xref: /openbmc/linux/include/linux/litex.h (revision ad4e600c)
122447a99SPawel Czarnecki /* SPDX-License-Identifier: GPL-2.0 */
222447a99SPawel Czarnecki /*
322447a99SPawel Czarnecki  * Common LiteX header providing
422447a99SPawel Czarnecki  * helper functions for accessing CSRs.
522447a99SPawel Czarnecki  *
622447a99SPawel Czarnecki  * Copyright (C) 2019-2020 Antmicro <www.antmicro.com>
722447a99SPawel Czarnecki  */
822447a99SPawel Czarnecki 
922447a99SPawel Czarnecki #ifndef _LINUX_LITEX_H
1022447a99SPawel Czarnecki #define _LINUX_LITEX_H
1122447a99SPawel Czarnecki 
1222447a99SPawel Czarnecki #include <linux/io.h>
1322447a99SPawel Czarnecki 
_write_litex_subregister(u32 val,void __iomem * addr)14b5d3061eSGabriel Somlo static inline void _write_litex_subregister(u32 val, void __iomem *addr)
15b5d3061eSGabriel Somlo {
16b5d3061eSGabriel Somlo 	writel((u32 __force)cpu_to_le32(val), addr);
17b5d3061eSGabriel Somlo }
18b5d3061eSGabriel Somlo 
_read_litex_subregister(void __iomem * addr)19b5d3061eSGabriel Somlo static inline u32 _read_litex_subregister(void __iomem *addr)
20b5d3061eSGabriel Somlo {
21b5d3061eSGabriel Somlo 	return le32_to_cpu((__le32 __force)readl(addr));
22b5d3061eSGabriel Somlo }
23b5d3061eSGabriel Somlo 
249d93a9e8SGabriel Somlo /*
259d93a9e8SGabriel Somlo  * LiteX SoC Generator, depending on the configuration, can split a single
269d93a9e8SGabriel Somlo  * logical CSR (Control&Status Register) into a series of consecutive physical
279d93a9e8SGabriel Somlo  * registers.
289d93a9e8SGabriel Somlo  *
2951f10922SGabriel Somlo  * For example, in the configuration with 8-bit CSR Bus, a 32-bit aligned,
3051f10922SGabriel Somlo  * 32-bit wide logical CSR will be laid out as four 32-bit physical
3151f10922SGabriel Somlo  * subregisters, each one containing one byte of meaningful data.
329d93a9e8SGabriel Somlo  *
33*ad4e600cSGabriel Somlo  * For Linux support, upstream LiteX enforces a 32-bit wide CSR bus, which
34*ad4e600cSGabriel Somlo  * means that only larger-than-32-bit CSRs will be split across multiple
35*ad4e600cSGabriel Somlo  * subregisters (e.g., a 64-bit CSR will be spread across two consecutive
36*ad4e600cSGabriel Somlo  * 32-bit subregisters).
37*ad4e600cSGabriel Somlo  *
389d93a9e8SGabriel Somlo  * For details see: https://github.com/enjoy-digital/litex/wiki/CSR-Bus
3951f10922SGabriel Somlo  */
4051f10922SGabriel Somlo 
litex_write8(void __iomem * reg,u8 val)4122447a99SPawel Czarnecki static inline void litex_write8(void __iomem *reg, u8 val)
4222447a99SPawel Czarnecki {
43*ad4e600cSGabriel Somlo 	_write_litex_subregister(val, reg);
4422447a99SPawel Czarnecki }
4522447a99SPawel Czarnecki 
litex_write16(void __iomem * reg,u16 val)4622447a99SPawel Czarnecki static inline void litex_write16(void __iomem *reg, u16 val)
4722447a99SPawel Czarnecki {
48*ad4e600cSGabriel Somlo 	_write_litex_subregister(val, reg);
4922447a99SPawel Czarnecki }
5022447a99SPawel Czarnecki 
litex_write32(void __iomem * reg,u32 val)5122447a99SPawel Czarnecki static inline void litex_write32(void __iomem *reg, u32 val)
5222447a99SPawel Czarnecki {
53*ad4e600cSGabriel Somlo 	_write_litex_subregister(val, reg);
5422447a99SPawel Czarnecki }
5522447a99SPawel Czarnecki 
litex_write64(void __iomem * reg,u64 val)5622447a99SPawel Czarnecki static inline void litex_write64(void __iomem *reg, u64 val)
5722447a99SPawel Czarnecki {
58*ad4e600cSGabriel Somlo 	_write_litex_subregister(val >> 32, reg);
59*ad4e600cSGabriel Somlo 	_write_litex_subregister(val, reg + 4);
6022447a99SPawel Czarnecki }
6122447a99SPawel Czarnecki 
litex_read8(void __iomem * reg)6222447a99SPawel Czarnecki static inline u8 litex_read8(void __iomem *reg)
6322447a99SPawel Czarnecki {
64*ad4e600cSGabriel Somlo 	return _read_litex_subregister(reg);
6522447a99SPawel Czarnecki }
6622447a99SPawel Czarnecki 
litex_read16(void __iomem * reg)6722447a99SPawel Czarnecki static inline u16 litex_read16(void __iomem *reg)
6822447a99SPawel Czarnecki {
69*ad4e600cSGabriel Somlo 	return _read_litex_subregister(reg);
7022447a99SPawel Czarnecki }
7122447a99SPawel Czarnecki 
litex_read32(void __iomem * reg)7222447a99SPawel Czarnecki static inline u32 litex_read32(void __iomem *reg)
7322447a99SPawel Czarnecki {
74*ad4e600cSGabriel Somlo 	return _read_litex_subregister(reg);
7522447a99SPawel Czarnecki }
7622447a99SPawel Czarnecki 
litex_read64(void __iomem * reg)7722447a99SPawel Czarnecki static inline u64 litex_read64(void __iomem *reg)
7822447a99SPawel Czarnecki {
79*ad4e600cSGabriel Somlo 	return ((u64)_read_litex_subregister(reg) << 32) |
80*ad4e600cSGabriel Somlo 		_read_litex_subregister(reg + 4);
8122447a99SPawel Czarnecki }
8222447a99SPawel Czarnecki 
8322447a99SPawel Czarnecki #endif /* _LINUX_LITEX_H */
84