[coreboot-gerrit] Change in coreboot[master]: Fizz: Set BJ adapter limit

Daisuke Nojiri (Code Review) gerrit at coreboot.org
Tue Nov 28 20:31:11 CET 2017


Daisuke Nojiri has uploaded this change for review. ( https://review.coreboot.org/22620


Change subject: Fizz: Set BJ adapter limit
......................................................................

Fizz: Set BJ adapter limit

This patch makes coreboot set the max current and voltage for a
barrel jack adapter.

BUG=b:64442692
BRANCH=none
TEST=Boot Fizz. Use chgsup console command to verify the max
current and voltage are set as expected.

Change-Id: I9b70725c7e2b37aab1e874e2969ea83324abfb42
Signed-off-by: Daisuke Nojiri <dnojiri at chromium.org>
---
M src/ec/google/chromeec/ec.c
M src/ec/google/chromeec/ec.h
M src/ec/google/chromeec/ec_commands.h
M src/mainboard/google/fizz/mainboard.c
4 files changed, 135 insertions(+), 10 deletions(-)



  git pull ssh://review.coreboot.org:29418/coreboot refs/changes/20/22620/1

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

-- 
To view, visit https://review.coreboot.org/22620
To unsubscribe, visit https://review.coreboot.org/settings

Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-MessageType: newchange
Gerrit-Change-Id: I9b70725c7e2b37aab1e874e2969ea83324abfb42
Gerrit-Change-Number: 22620
Gerrit-PatchSet: 1
Gerrit-Owner: Daisuke Nojiri <dnojiri at chromium.org>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.coreboot.org/pipermail/coreboot-gerrit/attachments/20171128/37d0f655/attachment-0001.html>


More information about the coreboot-gerrit mailing list