qtest/ahci: add ahci_write_fis

Similar to ahci_set_command_header, add a helper that takes an
in-memory representation of a command FIS and writes it to guest
memory, handling endianness as-needed.

Signed-off-by: John Snow <jsnow@redhat.com>
Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
Message-id: 1423158090-25580-11-git-send-email-jsnow@redhat.com
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
John Snow 2015-02-05 12:41:21 -05:00 committed by Stefan Hajnoczi
parent 36e367261c
commit 52515766f1
3 changed files with 17 additions and 2 deletions

View File

@ -728,7 +728,7 @@ static void ahci_test_identify(AHCIQState *ahci)
g_assert_cmphex(ahci_px_rreg(ahci, i, AHCI_PX_IS), ==, 0); g_assert_cmphex(ahci_px_rreg(ahci, i, AHCI_PX_IS), ==, 0);
/* Commit the Command FIS to the Command Table */ /* Commit the Command FIS to the Command Table */
memwrite(table, &fis, sizeof(fis)); ahci_write_fis(ahci, &fis, table);
/* Commit the PRD entry to the Command Table */ /* Commit the PRD entry to the Command Table */
memwrite(table + 0x80, &prd, sizeof(prd)); memwrite(table + 0x80, &prd, sizeof(prd));

View File

@ -464,6 +464,20 @@ void ahci_destroy_command(AHCIQState *ahci, uint8_t port, uint8_t slot)
ahci->port[port].prdtl[slot] = 0; ahci->port[port].prdtl[slot] = 0;
} }
void ahci_write_fis(AHCIQState *ahci, RegH2DFIS *fis, uint64_t addr)
{
RegH2DFIS tmp = *fis;
/* The auxiliary FIS fields are defined per-command and are not
* currently implemented in libqos/ahci.o, but may or may not need
* to be flipped. */
/* All other FIS fields are 8 bit and do not need to be flipped. */
tmp.count = cpu_to_le16(tmp.count);
memwrite(addr, &tmp, sizeof(tmp));
}
unsigned ahci_pick_cmd(AHCIQState *ahci, uint8_t port) unsigned ahci_pick_cmd(AHCIQState *ahci, uint8_t port)
{ {
unsigned i; unsigned i;

View File

@ -393,7 +393,7 @@ typedef struct RegH2DFIS {
uint8_t icc; uint8_t icc;
uint8_t control; uint8_t control;
/* DW4 */ /* DW4 */
uint32_t aux; uint8_t aux[4];
} __attribute__((__packed__)) RegH2DFIS; } __attribute__((__packed__)) RegH2DFIS;
/** /**
@ -515,6 +515,7 @@ void ahci_get_command_header(AHCIQState *ahci, uint8_t port,
void ahci_set_command_header(AHCIQState *ahci, uint8_t port, void ahci_set_command_header(AHCIQState *ahci, uint8_t port,
uint8_t slot, AHCICommandHeader *cmd); uint8_t slot, AHCICommandHeader *cmd);
void ahci_destroy_command(AHCIQState *ahci, uint8_t port, uint8_t slot); void ahci_destroy_command(AHCIQState *ahci, uint8_t port, uint8_t slot);
void ahci_write_fis(AHCIQState *ahci, RegH2DFIS *fis, uint64_t addr);
unsigned ahci_pick_cmd(AHCIQState *ahci, uint8_t port); unsigned ahci_pick_cmd(AHCIQState *ahci, uint8_t port);
#endif #endif