From 31f5fc98e4095c1a8b0f68e34f652c02d3236164 Mon Sep 17 00:00:00 2001 From: Howard Mao Date: Fri, 23 Jun 2017 22:50:54 -0700 Subject: [PATCH] fix multi-tracker block device --- src/main/scala/blkdev/Configs.scala | 12 ++++ src/main/scala/blkdev/TestHarness.scala | 9 ++- testchipip | 2 +- tests/Makefile | 2 +- tests/blkdev.c | 78 +++++++++++++++---------- 5 files changed, 68 insertions(+), 35 deletions(-) diff --git a/src/main/scala/blkdev/Configs.scala b/src/main/scala/blkdev/Configs.scala index 43c67593..c7eefa70 100644 --- a/src/main/scala/blkdev/Configs.scala +++ b/src/main/scala/blkdev/Configs.scala @@ -4,6 +4,18 @@ import config.{Parameters, Config} import example.DefaultExampleConfig import testchipip.{WithBlockDevice, WithNBlockDeviceTrackers} +class WithSimBlockDevice extends Config((site, here, up) => { + case UseSimBlockDevice => true +}) + +class WithBlockDeviceModel extends Config((site, here, up) => { + case UseSimBlockDevice => false +}) + class BlockDeviceConfig extends Config( + new WithSimBlockDevice ++ new WithBlockDevice ++ new DefaultExampleConfig) + +class WithTwoTrackers extends WithNBlockDeviceTrackers(2) +class WithFourTrackers extends WithNBlockDeviceTrackers(4) diff --git a/src/main/scala/blkdev/TestHarness.scala b/src/main/scala/blkdev/TestHarness.scala index 0b8bab23..b948ca44 100644 --- a/src/main/scala/blkdev/TestHarness.scala +++ b/src/main/scala/blkdev/TestHarness.scala @@ -2,10 +2,12 @@ package blkdev import diplomacy.LazyModule import chisel3._ -import config.Parameters +import config.{Parameters, Field} import testchipip.GeneratorApp import example._ +case object UseSimBlockDevice extends Field[Boolean] + class TestHarness(implicit p: Parameters) extends Module { val io = IO(new Bundle { val success = Output(Bool()) @@ -13,7 +15,10 @@ class TestHarness(implicit p: Parameters) extends Module { val dut = Module(LazyModule(new ExampleTopWithBlockDevice).module) dut.connectSimAXIMem() - dut.connectSimBlockDevice() + if (p(UseSimBlockDevice)) + dut.connectSimBlockDevice() + else + dut.connectBlockDeviceModel() io.success := dut.connectSimSerial() } diff --git a/testchipip b/testchipip index e8a16be9..99eb48a0 160000 --- a/testchipip +++ b/testchipip @@ -1 +1 @@ -Subproject commit e8a16be9b71535a2dd8258a90dec227c7ded17ca +Subproject commit 99eb48a02b161c05bef6fdc4eb07f7040bae9390 diff --git a/tests/Makefile b/tests/Makefile index 91a0da0d..edabb264 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -1,6 +1,6 @@ GCC=riscv64-unknown-elf-gcc OBJDUMP=riscv64-unknown-elf-objdump -CFLAGS=-mcmodel=medany -std=gnu99 -O2 -fno-common -fno-builtin-printf +CFLAGS=-mcmodel=medany -std=gnu99 -O2 -fno-common -fno-builtin-printf -Wall LDFLAGS=-static -nostdlib -nostartfiles -lgcc PROGRAMS = pwm blkdev accum charcount diff --git a/tests/blkdev.c b/tests/blkdev.c index 6e882726..9f3b6011 100644 --- a/tests/blkdev.c +++ b/tests/blkdev.c @@ -27,42 +27,65 @@ size_t blkdev_max_req_len(void) return read_reg(BLKDEV_MAX_REQUEST_LENGTH); } -int blkdev_read(void *addr, unsigned long offset, size_t nsectors) +void blkdev_read(void *addr, unsigned long offset, size_t nsectors) { - int req_tag, resp_tag; + int req_tag, resp_tag, ntags, i; + size_t nsectors_per_tag; - write_reg(BLKDEV_ADDR, (unsigned long) addr); - write_reg(BLKDEV_OFFSET, offset); - write_reg(BLKDEV_LEN, nsectors); - write_reg(BLKDEV_WRITE, 0); + ntags = read_reg(BLKDEV_NREQUEST); + nsectors_per_tag = nsectors / ntags; - while (read_reg(BLKDEV_NREQUEST) == 0); - req_tag = read_reg(BLKDEV_REQUEST); + printf("sending %d reads\n", ntags); - while (read_reg(BLKDEV_NCOMPLETE) == 0); + 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); - resp_tag = read_reg(BLKDEV_COMPLETE); - return (resp_tag == req_tag) ? 0 : -1; + req_tag = read_reg(BLKDEV_REQUEST); + addr += (nsectors_per_tag << BLKDEV_SECTOR_SHIFT); + offset += nsectors_per_tag; + } + + while (read_reg(BLKDEV_NCOMPLETE) < ntags); + + for (i = 0; i < ntags; i++) { + resp_tag = read_reg(BLKDEV_COMPLETE); + printf("completed read %d\n", resp_tag); + } } -int blkdev_write(unsigned long offset, void *addr, size_t nsectors) +void blkdev_write(unsigned long offset, void *addr, size_t nsectors) { - int req_tag, resp_tag; + int req_tag, resp_tag, ntags, i; + size_t nsectors_per_tag; - write_reg(BLKDEV_ADDR, (unsigned long) addr); - write_reg(BLKDEV_OFFSET, offset); - write_reg(BLKDEV_LEN, nsectors); - write_reg(BLKDEV_WRITE, 1); + ntags = read_reg(BLKDEV_NREQUEST); + nsectors_per_tag = nsectors / ntags; - req_tag = read_reg(BLKDEV_REQUEST); + printf("sending %d writes\n", ntags); - while (read_reg(BLKDEV_NCOMPLETE) == 0); + 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); - resp_tag = read_reg(BLKDEV_COMPLETE); - return (resp_tag == req_tag) ? 0 : -1; + req_tag = read_reg(BLKDEV_REQUEST); + addr += (nsectors_per_tag << BLKDEV_SECTOR_SHIFT); + offset += nsectors_per_tag; + } + + while (read_reg(BLKDEV_NCOMPLETE) < ntags); + + for (i = 0; i < ntags; i++) { + resp_tag = read_reg(BLKDEV_COMPLETE); + printf("completed write %d\n", resp_tag); + } } -#define TEST_NSECTORS 2 +#define TEST_NSECTORS 4 #define TEST_SIZE (TEST_NSECTORS * BLKDEV_SECTOR_SIZE / sizeof(int)) unsigned int test_data[TEST_SIZE]; @@ -94,15 +117,8 @@ int main(void) asm volatile ("fence"); - if (blkdev_write(0, (void *) test_data, TEST_NSECTORS)) { - printf("write error\n"); - return 1; - } - - if (blkdev_read((void *) res_data, 0, TEST_NSECTORS)) { - printf("read error\n"); - return 1; - } + blkdev_write(0, (void *) test_data, TEST_NSECTORS); + blkdev_read((void *) res_data, 0, TEST_NSECTORS); for (int i = 0; i < TEST_SIZE; i++) { if (test_data[i] != res_data[i]) {