<p>Duncan Laurie has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/26174">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">soc/intel: Add support for USB ACPI code generation<br><br>To support generating USB devices in ACPI the platform needs to<br>know how to determine a device name for each USB port, and for<br>any root hubs that may be present.<br><br>Recent Intel platforms route all ports to an XHCI controller<br>through a root hub.  This is supported by considering the root<br>hub to be USB port type 0, the USB 2.0 ports to be type 2, and<br>the USB 3.0 ports to be type 3.<br><br>This was tested with a Kaby Lake platform by adding entries to<br>the devicetree and checking the resulting SSDT.<br><br>Change-Id: I527a63bdc64f9243fe57487363ee6d5f60be84ca<br>Signed-off-by: Duncan Laurie <dlaurie@google.com><br>---<br>M src/soc/intel/apollolake/acpi/xhci.asl<br>M src/soc/intel/apollolake/chip.c<br>M src/soc/intel/common/block/include/intelblocks/acpi.h<br>M src/soc/intel/common/block/xhci/xhci.c<br>M src/soc/intel/skylake/acpi.c<br>5 files changed, 100 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/74/26174/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/soc/intel/apollolake/acpi/xhci.asl b/src/soc/intel/apollolake/acpi/xhci.asl</span><br><span>index c07c707..8222cb5 100644</span><br><span>--- a/src/soc/intel/apollolake/acpi/xhci.asl</span><br><span>+++ b/src/soc/intel/apollolake/acpi/xhci.asl</span><br><span>@@ -28,4 +28,28 @@</span><br><span>      {</span><br><span>            Return (0xF)</span><br><span>         }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   Device (RHUB)</span><br><span style="color: hsl(120, 100%, 40%);">+ {</span><br><span style="color: hsl(120, 100%, 40%);">+             /* Root Hub */</span><br><span style="color: hsl(120, 100%, 40%);">+                Name (_ADR, Zero)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           /* USB2 */</span><br><span style="color: hsl(120, 100%, 40%);">+            Device (HS01) { Name (_ADR, 1) }</span><br><span style="color: hsl(120, 100%, 40%);">+              Device (HS02) { Name (_ADR, 2) }</span><br><span style="color: hsl(120, 100%, 40%);">+              Device (HS03) { Name (_ADR, 3) }</span><br><span style="color: hsl(120, 100%, 40%);">+              Device (HS04) { Name (_ADR, 4) }</span><br><span style="color: hsl(120, 100%, 40%);">+              Device (HS05) { Name (_ADR, 5) }</span><br><span style="color: hsl(120, 100%, 40%);">+              Device (HS06) { Name (_ADR, 6) }</span><br><span style="color: hsl(120, 100%, 40%);">+              Device (HS07) { Name (_ADR, 7) }</span><br><span style="color: hsl(120, 100%, 40%);">+              Device (HS08) { Name (_ADR, 8) }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            /* USB3 */</span><br><span style="color: hsl(120, 100%, 40%);">+            Device (SS01) { Name (_ADR, 9) }</span><br><span style="color: hsl(120, 100%, 40%);">+              Device (SS02) { Name (_ADR, 10) }</span><br><span style="color: hsl(120, 100%, 40%);">+             Device (SS03) { Name (_ADR, 11) }</span><br><span style="color: hsl(120, 100%, 40%);">+             Device (SS04) { Name (_ADR, 12) }</span><br><span style="color: hsl(120, 100%, 40%);">+             Device (SS05) { Name (_ADR, 13) }</span><br><span style="color: hsl(120, 100%, 40%);">+             Device (SS06) { Name (_ADR, 14) }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span> }</span><br><span>diff --git a/src/soc/intel/apollolake/chip.c b/src/soc/intel/apollolake/chip.c</span><br><span>index e4084fe..96c8df6 100644</span><br><span>--- a/src/soc/intel/apollolake/chip.c</span><br><span>+++ b/src/soc/intel/apollolake/chip.c</span><br><span>@@ -34,6 +34,7 @@</span><br><span> #include <intelblocks/xdci.h></span><br><span> #include <fsp/api.h></span><br><span> #include <fsp/util.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <intelblocks/acpi.h></span><br><span> #include <intelblocks/cpulib.h></span><br><span> #include <intelblocks/itss.h></span><br><span> #include <intelblocks/pmclib.h></span><br><span>@@ -50,11 +51,44 @@</span><br><span> </span><br><span> #include "chip.h"</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static const char *soc_acpi_name(const struct device *dev)</span><br><span style="color: hsl(120, 100%, 40%);">+const char *soc_acpi_name(const struct device *dev)</span><br><span> {</span><br><span>       if (dev->path.type == DEVICE_PATH_DOMAIN)</span><br><span>                 return "PCI0";</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  if (dev->path.type == DEVICE_PATH_USB) {</span><br><span style="color: hsl(120, 100%, 40%);">+           switch (dev->path.usb.port_type) {</span><br><span style="color: hsl(120, 100%, 40%);">+         case 0:</span><br><span style="color: hsl(120, 100%, 40%);">+                       /* Root Hub */</span><br><span style="color: hsl(120, 100%, 40%);">+                        return "RHUB";</span><br><span style="color: hsl(120, 100%, 40%);">+              case 2:</span><br><span style="color: hsl(120, 100%, 40%);">+                       /* USB2 ports */</span><br><span style="color: hsl(120, 100%, 40%);">+                      switch (dev->path.usb.port_id) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   case 0: return "HS01";</span><br><span style="color: hsl(120, 100%, 40%);">+                      case 1: return "HS02";</span><br><span style="color: hsl(120, 100%, 40%);">+                      case 2: return "HS03";</span><br><span style="color: hsl(120, 100%, 40%);">+                      case 3: return "HS04";</span><br><span style="color: hsl(120, 100%, 40%);">+                      case 4: return "HS05";</span><br><span style="color: hsl(120, 100%, 40%);">+                      case 5: return "HS06";</span><br><span style="color: hsl(120, 100%, 40%);">+                      case 6: return "HS07";</span><br><span style="color: hsl(120, 100%, 40%);">+                      case 7: return "HS08";</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+                     break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 3:</span><br><span style="color: hsl(120, 100%, 40%);">+                       /* USB3 ports */</span><br><span style="color: hsl(120, 100%, 40%);">+                      switch (dev->path.usb.port_id) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   case 0: return "SS01";</span><br><span style="color: hsl(120, 100%, 40%);">+                      case 1: return "SS02";</span><br><span style="color: hsl(120, 100%, 40%);">+                      case 2: return "SS03";</span><br><span style="color: hsl(120, 100%, 40%);">+                      case 3: return "SS04";</span><br><span style="color: hsl(120, 100%, 40%);">+                      case 4: return "SS05";</span><br><span style="color: hsl(120, 100%, 40%);">+                      case 5: return "SS06";</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+                     break;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+             return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (dev->path.type != DEVICE_PATH_PCI)</span><br><span>            return NULL;</span><br><span> </span><br><span>diff --git a/src/soc/intel/common/block/include/intelblocks/acpi.h b/src/soc/intel/common/block/include/intelblocks/acpi.h</span><br><span>index 927da3c..f58f914 100644</span><br><span>--- a/src/soc/intel/common/block/include/intelblocks/acpi.h</span><br><span>+++ b/src/soc/intel/common/block/include/intelblocks/acpi.h</span><br><span>@@ -29,6 +29,9 @@</span><br><span> /* Forward  declare the global nvs structure here */</span><br><span> struct global_nvs_t;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Return ACPI name for this device */</span><br><span style="color: hsl(120, 100%, 40%);">+const char *soc_acpi_name(const struct device *dev);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Read the scis from soc specific register. Returns int scis value */</span><br><span> uint32_t soc_read_sci_irq_select(void);</span><br><span> </span><br><span>diff --git a/src/soc/intel/common/block/xhci/xhci.c b/src/soc/intel/common/block/xhci/xhci.c</span><br><span>index 737c8cf..d764262 100644</span><br><span>--- a/src/soc/intel/common/block/xhci/xhci.c</span><br><span>+++ b/src/soc/intel/common/block/xhci/xhci.c</span><br><span>@@ -19,6 +19,7 @@</span><br><span> #include <device/pci.h></span><br><span> #include <device/pci_ids.h></span><br><span> #include <arch/io.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <intelblocks/acpi.h></span><br><span> #include <intelblocks/xhci.h></span><br><span> </span><br><span> __weak void soc_xhci_init(struct device *dev) { /* no-op */ }</span><br><span>@@ -29,6 +30,8 @@</span><br><span>         .enable_resources       = &pci_dev_enable_resources,</span><br><span>     .init                   = soc_xhci_init,</span><br><span>     .ops_pci                = &pci_dev_ops_pci,</span><br><span style="color: hsl(120, 100%, 40%);">+       .scan_bus               = &scan_usb_bus,</span><br><span style="color: hsl(120, 100%, 40%);">+  .acpi_name              = &soc_acpi_name,</span><br><span> };</span><br><span> </span><br><span> static const unsigned short pci_device_ids[] = {</span><br><span>diff --git a/src/soc/intel/skylake/acpi.c b/src/soc/intel/skylake/acpi.c</span><br><span>index 914b9d5..43487c4 100644</span><br><span>--- a/src/soc/intel/skylake/acpi.c</span><br><span>+++ b/src/soc/intel/skylake/acpi.c</span><br><span>@@ -717,6 +717,41 @@</span><br><span>      if (dev->path.type == DEVICE_PATH_DOMAIN)</span><br><span>                 return "PCI0";</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  if (dev->path.type == DEVICE_PATH_USB) {</span><br><span style="color: hsl(120, 100%, 40%);">+           switch (dev->path.usb.port_type) {</span><br><span style="color: hsl(120, 100%, 40%);">+         case 0:</span><br><span style="color: hsl(120, 100%, 40%);">+                       /* Root Hub */</span><br><span style="color: hsl(120, 100%, 40%);">+                        return "RHUB";</span><br><span style="color: hsl(120, 100%, 40%);">+              case 2:</span><br><span style="color: hsl(120, 100%, 40%);">+                       /* USB2 ports */</span><br><span style="color: hsl(120, 100%, 40%);">+                      switch (dev->path.usb.port_id) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   case 0: return "HS01";</span><br><span style="color: hsl(120, 100%, 40%);">+                      case 1: return "HS02";</span><br><span style="color: hsl(120, 100%, 40%);">+                      case 2: return "HS03";</span><br><span style="color: hsl(120, 100%, 40%);">+                      case 3: return "HS04";</span><br><span style="color: hsl(120, 100%, 40%);">+                      case 4: return "HS05";</span><br><span style="color: hsl(120, 100%, 40%);">+                      case 5: return "HS06";</span><br><span style="color: hsl(120, 100%, 40%);">+                      case 6: return "HS07";</span><br><span style="color: hsl(120, 100%, 40%);">+                      case 7: return "HS08";</span><br><span style="color: hsl(120, 100%, 40%);">+                      case 8: return "HS09";</span><br><span style="color: hsl(120, 100%, 40%);">+                      case 9: return "HS10";</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+                     break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 3:</span><br><span style="color: hsl(120, 100%, 40%);">+                       /* USB3 ports */</span><br><span style="color: hsl(120, 100%, 40%);">+                      switch (dev->path.usb.port_id) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   case 0: return "SS01";</span><br><span style="color: hsl(120, 100%, 40%);">+                      case 1: return "SS02";</span><br><span style="color: hsl(120, 100%, 40%);">+                      case 2: return "SS03";</span><br><span style="color: hsl(120, 100%, 40%);">+                      case 3: return "SS04";</span><br><span style="color: hsl(120, 100%, 40%);">+                      case 4: return "SS05";</span><br><span style="color: hsl(120, 100%, 40%);">+                      case 5: return "SS06";</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+                     break;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+             return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (dev->path.type != DEVICE_PATH_PCI)</span><br><span>            return NULL;</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/26174">change 26174</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://review.coreboot.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://review.coreboot.org/26174"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: coreboot </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I527a63bdc64f9243fe57487363ee6d5f60be84ca </div>
<div style="display:none"> Gerrit-Change-Number: 26174 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Duncan Laurie <dlaurie@chromium.org> </div>