* [PATCH v4 0/5] ACPI: platform: Fix SMB0001 enumeration on Kontron devices
@ 2023-07-03 12:14 Andy Shevchenko
2023-07-03 12:14 ` [PATCH v4 1/5] ACPI: bus: Introduce acpi_match_acpi_device() helper Andy Shevchenko
` (5 more replies)
0 siblings, 6 replies; 10+ messages in thread
From: Andy Shevchenko @ 2023-07-03 12:14 UTC (permalink / raw)
To: Andy Shevchenko, Rafael J. Wysocki, Wolfram Sang, Andi Shyti,
linux-acpi, linux-kernel, linux-i2c, acpica-devel
Cc: Rafael J. Wysocki, Len Brown, Robert Moore, Michael Walle
After switching i2c-scmi driver to be a plaform one, it stopped
being enumerated on number of Kontron platforms, because it's
listed in the forbidden_id_list.
To resolve the situation, add a flag and check if there are resources
privided for the forbiden device. If it is the case, the device must
be skipped.
Changelog v4:
- dropped applied patch
- added kernel doc for new helper (Rafael)
- rewritten the commit message for the reason of a new helper (Rafael)
- added a couple of patches for ACPI scan.c that can be applied later on
Changelog v3:
- provided completely rewritten solution (Rafael)
- due to above, added two new patches
- due to above, dropped tags from patch 3
Andy Shevchenko (5):
ACPI: bus: Introduce acpi_match_acpi_device() helper
ACPI: platform: Ignore SMB0001 only when it has resources
ACPI: platform: Move SMB0001 HID to the header and reuse
ACPI: scan: Use the acpi_match_acpi_device() helper
ACPI: scan: Provide symbol declarations
drivers/acpi/acpi_platform.c | 30 +++++++++++++++++++++++++++---
drivers/acpi/bus.c | 25 +++++++++++++++++++++----
drivers/acpi/scan.c | 22 +++++++++++++---------
drivers/i2c/busses/i2c-scmi.c | 3 ---
include/acpi/acpi_drivers.h | 2 ++
include/linux/acpi.h | 9 +++++++++
6 files changed, 72 insertions(+), 19 deletions(-)
--
2.40.0.1.gaa8946217a0b
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH v4 1/5] ACPI: bus: Introduce acpi_match_acpi_device() helper
2023-07-03 12:14 [PATCH v4 0/5] ACPI: platform: Fix SMB0001 enumeration on Kontron devices Andy Shevchenko
@ 2023-07-03 12:14 ` Andy Shevchenko
2023-07-03 12:14 ` [PATCH v4 2/5] ACPI: platform: Ignore SMB0001 only when it has resources Andy Shevchenko
` (4 subsequent siblings)
5 siblings, 0 replies; 10+ messages in thread
From: Andy Shevchenko @ 2023-07-03 12:14 UTC (permalink / raw)
To: Andy Shevchenko, Rafael J. Wysocki, Wolfram Sang, Andi Shyti,
linux-acpi, linux-kernel, linux-i2c, acpica-devel
Cc: Rafael J. Wysocki, Len Brown, Robert Moore, Michael Walle
Match the ACPI device against a given list of ACPI IDs.
This may be helpful in different cases.
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
drivers/acpi/bus.c | 25 +++++++++++++++++++++----
include/linux/acpi.h | 9 +++++++++
2 files changed, 30 insertions(+), 4 deletions(-)
diff --git a/drivers/acpi/bus.c b/drivers/acpi/bus.c
index 20cdfb37da79..2fc2b43a4ed3 100644
--- a/drivers/acpi/bus.c
+++ b/drivers/acpi/bus.c
@@ -850,6 +850,26 @@ static bool __acpi_match_device(const struct acpi_device *device,
return true;
}
+/**
+ * acpi_match_acpi_device - Match an ACPI device against a given list of ACPI IDs
+ * @ids: Array of struct acpi_device_id objects to match against.
+ * @adev: The ACPI device pointer to match.
+ *
+ * Match the ACPI device @adev against a given list of ACPI IDs @ids.
+ *
+ * Return:
+ * a pointer to the first matching ACPI ID on success or %NULL on failure.
+ */
+const struct acpi_device_id *acpi_match_acpi_device(const struct acpi_device_id *ids,
+ const struct acpi_device *adev)
+{
+ const struct acpi_device_id *id = NULL;
+
+ __acpi_match_device(adev, ids, NULL, &id, NULL);
+ return id;
+}
+EXPORT_SYMBOL_GPL(acpi_match_acpi_device);
+
/**
* acpi_match_device - Match a struct device against a given list of ACPI IDs
* @ids: Array of struct acpi_device_id object to match against.
@@ -864,10 +884,7 @@ static bool __acpi_match_device(const struct acpi_device *device,
const struct acpi_device_id *acpi_match_device(const struct acpi_device_id *ids,
const struct device *dev)
{
- const struct acpi_device_id *id = NULL;
-
- __acpi_match_device(acpi_companion_match(dev), ids, NULL, &id, NULL);
- return id;
+ return acpi_match_acpi_device(ids, acpi_companion_match(dev));
}
EXPORT_SYMBOL_GPL(acpi_match_device);
diff --git a/include/linux/acpi.h b/include/linux/acpi.h
index 640f1c07c894..641dc4843987 100644
--- a/include/linux/acpi.h
+++ b/include/linux/acpi.h
@@ -707,6 +707,9 @@ extern int acpi_nvs_register(__u64 start, __u64 size);
extern int acpi_nvs_for_each_region(int (*func)(__u64, __u64, void *),
void *data);
+const struct acpi_device_id *acpi_match_acpi_device(const struct acpi_device_id *ids,
+ const struct acpi_device *adev);
+
const struct acpi_device_id *acpi_match_device(const struct acpi_device_id *ids,
const struct device *dev);
@@ -922,6 +925,12 @@ static inline int acpi_nvs_for_each_region(int (*func)(__u64, __u64, void *),
struct acpi_device_id;
+static inline const struct acpi_device_id *acpi_match_acpi_device(
+ const struct acpi_device_id *ids, const struct acpi_device *adev)
+{
+ return NULL;
+}
+
static inline const struct acpi_device_id *acpi_match_device(
const struct acpi_device_id *ids, const struct device *dev)
{
--
2.40.0.1.gaa8946217a0b
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v4 2/5] ACPI: platform: Ignore SMB0001 only when it has resources
2023-07-03 12:14 [PATCH v4 0/5] ACPI: platform: Fix SMB0001 enumeration on Kontron devices Andy Shevchenko
2023-07-03 12:14 ` [PATCH v4 1/5] ACPI: bus: Introduce acpi_match_acpi_device() helper Andy Shevchenko
@ 2023-07-03 12:14 ` Andy Shevchenko
2023-07-04 17:32 ` Rafael J. Wysocki
2023-07-03 12:14 ` [PATCH v4 3/5] ACPI: platform: Move SMB0001 HID to the header and reuse Andy Shevchenko
` (3 subsequent siblings)
5 siblings, 1 reply; 10+ messages in thread
From: Andy Shevchenko @ 2023-07-03 12:14 UTC (permalink / raw)
To: Andy Shevchenko, Rafael J. Wysocki, Wolfram Sang, Andi Shyti,
linux-acpi, linux-kernel, linux-i2c, acpica-devel
Cc: Rafael J. Wysocki, Len Brown, Robert Moore, Michael Walle
After switching i2c-scmi driver to be a platform one, it stopped
being enumerated on number of Kontron platforms, because it's
listed in the forbidden_id_list.
To resolve the situation, add a flag to driver data to allow devices
with no resources in _CRS to be enumerated via platform bus.
Fixes: 03d4287add6e ("i2c: scmi: Convert to be a platform driver")
Closes: https://lore.kernel.org/r/60c1756765b9a3f1eab0dcbd84f59f00fe1caf48.camel@kontron.com
Link: https://lore.kernel.org/r/20230621151652.79579-1-andriy.shevchenko@linux.intel.com
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
Reviewed-by: Andi Shyti <andi.shyti@kernel.org>
---
drivers/acpi/acpi_platform.c | 30 +++++++++++++++++++++++++++---
1 file changed, 27 insertions(+), 3 deletions(-)
diff --git a/drivers/acpi/acpi_platform.c b/drivers/acpi/acpi_platform.c
index fe00a5783f53..c2ce558bd032 100644
--- a/drivers/acpi/acpi_platform.c
+++ b/drivers/acpi/acpi_platform.c
@@ -9,6 +9,7 @@
*/
#include <linux/acpi.h>
+#include <linux/bits.h>
#include <linux/device.h>
#include <linux/err.h>
#include <linux/kernel.h>
@@ -19,13 +20,16 @@
#include "internal.h"
+/* Exclude devices that have no _CRS resources provided */
+#define ACPI_ALLOW_WO_RESOURCES BIT(0)
+
static const struct acpi_device_id forbidden_id_list[] = {
{"ACPI0009", 0}, /* IOxAPIC */
{"ACPI000A", 0}, /* IOAPIC */
{"PNP0000", 0}, /* PIC */
{"PNP0100", 0}, /* Timer */
{"PNP0200", 0}, /* AT DMA Controller */
- {"SMB0001", 0}, /* ACPI SMBUS virtual device */
+ {"SMB0001", ACPI_ALLOW_WO_RESOURCES}, /* ACPI SMBUS virtual device */
{ }
};
@@ -83,6 +87,15 @@ static void acpi_platform_fill_resource(struct acpi_device *adev,
dest->parent = pci_find_resource(to_pci_dev(parent), dest);
}
+static unsigned int acpi_platform_resource_count(struct acpi_resource *ares, void *data)
+{
+ bool *has_resources = data;
+
+ *has_resources = true;
+
+ return AE_CTRL_TERMINATE;
+}
+
/**
* acpi_create_platform_device - Create platform device for ACPI device node
* @adev: ACPI device node to create a platform device for.
@@ -100,17 +113,28 @@ struct platform_device *acpi_create_platform_device(struct acpi_device *adev,
struct acpi_device *parent = acpi_dev_parent(adev);
struct platform_device *pdev = NULL;
struct platform_device_info pdevinfo;
+ const struct acpi_device_id *match;
struct resource_entry *rentry;
struct list_head resource_list;
struct resource *resources = NULL;
+ bool has_resources;
int count;
/* If the ACPI node already has a physical device attached, skip it. */
if (adev->physical_node_count)
return NULL;
- if (!acpi_match_device_ids(adev, forbidden_id_list))
- return ERR_PTR(-EINVAL);
+ match = acpi_match_acpi_device(forbidden_id_list, adev);
+ if (match) {
+ if (match->driver_data & ACPI_ALLOW_WO_RESOURCES) {
+ acpi_walk_resources(adev->handle, METHOD_NAME__CRS,
+ acpi_platform_resource_count, &has_resources);
+ if (has_resources)
+ return ERR_PTR(-EINVAL);
+ } else {
+ return ERR_PTR(-EINVAL);
+ }
+ }
INIT_LIST_HEAD(&resource_list);
count = acpi_dev_get_resources(adev, &resource_list, NULL, NULL);
--
2.40.0.1.gaa8946217a0b
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v4 3/5] ACPI: platform: Move SMB0001 HID to the header and reuse
2023-07-03 12:14 [PATCH v4 0/5] ACPI: platform: Fix SMB0001 enumeration on Kontron devices Andy Shevchenko
2023-07-03 12:14 ` [PATCH v4 1/5] ACPI: bus: Introduce acpi_match_acpi_device() helper Andy Shevchenko
2023-07-03 12:14 ` [PATCH v4 2/5] ACPI: platform: Ignore SMB0001 only when it has resources Andy Shevchenko
@ 2023-07-03 12:14 ` Andy Shevchenko
2023-07-03 12:14 ` [PATCH v4 4/5] ACPI: scan: Use the acpi_match_acpi_device() helper Andy Shevchenko
` (2 subsequent siblings)
5 siblings, 0 replies; 10+ messages in thread
From: Andy Shevchenko @ 2023-07-03 12:14 UTC (permalink / raw)
To: Andy Shevchenko, Rafael J. Wysocki, Wolfram Sang, Andi Shyti,
linux-acpi, linux-kernel, linux-i2c, acpica-devel
Cc: Rafael J. Wysocki, Len Brown, Robert Moore, Michael Walle
There are at least two places in the kernel that are using
the SMB0001 HID. Make it to be available via acpi_drivers.h
header file. While at it, replace hard coded one with a
definition.
Reviewed-by: Andi Shyti <andi.shyti@kernel.org>
Acked-by: Wolfram Sang <wsa@kernel.org> # for I2C
Link: https://lore.kernel.org/r/20230621151652.79579-2-andriy.shevchenko@linux.intel.com
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
drivers/acpi/acpi_platform.c | 2 +-
drivers/i2c/busses/i2c-scmi.c | 3 ---
include/acpi/acpi_drivers.h | 2 ++
3 files changed, 3 insertions(+), 4 deletions(-)
diff --git a/drivers/acpi/acpi_platform.c b/drivers/acpi/acpi_platform.c
index c2ce558bd032..3867d5389c51 100644
--- a/drivers/acpi/acpi_platform.c
+++ b/drivers/acpi/acpi_platform.c
@@ -29,7 +29,7 @@ static const struct acpi_device_id forbidden_id_list[] = {
{"PNP0000", 0}, /* PIC */
{"PNP0100", 0}, /* Timer */
{"PNP0200", 0}, /* AT DMA Controller */
- {"SMB0001", ACPI_ALLOW_WO_RESOURCES}, /* ACPI SMBUS virtual device */
+ {ACPI_SMBUS_MS_HID, ACPI_ALLOW_WO_RESOURCES}, /* ACPI SMBUS virtual device */
{ }
};
diff --git a/drivers/i2c/busses/i2c-scmi.c b/drivers/i2c/busses/i2c-scmi.c
index 104570292241..421735acfa14 100644
--- a/drivers/i2c/busses/i2c-scmi.c
+++ b/drivers/i2c/busses/i2c-scmi.c
@@ -13,9 +13,6 @@
#include <linux/i2c.h>
#include <linux/acpi.h>
-/* SMBUS HID definition as supported by Microsoft Windows */
-#define ACPI_SMBUS_MS_HID "SMB0001"
-
struct smbus_methods_t {
char *mt_info;
char *mt_sbr;
diff --git a/include/acpi/acpi_drivers.h b/include/acpi/acpi_drivers.h
index 8372b0e7fd15..b14d165632e7 100644
--- a/include/acpi/acpi_drivers.h
+++ b/include/acpi/acpi_drivers.h
@@ -27,6 +27,8 @@
#define ACPI_BAY_HID "LNXIOBAY"
#define ACPI_DOCK_HID "LNXDOCK"
#define ACPI_ECDT_HID "LNXEC"
+/* SMBUS HID definition as supported by Microsoft Windows */
+#define ACPI_SMBUS_MS_HID "SMB0001"
/* Quirk for broken IBM BIOSes */
#define ACPI_SMBUS_IBM_HID "SMBUSIBM"
--
2.40.0.1.gaa8946217a0b
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v4 4/5] ACPI: scan: Use the acpi_match_acpi_device() helper
2023-07-03 12:14 [PATCH v4 0/5] ACPI: platform: Fix SMB0001 enumeration on Kontron devices Andy Shevchenko
` (2 preceding siblings ...)
2023-07-03 12:14 ` [PATCH v4 3/5] ACPI: platform: Move SMB0001 HID to the header and reuse Andy Shevchenko
@ 2023-07-03 12:14 ` Andy Shevchenko
2023-07-03 12:14 ` [PATCH v4 5/5] ACPI: scan: Provide symbol declarations Andy Shevchenko
2023-07-03 13:09 ` [PATCH v4 0/5] ACPI: platform: Fix SMB0001 enumeration on Kontron devices Andy Shevchenko
5 siblings, 0 replies; 10+ messages in thread
From: Andy Shevchenko @ 2023-07-03 12:14 UTC (permalink / raw)
To: Andy Shevchenko, Rafael J. Wysocki, Wolfram Sang, Andi Shyti,
linux-acpi, linux-kernel, linux-i2c, acpica-devel
Cc: Rafael J. Wysocki, Len Brown, Robert Moore, Michael Walle
Instead of doing two pass parsing of the table, replace
acpi_match_device_ids() with acpi_match_acpi_device().
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
drivers/acpi/scan.c | 21 ++++++++++++---------
1 file changed, 12 insertions(+), 9 deletions(-)
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index e75ed9123931..ec1c9bec8bae 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -928,26 +928,29 @@ static int acpi_bus_extract_wakeup_device_power_package(struct acpi_device *dev)
return err;
}
+/* Do not use a button for S5 wakeup */
+#define ACPI_AVOID_WAKE_FROM_S5 BIT(0)
+
static bool acpi_wakeup_gpe_init(struct acpi_device *device)
{
static const struct acpi_device_id button_device_ids[] = {
- {"PNP0C0C", 0}, /* Power button */
- {"PNP0C0D", 0}, /* Lid */
- {"PNP0C0E", 0}, /* Sleep button */
+ {"PNP0C0C", 0}, /* Power button */
+ {"PNP0C0D", ACPI_AVOID_WAKE_FROM_S5}, /* Lid */
+ {"PNP0C0E", ACPI_AVOID_WAKE_FROM_S5}, /* Sleep button */
{"", 0},
};
struct acpi_device_wakeup *wakeup = &device->wakeup;
+ const struct acpi_device_id *match;
acpi_status status;
wakeup->flags.notifier_present = 0;
/* Power button, Lid switch always enable wakeup */
- if (!acpi_match_device_ids(device, button_device_ids)) {
- if (!acpi_match_device_ids(device, &button_device_ids[1])) {
- /* Do not use Lid/sleep button for S5 wakeup */
- if (wakeup->sleep_state == ACPI_STATE_S5)
- wakeup->sleep_state = ACPI_STATE_S4;
- }
+ match = acpi_match_acpi_device(button_device_ids, device);
+ if (match) {
+ if ((match->driver_data & ACPI_AVOID_WAKE_FROM_S5) &&
+ wakeup->sleep_state == ACPI_STATE_S5)
+ wakeup->sleep_state = ACPI_STATE_S4;
acpi_mark_gpe_for_wake(wakeup->gpe_device, wakeup->gpe_number);
device_set_wakeup_capable(&device->dev, true);
return true;
--
2.40.0.1.gaa8946217a0b
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH v4 5/5] ACPI: scan: Provide symbol declarations
2023-07-03 12:14 [PATCH v4 0/5] ACPI: platform: Fix SMB0001 enumeration on Kontron devices Andy Shevchenko
` (3 preceding siblings ...)
2023-07-03 12:14 ` [PATCH v4 4/5] ACPI: scan: Use the acpi_match_acpi_device() helper Andy Shevchenko
@ 2023-07-03 12:14 ` Andy Shevchenko
2023-07-04 17:21 ` Rafael J. Wysocki
2023-07-03 13:09 ` [PATCH v4 0/5] ACPI: platform: Fix SMB0001 enumeration on Kontron devices Andy Shevchenko
5 siblings, 1 reply; 10+ messages in thread
From: Andy Shevchenko @ 2023-07-03 12:14 UTC (permalink / raw)
To: Andy Shevchenko, Rafael J. Wysocki, Wolfram Sang, Andi Shyti,
linux-acpi, linux-kernel, linux-i2c, acpica-devel
Cc: Rafael J. Wysocki, Len Brown, Robert Moore, Michael Walle
Compiler is not happy about a couple of symbols that, it thinks,
are not declared:
warning: symbol 'acpi_device_lock' was not declared. Should it be static?
warning: symbol 'acpi_wakeup_device_list' was not declared. Should it be static?
Include "sleep.h" to have them explicitly declared and make
the compiler happy.
Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
---
drivers/acpi/scan.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
index ec1c9bec8bae..5b145f1aaa1b 100644
--- a/drivers/acpi/scan.c
+++ b/drivers/acpi/scan.c
@@ -23,6 +23,7 @@
#include <linux/dma-direct.h>
#include "internal.h"
+#include "sleep.h"
#define ACPI_BUS_CLASS "system_bus"
#define ACPI_BUS_HID "LNXSYBUS"
--
2.40.0.1.gaa8946217a0b
^ permalink raw reply related [flat|nested] 10+ messages in thread
* Re: [PATCH v4 0/5] ACPI: platform: Fix SMB0001 enumeration on Kontron devices
2023-07-03 12:14 [PATCH v4 0/5] ACPI: platform: Fix SMB0001 enumeration on Kontron devices Andy Shevchenko
` (4 preceding siblings ...)
2023-07-03 12:14 ` [PATCH v4 5/5] ACPI: scan: Provide symbol declarations Andy Shevchenko
@ 2023-07-03 13:09 ` Andy Shevchenko
5 siblings, 0 replies; 10+ messages in thread
From: Andy Shevchenko @ 2023-07-03 13:09 UTC (permalink / raw)
To: Rafael J. Wysocki, Wolfram Sang, Andi Shyti, linux-acpi,
linux-kernel, linux-i2c, acpica-devel
Cc: Rafael J. Wysocki, Len Brown, Robert Moore, Michael Walle
On Mon, Jul 03, 2023 at 03:14:06PM +0300, Andy Shevchenko wrote:
> After switching i2c-scmi driver to be a plaform one, it stopped
> being enumerated on number of Kontron platforms, because it's
> listed in the forbidden_id_list.
>
> To resolve the situation, add a flag and check if there are resources
> privided for the forbiden device. If it is the case, the device must
> be skipped.
...
> Changelog v4:
> - dropped applied patch
> - added kernel doc for new helper (Rafael)
> - rewritten the commit message for the reason of a new helper (Rafael)
> - added a couple of patches for ACPI scan.c that can be applied later on
- converted to use boolean instead of integer (Rafael)
- added tag (Andi)
> Changelog v3:
> - provided completely rewritten solution (Rafael)
> - due to above, added two new patches
> - due to above, dropped tags from patch 3
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v4 5/5] ACPI: scan: Provide symbol declarations
2023-07-03 12:14 ` [PATCH v4 5/5] ACPI: scan: Provide symbol declarations Andy Shevchenko
@ 2023-07-04 17:21 ` Rafael J. Wysocki
0 siblings, 0 replies; 10+ messages in thread
From: Rafael J. Wysocki @ 2023-07-04 17:21 UTC (permalink / raw)
To: Andy Shevchenko
Cc: Rafael J. Wysocki, Wolfram Sang, Andi Shyti, linux-acpi,
linux-kernel, linux-i2c, acpica-devel, Rafael J. Wysocki,
Len Brown, Robert Moore, Michael Walle
On Mon, Jul 3, 2023 at 2:14 PM Andy Shevchenko
<andriy.shevchenko@linux.intel.com> wrote:
>
> Compiler is not happy about a couple of symbols that, it thinks,
> are not declared:
>
> warning: symbol 'acpi_device_lock' was not declared. Should it be static?
> warning: symbol 'acpi_wakeup_device_list' was not declared. Should it be static?
>
> Include "sleep.h" to have them explicitly declared and make
> the compiler happy.
>
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
I've just applied a patch from Ben Dooks making the exact same change.
> ---
> drivers/acpi/scan.c | 1 +
> 1 file changed, 1 insertion(+)
>
> diff --git a/drivers/acpi/scan.c b/drivers/acpi/scan.c
> index ec1c9bec8bae..5b145f1aaa1b 100644
> --- a/drivers/acpi/scan.c
> +++ b/drivers/acpi/scan.c
> @@ -23,6 +23,7 @@
> #include <linux/dma-direct.h>
>
> #include "internal.h"
> +#include "sleep.h"
>
> #define ACPI_BUS_CLASS "system_bus"
> #define ACPI_BUS_HID "LNXSYBUS"
> --
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v4 2/5] ACPI: platform: Ignore SMB0001 only when it has resources
2023-07-03 12:14 ` [PATCH v4 2/5] ACPI: platform: Ignore SMB0001 only when it has resources Andy Shevchenko
@ 2023-07-04 17:32 ` Rafael J. Wysocki
2023-07-06 9:27 ` Andy Shevchenko
0 siblings, 1 reply; 10+ messages in thread
From: Rafael J. Wysocki @ 2023-07-04 17:32 UTC (permalink / raw)
To: Andy Shevchenko
Cc: Rafael J. Wysocki, Wolfram Sang, Andi Shyti, linux-acpi,
linux-kernel, linux-i2c, acpica-devel, Rafael J. Wysocki,
Len Brown, Robert Moore, Michael Walle
On Mon, Jul 3, 2023 at 2:14 PM Andy Shevchenko
<andriy.shevchenko@linux.intel.com> wrote:
>
> After switching i2c-scmi driver to be a platform one, it stopped
> being enumerated on number of Kontron platforms, because it's
> listed in the forbidden_id_list.
>
> To resolve the situation, add a flag to driver data to allow devices
> with no resources in _CRS to be enumerated via platform bus.
>
> Fixes: 03d4287add6e ("i2c: scmi: Convert to be a platform driver")
> Closes: https://lore.kernel.org/r/60c1756765b9a3f1eab0dcbd84f59f00fe1caf48.camel@kontron.com
> Link: https://lore.kernel.org/r/20230621151652.79579-1-andriy.shevchenko@linux.intel.com
> Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
> Reviewed-by: Andi Shyti <andi.shyti@kernel.org>
> ---
> drivers/acpi/acpi_platform.c | 30 +++++++++++++++++++++++++++---
> 1 file changed, 27 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/acpi/acpi_platform.c b/drivers/acpi/acpi_platform.c
> index fe00a5783f53..c2ce558bd032 100644
> --- a/drivers/acpi/acpi_platform.c
> +++ b/drivers/acpi/acpi_platform.c
> @@ -9,6 +9,7 @@
> */
>
> #include <linux/acpi.h>
> +#include <linux/bits.h>
> #include <linux/device.h>
> #include <linux/err.h>
> #include <linux/kernel.h>
> @@ -19,13 +20,16 @@
>
> #include "internal.h"
>
> +/* Exclude devices that have no _CRS resources provided */
> +#define ACPI_ALLOW_WO_RESOURCES BIT(0)
> +
> static const struct acpi_device_id forbidden_id_list[] = {
> {"ACPI0009", 0}, /* IOxAPIC */
> {"ACPI000A", 0}, /* IOAPIC */
> {"PNP0000", 0}, /* PIC */
> {"PNP0100", 0}, /* Timer */
> {"PNP0200", 0}, /* AT DMA Controller */
> - {"SMB0001", 0}, /* ACPI SMBUS virtual device */
> + {"SMB0001", ACPI_ALLOW_WO_RESOURCES}, /* ACPI SMBUS virtual device */
> { }
> };
>
> @@ -83,6 +87,15 @@ static void acpi_platform_fill_resource(struct acpi_device *adev,
> dest->parent = pci_find_resource(to_pci_dev(parent), dest);
> }
>
> +static unsigned int acpi_platform_resource_count(struct acpi_resource *ares, void *data)
> +{
> + bool *has_resources = data;
> +
> + *has_resources = true;
> +
> + return AE_CTRL_TERMINATE;
> +}
> +
> /**
> * acpi_create_platform_device - Create platform device for ACPI device node
> * @adev: ACPI device node to create a platform device for.
> @@ -100,17 +113,28 @@ struct platform_device *acpi_create_platform_device(struct acpi_device *adev,
> struct acpi_device *parent = acpi_dev_parent(adev);
> struct platform_device *pdev = NULL;
> struct platform_device_info pdevinfo;
> + const struct acpi_device_id *match;
> struct resource_entry *rentry;
> struct list_head resource_list;
> struct resource *resources = NULL;
> + bool has_resources;
> int count;
>
> /* If the ACPI node already has a physical device attached, skip it. */
> if (adev->physical_node_count)
> return NULL;
>
> - if (!acpi_match_device_ids(adev, forbidden_id_list))
> - return ERR_PTR(-EINVAL);
> + match = acpi_match_acpi_device(forbidden_id_list, adev);
> + if (match) {
> + if (match->driver_data & ACPI_ALLOW_WO_RESOURCES) {
> + acpi_walk_resources(adev->handle, METHOD_NAME__CRS,
> + acpi_platform_resource_count, &has_resources);
> + if (has_resources)
> + return ERR_PTR(-EINVAL);
> + } else {
> + return ERR_PTR(-EINVAL);
> + }
> + }
>
> INIT_LIST_HEAD(&resource_list);
> count = acpi_dev_get_resources(adev, &resource_list, NULL, NULL);
> --
Applied as 6.5-rc material along with the rest of the series (except
for the last patch that has been superseded), but I moved the
has_resources definition to the block where it is used and added a
'false' initial value to it. as the code might not work as expected
without initializing it.
Please double check the bleeding-edge branch of linux-pm.
Thanks!
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [PATCH v4 2/5] ACPI: platform: Ignore SMB0001 only when it has resources
2023-07-04 17:32 ` Rafael J. Wysocki
@ 2023-07-06 9:27 ` Andy Shevchenko
0 siblings, 0 replies; 10+ messages in thread
From: Andy Shevchenko @ 2023-07-06 9:27 UTC (permalink / raw)
To: Rafael J. Wysocki
Cc: Rafael J. Wysocki, Wolfram Sang, Andi Shyti, linux-acpi,
linux-kernel, linux-i2c, acpica-devel, Len Brown, Robert Moore,
Michael Walle
On Tue, Jul 04, 2023 at 07:32:43PM +0200, Rafael J. Wysocki wrote:
> On Mon, Jul 3, 2023 at 2:14 PM Andy Shevchenko
> <andriy.shevchenko@linux.intel.com> wrote:
...
> Applied as 6.5-rc material along with the rest of the series (except
> for the last patch that has been superseded), but I moved the
> has_resources definition to the block where it is used and added a
> 'false' initial value to it. as the code might not work as expected
> without initializing it.
>
> Please double check the bleeding-edge branch of linux-pm.
Now it's in Linux Next and everything looks fine to me,
thank you!
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2023-07-06 9:27 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-07-03 12:14 [PATCH v4 0/5] ACPI: platform: Fix SMB0001 enumeration on Kontron devices Andy Shevchenko
2023-07-03 12:14 ` [PATCH v4 1/5] ACPI: bus: Introduce acpi_match_acpi_device() helper Andy Shevchenko
2023-07-03 12:14 ` [PATCH v4 2/5] ACPI: platform: Ignore SMB0001 only when it has resources Andy Shevchenko
2023-07-04 17:32 ` Rafael J. Wysocki
2023-07-06 9:27 ` Andy Shevchenko
2023-07-03 12:14 ` [PATCH v4 3/5] ACPI: platform: Move SMB0001 HID to the header and reuse Andy Shevchenko
2023-07-03 12:14 ` [PATCH v4 4/5] ACPI: scan: Use the acpi_match_acpi_device() helper Andy Shevchenko
2023-07-03 12:14 ` [PATCH v4 5/5] ACPI: scan: Provide symbol declarations Andy Shevchenko
2023-07-04 17:21 ` Rafael J. Wysocki
2023-07-03 13:09 ` [PATCH v4 0/5] ACPI: platform: Fix SMB0001 enumeration on Kontron devices Andy Shevchenko
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox