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 20CC2386568 for ; Wed, 13 May 2026 19:23:26 +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=1778700210; cv=none; b=gr2NnLu/0i/8Fd7c0DyytDB1H1GoivICe7TltRNT+Q7MDwVNm9k1ij3UZprJ4GzDtMt3taMOtUN40SXDAzBOsakdyzoqDo0Y/ylGmGWpGNSpnMVdhTn8LA3DuS0T4XdsK8V117pmjrYSPL6oWKl6YKea5xq6/BYGspP8DQASfcM= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1778700210; c=relaxed/simple; bh=pzzhWuZCMRdaooryeMgm8vAFAtutADwyTwYiwruqciw=; h=Message-ID:Date:MIME-Version:Subject:To:Cc:References:From: In-Reply-To:Content-Type; b=A6eeicisJp9LRR27k3uOWs5qaY6obd+3Xk8gE+GveBJ2JiB/DdDjNi+PDaDiCgqMFd+Mta80zDHlByymJbkhQxYaLQFK+4Ozf2XtnHV5YvIrzm4EUDtgPCYILKYkl9IoIy8rS6KTur+yo62GjrZKdQkWxjD+mhItsgZO0nfuVdw= 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=lPzCX65S; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b=OgE6iBYk; 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="lPzCX65S"; dkim=pass (2048-bit key) header.d=oss.qualcomm.com header.i=@oss.qualcomm.com header.b="OgE6iBYk" Received: from pps.filterd (m0279863.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.18.1.11/8.18.1.11) with ESMTP id 64DH0JkU2321422 for ; Wed, 13 May 2026 19:23:26 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= 9W+d1XMEmCq/odsQSepbOYGXHGkxm8V3ZwUbDeKHeEk=; b=lPzCX65STI1eFrcb bvIwHK7ntKoDXYaiyplUbM4+7qLw00wLAGB+R1O7+Sys74B18FVeXFEuGTn/kar7 H90L+usBzgS7qXlWPbuSq9J0zuGVSeSeisRI126f6bI8i4u/4MXOHFVku+JcCOKd 66se1nOb+fg9k3KdSvz1rHQqDKNdRGzD9vVB5WKcG4I1mCSGWkmonD5+qYuYGb+M rQjYzQa3EXnVAEenDGpeo8kIg5aScTH2zl5jt1+0mhWgFwSAP+xZbF2sLed8FaJh IQ1TmM2hQYFsiQNPoXEkUUKMXi8iEI647REuBKq07p/doBQTmf8Bz0ygsTfBpbIm f+6icg== Received: from mail-pf1-f198.google.com (mail-pf1-f198.google.com [209.85.210.198]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 4e4hgubphv-1 (version=TLSv1.3 cipher=TLS_AES_128_GCM_SHA256 bits=128 verify=NOT) for ; Wed, 13 May 2026 19:23:26 +0000 (GMT) Received: by mail-pf1-f198.google.com with SMTP id d2e1a72fcca58-8354503d9acso8953340b3a.1 for ; Wed, 13 May 2026 12:23:26 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=oss.qualcomm.com; s=google; t=1778700206; x=1779305006; darn=vger.kernel.org; h=content-transfer-encoding:in-reply-to:from:references:cc:to :content-language:subject:user-agent:mime-version:date:message-id :from:to:cc:subject:date:message-id:reply-to; bh=9W+d1XMEmCq/odsQSepbOYGXHGkxm8V3ZwUbDeKHeEk=; b=OgE6iBYkRakP07ZHfy9s6aQPjHzjHoR96pyGf6D5WXvRRMAiTnB0uS6764q19L01hE h4J8+izwwzNarUldIRfvAzqga1weTQjtHMbPTEp9OeLugYfIG96oFNJIfr6ORrKoeXEg wJZclfuQ1RVu+lMuOMYwvtdNLqixCCCa1aZX4DFlputpYZaLQ8KzkvF3MOTj/Nqr0ovj mMxpDWnXi+wqht22ztUyNaU4/heYmNhXU/kyqk+NzhoD2afc0avOIdeXj6b0v9obf5ZM jVVqHw8fwThHTDTUY2YtycSCOucrZKlilBA0bFsMdrw0hPc6Cpr3zwcRD/ioP4TdJNtH u49A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1778700206; x=1779305006; h=content-transfer-encoding:in-reply-to:from:references:cc:to :content-language: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=9W+d1XMEmCq/odsQSepbOYGXHGkxm8V3ZwUbDeKHeEk=; b=Y8VMLvr3W2HixmPaXhKU0+drxK7KaNhdQGG096FCQ804EFeF969uWhT6kLFqUOQvGY 4ml2UQtcujkRcLSF9PQdGcLqKr4bEj0U1LtvrUbC+f2+fbOpz4i3uMEAvVtUci9AYjP5 3hwLebNhEPAmftDpGtVRx44VrimoHjioWgbGsc6HBQxrwQUluxdJTtKMBGdPzNKNQXgk Mze+FtXQZ/QgU28CBqoaBNOp27DP+Jrbcqzu29pF5gNYk8a5S3CQhDRddsgEnq47WBYM DAl2o97iOf95QUhCZDhuui8aK5zP/qzk3tqGUSV2sYgNIN8VhMFAB+GzGa55KcQGMVAW OWFw== X-Forwarded-Encrypted: i=1; AFNElJ/UoABvcbCPDAsIEZip3o73rk2gqbP4Rmykt1eRiSVLJJ7elrHNUIKv0F0lN2BjFHynofoY5+19o+K9@vger.kernel.org X-Gm-Message-State: AOJu0YyMbOi9Yv6ZJSRs/fCBxQohjmAsZgtvoqSdTxkAaocIJL5vJ9L5 btGHutZm86p4EYpR1Zg+3PVIIWZK0W8QviMw959zEL+2hYACwXLcvtD94h8HbyjDT4zeFychjPB XzLFZkHgphdsiUAGyd744hmasiME6FKuoRpMIIOEZi2Ia1fqk07d6YHVSJNpfF3YU X-Gm-Gg: Acq92OFoI5HoF+xMtbAyoroEdvTkNDHo6CroejGEOlL/yW0ojkCb90018HPhtfW0KVa 5rg/P1MI9T0cvQ0EHrFdvzebnc4SmrJ84VRypMY/bTtl8QH5V5DMCXPGsi+GOpDaackoyM0cN0s kYZzycF0kuEGuQ1g+Uxza8nitE3AVwg8yNoDamLJ+Zu+OTnrkmTYrPIFzvGiY+cvBCMUQzYms1x bWv9e208aYqwZDQdOdpcWaRhWnWPHtG1Vzg/IYq3w/Vdx1vS1XMXTgkDY03JJekYyOZHsrHfJkI jsEfgpnR950tghJ1Lh4mNk0uopMPCQH9VUNyTxsOEKmYx8VqXKeE4j64VTJGgZdR5gsYut9Gjdp qwqW/SvZSRD7PZjPl41w9KawpYagDUECQnXpbn7BmjwMLDVNIhSWueqmo5HBtkiY= X-Received: by 2002:a05:6a00:32c4:b0:835:424f:6a83 with SMTP id d2e1a72fcca58-83f042b916emr4914572b3a.41.1778700205550; Wed, 13 May 2026 12:23:25 -0700 (PDT) X-Received: by 2002:a05:6a00:32c4:b0:835:424f:6a83 with SMTP id d2e1a72fcca58-83f042b916emr4914525b3a.41.1778700204914; Wed, 13 May 2026 12:23:24 -0700 (PDT) Received: from [192.168.0.17] ([49.205.251.25]) by smtp.gmail.com with ESMTPSA id d2e1a72fcca58-83f19c7809esm314509b3a.44.2026.05.13.12.23.16 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Wed, 13 May 2026 12:23:24 -0700 (PDT) Message-ID: Date: Thu, 14 May 2026 00:53:14 +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 Subject: Re: [PATCH v5 11/14] media: iris: Add support to select core for dual core platforms Content-Language: en-US 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> From: Vishnu Reddy In-Reply-To: Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 7bit X-Authority-Analysis: v=2.4 cv=X4di7mTe c=1 sm=1 tr=0 ts=6a04cfae cx=c_pps a=m5Vt/hrsBiPMCU0y4gIsQw==:117 a=UdqKVphAFhxg2bWZaUV5ew==:17 a=IkcTkHD0fZMA:10 a=NGcC8JguVDcA:10 a=s4-Qcg_JpJYA:10 a=VkNPw1HP01LnGYTKEx00:22 a=u7WPNUs3qKkmUXheDGA7:22 a=yOCtJkima9RkubShWh1s:22 a=EUspDBNiAAAA:8 a=ajyc9N5q4Y8mAeJsAi0A:9 a=QEXdDO2ut3YA:10 a=IoOABgeZipijB_acs4fv:22 X-Proofpoint-GUID: m8o4Ds7wuH3OnPKwuQgXQ2JXbmkFBxQR X-Proofpoint-ORIG-GUID: m8o4Ds7wuH3OnPKwuQgXQ2JXbmkFBxQR X-Proofpoint-Spam-Details-Enc: AW1haW4tMjYwNTEzMDE5MSBTYWx0ZWRfX6QHKnxw/e6jg x7d7M8d5Fj55svEv8ysrAU1uLAvcKu4u/+N/gmm/yjSMYx8cG+Ql5tsrgJtek+Oi+R8NDmeX2Hi QK0/HCgT1CQa++qHHyi4Qe+k3UZbkC7Cz1bqs5hcQgFMewrRykfvWM5GbLyYPP3CkV/6IOyPeC8 jo6iGjE2kfjLcOcMvRzYvVISwaGB5+RuCMt/m/NrdpV3U3t7qxWBA56LkorDhMXtzqo+dZpKdlb Ba87iLpq35F+sq7R5JDXhoP17aI45RGhVKH6PSN+Jo3fH63tavkeWh9lsdLGkfTKAEC6f+BJ334 ziC0e0wfc1Vlcpf8rtbd8gYbdGW+qGp4E2jXw56DkLEaQuf3A/5i1bGiOwdsUKLMLPcv0ebi9t8 0NBjSiCSU2SND/ERb/53/5joW1EVcjPBDOHL91cRUTy9Db/RXWpSc+fF8qV+47C91tvYXE+9MN3 Co90eqySB+EH+8bNMpw== 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 impostorscore=0 priorityscore=1501 lowpriorityscore=0 adultscore=0 phishscore=0 malwarescore=0 suspectscore=0 spamscore=0 clxscore=1015 bulkscore=0 classifier=typeunknown authscore=0 authtc= authcc= route=outbound adjust=0 reason=mlx scancount=1 engine=8.22.0-2605050000 definitions=main-2605130191 On 5/14/2026 12:40 AM, Dmitry Baryshkov wrote: > On Thu, May 14, 2026 at 12:25:58AM +0530, Vishnu Reddy wrote: >> 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. > Again, an alternative approach is to get all the platform specifics into > the corresponding iris_vpuXX.c file. Are you suggesting moving this function to the corresponding iris_vpuXX.c file and hooking it into the platform-specific ops? >>>> 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 >>>>>>