diff options
author | Lijian Zhao <lijian.zhao@intel.com> | 2018-08-20 14:06:13 -0700 |
---|---|---|
committer | Martin Roth <martinroth@google.com> | 2018-08-28 15:15:26 +0000 |
commit | 903c9764a16fba61bf90187d6f7e2afde37cfec0 (patch) | |
tree | 613569c7c546b90d941d55374b3f80fa59f30bf8 /src/soc/intel | |
parent | 5dff396befca2241f8323b422cbf6cc5b66a7488 (diff) |
soc/intel/cannonlake: Change LPDDR4 to MEMCFG
Modify the previously SOC_CNL_LPDDR4_INIT to SOC_CNL_MEMCFG_INIT, to
make the infrasturture to handle both LPDDR4 and DDR4 cases in the
future. Consider the case of reading SPD from SMBus other than providing
SPD pointer directly.
BUG=N/A
TEST=Verify "./util/abuild/abuild -p none -t google/zoombini -x -a"
compiles successfully.
Change-Id: I2f898147f67dd52b89cc3d9fc4e6b3854fa81f57
Signed-off-by: Lijian Zhao <lijian.zhao@intel.com>
Reviewed-on: https://review.coreboot.org/28248
Reviewed-by: Nick Vaccaro <nvaccaro@google.com>
Reviewed-by: Paul Menzel <paulepanter@users.sourceforge.net>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Diffstat (limited to 'src/soc/intel')
-rw-r--r-- | src/soc/intel/cannonlake/Kconfig | 2 | ||||
-rw-r--r-- | src/soc/intel/cannonlake/Makefile.inc | 2 | ||||
-rw-r--r-- | src/soc/intel/cannonlake/cnl_memcfg_init.c (renamed from src/soc/intel/cannonlake/cnl_lpddr4_init.c) | 76 | ||||
-rw-r--r-- | src/soc/intel/cannonlake/include/soc/cnl_memcfg_init.h (renamed from src/soc/intel/cannonlake/include/soc/cnl_lpddr4_init.h) | 39 |
4 files changed, 73 insertions, 46 deletions
diff --git a/src/soc/intel/cannonlake/Kconfig b/src/soc/intel/cannonlake/Kconfig index e6a2062c4a..ef39706b8d 100644 --- a/src/soc/intel/cannonlake/Kconfig +++ b/src/soc/intel/cannonlake/Kconfig @@ -184,7 +184,7 @@ config CPU_BCLK_MHZ int default 100 -config SOC_INTEL_CANNONLAKE_LPDDR4_INIT +config SOC_INTEL_CANNONLAKE_MEMCFG_INIT bool default n diff --git a/src/soc/intel/cannonlake/Makefile.inc b/src/soc/intel/cannonlake/Makefile.inc index 013e86a922..065d92b6e5 100644 --- a/src/soc/intel/cannonlake/Makefile.inc +++ b/src/soc/intel/cannonlake/Makefile.inc @@ -22,7 +22,7 @@ bootblock-y += lpc.c bootblock-y += p2sb.c bootblock-$(CONFIG_UART_DEBUG) += uart.c -romstage-$(CONFIG_SOC_INTEL_CANNONLAKE_LPDDR4_INIT) += cnl_lpddr4_init.c +romstage-$(CONFIG_SOC_INTEL_CANNONLAKE_MEMCFG_INIT) += cnl_memcfg_init.c romstage-y += gpio.c romstage-y += gspi.c romstage-y += i2c.c diff --git a/src/soc/intel/cannonlake/cnl_lpddr4_init.c b/src/soc/intel/cannonlake/cnl_memcfg_init.c index ea8c410267..9f9592b5db 100644 --- a/src/soc/intel/cannonlake/cnl_lpddr4_init.c +++ b/src/soc/intel/cannonlake/cnl_memcfg_init.c @@ -15,13 +15,12 @@ #include <assert.h> #include <console/console.h> #include <fsp/util.h> -#include <soc/cnl_lpddr4_init.h> +#include <soc/cnl_memcfg_init.h> #include <spd_bin.h> #include <string.h> -static void meminit_lpddr4(FSP_M_CONFIG *mem_cfg, - const struct lpddr4_cfg *board_cfg, - size_t spd_data_len, uintptr_t spd_data_ptr) +static void meminit_memcfg(FSP_M_CONFIG *mem_cfg, + const struct cnl_mb_cfg *board_cfg) { /* * DqByteMapChx expects 12 bytes of data, but the last 6 bytes @@ -29,17 +28,17 @@ static void meminit_lpddr4(FSP_M_CONFIG *mem_cfg, * we null out the rest of the data. */ memset(&mem_cfg->DqByteMapCh0, 0, sizeof(mem_cfg->DqByteMapCh0)); - memcpy(&mem_cfg->DqByteMapCh0, &board_cfg->dq_map[LP4_CH0], - sizeof(board_cfg->dq_map[LP4_CH0])); + memcpy(&mem_cfg->DqByteMapCh0, &board_cfg->dq_map[DDR_CH0], + sizeof(board_cfg->dq_map[DDR_CH0])); memset(&mem_cfg->DqByteMapCh1, 0, sizeof(mem_cfg->DqByteMapCh1)); - memcpy(&mem_cfg->DqByteMapCh1, &board_cfg->dq_map[LP4_CH1], - sizeof(board_cfg->dq_map[LP4_CH1])); + memcpy(&mem_cfg->DqByteMapCh1, &board_cfg->dq_map[DDR_CH1], + sizeof(board_cfg->dq_map[DDR_CH1])); - memcpy(&mem_cfg->DqsMapCpu2DramCh0, &board_cfg->dqs_map[LP4_CH0], - sizeof(board_cfg->dqs_map[LP4_CH0])); - memcpy(&mem_cfg->DqsMapCpu2DramCh1, &board_cfg->dqs_map[LP4_CH1], - sizeof(board_cfg->dqs_map[LP4_CH1])); + memcpy(&mem_cfg->DqsMapCpu2DramCh0, &board_cfg->dqs_map[DDR_CH0], + sizeof(board_cfg->dqs_map[DDR_CH0])); + memcpy(&mem_cfg->DqsMapCpu2DramCh1, &board_cfg->dqs_map[DDR_CH1], + sizeof(board_cfg->dqs_map[DDR_CH1])); memcpy(&mem_cfg->RcompResistor, &board_cfg->rcomp_resistor, sizeof(mem_cfg->RcompResistor)); @@ -47,7 +46,12 @@ static void meminit_lpddr4(FSP_M_CONFIG *mem_cfg, /* Early cannonlake requires rcomp targets to be 0 */ memcpy(&mem_cfg->RcompTarget, &board_cfg->rcomp_targets, sizeof(mem_cfg->RcompTarget)); +} +static void meminit_memcfg_spd(FSP_M_CONFIG *mem_cfg, + const struct cnl_mb_cfg *board_cfg, + size_t spd_data_len, uintptr_t spd_data_ptr) +{ mem_cfg->MemorySpdDataLen = spd_data_len; mem_cfg->MemorySpdPtr00 = spd_data_ptr; @@ -56,23 +60,23 @@ static void meminit_lpddr4(FSP_M_CONFIG *mem_cfg, } /* - * Initialize default LPDDR4 settings using spd data contained in a buffer. + * Initialize default memory settings using spd data contained in a buffer. */ -static void meminit_lpddr4_spd_data(FSP_M_CONFIG *mem_cfg, - const struct lpddr4_cfg *cnl_cfg, +static void meminit_spd_data(FSP_M_CONFIG *mem_cfg, + const struct cnl_mb_cfg *cnl_cfg, size_t spd_data_len, uintptr_t spd_data_ptr) { assert(spd_data_ptr && spd_data_len); - meminit_lpddr4(mem_cfg, cnl_cfg, spd_data_len, spd_data_ptr); + meminit_memcfg_spd(mem_cfg, cnl_cfg, spd_data_len, spd_data_ptr); } /* - * Initialize default LPDDR4 settings using the spd file specified by + * Initialize default memory settings using the spd file specified by * spd_index. The spd_index is an index into the SPD_SOURCES array defined * in spd/Makefile.inc. */ -static void meminit_lpddr4_cbfs_spd_index(FSP_M_CONFIG *mem_cfg, - const struct lpddr4_cfg *cnl_cfg, +static void meminit_cbfs_spd_index(FSP_M_CONFIG *mem_cfg, + const struct cnl_mb_cfg *cnl_cfg, int spd_index) { size_t spd_data_len; @@ -86,26 +90,40 @@ static void meminit_lpddr4_cbfs_spd_index(FSP_M_CONFIG *mem_cfg, /* Memory leak is ok since we have memory mapped boot media */ assert(IS_ENABLED(CONFIG_BOOT_DEVICE_MEMORY_MAPPED)); spd_data_ptr = (uintptr_t)rdev_mmap_full(&spd_rdev); - meminit_lpddr4_spd_data(mem_cfg, cnl_cfg, spd_data_len, spd_data_ptr); + meminit_spd_data(mem_cfg, cnl_cfg, spd_data_len, spd_data_ptr); } -/* Initialize LPDDR4 settings for CannonLake */ -void cannonlake_lpddr4_init(FSP_M_CONFIG *mem_cfg, - const struct lpddr4_cfg *cnl_cfg, +/* Initialize onboard memory configurations for CannonLake */ +void cannonlake_memcfg_init(FSP_M_CONFIG *mem_cfg, + const struct cnl_mb_cfg *cnl_cfg, const struct spd_info *spd) { + bool OnModuleSpd; /* Early Command Training Enabled */ mem_cfg->ECT = cnl_cfg->ect; mem_cfg->DqPinsInterleaved = cnl_cfg->dq_pins_interleaved; - mem_cfg->RefClk = 0; /* Auto Select CLK freq */ - mem_cfg->CaVrefConfig = 0; /* VREF_CA->CHA/CHB */ + mem_cfg->CaVrefConfig = cnl_cfg->vref_ca_config; - if (spd->spd_by_index) { - meminit_lpddr4_cbfs_spd_index(mem_cfg, cnl_cfg, + /* Spd pointer will only be used if all smbus slave address of memory + * sockets on the platform is empty */ + for (int i = 0; i < ARRAY_SIZE(mem_cfg->SpdAddressTable); i++) { + if (spd->spd_smbus_address[i] != 0) { + mem_cfg->SpdAddressTable[i] = spd->spd_smbus_address[i]; + OnModuleSpd = 1; + } + } + + if (!OnModuleSpd) { + if (spd->spd_by_index) { + meminit_cbfs_spd_index(mem_cfg, cnl_cfg, spd->spd_spec.spd_index); - } else { - meminit_lpddr4_spd_data(mem_cfg, cnl_cfg, + } else { + meminit_spd_data(mem_cfg, cnl_cfg, spd->spd_spec.spd_data_ptr_info.spd_data_len, spd->spd_spec.spd_data_ptr_info.spd_data_ptr); + } } + + meminit_memcfg(mem_cfg, cnl_cfg); + } diff --git a/src/soc/intel/cannonlake/include/soc/cnl_lpddr4_init.h b/src/soc/intel/cannonlake/include/soc/cnl_memcfg_init.h index db1c3a57c9..7a76eb09f1 100644 --- a/src/soc/intel/cannonlake/include/soc/cnl_lpddr4_init.h +++ b/src/soc/intel/cannonlake/include/soc/cnl_memcfg_init.h @@ -13,8 +13,8 @@ * GNU General Public License for more details. */ -#ifndef _SOC_CANNONLAKE_LPDDR4_INIT_H_ -#define _SOC_CANNONLAKE_LPDDR4_INIT_H_ +#ifndef _SOC_CANNONLAKE_MEMCFG_INIT_H_ +#define _SOC_CANNONLAKE_MEMCFG_INIT_H_ #include <stddef.h> #include <stdint.h> @@ -24,15 +24,15 @@ #define DQ_BITS_PER_DQS 8 /* - * Number of LPDDR4 packages, where a "package" represents a 64-bit solution. + * Number of memory packages, where a "package" represents a 64-bit solution. */ -#define LP4_NUM_PACKAGES 2 +#define DDR_NUM_PACKAGES 2 /* 64-bit Channel identification */ enum { - LP4_CH0, - LP4_CH1, - LP4_NUM_CHANNELS + DDR_CH0, + DDR_CH1, + DDR_NUM_CHANNELS }; struct spd_by_pointer { @@ -46,10 +46,11 @@ struct spd_info { int spd_index; struct spd_by_pointer spd_data_ptr_info; } spd_spec; + const uint8_t spd_smbus_address[4]; }; -/* Board-specific lpddr4 dq mapping information */ -struct lpddr4_cfg { +/* Board-specific memory dq mapping information */ +struct cnl_mb_cfg { /* * For each channel, there are 3 sets of DQ byte mappings, * where each set has a package 0 and a package 1 value (package 0 @@ -61,7 +62,7 @@ struct lpddr4_cfg { * and let the meminit_lpddr4() routine take care of clearing the * unused fields for the caller. */ - const uint8_t dq_map[LP4_NUM_CHANNELS][3][LP4_NUM_PACKAGES]; + const uint8_t dq_map[DDR_NUM_CHANNELS][3][DDR_NUM_PACKAGES]; /* * DQS CPU<>DRAM map Ch0 and Ch1. Each array entry represents a @@ -70,7 +71,7 @@ struct lpddr4_cfg { * on the memory part, and the values in the array represent which * pin on the CPU that DRAM pin connects to. */ - const uint8_t dqs_map[LP4_NUM_CHANNELS][DQ_BITS_PER_DQS]; + const uint8_t dqs_map[DDR_NUM_CHANNELS][DQ_BITS_PER_DQS]; /* * Rcomp resistor values. These values represent the resistance in @@ -92,15 +93,23 @@ struct lpddr4_cfg { */ const uint8_t dq_pins_interleaved; + /* + * VREF_CA configuraation. + * Set to 0 VREF_CA goes to both CH_A and CH_B, + * set to 1 VREF_CA goes to CH_A and VREF_DQ_A goes to CH_B, + * set to 2 VREF_CA goes to CH_A and VREF_DQ_B goes to CH_B. + */ + const uint8_t vref_ca_config; + /* Early Command Training Enabled */ const uint8_t ect; }; /* - * Initialize default LPDDR4 settings for CannonLake. + * Initialize default memory configurations for CannonLake. */ -void cannonlake_lpddr4_init(FSP_M_CONFIG *mem_cfg, - const struct lpddr4_cfg *cnl_cfg, +void cannonlake_memcfg_init(FSP_M_CONFIG *mem_cfg, + const struct cnl_mb_cfg *cnl_cfg, const struct spd_info *spd); -#endif /* _SOC_CANNONLAKE_LPDDR4_INIT_H_ */ +#endif /* _SOC_CANNONLAKE_MEMCFG_INIT_H_ */ |