[PATCH 045/111] LEON GRSPW: updated to new DRVMGR translation interface

Daniel Hellstrom daniel at gaisler.com
Thu Feb 26 16:38:47 UTC 2015


---
 c/src/lib/libbsp/sparc/shared/spw/grspw.c |  171 ++++++++++++++++++----------
 1 files changed, 110 insertions(+), 61 deletions(-)

diff --git a/c/src/lib/libbsp/sparc/shared/spw/grspw.c b/c/src/lib/libbsp/sparc/shared/spw/grspw.c
index 5cedcb9..ebf7fe0 100644
--- a/c/src/lib/libbsp/sparc/shared/spw/grspw.c
+++ b/c/src/lib/libbsp/sparc/shared/spw/grspw.c
@@ -116,11 +116,12 @@ typedef struct {
    char *ptr_rxbuf0;
    char *ptr_txdbuf0;
    char *ptr_txhbuf0;
-   char *ptr_bd0;
+   char *_ptr_bd0, *ptr_bd0;
 
    char *ptr_rxbuf0_remote;
    char *ptr_txdbuf0_remote;
    char *ptr_txhbuf0_remote;
+   char *ptr_bd0_remote;
 
    unsigned int irq;
    int minor;
@@ -610,74 +611,123 @@ static unsigned int grspw_calc_disconnect(int freq_khz){
 
 static int grspw_buffer_alloc(GRSPW_DEV *pDev)
 {
-	if ( pDev->rx_dma_area ) {
-#warning Check size?
-		if ( pDev->rx_dma_area & 1 ) {
-			/* Address given in remote address */
-			drvmgr_translate(pDev->dev, 1, 1, (void *)(pDev->rx_dma_area & ~1), (void **)&pDev->ptr_rxbuf0);
-		} else {
-			pDev->ptr_rxbuf0 = pDev->rx_dma_area;
-		}
+	/* RX DMA AREA */
+	if (pDev->rx_dma_area & 1) {
+		/* Address given in remote address */
+		pDev->ptr_rxbuf0_remote = (char *)(pDev->rx_dma_area & ~1);
+		drvmgr_translate_check(
+			pDev->dev,
+			DMAMEM_TO_CPU,
+			(void *)pDev->ptr_rxbuf0_remote,
+			(void **)&pDev->ptr_rxbuf0,
+			pDev->rxbufsize * pDev->rxbufcnt);
+		
 	} else {
-		if (pDev->_ptr_rxbuf0) {
-			free(pDev->_ptr_rxbuf0);
-		}
-		pDev->_ptr_rxbuf0 = (unsigned int) malloc(pDev->rxbufsize * pDev->rxbufcnt+4);
-		pDev->ptr_rxbuf0 = (char *)((pDev->_ptr_rxbuf0+7)&~7);
-		if ( !pDev->ptr_rxbuf0 )
-			return 1;
-	}
-	if ( pDev->tx_data_dma_area ) {
-		if ( pDev->tx_data_dma_area & 1 ) {
-			/* Address given in remote address */
-			drvmgr_translate(pDev->dev, 1, 1, (void *)(pDev->tx_data_dma_area & ~1), (void **)&pDev->ptr_txdbuf0);
+		if (pDev->rx_dma_area == 0) {
+			if (pDev->_ptr_rxbuf0)
+				free((void *)pDev->_ptr_rxbuf0);
+			pDev->_ptr_rxbuf0 = (unsigned int) malloc(pDev->rxbufsize * pDev->rxbufcnt+4);
+			pDev->ptr_rxbuf0 = (char *)((pDev->_ptr_rxbuf0+7)&~7);
+			if ( !pDev->ptr_rxbuf0 )
+				return 1;
 		} else {
-			pDev->ptr_txdbuf0 = pDev->tx_data_dma_area;
+			pDev->ptr_rxbuf0 = (char *)pDev->rx_dma_area;
 		}
-	} else {
-		if (pDev->ptr_txdbuf0) {
-			free(pDev->ptr_txdbuf0);
-		}
-		pDev->ptr_txdbuf0 = (char *) malloc(pDev->txdbufsize * pDev->txbufcnt);
-		if ( !pDev->ptr_txdbuf0 )
-			return 1;
+		drvmgr_translate_check(
+			pDev->dev,
+			CPUMEM_TO_DMA,
+			(void *)pDev->ptr_rxbuf0,
+			(void **)&pDev->ptr_rxbuf0_remote,
+			pDev->rxbufsize * pDev->rxbufcnt);
 	}
-	if ( pDev->tx_hdr_dma_area ) {
-		if ( pDev->tx_hdr_dma_area & 1 ) {
-			/* Address given in remote address */
-			drvmgr_translate(pDev->dev, 1, 1, (void *)(pDev->tx_hdr_dma_area & ~1), (void **)&pDev->ptr_txhbuf0);
-		} else {
-			pDev->ptr_txhbuf0 = pDev->tx_hdr_dma_area;
-		}
+
+	/* TX-DATA DMA AREA */
+	if (pDev->tx_data_dma_area & 1) {
+		/* Address given in remote address */
+		pDev->ptr_txdbuf0_remote = (char*)(pDev->tx_data_dma_area & ~1);
+		drvmgr_translate_check(
+			pDev->dev,
+			DMAMEM_TO_CPU,
+			(void *)pDev->ptr_txdbuf0_remote,
+			(void **)&pDev->ptr_txdbuf0,
+			pDev->txdbufsize * pDev->txbufcnt);
 	} else {
-		if (pDev->ptr_txhbuf0) {
-			free(pDev->ptr_txhbuf0);
+		if (pDev->tx_data_dma_area == 0) {
+			if (pDev->ptr_txdbuf0)
+				free(pDev->ptr_txdbuf0);
+			pDev->ptr_txdbuf0 = (char *) malloc(pDev->txdbufsize * pDev->txbufcnt);
+			if (!pDev->ptr_txdbuf0)
+				return 1;
+		} else {
+			pDev->ptr_txdbuf0 = (char *)pDev->tx_data_dma_area;
 		}
-		pDev->ptr_txhbuf0 = (char *) malloc(pDev->txhbufsize * pDev->txbufcnt);
-		if ( !pDev->ptr_txhbuf0 )
-			return 1;
+		drvmgr_translate_check(
+			pDev->dev,
+			CPUMEM_TO_DMA,
+			(void *)pDev->ptr_txdbuf0,
+			(void **)&pDev->ptr_txdbuf0_remote,
+			pDev->txdbufsize * pDev->txbufcnt);
 	}
-	if ( pDev->bd_dma_area ) {
-		if ( pDev->bd_dma_area & 1 ) {
-			/* Address given in remote address */
-			drvmgr_translate(pDev->dev, 1, 1, (void *)(pDev->bd_dma_area & ~1), (void **)&pDev->ptr_bd0);
+
+	/* TX-HEADER DMA AREA */
+	if (pDev->tx_hdr_dma_area & 1) {
+		/* Address given in remote address */
+		pDev->ptr_txhbuf0_remote = (char *)(pDev->tx_hdr_dma_area & ~1);
+		drvmgr_translate_check(
+			pDev->dev,
+			DMAMEM_TO_CPU,
+			(void *)pDev->ptr_txhbuf0_remote,
+			(void **)&pDev->ptr_txhbuf0,
+			pDev->txhbufsize * pDev->txbufcnt);
+	} else {
+		if (pDev->tx_hdr_dma_area == 0) {
+			if (pDev->ptr_txhbuf0)
+				free(pDev->ptr_txhbuf0);
+			pDev->ptr_txhbuf0 = (char *) malloc(pDev->txhbufsize * pDev->txbufcnt);
+			if (!pDev->ptr_txhbuf0)
+				return 1;
 		} else {
-			pDev->ptr_bd0 = pDev->bd_dma_area;
+			pDev->ptr_txhbuf0 = (char *)pDev->tx_hdr_dma_area;
 		}
+		drvmgr_translate_check(
+			pDev->dev,
+			CPUMEM_TO_DMA,
+			(void *)pDev->ptr_txhbuf0,
+			(void **)&pDev->ptr_txhbuf0_remote,
+			pDev->txhbufsize * pDev->txbufcnt);
+	}
+
+	/* DMA DESCRIPTOR TABLES */
+	if (pDev->bd_dma_area & 1) {
+		/* Address given in remote address */
+		pDev->ptr_bd0_remote = (char *)(pDev->bd_dma_area & ~1);
+		drvmgr_translate_check(
+			pDev->dev,
+			DMAMEM_TO_CPU,
+			(void *)pDev->ptr_bd0_remote,
+			(void **)&pDev->ptr_bd0,
+			2 * SPACEWIRE_BDTABLE_SIZE);
 	} else {
-		if (pDev->ptr_bd0) {
-			free(pDev->ptr_bd0);
+		if (pDev->bd_dma_area == 0) {
+			if (pDev->_ptr_bd0)
+				free(pDev->_ptr_bd0);
+			pDev->_ptr_bd0 =
+				rtems_heap_allocate_aligned_with_boundary(
+					SPACEWIRE_BDTABLE_SIZE*2, 1024, 0);
+			if (!pDev->_ptr_bd0)
+				return 1;
+			pDev->ptr_bd0 = (char *)pDev->_ptr_bd0;
+		} else {
+			pDev->ptr_bd0 = (char *)pDev->bd_dma_area;
 		}
-		pDev->ptr_bd0 = (char *)
-			rtems_heap_allocate_aligned_with_boundary(SPACEWIRE_BDTABLE_SIZE*2, 1024, 0);
-		if ( !pDev->ptr_bd0 )
-			return 1;
+		drvmgr_translate_check(
+			pDev->dev, 
+			CPUMEM_TO_DMA,
+			(void *)pDev->ptr_bd0,
+			(void **)&pDev->ptr_bd0_remote,
+			2 * SPACEWIRE_BDTABLE_SIZE);
 	}
 
-	/* Translate into remote address */
-	drvmgr_translate(pDev->dev, 0, 0, (void *)pDev->ptr_rxbuf0, (void **)&pDev->ptr_rxbuf0_remote);
-	drvmgr_translate(pDev->dev, 0, 0, (void *)pDev->ptr_txdbuf0,(void **)&pDev->ptr_txdbuf0_remote);
-	drvmgr_translate(pDev->dev, 0, 0, (void *)pDev->ptr_txhbuf0, (void **)&pDev->ptr_txhbuf0_remote);
 	return 0;
 }
 
@@ -1549,11 +1599,11 @@ static int grspw_hw_init(GRSPW_DEV *pDev) {
 	ctrl = SPW_CTRL_READ(pDev);
 
 	pDev->rx = (SPACEWIRE_RXBD *) pDev->ptr_bd0;
-	pDev->tx = (SPACEWIRE_TXBD *) &pDev->rx[SPACEWIRE_RXBUFS_NR];
+	pDev->tx = (SPACEWIRE_TXBD *) (pDev->ptr_bd0 + SPACEWIRE_BDTABLE_SIZE);
 
-	/* Translate into remote address */
-	drvmgr_translate(pDev->dev, 0, 0, (void *)pDev->rx, (void **)&pDev->rx_remote);
-	drvmgr_translate(pDev->dev, 0, 0, (void *)pDev->tx, (void **)&pDev->tx_remote);
+	/* Set up remote addresses */
+	pDev->rx_remote = (unsigned int)pDev->ptr_bd0_remote;
+	pDev->tx_remote = pDev->rx_remote + SPACEWIRE_BDTABLE_SIZE;
 
 	SPACEWIRE_DBG("hw_init [minor %i]\n", pDev->minor);
 
@@ -1735,7 +1785,6 @@ int grspw_hw_send(GRSPW_DEV *pDev, unsigned int hlen, char *hdr, unsigned int dl
 	char *txd = pDev->ptr_txdbuf0 + (cur * pDev->txdbufsize);
 	char *txh_remote = pDev->ptr_txhbuf0_remote + (cur * pDev->txhbufsize);
 	char *txd_remote = pDev->ptr_txdbuf0_remote + (cur * pDev->txdbufsize);
-	unsigned int tmp, tmp2;
 	
 	ctrl = SPW_READ((volatile void *)&pDev->tx[cur].ctrl);
 
-- 
1.7.0.4




More information about the devel mailing list