Changeset bc89145 in rtems


Ignore:
Timestamp:
Feb 11, 2015, 1:39:34 PM (5 years ago)
Author:
Daniel Hellstrom <daniel@…>
Branches:
4.11, master
Children:
ab907e8e
Parents:
ffd8002
git-author:
Daniel Hellstrom <daniel@…> (02/11/15 13:39:34)
git-committer:
Daniel Hellstrom <daniel@…> (04/16/15 23:10:19)
Message:

LEON GRSPW: updated to new DRVMGR translation interface

File:
1 edited

Legend:

Unmodified
Added
Removed
  • c/src/lib/libbsp/sparc/shared/spw/grspw.c

    rffd8002 rbc89145  
    117117   char *ptr_txdbuf0;
    118118   char *ptr_txhbuf0;
    119    char *ptr_bd0;
     119   char *_ptr_bd0, *ptr_bd0;
    120120
    121121   char *ptr_rxbuf0_remote;
    122122   char *ptr_txdbuf0_remote;
    123123   char *ptr_txhbuf0_remote;
     124   char *ptr_bd0_remote;
    124125
    125126   unsigned int irq;
     
    611612static int grspw_buffer_alloc(GRSPW_DEV *pDev)
    612613{
    613         if ( pDev->rx_dma_area ) {
    614 #warning Check size?
    615                 if ( pDev->rx_dma_area & 1 ) {
    616                         /* Address given in remote address */
    617                         drvmgr_translate(pDev->dev, 1, 1, (void *)(pDev->rx_dma_area & ~1), (void **)&pDev->ptr_rxbuf0);
     614        /* RX DMA AREA */
     615        if (pDev->rx_dma_area & 1) {
     616                /* Address given in remote address */
     617                pDev->ptr_rxbuf0_remote = (char *)(pDev->rx_dma_area & ~1);
     618                drvmgr_translate_check(
     619                        pDev->dev,
     620                        DMAMEM_TO_CPU,
     621                        (void *)pDev->ptr_rxbuf0_remote,
     622                        (void **)&pDev->ptr_rxbuf0,
     623                        pDev->rxbufsize * pDev->rxbufcnt);
     624               
     625        } else {
     626                if (pDev->rx_dma_area == 0) {
     627                        if (pDev->_ptr_rxbuf0)
     628                                free((void *)pDev->_ptr_rxbuf0);
     629                        pDev->_ptr_rxbuf0 = (unsigned int) malloc(pDev->rxbufsize * pDev->rxbufcnt+4);
     630                        pDev->ptr_rxbuf0 = (char *)((pDev->_ptr_rxbuf0+7)&~7);
     631                        if ( !pDev->ptr_rxbuf0 )
     632                                return 1;
    618633                } else {
    619                         pDev->ptr_rxbuf0 = pDev->rx_dma_area;
    620                 }
     634                        pDev->ptr_rxbuf0 = (char *)pDev->rx_dma_area;
     635                }
     636                drvmgr_translate_check(
     637                        pDev->dev,
     638                        CPUMEM_TO_DMA,
     639                        (void *)pDev->ptr_rxbuf0,
     640                        (void **)&pDev->ptr_rxbuf0_remote,
     641                        pDev->rxbufsize * pDev->rxbufcnt);
     642        }
     643
     644        /* TX-DATA DMA AREA */
     645        if (pDev->tx_data_dma_area & 1) {
     646                /* Address given in remote address */
     647                pDev->ptr_txdbuf0_remote = (char*)(pDev->tx_data_dma_area & ~1);
     648                drvmgr_translate_check(
     649                        pDev->dev,
     650                        DMAMEM_TO_CPU,
     651                        (void *)pDev->ptr_txdbuf0_remote,
     652                        (void **)&pDev->ptr_txdbuf0,
     653                        pDev->txdbufsize * pDev->txbufcnt);
    621654        } else {
    622                 if (pDev->_ptr_rxbuf0) {
    623                         free(pDev->_ptr_rxbuf0);
    624                 }
    625                 pDev->_ptr_rxbuf0 = (unsigned int) malloc(pDev->rxbufsize * pDev->rxbufcnt+4);
    626                 pDev->ptr_rxbuf0 = (char *)((pDev->_ptr_rxbuf0+7)&~7);
    627                 if ( !pDev->ptr_rxbuf0 )
    628                         return 1;
    629         }
    630         if ( pDev->tx_data_dma_area ) {
    631                 if ( pDev->tx_data_dma_area & 1 ) {
    632                         /* Address given in remote address */
    633                         drvmgr_translate(pDev->dev, 1, 1, (void *)(pDev->tx_data_dma_area & ~1), (void **)&pDev->ptr_txdbuf0);
     655                if (pDev->tx_data_dma_area == 0) {
     656                        if (pDev->ptr_txdbuf0)
     657                                free(pDev->ptr_txdbuf0);
     658                        pDev->ptr_txdbuf0 = (char *) malloc(pDev->txdbufsize * pDev->txbufcnt);
     659                        if (!pDev->ptr_txdbuf0)
     660                                return 1;
    634661                } else {
    635                         pDev->ptr_txdbuf0 = pDev->tx_data_dma_area;
    636                 }
     662                        pDev->ptr_txdbuf0 = (char *)pDev->tx_data_dma_area;
     663                }
     664                drvmgr_translate_check(
     665                        pDev->dev,
     666                        CPUMEM_TO_DMA,
     667                        (void *)pDev->ptr_txdbuf0,
     668                        (void **)&pDev->ptr_txdbuf0_remote,
     669                        pDev->txdbufsize * pDev->txbufcnt);
     670        }
     671
     672        /* TX-HEADER DMA AREA */
     673        if (pDev->tx_hdr_dma_area & 1) {
     674                /* Address given in remote address */
     675                pDev->ptr_txhbuf0_remote = (char *)(pDev->tx_hdr_dma_area & ~1);
     676                drvmgr_translate_check(
     677                        pDev->dev,
     678                        DMAMEM_TO_CPU,
     679                        (void *)pDev->ptr_txhbuf0_remote,
     680                        (void **)&pDev->ptr_txhbuf0,
     681                        pDev->txhbufsize * pDev->txbufcnt);
    637682        } else {
    638                 if (pDev->ptr_txdbuf0) {
    639                         free(pDev->ptr_txdbuf0);
    640                 }
    641                 pDev->ptr_txdbuf0 = (char *) malloc(pDev->txdbufsize * pDev->txbufcnt);
    642                 if ( !pDev->ptr_txdbuf0 )
    643                         return 1;
    644         }
    645         if ( pDev->tx_hdr_dma_area ) {
    646                 if ( pDev->tx_hdr_dma_area & 1 ) {
    647                         /* Address given in remote address */
    648                         drvmgr_translate(pDev->dev, 1, 1, (void *)(pDev->tx_hdr_dma_area & ~1), (void **)&pDev->ptr_txhbuf0);
     683                if (pDev->tx_hdr_dma_area == 0) {
     684                        if (pDev->ptr_txhbuf0)
     685                                free(pDev->ptr_txhbuf0);
     686                        pDev->ptr_txhbuf0 = (char *) malloc(pDev->txhbufsize * pDev->txbufcnt);
     687                        if (!pDev->ptr_txhbuf0)
     688                                return 1;
    649689                } else {
    650                         pDev->ptr_txhbuf0 = pDev->tx_hdr_dma_area;
    651                 }
     690                        pDev->ptr_txhbuf0 = (char *)pDev->tx_hdr_dma_area;
     691                }
     692                drvmgr_translate_check(
     693                        pDev->dev,
     694                        CPUMEM_TO_DMA,
     695                        (void *)pDev->ptr_txhbuf0,
     696                        (void **)&pDev->ptr_txhbuf0_remote,
     697                        pDev->txhbufsize * pDev->txbufcnt);
     698        }
     699
     700        /* DMA DESCRIPTOR TABLES */
     701        if (pDev->bd_dma_area & 1) {
     702                /* Address given in remote address */
     703                pDev->ptr_bd0_remote = (char *)(pDev->bd_dma_area & ~1);
     704                drvmgr_translate_check(
     705                        pDev->dev,
     706                        DMAMEM_TO_CPU,
     707                        (void *)pDev->ptr_bd0_remote,
     708                        (void **)&pDev->ptr_bd0,
     709                        2 * SPACEWIRE_BDTABLE_SIZE);
    652710        } else {
    653                 if (pDev->ptr_txhbuf0) {
    654                         free(pDev->ptr_txhbuf0);
    655                 }
    656                 pDev->ptr_txhbuf0 = (char *) malloc(pDev->txhbufsize * pDev->txbufcnt);
    657                 if ( !pDev->ptr_txhbuf0 )
    658                         return 1;
    659         }
    660         if ( pDev->bd_dma_area ) {
    661                 if ( pDev->bd_dma_area & 1 ) {
    662                         /* Address given in remote address */
    663                         drvmgr_translate(pDev->dev, 1, 1, (void *)(pDev->bd_dma_area & ~1), (void **)&pDev->ptr_bd0);
     711                if (pDev->bd_dma_area == 0) {
     712                        if (pDev->_ptr_bd0)
     713                                free(pDev->_ptr_bd0);
     714                        pDev->_ptr_bd0 =
     715                                rtems_heap_allocate_aligned_with_boundary(
     716                                        SPACEWIRE_BDTABLE_SIZE*2, 1024, 0);
     717                        if (!pDev->_ptr_bd0)
     718                                return 1;
     719                        pDev->ptr_bd0 = (char *)pDev->_ptr_bd0;
    664720                } else {
    665                         pDev->ptr_bd0 = pDev->bd_dma_area;
    666                 }
    667         } else {
    668                 if (pDev->ptr_bd0) {
    669                         free(pDev->ptr_bd0);
    670                 }
    671                 pDev->ptr_bd0 = (char *)
    672                         rtems_heap_allocate_aligned_with_boundary(SPACEWIRE_BDTABLE_SIZE*2, 1024, 0);
    673                 if ( !pDev->ptr_bd0 )
    674                         return 1;
    675         }
    676 
    677         /* Translate into remote address */
    678         drvmgr_translate(pDev->dev, 0, 0, (void *)pDev->ptr_rxbuf0, (void **)&pDev->ptr_rxbuf0_remote);
    679         drvmgr_translate(pDev->dev, 0, 0, (void *)pDev->ptr_txdbuf0,(void **)&pDev->ptr_txdbuf0_remote);
    680         drvmgr_translate(pDev->dev, 0, 0, (void *)pDev->ptr_txhbuf0, (void **)&pDev->ptr_txhbuf0_remote);
     721                        pDev->ptr_bd0 = (char *)pDev->bd_dma_area;
     722                }
     723                drvmgr_translate_check(
     724                        pDev->dev,
     725                        CPUMEM_TO_DMA,
     726                        (void *)pDev->ptr_bd0,
     727                        (void **)&pDev->ptr_bd0_remote,
     728                        2 * SPACEWIRE_BDTABLE_SIZE);
     729        }
     730
    681731        return 0;
    682732}
     
    15501600
    15511601        pDev->rx = (SPACEWIRE_RXBD *) pDev->ptr_bd0;
    1552         pDev->tx = (SPACEWIRE_TXBD *) &pDev->rx[SPACEWIRE_RXBUFS_NR];
    1553 
    1554         /* Translate into remote address */
    1555         drvmgr_translate(pDev->dev, 0, 0, (void *)pDev->rx, (void **)&pDev->rx_remote);
    1556         drvmgr_translate(pDev->dev, 0, 0, (void *)pDev->tx, (void **)&pDev->tx_remote);
     1602        pDev->tx = (SPACEWIRE_TXBD *) (pDev->ptr_bd0 + SPACEWIRE_BDTABLE_SIZE);
     1603
     1604        /* Set up remote addresses */
     1605        pDev->rx_remote = (unsigned int)pDev->ptr_bd0_remote;
     1606        pDev->tx_remote = pDev->rx_remote + SPACEWIRE_BDTABLE_SIZE;
    15571607
    15581608        SPACEWIRE_DBG("hw_init [minor %i]\n", pDev->minor);
     
    17361786        char *txh_remote = pDev->ptr_txhbuf0_remote + (cur * pDev->txhbufsize);
    17371787        char *txd_remote = pDev->ptr_txdbuf0_remote + (cur * pDev->txdbufsize);
    1738         unsigned int tmp, tmp2;
    17391788       
    17401789        ctrl = SPW_READ((volatile void *)&pDev->tx[cur].ctrl);
Note: See TracChangeset for help on using the changeset viewer.