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:
parent
36e367261c
commit
52515766f1
@ -728,7 +728,7 @@ static void ahci_test_identify(AHCIQState *ahci)
|
||||
g_assert_cmphex(ahci_px_rreg(ahci, i, AHCI_PX_IS), ==, 0);
|
||||
|
||||
/* 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 */
|
||||
memwrite(table + 0x80, &prd, sizeof(prd));
|
||||
|
@ -464,6 +464,20 @@ void ahci_destroy_command(AHCIQState *ahci, uint8_t port, uint8_t slot)
|
||||
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 i;
|
||||
|
@ -393,7 +393,7 @@ typedef struct RegH2DFIS {
|
||||
uint8_t icc;
|
||||
uint8_t control;
|
||||
/* DW4 */
|
||||
uint32_t aux;
|
||||
uint8_t aux[4];
|
||||
} __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,
|
||||
uint8_t slot, AHCICommandHeader *cmd);
|
||||
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);
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user