Print this page
cpuid for ARMv7
@@ -28,13 +28,20 @@
extern "C" {
#endif
typedef struct arm_cpuid_cache {
boolean_t acc_exists;
- boolean_t acc_rcolor;
- uint8_t acc_assoc;
+ boolean_t acc_unified;
+ boolean_t acc_wt;
+ boolean_t acc_wb;
+ boolean_t acc_ra;
+ boolean_t acc_wa;
+ uint16_t acc_sets;
uint8_t acc_linesz;
+ uint16_t acc_assoc;
+
+ boolean_t acc_rcolor;
uint32_t acc_size;
} arm_cpuid_cache_t;
typedef struct arm_cpuid {
uint32_t ac_ident;
@@ -42,16 +49,24 @@
uint32_t ac_dfr;
uint32_t ac_mmfr[4];
uint32_t ac_isar[6];
uint32_t ac_fpident;
uint32_t ac_mvfr[2];
- boolean_t ac_unifiedl1;
- arm_cpuid_cache_t ac_icache;
- arm_cpuid_cache_t ac_dcache;
+ uint32_t ac_clidr;
+
+ /*
+ * ARM supports 7 levels of caches. Each level can have separate
+ * I/D caches or a unified cache. We keep track of all these as a
+ * two dimensional array. First, we select if we're dealing with a
+ * I cache (B_TRUE) or a D/unified cache (B_FALSE), and then we
+ * index on the level. Note that L1 caches are at index 0.
+ */
+ uint32_t ac_ccsidr[2][7];
+ arm_cpuid_cache_t ac_caches[2][7];
} arm_cpuid_t;
-extern uint32_t arm_cpuid_idreg();
+extern uint32_t arm_cpuid_midr();
extern uint32_t arm_cpuid_pfr0();
extern uint32_t arm_cpuid_pfr1();
extern uint32_t arm_cpuid_dfr0();
extern uint32_t arm_cpuid_mmfr0();
extern uint32_t arm_cpuid_mmfr1();
@@ -66,11 +81,12 @@
extern uint32_t arm_cpuid_vfpidreg();
extern uint32_t arm_cpuid_mvfr0();
extern uint32_t arm_cpuid_mvfr1();
-extern uint32_t arm_cpuid_ctr();
+extern uint32_t arm_cpuid_clidr();
+extern uint32_t arm_cpuid_ccsidr(uint32_t level, boolean_t icache);
#ifdef __cplusplus
}
#endif