[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PATCH v2 12/15] ahci: ncq migration
From: |
John Snow |
Subject: |
[Qemu-block] [PATCH v2 12/15] ahci: ncq migration |
Date: |
Wed, 1 Jul 2015 12:19:35 -0400 |
Migrate the NCQ queue. This is solely for the benefit of halted commands,
since anything else should have completed and had any relevant status
flushed to the HBA registers already.
Signed-off-by: John Snow <address@hidden>
---
hw/ide/ahci.c | 51 ++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 50 insertions(+), 1 deletion(-)
diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c
index 13b0157..a2620f6 100644
--- a/hw/ide/ahci.c
+++ b/hw/ide/ahci.c
@@ -1521,6 +1521,21 @@ void ahci_reset(AHCIState *s)
}
}
+static const VMStateDescription vmstate_ncq_tfs = {
+ .name = "ncq state",
+ .version_id = 1,
+ .fields = (VMStateField[]) {
+ VMSTATE_UINT32(sector_count, NCQTransferState),
+ VMSTATE_UINT64(lba, NCQTransferState),
+ VMSTATE_UINT8(tag, NCQTransferState),
+ VMSTATE_UINT8(cmd, NCQTransferState),
+ VMSTATE_UINT8(slot, NCQTransferState),
+ VMSTATE_BOOL(used, NCQTransferState),
+ VMSTATE_BOOL(halt, NCQTransferState),
+ VMSTATE_END_OF_LIST()
+ },
+};
+
static const VMStateDescription vmstate_ahci_device = {
.name = "ahci port",
.version_id = 1,
@@ -1546,14 +1561,17 @@ static const VMStateDescription vmstate_ahci_device = {
VMSTATE_BOOL(done_atapi_packet, AHCIDevice),
VMSTATE_INT32(busy_slot, AHCIDevice),
VMSTATE_BOOL(init_d2h_sent, AHCIDevice),
+ VMSTATE_STRUCT_ARRAY(ncq_tfs, AHCIDevice, AHCI_MAX_CMDS,
+ 1, vmstate_ncq_tfs, NCQTransferState),
VMSTATE_END_OF_LIST()
},
};
static int ahci_state_post_load(void *opaque, int version_id)
{
- int i;
+ int i, j;
struct AHCIDevice *ad;
+ NCQTransferState *ncq_tfs;
AHCIState *s = opaque;
for (i = 0; i < s->ports; i++) {
@@ -1565,6 +1583,37 @@ static int ahci_state_post_load(void *opaque, int
version_id)
return -1;
}
+ for (j = 0; j < AHCI_MAX_CMDS; j++) {
+ ncq_tfs = &ad->ncq_tfs[j];
+ ncq_tfs->drive = ad;
+
+ if (ncq_tfs->used != ncq_tfs->halt) {
+ return -1;
+ }
+ if (!ncq_tfs->halt) {
+ continue;
+ }
+ if (!is_ncq(ncq_tfs->cmd)) {
+ return -1;
+ }
+ if (ncq_tfs->slot != ncq_tfs->tag) {
+ return -1;
+ }
+ /* If ncq_tfs->halt is justly set, the engine should be engaged,
+ * and the command list buffer should be mapped. */
+ ncq_tfs->cmdh = get_cmd_header(s, i, ncq_tfs->slot);
+ if (!ncq_tfs->cmdh) {
+ return -1;
+ }
+ ahci_populate_sglist(ncq_tfs->drive, &ncq_tfs->sglist,
+ ncq_tfs->cmdh, ncq_tfs->sector_count * 512,
+ 0);
+ if (ncq_tfs->sector_count != ncq_tfs->sglist.size >> 9) {
+ return -1;
+ }
+ }
+
+
/*
* If an error is present, ad->busy_slot will be valid and not -1.
* In this case, an operation is waiting to resume and will re-check
--
2.1.0
- [Qemu-block] [PATCH v2 05/15] ahci: factor ncq_finish out of ncq_cb, (continued)
- [Qemu-block] [PATCH v2 05/15] ahci: factor ncq_finish out of ncq_cb, John Snow, 2015/07/01
- [Qemu-block] [PATCH v2 07/15] ahci: correct types in NCQTransferState, John Snow, 2015/07/01
- [Qemu-block] [PATCH v2 06/15] ahci: add rwerror=stop support for ncq, John Snow, 2015/07/01
- [Qemu-block] [PATCH v2 01/15] ide: add limit to .prepare_buf(), John Snow, 2015/07/01
- [Qemu-block] [PATCH v2 09/15] qtest/ahci: halted NCQ test, John Snow, 2015/07/01
- [Qemu-block] [PATCH v2 02/15] ahci: stash ncq command, John Snow, 2015/07/01
- [Qemu-block] [PATCH v2 10/15] ahci: add cmd header to ncq transfer state, John Snow, 2015/07/01
- [Qemu-block] [PATCH v2 08/15] ahci: correct ncq sector count, John Snow, 2015/07/01
- [Qemu-block] [PATCH v2 12/15] ahci: ncq migration,
John Snow <=
- [Qemu-block] [PATCH v2 13/15] ahci: Do not map cmd_fis to generate response, John Snow, 2015/07/01
- [Qemu-block] [PATCH v2 14/15] qtest/ahci: halted ncq migration test, John Snow, 2015/07/01
- [Qemu-block] [PATCH v2 11/15] ahci: add get_cmd_header helper, John Snow, 2015/07/01
- [Qemu-block] [PATCH v2 15/15] ahci: fix sdb fis semantics, John Snow, 2015/07/01
- Re: [Qemu-block] [PATCH v2 00/15] ahci: ncq cleanup, part 2, Stefan Hajnoczi, 2015/07/02
- Re: [Qemu-block] [Qemu-devel] [PATCH v2 00/15] ahci: ncq cleanup, part 2, John Snow, 2015/07/02