From fe3e67afee7190e19db864fed1aac1a32c055c76 Mon Sep 17 00:00:00 2001 From: Cyril Jourdan Date: Tue, 21 Aug 2012 18:47:26 +0200 Subject: {cleo/uboot, common}: add IOMUX management, refs #2961 --- common/tools/genNVRAM/genNVRAM.c | 328 ++++++++++++++++++--------- common/tools/genNVRAM/nvram_mse500_simu.conf | 3 +- 2 files changed, 218 insertions(+), 113 deletions(-) (limited to 'common/tools') diff --git a/common/tools/genNVRAM/genNVRAM.c b/common/tools/genNVRAM/genNVRAM.c index ae9ca6cf31..0cf83ea806 100644 --- a/common/tools/genNVRAM/genNVRAM.c +++ b/common/tools/genNVRAM/genNVRAM.c @@ -212,6 +212,65 @@ static spidcom_nvram_t nvram = { /* Next free position in dynamic NVRAM data. */ static uint32_t *nvram_dynamic = nvram.dynamic; +static enum +{ + IO_NOINIT, + IO_GPIO, + IO_IOMUX, +} io = IO_NOINIT; + +/* + * IOMUX configurations: triplet of offset, value, mask, where offset is + * relative to IOMUX_BASE. + */ + +uint32_t iomux_config_bringup[] = +{ + 0x00000000, 0x0000, 0xFFFF, + 0x00000050, 0x1025, 0x1477, + 0x00000080, 0x0500, 0x0F00, + 0x00000084, 0x0002, 0x0002, + 0x0000003C, 0x0004, 0x0004, + 0x00000048, 0x000F, 0x000F, + (uint32_t)-1 +}; + +uint32_t iomux_config_bringup_uart_leon[] = +{ + 0x00000000, 0x0000, 0xFFFF, + 0x00000050, 0x1025, 0x1477, + 0x00000080, 0x0500, 0x0F00, + 0x00000084, 0x0002, 0x0002, + 0x0000003C, 0x0004, 0x0004, + 0x00000048, 0x0010, 0x0010, + (uint32_t)-1 +}; + +uint32_t iomux_config_bringup_dsu_uart_leon[] = +{ + 0x00000000, 0x0000, 0xFFFF, + 0x00000050, 0x1025, 0x1477, + 0x00000080, 0x0500, 0x0F00, + 0x00000084, 0x0002, 0x0002, + 0x0000003C, 0x0004, 0x0004, + 0x00000048, 0x0090, 0x0090, + (uint32_t)-1 +}; + +struct iomux_config_table_t +{ + char *name; + uint32_t *config; +}; + +static const struct iomux_config_table_t iomux_config_table[] = +{ + { "bringup", iomux_config_bringup }, + { "bringup_uart_leon", iomux_config_bringup_uart_leon }, + { "bringup_dsu_uart_leon", iomux_config_bringup_dsu_uart_leon }, + NULL +}; + static enum { DRAM_NOINIT, @@ -220,83 +279,83 @@ static enum } dram = DRAM_NOINIT; /* - * MIU configurations: pair of offset, value, where offset is relative to - * MIU_BASE. + * MIU configurations: triplet of offset, value, mask, where offset is + * relative to MIU_BASE. * There are special offsets that are interpreted by uboot as commands, * see nvram.h. */ uint32_t miu_config_sdram_dini_64m[] = { - 0x0004, 0x00000894, - 0x0008, 0x00000185, - 0x000c, 0x00000120, - 0x0020, 0x00000031, - 0x00b4, 0x00002000, - 0x003c, 0x00000c01, - 0x003c, 0x00000c08, - 0x0000, 0x00000008, - 0x0000, 0x0000000c, - 0x0000, 0x0000000e, - 0x0000, 0x0000000f, - NVRAM_MIU_WAIT_INIT_DONE_CODE_OP, 0, + 0x00000004, 0x0894, 0xFFFF, + 0x00000008, 0x0185, 0xFFFF, + 0x0000000c, 0x0120, 0xFFFF, + 0x00000020, 0x0031, 0xFFFF, + 0x000000b4, 0x2000, 0xFFFF, + 0x0000003c, 0x0c01, 0xFFFF, + 0x0000003c, 0x0c08, 0xFFFF, + 0x00000000, 0x0008, 0xFFFF, + 0x00000000, 0x000c, 0xFFFF, + 0x00000000, 0x000e, 0xFFFF, + 0x00000000, 0x000f, 0xFFFF, + NVRAM_MIU_WAIT_INIT_DONE_CODE_OP, 0, 0, (uint32_t)-1 }; uint32_t miu_config_mt47h32m16[] = { - 0x003c, 0x0c01, - 0x003c, 0x0c00, - 0x008c, 0xFFFE, - 0x0090, 0xFFFF, - 0x0094, 0xFFFF, - 0x0098, 0xFFFF, - 0x008c, 0xFFFE, - 0x10060, 0x8348, - 0x10064, 0x0014, - 0x10068, 0x0000, - 0x1006c, 0x0000, - 0x10040, 0x0000, - 0x10010, 0x70ff, - 0x100fc, 0x0000, - NVRAM_MIU_WAIT_CODE_OP, 500, - 0x0004, 0x0292, - 0x0008, 0x008b, - 0x000c, 0x1420, - 0x0010, 0x1066, - 0x0014, 0x1644, - 0x0018, 0x7465, - 0x001c, 0x204f, - 0x0020, 0x0a62, - 0x0024, 0x4004, - 0x0028, 0x8000, - 0x002c, 0xc000, - 0x10000, 0x0010, - 0x10070, 0x0033, - 0x10074, 0x0000, - 0x10004, 0x0000, - 0x10008, 0x0000, - 0x10078, 0x0200, - 0x1007c, 0x0022, - 0x1001c, 0x00a7, - 0x100dc, 0x0055, - 0x100d0, 0x004f, - 0x100d4, 0x004f, - 0x100a8, 0x0000, - 0x003c, 0x0c01, - 0x003c, 0x0c00, - 0x10000, 0x0000, - 0x10004, 0xaaaa, - NVRAM_MIU_WAIT_CODE_OP, 1, - 0x0000, 0x0000, - 0x0000, 0x0008, - 0x0000, 0x000c, - NVRAM_MIU_WAIT_CODE_OP, 200, - 0x0000, 0x000e, - NVRAM_MIU_WAIT_CODE_OP, 500, - 0x0000, 0x001f, - NVRAM_MIU_WAIT_INIT_DONE_CODE_OP, 0, - 0x008c, 0x0000, + 0x0000003c, 0x0c01, 0xFFFF, + 0x0000003c, 0x0c00, 0xFFFF, + 0x0000008c, 0xFFFE, 0xFFFF, + 0x00000090, 0xFFFF, 0xFFFF, + 0x00000094, 0xFFFF, 0xFFFF, + 0x00000098, 0xFFFF, 0xFFFF, + 0x0000008c, 0xFFFE, 0xFFFF, + 0x00010060, 0x8348, 0xFFFF, + 0x00010064, 0x0014, 0xFFFF, + 0x00010068, 0x0000, 0xFFFF, + 0x0001006c, 0x0000, 0xFFFF, + 0x00010040, 0x0000, 0xFFFF, + 0x00010010, 0x70ff, 0xFFFF, + 0x000100fc, 0x0000, 0xFFFF, + NVRAM_WAIT_CODE_OP, 500, 0, + 0x00000004, 0x0292, 0xFFFF, + 0x00000008, 0x008b, 0xFFFF, + 0x0000000c, 0x1420, 0xFFFF, + 0x00000010, 0x1066, 0xFFFF, + 0x00000014, 0x1644, 0xFFFF, + 0x00000018, 0x7465, 0xFFFF, + 0x0000001c, 0x204f, 0xFFFF, + 0x00000020, 0x0a62, 0xFFFF, + 0x00000024, 0x4004, 0xFFFF, + 0x00000028, 0x8000, 0xFFFF, + 0x0000002c, 0xc000, 0xFFFF, + 0x00010000, 0x0010, 0xFFFF, + 0x00010070, 0x0033, 0xFFFF, + 0x00010074, 0x0000, 0xFFFF, + 0x00010004, 0x0000, 0xFFFF, + 0x00010008, 0x0000, 0xFFFF, + 0x00010078, 0x0200, 0xFFFF, + 0x0001007c, 0x0022, 0xFFFF, + 0x0001001c, 0x00a7, 0xFFFF, + 0x000100dc, 0x0055, 0xFFFF, + 0x000100d0, 0x004f, 0xFFFF, + 0x000100d4, 0x004f, 0xFFFF, + 0x000100a8, 0x0000, 0xFFFF, + 0x0000003c, 0x0c01, 0xFFFF, + 0x0000003c, 0x0c00, 0xFFFF, + 0x00010000, 0x0000, 0xFFFF, + 0x00010004, 0xaaaa, 0xFFFF, + NVRAM_WAIT_CODE_OP, 1, 0, + 0x00000000, 0x0000, 0xFFFF, + 0x00000000, 0x0008, 0xFFFF, + 0x00000000, 0x000c, 0xFFFF, + NVRAM_WAIT_CODE_OP, 200, 0, + 0x00000000, 0x000e, 0xFFFF, + NVRAM_WAIT_CODE_OP, 500, 0, + 0x00000000, 0x001f, 0xFFFF, + NVRAM_MIU_WAIT_INIT_DONE_CODE_OP, 0, 0, + 0x0000008c, 0x0000, 0xFFFF, (uint32_t)-1 }; @@ -344,6 +403,7 @@ static void print_usage(const char *cmd) " [ --pkgcfg package number ] (300/500)\n" " [ --gpio07 GPIO 0 to 7 config ] (300/500)\n" " [ --gpio815 GPIO 8 to 15 config ] (300/500)\n" + " [ --iomux-config IOMUX config ] (500)\n" " [ --gpiodir GPIO allowed directions ] (300/500)\n" " [ --sconr SDRAM config register ] (300/500)\n" " [ --stmg0r SDRAM timing0 register ] (300/500)\n" @@ -495,16 +555,71 @@ static int parse_pkgcfg(char *arg) return 0; } +static int parse_gpio_check(void) +{ + if (io != IO_NOINIT && io != IO_GPIO) + { + fprintf (stderr, "Several IO muxing configuration detected\n"); + return -1; + } + else + { + io = IO_GPIO; + return 0; + } +} + static int parse_gpio07(char *arg) { nvram.io.spcpio.gpio_0_7_cfg = (uint32_t)strtoul(arg, NULL, 0); - return 0; + return parse_gpio_check(); } static int parse_gpio815(char *arg) { nvram.io.spcpio.gpio_8_15_cfg = (uint32_t)strtoul(arg, NULL, 0); - return 0; + return parse_gpio_check(); +} + +static void write_dynamic_config (uint16_t *config_offset, uint16_t *config_size, + uint32_t *config) +{ + *config_size = 0; + *config_offset = (uint32_t) ((uint8_t *) nvram_dynamic - (uint8_t *) &nvram); + /* Translate the configuration into NVRAM format, see nvram_dyn_cfg.S in + * u-boot. */ + for ( ; *config != (uint32_t) -1; config += 3) + { + assert (!(config[1] & ~0xffff)); + assert (!(config[2] & ~0xffff)); + *nvram_dynamic++ = config[0]; + *nvram_dynamic++ = (config[2] << 16) | config[1]; + *config_size += 2 * sizeof (uint32_t); + } +} + +static int parse_iomux_config(char *arg) +{ + if (io != IO_NOINIT) + { + fprintf (stderr, "Several IO muxing configuration detected\n"); + return -1; + } + io = IO_IOMUX; + /* Lookup the requested config. */ + const struct iomux_config_table_t *p; + for (p = iomux_config_table; p->name; p++) + { + if (strcmp(p->name, arg) == 0) + { + nvram.io.iomux.reserved = 0; + write_dynamic_config (&nvram.io.iomux.config_offset, + &nvram.io.iomux.config_size, + p->config); + return 0; + } + } + return -1; } static int parse_gpiodir(char *arg) @@ -571,23 +686,12 @@ static int parse_miu_config(char *arg) { if (strcmp(p->name, arg) == 0) { - int size = 0; - nvram.dram.miu.config_offset = - (uint32_t) (nvram_dynamic - (uint32_t *) &nvram); nvram.dram.miu.ram_size = p->ram_size; nvram.dram.miu.reserved[0] = 0; nvram.dram.miu.reserved[1] = 0; - uint32_t *config; - /* Translate the configuration into NVRAM format, see miu.S in - * u-boot. */ - for (config = p->config; *config != (uint32_t) -1; config += 2) - { - assert (!(config[0] & ~0x3fffc)); - assert (!(config[1] & ~0xffff)); - *nvram_dynamic++ = (config[0] >> 2 << 16) | config[1]; - size++; - } - nvram.dram.miu.config_size = size; + write_dynamic_config (&nvram.dram.miu.config_offset, + &nvram.dram.miu.config_size, + p->config); return 0; } } @@ -798,6 +902,7 @@ struct parser parse_table[] = { "pkgcfg", parse_pkgcfg, NVRAM_TYPE_SPC300 | NVRAM_TYPE_MSE500 }, { "gpio07", parse_gpio07, NVRAM_TYPE_SPC300 | NVRAM_TYPE_MSE500 }, { "gpio815", parse_gpio815, NVRAM_TYPE_SPC300 | NVRAM_TYPE_MSE500 }, + { "iomux_config", parse_iomux_config, NVRAM_TYPE_MSE500 }, { "gpiodir", parse_gpiodir, NVRAM_TYPE_SPC300 | NVRAM_TYPE_MSE500 }, { "sconr", parse_sdramcfg, NVRAM_TYPE_SPC300 | NVRAM_TYPE_MSE500 }, { "stmg0r", parse_sdramtmg0, NVRAM_TYPE_SPC300 | NVRAM_TYPE_MSE500 }, @@ -887,35 +992,36 @@ int main(int argc, char **argv) { "pkgcfg", required_argument, NULL, 3 }, { "gpio07", required_argument, NULL, 4 }, { "gpio815", required_argument, NULL, 5 }, - { "gpiodir", required_argument, NULL, 6 }, - { "sconr", required_argument, NULL, 7 }, - { "stmg0r", required_argument, NULL, 8 }, - { "stmg1r", required_argument, NULL, 9 }, - { "srefr", required_argument, NULL, 10 }, - { "ssize", required_argument, NULL, 11 }, - { "miu-config", required_argument, NULL, 12 }, - { "forg", required_argument, NULL, 13 }, - { "img0off", required_argument, NULL, 14 }, - { "img1off", required_argument, NULL, 15 }, - { "nbimg", required_argument, NULL, 16 }, - { "name", required_argument, NULL, 17 }, - { "partnb", required_argument, NULL, 18 }, - { "desc", required_argument, NULL, 19 }, - { "serial", required_argument, NULL, 20 }, - { "phy", required_argument, NULL, 21 }, - { "ethernet", required_argument, NULL, 22 }, - { "plc", required_argument, NULL, 23 }, - { "dpw", required_argument, NULL, 24 }, - { "oem", required_argument, NULL, 25 }, - { "tonemask", required_argument, NULL, 26 }, - { "factory", required_argument, NULL, 27 }, - { "portnb", required_argument, NULL, 28 }, - { "imgmaxsize", required_argument, NULL, 29 }, - { "cpupartnb", required_argument, NULL, 30 }, - { "brdnb", required_argument, NULL, 31 }, - { "brddesc", required_argument, NULL, 32 }, - { "brdid", required_argument, NULL, 33 }, - { "afetype", required_argument, NULL, 34 }, + { "iomux-config", required_argument, NULL, 6 }, + { "gpiodir", required_argument, NULL, 7 }, + { "sconr", required_argument, NULL, 8 }, + { "stmg0r", required_argument, NULL, 9 }, + { "stmg1r", required_argument, NULL, 10 }, + { "srefr", required_argument, NULL, 11 }, + { "ssize", required_argument, NULL, 12 }, + { "miu-config", required_argument, NULL, 13 }, + { "forg", required_argument, NULL, 14 }, + { "img0off", required_argument, NULL, 15 }, + { "img1off", required_argument, NULL, 16 }, + { "nbimg", required_argument, NULL, 17 }, + { "name", required_argument, NULL, 18 }, + { "partnb", required_argument, NULL, 19 }, + { "desc", required_argument, NULL, 20 }, + { "serial", required_argument, NULL, 21 }, + { "phy", required_argument, NULL, 22 }, + { "ethernet", required_argument, NULL, 23 }, + { "plc", required_argument, NULL, 24 }, + { "dpw", required_argument, NULL, 25 }, + { "oem", required_argument, NULL, 26 }, + { "tonemask", required_argument, NULL, 27 }, + { "factory", required_argument, NULL, 28 }, + { "portnb", required_argument, NULL, 29 }, + { "imgmaxsize", required_argument, NULL, 30 }, + { "cpupartnb", required_argument, NULL, 31 }, + { "brdnb", required_argument, NULL, 32 }, + { "brddesc", required_argument, NULL, 33 }, + { "brdid", required_argument, NULL, 34 }, + { "afetype", required_argument, NULL, 35 }, { 0, 0, 0, 0 } }; diff --git a/common/tools/genNVRAM/nvram_mse500_simu.conf b/common/tools/genNVRAM/nvram_mse500_simu.conf index f726e70088..3f03e42943 100644 --- a/common/tools/genNVRAM/nvram_mse500_simu.conf +++ b/common/tools/genNVRAM/nvram_mse500_simu.conf @@ -1,6 +1,5 @@ pkgcfg=0x0000300f -gpio07=0x00000000 -gpio815=0x00000000 +iomux_config = bringup gpiodir=0xffffffff miu_config = mt47h32m16 forg=0x00000006 -- cgit v1.2.3