152 static void write(uint32_t addr,
const void *buf, uint32_t len)
170 static constexpr uint32_t BUF_WORD_LEN = 32;
171 static constexpr uint32_t BUF_BYTE_LEN = 128;
172 static constexpr uint32_t BUF_BYTE_MASK = BUF_BYTE_LEN - 1;
173 static constexpr uint32_t BYTE_PER_WORD = 4;
176 uint32_t w[BUF_WORD_LEN];
177 uint8_t b[BUF_BYTE_LEN];
179 static BufType wrbuf;
181 const uint8_t *src = (
const uint8_t *)buf;
186 uint32_t *buf_address = (uint32_t *)(addr & ~BUF_BYTE_MASK);
188 uint32_t buf_word_ofs = (addr & BUF_BYTE_MASK) / BYTE_PER_WORD;
190 uint32_t buf_byte_ofs = (addr & BUF_BYTE_MASK);
192 uint32_t buf_byte_count =
193 std::min((uint32_t)len, BUF_BYTE_LEN - buf_byte_ofs);
195 uint32_t buf_word_end =
196 (buf_byte_ofs + buf_byte_count + BYTE_PER_WORD - 1) /
199 uint32_t buf_word_count = buf_word_end - buf_word_ofs;
202 for (uint32_t i = 0; i < buf_word_count; ++i)
204 wrbuf.w[buf_word_ofs + i] = buf_address[buf_word_ofs + i];
208 for (uint32_t i = 0; i < buf_byte_count; ++i)
210 wrbuf.b[buf_byte_ofs + i] &= src[i];
215 HASSERT(FPG(wrbuf.w + buf_word_ofs,
216 ((uint32_t)buf_address) + buf_word_ofs * BYTE_PER_WORD,
217 buf_word_count * BYTE_PER_WORD) == 0);
221 len -= buf_byte_count;
222 addr += buf_byte_count;
223 src += buf_byte_count;