Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

ALSA: qc_audio_offload: rename dma/iova/va/cpu/phys variables

While trying to understand a bug in the audio offload code, I had
to spend extra time due to unfortunate nameing of local variables
and struct members.

Change these to more conventional names that reflect the actual
usage:

- pointers to the CPU virtual addresses of a dma buffer get a
_cpu suffix to disambiguate them for MMIO virtual addresses

- MMIO virtual addresses that are mapped explicitly through
the IOMMU get a _iova suffix consistently, rather than a
mix of iova and va.

- DMA addresses (dma_addr_t) that are in a device address
space (linear or IOMMU) get a _dma suffix in place of the
_pa suffix.

- CPU physical (phys_addr_t) addresses get a _pa suffix.
There is still a mixup with dma addresses here that I address
in another patch.

No functional changes are intended here.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Link: https://lore.kernel.org/r/20250513123442.159936-2-arnd@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Arnd Bergmann and committed by
Greg Kroah-Hartman
485ae085 e7144a2b

+72 -72
+68 -68
sound/usb/qcom/qc_audio_offload.c
··· 78 78 size_t data_xfer_ring_size; 79 79 unsigned long sync_xfer_ring_va; 80 80 size_t sync_xfer_ring_size; 81 - unsigned long xfer_buf_va; 81 + unsigned long xfer_buf_iova; 82 82 size_t xfer_buf_size; 83 - phys_addr_t xfer_buf_pa; 84 - u8 *xfer_buf; 83 + phys_addr_t xfer_buf_dma; 84 + u8 *xfer_buf_cpu; 85 85 86 86 /* USB endpoint information */ 87 87 unsigned int data_ep_pipe; ··· 396 396 struct iova_info *info, *new_info = NULL; 397 397 struct list_head *curr_head; 398 398 size_t tmp_size = size; 399 - unsigned long va = 0; 399 + unsigned long iova = 0; 400 400 401 401 if (size % PAGE_SIZE) 402 402 goto done; ··· 411 411 /* exact size iova_info */ 412 412 if (!info->in_use && info->size == size) { 413 413 info->in_use = true; 414 - va = info->start_iova; 414 + iova = info->start_iova; 415 415 *curr_iova_size -= size; 416 416 goto done; 417 417 } else if (!info->in_use && tmp_size >= info->size) { ··· 421 421 if (tmp_size) 422 422 continue; 423 423 424 - va = new_info->start_iova; 424 + iova = new_info->start_iova; 425 425 for (curr_head = &new_info->list; curr_head != 426 426 &info->list; curr_head = curr_head->next) { 427 427 new_info = list_entry(curr_head, struct ··· 440 440 441 441 info = kzalloc(sizeof(*info), GFP_KERNEL); 442 442 if (!info) { 443 - va = 0; 443 + iova = 0; 444 444 goto done; 445 445 } 446 446 447 - va = *curr_iova; 447 + iova = *curr_iova; 448 448 info->start_iova = *curr_iova; 449 449 info->size = size; 450 450 info->in_use = true; ··· 453 453 list_add_tail(&info->list, head); 454 454 455 455 done: 456 - return va; 456 + return iova; 457 457 } 458 458 459 - static void uaudio_put_iova(unsigned long va, size_t size, struct list_head 459 + static void uaudio_put_iova(unsigned long iova, size_t size, struct list_head 460 460 *head, size_t *curr_iova_size) 461 461 { 462 462 struct iova_info *info; ··· 464 464 bool found = false; 465 465 466 466 list_for_each_entry(info, head, list) { 467 - if (info->start_iova == va) { 467 + if (info->start_iova == iova) { 468 468 if (!info->in_use) 469 469 return; 470 470 ··· 492 492 /** 493 493 * uaudio_iommu_unmap() - unmaps iommu memory for adsp 494 494 * @mtype: ring type 495 - * @va: virtual address to unmap 495 + * @iova: virtual address to unmap 496 496 * @iova_size: region size 497 497 * @mapped_iova_size: mapped region size 498 498 * 499 499 * Unmaps the memory region that was previously assigned to the adsp. 500 500 * 501 501 */ 502 - static void uaudio_iommu_unmap(enum mem_type mtype, unsigned long va, 502 + static void uaudio_iommu_unmap(enum mem_type mtype, unsigned long iova, 503 503 size_t iova_size, size_t mapped_iova_size) 504 504 { 505 505 size_t umap_size; 506 506 bool unmap = true; 507 507 508 - if (!va || !iova_size) 508 + if (!iova || !iova_size) 509 509 return; 510 510 511 511 switch (mtype) { ··· 517 517 break; 518 518 519 519 case MEM_XFER_RING: 520 - uaudio_put_iova(va, iova_size, &uaudio_qdev->xfer_ring_list, 520 + uaudio_put_iova(iova, iova_size, &uaudio_qdev->xfer_ring_list, 521 521 &uaudio_qdev->xfer_ring_iova_size); 522 522 break; 523 523 case MEM_XFER_BUF: 524 - uaudio_put_iova(va, iova_size, &uaudio_qdev->xfer_buf_list, 524 + uaudio_put_iova(iova, iova_size, &uaudio_qdev->xfer_buf_list, 525 525 &uaudio_qdev->xfer_buf_iova_size); 526 526 break; 527 527 default: ··· 531 531 if (!unmap || !mapped_iova_size) 532 532 return; 533 533 534 - umap_size = iommu_unmap(uaudio_qdev->data->domain, va, mapped_iova_size); 534 + umap_size = iommu_unmap(uaudio_qdev->data->domain, iova, mapped_iova_size); 535 535 if (umap_size != mapped_iova_size) 536 536 dev_err(uaudio_qdev->data->dev, 537 537 "unmapped size %zu for iova 0x%08lx of mapped size %zu\n", 538 - umap_size, va, mapped_iova_size); 538 + umap_size, iova, mapped_iova_size); 539 539 } 540 540 541 541 /** ··· 556 556 struct sg_table *sgt) 557 557 { 558 558 struct scatterlist *sg; 559 - unsigned long va = 0; 559 + unsigned long iova = 0; 560 560 size_t total_len = 0; 561 - unsigned long va_sg; 561 + unsigned long iova_sg; 562 562 phys_addr_t pa_sg; 563 563 bool map = true; 564 564 size_t sg_len; ··· 573 573 574 574 switch (mtype) { 575 575 case MEM_EVENT_RING: 576 - va = IOVA_BASE; 576 + iova = IOVA_BASE; 577 577 /* er already mapped */ 578 578 if (uaudio_qdev->er_mapped) 579 579 map = false; 580 580 break; 581 581 case MEM_XFER_RING: 582 - va = uaudio_get_iova(&uaudio_qdev->curr_xfer_ring_iova, 582 + iova = uaudio_get_iova(&uaudio_qdev->curr_xfer_ring_iova, 583 583 &uaudio_qdev->xfer_ring_iova_size, 584 584 &uaudio_qdev->xfer_ring_list, size); 585 585 break; 586 586 case MEM_XFER_BUF: 587 - va = uaudio_get_iova(&uaudio_qdev->curr_xfer_buf_iova, 587 + iova = uaudio_get_iova(&uaudio_qdev->curr_xfer_buf_iova, 588 588 &uaudio_qdev->xfer_buf_iova_size, 589 589 &uaudio_qdev->xfer_buf_list, size); 590 590 break; ··· 592 592 dev_err(uaudio_qdev->data->dev, "unknown mem type %d\n", mtype); 593 593 } 594 594 595 - if (!va || !map) 595 + if (!iova || !map) 596 596 goto done; 597 597 598 598 if (!sgt) 599 599 goto skip_sgt_map; 600 600 601 - va_sg = va; 601 + iova_sg = iova; 602 602 for_each_sg(sgt->sgl, sg, sgt->nents, i) { 603 603 sg_len = PAGE_ALIGN(sg->offset + sg->length); 604 604 pa_sg = page_to_phys(sg_page(sg)); 605 - ret = iommu_map(uaudio_qdev->data->domain, va_sg, pa_sg, sg_len, 605 + ret = iommu_map(uaudio_qdev->data->domain, iova_sg, pa_sg, sg_len, 606 606 prot, GFP_KERNEL); 607 607 if (ret) { 608 - uaudio_iommu_unmap(MEM_XFER_BUF, va, size, total_len); 609 - va = 0; 608 + uaudio_iommu_unmap(MEM_XFER_BUF, iova, size, total_len); 609 + iova = 0; 610 610 goto done; 611 611 } 612 612 613 - va_sg += sg_len; 613 + iova_sg += sg_len; 614 614 total_len += sg_len; 615 615 } 616 616 617 617 if (size != total_len) { 618 - uaudio_iommu_unmap(MEM_XFER_BUF, va, size, total_len); 619 - va = 0; 618 + uaudio_iommu_unmap(MEM_XFER_BUF, iova, size, total_len); 619 + iova = 0; 620 620 } 621 - return va; 621 + return iova; 622 622 623 623 skip_sgt_map: 624 - iommu_map(uaudio_qdev->data->domain, va, pa, size, prot, GFP_KERNEL); 624 + iommu_map(uaudio_qdev->data->domain, iova, pa, size, prot, GFP_KERNEL); 625 625 626 626 done: 627 - return va; 627 + return iova; 628 628 } 629 629 630 630 /* looks up alias, if any, for controller DT node and returns the index */ ··· 658 658 info->sync_xfer_ring_va = 0; 659 659 info->sync_xfer_ring_size = 0; 660 660 661 - uaudio_iommu_unmap(MEM_XFER_BUF, info->xfer_buf_va, info->xfer_buf_size, 661 + uaudio_iommu_unmap(MEM_XFER_BUF, info->xfer_buf_iova, info->xfer_buf_size, 662 662 info->xfer_buf_size); 663 - info->xfer_buf_va = 0; 663 + info->xfer_buf_iova = 0; 664 664 665 - usb_free_coherent(udev, info->xfer_buf_size, info->xfer_buf, 666 - info->xfer_buf_pa); 665 + usb_free_coherent(udev, info->xfer_buf_size, info->xfer_buf_cpu, 666 + info->xfer_buf_dma); 667 667 info->xfer_buf_size = 0; 668 - info->xfer_buf = NULL; 669 - info->xfer_buf_pa = 0; 668 + info->xfer_buf_cpu = NULL; 669 + info->xfer_buf_dma = 0; 670 670 671 671 info->in_use = false; 672 672 } ··· 1021 1021 phys_addr_t xfer_buf_pa; 1022 1022 u32 len = xfer_buf_len; 1023 1023 bool dma_coherent; 1024 - unsigned long va; 1024 + unsigned long iova; 1025 1025 u32 remainder; 1026 1026 u32 mult; 1027 1027 int ret; ··· 1050 1050 1051 1051 dma_get_sgtable(subs->dev->bus->sysdev, &xfer_buf_sgt, xfer_buf, 1052 1052 xfer_buf_pa, len); 1053 - va = uaudio_iommu_map(MEM_XFER_BUF, dma_coherent, xfer_buf_pa, len, 1053 + iova = uaudio_iommu_map(MEM_XFER_BUF, dma_coherent, xfer_buf_pa, len, 1054 1054 &xfer_buf_sgt); 1055 - if (!va) { 1055 + if (!iova) { 1056 1056 ret = -ENOMEM; 1057 1057 goto unmap_sync; 1058 1058 } 1059 1059 1060 - mem_info->pa = xfer_buf_pa; 1060 + mem_info->dma = xfer_buf_pa; 1061 1061 mem_info->size = len; 1062 - mem_info->va = PREPEND_SID_TO_IOVA(va, uaudio_qdev->data->sid); 1062 + mem_info->iova = PREPEND_SID_TO_IOVA(iova, uaudio_qdev->data->sid); 1063 1063 sg_free_table(&xfer_buf_sgt); 1064 1064 1065 1065 return 0; ··· 1094 1094 phys_addr_t tr_pa = 0; 1095 1095 struct sg_table *sgt; 1096 1096 bool dma_coherent; 1097 - unsigned long va; 1097 + unsigned long iova; 1098 1098 struct page *pg; 1099 1099 int ret = -ENODEV; 1100 1100 ··· 1127 1127 1128 1128 pg = sg_page(sgt->sgl); 1129 1129 tr_pa = page_to_phys(pg); 1130 - mem_info->pa = sg_dma_address(sgt->sgl); 1130 + mem_info->dma = sg_dma_address(sgt->sgl); 1131 1131 sg_free_table(sgt); 1132 1132 1133 1133 /* data transfer ring */ 1134 - va = uaudio_iommu_map(MEM_XFER_RING, dma_coherent, tr_pa, 1134 + iova = uaudio_iommu_map(MEM_XFER_RING, dma_coherent, tr_pa, 1135 1135 PAGE_SIZE, NULL); 1136 - if (!va) { 1136 + if (!iova) { 1137 1137 ret = -ENOMEM; 1138 1138 goto clear_pa; 1139 1139 } 1140 1140 1141 - mem_info->va = PREPEND_SID_TO_IOVA(va, uaudio_qdev->data->sid); 1141 + mem_info->iova = PREPEND_SID_TO_IOVA(iova, uaudio_qdev->data->sid); 1142 1142 mem_info->size = PAGE_SIZE; 1143 1143 1144 1144 return 0; 1145 1145 1146 1146 clear_pa: 1147 - mem_info->pa = 0; 1147 + mem_info->dma = 0; 1148 1148 remove_ep: 1149 1149 xhci_sideband_remove_endpoint(uadev[card_num].sb, ep); 1150 1150 exit: ··· 1167 1167 struct sg_table *sgt; 1168 1168 phys_addr_t er_pa; 1169 1169 bool dma_coherent; 1170 - unsigned long va; 1170 + unsigned long iova; 1171 1171 struct page *pg; 1172 1172 int ret; 1173 1173 ··· 1192 1192 1193 1193 pg = sg_page(sgt->sgl); 1194 1194 er_pa = page_to_phys(pg); 1195 - mem_info->pa = sg_dma_address(sgt->sgl); 1195 + mem_info->dma = sg_dma_address(sgt->sgl); 1196 1196 sg_free_table(sgt); 1197 1197 1198 - va = uaudio_iommu_map(MEM_EVENT_RING, dma_coherent, er_pa, 1198 + iova = uaudio_iommu_map(MEM_EVENT_RING, dma_coherent, er_pa, 1199 1199 PAGE_SIZE, NULL); 1200 - if (!va) { 1200 + if (!iova) { 1201 1201 ret = -ENOMEM; 1202 1202 goto clear_pa; 1203 1203 } 1204 1204 1205 - mem_info->va = PREPEND_SID_TO_IOVA(va, uaudio_qdev->data->sid); 1205 + mem_info->iova = PREPEND_SID_TO_IOVA(iova, uaudio_qdev->data->sid); 1206 1206 mem_info->size = PAGE_SIZE; 1207 1207 1208 1208 return 0; 1209 1209 1210 1210 clear_pa: 1211 - mem_info->pa = 0; 1211 + mem_info->dma = 0; 1212 1212 remove_interrupter: 1213 1213 xhci_sideband_remove_interrupter(uadev[card_num].sb); 1214 1214 exit: ··· 1340 1340 struct q6usb_offload *data; 1341 1341 int pcm_dev_num; 1342 1342 int card_num; 1343 - u8 *xfer_buf = NULL; 1343 + u8 *xfer_buf_cpu = NULL; 1344 1344 int ret; 1345 1345 1346 1346 pcm_dev_num = (req_msg->usb_token & QMI_STREAM_REQ_DEV_NUM_MASK) >> 8; ··· 1409 1409 1410 1410 resp->speed_info_valid = 1; 1411 1411 1412 - ret = uaudio_transfer_buffer_setup(subs, xfer_buf, req_msg->xfer_buff_size, 1412 + ret = uaudio_transfer_buffer_setup(subs, xfer_buf_cpu, req_msg->xfer_buff_size, 1413 1413 &resp->xhci_mem_info.xfer_buff); 1414 1414 if (ret < 0) { 1415 1415 ret = -ENOMEM; ··· 1440 1440 1441 1441 /* cache intf specific info to use it for unmap and free xfer buf */ 1442 1442 uadev[card_num].info[info_idx].data_xfer_ring_va = 1443 - IOVA_MASK(resp->xhci_mem_info.tr_data.va); 1443 + IOVA_MASK(resp->xhci_mem_info.tr_data.iova); 1444 1444 uadev[card_num].info[info_idx].data_xfer_ring_size = PAGE_SIZE; 1445 1445 uadev[card_num].info[info_idx].sync_xfer_ring_va = 1446 - IOVA_MASK(resp->xhci_mem_info.tr_sync.va); 1446 + IOVA_MASK(resp->xhci_mem_info.tr_sync.iova); 1447 1447 uadev[card_num].info[info_idx].sync_xfer_ring_size = PAGE_SIZE; 1448 - uadev[card_num].info[info_idx].xfer_buf_va = 1449 - IOVA_MASK(resp->xhci_mem_info.xfer_buff.va); 1450 - uadev[card_num].info[info_idx].xfer_buf_pa = 1451 - resp->xhci_mem_info.xfer_buff.pa; 1448 + uadev[card_num].info[info_idx].xfer_buf_iova = 1449 + IOVA_MASK(resp->xhci_mem_info.xfer_buff.iova); 1450 + uadev[card_num].info[info_idx].xfer_buf_dma = 1451 + resp->xhci_mem_info.xfer_buff.dma; 1452 1452 uadev[card_num].info[info_idx].xfer_buf_size = 1453 1453 resp->xhci_mem_info.xfer_buff.size; 1454 1454 uadev[card_num].info[info_idx].data_ep_pipe = subs->data_endpoint ? ··· 1459 1459 subs->data_endpoint->ep_num : 0; 1460 1460 uadev[card_num].info[info_idx].sync_ep_idx = subs->sync_endpoint ? 1461 1461 subs->sync_endpoint->ep_num : 0; 1462 - uadev[card_num].info[info_idx].xfer_buf = xfer_buf; 1462 + uadev[card_num].info[info_idx].xfer_buf_cpu = xfer_buf_cpu; 1463 1463 uadev[card_num].info[info_idx].pcm_card_num = card_num; 1464 1464 uadev[card_num].info[info_idx].pcm_dev_num = pcm_dev_num; 1465 1465 uadev[card_num].info[info_idx].direction = subs->direction; ··· 1477 1477 drop_sync_ep: 1478 1478 if (subs->sync_endpoint) { 1479 1479 uaudio_iommu_unmap(MEM_XFER_RING, 1480 - IOVA_MASK(resp->xhci_mem_info.tr_sync.va), 1480 + IOVA_MASK(resp->xhci_mem_info.tr_sync.iova), 1481 1481 PAGE_SIZE, PAGE_SIZE); 1482 1482 xhci_sideband_remove_endpoint(uadev[card_num].sb, 1483 1483 usb_pipe_endpoint(subs->dev, subs->sync_endpoint->pipe)); 1484 1484 } 1485 1485 drop_data_ep: 1486 - uaudio_iommu_unmap(MEM_XFER_RING, IOVA_MASK(resp->xhci_mem_info.tr_data.va), 1486 + uaudio_iommu_unmap(MEM_XFER_RING, IOVA_MASK(resp->xhci_mem_info.tr_data.iova), 1487 1487 PAGE_SIZE, PAGE_SIZE); 1488 1488 xhci_sideband_remove_endpoint(uadev[card_num].sb, 1489 1489 usb_pipe_endpoint(subs->dev, subs->data_endpoint->pipe));
+2 -2
sound/usb/qcom/usb_audio_qmi_v01.c
··· 14 14 .elem_size = sizeof(u64), 15 15 .array_type = NO_ARRAY, 16 16 .tlv_type = 0, 17 - .offset = offsetof(struct mem_info_v01, va), 17 + .offset = offsetof(struct mem_info_v01, iova), 18 18 }, 19 19 { 20 20 .data_type = QMI_UNSIGNED_8_BYTE, ··· 22 22 .elem_size = sizeof(u64), 23 23 .array_type = NO_ARRAY, 24 24 .tlv_type = 0, 25 - .offset = offsetof(struct mem_info_v01, pa), 25 + .offset = offsetof(struct mem_info_v01, dma), 26 26 }, 27 27 { 28 28 .data_type = QMI_UNSIGNED_4_BYTE,
+2 -2
sound/usb/qcom/usb_audio_qmi_v01.h
··· 14 14 #define QMI_UAUDIO_STREAM_IND_V01 0x0001 15 15 16 16 struct mem_info_v01 { 17 - u64 va; 18 - u64 pa; 17 + u64 iova; /* mapped into sysdev */ 18 + u64 dma; /* mapped into usb host */ 19 19 u32 size; 20 20 }; 21 21