diff options
-rw-r--r-- | imx6_ddrstat.c | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/imx6_ddrstat.c b/imx6_ddrstat.c index f2f700e..8f4c8a4 100644 --- a/imx6_ddrstat.c +++ b/imx6_ddrstat.c @@ -47,10 +47,11 @@ #define MMDC_MADPSR4 0x0428 /* total read bytes */ #define MMDC_MADPSR5 0x042c /* total write bytes */ -#define MADPCR0_DBG_EN (1 << 0) -#define MADPCR0_DBG_RST (1 << 1) -#define MADPCR0_PRF_FRZ (1 << 2) -#define MADPCR0_CYC_OVF (1 << 3) +#define MADPCR0_DBG_EN (1 << 0) +#define MADPCR0_DBG_RST (1 << 1) +#define MADPCR0_PRF_FRZ (1 << 2) +#define MADPCR0_CYC_OVF (1 << 3) +#define MADPCR0_PROFILE_SEL (1 << 4) #define MADPCR1_PRF_AXI_ID_SHIFT 0 /* profiling AXI ID */ #define MADPCR1_PRF_AXI_ID_MASK_SHIFT 16 /* profiling AXI ID mask */ @@ -83,20 +84,21 @@ static unsigned short axi_id; static unsigned short axi_id_mask; static bool pretty; -static void *mmdc_init(int fd, unsigned base) +static void *mmdc_init(int fd, unsigned base, bool noc) { void *mem = mmap(NULL, PAGE_SIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, base); volatile uint32_t *mmdc = mem; + int noc_sel = noc ? MADPCR0_PROFILE_SEL : 0; if (mem == MAP_FAILED) return NULL; - mmdc[MMDC_MADPCR0 >> 2] = 0; + mmdc[MMDC_MADPCR0 >> 2] = noc_sel; /* assert DBG_RST, write 1 to clear CYC_OVF */ - mmdc[MMDC_MADPCR0 >> 2] = MADPCR0_DBG_RST | MADPCR0_CYC_OVF; + mmdc[MMDC_MADPCR0 >> 2] = noc_sel | MADPCR0_DBG_RST | MADPCR0_CYC_OVF; /* deassert DBG_RST, enable DBG_EN and set PRF_FRZ */ - mmdc[MMDC_MADPCR0 >> 2] = MADPCR0_DBG_EN | MADPCR0_PRF_FRZ; + mmdc[MMDC_MADPCR0 >> 2] = noc_sel | MADPCR0_DBG_EN | MADPCR0_PRF_FRZ; mmdc[MMDC_MADPCR1 >> 2] = (axi_id_mask << MADPCR1_PRF_AXI_ID_MASK_SHIFT) | (axi_id << MADPCR1_PRF_AXI_ID_SHIFT); @@ -156,7 +158,7 @@ static void mmdc_print(const char *tag, struct mmdc_stats *st) st->write_accesses, st->write_bytes); } -static int perf_init(void) +static int perf_init(bool noc) { int fd = open("/dev/mem", O_RDWR); int err = 0; @@ -164,8 +166,8 @@ static int perf_init(void) if (fd == -1) return -1; - mmdc0 = mmdc_init(fd, MMDC0_BASE); - mmdc1 = mmdc_init(fd, MMDC1_BASE); + mmdc0 = mmdc_init(fd, MMDC0_BASE, noc); + mmdc1 = mmdc_init(fd, MMDC1_BASE, noc); if (!mmdc0 || !mmdc1) err = -1; @@ -380,13 +382,16 @@ bool of_machine_is_compatible(const char *compatible) int main(int argc, char **argv) { static struct axi_filter *filters; + bool noc = false; int delay = 1; char *endp; - if (of_machine_is_compatible("fsl,imx6qp")) + if (of_machine_is_compatible("fsl,imx6qp")) { filters = filters_quadplus; - else + noc = true; + } else { filters = filters_quad; + } if (argc > 1 && strcmp(argv[1], "--help") == 0) { struct axi_filter *filter; @@ -419,7 +424,7 @@ int main(int argc, char **argv) delay = 1; printf("interval %d s\n", delay); - if (perf_init()) + if (perf_init(noc)) return 1; for (;;) { |