As mentioned in ACPI v6.3, Table 6-200, the platform will indicate to the OS whether or not it supports usage of ResourceSource. If not set, the OS may choose to ignore the ResourceSource parameter in the extended interrupt descriptor. Since we support parsing ResoureSource field of interrupts both for platform devices and PCI Interrupt Link devices now, this patch sets the relevant OSC bit and checks the capability as described in ACPI specification. Signed-off-by: Chen Baozi <chenbaozi@xxxxxxxxxxxxxx> Cc: Jonathan Cameron <Jonathan.Cameron@xxxxxxxxxx> --- drivers/acpi/bus.c | 5 +++++ drivers/acpi/irq.c | 3 ++- include/linux/acpi.h | 4 +++- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c index 1682f8b454a2..a6af1270bea6 100644 --- a/drivers/acpi/bus.c +++ b/drivers/acpi/bus.c @@ -281,6 +281,8 @@ bool osc_sb_apei_support_acked; bool osc_pc_lpi_support_confirmed; EXPORT_SYMBOL_GPL(osc_pc_lpi_support_confirmed); +bool osc_sb_intr_ressrc_support_confirmed; + static u8 sb_uuid_str[] = "0811B06E-4A27-44F9-8D60-3CBBC22E7B48"; static void acpi_bus_osc_support(void) { @@ -303,6 +305,7 @@ static void acpi_bus_osc_support(void) capbuf[OSC_SUPPORT_DWORD] |= OSC_SB_HOTPLUG_OST_SUPPORT; capbuf[OSC_SUPPORT_DWORD] |= OSC_SB_PCLPI_SUPPORT; + capbuf[OSC_SUPPORT_DWORD] |= OSC_SB_INTR_RESSRC_SUPPORT; #ifdef CONFIG_ARM64 capbuf[OSC_SUPPORT_DWORD] |= OSC_SB_GENERIC_INITIATOR_SUPPORT; #endif @@ -328,6 +331,8 @@ static void acpi_bus_osc_support(void) capbuf_ret[OSC_SUPPORT_DWORD] & OSC_SB_APEI_SUPPORT; osc_pc_lpi_support_confirmed = capbuf_ret[OSC_SUPPORT_DWORD] & OSC_SB_PCLPI_SUPPORT; + osc_sb_intr_ressrc_support_confirmed = + capbuf_ret[OSC_SUPPORT_DWORD] & OSC_SB_INTR_RESSRC_SUPPORT; } kfree(context.ret.pointer); } diff --git a/drivers/acpi/irq.c b/drivers/acpi/irq.c index 86336a89f73e..8f4d2dff5538 100644 --- a/drivers/acpi/irq.c +++ b/drivers/acpi/irq.c @@ -108,7 +108,8 @@ acpi_get_irq_source_fwhandle(const struct acpi_resource_source *source) acpi_handle handle; acpi_status status; - if (!source->string_length) + if (!osc_sb_intr_ressrc_support_confirmed || + !source->string_length) return acpi_gsi_domain_id; status = acpi_get_handle(NULL, source->string_ptr, &handle); diff --git a/include/linux/acpi.h b/include/linux/acpi.h index b182a267fe66..f9ca8e117f31 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h @@ -555,10 +555,12 @@ acpi_status acpi_run_osc(acpi_handle handle, struct acpi_osc_context *context); #define OSC_SB_PCLPI_SUPPORT 0x00000080 #define OSC_SB_OSLPI_SUPPORT 0x00000100 #define OSC_SB_CPC_DIVERSE_HIGH_SUPPORT 0x00001000 -#define OSC_SB_GENERIC_INITIATOR_SUPPORT 0x00002000 +#define OSC_SB_INTR_RESSRC_SUPPORT 0x00002000 +#define OSC_SB_GENERIC_INITIATOR_SUPPORT 0x00020000 extern bool osc_sb_apei_support_acked; extern bool osc_pc_lpi_support_confirmed; +extern bool osc_sb_intr_ressrc_support_confirmed; /* PCI Host Bridge _OSC: Capabilities DWORD 2: Support Field */ #define OSC_PCI_EXT_CONFIG_SUPPORT 0x00000001 -- 2.28.0