[PATCH v3 6/8] grlib: use cpu-independent routines for uncached access
Jiri Gaisler
jiri at gaisler.se
Fri Jan 18 19:42:59 UTC 2019
---
bsps/include/grlib/grlib_impl.h | 52 +++++++++++++++++++
bsps/shared/grlib/1553/b1553brm.c | 10 +---
bsps/shared/grlib/1553/b1553rt.c | 11 +---
bsps/shared/grlib/can/grcan.c | 27 ++--------
bsps/shared/grlib/pci/grpci2dma.c | 2 +-
bsps/shared/grlib/spw/grspw.c | 33 +++---------
bsps/shared/grlib/spw/grspw_pkt.c | 2 +-
cpukit/score/cpu/riscv/headers.am | 2 +
.../score/cpu/riscv/include/libcpu/access.h | 50 ++++++++++++++++++
.../cpu/riscv/include/libcpu/byteorder.h | 31 +++++++++++
10 files changed, 149 insertions(+), 71 deletions(-)
create mode 100644 cpukit/score/cpu/riscv/include/libcpu/access.h
create mode 100644 cpukit/score/cpu/riscv/include/libcpu/byteorder.h
diff --git a/bsps/include/grlib/grlib_impl.h b/bsps/include/grlib/grlib_impl.h
index 9a7fa15a5e..f1260671e0 100644
--- a/bsps/include/grlib/grlib_impl.h
+++ b/bsps/include/grlib/grlib_impl.h
@@ -90,6 +90,58 @@ RTEMS_INLINE_ROUTINE void *grlib_calloc(size_t nelem, size_t elsize)
#endif
+#ifdef __sparc
+
+RTEMS_INLINE_ROUTINE unsigned char grlib_read_uncached8(unsigned int address)
+{
+ unsigned char tmp;
+ __asm__ (" lduba [%1]1, %0 "
+ : "=r"(tmp)
+ : "r"(address)
+ );
+ return tmp;
+}
+
+RTEMS_INLINE_ROUTINE unsigned short grlib_read_uncached16(unsigned int addr) {
+ unsigned short tmp;
+ __asm__ (" lduha [%1]1, %0 "
+ : "=r"(tmp)
+ : "r"(addr)
+ );
+ return tmp;
+}
+
+
+RTEMS_INLINE_ROUTINE unsigned int grlib_read_uncached32(unsigned int address)
+{
+ unsigned int tmp;
+ __asm__ (" lda [%1]1, %0 "
+ : "=r"(tmp)
+ : "r"(address)
+ );
+ return tmp;
+}
+#else
+
+static unsigned char __inline__ grlib_read_uncached8(unsigned int address)
+{
+ unsigned char tmp = (*(volatile unsigned char *)(address));
+ return tmp;
+}
+
+static __inline__ unsigned short grlib_read_uncached16(unsigned int address) {
+ unsigned short tmp = (*(volatile unsigned short *)(address));
+ return tmp;
+}
+
+RTEMS_INLINE_ROUTINE unsigned int grlib_read_uncached32(unsigned int address)
+{
+ unsigned int tmp = (*(volatile unsigned int *)(address));
+ return tmp;
+}
+
+#endif
+
extern struct ambapp_bus ambapp_plb;
#ifdef __cplusplus
diff --git a/bsps/shared/grlib/1553/b1553brm.c b/bsps/shared/grlib/1553/b1553brm.c
index 5575abb525..57ef70126b 100644
--- a/bsps/shared/grlib/1553/b1553brm.c
+++ b/bsps/shared/grlib/1553/b1553brm.c
@@ -59,15 +59,7 @@
#endif
#define READ_REG(address) (*(volatile unsigned int *)address)
-#define READ_DMA(address) _BRM_REG_READ16((unsigned int)address)
-static __inline__ unsigned short _BRM_REG_READ16(unsigned int addr) {
- unsigned short tmp;
- __asm__ (" lduha [%1]1, %0 "
- : "=r"(tmp)
- : "r"(addr)
- );
- return tmp;
-}
+#define READ_DMA(address) grlib_read_uncached16((unsigned int)address)
static rtems_device_driver brm_initialize(rtems_device_major_number major, rtems_device_minor_number minor, void *arg);
static rtems_device_driver brm_open(rtems_device_major_number major, rtems_device_minor_number minor, void *arg);
diff --git a/bsps/shared/grlib/1553/b1553rt.c b/bsps/shared/grlib/1553/b1553rt.c
index 35afd901c8..d7257e461f 100644
--- a/bsps/shared/grlib/1553/b1553rt.c
+++ b/bsps/shared/grlib/1553/b1553rt.c
@@ -52,16 +52,7 @@
#define FUNCDBG(x...)
#endif
-#define READ_DMA(address) _READ16((unsigned int)address)
-
-static __inline__ unsigned short _READ16(unsigned int addr) {
- unsigned short tmp;
- asm(" lduha [%1]1, %0 "
- : "=r"(tmp)
- : "r"(addr)
- );
- return tmp;
-}
+#define READ_DMA(address) grlib_read_uncached16((unsigned int)address)
static rtems_device_driver rt_initialize(rtems_device_major_number major, rtems_device_minor_number minor, void *arg);
static rtems_device_driver rt_open(rtems_device_major_number major, rtems_device_minor_number minor, void *arg);
diff --git a/bsps/shared/grlib/can/grcan.c b/bsps/shared/grlib/can/grcan.c
index 55154d823a..d69d99d85a 100644
--- a/bsps/shared/grlib/can/grcan.c
+++ b/bsps/shared/grlib/can/grcan.c
@@ -165,40 +165,19 @@ static void grcan_hw_sync(
static void grcan_interrupt(void *arg);
#ifdef GRCAN_REG_BYPASS_CACHE
-#define READ_REG(address) _grcan_read_nocache((unsigned int)(address))
+#define READ_REG(address) grlib_read_uncached32((unsigned int)(address))
#else
#define READ_REG(address) (*(volatile unsigned int *)(address))
#endif
#ifdef GRCAN_DMA_BYPASS_CACHE
-#define READ_DMA_WORD(address) _grcan_read_nocache((unsigned int)(address))
-#define READ_DMA_BYTE(address) _grcan_read_nocache_byte((unsigned int)(address))
-static unsigned char __inline__ _grcan_read_nocache_byte(unsigned int address)
-{
- unsigned char tmp;
- __asm__ (" lduba [%1]1, %0 "
- : "=r"(tmp)
- : "r"(address)
- );
- return tmp;
-}
+#define READ_DMA_WORD(address) grlib_read_uncached32((unsigned int)(address))
+#define READ_DMA_BYTE(address) grlib_read_uncached8((unsigned int)(address))
#else
#define READ_DMA_WORD(address) (*(volatile unsigned int *)(address))
#define READ_DMA_BYTE(address) (*(volatile unsigned char *)(address))
#endif
-#if defined(GRCAN_REG_BYPASS_CACHE) || defined(GRCAN_DMA_BYPASS_CACHE)
-static unsigned int __inline__ _grcan_read_nocache(unsigned int address)
-{
- unsigned int tmp;
- __asm__ (" lda [%1]1, %0 "
- : "=r"(tmp)
- : "r"(address)
- );
- return tmp;
-}
-#endif
-
#define NELEM(a) ((int) (sizeof (a) / sizeof (a[0])))
static int grcan_count = 0;
diff --git a/bsps/shared/grlib/pci/grpci2dma.c b/bsps/shared/grlib/pci/grpci2dma.c
index 7e39ca691d..cb41d48966 100644
--- a/bsps/shared/grlib/pci/grpci2dma.c
+++ b/bsps/shared/grlib/pci/grpci2dma.c
@@ -98,7 +98,7 @@
/* Memory and HW Registers Access routines. All 32-bit access routines */
#define BD_WRITE(addr, val) (*(volatile unsigned int *)(addr) = (unsigned int)(val))
/*#define BD_READ(addr) (*(volatile unsigned int *)(addr))*/
-#define BD_READ(addr) leon_r32_no_cache((unsigned long)(addr))
+#define BD_READ(addr) grlib_read_uncached32((unsigned long)(addr))
#define REG_WRITE(addr, val) (*(volatile unsigned int *)(addr) = (unsigned int)(val))
#define REG_READ(addr) (*(volatile unsigned int *)(addr))
diff --git a/bsps/shared/grlib/spw/grspw.c b/bsps/shared/grlib/spw/grspw.c
index ca0f63edd8..fbaadd1e13 100644
--- a/bsps/shared/grlib/spw/grspw.c
+++ b/bsps/shared/grlib/spw/grspw.c
@@ -25,6 +25,10 @@
#include <grlib/grlib_impl.h>
+#ifndef CPU_SPARC_HAS_SNOOPING
+#define CPU_SPARC_HAS_SNOOPING 1
+#endif
+
#define DBGSPW_IOCALLS 1
#define DBGSPW_TX 2
#define DBGSPW_RX 4
@@ -152,32 +156,9 @@ void (*grspw_timecode_callback)
#define _MEM_READ8(address) (*(volatile unsigned char *)(address))
#define _MEM_READ32(address) (*(volatile unsigned int *)(address))
#else
-static inline unsigned int _SPW_READ(volatile void *addr) {
- unsigned int tmp;
- __asm__ (" lda [%1]1, %0 "
- : "=r"(tmp)
- : "r"(addr)
- );
- return tmp;
-}
-
-static inline unsigned int _MEM_READ8(volatile void *addr) {
- unsigned int tmp;
- __asm__ (" lduba [%1]1, %0 "
- : "=r"(tmp)
- : "r"(addr)
- );
- return tmp;
-}
-
-static inline unsigned int _MEM_READ32(volatile void *addr) {
- unsigned int tmp;
- __asm__ (" lda [%1]1, %0 "
- : "=r"(tmp)
- : "r"(addr)
- );
- return tmp;
-}
+#define _SPW_READ(address) grlib_read_uncached32((unsigned int) address)
+#define _MEM_READ8(address) grlib_read_uncached8((unsigned int) address)
+#define _MEM_READ32(address) grlib_read_uncached32((unsigned int) address)
#endif
#define MEM_READ8(addr) _MEM_READ8((volatile void *)(addr))
diff --git a/bsps/shared/grlib/spw/grspw_pkt.c b/bsps/shared/grlib/spw/grspw_pkt.c
index 208f5a14f7..56b39d78db 100644
--- a/bsps/shared/grlib/spw/grspw_pkt.c
+++ b/bsps/shared/grlib/spw/grspw_pkt.c
@@ -315,7 +315,7 @@ struct grspw_txbd {
/* Memory and HW Registers Access routines. All 32-bit access routines */
#define BD_WRITE(addr, val) (*(volatile unsigned int *)(addr) = (unsigned int)(val))
/*#define BD_READ(addr) (*(volatile unsigned int *)(addr))*/
-#define BD_READ(addr) leon_r32_no_cache((unsigned long)(addr))
+#define BD_READ(addr) grlib_read_uncached32((unsigned long)(addr))
#define REG_WRITE(addr, val) (*(volatile unsigned int *)(addr) = (unsigned int)(val))
#define REG_READ(addr) (*(volatile unsigned int *)(addr))
diff --git a/cpukit/score/cpu/riscv/headers.am b/cpukit/score/cpu/riscv/headers.am
index 415075ce46..abb8a42f78 100644
--- a/cpukit/score/cpu/riscv/headers.am
+++ b/cpukit/score/cpu/riscv/headers.am
@@ -1,4 +1,6 @@
## This file was generated by "./boostrap -H".
+include_libcpu_HEADERS += score/cpu/riscv/include/libcpu/access.h
+include_libcpu_HEADERS += score/cpu/riscv/include/libcpu/byteorder.h
include_rtems_HEADERS += score/cpu/riscv/include/rtems/asm.h
include_rtems_score_HEADERS += score/cpu/riscv/include/rtems/score/cpu.h
include_rtems_score_HEADERS += score/cpu/riscv/include/rtems/score/cpu_asm.h
diff --git a/cpukit/score/cpu/riscv/include/libcpu/access.h b/cpukit/score/cpu/riscv/include/libcpu/access.h
new file mode 100644
index 0000000000..cdf6b77122
--- /dev/null
+++ b/cpukit/score/cpu/riscv/include/libcpu/access.h
@@ -0,0 +1,50 @@
+/*
+ * access.h - access routines for SPARC. SPARC is big endian only.
+ *
+ * COPYRIGHT (c) 2011
+ * Aeroflex Gaisler.
+ *
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#ifndef _LIBCPU_ACCESS_H
+#define _LIBCPU_ACCESS_H
+
+#include <rtems/system.h>
+#include <rtems/score/cpu.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* "Raw" access */
+extern uint8_t _ld8(uint8_t *addr);
+extern void _st8(uint8_t *addr, uint8_t val);
+extern uint16_t _ld16(uint16_t *addr);
+extern void _st16(uint16_t *addr, uint16_t val);
+extern uint32_t _ld32(uint32_t *addr);
+extern void _st32(uint32_t *addr, uint32_t val);
+extern uint64_t _ld64(uint64_t *addr);
+extern void _st64(uint64_t *addr, uint64_t val);
+
+/* Aliases for Big Endian */
+extern uint16_t _ld_be16(uint16_t *addr);
+extern void _st_be16(uint16_t *addr, uint16_t val);
+extern uint32_t _ld_be32(uint32_t *addr);
+extern void _st_be32(uint32_t *addr, uint32_t val);
+extern uint64_t _ld_be64(uint64_t *addr);
+extern void _st_be64(uint64_t *addr, uint64_t val);
+
+/* Little endian */
+extern uint16_t _ld_le16(uint16_t *addr);
+extern void _st_le16(uint16_t *addr, uint16_t val);
+extern uint32_t _ld_le32(uint32_t *addr);
+extern void _st_le32(uint32_t *addr, uint32_t val);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/cpukit/score/cpu/riscv/include/libcpu/byteorder.h b/cpukit/score/cpu/riscv/include/libcpu/byteorder.h
new file mode 100644
index 0000000000..939e51fe84
--- /dev/null
+++ b/cpukit/score/cpu/riscv/include/libcpu/byteorder.h
@@ -0,0 +1,31 @@
+/*
+ * The license and distribution terms for this file may be
+ * found in the file LICENSE in this distribution or at
+ * http://www.rtems.org/license/LICENSE.
+ */
+
+#ifndef _LIBCPU_BYTEORDER_H
+#define _LIBCPU_BYTEORDER_H
+
+static inline void st_le32(volatile uint32_t *addr, uint32_t value)
+{
+ *(addr)=value ;
+}
+
+static inline uint32_t ld_le32(volatile uint32_t *addr)
+{
+ return(*addr);
+}
+
+static inline void st_le16(volatile uint16_t *addr, uint16_t value)
+{
+ *(addr)=value ;
+}
+
+static inline uint16_t ld_le16(volatile uint16_t *addr)
+{
+ return(*addr);
+}
+
+
+#endif
--
2.17.1
More information about the devel
mailing list