diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mainboard/google/brya/variants/teliks/variant.c | 58 |
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"; +} |