|
|
|
@ -93,65 +93,61 @@ extern void blackfin_dcache_flush_invalidate_range(const void *, const void *); |
|
|
|
|
# define NOP_PAD_ANOMALY_05000198 |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#define bfin_read8(addr) ({ \ |
|
|
|
|
uint8_t __v; \
|
|
|
|
|
#define _bfin_readX(addr, size, asm_size, asm_ext) ({ \ |
|
|
|
|
u32 __v; \
|
|
|
|
|
__asm__ __volatile__( \
|
|
|
|
|
NOP_PAD_ANOMALY_05000198 \
|
|
|
|
|
"%0 = b[%1] (z);" \
|
|
|
|
|
"%0 = " #asm_size "[%1]" #asm_ext ";" \
|
|
|
|
|
: "=d" (__v) \
|
|
|
|
|
: "a" (addr) \
|
|
|
|
|
); \
|
|
|
|
|
__v; }) |
|
|
|
|
|
|
|
|
|
#define bfin_read16(addr) ({ \ |
|
|
|
|
uint16_t __v; \
|
|
|
|
|
__asm__ __volatile__( \
|
|
|
|
|
NOP_PAD_ANOMALY_05000198 \
|
|
|
|
|
"%0 = w[%1] (z);" \
|
|
|
|
|
: "=d" (__v) \
|
|
|
|
|
: "a" (addr) \
|
|
|
|
|
); \
|
|
|
|
|
__v; }) |
|
|
|
|
|
|
|
|
|
#define bfin_read32(addr) ({ \ |
|
|
|
|
uint32_t __v; \
|
|
|
|
|
#define _bfin_writeX(addr, val, size, asm_size) \ |
|
|
|
|
__asm__ __volatile__( \
|
|
|
|
|
NOP_PAD_ANOMALY_05000198 \
|
|
|
|
|
"%0 = [%1];" \
|
|
|
|
|
: "=d" (__v) \
|
|
|
|
|
: "a" (addr) \
|
|
|
|
|
); \
|
|
|
|
|
__v; }) |
|
|
|
|
|
|
|
|
|
#define bfin_readPTR(addr) bfin_read32(addr) |
|
|
|
|
|
|
|
|
|
#define bfin_write8(addr, val) \ |
|
|
|
|
__asm__ __volatile__( \
|
|
|
|
|
NOP_PAD_ANOMALY_05000198 \
|
|
|
|
|
"b[%0] = %1;" \
|
|
|
|
|
: \
|
|
|
|
|
: "a" (addr), "d" (val) \
|
|
|
|
|
: "memory" \
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
#define bfin_write16(addr, val) \ |
|
|
|
|
__asm__ __volatile__( \
|
|
|
|
|
NOP_PAD_ANOMALY_05000198 \
|
|
|
|
|
"w[%0] = %1;" \
|
|
|
|
|
#asm_size "[%0] = %1;" \ |
|
|
|
|
: \
|
|
|
|
|
: "a" (addr), "d" (val) \
|
|
|
|
|
: "a" (addr), "d" ((u##size)(val)) \
|
|
|
|
|
: "memory" \
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
#define bfin_write32(addr, val) \ |
|
|
|
|
__asm__ __volatile__( \
|
|
|
|
|
NOP_PAD_ANOMALY_05000198 \
|
|
|
|
|
"[%0] = %1;" \
|
|
|
|
|
: \
|
|
|
|
|
: "a" (addr), "d" (val) \
|
|
|
|
|
: "memory" \
|
|
|
|
|
) |
|
|
|
|
#define bfin_read8(addr) _bfin_readX(addr, 8, b, (z)) |
|
|
|
|
#define bfin_read16(addr) _bfin_readX(addr, 16, w, (z)) |
|
|
|
|
#define bfin_read32(addr) _bfin_readX(addr, 32, , ) |
|
|
|
|
#define bfin_write8(addr, val) _bfin_writeX(addr, val, 8, b) |
|
|
|
|
#define bfin_write16(addr, val) _bfin_writeX(addr, val, 16, w) |
|
|
|
|
#define bfin_write32(addr, val) _bfin_writeX(addr, val, 32, ) |
|
|
|
|
|
|
|
|
|
#define bfin_read(addr) \ |
|
|
|
|
({ \
|
|
|
|
|
sizeof(*(addr)) == 1 ? bfin_read8(addr) : \
|
|
|
|
|
sizeof(*(addr)) == 2 ? bfin_read16(addr) : \
|
|
|
|
|
sizeof(*(addr)) == 4 ? bfin_read32(addr) : \
|
|
|
|
|
({ BUG(); 0; }); \
|
|
|
|
|
}) |
|
|
|
|
#define bfin_write(addr, val) \ |
|
|
|
|
do { \
|
|
|
|
|
switch (sizeof(*(addr))) { \
|
|
|
|
|
case 1: bfin_write8(addr, val); break; \
|
|
|
|
|
case 2: bfin_write16(addr, val); break; \
|
|
|
|
|
case 4: bfin_write32(addr, val); break; \
|
|
|
|
|
default: BUG(); \
|
|
|
|
|
} \
|
|
|
|
|
} while (0) |
|
|
|
|
|
|
|
|
|
#define bfin_write_or(addr, bits) \ |
|
|
|
|
do { \
|
|
|
|
|
typeof(addr) __addr = (addr); \
|
|
|
|
|
bfin_write(__addr, bfin_read(__addr) | (bits)); \
|
|
|
|
|
} while (0) |
|
|
|
|
|
|
|
|
|
#define bfin_write_and(addr, bits) \ |
|
|
|
|
do { \
|
|
|
|
|
typeof(addr) __addr = (addr); \
|
|
|
|
|
bfin_write(__addr, bfin_read(__addr) & (bits)); \
|
|
|
|
|
} while (0) |
|
|
|
|
|
|
|
|
|
#define bfin_readPTR(addr) bfin_read32(addr) |
|
|
|
|
#define bfin_writePTR(addr, val) bfin_write32(addr, val) |
|
|
|
|
|
|
|
|
|
/* SSYNC implementation for C file */ |
|
|
|
|