From patchwork Tue Aug 2 11:31:09 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Max Filippov X-Patchwork-Id: 654688 X-Patchwork-Delegate: joe.hershberger@gmail.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id 3s3Ywv52CJz9t3p for ; Tue, 2 Aug 2016 21:33:19 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=Arm18N6a; dkim-atps=neutral Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 3B598A7599; Tue, 2 Aug 2016 13:32:50 +0200 (CEST) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id fhKesA-KAfsF; Tue, 2 Aug 2016 13:32:50 +0200 (CEST) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id AE5DBA7640; Tue, 2 Aug 2016 13:32:32 +0200 (CEST) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 510A1A7528 for ; Tue, 2 Aug 2016 13:32:19 +0200 (CEST) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id DHOnbPTStsxH for ; Tue, 2 Aug 2016 13:32:19 +0200 (CEST) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from mail-lf0-f65.google.com (mail-lf0-f65.google.com [209.85.215.65]) by theia.denx.de (Postfix) with ESMTPS id 04A8CA74FB for ; Tue, 2 Aug 2016 13:32:17 +0200 (CEST) Received: by mail-lf0-f65.google.com with SMTP id l69so9777254lfg.1 for ; Tue, 02 Aug 2016 04:32:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=XOP2WpMhqxD/g7vSGXoAOCE/EfGW5Hzy0sNyeZ25G4g=; b=Arm18N6aL1+yq9A2z+cXqDMvwv4Z1Hh5ovPet2ASLLJ9M/z4c9PY4M/mmTQdCdOivi cIzAl9CQ7MtUmvLDu8KApR5M7l9aaNS7h0GtRXUDidDKm3lRAFbmFbE9IZ3EBIULHeGO 5rmUAEZGlZmep0yG0bcTJfScjsO7Gk5nNxilQ26lkvGTn/4SjohlWEZBCz8jhBDevfCD mOm0owzl+2qXcQnJmCfj9iQLUo/L6OkDCsPXe5JZb/v2uR1iItN6kbjN8UBbl7Hg+4fS yzwwwZJSE3mKq2D3tNqfv9V10WJeODXKUXEx7GRESTapOtyRhKEsjoLkG4U33RiuHI6s f4+Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=XOP2WpMhqxD/g7vSGXoAOCE/EfGW5Hzy0sNyeZ25G4g=; b=h+Ay1+v+xqdZe43mlzGqWrka0Lakt0apkc9ib7xH5iWpvbsPUDaBl7uSsNKieHI9kb bdhaINM0Cg/blPAdk9uOa20et8uMAFy77YTA8389HRxBgW4AIT9hMJ/3Pl+O/bDO0Caq s2PyvPlUhpoHfeL0rgukpMFOE6OmJo++SBIUkbpM9YU5DZu24mFsYokdnIFmWQ/6ncLj QeZqNK/F+9KgUblAdVIPRdKaaxk15EPk6v37A0edoK8Kfz1uqGstxqgVxPyV0gMq6eKh m57uVcWJoobSg77M0CiFbNsSXhHlRU6YG3wMJEvnBWDehoQaaxL0l0YK7D9w3EjXZxiS VsOg== X-Gm-Message-State: AEkoouvZCmTWXVjAuUbigJeVwb+PFP8JpnBkEuqdlDahBct9i96MCrxzjErOqZ4x6mzpZA== X-Received: by 10.46.9.145 with SMTP id 139mr18468178ljj.2.1470137536490; Tue, 02 Aug 2016 04:32:16 -0700 (PDT) Received: from octofox.metropolis ([5.19.183.212]) by smtp.gmail.com with ESMTPSA id f69sm417906lji.19.2016.08.02.04.32.15 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 02 Aug 2016 04:32:15 -0700 (PDT) From: Max Filippov To: u-boot@lists.denx.de Date: Tue, 2 Aug 2016 14:31:09 +0300 Message-Id: <1470137470-6051-7-git-send-email-jcmvbkbc@gmail.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1470137470-6051-1-git-send-email-jcmvbkbc@gmail.com> References: <1470137470-6051-1-git-send-email-jcmvbkbc@gmail.com> Cc: Joe Hershberger Subject: [U-Boot] [PATCH 6/7] net/ethoc: support private memory configurations X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.15 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" The ethoc device can be configured to have a private memory region instead of having access to the main memory. In that case egress packets must be copied into that memory for transmission and pointers to that memory need to be passed to net_process_received_packet or returned from the recv callback. Signed-off-by: Max Filippov Acked-by: Joe Hershberger --- drivers/net/ethoc.c | 46 ++++++++++++++++++++++++++++++++---- include/dm/platform_data/net_ethoc.h | 1 + 2 files changed, 42 insertions(+), 5 deletions(-) diff --git a/drivers/net/ethoc.c b/drivers/net/ethoc.c index e25dd1b..fa623d5 100644 --- a/drivers/net/ethoc.c +++ b/drivers/net/ethoc.c @@ -179,6 +179,8 @@ struct ethoc { u32 num_rx; u32 cur_rx; void __iomem *iobase; + void __iomem *packet; + phys_addr_t packet_phys; }; /** @@ -247,6 +249,7 @@ static inline void ethoc_disable_rx_and_tx(struct ethoc *priv) static int ethoc_init_ring(struct ethoc *priv) { struct ethoc_bd bd; + phys_addr_t addr = priv->packet_phys; int i; priv->cur_tx = 0; @@ -258,6 +261,10 @@ static int ethoc_init_ring(struct ethoc *priv) bd.addr = 0; for (i = 0; i < priv->num_tx; i++) { + if (addr) { + bd.addr = addr; + addr += PKTSIZE_ALIGN; + } if (i == priv->num_tx - 1) bd.stat |= TX_BD_WRAP; @@ -267,7 +274,12 @@ static int ethoc_init_ring(struct ethoc *priv) bd.stat = RX_BD_EMPTY | RX_BD_IRQ; for (i = 0; i < priv->num_rx; i++) { - bd.addr = virt_to_phys(net_rx_packets[i]); + if (addr) { + bd.addr = addr; + addr += PKTSIZE_ALIGN; + } else { + bd.addr = virt_to_phys(net_rx_packets[i]); + } if (i == priv->num_rx - 1) bd.stat |= RX_BD_WRAP; @@ -367,7 +379,10 @@ static int ethoc_rx_common(struct ethoc *priv, uchar **packetp) int size = bd.stat >> 16; size -= 4; /* strip the CRC */ - *packetp = net_rx_packets[i]; + if (priv->packet) + *packetp = priv->packet + entry * PKTSIZE_ALIGN; + else + *packetp = net_rx_packets[i]; return size; } else { return 0; @@ -430,8 +445,15 @@ static int ethoc_send_common(struct ethoc *priv, void *packet, int length) bd.stat |= TX_BD_PAD; else bd.stat &= ~TX_BD_PAD; - bd.addr = virt_to_phys(packet); + if (priv->packet) { + void *p = priv->packet + entry * PKTSIZE_ALIGN; + + memcpy(p, packet, length); + packet = p; + } else { + bd.addr = virt_to_phys(packet); + } flush_dcache_range((ulong)packet, (ulong)packet + length); bd.stat &= ~(TX_BD_STATS | TX_BD_LEN_MASK); bd.stat |= TX_BD_LEN(length); @@ -468,12 +490,17 @@ static int ethoc_free_pkt_common(struct ethoc *priv) struct ethoc_bd bd; u32 i = priv->cur_rx % priv->num_rx; u32 entry = priv->num_tx + i; + void *src; ethoc_read_bd(priv, entry, &bd); + if (priv->packet) + src = priv->packet + entry * PKTSIZE_ALIGN; + else + src = net_rx_packets[i]; /* clear the buffer descriptor so it can be reused */ - flush_dcache_range((ulong)net_rx_packets[i], - (ulong)net_rx_packets[i] + PKTSIZE_ALIGN); + flush_dcache_range((ulong)src, + (ulong)src + PKTSIZE_ALIGN); bd.stat &= ~RX_BD_STATS; bd.stat |= RX_BD_EMPTY; ethoc_write_bd(priv, entry, &bd); @@ -606,8 +633,12 @@ static void ethoc_stop(struct udevice *dev) static int ethoc_ofdata_to_platdata(struct udevice *dev) { struct ethoc_eth_pdata *pdata = dev_get_platdata(dev); + fdt_addr_t addr; pdata->eth_pdata.iobase = dev_get_addr(dev); + addr = dev_get_addr_index(dev, 1); + if (addr != FDT_ADDR_T_NONE) + pdata->packet_base = addr; return 0; } @@ -617,6 +648,11 @@ static int ethoc_probe(struct udevice *dev) struct ethoc *priv = dev_get_priv(dev); priv->iobase = ioremap(pdata->eth_pdata.iobase, ETHOC_IOSIZE); + if (pdata->packet_base) { + priv->packet_phys = pdata->packet_base; + priv->packet = ioremap(pdata->packet_base, + (1 + PKTBUFSRX) * PKTSIZE_ALIGN); + } return 0; } diff --git a/include/dm/platform_data/net_ethoc.h b/include/dm/platform_data/net_ethoc.h index 1d8c73c..3f94bde 100644 --- a/include/dm/platform_data/net_ethoc.h +++ b/include/dm/platform_data/net_ethoc.h @@ -13,6 +13,7 @@ struct ethoc_eth_pdata { struct eth_pdata eth_pdata; + phys_addr_t packet_base; }; #endif