Skip to content

Commit 0423541

Browse files
- Added some (not used) Cache-Tests
- Fixed WRAM to not data abort in DS mode
1 parent 4f91f09 commit 0423541

File tree

6 files changed

+584
-18
lines changed

6 files changed

+584
-18
lines changed

source/CP15.c

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,17 @@ uint32_t __attribute__((naked)) CP15_SetRegion6(uint32_t val)
170170
);
171171
}
172172

173+
uint32_t __attribute__((naked)) CP15_SetRegion3(uint32_t val)
174+
{
175+
asm(
176+
"mcr p15, 0, r0, c6, c3, 0 \n"
177+
"mrc p15, 0, r0, c6, c3, 0 \n"
178+
"bx lr \n"
179+
:
180+
:
181+
);
182+
}
183+
173184

174185
uint32_t CP15_ReadRegister(uint8_t num, uint8_t opcode)
175186
{
@@ -282,6 +293,28 @@ void EnableICache()
282293
);
283294
}
284295

296+
void EnableRoundRobinCache()
297+
{
298+
asm("mrc p15, 0, r0, c1, c0, 0 \n"
299+
"orr r0, r0, #0x4000 \n"
300+
"mcr p15, 0, r0, c1, c0, 0 \n"
301+
:
302+
:
303+
: "r0"
304+
);
305+
}
306+
307+
void DisableRoundRobinCache()
308+
{
309+
asm("mrc p15, 0, r0, c1, c0, 0 \n"
310+
"bic r0, r0, #0x4000 \n"
311+
"mcr p15, 0, r0, c1, c0, 0 \n"
312+
:
313+
:
314+
: "r0"
315+
);
316+
}
317+
285318
void EnableDCache()
286319
{
287320
asm("mrc p15, 0, r0, c1, c0, 0 \n"
@@ -370,3 +403,115 @@ inline uint32_t GetCacheDirtyStatus()
370403
);
371404
return val;
372405
}
406+
407+
408+
inline void WriteCacheDebugIndexRegister(uint32_t val)
409+
{
410+
asm(
411+
"mcr p15, 3, %0, c15, c0, 0 \n"
412+
:
413+
: "r" (val)
414+
:
415+
);
416+
}
417+
418+
inline uint32_t ReadCacheDebugIndexRegister()
419+
{
420+
uint32_t val = 0;
421+
asm(
422+
"mcr p15, 3, %0, c15, c0, 0 \n"
423+
: "=r" (val)
424+
:
425+
:
426+
);
427+
return val;
428+
}
429+
430+
inline void WriteInstructionCacheTagRegister(uint32_t val)
431+
{
432+
asm(
433+
"mcr p15, 3, %0, c15, c1, 0 \n"
434+
:
435+
: "r" (val)
436+
:
437+
);
438+
}
439+
440+
inline uint32_t ReadInstructionCacheTagRegister()
441+
{
442+
uint32_t val = 0;
443+
asm(
444+
"mrc p15, 3, %0, c15, c1, 0 \n"
445+
: "=r" (val)
446+
:
447+
:
448+
);
449+
return val;
450+
}
451+
452+
inline void WriteDataCacheTagRegister(uint32_t val)
453+
{
454+
asm(
455+
"mcr p15, 3, %0, c15, c2, 0 \n"
456+
:
457+
: "r" (val)
458+
:
459+
);
460+
}
461+
462+
inline uint32_t ReadDataCacheTagRegister()
463+
{
464+
uint32_t val = 0;
465+
asm(
466+
"eor %0, %0, %0 \n"
467+
"mrc p15, 3, %0, c15, c2, 0 \n"
468+
: "=r" (val)
469+
:
470+
:
471+
);
472+
return val;
473+
}
474+
475+
inline void WriteInstructionCacheRegister(uint32_t val)
476+
{
477+
asm(
478+
"mcr p15, 3, %0, c15, c3, 0 \n"
479+
:
480+
: "r" (val)
481+
:
482+
);
483+
}
484+
485+
inline uint32_t ReadInstructionCacheRegister()
486+
{
487+
uint32_t val = 0;
488+
asm(
489+
"mrc p15, 3, %0, c15, c3, 0 \n"
490+
: "=r" (val)
491+
:
492+
:
493+
);
494+
return val;
495+
}
496+
497+
inline void WriteDataCacheRegister(uint32_t val)
498+
{
499+
asm(
500+
"mcr p15, 3, %0, c15, c4, 0 \n"
501+
:
502+
: "r" (val)
503+
:
504+
);
505+
}
506+
507+
inline uint32_t ReadDataCacheRegister()
508+
{
509+
uint32_t val = 0;
510+
asm(
511+
"mrc p15, 3, %0, c15, c4, 0 \n"
512+
: "=r" (val)
513+
:
514+
:
515+
);
516+
return val;
517+
}

source/CP15.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,23 @@ uint32_t CP15_GetRegion6() ;
3838
uint32_t CP15_GetRegion7() ;
3939

4040
uint32_t CP15_SetRegion6(uint32_t val);
41+
uint32_t CP15_SetRegion3(uint32_t val);
4142
uint32_t GetCacheDirtyStatus();
4243

44+
void WriteCacheDebugIndexRegister(uint32_t val);
45+
uint32_t ReadCacheDebugIndexRegister();
46+
void WriteInstructionCacheTagRegister(uint32_t val);
47+
uint32_t ReadInstructionCacheTagRegister();
48+
void WriteDataCacheTagRegister(uint32_t val);
49+
uint32_t ReadDataCacheTagRegister();
50+
void WriteInstructionCacheRegister(uint32_t val);
51+
uint32_t ReadInstructionCacheRegister();
52+
void WriteDataCacheRegister(uint32_t val);
53+
uint32_t ReadDataCacheRegister();
54+
55+
void EnableRoundRobinCache();
56+
void DisableRoundRobinCache();
57+
4358
#ifdef __cplusplus
4459
}
4560
#endif

0 commit comments

Comments
 (0)