Index: parse.c |
diff --git a/parse.c b/parse.c |
index babda0440e87c3e774cf7d1c8ad79253335757e6..49d7b4a193e8cbdef3fcecb88a6bbad41e55b9cd 100644 |
--- a/parse.c |
+++ b/parse.c |
@@ -80,6 +80,8 @@ static char |
*parse_end_state(char *statement, char *uname, int chars_remaining); |
static int |
parse_dev_param(build_image_context *context, parse_token token, char *rest); |
+static int |
+parse_sdram_param(build_image_context *context, parse_token token, char *rest); |
static int process_statement(build_image_context *context, char *statement); |
@@ -143,6 +145,231 @@ static enum_item s_spi_clock_source_table[] = |
{ NULL, 0 } |
}; |
+static enum_item s_nvboot_memory_type_table[] = |
+{ |
+ { "NvBootMemoryType_None", nvbct_lib_id_memory_type_none }, |
+ { "NvBootMemoryType_Ddr2", nvbct_lib_id_memory_type_ddr2 }, |
+ { "NvBootMemoryType_Ddr", nvbct_lib_id_memory_type_ddr }, |
+ { "NvBootMemoryType_LpDdr2", nvbct_lib_id_memory_type_lpddr2 }, |
+ { "NvBootMemoryType_LpDdr", nvbct_lib_id_memory_type_lpddr }, |
+ |
+ { "None", nvbct_lib_id_memory_type_none }, |
+ { "Ddr2", nvbct_lib_id_memory_type_ddr2 }, |
+ { "Ddr", nvbct_lib_id_memory_type_ddr }, |
+ { "LpDdr2", nvbct_lib_id_memory_type_lpddr2 }, |
+ { "LpDdr", nvbct_lib_id_memory_type_lpddr }, |
+ |
+ { NULL, 0 } |
+}; |
+ |
+static field_item s_sdram_field_table[] = |
+{ |
+ { "MemoryType", token_memory_type, |
+ field_type_enum, s_nvboot_memory_type_table }, |
+ { "PllMChargePumpSetupControl", token_pllm_charge_pump_setup_ctrl, |
+ field_type_u32, NULL }, |
+ { "PllMLoopFilterSetupControl", token_pllm_loop_filter_setup_ctrl, |
+ field_type_u32, NULL }, |
+ { "PllMInputDivider", token_pllm_input_divider, |
+ field_type_u32, NULL }, |
+ { "PllMFeedbackDivider", token_pllm_feedback_divider, |
+ field_type_u32, NULL }, |
+ { "PllMPostDivider", token_pllm_post_divider, |
+ field_type_u32, NULL }, |
+ { "PllMStableTime", token_pllm_stable_time, |
+ field_type_u32, NULL }, |
+ { "EmcClockDivider", token_emc_clock_divider, |
+ field_type_u32, NULL }, |
+ { "EmcAutoCalInterval", token_emc_auto_cal_interval, |
+ field_type_u32, NULL }, |
+ { "EmcAutoCalConfig", token_emc_auto_cal_config, |
+ field_type_u32, NULL }, |
+ { "EmcAutoCalWait", token_emc_auto_cal_wait, |
+ field_type_u32, NULL }, |
+ { "EmcPinProgramWait", token_emc_pin_program_wait, |
+ field_type_u32, NULL }, |
+ { "EmcRc", token_emc_rc, |
+ field_type_u32, NULL }, |
+ { "EmcRfc", token_emc_rfc, |
+ field_type_u32, NULL }, |
+ { "EmcRas", token_emc_ras, |
+ field_type_u32, NULL }, |
+ { "EmcRp", token_emc_rp, |
+ field_type_u32, NULL }, |
+ { "EmcR2w", token_emc_r2w, |
+ field_type_u32, NULL }, |
+ { "EmcW2r", token_emc_w2r, |
+ field_type_u32, NULL }, |
+ { "EmcR2p", token_emc_r2p, |
+ field_type_u32, NULL }, |
+ { "EmcW2p", token_emc_w2p, |
+ field_type_u32, NULL }, |
+ { "EmcRrd", token_emc_rrd, |
+ field_type_u32, NULL }, |
+ { "EmcRdRcd", token_emc_rd_rcd, |
+ field_type_u32, NULL }, |
+ { "EmcWrRcd", token_emc_wr_rcd, |
+ field_type_u32, NULL }, |
+ { "EmcRext", token_emc_rext, |
+ field_type_u32, NULL }, |
+ { "EmcWdv", token_emc_wdv, |
+ field_type_u32, NULL }, |
+ { "EmcQUseExtra", token_emc_quse_extra, |
+ field_type_u32, NULL }, |
+ { "EmcQUse", token_emc_quse, |
+ field_type_u32, NULL }, |
+ { "EmcQRst", token_emc_qrst, |
+ field_type_u32, NULL }, |
+ { "EmcQSafe", token_emc_qsafe, |
+ field_type_u32, NULL }, |
+ { "EmcRdv", token_emc_rdv, |
+ field_type_u32, NULL }, |
+ { "EmcRefresh", token_emc_refresh, |
+ field_type_u32, NULL }, |
+ { "EmcBurstRefreshNum", token_emc_burst_refresh_num, |
+ field_type_u32, NULL }, |
+ { "EmcPdEx2Wr", token_emc_pdex2wr, |
+ field_type_u32, NULL }, |
+ { "EmcPdEx2Rd", token_emc_pdex2rd, |
+ field_type_u32, NULL }, |
+ { "EmcPChg2Pden", token_emc_pchg2pden, |
+ field_type_u32, NULL }, |
+ { "EmcAct2Pden", token_emc_act2pden, |
+ field_type_u32, NULL }, |
+ { "EmcAr2Pden", token_emc_ar2pden, |
+ field_type_u32, NULL }, |
+ { "EmcRw2Pden", token_emc_rw2pden, |
+ field_type_u32, NULL }, |
+ { "EmcTxsr", token_emc_txsr, |
+ field_type_u32, NULL }, |
+ { "EmcTcke", token_emc_tcke, |
+ field_type_u32, NULL }, |
+ { "EmcTfaw", token_emc_tfaw, |
+ field_type_u32, NULL }, |
+ { "EmcTrpab", token_emc_trpab, |
+ field_type_u32, NULL }, |
+ { "EmcTClkStable", token_emc_tclkstable, |
+ field_type_u32, NULL }, |
+ { "EmcTClkStop", token_emc_tclkstop, |
+ field_type_u32, NULL }, |
+ { "EmcTRefBw", token_emc_trefbw, |
+ field_type_u32, NULL }, |
+ { "EmcFbioCfg1", token_emc_fbio_cfg1, |
+ field_type_u32, NULL }, |
+ { "EmcFbioDqsibDlyMsb", token_emc_fbio_dqsib_dly_msb, |
+ field_type_u32, NULL }, |
+ { "EmcFbioDqsibDly", token_emc_fbio_dqsib_dly, |
+ field_type_u32, NULL }, |
+ { "EmcFbioQuseDlyMsb", token_emc_fbio_quse_dly_msb, |
+ field_type_u32, NULL }, |
+ { "EmcFbioQuseDly", token_emc_fbio_quse_dly, |
+ field_type_u32, NULL }, |
+ { "EmcFbioCfg5", token_emc_fbio_cfg5, |
+ field_type_u32, NULL }, |
+ { "EmcFbioCfg6", token_emc_fbio_cfg6, |
+ field_type_u32, NULL }, |
+ { "EmcFbioSpare", token_emc_fbio_spare, |
+ field_type_u32, NULL }, |
+ { "EmcMrsResetDllWait", token_emc_mrs_reset_dll_wait, |
+ field_type_u32, NULL }, |
+ { "EmcMrsResetDll", token_emc_mrs_reset_dll, |
+ field_type_u32, NULL }, |
+ { "EmcMrsDdr2DllReset", token_emc_mrs_ddr2_dll_reset, |
+ field_type_u32, NULL }, |
+ { "EmcMrs", token_emc_mrs, |
+ field_type_u32, NULL }, |
+ { "EmcEmrsEmr2", token_emc_emrs_emr2, |
+ field_type_u32, NULL }, |
+ { "EmcEmrsEmr3", token_emc_emrs_emr3, |
+ field_type_u32, NULL }, |
+ { "EmcEmrsDdr2DllEnable", token_emc_emrs_ddr2_dll_enable, |
+ field_type_u32, NULL }, |
+ { "EmcEmrsDdr2OcdCalib", token_emc_emrs_ddr2_ocd_calib, |
+ field_type_u32, NULL }, |
+ { "EmcEmrs", token_emc_emrs, |
+ field_type_u32, NULL }, |
+ { "EmcMrw1", token_emc_mrw1, |
+ field_type_u32, NULL }, |
+ { "EmcMrw2", token_emc_mrw2, |
+ field_type_u32, NULL }, |
+ { "EmcMrw3", token_emc_mrw3, |
+ field_type_u32, NULL }, |
+ { "EmcMrwResetCommand", token_emc_mrw_reset_command, |
+ field_type_u32, NULL }, |
+ { "EmcMrwResetNInitWait", token_emc_mrw_reset_ninit_wait, |
+ field_type_u32, NULL }, |
+ { "EmcAdrCfg1", token_emc_adr_cfg1, |
+ field_type_u32, NULL }, |
+ { "EmcAdrCfg", token_emc_adr_cfg, |
+ field_type_u32, NULL }, |
+ { "McEmemCfg", token_mc_emem_Cfg, |
+ field_type_u32, NULL }, |
+ { "McLowLatencyConfig", token_mc_lowlatency_config, |
+ field_type_u32, NULL }, |
+ { "EmcCfg2", token_emc_cfg2, |
+ field_type_u32, NULL }, |
+ { "EmcCfgDigDll", token_emc_cfg_dig_dll, |
+ field_type_u32, NULL }, |
+ { "EmcCfgClktrim0", token_emc_cfg_clktrim0, |
+ field_type_u32, NULL }, |
+ { "EmcCfgClktrim1", token_emc_cfg_clktrim1, |
+ field_type_u32, NULL }, |
+ { "EmcCfgClktrim2", token_emc_cfg_clktrim2, |
+ field_type_u32, NULL }, |
+ { "EmcCfg", token_emc_cfg, |
+ field_type_u32, NULL }, |
+ { "EmcDbg", token_emc_dbg, |
+ field_type_u32, NULL }, |
+ { "AhbArbitrationXbarCtrl", token_ahb_arbitration_xbar_ctrl, |
+ field_type_u32, NULL }, |
+ { "EmcDllXformDqs", token_emc_dll_xform_dqs, |
+ field_type_u32, NULL }, |
+ { "EmcDllXformQUse", token_emc_dll_xform_quse, |
+ field_type_u32, NULL }, |
+ { "WarmBootWait", token_warm_boot_wait, |
+ field_type_u32, NULL }, |
+ { "EmcCttTermCtrl", token_emc_ctt_term_ctrl, |
+ field_type_u32, NULL }, |
+ { "EmcOdtWrite", token_emc_odt_write, |
+ field_type_u32, NULL }, |
+ { "EmcOdtRead", token_emc_odt_read, |
+ field_type_u32, NULL }, |
+ { "EmcZcalRefCnt", token_emc_zcal_ref_cnt, |
+ field_type_u32, NULL }, |
+ { "EmcZcalWaitCnt", token_emc_zcal_wait_cnt, |
+ field_type_u32, NULL }, |
+ { "EmcZcalMrwCmd", token_emc_zcal_mrw_cmd, |
+ field_type_u32, NULL }, |
+ { "EmcMrwZqInitDev0", token_emc_mrw_zq_init_dev0, |
+ field_type_u32, NULL }, |
+ { "EmcMrwZqInitDev1", token_emc_mrw_zq_init_dev1, |
+ field_type_u32, NULL }, |
+ { "EmcMrwZqInitWait", token_emc_mrw_zq_init_wait, |
+ field_type_u32, NULL }, |
+ { "EmcDdr2Wait", token_emc_ddr2_wait, |
+ field_type_u32, NULL }, |
+ { "PmcDdrPwr", token_pmc_ddr_pwr, |
+ field_type_u32, NULL }, |
+ { "ApbMiscGpXm2CfgAPadCtrl", token_apb_misc_gp_xm2cfga_pad_ctrl, |
+ field_type_u32, NULL }, |
+ { "ApbMiscGpXm2CfgCPadCtrl2", token_apb_misc_gp_xm2cfgc_pad_ctrl2, |
+ field_type_u32, NULL }, |
+ { "ApbMiscGpXm2CfgCPadCtrl", token_apb_misc_gp_xm2cfgc_pad_ctrl, |
+ field_type_u32, NULL }, |
+ { "ApbMiscGpXm2CfgDPadCtrl2", token_apb_misc_gp_xm2cfgd_pad_ctrl2, |
+ field_type_u32, NULL }, |
+ { "ApbMiscGpXm2CfgDPadCtrl", token_apb_misc_gp_xm2cfgd_pad_ctrl, |
+ field_type_u32, NULL }, |
+ { "ApbMiscGpXm2ClkCfgPadCtrl", token_apb_misc_gp_xm2clkcfg_Pad_ctrl, |
+ field_type_u32, NULL }, |
+ { "ApbMiscGpXm2CompPadCtrl", token_apb_misc_gp_xm2comp_pad_ctrl, |
+ field_type_u32, NULL }, |
+ { "ApbMiscGpXm2VttGenPadCtrl", token_apb_misc_gp_xm2vttgen_pad_ctrl |
+ ,field_type_u32, NULL }, |
+ |
+ { NULL, 0, 0, NULL } |
+}; |
+ |
static field_item s_nand_table[] = |
{ |
{ "ClockDivider", token_clock_divider, field_type_u32, NULL }, |
@@ -200,6 +427,7 @@ static parse_item s_top_level_items[] = |
{ "PartitionSize=", token_partition_size, parse_value_u32 }, |
{ "DevType[", token_dev_type, parse_array }, |
{ "DeviceParam[", token_dev_param, parse_dev_param }, |
+ { "SDRAM[", token_sdram, parse_sdram_param }, |
{ "BootLoader=", token_bootloader, parse_bootloader }, |
{ "Redundancy=", token_redundancy, parse_value_u32 }, |
{ "Version=", token_version, parse_value_u32 }, |
@@ -696,6 +924,51 @@ parse_dev_param(build_image_context *context, parse_token token, char *rest) |
return 1; |
} |
+ |
+static int |
+parse_sdram_param(build_image_context *context, parse_token token, char *rest) |
+{ |
+ u_int32_t value; |
+ field_item *field; |
+ u_int32_t index; |
+ |
+ assert(context != NULL); |
+ assert(rest != NULL); |
+ |
+ /* Parse the index. */ |
+ rest = parse_u32(rest, &index); |
+ if (rest == NULL) |
+ return 1; |
+ |
+ /* Parse the closing bracket. */ |
+ if (*rest != ']') |
+ return 1; |
+ rest++; |
+ |
+ /* Parse the following '.' */ |
+ if (*rest != '.') |
+ return 1; |
+ rest++; |
+ |
+ /* Parse the field name. */ |
+ rest = parse_field_name(rest, s_sdram_field_table, &field); |
+ if (rest == NULL) |
+ return 1; |
+ |
+ /* Parse the equals sign.*/ |
+ if (*rest != '=') |
+ return 1; |
+ rest++; |
+ |
+ /* Parse the value based on the field table. */ |
+ rest = parse_field_value(context, rest, field, &value); |
+ if (rest == NULL) |
+ return 1; |
+ |
+ /* Store the result. */ |
+ return set_sdram_param(context, index, field->token, value); |
+ |
+} |
/* Return 0 on success, 1 on error */ |
static int |
process_statement(build_image_context *context, char *statement) |