26static void mmio_region_memcpy32(
mmio_region_t base, uint32_t offset,
27 uint8_t *buf,
size_t len,
bool from_mmio) {
34 ptrdiff_t misalignment = misalignment32_of(offset);
35 if (misalignment != 0) {
38 size_t realignment =
sizeof(uint32_t) -
OT_UNSIGNED(misalignment);
42 if (realignment > len) {
48 ptrdiff_t current_word_offset =
OT_SIGNED(offset) - misalignment;
49 uint32_t current_word = mmio_region_read32(base, current_word_offset);
53 uint8_t *current_byte = ((uint8_t *)¤t_word) + misalignment;
55 memcpy(buf, current_byte, realignment);
58 memcpy(current_byte, buf, realignment);
59 mmio_region_write32(base, current_word_offset, current_word);
62 offset += realignment;
72 uint32_t bytes_to_copy =
sizeof(uint32_t);
73 if (bytes_to_copy > len) {
78 uint32_t current_word = 0;
79 if (from_mmio || bytes_to_copy !=
sizeof(uint32_t)) {
84 current_word = mmio_region_read32(base,
OT_SIGNED(offset));
89 memcpy(buf, ¤t_word, bytes_to_copy);
92 memcpy(¤t_word, buf, bytes_to_copy);
93 mmio_region_write32(base,
OT_SIGNED(offset), current_word);
96 offset += bytes_to_copy;
103 void *dest,
size_t len) {
104 mmio_region_memcpy32(base, offset, dest, len,
true);
108 const void *src,
size_t len) {
112 mmio_region_memcpy32(base, offset, (
void *)src, len,
false);
117extern mmio_region_t mmio_region_from_addr(uintptr_t address);
118extern uint8_t mmio_region_read8(
mmio_region_t base, ptrdiff_t offset);
119extern uint32_t mmio_region_read32(
mmio_region_t base, ptrdiff_t offset);
120extern void mmio_region_write8(
mmio_region_t base, ptrdiff_t offset,
122extern void mmio_region_write32(
mmio_region_t base, ptrdiff_t offset,
124extern void mmio_region_write8_shadowed(
mmio_region_t base, ptrdiff_t offset,
126extern void mmio_region_write32_shadowed(
mmio_region_t base, ptrdiff_t offset,
128extern uint32_t mmio_region_read_mask32(
mmio_region_t base, ptrdiff_t offset,
129 uint32_t mask, uint32_t mask_index);
130extern bool mmio_region_get_bit32(
mmio_region_t base, ptrdiff_t offset,
132extern void mmio_region_nonatomic_clear_mask32(
mmio_region_t base,
133 ptrdiff_t offset, uint32_t mask,
134 uint32_t mask_index);
135extern void mmio_region_nonatomic_set_mask32(
mmio_region_t base,
136 ptrdiff_t offset, uint32_t mask,
137 uint32_t mask_index);
138extern void mmio_region_write_only_set_mask32(
mmio_region_t base,
139 ptrdiff_t offset, uint32_t mask,
140 uint32_t mask_index);
141extern void mmio_region_nonatomic_set_field32(
mmio_region_t base,
145extern void mmio_region_write_only_set_field32(
mmio_region_t base,
149extern void mmio_region_nonatomic_clear_bit32(
mmio_region_t base,
152extern void mmio_region_nonatomic_set_bit32(
mmio_region_t base,
155extern void mmio_region_write_only_set_bit32(
mmio_region_t base,