2 * caches defined by arm v7 architecture
5 #include "../port/lib.h"
9 #include "../port/error.h"
16 static char *types[] = {
23 if (type >= nelem(types) || types[type] == nil)
28 static char *catype[] = {
40 cacheinfo(int level, Memcache *cp, int ext, int type)
44 memset(cp, 0, sizeof *cp);
50 if (level == 2) { /* external PL310 */
52 setsways = cp->setsways;
54 /* select internal cache level */
55 cpwrsc(CpIDcssel, CpID, CpIDid, 0, (level - 1) << 1);
57 setsways = cprdsc(CpIDcsize, CpID, CpIDid, 0);
59 cp->nways = ((setsways >> 3) & MASK(10)) + 1;
60 cp->nsets = ((setsways >> 13) & MASK(15)) + 1;
61 cp->log2linelen = (setsways & MASK(2)) + 2 + 2;
63 cp->linelen = 1 << cp->log2linelen;
64 cp->setsways = setsways;
65 cp->setsh = cp->log2linelen;
66 cp->waysh = 32 - log2(cp->nways);
70 allcacheinfo(Memcache *mc)
75 lvl = cprdsc(CpIDcsize, CpID, CpIDidct, CpIDclvlid);
77 for (lvl &= MASK(21); lvl; lvl >>= 3)
78 cacheinfo(n, &mc[n], Intcache, lvl & MASK(3));
79 // cacheinfo(2, &mc[2], Extcache, Unified); /* PL310 */
88 for (cache = 1; cache < 8 && cachel[cache].type; cache++) {
90 iprint("l%d: %s %-10s %2d ways %4d sets %d bytes/line; can W[",
91 mc->level, mc->external? "ext": "int", catype[mc->type],
92 mc->nways, mc->nsets, mc->linelen);
93 if (mc->linelen != CACHELINESZ)
94 iprint(" *should* be %d", CACHELINESZ);
95 if (mc->setsways & Cawt)
97 if (mc->setsways & Cawb)
99 if (mc->setsways & Cawa)
103 iprint("; l1-i %s", l1iptype((mc->l1ip >> 14) & MASK(2)));