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
This commit is contained in:
Ruslan Bukin 2016-04-22 15:12:05 +00:00
parent 6c1838e37e
commit fd3dc9f439
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=298476

View File

@ -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);