summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPhilipp Zabel <p.zabel@pengutronix.de>2019-01-07 17:43:21 +0100
committerPhilipp Zabel <p.zabel@pengutronix.de>2019-01-07 17:51:50 +0100
commit48f81f034eacdbdcd1ce18f6affaec9778492dee (patch)
tree2eb79f08057ddc3087a0fa71fda95631e94325e4
parent4474c0c3aac856dfa789bb1f2a9ec3f3ba2f14ec (diff)
downloadimx6_ddrstat-48f81f034eacdbdcd1ce18f6affaec9778492dee.tar.gz
imx6_ddrstat-48f81f034eacdbdcd1ce18f6affaec9778492dee.tar.xz
Add NoC scheduler support for i.MX6QuadPlusHEADmaster
Signed-off-by: Philipp Zabel <p.zabel@pengutronix.de>
-rw-r--r--imx6_ddrstat.c33
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 (;;) {