From nobody Sat May 11 21:26:21 2024 Delivered-To: importer@patchew.org Authentication-Results: mx.zohomail.com; dkim=fail; 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 ARC-Seal: i=1; a=rsa-sha256; t=1597413301; cv=none; d=zohomail.com; s=zohoarc; b=khq4P2Iy8cy42Qx+1RPmxGNnfCxdpZrH7IilyKQZOjwjN7B1X+0/0e8FsUbC2BT5Am/kdHu8BJQfpeSPwJJwghPNXHZ3TkwMu5FSLWHd3Bikp0+C3+hRUwiESTRujB00VOy07HoGllwUUmhBnFk+srtuCbks8nmX0doAr8EYTgM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1597413301; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Sender:Subject:To; bh=HHF8F8C69cxwA1gHUBPBrw8zWVGJfAJ1ev6KdpDclys=; b=js9OUiSakwspvlYi+tc3rcbS6TsYWmJoO6LadWxCDdG9GGdg7TS3lNlPCQcg25AW+5vyNkSpVcp5hfXI8+b0rxyBFfQhktXvlhAqNauzANwmMAy1cMANVS1S58WQZ1eD1dZTZhuD0EQnWbfQt6rKSZyto8OJ4t8j5QXJ/6pcr+0= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=fail; 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 Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 15974133019152.5487098440127056; Fri, 14 Aug 2020 06:55:01 -0700 (PDT) Received: from localhost ([::1]:60732 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1k6YqW-0001Fs-Ef for importer@patchew.org; Fri, 14 Aug 2020 08:30:08 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:35598) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1k6Ypd-0000iz-UG; Fri, 14 Aug 2020 08:29:13 -0400 Received: from mail-wm1-x344.google.com ([2a00:1450:4864:20::344]:52941) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1k6Ypb-0002L0-Th; Fri, 14 Aug 2020 08:29:13 -0400 Received: by mail-wm1-x344.google.com with SMTP id x5so7328470wmi.2; Fri, 14 Aug 2020 05:29:10 -0700 (PDT) Received: from localhost.localdomain (121.red-81-40-121.staticip.rima-tde.net. [81.40.121.121]) by smtp.gmail.com with ESMTPSA id j4sm14410210wmi.48.2020.08.14.05.29.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 14 Aug 2020 05:29:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=HHF8F8C69cxwA1gHUBPBrw8zWVGJfAJ1ev6KdpDclys=; b=rsdDUulbEpb4wsA/IBSZMHuIr/weEFSsewpy5CcQ8QHtxmy5wq2snezbT56hdd5Y+L quUAFdzTsAnqVu0h/xpORUWjQ21SVtKY8MNpSyG6fL+VKnaUwMr+ZIUd2Obov8s3rL+T T/m7W47eKPv2ZR9dfx+GDZOPZJH9eTrk++FCFnEK2Gj5PE+0Y30r4OpXn0pipqWLISru 3dn0nyQwYhymvc4yNN+TsXHrCV+/qmOkdWWvEg615iPXhkFLiCtvqcmvZuUhzAFSm4I3 +ezoeHx8x0FR9w+xceWPHMpKyk9ONGPfdV7Dm79kguwdOC5NwliVast2sC8rtTXlS0DE T3pw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :mime-version:content-transfer-encoding; bh=HHF8F8C69cxwA1gHUBPBrw8zWVGJfAJ1ev6KdpDclys=; b=MG2r9pdEZfy2IMmFx60VMF4l9RetHIlRmlvRRCRQR17gG7HXTY4jEqWUY47Ft2YN6Y e9kXj9dzg2uI+wI8Jm0+MuT9qrlIyNPO9KjrVOPCuFe6ORO/St1H7SMCeUklhpjQ3soc jCApWa9cq8suF4Mk0uMWjgJNUxTcCQTpv27TH4Zr1LJ2IRnAfZktol3U+BnjLRMJHR6H V9P7SVUlpJhJJFFP+ctYnDMI62hJljJ1oV1gLbVucDDfReteD9G4O+I1yaMANUi+DbgS bZ8+nFma3L7crf/EhQpLDR2Ub1F+uAfwBxKxj7m9OJEcpyh3Lumkv37ugS9wNAugig+U +w2Q== X-Gm-Message-State: AOAM532zksAnBPknuwxnIjl/JnMP0ry0rjF+8g8LC8SDX3M2rPS7ieNq t2xdVZuYLKHTEFH3yLntwbhxDvPWXFY= X-Google-Smtp-Source: ABdhPJxpkqeF5VHjTIk2szAIp6vS4v6HyH3VwJiKR+25hyprVLrQ7hzUNx4zYEkUyPp9dzXQavFmeA== X-Received: by 2002:a05:600c:2055:: with SMTP id p21mr2255489wmg.109.1597408149518; Fri, 14 Aug 2020 05:29:09 -0700 (PDT) From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= To: qemu-devel@nongnu.org Subject: [PATCH] hw/net/allwinner-sun8i-emac: Use AddressSpace for DMA transfers Date: Fri, 14 Aug 2020 14:29:07 +0200 Message-Id: <20200814122907.27732-1-f4bug@amsat.org> X-Mailer: git-send-email 2.21.3 MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" 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::344; envelope-from=philippe.mathieu.daude@gmail.com; helo=mail-wm1-x344.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: 0 X-Spam_score: 0.0 X-Spam_bar: / X-Spam_report: (0.0 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_EF=-0.1, FREEMAIL_FORGED_FROMDOMAIN=1, FREEMAIL_FROM=0.001, HEADER_FROM_DIFFERENT_DOMAINS=1, RCVD_IN_DNSWL_NONE=-0.0001, SPF_HELO_NONE=0.001, SPF_PASS=-0.001 autolearn=no 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: , Cc: Peter Maydell , Jason Wang , =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= , Beniamino Galvani , Niek Linnenbank , qemu-arm@nongnu.org Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail-DKIM: fail (Header signature does not verify) 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: Niek Linnenbank Reviewed-by: Richard Henderson Tested-by: Niek Linnenbank --- Tested with: AVOCADO_ALLOW_LARGE_STORAGE=3D1 avocado run -t machine:orangepi-pc tests/= acceptance/ --- 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 eda034e96b..dd1d7b96cd 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 ff92ded82c..21a5d759d1 100644 --- a/hw/arm/allwinner-h3.c +++ b/hw/arm/allwinner-h3.c @@ -363,6 +363,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 28637ff4c1..38d328587e 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.21.3