2022-07-18 14:31:11

by 吕建民

[permalink] [raw]
Subject: [PATCH V16 14/14] irqchip / ACPI: Introduce ACPI_IRQ_MODEL_LPIC for LoongArch

For LoongArch, ACPI_IRQ_MODEL_LPIC is introduced, and then the
callback acpi_get_gsi_domain_id and acpi_gsi_to_irq_fallback are
implemented.

The acpi_get_gsi_domain_id callback returns related fwnode handle
of irqdomain for different GSI range.

The acpi_gsi_to_irq_fallback will create new mapping for gsi when
the mapping of it is not found.

Signed-off-by: Jianmin Lv <[email protected]>
---
drivers/acpi/bus.c | 3 +++
drivers/irqchip/irq-loongarch-cpu.c | 38 +++++++++++++++++++++++++++++++++++++
include/linux/acpi.h | 1 +
3 files changed, 42 insertions(+)

diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c
index 86fa61a..63fbf00 100644
--- a/drivers/acpi/bus.c
+++ b/drivers/acpi/bus.c
@@ -1145,6 +1145,9 @@ static int __init acpi_bus_init_irq(void)
case ACPI_IRQ_MODEL_PLATFORM:
message = "platform specific model";
break;
+ case ACPI_IRQ_MODEL_LPIC:
+ message = "LPIC";
+ break;
default:
pr_info("Unknown interrupt routing model\n");
return -ENODEV;
diff --git a/drivers/irqchip/irq-loongarch-cpu.c b/drivers/irqchip/irq-loongarch-cpu.c
index b4db430..a5e0bf0 100644
--- a/drivers/irqchip/irq-loongarch-cpu.c
+++ b/drivers/irqchip/irq-loongarch-cpu.c
@@ -16,6 +16,42 @@
static struct irq_domain *irq_domain;
struct fwnode_handle *cpuintc_handle;

+static u32 lpic_gsi_to_irq(u32 gsi)
+{
+ /* Only pch irqdomain transferring is required for LoongArch. */
+ if (gsi >= GSI_MIN_PCH_IRQ && gsi <= GSI_MAX_PCH_IRQ)
+ return acpi_register_gsi(NULL, gsi, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_HIGH);
+
+ return 0;
+}
+
+static struct fwnode_handle *lpic_get_gsi_domain_id(u32 gsi)
+{
+ int id;
+ struct fwnode_handle *domain_handle = NULL;
+
+ switch (gsi) {
+ case GSI_MIN_CPU_IRQ ... GSI_MAX_CPU_IRQ:
+ if (liointc_handle)
+ domain_handle = liointc_handle;
+ break;
+
+ case GSI_MIN_LPC_IRQ ... GSI_MAX_LPC_IRQ:
+ if (pch_lpc_handle)
+ domain_handle = pch_lpc_handle;
+ break;
+
+ case GSI_MIN_PCH_IRQ ... GSI_MAX_PCH_IRQ:
+ id = find_pch_pic(gsi);
+ if (id >= 0 && pch_pic_handle[id])
+ domain_handle = pch_pic_handle[id];
+
+ break;
+ }
+
+ return domain_handle;
+}
+
static void mask_loongarch_irq(struct irq_data *d)
{
clear_csr_ecfg(ECFGF(d->hwirq));
@@ -102,6 +138,8 @@ static int __init cpuintc_acpi_init_v1(union acpi_subtable_headers *header,
panic("Failed to add irqdomain for LoongArch CPU");

set_handle_irq(&handle_cpu_irq);
+ acpi_set_irq_model(ACPI_IRQ_MODEL_LPIC, lpic_get_gsi_domain_id);
+ acpi_set_gsi_to_irq_fallback(lpic_gsi_to_irq);
acpi_cascade_irqdomain_init();

return 0;
diff --git a/include/linux/acpi.h b/include/linux/acpi.h
index e2b60d5..76520f3 100644
--- a/include/linux/acpi.h
+++ b/include/linux/acpi.h
@@ -105,6 +105,7 @@ enum acpi_irq_model_id {
ACPI_IRQ_MODEL_IOSAPIC,
ACPI_IRQ_MODEL_PLATFORM,
ACPI_IRQ_MODEL_GIC,
+ ACPI_IRQ_MODEL_LPIC,
ACPI_IRQ_MODEL_COUNT
};

--
1.8.3.1


2022-07-19 02:40:17

by Huacai Chen

[permalink] [raw]
Subject: Re: [PATCH V16 14/14] irqchip / ACPI: Introduce ACPI_IRQ_MODEL_LPIC for LoongArch

Hi, Jianmin,

On Mon, Jul 18, 2022 at 10:21 PM Jianmin Lv <[email protected]> wrote:
>
> For LoongArch, ACPI_IRQ_MODEL_LPIC is introduced, and then the
> callback acpi_get_gsi_domain_id and acpi_gsi_to_irq_fallback are
> implemented.
>
> The acpi_get_gsi_domain_id callback returns related fwnode handle
> of irqdomain for different GSI range.
>
> The acpi_gsi_to_irq_fallback will create new mapping for gsi when
> the mapping of it is not found.
>
> Signed-off-by: Jianmin Lv <[email protected]>
> ---
> drivers/acpi/bus.c | 3 +++
> drivers/irqchip/irq-loongarch-cpu.c | 38 +++++++++++++++++++++++++++++++++++++
> include/linux/acpi.h | 1 +
> 3 files changed, 42 insertions(+)
>
> diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c
> index 86fa61a..63fbf00 100644
> --- a/drivers/acpi/bus.c
> +++ b/drivers/acpi/bus.c
> @@ -1145,6 +1145,9 @@ static int __init acpi_bus_init_irq(void)
> case ACPI_IRQ_MODEL_PLATFORM:
> message = "platform specific model";
> break;
> + case ACPI_IRQ_MODEL_LPIC:
> + message = "LPIC";
> + break;
> default:
> pr_info("Unknown interrupt routing model\n");
> return -ENODEV;
> diff --git a/drivers/irqchip/irq-loongarch-cpu.c b/drivers/irqchip/irq-loongarch-cpu.c
> index b4db430..a5e0bf0 100644
> --- a/drivers/irqchip/irq-loongarch-cpu.c
> +++ b/drivers/irqchip/irq-loongarch-cpu.c
> @@ -16,6 +16,42 @@
> static struct irq_domain *irq_domain;
> struct fwnode_handle *cpuintc_handle;
>
> +static u32 lpic_gsi_to_irq(u32 gsi)
> +{
> + /* Only pch irqdomain transferring is required for LoongArch. */
> + if (gsi >= GSI_MIN_PCH_IRQ && gsi <= GSI_MAX_PCH_IRQ)
> + return acpi_register_gsi(NULL, gsi, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_HIGH);
> +
> + return 0;
> +}
> +
> +static struct fwnode_handle *lpic_get_gsi_domain_id(u32 gsi)
> +{
> + int id;
> + struct fwnode_handle *domain_handle = NULL;
> +
> + switch (gsi) {
> + case GSI_MIN_CPU_IRQ ... GSI_MAX_CPU_IRQ:
> + if (liointc_handle)
> + domain_handle = liointc_handle;
> + break;
> +
> + case GSI_MIN_LPC_IRQ ... GSI_MAX_LPC_IRQ:
> + if (pch_lpc_handle)
> + domain_handle = pch_lpc_handle;
> + break;
> +
> + case GSI_MIN_PCH_IRQ ... GSI_MAX_PCH_IRQ:
> + id = find_pch_pic(gsi);
> + if (id >= 0 && pch_pic_handle[id])
> + domain_handle = pch_pic_handle[id];
> +
Remove this blank line, please.

Huacai
> + break;
> + }
> +
> + return domain_handle;
> +}
> +
> static void mask_loongarch_irq(struct irq_data *d)
> {
> clear_csr_ecfg(ECFGF(d->hwirq));
> @@ -102,6 +138,8 @@ static int __init cpuintc_acpi_init_v1(union acpi_subtable_headers *header,
> panic("Failed to add irqdomain for LoongArch CPU");
>
> set_handle_irq(&handle_cpu_irq);
> + acpi_set_irq_model(ACPI_IRQ_MODEL_LPIC, lpic_get_gsi_domain_id);
> + acpi_set_gsi_to_irq_fallback(lpic_gsi_to_irq);
> acpi_cascade_irqdomain_init();
>
> return 0;
> diff --git a/include/linux/acpi.h b/include/linux/acpi.h
> index e2b60d5..76520f3 100644
> --- a/include/linux/acpi.h
> +++ b/include/linux/acpi.h
> @@ -105,6 +105,7 @@ enum acpi_irq_model_id {
> ACPI_IRQ_MODEL_IOSAPIC,
> ACPI_IRQ_MODEL_PLATFORM,
> ACPI_IRQ_MODEL_GIC,
> + ACPI_IRQ_MODEL_LPIC,
> ACPI_IRQ_MODEL_COUNT
> };
>
> --
> 1.8.3.1
>
>

2022-07-19 15:00:00

by 吕建民

[permalink] [raw]
Subject: Re: [PATCH V16 14/14] irqchip / ACPI: Introduce ACPI_IRQ_MODEL_LPIC for LoongArch



On 2022/7/19 上午10:25, Huacai Chen wrote:
> Hi, Jianmin,
>
> On Mon, Jul 18, 2022 at 10:21 PM Jianmin Lv <[email protected]> wrote:
>>
>> For LoongArch, ACPI_IRQ_MODEL_LPIC is introduced, and then the
>> callback acpi_get_gsi_domain_id and acpi_gsi_to_irq_fallback are
>> implemented.
>>
>> The acpi_get_gsi_domain_id callback returns related fwnode handle
>> of irqdomain for different GSI range.
>>
>> The acpi_gsi_to_irq_fallback will create new mapping for gsi when
>> the mapping of it is not found.
>>
>> Signed-off-by: Jianmin Lv <[email protected]>
>> ---
>> drivers/acpi/bus.c | 3 +++
>> drivers/irqchip/irq-loongarch-cpu.c | 38 +++++++++++++++++++++++++++++++++++++
>> include/linux/acpi.h | 1 +
>> 3 files changed, 42 insertions(+)
>>
>> diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c
>> index 86fa61a..63fbf00 100644
>> --- a/drivers/acpi/bus.c
>> +++ b/drivers/acpi/bus.c
>> @@ -1145,6 +1145,9 @@ static int __init acpi_bus_init_irq(void)
>> case ACPI_IRQ_MODEL_PLATFORM:
>> message = "platform specific model";
>> break;
>> + case ACPI_IRQ_MODEL_LPIC:
>> + message = "LPIC";
>> + break;
>> default:
>> pr_info("Unknown interrupt routing model\n");
>> return -ENODEV;
>> diff --git a/drivers/irqchip/irq-loongarch-cpu.c b/drivers/irqchip/irq-loongarch-cpu.c
>> index b4db430..a5e0bf0 100644
>> --- a/drivers/irqchip/irq-loongarch-cpu.c
>> +++ b/drivers/irqchip/irq-loongarch-cpu.c
>> @@ -16,6 +16,42 @@
>> static struct irq_domain *irq_domain;
>> struct fwnode_handle *cpuintc_handle;
>>
>> +static u32 lpic_gsi_to_irq(u32 gsi)
>> +{
>> + /* Only pch irqdomain transferring is required for LoongArch. */
>> + if (gsi >= GSI_MIN_PCH_IRQ && gsi <= GSI_MAX_PCH_IRQ)
>> + return acpi_register_gsi(NULL, gsi, ACPI_LEVEL_SENSITIVE, ACPI_ACTIVE_HIGH);
>> +
>> + return 0;
>> +}
>> +
>> +static struct fwnode_handle *lpic_get_gsi_domain_id(u32 gsi)
>> +{
>> + int id;
>> + struct fwnode_handle *domain_handle = NULL;
>> +
>> + switch (gsi) {
>> + case GSI_MIN_CPU_IRQ ... GSI_MAX_CPU_IRQ:
>> + if (liointc_handle)
>> + domain_handle = liointc_handle;
>> + break;
>> +
>> + case GSI_MIN_LPC_IRQ ... GSI_MAX_LPC_IRQ:
>> + if (pch_lpc_handle)
>> + domain_handle = pch_lpc_handle;
>> + break;
>> +
>> + case GSI_MIN_PCH_IRQ ... GSI_MAX_PCH_IRQ:
>> + id = find_pch_pic(gsi);
>> + if (id >= 0 && pch_pic_handle[id])
>> + domain_handle = pch_pic_handle[id];
>> +
> Remove this blank line, please.
>

Ok, thanks.


> Huacai
>> + break;
>> + }
>> +
>> + return domain_handle;
>> +}
>> +
>> static void mask_loongarch_irq(struct irq_data *d)
>> {
>> clear_csr_ecfg(ECFGF(d->hwirq));
>> @@ -102,6 +138,8 @@ static int __init cpuintc_acpi_init_v1(union acpi_subtable_headers *header,
>> panic("Failed to add irqdomain for LoongArch CPU");
>>
>> set_handle_irq(&handle_cpu_irq);
>> + acpi_set_irq_model(ACPI_IRQ_MODEL_LPIC, lpic_get_gsi_domain_id);
>> + acpi_set_gsi_to_irq_fallback(lpic_gsi_to_irq);
>> acpi_cascade_irqdomain_init();
>>
>> return 0;
>> diff --git a/include/linux/acpi.h b/include/linux/acpi.h
>> index e2b60d5..76520f3 100644
>> --- a/include/linux/acpi.h
>> +++ b/include/linux/acpi.h
>> @@ -105,6 +105,7 @@ enum acpi_irq_model_id {
>> ACPI_IRQ_MODEL_IOSAPIC,
>> ACPI_IRQ_MODEL_PLATFORM,
>> ACPI_IRQ_MODEL_GIC,
>> + ACPI_IRQ_MODEL_LPIC,
>> ACPI_IRQ_MODEL_COUNT
>> };
>>
>> --
>> 1.8.3.1
>>
>>

2022-07-19 23:16:16

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH V16 14/14] irqchip / ACPI: Introduce ACPI_IRQ_MODEL_LPIC for LoongArch

Hi Jianmin,

Thank you for the patch! Yet something to improve:

[auto build test ERROR on rafael-pm/linux-next]
[also build test ERROR on linus/master v5.19-rc7 next-20220719]
[cannot apply to tip/irq/core]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url: https://github.com/intel-lab-lkp/linux/commits/Jianmin-Lv/irqchip-Add-LoongArch-related-irqchip-drivers/20220718-222340
base: https://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git linux-next
config: loongarch-randconfig-c003-20220718 (https://download.01.org/0day-ci/archive/20220720/[email protected]/config)
compiler: loongarch64-linux-gcc (GCC) 12.1.0
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# https://github.com/intel-lab-lkp/linux/commit/f8e9b95288022d4cbe61fbd94cffee6821fbfb7d
git remote add linux-review https://github.com/intel-lab-lkp/linux
git fetch --no-tags linux-review Jianmin-Lv/irqchip-Add-LoongArch-related-irqchip-drivers/20220718-222340
git checkout f8e9b95288022d4cbe61fbd94cffee6821fbfb7d
# save the config file
mkdir build_dir && cp config build_dir/.config
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=loongarch SHELL=/bin/bash

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <[email protected]>

All errors (new ones prefixed by >>):

loongarch64-linux-ld: drivers/irqchip/irq-loongarch-cpu.o: in function `lpic_get_gsi_domain_id':
>> irq-loongarch-cpu.c:(.text+0x10): undefined reference to `pch_lpc_handle'
>> loongarch64-linux-ld: irq-loongarch-cpu.c:(.text+0x14): undefined reference to `pch_lpc_handle'
>> loongarch64-linux-ld: irq-loongarch-cpu.c:(.text+0x14): undefined reference to `pch_lpc_handle'
>> loongarch64-linux-ld: irq-loongarch-cpu.c:(.text+0x68): undefined reference to `liointc_handle'
loongarch64-linux-ld: irq-loongarch-cpu.c:(.text+0x6c): undefined reference to `liointc_handle'
loongarch64-linux-ld: irq-loongarch-cpu.c:(.text+0x6c): undefined reference to `liointc_handle'
loongarch64-linux-ld: drivers/irqchip/irq-loongarch-cpu.o: in function `eiointc_parse_madt':
irq-loongarch-cpu.c:(.init.text+0x10): undefined reference to `eiointc_acpi_init'
loongarch64-linux-ld: drivers/irqchip/irq-loongarch-cpu.o: in function `liointc_parse_madt':
irq-loongarch-cpu.c:(.init.text+0x24): undefined reference to `liointc_acpi_init'
loongarch64-linux-ld: drivers/irqchip/irq-loongson-pch-pic.o: in function `lpcintc_parse_madt':
irq-loongson-pch-pic.c:(.init.text+0x14): undefined reference to `pch_lpc_acpi_init'
loongarch64-linux-ld: drivers/video/fbdev/efifb.o: in function `depth_show':
efifb.c:(.text+0x48): undefined reference to `screen_info'
loongarch64-linux-ld: efifb.c:(.text+0x4c): undefined reference to `screen_info'
loongarch64-linux-ld: efifb.c:(.text+0x4c): undefined reference to `screen_info'
loongarch64-linux-ld: drivers/video/fbdev/efifb.o: in function `height_show':
efifb.c:(.text+0x94): undefined reference to `screen_info'
loongarch64-linux-ld: efifb.c:(.text+0x98): undefined reference to `screen_info'
loongarch64-linux-ld: drivers/video/fbdev/efifb.o:efifb.c:(.text+0x98): more undefined references to `screen_info' follow

--
0-DAY CI Kernel Test Service
https://01.org/lkp