summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuihai Zhou <zhouruihai@huaqin.corp-partner.google.com>2023-03-30 17:54:12 +0800
committerRex-BC Chen <rex-bc.chen@mediatek.com>2023-04-27 05:35:06 +0000
commitd0b13a4d962213d88e684f5c1d422b40cb4606d4 (patch)
tree98ebea93305febd64e0abe12df3e6bb7fb5c7017
parent121d3d57adc35ed34204f983a72590f978939b1c (diff)
mb/google/corsola: Report SKU and panel ID for unprovisioned devices
The MIPI panels will be used on the detachable variant starmie, and there will be different MIPI panels used on starmie. In order to make the different panels functional on unprovisioned devices, it needs to pass the SKU ID and panel ID to the payload to load the matched device tree for kernel. From the schematic, the starmie variant will read the LCM ID from ADC channel 5. BRANCH=corsola BUG=b:275470328 TEST=boot starmie and see FW screen display Signed-off-by: Ruihai Zhou <zhouruihai@huaqin.corp-partner.google.com> Change-Id: I6339dc3c177fb8982f77fb3bd32dc00da735fce4 Reviewed-on: https://review.coreboot.org/c/coreboot/+/74135 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Yu-Ping Wu <yupingso@google.com> Reviewed-by: Yidi Lin <yidilin@google.com> Reviewed-by: cong yang <yangcong5@huaqin.corp-partner.google.com>
-rw-r--r--src/mainboard/google/corsola/boardid.c71
-rw-r--r--src/mainboard/google/corsola/display.h1
2 files changed, 63 insertions, 9 deletions
diff --git a/src/mainboard/google/corsola/boardid.c b/src/mainboard/google/corsola/boardid.c
index 96031ef408..a0c08abb54 100644
--- a/src/mainboard/google/corsola/boardid.c
+++ b/src/mainboard/google/corsola/boardid.c
@@ -6,6 +6,8 @@
#include <ec/google/chromeec/ec.h>
#include <soc/auxadc.h>
+#include "display.h"
+
/* board_id is provided by ec/google/chromeec/ec_boardid.c */
#define ADC_LEVELS 12
@@ -19,6 +21,22 @@ enum {
SKU_ID_HIGH_CHANNEL = 5,
};
+static const unsigned int lcm_voltages[ADC_LEVELS] = {
+ /* ID : Voltage (unit: uV) */
+ [0] = 0,
+ [1] = 283000,
+ [2] = 394000,
+ [3] = 490000,
+ [4] = 640000,
+ [5] = 712000,
+ [6] = 800000,
+ [7] = 867000,
+ [8] = 960000,
+ [9] = 1070000,
+ [10] = 1190000,
+ [11] = 1434000,
+};
+
static const unsigned int ram_voltages[ADC_LEVELS] = {
/* ID : Voltage (unit: uV) */
[0] = 74300,
@@ -42,12 +60,26 @@ static const unsigned int *adc_voltages[] = {
[SKU_ID_HIGH_CHANNEL] = ram_voltages,
};
+static const unsigned int *adc_voltages_detachable[] = {
+ [RAM_ID_LOW_CHANNEL] = ram_voltages,
+ [RAM_ID_HIGH_CHANNEL] = ram_voltages,
+ [SKU_ID_LOW_CHANNEL] = ram_voltages,
+ [SKU_ID_HIGH_CHANNEL] = lcm_voltages,
+};
+
static uint32_t get_adc_index(unsigned int channel)
{
unsigned int value = auxadc_get_voltage_uv(channel);
+ const unsigned int *voltages;
+
+ if (CONFIG(BOARD_GOOGLE_STARYU_COMMON)) {
+ assert(channel < ARRAY_SIZE(adc_voltages_detachable));
+ voltages = adc_voltages_detachable[channel];
+ } else {
+ assert(channel < ARRAY_SIZE(adc_voltages));
+ voltages = adc_voltages[channel];
+ }
- assert(channel < ARRAY_SIZE(adc_voltages));
- const unsigned int *voltages = adc_voltages[channel];
assert(voltages);
/* Find the closest voltage */
@@ -60,21 +92,42 @@ static uint32_t get_adc_index(unsigned int channel)
return id;
}
+/* Detachables use ADC channel 5 for panel ID */
+uint32_t panel_id(void)
+{
+ static uint32_t cached_panel_id = BOARD_ID_INIT;
+
+ if (cached_panel_id == BOARD_ID_INIT)
+ cached_panel_id = get_adc_index(SKU_ID_HIGH_CHANNEL);
+
+ return cached_panel_id;
+}
+
uint32_t sku_id(void)
{
static uint32_t cached_sku_code = BOARD_ID_INIT;
- if (cached_sku_code == BOARD_ID_INIT) {
- cached_sku_code = google_chromeec_get_board_sku();
+ if (cached_sku_code != BOARD_ID_INIT)
+ return cached_sku_code;
+
+ cached_sku_code = google_chromeec_get_board_sku();
- if (cached_sku_code == CROS_SKU_UNKNOWN) {
- printk(BIOS_WARNING, "Failed to get SKU code from EC\n");
- cached_sku_code = (get_adc_index(SKU_ID_HIGH_CHANNEL) << 4 |
- get_adc_index(SKU_ID_LOW_CHANNEL));
+ if (CONFIG(BOARD_GOOGLE_STARYU_COMMON)) {
+ if (cached_sku_code == CROS_SKU_UNPROVISIONED ||
+ cached_sku_code == CROS_SKU_UNKNOWN) {
+ printk(BIOS_WARNING, "SKU code from EC: %s\n",
+ (cached_sku_code == CROS_SKU_UNKNOWN) ?
+ "CROS_SKU_UNKNOWN" : "CROS_SKU_UNPROVISIONED");
+ /* Reserve last 4 bits to report PANEL_ID */
+ cached_sku_code = 0x7FFFFFF0UL | panel_id();
}
- printk(BIOS_DEBUG, "SKU Code: %#02x\n", cached_sku_code);
+ } else if (cached_sku_code == CROS_SKU_UNKNOWN) {
+ printk(BIOS_WARNING, "Failed to get SKU code from EC\n");
+ cached_sku_code = (get_adc_index(SKU_ID_HIGH_CHANNEL) << 4 |
+ get_adc_index(SKU_ID_LOW_CHANNEL));
}
+ printk(BIOS_DEBUG, "SKU Code: %#02x\n", cached_sku_code);
return cached_sku_code;
}
diff --git a/src/mainboard/google/corsola/display.h b/src/mainboard/google/corsola/display.h
index 4e883f2b88..929ddf7002 100644
--- a/src/mainboard/google/corsola/display.h
+++ b/src/mainboard/google/corsola/display.h
@@ -12,5 +12,6 @@ struct edp_bridge {
};
int configure_display(void);
+uint32_t panel_id(void);
#endif