diff mbox series

acpi: Support CONFIG_ACPI without CONFIG_PCI

Message ID 20240613211011.413120-1-surajjs@amazon.com (mailing list archive)
State New
Headers show
Series acpi: Support CONFIG_ACPI without CONFIG_PCI | expand

Commit Message

Jitindar Singh, Suraj June 13, 2024, 9:10 p.m. UTC
Make is possible to use ACPI without having CONFIG_PCI set.

When initialising ACPI the following call chain occurs:

  acpi_init() ->
    acpi_bus_init() ->
      acpi_load_tables() ->
        acpi_ev_install_region_handlers() ->

acpi_ev_install_region_handlers() calls acpi_ev_install_space_handler() on
each of the default address spaces defined as:

  u8 acpi_gbl_default_address_spaces[ACPI_NUM_DEFAULT_SPACES] = {
          ACPI_ADR_SPACE_SYSTEM_MEMORY,
          ACPI_ADR_SPACE_SYSTEM_IO,
          ACPI_ADR_SPACE_PCI_CONFIG,
          ACPI_ADR_SPACE_DATA_TABLE
  };

However in acpi_ev_install_space_handler() the case statement for
ACPI_ADR_SPACE_PCI_CONFIG is ifdef'd as:

  #ifdef ACPI_PCI_CONFIGURED
                  case ACPI_ADR_SPACE_PCI_CONFIG:

                          handler = acpi_ex_pci_config_space_handler;
                          setup = acpi_ev_pci_config_region_setup;
                          break;
  #endif

ACPI_PCI_CONFIGURED is not defined if CONFIG_PCI is not enabled, thus the
attempt to install the handler fails.

Fix this by ifdef'ing ACPI_ADR_SPACE_PCI_CONFIG in the list of default
address spaces.

Fixes: bd23fac3eaaa ("ACPICA: Remove PCI bits from ACPICA when CONFIG_PCI is unset")
CC: stable@vger.kernel.org # 5.0.x-
Signed-off-by: Suraj Jitindar Singh <surajjs@amazon.com>
---
 drivers/acpi/acpica/evhandler.c | 2 ++
 1 file changed, 2 insertions(+)

Comments

Rafael J. Wysocki June 14, 2024, 11:08 a.m. UTC | #1
On Thu, Jun 13, 2024 at 11:10 PM Suraj Jitindar Singh
<surajjs@amazon.com> wrote:
>
> Make is possible to use ACPI without having CONFIG_PCI set.
>
> When initialising ACPI the following call chain occurs:
>
>   acpi_init() ->
>     acpi_bus_init() ->
>       acpi_load_tables() ->
>         acpi_ev_install_region_handlers() ->
>
> acpi_ev_install_region_handlers() calls acpi_ev_install_space_handler() on
> each of the default address spaces defined as:
>
>   u8 acpi_gbl_default_address_spaces[ACPI_NUM_DEFAULT_SPACES] = {
>           ACPI_ADR_SPACE_SYSTEM_MEMORY,
>           ACPI_ADR_SPACE_SYSTEM_IO,
>           ACPI_ADR_SPACE_PCI_CONFIG,
>           ACPI_ADR_SPACE_DATA_TABLE
>   };
>
> However in acpi_ev_install_space_handler() the case statement for
> ACPI_ADR_SPACE_PCI_CONFIG is ifdef'd as:
>
>   #ifdef ACPI_PCI_CONFIGURED
>                   case ACPI_ADR_SPACE_PCI_CONFIG:
>
>                           handler = acpi_ex_pci_config_space_handler;
>                           setup = acpi_ev_pci_config_region_setup;
>                           break;
>   #endif
>
> ACPI_PCI_CONFIGURED is not defined if CONFIG_PCI is not enabled, thus the
> attempt to install the handler fails.
>
> Fix this by ifdef'ing ACPI_ADR_SPACE_PCI_CONFIG in the list of default
> address spaces.

What if there are PCI operation regions in the AML on the platform?
How are they going to be handled?

> Fixes: bd23fac3eaaa ("ACPICA: Remove PCI bits from ACPICA when CONFIG_PCI is unset")
> CC: stable@vger.kernel.org # 5.0.x-
> Signed-off-by: Suraj Jitindar Singh <surajjs@amazon.com>
> ---
>  drivers/acpi/acpica/evhandler.c | 2 ++
>  1 file changed, 2 insertions(+)
>
> diff --git a/drivers/acpi/acpica/evhandler.c b/drivers/acpi/acpica/evhandler.c
> index 1c8cb6d924df..371093acb362 100644
> --- a/drivers/acpi/acpica/evhandler.c
> +++ b/drivers/acpi/acpica/evhandler.c
> @@ -26,7 +26,9 @@ acpi_ev_install_handler(acpi_handle obj_handle,
>  u8 acpi_gbl_default_address_spaces[ACPI_NUM_DEFAULT_SPACES] = {
>         ACPI_ADR_SPACE_SYSTEM_MEMORY,
>         ACPI_ADR_SPACE_SYSTEM_IO,
> +#ifdef ACPI_PCI_CONFIGURED
>         ACPI_ADR_SPACE_PCI_CONFIG,
> +#endif
>         ACPI_ADR_SPACE_DATA_TABLE
>  };
>
> --
> 2.34.1
>
>
Jitindar Singh, Suraj July 2, 2024, 11:01 p.m. UTC | #2
On Fri, 2024-06-14 at 13:08 +0200, Rafael J. Wysocki wrote:
> On Thu, Jun 13, 2024 at 11:10 PM Suraj Jitindar Singh
> <surajjs@amazon.com> wrote:
> > 
> > Make is possible to use ACPI without having CONFIG_PCI set.
> > 
> > When initialising ACPI the following call chain occurs:
> > 
> >   acpi_init() ->
> >     acpi_bus_init() ->
> >       acpi_load_tables() ->
> >         acpi_ev_install_region_handlers() ->
> > 
> > acpi_ev_install_region_handlers() calls
> > acpi_ev_install_space_handler() on
> > each of the default address spaces defined as:
> > 
> >   u8 acpi_gbl_default_address_spaces[ACPI_NUM_DEFAULT_SPACES] = {
> >           ACPI_ADR_SPACE_SYSTEM_MEMORY,
> >           ACPI_ADR_SPACE_SYSTEM_IO,
> >           ACPI_ADR_SPACE_PCI_CONFIG,
> >           ACPI_ADR_SPACE_DATA_TABLE
> >   };
> > 
> > However in acpi_ev_install_space_handler() the case statement for
> > ACPI_ADR_SPACE_PCI_CONFIG is ifdef'd as:
> > 
> >   #ifdef ACPI_PCI_CONFIGURED
> >                   case ACPI_ADR_SPACE_PCI_CONFIG:
> > 
> >                           handler =
> > acpi_ex_pci_config_space_handler;
> >                           setup = acpi_ev_pci_config_region_setup;
> >                           break;
> >   #endif
> > 
> > ACPI_PCI_CONFIGURED is not defined if CONFIG_PCI is not enabled,
> > thus the
> > attempt to install the handler fails.
> > 
> > Fix this by ifdef'ing ACPI_ADR_SPACE_PCI_CONFIG in the list of
> > default
> > address spaces.
> 
> What if there are PCI operation regions in the AML on the platform?
> How are they going to be handled?

Hi,

Appreciate the response.

I think the short answer is that if there are PCI operation regions in
the AML on the platform then the kernel will need to be built with PCI
support (CONFIG_PCI) and if it isn't then there won't be a handler
installed and the operation will error.

Correct me if I'm wrong but it seems the intention of the patch series:

36ad7d2b9e9b ACPI: Move PCI reset to a separate function
86689776878f ACPI: Allow CONFIG_PCI to be unset for reboot
bd23fac3eaaa ACPICA: Remove PCI bits from ACPICA when CONFIG_PCI is
unset
5d32a66541c4 PCI/ACPI: Allow ACPI to be built without CONFIG_PCI set

was to decouple the dependency between CONFIG_PCI and CONFIG_ACPI.

bd23fac3eaaa ("ACPICA: Remove PCI bits from ACPICA when CONFIG_PCI is
unset") added an ifdef around the code to install the handler for the
PCI CONFIG region making it dependent on ACPI_PCI_CONFIGURED (and thus
CONFIG_PCI). Thus it is not possible to install the default handler for
the PCI CONFIG region unless CONFIG_PCI is set meaning it makes no
sense to have it in the list of default address spaces.

I can gather that this leads to 2 possibilities:

1. If there are PCI operation regions in the AML on the platform then
these will error on a kernel not compiled with CONFIG_PCI.

or,

2. The code to install the handler for the PCI CONFIG region should not
be ifdef'ed and should be executed irrespective of if the kernel is
compiled with CONFIG_PCI to allow for PCI CONFIG regions in the AML.

Thanks

> 
> > Fixes: bd23fac3eaaa ("ACPICA: Remove PCI bits from ACPICA when
> > CONFIG_PCI is unset")
> > CC: stable@vger.kernel.org # 5.0.x-
> > Signed-off-by: Suraj Jitindar Singh <surajjs@amazon.com>
> > ---
> >  drivers/acpi/acpica/evhandler.c | 2 ++
> >  1 file changed, 2 insertions(+)
> > 
> > diff --git a/drivers/acpi/acpica/evhandler.c
> > b/drivers/acpi/acpica/evhandler.c
> > index 1c8cb6d924df..371093acb362 100644
> > --- a/drivers/acpi/acpica/evhandler.c
> > +++ b/drivers/acpi/acpica/evhandler.c
> > @@ -26,7 +26,9 @@ acpi_ev_install_handler(acpi_handle obj_handle,
> >  u8 acpi_gbl_default_address_spaces[ACPI_NUM_DEFAULT_SPACES] = {
> >         ACPI_ADR_SPACE_SYSTEM_MEMORY,
> >         ACPI_ADR_SPACE_SYSTEM_IO,
> > +#ifdef ACPI_PCI_CONFIGURED
> >         ACPI_ADR_SPACE_PCI_CONFIG,
> > +#endif
> >         ACPI_ADR_SPACE_DATA_TABLE
> >  };
> > 
> > --
> > 2.34.1
> > 
> >
Rafael J. Wysocki July 4, 2024, 12:16 p.m. UTC | #3
On Wed, Jul 3, 2024 at 1:01 AM Jitindar Singh, Suraj <surajjs@amazon.com> wrote:
>
> On Fri, 2024-06-14 at 13:08 +0200, Rafael J. Wysocki wrote:
> > On Thu, Jun 13, 2024 at 11:10 PM Suraj Jitindar Singh
> > <surajjs@amazon.com> wrote:
> > >
> > > Make is possible to use ACPI without having CONFIG_PCI set.
> > >
> > > When initialising ACPI the following call chain occurs:
> > >
> > >   acpi_init() ->
> > >     acpi_bus_init() ->
> > >       acpi_load_tables() ->
> > >         acpi_ev_install_region_handlers() ->
> > >
> > > acpi_ev_install_region_handlers() calls
> > > acpi_ev_install_space_handler() on
> > > each of the default address spaces defined as:
> > >
> > >   u8 acpi_gbl_default_address_spaces[ACPI_NUM_DEFAULT_SPACES] = {
> > >           ACPI_ADR_SPACE_SYSTEM_MEMORY,
> > >           ACPI_ADR_SPACE_SYSTEM_IO,
> > >           ACPI_ADR_SPACE_PCI_CONFIG,
> > >           ACPI_ADR_SPACE_DATA_TABLE
> > >   };
> > >
> > > However in acpi_ev_install_space_handler() the case statement for
> > > ACPI_ADR_SPACE_PCI_CONFIG is ifdef'd as:
> > >
> > >   #ifdef ACPI_PCI_CONFIGURED
> > >                   case ACPI_ADR_SPACE_PCI_CONFIG:
> > >
> > >                           handler =
> > > acpi_ex_pci_config_space_handler;
> > >                           setup = acpi_ev_pci_config_region_setup;
> > >                           break;
> > >   #endif
> > >
> > > ACPI_PCI_CONFIGURED is not defined if CONFIG_PCI is not enabled,
> > > thus the
> > > attempt to install the handler fails.
> > >
> > > Fix this by ifdef'ing ACPI_ADR_SPACE_PCI_CONFIG in the list of
> > > default
> > > address spaces.
> >
> > What if there are PCI operation regions in the AML on the platform?
> > How are they going to be handled?
>
> Hi,
>
> Appreciate the response.
>
> I think the short answer is that if there are PCI operation regions in
> the AML on the platform then the kernel will need to be built with PCI
> support (CONFIG_PCI) and if it isn't then there won't be a handler
> installed and the operation will error.

A problem with this approach is that AML has no good way of handling
such errors.  It accesses a location in an address space of some sort
and expects the access to be successful.

The interpreter can catch them, but then the only thing it can do is
to abort the AML which then may lead to all sorts of unexpected
behavior of the platform.

> Correct me if I'm wrong but it seems the intention of the patch series:
>
> 36ad7d2b9e9b ACPI: Move PCI reset to a separate function
> 86689776878f ACPI: Allow CONFIG_PCI to be unset for reboot
> bd23fac3eaaa ACPICA: Remove PCI bits from ACPICA when CONFIG_PCI is
> unset
> 5d32a66541c4 PCI/ACPI: Allow ACPI to be built without CONFIG_PCI set
>
> was to decouple the dependency between CONFIG_PCI and CONFIG_ACPI.

Yes, and as per the above, it was a mistake.

> bd23fac3eaaa ("ACPICA: Remove PCI bits from ACPICA when CONFIG_PCI is
> unset") added an ifdef around the code to install the handler for the
> PCI CONFIG region making it dependent on ACPI_PCI_CONFIGURED (and thus
> CONFIG_PCI). Thus it is not possible to install the default handler for
> the PCI CONFIG region unless CONFIG_PCI is set meaning it makes no
> sense to have it in the list of default address spaces.
>
> I can gather that this leads to 2 possibilities:
>
> 1. If there are PCI operation regions in the AML on the platform then
> these will error on a kernel not compiled with CONFIG_PCI.

But as I said, there is no good way of handling such errors.
Basically, the kernel should panic() in those cases.

> or,
>
> 2. The code to install the handler for the PCI CONFIG region should not
> be ifdef'ed and should be executed irrespective of if the kernel is
> compiled with CONFIG_PCI to allow for PCI CONFIG regions in the AML.

That doesn't work either because the PCI config address space may not
be really accessible without CONFIG_PCI.

IOW, I don't see how this can be made work.

Can you please remind me what the use case for ACPI without PCI is?
diff mbox series

Patch

diff --git a/drivers/acpi/acpica/evhandler.c b/drivers/acpi/acpica/evhandler.c
index 1c8cb6d924df..371093acb362 100644
--- a/drivers/acpi/acpica/evhandler.c
+++ b/drivers/acpi/acpica/evhandler.c
@@ -26,7 +26,9 @@  acpi_ev_install_handler(acpi_handle obj_handle,
 u8 acpi_gbl_default_address_spaces[ACPI_NUM_DEFAULT_SPACES] = {
 	ACPI_ADR_SPACE_SYSTEM_MEMORY,
 	ACPI_ADR_SPACE_SYSTEM_IO,
+#ifdef ACPI_PCI_CONFIGURED
 	ACPI_ADR_SPACE_PCI_CONFIG,
+#endif
 	ACPI_ADR_SPACE_DATA_TABLE
 };