qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 08/11] ahci: add ahci emulation


From: Alexander Graf
Subject: Re: [Qemu-devel] [PATCH 08/11] ahci: add ahci emulation
Date: Tue, 23 Nov 2010 14:48:40 +0100

On 21.11.2010, at 13:54, Blue Swirl wrote:

> On Fri, Nov 19, 2010 at 2:56 AM, Alexander Graf <address@hidden> wrote:
>> 
>> +typedef struct AHCIControlRegs {
>> +    uint32_t    cap;
>> +    uint32_t    ghc;
>> +    uint32_t    irqstatus;
>> +    uint32_t    impl;
>> +    uint32_t    version;
>> +} __attribute__ ((packed)) AHCIControlRegs;
> 
> Why packed? These are used in native endian, so I'd let the compiler
> pick the best layout. Also in other structs.

Packed doesn't have too much to do with endianness, but gaps in the struct. The 
reason I made these packed is that I casted the struct to an uint32_t array and 
didn't want to have gaps there later on.

I changed that for the next version though to have explicit setters for each 
field, so we don't need it here anymore.

> 
>> +
>> +typedef struct AHCIPortRegs {
>> +    uint32_t    lst_addr;
>> +    uint32_t    lst_addr_hi;
>> +    uint32_t    fis_addr;
>> +    uint32_t    fis_addr_hi;
>> +    uint32_t    irq_stat;
>> +    uint32_t    irq_mask;
>> +    uint32_t    cmd;
>> +    uint32_t    unused0;
>> +    uint32_t    tfdata;
>> +    uint32_t    sig;
>> +    uint32_t    scr_stat;
>> +    uint32_t    scr_ctl;
>> +    uint32_t    scr_err;
>> +    uint32_t    scr_act;
>> +    uint32_t    cmd_issue;
>> +    uint32_t    reserved;
>> +} __attribute__ ((packed)) AHCIPortRegs;

Same as above for this one. I also changed it.

>> +
>> +typedef struct AHCICmdHdr {
>> +    uint32_t    opts;
>> +    uint32_t    status;
>> +    uint64_t    tbl_addr;
>> +    uint32_t    reserved[4];
>> +} __attribute__ ((packed)) AHCICmdHdr;

These have to be packed. We cast guest ram regions to this struct and then do 
leXX_to_cpu() on that variable to make sure we take host endianness into 
account. That's faster than going through the mapping logic for every single 
word. And yes, they're always LE in ram :).

>> +
>> +typedef struct AHCI_SG {
>> +    uint32_t    addr;
>> +    uint32_t    addr_hi;
>> +    uint32_t    reserved;
>> +    uint32_t    flags_size;
>> +} __attribute__ ((packed)) AHCI_SG;
>> +
>> +typedef struct AHCIDevice AHCIDevice;
>> +
>> +typedef struct NCQTransferState {
>> +    AHCIDevice *drive;
>> +    QEMUSGList sglist;
>> +    int is_read;
>> +    uint16_t sector_count;
>> +    uint64_t lba;
>> +    uint8_t tag;
>> +    int slot;
>> +    int used;
>> +} NCQTransferState;
>> +
>> +struct AHCIDevice {
>> +    IDEBus port;
>> +    BMDMAState bmdma;
>> +    int port_no;
>> +    uint32_t port_state;
>> +    uint32_t finished;
>> +    AHCIPortRegs port_regs;
>> +    struct AHCIState *hba;
>> +    uint8_t *lst;
>> +    uint8_t *res_fis;
>> +    uint8_t *cmd_fis;
>> +    int cmd_fis_len;
>> +    AHCICmdHdr *cur_cmd;
>> +    NCQTransferState ncq_tfs[AHCI_MAX_CMDS];
>> +};
>> +
>> +typedef struct AHCIState {
>> +    AHCIDevice dev[SATA_PORTS];
>> +    AHCIControlRegs control_regs;
>> +    int mem;
>> +    qemu_irq irq;
>> +} AHCIState;
>> +
>> +typedef struct AHCIPciState {
> 
> AHCIPCIState.
> 
>> +    PCIDevice card;
>> +    AHCIState ahci;
>> +} AHCIPciState;
>> +
>> +typedef struct H2D_NCQ_FIS {
> 
> This is not named according to CODING_STYLE. How about a more
> descriptive name which is not full of acronyms?

I'm open for suggestions. It's the "Host to Device Native Command Queue Frame 
Information Structure". I changed it to H2dNcqFis for now.


Alex




reply via email to

[Prev in Thread] Current Thread [Next in Thread]