
Very Elegant Wolfgang - I like it ... I'll take a stab and I'll try not to tarnish it!
-M
Looking at the code it seems we have just a list of constants that need to get written all to the same mddrc.ddr_command register. To make this configurable, we should probably not try to add more such stuff, but separate code and data to simplify the design.
I think we should turn the existing code:
/* Initialize DDR */ for (i = 0; i < 10; i++) out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_NOP);
out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_PCHG_ALL); out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_NOP); out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_RFSH); out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_NOP); out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_RFSH); out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_NOP); out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_INIT_DEV_OP); out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_NOP); out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_EM2); out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_NOP); out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_PCHG_ALL); out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_EM2); out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_EM3); out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_EN_DLL); out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_INIT_DEV_OP); out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_PCHG_ALL); out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_RFSH); out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_INIT_DEV_OP); out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_OCD_DEFAULT); out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_PCHG_ALL); out_be32(&im->mddrc.ddr_command, CONFIG_SYS_MICRON_NOP);
into something like this:
u32 micron_table[] = { CONFIG_SYS_MICRON_NOP, CONFIG_SYS_MICRON_NOP, CONFIG_SYS_MICRON_NOP, CONFIG_SYS_MICRON_NOP, CONFIG_SYS_MICRON_NOP, CONFIG_SYS_MICRON_NOP, CONFIG_SYS_MICRON_NOP, CONFIG_SYS_MICRON_NOP, CONFIG_SYS_MICRON_NOP, CONFIG_SYS_MICRON_NOP,
CONFIG_SYS_MICRON_PCHG_ALL, CONFIG_SYS_MICRON_NOP, CONFIG_SYS_MICRON_RFSH, CONFIG_SYS_MICRON_NOP, CONFIG_SYS_MICRON_RFSH, CONFIG_SYS_MICRON_NOP, CONFIG_SYS_MICRON_INIT_DEV_OP, CONFIG_SYS_MICRON_NOP, CONFIG_SYS_MICRON_EM2, CONFIG_SYS_MICRON_NOP, CONFIG_SYS_MICRON_PCHG_ALL, CONFIG_SYS_MICRON_EM2, CONFIG_SYS_MICRON_EM3, CONFIG_SYS_MICRON_EN_DLL, CONFIG_SYS_MICRON_INIT_DEV_OP, CONFIG_SYS_MICRON_PCHG_ALL, CONFIG_SYS_MICRON_RFSH, CONFIG_SYS_MICRON_INIT_DEV_OP, CONFIG_SYS_MICRON_OCD_DEFAULT, CONFIG_SYS_MICRON_PCHG_ALL, CONFIG_SYS_MICRON_NOP, }; ...
long int fixed_sdram(u32 ram_table[], int table_size) { int i; ... for (i=0; i<table_size; ++i) out_be32(&im->mddrc.ddr_sys_config, ram_table[i]) ... }
The board specific code would then be changed from
fixed_sdram()
into for example
fixed_sdram(micron_table,sizeof(micron_table)/sizeof(u32))
In board/freescale/mpc5121ads/mpc5121ads.c, you could provide an additional set of data (elpida_table[]), and then pass either of these to fixed_sdram().
What do you think?
Best regards,
Wolfgang Denk
-- DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd@denx.de The optimum committee has no members. - Norman Augustine