From patchwork Mon Dec 8 23:10:33 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kevin O'Connor X-Patchwork-Id: 418906 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id CEBB91400DE for ; Tue, 9 Dec 2014 10:13:58 +1100 (AEDT) Received: from localhost ([::1]:36570 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xy7V6-0002Mg-W2 for incoming@patchwork.ozlabs.org; Mon, 08 Dec 2014 18:13:57 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:36857) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xy7SJ-0006EO-48 for qemu-devel@nongnu.org; Mon, 08 Dec 2014 18:11:08 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1Xy7SD-0005zA-BF for qemu-devel@nongnu.org; Mon, 08 Dec 2014 18:11:03 -0500 Received: from mail-qa0-f45.google.com ([209.85.216.45]:62944) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1Xy7SD-0005z6-8S for qemu-devel@nongnu.org; Mon, 08 Dec 2014 18:10:57 -0500 Received: by mail-qa0-f45.google.com with SMTP id x12so4060002qac.32 for ; Mon, 08 Dec 2014 15:10:57 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=+Xk8lBdU9OUj8s0mVoQ7J4C03VhIzgQMfKcy4hAfxEg=; b=bc/q5+61VLgwJrCWEFmskKDEwCEDYyxGXXKkmROfsadzsF4QGF1qK+Sbo+ey9cH8nP XSVpXlGWjYpSdx5/SkfnzY8jMzpzGvD7QboyiIcwplZ4i152ajcQUXm/X317J1NjQERG uA/B4jgBoHvavXFQYJ+WjFtqLxcGdzhBBW7+DGh/KWt+vt9MVbBdyLGasERMDIh4cTXO WSMcGfnqc30OJ/Wa4KCsDq+D5q3pziDMkv6ztZ5JTyqHm3d5H8t+xtBXhS4HBe+DAJ/0 LlmKvLsvUFjxRJvsDsag3FMcZ1XP888BibHytOAOdK3scEuIjjhLS7xDWmuXFwUmQMDe lN9Q== X-Gm-Message-State: ALoCoQkFk5xBel3EyG4u/LPBtyDohMcuNCo+B+NJFO7uv34K4/eczN+44aZ/uX6emxWeto4p5j1M X-Received: by 10.140.48.1 with SMTP id n1mr55670261qga.12.1418080257013; Mon, 08 Dec 2014 15:10:57 -0800 (PST) Received: from localhost (207-172-170-53.c3-0.avec-ubr1.nyr-avec.ny.cable.rcn.com. [207.172.170.53]) by mx.google.com with ESMTPSA id i32sm39075051qgf.12.2014.12.08.15.10.55 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 08 Dec 2014 15:10:56 -0800 (PST) From: Kevin O'Connor To: qemu-devel@nongnu.org Date: Mon, 8 Dec 2014 18:10:33 -0500 Message-Id: <1418080234-31694-5-git-send-email-kevin@koconnor.net> X-Mailer: git-send-email 1.9.3 In-Reply-To: <1418080234-31694-1-git-send-email-kevin@koconnor.net> References: <1418080234-31694-1-git-send-email-kevin@koconnor.net> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 209.85.216.45 Subject: [Qemu-devel] [PATCHv3 4/5] sdhci: Support SDHCI devices on PCI X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Support for PCI devices following the "SD Host Controller Simplified Specification Version 2.00" spec. Signed-off-by: Kevin O'Connor --- default-configs/pci.mak | 2 ++ hw/sd/sdhci.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ hw/sd/sdhci.h | 9 ++++++++- 3 files changed, 54 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 f474d2b..d22740b 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_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) { 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)