<p>Duncan Laurie has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/26171">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">acpi: Add support for writing ACPI _PLD structures<br><br>This commit adds support for writing ACPI _PLD structures that<br>describe the physical location of a device to the OS.<br><br>This can be used by any device with a physical connector, but is<br>required when defining USB ports for the OS.<br><br>A simple function is provided that generates a generic _PLD<br>structure for USB ports based on the USB port type.<br><br>Change-Id: Ic9cf1fd158eca80ead21b4725b37ab3c36b000f3<br>Signed-off-by: Duncan Laurie <dlaurie@google.com><br>---<br>M src/arch/x86/Makefile.inc<br>A src/arch/x86/acpi_pld.c<br>M src/arch/x86/acpigen.c<br>A src/arch/x86/include/arch/acpi_pld.h<br>M src/arch/x86/include/arch/acpigen.h<br>5 files changed, 303 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/71/26171/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/arch/x86/Makefile.inc b/src/arch/x86/Makefile.inc</span><br><span>index df054f8..a9e870e 100644</span><br><span>--- a/src/arch/x86/Makefile.inc</span><br><span>+++ b/src/arch/x86/Makefile.inc</span><br><span>@@ -328,6 +328,7 @@</span><br><span> ramstage-$(CONFIG_HAVE_ACPI_TABLES) += acpigen.c</span><br><span> ramstage-$(CONFIG_HAVE_ACPI_TABLES) += acpigen_dsm.c</span><br><span> ramstage-$(CONFIG_HAVE_ACPI_TABLES) += acpi_device.c</span><br><span style="color: hsl(120, 100%, 40%);">+ramstage-$(CONFIG_HAVE_ACPI_TABLES) += acpi_pld.c</span><br><span> ramstage-$(CONFIG_HAVE_ACPI_RESUME) += acpi_s3.c</span><br><span> ramstage-y += boot.c</span><br><span> ramstage-y += c_start.S</span><br><span>diff --git a/src/arch/x86/acpi_pld.c b/src/arch/x86/acpi_pld.c</span><br><span>new file mode 100644</span><br><span>index 0000000..43e751a</span><br><span>--- /dev/null</span><br><span>+++ b/src/arch/x86/acpi_pld.c</span><br><span>@@ -0,0 +1,169 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * This file is part of the coreboot project.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright 2018 Google LLC</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; version 2 of the License.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <string.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <arch/acpi.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <arch/acpi_pld.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int acpi_pld_fill_usb(struct acpi_pld *pld, enum acpi_upc_type type)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!pld)</span><br><span style="color: hsl(120, 100%, 40%);">+             return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  memset(pld, 0, sizeof(struct acpi_pld));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Set defaults */</span><br><span style="color: hsl(120, 100%, 40%);">+    pld->ignore_color = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+     pld->panel = PLD_PANEL_UNKNOWN;</span><br><span style="color: hsl(120, 100%, 40%);">+    pld->vertical_position = PLD_VERTICAL_POSITION_CENTER;</span><br><span style="color: hsl(120, 100%, 40%);">+     pld->horizontal_position = PLD_HORIZONTAL_POSITION_CENTER;</span><br><span style="color: hsl(120, 100%, 40%);">+ pld->rotation = PLD_ROTATE_0;</span><br><span style="color: hsl(120, 100%, 40%);">+      pld->visible = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Set the shape based on port type */</span><br><span style="color: hsl(120, 100%, 40%);">+        switch (type) {</span><br><span style="color: hsl(120, 100%, 40%);">+       case UPC_TYPE_A:</span><br><span style="color: hsl(120, 100%, 40%);">+      case UPC_TYPE_USB3_A:</span><br><span style="color: hsl(120, 100%, 40%);">+ case UPC_TYPE_USB3_POWER_B:</span><br><span style="color: hsl(120, 100%, 40%);">+           pld->shape = PLD_SHAPE_HORIZONTAL_RECTANGLE;</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case UPC_TYPE_MINI_AB:</span><br><span style="color: hsl(120, 100%, 40%);">+        case UPC_TYPE_USB3_B:</span><br><span style="color: hsl(120, 100%, 40%);">+         pld->shape = PLD_SHAPE_CHAMFERED;</span><br><span style="color: hsl(120, 100%, 40%);">+          break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case UPC_TYPE_USB3_MICRO_B:</span><br><span style="color: hsl(120, 100%, 40%);">+   case UPC_TYPE_USB3_MICRO_AB:</span><br><span style="color: hsl(120, 100%, 40%);">+          pld->shape = PLD_SHAPE_HORIZONTAL_TRAPEZOID;</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case UPC_TYPE_C_USB2_ONLY:</span><br><span style="color: hsl(120, 100%, 40%);">+    case UPC_TYPE_C_USB2_SS_SWITCH:</span><br><span style="color: hsl(120, 100%, 40%);">+       case UPC_TYPE_C_USB2_SS:</span><br><span style="color: hsl(120, 100%, 40%);">+              pld->shape = PLD_SHAPE_OVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case UPC_TYPE_INTERNAL:</span><br><span style="color: hsl(120, 100%, 40%);">+       default:</span><br><span style="color: hsl(120, 100%, 40%);">+              pld->shape = PLD_SHAPE_UNKNOWN;</span><br><span style="color: hsl(120, 100%, 40%);">+            pld->visible = 0;</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int acpi_pld_to_buffer(struct acpi_pld *pld, uint8_t *buf, int buf_len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!pld || !buf)</span><br><span style="color: hsl(120, 100%, 40%);">+             return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  memset(buf, 0, buf_len);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* [0] Revision (=2) */</span><br><span style="color: hsl(120, 100%, 40%);">+       buf[0] = 0x2;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (pld->ignore_color) {</span><br><span style="color: hsl(120, 100%, 40%);">+           /* [1] Ignore Color */</span><br><span style="color: hsl(120, 100%, 40%);">+                buf[0] |= 0x80;</span><br><span style="color: hsl(120, 100%, 40%);">+       } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* [15:8] Red Color */</span><br><span style="color: hsl(120, 100%, 40%);">+                buf[1] = pld->color_red;</span><br><span style="color: hsl(120, 100%, 40%);">+           /* [23:16] Green Color */</span><br><span style="color: hsl(120, 100%, 40%);">+             buf[2] = pld->color_green;</span><br><span style="color: hsl(120, 100%, 40%);">+         /* [31:24] Blue Color */</span><br><span style="color: hsl(120, 100%, 40%);">+              buf[3] = pld->color_blue;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* [47:32] Width */</span><br><span style="color: hsl(120, 100%, 40%);">+   buf[4] = pld->width & 0xff;</span><br><span style="color: hsl(120, 100%, 40%);">+    buf[5] = pld->width >> 8;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* [63:48] Height */</span><br><span style="color: hsl(120, 100%, 40%);">+  buf[6] = pld->height & 0xff;</span><br><span style="color: hsl(120, 100%, 40%);">+   buf[7] = pld->height >> 8;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* [64] User Visible */</span><br><span style="color: hsl(120, 100%, 40%);">+       buf[8] |= (pld->visible & 0x1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* [65] Dock */</span><br><span style="color: hsl(120, 100%, 40%);">+       buf[8] |= (pld->dock & 0x1) << 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* [66] Lid */</span><br><span style="color: hsl(120, 100%, 40%);">+        buf[8] |= (pld->lid & 0x1) << 2;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* [69:67] Panel */</span><br><span style="color: hsl(120, 100%, 40%);">+   buf[8] |= (pld->panel & 0x7) << 3;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* [71:70] Vertical Position */</span><br><span style="color: hsl(120, 100%, 40%);">+       buf[8] |= (pld->vertical_position & 0x3) << 6;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* [73:72] Horizontal Position */</span><br><span style="color: hsl(120, 100%, 40%);">+     buf[9] |= (pld->horizontal_position & 0x3);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* [77:74] Shape */</span><br><span style="color: hsl(120, 100%, 40%);">+   buf[9] |= (pld->shape & 0xf) << 2;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* [78] Group Orientation */</span><br><span style="color: hsl(120, 100%, 40%);">+  buf[9] |= (pld->group_orientation & 0x1) << 6;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* [86:79] Group Token (incorrectly defined as 1 bit in ACPI 6.2A) */</span><br><span style="color: hsl(120, 100%, 40%);">+ buf[9] |= (pld->group_token & 0x1) << 7;</span><br><span style="color: hsl(120, 100%, 40%);">+ buf[10] |= (pld->group_token >> 0x1) & 0x7f;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* [94:87] Group Position */</span><br><span style="color: hsl(120, 100%, 40%);">+  buf[10] |= (pld->group_position & 0x1) << 7;</span><br><span style="color: hsl(120, 100%, 40%);">+     buf[11] |= (pld->group_position >> 0x1) & 0x7f;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* [95] Bay */</span><br><span style="color: hsl(120, 100%, 40%);">+        buf[11] |= (pld->bay & 0x1) << 7;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* [96] Ejectable */</span><br><span style="color: hsl(120, 100%, 40%);">+  buf[12] |= (pld->ejectable & 0x1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* [97] Ejectable with OSPM help */</span><br><span style="color: hsl(120, 100%, 40%);">+   buf[12] |= (pld->ejectable_ospm & 0x1) << 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* [105:98] Cabinet Number */</span><br><span style="color: hsl(120, 100%, 40%);">+ buf[12] |= (pld->cabinet_number & 0x3f) << 2;</span><br><span style="color: hsl(120, 100%, 40%);">+    buf[13] |= (pld->cabinet_number >> 6) & 0x3;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* [113:106] Card Cage Number */</span><br><span style="color: hsl(120, 100%, 40%);">+      buf[13] |= (pld->card_cage_number & 0x3f) << 2;</span><br><span style="color: hsl(120, 100%, 40%);">+  buf[14] |= (pld->card_cage_number >> 6) & 0x3;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* [114] PLD is a Reference Shape */</span><br><span style="color: hsl(120, 100%, 40%);">+  buf[14] |= (pld->reference_shape & 0x1) << 2;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* [118:115] Rotation */</span><br><span style="color: hsl(120, 100%, 40%);">+      buf[14] |= (pld->rotation & 0xf) << 3;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* [123:119] Draw Order */</span><br><span style="color: hsl(120, 100%, 40%);">+    buf[14] |= (pld->draw_order & 0x1) << 7;</span><br><span style="color: hsl(120, 100%, 40%);">+ buf[15] |= (pld->draw_order >> 1) & 0xf;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* [127:124] Reserved */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Both 16 byte and 20 byte buffers are supported by the spec */</span><br><span style="color: hsl(120, 100%, 40%);">+      if (buf_len == 20) {</span><br><span style="color: hsl(120, 100%, 40%);">+          /* [143:128] Vertical Offset */</span><br><span style="color: hsl(120, 100%, 40%);">+               buf[16] = pld->vertical_offset & 0xff;</span><br><span style="color: hsl(120, 100%, 40%);">+         buf[17] = pld->vertical_offset >> 8;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+               /* [159:144] Horizontal Offset */</span><br><span style="color: hsl(120, 100%, 40%);">+             buf[18] = pld->horizontal_offset & 0xff;</span><br><span style="color: hsl(120, 100%, 40%);">+               buf[19] = pld->horizontal_offset >> 8;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/arch/x86/acpigen.c b/src/arch/x86/acpigen.c</span><br><span>index 867c809..7035c4b 100644</span><br><span>--- a/src/arch/x86/acpigen.c</span><br><span>+++ b/src/arch/x86/acpigen.c</span><br><span>@@ -1236,6 +1236,17 @@</span><br><span>   acpigen_pop_len();</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+void acpigen_write_pld(struct acpi_pld *pld)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t buf[20];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if (acpi_pld_to_buffer(pld, buf, ARRAY_SIZE(buf)) < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+             return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     acpigen_write_name("_PLD");</span><br><span style="color: hsl(120, 100%, 40%);">+ acpigen_write_byte_buffer(buf, ARRAY_SIZE(buf));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> void acpigen_write_dsm(const char *uuid, void (**callbacks)(void *),</span><br><span>                       size_t count, void *arg)</span><br><span> {</span><br><span>diff --git a/src/arch/x86/include/arch/acpi_pld.h b/src/arch/x86/include/arch/acpi_pld.h</span><br><span>new file mode 100644</span><br><span>index 0000000..675972b</span><br><span>--- /dev/null</span><br><span>+++ b/src/arch/x86/include/arch/acpi_pld.h</span><br><span>@@ -0,0 +1,120 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * This file is part of the coreboot project.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * Copyright 2018 Google LLC</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; version 2 of the License.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef __ACPI_PLD_H</span><br><span style="color: hsl(120, 100%, 40%);">+#define __ACPI_PLD_H</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <arch/acpi.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+enum acpi_pld_panel {</span><br><span style="color: hsl(120, 100%, 40%);">+  PLD_PANEL_TOP,</span><br><span style="color: hsl(120, 100%, 40%);">+        PLD_PANEL_BOTTOM,</span><br><span style="color: hsl(120, 100%, 40%);">+     PLD_PANEL_LEFT,</span><br><span style="color: hsl(120, 100%, 40%);">+       PLD_PANEL_RIGHT,</span><br><span style="color: hsl(120, 100%, 40%);">+      PLD_PANEL_FRONT,</span><br><span style="color: hsl(120, 100%, 40%);">+      PLD_PANEL_BACK,</span><br><span style="color: hsl(120, 100%, 40%);">+       PLD_PANEL_UNKNOWN</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+enum acpi_pld_vertical_position {</span><br><span style="color: hsl(120, 100%, 40%);">+    PLD_VERTICAL_POSITION_UPPER,</span><br><span style="color: hsl(120, 100%, 40%);">+  PLD_VERTICAL_POSITION_CENTER,</span><br><span style="color: hsl(120, 100%, 40%);">+ PLD_VERTICAL_POSITION_LOWER</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * The ACPI spec 6.2A does not define the horizontal position field.</span><br><span style="color: hsl(120, 100%, 40%);">+ * These values are taken from the IASL compiler:</span><br><span style="color: hsl(120, 100%, 40%);">+ * https://github.com/acpica/acpica/blob/master/source/components/utilities/utglobal.c#L321</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+enum acpi_pld_horizontal_position {</span><br><span style="color: hsl(120, 100%, 40%);">+       PLD_HORIZONTAL_POSITION_LEFT,</span><br><span style="color: hsl(120, 100%, 40%);">+ PLD_HORIZONTAL_POSITION_CENTER,</span><br><span style="color: hsl(120, 100%, 40%);">+       PLD_HORIZONTAL_POSITION_RIGHT</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+enum acpi_pld_shape {</span><br><span style="color: hsl(120, 100%, 40%);">+    PLD_SHAPE_ROUND,</span><br><span style="color: hsl(120, 100%, 40%);">+      PLD_SHAPE_OVAL,</span><br><span style="color: hsl(120, 100%, 40%);">+       PLD_SHAPE_SQUARE,</span><br><span style="color: hsl(120, 100%, 40%);">+     PLD_SHAPE_VERTICAL_RECTANGLE,</span><br><span style="color: hsl(120, 100%, 40%);">+ PLD_SHAPE_HORIZONTAL_RECTANGLE,</span><br><span style="color: hsl(120, 100%, 40%);">+       PLD_SHAPE_VERTICAL_TRAPEZOID,</span><br><span style="color: hsl(120, 100%, 40%);">+ PLD_SHAPE_HORIZONTAL_TRAPEZOID,</span><br><span style="color: hsl(120, 100%, 40%);">+       PLD_SHAPE_UNKNOWN,</span><br><span style="color: hsl(120, 100%, 40%);">+    PLD_SHAPE_CHAMFERED</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+enum acpi_pld_orientation {</span><br><span style="color: hsl(120, 100%, 40%);">+        PLD_ORIENTATION_HORIZONTAL,</span><br><span style="color: hsl(120, 100%, 40%);">+   PLD_ORIENTATION_VERTICAL,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+enum acpi_pld_rotate {</span><br><span style="color: hsl(120, 100%, 40%);">+       PLD_ROTATE_0,</span><br><span style="color: hsl(120, 100%, 40%);">+ PLD_ROTATE_45,</span><br><span style="color: hsl(120, 100%, 40%);">+        PLD_ROTATE_90,</span><br><span style="color: hsl(120, 100%, 40%);">+        PLD_ROTATE_135,</span><br><span style="color: hsl(120, 100%, 40%);">+       PLD_ROTATE_180,</span><br><span style="color: hsl(120, 100%, 40%);">+       PLD_ROTATE_225,</span><br><span style="color: hsl(120, 100%, 40%);">+       PLD_ROTATE_270,</span><br><span style="color: hsl(120, 100%, 40%);">+       PLD_ROTATE_315</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct acpi_pld {</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Color field can be explicitly ignored */</span><br><span style="color: hsl(120, 100%, 40%);">+   bool ignore_color;</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t color_red;</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t color_blue;</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t color_green;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Port characteristics */</span><br><span style="color: hsl(120, 100%, 40%);">+    bool visible;           /* Can be seen by the user */</span><br><span style="color: hsl(120, 100%, 40%);">+ bool lid;               /* Port is on lid of device */</span><br><span style="color: hsl(120, 100%, 40%);">+        bool dock;              /* Port is in a docking station */</span><br><span style="color: hsl(120, 100%, 40%);">+    bool bay;               /* Port is in a bay */</span><br><span style="color: hsl(120, 100%, 40%);">+        bool ejectable;         /* Device is ejectable, has _EJx objects */</span><br><span style="color: hsl(120, 100%, 40%);">+   bool ejectable_ospm;    /* Device needs OSPM to eject */</span><br><span style="color: hsl(120, 100%, 40%);">+      uint16_t width;         /* Width in mm */</span><br><span style="color: hsl(120, 100%, 40%);">+     uint16_t height;        /* Height in mm */</span><br><span style="color: hsl(120, 100%, 40%);">+    uint16_t vertical_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+     uint16_t horizontal_offset;</span><br><span style="color: hsl(120, 100%, 40%);">+   enum acpi_pld_panel panel;</span><br><span style="color: hsl(120, 100%, 40%);">+    enum acpi_pld_horizontal_position horizontal_position;</span><br><span style="color: hsl(120, 100%, 40%);">+        enum acpi_pld_vertical_position vertical_position;</span><br><span style="color: hsl(120, 100%, 40%);">+    enum acpi_pld_shape shape;</span><br><span style="color: hsl(120, 100%, 40%);">+    enum acpi_pld_rotate rotation;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Port grouping */</span><br><span style="color: hsl(120, 100%, 40%);">+   enum acpi_pld_orientation group_orientation;</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t group_token;</span><br><span style="color: hsl(120, 100%, 40%);">+  uint8_t group_position;</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t draw_order;</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t cabinet_number;</span><br><span style="color: hsl(120, 100%, 40%);">+       uint8_t card_cage_number;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Set if this PLD defines a reference shape */</span><br><span style="color: hsl(120, 100%, 40%);">+       bool reference_shape;</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Fill out PLD structure with defaults based on USB port type */</span><br><span style="color: hsl(120, 100%, 40%);">+int acpi_pld_fill_usb(struct acpi_pld *pld, enum acpi_upc_type type);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Turn PLD structure into a 20 byte ACPI buffer */</span><br><span style="color: hsl(120, 100%, 40%);">+int acpi_pld_to_buffer(struct acpi_pld *pld, uint8_t *buf, int buf_len);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span>diff --git a/src/arch/x86/include/arch/acpigen.h b/src/arch/x86/include/arch/acpigen.h</span><br><span>index 250c0b7..00c4f75 100644</span><br><span>--- a/src/arch/x86/include/arch/acpigen.h</span><br><span>+++ b/src/arch/x86/include/arch/acpigen.h</span><br><span>@@ -23,6 +23,7 @@</span><br><span> #include <stdint.h></span><br><span> #include <arch/acpi.h></span><br><span> #include <arch/acpi_device.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <arch/acpi_pld.h></span><br><span> </span><br><span> /* Values that can be returned for ACPI Device _STA method */</span><br><span> #define ACPI_STATUS_DEVICE_PRESENT  (1 << 0)</span><br><span>@@ -256,6 +257,7 @@</span><br><span> void acpigen_write_return_singleton_buffer(uint8_t arg);</span><br><span> void acpigen_write_return_byte(uint8_t arg);</span><br><span> void acpigen_write_upc(enum acpi_upc_type type);</span><br><span style="color: hsl(120, 100%, 40%);">+void acpigen_write_pld(struct acpi_pld *pld);</span><br><span> /*</span><br><span>  * Generate ACPI AML code for _DSM method.</span><br><span>  * This function takes as input uuid for the device, set of callbacks and</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/26171">change 26171</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/26171"/><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: Ic9cf1fd158eca80ead21b4725b37ab3c36b000f3 </div>
<div style="display:none"> Gerrit-Change-Number: 26171 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Duncan Laurie <dlaurie@chromium.org> </div>