From patchwork Sun Apr 29 00:43:29 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Francisco Iglesias X-Patchwork-Id: 906232 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=208.118.235.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="Wc6iAD0C"; dkim-atps=neutral Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 40YTTQ3f99z9s1v for ; Sun, 29 Apr 2018 10:44:41 +1000 (AEST) Received: from localhost ([::1]:53997 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fCaRt-0007dE-06 for incoming@patchwork.ozlabs.org; Sat, 28 Apr 2018 20:44:17 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:44247) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1fCaRF-0007bp-3W for qemu-devel@nongnu.org; Sat, 28 Apr 2018 20:43:38 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1fCaRE-0004TW-7J for qemu-devel@nongnu.org; Sat, 28 Apr 2018 20:43:37 -0400 Received: from mail-lf0-x241.google.com ([2a00:1450:4010:c07::241]:34316) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1fCaRD-0004TK-VN for qemu-devel@nongnu.org; Sat, 28 Apr 2018 20:43:36 -0400 Received: by mail-lf0-x241.google.com with SMTP id h4-v6so7707364lfc.1 for ; Sat, 28 Apr 2018 17:43:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=2PagD+Ff75akV8exLPt94SU/EC3Gxy0d/tmgtafXuPk=; b=Wc6iAD0C+baObnOpRydh8nhnhcAoT2ozp9QNvWRFmBJ++CwrGyZTVXL3vMerXb7IPS ytg1gnJChgluELu66BF+AvyVKmnI16Ipnuza1aGS2+JVwsUDspHubdf/gee9FbU3Cf1l KDg8FDMhoaRliufSjVCcj+Em1TQoisbAttt+s735gxwdgQmMKSlZRvfNwiUGJM545h1G aM8hqShQx1oox574w8D9pxMwP2DB/Sqkps99n/R6nLWasfnepW645Y7Vglwmchhs+H2Y 8JnWeCaHwRR+weEtIGFswTOpSRvk8EDY0DRtnsjl3p8s+u/lM4g7jhHJUNcBc+uEQblc Oasg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=2PagD+Ff75akV8exLPt94SU/EC3Gxy0d/tmgtafXuPk=; b=hkt2p6PJN+/mcURCJSCBpvGJmkyOAzVP6IlVejszXmzhiKhHaVLN6C8Z8EbRFI4qPX LACtfXIj7YZYmPwOZU/3z8GcWUGoSyTIiRCZCCg1GXr27lVmy4nDPi0PYKrklwgtXaEu vGtCW9cTZP5EYDjgEBNC1nAZSqHRzjJmabLpFK9pHGXAu05jdvwxNiF89qSY+h6M5S4X Y4BDJ+f+G+EOuFQmHK4Ig53VRsS9wWOHyH9hhSVjE2gRTAu8nJRyZOt38C5fZ1+SLlqG t3MxmxdE3vKDPnjVMZwYNOCXs4hWEsElkIcN75l82JUqkMnORsdxUybOCt3JUght2y7U K2PQ== X-Gm-Message-State: ALQs6tDIIIBjoxV/NHkMBmrBynLjsGRo/Q4bW9iP8Ledpul96URsCU62 RdDwfea6A7HQswxrH+uKIcbqBA== X-Google-Smtp-Source: AB8JxZqLICcUcEowYMdM0Mu1rEpv5hAtp8d8U0pL256QxE2+xzizMTbY6wykcGII2SHHAwTobLXPfA== X-Received: by 2002:a2e:1082:: with SMTP id 2-v6mr4856500ljq.9.1524962614351; Sat, 28 Apr 2018 17:43:34 -0700 (PDT) Received: from localhost.localdomain (94-255-130-40.cust.bredband2.com. [94.255.130.40]) by smtp.gmail.com with ESMTPSA id y23-v6sm425941ljh.88.2018.04.28.17.43.33 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 28 Apr 2018 17:43:33 -0700 (PDT) From: Francisco Iglesias To: qemu-devel@nongnu.org Date: Sun, 29 Apr 2018 02:43:29 +0200 Message-Id: <20180429004329.21067-3-frasse.iglesias@gmail.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180429004329.21067-1-frasse.iglesias@gmail.com> References: <20180429004329.21067-1-frasse.iglesias@gmail.com> X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 2a00:1450:4010:c07::241 Subject: [Qemu-devel] [PATCH v1 2/2] xlnx-zynqmp: Connect the ZynqMP GDMA and ADMA X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: peter.maydell@linaro.org, francisco.iglesias@feimtech.se, sai.pavan.boddu@xilinx.com, alistair@alistair23.me, edgari@xilinx.com, alistair23@gmail.com Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" The ZynqMP contains two instances of a generic DMA, the GDMA, located in the FPD (full power domain), and the ADMA, located in LPD (low power domain). This patch adds these two DMAs to the ZynqMP board. Signed-off-by: Francisco Iglesias --- hw/arm/xlnx-zynqmp.c | 53 ++++++++++++++++++++++++++++++++++++++++++++ include/hw/arm/xlnx-zynqmp.h | 5 +++++ 2 files changed, 58 insertions(+) diff --git a/hw/arm/xlnx-zynqmp.c b/hw/arm/xlnx-zynqmp.c index 505253e0d2..d8c3c9e8d9 100644 --- a/hw/arm/xlnx-zynqmp.c +++ b/hw/arm/xlnx-zynqmp.c @@ -90,6 +90,24 @@ static const int spi_intr[XLNX_ZYNQMP_NUM_SPIS] = { 19, 20, }; +static const uint64_t gdma_addr[XLNX_ZYNQMP_NUM_GDMA] = { + 0xFD500000, 0xFD510000, 0xFD520000, 0xFD530000, + 0xFD540000, 0xFD550000, 0xFD560000, 0xFD570000 +}; + +static const int gdma_intr[XLNX_ZYNQMP_NUM_GDMA] = { + 124, 125, 126, 127, 128, 129, 130, 131 +}; + +static const uint64_t adma_addr[XLNX_ZYNQMP_NUM_ADMA] = { + 0xFFA80000, 0xFFA90000, 0xFFAA0000, 0xFFAB0000, + 0xFFAC0000, 0xFFAD0000, 0xFFAE0000, 0xFFAF0000 +}; + +static const int adma_intr[XLNX_ZYNQMP_NUM_ADMA] = { + 77, 78, 79, 80, 81, 82, 83, 84 +}; + typedef struct XlnxZynqMPGICRegion { int region_index; uint32_t address; @@ -197,6 +215,16 @@ static void xlnx_zynqmp_init(Object *obj) object_initialize(&s->rtc, sizeof(s->rtc), TYPE_XLNX_ZYNQMP_RTC); qdev_set_parent_bus(DEVICE(&s->rtc), sysbus_get_default()); + + for (i = 0; i < XLNX_ZYNQMP_NUM_GDMA; i++) { + object_initialize(&s->gdma[i], sizeof(s->gdma[i]), TYPE_XLNX_ZDMA); + qdev_set_parent_bus(DEVICE(&s->gdma[i]), sysbus_get_default()); + } + + for (i = 0; i < XLNX_ZYNQMP_NUM_ADMA; i++) { + object_initialize(&s->adma[i], sizeof(s->adma[i]), TYPE_XLNX_ZDMA); + qdev_set_parent_bus(DEVICE(&s->adma[i]), sysbus_get_default()); + } } static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp) @@ -492,6 +520,31 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp) } sysbus_mmio_map(SYS_BUS_DEVICE(&s->rtc), 0, RTC_ADDR); sysbus_connect_irq(SYS_BUS_DEVICE(&s->rtc), 0, gic_spi[RTC_IRQ]); + + for (i = 0; i < XLNX_ZYNQMP_NUM_GDMA; i++) { + object_property_set_uint(OBJECT(&s->gdma[i]), 128, "bus-width", &err); + object_property_set_bool(OBJECT(&s->gdma[i]), true, "realized", &err); + if (err) { + error_propagate(errp, err); + return; + } + + sysbus_mmio_map(SYS_BUS_DEVICE(&s->gdma[i]), 0, gdma_addr[i]); + sysbus_connect_irq(SYS_BUS_DEVICE(&s->gdma[i]), 0, + gic_spi[gdma_intr[i]]); + } + + for (i = 0; i < XLNX_ZYNQMP_NUM_ADMA; i++) { + object_property_set_bool(OBJECT(&s->adma[i]), true, "realized", &err); + if (err) { + error_propagate(errp, err); + return; + } + + sysbus_mmio_map(SYS_BUS_DEVICE(&s->adma[i]), 0, adma_addr[i]); + sysbus_connect_irq(SYS_BUS_DEVICE(&s->adma[i]), 0, + gic_spi[adma_intr[i]]); + } } static Property xlnx_zynqmp_props[] = { diff --git a/include/hw/arm/xlnx-zynqmp.h b/include/hw/arm/xlnx-zynqmp.h index 3b613e364d..9824a0fa17 100644 --- a/include/hw/arm/xlnx-zynqmp.h +++ b/include/hw/arm/xlnx-zynqmp.h @@ -27,6 +27,7 @@ #include "hw/sd/sdhci.h" #include "hw/ssi/xilinx_spips.h" #include "hw/dma/xlnx_dpdma.h" +#include "hw/dma/xlnx-zdma.h" #include "hw/display/xlnx_dp.h" #include "hw/intc/xlnx-zynqmp-ipi.h" #include "hw/timer/xlnx-zynqmp-rtc.h" @@ -41,6 +42,8 @@ #define XLNX_ZYNQMP_NUM_UARTS 2 #define XLNX_ZYNQMP_NUM_SDHCI 2 #define XLNX_ZYNQMP_NUM_SPIS 2 +#define XLNX_ZYNQMP_NUM_GDMA 8 +#define XLNX_ZYNQMP_NUM_ADMA 8 #define XLNX_ZYNQMP_NUM_QSPI_BUS 2 #define XLNX_ZYNQMP_NUM_QSPI_BUS_CS 2 @@ -94,6 +97,8 @@ typedef struct XlnxZynqMPState { XlnxDPDMAState dpdma; XlnxZynqMPIPI ipi; XlnxZynqMPRTC rtc; + XlnxZDMA gdma[XLNX_ZYNQMP_NUM_GDMA]; + XlnxZDMA adma[XLNX_ZYNQMP_NUM_ADMA]; char *boot_cpu; ARMCPU *boot_cpu_ptr;