drivers/intel/fsp2_0: Refactor for earlier graphics memory WC MTRR
Moves the MTRR setup for graphics memory (GMADR) from the
`soc_load_logo_by_coreboot()` function to `do_silicon_init()`. This
refactors the logic into a new helper function,
`soc_mark_gfx_memory()`, which acquires a temporary Write-Combine
(WC) MTRR.
The MTRR is now configured earlier in the silicon initialization
process, making the setup and cleanup independent of the
`soc_load_logo_by_coreboot()` function itself.
This improves FSP-S performance and ensures the MTRR is correctly
managed within the silicon initialization flow which was earlier
missed when platform selects `USE_COREBOOT_FOR_BMP_RENDERING` aka
rendering the BMP logo using coreboot driver and not using FSP driver
logic.
The cleanup of the MTRR is also moved to `do_silicon_init()` to pair
with the earlier setup.
TEST=Successfully boot to OS on google/fatcat using coreboot for logo
rendering.
w/o this patch
```
963:returning from FspMultiPhaseSiInit 1,164,839 (123,244)
```
w/ this patch
```
963:returning from FspMultiPhaseSiInit 1,143,974 (115,443)
```
Change-Id: I5da3178c622f5fd6cb3d7f3f574e59f9ed5a5b3d
Signed-off-by: Subrata Banik <subratabanik@google.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/88982
Reviewed-by: Jérémy Compostella <jeremy.compostella@intel.com>
Reviewed-by: Pranava Y N <pranavayn@google.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
parent
1c571446ec
commit
5f0225a7b5
3 changed files with 30 additions and 11 deletions
|
|
@ -39,11 +39,29 @@ static void program_igd_lmembar(uint32_t base)
|
||||||
pci_or_config16(SA_DEV_IGD, PCI_COMMAND, enable_mask);
|
pci_or_config16(SA_DEV_IGD, PCI_COMMAND, enable_mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Marks the GMADR range as Write-Combine (WC) memory.
|
||||||
|
*
|
||||||
|
* This function acquires and configures a temporary MTRR for the GMADR range.
|
||||||
|
*
|
||||||
|
* @return valid MTRR index on success, -1 on failure.
|
||||||
|
*/
|
||||||
|
int soc_mark_gfx_memory(void)
|
||||||
|
{
|
||||||
|
/* Set up a temporary Write Combine (WC) MTRR for the GMADR range */
|
||||||
|
int temp_mtrr_index = acquire_and_configure_mtrr(GMADR_BASE, GMADR_SIZE, MTRR_TYPE_WRCOMB);
|
||||||
|
if (temp_mtrr_index < 0) {
|
||||||
|
printk(BIOS_ERR, "Failed to configure WC MTRR for GMADR.\n");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return temp_mtrr_index;
|
||||||
|
}
|
||||||
|
|
||||||
void soc_load_logo_by_coreboot(void)
|
void soc_load_logo_by_coreboot(void)
|
||||||
{
|
{
|
||||||
const struct hob_graphics_info *ginfo;
|
const struct hob_graphics_info *ginfo;
|
||||||
struct soc_intel_common_config *config = chip_get_common_soc_structure();
|
struct soc_intel_common_config *config = chip_get_common_soc_structure();
|
||||||
int temp_mtrr_index = -1;
|
|
||||||
struct logo_config logo_cfg;
|
struct logo_config logo_cfg;
|
||||||
size_t size;
|
size_t size;
|
||||||
|
|
||||||
|
|
@ -57,13 +75,6 @@ void soc_load_logo_by_coreboot(void)
|
||||||
/* Program the IGD LMEMBAR */
|
/* Program the IGD LMEMBAR */
|
||||||
program_igd_lmembar(GMADR_BASE);
|
program_igd_lmembar(GMADR_BASE);
|
||||||
|
|
||||||
/* Set up a temporary Write Combine (WC) MTRR for the GMADR range */
|
|
||||||
temp_mtrr_index = acquire_and_configure_mtrr(GMADR_BASE, GMADR_SIZE, MTRR_TYPE_WRCOMB);
|
|
||||||
if (temp_mtrr_index < 0) {
|
|
||||||
printk(BIOS_ERR, "Failed to configure WC MTRR for GMADR.\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Adjusts panel orientation for external display when the lid is closed.
|
* Adjusts panel orientation for external display when the lid is closed.
|
||||||
*
|
*
|
||||||
|
|
@ -88,7 +99,4 @@ void soc_load_logo_by_coreboot(void)
|
||||||
logo_cfg.logo_bottom_margin = config->logo_bottom_margin;
|
logo_cfg.logo_bottom_margin = config->logo_bottom_margin;
|
||||||
|
|
||||||
render_logo_to_framebuffer(&logo_cfg);
|
render_logo_to_framebuffer(&logo_cfg);
|
||||||
|
|
||||||
/* Clear temporary Write Combine (WC) MTRR */
|
|
||||||
clear_var_mtrr(temp_mtrr_index);
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -108,8 +108,10 @@ void soc_load_logo_by_fsp(FSPS_UPD *supd);
|
||||||
*/
|
*/
|
||||||
#if CONFIG(USE_COREBOOT_FOR_BMP_RENDERING)
|
#if CONFIG(USE_COREBOOT_FOR_BMP_RENDERING)
|
||||||
void soc_load_logo_by_coreboot(void);
|
void soc_load_logo_by_coreboot(void);
|
||||||
|
int soc_mark_gfx_memory(void);
|
||||||
#else
|
#else
|
||||||
static inline void soc_load_logo_by_coreboot(void) { /* nop */ }
|
static inline void soc_load_logo_by_coreboot(void) { /* nop */ }
|
||||||
|
static inline int soc_mark_gfx_memory(void) { return -1; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Update the SOC specific memory config param for mma. */
|
/* Update the SOC specific memory config param for mma. */
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@
|
||||||
#include <cbfs.h>
|
#include <cbfs.h>
|
||||||
#include <cbmem.h>
|
#include <cbmem.h>
|
||||||
#include <commonlib/fsp.h>
|
#include <commonlib/fsp.h>
|
||||||
|
#include <cpu/x86/mtrr.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <console/console.h>
|
#include <console/console.h>
|
||||||
#include <fsp/api.h>
|
#include <fsp/api.h>
|
||||||
|
|
@ -96,6 +97,7 @@ static void do_silicon_init(struct fsp_header *hdr)
|
||||||
fsp_multi_phase_init_fn multi_phase_si_init;
|
fsp_multi_phase_init_fn multi_phase_si_init;
|
||||||
struct fsp_multi_phase_params multi_phase_params;
|
struct fsp_multi_phase_params multi_phase_params;
|
||||||
struct fsp_multi_phase_get_number_of_phases_params multi_phase_get_number;
|
struct fsp_multi_phase_get_number_of_phases_params multi_phase_get_number;
|
||||||
|
int temp_mtrr_index = -1;
|
||||||
|
|
||||||
supd = (FSPS_UPD *)(uintptr_t)(hdr->cfg_region_offset + hdr->image_base);
|
supd = (FSPS_UPD *)(uintptr_t)(hdr->cfg_region_offset + hdr->image_base);
|
||||||
|
|
||||||
|
|
@ -123,6 +125,9 @@ static void do_silicon_init(struct fsp_header *hdr)
|
||||||
/* Give SoC/mainboard a chance to populate entries */
|
/* Give SoC/mainboard a chance to populate entries */
|
||||||
platform_fsp_silicon_init_params_cb(upd);
|
platform_fsp_silicon_init_params_cb(upd);
|
||||||
|
|
||||||
|
if (CONFIG(BMP_LOGO) && CONFIG(USE_COREBOOT_FOR_BMP_RENDERING))
|
||||||
|
temp_mtrr_index = soc_mark_gfx_memory();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Populate UPD entries for the logo if the platform utilizes
|
* Populate UPD entries for the logo if the platform utilizes
|
||||||
* the FSP's capability for rendering bitmap (BMP) images.
|
* the FSP's capability for rendering bitmap (BMP) images.
|
||||||
|
|
@ -229,6 +234,10 @@ static void do_silicon_init(struct fsp_header *hdr)
|
||||||
* the rendering.
|
* the rendering.
|
||||||
*/
|
*/
|
||||||
timestamp_add_now(TS_FIRMWARE_SPLASH_RENDERED);
|
timestamp_add_now(TS_FIRMWARE_SPLASH_RENDERED);
|
||||||
|
|
||||||
|
/* Clear temporary Write Combine (WC) MTRR */
|
||||||
|
if (temp_mtrr_index >= 0)
|
||||||
|
clear_var_mtrr(temp_mtrr_index);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Reinitialize CPUs if FSP-S has done MP Init */
|
/* Reinitialize CPUs if FSP-S has done MP Init */
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue