From 58732810230719765a6618004be8f0070c9f3d31 Mon Sep 17 00:00:00 2001 From: Stefan Hajnoczi Date: Mon, 20 Jul 2015 12:21:18 -0400 Subject: [PATCH 1/3] qtest/ide: add another short PRDT test flavor The existing short PRDT test case does not transfer any data because the first PRD is less than 1 sector. This patch adds another short PRDT test case where the first sector can be read but the PRDT is still smaller than the requested number of sectors. This exercises a different code path in ide_dma_cb(). Cc: John Snow Signed-off-by: Stefan Hajnoczi Reviewed-by: John Snow Message-id: 1435770571-9906-1-git-send-email-stefanha@redhat.com Signed-off-by: John Snow --- tests/ide-test.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/tests/ide-test.c b/tests/ide-test.c index 78382e9c75..4a07e3a9d0 100644 --- a/tests/ide-test.c +++ b/tests/ide-test.c @@ -339,6 +339,31 @@ static void test_bmdma_short_prdt(void) assert_bit_clear(inb(IDE_BASE + reg_status), DF | ERR); } +static void test_bmdma_one_sector_short_prdt(void) +{ + uint8_t status; + + /* Read 2 sectors but only give 1 sector in PRDT */ + PrdtEntry prdt[] = { + { + .addr = 0, + .size = cpu_to_le32(0x200 | PRDT_EOT), + }, + }; + + /* Normal request */ + status = send_dma_request(CMD_READ_DMA, 0, 2, + prdt, ARRAY_SIZE(prdt)); + g_assert_cmphex(status, ==, 0); + assert_bit_clear(inb(IDE_BASE + reg_status), DF | ERR); + + /* Abort the request before it completes */ + status = send_dma_request(CMD_READ_DMA | CMDF_ABORT, 0, 2, + prdt, ARRAY_SIZE(prdt)); + g_assert_cmphex(status, ==, 0); + assert_bit_clear(inb(IDE_BASE + reg_status), DF | ERR); +} + static void test_bmdma_long_prdt(void) { uint8_t status; @@ -592,6 +617,8 @@ int main(int argc, char **argv) qtest_add_func("/ide/bmdma/setup", test_bmdma_setup); qtest_add_func("/ide/bmdma/simple_rw", test_bmdma_simple_rw); qtest_add_func("/ide/bmdma/short_prdt", test_bmdma_short_prdt); + qtest_add_func("/ide/bmdma/one_sector_short_prdt", + test_bmdma_one_sector_short_prdt); qtest_add_func("/ide/bmdma/long_prdt", test_bmdma_long_prdt); qtest_add_func("/ide/bmdma/no_busmaster", test_bmdma_no_busmaster); qtest_add_func("/ide/bmdma/teardown", test_bmdma_teardown); From 09b61db7c140c5a71bfde36614c5a1f4f0d382a6 Mon Sep 17 00:00:00 2001 From: Stefan Fritsch Date: Mon, 20 Jul 2015 12:21:18 -0400 Subject: [PATCH 2/3] ahci: Force ICC bits in PxCMD to zero The AHCI spec requires that the HBA sets the ICC bits to zero after the ICC change is done. Since we don't do any ICC change, force the bits to zero all the time. This fixes delays with some OSs (e.g. OpenBSD) waiting for the ICC bits to change to 0. Signed-off-by: Stefan Fritsch Reviewed-by: Kevin Wolf Reviewed-by: John Snow Message-id: E1ZFpg7-00027N-HW@eru.sfritsch.de Signed-off-by: John Snow --- hw/ide/ahci.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c index bb6a92f7f4..48749c1dc1 100644 --- a/hw/ide/ahci.c +++ b/hw/ide/ahci.c @@ -279,8 +279,13 @@ static void ahci_port_write(AHCIState *s, int port, int offset, uint32_t val) break; case PORT_CMD: /* Block any Read-only fields from being set; - * including LIST_ON and FIS_ON. */ - pr->cmd = (pr->cmd & PORT_CMD_RO_MASK) | (val & ~PORT_CMD_RO_MASK); + * including LIST_ON and FIS_ON. + * The spec requires to set ICC bits to zero after the ICC change + * is done. We don't support ICC state changes, therefore always + * force the ICC bits to zero. + */ + pr->cmd = (pr->cmd & PORT_CMD_RO_MASK) | + (val & ~(PORT_CMD_RO_MASK|PORT_CMD_ICC_MASK)); /* Check FIS RX and CLB engines, allow transition to false: */ ahci_cond_start_engines(&s->dev[port], true); From 47c719964a8240c99d4b7a2b4695ae026c619b83 Mon Sep 17 00:00:00 2001 From: Stefan Weil Date: Mon, 20 Jul 2015 12:21:18 -0400 Subject: [PATCH 3/3] tests: Fix broken targets check-report-qtest-* They need QTEST_QEMU_IMG. Without it, the tests raise an assertion: $ make -C bin check-report-qtest-i386.xml make: Entering directory 'bin' GTESTER check-report-qtest-i386.xml blkdebug: Suspended request 'A' blkdebug: Resuming request 'A' ahci-test: tests/libqos/libqos.c:162: mkimg: Assertion `qemu_img_path' failed. main-loop: WARNING: I/O thread spun for 1000 iterations Signed-off-by: Stefan Weil Reviewed-by: John Snow Message-id: 1437231284-17455-1-git-send-email-sw@weilnetz.de Signed-off-by: John Snow --- tests/Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/Makefile b/tests/Makefile index 2c4b8dc5ec..8d26736f1f 100644 --- a/tests/Makefile +++ b/tests/Makefile @@ -478,6 +478,7 @@ $(patsubst %, check-%, $(check-unit-y)): check-%: % $(patsubst %, check-report-qtest-%.xml, $(QTEST_TARGETS)): check-report-qtest-%.xml: $(check-qtest-y) $(call quiet-command,QTEST_QEMU_BINARY=$*-softmmu/qemu-system-$* \ + QTEST_QEMU_IMG=qemu-img$(EXESUF) \ gtester -q $(GTESTER_OPTIONS) -o $@ -m=$(SPEED) $(check-qtest-$*-y),"GTESTER $@") check-report-unit.xml: $(check-unit-y)