22
22
23
23
static inline unsigned char litex_read8 (unsigned long addr )
24
24
{
25
+ #if CONFIG_LITEX_CSR_DATA_WIDTH >= 8
25
26
return sys_read8 (addr );
27
+ #else
28
+ #error CSR data width less than 8
29
+ #endif
26
30
}
27
31
28
32
static inline unsigned short litex_read16 (unsigned long addr )
29
33
{
34
+ #if CONFIG_LITEX_CSR_DATA_WIDTH == 8
30
35
return (sys_read8 (addr ) << 8 )
31
36
| 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
32
42
}
33
43
34
44
static inline unsigned int litex_read32 (unsigned long addr )
35
45
{
46
+ #if CONFIG_LITEX_CSR_DATA_WIDTH == 8
36
47
return (sys_read8 (addr ) << 24 )
37
48
| (sys_read8 (addr + 0x4 ) << 16 )
38
49
| (sys_read8 (addr + 0x8 ) << 8 )
39
50
| 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
40
56
}
41
57
42
58
static inline uint64_t litex_read64 (unsigned long addr )
43
59
{
60
+ #if CONFIG_LITEX_CSR_DATA_WIDTH == 8
44
61
return (((uint64_t )sys_read8 (addr )) << 56 )
45
62
| ((uint64_t )sys_read8 (addr + 0x4 ) << 48 )
46
63
| ((uint64_t )sys_read8 (addr + 0x8 ) << 40 )
@@ -49,25 +66,48 @@ static inline uint64_t litex_read64(unsigned long addr)
49
66
| ((uint64_t )sys_read8 (addr + 0x14 ) << 16 )
50
67
| ((uint64_t )sys_read8 (addr + 0x18 ) << 8 )
51
68
| (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
52
76
}
53
77
54
78
static inline void litex_write8 (unsigned char value , unsigned long addr )
55
79
{
80
+ #if CONFIG_LITEX_CSR_DATA_WIDTH >= 8
56
81
sys_write8 (value , addr );
82
+ #else
83
+ #error CSR data width less than 8
84
+ #endif
57
85
}
58
86
59
87
static inline void litex_write16 (unsigned short value , unsigned long addr )
60
88
{
89
+ #if CONFIG_LITEX_CSR_DATA_WIDTH == 8
61
90
sys_write8 (value >> 8 , addr );
62
91
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
63
97
}
64
98
65
99
static inline void litex_write32 (unsigned int value , unsigned long addr )
66
100
{
101
+ #if CONFIG_LITEX_CSR_DATA_WIDTH == 8
67
102
sys_write8 (value >> 24 , addr );
68
103
sys_write8 (value >> 16 , addr + 0x4 );
69
104
sys_write8 (value >> 8 , addr + 0x8 );
70
105
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
71
111
}
72
112
73
113
static inline void litex_write (volatile uint32_t * reg , uint32_t reg_size , uint32_t val )
0 commit comments