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