Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F111403375
D1812.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
4 KB
Referenced Files
None
Subscribers
None
D1812.diff
View Options
Index: sys/arm/arm/cpufunc.c
===================================================================
--- sys/arm/arm/cpufunc.c
+++ sys/arm/arm/cpufunc.c
@@ -837,6 +837,11 @@
defined(CPU_XSCALE_80219) || defined(CPU_XSCALE_81342) || \
defined(CPU_CORTEXA) || defined(CPU_KRAIT)
+/* Global cache line sizes, use 32 as default */
+int arm_dcache_min_line_size = 32;
+int arm_icache_min_line_size = 32;
+int arm_idcache_min_line_size = 32;
+
static void get_cachetype_cp15(void);
/* Additional cache information local to this file. Log2 of some of the
@@ -868,6 +873,13 @@
goto out;
if (CPU_CT_FORMAT(ctype) == CPU_CT_ARMV7) {
+
+ /* Resolve minimal cache line sizes */
+ arm_dcache_min_line_size = 1 << (CPU_CT_DMINLINE(ctype) + 2);
+ arm_icache_min_line_size = 1 << (CPU_CT_IMINLINE(ctype) + 2);
+ arm_idcache_min_line_size =
+ min(arm_icache_min_line_size, arm_dcache_min_line_size);
+
__asm __volatile("mrc p15, 1, %0, c0, c0, 1"
: "=r" (clevel));
arm_cache_level = clevel;
Index: sys/arm/arm/cpufunc_asm_armv7.S
===================================================================
--- sys/arm/arm/cpufunc_asm_armv7.S
+++ sys/arm/arm/cpufunc_asm_armv7.S
@@ -41,6 +41,12 @@
.word _C_LABEL(arm_cache_loc)
.Lcache_type:
.word _C_LABEL(arm_cache_type)
+.Larmv7_dcache_line_size:
+ .word _C_LABEL(arm_dcache_min_line_size)
+.Larmv7_icache_line_size:
+ .word _C_LABEL(arm_icache_min_line_size)
+.Larmv7_idcache_line_size:
+ .word _C_LABEL(arm_idcache_min_line_size)
.Lway_mask:
.word 0x3ff
.Lmax_index:
@@ -180,14 +186,9 @@
RET
END(armv7_idcache_wbinv_all)
-/* XXX Temporary set it to 32 for MV cores, however this value should be
- * get from Cache Type register
- */
-.Larmv7_line_size:
- .word 32
-
ENTRY(armv7_dcache_wb_range)
- ldr ip, .Larmv7_line_size
+ ldr ip, .Larmv7_dcache_line_size
+ ldr ip, [ip]
sub r3, ip, #1
and r2, r0, r3
add r1, r1, r2
@@ -202,7 +203,8 @@
END(armv7_dcache_wb_range)
ENTRY(armv7_dcache_wbinv_range)
- ldr ip, .Larmv7_line_size
+ ldr ip, .Larmv7_dcache_line_size
+ ldr ip, [ip]
sub r3, ip, #1
and r2, r0, r3
add r1, r1, r2
@@ -221,7 +223,8 @@
* must use wb-inv of the entire cache.
*/
ENTRY(armv7_dcache_inv_range)
- ldr ip, .Larmv7_line_size
+ ldr ip, .Larmv7_dcache_line_size
+ ldr ip, [ip]
sub r3, ip, #1
and r2, r0, r3
add r1, r1, r2
@@ -236,7 +239,8 @@
END(armv7_dcache_inv_range)
ENTRY(armv7_idcache_wbinv_range)
- ldr ip, .Larmv7_line_size
+ ldr ip, .Larmv7_idcache_line_size
+ ldr ip, [ip]
sub r3, ip, #1
and r2, r0, r3
add r1, r1, r2
@@ -264,7 +268,8 @@
END(armv7_icache_sync_all)
ENTRY_NP(armv7_icache_sync_range)
- ldr ip, .Larmv7_line_size
+ ldr ip, .Larmv7_icache_line_size
+ ldr ip, [ip]
.Larmv7_sync_next:
mcr CP15_ICIMVAU(r0)
mcr CP15_DCCMVAC(r0)
Index: sys/arm/arm/elf_trampoline.c
===================================================================
--- sys/arm/arm/elf_trampoline.c
+++ sys/arm/arm/elf_trampoline.c
@@ -115,6 +115,10 @@
int arm_dcache_align;
int arm_dcache_align_mask;
+int arm_dcache_min_line_size = 32;
+int arm_icache_min_line_size = 32;
+int arm_idcache_min_line_size = 32;
+
u_int arm_cache_level;
u_int arm_cache_type[14];
u_int arm_cache_loc;
@@ -277,6 +281,14 @@
goto out;
if (CPU_CT_FORMAT(ctype) == CPU_CT_ARMV7) {
+
+ /* Resolve minimal cache line sizes */
+ arm_dcache_min_line_size = 1 << (CPU_CT_DMINLINE(ctype) + 2);
+ arm_icache_min_line_size = 1 << (CPU_CT_IMINLINE(ctype) + 2);
+ arm_idcache_min_line_size =
+ (arm_dcache_min_line_size > arm_icache_min_line_size ?
+ arm_icache_min_line_size : arm_dcache_min_line_size);
+
__asm __volatile("mrc p15, 1, %0, c0, c0, 1"
: "=r" (clevel));
arm_cache_level = clevel;
Index: sys/arm/include/armreg.h
===================================================================
--- sys/arm/include/armreg.h
+++ sys/arm/include/armreg.h
@@ -323,6 +323,9 @@
#define CPU_CT_S (1U << 24) /* split cache */
#define CPU_CT_CTYPE(x) (((x) >> 25) & 0xf) /* cache type */
#define CPU_CT_FORMAT(x) ((x) >> 29)
+/* Cache type register definitions for ARM v7 */
+#define CPU_CT_IMINLINE(x) ((x) & 0xf) /* I$ min line size */
+#define CPU_CT_DMINLINE(x) (((x) >> 16) & 0xf) /* D$ min line size */
#define CPU_CT_CTYPE_WT 0 /* write-through */
#define CPU_CT_CTYPE_WB1 1 /* write-back, clean w/ read */
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Tue, Mar 4, 8:29 AM (16 h, 12 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
16966078
Default Alt Text
D1812.diff (4 KB)
Attached To
Mode
D1812: Resolve cache line size from CP15
Attached
Detach File
Event Timeline
Log In to Comment