From patchwork Tue Nov 18 04:26:39 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: 411905 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 2BB2314011E for ; Tue, 18 Nov 2014 15:30:20 +1100 (AEDT) Received: from localhost ([::1]:51273 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XqaQk-00048N-4N for incoming@patchwork.ozlabs.org; Mon, 17 Nov 2014 23:30:18 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:42213) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XqaNq-0007JD-2S for qemu-devel@nongnu.org; Mon, 17 Nov 2014 23:27:23 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1XqaNk-0000IU-5f for qemu-devel@nongnu.org; Mon, 17 Nov 2014 23:27:18 -0500 Received: from mail-qg0-f44.google.com ([209.85.192.44]:33898) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1XqaNk-0000IQ-0f for qemu-devel@nongnu.org; Mon, 17 Nov 2014 23:27:12 -0500 Received: by mail-qg0-f44.google.com with SMTP id z60so1759472qgd.17 for ; Mon, 17 Nov 2014 20:27:11 -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=NA90JVVQe2ALH+SuV6gtIifn4vRgimfVSYC0K9oI+rs=; b=jDCZUzqzFTFeMZb+XNP2B3kOTAgAw1VIoIJLwatEfjgOMhejDDixvmZckGtlMTenAM ngw4jeAaFQNWZn/ZSrJJWeKYEW2JVhJmspb/ffSEXXu7kiT5kiJ2MlUcODHiACdjz1g8 EcxIO0jIsfX0uzRE6NqaVZ7RRa7V/88eByugV4ps6DNC2A0UQelggHoakRHJdabwd6Jm FLDTCMxkAJTEVw0IgvJAAR/QM5m8fT1OnpTN2XQbki+lCN90K9LnV7qzhcBtdcbU8ttD DyaH3pqackIZDJ4E9d8bQzILwVNLuz3Y9Gyj+cS5MI0QaQA+NYDdauQ/pHtmT69OGxnS FJkA== X-Gm-Message-State: ALoCoQmWl8fh9QcAOVkAJj1TNFQzo1ZZtvQN7g8SY6TVJa2k1gF5xmceAgQhDkHKsd0zJjlYg8Tx X-Received: by 10.140.29.165 with SMTP id b34mr17960656qgb.94.1416284831739; Mon, 17 Nov 2014 20:27:11 -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 f105sm10059844qge.1.2014.11.17.20.27.10 for (version=TLSv1.2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 17 Nov 2014 20:27:10 -0800 (PST) From: Kevin O'Connor To: qemu-devel@nongnu.org Date: Mon, 17 Nov 2014 23:26:39 -0500 Message-Id: <1416284800-2759-4-git-send-email-kevin@koconnor.net> X-Mailer: git-send-email 1.9.3 In-Reply-To: <1416284800-2759-1-git-send-email-kevin@koconnor.net> References: <1416284800-2759-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.44 Subject: [Qemu-devel] [PATCH 3/4] 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 ++++++++- include/hw/pci/pci.h | 1 + include/hw/pci/pci_ids.h | 1 + 5 files changed, 56 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 05b0c50..55709da 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_QEMU; + k->device_id = PCI_DEVICE_ID_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) diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h index c352c7b..fae77cb 100644 --- a/include/hw/pci/pci.h +++ b/include/hw/pci/pci.h @@ -53,6 +53,7 @@ /* QEMU/Bochs VGA (0x1234) */ #define PCI_VENDOR_ID_QEMU 0x1234 #define PCI_DEVICE_ID_QEMU_VGA 0x1111 +#define PCI_DEVICE_ID_SDHCI 0x2222 /* VMWare (0x15ad) */ #define PCI_VENDOR_ID_VMWARE 0x15ad diff --git a/include/hw/pci/pci_ids.h b/include/hw/pci/pci_ids.h index 321d622..d7be386 100644 --- a/include/hw/pci/pci_ids.h +++ b/include/hw/pci/pci_ids.h @@ -31,6 +31,7 @@ #define PCI_CLASS_MEMORY_RAM 0x0500 +#define PCI_CLASS_SYSTEM_SDHCI 0x0805 #define PCI_CLASS_SYSTEM_OTHER 0x0880 #define PCI_CLASS_SERIAL_USB 0x0c03