Hung-Te Lin has submitted this change. ( https://review.coreboot.org/c/blobs/+/61102 )
Change subject: soc/mediatek/mt8186: Add dram.elf version 0.1.0 for DRAM calibration ......................................................................
soc/mediatek/mt8186: Add dram.elf version 0.1.0 for DRAM calibration
This blob includes both full calibration and fast calibration flow.
TEST=DRAM calibration pass BUG=b:204226005
Signed-off-by: Ryan Chuang ryan.chuang@mediatek.com Signed-off-by: Xi Chen xixi.chen@mediatek.corp-partner.google.com Change-Id: I010ded1cb68f4bd50f08927b0b4faaa9b9db67f6 --- M soc/mediatek/mt8186/README.md A soc/mediatek/mt8186/dram.elf A soc/mediatek/mt8186/dram.elf.md5 A soc/mediatek/mt8186/dram_release_notes.txt 4 files changed, 111 insertions(+), 0 deletions(-)
Approvals: Yu-Ping Wu: Verified; Looks good to me, approved
diff --git a/soc/mediatek/mt8186/README.md b/soc/mediatek/mt8186/README.md index d8b07fd..eb7a848 100644 --- a/soc/mediatek/mt8186/README.md +++ b/soc/mediatek/mt8186/README.md @@ -1,6 +1,7 @@ # Firmware list - `spm_firmware.bin` - `sspm.bin` +- `dram.elf`
-------------------------------------------------------------------------------- # SPM introduction @@ -41,3 +42,101 @@ `$ strings sspm.bin | grep "SSPM firmware"`
-------------------------------------------------------------------------------- +# `dram.elf` introduction +`dram.elf` is an ELF format file, which performs DRAM full calibration, DRAM +fast calibration and returns the trained calibration parameters to the caller. +The caller may store the parameters on NOR/NAND or eMMC for faster subsequent +bootups. + +## Who uses it +Coreboot loads `dram.elf` during the first bootup if no valid DRAM parameters +are found on NOR/NAND or eMMC. + +## How to load `dram.elf` +Coreboot locates `dram.elf` file, locates the entry point `_start`, +passes a `dramc_param` struct argument `dparam` to it, and calls +`_start(&dparam)` to execute `dram.elf`. + +## Parameters +``` +struct dramc_param { + struct dramc_param_header header; // see below + void (*do_putc)(unsigned char c); + struct dramc_data dramc_datas; // see below +}; +``` + +Below shows the internal structure of `dramc_param`: +``` +struct dramc_param_header { + u16 version; /* DRAMC_PARAM_HEADER_VERSION, set in coreboot */ + u16 size; /* size of whole dramc_param, set in coreboot */ + u16 status; /* DRAMC_PARAM_STATUS_CODES, set in dram blob */ + u16 flags; /* DRAMC_PARAM_FLAG, set in dram blob */ + u16 config; /* DRAMC_PARAM_CONFIG, set in coreboot */ +}; + +struct sdram_info { + u32 ddr_type; /* SDRAM_DDR_TYPE */ + u32 ddr_geometry; /* SDRAM_DDR_GEOMETRY_TYPE */ +}; + +struct sdram_params { + u32 rank_num; + u16 num_dlycell_perT; + u16 delay_cell_timex100; + + /* duty */ + s8 duty_clk_delay[CHANNEL_MAX][RANK_MAX]; + s8 duty_dqs_delay[CHANNEL_MAX][DQS_NUMBER_LP4]; + s8 duty_wck_delay[CHANNEL_MAX][DQS_NUMBER_LP4]; + ....... + ....... +}; + +struct emi_mdl { + u32 cona_val; + u32 conh_val; + u32 conf_val; + u32 chn_cona_val; +}; + +struct ddr_mrr_info { + u16 mr5_vendor_id; + u16 mr6_revision_id; + u16 mr7_revision_id; + u64 mr8_density[RANK_MAX]; + u32 rank_nums; + u8 die_num[RANK_MAX]; +}; + +struct ddr_base_info { + u32 config_dvfs; /* SDRAM_DVFS_FLAG */ + struct sdram_info sdram; + u32 voltage_type; /* SDRAM_VOLTAGE_TYPE */ + u32 support_ranks; + u64 rank_size[RANK_MAX]; + struct emi_mdl emi_config; + DRAM_CBT_MODE_T cbt_mode[RANK_MAX]; + struct ddr_mrr_info mrr_info; + u32 data_rate; +}; + +struct dramc_data { + struct ddr_base_info ddr_info; + struct sdram_params freq_params[DRAM_DFS_SHU_MAX]; +}; +``` + +## The output of `dram.elf` +`dram.elf` configures suitable dramc settings and returns the DRAM parameters. +Then, Coreboot saves the parameters on the specified firmware flash section: +`"RW_MRC_CACHE"`. + +## Return values +0 on success; < 0 on failure. + +## Version +`$ strings dram.elf | grep "firmware version"` + +-------------------------------------------------------------------------------- diff --git a/soc/mediatek/mt8186/dram.elf b/soc/mediatek/mt8186/dram.elf new file mode 100644 index 0000000..0f80e3d --- /dev/null +++ b/soc/mediatek/mt8186/dram.elf Binary files differ diff --git a/soc/mediatek/mt8186/dram.elf.md5 b/soc/mediatek/mt8186/dram.elf.md5 new file mode 100644 index 0000000..97bbb16 --- /dev/null +++ b/soc/mediatek/mt8186/dram.elf.md5 @@ -0,0 +1 @@ +5c7f96716ec681544803301184a33f4b *dram.elf diff --git a/soc/mediatek/mt8186/dram_release_notes.txt b/soc/mediatek/mt8186/dram_release_notes.txt new file mode 100644 index 0000000..16e773d --- /dev/null +++ b/soc/mediatek/mt8186/dram_release_notes.txt @@ -0,0 +1,11 @@ +# 0.1.0 + +1. A local build. + Protocol (params header) version: 1 + +2. Included changes: + +- CL:*4389197 mtk-dramk/mt8186,8192,8195: Extract dramc_param_header to common header +- CL:*4357516 mtk-dramk/mt8186: Add fast-k support +- CL:*4392248 mtk-dramk/mt8186: Add cros folder for mtk-dramk +- CL:*4043272 mtk-dramk/mt8186: Initial drop for memory calibration