Skip to content

Commit 224d10f

Browse files
KevinOConnorbonzini
authored andcommitted
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 <[email protected]> Signed-off-by: Paolo Bonzini <[email protected]>
1 parent ece5e5b commit 224d10f

File tree

3 files changed

+54
-1
lines changed

3 files changed

+54
-1
lines changed

default-configs/pci.mak

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,3 +30,5 @@ CONFIG_IPACK=y
3030
CONFIG_WDT_IB6300ESB=y
3131
CONFIG_PCI_TESTDEV=y
3232
CONFIG_NVME_PCI=y
33+
CONFIG_SD=y
34+
CONFIG_SDHCI=y

hw/sd/sdhci.c

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1220,6 +1220,49 @@ static Property sdhci_properties[] = {
12201220
DEFINE_PROP_END_OF_LIST(),
12211221
};
12221222

1223+
static int sdhci_pci_init(PCIDevice *dev)
1224+
{
1225+
SDHCIState *s = PCI_SDHCI(dev);
1226+
dev->config[PCI_CLASS_PROG] = 0x01; /* Standard Host supported DMA */
1227+
dev->config[PCI_INTERRUPT_PIN] = 0x01; /* interrupt pin A */
1228+
sdhci_initfn(s);
1229+
s->buf_maxsz = sdhci_get_fifolen(s);
1230+
s->fifo_buffer = g_malloc0(s->buf_maxsz);
1231+
s->irq = pci_allocate_irq(dev);
1232+
memory_region_init_io(&s->iomem, OBJECT(s), &sdhci_mmio_ops, s, "sdhci",
1233+
SDHC_REGISTERS_MAP_SIZE);
1234+
pci_register_bar(dev, 0, 0, &s->iomem);
1235+
return 0;
1236+
}
1237+
1238+
static void sdhci_pci_exit(PCIDevice *dev)
1239+
{
1240+
SDHCIState *s = PCI_SDHCI(dev);
1241+
sdhci_uninitfn(s);
1242+
}
1243+
1244+
static void sdhci_pci_class_init(ObjectClass *klass, void *data)
1245+
{
1246+
DeviceClass *dc = DEVICE_CLASS(klass);
1247+
PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
1248+
1249+
k->init = sdhci_pci_init;
1250+
k->exit = sdhci_pci_exit;
1251+
k->vendor_id = PCI_VENDOR_ID_REDHAT;
1252+
k->device_id = PCI_DEVICE_ID_REDHAT_SDHCI;
1253+
k->class_id = PCI_CLASS_SYSTEM_SDHCI;
1254+
set_bit(DEVICE_CATEGORY_STORAGE, dc->categories);
1255+
dc->vmsd = &sdhci_vmstate;
1256+
dc->props = sdhci_properties;
1257+
}
1258+
1259+
static const TypeInfo sdhci_pci_info = {
1260+
.name = TYPE_PCI_SDHCI,
1261+
.parent = TYPE_PCI_DEVICE,
1262+
.instance_size = sizeof(SDHCIState),
1263+
.class_init = sdhci_pci_class_init,
1264+
};
1265+
12231266
static void sdhci_sysbus_init(Object *obj)
12241267
{
12251268
SDHCIState *s = SYSBUS_SDHCI(obj);
@@ -1265,6 +1308,7 @@ static const TypeInfo sdhci_sysbus_info = {
12651308

12661309
static void sdhci_register_types(void)
12671310
{
1311+
type_register_static(&sdhci_pci_info);
12681312
type_register_static(&sdhci_sysbus_info);
12691313
}
12701314

hw/sd/sdhci.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#define SDHCI_H
2727

2828
#include "qemu-common.h"
29+
#include "hw/pci/pci.h"
2930
#include "hw/sysbus.h"
3031
#include "hw/sd.h"
3132

@@ -232,7 +233,10 @@ enum {
232233

233234
/* SD/MMC host controller state */
234235
typedef struct SDHCIState {
235-
SysBusDevice busdev;
236+
union {
237+
PCIDevice pcidev;
238+
SysBusDevice busdev;
239+
};
236240
SDState *card;
237241
MemoryRegion iomem;
238242

@@ -281,6 +285,9 @@ typedef struct SDHCIState {
281285

282286
extern const VMStateDescription sdhci_vmstate;
283287

288+
#define TYPE_PCI_SDHCI "sdhci-pci"
289+
#define PCI_SDHCI(obj) OBJECT_CHECK(SDHCIState, (obj), TYPE_PCI_SDHCI)
290+
284291
#define TYPE_SYSBUS_SDHCI "generic-sdhci"
285292
#define SYSBUS_SDHCI(obj) \
286293
OBJECT_CHECK(SDHCIState, (obj), TYPE_SYSBUS_SDHCI)

0 commit comments

Comments
 (0)