boot/arm: use std::atomic<> to access bcm2708 mailbox
Signed-off-by: Paweł Dziepak <[email protected]>
This commit is contained in:
@@ -8,6 +8,7 @@
|
|||||||
* Alexander von Gluck IV, [email protected]
|
* Alexander von Gluck IV, [email protected]
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <atomic>
|
||||||
|
|
||||||
#include "arch_mailbox.h"
|
#include "arch_mailbox.h"
|
||||||
|
|
||||||
@@ -26,6 +27,7 @@ virtual status_t Write(uint8 channel, uint32 value);
|
|||||||
virtual status_t Read(uint8 channel, uint32& value);
|
virtual status_t Read(uint8 channel, uint32& value);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
auto& GetRegister(unsigned reg);
|
||||||
void RegisterWrite(addr_t reg, uint32 value);
|
void RegisterWrite(addr_t reg, uint32 value);
|
||||||
uint32 RegisterRead(addr_t reg);
|
uint32 RegisterRead(addr_t reg);
|
||||||
};
|
};
|
||||||
@@ -73,18 +75,22 @@ ArchMailboxArmBCM2708::Read(uint8 channel, uint32& value)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
uint32
|
inline auto&
|
||||||
|
ArchMailboxArmBCM2708::GetRegister(unsigned reg)
|
||||||
|
{
|
||||||
|
auto addr = fBase + ARM_CTRL_0_MAILBOX_BASE + reg;
|
||||||
|
return *reinterpret_cast<std::atomic<uint32_t>*>(addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline uint32
|
||||||
ArchMailboxArmBCM2708::RegisterRead(addr_t reg)
|
ArchMailboxArmBCM2708::RegisterRead(addr_t reg)
|
||||||
{
|
{
|
||||||
uint32 result = *(volatile uint32*)(fBase + ARM_CTRL_0_MAILBOX_BASE + reg);
|
return GetRegister(reg).load(std::memory_order_acquire);
|
||||||
arch_cpu_memory_read_barrier();
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
inline void
|
||||||
ArchMailboxArmBCM2708::RegisterWrite(addr_t reg, uint32 value)
|
ArchMailboxArmBCM2708::RegisterWrite(addr_t reg, uint32 value)
|
||||||
{
|
{
|
||||||
arch_cpu_memory_write_barrier();
|
GetRegister(reg).store(value, std::memory_order_release);
|
||||||
*(volatile uint32*)(fBase + ARM_CTRL_0_MAILBOX_BASE + reg) = value;
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user