@samitouri / QOSamiQemu / commits / 92854c9c75

ide-test: Factor out wait_dma_completion()

Signed-off-by: Kevin Wolf <kwolf@redhat.com> Message-ID: <20260421161132.99878-7-kwolf@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>

Kevin Wolf committed Apr 21, 2026 at 18:11 UTC 92854c9c7539bdbf4f9c1abb33dd3ba59ff91e58
1 file changed +29 -19
tests/qtest/ide-test.c
+29 -19
@@ -200,6 +200,34 @@ static uint64_t trim_range_le(uint64_t sector, uint16_t count)
200 return cpu_to_le64(((uint64_t)count << 48) + sector);
201 }
202
203 +static uint8_t wait_dma_completion(QTestState *qts, QPCIDevice *dev,
204 + QPCIBar bmdma_bar, QPCIBar ide_bar)
205 +{
206 + uint8_t status;
207 +
208 + /* Wait for the DMA transfer to complete */
209 + do {
210 + status = qpci_io_readb(dev, bmdma_bar, bmreg_status);
211 + } while ((status & (BM_STS_ACTIVE | BM_STS_INTR)) == BM_STS_ACTIVE);
212 +
213 + g_assert_cmpint(qtest_get_irq(qts, IDE_PRIMARY_IRQ), ==,
214 + !!(status & BM_STS_INTR));
215 +
216 + /* Check IDE status code */
217 + assert_bit_set(qpci_io_readb(dev, ide_bar, reg_status), DRDY);
218 + assert_bit_clear(qpci_io_readb(dev, ide_bar, reg_status), BSY | DRQ);
219 +
220 + /* Reading the status register clears the IRQ */
221 + g_assert(!qtest_get_irq(qts, IDE_PRIMARY_IRQ));
222 +
223 + /* Stop DMA transfer if still active */
224 + if (status & BM_STS_ACTIVE) {
225 + qpci_io_writeb(dev, bmdma_bar, bmreg_cmd, 0);
226 + }
227 +
228 + return status;
229 +}
230 +
231 static int send_dma_request(QTestState *qts, int cmd, uint64_t sector,
232 int nb_sectors, PrdtEntry *prdt, int prdt_entries,
233 void(*post_exec)(QPCIDevice *dev, QPCIBar ide_bar,
@@ -280,25 +308,7 @@ static int send_dma_request(QTestState *qts, int cmd, uint64_t sector,
308 qpci_io_writeb(dev, bmdma_bar, bmreg_cmd, 0);
309 }
310
283 - /* Wait for the DMA transfer to complete */
284 - do {
285 - status = qpci_io_readb(dev, bmdma_bar, bmreg_status);
286 - } while ((status & (BM_STS_ACTIVE | BM_STS_INTR)) == BM_STS_ACTIVE);
287 -
288 - g_assert_cmpint(qtest_get_irq(qts, IDE_PRIMARY_IRQ), ==,
289 - !!(status & BM_STS_INTR));
290 -
291 - /* Check IDE status code */
292 - assert_bit_set(qpci_io_readb(dev, ide_bar, reg_status), DRDY);
293 - assert_bit_clear(qpci_io_readb(dev, ide_bar, reg_status), BSY | DRQ);
294 -
295 - /* Reading the status register clears the IRQ */
296 - g_assert(!qtest_get_irq(qts, IDE_PRIMARY_IRQ));
297 -
298 - /* Stop DMA transfer if still active */
299 - if (status & BM_STS_ACTIVE) {
300 - qpci_io_writeb(dev, bmdma_bar, bmreg_cmd, 0);
301 - }
311 + status = wait_dma_completion(qts, dev, bmdma_bar, ide_bar);
312
313 free_pci_device(dev);
314