Changeset 1e472ee in mainline


Ignore:
Timestamp:
2018-06-28T19:23:42Z (6 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
d3b2ffa
Parents:
331d024
Message:

Move DMA buffers allocation functions to libvirtio

Location:
uspace
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/nic/virtio-net/virtio-net.c

    r331d024 r1e472ee  
    7070};
    7171
    72 /** Allocate DMA buffers
    73  *
    74  * @param buffers[in]  Number of buffers to allocate.
    75  * @param size[in]     Size of each buffer.
    76  * @param write[in]    True if the buffers are writable by the driver, false
    77  *                     otherwise.
    78  * @param buf[out]     Output array holding virtual addresses of the allocated
    79  *                     buffers.
    80  * @param buf_p[out]   Output array holding physical addresses of the allocated
    81  *                     buffers.
    82  *
    83  * The buffers can be deallocated by virtio_net_teardown_bufs().
    84  *
    85  * @return  EOK on success or error code.
    86  */
    87 static errno_t virtio_net_setup_bufs(unsigned int buffers, size_t size,
    88     bool write, void *buf[], uintptr_t buf_p[])
    89 {
    90         /*
    91          * Allocate all buffers at once in one large chunk.
    92          */
    93         void *virt = AS_AREA_ANY;
    94         uintptr_t phys;
    95         errno_t rc = dmamem_map_anonymous(buffers * size, 0,
    96             write ? AS_AREA_WRITE : AS_AREA_READ, 0, &phys, &virt);
    97         if (rc != EOK)
    98                 return rc;
    99 
    100         ddf_msg(LVL_NOTE, "DMA buffers: %p-%p", virt, virt + buffers * size);
    101 
    102         /*
    103          * Calculate addresses of the individual buffers for easy access.
    104          */
    105         for (unsigned i = 0; i < buffers; i++) {
    106                 buf[i] = virt + i * size;
    107                 buf_p[i] = phys + i * size;
    108         }
    109 
    110         return EOK;
    111 }
    112 
    113 /** Deallocate DMA buffers
    114  *
    115  * @param buf[in]  Array holding the virtual addresses of the DMA buffers
    116  *                 previously allocated by virtio_net_setup_bufs().
    117  */
    118 static void virtio_net_teardown_bufs(void *buf[])
    119 {
    120         if (buf[0]) {
    121                 dmamem_unmap_anonymous(buf[0]);
    122                 buf[0] = NULL;
    123         }
    124 }
    125 
    12672static void virtio_net_irq_handler(ipc_call_t *icall, ddf_dev_t *dev)
    12773{
     
    287233         * Setup DMA buffers
    288234         */
    289         rc = virtio_net_setup_bufs(RX_BUFFERS, RX_BUF_SIZE, false,
     235        rc = virtio_setup_dma_bufs(RX_BUFFERS, RX_BUF_SIZE, false,
    290236            virtio_net->rx_buf, virtio_net->rx_buf_p);
    291237        if (rc != EOK)
    292238                goto fail;
    293         rc = virtio_net_setup_bufs(TX_BUFFERS, TX_BUF_SIZE, true,
     239        rc = virtio_setup_dma_bufs(TX_BUFFERS, TX_BUF_SIZE, true,
    294240            virtio_net->tx_buf, virtio_net->tx_buf_p);
    295241        if (rc != EOK)
    296242                goto fail;
    297         rc = virtio_net_setup_bufs(CT_BUFFERS, CT_BUF_SIZE, true,
     243        rc = virtio_setup_dma_bufs(CT_BUFFERS, CT_BUF_SIZE, true,
    298244            virtio_net->ct_buf, virtio_net->ct_buf_p);
    299245        if (rc != EOK)
     
    356302
    357303fail:
    358         virtio_net_teardown_bufs(virtio_net->rx_buf);
    359         virtio_net_teardown_bufs(virtio_net->tx_buf);
    360         virtio_net_teardown_bufs(virtio_net->ct_buf);
     304        virtio_teardown_dma_bufs(virtio_net->rx_buf);
     305        virtio_teardown_dma_bufs(virtio_net->tx_buf);
     306        virtio_teardown_dma_bufs(virtio_net->ct_buf);
    361307
    362308        virtio_device_setup_fail(vdev);
     
    370316        virtio_net_t *virtio_net = (virtio_net_t *) nic_get_specific(nic);
    371317
    372         virtio_net_teardown_bufs(virtio_net->rx_buf);
    373         virtio_net_teardown_bufs(virtio_net->tx_buf);
    374         virtio_net_teardown_bufs(virtio_net->ct_buf);
     318        virtio_teardown_dma_bufs(virtio_net->rx_buf);
     319        virtio_teardown_dma_bufs(virtio_net->tx_buf);
     320        virtio_teardown_dma_bufs(virtio_net->ct_buf);
    375321
    376322        virtio_device_setup_fail(&virtio_net->virtio_dev);
  • uspace/lib/virtio/virtio-pci.h

    r331d024 r1e472ee  
    181181} virtio_dev_t;
    182182
     183extern errno_t virtio_setup_dma_bufs(unsigned int, size_t, bool, void *[],
     184    uintptr_t []);
     185extern void virtio_teardown_dma_bufs(void *[]);
     186
    183187extern void virtio_virtq_desc_set(virtio_dev_t *vdev, uint16_t, uint16_t,
    184188    uint64_t, uint32_t, uint16_t, uint16_t);
  • uspace/lib/virtio/virtio.c

    r331d024 r1e472ee  
    3939#include <libarch/barrier.h>
    4040
     41/** Allocate DMA buffers
     42 *
     43 * @param buffers[in]  Number of buffers to allocate.
     44 * @param size[in]     Size of each buffer.
     45 * @param write[in]    True if the buffers are writable by the driver, false
     46 *                     otherwise.
     47 * @param buf[out]     Output array holding virtual addresses of the allocated
     48 *                     buffers.
     49 * @param buf_p[out]   Output array holding physical addresses of the allocated
     50 *                     buffers.
     51 *
     52 * The buffers can be deallocated by virtio_net_teardown_bufs().
     53 *
     54 * @return  EOK on success or error code.
     55 */
     56errno_t virtio_setup_dma_bufs(unsigned int buffers, size_t size,
     57    bool write, void *buf[], uintptr_t buf_p[])
     58{
     59        /*
     60         * Allocate all buffers at once in one large chunk.
     61         */
     62        void *virt = AS_AREA_ANY;
     63        uintptr_t phys;
     64        errno_t rc = dmamem_map_anonymous(buffers * size, 0,
     65            write ? AS_AREA_WRITE : AS_AREA_READ, 0, &phys, &virt);
     66        if (rc != EOK)
     67                return rc;
     68
     69        ddf_msg(LVL_NOTE, "DMA buffers: %p-%p", virt, virt + buffers * size);
     70
     71        /*
     72         * Calculate addresses of the individual buffers for easy access.
     73         */
     74        for (unsigned i = 0; i < buffers; i++) {
     75                buf[i] = virt + i * size;
     76                buf_p[i] = phys + i * size;
     77        }
     78
     79        return EOK;
     80}
     81
     82/** Deallocate DMA buffers
     83 *
     84 * @param buf[in]  Array holding the virtual addresses of the DMA buffers
     85 *                 previously allocated by virtio_net_setup_bufs().
     86 */
     87extern void virtio_teardown_dma_bufs(void *buf[])
     88{
     89        if (buf[0]) {
     90                dmamem_unmap_anonymous(buf[0]);
     91                buf[0] = NULL;
     92        }
     93}
     94
    4195void virtio_virtq_desc_set(virtio_dev_t *vdev, uint16_t num, uint16_t descno,
    4296    uint64_t addr, uint32_t len, uint16_t flags, uint16_t next)
Note: See TracChangeset for help on using the changeset viewer.