Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2216207/?format=api
{ "id": 2216207, "url": "http://patchwork.ozlabs.org/api/patches/2216207/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linux-aspeed/patch/20260326-irqchip-v3-3-366739f57acf@aspeedtech.com/", "project": { "id": 57, "url": "http://patchwork.ozlabs.org/api/projects/57/?format=api", "name": "Linux ASPEED SoC development", "link_name": "linux-aspeed", "list_id": "linux-aspeed.lists.ozlabs.org", "list_email": "linux-aspeed@lists.ozlabs.org", "web_url": "", "scm_url": "", "webscm_url": "", "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20260326-irqchip-v3-3-366739f57acf@aspeedtech.com>", "list_archive_url": null, "date": "2026-03-26T06:19:52", "name": "[v3,3/4] irqchip/ast2700-intc: Add KUnit tests for route resolution", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "5184e50551bf640f474bd6dd7fc76da5acf5f8fe", "submitter": { "id": 71489, "url": "http://patchwork.ozlabs.org/api/people/71489/?format=api", "name": "Ryan Chen", "email": "ryan_chen@aspeedtech.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/linux-aspeed/patch/20260326-irqchip-v3-3-366739f57acf@aspeedtech.com/mbox/", "series": [ { "id": 497536, "url": "http://patchwork.ozlabs.org/api/series/497536/?format=api", "web_url": "http://patchwork.ozlabs.org/project/linux-aspeed/list/?series=497536", "date": "2026-03-26T06:19:49", "name": "AST2700-A2 interrupt controller hierarchy and route support", "version": 3, "mbox": "http://patchwork.ozlabs.org/series/497536/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2216207/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2216207/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "\n <linux-aspeed+bounces-3781-incoming=patchwork.ozlabs.org@lists.ozlabs.org>", "X-Original-To": [ "incoming@patchwork.ozlabs.org", "linux-aspeed@lists.ozlabs.org" ], "Delivered-To": "patchwork-incoming@legolas.ozlabs.org", "Authentication-Results": [ "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=lists.ozlabs.org\n (client-ip=2404:9400:21b9:f100::1; helo=lists.ozlabs.org;\n envelope-from=linux-aspeed+bounces-3781-incoming=patchwork.ozlabs.org@lists.ozlabs.org;\n receiver=patchwork.ozlabs.org)", "lists.ozlabs.org;\n arc=none smtp.remote-ip=211.20.114.72", "lists.ozlabs.org;\n dmarc=pass (p=quarantine dis=none) header.from=aspeedtech.com", "lists.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=aspeedtech.com\n (client-ip=211.20.114.72; helo=twmbx01.aspeed.com;\n envelope-from=ryan_chen@aspeedtech.com; receiver=lists.ozlabs.org)" ], "Received": [ "from lists.ozlabs.org (lists.ozlabs.org\n [IPv6:2404:9400:21b9:f100::1])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fhDCh1FMxz1y1x\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 26 Mar 2026 17:20:16 +1100 (AEDT)", "from boromir.ozlabs.org (localhost [127.0.0.1])\n\tby lists.ozlabs.org (Postfix) with ESMTP id 4fhDCh01vhz2yS4;\n\tThu, 26 Mar 2026 17:20:16 +1100 (AEDT)", "from TWMBX01.aspeed.com (mail.aspeedtech.com [211.20.114.72])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby lists.ozlabs.org (Postfix) with ESMTPS id 4fhDCf4vFLz2xd6\n\tfor <linux-aspeed@lists.ozlabs.org>; Thu, 26 Mar 2026 17:20:14 +1100 (AEDT)", "from TWMBX01.aspeed.com (192.168.0.62) by TWMBX01.aspeed.com\n (192.168.0.62) with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1748.10; Thu, 26 Mar\n 2026 14:19:50 +0800", "from [127.0.1.1] (192.168.10.13) by TWMBX01.aspeed.com\n (192.168.0.62) with Microsoft SMTP Server id 15.2.1748.10 via Frontend\n Transport; Thu, 26 Mar 2026 14:19:50 +0800" ], "ARC-Seal": "i=1; a=rsa-sha256; d=lists.ozlabs.org; s=201707; t=1774506015;\n\tcv=none;\n b=F5iK652HirXIbDboN0Uni2MTu/2hjmnZ6Y9ov2cOZiS6RUzpbqO6Lqj0sCa79jJTzh6Hzg4n20fhpu7f7/2gq09NADCqYJsbVujOMw9UYyhKkQBwVcY2Z3gkhEY/H8lGegc2tHXQCJZgOxfkwiNquWPy2Oul3Jnu0dbgTwcxS6Cwdq5FNj9UAD97tOI6knSFVxrvEmDLyp6gSRUcfYGqvrO420zNi2CNpwhTqacH1uTCeBh2I0408RFK1ypiXOw2r43uQ4ul5VHPClmnXcaOzKNNFck028Bk92TL3tAPBi4ba6kiZdGmOuGOj2qzfAqul4Xz8PwHMEUU0/0GGElwZg==", "ARC-Message-Signature": "i=1; a=rsa-sha256; d=lists.ozlabs.org; s=201707;\n\tt=1774506015; c=relaxed/relaxed;\n\tbh=6kHcHEpkSNeWqVxxL2+mkHZIwxCBGOknwxKDp7hpBjQ=;\n\th=From:Date:Subject:MIME-Version:Content-Type:Message-ID:References:\n\t In-Reply-To:To:CC;\n b=fYsbfj8c6Hhxz9/Q9NUdN8Z0p4UETe3Hje5jQxpyyjBlhYHItMNPjtbTkJc6f+YPUPi41gBAXnLmPPlbYfuf+Jiu+O/HnD2A1YVZtNNeS35Q8tn9TBf+/Jsqimh1hMskKicwIIbjYnB52LnGVhsGq5N/FgzbWUlTXSt0T5zUW5+0wvdsSaAQUi1jVQ81ulo17bgZb3oXUI3sCUcQsC+NLJzjbnoIxr4DZMjLZH7VXZyc9izWnzkKgeuJM/z56OA6Eemq/HGU/OmSUtAls/Bw0V7W5ghJqYQLoStn/gOvu/lvd+9T28bfbxPvVWA4tw+Wg+Yk2WFx5yWrgoqISSRw8w==", "ARC-Authentication-Results": "i=1; lists.ozlabs.org;\n dmarc=pass (p=quarantine dis=none) header.from=aspeedtech.com;\n spf=pass (client-ip=211.20.114.72; helo=twmbx01.aspeed.com;\n envelope-from=ryan_chen@aspeedtech.com;\n receiver=lists.ozlabs.org) smtp.mailfrom=aspeedtech.com", "From": "Ryan Chen <ryan_chen@aspeedtech.com>", "Date": "Thu, 26 Mar 2026 14:19:52 +0800", "Subject": "[PATCH v3 3/4] irqchip/ast2700-intc: Add KUnit tests for route\n resolution", "X-Mailing-List": "linux-aspeed@lists.ozlabs.org", "List-Id": "<linux-aspeed.lists.ozlabs.org>", "List-Help": "<mailto:linux-aspeed+help@lists.ozlabs.org>", "List-Owner": "<mailto:linux-aspeed+owner@lists.ozlabs.org>", "List-Post": "<mailto:linux-aspeed@lists.ozlabs.org>", "List-Archive": "<https://lore.kernel.org/linux-aspeed/>,\n <https://lists.ozlabs.org/pipermail/linux-aspeed/>", "List-Subscribe": "<mailto:linux-aspeed+subscribe@lists.ozlabs.org>,\n <mailto:linux-aspeed+subscribe-digest@lists.ozlabs.org>,\n <mailto:linux-aspeed+subscribe-nomail@lists.ozlabs.org>", "List-Unsubscribe": "<mailto:linux-aspeed+unsubscribe@lists.ozlabs.org>", "Precedence": "list", "MIME-Version": "1.0", "Content-Type": "text/plain; charset=\"utf-8\"", "Content-Transfer-Encoding": "7bit", "Message-ID": "<20260326-irqchip-v3-3-366739f57acf@aspeedtech.com>", "References": "<20260326-irqchip-v3-0-366739f57acf@aspeedtech.com>", "In-Reply-To": "<20260326-irqchip-v3-0-366739f57acf@aspeedtech.com>", "To": "Rob Herring <robh@kernel.org>, Krzysztof Kozlowski <krzk+dt@kernel.org>,\n\tConor Dooley <conor+dt@kernel.org>, Joel Stanley <joel@jms.id.au>, \"Andrew\n Jeffery\" <andrew@codeconstruct.com.au>, Paul Walmsley <pjw@kernel.org>,\n\t\"Palmer Dabbelt\" <palmer@dabbelt.com>, Albert Ou <aou@eecs.berkeley.edu>,\n\t\"Alexandre Ghiti\" <alex@ghiti.fr>, Thomas Gleixner <tglx@kernel.org>, Thomas\n Gleixner <tglx@kernel.org>", "CC": "<linux-kernel@vger.kernel.org>, <devicetree@vger.kernel.org>,\n\t<linux-arm-kernel@lists.infradead.org>, <linux-aspeed@lists.ozlabs.org>,\n\t<linux-riscv@lists.infradead.org>, Ryan Chen <ryan_chen@aspeedtech.com>", "X-Mailer": "b4 0.14.3", "X-Developer-Signature": "v=1; a=ed25519-sha256; t=1774505990; l=14664;\n i=ryan_chen@aspeedtech.com; s=20251126; h=from:subject:message-id;\n bh=1YBW+EL7AuGWoFCRjiSMhAL5FE0T35y9CH+HP9XNVFg=;\n b=Y9wLsicB7XByheJooZF5sf87VithLdAJgl7EGCcJiIy3pOiWhmdCuzuZ0fUXDsy62bYrSuwtA\n mM8eRbeAL2lCa9C9RcxuBhs6xwQNZqEm/HAQrncD0JqY4NLaw/Ucnvu", "X-Developer-Key": "i=ryan_chen@aspeedtech.com; a=ed25519;\n pk=Xe73xY6tcnkuRjjbVAB/oU30KdB3FvG4nuJuILj7ZVc=", "X-Spam-Status": "No, score=0.0 required=5.0 tests=SPF_HELO_FAIL,SPF_PASS\n\tautolearn=disabled version=4.0.1", "X-Spam-Checker-Version": "SpamAssassin 4.0.1 (2024-03-25) on lists.ozlabs.org" }, "content": "Add a KUnit suite for aspeed_intc0_resolve_route().\n\nCover invalid arguments, invalid domain/range data, connected and\ndisconnected mappings, and malformed upstream range cases.\n\nSigned-off-by: Ryan Chen <ryan_chen@aspeedtech.com>\n\n---\nChanges in v2:\n- add line break before include \"irq-ast2700.h\"\n- remove pointless newline.\n- rename arm_gicv3_fwnode_read_string_array to\n gicv3_fwnode_read_string_array\n- add .kunitconfig file\n---\n drivers/irqchip/.kunitconfig | 5 +\n drivers/irqchip/Kconfig | 11 +\n drivers/irqchip/Makefile | 1 +\n drivers/irqchip/irq-ast2700-intc0-test.c | 473 +++++++++++++++++++++++++++++++\n 4 files changed, 490 insertions(+)", "diff": "diff --git a/drivers/irqchip/.kunitconfig b/drivers/irqchip/.kunitconfig\nnew file mode 100644\nindex 000000000000..00a12703f635\n--- /dev/null\n+++ b/drivers/irqchip/.kunitconfig\n@@ -0,0 +1,5 @@\n+CONFIG_KUNIT=y\n+CONFIG_OF=y\n+CONFIG_COMPILE_TEST=y\n+CONFIG_ASPEED_AST2700_INTC=y\n+CONFIG_ASPEED_AST2700_INTC_TEST=y\ndiff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig\nindex 0156fee89b2c..143af3f30a4b 100644\n--- a/drivers/irqchip/Kconfig\n+++ b/drivers/irqchip/Kconfig\n@@ -122,6 +122,17 @@ config ASPEED_AST2700_INTC\n \n \t If unsure, say N.\n \n+config ASPEED_AST2700_INTC_TEST\n+\tbool \"Tests for the ASPEED AST2700 Interrupt Controller\"\n+\tdepends on ASPEED_AST2700_INTC && KUNIT=y\n+\tdefault KUNIT_ALL_TESTS\n+\thelp\n+\t Enable KUnit tests for AST2700 INTC route resolution.\n+\t The tests exercise error handling and route selection paths.\n+\t This option is intended for test builds.\n+\n+\t If unsure, say N.\n+\n config ATMEL_AIC_IRQ\n \tbool\n \tselect GENERIC_IRQ_CHIP\ndiff --git a/drivers/irqchip/Makefile b/drivers/irqchip/Makefile\nindex 62790663f982..ac04a4b97797 100644\n--- a/drivers/irqchip/Makefile\n+++ b/drivers/irqchip/Makefile\n@@ -90,6 +90,7 @@ obj-$(CONFIG_MVEBU_SEI)\t\t\t+= irq-mvebu-sei.o\n obj-$(CONFIG_LS_EXTIRQ)\t\t\t+= irq-ls-extirq.o\n obj-$(CONFIG_LS_SCFG_MSI)\t\t+= irq-ls-scfg-msi.o\n obj-$(CONFIG_ASPEED_AST2700_INTC)\t+= irq-ast2700.o irq-ast2700-intc0.o irq-ast2700-intc1.o\n+obj-$(CONFIG_ASPEED_AST2700_INTC_TEST)\t+= irq-ast2700-intc0-test.o\n obj-$(CONFIG_ARCH_ASPEED)\t\t+= irq-aspeed-vic.o irq-aspeed-i2c-ic.o irq-aspeed-scu-ic.o\n obj-$(CONFIG_ARCH_ASPEED)\t\t+= irq-aspeed-intc.o\n obj-$(CONFIG_STM32MP_EXTI)\t\t+= irq-stm32mp-exti.o\ndiff --git a/drivers/irqchip/irq-ast2700-intc0-test.c b/drivers/irqchip/irq-ast2700-intc0-test.c\nnew file mode 100644\nindex 000000000000..2aa00df72c04\n--- /dev/null\n+++ b/drivers/irqchip/irq-ast2700-intc0-test.c\n@@ -0,0 +1,473 @@\n+// SPDX-License-Identifier: GPL-2.0-only\n+/*\n+ * Copyright (C) 2026 Code Construct\n+ */\n+#include <kunit/test.h>\n+\n+#include \"irq-ast2700.h\"\n+\n+static void aspeed_intc0_resolve_route_bad_args(struct kunit *test)\n+{\n+\tstatic const struct aspeed_intc_interrupt_range c1ranges[] = { 0 };\n+\tstatic const u32 c1outs[] = { 0 };\n+\tstruct aspeed_intc_interrupt_range resolved;\n+\tconst struct irq_domain c0domain = { 0 };\n+\tint rc;\n+\n+\trc = aspeed_intc0_resolve_route(NULL, 0, c1outs, 0, c1ranges, NULL);\n+\tKUNIT_EXPECT_EQ(test, rc, -EINVAL);\n+\n+\trc = aspeed_intc0_resolve_route(&c0domain, 0, c1outs,\n+\t\t\t\t\tARRAY_SIZE(c1ranges), c1ranges,\n+\t\t\t\t\t&resolved);\n+\tKUNIT_EXPECT_EQ(test, rc, -ENOENT);\n+\n+\trc = aspeed_intc0_resolve_route(&c0domain, ARRAY_SIZE(c1outs), c1outs,\n+\t\t\t\t\t0, c1ranges, &resolved);\n+\tKUNIT_EXPECT_EQ(test, rc, -ENOENT);\n+}\n+\n+static int gicv3_fwnode_read_string_array(const struct fwnode_handle *fwnode,\n+\t\t\t\t\t const char *propname, const char **val, size_t nval)\n+{\n+\tif (!propname)\n+\t\treturn -EINVAL;\n+\n+\tif (!val)\n+\t\treturn 1;\n+\n+\tif (WARN_ON(nval != 1))\n+\t\treturn -EOVERFLOW;\n+\n+\t*val = \"arm,gic-v3\";\n+\treturn 1;\n+}\n+\n+static const struct fwnode_operations arm_gicv3_fwnode_ops = {\n+\t.property_read_string_array = gicv3_fwnode_read_string_array,\n+};\n+\n+static void aspeed_intc_resolve_route_invalid_c0domain(struct kunit *test)\n+{\n+\tstruct device_node intc0_node = {\n+\t\t.fwnode = { .ops = &arm_gicv3_fwnode_ops },\n+\t};\n+\tconst struct irq_domain c0domain = { .fwnode = &intc0_node.fwnode };\n+\tstatic const struct aspeed_intc_interrupt_range c1ranges[] = { 0 };\n+\tstatic const u32 c1outs[] = { 0 };\n+\tstruct aspeed_intc_interrupt_range resolved;\n+\tint rc;\n+\n+\trc = aspeed_intc0_resolve_route(&c0domain, ARRAY_SIZE(c1outs), c1outs,\n+\t\t\t\t\tARRAY_SIZE(c1ranges), c1ranges,\n+\t\t\t\t\t&resolved);\n+\tKUNIT_EXPECT_NE(test, rc, 0);\n+}\n+\n+static int\n+aspeed_intc0_fwnode_read_string_array(const struct fwnode_handle *fwnode_handle,\n+\t\t\t\t const char *propname, const char **val,\n+\t\t\t\t size_t nval)\n+{\n+\tif (!propname)\n+\t\treturn -EINVAL;\n+\n+\tif (!val)\n+\t\treturn 1;\n+\n+\tif (WARN_ON(nval != 1))\n+\t\treturn -EOVERFLOW;\n+\n+\t*val = \"aspeed,ast2700-intc0\";\n+\treturn nval;\n+}\n+\n+static const struct fwnode_operations intc0_fwnode_ops = {\n+\t.property_read_string_array = aspeed_intc0_fwnode_read_string_array,\n+};\n+\n+static void\n+aspeed_intc0_resolve_route_c1i1o1c0i1o1_connected(struct kunit *test)\n+{\n+\tstruct device_node intc0_node = {\n+\t\t.fwnode = { .ops = &intc0_fwnode_ops },\n+\t};\n+\tstruct aspeed_intc_interrupt_range c1ranges[] = {\n+\t\t{\n+\t\t\t.start = 0,\n+\t\t\t.count = 1,\n+\t\t\t.upstream = {\n+\t\t\t\t.fwnode = &intc0_node.fwnode,\n+\t\t\t\t.param_count = 1,\n+\t\t\t\t.param = { 128 }\n+\t\t\t}\n+\t\t}\n+\t};\n+\tstatic const u32 c1outs[] = { 0 };\n+\tstruct aspeed_intc_interrupt_range resolved;\n+\tstruct aspeed_intc_interrupt_range intc0_ranges[] = {\n+\t\t{\n+\t\t\t.start = 128,\n+\t\t\t.count = 1,\n+\t\t\t.upstream = {\n+\t\t\t\t.fwnode = NULL,\n+\t\t\t\t.param_count = 0,\n+\t\t\t\t.param = { 0 },\n+\t\t\t}\n+\t\t}\n+\t};\n+\tstruct aspeed_intc0 intc0 = {\n+\t\t.ranges = { .ranges = intc0_ranges, .nranges = ARRAY_SIZE(intc0_ranges), }\n+\t};\n+\tconst struct irq_domain c0domain = {\n+\t\t.host_data = &intc0,\n+\t\t.fwnode = &intc0_node.fwnode\n+\t};\n+\tint rc;\n+\n+\trc = aspeed_intc0_resolve_route(&c0domain, ARRAY_SIZE(c1outs), c1outs,\n+\t\t\t\t\tARRAY_SIZE(c1ranges), c1ranges,\n+\t\t\t\t\t&resolved);\n+\tKUNIT_EXPECT_EQ(test, rc, 0);\n+\tKUNIT_EXPECT_EQ(test, resolved.start, 0);\n+\tKUNIT_EXPECT_EQ(test, resolved.count, 1);\n+\tKUNIT_EXPECT_EQ(test, resolved.upstream.param[0], 128);\n+}\n+\n+static void\n+aspeed_intc0_resolve_route_c1i1o1c0i1o1_disconnected(struct kunit *test)\n+{\n+\tstruct device_node intc0_node = {\n+\t\t.fwnode = { .ops = &intc0_fwnode_ops },\n+\t};\n+\tstruct aspeed_intc_interrupt_range c1ranges[] = {\n+\t\t{\n+\t\t\t.start = 0,\n+\t\t\t.count = 1,\n+\t\t\t.upstream = {\n+\t\t\t\t.fwnode = &intc0_node.fwnode,\n+\t\t\t\t.param_count = 1,\n+\t\t\t\t.param = { 128 }\n+\t\t\t}\n+\t\t}\n+\t};\n+\tstatic const u32 c1outs[] = { 0 };\n+\tstruct aspeed_intc_interrupt_range resolved;\n+\tstruct aspeed_intc_interrupt_range intc0_ranges[] = {\n+\t\t{\n+\t\t\t.start = 129,\n+\t\t\t.count = 1,\n+\t\t\t.upstream = {\n+\t\t\t\t.fwnode = NULL,\n+\t\t\t\t.param_count = 0,\n+\t\t\t\t.param = { 0 },\n+\t\t\t}\n+\t\t}\n+\t};\n+\tstruct aspeed_intc0 intc0 = {\n+\t\t.ranges = {\n+\t\t\t.ranges = intc0_ranges,\n+\t\t\t.nranges = ARRAY_SIZE(intc0_ranges),\n+\t\t}\n+\t};\n+\tconst struct irq_domain c0domain = {\n+\t\t.host_data = &intc0,\n+\t\t.fwnode = &intc0_node.fwnode\n+\t};\n+\tint rc;\n+\n+\trc = aspeed_intc0_resolve_route(&c0domain, ARRAY_SIZE(c1outs), c1outs,\n+\t\t\t\t\tARRAY_SIZE(c1ranges), c1ranges,\n+\t\t\t\t\t&resolved);\n+\tKUNIT_EXPECT_NE(test, rc, 0);\n+}\n+\n+static void aspeed_intc0_resolve_route_c1i1o1mc0i1o1(struct kunit *test)\n+{\n+\tstruct device_node intc0_node = {\n+\t\t.fwnode = { .ops = &intc0_fwnode_ops },\n+\t};\n+\tstruct aspeed_intc_interrupt_range c1ranges[] = {\n+\t\t{\n+\t\t\t.start = 0,\n+\t\t\t.count = 1,\n+\t\t\t.upstream = {\n+\t\t\t\t.fwnode = &intc0_node.fwnode,\n+\t\t\t\t.param_count = 1,\n+\t\t\t\t.param = { 480 }\n+\t\t\t}\n+\t\t}\n+\t};\n+\tstatic const u32 c1outs[] = { 0 };\n+\tstruct aspeed_intc_interrupt_range resolved;\n+\tstruct aspeed_intc_interrupt_range intc0_ranges[] = {\n+\t\t{\n+\t\t\t.start = 192,\n+\t\t\t.count = 1,\n+\t\t\t.upstream = {\n+\t\t\t\t.fwnode = NULL,\n+\t\t\t\t.param_count = 0,\n+\t\t\t\t.param = { 0 },\n+\t\t\t}\n+\t\t}\n+\t};\n+\tstruct aspeed_intc0 intc0 = {\n+\t\t.ranges = {\n+\t\t\t.ranges = intc0_ranges,\n+\t\t\t.nranges = ARRAY_SIZE(intc0_ranges),\n+\t\t}\n+\t};\n+\tconst struct irq_domain c0domain = {\n+\t\t.host_data = &intc0,\n+\t\t.fwnode = &intc0_node.fwnode\n+\t};\n+\tint rc;\n+\n+\trc = aspeed_intc0_resolve_route(&c0domain, ARRAY_SIZE(c1outs), c1outs,\n+\t\t\t\t\tARRAY_SIZE(c1ranges), c1ranges,\n+\t\t\t\t\t&resolved);\n+\tKUNIT_EXPECT_EQ(test, rc, 0);\n+\tKUNIT_EXPECT_EQ(test, resolved.start, 0);\n+\tKUNIT_EXPECT_EQ(test, resolved.count, 1);\n+\tKUNIT_EXPECT_EQ(test, resolved.upstream.param[0], 480);\n+}\n+\n+static void aspeed_intc0_resolve_route_c1i2o2mc0i1o1(struct kunit *test)\n+{\n+\tstruct device_node intc0_node = {\n+\t\t.fwnode = { .ops = &intc0_fwnode_ops },\n+\t};\n+\tstruct aspeed_intc_interrupt_range c1ranges[] = {\n+\t\t{\n+\t\t\t.start = 0,\n+\t\t\t.count = 1,\n+\t\t\t.upstream = {\n+\t\t\t\t.fwnode = &intc0_node.fwnode,\n+\t\t\t\t.param_count = 1,\n+\t\t\t\t.param = { 480 }\n+\t\t\t}\n+\t\t},\n+\t\t{\n+\t\t\t.start = 1,\n+\t\t\t.count = 1,\n+\t\t\t.upstream = {\n+\t\t\t\t.fwnode = &intc0_node.fwnode,\n+\t\t\t\t.param_count = 1,\n+\t\t\t\t.param = { 510 }\n+\t\t\t}\n+\t\t}\n+\t};\n+\tstatic const u32 c1outs[] = { 1 };\n+\tstruct aspeed_intc_interrupt_range resolved;\n+\tstruct aspeed_intc_interrupt_range intc0_ranges[] = {\n+\t\t{\n+\t\t\t.start = 208,\n+\t\t\t.count = 1,\n+\t\t\t.upstream = {\n+\t\t\t\t.fwnode = NULL,\n+\t\t\t\t.param_count = 0,\n+\t\t\t\t.param = { 0 },\n+\t\t\t}\n+\t\t}\n+\t};\n+\tstruct aspeed_intc0 intc0 = {\n+\t\t.ranges = {\n+\t\t\t.ranges = intc0_ranges,\n+\t\t\t.nranges = ARRAY_SIZE(intc0_ranges),\n+\t\t}\n+\t};\n+\tconst struct irq_domain c0domain = {\n+\t\t.host_data = &intc0,\n+\t\t.fwnode = &intc0_node.fwnode\n+\t};\n+\tint rc;\n+\n+\trc = aspeed_intc0_resolve_route(&c0domain, ARRAY_SIZE(c1outs), c1outs,\n+\t\t\t\t\tARRAY_SIZE(c1ranges), c1ranges,\n+\t\t\t\t\t&resolved);\n+\tKUNIT_EXPECT_EQ(test, rc, 0);\n+\tKUNIT_EXPECT_EQ(test, resolved.start, 1);\n+\tKUNIT_EXPECT_EQ(test, resolved.count, 1);\n+\tKUNIT_EXPECT_EQ(test, resolved.upstream.param[0], 510);\n+}\n+\n+static void aspeed_intc0_resolve_route_c1i1o1mc0i2o1(struct kunit *test)\n+{\n+\tstruct device_node intc0_node = {\n+\t\t.fwnode = { .ops = &intc0_fwnode_ops },\n+\t};\n+\tstruct aspeed_intc_interrupt_range c1ranges[] = {\n+\t\t{\n+\t\t\t.start = 0,\n+\t\t\t.count = 1,\n+\t\t\t.upstream = {\n+\t\t\t\t.fwnode = &intc0_node.fwnode,\n+\t\t\t\t.param_count = 1,\n+\t\t\t\t.param = { 510 }\n+\t\t\t}\n+\t\t},\n+\t};\n+\tstatic const u32 c1outs[] = { 0 };\n+\tstruct aspeed_intc_interrupt_range resolved;\n+\tstruct aspeed_intc_interrupt_range intc0_ranges[] = {\n+\t\t{\n+\t\t\t.start = 192,\n+\t\t\t.count = 1,\n+\t\t\t.upstream = {\n+\t\t\t\t.fwnode = NULL,\n+\t\t\t\t.param_count = 0,\n+\t\t\t\t.param = {0},\n+\t\t\t}\n+\t\t},\n+\t\t{\n+\t\t\t.start = 208,\n+\t\t\t.count = 1,\n+\t\t\t.upstream = {\n+\t\t\t\t.fwnode = NULL,\n+\t\t\t\t.param_count = 0,\n+\t\t\t\t.param = {0},\n+\t\t\t}\n+\t\t}\n+\t};\n+\tstruct aspeed_intc0 intc0 = {\n+\t\t.ranges = {\n+\t\t\t.ranges = intc0_ranges,\n+\t\t\t.nranges = ARRAY_SIZE(intc0_ranges),\n+\t\t}\n+\t};\n+\tconst struct irq_domain c0domain = {\n+\t\t.host_data = &intc0,\n+\t\t.fwnode = &intc0_node.fwnode\n+\t};\n+\tint rc;\n+\n+\trc = aspeed_intc0_resolve_route(&c0domain, ARRAY_SIZE(c1outs), c1outs,\n+\t\t\t\t\tARRAY_SIZE(c1ranges), c1ranges,\n+\t\t\t\t\t&resolved);\n+\tKUNIT_EXPECT_EQ(test, rc, 0);\n+\tKUNIT_EXPECT_EQ(test, resolved.start, 0);\n+\tKUNIT_EXPECT_EQ(test, resolved.count, 1);\n+\tKUNIT_EXPECT_EQ(test, resolved.upstream.param[0], 510);\n+}\n+\n+static void aspeed_intc0_resolve_route_c1i1o2mc0i1o1_invalid(struct kunit *test)\n+{\n+\tstruct device_node intc0_node = {\n+\t\t.fwnode = { .ops = &intc0_fwnode_ops },\n+\t};\n+\tstruct aspeed_intc_interrupt_range c1ranges[] = {\n+\t\t{\n+\t\t\t.start = 0,\n+\t\t\t.count = 1,\n+\t\t\t.upstream = {\n+\t\t\t\t.fwnode = &intc0_node.fwnode,\n+\t\t\t\t.param_count = 1,\n+\t\t\t\t.param = { 480 }\n+\t\t\t}\n+\t\t}\n+\t};\n+\tstatic const u32 c1outs[] = {\n+\t\tAST2700_INTC_INVALID_ROUTE, 0\n+\t};\n+\tstruct aspeed_intc_interrupt_range resolved;\n+\tstruct aspeed_intc_interrupt_range intc0_ranges[] = {\n+\t\t{\n+\t\t\t.start = 192,\n+\t\t\t.count = 1,\n+\t\t\t.upstream = {\n+\t\t\t\t.fwnode = NULL,\n+\t\t\t\t.param_count = 0,\n+\t\t\t\t.param = { 0 },\n+\t\t\t}\n+\t\t}\n+\t};\n+\tstruct aspeed_intc0 intc0 = {\n+\t\t.ranges = {\n+\t\t\t.ranges = intc0_ranges,\n+\t\t\t.nranges = ARRAY_SIZE(intc0_ranges),\n+\t\t}\n+\t};\n+\tconst struct irq_domain c0domain = {\n+\t\t.host_data = &intc0,\n+\t\t.fwnode = &intc0_node.fwnode\n+\t};\n+\tint rc;\n+\n+\trc = aspeed_intc0_resolve_route(&c0domain, ARRAY_SIZE(c1outs), c1outs,\n+\t\t\t\t\tARRAY_SIZE(c1ranges), c1ranges,\n+\t\t\t\t\t&resolved);\n+\tKUNIT_EXPECT_EQ(test, rc, 1);\n+\tKUNIT_EXPECT_EQ(test, resolved.start, 0);\n+\tKUNIT_EXPECT_EQ(test, resolved.count, 1);\n+\tKUNIT_EXPECT_EQ(test, resolved.upstream.param[0], 480);\n+}\n+\n+static void\n+aspeed_intc0_resolve_route_c1i1o1mc0i1o1_bad_range_upstream(struct kunit *test)\n+{\n+\tstruct device_node intc0_node = {\n+\t\t.fwnode = { .ops = &intc0_fwnode_ops },\n+\t};\n+\tstruct aspeed_intc_interrupt_range c1ranges[] = {\n+\t\t{\n+\t\t\t.start = 0,\n+\t\t\t.count = 1,\n+\t\t\t.upstream = {\n+\t\t\t\t.fwnode = &intc0_node.fwnode,\n+\t\t\t\t.param_count = 0,\n+\t\t\t\t.param = { 0 }\n+\t\t\t}\n+\t\t}\n+\t};\n+\tstatic const u32 c1outs[] = { 0 };\n+\tstruct aspeed_intc_interrupt_range resolved;\n+\tstruct aspeed_intc_interrupt_range intc0_ranges[] = {\n+\t\t{\n+\t\t\t.start = 0,\n+\t\t\t.count = 0,\n+\t\t\t.upstream = {\n+\t\t\t\t.fwnode = NULL,\n+\t\t\t\t.param_count = 0,\n+\t\t\t\t.param = { 0 },\n+\t\t\t}\n+\t\t}\n+\t};\n+\tstruct aspeed_intc0 intc0 = {\n+\t\t.ranges = {\n+\t\t\t.ranges = intc0_ranges,\n+\t\t\t.nranges = ARRAY_SIZE(intc0_ranges),\n+\t\t}\n+\t};\n+\tconst struct irq_domain c0domain = {\n+\t\t.host_data = &intc0,\n+\t\t.fwnode = &intc0_node.fwnode\n+\t};\n+\tint rc;\n+\n+\trc = aspeed_intc0_resolve_route(&c0domain, ARRAY_SIZE(c1outs), c1outs,\n+\t\t\t\t\tARRAY_SIZE(c1ranges), c1ranges,\n+\t\t\t\t\t&resolved);\n+\tKUNIT_EXPECT_NE(test, rc, 0);\n+}\n+\n+static struct kunit_case ast2700_intc0_test_cases[] = {\n+\tKUNIT_CASE(aspeed_intc0_resolve_route_bad_args),\n+\tKUNIT_CASE(aspeed_intc_resolve_route_invalid_c0domain),\n+\tKUNIT_CASE(aspeed_intc0_resolve_route_c1i1o1c0i1o1_connected),\n+\tKUNIT_CASE(aspeed_intc0_resolve_route_c1i1o1c0i1o1_disconnected),\n+\tKUNIT_CASE(aspeed_intc0_resolve_route_c1i1o1mc0i1o1),\n+\tKUNIT_CASE(aspeed_intc0_resolve_route_c1i2o2mc0i1o1),\n+\tKUNIT_CASE(aspeed_intc0_resolve_route_c1i1o1mc0i2o1),\n+\tKUNIT_CASE(aspeed_intc0_resolve_route_c1i1o2mc0i1o1_invalid),\n+\tKUNIT_CASE(aspeed_intc0_resolve_route_c1i1o1mc0i1o1_bad_range_upstream),\n+\t{},\n+};\n+\n+static struct kunit_suite ast2700_intc0_test_suite = {\n+\t.name = \"ast2700-intc0\",\n+\t.test_cases = ast2700_intc0_test_cases,\n+};\n+\n+kunit_test_suite(ast2700_intc0_test_suite);\n+\n+MODULE_LICENSE(\"GPL\");\n", "prefixes": [ "v3", "3/4" ] }