Thread (32 messages) 32 messages, 5 authors, 2018-02-16

Re: [PATCH v13 7/9] ACPI: Translate the I/O range of non-MMIO devices before scanning

From: John Garry <hidden>
Date: 2018-02-15 11:19:35
Also in: linux-acpi, linux-arch, linux-pci, lkml

Nothing apart from only being used by arm64 platforms today, which is
circumstantial.
quoted
I understand you need to find a place to add the:

acpi_indirect_io_scan_init()

to be called from core ACPI code because ACPI can't handle probe
dependencies in any other way but other than that this patch is
a Hisilicon ACPI driver - there is nothing generic in it (or at
least there are no standard bindings to make it so).

Whether a callback from ACPI core code (acpi_scan_init()) to a driver
specific hook is sane or not that's the question and the only reason
why you want to add this in drivers/acpi/arm64 rather than, say,
drivers/bus (as you do for the DT driver).

I do not know Rafael's opinion on the above, I would like to help
you make forward progress but please understand my concerns, mostly
on FW side.
I did mention an alternative in my "ping" in v12 patch 7/9 (Feb 1), but
no response to this specific note so I kept on the same path.

Here's what I then wrote:
"I think another solution - which you may prefer - is to avoid adding
this scan handler (and all this other scan code) and add a check like
acpi_is_serial_bus_slave() [which checks the device parent versus a list
of known indirectIO hosts] to not enumerate these children, and do it
from the LLDD host probe instead (https://lkml.org/lkml/2017/6/16/250)"
Hi Rafael, Lorenzo,

I can avoid adding the scan handler in acpi_indirectio.c by skipping the 
child enumeration, like with this change in scan.c:

+static const struct acpi_device_id indirect_io_hosts[] = {
+    {"HISI0191", 0},    /* HiSilicon LPC host */
+    {},
+};
+
+static bool acpi_is_indirect_io_slave(struct acpi_device *device)
+{
+    struct acpi_device *parent = dev->parent;
+
+    if (!parent || acpi_match_device_ids(parent, indirect_io_hosts))
+        return false;
+
+    return true;
+}
+
  static bool acpi_is_serial_bus_slave(struct acpi_device *device)
  {
      struct list_head resource_list;
      bool is_serial_bus_slave = false;

+    if (acpi_is_indirect_io_slave(device))
+        return true;
+
      /* Macs use device properties in lieu of _CRS resources */


This means I can move all this scan code into the LLDD.

What do you think? Please let me know.

John
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help