From nobody Tue Jun 16 17:03:50 2026 Received: from galois.linutronix.de (Galois.linutronix.de [193.142.43.55]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 769A73DA5C4; Thu, 30 Apr 2026 10:56:51 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=193.142.43.55 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777546613; cv=none; b=fGjZZksySWuxsY6+DELUsfM06TMxIVVhdWcWPFLmtGDAqf2KSwleKPjZPHxk9S0wB4b1ROHu9sQ1Ugq/doJvSNNT3nrWyChtqsHRMAE9I2G728RuSpAmIXXi5AcyS4+XIXbaCiKEjvLANfPmG5UTHvK91aY+HPlGnzJO2tg9Oyo= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777546613; c=relaxed/simple; bh=fLYvBb6zqrlYQAdaEN4LiQhwPHBXlZEZ9gfy2Px7JUo=; h=Date:From:To:Subject:Cc:In-Reply-To:References:MIME-Version: Message-ID:Content-Type; b=rfPjcPmQHgSiimFOtjH6Ynv7ghhoRDRyQUX3Nj5evedN+WG5uMgChXl7EAZJbie7dy+hCL2lTnRksLBBqTfEq0P1htCnlPhtuX4EK+5hVszCpoONyBg0YQGLM4X7W8O9kuWmNrKNYe3VeCDIqinMeUnxF8UD+BYsD9wlc5Hv1k4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de; spf=pass smtp.mailfrom=linutronix.de; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=kmj5F8Ce; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b=YFiSP2bd; arc=none smtp.client-ip=193.142.43.55 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linutronix.de Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linutronix.de Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="kmj5F8Ce"; dkim=permerror (0-bit key) header.d=linutronix.de header.i=@linutronix.de header.b="YFiSP2bd" Date: Thu, 30 Apr 2026 10:56:48 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020; t=1777546609; h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=nH12V7g9MQarEAo3wf0cc/kMFGqT/9FYsheOzMbeC9k=; b=kmj5F8CeRJ2T5tVp7Pu3y1osXtNpWO9vusxcnE46RRsbGuj9NEtqFxtDgKihVgS/6/kg9M gHcy8UG5hFnZA4bIf3r0hNSJV/FH4xxvcs/AkdQpQ1y+mcAY+RXHZ0b+v6wlZP9ffSipSQ 3zUZqNk4g47K0BzyYu5mqX68JjKKQJ+K8Wvvr7PInnF8whMLefplfesaSYPadXystMAkiV smOLRxvOK+Nh6ExZHbpgdTVcmSmw13c4JYAnkWLi8MlmZwPUTWbSG7WQhBirBBvFz/qUzf 2goMCD4QTdBEAfXO/fE+9sjIAyyf/6B2PF7BxOa9W7bNo2lD5sPdsI84hXpVUA== DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=linutronix.de; s=2020e; t=1777546609; h=from:from:sender:sender:reply-to:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=nH12V7g9MQarEAo3wf0cc/kMFGqT/9FYsheOzMbeC9k=; b=YFiSP2bd3VmbyXahXZHsXQ/jizncC/ITDVSb3VaKlchEZCVRuHywvg0woI6rzYq/gfZl4A obnNXVLOQrkrThAQ== From: "tip-bot2 for Ryan Chen" Sender: tip-bot2@linutronix.de Reply-to: linux-kernel@vger.kernel.org To: linux-tip-commits@vger.kernel.org Subject: [tip: irq/drivers] irqchip/ast2700-intc: Add KUnit tests for route resolution Cc: Ryan Chen , Thomas Gleixner , x86@kernel.org, linux-kernel@vger.kernel.org In-Reply-To: <20260407-irqchip-v5-3-c0b0a300a057@aspeedtech.com> References: <20260407-irqchip-v5-3-c0b0a300a057@aspeedtech.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Message-ID: <177754660847.3521451.9996744743760129517.tip-bot2@tip-bot2> Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails Precedence: bulk Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable The following commit has been merged into the irq/drivers branch of tip: Commit-ID: 46e39ee92d14bf2248d6404119b816047144de4e Gitweb: https://git.kernel.org/tip/46e39ee92d14bf2248d6404119b816047= 144de4e Author: Ryan Chen AuthorDate: Tue, 07 Apr 2026 11:08:06 +08:00 Committer: Thomas Gleixner CommitterDate: Thu, 30 Apr 2026 12:53:04 +02:00 irqchip/ast2700-intc: Add KUnit tests for route resolution Add a KUnit suite for aspeed_intc0_resolve_route(). Cover invalid arguments, invalid domain/range data, connected and disconnected mappings, and malformed upstream range cases. Signed-off-by: Ryan Chen Signed-off-by: Thomas Gleixner Link: https://patch.msgid.link/20260407-irqchip-v5-3-c0b0a300a057@aspeedtec= h.com --- drivers/irqchip/.kunitconfig | 5 +- drivers/irqchip/Kconfig | 11 +- drivers/irqchip/Makefile | 1 +- drivers/irqchip/irq-ast2700-intc0-test.c | 473 ++++++++++++++++++++++- drivers/irqchip/irq-ast2700-intc0.c | 3 +- 5 files changed, 492 insertions(+), 1 deletion(-) create mode 100644 drivers/irqchip/.kunitconfig create mode 100644 drivers/irqchip/irq-ast2700-intc0-test.c diff --git a/drivers/irqchip/.kunitconfig b/drivers/irqchip/.kunitconfig new file mode 100644 index 0000000..00a1270 --- /dev/null +++ b/drivers/irqchip/.kunitconfig @@ -0,0 +1,5 @@ +CONFIG_KUNIT=3Dy +CONFIG_OF=3Dy +CONFIG_COMPILE_TEST=3Dy +CONFIG_ASPEED_AST2700_INTC=3Dy +CONFIG_ASPEED_AST2700_INTC_TEST=3Dy diff --git a/drivers/irqchip/Kconfig b/drivers/irqchip/Kconfig index cb446e1..387beef 100644 --- a/drivers/irqchip/Kconfig +++ b/drivers/irqchip/Kconfig @@ -122,6 +122,17 @@ config ASPEED_AST2700_INTC =20 If unsure, say N. =20 +config ASPEED_AST2700_INTC_TEST + bool "Tests for the ASPEED AST2700 Interrupt Controller" + depends on ASPEED_AST2700_INTC && KUNIT=3Dy + default KUNIT_ALL_TESTS + help + Enable KUnit tests for AST2700 INTC route resolution. + The tests exercise error handling and route selection paths. + This option is intended for test builds. + + If unsure, say N. + config ATMEL_AIC_IRQ bool select GENERIC_IRQ_CHIP diff --git a/drivers/irqchip/Makefile b/drivers/irqchip/Makefile index 6279066..ac04a4b 100644 --- a/drivers/irqchip/Makefile +++ b/drivers/irqchip/Makefile @@ -90,6 +90,7 @@ obj-$(CONFIG_MVEBU_SEI) +=3D irq-mvebu-sei.o obj-$(CONFIG_LS_EXTIRQ) +=3D irq-ls-extirq.o obj-$(CONFIG_LS_SCFG_MSI) +=3D irq-ls-scfg-msi.o obj-$(CONFIG_ASPEED_AST2700_INTC) +=3D irq-ast2700.o irq-ast2700-intc0.o i= rq-ast2700-intc1.o +obj-$(CONFIG_ASPEED_AST2700_INTC_TEST) +=3D irq-ast2700-intc0-test.o obj-$(CONFIG_ARCH_ASPEED) +=3D irq-aspeed-vic.o irq-aspeed-i2c-ic.o irq-a= speed-scu-ic.o obj-$(CONFIG_ARCH_ASPEED) +=3D irq-aspeed-intc.o obj-$(CONFIG_STM32MP_EXTI) +=3D irq-stm32mp-exti.o diff --git a/drivers/irqchip/irq-ast2700-intc0-test.c b/drivers/irqchip/irq= -ast2700-intc0-test.c new file mode 100644 index 0000000..d497845 --- /dev/null +++ b/drivers/irqchip/irq-ast2700-intc0-test.c @@ -0,0 +1,473 @@ +// SPDX-License-Identifier: GPL-2.0-only +/* + * Copyright (C) 2026 Code Construct + */ +#include + +#include "irq-ast2700.h" + +static void aspeed_intc0_resolve_route_bad_args(struct kunit *test) +{ + static const struct aspeed_intc_interrupt_range c1ranges[] =3D { 0 }; + static const u32 c1outs[] =3D { 0 }; + struct aspeed_intc_interrupt_range resolved; + const struct irq_domain c0domain =3D { 0 }; + int rc; + + rc =3D aspeed_intc0_resolve_route(NULL, 0, c1outs, 0, c1ranges, NULL); + KUNIT_EXPECT_EQ(test, rc, -EINVAL); + + rc =3D aspeed_intc0_resolve_route(&c0domain, 0, c1outs, + ARRAY_SIZE(c1ranges), c1ranges, + &resolved); + KUNIT_EXPECT_EQ(test, rc, -ENOENT); + + rc =3D aspeed_intc0_resolve_route(&c0domain, ARRAY_SIZE(c1outs), c1outs, + 0, c1ranges, &resolved); + KUNIT_EXPECT_EQ(test, rc, -ENOENT); +} + +static int gicv3_fwnode_read_string_array(const struct fwnode_handle *fwno= de, + const char *propname, const char **val, size_t nval) +{ + if (!propname) + return -EINVAL; + + if (!val) + return 1; + + if (WARN_ON(nval !=3D 1)) + return -EOVERFLOW; + + *val =3D "arm,gic-v3"; + return 1; +} + +static const struct fwnode_operations arm_gicv3_fwnode_ops =3D { + .property_read_string_array =3D gicv3_fwnode_read_string_array, +}; + +static void aspeed_intc_resolve_route_invalid_c0domain(struct kunit *test) +{ + struct device_node intc0_node =3D { + .fwnode =3D { .ops =3D &arm_gicv3_fwnode_ops }, + }; + const struct irq_domain c0domain =3D { .fwnode =3D &intc0_node.fwnode }; + static const struct aspeed_intc_interrupt_range c1ranges[] =3D { 0 }; + static const u32 c1outs[] =3D { 0 }; + struct aspeed_intc_interrupt_range resolved; + int rc; + + rc =3D aspeed_intc0_resolve_route(&c0domain, ARRAY_SIZE(c1outs), c1outs, + ARRAY_SIZE(c1ranges), c1ranges, + &resolved); + KUNIT_EXPECT_NE(test, rc, 0); +} + +static int +aspeed_intc0_fwnode_read_string_array(const struct fwnode_handle *fwnode_h= andle, + const char *propname, const char **val, + size_t nval) +{ + if (!propname) + return -EINVAL; + + if (!val) + return 1; + + if (WARN_ON(nval !=3D 1)) + return -EOVERFLOW; + + *val =3D "aspeed,ast2700-intc0"; + return nval; +} + +static const struct fwnode_operations intc0_fwnode_ops =3D { + .property_read_string_array =3D aspeed_intc0_fwnode_read_string_array, +}; + +static void +aspeed_intc0_resolve_route_c1i1o1c0i1o1_connected(struct kunit *test) +{ + struct device_node intc0_node =3D { + .fwnode =3D { .ops =3D &intc0_fwnode_ops }, + }; + struct aspeed_intc_interrupt_range c1ranges[] =3D { + { + .start =3D 0, + .count =3D 1, + .upstream =3D { + .fwnode =3D &intc0_node.fwnode, + .param_count =3D 1, + .param =3D { 128 } + } + } + }; + static const u32 c1outs[] =3D { 0 }; + struct aspeed_intc_interrupt_range resolved; + struct aspeed_intc_interrupt_range intc0_ranges[] =3D { + { + .start =3D 128, + .count =3D 1, + .upstream =3D { + .fwnode =3D NULL, + .param_count =3D 0, + .param =3D { 0 }, + } + } + }; + struct aspeed_intc0 intc0 =3D { + .ranges =3D { .ranges =3D intc0_ranges, .nranges =3D ARRAY_SIZE(intc0_ra= nges), } + }; + const struct irq_domain c0domain =3D { + .host_data =3D &intc0, + .fwnode =3D &intc0_node.fwnode + }; + int rc; + + rc =3D aspeed_intc0_resolve_route(&c0domain, ARRAY_SIZE(c1outs), c1outs, + ARRAY_SIZE(c1ranges), c1ranges, + &resolved); + KUNIT_EXPECT_EQ(test, rc, 0); + KUNIT_EXPECT_EQ(test, resolved.start, 0); + KUNIT_EXPECT_EQ(test, resolved.count, 1); + KUNIT_EXPECT_EQ(test, resolved.upstream.param[0], 128); +} + +static void +aspeed_intc0_resolve_route_c1i1o1c0i1o1_disconnected(struct kunit *test) +{ + struct device_node intc0_node =3D { + .fwnode =3D { .ops =3D &intc0_fwnode_ops }, + }; + struct aspeed_intc_interrupt_range c1ranges[] =3D { + { + .start =3D 0, + .count =3D 1, + .upstream =3D { + .fwnode =3D &intc0_node.fwnode, + .param_count =3D 1, + .param =3D { 128 } + } + } + }; + static const u32 c1outs[] =3D { 0 }; + struct aspeed_intc_interrupt_range resolved; + struct aspeed_intc_interrupt_range intc0_ranges[] =3D { + { + .start =3D 129, + .count =3D 1, + .upstream =3D { + .fwnode =3D NULL, + .param_count =3D 0, + .param =3D { 0 }, + } + } + }; + struct aspeed_intc0 intc0 =3D { + .ranges =3D { + .ranges =3D intc0_ranges, + .nranges =3D ARRAY_SIZE(intc0_ranges), + } + }; + const struct irq_domain c0domain =3D { + .host_data =3D &intc0, + .fwnode =3D &intc0_node.fwnode + }; + int rc; + + rc =3D aspeed_intc0_resolve_route(&c0domain, ARRAY_SIZE(c1outs), c1outs, + ARRAY_SIZE(c1ranges), c1ranges, + &resolved); + KUNIT_EXPECT_NE(test, rc, 0); +} + +static void aspeed_intc0_resolve_route_c1i1o1mc0i1o1(struct kunit *test) +{ + struct device_node intc0_node =3D { + .fwnode =3D { .ops =3D &intc0_fwnode_ops }, + }; + struct aspeed_intc_interrupt_range c1ranges[] =3D { + { + .start =3D 0, + .count =3D 1, + .upstream =3D { + .fwnode =3D &intc0_node.fwnode, + .param_count =3D 1, + .param =3D { 480 } + } + } + }; + static const u32 c1outs[] =3D { 0 }; + struct aspeed_intc_interrupt_range resolved; + struct aspeed_intc_interrupt_range intc0_ranges[] =3D { + { + .start =3D 192, + .count =3D 1, + .upstream =3D { + .fwnode =3D NULL, + .param_count =3D 0, + .param =3D { 0 }, + } + } + }; + struct aspeed_intc0 intc0 =3D { + .ranges =3D { + .ranges =3D intc0_ranges, + .nranges =3D ARRAY_SIZE(intc0_ranges), + } + }; + const struct irq_domain c0domain =3D { + .host_data =3D &intc0, + .fwnode =3D &intc0_node.fwnode + }; + int rc; + + rc =3D aspeed_intc0_resolve_route(&c0domain, ARRAY_SIZE(c1outs), c1outs, + ARRAY_SIZE(c1ranges), c1ranges, + &resolved); + KUNIT_EXPECT_EQ(test, rc, 0); + KUNIT_EXPECT_EQ(test, resolved.start, 0); + KUNIT_EXPECT_EQ(test, resolved.count, 1); + KUNIT_EXPECT_EQ(test, resolved.upstream.param[0], 480); +} + +static void aspeed_intc0_resolve_route_c1i2o2mc0i1o1(struct kunit *test) +{ + struct device_node intc0_node =3D { + .fwnode =3D { .ops =3D &intc0_fwnode_ops }, + }; + struct aspeed_intc_interrupt_range c1ranges[] =3D { + { + .start =3D 0, + .count =3D 1, + .upstream =3D { + .fwnode =3D &intc0_node.fwnode, + .param_count =3D 1, + .param =3D { 480 } + } + }, + { + .start =3D 1, + .count =3D 1, + .upstream =3D { + .fwnode =3D &intc0_node.fwnode, + .param_count =3D 1, + .param =3D { 510 } + } + } + }; + static const u32 c1outs[] =3D { 1 }; + struct aspeed_intc_interrupt_range resolved; + static struct aspeed_intc_interrupt_range intc0_ranges[] =3D { + { + .start =3D 208, + .count =3D 1, + .upstream =3D { + .fwnode =3D NULL, + .param_count =3D 0, + .param =3D { 0 }, + } + } + }; + struct aspeed_intc0 intc0 =3D { + .ranges =3D { + .ranges =3D intc0_ranges, + .nranges =3D ARRAY_SIZE(intc0_ranges), + } + }; + const struct irq_domain c0domain =3D { + .host_data =3D &intc0, + .fwnode =3D &intc0_node.fwnode + }; + int rc; + + rc =3D aspeed_intc0_resolve_route(&c0domain, ARRAY_SIZE(c1outs), c1outs, + ARRAY_SIZE(c1ranges), c1ranges, + &resolved); + KUNIT_EXPECT_EQ(test, rc, 0); + KUNIT_EXPECT_EQ(test, resolved.start, 1); + KUNIT_EXPECT_EQ(test, resolved.count, 1); + KUNIT_EXPECT_EQ(test, resolved.upstream.param[0], 510); +} + +static void aspeed_intc0_resolve_route_c1i1o1mc0i2o1(struct kunit *test) +{ + struct device_node intc0_node =3D { + .fwnode =3D { .ops =3D &intc0_fwnode_ops }, + }; + struct aspeed_intc_interrupt_range c1ranges[] =3D { + { + .start =3D 0, + .count =3D 1, + .upstream =3D { + .fwnode =3D &intc0_node.fwnode, + .param_count =3D 1, + .param =3D { 510 } + } + }, + }; + static const u32 c1outs[] =3D { 0 }; + struct aspeed_intc_interrupt_range resolved; + static struct aspeed_intc_interrupt_range intc0_ranges[] =3D { + { + .start =3D 192, + .count =3D 1, + .upstream =3D { + .fwnode =3D NULL, + .param_count =3D 0, + .param =3D {0}, + } + }, + { + .start =3D 208, + .count =3D 1, + .upstream =3D { + .fwnode =3D NULL, + .param_count =3D 0, + .param =3D {0}, + } + } + }; + struct aspeed_intc0 intc0 =3D { + .ranges =3D { + .ranges =3D intc0_ranges, + .nranges =3D ARRAY_SIZE(intc0_ranges), + } + }; + const struct irq_domain c0domain =3D { + .host_data =3D &intc0, + .fwnode =3D &intc0_node.fwnode + }; + int rc; + + rc =3D aspeed_intc0_resolve_route(&c0domain, ARRAY_SIZE(c1outs), c1outs, + ARRAY_SIZE(c1ranges), c1ranges, + &resolved); + KUNIT_EXPECT_EQ(test, rc, 0); + KUNIT_EXPECT_EQ(test, resolved.start, 0); + KUNIT_EXPECT_EQ(test, resolved.count, 1); + KUNIT_EXPECT_EQ(test, resolved.upstream.param[0], 510); +} + +static void aspeed_intc0_resolve_route_c1i1o2mc0i1o1_invalid(struct kunit = *test) +{ + struct device_node intc0_node =3D { + .fwnode =3D { .ops =3D &intc0_fwnode_ops }, + }; + struct aspeed_intc_interrupt_range c1ranges[] =3D { + { + .start =3D 0, + .count =3D 1, + .upstream =3D { + .fwnode =3D &intc0_node.fwnode, + .param_count =3D 1, + .param =3D { 480 } + } + } + }; + static const u32 c1outs[] =3D { + AST2700_INTC_INVALID_ROUTE, 0 + }; + struct aspeed_intc_interrupt_range resolved; + struct aspeed_intc_interrupt_range intc0_ranges[] =3D { + { + .start =3D 192, + .count =3D 1, + .upstream =3D { + .fwnode =3D NULL, + .param_count =3D 0, + .param =3D { 0 }, + } + } + }; + struct aspeed_intc0 intc0 =3D { + .ranges =3D { + .ranges =3D intc0_ranges, + .nranges =3D ARRAY_SIZE(intc0_ranges), + } + }; + const struct irq_domain c0domain =3D { + .host_data =3D &intc0, + .fwnode =3D &intc0_node.fwnode + }; + int rc; + + rc =3D aspeed_intc0_resolve_route(&c0domain, ARRAY_SIZE(c1outs), c1outs, + ARRAY_SIZE(c1ranges), c1ranges, + &resolved); + KUNIT_EXPECT_EQ(test, rc, 1); + KUNIT_EXPECT_EQ(test, resolved.start, 0); + KUNIT_EXPECT_EQ(test, resolved.count, 1); + KUNIT_EXPECT_EQ(test, resolved.upstream.param[0], 480); +} + +static void +aspeed_intc0_resolve_route_c1i1o1mc0i1o1_bad_range_upstream(struct kunit *= test) +{ + struct device_node intc0_node =3D { + .fwnode =3D { .ops =3D &intc0_fwnode_ops }, + }; + struct aspeed_intc_interrupt_range c1ranges[] =3D { + { + .start =3D 0, + .count =3D 1, + .upstream =3D { + .fwnode =3D &intc0_node.fwnode, + .param_count =3D 0, + .param =3D { 0 } + } + } + }; + static const u32 c1outs[] =3D { 0 }; + struct aspeed_intc_interrupt_range resolved; + struct aspeed_intc_interrupt_range intc0_ranges[] =3D { + { + .start =3D 0, + .count =3D 0, + .upstream =3D { + .fwnode =3D NULL, + .param_count =3D 0, + .param =3D { 0 }, + } + } + }; + struct aspeed_intc0 intc0 =3D { + .ranges =3D { + .ranges =3D intc0_ranges, + .nranges =3D ARRAY_SIZE(intc0_ranges), + } + }; + const struct irq_domain c0domain =3D { + .host_data =3D &intc0, + .fwnode =3D &intc0_node.fwnode + }; + int rc; + + rc =3D aspeed_intc0_resolve_route(&c0domain, ARRAY_SIZE(c1outs), c1outs, + ARRAY_SIZE(c1ranges), c1ranges, + &resolved); + KUNIT_EXPECT_NE(test, rc, 0); +} + +static struct kunit_case ast2700_intc0_test_cases[] =3D { + KUNIT_CASE(aspeed_intc0_resolve_route_bad_args), + KUNIT_CASE(aspeed_intc_resolve_route_invalid_c0domain), + KUNIT_CASE(aspeed_intc0_resolve_route_c1i1o1c0i1o1_connected), + KUNIT_CASE(aspeed_intc0_resolve_route_c1i1o1c0i1o1_disconnected), + KUNIT_CASE(aspeed_intc0_resolve_route_c1i1o1mc0i1o1), + KUNIT_CASE(aspeed_intc0_resolve_route_c1i2o2mc0i1o1), + KUNIT_CASE(aspeed_intc0_resolve_route_c1i1o1mc0i2o1), + KUNIT_CASE(aspeed_intc0_resolve_route_c1i1o2mc0i1o1_invalid), + KUNIT_CASE(aspeed_intc0_resolve_route_c1i1o1mc0i1o1_bad_range_upstream), + {}, +}; + +static struct kunit_suite ast2700_intc0_test_suite =3D { + .name =3D "ast2700-intc0", + .test_cases =3D ast2700_intc0_test_cases, +}; + +kunit_test_suite(ast2700_intc0_test_suite); + +MODULE_LICENSE("GPL"); diff --git a/drivers/irqchip/irq-ast2700-intc0.c b/drivers/irqchip/irq-ast2= 700-intc0.c index 65e17b2..14b8b88 100644 --- a/drivers/irqchip/irq-ast2700-intc0.c +++ b/drivers/irqchip/irq-ast2700-intc0.c @@ -311,7 +311,8 @@ int aspeed_intc0_resolve_route(const struct irq_domain = *c0domain, size_t nc1outs if (nc1outs =3D=3D 0 || nc1ranges =3D=3D 0) return -ENOENT; =20 - if (!fwnode_device_is_compatible(c0domain->fwnode, "aspeed,ast2700-intc0"= )) + if (!IS_ENABLED(CONFIG_ASPEED_AST2700_INTC_TEST) && + !fwnode_device_is_compatible(c0domain->fwnode, "aspeed,ast2700-intc0"= )) return -ENODEV; =20 intc0 =3D c0domain->host_data;