All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: Kevin O'Connor <kevin@koconnor.net>, qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 3/4] sdhci: Support SDHCI devices on PCI
Date: Tue, 18 Nov 2014 07:27:24 +0100	[thread overview]
Message-ID: <546AE6CC.7040606@redhat.com> (raw)
In-Reply-To: <1416284800-2759-4-git-send-email-kevin@koconnor.net>

On 18/11/2014 05:26, Kevin O'Connor wrote:
> Support for PCI devices following the "SD Host Controller Simplified
> Specification Version 2.00" spec.
> 
> Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
> ---
>  default-configs/pci.mak  |  2 ++
>  hw/sd/sdhci.c            | 44 ++++++++++++++++++++++++++++++++++++++++++++
>  hw/sd/sdhci.h            |  9 ++++++++-
>  include/hw/pci/pci.h     |  1 +
>  include/hw/pci/pci_ids.h |  1 +
>  5 files changed, 56 insertions(+), 1 deletion(-)
> 
> diff --git a/default-configs/pci.mak b/default-configs/pci.mak
> index 91b1e92..a186c39 100644
> --- a/default-configs/pci.mak
> +++ b/default-configs/pci.mak
> @@ -30,3 +30,5 @@ CONFIG_IPACK=y
>  CONFIG_WDT_IB6300ESB=y
>  CONFIG_PCI_TESTDEV=y
>  CONFIG_NVME_PCI=y
> +CONFIG_SD=y
> +CONFIG_SDHCI=y
> diff --git a/hw/sd/sdhci.c b/hw/sd/sdhci.c
> index 05b0c50..55709da 100644
> --- a/hw/sd/sdhci.c
> +++ b/hw/sd/sdhci.c
> @@ -1220,6 +1220,49 @@ static Property sdhci_properties[] = {
>      DEFINE_PROP_END_OF_LIST(),
>  };
>  
> +static int sdhci_pci_init(PCIDevice *dev)
> +{
> +    SDHCIState *s = PCI_SDHCI(dev);
> +    dev->config[PCI_CLASS_PROG] = 0x01; /* Standard Host supported DMA */
> +    dev->config[PCI_INTERRUPT_PIN] = 0x01; /* interrupt pin A */
> +    sdhci_initfn(s);
> +    s->buf_maxsz = sdhci_get_fifolen(s);
> +    s->fifo_buffer = g_malloc0(s->buf_maxsz);
> +    s->irq = pci_allocate_irq(dev);
> +    memory_region_init_io(&s->iomem, OBJECT(s), &sdhci_mmio_ops, s, "sdhci",
> +            SDHC_REGISTERS_MAP_SIZE);
> +    pci_register_bar(dev, 0, 0, &s->iomem);
> +    return 0;
> +}
> +
> +static void sdhci_pci_exit(PCIDevice *dev)
> +{
> +    SDHCIState *s = PCI_SDHCI(dev);
> +    sdhci_uninitfn(s);
> +}
> +
> +static void sdhci_pci_class_init(ObjectClass *klass, void *data)
> +{
> +    DeviceClass *dc = DEVICE_CLASS(klass);
> +    PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
> +
> +    k->init = sdhci_pci_init;
> +    k->exit = sdhci_pci_exit;
> +    k->vendor_id = PCI_VENDOR_ID_QEMU;
> +    k->device_id = PCI_DEVICE_ID_SDHCI;
> +    k->class_id = PCI_CLASS_SYSTEM_SDHCI;
> +    set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
> +    dc->vmsd = &sdhci_vmstate;
> +    dc->props = sdhci_properties;
> +}
> +
> +static const TypeInfo sdhci_pci_info = {
> +    .name = TYPE_PCI_SDHCI,
> +    .parent = TYPE_PCI_DEVICE,
> +    .instance_size = sizeof(SDHCIState),
> +    .class_init = sdhci_pci_class_init,
> +};
> +
>  static void sdhci_sysbus_init(Object *obj)
>  {
>      SDHCIState *s = SYSBUS_SDHCI(obj);
> @@ -1265,6 +1308,7 @@ static const TypeInfo sdhci_sysbus_info = {
>  
>  static void sdhci_register_types(void)
>  {
> +    type_register_static(&sdhci_pci_info);
>      type_register_static(&sdhci_sysbus_info);
>  }
>  
> diff --git a/hw/sd/sdhci.h b/hw/sd/sdhci.h
> index 9fbf682..3352d23 100644
> --- a/hw/sd/sdhci.h
> +++ b/hw/sd/sdhci.h
> @@ -26,6 +26,7 @@
>  #define SDHCI_H
>  
>  #include "qemu-common.h"
> +#include "hw/pci/pci.h"
>  #include "hw/sysbus.h"
>  #include "hw/sd.h"
>  
> @@ -232,7 +233,10 @@ enum {
>  
>  /* SD/MMC host controller state */
>  typedef struct SDHCIState {
> -    SysBusDevice busdev;
> +    union {
> +        PCIDevice pcidev;
> +        SysBusDevice busdev;
> +    };
>      SDState *card;
>      MemoryRegion iomem;
>  
> @@ -281,6 +285,9 @@ typedef struct SDHCIState {
>  
>  extern const VMStateDescription sdhci_vmstate;
>  
> +#define TYPE_PCI_SDHCI "sdhci-pci"
> +#define PCI_SDHCI(obj) OBJECT_CHECK(SDHCIState, (obj), TYPE_PCI_SDHCI)
> +
>  #define TYPE_SYSBUS_SDHCI "generic-sdhci"
>  #define SYSBUS_SDHCI(obj)                               \
>       OBJECT_CHECK(SDHCIState, (obj), TYPE_SYSBUS_SDHCI)
> diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h
> index c352c7b..fae77cb 100644
> --- a/include/hw/pci/pci.h
> +++ b/include/hw/pci/pci.h
> @@ -53,6 +53,7 @@
>  /* QEMU/Bochs VGA (0x1234) */
>  #define PCI_VENDOR_ID_QEMU               0x1234
>  #define PCI_DEVICE_ID_QEMU_VGA           0x1111
> +#define PCI_DEVICE_ID_SDHCI              0x2222

0x1234 is not a registered PCI id, and it's only used for VGA for
backwards-compatibility reasons.

Please use 1b36:0005 instead, and document it in docs/specs/pci-ids.txt,
or use a real-world PCI vendor/device pair (if you can find one that
Linux doesn't have quirks for; that could be hard).

Paolo

>  
>  /* VMWare (0x15ad) */
>  #define PCI_VENDOR_ID_VMWARE             0x15ad
> diff --git a/include/hw/pci/pci_ids.h b/include/hw/pci/pci_ids.h
> index 321d622..d7be386 100644
> --- a/include/hw/pci/pci_ids.h
> +++ b/include/hw/pci/pci_ids.h
> @@ -31,6 +31,7 @@
>  
>  #define PCI_CLASS_MEMORY_RAM             0x0500
>  
> +#define PCI_CLASS_SYSTEM_SDHCI           0x0805
>  #define PCI_CLASS_SYSTEM_OTHER           0x0880
>  
>  #define PCI_CLASS_SERIAL_USB             0x0c03
> 

  reply	other threads:[~2014-11-18  6:27 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-11-18  4:26 [Qemu-devel] [RFC][PATCH 0/4] Add support for SDHCI PCI devices Kevin O'Connor
2014-11-18  4:26 ` [Qemu-devel] [PATCH 1/4] sdhci: Remove class "virtual" methods Kevin O'Connor
2014-11-18  4:26 ` [Qemu-devel] [PATCH 2/4] sdhci: Add "sysbus" to sdhci QOM types and methods Kevin O'Connor
2014-11-18  4:26 ` [Qemu-devel] [PATCH 3/4] sdhci: Support SDHCI devices on PCI Kevin O'Connor
2014-11-18  6:27   ` Paolo Bonzini [this message]
2014-11-20 17:03     ` Kevin O'Connor
2014-11-21  7:20       ` Gerd Hoffmann
2014-11-21 11:56         ` Paolo Bonzini
2014-11-18  4:26 ` [Qemu-devel] [PATCH 4/4] sdhci: Set a default frequency clock Kevin O'Connor

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=546AE6CC.7040606@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=kevin@koconnor.net \
    --cc=qemu-devel@nongnu.org \
    /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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.