|
|
|
@ -27,28 +27,115 @@ |
|
|
|
#include "qemu/timer.h" |
|
|
|
#include "qobject/qdict.h" |
|
|
|
#include "libqtest-single.h" |
|
|
|
#include "qemu/typedefs.h" |
|
|
|
|
|
|
|
#define AST2600_GPIO_BASE 0x1E780000 |
|
|
|
|
|
|
|
#define GPIO_ABCD_DATA_VALUE 0x000 |
|
|
|
#define GPIO_ABCD_DIRECTION 0x004 |
|
|
|
|
|
|
|
static uint32_t qtest_qom_get_uint32(QTestState *s, const char *path, |
|
|
|
const char *property) |
|
|
|
{ |
|
|
|
QDict *r; |
|
|
|
|
|
|
|
uint32_t res; |
|
|
|
r = qtest_qmp(s, "{ 'execute': 'qom-get', 'arguments': " |
|
|
|
"{ 'path': %s, 'property': %s } }", path, property); |
|
|
|
res = qdict_get_uint(r, "return"); |
|
|
|
qobject_unref(r); |
|
|
|
|
|
|
|
return res; |
|
|
|
} |
|
|
|
|
|
|
|
static void qtest_qom_set_uint32(QTestState *s, const char *path, |
|
|
|
const char *property, uint32_t value) |
|
|
|
{ |
|
|
|
QDict *r; |
|
|
|
|
|
|
|
r = qtest_qmp(s, "{ 'execute': 'qom-set', 'arguments': " |
|
|
|
"{ 'path': %s, 'property': %s, 'value': %" PRIu32 " } }", |
|
|
|
path, property, value); |
|
|
|
qobject_unref(r); |
|
|
|
} |
|
|
|
|
|
|
|
static const char *resp_get_error(QDict *r, const char* error_key) |
|
|
|
{ |
|
|
|
QDict *qdict; |
|
|
|
|
|
|
|
g_assert(r); |
|
|
|
|
|
|
|
qdict = qdict_get_qdict(r, "error"); |
|
|
|
if (qdict) { |
|
|
|
return qdict_get_str(qdict, error_key); |
|
|
|
} |
|
|
|
|
|
|
|
return NULL; |
|
|
|
} |
|
|
|
|
|
|
|
static bool qtest_qom_check_error(QTestState *s, const char *path, |
|
|
|
const char *property, const char *error_msg, |
|
|
|
const char *error_msg_key) |
|
|
|
{ |
|
|
|
QDict *r; |
|
|
|
bool b; |
|
|
|
|
|
|
|
r = qtest_qmp(s, "{ 'execute': 'qom-get', 'arguments': " |
|
|
|
"{ 'path': %s, 'property': %s } }", path, property); |
|
|
|
b = g_str_equal(resp_get_error(r, error_msg_key), error_msg); |
|
|
|
qobject_unref(r); |
|
|
|
|
|
|
|
return b; |
|
|
|
} |
|
|
|
|
|
|
|
static void test_set_colocated_pins(const void *data) |
|
|
|
{ |
|
|
|
QTestState *s = (QTestState *)data; |
|
|
|
|
|
|
|
const char path[] = "/machine/soc/gpio"; |
|
|
|
/*
|
|
|
|
* gpioV4-7 occupy bits within a single 32-bit value, so we want to make |
|
|
|
* sure that modifying one doesn't affect the other. |
|
|
|
*/ |
|
|
|
qtest_qom_set_bool(s, "/machine/soc/gpio", "gpioV4", true); |
|
|
|
qtest_qom_set_bool(s, "/machine/soc/gpio", "gpioV5", false); |
|
|
|
qtest_qom_set_bool(s, "/machine/soc/gpio", "gpioV6", true); |
|
|
|
qtest_qom_set_bool(s, "/machine/soc/gpio", "gpioV7", false); |
|
|
|
g_assert(qtest_qom_get_bool(s, "/machine/soc/gpio", "gpioV4")); |
|
|
|
g_assert(!qtest_qom_get_bool(s, "/machine/soc/gpio", "gpioV5")); |
|
|
|
g_assert(qtest_qom_get_bool(s, "/machine/soc/gpio", "gpioV6")); |
|
|
|
g_assert(!qtest_qom_get_bool(s, "/machine/soc/gpio", "gpioV7")); |
|
|
|
qtest_qom_set_bool(s, path, "gpioV4", true); |
|
|
|
qtest_qom_set_bool(s, path, "gpioV5", false); |
|
|
|
qtest_qom_set_bool(s, path, "gpioV6", true); |
|
|
|
qtest_qom_set_bool(s, path, "gpioV7", false); |
|
|
|
g_assert(qtest_qom_get_bool(s, path, "gpioV4")); |
|
|
|
g_assert(!qtest_qom_get_bool(s, path, "gpioV5")); |
|
|
|
g_assert(qtest_qom_get_bool(s, path, "gpioV6")); |
|
|
|
g_assert(!qtest_qom_get_bool(s, path, "gpioV7")); |
|
|
|
|
|
|
|
/*
|
|
|
|
* Testing the gpio-set[%d] properties, using individual gpio boolean |
|
|
|
* properties to do cross check. |
|
|
|
* We use gpioR4-7 for test, Setting them to be 0b1010. |
|
|
|
*/ |
|
|
|
qtest_qom_set_uint32(s, path, "gpio-set[4]", 0x0); |
|
|
|
g_assert(qtest_qom_get_uint32(s, path, "gpio-set[4]") == 0x0); |
|
|
|
qtest_qom_set_uint32(s, path, "gpio-set[4]", 0xa000); |
|
|
|
g_assert(qtest_qom_get_uint32(s, path, "gpio-set[4]") == 0xa000); |
|
|
|
|
|
|
|
g_assert(!qtest_qom_get_bool(s, path, "gpioR4")); |
|
|
|
g_assert(qtest_qom_get_bool(s, path, "gpioR5")); |
|
|
|
g_assert(!qtest_qom_get_bool(s, path, "gpioR6")); |
|
|
|
g_assert(qtest_qom_get_bool(s, path, "gpioR7")); |
|
|
|
|
|
|
|
/*
|
|
|
|
* Testing the invalid indexing, the response info should contain following |
|
|
|
* info: |
|
|
|
* {key: "class", value: "GenericError"} |
|
|
|
* |
|
|
|
* For pins, it should follow "gpio%2[A-Z]%1d" or "gpio%3[18A-E]%1d" format. |
|
|
|
*/ |
|
|
|
const char error_msg[] = "GenericError"; |
|
|
|
const char error_msg_key[] = "class"; |
|
|
|
|
|
|
|
g_assert(qtest_qom_check_error(s, path, "gpioR+1", error_msg, |
|
|
|
error_msg_key)); |
|
|
|
g_assert(qtest_qom_check_error(s, path, "gpio-set[99]", error_msg, |
|
|
|
error_msg_key)); |
|
|
|
g_assert(qtest_qom_check_error(s, path, "gpio-set[-3]", error_msg, |
|
|
|
error_msg_key)); |
|
|
|
} |
|
|
|
|
|
|
|
static void test_set_input_pins(const void *data) |
|
|
|
|