| 1390 | } |
| 1391 | |
| 1392 | int |
| 1393 | iflib_dma_alloc_align(if_ctx_t ctx, int size, int align, iflib_dma_info_t dma, int mapflags) |
| 1394 | { |
| 1395 | int err; |
| 1396 | device_t dev = ctx->ifc_dev; |
| 1397 | |
| 1398 | err = bus_dma_tag_create(bus_get_dma_tag(dev), /* parent */ |
| 1399 | align, 0, /* alignment, bounds */ |
| 1400 | BUS_SPACE_MAXADDR, /* lowaddr */ |
| 1401 | BUS_SPACE_MAXADDR, /* highaddr */ |
| 1402 | NULL, NULL, /* filter, filterarg */ |
| 1403 | size, /* maxsize */ |
| 1404 | 1, /* nsegments */ |
| 1405 | size, /* maxsegsize */ |
| 1406 | BUS_DMA_ALLOCNOW, /* flags */ |
| 1407 | NULL, /* lockfunc */ |
| 1408 | NULL, /* lockarg */ |
| 1409 | &dma->idi_tag); |
| 1410 | if (err) { |
| 1411 | device_printf(dev, |
| 1412 | "%s: bus_dma_tag_create failed: %d\n", |
| 1413 | __func__, err); |
| 1414 | goto fail_0; |
| 1415 | } |
| 1416 | |
| 1417 | err = bus_dmamem_alloc(dma->idi_tag, (void**) &dma->idi_vaddr, |
| 1418 | BUS_DMA_NOWAIT | BUS_DMA_COHERENT | BUS_DMA_ZERO, &dma->idi_map); |
| 1419 | if (err) { |
| 1420 | device_printf(dev, |
| 1421 | "%s: bus_dmamem_alloc(%ju) failed: %d\n", |
| 1422 | __func__, (uintmax_t)size, err); |
| 1423 | goto fail_1; |
| 1424 | } |
| 1425 | |
| 1426 | dma->idi_paddr = IF_BAD_DMA; |
| 1427 | err = bus_dmamap_load(dma->idi_tag, dma->idi_map, dma->idi_vaddr, |
| 1428 | size, _iflib_dmamap_cb, &dma->idi_paddr, mapflags | BUS_DMA_NOWAIT); |
| 1429 | if (err || dma->idi_paddr == IF_BAD_DMA) { |
| 1430 | device_printf(dev, |
| 1431 | "%s: bus_dmamap_load failed: %d\n", |
| 1432 | __func__, err); |
| 1433 | goto fail_2; |
| 1434 | } |
| 1435 | |
| 1436 | dma->idi_size = size; |
| 1437 | return (0); |
| 1438 | |
| 1439 | fail_2: |
| 1440 | bus_dmamem_free(dma->idi_tag, dma->idi_vaddr, dma->idi_map); |
| 1441 | fail_1: |
| 1442 | bus_dma_tag_destroy(dma->idi_tag); |
| 1443 | fail_0: |
| 1444 | dma->idi_tag = NULL; |
| 1445 | |
| 1446 | return (err); |
| 1447 | } |
| 1448 | |
| 1449 | int |
no test coverage detected