separate mmio read/write functions by size
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
22
tests/mmio.h
22
tests/mmio.h
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user