Re: [Qemu-devel] [PATCH 19/19] qtest/ahci: Adding simple dma read-write test

2015-02-02 Thread Paolo Bonzini


On 30/01/2015 19:42, John Snow wrote:
 +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);

I would qmemset the buffer here.

Paolo

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



[Qemu-devel] [PATCH 19/19] qtest/ahci: Adding simple dma read-write test

2015-01-30 Thread John Snow
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