From 6f25a0d8a1dced95c87bbe38e014f85ec56a1528 Mon Sep 17 00:00:00 2001 From: Sean Cross Date: Sat, 22 Sep 2018 16:33:15 +0200 Subject: [PATCH] csr: use external csr_readl()/csr_writel() if present If the variable CSR_ACCESSORS_DEFINED is set, then use external csr_readl() and csr_writel() instead of locally-generated inline functions. With this patch, csr.h can be used with etherbone.h and litex_server to prototype drivers remotely. Signed-off-by: Sean Cross --- litex/soc/integration/cpu_interface.py | 9 +++++++++ litex/soc/software/include/hw/common.h | 10 ++++++++++ 2 files changed, 19 insertions(+) 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 */