libqos/ahci: fix ahci_write_fis for ncq on ppc64
Don't try to correct the endianness of NCQ commands, which do not use any fields wider than a single byte. This corrects the /x86_64/ahci/io/ncq/simple test (and others) for ppc64 BE hosts. Reported-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: John Snow <jsnow@redhat.com> Tested-by: Peter Maydell <peter.maydell@linaro.org> Message-id: 1436210229-4118-2-git-send-email-jsnow@redhat.com
This commit is contained in:
		
							parent
							
								
									c8232b39bb
								
							
						
					
					
						commit
						9ab9993f71
					
				| @ -545,16 +545,18 @@ 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) | ||||
| void ahci_write_fis(AHCIQState *ahci, AHCICommand *cmd) | ||||
| { | ||||
|     RegH2DFIS tmp = *fis; | ||||
|     RegH2DFIS tmp = cmd->fis; | ||||
|     uint64_t addr = cmd->header.ctba; | ||||
| 
 | ||||
|     /* 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. */ | ||||
|     /* NCQ commands use exclusively 8 bit fields and needs no adjustment.
 | ||||
|      * Only the count field needs to be adjusted for non-NCQ commands. | ||||
|      * 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. */ | ||||
|     if (!cmd->props->ncq) { | ||||
|         tmp.count = cpu_to_le16(tmp.count); | ||||
|     } | ||||
| 
 | ||||
|     memwrite(addr, &tmp, sizeof(tmp)); | ||||
| } | ||||
| @ -877,7 +879,7 @@ void ahci_command_commit(AHCIQState *ahci, AHCICommand *cmd, uint8_t port) | ||||
| 
 | ||||
|     /* Commit the command header and command FIS */ | ||||
|     ahci_set_command_header(ahci, port, cmd->slot, &(cmd->header)); | ||||
|     ahci_write_fis(ahci, &(cmd->fis), table_ptr); | ||||
|     ahci_write_fis(ahci, cmd); | ||||
| 
 | ||||
|     /* Construct and write the PRDs to the command table */ | ||||
|     g_assert_cmphex(prdtl, ==, cmd->header.prdtl); | ||||
|  | ||||
| @ -548,7 +548,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); | ||||
| void ahci_write_fis(AHCIQState *ahci, AHCICommand *cmd); | ||||
| unsigned ahci_pick_cmd(AHCIQState *ahci, uint8_t port); | ||||
| unsigned size_to_prdtl(unsigned bytes, unsigned bytes_per_prd); | ||||
| void ahci_guest_io(AHCIQState *ahci, uint8_t port, uint8_t ide_cmd, | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 John Snow
						John Snow