diff options
Diffstat (limited to 'pk/ppe42/ppe42.h')
-rw-r--r-- | pk/ppe42/ppe42.h | 43 |
1 files changed, 39 insertions, 4 deletions
diff --git a/pk/ppe42/ppe42.h b/pk/ppe42/ppe42.h index affd7f51..91ef5bf4 100644 --- a/pk/ppe42/ppe42.h +++ b/pk/ppe42/ppe42.h @@ -29,10 +29,8 @@ #ifdef HWMACRO_GPE #include "gpe.h" -#elif defined(HWMACRO_SBE) -#include "sbe.h" -#elif defined(HWMACRO_CME) -#include "cme.h" +#elif defined(HWMACRO_STD) +#include "std.h" #elif defined(HWMACRO_PPE) #include "ppe.h" #else @@ -154,6 +152,8 @@ do {*(volatile uint32_t *)(addr) = (data);} while(0) #define in32(addr) \ ({uint32_t __data = *(volatile uint32_t *)(addr); __data;}) +#ifdef HWMACRO_GPE + /// 64-bit MMIO Write #define out64(addr, data) \ do { \ @@ -164,6 +164,24 @@ do {*(volatile uint32_t *)(addr) = (data);} while(0) *__addr_lo = (__data & 0xffffffff); \ } while(0) +#else /* standard PPE's require a 64 bit write */ + +/// 64-bit MMIO Write +#define out64(addr, data) \ +{\ + uint64_t __d = (data); \ + uint32_t* __a = (uint32_t*)(addr); \ + asm volatile \ + (\ + "stvd %1, %0 \n" \ + : "=o"(*__a) \ + : "r"(__d) \ + ); \ +} + +#endif /* HWMACRO_GPE */ + +#ifdef HWMACRO_GPE /// 64-bit MMIO Read #define in64(addr) \ ({ \ @@ -174,6 +192,23 @@ do {*(volatile uint32_t *)(addr) = (data);} while(0) __data = (__data << 32) | *__addr_lo; \ __data;}) +#else /* Standard PPE's require a 64 bit read */ + +#define in64(addr) \ +({\ + uint64_t __d; \ + uint32_t* __a = (uint32_t*)(addr); \ + asm volatile \ + (\ + "lvd %0, %1 \n" \ + :"=r"(__d) \ + :"o"(*__a) \ + ); \ + __d; \ +}) + +#endif /* HWMACRO_GPE */ + #endif /* __ASSEMBLER__ */ #include "ppe42_irq.h" |