From 8d029185ca6bc18e6c3a65cb668e7bf9e3ed700c Mon Sep 17 00:00:00 2001 From: Howard Mao Date: Mon, 26 Jun 2017 20:25:37 -0700 Subject: [PATCH] separate mmio read/write functions by size --- tests/blkdev.c | 36 ++++++++++++++++++------------------ tests/mmio.h | 22 ++++++++++++++++++---- tests/pwm.c | 6 +++--- 3 files changed, 39 insertions(+), 25 deletions(-) diff --git a/tests/blkdev.c b/tests/blkdev.c index 9f3b6011..d00e3ccd 100644 --- a/tests/blkdev.c +++ b/tests/blkdev.c @@ -19,12 +19,12 @@ size_t blkdev_nsectors(void) { - return read_reg(BLKDEV_NSECTORS); + return reg_read32(BLKDEV_NSECTORS); } size_t blkdev_max_req_len(void) { - return read_reg(BLKDEV_MAX_REQUEST_LENGTH); + return reg_read32(BLKDEV_MAX_REQUEST_LENGTH); } void blkdev_read(void *addr, unsigned long offset, size_t nsectors) @@ -32,26 +32,26 @@ void blkdev_read(void *addr, unsigned long offset, size_t nsectors) int req_tag, resp_tag, ntags, i; size_t nsectors_per_tag; - ntags = read_reg(BLKDEV_NREQUEST); + ntags = reg_read32(BLKDEV_NREQUEST); nsectors_per_tag = nsectors / ntags; printf("sending %d reads\n", ntags); for (i = 0; i < ntags; i++) { - write_reg(BLKDEV_ADDR, (unsigned long) addr); - write_reg(BLKDEV_OFFSET, offset); - write_reg(BLKDEV_LEN, nsectors_per_tag); - write_reg(BLKDEV_WRITE, 0); + reg_write32(BLKDEV_ADDR, (unsigned long) addr); + reg_write32(BLKDEV_OFFSET, offset); + reg_write32(BLKDEV_LEN, nsectors_per_tag); + reg_write32(BLKDEV_WRITE, 0); - req_tag = read_reg(BLKDEV_REQUEST); + req_tag = reg_read32(BLKDEV_REQUEST); addr += (nsectors_per_tag << BLKDEV_SECTOR_SHIFT); offset += nsectors_per_tag; } - while (read_reg(BLKDEV_NCOMPLETE) < ntags); + while (reg_read32(BLKDEV_NCOMPLETE) < ntags); for (i = 0; i < ntags; i++) { - resp_tag = read_reg(BLKDEV_COMPLETE); + resp_tag = reg_read32(BLKDEV_COMPLETE); printf("completed read %d\n", resp_tag); } } @@ -61,26 +61,26 @@ void blkdev_write(unsigned long offset, void *addr, size_t nsectors) int req_tag, resp_tag, ntags, i; size_t nsectors_per_tag; - ntags = read_reg(BLKDEV_NREQUEST); + ntags = reg_read32(BLKDEV_NREQUEST); nsectors_per_tag = nsectors / ntags; printf("sending %d writes\n", ntags); for (i = 0; i < ntags; i++) { - write_reg(BLKDEV_ADDR, (unsigned long) addr); - write_reg(BLKDEV_OFFSET, offset); - write_reg(BLKDEV_LEN, nsectors_per_tag); - write_reg(BLKDEV_WRITE, 1); + reg_write32(BLKDEV_ADDR, (unsigned long) addr); + reg_write32(BLKDEV_OFFSET, offset); + reg_write32(BLKDEV_LEN, nsectors_per_tag); + reg_write32(BLKDEV_WRITE, 1); - req_tag = read_reg(BLKDEV_REQUEST); + req_tag = reg_read32(BLKDEV_REQUEST); addr += (nsectors_per_tag << BLKDEV_SECTOR_SHIFT); offset += nsectors_per_tag; } - while (read_reg(BLKDEV_NCOMPLETE) < ntags); + while (reg_read32(BLKDEV_NCOMPLETE) < ntags); for (i = 0; i < ntags; i++) { - resp_tag = read_reg(BLKDEV_COMPLETE); + resp_tag = reg_read32(BLKDEV_COMPLETE); printf("completed write %d\n", resp_tag); } } diff --git a/tests/mmio.h b/tests/mmio.h index 3fb791c6..b887b2b5 100644 --- a/tests/mmio.h +++ b/tests/mmio.h @@ -1,15 +1,29 @@ #ifndef __MMIO_H__ #define __MMIO_H__ -static inline void write_reg(unsigned long addr, unsigned int data) +#include + +static inline void reg_write32(uintptr_t addr, uint32_t data) { - volatile unsigned int *ptr = (volatile unsigned int *) addr; + volatile uint32_t *ptr = (volatile uint32_t *) addr; *ptr = data; } -static inline unsigned long read_reg(unsigned long addr) +static inline uint32_t reg_read32(uintptr_t addr) { - volatile unsigned int *ptr = (volatile unsigned int *) addr; + volatile uint32_t *ptr = (volatile uint32_t *) addr; + return *ptr; +} + +static inline void reg_write64(unsigned long addr, uint64_t data) +{ + volatile uint64_t *ptr = (volatile uint64_t *) addr; + *ptr = data; +} + +static inline uint64_t reg_read64(unsigned long addr) +{ + volatile uint64_t *ptr = (volatile uint64_t *) addr; return *ptr; } diff --git a/tests/pwm.c b/tests/pwm.c index 77c56424..3335e80c 100644 --- a/tests/pwm.c +++ b/tests/pwm.c @@ -6,9 +6,9 @@ int main(void) { - write_reg(PWM_PERIOD, 20); - write_reg(PWM_DUTY, 5); - write_reg(PWM_ENABLE, 1); + reg_write32(PWM_PERIOD, 20); + reg_write32(PWM_DUTY, 5); + reg_write32(PWM_ENABLE, 1); return 0; }