soc/intel/quark: Disable the ROM shadow
Disable the ROM shadow and enable RAM for 0x000e0000 - 0x000fffff. Testing on Galileo: * Edit the src/mainboard/intel/galileo/Makefile.inc file: * Add "select ADD_FSP_PDAT_FILE" * Add "select ADD_FSP_RAW_BIN" * Add "select ADD_RMU_FILE" * Place the FSP.bin file in the location specified by CONFIG_FSP_FILE * Place the pdat.bin files in the location specified by CONFIG_FSP_PDAT_FILE * Place the rmu.bin file in the location specified by CONFIG_RMU_FILE * Build EDK2 CorebootPayloadPkg/CorebootPayloadPkgIa32.dsc to generate UEFIPAYLOAD.fd * Testing successful display of 0x000ffff0 - 0x000fffff does not match the end of the SPI flash. Change-Id: I6e0a50417815320333eae0b69b96280c39db7eaa Signed-off-by: Lee Leahy <leroy.p.leahy@intel.com> Reviewed-on: https://review.coreboot.org/14110 Tested-by: build bot (Jenkins) Reviewed-by: Martin Roth <martinroth@google.com>
This commit is contained in:
parent
1f1f2c4d38
commit
d75ed0bfd9
|
@ -269,6 +269,8 @@ Definitions beginning with "N_" are the bit position
|
||||||
//
|
//
|
||||||
#define QNC_MSG_FSBIC_REG_HMISC 0x03 // Host Misellaneous Controls
|
#define QNC_MSG_FSBIC_REG_HMISC 0x03 // Host Misellaneous Controls
|
||||||
#define SMI_EN (BIT19) // SMI Global Enable (from Legacy Bridge)
|
#define SMI_EN (BIT19) // SMI Global Enable (from Legacy Bridge)
|
||||||
|
#define FSEG_RD_DRAM (BIT2) // Enable RAM for 0x000f0000 - 0x000fffff
|
||||||
|
#define ESEG_RD_DRAM (BIT1) // Enable RAM for 0x000e0000 - 0x000effff
|
||||||
#define QNC_MSG_FSBIC_REG_HSMMC 0x04 // Host SMM Control
|
#define QNC_MSG_FSBIC_REG_HSMMC 0x04 // Host SMM Control
|
||||||
#define NON_HOST_SMM_WR_OPEN (BIT18) // SMM Writes OPEN
|
#define NON_HOST_SMM_WR_OPEN (BIT18) // SMM Writes OPEN
|
||||||
#define NON_HOST_SMM_RD_OPEN (BIT17) // SMM Writes OPEN
|
#define NON_HOST_SMM_RD_OPEN (BIT17) // SMM Writes OPEN
|
||||||
|
|
|
@ -30,6 +30,8 @@ void mcr_write(uint8_t opcode, uint8_t port, uint32_t reg_address);
|
||||||
uint32_t mdr_read(void);
|
uint32_t mdr_read(void);
|
||||||
void mdr_write(uint32_t value);
|
void mdr_write(uint32_t value);
|
||||||
void mea_write(uint32_t reg_address);
|
void mea_write(uint32_t reg_address);
|
||||||
|
uint32_t port_reg_read(uint8_t port, uint32_t offset);
|
||||||
|
void port_reg_write(uint8_t port, uint32_t offset, uint32_t value);
|
||||||
void report_platform_info(void);
|
void report_platform_info(void);
|
||||||
int set_base_address_and_enable_uart(u8 bus, u8 dev, u8 func, u32 mmio_base);
|
int set_base_address_and_enable_uart(u8 bus, u8 dev, u8 func, u32 mmio_base);
|
||||||
|
|
||||||
|
|
|
@ -73,6 +73,23 @@ static uint32_t mtrr_index_to_host_bridge_register_offset(unsigned long index)
|
||||||
return offset;
|
return offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint32_t port_reg_read(uint8_t port, uint32_t offset)
|
||||||
|
{
|
||||||
|
/* Read the port register */
|
||||||
|
offset = QNC_MSG_FSBIC_REG_HMISC;
|
||||||
|
mea_write(offset);
|
||||||
|
mcr_write(QUARK_OPCODE_READ, port, offset);
|
||||||
|
return mdr_read();
|
||||||
|
}
|
||||||
|
|
||||||
|
void port_reg_write(uint8_t port, uint32_t offset, uint32_t value)
|
||||||
|
{
|
||||||
|
/* Write the port register */
|
||||||
|
mea_write(offset);
|
||||||
|
mdr_write(value);
|
||||||
|
mcr_write(QUARK_OPCODE_WRITE, port, offset);
|
||||||
|
}
|
||||||
|
|
||||||
msr_t soc_mtrr_read(unsigned long index)
|
msr_t soc_mtrr_read(unsigned long index)
|
||||||
{
|
{
|
||||||
uint32_t offset;
|
uint32_t offset;
|
||||||
|
@ -83,18 +100,14 @@ msr_t soc_mtrr_read(unsigned long index)
|
||||||
|
|
||||||
/* Read the low 32-bits of the register */
|
/* Read the low 32-bits of the register */
|
||||||
offset = mtrr_index_to_host_bridge_register_offset(index);
|
offset = mtrr_index_to_host_bridge_register_offset(index);
|
||||||
mea_write(offset);
|
value.u64 = port_reg_read(QUARK_NC_HOST_BRIDGE_SB_PORT_ID, offset);
|
||||||
mcr_write(QUARK_OPCODE_READ, QUARK_NC_HOST_BRIDGE_SB_PORT_ID, offset);
|
|
||||||
value.u64 = mdr_read();
|
|
||||||
|
|
||||||
/* For 64-bit registers, read the upper 32-bits */
|
/* For 64-bit registers, read the upper 32-bits */
|
||||||
if ((offset >= QUARK_NC_HOST_BRIDGE_MTRR_FIX64K_00000)
|
if ((offset >= QUARK_NC_HOST_BRIDGE_MTRR_FIX64K_00000)
|
||||||
&& (offset <= QUARK_NC_HOST_BRIDGE_MTRR_FIX4K_F8000)) {
|
&& (offset <= QUARK_NC_HOST_BRIDGE_MTRR_FIX4K_F8000)) {
|
||||||
offset += 1;
|
offset += 1;
|
||||||
mea_write(offset);
|
value.u64 |= port_reg_read(QUARK_NC_HOST_BRIDGE_SB_PORT_ID,
|
||||||
mcr_write(QUARK_OPCODE_READ, QUARK_NC_HOST_BRIDGE_SB_PORT_ID,
|
offset);
|
||||||
offset);
|
|
||||||
value.u64 |= mdr_read();
|
|
||||||
}
|
}
|
||||||
return value.msr;
|
return value.msr;
|
||||||
}
|
}
|
||||||
|
@ -110,18 +123,14 @@ void soc_mtrr_write(unsigned long index, msr_t msr)
|
||||||
/* Write the low 32-bits of the register */
|
/* Write the low 32-bits of the register */
|
||||||
value.msr = msr;
|
value.msr = msr;
|
||||||
offset = mtrr_index_to_host_bridge_register_offset(index);
|
offset = mtrr_index_to_host_bridge_register_offset(index);
|
||||||
mea_write(offset);
|
port_reg_write(QUARK_NC_HOST_BRIDGE_SB_PORT_ID, offset, value.u32[0]);
|
||||||
mdr_write(value.u32[0]);
|
|
||||||
mcr_write(QUARK_OPCODE_WRITE, QUARK_NC_HOST_BRIDGE_SB_PORT_ID, offset);
|
|
||||||
|
|
||||||
/* For 64-bit registers, write the upper 32-bits */
|
/* For 64-bit registers, write the upper 32-bits */
|
||||||
if ((offset >= QUARK_NC_HOST_BRIDGE_MTRR_FIX64K_00000)
|
if ((offset >= QUARK_NC_HOST_BRIDGE_MTRR_FIX64K_00000)
|
||||||
&& (offset <= QUARK_NC_HOST_BRIDGE_MTRR_FIX4K_F8000)) {
|
&& (offset <= QUARK_NC_HOST_BRIDGE_MTRR_FIX4K_F8000)) {
|
||||||
offset += 1;
|
offset += 1;
|
||||||
mea_write(offset);
|
port_reg_write(QUARK_NC_HOST_BRIDGE_SB_PORT_ID, offset,
|
||||||
mdr_write(value.u32[1]);
|
value.u32[1]);
|
||||||
mcr_write(QUARK_OPCODE_WRITE, QUARK_NC_HOST_BRIDGE_SB_PORT_ID,
|
|
||||||
offset);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include <device/pci_def.h>
|
#include <device/pci_def.h>
|
||||||
#include <fsp/car.h>
|
#include <fsp/car.h>
|
||||||
#include <fsp/util.h>
|
#include <fsp/util.h>
|
||||||
|
#include <lib.h>
|
||||||
#include <soc/intel/common/util.h>
|
#include <soc/intel/common/util.h>
|
||||||
#include <soc/iomap.h>
|
#include <soc/iomap.h>
|
||||||
#include <soc/pci_devs.h>
|
#include <soc/pci_devs.h>
|
||||||
|
@ -86,6 +87,30 @@ void soc_memory_init_params(struct romstage_params *params,
|
||||||
config->PcdSmmTsegSize : 0;
|
config->PcdSmmTsegSize : 0;
|
||||||
upd->PcdPlatformDataBaseAddress = (UINT32)pdat_file;
|
upd->PcdPlatformDataBaseAddress = (UINT32)pdat_file;
|
||||||
upd->PcdPlatformDataMaxLen = (UINT32)pdat_file_len;
|
upd->PcdPlatformDataMaxLen = (UINT32)pdat_file_len;
|
||||||
|
|
||||||
|
/* Display the ROM shadow data */
|
||||||
|
hexdump((void *)0x000ffff0, 0x10);
|
||||||
|
}
|
||||||
|
|
||||||
|
void soc_after_ram_init(struct romstage_params *params)
|
||||||
|
{
|
||||||
|
uint32_t data;
|
||||||
|
|
||||||
|
/* Determine if the shadow ROM is enabled */
|
||||||
|
data = port_reg_read(QUARK_NC_HOST_BRIDGE_SB_PORT_ID,
|
||||||
|
QNC_MSG_FSBIC_REG_HMISC);
|
||||||
|
printk(BIOS_DEBUG, "0x%08x: HMISC\n", data);
|
||||||
|
if ((data & (ESEG_RD_DRAM | FSEG_RD_DRAM))
|
||||||
|
!= (ESEG_RD_DRAM | FSEG_RD_DRAM)) {
|
||||||
|
|
||||||
|
/* Disable the ROM shadow 0x000e0000 - 0x000fffff */
|
||||||
|
data |= ESEG_RD_DRAM | FSEG_RD_DRAM;
|
||||||
|
port_reg_write(QUARK_NC_HOST_BRIDGE_SB_PORT_ID,
|
||||||
|
QNC_MSG_FSBIC_REG_HMISC, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Display the DRAM data */
|
||||||
|
hexdump((void *)0x000ffff0, 0x10);
|
||||||
}
|
}
|
||||||
|
|
||||||
void soc_display_memory_init_params(const MEMORY_INIT_UPD *old,
|
void soc_display_memory_init_params(const MEMORY_INIT_UPD *old,
|
||||||
|
|
Loading…
Reference in New Issue