<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>