From nobody Thu Dec 18 22:27:15 2025 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass(p=none dis=none) header.from=linaro.org ARC-Seal: i=1; a=rsa-sha256; t=1598606937; cv=none; d=zohomail.com; s=zohoarc; b=Qby3zBIK7vYxh9G+2lmtenRZUCMsyFAHPuG4Iu8GcFvH3kAUz4by0v0n8lcm5Jt9NR4okrH4zWYjMwubcIvzfRsH1fvkSUiYPJR2fDEniAqfqmOB+MNStA/fwaxAw9hch3yCpz392t3YzPidMO2skI3+yHRkVzC61Y+WWOR3gP4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1598606937; h=Content-Type:Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=l2nOHa60kq0nVRkzT+oUvlscX0cyU37UXJ5f7eYIvCU=; b=coLOjgzsyt1PmO309YyKeS1/5BNG5UeVJjNen6piWuEEsKKRPj4IKIkGNS3V2m7PuCilkpLlMdM26PY9QJCw3xEGY/9V8ANJFc8BBEY7QkV/dEY3Cl6b+4qCyFxjJ5Tg+rkhuEe7pkUykOf6mq4hvrOH2krerXEzqK3duJH+dCk= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org; dmarc=pass header.from= (p=none dis=none) header.from= Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1598606937160283.91863102849027; Fri, 28 Aug 2020 02:28:57 -0700 (PDT) Received: from localhost ([::1]:43482 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1kBagn-0003sf-Pw for importer@patchew.org; Fri, 28 Aug 2020 05:28:53 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:45872) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1kBacY-00049D-7x for qemu-devel@nongnu.org; Fri, 28 Aug 2020 05:24:30 -0400 Received: from mail-wr1-x441.google.com ([2a00:1450:4864:20::441]:35828) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1kBacV-0004Fp-VV for qemu-devel@nongnu.org; Fri, 28 Aug 2020 05:24:29 -0400 Received: by mail-wr1-x441.google.com with SMTP id e16so635524wrm.2 for ; Fri, 28 Aug 2020 02:24:27 -0700 (PDT) Received: from orth.archaic.org.uk (orth.archaic.org.uk. [81.2.115.148]) by smtp.gmail.com with ESMTPSA id t13sm912304wru.65.2020.08.28.02.24.24 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 28 Aug 2020 02:24:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:subject:date:message-id:in-reply-to:references:mime-version :content-transfer-encoding; bh=l2nOHa60kq0nVRkzT+oUvlscX0cyU37UXJ5f7eYIvCU=; b=A1xSpLlP0fM8RuPbsR+GvA3FlevcegzXH9MT5PaXIlKD/4vdPXTJPuvJhATFIDHoYl 7sGyALi4/UORSlgUiPAJVhIS1osbrwMM7zGBrn69T3G5QUcdBWSTErSopUztwD59vWhT 37ZCCFSIlzLm9TKv7SFMGDpxdyudlAAafTQaUOpqOWkhRHNgoatQEwW2foXQSp0faaC2 /aeZovwJAVpSV447ns2iAe4JKLJjkZws2fgRAgB6f4Waf8o9fMlRNt7HZI7od9SUAxx1 7FfO4lXNH9BVN/R64NJj2sTFLLZhjw2sQa+rCB8PV2s41irIrwYXQwZx7d78q+QZ5a8U HJhQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=l2nOHa60kq0nVRkzT+oUvlscX0cyU37UXJ5f7eYIvCU=; b=kQUCo57OtH1A5Y+0t5h+oZ4xPSZ0Ufi7NRyjlgm+nqSMYZdUkKDdM59teawx17tBDX s48KGozNz0vQYNnBUG21pufNor3xYeY6TtMVI9svT/tpws9evcubmukzOMdHDBTYJG5l Ywkp11xXuAlnqAWUaO9f0iBckBSnywdNnLjC5/7w4GWntiL3jPXFESYLnI5MoGv2WpJj pkxdg0WCUS3X5mAK0zPke+KQaUUntGDqAGLo63mLUj355CFym6oFej2hApuVsNAMnKs8 9wsxaf9p2E7ihmaw6fyBmm+jzmaomxRxg+qz4xAkdfGo5umiTAlDrQqr5Ta9XPHjz6PT Eiwg== X-Gm-Message-State: AOAM531D0e7NGbTKe650MRnJIdcPTadphC1gfgPiUCNEfqMcwE+Udi/3 UOFaICQ3F0VeuWso6oNBaHuIRWQw1eWzvZ6l X-Google-Smtp-Source: ABdhPJxRnLQWvTByZK4jFGC0eWxp+WmWnA+CkvhFwEVz1C8CsmWMGDXpQR6lyY4JNcqcfOZ0a0t+2w== X-Received: by 2002:adf:e982:: with SMTP id h2mr682477wrm.394.1598606666211; Fri, 28 Aug 2020 02:24:26 -0700 (PDT) From: Peter Maydell To: qemu-devel@nongnu.org Subject: [PULL 10/35] hw/net/allwinner-sun8i-emac: Use AddressSpace for DMA transfers Date: Fri, 28 Aug 2020 10:23:48 +0100 Message-Id: <20200828092413.22206-11-peter.maydell@linaro.org> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20200828092413.22206-1-peter.maydell@linaro.org> References: <20200828092413.22206-1-peter.maydell@linaro.org> MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Received-SPF: pass (zohomail.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Received-SPF: pass client-ip=2a00:1450:4864:20::441; envelope-from=peter.maydell@linaro.org; helo=mail-wr1-x441.google.com X-detected-operating-system: by eggs.gnu.org: No matching host in p0f cache. That's all we know. X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: pass (identity @linaro.org) From: Philippe Mathieu-Daud=C3=A9 Allow the device to execute the DMA transfers in a different AddressSpace. The H3 SoC keeps using the system_memory address space, but via the proper dma_memory_access() API. Signed-off-by: Philippe Mathieu-Daud=C3=A9 Reviewed-by: Richard Henderson Reviewed-by: Niek Linnenbank Tested-by: Niek Linnenbank Message-id: 20200814122907.27732-1-f4bug@amsat.org Signed-off-by: Peter Maydell --- include/hw/net/allwinner-sun8i-emac.h | 6 ++++ hw/arm/allwinner-h3.c | 2 ++ hw/net/allwinner-sun8i-emac.c | 46 +++++++++++++++++---------- 3 files changed, 38 insertions(+), 16 deletions(-) diff --git a/include/hw/net/allwinner-sun8i-emac.h b/include/hw/net/allwinn= er-sun8i-emac.h index eda034e96b2..dd1d7b96cdd 100644 --- a/include/hw/net/allwinner-sun8i-emac.h +++ b/include/hw/net/allwinner-sun8i-emac.h @@ -49,6 +49,12 @@ typedef struct AwSun8iEmacState { /** Interrupt output signal to notify CPU */ qemu_irq irq; =20 + /** Memory region where DMA transfers are done */ + MemoryRegion *dma_mr; + + /** Address space used internally for DMA transfers */ + AddressSpace dma_as; + /** Generic Network Interface Controller (NIC) for networking API */ NICState *nic; =20 diff --git a/hw/arm/allwinner-h3.c b/hw/arm/allwinner-h3.c index 43a8d3dc480..76ac51a3efc 100644 --- a/hw/arm/allwinner-h3.c +++ b/hw/arm/allwinner-h3.c @@ -365,6 +365,8 @@ static void allwinner_h3_realize(DeviceState *dev, Erro= r **errp) qemu_check_nic_model(&nd_table[0], TYPE_AW_SUN8I_EMAC); qdev_set_nic_properties(DEVICE(&s->emac), &nd_table[0]); } + object_property_set_link(OBJECT(&s->emac), "dma-memory", + OBJECT(get_system_memory()), &error_fatal); sysbus_realize(SYS_BUS_DEVICE(&s->emac), &error_fatal); sysbus_mmio_map(SYS_BUS_DEVICE(&s->emac), 0, s->memmap[AW_H3_EMAC]); sysbus_connect_irq(SYS_BUS_DEVICE(&s->emac), 0, diff --git a/hw/net/allwinner-sun8i-emac.c b/hw/net/allwinner-sun8i-emac.c index 28637ff4c12..38d328587e3 100644 --- a/hw/net/allwinner-sun8i-emac.c +++ b/hw/net/allwinner-sun8i-emac.c @@ -19,6 +19,7 @@ =20 #include "qemu/osdep.h" #include "qemu/units.h" +#include "qapi/error.h" #include "hw/sysbus.h" #include "migration/vmstate.h" #include "net/net.h" @@ -29,6 +30,7 @@ #include "net/checksum.h" #include "qemu/module.h" #include "exec/cpu-common.h" +#include "sysemu/dma.h" #include "hw/net/allwinner-sun8i-emac.h" =20 /* EMAC register offsets */ @@ -337,12 +339,13 @@ static void allwinner_sun8i_emac_update_irq(AwSun8iEm= acState *s) qemu_set_irq(s->irq, (s->int_sta & s->int_en) !=3D 0); } =20 -static uint32_t allwinner_sun8i_emac_next_desc(FrameDescriptor *desc, +static uint32_t allwinner_sun8i_emac_next_desc(AwSun8iEmacState *s, + FrameDescriptor *desc, size_t min_size) { uint32_t paddr =3D desc->next; =20 - cpu_physical_memory_read(paddr, desc, sizeof(*desc)); + dma_memory_read(&s->dma_as, paddr, desc, sizeof(*desc)); =20 if ((desc->status & DESC_STATUS_CTL) && (desc->status2 & DESC_STATUS2_BUF_SIZE_MASK) >=3D min_size) { @@ -352,7 +355,8 @@ static uint32_t allwinner_sun8i_emac_next_desc(FrameDes= criptor *desc, } } =20 -static uint32_t allwinner_sun8i_emac_get_desc(FrameDescriptor *desc, +static uint32_t allwinner_sun8i_emac_get_desc(AwSun8iEmacState *s, + FrameDescriptor *desc, uint32_t start_addr, size_t min_size) { @@ -360,7 +364,7 @@ static uint32_t allwinner_sun8i_emac_get_desc(FrameDesc= riptor *desc, =20 /* Note that the list is a cycle. Last entry points back to the head. = */ while (desc_addr !=3D 0) { - cpu_physical_memory_read(desc_addr, desc, sizeof(*desc)); + dma_memory_read(&s->dma_as, desc_addr, desc, sizeof(*desc)); =20 if ((desc->status & DESC_STATUS_CTL) && (desc->status2 & DESC_STATUS2_BUF_SIZE_MASK) >=3D min_size) { @@ -379,20 +383,21 @@ static uint32_t allwinner_sun8i_emac_rx_desc(AwSun8iE= macState *s, FrameDescriptor *desc, size_t min_size) { - return allwinner_sun8i_emac_get_desc(desc, s->rx_desc_curr, min_size); + return allwinner_sun8i_emac_get_desc(s, desc, s->rx_desc_curr, min_siz= e); } =20 static uint32_t allwinner_sun8i_emac_tx_desc(AwSun8iEmacState *s, FrameDescriptor *desc, size_t min_size) { - return allwinner_sun8i_emac_get_desc(desc, s->tx_desc_head, min_size); + return allwinner_sun8i_emac_get_desc(s, desc, s->tx_desc_head, min_siz= e); } =20 -static void allwinner_sun8i_emac_flush_desc(FrameDescriptor *desc, +static void allwinner_sun8i_emac_flush_desc(AwSun8iEmacState *s, + FrameDescriptor *desc, uint32_t phys_addr) { - cpu_physical_memory_write(phys_addr, desc, sizeof(*desc)); + dma_memory_write(&s->dma_as, phys_addr, desc, sizeof(*desc)); } =20 static bool allwinner_sun8i_emac_can_receive(NetClientState *nc) @@ -450,8 +455,8 @@ static ssize_t allwinner_sun8i_emac_receive(NetClientSt= ate *nc, << RX_DESC_STATUS_FRM_LEN_SHIFT; } =20 - cpu_physical_memory_write(desc.addr, buf, desc_bytes); - allwinner_sun8i_emac_flush_desc(&desc, s->rx_desc_curr); + dma_memory_write(&s->dma_as, desc.addr, buf, desc_bytes); + allwinner_sun8i_emac_flush_desc(s, &desc, s->rx_desc_curr); trace_allwinner_sun8i_emac_receive(s->rx_desc_curr, desc.addr, desc_bytes); =20 @@ -465,7 +470,7 @@ static ssize_t allwinner_sun8i_emac_receive(NetClientSt= ate *nc, bytes_left -=3D desc_bytes; =20 /* Move to the next descriptor */ - s->rx_desc_curr =3D allwinner_sun8i_emac_next_desc(&desc, 64); + s->rx_desc_curr =3D allwinner_sun8i_emac_next_desc(s, &desc, 64); if (!s->rx_desc_curr) { /* Not enough buffer space available */ s->int_sta |=3D INT_STA_RX_BUF_UA; @@ -501,10 +506,10 @@ static void allwinner_sun8i_emac_transmit(AwSun8iEmac= State *s) desc.status |=3D TX_DESC_STATUS_LENGTH_ERR; break; } - cpu_physical_memory_read(desc.addr, packet_buf + packet_bytes, byt= es); + dma_memory_read(&s->dma_as, desc.addr, packet_buf + packet_bytes, = bytes); packet_bytes +=3D bytes; desc.status &=3D ~DESC_STATUS_CTL; - allwinner_sun8i_emac_flush_desc(&desc, s->tx_desc_curr); + allwinner_sun8i_emac_flush_desc(s, &desc, s->tx_desc_curr); =20 /* After the last descriptor, send the packet */ if (desc.status2 & TX_DESC_STATUS2_LAST_DESC) { @@ -519,7 +524,7 @@ static void allwinner_sun8i_emac_transmit(AwSun8iEmacSt= ate *s) packet_bytes =3D 0; transmitted++; } - s->tx_desc_curr =3D allwinner_sun8i_emac_next_desc(&desc, 0); + s->tx_desc_curr =3D allwinner_sun8i_emac_next_desc(s, &desc, 0); } =20 /* Raise transmit completed interrupt */ @@ -623,7 +628,7 @@ static uint64_t allwinner_sun8i_emac_read(void *opaque,= hwaddr offset, break; case REG_TX_CUR_BUF: /* Transmit Current Buffer */ if (s->tx_desc_curr !=3D 0) { - cpu_physical_memory_read(s->tx_desc_curr, &desc, sizeof(desc)); + dma_memory_read(&s->dma_as, s->tx_desc_curr, &desc, sizeof(des= c)); value =3D desc.addr; } else { value =3D 0; @@ -636,7 +641,7 @@ static uint64_t allwinner_sun8i_emac_read(void *opaque,= hwaddr offset, break; case REG_RX_CUR_BUF: /* Receive Current Buffer */ if (s->rx_desc_curr !=3D 0) { - cpu_physical_memory_read(s->rx_desc_curr, &desc, sizeof(desc)); + dma_memory_read(&s->dma_as, s->rx_desc_curr, &desc, sizeof(des= c)); value =3D desc.addr; } else { value =3D 0; @@ -790,6 +795,13 @@ static void allwinner_sun8i_emac_realize(DeviceState *= dev, Error **errp) { AwSun8iEmacState *s =3D AW_SUN8I_EMAC(dev); =20 + if (!s->dma_mr) { + error_setg(errp, TYPE_AW_SUN8I_EMAC " 'dma-memory' link not set"); + return; + } + + address_space_init(&s->dma_as, s->dma_mr, "emac-dma"); + qemu_macaddr_default_if_unset(&s->conf.macaddr); s->nic =3D qemu_new_nic(&net_allwinner_sun8i_emac_info, &s->conf, object_get_typename(OBJECT(dev)), dev->id, s); @@ -799,6 +811,8 @@ static void allwinner_sun8i_emac_realize(DeviceState *d= ev, Error **errp) static Property allwinner_sun8i_emac_properties[] =3D { DEFINE_NIC_PROPERTIES(AwSun8iEmacState, conf), DEFINE_PROP_UINT8("phy-addr", AwSun8iEmacState, mii_phy_addr, 0), + DEFINE_PROP_LINK("dma-memory", AwSun8iEmacState, dma_mr, + TYPE_MEMORY_REGION, MemoryRegion *), DEFINE_PROP_END_OF_LIST(), }; =20 --=20 2.20.1