Since we lack enough information to get parameters.
Signed-off-by: Luc Verhaegen <[email protected]>
---
meminfo.c | 283 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 283 insertions(+), 0 deletions(-)
diff --git a/meminfo.c b/meminfo.c
index e5daa77..b639746 100644
--- a/meminfo.c
+++ b/meminfo.c
@@ -173,6 +173,48 @@ sunxi_dram_clock_read(unsigned int *clock)
return 0;
}
+struct regs {
+ int offset;
+ char *name;
+};
+
+static int
+dram_registers_print(unsigned int address, int size, const struct regs *regs,
+ const char *description, const char *prefix)
+{
+ void *base;
+ int i, j;
+
+ base = mmap(NULL, size, PROT_READ, MAP_SHARED, devmem_fd, address);
+ if (base == MAP_FAILED) {
+ fprintf(stderr, "Failed to map %s registers: %s\n",
+ description, strerror(errno));
+ return errno;
+ }
+
+ printf("/*\n");
+ printf(" * %s Registers\n", description);
+ printf(" */\n");
+
+ for (i = 0; i < size; i += 4) {
+ unsigned int reg = sunxi_io_read(base, i);
+
+ for (j = 0; regs[j].name; j++)
+ if (i == regs[j].offset) {
+ printf("%s = 0x%08x;\n", regs[j].name, reg);
+ }
+
+ if (reg && !regs[j].name)
+ printf("%s_%03X = 0x%08x;\n", prefix, i, reg);
+ }
+
+ printf("\n");
+
+ munmap(base, size);
+
+ return 0;
+}
+
/*
* Read DRAM parameters.
*/
@@ -357,6 +399,245 @@ sun4i_dram_para_print(bool uboot)
return 0;
}
+/*
+ *
+ */
+#define SUN6I_IO_DRAMCOM_BASE 0x01C62000
+#define SUN6I_IO_DRAMCOM_SIZE 0x0300
+#define SUN6I_IO_DRAMCTL_BASE 0x01C63000
+#define SUN6I_IO_DRAMCTL_SIZE 0x0400
+#define SUN6I_IO_DRAMPHY_BASE 0x01C65000
+#define SUN6I_IO_DRAMPHY_SIZE 0x0400
+
+static struct regs
+sun6i_dramcom_regs[] = {
+ {0x00, "SDR_COM_CR"},
+ {0x04, "SDR_COM_CCR"},
+ {0x10, "SDR_COM_MFACR"},
+ {0x30, "SDR_COM_MSACR"},
+ {0x50, "SDR_COM_MBACR"},
+ {0, NULL}
+};
+
+static struct regs
+sun6i_dramctl_regs[] = {
+ {0x004, "SDR_SCTL"},
+ {0x008, "SDR_SSTAT"},
+ {0x040, "SDR_MCMD"},
+ {0x04c, "SDR_CMDSTAT"},
+ {0x050, "SDR_CMDSTATEN"},
+ {0x060, "SDR_MRRCFG0"},
+ {0x064, "SDR_MRRSTAT0"},
+ {0x068, "SDR_MRRSTAT1"},
+ {0x07c, "SDR_MCFG1"},
+ {0x080, "SDR_MCFG"},
+ {0x084, "SDR_PPCFG"},
+ {0x088, "SDR_MSTAT"},
+ {0x08c, "SDR_LP2ZQCFG"},
+ {0x094, "SDR_DTUSTAT"},
+ {0x098, "SDR_DTUNA"},
+ {0x09c, "SDR_DTUNE"},
+ {0x0a0, "SDR_DTUPRD0"},
+ {0x0a4, "SDR_DTUPRD1"},
+ {0x0a8, "SDR_DTUPRD2"},
+ {0x0ac, "SDR_DTUPRD3"},
+ {0x0b0, "SDR_DTUAWDT"},
+ {0x0c0, "SDR_TOGCNT1U"},
+ {0x0cc, "SDR_TOGCNT100N"},
+ {0x0d0, "SDR_TREFI"},
+ {0x0d4, "SDR_TMRD"},
+ {0x0d8, "SDR_TRFC"},
+ {0x0dc, "SDR_TRP"},
+ {0x0e0, "SDR_TRTW"},
+ {0x0e4, "SDR_TAL"},
+ {0x0e8, "SDR_TCL"},
+ {0x0ec, "SDR_TCWL"},
+ {0x0f0, "SDR_TRAS"},
+ {0x0f4, "SDR_TRC"},
+ {0x0f8, "SDR_TRCD"},
+ {0x0fc, "SDR_TRRD"},
+ {0x100, "SDR_TRTP"},
+ {0x104, "SDR_TWR"},
+ {0x108, "SDR_TWTR"},
+ {0x10c, "SDR_TEXSR"},
+ {0x110, "SDR_TXP"},
+ {0x114, "SDR_TXPDLL"},
+ {0x118, "SDR_TZQCS"},
+ {0x11c, "SDR_TZQCSI"},
+ {0x120, "SDR_TDQS"},
+ {0x124, "SDR_TCKSRE"},
+ {0x128, "SDR_TCKSRX"},
+ {0x12c, "SDR_TCKE"},
+ {0x130, "SDR_TMOD"},
+ {0x134, "SDR_TRSTL"},
+ {0x138, "SDR_TZQCL"},
+ {0x13c, "SDR_TMRR"},
+ {0x140, "SDR_TCKESR"},
+ {0x144, "SDR_TDPD"},
+ {0x200, "SDR_DTUWACTL"},
+ {0x204, "SDR_DTURACTL"},
+ {0x208, "SDR_DTUCFG"},
+ {0x20c, "SDR_DTUECTL"},
+ {0x210, "SDR_DTUWD0"},
+ {0x214, "SDR_DTUWD1"},
+ {0x218, "SDR_DTUWD2"},
+ {0x21c, "SDR_DTUWD3"},
+ {0x220, "SDR_DTUWDM"},
+ {0x224, "SDR_DTURD0"},
+ {0x224, "SDR_DTURD1"},
+ {0x22c, "SDR_DTURD2"},
+ {0x230, "SDR_DTURD3"},
+ {0x234, "SDR_DTULFSRWD"},
+ {0x238, "SDR_DTULFSRRD"},
+ {0x23c, "SDR_DTUEAF"},
+ {0x240, "SDR_DFITCTLDLY"},
+ {0x244, "SDR_DFIODTCFG"},
+ {0x248, "SDR_DFIODTCFG1"},
+ {0x24c, "SDR_DFIODTRMAP"},
+ {0x250, "SDR_DFITPHYWRD"},
+ {0x254, "SDR_DFITPHYWRL"},
+ {0x260, "SDR_DFITRDDEN"},
+ {0x264, "SDR_DFITPHYRDL"},
+ {0x270, "SDR_DFITPHYUPDTYPE0"},
+ {0x274, "SDR_DFITPHYUPDTYPE1"},
+ {0x278, "SDR_DFITPHYUPDTYPE2"},
+ {0x27c, "SDR_DFITPHYUPDTYPE3"},
+ {0x280, "SDR_DFITCTRLUPDMIN"},
+ {0x284, "SDR_DFITCTRLUPDMAX"},
+ {0x288, "SDR_DFITCTRLUPDDLY"},
+ {0x290, "SDR_DFIUPDCFG"},
+ {0x294, "SDR_DFITREFMSKI"},
+ {0x298, "SDR_DFITCRLUPDI"},
+ {0x2ac, "SDR_DFITRCFG0"},
+ {0x2b0, "SDR_DFITRSTAT0"},
+ {0x2b4, "SDR_DFITRWRLVLEN"},
+ {0x2b8, "SDR_DFITRRDLVLEN"},
+ {0x2bc, "SDR_DFITRRDLVLGATEEN"},
+ {0x2c4, "SDR_DFISTCFG0"},
+ {0x2c8, "SDR_DFISTCFG1"},
+ {0x2d0, "SDR_DFITDRAMCLKEN"},
+ {0x2d4, "SDR_DFITDRAMCLKDIS"},
+ {0x2f0, "SDR_DFILPCFG0"},
+ {0, NULL}
+};
+
+static struct regs
+sun6i_dramphy_regs[] = {
+ {0x004, "SDR_PIR"},
+ {0x008, "SDR_PGCR"},
+ {0x00c, "SDR_PGSR"},
+ {0x010, "SDR_DLLGCR"},
+ {0x014, "SDR_ACDLLCR"},
+ {0x018, "SDR_PTR0"},
+ {0x01c, "SDR_PTR1"},
+ {0x020, "SDR_PTR2"},
+ {0x024, "SDR_ACIOCR"},
+ {0x028, "SDR_DXCCR"},
+ {0x02c, "SDR_DSGCR"},
+ {0x030, "SDR_DCR"},
+ {0x034, "SDR_DTPR0"},
+ {0x038, "SDR_DTPR1"},
+ {0x03c, "SDR_DTPR2"},
+ {0x040, "SDR_MR0"},
+ {0x044, "SDR_MR1"},
+ {0x048, "SDR_MR2"},
+ {0x04c, "SDR_MR3"},
+ {0x050, "SDR_ODTCR"},
+ {0x054, "SDR_DTAR"},
+ {0x058, "SDR_DTDT0"},
+ {0x05c, "SDR_DTDT1"},
+ {0x0c0, "SDR_DCUAR"},
+ {0x0c4, "SDR_DCUDR"},
+ {0x0c8, "SDR_DCURR"},
+ {0x0cc, "SDR_DCULR"},
+ {0x0d0, "SDR_DCUGCR"},
+ {0x0d4, "SDR_DCUTPR"},
+ {0x0d8, "SDR_DCUSR0"},
+ {0x0dc, "SDR_DCUSR1"},
+ {0x100, "SDR_BISTRR"},
+ {0x104, "SDR_BISTMSKR0"},
+ {0x108, "SDR_BISTMSKR1"},
+ {0x10c, "SDR_BISTWCR"},
+ {0x110, "SDR_BISTLSR"},
+ {0x114, "SDR_BISTAR0"},
+ {0x118, "SDR_BISTAR1"},
+ {0x11c, "SDR_BISTAR2"},
+ {0x120, "SDR_BISTUDPR"},
+ {0x124, "SDR_BISTGSR"},
+ {0x128, "SDR_BISTWER"},
+ {0x12c, "SDR_BISTBER0"},
+ {0x130, "SDR_BISTBER1"},
+ {0x134, "SDR_BISTBER2"},
+ {0x138, "SDR_BISTWCSR"},
+ {0x13c, "SDR_BISTFWR0"},
+ {0x140, "SDR_BISTFWR1"},
+ {0x180, "SDR_ZQ0CR0"},
+ {0x184, "SDR_ZQ0CR1"},
+ {0x188, "SDR_ZQ0SR0"},
+ {0x18c, "SDR_ZQ0SR1"},
+ {0x1c0, "SDR_DX0GCR"},
+ {0x1c4, "SDR_DX0GSR0"},
+ {0x1c8, "SDR_DX0GSR1"},
+ {0x1cc, "SDR_DX0DLLCR"},
+ {0x1d0, "SDR_DX0DQTR"},
+ {0x1d4, "SDR_DX0DQSTR"},
+ {0x200, "SDR_DX1GCR"},
+ {0x204, "SDR_DX1GSR0"},
+ {0x208, "SDR_DX1GSR1"},
+ {0x20c, "SDR_DX1DLLCR"},
+ {0x210, "SDR_DX1DQTR"},
+ {0x214, "SDR_DX1DQSTR"},
+ {0x240, "SDR_DX2GCR"},
+ {0x244, "SDR_DX2GSR0"},
+ {0x248, "SDR_DX2GSR1"},
+ {0x24c, "SDR_DX2DLLCR"},
+ {0x250, "SDR_DX2DQTR"},
+ {0x254, "SDR_DX2DQSTR"},
+ {0x280, "SDR_DX3GCR"},
+ {0x284, "SDR_DX3GSR0"},
+ {0x288, "SDR_DX3GSR1"},
+ {0x28c, "SDR_DX3DLLCR"},
+ {0x290, "SDR_DX3DQTR"},
+ {0x294, "SDR_DX3DQSTR"},
+ {0, NULL}
+};
+
+static int
+sun6i_dram_regs_print(void)
+{
+ unsigned int clock;
+ int ret;
+
+ ret = sunxi_dram_clock_read(&clock);
+ if (ret)
+ return ret;
+
+ printf("DRAM Clock: %dMHz\n", clock);
+
+ ret = dram_registers_print(SUN6I_IO_DRAMCOM_BASE,
+ SUN6I_IO_DRAMCOM_SIZE,
+ &sun6i_dramcom_regs[0],
+ "DRAM COM", "SDR_COM");
+ if (ret)
+ return ret;
+
+ ret = dram_registers_print(SUN6I_IO_DRAMCTL_BASE,
+ SUN6I_IO_DRAMCTL_SIZE,
+ &sun6i_dramctl_regs[0],
+ "DRAM CTL", "SDR_CTL");
+ if (ret)
+ return ret;
+
+ ret = dram_registers_print(SUN6I_IO_DRAMPHY_BASE,
+ SUN6I_IO_DRAMPHY_SIZE,
+ &sun6i_dramphy_regs[0],
+ "DRAM PHY", "SDR_PHY");
+ if (ret)
+ return ret;
+
+ return 0;
+}
+
static void
print_usage(const char *name)
{
@@ -419,6 +700,8 @@ main(int argc, char *argv[])
case SUNXI_SOC_SUN5I:
case SUNXI_SOC_SUN7I:
return sun4i_dram_para_print(uboot);
+ case SUNXI_SOC_SUN6I:
+ return sun6i_dram_regs_print();
default:
fprintf(stderr, "Error: unknown or unhandled Soc: 0x%04X\n",
soc_version);
--
1.7.7
--
You received this message because you are subscribed to the Google Groups
"linux-sunxi" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.