All of lore.kernel.org
 help / color / mirror / Atom feed
From: Stefan Roese <sr@denx.de>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v1 16/41] net: mvpp2: adjust the allocation/free of BM pools for PPv2.2
Date: Tue, 21 Mar 2017 15:27:37 +0100	[thread overview]
Message-ID: <20170321142802.24276-17-sr@denx.de> (raw)
In-Reply-To: <20170321142802.24276-1-sr@denx.de>

From: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>

This commit adjusts the allocation and freeing of BM pools to support
PPv2.2. This involves:

- Checking that the number of buffer pointers is a multiple of 16, as
  required by the hardware.

- Adjusting the size of the DMA coherent area allocated for buffer
  pointers. Indeed, PPv2.2 needs space for 2 pointers of 64-bits per
  buffer, as opposed to 2 pointers of 32-bits per buffer in
  PPv2.1. The size in bytes is now stored in a new field of the
  mvpp2_bm_pool structure.

- On PPv2.2, getting the physical and virtual address of each buffer
  requires reading the MVPP2_BM_ADDR_HIGH_ALLOC to get the high order
  bits of those addresses. A new utility function
  mvpp2_bm_bufs_get_addrs() is introduced to handle this.

- On PPv2.2, releasing a buffer requires writing the high order 32 bits
  of the physical address to MVPP2_BM_PHY_VIRT_HIGH_RLS_REG. We no
  longer need to write the virtual address to MVPP2_BM_VIRT_RLS_REG.

Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Signed-off-by: Stefan Roese <sr@denx.de>
---

 drivers/net/mvpp2.c | 39 ++++++++++++++++++++++++++++++++++++---
 1 file changed, 36 insertions(+), 3 deletions(-)

diff --git a/drivers/net/mvpp2.c b/drivers/net/mvpp2.c
index c460ba2112..c5ac6d1b7f 100644
--- a/drivers/net/mvpp2.c
+++ b/drivers/net/mvpp2.c
@@ -251,14 +251,23 @@ do {									\
 #define MVPP2_BM_PHY_ALLOC_REG(pool)		(0x6400 + ((pool) * 4))
 #define     MVPP2_BM_PHY_ALLOC_GRNTD_MASK	BIT(0)
 #define MVPP2_BM_VIRT_ALLOC_REG			0x6440
+#define MVPP2_BM_ADDR_HIGH_ALLOC		0x6444
+#define     MVPP2_BM_ADDR_HIGH_PHYS_MASK	0xff
+#define     MVPP2_BM_ADDR_HIGH_VIRT_MASK	0xff00
+#define     MVPP2_BM_ADDR_HIGH_VIRT_SHIFT	8
 #define MVPP2_BM_PHY_RLS_REG(pool)		(0x6480 + ((pool) * 4))
 #define     MVPP2_BM_PHY_RLS_MC_BUFF_MASK	BIT(0)
 #define     MVPP2_BM_PHY_RLS_PRIO_EN_MASK	BIT(1)
 #define     MVPP2_BM_PHY_RLS_GRNTD_MASK		BIT(2)
 #define MVPP2_BM_VIRT_RLS_REG			0x64c0
-#define MVPP2_BM_MC_RLS_REG			0x64c4
+#define MVPP21_BM_MC_RLS_REG			0x64c4
 #define     MVPP2_BM_MC_ID_MASK			0xfff
 #define     MVPP2_BM_FORCE_RELEASE_MASK		BIT(12)
+#define MVPP22_BM_ADDR_HIGH_RLS_REG		0x64c4
+#define     MVPP22_BM_ADDR_HIGH_PHYS_RLS_MASK	0xff
+#define	    MVPP22_BM_ADDR_HIGH_VIRT_RLS_MASK	0xff00
+#define     MVPP22_BM_ADDR_HIGH_VIRT_RLS_SHIFT	8
+#define MVPP22_BM_MC_RLS_REG			0x64d4
 
 /* TX Scheduler registers */
 #define MVPP2_TXP_SCHED_PORT_INDEX_REG		0x8000
@@ -2333,6 +2342,12 @@ static int mvpp2_bm_pool_create(struct udevice *dev,
 {
 	u32 val;
 
+	/* Number of buffer pointers must be a multiple of 16, as per
+	 * hardware constraints
+	 */
+	if (!IS_ALIGNED(size, 16))
+		return -EINVAL;
+
 	bm_pool->virt_addr = buffer_loc.bm_pool[bm_pool->id];
 	bm_pool->dma_addr = (dma_addr_t)buffer_loc.bm_pool[bm_pool->id];
 	if (!bm_pool->virt_addr)
@@ -2346,7 +2361,7 @@ static int mvpp2_bm_pool_create(struct udevice *dev,
 	}
 
 	mvpp2_write(priv, MVPP2_BM_POOL_BASE_REG(bm_pool->id),
-		    bm_pool->dma_addr);
+		    lower_32_bits(bm_pool->dma_addr));
 	mvpp2_write(priv, MVPP2_BM_POOL_SIZE_REG(bm_pool->id), size);
 
 	val = mvpp2_read(priv, MVPP2_BM_POOL_CTRL_REG(bm_pool->id));
@@ -2489,6 +2504,21 @@ static inline void mvpp2_bm_pool_put(struct mvpp2_port *port, int pool,
 				     dma_addr_t buf_dma_addr,
 				     unsigned long buf_phys_addr)
 {
+	if (port->priv->hw_version == MVPP22) {
+		u32 val = 0;
+
+		if (sizeof(dma_addr_t) == 8)
+			val |= upper_32_bits(buf_dma_addr) &
+				MVPP22_BM_ADDR_HIGH_PHYS_RLS_MASK;
+
+		if (sizeof(phys_addr_t) == 8)
+			val |= (upper_32_bits(buf_phys_addr)
+				<< MVPP22_BM_ADDR_HIGH_VIRT_RLS_SHIFT) &
+				MVPP22_BM_ADDR_HIGH_VIRT_RLS_MASK;
+
+		mvpp2_write(port->priv, MVPP22_BM_ADDR_HIGH_RLS_REG, val);
+	}
+
 	/* MVPP2_BM_VIRT_RLS_REG is not interpreted by HW, and simply
 	 * returned in the "cookie" field of the RX
 	 * descriptor. Instead of storing the virtual address, we
@@ -4240,7 +4270,10 @@ static int mvpp2_base_probe(struct udevice *dev)
 	for (i = 0; i < MVPP2_BM_POOLS_NUM; i++) {
 		buffer_loc.bm_pool[i] =
 			(unsigned long *)((unsigned long)bd_space + size);
-		size += MVPP2_BM_POOL_SIZE_MAX * sizeof(u32);
+		if (priv->hw_version == MVPP21)
+			size += MVPP2_BM_POOL_SIZE_MAX * 2 * sizeof(u32);
+		else
+			size += MVPP2_BM_POOL_SIZE_MAX * 2 * sizeof(u64);
 	}
 
 	for (i = 0; i < MVPP2_BM_LONG_BUF_NUM; i++) {
-- 
2.12.0

  parent reply	other threads:[~2017-03-21 14:27 UTC|newest]

Thread overview: 92+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-03-21 14:27 [U-Boot] [PATCH v1 00/41] Add PPv2.2 support to the mvpp2 ethernet driver and enable it for A7k/8k Stefan Roese
2017-03-21 14:27 ` [U-Boot] [PATCH v1 01/41] bitops.h: Include bitsperlong.h as needed for GENMASK_ULL Stefan Roese
2017-03-21 15:02   ` Tom Rini
2017-03-21 16:53   ` Joe Hershberger
2017-03-21 14:27 ` [U-Boot] [PATCH v1 02/41] net: mvpp2: Round up top tx buffer boundaries for dcache ops Stefan Roese
2017-03-21 16:55   ` Joe Hershberger
2017-03-21 14:27 ` [U-Boot] [PATCH v1 03/41] net: mvpp2: simplify mvpp2_bm_bufs_add() Stefan Roese
2017-03-21 16:57   ` Joe Hershberger
2017-03-21 14:27 ` [U-Boot] [PATCH v1 04/41] net: mvpp2: remove unused register definitions Stefan Roese
2017-03-21 16:58   ` Joe Hershberger
2017-03-21 14:27 ` [U-Boot] [PATCH v1 05/41] net: mvpp2: fix indentation of MVPP2_EXT_GLOBAL_CTRL_DEFAULT Stefan Roese
2017-03-21 16:59   ` Joe Hershberger
2017-03-21 14:27 ` [U-Boot] [PATCH v1 06/41] net: mvpp2: simplify MVPP2_PRS_RI_* definitions Stefan Roese
2017-03-21 17:01   ` Joe Hershberger
2017-03-21 14:27 ` [U-Boot] [PATCH v1 07/41] net: mvpp2: enable building on 64-bit platforms Stefan Roese
2017-03-21 17:02   ` Joe Hershberger
2017-03-21 14:27 ` [U-Boot] [PATCH v1 08/41] net: mvpp2: enable building on 64-bit platforms (more U-Boot specific) Stefan Roese
2017-03-21 17:03   ` Joe Hershberger
2017-03-21 14:27 ` [U-Boot] [PATCH v1 09/41] net: mvpp2: use "dma" instead of "phys" where appropriate Stefan Roese
2017-03-21 17:04   ` Joe Hershberger
2017-03-21 14:27 ` [U-Boot] [PATCH v1 10/41] net: mvpp2: remove support for buffer header Stefan Roese
2017-03-21 17:04   ` Joe Hershberger
2017-03-21 14:27 ` [U-Boot] [PATCH v1 11/41] net: mvpp2: store physical address of buffer in rx_desc->buf_cookie Stefan Roese
2017-03-21 17:06   ` Joe Hershberger
2017-03-21 14:27 ` [U-Boot] [PATCH v1 12/41] net: mvpp2: add and use accessors for TX/RX descriptors Stefan Roese
2017-03-21 17:07   ` Joe Hershberger
2017-03-21 14:27 ` [U-Boot] [PATCH v1 13/41] net: mvpp2: add hw_version field in "struct mvpp2" Stefan Roese
2017-03-21 17:09   ` Joe Hershberger
2017-03-21 14:27 ` [U-Boot] [PATCH v1 14/41] net: mvpp2: introduce an intermediate union for the TX/RX descriptors Stefan Roese
2017-03-21 17:10   ` Joe Hershberger
2017-03-21 14:27 ` [U-Boot] [PATCH v1 15/41] net: mvpp2: introduce PPv2.2 HW descriptors and adapt accessors Stefan Roese
2017-03-21 17:13   ` Joe Hershberger
2017-03-22  7:11     ` Stefan Roese
2017-03-22  8:03       ` Thomas Petazzoni
2017-03-22  8:13         ` Stefan Roese
2017-03-21 14:27 ` Stefan Roese [this message]
2017-03-21 17:18   ` [U-Boot] [PATCH v1 16/41] net: mvpp2: adjust the allocation/free of BM pools for PPv2.2 Joe Hershberger
2017-03-21 14:27 ` [U-Boot] [PATCH v1 17/41] net: mvpp2: adapt the mvpp2_rxq_*_pool_set functions to PPv2.2 Stefan Roese
2017-03-21 17:21   ` Joe Hershberger
2017-03-22  7:13     ` Stefan Roese
2017-03-21 14:27 ` [U-Boot] [PATCH v1 18/41] net: mvpp2: adapt mvpp2_defaults_set() " Stefan Roese
2017-03-21 17:21   ` Joe Hershberger
2017-03-21 14:27 ` [U-Boot] [PATCH v1 19/41] net: mvpp2: adjust mvpp2_{rxq, txq}_init for PPv2.2 Stefan Roese
2017-03-21 17:25   ` Joe Hershberger
2017-03-22  7:17     ` Stefan Roese
2017-03-21 14:27 ` [U-Boot] [PATCH v1 20/41] net: mvpp2: handle register mapping and access " Stefan Roese
2017-03-21 17:33   ` Joe Hershberger
2017-03-22  7:19     ` Stefan Roese
2017-03-21 14:27 ` [U-Boot] [PATCH v1 21/41] net: mvpp2: handle misc PPv2.1/PPv2.2 differences Stefan Roese
2017-03-21 17:35   ` Joe Hershberger
2017-03-21 14:27 ` [U-Boot] [PATCH v1 22/41] net: mvpp2: add AXI bridge initialization for PPv2.2 Stefan Roese
2017-03-21 17:36   ` Joe Hershberger
2017-03-21 14:27 ` [U-Boot] [PATCH v1 23/41] net: mvpp2: rework RXQ interrupt group " Stefan Roese
2017-03-21 17:38   ` Joe Hershberger
2017-03-21 14:27 ` [U-Boot] [PATCH v1 24/41] net: mvpp2: adapt rxq distribution to PPv2.2 Stefan Roese
2017-03-21 17:42   ` Joe Hershberger
2017-03-21 14:27 ` [U-Boot] [PATCH v1 25/41] net: mvpp2: finally add the PPv2.2 compatible string Stefan Roese
2017-03-21 17:42   ` Joe Hershberger
2017-03-21 14:27 ` [U-Boot] [PATCH v1 26/41] net: mvpp2: Add MDIO support for PPv2.2 Stefan Roese
2017-03-21 17:44   ` Joe Hershberger
2017-03-21 14:27 ` [U-Boot] [PATCH v1 27/41] net: mvpp2: Move probe function from MISC to ETH DM driver Stefan Roese
2017-03-21 17:47   ` Joe Hershberger
2017-03-21 14:27 ` [U-Boot] [PATCH v1 28/41] net: mvpp2.c: Clear all buffer / descriptor areas before usage Stefan Roese
2017-03-21 17:47   ` Joe Hershberger
2017-03-21 14:27 ` [U-Boot] [PATCH v1 29/41] net: mvpp2: Enable compilation for Armada 7K/8K platforms Stefan Roese
2017-03-21 17:50   ` Joe Hershberger
2017-03-21 14:27 ` [U-Boot] [PATCH v1 30/41] arm64: marvell: dts: add PPv2.2 description to Armada 7K/8K Stefan Roese
2017-03-21 17:52   ` Joe Hershberger
2017-03-21 14:27 ` [U-Boot] [PATCH v1 31/41] arm64: mvebu: armada-7k/8k: Enable MVPP2 ethernet driver Stefan Roese
2017-03-21 17:54   ` Joe Hershberger
2017-03-21 14:27 ` [U-Boot] [PATCH v1 32/41] net: mvpp2: Handle eth device naming in multi-CP case correctly Stefan Roese
2017-03-21 17:56   ` Joe Hershberger
2017-03-21 14:27 ` [U-Boot] [PATCH v1 33/41] net: mvpp2: Add remove function that is called before the OS is started Stefan Roese
2017-03-21 17:57   ` Joe Hershberger
2017-03-21 14:27 ` [U-Boot] [PATCH v1 34/41] net: mvpp2: Add RX and TX FIFO configuration for PPv2.2 Stefan Roese
2017-03-21 17:59   ` Joe Hershberger
2017-03-22  7:27     ` Stefan Roese
2017-03-21 14:27 ` [U-Boot] [PATCH v1 35/41] net: include/phy.h: Add new PHY interface modes Stefan Roese
2017-03-21 18:00   ` Joe Hershberger
2017-03-21 14:27 ` [U-Boot] [PATCH v1 36/41] net: mvpp2: Add Group-of-Ports and Net-Compex configuration for PPv2.2 Stefan Roese
2017-03-21 18:03   ` Joe Hershberger
2017-03-22  7:50     ` Stefan Roese
2017-03-21 14:27 ` [U-Boot] [PATCH v1 37/41] net: mvpp2: Enable PHY polling mode on PPv2.2 Stefan Roese
2017-03-21 18:04   ` Joe Hershberger
2017-03-21 14:27 ` [U-Boot] [PATCH v1 38/41] net: mvpp2: Configure SMI PHY address needed for PHY polling Stefan Roese
2017-03-21 18:05   ` Joe Hershberger
2017-03-21 14:28 ` [U-Boot] [PATCH v1 39/41] net: mvpp2: Remove unreferenced in_use_thresh from struct mvpp2_bm_pool Stefan Roese
2017-03-21 18:06   ` Joe Hershberger
2017-03-21 14:28 ` [U-Boot] [PATCH v1 40/41] arm64: mvebu: armada-7040-db.dts: Change eth1 speed from 2.5G to 1G Stefan Roese
2017-03-21 18:06   ` Joe Hershberger
2017-03-21 14:28 ` [U-Boot] [PATCH v1 41/41] arm64: mvebu: Enable CONFIG_PHY_MARVELL in Armada7k/8k-DB defconfig Stefan Roese
2017-03-21 18:07   ` Joe Hershberger

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170321142802.24276-17-sr@denx.de \
    --to=sr@denx.de \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.