qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: Jason Baron <jbaron@redhat.com>
Cc: aliguori@us.ibm.com, juzhang@redhat.com, mst@redhat.com,
	jan.kiszka@siemens.com, qemu-devel@nongnu.org, agraf@suse.de,
	blauwirbel@gmail.com, yamahata@valinux.co.jp,
	alex.williamson@redhat.com, kevin@koconnor.net, avi@redhat.com,
	mkletzan@redhat.com, lcapitulino@redhat.com, afaerber@suse.de,
	armbru@redhat.com, kraxel@redhat.com
Subject: Re: [Qemu-devel] [PATCH v2 02/21] blockdev: Introduce IF_AHCI
Date: Tue, 09 Oct 2012 09:36:20 +0200	[thread overview]
Message-ID: <5073D3F4.5000001@redhat.com> (raw)
In-Reply-To: <07da35180257308d6d3ade9a8d4f40c08a0eb925.1349749915.git.jbaron@redhat.com>

Il 09/10/2012 05:30, Jason Baron ha scritto:
> From: Jason Baron <jbaron@redhat.com>
> 
> Introduce IF_AHCI so that q35 can differentiate between ide and ahci disks.
> This allows q35 to specify its default disk type. It also allows q35 to
> differentiate between ahci and ide disks, such that -drive if=ide does not
> result in the creating of an ahci disk. This is important, since we don't want
> to have the meaning of if=ide changing once q35 is introduced. Thus, its
> important for this to be applied before we introduce q35.
> 
> This patch also adds:
> 
> pci_ahci_create_devs(PCIDevice *pci_dev, DriveInfo **hd_table)
> 
> Which provides a convient way of attaching ahci drives to an
> ahci controller.
> 
> Signed-off-by: Jason Baron <jbaron@redhat.com>

Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>

> ---
>  blockdev.c    |   13 ++++++++++++-
>  blockdev.h    |    2 ++
>  hw/ide.h      |    6 ++++++
>  hw/ide/ahci.c |   18 ++++++++++++++++++
>  hw/ide/core.c |   23 ++++++++++++++++++-----
>  5 files changed, 56 insertions(+), 6 deletions(-)
> 
> diff --git a/blockdev.c b/blockdev.c
> index 93a7bf7..9ccc150 100644
> --- a/blockdev.c
> +++ b/blockdev.c
> @@ -32,6 +32,7 @@ static const char *const if_name[IF_COUNT] = {
>      [IF_SD] = "sd",
>      [IF_VIRTIO] = "virtio",
>      [IF_XEN] = "xen",
> +    [IF_AHCI] = "ahci",
>  };
>  
>  static const int if_max_devs[IF_COUNT] = {
> @@ -51,8 +52,17 @@ static const int if_max_devs[IF_COUNT] = {
>       */
>      [IF_IDE] = 2,
>      [IF_SCSI] = 7,
> +    [IF_AHCI] = 6,
>  };
>  
> +int get_if_max_devs(BlockInterfaceType if_type)
> +{
> +    assert(if_type < IF_COUNT);
> +    assert(if_type >= IF_DEFAULT);
> +
> +    return if_max_devs[if_type];
> +}
> +
>  /*
>   * We automatically delete the drive when a device using it gets
>   * unplugged.  Questionable feature, but we can't just drop it.
> @@ -517,7 +527,7 @@ DriveInfo *drive_init(QemuOpts *opts, int mach_if)
>      } else {
>          /* no id supplied -> create one */
>          dinfo->id = g_malloc0(32);
> -        if (type == IF_IDE || type == IF_SCSI)
> +        if (type == IF_IDE || type == IF_SCSI || type == IF_AHCI)
>              mediastr = (media == MEDIA_CDROM) ? "-cd" : "-hd";
>          if (max_devs)
>              snprintf(dinfo->id, 32, "%s%i%s%i",
> @@ -549,6 +559,7 @@ DriveInfo *drive_init(QemuOpts *opts, int mach_if)
>  
>      switch(type) {
>      case IF_IDE:
> +    case IF_AHCI:
>      case IF_SCSI:
>      case IF_XEN:
>      case IF_NONE:
> diff --git a/blockdev.h b/blockdev.h
> index 8b126ad..bbd1017 100644
> --- a/blockdev.h
> +++ b/blockdev.h
> @@ -21,6 +21,7 @@ typedef enum {
>      IF_DEFAULT = -1,            /* for use with drive_add() only */
>      IF_NONE,
>      IF_IDE, IF_SCSI, IF_FLOPPY, IF_PFLASH, IF_MTD, IF_SD, IF_VIRTIO, IF_XEN,
> +    IF_AHCI,
>      IF_COUNT
>  } BlockInterfaceType;
>  
> @@ -56,6 +57,7 @@ static inline int get_mach_if(int mach_if)
>      return mach_if;
>  }
>  
> +int get_if_max_devs(BlockInterfaceType if_type);
>  DriveInfo *drive_get(BlockInterfaceType type, int bus, int unit);
>  DriveInfo *drive_get_by_index(BlockInterfaceType type, int index);
>  int drive_get_max_bus(BlockInterfaceType type);
> diff --git a/hw/ide.h b/hw/ide.h
> index 2db4079..0b7e000 100644
> --- a/hw/ide.h
> +++ b/hw/ide.h
> @@ -4,6 +4,7 @@
>  #include "isa.h"
>  #include "pci.h"
>  #include "memory.h"
> +#include "blockdev.h"
>  
>  #define MAX_IDE_DEVS	2
>  
> @@ -34,6 +35,11 @@ int ide_get_geometry(BusState *bus, int unit,
>  int ide_get_bios_chs_trans(BusState *bus, int unit);
>  
>  /* ide/core.c */
> +void ata_drive_get(DriveInfo **hd, int max_bus, BlockInterfaceType type);
>  void ide_drive_get(DriveInfo **hd, int max_bus);
> +void ahci_drive_get(DriveInfo **hd, int max_bus);
> +
> +/* ide/ahci.c */
> +void pci_ahci_create_devs(PCIDevice *pci_dev, DriveInfo **hd_table);
>  
>  #endif /* HW_IDE_H */
> diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c
> index 68671bc..824b86f 100644
> --- a/hw/ide/ahci.c
> +++ b/hw/ide/ahci.c
> @@ -26,6 +26,7 @@
>  #include <hw/pc.h>
>  #include <hw/pci.h>
>  #include <hw/sysbus.h>
> +#include <blockdev.h>
>  
>  #include "monitor.h"
>  #include "dma.h"
> @@ -1260,3 +1261,20 @@ static void sysbus_ahci_register_types(void)
>  }
>  
>  type_init(sysbus_ahci_register_types)
> +
> +void pci_ahci_create_devs(PCIDevice *pci_dev, DriveInfo **hd_table)
> +{
> +    struct AHCIPCIState *dev = DO_UPCAST(struct AHCIPCIState, card, pci_dev);
> +    int i;
> +    DriveInfo *drive;
> +
> +    for (i = 0; i < dev->ahci.ports; i++) {
> +        if (hd_table[i] == NULL) {
> +            continue;
> +        }
> +        drive = hd_table[i];
> +        assert(drive->type == IF_AHCI);
> +        ide_create_drive(&dev->ahci.dev[i].port, 0,
> +                         hd_table[i]);
> +    }
> +}
> diff --git a/hw/ide/core.c b/hw/ide/core.c
> index d6fb69c..f2fcc79 100644
> --- a/hw/ide/core.c
> +++ b/hw/ide/core.c
> @@ -2351,16 +2351,29 @@ const VMStateDescription vmstate_ide_bus = {
>      }
>  };
>  
> -void ide_drive_get(DriveInfo **hd, int max_bus)
> +void ata_drive_get(DriveInfo **hd, int max_bus, BlockInterfaceType type)
>  {
>      int i;
> +    int max_devs;
> +
> +    assert((type == IF_IDE) || type == IF_AHCI);
>  
> -    if (drive_get_max_bus(IF_IDE) >= max_bus) {
> +    if (drive_get_max_bus(type) >= max_bus) {
>          fprintf(stderr, "qemu: too many IDE bus: %d\n", max_bus);
>          exit(1);
>      }
> -
> -    for(i = 0; i < max_bus * MAX_IDE_DEVS; i++) {
> -        hd[i] = drive_get(IF_IDE, i / MAX_IDE_DEVS, i % MAX_IDE_DEVS);
> +    max_devs = get_if_max_devs(type);
> +    for (i = 0; i < max_bus * max_devs; i++) {
> +        hd[i] = drive_get(type, i / max_devs, i % max_devs);
>      }
>  }
> +
> +void ide_drive_get(DriveInfo **hd, int max_bus)
> +{
> +    ata_drive_get(hd, max_bus, IF_IDE);
> +}
> +
> +void ahci_drive_get(DriveInfo **hd, int max_bus)
> +{
> +    ata_drive_get(hd, max_bus, IF_AHCI);
> +}
> 

  reply	other threads:[~2012-10-09  7:36 UTC|newest]

Thread overview: 65+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-10-09  3:30 [Qemu-devel] [PATCH v2 00/21] q35 qemu support Jason Baron
2012-10-09  3:30 ` [Qemu-devel] [PATCH v2 01/21] blockdev: Introduce a default machine blockdev interface field, QEMUMachine->mach_if Jason Baron
2012-10-09  7:34   ` Paolo Bonzini
2012-10-09  3:30 ` [Qemu-devel] [PATCH v2 02/21] blockdev: Introduce IF_AHCI Jason Baron
2012-10-09  7:36   ` Paolo Bonzini [this message]
2012-10-09  3:30 ` [Qemu-devel] [PATCH v2 03/21] pci: pci capability must be in PCI space Jason Baron
2012-10-09  7:36   ` Paolo Bonzini
2012-10-13  8:29   ` Blue Swirl
2012-10-09  3:30 ` [Qemu-devel] [PATCH v2 04/21] pci: introduce pci_swizzle_map_irq_fn() for standardized interrupt pin swizzle Jason Baron
2012-10-09  7:39   ` Paolo Bonzini
2012-10-09  3:30 ` [Qemu-devel] [PATCH v2 05/21] pc, pc_piix: split out pc nic initialization Jason Baron
2012-10-09  7:39   ` Paolo Bonzini
2012-10-09  3:30 ` [Qemu-devel] [PATCH v2 06/21] pc: Move ioapic_init() from pc_piix.c to pc.c Jason Baron
2012-10-09  7:44   ` Paolo Bonzini
2012-10-09  3:30 ` [Qemu-devel] [PATCH v2 07/21] pc/piix_pci: factor out smram/pam logic Jason Baron
2012-10-09  7:47   ` Paolo Bonzini
2012-10-09  3:30 ` [Qemu-devel] [PATCH v2 08/21] pci_ids: add intel 82801BA pci-to-pci bridge id and PCI_CLASS_SERIAL_SMBUS Jason Baron
2012-10-09  7:48   ` Paolo Bonzini
2012-10-13  8:31   ` Blue Swirl
2012-10-09  3:30 ` [Qemu-devel] [PATCH v2 10/21] pcie: pass pcie window size to pcie_host_mmcfg_update() Jason Baron
2012-10-09  7:52   ` Paolo Bonzini
2012-10-09  3:30 ` [Qemu-devel] [PATCH v2 09/21] pci: Add class 0xc05 as 'SMBus' Jason Baron
2012-10-09  7:49   ` Paolo Bonzini
2012-10-09  3:30 ` [Qemu-devel] [PATCH v2 12/21] q35: Introduce q35 pc based chipset emulator Jason Baron
2012-10-11 14:47   ` Michael S. Tsirkin
2012-10-09  3:30 ` [Qemu-devel] [PATCH v2 11/21] pcie: Convert PCIExpressHost to use the QOM Jason Baron
2012-10-09  7:52   ` Paolo Bonzini
2012-10-09  3:30 ` [Qemu-devel] [PATCH v2 13/21] q35: Re-base q35 Jason Baron
2012-10-09  3:30 ` [Qemu-devel] [PATCH v2 14/21] q35: Suppress SMM BIOS initialization under KVM Jason Baron
2012-10-09  7:53   ` Paolo Bonzini
2012-10-09  3:30 ` [Qemu-devel] [PATCH v2 15/21] q35: Fix non-PCI IRQ processing in ich9_lpc_update_apic Jason Baron
2012-10-09  7:53   ` Paolo Bonzini
2012-10-09  3:30 ` [Qemu-devel] [PATCH v2 16/21] q35: smbus: Remove PCI_STATUS_SIG_SYSTEM_ERROR and PCI_STATUS_DETECTED_PARITY from w1cmask Jason Baron
2012-10-09  7:54   ` Paolo Bonzini
2012-10-11 14:53   ` Michael S. Tsirkin
2012-10-19 15:13     ` Jason Baron
2012-10-19 16:17       ` Isaku Yamahata
2012-10-09  3:30 ` [Qemu-devel] [PATCH v2 17/21] q35: Add kvmclock support Jason Baron
2012-10-09  7:54   ` Paolo Bonzini
2012-10-09  3:30 ` [Qemu-devel] [PATCH v2 19/21] Add a fallback bios file search, if -L fails Jason Baron
2012-10-09  7:59   ` Paolo Bonzini
2012-10-09  3:30 ` [Qemu-devel] [PATCH v2 18/21] q35: Fix irr initialization for slots 25..31 Jason Baron
2012-10-09  7:58   ` Paolo Bonzini
2012-10-11 14:49   ` Michael S. Tsirkin
2012-10-09  3:30 ` [Qemu-devel] [PATCH v2 20/21] q35: automatically load the q35 dsdt table Jason Baron
2012-10-09  8:02   ` Paolo Bonzini
2012-10-09  8:29     ` Paolo Bonzini
2012-10-09 20:06     ` Jason Baron
2012-10-13  8:33   ` Blue Swirl
2012-10-09  3:30 ` [Qemu-devel] [PATCH v2 21/21] q35: add acpi-based pci hotplug Jason Baron
2012-10-09  8:04   ` Paolo Bonzini
2012-10-11 10:57   ` Michael S. Tsirkin
2012-10-11 14:21     ` Jason Baron
2012-10-11 14:46       ` Michael S. Tsirkin
2012-10-11 14:54         ` Paolo Bonzini
2012-10-11 15:40           ` Jason Baron
2012-10-11 15:34         ` Jason Baron
2012-10-11 20:40           ` Michael S. Tsirkin
2012-10-12 15:27             ` Jason Baron
2012-10-13 23:03               ` Michael S. Tsirkin
2012-10-12  7:27           ` Gerd Hoffmann
2012-10-12  9:39             ` Michael S. Tsirkin
2012-10-12 10:06               ` Gerd Hoffmann
2012-10-12 10:39                 ` Michael S. Tsirkin
2012-10-12 15:00                 ` Jason Baron

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5073D3F4.5000001@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=afaerber@suse.de \
    --cc=agraf@suse.de \
    --cc=alex.williamson@redhat.com \
    --cc=aliguori@us.ibm.com \
    --cc=armbru@redhat.com \
    --cc=avi@redhat.com \
    --cc=blauwirbel@gmail.com \
    --cc=jan.kiszka@siemens.com \
    --cc=jbaron@redhat.com \
    --cc=juzhang@redhat.com \
    --cc=kevin@koconnor.net \
    --cc=kraxel@redhat.com \
    --cc=lcapitulino@redhat.com \
    --cc=mkletzan@redhat.com \
    --cc=mst@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=yamahata@valinux.co.jp \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).