get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/2216207/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "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"
    ]
}