From mboxrd@z Thu Jan 1 00:00:00 1970 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 9686138E11A for ; Wed, 13 May 2026 18:56:12 +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=1778698574; cv=none; b=fTglAdCvitP8gdKS8Av2zJBaGji4mDlL3Uq+LcZk8vGW4tQ+NCNgfUI10UcwPExat+vLYcI6vhMMb5te1+84aVpveG5NwOxJsqQqIU46w3W7W/u7ANGv9/l5DDyPnOVon0iPOzuNFqUOKFo6ruAvD4YjXjdASA760cBKoS7krx0= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778698574; c=relaxed/simple; bh=ygAXg0yIaIgGsp62GGnfC5yDl2KNxF7XrFSjT3ekOXQ=; h=Message-ID:Date:MIME-Version:From:Subject:To:Cc:References: In-Reply-To:Content-Type; b=Do+Wk82js0OYnUnKZqjEPvmtdmL5EeRCdtC7ZV6Uc2RXi2KlGJzDdWvjC5LGi9TQxRoKRS+159TRWbOY7hSq/HovjuSeY/95dMCIV4BNrDx4PYbWrp4oBVgQ1i6GV70k3PQcmmPKoLqnK3Le+AYXhC4T7yVSyTssjPknrCxswFo= 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=XNnl75Vq; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=kmiX+2uP; 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="XNnl75Vq"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="kmiX+2uP" Received: from pps.filterd (m0279868.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64DHM3kX3430351 for ; Wed, 13 May 2026 18:56:11 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= lMUtsmmXt0qUbaR0tmN+fLAyBCwIAa6nmnyrZoPa5NI=; b=XNnl75VqhH2EXAgX cuG+cL6Ril3WR0AaPb+WH4filrKXbkkF/otEdCY5HvqjiZpcZumor1T33pOvFHu5 /Mi4xxeq03+YR9I1gDxb3u7Tuq7p63lqi0E6s52TkNz9H3/h1Y1zaR1k6rswBUr1 Kt7KtAqt2tblvq9mbTi6pRCXv8b5AzoTMSq/Q7hGwQTJ3GVnUZraMpEyOERe5+OD gqKZsr0uRh1+7h+mVoyfLyCYclu3qHDjnC3H8Q/HV1dlP5Rjb4qHbF1uiQbn3xjF wkiz1tLD7h8dNff2tIkC1nwPQXlI9bqIY/zcJ33XdksHJTId8f/lmx5WyX9u2aqm 9xSbww== Received: from mail-pj1-f72.google.com (mail-pj1-f72.google.com [209.85.216.72]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4e4qmcj1k9-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 13 May 2026 18:56:11 +0000 (GMT) Received: by mail-pj1-f72.google.com with SMTP id 98e67ed59e1d1-36641fe4aedso11109373a91.1 for ; Wed, 13 May 2026 11:56:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1778698571; x=1779303371; darn=vger.kernel.org; h=content-transfer-encoding:in-reply-to:content-language:references :cc:to:subject:from:user-agent:mime-version:date:message-id:from:to :cc:subject:date:message-id:reply-to; bh=lMUtsmmXt0qUbaR0tmN+fLAyBCwIAa6nmnyrZoPa5NI=; b=kmiX+2uP77psYdvHKD6UL4uFZOWX3OUAVHNt6S8aVh0L5fmX4um8/cibDy7TL1t5ZU kOp2aj9J3SitTjeVHTn6ooS466HPaVN8EFLBYmaArncMwYKHq4tvtf9sKpzpND7lgWj/ a412dCrAbAIzL/PjpiAPTFd8SZo/dD5Mr1Ap6TW9jTk8WejERWKOxtYo+v2SW+2m1uEZ IlC6m8wGo6N8FrCPVZgjTMY4SoiXNDvh4R8qvaQbGuSMsssbLgDfEBoZ3SCoN7mHdZvo 7SavD4FIGUKTQK9GdRkEyZyADChrFJMjDnc/KQlim6HmdfbN3ywQ4pTGOuxb7Vf/qBeD MAoQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778698571; x=1779303371; h=content-transfer-encoding:in-reply-to:content-language:references :cc:to:subject:from:user-agent:mime-version:date:message-id:x-gm-gg :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=lMUtsmmXt0qUbaR0tmN+fLAyBCwIAa6nmnyrZoPa5NI=; b=GlLejW+iwnuZ5SkuKDtjRPQaCJc7uE7evSDXEFOsZWzKW08POO5jOYdO4PxV6CvkZb S+k1MNezuqe6q+dcIYDeYUUbbS8scXfHAfR9+o7Ix+eGJvncymDwB+QmoqNNxuKQQlSq Sb/i9SSBlEIzFEp0GziXEuKsrfvwmUmEfv/7PhOTuXfokSolOTzB8usJq/ynnjprqpGx qaVpHalfeMX5ZrN1F4zdDj2GHnCkieUIy7Ncvc5U4f0QMnPdiywQkTkgI+cD5RuIV1MC Z6W7wFzAqYUe/PDgiJyW7NOeEDPb9hP5TvxAupBMOG9nMIHPmxB7n95i+jWzlsMLwS1g SBFw== X-Forwarded-Encrypted: i=1; AFNElJ/GV9SZvrTN1Z1Bd89h38liSp9IRcOg4Fi0Qias/ScscDSZI8XOMpedpjr8BOXTzWlvMSIjoSu8pTHm@vger.kernel.org X-Gm-Message-State: AOJu0YzFzqSCeKE1E9v1MXfJTaZfPGqnotwDeIWQRNTJO7hyIjIu21ba TsMK5NHNRHTK5POUzz0X7IIzfBghqQd5xMxk0rxGuyUp9pZ9Jq/+ZoHYd74Gwge4bD/qc/FRt0B YA/pB8vjjJxn3Kk2Sk+bdfXePYKHgwmgdl5Pr5mGr0Dwmwgw4pP9F+WT4H72uJaSI X-Gm-Gg: Acq92OFoU+2MtSmCWRgsZCOt0PiWCwUKBjOwxkAMEdgB9Dsn/JdnVqqWR8oC2ExzNwY V25rcHxIfF4vNbEtxJYuGpFxGdHsXu+vGKlqjLbHRYGHJ0oU/+dSsWDI8DPmQVZfWkh08lYDKkb wKKViRff8yY5M1pYUMMPOmVD5ODq7dr/p11V+tA9dejVoIkarDyabpAVbHan8AtCXN9t3NKLLb6 UR0ecwSO0XndbKWUnQwh85/JyhqvTOVK8PbY6tjSXfcBoBsA95YcOevhVJDp+pKJAeOgekigwKQ V2YOEgqcTyOnneXGE6Uf2V5KQ3u1kCJ87Qx/DMTo4oArPdwIN0gVORr/Zn7W8wFk2CPIcEF8QWQ rPtZKP16N4rWJqYU/l5TU7yRyD7Tt2usWfJRAv25EHouMaWUmGJGl X-Received: by 2002:a17:90b:56cb:b0:365:c8e3:ec53 with SMTP id 98e67ed59e1d1-368f3d3b8d2mr4973322a91.20.1778698570517; Wed, 13 May 2026 11:56:10 -0700 (PDT) X-Received: by 2002:a17:90b:56cb:b0:365:c8e3:ec53 with SMTP id 98e67ed59e1d1-368f3d3b8d2mr4973280a91.20.1778698569910; Wed, 13 May 2026 11:56:09 -0700 (PDT) Received: from [192.168.0.17] ([49.205.251.25]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-368ede204a4sm3725604a91.4.2026.05.13.11.56.01 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 13 May 2026 11:56:09 -0700 (PDT) Message-ID: Date: Thu, 14 May 2026 00:25:58 +0530 Precedence: bulk X-Mailing-List: devicetree@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 From: Vishnu Reddy Subject: Re: [PATCH v5 11/14] media: iris: Add support to select core for dual core platforms To: Dmitry Baryshkov Cc: Vikash Garodia , Dikshita Agarwal , Abhinav Kumar , Bryan O'Donoghue , Mauro Carvalho Chehab , Joerg Roedel , Will Deacon , Robin Murphy , Hans Verkuil , Stefan Schmidt , Rob Herring , Krzysztof Kozlowski , Conor Dooley , Stanimir Varbanov , Jorge Ramirez-Ortiz , Del Regno , Bjorn Andersson , Konrad Dybcio , linux-kernel@vger.kernel.org, linux-media@vger.kernel.org, linux-arm-msm@vger.kernel.org, iommu@lists.linux.dev, Krzysztof Kozlowski , devicetree@vger.kernel.org References: <20260509-glymur-v5-0-7fbb340c5dbd@oss.qualcomm.com> <20260509-glymur-v5-11-7fbb340c5dbd@oss.qualcomm.com> Content-Language: en-US In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Proofpoint-GUID: SeiJI9DTxB9pay5FTAfYwy3weKUAvpCn X-Authority-Analysis: v=2.4 cv=Hu5G3UTS c=1 sm=1 tr=0 ts=6a04c94b cx=c_pps a=RP+M6JBNLl+fLTcSJhASfg==:117 a=UdqKVphAFhxg2bWZaUV5ew==:17 a=IkcTkHD0fZMA:10 a=NGcC8JguVDcA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=ZpdpYltYx_vBUK5n70dp:22 a=EUspDBNiAAAA:8 a=4Kw0L1zkfPIsoMSo1fEA:9 a=QEXdDO2ut3YA:10 a=iS9zxrgQBfv6-_F4QbHw:22 X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTEzMDE4NyBTYWx0ZWRfX5hgPPT8dKmxU imXTtgotsSTihE53rlKEGRiuHmfn8i2IVa5J06sQ5ZBB/YYgj+bZA3OzAz+mJ1Y4W/0CNjfqdK9 N1sgojkoQzX8NwgrnI9VoN0vCyOfqUWAN+K2BJfbwZyvS3JEDvNcRWFQk9vl0vEeUqESQR1tidN AA4A4EGpCsJkwABFx8nCcd470+opaCMmcILdLGq2Axg55yr3h7WfdOIIf4MXLYbAJgq0EeYzCJf 35kzYFH/aEaAQwAOQm9HQH90tOj/GtzuS9C9FwoDpLIIfEeDtZPpJUFRJ/79cZt0uPsANkA8+e6 mM/d+Sz58YG22tFM6g5PZabBNoON6Z2jYknMKGEq9ClFS82mG2lFGMW5+hJq1BKOIk9MMLoBcrc crl6WF0E9G1SXqlXfzRttp6WBO/3t8q8OyBL4sZOhV6iooZ79iMBOmwH/ihczh2VqhfU2NBU/Tb 0cpIJvin1s6aRlsx4gg== X-Proofpoint-ORIG-GUID: SeiJI9DTxB9pay5FTAfYwy3weKUAvpCn 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-05-13_02,2026-05-13_01,2025-10-01_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 malwarescore=0 impostorscore=0 priorityscore=1501 spamscore=0 clxscore=1015 bulkscore=0 suspectscore=0 adultscore=0 lowpriorityscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605050000 definitions=main-2605130187 On 5/13/2026 7:21 PM, Dmitry Baryshkov wrote: > On Mon, May 11, 2026 at 09:42:43PM +0530, Vishnu Reddy wrote: >> On 5/9/2026 2:30 AM, Dmitry Baryshkov wrote: >>> On Sat, May 09, 2026 at 12:30:00AM +0530, Vishnu Reddy wrote: >>>> On platforms with dual vcodec cores, select the hardware core for a >>>> session based on current load. Assign the session to vcodec0 if its >>>> MBPF/MBPS capacity allows it, otherwise assign to vcodec1. Communicate >>>> the selected core to firmware using the new HFI_PROP_CORE_ID property. >>>> >>>> Signed-off-by: Vishnu Reddy >>>> --- >>>> drivers/media/platform/qcom/iris/iris_common.c | 10 +++ >>>> drivers/media/platform/qcom/iris/iris_common.h | 1 + >>>> drivers/media/platform/qcom/iris/iris_core.h | 5 ++ >>>> drivers/media/platform/qcom/iris/iris_hfi_common.h | 1 + >>>> .../platform/qcom/iris/iris_hfi_gen2_command.c | 19 ++++++ >>>> .../platform/qcom/iris/iris_hfi_gen2_defines.h | 1 + >>>> drivers/media/platform/qcom/iris/iris_instance.h | 2 + >>>> .../platform/qcom/iris/iris_platform_common.h | 1 + >>>> drivers/media/platform/qcom/iris/iris_power.c | 11 ++-- >>>> drivers/media/platform/qcom/iris/iris_utils.c | 75 ++++++++++++++++------ >>>> drivers/media/platform/qcom/iris/iris_vb2.c | 4 ++ >>>> drivers/media/platform/qcom/iris/iris_vidc.c | 6 +- >>>> 12 files changed, 113 insertions(+), 23 deletions(-) >>>> >>>> diff --git a/drivers/media/platform/qcom/iris/iris_common.c b/drivers/media/platform/qcom/iris/iris_common.c >>>> index 7f1c7fe144f7..3b3fc482e194 100644 >>>> --- a/drivers/media/platform/qcom/iris/iris_common.c >>>> +++ b/drivers/media/platform/qcom/iris/iris_common.c >>>> @@ -46,6 +46,16 @@ void iris_set_ts_metadata(struct iris_inst *inst, struct vb2_v4l2_buffer *vbuf) >>>> inst->metadata_idx++; >>>> } >>>> >>>> +int iris_set_core_id(struct iris_inst *inst) >>>> +{ >>>> + const struct iris_hfi_command_ops *hfi_ops = inst->core->hfi_ops; >>>> + >>>> + if (!inst->core->iris_platform_data->dual_core) >>>> + return 0; >>>> + >>>> + return hfi_ops->session_set_core_id(inst, inst->core_id); >>>> +} >>>> + >>>> int iris_process_streamon_input(struct iris_inst *inst) >>>> { >>>> const struct iris_hfi_command_ops *hfi_ops = inst->core->hfi_ops; >>>> diff --git a/drivers/media/platform/qcom/iris/iris_common.h b/drivers/media/platform/qcom/iris/iris_common.h >>>> index b2a27b781c9a..34e32c60f768 100644 >>>> --- a/drivers/media/platform/qcom/iris/iris_common.h >>>> +++ b/drivers/media/platform/qcom/iris/iris_common.h >>>> @@ -11,6 +11,7 @@ struct iris_buffer; >>>> >>>> int iris_vb2_buffer_to_driver(struct vb2_buffer *vb2, struct iris_buffer *buf); >>>> void iris_set_ts_metadata(struct iris_inst *inst, struct vb2_v4l2_buffer *vbuf); >>>> +int iris_set_core_id(struct iris_inst *inst); >>>> int iris_process_streamon_input(struct iris_inst *inst); >>>> int iris_process_streamon_output(struct iris_inst *inst); >>>> int iris_session_streamoff(struct iris_inst *inst, u32 plane); >>>> diff --git a/drivers/media/platform/qcom/iris/iris_core.h b/drivers/media/platform/qcom/iris/iris_core.h >>>> index b396c8cf595e..54a8649841e4 100644 >>>> --- a/drivers/media/platform/qcom/iris/iris_core.h >>>> +++ b/drivers/media/platform/qcom/iris/iris_core.h >>>> @@ -30,6 +30,11 @@ enum domain_type { >>>> DECODER = BIT(1), >>>> }; >>>> >>>> +enum iris_vcodec_core_id { >>>> + IRIS_VCODEC0 = 1, >>>> + IRIS_VCODEC1, >>>> +}; >>>> + >>>> /** >>>> * struct iris_core - holds core parameters valid for all instances >>>> * >>>> diff --git a/drivers/media/platform/qcom/iris/iris_hfi_common.h b/drivers/media/platform/qcom/iris/iris_hfi_common.h >>>> index 3edb5ae582b4..fbaf852a6b99 100644 >>>> --- a/drivers/media/platform/qcom/iris/iris_hfi_common.h >>>> +++ b/drivers/media/platform/qcom/iris/iris_hfi_common.h >>>> @@ -124,6 +124,7 @@ struct iris_hfi_command_ops { >>>> int (*session_drain)(struct iris_inst *inst, u32 plane); >>>> int (*session_resume_drain)(struct iris_inst *inst, u32 plane); >>>> int (*session_close)(struct iris_inst *inst); >>>> + int (*session_set_core_id)(struct iris_inst *inst, u32 core_id); >>>> }; >>>> >>>> struct iris_hfi_response_ops { >>>> diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c >>>> index 30bfd90d423b..9d9fae587297 100644 >>>> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c >>>> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_command.c >>>> @@ -1300,6 +1300,24 @@ static int iris_hfi_gen2_session_release_buffer(struct iris_inst *inst, struct i >>>> inst_hfi_gen2->packet->size); >>>> } >>>> >>>> +static int iris_hfi_gen2_set_core_id(struct iris_inst *inst, u32 core_id) >>>> +{ >>>> + struct iris_inst_hfi_gen2 *inst_hfi_gen2 = to_iris_inst_hfi_gen2(inst); >>>> + u32 payload = core_id; >>>> + >>>> + iris_hfi_gen2_packet_session_command(inst, >>>> + HFI_PROP_CORE_ID, >>>> + HFI_HOST_FLAGS_NONE, >>>> + HFI_PORT_NONE, >>>> + inst->session_id, >>>> + HFI_PAYLOAD_U32, >>>> + &payload, >>>> + sizeof(u32)); >>>> + >>>> + return iris_hfi_queue_cmd_write(inst->core, inst_hfi_gen2->packet, >>>> + inst_hfi_gen2->packet->size); >>>> +} >>>> + >>>> static const struct iris_hfi_command_ops iris_hfi_gen2_command_ops = { >>>> .sys_init = iris_hfi_gen2_sys_init, >>>> .sys_image_version = iris_hfi_gen2_sys_image_version, >>>> @@ -1317,6 +1335,7 @@ static const struct iris_hfi_command_ops iris_hfi_gen2_command_ops = { >>>> .session_drain = iris_hfi_gen2_session_drain, >>>> .session_resume_drain = iris_hfi_gen2_session_resume_drain, >>>> .session_close = iris_hfi_gen2_session_close, >>>> + .session_set_core_id = iris_hfi_gen2_set_core_id, >>>> }; >>>> >>>> void iris_hfi_gen2_command_ops_init(struct iris_core *core) >>>> diff --git a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h >>>> index cecf771c55dd..600e9dc07669 100644 >>>> --- a/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h >>>> +++ b/drivers/media/platform/qcom/iris/iris_hfi_gen2_defines.h >>>> @@ -56,6 +56,7 @@ >>>> #define HFI_PROP_BUFFER_HOST_MAX_COUNT 0x03000123 >>>> #define HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT 0x03000124 >>>> #define HFI_PROP_PIC_ORDER_CNT_TYPE 0x03000128 >>>> +#define HFI_PROP_CORE_ID 0x030001a9 >>>> >>>> enum hfi_rate_control { >>>> HFI_RC_VBR_CFR = 0x00000000, >>>> diff --git a/drivers/media/platform/qcom/iris/iris_instance.h b/drivers/media/platform/qcom/iris/iris_instance.h >>>> index 16965150f427..dd341ca5be57 100644 >>>> --- a/drivers/media/platform/qcom/iris/iris_instance.h >>>> +++ b/drivers/media/platform/qcom/iris/iris_instance.h >>>> @@ -37,6 +37,7 @@ struct iris_fmt { >>>> * >>>> * @list: used for attach an instance to the core >>>> * @core: pointer to core structure >>>> + * @core_id: specifies the hardware core on which the session runs >>>> * @session_id: id of current video session >>>> * @ctx_q_lock: lock to serialize queues related ioctls >>>> * @lock: lock to seralise forward and reverse threads >>>> @@ -79,6 +80,7 @@ struct iris_fmt { >>>> struct iris_inst { >>>> struct list_head list; >>>> struct iris_core *core; >>>> + u32 core_id; >>>> u32 session_id; >>>> struct mutex ctx_q_lock;/* lock to serialize queues related ioctls */ >>>> struct mutex lock; /* lock to serialize forward and reverse threads */ >>>> diff --git a/drivers/media/platform/qcom/iris/iris_platform_common.h b/drivers/media/platform/qcom/iris/iris_platform_common.h >>>> index 8995136ad29e..502d7099085c 100644 >>>> --- a/drivers/media/platform/qcom/iris/iris_platform_common.h >>>> +++ b/drivers/media/platform/qcom/iris/iris_platform_common.h >>>> @@ -258,6 +258,7 @@ struct iris_platform_data { >>>> const struct tz_cp_config *tz_cp_config_data; >>>> u32 tz_cp_config_data_size; >>>> u32 core_arch; >>>> + bool dual_core; >>>> u32 hw_response_timeout; >>>> struct ubwc_config_data *ubwc_config; >>>> u32 num_vpp_pipe; >>>> diff --git a/drivers/media/platform/qcom/iris/iris_power.c b/drivers/media/platform/qcom/iris/iris_power.c >>>> index 91aa21d4070e..b72ce5b596b8 100644 >>>> --- a/drivers/media/platform/qcom/iris/iris_power.c >>>> +++ b/drivers/media/platform/qcom/iris/iris_power.c >>>> @@ -77,9 +77,9 @@ static int iris_vote_interconnects(struct iris_inst *inst) >>>> >>>> static int iris_set_clocks(struct iris_inst *inst) >>>> { >>>> + u64 vcodec0_freq = 0, vcodec1_freq = 0; >>>> struct iris_core *core = inst->core; >>>> struct iris_inst *instance; >>>> - u64 freq = 0; >>>> int ret; >>>> >>>> mutex_lock(&core->lock); >>>> @@ -87,11 +87,14 @@ static int iris_set_clocks(struct iris_inst *inst) >>>> if (!instance->max_input_data_size) >>>> continue; >>>> >>>> - freq += instance->power.min_freq; >>>> + if (instance->core_id == IRIS_VCODEC0) >>>> + vcodec0_freq += instance->power.min_freq; >>>> + else >>>> + vcodec1_freq += instance->power.min_freq; >>>> } >>>> >>>> - core->power.clk_freq = freq; >>>> - ret = iris_opp_set_rate(core->dev, freq); >>>> + core->power.clk_freq = max(vcodec0_freq, vcodec1_freq); >>>> + ret = iris_opp_set_rate(core->dev, core->power.clk_freq); >>>> mutex_unlock(&core->lock); >>>> >>>> return ret; >>>> diff --git a/drivers/media/platform/qcom/iris/iris_utils.c b/drivers/media/platform/qcom/iris/iris_utils.c >>>> index cfc5b576ec56..da8a89d3dd41 100644 >>>> --- a/drivers/media/platform/qcom/iris/iris_utils.c >>>> +++ b/drivers/media/platform/qcom/iris/iris_utils.c >>>> @@ -90,40 +90,79 @@ struct iris_inst *iris_get_instance(struct iris_core *core, u32 session_id) >>>> return NULL; >>>> } >>>> >>>> -int iris_check_core_mbpf(struct iris_inst *inst) >>>> +static u32 iris_get_mbps(struct iris_inst *inst) >>>> { >>>> - struct iris_core *core = inst->core; >>>> + u32 fps = max(inst->frame_rate, inst->operating_rate); >>>> + >>>> + return iris_get_mbpf(inst) * fps; >>>> +} >>>> + >>>> +static int iris_check_and_assign_core(struct iris_inst *inst, bool mbpf) >>>> +{ >>>> + const struct iris_platform_data *platform_data = inst->core->iris_platform_data; >>>> + u32 max_load = mbpf ? platform_data->max_core_mbpf : platform_data->max_core_mbps; >>>> + u32 max_session_cnt = platform_data->max_session_count; >>>> + u32 core0_session_cnt = 0, core1_session_cnt = 0; >>>> + bool dual_core = platform_data->dual_core; >>> num_cores >> A num_cores field would require updating all platform data entries. For two > I was thinking about adding num_cores to platform_data and to iris_inst > (or iris_core) and setting it to 1 if the value is unset in > platform_data. > > A better option would be to move all these multi-core functions to a > separate file. Thanks for your point, Adding num_cores to platform_data makes sense if the number of cores grows beyond two. For now, since we only handle single and dual core, the current logic feels simpler and sufficient to cover both cases. Happy to adopt the num_cores approach in the future if we have any platform with more than dual core. >> cores, a simple boolean flag feels sufficient here. >> >>>> + u32 core0_load = 0, core1_load = 0; >>>> + bool select_core0, select_core1; >>>> struct iris_inst *instance; >>>> - u32 total_mbpf = 0; >>>> + u32 load, new_load; >>>> >>>> - mutex_lock(&core->lock); >>>> - list_for_each_entry(instance, &core->instances, list) >>>> - total_mbpf += iris_get_mbpf(instance); >>>> - mutex_unlock(&core->lock); >>>> + inst->core_id = 0; >>>> >>>> - if (total_mbpf > core->iris_platform_data->max_core_mbpf) >>>> + list_for_each_entry(instance, &inst->core->instances, list) { >>>> + load = mbpf ? iris_get_mbpf(instance) : iris_get_mbps(instance); >>>> + >>>> + if (instance->core_id == IRIS_VCODEC0) { >>>> + core0_load += load; >>>> + core0_session_cnt++; >>>> + } else if (instance->core_id == IRIS_VCODEC1) { >>>> + core1_load += load; >>>> + core1_session_cnt++; >>> Arrays, please. >> Since we only have two cores, explicit variables feel cleaner and easier to >> read than arrays. >> >>>> + } >>>> + } >>>> + >>>> + new_load = mbpf ? iris_get_mbpf(inst) : iris_get_mbps(inst); >>>> + >>>> + select_core0 = core0_load + new_load <= max_load && core0_session_cnt < max_session_cnt; >>>> + select_core1 = dual_core && core1_load + new_load <= max_load && >>>> + core1_session_cnt < max_session_cnt; >>>> + >>>> + if (select_core0 && select_core1) >>>> + inst->core_id = (core0_load <= core1_load) ? IRIS_VCODEC0 : IRIS_VCODEC1; >>>> + else if (select_core0) >>>> + inst->core_id = IRIS_VCODEC0; >>>> + else if (select_core1) >>>> + inst->core_id = IRIS_VCODEC1; >>>> + else >>>> return -ENOMEM; >>>> >>>> return 0; >>>> } >>>> >>>> -int iris_check_core_mbps(struct iris_inst *inst) >>>> +int iris_check_core_mbpf(struct iris_inst *inst) >>>> { >>>> struct iris_core *core = inst->core; >>>> - struct iris_inst *instance; >>>> - u32 total_mbps = 0, fps = 0; >>>> + int ret; >>>> >>>> mutex_lock(&core->lock); >>>> - list_for_each_entry(instance, &core->instances, list) { >>>> - fps = max(instance->frame_rate, instance->operating_rate); >>>> - total_mbps += iris_get_mbpf(instance) * fps; >>>> - } >>>> + ret = iris_check_and_assign_core(inst, true); >>>> mutex_unlock(&core->lock); >>>> >>>> - if (total_mbps > core->iris_platform_data->max_core_mbps) >>>> - return -ENOMEM; >>>> + return ret; >>>> +} >>>> >>>> - return 0; >>>> +int iris_check_core_mbps(struct iris_inst *inst) >>>> +{ >>>> + struct iris_core *core = inst->core; >>>> + int ret; >>>> + >>>> + mutex_lock(&core->lock); >>>> + ret = iris_check_and_assign_core(inst, false); >>>> + mutex_unlock(&core->lock); >>>> + >>>> + return ret; >>>> } >>>> >>>> bool is_rotation_90_or_270(struct iris_inst *inst) >>>> diff --git a/drivers/media/platform/qcom/iris/iris_vb2.c b/drivers/media/platform/qcom/iris/iris_vb2.c >>>> index bf0b8400996e..5a05f7d65501 100644 >>>> --- a/drivers/media/platform/qcom/iris/iris_vb2.c >>>> +++ b/drivers/media/platform/qcom/iris/iris_vb2.c >>>> @@ -176,6 +176,10 @@ int iris_vb2_start_streaming(struct vb2_queue *q, unsigned int count) >>>> if (ret) >>>> goto error; >>>> >>>> + ret = iris_set_core_id(inst); >>>> + if (ret) >>>> + goto error; >>>> + >>>> if (V4L2_TYPE_IS_OUTPUT(q->type)) { >>>> if (inst->domain == DECODER) >>>> ret = iris_vdec_streamon_input(inst); >>>> diff --git a/drivers/media/platform/qcom/iris/iris_vidc.c b/drivers/media/platform/qcom/iris/iris_vidc.c >>>> index 5eb1786b0737..a1ce3cd524a3 100644 >>>> --- a/drivers/media/platform/qcom/iris/iris_vidc.c >>>> +++ b/drivers/media/platform/qcom/iris/iris_vidc.c >>>> @@ -41,16 +41,20 @@ static void iris_v4l2_fh_deinit(struct iris_inst *inst, struct file *filp) >>>> >>>> static void iris_add_session(struct iris_inst *inst) >>>> { >>>> + u32 max_session_count = inst->core->iris_platform_data->max_session_count; >>>> struct iris_core *core = inst->core; >>>> struct iris_inst *iter; >>>> u32 count = 0; >>>> >>>> + if (inst->core->iris_platform_data->dual_core) >>>> + max_session_count *= 2; >>> max_session_count *= num_cores. >>> >>>> + >>>> mutex_lock(&core->lock); >>>> >>>> list_for_each_entry(iter, &core->instances, list) >>>> count++; >>>> >>>> - if (count < core->iris_platform_data->max_session_count) >>>> + if (count < max_session_count) >>>> list_add_tail(&inst->list, &core->instances); >>>> >>>> mutex_unlock(&core->lock); >>>> >>>> -- >>>> 2.34.1 >>>>