Patchwork [v8,3/6] ahci: add support for non-PCI based controllers

login
register
mail settings
Submitter Mark Langsdorf
Date Jan. 11, 2012, 3:26 p.m.
Message ID <1326295570-10060-4-git-send-email-mark.langsdorf@calxeda.com>
Download mbox | patch
Permalink /patch/135408/
State New
Headers show

Comments

Mark Langsdorf - Jan. 11, 2012, 3:26 p.m.
From: Rob Herring <rob.herring@calxeda.com>

Add support for ahci on sysbus.

Signed-off-by: Rob Herring <rob.herring@calxeda.com>
Signed-off-by: Mark Langsdorf <mark.langsdorf@calxeda.com>
Reviewed-by: Andreas Färber <afaerber@suse.de>
---
Changes from v7
	None
Changes from v5, v6
        Skipped
Changes from v4
        replaced all references to Plat|plat_ with sysbus_
        made the number of ports into a qdev property
        added dummy migration support
Changes from v3
        Renamed plat-ahci to sysbus-ahci
Changes from v1, v2
        Corrected indentation of PlatAHCIState members
        Made plat_ahci_info into a single structure, not a list

 hw/ide/ahci.c |   44 ++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 44 insertions(+), 0 deletions(-)

Patch

diff --git a/hw/ide/ahci.c b/hw/ide/ahci.c
index 135d0ee..a3bd4b8 100644
--- a/hw/ide/ahci.c
+++ b/hw/ide/ahci.c
@@ -25,6 +25,7 @@ 
 #include <hw/msi.h>
 #include <hw/pc.h>
 #include <hw/pci.h>
+#include <hw/sysbus.h>
 
 #include "monitor.h"
 #include "dma.h"
@@ -1214,3 +1215,46 @@  void ahci_reset(void *opaque)
         ahci_reset_port(s, i);
     }
 }
+
+typedef struct sysbus_ahci_state {
+    SysBusDevice busdev;
+    AHCIState ahci;
+    uint32_t num_ports;
+} sysbus_ahci_state;
+
+static const VMStateDescription vmstate_sysbus_ahci = {
+    .name = "sysbus-ahci",
+    .unmigratable = 1,
+};
+
+static int sysbus_ahci_init(SysBusDevice *dev)
+{
+    sysbus_ahci_state *s = FROM_SYSBUS(sysbus_ahci_state, dev);
+    ahci_init(&s->ahci, &dev->qdev, s->num_ports);
+
+    sysbus_init_mmio(dev, &s->ahci.mem);
+    sysbus_init_irq(dev, &s->ahci.irq);
+
+    qemu_register_reset(ahci_reset, &s->ahci);
+    return 0;
+}
+
+static SysBusDeviceInfo sysbus_ahci_info = {
+    .qdev.name    = "sysbus-ahci",
+    .qdev.size    = sizeof(sysbus_ahci_state),
+    .qdev.vmsd    = &vmstate_sysbus_ahci,
+    .qdev.props = (Property[]) {
+        DEFINE_PROP_UINT32("num-ports", sysbus_ahci_state, num_ports, 1),
+        DEFINE_PROP_END_OF_LIST(),
+    },
+    .init         = sysbus_ahci_init,
+
+
+};
+
+static void sysbus_ahci_register(void)
+{
+    sysbus_register_withprop(&sysbus_ahci_info);
+}
+
+device_init(sysbus_ahci_register);