sdhci: Support SDHCI devices on PCI
Support for PCI devices following the "SD Host Controller Simplified Specification Version 2.00" spec. Signed-off-by: Kevin O'Connor <kevin@koconnor.net> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
ece5e5bfa1
commit
224d10ff5a
@ -30,3 +30,5 @@ CONFIG_IPACK=y
|
|||||||
CONFIG_WDT_IB6300ESB=y
|
CONFIG_WDT_IB6300ESB=y
|
||||||
CONFIG_PCI_TESTDEV=y
|
CONFIG_PCI_TESTDEV=y
|
||||||
CONFIG_NVME_PCI=y
|
CONFIG_NVME_PCI=y
|
||||||
|
CONFIG_SD=y
|
||||||
|
CONFIG_SDHCI=y
|
||||||
|
@ -1220,6 +1220,49 @@ static Property sdhci_properties[] = {
|
|||||||
DEFINE_PROP_END_OF_LIST(),
|
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_REDHAT;
|
||||||
|
k->device_id = PCI_DEVICE_ID_REDHAT_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)
|
static void sdhci_sysbus_init(Object *obj)
|
||||||
{
|
{
|
||||||
SDHCIState *s = SYSBUS_SDHCI(obj);
|
SDHCIState *s = SYSBUS_SDHCI(obj);
|
||||||
@ -1265,6 +1308,7 @@ static const TypeInfo sdhci_sysbus_info = {
|
|||||||
|
|
||||||
static void sdhci_register_types(void)
|
static void sdhci_register_types(void)
|
||||||
{
|
{
|
||||||
|
type_register_static(&sdhci_pci_info);
|
||||||
type_register_static(&sdhci_sysbus_info);
|
type_register_static(&sdhci_sysbus_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
#define SDHCI_H
|
#define SDHCI_H
|
||||||
|
|
||||||
#include "qemu-common.h"
|
#include "qemu-common.h"
|
||||||
|
#include "hw/pci/pci.h"
|
||||||
#include "hw/sysbus.h"
|
#include "hw/sysbus.h"
|
||||||
#include "hw/sd.h"
|
#include "hw/sd.h"
|
||||||
|
|
||||||
@ -232,7 +233,10 @@ enum {
|
|||||||
|
|
||||||
/* SD/MMC host controller state */
|
/* SD/MMC host controller state */
|
||||||
typedef struct SDHCIState {
|
typedef struct SDHCIState {
|
||||||
|
union {
|
||||||
|
PCIDevice pcidev;
|
||||||
SysBusDevice busdev;
|
SysBusDevice busdev;
|
||||||
|
};
|
||||||
SDState *card;
|
SDState *card;
|
||||||
MemoryRegion iomem;
|
MemoryRegion iomem;
|
||||||
|
|
||||||
@ -281,6 +285,9 @@ typedef struct SDHCIState {
|
|||||||
|
|
||||||
extern const VMStateDescription sdhci_vmstate;
|
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 TYPE_SYSBUS_SDHCI "generic-sdhci"
|
||||||
#define SYSBUS_SDHCI(obj) \
|
#define SYSBUS_SDHCI(obj) \
|
||||||
OBJECT_CHECK(SDHCIState, (obj), TYPE_SYSBUS_SDHCI)
|
OBJECT_CHECK(SDHCIState, (obj), TYPE_SYSBUS_SDHCI)
|
||||||
|
Loading…
Reference in New Issue
Block a user