From nobody Fri Apr 3 06:26:52 2026 Received: from mx0b-0031df01.pphosted.com (mx0b-0031df01.pphosted.com [205.220.180.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 658133976AB for ; Fri, 13 Mar 2026 13:20:33 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=205.220.180.131 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773408035; cv=none; b=GwXmFglZCzkk6dDvO6KES8SZ4Nr7JfplE/qP0Pv2+QMlA+Se4SwysOJrVHos4hU2wuzcaYsiRIvqiVQkYpG9lo/lLEajx5K8WDPqW00Hua+0bIzVSSTGQPvLvwUzQTkbQJ7h9sQX7TTSYvUk/xjjtXL5Fc2xkQ4I/yFan7QAqSA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1773408035; c=relaxed/simple; bh=0lhwz2GDhjJccpcaQkd+oJUE1mfWYeMI5kJ2acMGxnc=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=rhmEBoq9I0jgrAlzXwpGo4PLqAazgRJOLdWxm3nyiWKMd3mvS7VFt6wNAyJ6E23YVdukyEJUMkgFzAzsqi9jxRQ/EAcshN3gqmxtt0FJfvT/WQHMtwuc/Rb1N7Vfa+sIoXbpgZ86SaZRfBQBmfFj5r59M+j5kawgefDUDxu/iGQ= 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=QXxciobJ; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=On44iUYd; arc=none smtp.client-ip=205.220.180.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="QXxciobJ"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="On44iUYd" Received: from pps.filterd (m0279873.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 62D9B5Fp3906306 for ; Fri, 13 Mar 2026 13:20:32 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= 4F9nsNfa79aeW6n/ixoZUFyCpjEcfZKeyDWXPLWxujc=; b=QXxciobJCjHsoGaj P+jIXpueQ1T0mtnUDXSDnmscrtWUmxctpN3RigIwc4GZPkxPy18iYuW+PebEXPAq FPpOMuEj+S9BQ1tzkC3+K7D0oWQ+PDPQUj/QmseakkuAE6eUEw4HT1o54L7LZ0gD RmiYeTMMpaYXZ/+XULIHmiN96wlZsLegNKH41sJ0EvNii1yLUUz8zgVsgjCsHydu /S/sPfWW3US63sTQSW8vzuVT9B6RLSsKE+XnFT3nKUqjSoyB8drY6dHMyFY+Caar ioqtywaWF+lvcaCc+sQK7oVGMcp48+Sj3QCC5Ap0kQHtW7sQ/9KYlV6cU6OfM4/n I8IzLg== Received: from mail-pl1-f198.google.com (mail-pl1-f198.google.com [209.85.214.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4cvfqs8scj-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Fri, 13 Mar 2026 13:20:32 +0000 (GMT) Received: by mail-pl1-f198.google.com with SMTP id d9443c01a7336-2ae6961bff0so166275825ad.2 for ; Fri, 13 Mar 2026 06:20:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1773408031; x=1774012831; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=4F9nsNfa79aeW6n/ixoZUFyCpjEcfZKeyDWXPLWxujc=; b=On44iUYd+A2uVJUVy7v/DTXSTo9Sh7WvOei+Zxfptdcf6dpkl9SmQbsCQAWqLMsSgZ xjYfHssdLa5l/divTS2MiNAB+9/7RUe1+ZVTlaSlNtwJeakkGkhmY0ciudsqW8vr5dKO ZZavoyQgjxyzWXqqRJi0hR7CupHaKBEyVR78+YXSyNpwgNzD7JogFXkS+dT4hKCf3ugo hjqCUN99L0SnsmIEfqDS5DXkYOQrGTrVOwcRKHGljmZuaoWhqOkAL2hQx3rETaYBSH0z XNxSr6MDrLfpoNvbDW+QNs4H7OUuZPLvpTRMDuelnF/2xIQLWRAKiKLOYTKrwtcr4Sa8 +ogQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1773408031; x=1774012831; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=4F9nsNfa79aeW6n/ixoZUFyCpjEcfZKeyDWXPLWxujc=; b=cZG3V7aPGEjW2kvVfLR2okSAec8+YWelCYJVH+BOwLVB51+Gmv/vjWigJNq4TNw3bG tLsbRK/YQCkO0uf4wpbmbLBIJAjUr0L988qhu/LZjQ1qXGHrKexIf+hLedxPuFSTmzh3 ObqivNQKs+p/GzKGscfJ5FUaV9OO6RLO5M7hucsBQGUC2Hryg6YnjCFjZzOKwSw1TtNv /58w2tJn5CnRKhf5U3Amb6MQ0aDs47o+5lvHPsmsB5EMt3s8jcUjZY1xVDHmfvwMaRKO 4wOuflkgT1BYP9HxHvKkxgoz7bXrzn2llM3eKLvt9sFVp5+KNy4kYcmoUqtKHNQgLXJE fAow== X-Forwarded-Encrypted: i=1; AJvYcCX3+kCb2pz8nrZjV0QCrMA2sEQxp/0XScUpBSBmAqpHxKGS4IQlWJTF30Af+VQJsVB17Ow050+3lJWzdSk=@vger.kernel.org X-Gm-Message-State: AOJu0Ywt24fOpMxu40GG0inf36I2Kbkzb0QMoFR/o4HTs1qLMjp5j6Pd 4Um1E8ioeMSw4gRsdQ6G/LGPgUFm0Ur7E1DkEgDJy9UHFIgbhApZdpHMOdtCmH51kWvDv0CiVDP WvW9tXSNHGfs1CnQiD10gHpvkMXOPYdNLrr4Cv209WfeA8b6FE2dJ7uLm7Wqs7WuzEsI= X-Gm-Gg: ATEYQzwgvGeyfb9qDvy4Qv6arJQqYgMiPsvwEnrBOBlmhPYEavx+UZDOv+BcqQD9A4S gTOXY/sSc4u7GVpQ0+uVr70zFjTLecrbFMLxQ2VRyjNAr2c+zTrF/NVKYH78T6vUhdW+YJAoRm3 /F/9kMpqRIkNQ+hTSAj6ft2IXTJ/Vvvtucp770XHYC6OvLJDr2nZyc4WVQ5XOn7c0kl84uHDa1k 4y2jNdR9BoqMsjELEzC7vEReHajHWyKtaUQcRDkbfypDFEXd398X6lWgZ7K2uKFkuPG33amjnqR fMqSr4vy3wPVgzT4q9l2KrtJOpg1yiH1kSgIrR3jbFA2QlPCfGUfJYMljO1XKE2KoFxoLuYhs79 V8YX44cS/J/53vNjEB2ZMouKN6GfJsAMzhqWPX6Rk2iBOrPLXX1WNvj/J X-Received: by 2002:a05:6a21:d83:b0:398:a027:4729 with SMTP id adf61e73a8af0-398ecd61750mr3046027637.55.1773408031173; Fri, 13 Mar 2026 06:20:31 -0700 (PDT) X-Received: by 2002:a05:6a21:d83:b0:398:a027:4729 with SMTP id adf61e73a8af0-398ecd61750mr3045989637.55.1773408030646; Fri, 13 Mar 2026 06:20:30 -0700 (PDT) Received: from hu-vgarodia-hyd.qualcomm.com ([202.46.23.25]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-82a0724407csm5775254b3a.8.2026.03.13.06.20.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 13 Mar 2026 06:20:30 -0700 (PDT) From: Vikash Garodia Date: Fri, 13 Mar 2026 18:49:38 +0530 Subject: [PATCH v3 4/7] media: iris: add context bank devices using iommu-map Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260313-kaanapali-iris-v3-4-9c0d1a67af4b@oss.qualcomm.com> References: <20260313-kaanapali-iris-v3-0-9c0d1a67af4b@oss.qualcomm.com> In-Reply-To: <20260313-kaanapali-iris-v3-0-9c0d1a67af4b@oss.qualcomm.com> To: Dikshita Agarwal , Abhinav Kumar , Bryan O'Donoghue , Mauro Carvalho Chehab , Rob Herring , Krzysztof Kozlowski , Dmitry Baryshkov , Conor Dooley , Saravana Kannan , Joerg Roedel , Will Deacon , Robin Murphy , Stefan Schmidt , Hans Verkuil , Krzysztof Kozlowski , Vishnu Reddy , Hans Verkuil Cc: linux-arm-msm@vger.kernel.org, linux-media@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, iommu@lists.linux.dev, Bryan O'Donoghue , Vikash Garodia X-Mailer: b4 0.14.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1773407994; l=8180; i=vikash.garodia@oss.qualcomm.com; s=20241104; h=from:subject:message-id; bh=0lhwz2GDhjJccpcaQkd+oJUE1mfWYeMI5kJ2acMGxnc=; b=zAt3JN8iKdg4o8FqqkscPxekNQSgxCasQo7rUCKTLirHeNWrQoLU7HtDMiEBJzp0MMLyPllqw evNcu6xRZXyBNpYRXcZTEU2dxHtP1eIwgV9JDgE/BO/ry8ngu3dgihD X-Developer-Key: i=vikash.garodia@oss.qualcomm.com; a=ed25519; pk=LY9Eqp4KiHWxzGNKGHbwRFEJOfRCSzG/rxQNmvZvaKE= X-Proofpoint-ORIG-GUID: WdTh72P7dyQsjyMVHYS68smiFA762Vbo X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwMzEzMDEwNiBTYWx0ZWRfX5qXQV7fA0SFr jet+UxM/5Q1NOzwV7N0lmdknUtZDYghEczopO8JF7oYPbxYyez5CkUtuwnbAnV/I/lTmSj/+NmK HdMFhGP/8gT6FEXGqy6mfM8hAEgKl4nd0DWggsZDfZD9YvdNeRD+vvujBUOF+SuBUBCPKrUneMg 6J4bdk4EFrGOApl3m8dwsoFvey90XKo74Kk/q4hYUKau1WQ/z2OJ9iOMUAlg6Umf2tQZzbhb1Xs 4Oz5bEFDSDC21+hTtaIqrpceXpSUCmaHi99nat8givbfHfLKNRTyhwNubr3bFAzZ5zXb9/Q4o+E +1fWxRutU0EtQhskoJlKH+69uMBeJbv/s0xzDGQav02+mdh90qg/0aHNl72VLE2/vfR3aHq0yhG K1YRe4kwjEY00aMZ73BWzYr3e6sUqF8irb/iRZi0MopO7EWsyfPrGRofI72h67QM1MZE9/s5SwJ AyXB7apuRPJdKivk+fA== X-Proofpoint-GUID: WdTh72P7dyQsjyMVHYS68smiFA762Vbo X-Authority-Analysis: v=2.4 cv=GoNPO01C c=1 sm=1 tr=0 ts=69b40f20 cx=c_pps a=MTSHoo12Qbhz2p7MsH1ifg==:117 a=ZePRamnt/+rB5gQjfz0u9A==:17 a=IkcTkHD0fZMA:10 a=Yq5XynenixoA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=rJkE3RaqiGZ5pbrm-msn:22 a=EUspDBNiAAAA:8 a=SfyqL-E6UMM09KjvQ6sA:9 a=QEXdDO2ut3YA:10 a=GvdueXVYPmCkWapjIL-Q:22 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1143,Hydra:6.1.51,FMLib:17.12.100.49 definitions=2026-03-13_02,2026-03-13_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 adultscore=0 malwarescore=0 lowpriorityscore=0 spamscore=0 impostorscore=0 bulkscore=0 priorityscore=1501 phishscore=0 clxscore=1015 suspectscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2603050001 definitions=main-2603130106 Introduce different context banks(CB) and the associated buffer region. Different stream IDs from VPU would be associated to one of these CB. Multiple CBs are needed to increase the IOVA for the video usecases like higher concurrent sessions. Co-developed-by: Vishnu Reddy Signed-off-by: Vishnu Reddy Signed-off-by: Vikash Garodia --- drivers/media/platform/qcom/iris/iris_core.h | 2 + .../platform/qcom/iris/iris_platform_common.h | 14 +++++ drivers/media/platform/qcom/iris/iris_probe.c | 66 ++++++++++++++++++= ++-- drivers/media/platform/qcom/iris/iris_resources.c | 46 +++++++++++++++ drivers/media/platform/qcom/iris/iris_resources.h | 1 + 5 files changed, 125 insertions(+), 4 deletions(-) diff --git a/drivers/media/platform/qcom/iris/iris_core.h b/drivers/media/p= latform/qcom/iris/iris_core.h index fb194c967ad4f9b5e00cd74f0d41e0b827ef14db..62364bd6909e9a03d223bac8696= 2dc9094a40243 100644 --- a/drivers/media/platform/qcom/iris/iris_core.h +++ b/drivers/media/platform/qcom/iris/iris_core.h @@ -34,6 +34,7 @@ enum domain_type { * struct iris_core - holds core parameters valid for all instances * * @dev: reference to device structure + * @cb_devs: array of context bank devices (eg: bitstream, non-pixel, pixe= l, etc) * @reg_base: IO memory base address * @irq: iris irq * @v4l2_dev: a holder for v4l2 device structure @@ -77,6 +78,7 @@ enum domain_type { =20 struct iris_core { struct device *dev; + struct device *cb_devs[IRIS_MAX_REGION]; void __iomem *reg_base; int irq; struct v4l2_device v4l2_dev; diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h b/driv= ers/media/platform/qcom/iris/iris_platform_common.h index 2273243d1a80446233dd82dcd77444aa043ad064..df63a06b8401cd367c69ab8909a= f227f04bf69bf 100644 --- a/drivers/media/platform/qcom/iris/iris_platform_common.h +++ b/drivers/media/platform/qcom/iris/iris_platform_common.h @@ -204,6 +204,18 @@ struct icc_vote_data { u32 fps; }; =20 +enum iris_buffer_region { + IRIS_UNKNOWN_REGION, + IRIS_BITSTREAM_REGION, + IRIS_NON_PIXEL_REGION, + IRIS_PIXEL_REGION, + IRIS_SECURE_BITSTREAM_REGION, + IRIS_SECURE_NON_PIXEL_REGION, + IRIS_SECURE_PIXEL_REGION, + IRIS_FIRMWARE_REGION, + IRIS_MAX_REGION, +}; + struct iris_context_bank { char *name; u32 f_id; @@ -252,6 +264,8 @@ struct iris_platform_data { u32 inst_fw_caps_enc_size; const struct tz_cp_config *tz_cp_config_data; u32 tz_cp_config_data_size; + const struct iris_context_bank *cb_data; + const u32 cb_data_size; u32 core_arch; u32 hw_response_timeout; struct ubwc_config_data *ubwc_config; diff --git a/drivers/media/platform/qcom/iris/iris_probe.c b/drivers/media/= platform/qcom/iris/iris_probe.c index ddaacda523ecb9990af0dd0640196223fbcc2cab..439e6e0fe8adf8287f81d26257e= f2a7e9f21e53d 100644 --- a/drivers/media/platform/qcom/iris/iris_probe.c +++ b/drivers/media/platform/qcom/iris/iris_probe.c @@ -123,6 +123,55 @@ static int iris_init_resets(struct iris_core *core) core->iris_platform_data->controller_rst_tbl_size); } =20 +static void iris_destroy_child_device(struct iris_core *core, const struct= iris_context_bank *cb) +{ + u32 index, region_mask =3D cb->region_mask; + struct device *dev =3D NULL; + + while (region_mask) { + index =3D __ffs(region_mask); + dev =3D core->cb_devs[index]; + core->cb_devs[index] =3D NULL; + region_mask &=3D ~BIT(index); + } + + if (dev) + device_unregister(dev); +} + +static void iris_deinit_context_bank_devices(struct iris_core *core) +{ + const struct iris_context_bank *cb; + int i; + + for (i =3D 0; i < core->iris_platform_data->cb_data_size; i++) { + cb =3D &core->iris_platform_data->cb_data[i]; + iris_destroy_child_device(core, cb); + } +} + +static int iris_init_context_bank_devices(struct iris_core *core) +{ + const struct iris_context_bank *cb; + int ret, i; + + for (i =3D 0; i < core->iris_platform_data->cb_data_size; i++) { + cb =3D &core->iris_platform_data->cb_data[i]; + + ret =3D iris_create_child_device_and_map(core, cb); + if (ret) + goto err_deinit_cb; + } + + return 0; + +err_deinit_cb: + while (i-- > 0) + iris_destroy_child_device(core, &core->iris_platform_data->cb_data[i]); + + return ret; +} + static int iris_init_resources(struct iris_core *core) { int ret; @@ -193,6 +242,7 @@ static void iris_remove(struct platform_device *pdev) return; =20 iris_core_deinit(core); + iris_deinit_context_bank_devices(core); =20 video_unregister_device(core->vdev_dec); video_unregister_device(core->vdev_enc); @@ -275,12 +325,18 @@ static int iris_probe(struct platform_device *pdev) =20 platform_set_drvdata(pdev, core); =20 - dma_mask =3D core->iris_platform_data->dma_mask; - - ret =3D dma_set_mask_and_coherent(dev, dma_mask); + ret =3D iris_init_context_bank_devices(core); if (ret) goto err_vdev_unreg_enc; =20 + dma_mask =3D core->iris_platform_data->dma_mask; + + if (device_iommu_mapped(core->dev)) { + ret =3D dma_set_mask_and_coherent(core->dev, dma_mask); + if (ret) + goto err_deinit_cb; + } + dma_set_max_seg_size(&pdev->dev, DMA_BIT_MASK(32)); dma_set_seg_boundary(&pdev->dev, DMA_BIT_MASK(32)); =20 @@ -288,10 +344,12 @@ static int iris_probe(struct platform_device *pdev) pm_runtime_use_autosuspend(core->dev); ret =3D devm_pm_runtime_enable(core->dev); if (ret) - goto err_vdev_unreg_enc; + goto err_deinit_cb; =20 return 0; =20 +err_deinit_cb: + iris_deinit_context_bank_devices(core); err_vdev_unreg_enc: video_unregister_device(core->vdev_enc); err_vdev_unreg_dec: diff --git a/drivers/media/platform/qcom/iris/iris_resources.c b/drivers/me= dia/platform/qcom/iris/iris_resources.c index 773f6548370a257b8ae7332242544266cbbd61a9..a2e648f4cdb8c63db89396d49f3= 2bbc06d870ea5 100644 --- a/drivers/media/platform/qcom/iris/iris_resources.c +++ b/drivers/media/platform/qcom/iris/iris_resources.c @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include @@ -141,3 +142,48 @@ int iris_disable_unprepare_clock(struct iris_core *cor= e, enum platform_clk_type =20 return 0; } + +static void iris_device_release(struct device *dev) +{ + dev_set_drvdata(dev, NULL); + kfree(dev); +} + +int iris_create_child_device_and_map(struct iris_core *core, const struct = iris_context_bank *cb) +{ + u32 index, region_mask =3D cb->region_mask; + struct device *dev; + int ret; + + dev =3D kzalloc_obj(*dev); + if (!dev) + return -ENOMEM; + + dev->release =3D iris_device_release; + dev->bus =3D &iris_vpu_bus_type; + dev->parent =3D core->dev; + dev->coherent_dma_mask =3D core->iris_platform_data->dma_mask; + dev->dma_mask =3D &dev->coherent_dma_mask; + + dev_set_name(dev, "%s", cb->name); + dev_set_drvdata(dev, (void *)cb); + + ret =3D device_register(dev); + if (ret) { + put_device(dev); + return ret; + } + + if (!device_iommu_mapped(dev)) { + device_unregister(dev); + return 0; + } + + while (region_mask) { + index =3D __ffs(region_mask); + core->cb_devs[index] =3D dev; + region_mask &=3D ~BIT(index); + } + + return 0; +} diff --git a/drivers/media/platform/qcom/iris/iris_resources.h b/drivers/me= dia/platform/qcom/iris/iris_resources.h index 6bfbd2dc6db095ec05e53c894e048285f82446c6..c573016535b87d4fd140cad967d= 926cc1de63382 100644 --- a/drivers/media/platform/qcom/iris/iris_resources.h +++ b/drivers/media/platform/qcom/iris/iris_resources.h @@ -15,5 +15,6 @@ int iris_unset_icc_bw(struct iris_core *core); int iris_set_icc_bw(struct iris_core *core, unsigned long icc_bw); int iris_disable_unprepare_clock(struct iris_core *core, enum platform_clk= _type clk_type); int iris_prepare_enable_clock(struct iris_core *core, enum platform_clk_ty= pe clk_type); +int iris_create_child_device_and_map(struct iris_core *core, const struct = iris_context_bank *cb); =20 #endif --=20 2.34.1