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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user