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>
This commit is contained in:
zengqinghong 2024-10-25 22:19:11 +08:00 committed by Eric Lai
commit d99640ffe5

View file

@ -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";
}