diff --git a/soc/litex/litex_vexriscv/soc.h b/soc/litex/litex_vexriscv/soc.h index 4334be4ec1c..060110bbdbe 100644 --- a/soc/litex/litex_vexriscv/soc.h +++ b/soc/litex/litex_vexriscv/soc.h @@ -103,6 +103,27 @@ static inline void litex_write32(unsigned int value, unsigned long addr) #endif } +static inline void litex_write64(uint64_t value, unsigned long addr) +{ +#if CONFIG_LITEX_CSR_DATA_WIDTH == 8 + sys_write8(value >> 56, addr); + sys_write8(value >> 48, addr + 0x4); + sys_write8(value >> 40, addr + 0x8); + sys_write8(value >> 32, addr + 0xC); + sys_write8(value >> 24, addr + 0x10); + sys_write8(value >> 16, addr + 0x14); + sys_write8(value >> 8, addr + 0x18); + sys_write8(value, addr + 0x1C); +#elif CONFIG_LITEX_CSR_DATA_WIDTH == 32 + sys_write32(value >> 32, addr); + sys_write32(value, addr + 0x4); +#elif CONFIG_LITEX_CSR_DATA_WIDTH >= 64 + sys_write64(value, addr); +#else +#error Unsupported CSR data width +#endif +} + /* * Operates on uint32_t values only * Size is in bytes and meaningful are 1, 2 or 4