summaryrefslogtreecommitdiff
path: root/src/mainboard/google/brya/variants
diff options
context:
space:
mode:
authorzengqinghong <zengqinghong@huaqin.corp-partner.google.com>2024-10-25 22:19:11 +0800
committerEric Lai <ericllai@google.com>2024-10-31 04:38:35 +0000
commitd99640ffe586fe018d35e3636d63538c26d07f6c (patch)
tree128e28526557dcbf69eb114bc6bacde0928ac1c5 /src/mainboard/google/brya/variants
parent28717bd0d3eac7c4e6ffa42d6f7b8f2aa2603ece (diff)
mb/google/nissa/var/teliks: Match VBT with SSFC
We want to configure different VBT timings for panels of different sizes and distinguish them through SSFC. We select the reserved bit 6 of SSFC as the flag bit. When using a 12-inch panel, set this bit to 0; when using an 11-inch panel, set this bit to 1. Without splitting, the platform_BootPerf test will fail. BUG=b:374428465 TEST= 1. can match VBT with SSFC -When SSFC is set to 0x40: $ cat /sys/firmware/log | grep vbt Bit 6 of SSFC is 1, use vbt-teliks_panel_11_inch.bin CBFS: Found 'vbt-teliks_panel_11_inch.bin' @0x1c6140 size 0x50f in mcache @0x76adda14 -When SSFC is set to 0x0: $ cat /sys/firmware/log | grep vbt Bit 6 of SSFC is 0, use vbt-teliks.bin CBFS: Found 'vbt-teliks.bin' @0x1c5bc0 size 0x50e in mcache @0x76add9b0 2. can pass platform_BootPerf test The platform_BootPerf time measured for all SKUs is less than 1.55s. Change-Id: Ia8fb45aede5ead4826d983760506c366a70643ee Signed-off-by: Qinghong Zeng <zengqinghong@huaqin.corp-partner.google.com> Reviewed-on: https://review.coreboot.org/c/coreboot/+/84871 Reviewed-by: Paul Menzel <paulepanter@mailbox.org> Reviewed-by: Eric Lai <ericllai@google.com> Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Jianeng Ceng <cengjianeng@huaqin.corp-partner.google.com> Reviewed-by: Subrata Banik <subratabanik@google.com>
Diffstat (limited to 'src/mainboard/google/brya/variants')
-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";
+}