csr: use external csr_readl()/csr_writel() if present
authorSean Cross <sean@xobs.io>
Sat, 22 Sep 2018 14:33:15 +0000 (16:33 +0200)
committerSean Cross <sean@xobs.io>
Sat, 22 Sep 2018 14:55:09 +0000 (16:55 +0200)
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 <sean@xobs.io>
litex/soc/integration/cpu_interface.py
litex/soc/software/include/hw/common.h

index e431f363f1996b3695e12717532d149a50285c47..0819b0a0a7d0e9ec7584c2e5bd53cf755b6116a1 100644 (file)
@@ -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 <stdint.h>\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 <hw/common.h>\n"
+        r += "#endif /* ! CSR_ACCESSORS_DEFINED */\n"
     for name, origin, busword, obj in regions:
         if not with_shadow_base:
             origin &= (~shadow_base)
index abef55d65be08d5ab5ba40c7522aeaf76ee72334..af668f74e5bd33411f3253e982e6820e67405ff7 100644 (file)
@@ -3,6 +3,14 @@
 
 #include <stdint.h>
 
+/* 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 */