Sridhar Siricilla has uploaded this change for review. ( https://review.coreboot.org/c/coreboot/+/56073 )
Change subject: mb/intel/adlrvp: Update PMC Descriptor for Alder lake A0(0x906a0) silicon ......................................................................
mb/intel/adlrvp: Update PMC Descriptor for Alder lake A0(0x906a0) silicon
The patch updates PMC Descriptor which is part of Descriptor Region if system equipped with Alder lake A0 silicon. This change allows to use unified Descriptor Region for Alder lake A0(CPU ID:0x906a0) and B0 (CPUD ID:0x906a1) silicons.
BUG=B:187431859 TEST=Verified PMC Descriptor getting modified for Alder lake B0 silicon if not updated.
Signed-off-by: Sridhar Siricilla sridhar.siricilla@intel.com Change-Id: I2a1f60fda7575212bb694fc423bd229452515903 --- M src/mainboard/intel/adlrvp/bootblock.c 1 file changed, 56 insertions(+), 0 deletions(-)
git pull ssh://review.coreboot.org:29418/coreboot refs/changes/73/56073/1
diff --git a/src/mainboard/intel/adlrvp/bootblock.c b/src/mainboard/intel/adlrvp/bootblock.c index eeee406..e292d1d 100644 --- a/src/mainboard/intel/adlrvp/bootblock.c +++ b/src/mainboard/intel/adlrvp/bootblock.c @@ -2,8 +2,64 @@
#include <baseboard/variants.h> #include <bootblock_common.h> +#include <console/console.h> +#include <intelblocks/mp_init.h> +#include <fmap.h> +#include <commonlib/region.h> +#include <console/console.h> +#include <intelblocks/pmclib.h> +#include <cf9_reset.h> + +#define SI_DESC_REGION "SI_DESC" +#define SI_DESC_REGION_SZ 4096 +#define PMC_DESC_7_BYTE3 0xc32 + +/* It updates PMC Descriptor in the Descriptor Region */ +static void configure_pmc_descriptor(void) +{ + uint8_t si_desc_buf[SI_DESC_REGION_SZ]; + struct region_device desc_rdev; + + if (fmap_locate_area_as_rdev_rw(SI_DESC_REGION, &desc_rdev) < 0) { + printk(BIOS_ERR, "Failed to locate %s in the FMAP\n", SI_DESC_REGION); + return; + } + + if (rdev_readat(&desc_rdev, si_desc_buf, 0, SI_DESC_REGION_SZ) != SI_DESC_REGION_SZ) { + printk(BIOS_ERR, "Failed to read Descriptor Region from SPI Flash\n"); + return; + } + + if (si_desc_buf[PMC_DESC_7_BYTE3] == 0x40) { + si_desc_buf[PMC_DESC_7_BYTE3] = 0x44; + + if (rdev_eraseat(&desc_rdev, 0, SI_DESC_REGION_SZ) != SI_DESC_REGION_SZ) { + printk(BIOS_ERR, "Failed to erase Descriptor Region area\n"); + return; + } + + if (rdev_writeat(&desc_rdev, si_desc_buf, 0, SI_DESC_REGION_SZ) + != SI_DESC_REGION_SZ) { + printk(BIOS_ERR, "Failed to update Descriptor Region\n"); + return; + } + + printk(BIOS_DEBUG, "Update of PMC Descriptor successful, trigger GLOBAL RESET\n"); + + pmc_global_reset_enable(1); + do_full_reset(); + die("Failed to trigger GLOBAL RESET\n"); + } + + printk(BIOS_DEBUG, "Update of PMC Descriptor is not required!\n"); +}
void bootblock_mainboard_early_init(void) { variant_configure_early_gpio_pads(); } +void bootblock_mainboard_init(void) +{ + if (cpu_get_cpuid() == CPUID_ALDERLAKE_A0) + configure_pmc_descriptor(); +}