All of lore.kernel.org
 help / color / mirror / Atom feed
From: Troy Kisky <troy.kisky@boundarydevices.com>
To: Sriramakrishnan <srk@ti.com>
Cc: netdev@vger.kernel.org, davinci-linux-open-source@linux.davincidsp.com
Subject: Re: [PATCH 3/3] TI Davinci EMAC : Abstract Buffer address translation logic.
Date: Wed, 18 Nov 2009 12:15:22 -0700	[thread overview]
Message-ID: <4B0447CA.6040607@boundarydevices.com> (raw)
In-Reply-To: <1258537328-31527-4-git-send-email-srk@ti.com>

Sriramakrishnan wrote:
> When programming the DMA engine, the next pointers must be
> programmed with physical address as seen from the DMA master
> address space. This address may be different from physical
> address of the buffer RAM area. This patch abstracts the
> buffer address translation logic.
> 
> Signed-off-by: Sriramakrishnan <srk@ti.com>
> Acked-by: Chaithrika U S <chaithrika@ti.com>
> ---
>  drivers/net/davinci_emac.c   |   41 ++++++++++++++++++++++++-----------------
>  include/linux/davinci_emac.h |    1 +
>  2 files changed, 25 insertions(+), 17 deletions(-)
> 
> diff --git a/drivers/net/davinci_emac.c b/drivers/net/davinci_emac.c
> index 81931f8..d4e173b 100644
> --- a/drivers/net/davinci_emac.c
> +++ b/drivers/net/davinci_emac.c
> @@ -464,6 +464,7 @@ struct emac_priv {
>  	void __iomem *ctrl_base;
>  	void __iomem *emac_ctrl_ram;
>  	u32 ctrl_ram_size;
> +	u32 hw_ram_addr;
>  	struct emac_txch *txch[EMAC_DEF_MAX_TX_CH];
>  	struct emac_rxch *rxch[EMAC_DEF_MAX_RX_CH];
>  	u32 link; /* 1=link on, 0=link off */
> @@ -497,11 +498,9 @@ static struct clk *emac_clk;
>  static unsigned long emac_bus_frequency;
>  static unsigned long mdio_max_freq;
>  
> -/* EMAC internal utility function */
> -static inline u32 emac_virt_to_phys(void __iomem *addr)
> -{
> -	return (u32 __force) io_v2p(addr);
> -}
> +#define emac_virt_to_phys(addr, priv) \
> +	(((u32 __force)(addr) - (u32 __force)(priv->emac_ctrl_ram)) \
> +	+ priv->hw_ram_addr)


Maybe instead of hw_ram_addr, you could use virtual_to_phys_translation
where virtual_to_phys_translation = your hw_ram_addr - emac_ctrl_ram

I'm fine with your way too though.

>  
>  /* Cache macros - Packet buffers would be from skb pool which is cached */
>  #define EMAC_VIRT_NOCACHE(addr) (addr)
> @@ -1309,7 +1308,7 @@ static int emac_tx_bdproc(struct emac_priv *priv, u32 ch, u32 budget)
>  	curr_bd = txch->active_queue_head;
>  	if (NULL == curr_bd) {
>  		emac_write(EMAC_TXCP(ch),
> -			   emac_virt_to_phys(txch->last_hw_bdprocessed));
> +			   emac_virt_to_phys(txch->last_hw_bdprocessed, priv));
>  		txch->no_active_pkts++;
>  		spin_unlock_irqrestore(&priv->tx_lock, flags);
>  		return 0;
> @@ -1319,7 +1318,7 @@ static int emac_tx_bdproc(struct emac_priv *priv, u32 ch, u32 budget)
>  	while ((curr_bd) &&
>  	      ((frame_status & EMAC_CPPI_OWNERSHIP_BIT) == 0) &&
>  	      (pkts_processed < budget)) {
> -		emac_write(EMAC_TXCP(ch), emac_virt_to_phys(curr_bd));
> +		emac_write(EMAC_TXCP(ch), emac_virt_to_phys(curr_bd, priv));
>  		txch->active_queue_head = curr_bd->next;
>  		if (frame_status & EMAC_CPPI_EOQ_BIT) {
>  			if (curr_bd->next) {	/* misqueued packet */
> @@ -1406,7 +1405,7 @@ static int emac_send(struct emac_priv *priv, struct emac_netpktobj *pkt, u32 ch)
>  		txch->active_queue_tail = curr_bd;
>  		if (1 != txch->queue_active) {
>  			emac_write(EMAC_TXHDP(ch),
> -					emac_virt_to_phys(curr_bd));
> +					emac_virt_to_phys(curr_bd, priv));
>  			txch->queue_active = 1;
>  		}
>  		++txch->queue_reinit;
> @@ -1418,10 +1417,11 @@ static int emac_send(struct emac_priv *priv, struct emac_netpktobj *pkt, u32 ch)
>  		tail_bd->next = curr_bd;
>  		txch->active_queue_tail = curr_bd;
>  		tail_bd = EMAC_VIRT_NOCACHE(tail_bd);
> -		tail_bd->h_next = (int)emac_virt_to_phys(curr_bd);
> +		tail_bd->h_next = (int)emac_virt_to_phys(curr_bd, priv);
>  		frame_status = tail_bd->mode;
>  		if (frame_status & EMAC_CPPI_EOQ_BIT) {
> -			emac_write(EMAC_TXHDP(ch), emac_virt_to_phys(curr_bd));
> +			emac_write(EMAC_TXHDP(ch),
> +				emac_virt_to_phys(curr_bd, priv));
>  			frame_status &= ~(EMAC_CPPI_EOQ_BIT);
>  			tail_bd->mode = frame_status;
>  			++txch->end_of_queue_add;
> @@ -1611,7 +1611,8 @@ static int emac_init_rxch(struct emac_priv *priv, u32 ch, char *param)
>  		}
>  
>  		/* populate the hardware descriptor */
> -		curr_bd->h_next = emac_virt_to_phys(rxch->active_queue_head);
> +		curr_bd->h_next = emac_virt_to_phys(rxch->active_queue_head,
> +				priv);
>  		/* FIXME buff_ptr = dma_map_single(... data_ptr ...) */
>  		curr_bd->buff_ptr = virt_to_phys(curr_bd->data_ptr);
>  		curr_bd->off_b_len = rxch->buf_size;
> @@ -1886,7 +1887,7 @@ static void emac_addbd_to_rx_queue(struct emac_priv *priv, u32 ch,
>  		rxch->active_queue_tail = curr_bd;
>  		if (0 != rxch->queue_active) {
>  			emac_write(EMAC_RXHDP(ch),
> -				   emac_virt_to_phys(rxch->active_queue_head));
> +			   emac_virt_to_phys(rxch->active_queue_head, priv));
>  			rxch->queue_active = 1;
>  		}
>  	} else {
> @@ -1897,11 +1898,11 @@ static void emac_addbd_to_rx_queue(struct emac_priv *priv, u32 ch,
>  		rxch->active_queue_tail = curr_bd;
>  		tail_bd->next = curr_bd;
>  		tail_bd = EMAC_VIRT_NOCACHE(tail_bd);
> -		tail_bd->h_next = emac_virt_to_phys(curr_bd);
> +		tail_bd->h_next = emac_virt_to_phys(curr_bd, priv);
>  		frame_status = tail_bd->mode;
>  		if (frame_status & EMAC_CPPI_EOQ_BIT) {
>  			emac_write(EMAC_RXHDP(ch),
> -					emac_virt_to_phys(curr_bd));
> +					emac_virt_to_phys(curr_bd, priv));
>  			frame_status &= ~(EMAC_CPPI_EOQ_BIT);
>  			tail_bd->mode = frame_status;
>  			++rxch->end_of_queue_add;
> @@ -1994,7 +1995,7 @@ static int emac_rx_bdproc(struct emac_priv *priv, u32 ch, u32 budget)
>  		curr_pkt->num_bufs = 1;
>  		curr_pkt->pkt_length =
>  			(frame_status & EMAC_RX_BD_PKT_LENGTH_MASK);
> -		emac_write(EMAC_RXCP(ch), emac_virt_to_phys(curr_bd));
> +		emac_write(EMAC_RXCP(ch), emac_virt_to_phys(curr_bd, priv));
>  		++rxch->processed_bd;
>  		last_bd = curr_bd;
>  		curr_bd = last_bd->next;
> @@ -2005,7 +2006,7 @@ static int emac_rx_bdproc(struct emac_priv *priv, u32 ch, u32 budget)
>  			if (curr_bd) {
>  				++rxch->mis_queued_packets;
>  				emac_write(EMAC_RXHDP(ch),
> -					   emac_virt_to_phys(curr_bd));
> +					   emac_virt_to_phys(curr_bd, priv));
>  			} else {
>  				++rxch->end_of_queue;
>  				rxch->queue_active = 0;
> @@ -2106,7 +2107,7 @@ static int emac_hw_enable(struct emac_priv *priv)
>  		emac_write(EMAC_RXINTMASKSET, BIT(ch));
>  		rxch->queue_active = 1;
>  		emac_write(EMAC_RXHDP(ch),
> -			   emac_virt_to_phys(rxch->active_queue_head));
> +			   emac_virt_to_phys(rxch->active_queue_head, priv));
>  	}
>  
>  	/* Enable MII */
> @@ -2705,6 +2706,12 @@ static int __devinit davinci_emac_probe(struct platform_device *pdev)
>  	priv->ctrl_ram_size = pdata->ctrl_ram_size;
>  	priv->emac_ctrl_ram = priv->remap_addr + pdata->ctrl_ram_offset;
>  
> +	if (pdata->hw_ram_addr)
> +		priv->hw_ram_addr = pdata->hw_ram_addr;
> +	else
> +		priv->hw_ram_addr = (u32 __force)res->start +
> +					pdata->ctrl_ram_offset;
> +
>  	res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
>  	if (!res) {
>  		dev_err(emac_dev, "DaVinci EMAC: Error getting irq res\n");
> diff --git a/include/linux/davinci_emac.h b/include/linux/davinci_emac.h
> index eb24dc0..b318dfd 100644
> --- a/include/linux/davinci_emac.h
> +++ b/include/linux/davinci_emac.h
> @@ -19,6 +19,7 @@ struct emac_platform_data {
>  	u32 ctrl_reg_offset;
>  	u32 ctrl_mod_reg_offset;
>  	u32 ctrl_ram_offset;
> +	u32 hw_ram_addr;
>  	u32 mdio_reg_offset;
>  	u32 ctrl_ram_size;
>  	u32 phy_mask;


  reply	other threads:[~2009-11-18 19:15 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-11-18  9:42 [PATCH 0/3] TI EMAC driver : Make driver re-usable on non-davinci platforms Sriramakrishnan
2009-11-18  9:42 ` [PATCH 1/3] TI Davinci EMAC : Re-use driver for other platforms Sriramakrishnan
2009-11-18  9:42   ` [PATCH 2/3] TI Davinci EMAC : add platform specific interrupt enable/disable logic Sriramakrishnan
2009-11-18  9:42     ` [PATCH 3/3] TI Davinci EMAC : Abstract Buffer address translation logic Sriramakrishnan
2009-11-18 19:15       ` Troy Kisky [this message]
     [not found]     ` <1258537328-31527-3-git-send-email-srk-l0cyMroinI0@public.gmane.org>
2009-11-18 19:08       ` [PATCH 2/3] TI Davinci EMAC : add platform specific interrupt enable/disable logic Troy Kisky
2009-11-18 22:29         ` Kevin Hilman
2009-11-18 13:12 ` [PATCH 0/3] TI EMAC driver : Make driver re-usable on non-davinci platforms David Miller
2009-11-18 17:53 ` Kevin Hilman

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=4B0447CA.6040607@boundarydevices.com \
    --to=troy.kisky@boundarydevices.com \
    --cc=davinci-linux-open-source@linux.davincidsp.com \
    --cc=netdev@vger.kernel.org \
    --cc=srk@ti.com \
    /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.