From: Nicolas Ferre <nicolas.ferre@atmel.com>
To: Arun Chandran <achandran@mvista.com>, <netdev@vger.kernel.org>,
<linux-kernel@vger.kernel.org>, Michal Simek <monstr@monstr.eu>
Subject: Re: [PATCH] net: macb: Add big endian CPU support
Date: Tue, 24 Feb 2015 13:57:06 +0100 [thread overview]
Message-ID: <54EC7522.40006@atmel.com> (raw)
In-Reply-To: <1424763572-23317-1-git-send-email-achandran@mvista.com>
Le 24/02/2015 08:39, Arun Chandran a écrit :
> This patch converts all __raw_readl and __raw_writel function calls
> to their corresponding readl_relaxed and writel_relaxed variants.
>
> It also tells the driver to set ahb_endian_swp_mgmt_en bit in dma_cfg
> when the cpu is configured in big endian mode.
>
> Signed-off-by: Arun Chandran <achandran@mvista.com>
> ---
> This patch is tested on xilinx ZC702 evaluation board with
> CONFIG_CPU_BIG_ENDIAN=y and booting NFS rootfs
> Added on the fly IP endianness detection according to
> comments from Michal Simek.
> ---
> ---
> drivers/net/ethernet/cadence/macb.c | 33 +++++++++++++++++++++++++++------
> drivers/net/ethernet/cadence/macb.h | 15 ++++++++-------
> 2 files changed, 35 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/net/ethernet/cadence/macb.c b/drivers/net/ethernet/cadence/macb.c
> index ad76b8e..1642911 100644
> --- a/drivers/net/ethernet/cadence/macb.c
> +++ b/drivers/net/ethernet/cadence/macb.c
> @@ -449,7 +449,7 @@ static void macb_update_stats(struct macb *bp)
> WARN_ON((unsigned long)(end - p - 1) != (MACB_TPF - MACB_PFR) / 4);
>
> for(; p < end; p++, reg++)
> - *p += __raw_readl(reg);
> + *p += readl_relaxed(reg);
> }
>
> static int macb_halt_tx(struct macb *bp)
> @@ -1578,6 +1578,7 @@ static u32 macb_dbw(struct macb *bp)
> static void macb_configure_dma(struct macb *bp)
> {
> u32 dmacfg;
> + u32 tmp, ncr;
>
> if (macb_is_gem(bp)) {
> dmacfg = gem_readl(bp, DMACFG) & ~GEM_BF(RXBS, -1L);
> @@ -1585,7 +1586,25 @@ static void macb_configure_dma(struct macb *bp)
> if (bp->dma_burst_length)
> dmacfg = GEM_BFINS(FBLDO, bp->dma_burst_length, dmacfg);
> dmacfg |= GEM_BIT(TXPBMS) | GEM_BF(RXBMS, -1L);
> - dmacfg &= ~GEM_BIT(ENDIA);
> + dmacfg &= ~GEM_BIT(ENDIA_PKT);
I think this will fail... (see below)
> +
> + /* Here we use the loopback bit of net_ctrl register to detect
> + * endianness on IP. save it first. Program swaped mode for
> + * management descriptor accesses if writing to loop back bit
> + * and reading it back brings no change in bit value.
> + */
> + ncr = macb_readl(bp, NCR);
> + __raw_writel(MACB_BIT(LLB), bp->regs + MACB_NCR);
> + tmp = __raw_readl(bp->regs + MACB_NCR);
> +
> + if (tmp == MACB_BIT(LLB))
> + dmacfg &= ~GEM_BIT(ENDIA_DESC);
Ditto
> + else
> + dmacfg |= GEM_BIT(ENDIA_DESC);
Ditto
> +
> + /* Restore net_ctrl */
> + macb_writel(bp, NCR, ncr);
> +
> if (bp->dev->features & NETIF_F_HW_CSUM)
> dmacfg |= GEM_BIT(TXCOEN);
> else
> @@ -1832,14 +1851,14 @@ static void gem_update_stats(struct macb *bp)
>
> for (i = 0; i < GEM_STATS_LEN; ++i, ++p) {
> u32 offset = gem_statistics[i].offset;
> - u64 val = __raw_readl(bp->regs + offset);
> + u64 val = readl_relaxed(bp->regs + offset);
>
> bp->ethtool_stats[i] += val;
> *p += val;
>
> if (offset == GEM_OCTTXL || offset == GEM_OCTRXL) {
> /* Add GEM_OCTTXH, GEM_OCTRXH */
> - val = __raw_readl(bp->regs + offset + 4);
> + val = readl_relaxed(bp->regs + offset + 4);
> bp->ethtool_stats[i] += ((u64)val) << 32;
> *(++p) += val;
> }
> @@ -2191,12 +2210,14 @@ static void macb_probe_queues(void __iomem *mem,
> *num_queues = 1;
>
> /* is it macb or gem ? */
> - mid = __raw_readl(mem + MACB_MID);
> + mid = readl_relaxed(mem + MACB_MID);
> +
> if (MACB_BFEXT(IDNUM, mid) != 0x2)
> return;
>
> /* bit 0 is never set but queue 0 always exists */
> - *queue_mask = __raw_readl(mem + GEM_DCFG6) & 0xff;
> + *queue_mask = readl_relaxed(mem + GEM_DCFG6) & 0xff;
> +
> *queue_mask |= 0x1;
>
> for (hw_q = 1; hw_q < MACB_MAX_QUEUES; ++hw_q)
> diff --git a/drivers/net/ethernet/cadence/macb.h b/drivers/net/ethernet/cadence/macb.h
> index 31dc080..57f0a1a 100644
> --- a/drivers/net/ethernet/cadence/macb.h
> +++ b/drivers/net/ethernet/cadence/macb.h
> @@ -229,7 +229,8 @@
> /* Bitfields in DMACFG. */
> #define GEM_FBLDO_OFFSET 0 /* fixed burst length for DMA */
> #define GEM_FBLDO_SIZE 5
> -#define GEM_ENDIA_OFFSET 7 /* endian swap mode for packet data access */
> +#define GEM_ENDIA_DESC_OFFSET 6 /* endian swap mode for management descriptor access */
> +#define GEM_ENDIA_PKT_OFFSET 7 /* endian swap mode for packet data access */
here you would need to define as well:
#define GEM_ENDIA_DESC_SIZE 1
#define GEM_ENDIA_PKT_SIZE 1
Otherwise, I suspect that the GEM_BIT() macro won't work well.
> #define GEM_ENDIA_SIZE 1
And you can remove this one ^^^^.
> #define GEM_RXBMS_OFFSET 8 /* RX packet buffer memory size select */
> #define GEM_RXBMS_SIZE 2
> @@ -423,17 +424,17 @@
>
> /* Register access macros */
> #define macb_readl(port,reg) \
> - __raw_readl((port)->regs + MACB_##reg)
> + readl_relaxed((port)->regs + MACB_##reg)
> #define macb_writel(port,reg,value) \
> - __raw_writel((value), (port)->regs + MACB_##reg)
> + writel_relaxed((value), (port)->regs + MACB_##reg)
> #define gem_readl(port, reg) \
> - __raw_readl((port)->regs + GEM_##reg)
> + readl_relaxed((port)->regs + GEM_##reg)
> #define gem_writel(port, reg, value) \
> - __raw_writel((value), (port)->regs + GEM_##reg)
> + writel_relaxed((value), (port)->regs + GEM_##reg)
> #define queue_readl(queue, reg) \
> - __raw_readl((queue)->bp->regs + (queue)->reg)
> + readl_relaxed((queue)->bp->regs + (queue)->reg)
> #define queue_writel(queue, reg, value) \
> - __raw_writel((value), (queue)->bp->regs + (queue)->reg)
> + writel_relaxed((value), (queue)->bp->regs + (queue)->reg)
>
> /* Conditional GEM/MACB macros. These perform the operation to the correct
> * register dependent on whether the device is a GEM or a MACB. For registers
>
--
Nicolas Ferre
next prev parent reply other threads:[~2015-02-24 12:57 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-02-18 11:29 [PATCH] net: macb: Add big endian CPU support Arun Chandran
2015-02-19 12:16 ` Nicolas Ferre
2015-02-19 12:22 ` Michal Simek
2015-02-20 11:45 ` Arun Chandran
2015-02-23 14:10 ` Michal Simek
2015-02-24 7:39 ` Arun Chandran
2015-02-24 12:57 ` Nicolas Ferre [this message]
2015-02-24 17:57 ` Arun Chandran
2015-02-25 10:02 ` Michal Simek
2015-02-25 10:56 ` Arun Chandran
2015-02-25 11:50 ` Michal Simek
2015-02-26 10:44 ` Arun Chandran
2015-02-26 10:47 ` Michal Simek
2015-02-26 11:01 ` [PATCH v3] " Arun Chandran
2015-02-26 11:06 ` Nicolas Ferre
2015-02-26 11:49 ` Michal Simek
2015-02-27 22:24 ` David Miller
2015-02-28 10:43 ` Arun Chandran
[not found] ` <CAFdej03s4-ogLuyi+OK3p897VU6wPUjGDgekBrE3auCvFmjCXw@mail.gmail.com>
2015-02-28 18:02 ` David Miller
2015-03-01 6:08 ` [PATCH 1/2] net: macb: Add on the fly CPU endianness detection Arun Chandran
2015-03-01 6:08 ` [PATCH 2/2] net: macb: Properly add DMACFG bit definitions Arun Chandran
2015-03-02 4:05 ` David Miller
2015-03-02 4:05 ` [PATCH 1/2] net: macb: Add on the fly CPU endianness detection David Miller
2015-02-23 14:38 ` [PATCH] net: macb: Add big endian CPU support Nicolas Ferre
2015-02-24 7:27 ` Arun Chandran
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=54EC7522.40006@atmel.com \
--to=nicolas.ferre@atmel.com \
--cc=achandran@mvista.com \
--cc=linux-kernel@vger.kernel.org \
--cc=monstr@monstr.eu \
--cc=netdev@vger.kernel.org \
/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.