This patch adds support for AHCI emulation. I have tested and verified it works in Linux, OpenBSD, Windows Vista and Windows 7. This AHCI emulation supports NCQ, so multiple read or write requests can be outstanding at the same time.
The code is however not fully optimized yet. I'm fairly sure that there are low hanging performance fruits to be found still :). In my simple benchmarks I achieved about 2/3rd of virtio performance. Also, this AHCI emulation layer does not support legacy mode. So if you're using a disk with this emulation, you do not get it exposed using the legacy IDE interfaces. Another nitpick is CD-ROM support in Windows. Somehow it doesn't detect a CD-ROM drive attached to AHCI. At least it doesn't list it. To attach an AHCI disk to your VM, please use -drive file=...,if=sata This should do the trick for x86. On other platforms, you need to add the ahci host controller using -device and add CONFIG_AHCI to its default config. Big endian hosts are still broken due to qemu shortcomings in mmio handing. Expect patches to follow. This patch set is based on work done during the Google Summer of Code. I was mentoring a student, Roland Elek, who wrote most of the AHCI emulation code based on a patch from Chong Qiao. A bunch of other people were also involved, so everybody who I didn't mention - thanks a lot! git://repo.or.cz/qemu/ahci.git ahci v1 -> v2: - rename IDEExtender to IDEBusOps and make a pointer (kraxel) - make dma hooks explicit by putting them into ops struct (stefanha) - use qdev buses (kraxel) - minor cleanups - dprintf overhaul - add reset function v2 -> v3: - add msi support (kraxel) - use MIN macro (kraxel) - add msi support (kraxel) - fix ncq with multiple ports - zap qdev properties (kraxel) - redesign legacy IF_SATA hooks (kraxel) - don't build ahci as part of target - move to ide/ (kwolf) v3 -> v4: - prepare for endianness safety - add lspci dump (herbszt) - use ich7 instead of ich7m (herbszt) - fix lst+fis mapping (kraxel) - coding style (blue swirl) - explicit mmio setters/getters (blue swirl) - split pata code out to pata.c (kwolf) - only include config-devices.h in machine description (blue swirl) v4 -> v5: - s/H2dNcqFis/NCQFrame/g (blue swirl) - redo -drive magic (blue swirl) - bump BAR to 4k - rename ICH7_AHCI to ICH7_AHCI_RAID (herbszt) - drop device config header (blue swirl) v5 -> v6: - PCI config space fixes (isaku) - remove CONFIG_AHCI from x86 default configs (paul brook) - use snprintf (blue swirl) - add generic PCI config file (paul brook) - build ahci on all PCI platforms (paul brook) Alexander Graf (11): ide: split ide command interpretation off ide: fix whitespace gap in ide_exec_cmd ide: add DMA hooks to bus ops pci: add storage class for sata pci: add ich7 pci id ahci: add ahci emulation ahci: add -drive support ahci: spawn controller on demand ide: move pata specific parts to pata.c config: add generic pci config file config: add ahci for pci capable machines Roland Elek (2): ide: add support for ide bus ops ide: add ncq identify data for ahci sata drives Makefile | 13 +- Makefile.objs | 3 +- blockdev.c | 41 +- blockdev.h | 2 + create_config_mak | 19 + default-configs/i386-softmmu.mak | 2 + default-configs/mips-softmmu.mak | 2 + default-configs/mips64-softmmu.mak | 2 + default-configs/mips64el-softmmu.mak | 2 + default-configs/mipsel-softmmu.mak | 2 + default-configs/pci-devices.mak | 3 + default-configs/ppc-softmmu.mak | 2 + default-configs/ppc64-softmmu.mak | 2 + default-configs/ppcemb-softmmu.mak | 2 + default-configs/sparc64-softmmu.mak | 2 + default-configs/x86_64-softmmu.mak | 2 + hw/ide/ahci.c | 1380 ++++++++++++++++++++++++++++++++++ hw/ide/core.c | 874 ++++++++++------------ hw/ide/internal.h | 37 +- hw/ide/pata.c | 178 +++++ hw/pci.h | 1 + hw/pci_ids.h | 1 + qemu-common.h | 2 +- vl.c | 2 + 24 files changed, 2082 insertions(+), 494 deletions(-) create mode 100755 create_config_mak create mode 100644 default-configs/pci-devices.mak create mode 100644 hw/ide/ahci.c create mode 100644 hw/ide/pata.c