From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) (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 5809A1F94A for ; Mon, 5 Jan 2026 06:02:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.168.131 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767592971; cv=none; b=htCUwlmP/0d5FovmBfDnTSqlhedSLvyLp2ERtEQg0nS78QKAO2BTMLVykSKjFaVDGu6WP+sblZGJBpVhzn7YhlS7naFx85xIBSVDDnWvMsJUZt2fbVb5WNOedWjjjz1y+ecaVVLl9vd9WEiNZMGOTCLyQmD3/8nPtK6nnlC9hSo= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1767592971; c=relaxed/simple; bh=/fCfzj8pJxxOFTAhEr458P2AWjbIiUWxcUQI+PiZ+Jo=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=A4xZPPuseNqe6FOfrUkVEty9mmcWxBTtQWpLkq4JltIM+F++FMhZfjKkftIjej8+dfvIvWASuv+10AoAYMmvMUyOsF8N5VAbxo6zJ9laCZhFtSHoZKA3S3sF3e9AjQqg+oWE4ELqi683vyY3r6kWRFwSAGwiXi2/c2BJKQFvoP8= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com; spf=pass smtp.mailfrom=oss.qualcomm.com; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b=dEz5NH5T; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=KNQEvl7w; arc=none smtp.client-ip=205.220.168.131 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=oss.qualcomm.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=qualcomm.com header.i=@qualcomm.com header.b="dEz5NH5T"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="KNQEvl7w" Received: from pps.filterd (m0279864.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 604NqVEB1234621 for ; Mon, 5 Jan 2026 06:02:48 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=qualcomm.com; h= cc:content-transfer-encoding:content-type:date:from:in-reply-to :message-id:mime-version:references:subject:to; s=qcppdkim1; bh= UFHfP3+ljG6X7U8dn/8CT3QCG9bZ5b12GFoxoMcv514=; b=dEz5NH5TMJ3fmF4b MkBivgmuswocIHyZE5EFXAzmzWsAGndlbCaxuWvn17HGgcldLmzzxoK0AlbydA6B GPffIkvhYg/w8ksc7qk2f/C64Yxxb2+n786Y29hUXqrnq40dMMkXBmxuJYZ9fhXb RRs0mL8UF2TAcB+9lh9nglI7aPsuGKJSumpD2AaXoI0C0m4n1/VxNrV8nGvVfH5i 6I4QEr8DNjI1jBSUaShqFjJSC+oK/IGWwUxo+GLPjlYcZ6ZSaDHhr03eiYzANFKl CSTPUJJjwLqeOoMFd/8NEoaqAZXGF8YZu2/WfzUE4FejWmD0L79iq5pJV52XjNMJ LCNOug== Received: from mail-pf1-f197.google.com (mail-pf1-f197.google.com [209.85.210.197]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4bev9hb9ng-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Mon, 05 Jan 2026 06:02:48 +0000 (GMT) Received: by mail-pf1-f197.google.com with SMTP id d2e1a72fcca58-7c1df71b076so27239940b3a.0 for ; Sun, 04 Jan 2026 22:02:48 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1767592968; x=1768197768; darn=vger.kernel.org; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=UFHfP3+ljG6X7U8dn/8CT3QCG9bZ5b12GFoxoMcv514=; b=KNQEvl7welW1gWsvqS0PjC4Ak3ivetL0vFczEzZ5qVGXT8vfwvv9kXJEetAkRRp8ZK lRD1nKbnTwbqNZzNXKLfdoY3NjIwtf+BPlq/PYj3nuoMAZJqD9P96dGJVrPya9aEV5gw xotbPsn2H/9SpLfM2z9s0Jy3X4Me65lP9eIdtKabxyte7ARvsatEMf2GRnzi6lcoTSF7 sjG3gVV0rUR/wVCtbzGAt4sI/EmrPD0k4uALrxlDo2TjxN4LnjcDpbtMZYtIuSv/sQ/f rVN8Vj9Sd73GjQeAgvpBaXycnnv315b/XrqsL4vlbqauZ0hk5lo3BhLsVElRxIhGIC3w ufiA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1767592968; x=1768197768; h=content-transfer-encoding:in-reply-to:from:content-language :references:cc:to:subject:user-agent:mime-version:date:message-id :x-gm-gg:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=UFHfP3+ljG6X7U8dn/8CT3QCG9bZ5b12GFoxoMcv514=; b=uizaC2QMdwdB2tC94ljR9fDRZS78lTsC/zRnv5WVFlKFBMzzBrYPK1dfY+amAuBIUa mh9sJYARu7xgbTLVnKOUHthe8I/+CM3KgA1/19UZO7HZH+gSf/sIQtKQ4OCRQH5e7+qu gEOCJHRfcZVQON81RRirIOvETTbF1FFcHO3u6I6ps3VQ0Q9Ust7ptKzOHR6Oi/oqpJX0 nC0lYsWfCrRcR6mH/AZcmakPaFFrAEEA8rPA8n4P8R/I8lAzOupmRCY0/8w16/DtKZt3 BjXKYowMPTLCrc7hu84+v7PdRP6oZusD8PCpZMgEYqEQnv3GwlvWce/IS1A/2H8ZkSuX pL5A== X-Forwarded-Encrypted: i=1; AJvYcCXzng+MebMuVhTbuCiADmAxUcczvAy42mtcAM7ypTteDoPZPQAmVkZDYiR5HLsCr8BpvE5nCLbxkWnTjMU=@vger.kernel.org X-Gm-Message-State: AOJu0YxepWsvwnBZzTdiF93PaSGjm56TuHht+3zzXf5+et4ml79pFlHK URy4h2CQoHql3rMZ6RxKS2Ntt8vBr/P41ClhLGFrnZLoxMFWb+NjKmCmleMeBGFITZ0plA7dur4 ly24vR2xNEEhDeVHyuMaf3oJRKO6K2LqMqY6H4gCm5P2Tf/1EulTqgVfRCBDU59Lgqgo= X-Gm-Gg: AY/fxX4Ey206vlU1/sIxPKXi8q534xNJduz3Qd1YWxaWVmgHL0BXrLVF8r0KD6Qr7bq XqMrXmIucb2p24XIolprmM9qGkNNRRQHHwNWBnsmjGkU1zsMZlPE+83OPUIs46nDWlYq8x0l7E7 LQ8sglZE5+cscI5Xw+Qij5zA+jVBW6YuUxHSkhUuRlMFqHw9gG1ji+YkIZw7bM0xN1zmW4XWNgD v3gaClbPc7CbpQm7PRwwylCaiUfWLp1KPrZmywAZSx8ly0Nb5Pr3ECEBNkenDhNvseHvoLvLyzm k00ec+gHymGwHyY1NFXyEmVq3g73620wwKYQfEb/X88TMbEByu3B+vpJrVRkpx3YwNNYd1bLCIH 2tjRYjc2wUVoaOXj5Evmgb9amHWVo4uLETCv+oCiwtQ== X-Received: by 2002:a05:6a00:7613:b0:7ff:acc3:2f40 with SMTP id d2e1a72fcca58-7ffacc33e69mr34282206b3a.26.1767592967783; Sun, 04 Jan 2026 22:02:47 -0800 (PST) X-Google-Smtp-Source: AGHT+IGAM1gi4s6Rb8/IudQp/6kzZlB2f/iYhGxLaNvhfSm/dDSwvfh+ZSwmGB1TjDrmhfM4OyTylw== X-Received: by 2002:a05:6a00:7613:b0:7ff:acc3:2f40 with SMTP id d2e1a72fcca58-7ffacc33e69mr34282183b3a.26.1767592967242; Sun, 04 Jan 2026 22:02:47 -0800 (PST) Received: from [10.206.105.120] ([202.46.23.25]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-7ff7e792b65sm47699729b3a.58.2026.01.04.22.02.44 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sun, 04 Jan 2026 22:02:46 -0800 (PST) Message-ID: Date: Mon, 5 Jan 2026 11:32:42 +0530 Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.8.0 Subject: Re: [RFC PATCH] dma-iommu: Introduce API to reserve IOVA regions for dynamically created devices To: robin.murphy@arm.com, joro@8bytes.org, will@kernel.org, m.szyprowski@samsung.com Cc: iommu@lists.linux.dev, linux-kernel@vger.kernel.org, vikash.garodia@oss.qualcomm.com, dikshita.agarwal@oss.qualcomm.com References: <20251220023555.3017456-1-busanna.reddy@oss.qualcomm.com> Content-Language: en-US From: Vishnu Reddy In-Reply-To: <20251220023555.3017456-1-busanna.reddy@oss.qualcomm.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMTA1MDA1MyBTYWx0ZWRfXzwttxDpnelur HQGWsmAKxaWLvcO2S5W/aJNRHzEwZigt2aIPlgg16EkYJ8pFp0m46T0EFfnXJlrp6oy4lkkR1Jt LH0lz1ummi0BYedpwL0d0N7+zOvJ01FY8xPvBaoABGqf87DbDGWOaTMpNt6fJM3GpKNa8fd4Ah5 TTwGYMZ+EutN79Evm2o5djl0R/4pu6yLXIbOtFqdczPJgRmSxSr+CWYYtmBm7GgmHEGb0ddZTSb US3b9X0pVOtmHfaIdOhRqT0zUCQEad9Y+BKtsMoWS5eYlZ1BkPu1HBJEyJaB9Xm8mVtjv2zQJT9 3gekd19E9kVX/ojwdBaGKta3NHmRSmBINIaqzWw4+y2h7khg5a3I0njJoV/QP0XxpMx10lPj0Au uWjNtajdFBfYixVb+fmaGlRz4FuSRFi1ZX45dQxJs3gnaBi7TQb7TxgeGF7HBx2Oc0lpwxxmA5f k0de6QXOmYthZO7tuNQ== X-Proofpoint-GUID: G7jsOYXjkehXtTKu-V-zsiB0QaPChnfB X-Authority-Analysis: v=2.4 cv=RrbI7SmK c=1 sm=1 tr=0 ts=695b5408 cx=c_pps a=rEQLjTOiSrHUhVqRoksmgQ==:117 a=ZePRamnt/+rB5gQjfz0u9A==:17 a=IkcTkHD0fZMA:10 a=vUbySO9Y5rIA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=EUspDBNiAAAA:8 a=a8cTlLbHd2QiVrkBEt8A:9 a=QEXdDO2ut3YA:10 a=2VI0MkxyNR6bbpdq8BZq:22 X-Proofpoint-ORIG-GUID: G7jsOYXjkehXtTKu-V-zsiB0QaPChnfB X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1121,Hydra:6.1.9,FMLib:17.12.100.49 definitions=2026-01-05_01,2025-12-31_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 clxscore=1015 spamscore=0 impostorscore=0 malwarescore=0 suspectscore=0 adultscore=0 priorityscore=1501 bulkscore=0 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2512120000 definitions=main-2601050053 On 12/20/2025 8:05 AM, Vishnu Reddy wrote: > Drivers can create child devices dynamically. These child devices often > inherit parent device tree node, including its reserved iommu-address > ranges. While device tree can declare the multiple iommu-address ranges, > they still apply uniformly to any child inheriting the parent OF node. > > This creates a limitation when child requires a different iommu-address > range than its parent, as device tree cannot express the reservation per > child. > > Example layout and use case: > ---------------------------- > A multimedia subsystem with multiple child devices and distinct ranges: > > +-----------------------------------------------------------+ > | Device A reserved region (256 MB) | > | 0x00000000 - 0x10000000 | > +-----------------------------------------------------------+ > | Device B reserved region (512 MB) | > | 0x00000000 - 0x20000000 | > +-----------------------------------------------------------+ > | Device C reserved region (600 MB) | > | 0x00000000 - 0x25800000 | > +-----------------------------------------------------------+ > | Other reserved regions | > +-----------------------------------------------------------+ > > If we add Device C's reserved range (0x0 to 0x025800000) into iommu > address range into device tree and assign that OF node to Device B > and C, it wastes memory: > - Device A wastes ~344 MB > - Device B wastes ~88 MB > > To avoid this, drivers can use the introduced API to set their device > specific IOVA region at runtime, ensuring the DMA mapping without > unnecessary address space reservation. > > Signed-off-by: Vishnu Reddy > --- > drivers/iommu/dma-iommu.c | 44 +++++++++++++++++++++++++++++++++++++ > include/linux/dma-mapping.h | 7 ++++++ > 2 files changed, 51 insertions(+) > > diff --git a/drivers/iommu/dma-iommu.c b/drivers/iommu/dma-iommu.c > index c92088855450a..02c54cddf9417 100644 > --- a/drivers/iommu/dma-iommu.c > +++ b/drivers/iommu/dma-iommu.c > @@ -1743,6 +1743,50 @@ size_t iommu_dma_max_mapping_size(struct device *dev) > return SIZE_MAX; > } > > +/** > + * dma_iova_set_resv_region - Set a reserved region in the IOVA space > + * @dev: Device to set the reserved region for > + * @start: Start of the reserved region > + * @length: Length of the reserved region > + * > + * This function enables drivers to set device specific reservations at > + * runtime, which is particularly useful for dynamically created child > + * devices that requires distinct IOVA ranges than parent. > + * > + * Returns: > + * 0 - Success > + * -ENODEV - No valid IOMMU DMA domain for the device > + * -EINVAL - Invalid domain or cookie type for this operation > + * -ENOMEM - Failed to reserve the requested range > + */ > +int dma_iova_set_resv_region(struct device *dev, unsigned long start, > + unsigned long length) > +{ > + struct iommu_dma_cookie *cookie; > + struct iommu_domain *domain; > + struct iova_domain *iovad; > + unsigned long lo, hi; > + > + domain = iommu_get_dma_domain(dev); > + if (!domain || domain->type != IOMMU_DOMAIN_DMA) > + return -ENODEV; > + > + cookie = domain->iova_cookie; > + if (!cookie || domain->cookie_type != IOMMU_COOKIE_DMA_IOVA) > + return -EINVAL; > + > + iovad = &cookie->iovad; > + > + lo = iova_pfn(iovad, start); > + hi = iova_pfn(iovad, start + length - 1); > + > + if (!reserve_iova(iovad, lo, hi)) > + return -ENOMEM; > + > + return 0; > +} > +EXPORT_SYMBOL_GPL(dma_iova_set_resv_region); > + > /** > * dma_iova_try_alloc - Try to allocate an IOVA space > * @dev: Device to allocate the IOVA space for > diff --git a/include/linux/dma-mapping.h b/include/linux/dma-mapping.h > index aa36a0d1d9df6..c89147cf92231 100644 > --- a/include/linux/dma-mapping.h > +++ b/include/linux/dma-mapping.h > @@ -339,6 +339,8 @@ static inline bool dma_use_iova(struct dma_iova_state *state) > return state->__size != 0; > } > > +int dma_iova_set_resv_region(struct device *dev, unsigned long start, > + unsigned long length); > bool dma_iova_try_alloc(struct device *dev, struct dma_iova_state *state, > phys_addr_t phys, size_t size); > void dma_iova_free(struct device *dev, struct dma_iova_state *state); > @@ -358,6 +360,11 @@ static inline bool dma_use_iova(struct dma_iova_state *state) > { > return false; > } > +static inline int dma_iova_set_resv_region(struct device *dev, unsigned long start, > + unsigned long length) > +{ > + return -ENODEV; > +} > static inline bool dma_iova_try_alloc(struct device *dev, > struct dma_iova_state *state, phys_addr_t phys, size_t size) > { Reminder to review this patch. Thanks Vishnu Reddy