Adds a test case for AHCI wherein we write a 4K
block of a changing pattern to sector 0, then
read back that 4K and compare the transmit and
receive buffers.
Signed-off-by: John Snow js...@redhat.com
---
tests/ahci-test.c | 52
1 file changed, 52 insertions(+)
diff --git a/tests/ahci-test.c b/tests/ahci-test.c
index cae94b5..1f02fa8 100644
--- a/tests/ahci-test.c
+++ b/tests/ahci-test.c
@@ -731,6 +731,45 @@ static void ahci_test_identify(AHCIQState *ahci)
g_assert_cmphex(sect_size, ==, 0x200);
}
+static void ahci_test_dma_rw_simple(AHCIQState *ahci)
+{
+uint64_t ptr;
+uint8_t px;
+unsigned i;
+const unsigned bufsize = 4096;
+unsigned char *tx = g_malloc(bufsize);
+unsigned char *rx = g_malloc0(bufsize);
+
+g_assert(ahci != NULL);
+
+/* Pick the first running port and clear it. */
+px = ahci_port_select(ahci);
+ahci_port_clear(ahci, px);
+
+/*** Create pattern and transfer to guest ***/
+/* Data buffer in the guest */
+ptr = ahci_alloc(ahci, bufsize);
+g_assert(ptr);
+
+/* Write some indicative pattern to our 4K buffer. */
+for (i = 0; i bufsize; i++) {
+tx[i] = (bufsize - i);
+}
+memwrite(ptr, tx, bufsize);
+
+/* Write this buffer to disk, then read it back to the DMA buffer. */
+ahci_guest_io(ahci, px, CMD_WRITE_DMA, ptr, bufsize);
+ahci_guest_io(ahci, px, CMD_READ_DMA, ptr, bufsize);
+
+/*** Read back the Data ***/
+memread(ptr, rx, bufsize);
+g_assert_cmphex(memcmp(tx, rx, bufsize), ==, 0);
+
+ahci_free(ahci, ptr);
+g_free(tx);
+g_free(rx);
+}
+
/**/
/* Test Interfaces
*/
/**/
@@ -811,6 +850,18 @@ static void test_identify(void)
ahci_shutdown(ahci);
}
+/**
+ * Perform a simple DMA R/W test, using a single PRD and non-NCQ commands.
+ */
+static void test_dma_rw_simple(void)
+{
+AHCIQState *ahci;
+
+ahci = ahci_macro_bootup();
+ahci_test_dma_rw_simple(ahci);
+ahci_shutdown(ahci);
+}
+
/**/
int main(int argc, char **argv)
@@ -866,6 +917,7 @@ int main(int argc, char **argv)
qtest_add_func(/ahci/hba_spec, test_hba_spec);
qtest_add_func(/ahci/hba_enable, test_hba_enable);
qtest_add_func(/ahci/identify, test_identify);
+qtest_add_func(/ahci/dma/simple, test_dma_rw_simple);
ret = g_test_run();
--
1.9.3