Message ID | 20220518090901.2724518-1-pierre.gondois@arm.com |
---|---|
State | New |
Headers | show |
Series | [v2,1/5] ACPI: CPPC: Check _OSC for flexible address space | expand |
On 18-05-22, 11:08, Pierre Gondois wrote: > ACPI 6.2 Section 6.2.11.2 'Platform-Wide OSPM Capabilities': > Starting with ACPI Specification 6.2, all _CPC registers can be in > PCC, System Memory, System IO, or Functional Fixed Hardware address > spaces. OSPM support for this more flexible register space scheme is > indicated by the “Flexible Address Space for CPPC Registers” _OSC bit > > Otherwise (cf ACPI 6.1, s8.4.7.1.1.X), _CPC registers must be in: > - PCC or Functional Fixed Hardware address space if defined > - SystemMemory address space (NULL register) if not defined > > Add the corresponding _OSC bit and check it when parsing _CPC objects. > > Signed-off-by: Pierre Gondois <pierre.gondois@arm.com> > Reviewed-by: Sudeep Holla <sudeep.holla@arm.com> > --- > drivers/acpi/bus.c | 18 ++++++++++++++++++ > drivers/acpi/cppc_acpi.c | 9 +++++++++ > include/linux/acpi.h | 2 ++ > 3 files changed, 29 insertions(+) It would be much useful to get a cover letter for this series with what you have changed since the previous version. It is almost impossible to find that out otherwise.
On Wed, May 18, 2022 at 11:09 AM Pierre Gondois <pierre.gondois@arm.com> wrote: > > ACPI 6.2 Section 6.2.11.2 'Platform-Wide OSPM Capabilities': > Starting with ACPI Specification 6.2, all _CPC registers can be in > PCC, System Memory, System IO, or Functional Fixed Hardware address > spaces. OSPM support for this more flexible register space scheme is > indicated by the “Flexible Address Space for CPPC Registers” _OSC bit > > Otherwise (cf ACPI 6.1, s8.4.7.1.1.X), _CPC registers must be in: > - PCC or Functional Fixed Hardware address space if defined > - SystemMemory address space (NULL register) if not defined > > Add the corresponding _OSC bit and check it when parsing _CPC objects. > > Signed-off-by: Pierre Gondois <pierre.gondois@arm.com> > Reviewed-by: Sudeep Holla <sudeep.holla@arm.com> > --- > drivers/acpi/bus.c | 18 ++++++++++++++++++ > drivers/acpi/cppc_acpi.c | 9 +++++++++ > include/linux/acpi.h | 2 ++ > 3 files changed, 29 insertions(+) > > diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c > index 3e58b613a2c4..9eca43d1d941 100644 > --- a/drivers/acpi/bus.c > +++ b/drivers/acpi/bus.c > @@ -278,6 +278,20 @@ bool osc_sb_apei_support_acked; > bool osc_pc_lpi_support_confirmed; > EXPORT_SYMBOL_GPL(osc_pc_lpi_support_confirmed); > > +/* > + * ACPI 6.2 Section 6.2.11.2 'Platform-Wide OSPM Capabilities': > + * Starting with ACPI Specification 6.2, all _CPC registers can be in > + * PCC, System Memory, System IO, or Functional Fixed Hardware address > + * spaces. OSPM support for this more flexible register space scheme is > + * indicated by the “Flexible Address Space for CPPC Registers” _OSC bit. > + * > + * Otherwise (cf ACPI 6.1, s8.4.7.1.1.X), _CPC registers must be in: > + * - PCC or Functional Fixed Hardware address space if defined > + * - SystemMemory address space (NULL register) if not defined > + */ > +bool osc_cpc_flexible_adr_space_confirmed; > +EXPORT_SYMBOL_GPL(osc_cpc_flexible_adr_space_confirmed); > + > /* > * ACPI 6.4 Operating System Capabilities for USB. > */ > @@ -321,6 +335,8 @@ static void acpi_bus_osc_negotiate_platform_control(void) > } > #endif > > + capbuf[OSC_SUPPORT_DWORD] |= OSC_SB_CPC_FLEXIBLE_ADR_SPACE; > + > if (IS_ENABLED(CONFIG_SCHED_MC_PRIO)) > capbuf[OSC_SUPPORT_DWORD] |= OSC_SB_CPC_DIVERSE_HIGH_SUPPORT; > > @@ -366,6 +382,8 @@ static void acpi_bus_osc_negotiate_platform_control(void) > capbuf_ret[OSC_SUPPORT_DWORD] & OSC_SB_PCLPI_SUPPORT; > osc_sb_native_usb4_support_confirmed = > capbuf_ret[OSC_SUPPORT_DWORD] & OSC_SB_NATIVE_USB4_SUPPORT; > + osc_cpc_flexible_adr_space_confirmed = > + capbuf_ret[OSC_SUPPORT_DWORD] & OSC_SB_CPC_FLEXIBLE_ADR_SPACE; > } > > kfree(context.ret.pointer); > diff --git a/drivers/acpi/cppc_acpi.c b/drivers/acpi/cppc_acpi.c > index bc1454789a06..6f09fe011544 100644 > --- a/drivers/acpi/cppc_acpi.c > +++ b/drivers/acpi/cppc_acpi.c > @@ -736,6 +736,11 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr) > if (gas_t->address) { > void __iomem *addr; > > + if (!osc_cpc_flexible_adr_space_confirmed) { > + pr_debug("Flexible address space capability not supported\n"); > + goto out_free; > + } > + > addr = ioremap(gas_t->address, gas_t->bit_width/8); > if (!addr) > goto out_free; > @@ -758,6 +763,10 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr) > gas_t->address); > goto out_free; > } > + if (!osc_cpc_flexible_adr_space_confirmed) { > + pr_debug("Flexible address space capability not supported\n"); > + goto out_free; > + } > } else { > if (gas_t->space_id != ACPI_ADR_SPACE_FIXED_HARDWARE || !cpc_ffh_supported()) { > /* Support only PCC, SystemMemory, SystemIO, and FFH type regs. */ > diff --git a/include/linux/acpi.h b/include/linux/acpi.h > index d7136d13aa44..03465db16b68 100644 > --- a/include/linux/acpi.h > +++ b/include/linux/acpi.h > @@ -574,6 +574,7 @@ acpi_status acpi_run_osc(acpi_handle handle, struct acpi_osc_context *context); > #define OSC_SB_OSLPI_SUPPORT 0x00000100 > #define OSC_SB_CPC_DIVERSE_HIGH_SUPPORT 0x00001000 > #define OSC_SB_GENERIC_INITIATOR_SUPPORT 0x00002000 > +#define OSC_SB_CPC_FLEXIBLE_ADR_SPACE 0x00004000 > #define OSC_SB_NATIVE_USB4_SUPPORT 0x00040000 > #define OSC_SB_PRM_SUPPORT 0x00200000 > > @@ -581,6 +582,7 @@ extern bool osc_sb_apei_support_acked; > extern bool osc_pc_lpi_support_confirmed; > extern bool osc_sb_native_usb4_support_confirmed; > extern bool osc_sb_cppc_not_supported; > +extern bool osc_cpc_flexible_adr_space_confirmed; > > /* USB4 Capabilities */ > #define OSC_USB_USB3_TUNNELING 0x00000001 > -- Applied as 5.19 material along with the rest of the series, thanks!
diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c index 3e58b613a2c4..9eca43d1d941 100644 --- a/drivers/acpi/bus.c +++ b/drivers/acpi/bus.c @@ -278,6 +278,20 @@ bool osc_sb_apei_support_acked; bool osc_pc_lpi_support_confirmed; EXPORT_SYMBOL_GPL(osc_pc_lpi_support_confirmed); +/* + * ACPI 6.2 Section 6.2.11.2 'Platform-Wide OSPM Capabilities': + * Starting with ACPI Specification 6.2, all _CPC registers can be in + * PCC, System Memory, System IO, or Functional Fixed Hardware address + * spaces. OSPM support for this more flexible register space scheme is + * indicated by the “Flexible Address Space for CPPC Registers” _OSC bit. + * + * Otherwise (cf ACPI 6.1, s8.4.7.1.1.X), _CPC registers must be in: + * - PCC or Functional Fixed Hardware address space if defined + * - SystemMemory address space (NULL register) if not defined + */ +bool osc_cpc_flexible_adr_space_confirmed; +EXPORT_SYMBOL_GPL(osc_cpc_flexible_adr_space_confirmed); + /* * ACPI 6.4 Operating System Capabilities for USB. */ @@ -321,6 +335,8 @@ static void acpi_bus_osc_negotiate_platform_control(void) } #endif + capbuf[OSC_SUPPORT_DWORD] |= OSC_SB_CPC_FLEXIBLE_ADR_SPACE; + if (IS_ENABLED(CONFIG_SCHED_MC_PRIO)) capbuf[OSC_SUPPORT_DWORD] |= OSC_SB_CPC_DIVERSE_HIGH_SUPPORT; @@ -366,6 +382,8 @@ static void acpi_bus_osc_negotiate_platform_control(void) capbuf_ret[OSC_SUPPORT_DWORD] & OSC_SB_PCLPI_SUPPORT; osc_sb_native_usb4_support_confirmed = capbuf_ret[OSC_SUPPORT_DWORD] & OSC_SB_NATIVE_USB4_SUPPORT; + osc_cpc_flexible_adr_space_confirmed = + capbuf_ret[OSC_SUPPORT_DWORD] & OSC_SB_CPC_FLEXIBLE_ADR_SPACE; } kfree(context.ret.pointer); diff --git a/drivers/acpi/cppc_acpi.c b/drivers/acpi/cppc_acpi.c index bc1454789a06..6f09fe011544 100644 --- a/drivers/acpi/cppc_acpi.c +++ b/drivers/acpi/cppc_acpi.c @@ -736,6 +736,11 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr) if (gas_t->address) { void __iomem *addr; + if (!osc_cpc_flexible_adr_space_confirmed) { + pr_debug("Flexible address space capability not supported\n"); + goto out_free; + } + addr = ioremap(gas_t->address, gas_t->bit_width/8); if (!addr) goto out_free; @@ -758,6 +763,10 @@ int acpi_cppc_processor_probe(struct acpi_processor *pr) gas_t->address); goto out_free; } + if (!osc_cpc_flexible_adr_space_confirmed) { + pr_debug("Flexible address space capability not supported\n"); + goto out_free; + } } else { if (gas_t->space_id != ACPI_ADR_SPACE_FIXED_HARDWARE || !cpc_ffh_supported()) { /* Support only PCC, SystemMemory, SystemIO, and FFH type regs. */ diff --git a/include/linux/acpi.h b/include/linux/acpi.h index d7136d13aa44..03465db16b68 100644 --- a/include/linux/acpi.h +++ b/include/linux/acpi.h @@ -574,6 +574,7 @@ acpi_status acpi_run_osc(acpi_handle handle, struct acpi_osc_context *context); #define OSC_SB_OSLPI_SUPPORT 0x00000100 #define OSC_SB_CPC_DIVERSE_HIGH_SUPPORT 0x00001000 #define OSC_SB_GENERIC_INITIATOR_SUPPORT 0x00002000 +#define OSC_SB_CPC_FLEXIBLE_ADR_SPACE 0x00004000 #define OSC_SB_NATIVE_USB4_SUPPORT 0x00040000 #define OSC_SB_PRM_SUPPORT 0x00200000 @@ -581,6 +582,7 @@ extern bool osc_sb_apei_support_acked; extern bool osc_pc_lpi_support_confirmed; extern bool osc_sb_native_usb4_support_confirmed; extern bool osc_sb_cppc_not_supported; +extern bool osc_cpc_flexible_adr_space_confirmed; /* USB4 Capabilities */ #define OSC_USB_USB3_TUNNELING 0x00000001