summaryrefslogtreecommitdiffstats
path: root/c/src/lib/libbsp/sparc/shared
diff options
context:
space:
mode:
authorDaniel Hellstrom <daniel@gaisler.com>2015-02-11 14:39:34 +0100
committerDaniel Hellstrom <daniel@gaisler.com>2015-04-17 01:10:19 +0200
commitbc891456edb515ac53eac86948338410ed295184 (patch)
tree5486d621458e8493af8ef58dca6ad82346431239 /c/src/lib/libbsp/sparc/shared
parentGR-CPCI-LEON4-N2X: added PCI peripheral driver for PCI device (diff)
downloadrtems-bc891456edb515ac53eac86948338410ed295184.tar.bz2
LEON GRSPW: updated to new DRVMGR translation interface
Diffstat (limited to 'c/src/lib/libbsp/sparc/shared')
-rw-r--r--c/src/lib/libbsp/sparc/shared/spw/grspw.c171
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 5cedcb9812..ebf7fe00ee 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);