mirror of
https://github.com/gnuton/asuswrt-merlin.ng.git
synced 2025-05-19 16:02:36 +02:00
67 lines
2.7 KiB
C
67 lines
2.7 KiB
C
#ifndef _BCM_PREFETCH_H
|
|
#define _BCM_PREFETCH_H
|
|
|
|
#if (defined(CONFIG_BCM963138) || defined(CONFIG_BCM963148) || defined(CONFIG_BCM96846) || defined(CONFIG_BCM947189) || defined(CONFIG_BCM963178) || defined(CONFIG_BCM947622) || defined(CONFIG_BCM96878) || defined(CONFIG_BCM96855))
|
|
static inline void _bcm_prefetch(const void * addr)
|
|
{
|
|
__asm__ __volatile__("pld\t%a0" : : "p"(addr) : "cc");
|
|
}
|
|
static inline void bcm_prefetch_ld(const void * addr) { _bcm_prefetch(addr); }
|
|
static inline void bcm_prefetch_st(const void * addr) { _bcm_prefetch(addr); }
|
|
static inline void bcm_prefetch(const void * addr) { _bcm_prefetch(addr); }
|
|
static inline void bcm_prefetch_multiple(const void * addr, const int cachelines)
|
|
{
|
|
switch (cachelines) {
|
|
default:
|
|
case 4:
|
|
__asm__ __volatile__("pld\t%a0" : : "p"(addr + (L1_CACHE_BYTES * 3)) : "cc");
|
|
case 3:
|
|
__asm__ __volatile__("pld\t%a0" : : "p"(addr + (L1_CACHE_BYTES * 2)) : "cc");
|
|
case 2:
|
|
__asm__ __volatile__("pld\t%a0" : : "p"(addr + (L1_CACHE_BYTES * 1)) : "cc");
|
|
case 1:
|
|
__asm__ __volatile__("pld\t%a0" : : "p"(addr + (L1_CACHE_BYTES * 0)) : "cc");
|
|
}
|
|
return;
|
|
}
|
|
#elif (defined(CONFIG_BCM94908) || defined(CONFIG_BCM963158) || defined(CONFIG_BCM96858) || defined(CONFIG_BCM96856))
|
|
static inline void bcm_prefetch_ld(const void * addr)
|
|
{
|
|
__asm__ __volatile__("prfm pldl1keep, %a0" : : "p"(addr) : "cc");
|
|
}
|
|
static inline void bcm_prefetch_st(const void * addr)
|
|
{
|
|
__asm__ __volatile__("prfm pstl1keep, %a0" : : "p"(addr) : "cc");
|
|
}
|
|
static inline void bcm_prefetch(const void * addr) { bcm_prefetch_ld(addr); }
|
|
static inline void bcm_prefetch_multiple(const void * addr, const int cachelines)
|
|
{
|
|
switch (cachelines) {
|
|
default:
|
|
case 4:
|
|
__asm__ __volatile__("prfm pldl1keep, %a0" : : "p"(addr + (L1_CACHE_BYTES * 3)) : "cc");
|
|
case 3:
|
|
__asm__ __volatile__("prfm pldl1keep, %a0" : : "p"(addr + (L1_CACHE_BYTES * 2)) : "cc");
|
|
case 2:
|
|
__asm__ __volatile__("prfm pldl1keep, %a0" : : "p"(addr + (L1_CACHE_BYTES * 1)) : "cc");
|
|
case 1:
|
|
__asm__ __volatile__("prfm pldl1keep, %a0" : : "p"(addr + (L1_CACHE_BYTES * 0)) : "cc");
|
|
}
|
|
return;
|
|
}
|
|
|
|
#elif defined(CONFIG_MIPS_BCM963XX)
|
|
static inline void _bcm_prefetch(const void * addr)
|
|
{
|
|
__asm__ __volatile__("pref %0, (%1)" :: "i"(0), "r"(addr));
|
|
}
|
|
static inline void bcm_prefetch_ld(const void * addr) { _bcm_prefetch(addr); }
|
|
static inline void bcm_prefetch_st(const void * addr) { _bcm_prefetch(addr); }
|
|
static inline void bcm_prefetch(const void * addr) { _bcm_prefetch(addr); }
|
|
#else
|
|
static inline void bcm_prefetch_ld(const void * addr) { }
|
|
static inline void bcm_prefetch_st(const void * addr) { }
|
|
static inline void bcm_prefetch(const void * addr) { }
|
|
static inline void bcm_prefetch_multiple(const void * addr, const int cachelines) { }
|
|
#endif
|
|
#endif /* _BCM_PREFETCH_H */
|