]> Git Repo - J-linux.git/commitdiff
ACPI: allow building without CONFIG_HAS_IOPORT
authorArnd Bergmann <[email protected]>
Wed, 30 Oct 2024 12:36:41 +0000 (12:36 +0000)
committerRafael J. Wysocki <[email protected]>
Tue, 5 Nov 2024 20:41:10 +0000 (21:41 +0100)
CONFIG_HAS_IOPORT will soon become optional and cause a build time
failure when it is disabled but a driver calls inb()/outb(). At the
moment, all architectures that can support ACPI have port I/O, but this
is not necessarily the case in the future on non-x86 architectures.
The result is a set of errors like:

drivers/acpi/osl.c: In function 'acpi_os_read_port':
include/asm-generic/io.h:542:14: error: call to '_inb' declared with attribute error: inb()) requires CONFIG_HAS_IOPORT

Nothing should actually call these functions in this configuration,
and if it does, the result would be undefined behavior today, possibly
a NULL pointer dereference.

Change the low-level functions to return a proper error code when
HAS_IOPORT is disabled.

Signed-off-by: Arnd Bergmann <[email protected]>
Reviewed-by: Andy Shevchenko <[email protected]>
Link: https://patch.msgid.link/[email protected]
Signed-off-by: Rafael J. Wysocki <[email protected]>
drivers/acpi/cppc_acpi.c
drivers/acpi/osl.c

index 1a40f0514eaa368322b86e1be61bc7d6d56f9944..3757424b715f1299d81d39c81eec2f9d096613ae 100644 (file)
@@ -1017,7 +1017,8 @@ static int cpc_read(int cpu, struct cpc_register_resource *reg_res, u64 *val)
        *val = 0;
        size = GET_BIT_WIDTH(reg);
 
-       if (reg->space_id == ACPI_ADR_SPACE_SYSTEM_IO) {
+       if (IS_ENABLED(CONFIG_HAS_IOPORT) &&
+           reg->space_id == ACPI_ADR_SPACE_SYSTEM_IO) {
                u32 val_u32;
                acpi_status status;
 
@@ -1091,7 +1092,8 @@ static int cpc_write(int cpu, struct cpc_register_resource *reg_res, u64 val)
 
        size = GET_BIT_WIDTH(reg);
 
-       if (reg->space_id == ACPI_ADR_SPACE_SYSTEM_IO) {
+       if (IS_ENABLED(CONFIG_HAS_IOPORT) &&
+           reg->space_id == ACPI_ADR_SPACE_SYSTEM_IO) {
                acpi_status status;
 
                status = acpi_os_write_port((acpi_io_address)reg->address,
index 70af3fbbebe54c459ad5e58e6f45c0f468db8496..fed446aace4259446ebd83297b0fefa9cf4e1cd6 100644 (file)
@@ -642,6 +642,15 @@ acpi_status acpi_os_read_port(acpi_io_address port, u32 *value, u32 width)
 {
        u32 dummy;
 
+       if (!IS_ENABLED(CONFIG_HAS_IOPORT)) {
+               /*
+                * set all-1 result as if reading from non-existing
+                * I/O port
+                */
+               *value = GENMASK(width, 0);
+               return AE_NOT_IMPLEMENTED;
+       }
+
        if (value)
                *value = 0;
        else
@@ -665,6 +674,9 @@ EXPORT_SYMBOL(acpi_os_read_port);
 
 acpi_status acpi_os_write_port(acpi_io_address port, u32 value, u32 width)
 {
+       if (!IS_ENABLED(CONFIG_HAS_IOPORT))
+               return AE_NOT_IMPLEMENTED;
+
        if (width <= 8) {
                outb(value, port);
        } else if (width <= 16) {
This page took 0.061589 seconds and 4 git commands to generate.