2023-06-20 16:41:56

by Andy Shevchenko

[permalink] [raw]
Subject: [PATCH v1 1/2] ACPI: platform: Ignore SMB0001 only when it has resources

After switchind i2c-scmi driver to be a plaform one it stopped
being enumerated on number of Kontron platformsm, because it's
listed in the forbidden_id_list.

To resolve the situation, split the list to generic one and
another that holds devices that has to be skiped if and only if
they have bogus resources attached (_CRS method returns some).

Fixes: 03d4287add6e ("i2c: scmi: Convert to be a platform driver")
Closes: https://lore.kernel.org/r/[email protected]
Reported-by: Michael Brunner <[email protected]>
Signed-off-by: Andy Shevchenko <[email protected]>
---
drivers/acpi/acpi_platform.c | 27 +++++++++++++++++++++++++--
1 file changed, 25 insertions(+), 2 deletions(-)

diff --git a/drivers/acpi/acpi_platform.c b/drivers/acpi/acpi_platform.c
index fe00a5783f53..089a98bd18bf 100644
--- a/drivers/acpi/acpi_platform.c
+++ b/drivers/acpi/acpi_platform.c
@@ -19,13 +19,17 @@

#include "internal.h"

+static const struct acpi_device_id forbidden_id_with_resourses[] = {
+ {"SMB0001", 0}, /* ACPI SMBUS virtual device */
+ { }
+};
+
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 */
{ }
};

@@ -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 int acpi_platform_resource_count(struct acpi_resource *ares, void *data)
+{
+ int *count = data;
+
+ *count = *count + 1;
+
+ return 1;
+}
+
/**
* acpi_create_platform_device - Create platform device for ACPI device node
* @adev: ACPI device node to create a platform device for.
@@ -103,7 +116,8 @@ struct platform_device *acpi_create_platform_device(struct acpi_device *adev,
struct resource_entry *rentry;
struct list_head resource_list;
struct resource *resources = NULL;
- int count;
+ int count = 0;
+ int ret;

/* If the ACPI node already has a physical device attached, skip it. */
if (adev->physical_node_count)
@@ -113,6 +127,15 @@ struct platform_device *acpi_create_platform_device(struct acpi_device *adev,
return ERR_PTR(-EINVAL);

INIT_LIST_HEAD(&resource_list);
+ ret = acpi_dev_get_resources(adev, &resource_list, acpi_platform_resource_count, &count);
+ if (ret < 0)
+ return ERR_PTR(ret);
+
+ acpi_dev_free_resource_list(&resource_list);
+
+ if (count > 0 && !acpi_match_device_ids(adev, forbidden_id_with_resourses))
+ return ERR_PTR(-EINVAL);
+
count = acpi_dev_get_resources(adev, &resource_list, NULL, NULL);
if (count < 0)
return NULL;
--
2.40.0.1.gaa8946217a0b



2023-06-20 17:02:55

by Andy Shevchenko

[permalink] [raw]
Subject: [PATCH v1 2/2] ACPI: platform: Move SMB0001 HID to the header and reuse

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.

Signed-off-by: Andy Shevchenko <[email protected]>
---
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 089a98bd18bf..e86f76ee3473 100644
--- a/drivers/acpi/acpi_platform.c
+++ b/drivers/acpi/acpi_platform.c
@@ -20,7 +20,7 @@
#include "internal.h"

static const struct acpi_device_id forbidden_id_with_resourses[] = {
- {"SMB0001", 0}, /* ACPI SMBUS virtual device */
+ {ACPI_SMBUS_MS_HID, 0}, /* 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


2023-06-21 08:14:32

by Michael Brunner

[permalink] [raw]
Subject: Re: [PATCH v1 1/2] ACPI: platform: Ignore SMB0001 only when it has resources

On Tue, 2023-06-20 at 19:35 +0300, Andy Shevchenko wrote:
> After switchind i2c-scmi driver to be a plaform one it stopped
> being enumerated on number of Kontron platformsm, because it's
> listed in the forbidden_id_list.
>
> To resolve the situation, split the list to generic one and
> another that holds devices that has to be skiped if and only if
> they have bogus resources attached (_CRS method returns some).
>
> Fixes: 03d4287add6e ("i2c: scmi: Convert to be a platform driver")
> Closes: https://lore.kernel.org/r/[email protected]
> Reported-by: Michael Brunner <[email protected]>
> Signed-off-by: Andy Shevchenko <[email protected]>

Works as expected - the SMB0001 device shows up as platform device and
the i2c-scmi driver is enumerated again on the affected boards.
Thanks a lot!

Best regards,
Michael Brunner

2023-06-21 09:52:10

by Andi Shyti

[permalink] [raw]
Subject: Re: [PATCH v1 1/2] ACPI: platform: Ignore SMB0001 only when it has resources

Hi Andy,

On Tue, Jun 20, 2023 at 07:35:33PM +0300, Andy Shevchenko wrote:
> After switchind i2c-scmi driver to be a plaform one it stopped

/switchind/switching/
/one/one,/

> being enumerated on number of Kontron platformsm, because it's

/platformsm/platforms/

> listed in the forbidden_id_list.
>
> To resolve the situation, split the list to generic one and
> another that holds devices that has to be skiped if and only if

/skiped/skipped/

> they have bogus resources attached (_CRS method returns some).
>
> Fixes: 03d4287add6e ("i2c: scmi: Convert to be a platform driver")
> Closes: https://lore.kernel.org/r/[email protected]
> Reported-by: Michael Brunner <[email protected]>
> Signed-off-by: Andy Shevchenko <[email protected]>
> ---
> drivers/acpi/acpi_platform.c | 27 +++++++++++++++++++++++++--
> 1 file changed, 25 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/acpi/acpi_platform.c b/drivers/acpi/acpi_platform.c
> index fe00a5783f53..089a98bd18bf 100644
> --- a/drivers/acpi/acpi_platform.c
> +++ b/drivers/acpi/acpi_platform.c
> @@ -19,13 +19,17 @@
>
> #include "internal.h"
>
> +static const struct acpi_device_id forbidden_id_with_resourses[] = {
> + {"SMB0001", 0}, /* ACPI SMBUS virtual device */
> + { }
> +};
> +
> 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 */
> { }
> };
>
> @@ -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 int acpi_platform_resource_count(struct acpi_resource *ares, void *data)
> +{
> + int *count = data;
> +
> + *count = *count + 1;
> +
> + return 1;
> +}
> +
> /**
> * acpi_create_platform_device - Create platform device for ACPI device node
> * @adev: ACPI device node to create a platform device for.
> @@ -103,7 +116,8 @@ struct platform_device *acpi_create_platform_device(struct acpi_device *adev,
> struct resource_entry *rentry;
> struct list_head resource_list;
> struct resource *resources = NULL;
> - int count;
> + int count = 0;
> + int ret;
>
> /* If the ACPI node already has a physical device attached, skip it. */
> if (adev->physical_node_count)
> @@ -113,6 +127,15 @@ struct platform_device *acpi_create_platform_device(struct acpi_device *adev,
> return ERR_PTR(-EINVAL);
>
> INIT_LIST_HEAD(&resource_list);
> + ret = acpi_dev_get_resources(adev, &resource_list, acpi_platform_resource_count, &count);
> + if (ret < 0)
> + return ERR_PTR(ret);
> +
> + acpi_dev_free_resource_list(&resource_list);
> +
> + if (count > 0 && !acpi_match_device_ids(adev, forbidden_id_with_resourses))
> + return ERR_PTR(-EINVAL);

... so that you rule out first the devices in this list.

Reviewed-by: Andi Shyti <[email protected]>

Andi

> +
> count = acpi_dev_get_resources(adev, &resource_list, NULL, NULL);
> if (count < 0)
> return NULL;
> --
> 2.40.0.1.gaa8946217a0b
>

2023-06-21 10:01:07

by Andi Shyti

[permalink] [raw]
Subject: Re: [PATCH v1 1/2] ACPI: platform: Ignore SMB0001 only when it has resources

On Wed, Jun 21, 2023 at 07:46:42AM +0000, Michael Brunner wrote:
> On Tue, 2023-06-20 at 19:35 +0300, Andy Shevchenko wrote:
> > After switchind i2c-scmi driver to be a plaform one it stopped
> > being enumerated on number of Kontron platformsm, because it's
> > listed in the forbidden_id_list.
> >
> > To resolve the situation, split the list to generic one and
> > another that holds devices that has to be skiped if and only if
> > they have bogus resources attached (_CRS method returns some).
> >
> > Fixes: 03d4287add6e ("i2c: scmi: Convert to be a platform driver")
> > Closes: https://lore.kernel.org/r/[email protected]
> > Reported-by: Michael Brunner <[email protected]>
> > Signed-off-by: Andy Shevchenko <[email protected]>
>
> Works as expected - the SMB0001 device shows up as platform device and
> the i2c-scmi driver is enumerated again on the affected boards.
> Thanks a lot!

is this a "Tested-by: Michael Brunner <[email protected]>" :)

Andi

2023-06-21 10:12:57

by Andi Shyti

[permalink] [raw]
Subject: Re: [PATCH v1 2/2] ACPI: platform: Move SMB0001 HID to the header and reuse

Hi Andy,

On Tue, Jun 20, 2023 at 07:35:34PM +0300, Andy Shevchenko wrote:
> 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.
>
> Signed-off-by: Andy Shevchenko <[email protected]>

Reviewed-by: Andi Shyti <[email protected]>

Andi

2023-06-21 13:51:26

by Michael Brunner

[permalink] [raw]
Subject: Re: [PATCH v1 1/2] ACPI: platform: Ignore SMB0001 only when it has resources

On Wed, 2023-06-21 at 16:19 +0300, [email protected]
wrote:
> On Wed, Jun 21, 2023 at 11:30:56AM +0200, Andi Shyti wrote:
> > On Wed, Jun 21, 2023 at 07:46:42AM +0000, Michael Brunner wrote:
> > > On Tue, 2023-06-20 at 19:35 +0300, Andy Shevchenko wrote:
> > > > After switchind i2c-scmi driver to be a plaform one it stopped
> > > > being enumerated on number of Kontron platformsm, because it's
> > > > listed in the forbidden_id_list.
> > > >
> > > > To resolve the situation, split the list to generic one and
> > > > another that holds devices that has to be skiped if and only if
> > > > they have bogus resources attached (_CRS method returns some).
> > > >
> > > > Fixes: 03d4287add6e ("i2c: scmi: Convert to be a platform
> > > > driver")
> > > > Closes:
> > > > https://lore.kernel.org/r/[email protected]
> > > > Reported-by: Michael Brunner <[email protected]>
> > > > Signed-off-by: Andy Shevchenko <
> > > > [email protected]>
> > >
> > > Works as expected - the SMB0001 device shows up as platform
> > > device and
> > > the i2c-scmi driver is enumerated again on the affected boards.
> > > Thanks a lot!
> >
> > is this a "Tested-by: Michael Brunner <[email protected]>
> > " :)
>
> Michael, indeed, it would be nice to have a formal tag.
> After that I will send a v2 with tags and fixed typos
> as Andi noticed (thank you, Andi!).

No problem:

Tested-by: Michael Brunner <[email protected]>

Best regards,
Michael

2023-06-21 13:52:28

by Andy Shevchenko

[permalink] [raw]
Subject: Re: [PATCH v1 1/2] ACPI: platform: Ignore SMB0001 only when it has resources

On Wed, Jun 21, 2023 at 11:30:56AM +0200, Andi Shyti wrote:
> On Wed, Jun 21, 2023 at 07:46:42AM +0000, Michael Brunner wrote:
> > On Tue, 2023-06-20 at 19:35 +0300, Andy Shevchenko wrote:
> > > After switchind i2c-scmi driver to be a plaform one it stopped
> > > being enumerated on number of Kontron platformsm, because it's
> > > listed in the forbidden_id_list.
> > >
> > > To resolve the situation, split the list to generic one and
> > > another that holds devices that has to be skiped if and only if
> > > they have bogus resources attached (_CRS method returns some).
> > >
> > > Fixes: 03d4287add6e ("i2c: scmi: Convert to be a platform driver")
> > > Closes: https://lore.kernel.org/r/[email protected]
> > > Reported-by: Michael Brunner <[email protected]>
> > > Signed-off-by: Andy Shevchenko <[email protected]>
> >
> > Works as expected - the SMB0001 device shows up as platform device and
> > the i2c-scmi driver is enumerated again on the affected boards.
> > Thanks a lot!
>
> is this a "Tested-by: Michael Brunner <[email protected]>" :)

Michael, indeed, it would be nice to have a formal tag.
After that I will send a v2 with tags and fixed typos
as Andi noticed (thank you, Andi!).


--
With Best Regards,
Andy Shevchenko