utils.h: add writeread{8,16,32,64}

These functions all perform a store direcly followed by a load.
This is useful to e.g. useful to find busy bits which might
already be cleared a few cycles after a write.

Signed-off-by: Sven Peter <sven@svenpeter.dev>
This commit is contained in:
Sven Peter 2021-02-17 21:33:51 +01:00 committed by Hector Martin
parent 24938db17a
commit 1ccf2e2af5

View file

@ -56,6 +56,12 @@ static inline u64 mask64(u64 addr, u64 clear, u64 set)
return data;
}
static inline u64 writeread64(u64 addr, u64 data)
{
write64(addr, data);
return read64(addr);
}
static inline u32 read32(u64 addr)
{
u32 data;
@ -68,6 +74,12 @@ static inline void write32(u64 addr, u32 data)
__asm__ volatile("str\t%w0, [%1]" : : "r"(data), "r"(addr) : "memory");
}
static inline u32 writeread32(u64 addr, u32 data)
{
write32(addr, data);
return read32(addr);
}
static inline u32 set32(u64 addr, u32 set)
{
u32 data;
@ -156,6 +168,12 @@ static inline u16 mask16(u64 addr, u16 clear, u16 set)
return data;
}
static inline u16 writeread16(u64 addr, u16 data)
{
write16(addr, data);
return read16(addr);
}
static inline u8 read8(u64 addr)
{
u32 data;
@ -205,6 +223,12 @@ static inline u8 mask8(u64 addr, u8 clear, u8 set)
return data;
}
static inline u8 writeread8(u64 addr, u8 data)
{
write8(addr, data);
return read8(addr);
}
#define sys_reg(op0, op1, CRn, CRm, op2) s##op0##_##op1##_c##CRn##_c##CRm##_##op2
#define _mrs(reg) \