Skip to content

Commit f1e0cb6

Browse files
michalsieroncarlescufi
authored andcommitted
soc: litex-vexriscv: Implement universal LiteX HAL
Adds LITEX_CSR_DATA_WIDTH option to Kconfig Depending on its value appropriate read/write handling is used for accessing CSR registers. By using `>=` in preprocessor conditions it is somewhat future-proofed. Doesn't touch `litex_read` and `litex_write` yet. Signed-off-by: Michal Sieron <[email protected]>
1 parent e71448a commit f1e0cb6

File tree

2 files changed

+48
-0
lines changed

2 files changed

+48
-0
lines changed

soc/riscv/litex-vexriscv/Kconfig.soc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,11 @@ config SOC_RISCV32_LITEX_VEXRISCV
66
select RISCV
77
select ATOMIC_OPERATIONS_C
88
select INCLUDE_RESET_VECTOR
9+
10+
if SOC_RISCV32_LITEX_VEXRISCV
11+
12+
config LITEX_CSR_DATA_WIDTH
13+
int "Select Control/Status register width"
14+
default 32
15+
16+
endif # SOC_RISCV32_LITEX_VEXRISCV

soc/riscv/litex-vexriscv/soc.h

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,25 +22,42 @@
2222

2323
static inline unsigned char litex_read8(unsigned long addr)
2424
{
25+
#if CONFIG_LITEX_CSR_DATA_WIDTH >= 8
2526
return sys_read8(addr);
27+
#else
28+
#error CSR data width less than 8
29+
#endif
2630
}
2731

2832
static inline unsigned short litex_read16(unsigned long addr)
2933
{
34+
#if CONFIG_LITEX_CSR_DATA_WIDTH == 8
3035
return (sys_read8(addr) << 8)
3136
| sys_read8(addr + 0x4);
37+
#elif CONFIG_LITEX_CSR_DATA_WIDTH >= 16
38+
return sys_read16(addr);
39+
#else
40+
#error Unsupported CSR data width
41+
#endif
3242
}
3343

3444
static inline unsigned int litex_read32(unsigned long addr)
3545
{
46+
#if CONFIG_LITEX_CSR_DATA_WIDTH == 8
3647
return (sys_read8(addr) << 24)
3748
| (sys_read8(addr + 0x4) << 16)
3849
| (sys_read8(addr + 0x8) << 8)
3950
| sys_read8(addr + 0xc);
51+
#elif CONFIG_LITEX_CSR_DATA_WIDTH >= 32
52+
return sys_read32(addr);
53+
#else
54+
#error Unsupported CSR data width
55+
#endif
4056
}
4157

4258
static inline uint64_t litex_read64(unsigned long addr)
4359
{
60+
#if CONFIG_LITEX_CSR_DATA_WIDTH == 8
4461
return (((uint64_t)sys_read8(addr)) << 56)
4562
| ((uint64_t)sys_read8(addr + 0x4) << 48)
4663
| ((uint64_t)sys_read8(addr + 0x8) << 40)
@@ -49,25 +66,48 @@ static inline uint64_t litex_read64(unsigned long addr)
4966
| ((uint64_t)sys_read8(addr + 0x14) << 16)
5067
| ((uint64_t)sys_read8(addr + 0x18) << 8)
5168
| (uint64_t)sys_read8(addr + 0x1c);
69+
#elif CONFIG_LITEX_CSR_DATA_WIDTH == 32
70+
return ((uint64_t)sys_read32(addr) << 32) | (uint64_t)sys_read32(addr + 0x4);
71+
#elif CONFIG_LITEX_CSR_DATA_WIDTH >= 64
72+
return sys_read64(addr);
73+
#else
74+
#error Unsupported CSR data width
75+
#endif
5276
}
5377

5478
static inline void litex_write8(unsigned char value, unsigned long addr)
5579
{
80+
#if CONFIG_LITEX_CSR_DATA_WIDTH >= 8
5681
sys_write8(value, addr);
82+
#else
83+
#error CSR data width less than 8
84+
#endif
5785
}
5886

5987
static inline void litex_write16(unsigned short value, unsigned long addr)
6088
{
89+
#if CONFIG_LITEX_CSR_DATA_WIDTH == 8
6190
sys_write8(value >> 8, addr);
6291
sys_write8(value, addr + 0x4);
92+
#elif CONFIG_LITEX_CSR_DATA_WIDTH >= 16
93+
sys_write16(value, addr);
94+
#else
95+
#error Unsupported CSR data width
96+
#endif
6397
}
6498

6599
static inline void litex_write32(unsigned int value, unsigned long addr)
66100
{
101+
#if CONFIG_LITEX_CSR_DATA_WIDTH == 8
67102
sys_write8(value >> 24, addr);
68103
sys_write8(value >> 16, addr + 0x4);
69104
sys_write8(value >> 8, addr + 0x8);
70105
sys_write8(value, addr + 0xC);
106+
#elif CONFIG_LITEX_CSR_DATA_WIDTH >= 32
107+
sys_write32(value, addr);
108+
#else
109+
#error Unsupported CSR data width
110+
#endif
71111
}
72112

73113
static inline void litex_write(volatile uint32_t *reg, uint32_t reg_size, uint32_t val)

0 commit comments

Comments
 (0)