mirror of https://gitee.com/openkylin/qemu.git
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);
|
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));
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue