diff --git a/litex/soc/integration/cpu_interface.py b/litex/soc/integration/cpu_interface.py index e431f363f..0819b0a0a 100644 --- a/litex/soc/integration/cpu_interface.py +++ b/litex/soc/integration/cpu_interface.py @@ -147,7 +147,16 @@ def get_csr_header(regions, constants, with_access_functions=True, with_shadow_b r = "#ifndef __GENERATED_CSR_H\n#define __GENERATED_CSR_H\n" if with_access_functions: r += "#include \n" + r += "#ifdef CSR_ACCESSORS_DEFINED\n" + r += "extern void csr_writeb(uint8_t value, uint32_t addr);\n" + r += "extern uint8_t csr_readb(uint32_t addr);\n" + r += "extern void csr_writew(uint16_t value, uint32_t addr);\n" + r += "extern uint16_t csr_readw(uint32_t addr);\n" + r += "extern void csr_writel(uint32_t value, uint32_t addr);\n" + r += "extern uint32_t csr_readl(uint32_t addr);\n" + r += "#else /* ! CSR_ACCESSORS_DEFINED */\n" r += "#include \n" + r += "#endif /* ! CSR_ACCESSORS_DEFINED */\n" for name, origin, busword, obj in regions: if not with_shadow_base: origin &= (~shadow_base) diff --git a/litex/soc/software/include/hw/common.h b/litex/soc/software/include/hw/common.h index abef55d65..af668f74e 100644 --- a/litex/soc/software/include/hw/common.h +++ b/litex/soc/software/include/hw/common.h @@ -3,6 +3,14 @@ #include +/* To overwrite CSR accessors, define extern, non-inlined versions + * of csr_read[bwl]() and csr_write[bwl](), and define + * CSR_ACCESSORS_DEFINED. + */ + +#ifndef CSR_ACCESSORS_DEFINED +#define CSR_ACCESSORS_DEFINED + #ifdef __ASSEMBLER__ #define MMPTR(x) x #else /* ! __ASSEMBLER__ */ @@ -39,4 +47,6 @@ static inline uint32_t csr_readl(uint32_t addr) } #endif /* ! __ASSEMBLER__ */ +#endif /* ! CSR_ACCESSORS_DEFINED */ + #endif /* __HW_COMMON_H */