<p>Daisuke Nojiri has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/22620">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Fizz: Set BJ adapter limit<br><br>This patch makes coreboot set the max current and voltage for a<br>barrel jack adapter.<br><br>BUG=b:64442692<br>BRANCH=none<br>TEST=Boot Fizz. Use chgsup console command to verify the max<br>current and voltage are set as expected.<br><br>Change-Id: I9b70725c7e2b37aab1e874e2969ea83324abfb42<br>Signed-off-by: Daisuke Nojiri <dnojiri@chromium.org><br>---<br>M src/ec/google/chromeec/ec.c<br>M src/ec/google/chromeec/ec.h<br>M src/ec/google/chromeec/ec_commands.h<br>M src/mainboard/google/fizz/mainboard.c<br>4 files changed, 135 insertions(+), 10 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/20/22620/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">diff --git a/src/ec/google/chromeec/ec.c b/src/ec/google/chromeec/ec.c<br>index 3d053b6..9bdf702 100644<br>--- a/src/ec/google/chromeec/ec.c<br>+++ b/src/ec/google/chromeec/ec.c<br>@@ -638,6 +638,26 @@<br>        return 0;<br> }<br> <br>+int google_chromeec_override_dedicated_charger_limit(u16 current_lim,<br>+                                                  u16 voltage_lim)<br>+{<br>+    struct ec_params_dedicated_charger_limit p = {<br>+               .current_lim = current_lim,<br>+          .voltage_lim = voltage_lim,<br>+  };<br>+   struct chromeec_command cmd = {<br>+              .cmd_code = EC_CMD_OVERRIDE_DEDICATED_CHARGER_LIMIT,<br>+         .cmd_version = 0,<br>+            .cmd_data_in = &p,<br>+               .cmd_size_in = sizeof(p),<br>+            .cmd_data_out = NULL,<br>+                .cmd_size_out = 0,<br>+           .cmd_dev_index = 0,<br>+  };<br>+<br>+        return google_chromeec_command(&cmd);<br>+}<br>+<br> int google_chromeec_set_usb_pd_role(u8 port, enum usb_pd_control_role role)<br> {<br>    struct ec_params_usb_pd_control req = {<br>diff --git a/src/ec/google/chromeec/ec.h b/src/ec/google/chromeec/ec.h<br>index 25a90d7..59f48d8 100644<br>--- a/src/ec/google/chromeec/ec.h<br>+++ b/src/ec/google/chromeec/ec.h<br>@@ -91,6 +91,16 @@<br> int google_chromeec_get_usb_pd_power_info(enum usb_chg_type *type,<br>                                           u32 *max_watts);<br> <br>+/*<br>+ * Set max current and voltage of a dedicated charger.<br>+ *<br>+ * @param current_lim Max current in mA<br>+ * @param voltage_lim Max voltage in mV<br>+ * @return non-zero for error, otherwise 0.<br>+ */<br>+int google_chromeec_override_dedicated_charger_limit(u16 current_lim,<br>+                                                  u16 voltage_lim);<br>+<br> /* internal structure to send a command to the EC and wait for response. */<br> struct chromeec_command {<br>   uint16_t    cmd_code;     /* command code in, status out */<br>diff --git a/src/ec/google/chromeec/ec_commands.h b/src/ec/google/chromeec/ec_commands.h<br>index c4e4e31..17ac51e 100644<br>--- a/src/ec/google/chromeec/ec_commands.h<br>+++ b/src/ec/google/chromeec/ec_commands.h<br>@@ -3533,6 +3533,16 @@<br> <br> #define EC_POWER_LIMIT_NONE 0xffff<br> <br>+/*<br>+ * Set maximum voltage & current of a dedicated charge port<br>+ */<br>+#define EC_CMD_OVERRIDE_DEDICATED_CHARGER_LIMIT 0x00A3<br>+<br>+struct __ec_align2 ec_params_dedicated_charger_limit {<br>+    uint16_t current_lim; /* in mA */<br>+    uint16_t voltage_lim; /* in mV */<br>+};<br>+<br> /*****************************************************************************/<br> /* Hibernate/Deep Sleep Commands */<br> <br>diff --git a/src/mainboard/google/fizz/mainboard.c b/src/mainboard/google/fizz/mainboard.c<br>index ae37675..319b1ed 100644<br>--- a/src/mainboard/google/fizz/mainboard.c<br>+++ b/src/mainboard/google/fizz/mainboard.c<br>@@ -35,8 +35,71 @@<br>  */<br> #define GET_TYPEC_PL2(w)   (9 * (w) / 10)<br> <br>+/* Dev, Asus, HP, Acer, CfM */<br>+#define OEM_ID_COUNT      5<br>+/* Celeron-1, Celeron-2, i3, i5-2, i5-4, i7-2, i7-4 */<br>+#define SKU_ID_COUNT       7<br>+<br>+/* List of BJ adapters shipped with Fizz or its variants */<br>+enum bj_adapter {<br>+       BJ_UNKNOWN,<br>+  BJ_PPP012C_S,<br>+        BJ_ADP_65HB_HCE,<br>+     BJ_PA_1650_30,<br>+       BJ_PA_1900_92,<br>+       BJ_COUNT,<br>+};<br>+<br>+/* BJ adapter specs */<br>+static const struct {<br>+   uint16_t current_lim; /* in mA */<br>+    uint16_t voltage_lim; /* in mV */<br>+} bj_adapters[] = {<br>+      [BJ_PPP012C_S] = {4620, 19500},<br>+      [BJ_ADP_65HB_HCE] = {3330, 19500},<br>+   [BJ_PA_1650_30] = {3420, 19000},<br>+     [BJ_PA_1900_92] = {4740, 19000},<br>+};<br>+<br>+/*<br>+ * The table showing which device is shipped with which BJ adapter.<br>+ *<br>+ *        | SKU0     SKU1     ...<br>+ *   OEM0 | AdapterX AdapterZ ...<br>+ *   OEM1 | AdapterY ...<br>+ *   ...  |<br>+ */<br>+static const enum bj_adapter bj_adapter_table[OEM_ID_COUNT][SKU_ID_COUNT] = {<br>+      {BJ_PPP012C_S, BJ_ADP_65HB_HCE, BJ_PA_1650_30, BJ_PA_1900_92,<br>+                        BJ_PA_1900_92, BJ_PA_1900_92, BJ_UNKNOWN},<br>+   {BJ_PPP012C_S, BJ_ADP_65HB_HCE, BJ_PA_1650_30, BJ_PA_1900_92,<br>+                        BJ_PA_1900_92, BJ_PA_1900_92, BJ_UNKNOWN},<br>+   {BJ_PPP012C_S, BJ_ADP_65HB_HCE, BJ_PA_1650_30, BJ_PA_1900_92,<br>+                        BJ_PA_1900_92, BJ_PA_1900_92, BJ_UNKNOWN},<br>+   {BJ_PPP012C_S, BJ_ADP_65HB_HCE, BJ_PA_1650_30, BJ_PA_1900_92,<br>+                        BJ_PA_1900_92, BJ_PA_1900_92, BJ_UNKNOWN},<br>+   {BJ_PPP012C_S, BJ_ADP_65HB_HCE, BJ_PA_1650_30, BJ_PA_1900_92,<br>+                        BJ_PA_1900_92, BJ_PA_1900_92, BJ_UNKNOWN},<br>+};<br>+<br> static const char *oem_id = "GOOGLE";<br> static const char *oem_table_id = "FIZZ";<br>+<br>+<br>+static uint8_t board_sku_id(void)<br>+{<br>+     static int sku_id = -1;<br>+      const gpio_t sku_id_gpios[] = {<br>+              GPIO_SKU_ID0,<br>+                GPIO_SKU_ID1,<br>+                GPIO_SKU_ID2,<br>+                GPIO_SKU_ID3,<br>+        };<br>+   if (sku_id < 0)<br>+           sku_id = gpio_base2_value(sku_id_gpios,<br>+                                        ARRAY_SIZE(sku_id_gpios));<br>+ return sku_id;<br>+}<br> <br> /*<br>  * mainboard_get_pl2<br>@@ -48,25 +111,16 @@<br>  */<br> static u32 mainboard_get_pl2(void)<br> {<br>-       const gpio_t sku_id_gpios[] = {<br>-              GPIO_SKU_ID0,<br>-                GPIO_SKU_ID1,<br>-                GPIO_SKU_ID2,<br>-                GPIO_SKU_ID3,<br>-        };<br>    enum usb_chg_type type;<br>       u32 watts;<br> <br>         int rv = google_chromeec_get_usb_pd_power_info(&type, &watts);<br>-       int sku_id;<br> <br>        /* If we can't get charger info or not PD charger, assume barrel jack */<br>  if (rv != 0 || type != USB_CHG_TYPE_PD) {<br>             /* using the barrel jack, get PL2 based on sku id */<br>          watts = FIZZ_PL2_OTHERS;<br>-             sku_id = gpio_base2_value(sku_id_gpios,<br>-                                        ARRAY_SIZE(sku_id_gpios));<br>-         if (sku_id == FIZZ_SKU_ID_I7_U42)<br>+            if (board_sku_id() == FIZZ_SKU_ID_I7_U42)<br>                     watts = FIZZ_PL2_I7_U42;<br>      } else<br>                watts = GET_TYPEC_PL2(watts);<br>@@ -105,6 +159,35 @@<br>   return end_addr;<br> }<br> <br>+/*<br>+ * Set max current and voltage for a barrel jack adapter based on {OEM, SKU}.<br>+ * If this fails, the limit will remain unchanged = default values, which make<br>+ * the system run under safe but under-rated power.<br>+ * If a BJ adapter isn't plugged, this is a no-op.<br>+ */<br>+static void set_bj_adapter_limit(void)<br>+{<br>+      uint8_t oem = board_oem_id();<br>+        uint8_t sku = board_sku_id();<br>+        enum bj_adapter bj;<br>+<br>+       if (oem >= OEM_ID_COUNT || sku >= SKU_ID_COUNT) {<br>+              printk(BIOS_ERR, "Unrecognized OEM or SKU: %d/%d\n", oem, sku);<br>+            return;<br>+      }<br>+<br>+ bj = bj_adapter_table[oem][sku];<br>+     if (bj <= BJ_UNKNOWN || BJ_COUNT <= bj) {<br>+              printk(BIOS_ERR, "Invalid BJ adapter ID: %d\n", bj);<br>+               return;<br>+      }<br>+    printk(BIOS_INFO, "Setting BJ limit: %dmA/%dmV\n",<br>+        bj_adapters[bj].current_lim, bj_adapters[bj].voltage_lim);<br>+    google_chromeec_override_dedicated_charger_limit(<br>+                    bj_adapters[bj].current_lim,<br>+                 bj_adapters[bj].voltage_lim);<br>+}<br>+<br> static void mainboard_enable(device_t dev)<br> {<br>         device_t tpm;<br>@@ -113,6 +196,8 @@<br> <br>         conf->tdp_pl2_override = mainboard_get_pl2();<br> <br>+  set_bj_adapter_limit();<br>+<br>    dev->ops->init = mainboard_init;<br>        dev->ops->acpi_inject_dsdt_generator = chromeos_dsdt_generator;<br> <br></pre><p>To view, visit <a href="https://review.coreboot.org/22620">change 22620</a>. To unsubscribe, 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/22620"/><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: I9b70725c7e2b37aab1e874e2969ea83324abfb42 </div>
<div style="display:none"> Gerrit-Change-Number: 22620 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Daisuke Nojiri <dnojiri@chromium.org> </div>