From patchwork Fri Nov 21 17:39:35 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: 413126 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 D3488140192 for ; Sat, 22 Nov 2014 04:42:26 +1100 (AEDT) Received: from localhost ([::1]:41853 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XrsDx-0008IL-1X for incoming@patchwork.ozlabs.org; Fri, 21 Nov 2014 12:42:25 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35336) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XrsBY-0004oO-9I for qemu-devel@nongnu.org; Fri, 21 Nov 2014 12:40:02 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XrsBS-0000hv-Dg for qemu-devel@nongnu.org; Fri, 21 Nov 2014 12:39:56 -0500 Received: from mail-qg0-f50.google.com ([209.85.192.50]:50062) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XrsBS-0000hk-9y for qemu-devel@nongnu.org; Fri, 21 Nov 2014 12:39:50 -0500 Received: by mail-qg0-f50.google.com with SMTP id i50so837049qgf.37 for ; Fri, 21 Nov 2014 09:39:49 -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=HcVVNOl/TtWbTX4B8HmBzx5ApNBLwqBqA1+eMtkjW58=; b=R3Dsk36IBGpjtvJW3OlGPxBq8+vkjFx69QXdaZiwoDznvaV9nWIj62lDGi2cy/BnY+ TrmQRnDRmth+G8IPq8Byxqu4Xl7GTAhOz5SpyT5vq1vHvw/fXTLYWlXGzZxeCR2eSNd3 cbCgBd7yLDBlrV4ExJeHoLwRGohOzn2Yhfl0E4n31qlHbwk9NgX+ICZxywrm3XZQXyWN Deeby4AzEdt9M6pLzU2oFo+5w+tgAsbGtSEH5q1HaQp90XLvwuaGFUVnMqd8Up5i/R1f K7a48r7LS3qGEXUw5abIgmPT/dqqwhrbE84tZn8gc8BWz3eLEaVDjVvlsMsRFSt00vP5 F2jg== X-Gm-Message-State: ALoCoQmDMT6//q1pDwD+VEvDhZEPDD/X6lDo2r2LPPihzRmuqNZ2bNOre9nRUWuhn/OLC91HbT/2 X-Received: by 10.140.31.139 with SMTP id f11mr8060390qgf.30.1416591589785; Fri, 21 Nov 2014 09:39:49 -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 l11sm4201133qaj.23.2014.11.21.09.39.48 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Fri, 21 Nov 2014 09:39:48 -0800 (PST) From: Kevin O'Connor To: qemu-devel@nongnu.org Date: Fri, 21 Nov 2014 12:39:35 -0500 Message-Id: <1416591576-10341-5-git-send-email-kevin@koconnor.net> X-Mailer: git-send-email 1.9.3 In-Reply-To: <1416591576-10341-1-git-send-email-kevin@koconnor.net> References: <1416591576-10341-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.192.50 Subject: [Qemu-devel] [PATCHv2 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 fd48b8b..c4fb27c 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)