summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mainboard/google/brya/variants/teliks/variant.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/src/mainboard/google/brya/variants/teliks/variant.c b/src/mainboard/google/brya/variants/teliks/variant.c
index 7e0f02dead..7da0043cae 100644
--- a/src/mainboard/google/brya/variants/teliks/variant.c
+++ b/src/mainboard/google/brya/variants/teliks/variant.c
@@ -6,6 +6,9 @@
#include <sar.h>
#include <soc/gpio_soc_defs.h>
#include <intelblocks/graphics.h>
+#include <drivers/intel/gma/opregion.h>
+#include <console/console.h>
+#include <ec/google/chromeec/ec.h>
/* Per-pipe DDI Function Control 2 */
#define TRANS_DDI_FUNC_CTL2_A 0x60404
@@ -55,3 +58,58 @@ void variant_finalize(void)
graphics_gtt_rmw(TRANS_DDI_FUNC_CTL2_A, ~TRANS_DDI_AUDIO_MUTE_OVERRIDE_BITS_FIELDS,
TRANS_DDI_AUDIO_MUTE_OVERRIDE_BITS_FIELDS);
}
+
+static int get_ssfc(uint32_t *val)
+{
+ static uint32_t known_value;
+ static enum {
+ SSFC_NOT_READ,
+ SSFC_AVAILABLE,
+ } ssfc_state = SSFC_NOT_READ;
+
+ if (ssfc_state == SSFC_AVAILABLE) {
+ *val = known_value;
+ return 0;
+ }
+
+ /*
+ * If SSFC field is not in the CBI then the value of SSFC will be 0 for
+ * further processing later since 0 of each bits group means default
+ * component in a variant. For more detail, please refer to cbi_ssfc.h.
+ */
+ if (google_chromeec_cbi_get_ssfc(&known_value) != 0) {
+ printk(BIOS_DEBUG, "SSFC not set in CBI\n");
+ return -1;
+ }
+
+ ssfc_state = SSFC_AVAILABLE;
+ *val = known_value;
+ printk(BIOS_INFO, "SSFC 0x%x.\n", known_value);
+ return 0;
+}
+
+const char *mainboard_vbt_filename(void)
+{
+ uint32_t ssfc;
+ if (get_ssfc(&ssfc)) {
+ printk(BIOS_INFO, "Failed to read SSFC, using default vbt-teliks.bin\n");
+ return "vbt-teliks.bin";
+ }
+
+ /*
+ * Determine if the panel is 11 inches based on the SSFC register.
+ *
+ * Bit 6 of the SSFC register indicates the panel size:
+ * 0: 12.2 inch panel
+ * 1: 11.6 inch panel
+ */
+ bool is_panel_11_inch = (ssfc >> 6) & 0x1;
+
+ if (is_panel_11_inch) {
+ printk(BIOS_INFO, "Bit 6 of SSFC is 1, use vbt-teliks_panel_11_inch.bin\n");
+ return "vbt-teliks_panel_11_inch.bin";
+ }
+
+ printk(BIOS_INFO, "Bit 6 of SSFC is 0, use vbt-teliks.bin\n");
+ return "vbt-teliks.bin";
+}