From nobody Mon Feb 9 01:45:09 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 1D5D728E57A; Tue, 13 May 2025 12:34:55 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747139695; cv=none; b=RK0rel+u5S3K+wrGiqO0dFfH8lMHNOifjwYZk+UeRnYbsng3KEv0FaXTyoTCGW8mCORYKJMwmOHIYMab6XO+VnfrJMM7qDR2dJbQR+JiA0WxnAGrv9m0Z9x9vDYfunHFjhn6E6mqSd4OTTV/5T1NeRkLRdurD8vOQt0ErONAp2I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747139695; c=relaxed/simple; bh=pNFI8b6ltMIQqO6PpCE9uBYN8V8VrzLhyS+r+QrNFqU=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=tZSPKrlj5bB53GUBoaazWNbG7iP3xoOpNcsjFXvI37LyxZzHVHwDCngMCE0IooqWCQIzmoOFJUwb3ICsuqPEP0yUld9XZo+8LZ+dhz9m/E20HSdrhp/6npCAsFaHlKDjGEjbdbrwiwfHh6YlK0oK9W0zj2+zCHAz4aDKONdernU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=bcMba6hB; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="bcMba6hB" Received: by smtp.kernel.org (Postfix) with ESMTPSA id BF252C4CEED; Tue, 13 May 2025 12:34:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1747139694; bh=pNFI8b6ltMIQqO6PpCE9uBYN8V8VrzLhyS+r+QrNFqU=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=bcMba6hBSRjlWRF5l6W6MTYFYaPfQnt4U7Uf9U+PL65HbreUVg5dSEjEeOm4vPRg4 meYpMedqdes+UIori8n89lgH2iF/56rTpQYpu5dQuNQEzsEB08Cv/ujOjD9YgNDC6s ubJlnX8bD22D32v5R0tQ6F264wHgCrS3/leTLkdzdNsjHY7eYi61CyhlyAg+XnbpPD XXRQRjd2qeGfjrNwpAq2jFezuTdmvcoRrPQTJXnAV2g3tyVcbSA5hwWkRj4calLBoT vXQ6CNS/qoE/TTIG+E7p5D0DSx2aEIJ9cs/5A0M6Dyrwh9r2+5Wkc6FL5/LEoyOYsH JrvTjQcs8V5LQ== From: Arnd Bergmann To: Mark Brown Cc: Arnd Bergmann , Jaroslav Kysela , Takashi Iwai , Greg Kroah-Hartman , Wesley Cheng , Dan Carpenter , linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 1/3] ALSA: qc_audio_offload: rename dma/iova/va/cpu/phys variables Date: Tue, 13 May 2025 14:34:40 +0200 Message-Id: <20250513123442.159936-2-arnd@kernel.org> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250513123442.159936-1-arnd@kernel.org> References: <20250513123442.159936-1-arnd@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Arnd Bergmann 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 --- sound/usb/qcom/qc_audio_offload.c | 136 ++++++++++++++--------------- sound/usb/qcom/usb_audio_qmi_v01.c | 4 +- sound/usb/qcom/usb_audio_qmi_v01.h | 4 +- 3 files changed, 72 insertions(+), 72 deletions(-) diff --git a/sound/usb/qcom/qc_audio_offload.c b/sound/usb/qcom/qc_audio_of= fload.c index 8b096f37ad4c..d2256a26eaaa 100644 --- a/sound/usb/qcom/qc_audio_offload.c +++ b/sound/usb/qcom/qc_audio_offload.c @@ -78,10 +78,10 @@ struct intf_info { size_t data_xfer_ring_size; unsigned long sync_xfer_ring_va; size_t sync_xfer_ring_size; - unsigned long xfer_buf_va; + unsigned long xfer_buf_iova; size_t xfer_buf_size; - phys_addr_t xfer_buf_pa; - u8 *xfer_buf; + phys_addr_t xfer_buf_dma; + u8 *xfer_buf_cpu; =20 /* USB endpoint information */ unsigned int data_ep_pipe; @@ -396,7 +396,7 @@ static unsigned long uaudio_get_iova(unsigned long *cur= r_iova, struct iova_info *info, *new_info =3D NULL; struct list_head *curr_head; size_t tmp_size =3D size; - unsigned long va =3D 0; + unsigned long iova =3D 0; =20 if (size % PAGE_SIZE) goto done; @@ -411,7 +411,7 @@ static unsigned long uaudio_get_iova(unsigned long *cur= r_iova, /* exact size iova_info */ if (!info->in_use && info->size =3D=3D size) { info->in_use =3D true; - va =3D info->start_iova; + iova =3D info->start_iova; *curr_iova_size -=3D size; goto done; } else if (!info->in_use && tmp_size >=3D info->size) { @@ -421,7 +421,7 @@ static unsigned long uaudio_get_iova(unsigned long *cur= r_iova, if (tmp_size) continue; =20 - va =3D new_info->start_iova; + iova =3D new_info->start_iova; for (curr_head =3D &new_info->list; curr_head !=3D &info->list; curr_head =3D curr_head->next) { new_info =3D list_entry(curr_head, struct @@ -440,11 +440,11 @@ static unsigned long uaudio_get_iova(unsigned long *c= urr_iova, =20 info =3D kzalloc(sizeof(*info), GFP_KERNEL); if (!info) { - va =3D 0; + iova =3D 0; goto done; } =20 - va =3D *curr_iova; + iova =3D *curr_iova; info->start_iova =3D *curr_iova; info->size =3D size; info->in_use =3D true; @@ -453,10 +453,10 @@ static unsigned long uaudio_get_iova(unsigned long *c= urr_iova, list_add_tail(&info->list, head); =20 done: - return va; + return iova; } =20 -static void uaudio_put_iova(unsigned long va, size_t size, struct list_head +static void uaudio_put_iova(unsigned long iova, size_t size, struct list_h= ead *head, size_t *curr_iova_size) { struct iova_info *info; @@ -464,7 +464,7 @@ static void uaudio_put_iova(unsigned long va, size_t si= ze, struct list_head bool found =3D false; =20 list_for_each_entry(info, head, list) { - if (info->start_iova =3D=3D va) { + if (info->start_iova =3D=3D iova) { if (!info->in_use) return; =20 @@ -492,20 +492,20 @@ static void uaudio_put_iova(unsigned long va, size_t = size, struct list_head /** * uaudio_iommu_unmap() - unmaps iommu memory for adsp * @mtype: ring type - * @va: virtual address to unmap + * @iova: virtual address to unmap * @iova_size: region size * @mapped_iova_size: mapped region size * * Unmaps the memory region that was previously assigned to the adsp. * */ -static void uaudio_iommu_unmap(enum mem_type mtype, unsigned long va, +static void uaudio_iommu_unmap(enum mem_type mtype, unsigned long iova, size_t iova_size, size_t mapped_iova_size) { size_t umap_size; bool unmap =3D true; =20 - if (!va || !iova_size) + if (!iova || !iova_size) return; =20 switch (mtype) { @@ -517,11 +517,11 @@ static void uaudio_iommu_unmap(enum mem_type mtype, u= nsigned long va, break; =20 case MEM_XFER_RING: - uaudio_put_iova(va, iova_size, &uaudio_qdev->xfer_ring_list, + uaudio_put_iova(iova, iova_size, &uaudio_qdev->xfer_ring_list, &uaudio_qdev->xfer_ring_iova_size); break; case MEM_XFER_BUF: - uaudio_put_iova(va, iova_size, &uaudio_qdev->xfer_buf_list, + uaudio_put_iova(iova, iova_size, &uaudio_qdev->xfer_buf_list, &uaudio_qdev->xfer_buf_iova_size); break; default: @@ -531,11 +531,11 @@ static void uaudio_iommu_unmap(enum mem_type mtype, u= nsigned long va, if (!unmap || !mapped_iova_size) return; =20 - umap_size =3D iommu_unmap(uaudio_qdev->data->domain, va, mapped_iova_size= ); + umap_size =3D iommu_unmap(uaudio_qdev->data->domain, iova, mapped_iova_si= ze); if (umap_size !=3D mapped_iova_size) dev_err(uaudio_qdev->data->dev, "unmapped size %zu for iova 0x%08lx of mapped size %zu\n", - umap_size, va, mapped_iova_size); + umap_size, iova, mapped_iova_size); } =20 /** @@ -556,9 +556,9 @@ static unsigned long uaudio_iommu_map(enum mem_type mty= pe, bool dma_coherent, struct sg_table *sgt) { struct scatterlist *sg; - unsigned long va =3D 0; + unsigned long iova =3D 0; size_t total_len =3D 0; - unsigned long va_sg; + unsigned long iova_sg; phys_addr_t pa_sg; bool map =3D true; size_t sg_len; @@ -573,18 +573,18 @@ static unsigned long uaudio_iommu_map(enum mem_type m= type, bool dma_coherent, =20 switch (mtype) { case MEM_EVENT_RING: - va =3D IOVA_BASE; + iova =3D IOVA_BASE; /* er already mapped */ if (uaudio_qdev->er_mapped) map =3D false; break; case MEM_XFER_RING: - va =3D uaudio_get_iova(&uaudio_qdev->curr_xfer_ring_iova, + iova =3D uaudio_get_iova(&uaudio_qdev->curr_xfer_ring_iova, &uaudio_qdev->xfer_ring_iova_size, &uaudio_qdev->xfer_ring_list, size); break; case MEM_XFER_BUF: - va =3D uaudio_get_iova(&uaudio_qdev->curr_xfer_buf_iova, + iova =3D uaudio_get_iova(&uaudio_qdev->curr_xfer_buf_iova, &uaudio_qdev->xfer_buf_iova_size, &uaudio_qdev->xfer_buf_list, size); break; @@ -592,39 +592,39 @@ static unsigned long uaudio_iommu_map(enum mem_type m= type, bool dma_coherent, dev_err(uaudio_qdev->data->dev, "unknown mem type %d\n", mtype); } =20 - if (!va || !map) + if (!iova || !map) goto done; =20 if (!sgt) goto skip_sgt_map; =20 - va_sg =3D va; + iova_sg =3D iova; for_each_sg(sgt->sgl, sg, sgt->nents, i) { sg_len =3D PAGE_ALIGN(sg->offset + sg->length); pa_sg =3D page_to_phys(sg_page(sg)); - ret =3D iommu_map(uaudio_qdev->data->domain, va_sg, pa_sg, sg_len, + ret =3D iommu_map(uaudio_qdev->data->domain, iova_sg, pa_sg, sg_len, prot, GFP_KERNEL); if (ret) { - uaudio_iommu_unmap(MEM_XFER_BUF, va, size, total_len); - va =3D 0; + uaudio_iommu_unmap(MEM_XFER_BUF, iova, size, total_len); + iova =3D 0; goto done; } =20 - va_sg +=3D sg_len; + iova_sg +=3D sg_len; total_len +=3D sg_len; } =20 if (size !=3D total_len) { - uaudio_iommu_unmap(MEM_XFER_BUF, va, size, total_len); - va =3D 0; + uaudio_iommu_unmap(MEM_XFER_BUF, iova, size, total_len); + iova =3D 0; } - return va; + return iova; =20 skip_sgt_map: - iommu_map(uaudio_qdev->data->domain, va, pa, size, prot, GFP_KERNEL); + iommu_map(uaudio_qdev->data->domain, iova, pa, size, prot, GFP_KERNEL); =20 done: - return va; + return iova; } =20 /* looks up alias, if any, for controller DT node and returns the index */ @@ -658,15 +658,15 @@ static void uaudio_dev_intf_cleanup(struct usb_device= *udev, struct intf_info *i info->sync_xfer_ring_va =3D 0; info->sync_xfer_ring_size =3D 0; =20 - uaudio_iommu_unmap(MEM_XFER_BUF, info->xfer_buf_va, info->xfer_buf_size, + uaudio_iommu_unmap(MEM_XFER_BUF, info->xfer_buf_iova, info->xfer_buf_size, info->xfer_buf_size); - info->xfer_buf_va =3D 0; + info->xfer_buf_iova =3D 0; =20 - usb_free_coherent(udev, info->xfer_buf_size, info->xfer_buf, - info->xfer_buf_pa); + usb_free_coherent(udev, info->xfer_buf_size, info->xfer_buf_cpu, + info->xfer_buf_dma); info->xfer_buf_size =3D 0; - info->xfer_buf =3D NULL; - info->xfer_buf_pa =3D 0; + info->xfer_buf_cpu =3D NULL; + info->xfer_buf_dma =3D 0; =20 info->in_use =3D false; } @@ -1021,7 +1021,7 @@ static int uaudio_transfer_buffer_setup(struct snd_us= b_substream *subs, phys_addr_t xfer_buf_pa; u32 len =3D xfer_buf_len; bool dma_coherent; - unsigned long va; + unsigned long iova; u32 remainder; u32 mult; int ret; @@ -1050,16 +1050,16 @@ static int uaudio_transfer_buffer_setup(struct snd_= usb_substream *subs, =20 dma_get_sgtable(subs->dev->bus->sysdev, &xfer_buf_sgt, xfer_buf, xfer_buf_pa, len); - va =3D uaudio_iommu_map(MEM_XFER_BUF, dma_coherent, xfer_buf_pa, len, + iova =3D uaudio_iommu_map(MEM_XFER_BUF, dma_coherent, xfer_buf_pa, len, &xfer_buf_sgt); - if (!va) { + if (!iova) { ret =3D -ENOMEM; goto unmap_sync; } =20 - mem_info->pa =3D xfer_buf_pa; + mem_info->dma =3D xfer_buf_pa; mem_info->size =3D len; - mem_info->va =3D PREPEND_SID_TO_IOVA(va, uaudio_qdev->data->sid); + mem_info->iova =3D PREPEND_SID_TO_IOVA(iova, uaudio_qdev->data->sid); sg_free_table(&xfer_buf_sgt); =20 return 0; @@ -1094,7 +1094,7 @@ uaudio_endpoint_setup(struct snd_usb_substream *subs, phys_addr_t tr_pa =3D 0; struct sg_table *sgt; bool dma_coherent; - unsigned long va; + unsigned long iova; struct page *pg; int ret =3D -ENODEV; =20 @@ -1127,24 +1127,24 @@ uaudio_endpoint_setup(struct snd_usb_substream *sub= s, =20 pg =3D sg_page(sgt->sgl); tr_pa =3D page_to_phys(pg); - mem_info->pa =3D sg_dma_address(sgt->sgl); + mem_info->dma =3D sg_dma_address(sgt->sgl); sg_free_table(sgt); =20 /* data transfer ring */ - va =3D uaudio_iommu_map(MEM_XFER_RING, dma_coherent, tr_pa, + iova =3D uaudio_iommu_map(MEM_XFER_RING, dma_coherent, tr_pa, PAGE_SIZE, NULL); - if (!va) { + if (!iova) { ret =3D -ENOMEM; goto clear_pa; } =20 - mem_info->va =3D PREPEND_SID_TO_IOVA(va, uaudio_qdev->data->sid); + mem_info->iova =3D PREPEND_SID_TO_IOVA(iova, uaudio_qdev->data->sid); mem_info->size =3D PAGE_SIZE; =20 return 0; =20 clear_pa: - mem_info->pa =3D 0; + mem_info->dma =3D 0; remove_ep: xhci_sideband_remove_endpoint(uadev[card_num].sb, ep); exit: @@ -1167,7 +1167,7 @@ static int uaudio_event_ring_setup(struct snd_usb_sub= stream *subs, struct sg_table *sgt; phys_addr_t er_pa; bool dma_coherent; - unsigned long va; + unsigned long iova; struct page *pg; int ret; =20 @@ -1192,23 +1192,23 @@ static int uaudio_event_ring_setup(struct snd_usb_s= ubstream *subs, =20 pg =3D sg_page(sgt->sgl); er_pa =3D page_to_phys(pg); - mem_info->pa =3D sg_dma_address(sgt->sgl); + mem_info->dma =3D sg_dma_address(sgt->sgl); sg_free_table(sgt); =20 - va =3D uaudio_iommu_map(MEM_EVENT_RING, dma_coherent, er_pa, + iova =3D uaudio_iommu_map(MEM_EVENT_RING, dma_coherent, er_pa, PAGE_SIZE, NULL); - if (!va) { + if (!iova) { ret =3D -ENOMEM; goto clear_pa; } =20 - mem_info->va =3D PREPEND_SID_TO_IOVA(va, uaudio_qdev->data->sid); + mem_info->iova =3D PREPEND_SID_TO_IOVA(iova, uaudio_qdev->data->sid); mem_info->size =3D PAGE_SIZE; =20 return 0; =20 clear_pa: - mem_info->pa =3D 0; + mem_info->dma =3D 0; remove_interrupter: xhci_sideband_remove_interrupter(uadev[card_num].sb); exit: @@ -1340,7 +1340,7 @@ static int prepare_qmi_response(struct snd_usb_substr= eam *subs, struct q6usb_offload *data; int pcm_dev_num; int card_num; - u8 *xfer_buf =3D NULL; + u8 *xfer_buf_cpu =3D NULL; int ret; =20 pcm_dev_num =3D (req_msg->usb_token & QMI_STREAM_REQ_DEV_NUM_MASK) >> 8; @@ -1409,7 +1409,7 @@ static int prepare_qmi_response(struct snd_usb_substr= eam *subs, =20 resp->speed_info_valid =3D 1; =20 - ret =3D uaudio_transfer_buffer_setup(subs, xfer_buf, req_msg->xfer_buff_s= ize, + ret =3D uaudio_transfer_buffer_setup(subs, xfer_buf_cpu, req_msg->xfer_bu= ff_size, &resp->xhci_mem_info.xfer_buff); if (ret < 0) { ret =3D -ENOMEM; @@ -1440,15 +1440,15 @@ static int prepare_qmi_response(struct snd_usb_subs= tream *subs, =20 /* cache intf specific info to use it for unmap and free xfer buf */ uadev[card_num].info[info_idx].data_xfer_ring_va =3D - IOVA_MASK(resp->xhci_mem_info.tr_data.va); + IOVA_MASK(resp->xhci_mem_info.tr_data.iova); uadev[card_num].info[info_idx].data_xfer_ring_size =3D PAGE_SIZE; uadev[card_num].info[info_idx].sync_xfer_ring_va =3D - IOVA_MASK(resp->xhci_mem_info.tr_sync.va); + IOVA_MASK(resp->xhci_mem_info.tr_sync.iova); uadev[card_num].info[info_idx].sync_xfer_ring_size =3D PAGE_SIZE; - uadev[card_num].info[info_idx].xfer_buf_va =3D - IOVA_MASK(resp->xhci_mem_info.xfer_buff.va); - uadev[card_num].info[info_idx].xfer_buf_pa =3D - resp->xhci_mem_info.xfer_buff.pa; + uadev[card_num].info[info_idx].xfer_buf_iova =3D + IOVA_MASK(resp->xhci_mem_info.xfer_buff.iova); + uadev[card_num].info[info_idx].xfer_buf_dma =3D + resp->xhci_mem_info.xfer_buff.dma; uadev[card_num].info[info_idx].xfer_buf_size =3D resp->xhci_mem_info.xfer_buff.size; uadev[card_num].info[info_idx].data_ep_pipe =3D subs->data_endpoint ? @@ -1459,7 +1459,7 @@ static int prepare_qmi_response(struct snd_usb_substr= eam *subs, subs->data_endpoint->ep_num : 0; uadev[card_num].info[info_idx].sync_ep_idx =3D subs->sync_endpoint ? subs->sync_endpoint->ep_num : 0; - uadev[card_num].info[info_idx].xfer_buf =3D xfer_buf; + uadev[card_num].info[info_idx].xfer_buf_cpu =3D xfer_buf_cpu; uadev[card_num].info[info_idx].pcm_card_num =3D card_num; uadev[card_num].info[info_idx].pcm_dev_num =3D pcm_dev_num; uadev[card_num].info[info_idx].direction =3D subs->direction; @@ -1477,13 +1477,13 @@ static int prepare_qmi_response(struct snd_usb_subs= tream *subs, drop_sync_ep: if (subs->sync_endpoint) { uaudio_iommu_unmap(MEM_XFER_RING, - IOVA_MASK(resp->xhci_mem_info.tr_sync.va), + IOVA_MASK(resp->xhci_mem_info.tr_sync.iova), PAGE_SIZE, PAGE_SIZE); xhci_sideband_remove_endpoint(uadev[card_num].sb, usb_pipe_endpoint(subs->dev, subs->sync_endpoint->pipe)); } drop_data_ep: - uaudio_iommu_unmap(MEM_XFER_RING, IOVA_MASK(resp->xhci_mem_info.tr_data.v= a), + uaudio_iommu_unmap(MEM_XFER_RING, IOVA_MASK(resp->xhci_mem_info.tr_data.i= ova), PAGE_SIZE, PAGE_SIZE); xhci_sideband_remove_endpoint(uadev[card_num].sb, usb_pipe_endpoint(subs->dev, subs->data_endpoint->pipe)); diff --git a/sound/usb/qcom/usb_audio_qmi_v01.c b/sound/usb/qcom/usb_audio_= qmi_v01.c index 151ae7b591de..502857612277 100644 --- a/sound/usb/qcom/usb_audio_qmi_v01.c +++ b/sound/usb/qcom/usb_audio_qmi_v01.c @@ -14,7 +14,7 @@ static const struct qmi_elem_info mem_info_v01_ei[] =3D { .elem_size =3D sizeof(u64), .array_type =3D NO_ARRAY, .tlv_type =3D 0, - .offset =3D offsetof(struct mem_info_v01, va), + .offset =3D offsetof(struct mem_info_v01, iova), }, { .data_type =3D QMI_UNSIGNED_8_BYTE, @@ -22,7 +22,7 @@ static const struct qmi_elem_info mem_info_v01_ei[] =3D { .elem_size =3D sizeof(u64), .array_type =3D NO_ARRAY, .tlv_type =3D 0, - .offset =3D offsetof(struct mem_info_v01, pa), + .offset =3D offsetof(struct mem_info_v01, dma), }, { .data_type =3D QMI_UNSIGNED_4_BYTE, diff --git a/sound/usb/qcom/usb_audio_qmi_v01.h b/sound/usb/qcom/usb_audio_= qmi_v01.h index f2563537ed40..a1298d75d9f8 100644 --- a/sound/usb/qcom/usb_audio_qmi_v01.h +++ b/sound/usb/qcom/usb_audio_qmi_v01.h @@ -14,8 +14,8 @@ #define QMI_UAUDIO_STREAM_IND_V01 0x0001 =20 struct mem_info_v01 { - u64 va; - u64 pa; + u64 iova; /* mapped into sysdev */ + u64 dma; /* mapped into usb host */ u32 size; }; =20 --=20 2.39.5 From nobody Mon Feb 9 01:45:09 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id E660B28E5F9; Tue, 13 May 2025 12:34:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747139698; cv=none; b=DqvlGKNCe7s3knhZpgLB3Bi8GCvTZ7elTkdtN3Iqthzk7iJS4sjoy6OlhwkXqX/9SSHDnqUtib0rn19VCuFFldE0+QL5QAdbgNvoBycyUuZ1ShLbE5Vixzz9vneloNuoyZNEe9DN2dfgeEyuR7/kXSBswtcUdN7Jnnqx604B6s0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747139698; c=relaxed/simple; bh=OLQSa1A0N97f/i6jL2QjszXk2M9waokHZY4hY5LIrA8=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=BsNFmQsZhGm6KqVjWkWz9Ggahwrj4LZjvMBCK5MO6k/NN76RtxumWa3+VlYF8nzYEaJz6Uec/AQZoa+xsZ7H7o6+rhiY4Qrkbenzs6r4nIl+MCs46ssXySoGs0eB8w5dCVpin7xRzSX0ivJvbxly3/gofn42EKDdGAuCZ46uEEE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=C7fluJVi; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="C7fluJVi" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 6643EC4CEED; Tue, 13 May 2025 12:34:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1747139697; bh=OLQSa1A0N97f/i6jL2QjszXk2M9waokHZY4hY5LIrA8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=C7fluJViP7Wm1BffCofuNaeH5bNfDb5F9ButmTsxJ8IPBh3xZQratwkbvsRR9CnFj KCu0M654IUJ7pKAWzWCpksjQk8ZzSCnLoDca+4WKN4goWDH2L25uhDs24+JGgjgg/I 4iSfq6rVskvN03dE5lmKULyWtYMKSLe4P9+zDE+GcB0jC0pH2h8s+TWuBB9mzP3lu7 Gyf5zSpJcpcVtAHRKCyZ6deURkAiElISLhPagCHXgwnznXTi8joHjcEeYOqioGd/Bd 5OqozTKjXJUmBPUE6yP0YROjgrW516aASTPypAr2jYX/4MRUL1K/CJUZz/vaH2FYoc nJ0H/JCVBx3gw== From: Arnd Bergmann To: Mark Brown Cc: Arnd Bergmann , Jaroslav Kysela , Takashi Iwai , Greg Kroah-Hartman , Wesley Cheng , Dan Carpenter , linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 2/3] ALSA: qc_audio_offload: avoid leaking xfer_buf allocation Date: Tue, 13 May 2025 14:34:41 +0200 Message-Id: <20250513123442.159936-3-arnd@kernel.org> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250513123442.159936-1-arnd@kernel.org> References: <20250513123442.159936-1-arnd@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Arnd Bergmann The info->xfer_buf_cpu member is set to a NULL value because the allocation happens in a different function and is only assigned to the function argument but never passed back. Pass it by reference instead to have a handle that can actually be freed by the final usb_free_coherent() call. Signed-off-by: Arnd Bergmann --- sound/usb/qcom/qc_audio_offload.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/sound/usb/qcom/qc_audio_offload.c b/sound/usb/qcom/qc_audio_of= fload.c index d2256a26eaaa..c4dde2fa5a1f 100644 --- a/sound/usb/qcom/qc_audio_offload.c +++ b/sound/usb/qcom/qc_audio_offload.c @@ -1014,10 +1014,11 @@ static int enable_audio_stream(struct snd_usb_subst= ream *subs, * */ static int uaudio_transfer_buffer_setup(struct snd_usb_substream *subs, - u8 *xfer_buf, u32 xfer_buf_len, + void **xfer_buf_cpu, u32 xfer_buf_len, struct mem_info_v01 *mem_info) { struct sg_table xfer_buf_sgt; + void *xfer_buf; phys_addr_t xfer_buf_pa; u32 len =3D xfer_buf_len; bool dma_coherent; @@ -1060,6 +1061,7 @@ static int uaudio_transfer_buffer_setup(struct snd_us= b_substream *subs, mem_info->dma =3D xfer_buf_pa; mem_info->size =3D len; mem_info->iova =3D PREPEND_SID_TO_IOVA(iova, uaudio_qdev->data->sid); + *xfer_buf_cpu =3D xfer_buf; sg_free_table(&xfer_buf_sgt); =20 return 0; @@ -1340,7 +1342,7 @@ static int prepare_qmi_response(struct snd_usb_substr= eam *subs, struct q6usb_offload *data; int pcm_dev_num; int card_num; - u8 *xfer_buf_cpu =3D NULL; + void *xfer_buf_cpu; int ret; =20 pcm_dev_num =3D (req_msg->usb_token & QMI_STREAM_REQ_DEV_NUM_MASK) >> 8; @@ -1409,7 +1411,7 @@ static int prepare_qmi_response(struct snd_usb_substr= eam *subs, =20 resp->speed_info_valid =3D 1; =20 - ret =3D uaudio_transfer_buffer_setup(subs, xfer_buf_cpu, req_msg->xfer_bu= ff_size, + ret =3D uaudio_transfer_buffer_setup(subs, &xfer_buf_cpu, req_msg->xfer_b= uff_size, &resp->xhci_mem_info.xfer_buff); if (ret < 0) { ret =3D -ENOMEM; --=20 2.39.5 From nobody Mon Feb 9 01:45:09 2026 Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org [10.30.226.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 0A60128ECCE; Tue, 13 May 2025 12:35:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=10.30.226.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747139700; cv=none; b=VVMdk0ld4oBWBKh3doIQAuWACodvNYdAFiWYk7xHhBzpXhPKHwgx5TPZzAp/UyN6134SJsHDXIvR9+mGa8b6+PH6PdSOhlCosspI/lS9JkYm8wzwG8vVMTtgdGnbrb8GAM+DSzdmbh/w19M/cp75EeLyuiC/M5SnBPKRyrI/hq0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1747139700; c=relaxed/simple; bh=u2hoH0if4XlY924RAc8QSz9rFsWWAX5jfbtK7C9L0z4=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: MIME-Version; b=P7/2QGY0WdCkb+IzFgcz5NlXooWbKW95APh8GXfYlXtPx4HpibqekrJKhE2b8m1falV+PsGi6LIO7l2a71YnJ0WUPLocp8YqxXxsmIO9Td9UlVrJO3kmf9MRrWkPAzDiHbDTXZhzt9NIh+zVa7/IC7mSeO9eZm6/X+KPpgyjh7w= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=CWXJF/nd; arc=none smtp.client-ip=10.30.226.201 Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b="CWXJF/nd" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D304DC4CEF3; Tue, 13 May 2025 12:34:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1747139699; bh=u2hoH0if4XlY924RAc8QSz9rFsWWAX5jfbtK7C9L0z4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=CWXJF/nd1+fVMyET8fNK5vodONP93mwjpYLAQqZ8Qv9bbC7zAUR9sMCp8zfwks0PI TaUD7c2F7zJ2e1gUivbrTBi1E4V7jgjEc8iHl1s6ceaFx+7dfHFpHjPDPVOubKsZU3 +fgcmay+TXke23jZgOeGMiMc5G3CJ21GM0RwsP7491Bb2GjvHjUACXIvyPYbkZheMP GSpZF5sQW+hsrUOeTei0HjzMr+F+7e8yVYJByJo1/WIxet9Qxdr62D2am5w6GcEOH8 iaX+S+aIQItKPdq9JIOmikCsuWWl7jGkfkAIqzs56gpsDK8Ykxgq6NB5PXZ4JNQN0J wImLnAPfJpyRA== From: Arnd Bergmann To: Mark Brown Cc: Arnd Bergmann , Jaroslav Kysela , Takashi Iwai , Greg Kroah-Hartman , Wesley Cheng , Dan Carpenter , linux-sound@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 3/3] ALSA: qc_audio_offload: try to reduce address space confusion Date: Tue, 13 May 2025 14:34:42 +0200 Message-Id: <20250513123442.159936-4-arnd@kernel.org> X-Mailer: git-send-email 2.39.5 In-Reply-To: <20250513123442.159936-1-arnd@kernel.org> References: <20250513123442.159936-1-arnd@kernel.org> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Arnd Bergmann uaudio_transfer_buffer_setup() allocates a buffer for the subs->dev device, and the returned address for the buffer is a CPU local virtual address that may or may not be in the linear mapping, as well as a DMA address token that is accessible by the USB device, and this in turn may or may not correspond to the physical address. The use in the driver however assumes that these addresses are the linear map and the CPU physical address, respectively. Both are nonportable here, but in the end only the virtual address gets used by converting it to a physical address that gets mapped into a second iommu. Make this more explicit by pulling the conversion out first and warning if it is not part of the linear map, and using the actual physical address to map into the iommu in place of the dma address that may already be iommu-mapped into the usb host. Signed-off-by: Arnd Bergmann Acked-by: Arnd Bergmann --- sound/usb/qcom/qc_audio_offload.c | 32 ++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/sound/usb/qcom/qc_audio_offload.c b/sound/usb/qcom/qc_audio_of= fload.c index c4dde2fa5a1f..46379387c9a5 100644 --- a/sound/usb/qcom/qc_audio_offload.c +++ b/sound/usb/qcom/qc_audio_offload.c @@ -78,9 +78,9 @@ struct intf_info { size_t data_xfer_ring_size; unsigned long sync_xfer_ring_va; size_t sync_xfer_ring_size; - unsigned long xfer_buf_iova; + dma_addr_t xfer_buf_iova; size_t xfer_buf_size; - phys_addr_t xfer_buf_dma; + dma_addr_t xfer_buf_dma; u8 *xfer_buf_cpu; =20 /* USB endpoint information */ @@ -1018,11 +1018,12 @@ static int uaudio_transfer_buffer_setup(struct snd_= usb_substream *subs, struct mem_info_v01 *mem_info) { struct sg_table xfer_buf_sgt; + dma_addr_t xfer_buf_dma; void *xfer_buf; phys_addr_t xfer_buf_pa; u32 len =3D xfer_buf_len; bool dma_coherent; - unsigned long iova; + dma_addr_t xfer_buf_dma_sysdev; u32 remainder; u32 mult; int ret; @@ -1045,29 +1046,38 @@ static int uaudio_transfer_buffer_setup(struct snd_= usb_substream *subs, len =3D MAX_XFER_BUFF_LEN; } =20 - xfer_buf =3D usb_alloc_coherent(subs->dev, len, GFP_KERNEL, &xfer_buf_pa); + /* get buffer mapped into subs->dev */ + xfer_buf =3D usb_alloc_coherent(subs->dev, len, GFP_KERNEL, &xfer_buf_dma= ); if (!xfer_buf) return -ENOMEM; =20 + /* Remapping is not possible if xfer_buf is outside of linear map */ + xfer_buf_pa =3D virt_to_phys(xfer_buf); + if (WARN_ON(!page_is_ram(PFN_DOWN(xfer_buf_pa)))) { + ret =3D -ENXIO; + goto unmap_sync; + } dma_get_sgtable(subs->dev->bus->sysdev, &xfer_buf_sgt, xfer_buf, - xfer_buf_pa, len); - iova =3D uaudio_iommu_map(MEM_XFER_BUF, dma_coherent, xfer_buf_pa, len, - &xfer_buf_sgt); - if (!iova) { + xfer_buf_dma, len); + + /* map the physical buffer into sysdev as well */ + xfer_buf_dma_sysdev =3D uaudio_iommu_map(MEM_XFER_BUF, dma_coherent, + xfer_buf_pa, len, &xfer_buf_sgt); + if (!xfer_buf_dma_sysdev) { ret =3D -ENOMEM; goto unmap_sync; } =20 - mem_info->dma =3D xfer_buf_pa; + mem_info->dma =3D xfer_buf_dma; mem_info->size =3D len; - mem_info->iova =3D PREPEND_SID_TO_IOVA(iova, uaudio_qdev->data->sid); + mem_info->iova =3D PREPEND_SID_TO_IOVA(xfer_buf_dma_sysdev, uaudio_qdev->= data->sid); *xfer_buf_cpu =3D xfer_buf; sg_free_table(&xfer_buf_sgt); =20 return 0; =20 unmap_sync: - usb_free_coherent(subs->dev, len, xfer_buf, xfer_buf_pa); + usb_free_coherent(subs->dev, len, xfer_buf, xfer_buf_dma); =20 return ret; } --=20 2.39.5