X-Git-Url: https://scm.lunaixsky.com/lunaix-os.git/blobdiff_plain/6942ebae59c3904674dce6b67cd07c43a3bbe00d..7e13988c1113d38bec17bd79b71757d78d977e76:/lunaix-os/tests/units/device-tree/test-interrupts.c diff --git a/lunaix-os/tests/units/device-tree/test-interrupts.c b/lunaix-os/tests/units/device-tree/test-interrupts.c new file mode 100644 index 0000000..934c4c7 --- /dev/null +++ b/lunaix-os/tests/units/device-tree/test-interrupts.c @@ -0,0 +1,106 @@ +#include "common.h" +#include + +extern void *calloc(size_t, size_t); +extern void free(void *); + +void +run_test(int argc, const char* argv[]) +{ + struct dt_context* ctx; + struct dtn* node, *domain; + struct dtn_iter it; + struct dtp_val val; + + my_load_dtb(); + + ctx = dt_main_context(); + + node = ctx->root; + testcase("root", { + expect_notnull(node); + expect_int(node->base.addr_c, 0); + expect_int(node->base.sz_c, 0); + expect_int(node->base.intr_c, 0); + }); + + dt_begin_find_byname(&it, ctx->root, "dev@1"); + node = (struct dtn*)it.matched; + + testcase("intr-basic", { + expect_notnull(node); + expect_notnull(node->intr.parent); + + expect_str(dt_name(node), "dev@1"); + expect_str(dt_name(node->intr.parent), "pic@11"); + }); + + testcase("intr-single", { + expect_int(node->intr.nr_intrs, 1); + expect_false(node->intr.extended); + + domain = dt_interrupt_at(node, 0, &val); + expect_int(val.ref->raw[0], 1); + expect_int(val.ref->raw[1], 2); + expect_str(dt_name(domain), "pic@11"); + + expect_null(dt_interrupt_at(node, 1, &val)); + }); + + dt_begin_find_byname(&it, ctx->root, "dev@2"); + node = (struct dtn*)it.matched; + + testcase("intr-multi", { + expect_notnull(node); + expect_int(node->intr.nr_intrs, 3); + expect_false(node->intr.extended); + + domain = dt_interrupt_at(node, 0, &val); + expect_int(val.ref->raw[0], 1); + expect_int(val.ref->raw[1], 1); + expect_str(dt_name(domain), "pic@11"); + + domain = dt_interrupt_at(node, 1, &val); + expect_int(val.ref->raw[0], 1); + expect_int(val.ref->raw[1], 2); + expect_str(dt_name(domain), "pic@11"); + + domain = dt_interrupt_at(node, 2, &val); + expect_int(val.ref->raw[0], 2); + expect_int(val.ref->raw[1], 2); + expect_str(dt_name(domain), "pic@11"); + + expect_null(dt_interrupt_at(node, 3, &val)); + }); + + dt_begin_find_byname(&it, ctx->root, "dev@3"); + node = (struct dtn*)it.matched; + + testcase("intr-ext-multi", { + expect_notnull(node); + + expect_int(node->intr.nr_intrs, 3); + expect_true(node->intr.extended); + + domain = dt_interrupt_at(node, 0, &val); + expect_int(val.size / sizeof(int), 2); + expect_int(val.ref->raw[0], 3); + expect_int(val.ref->raw[1], 3); + expect_str(dt_name(domain), "pic@11"); + + domain = dt_interrupt_at(node, 1, &val); + expect_int(val.size / sizeof(int), 1); + expect_int(val.ref->raw[0], 1); + expect_str(dt_name(domain), "pic@22"); + + domain = dt_interrupt_at(node, 2, &val); + expect_int(val.size / sizeof(int), 4); + expect_int(val.ref->raw[0], 1); + expect_int(val.ref->raw[1], 2); + expect_int(val.ref->raw[2], 3); + expect_int(val.ref->raw[3], 4); + expect_str(dt_name(domain), "pic@33"); + + expect_null(dt_interrupt_at(node, 3, &val)); + }); +} \ No newline at end of file