Lines Matching defs:pbl

1288 static int pbl_chunk_list_create(struct efa_dev *dev, struct pbl_context *pbl)
1290 struct pbl_chunk_list *chunk_list = &pbl->phys.indirect.chunk_list;
1291 int page_cnt = pbl->phys.indirect.pbl_buf_size_in_pages;
1292 struct scatterlist *pages_sgl = pbl->phys.indirect.sgl;
1294 int sg_dma_cnt = pbl->phys.indirect.sg_dma_cnt;
1388 static void pbl_chunk_list_destroy(struct efa_dev *dev, struct pbl_context *pbl)
1390 struct pbl_chunk_list *chunk_list = &pbl->phys.indirect.chunk_list;
1402 /* initialize pbl continuous mode: map pbl buffer to a dma address. */
1404 struct pbl_context *pbl)
1408 dma_addr = dma_map_single(&dev->pdev->dev, pbl->pbl_buf,
1409 pbl->pbl_buf_size_in_bytes, DMA_TO_DEVICE);
1411 ibdev_err(&dev->ibdev, "Unable to map pbl to DMA address\n");
1415 pbl->phys.continuous.dma_addr = dma_addr;
1417 "pbl continuous - dma_addr = %pad, size[%u]\n",
1418 &dma_addr, pbl->pbl_buf_size_in_bytes);
1424 * initialize pbl indirect mode:
1426 * pbl buffer.
1428 static int pbl_indirect_initialize(struct efa_dev *dev, struct pbl_context *pbl)
1430 u32 size_in_pages = DIV_ROUND_UP(pbl->pbl_buf_size_in_bytes, EFA_CHUNK_PAYLOAD_SIZE);
1435 sgl = efa_vmalloc_buf_to_sg(pbl->pbl_buf, size_in_pages);
1445 pbl->phys.indirect.pbl_buf_size_in_pages = size_in_pages;
1446 pbl->phys.indirect.sgl = sgl;
1447 pbl->phys.indirect.sg_dma_cnt = sg_dma_cnt;
1448 err = pbl_chunk_list_create(dev, pbl);
1456 "pbl indirect - size[%u], chunks[%u]\n",
1457 pbl->pbl_buf_size_in_bytes,
1458 pbl->phys.indirect.chunk_list.size);
1469 static void pbl_indirect_terminate(struct efa_dev *dev, struct pbl_context *pbl)
1471 pbl_chunk_list_destroy(dev, pbl);
1472 dma_unmap_sg(&dev->pdev->dev, pbl->phys.indirect.sgl,
1473 pbl->phys.indirect.pbl_buf_size_in_pages, DMA_TO_DEVICE);
1474 kfree(pbl->phys.indirect.sgl);
1479 struct pbl_context *pbl,
1486 pbl->pbl_buf_size_in_bytes = hp_cnt * EFA_CHUNK_PAYLOAD_PTR_SIZE;
1487 pbl->pbl_buf = kvzalloc(pbl->pbl_buf_size_in_bytes, GFP_KERNEL);
1488 if (!pbl->pbl_buf)
1491 if (is_vmalloc_addr(pbl->pbl_buf)) {
1492 pbl->physically_continuous = 0;
1493 err = umem_to_page_list(dev, umem, pbl->pbl_buf, hp_cnt,
1498 err = pbl_indirect_initialize(dev, pbl);
1502 pbl->physically_continuous = 1;
1503 err = umem_to_page_list(dev, umem, pbl->pbl_buf, hp_cnt,
1508 err = pbl_continuous_initialize(dev, pbl);
1515 hp_cnt, pbl->physically_continuous);
1520 kvfree(pbl->pbl_buf);
1524 static void pbl_destroy(struct efa_dev *dev, struct pbl_context *pbl)
1526 if (pbl->physically_continuous)
1527 dma_unmap_single(&dev->pdev->dev, pbl->phys.continuous.dma_addr,
1528 pbl->pbl_buf_size_in_bytes, DMA_TO_DEVICE);
1530 pbl_indirect_terminate(dev, pbl);
1532 kvfree(pbl->pbl_buf);
1541 err = umem_to_page_list(dev, mr->umem, params->pbl.inline_pbl_array,
1553 struct pbl_context *pbl,
1559 err = pbl_create(dev, pbl, mr->umem, params->page_num,
1562 ibdev_dbg(&dev->ibdev, "Failed to create pbl[%d]\n", err);
1567 params->indirect = !pbl->physically_continuous;
1568 if (pbl->physically_continuous) {
1569 params->pbl.pbl.length = pbl->pbl_buf_size_in_bytes;
1571 efa_com_set_dma_addr(pbl->phys.continuous.dma_addr,
1572 &params->pbl.pbl.address.mem_addr_high,
1573 &params->pbl.pbl.address.mem_addr_low);
1575 params->pbl.pbl.length =
1576 pbl->phys.indirect.chunk_list.chunks[0].length;
1578 efa_com_set_dma_addr(pbl->phys.indirect.chunk_list.chunks[0].dma_addr,
1579 &params->pbl.pbl.address.mem_addr_high,
1580 &params->pbl.pbl.address.mem_addr_low);
1626 struct pbl_context pbl;
1652 inline_size = ARRAY_SIZE(params.pbl.inline_pbl_array);
1662 err = efa_create_pbl(dev, &pbl, mr, &params);
1667 pbl_destroy(dev, &pbl);