summaryrefslogtreecommitdiffstats
path: root/sys/riscv
diff options
context:
space:
mode:
authorbr <br@FreeBSD.org>2016-04-22 15:12:05 +0000
committerbr <br@FreeBSD.org>2016-04-22 15:12:05 +0000
commite0ecee54992a794a8d017219a78dbcbd376a0412 (patch)
tree8cfbacde2f26bf0b61f91202ace8dafbe670a02a /sys/riscv
parent49a47991fb24943b2c775d4fdb74ddb1da796d27 (diff)
downloadFreeBSD-src-e0ecee54992a794a8d017219a78dbcbd376a0412.zip
FreeBSD-src-e0ecee54992a794a8d017219a78dbcbd376a0412.tar.gz
Add memory barriers (fence instructions) so the data wrotten by hardware
to physical address now can be read by VA. This fixes operation on Rocket Core (FPGA). Sponsored by: DARPA, AFRL Sponsored by: HEIF5
Diffstat (limited to 'sys/riscv')
-rw-r--r--sys/riscv/htif/htif_block.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/sys/riscv/htif/htif_block.c b/sys/riscv/htif/htif_block.c
index c9d2ffc..a31de1c 100644
--- a/sys/riscv/htif/htif_block.c
+++ b/sys/riscv/htif/htif_block.c
@@ -115,6 +115,7 @@ htif_blk_intr(void *arg, uint64_t entry)
data = HTIF_DEV_DATA(entry);
if (sc->curtag == data) {
+ wmb();
sc->cmd_done = 1;
wakeup(&sc->intr_chan);
} else {
@@ -198,6 +199,7 @@ htif_blk_task(void *arg)
{
struct htif_blk_request req __aligned(HTIF_ALIGN);
struct htif_blk_softc *sc;
+ uint64_t req_paddr;
struct bio *bp;
uint64_t paddr;
uint64_t cmd;
@@ -217,11 +219,13 @@ htif_blk_task(void *arg)
if (bp->bio_cmd == BIO_READ || bp->bio_cmd == BIO_WRITE) {
HTIF_BLK_LOCK(sc);
+ rmb();
req.offset = (bp->bio_pblkno * sc->disk->d_sectorsize);
req.size = bp->bio_bcount;
paddr = vtophys(bp->bio_data);
KASSERT(paddr != 0, ("paddr is 0"));
req.addr = paddr;
+ sc->curtag++;
req.tag = sc->curtag;
cmd = sc->index;
@@ -230,9 +234,9 @@ htif_blk_task(void *arg)
cmd |= (HTIF_CMD_READ << HTIF_CMD_SHIFT);
else
cmd |= (HTIF_CMD_WRITE << HTIF_CMD_SHIFT);
- paddr = vtophys(&req);
- KASSERT(paddr != 0, ("paddr is 0"));
- cmd |= paddr;
+ req_paddr = vtophys(&req);
+ KASSERT(req_paddr != 0, ("req_paddr is 0"));
+ cmd |= req_paddr;
sc->cmd_done = 0;
htif_command(cmd);
OpenPOWER on IntegriCloud