separate mmio read/write functions by size

This commit is contained in:
Howard Mao
2017-06-26 20:25:37 -07:00
parent f766dcc550
commit 8d029185ca
3 changed files with 39 additions and 25 deletions

View File

@@ -19,12 +19,12 @@
size_t blkdev_nsectors(void) size_t blkdev_nsectors(void)
{ {
return read_reg(BLKDEV_NSECTORS); return reg_read32(BLKDEV_NSECTORS);
} }
size_t blkdev_max_req_len(void) 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) 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; int req_tag, resp_tag, ntags, i;
size_t nsectors_per_tag; size_t nsectors_per_tag;
ntags = read_reg(BLKDEV_NREQUEST); ntags = reg_read32(BLKDEV_NREQUEST);
nsectors_per_tag = nsectors / ntags; nsectors_per_tag = nsectors / ntags;
printf("sending %d reads\n", ntags); printf("sending %d reads\n", ntags);
for (i = 0; i < ntags; i++) { for (i = 0; i < ntags; i++) {
write_reg(BLKDEV_ADDR, (unsigned long) addr); reg_write32(BLKDEV_ADDR, (unsigned long) addr);
write_reg(BLKDEV_OFFSET, offset); reg_write32(BLKDEV_OFFSET, offset);
write_reg(BLKDEV_LEN, nsectors_per_tag); reg_write32(BLKDEV_LEN, nsectors_per_tag);
write_reg(BLKDEV_WRITE, 0); reg_write32(BLKDEV_WRITE, 0);
req_tag = read_reg(BLKDEV_REQUEST); req_tag = reg_read32(BLKDEV_REQUEST);
addr += (nsectors_per_tag << BLKDEV_SECTOR_SHIFT); addr += (nsectors_per_tag << BLKDEV_SECTOR_SHIFT);
offset += nsectors_per_tag; offset += nsectors_per_tag;
} }
while (read_reg(BLKDEV_NCOMPLETE) < ntags); while (reg_read32(BLKDEV_NCOMPLETE) < ntags);
for (i = 0; i < ntags; i++) { 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); 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; int req_tag, resp_tag, ntags, i;
size_t nsectors_per_tag; size_t nsectors_per_tag;
ntags = read_reg(BLKDEV_NREQUEST); ntags = reg_read32(BLKDEV_NREQUEST);
nsectors_per_tag = nsectors / ntags; nsectors_per_tag = nsectors / ntags;
printf("sending %d writes\n", ntags); printf("sending %d writes\n", ntags);
for (i = 0; i < ntags; i++) { for (i = 0; i < ntags; i++) {
write_reg(BLKDEV_ADDR, (unsigned long) addr); reg_write32(BLKDEV_ADDR, (unsigned long) addr);
write_reg(BLKDEV_OFFSET, offset); reg_write32(BLKDEV_OFFSET, offset);
write_reg(BLKDEV_LEN, nsectors_per_tag); reg_write32(BLKDEV_LEN, nsectors_per_tag);
write_reg(BLKDEV_WRITE, 1); reg_write32(BLKDEV_WRITE, 1);
req_tag = read_reg(BLKDEV_REQUEST); req_tag = reg_read32(BLKDEV_REQUEST);
addr += (nsectors_per_tag << BLKDEV_SECTOR_SHIFT); addr += (nsectors_per_tag << BLKDEV_SECTOR_SHIFT);
offset += nsectors_per_tag; offset += nsectors_per_tag;
} }
while (read_reg(BLKDEV_NCOMPLETE) < ntags); while (reg_read32(BLKDEV_NCOMPLETE) < ntags);
for (i = 0; i < ntags; i++) { 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); printf("completed write %d\n", resp_tag);
} }
} }

View File

@@ -1,15 +1,29 @@
#ifndef __MMIO_H__ #ifndef __MMIO_H__
#define __MMIO_H__ #define __MMIO_H__
static inline void write_reg(unsigned long addr, unsigned int data) #include <stdint.h>
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; *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; return *ptr;
} }

View File

@@ -6,9 +6,9 @@
int main(void) int main(void)
{ {
write_reg(PWM_PERIOD, 20); reg_write32(PWM_PERIOD, 20);
write_reg(PWM_DUTY, 5); reg_write32(PWM_DUTY, 5);
write_reg(PWM_ENABLE, 1); reg_write32(PWM_ENABLE, 1);
return 0; return 0;
} }