1111
1212#include <linux/io.h>
1313
14- /* LiteX SoCs support 8- or 32-bit CSR Bus data width (i.e., subreg. size) */
15- #if defined(CONFIG_LITEX_SUBREG_SIZE ) && \
16- (CONFIG_LITEX_SUBREG_SIZE == 1 || CONFIG_LITEX_SUBREG_SIZE == 4 )
17- #define LITEX_SUBREG_SIZE CONFIG_LITEX_SUBREG_SIZE
18- #else
19- #error LiteX subregister size (LITEX_SUBREG_SIZE) must be 4 or 1!
20- #endif
21- #define LITEX_SUBREG_SIZE_BIT (LITEX_SUBREG_SIZE * 8)
22-
23- /* LiteX subregisters of any width are always aligned on a 4-byte boundary */
24- #define LITEX_SUBREG_ALIGN 0x4
25-
2614static inline void _write_litex_subregister (u32 val , void __iomem * addr )
2715{
2816 writel ((u32 __force )cpu_to_le32 (val ), addr );
@@ -42,115 +30,54 @@ static inline u32 _read_litex_subregister(void __iomem *addr)
4230 * 32-bit wide logical CSR will be laid out as four 32-bit physical
4331 * subregisters, each one containing one byte of meaningful data.
4432 *
45- * For details see: https://github.com/enjoy-digital/litex/wiki/CSR-Bus
46- */
47-
48- /* number of LiteX subregisters needed to store a register of given reg_size */
49- #define _litex_num_subregs (reg_size ) \
50- (((reg_size) - 1) / LITEX_SUBREG_SIZE + 1)
51-
52- /*
53- * since the number of 4-byte aligned subregisters required to store a single
54- * LiteX CSR (MMIO) register varies with LITEX_SUBREG_SIZE, the offset of the
55- * next adjacent LiteX CSR register w.r.t. the offset of the current one also
56- * depends on how many subregisters the latter is spread across
57- */
58- #define _next_reg_off (off , size ) \
59- ((off) + _litex_num_subregs(size) * LITEX_SUBREG_ALIGN)
60-
61- /*
62- * The purpose of `_litex_[set|get]_reg()` is to implement the logic of
63- * writing to/reading from the LiteX CSR in a single place that can be then
64- * reused by all LiteX drivers via the `litex_[write|read][8|16|32|64]()`
65- * accessors for the appropriate data width.
66- * NOTE: direct use of `_litex_[set|get]_reg()` by LiteX drivers is strongly
67- * discouraged, as they perform no error checking on the requested data width!
68- */
69-
70- /**
71- * _litex_set_reg() - Writes a value to the LiteX CSR (Control&Status Register)
72- * @reg: Address of the CSR
73- * @reg_size: The width of the CSR expressed in the number of bytes
74- * @val: Value to be written to the CSR
33+ * For Linux support, upstream LiteX enforces a 32-bit wide CSR bus, which
34+ * means that only larger-than-32-bit CSRs will be split across multiple
35+ * subregisters (e.g., a 64-bit CSR will be spread across two consecutive
36+ * 32-bit subregisters).
7537 *
76- * This function splits a single (possibly multi-byte) LiteX CSR write into
77- * a series of subregister writes with a proper offset.
78- * NOTE: caller is responsible for ensuring (0 < reg_size <= sizeof(u64)).
79- */
80- static inline void _litex_set_reg (void __iomem * reg , size_t reg_size , u64 val )
81- {
82- u8 shift = _litex_num_subregs (reg_size ) * LITEX_SUBREG_SIZE_BIT ;
83-
84- while (shift > 0 ) {
85- shift -= LITEX_SUBREG_SIZE_BIT ;
86- _write_litex_subregister (val >> shift , reg );
87- reg += LITEX_SUBREG_ALIGN ;
88- }
89- }
90-
91- /**
92- * _litex_get_reg() - Reads a value of the LiteX CSR (Control&Status Register)
93- * @reg: Address of the CSR
94- * @reg_size: The width of the CSR expressed in the number of bytes
95- *
96- * Return: Value read from the CSR
97- *
98- * This function generates a series of subregister reads with a proper offset
99- * and joins their results into a single (possibly multi-byte) LiteX CSR value.
100- * NOTE: caller is responsible for ensuring (0 < reg_size <= sizeof(u64)).
38+ * For details see: https://github.com/enjoy-digital/litex/wiki/CSR-Bus
10139 */
102- static inline u64 _litex_get_reg (void __iomem * reg , size_t reg_size )
103- {
104- u64 r ;
105- u8 i ;
106-
107- r = _read_litex_subregister (reg );
108- for (i = 1 ; i < _litex_num_subregs (reg_size ); i ++ ) {
109- r <<= LITEX_SUBREG_SIZE_BIT ;
110- reg += LITEX_SUBREG_ALIGN ;
111- r |= _read_litex_subregister (reg );
112- }
113- return r ;
114- }
11540
11641static inline void litex_write8 (void __iomem * reg , u8 val )
11742{
118- _litex_set_reg ( reg , sizeof ( u8 ), val );
43+ _write_litex_subregister ( val , reg );
11944}
12045
12146static inline void litex_write16 (void __iomem * reg , u16 val )
12247{
123- _litex_set_reg ( reg , sizeof ( u16 ), val );
48+ _write_litex_subregister ( val , reg );
12449}
12550
12651static inline void litex_write32 (void __iomem * reg , u32 val )
12752{
128- _litex_set_reg ( reg , sizeof ( u32 ), val );
53+ _write_litex_subregister ( val , reg );
12954}
13055
13156static inline void litex_write64 (void __iomem * reg , u64 val )
13257{
133- _litex_set_reg (reg , sizeof (u64 ), val );
58+ _write_litex_subregister (val >> 32 , reg );
59+ _write_litex_subregister (val , reg + 4 );
13460}
13561
13662static inline u8 litex_read8 (void __iomem * reg )
13763{
138- return _litex_get_reg (reg , sizeof ( u8 ) );
64+ return _read_litex_subregister (reg );
13965}
14066
14167static inline u16 litex_read16 (void __iomem * reg )
14268{
143- return _litex_get_reg (reg , sizeof ( u16 ) );
69+ return _read_litex_subregister (reg );
14470}
14571
14672static inline u32 litex_read32 (void __iomem * reg )
14773{
148- return _litex_get_reg (reg , sizeof ( u32 ) );
74+ return _read_litex_subregister (reg );
14975}
15076
15177static inline u64 litex_read64 (void __iomem * reg )
15278{
153- return _litex_get_reg (reg , sizeof (u64 ));
79+ return ((u64 )_read_litex_subregister (reg ) << 32 ) |
80+ _read_litex_subregister (reg + 4 );
15481}
15582
15683#endif /* _LINUX_LITEX_H */
0 commit comments