From nobody Fri Sep 20 01:19:08 2024 Received: from mailgw02.mediatek.com (unknown [210.61.82.184]) (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 6D4928BE2; Sat, 20 Jul 2024 08:00:48 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=210.61.82.184 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1721462451; cv=none; b=r0V3n6aWEx5Ofob+ju+R05qDK624z2VM6orM5mb0wQcWBKBwm2I3ZA65iIFAZn5c+5or+KAuAr6eGZF3WD+SmY+4NPX3Mq/dPOpfkqAIb0sd33gxntMBXE3smaZGLhZslEZm9AMcb8VxsVsu05xgayAVUhR4EmNNHm1WITjGGPk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1721462451; c=relaxed/simple; bh=pq8xBK0+IqiGOJ3YhCMZptSa3Bj0C0JyHPXwo2Qrwys=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=t8KhypSd4y74+SlsWWnkIYcjZJ6RAz4gO9BslQklAleJUrK9ozmYOa51pYx5Tp70cWWaIb7EbHnZAp+kd8rB52iSls3yeagZJtRTbzUup8zLq+VLZlgZ7sWuxxagXFNUxx4/yANeqzUYMZHc/1yKS2Ee5EtVKqPBft+LYoHZMHM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=mediatek.com; spf=pass smtp.mailfrom=mediatek.com; dkim=pass (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b=q3EmrTkw; arc=none smtp.client-ip=210.61.82.184 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=mediatek.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=mediatek.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="q3EmrTkw" X-UUID: 051999a8466811ef87684b57767b52b1-20240720 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Type:Content-Transfer-Encoding:MIME-Version:References:In-Reply-To:Message-ID:Date:Subject:CC:To:From; bh=My2qHK1LZTlVJLyDFXRnOL28F6fqvoK2IyVdTbSQJKE=; b=q3EmrTkwxU/JcWEA3TbQTY6DTWVg2Y04FLMXThvabJiZgsedBDG39qpgu5cK/qzifm5N0YTuD8IRfGE8KWjHbGr0CxJzFOwEun2P1J5LPZmILnmjdqu6TavEozgII/Txvc3UcWJMKvPqvRiGJJ7dy8ewbeE7GXBjMiNdxk7THiY=; X-CID-CACHE: Type:Local,Time:202407201558+08,HitQuantity:1 X-CID-P-RULE: Release_Ham X-CID-O-INFO: VERSION:1.1.40,REQID:d050331a-3c18-4fe7-8adc-919ecc0810a3,IP:0,U RL:0,TC:0,Content:-5,EDM:-25,RT:0,SF:0,FILE:0,BULK:0,RULE:Release_Ham,ACTI ON:release,TS:-30 X-CID-META: VersionHash:ba885a6,CLOUDID:15798545-a117-4f46-a956-71ffeac67bfa,B ulkID:nil,BulkQuantity:0,Recheck:0,SF:102,TC:nil,Content:0,EDM:1,IP:nil,UR L:0,File:nil,RT:nil,Bulk:nil,QS:nil,BEC:nil,COL:0,OSI:0,OSA:0,AV:0,LES:1,S PR:NO,DKR:0,DKP:0,BRR:0,BRE:0,ARC:0 X-CID-BVR: 0 X-CID-BAS: 0,_,0,_ X-CID-FACTOR: TF_CID_SPAM_SNR X-UUID: 051999a8466811ef87684b57767b52b1-20240720 Received: from mtkmbs14n2.mediatek.inc [(172.21.101.76)] by mailgw02.mediatek.com (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-GCM-SHA384 256/256) with ESMTP id 1241200868; Sat, 20 Jul 2024 15:16:44 +0800 Received: from mtkmbs11n2.mediatek.inc (172.21.101.187) by mtkmbs13n1.mediatek.inc (172.21.101.193) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.1118.26; Sat, 20 Jul 2024 15:16:44 +0800 Received: from mhfsdcap04.gcn.mediatek.inc (10.17.3.154) by mtkmbs11n2.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.2.1118.26 via Frontend Transport; Sat, 20 Jul 2024 15:16:42 +0800 From: Yunfei Dong To: Jeffrey Kardatzke , =?UTF-8?q?N=C3=ADcolas=20F=20=2E=20R=20=2E=20A=20=2E=20Prado?= , Nathan Hebert , Nicolas Dufresne , Hans Verkuil , AngeloGioacchino Del Regno , Benjamin Gaignard , Sebastian Fricke , Tomasz Figa , Mauro Carvalho Chehab , Marek Szyprowski CC: Chen-Yu Tsai , Yong Wu , Hsin-Yi Wang , Fritz Koenig , Daniel Vetter , Steve Cho , Yunfei Dong , Sumit Semwal , Brian Starkey , John Stultz , "T . J . Mercier" , =?UTF-8?q?Christian=20K=C3=B6nig?= , Matthias Brugger , , , , , , Subject: [PATCH v7 24/28] media: mediatek: vcodec: support vp9 svp decoder for mt8188 Date: Sat, 20 Jul 2024 15:16:02 +0800 Message-ID: <20240720071606.27930-25-yunfei.dong@mediatek.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20240720071606.27930-1-yunfei.dong@mediatek.com> References: <20240720071606.27930-1-yunfei.dong@mediatek.com> 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 X-MTK: N Content-Type: text/plain; charset="utf-8" From: Yilong Zhou Change vp9 driver to support secure video playback(svp) for mt8188. Need to map shared memory with optee interface and wait interrupt in optee-os. Signed-off-by: Yilong Zhou Signed-off-by: Yunfei Dong [Yunfei: Fix the checkpatch warning] --- .../vcodec/decoder/vdec/vdec_vp9_req_lat_if.c | 101 +++++++++++------- 1 file changed, 65 insertions(+), 36 deletions(-) diff --git a/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_vp9_r= eq_lat_if.c b/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_vp9_= req_lat_if.c index eea709d93820..a16a6f858e2e 100644 --- a/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_vp9_req_lat_= if.c +++ b/drivers/media/platform/mediatek/vcodec/decoder/vdec/vdec_vp9_req_lat_= if.c @@ -141,6 +141,7 @@ struct vdec_vp9_slice_frame_counts { * @skip: skip counts. * @y_mode: Y prediction mode counts. * @filter: interpolation filter counts. + * @mv_joint: motion vector joint counts. * @sign: motion vector sign counts. * @classes: motion vector class counts. * @class0: motion vector class0 bit counts. @@ -804,6 +805,9 @@ static void vdec_vp9_slice_setup_frame_ctx(struct vdec_= vp9_slice_instance *insta error_resilient_mode =3D HDR_FLAG(ERROR_RESILIENT); reset_frame_context =3D uh->reset_frame_context; =20 + if (instance->ctx->is_secure_playback) + return; + /* * according to "6.2 Uncompressed header syntax" in * "VP9 Bitstream & Decoding Process Specification", @@ -818,8 +822,7 @@ static void vdec_vp9_slice_setup_frame_ctx(struct vdec_= vp9_slice_instance *insta * 2 resets just the context specified in the frame header * 3 resets all contexts */ - if (key_frame || error_resilient_mode || - reset_frame_context =3D=3D 3) { + if (key_frame || error_resilient_mode || reset_frame_context =3D=3D 3) { /* use default table */ for (i =3D 0; i < 4; i++) instance->dirty[i] =3D 0; @@ -1042,6 +1045,9 @@ static void vdec_vp9_slice_setup_seg_buffer(struct vd= ec_vp9_slice_instance *inst { struct vdec_vp9_slice_uncompressed_header *uh; =20 + if (instance->ctx->is_secure_playback) + return; + /* reset segment buffer */ uh =3D &vsi->frame.uh; if (uh->frame_type =3D=3D 0 || @@ -1172,15 +1178,16 @@ static int vdec_vp9_slice_setup_lat(struct vdec_vp9= _slice_instance *instance, =20 vdec_vp9_slice_setup_seg_buffer(instance, vsi, &instance->seg[0]); =20 - /* setup prob/tile buffers for LAT */ - - ret =3D vdec_vp9_slice_setup_prob_buffer(instance, vsi); - if (ret) - goto err; + if (!instance->ctx->is_secure_playback) { + /* setup prob/tile buffers for LAT */ + ret =3D vdec_vp9_slice_setup_prob_buffer(instance, vsi); + if (ret) + goto err; =20 - ret =3D vdec_vp9_slice_setup_tile_buffer(instance, vsi, bs); - if (ret) - goto err; + ret =3D vdec_vp9_slice_setup_tile_buffer(instance, vsi, bs); + if (ret) + goto err; + } =20 return 0; =20 @@ -1599,7 +1606,8 @@ static int vdec_vp9_slice_update_single(struct vdec_v= p9_slice_instance *instance pfc->seq, vsi->state.crc[4], vsi->state.crc[5], vsi->state.crc[6], vsi->state.crc[7]); =20 - vdec_vp9_slice_update_prob(instance, vsi); + if (!instance->ctx->is_secure_playback) + vdec_vp9_slice_update_prob(instance, vsi); =20 instance->width =3D vsi->frame.uh.frame_width; instance->height =3D vsi->frame.uh.frame_height; @@ -1632,7 +1640,8 @@ static int vdec_vp9_slice_update_lat(struct vdec_vp9_= slice_instance *instance, return -EAGAIN; } =20 - vdec_vp9_slice_update_prob(instance, vsi); + if (!instance->ctx->is_secure_playback) + vdec_vp9_slice_update_prob(instance, vsi); =20 instance->width =3D vsi->frame.uh.frame_width; instance->height =3D vsi->frame.uh.frame_height; @@ -1665,7 +1674,6 @@ static int vdec_vp9_slice_setup_core_buffer(struct vd= ec_vp9_slice_instance *inst struct vb2_queue *vq; struct vdec_vp9_slice_reference *ref; int plane; - int size; int w; int h; int i; @@ -1673,12 +1681,14 @@ static int vdec_vp9_slice_setup_core_buffer(struct = vdec_vp9_slice_instance *inst plane =3D instance->ctx->q_data[MTK_Q_DATA_DST].fmt->num_planes; w =3D vsi->frame.uh.frame_width; h =3D vsi->frame.uh.frame_height; - size =3D ALIGN(w, 64) * ALIGN(h, 64); + + vsi->fb.y.size =3D instance->ctx->picinfo.fb_sz[0]; + vsi->fb.c.size =3D instance->ctx->picinfo.fb_sz[1]; =20 /* frame buffer */ vsi->fb.y.dma_addr =3D fb->base_y.dma_addr; if (plane =3D=3D 1) - vsi->fb.c.dma_addr =3D fb->base_y.dma_addr + size; + vsi->fb.c.dma_addr =3D fb->base_y.dma_addr + vsi->fb.y.size; else vsi->fb.c.dma_addr =3D fb->base_c.dma_addr; =20 @@ -1694,8 +1704,15 @@ static int vdec_vp9_slice_setup_core_buffer(struct v= dec_vp9_slice_instance *inst return -EINVAL; =20 /* update internal buffer's width/height */ - instance->dpb[vb->index].width =3D w; - instance->dpb[vb->index].height =3D h; + for (i =3D 0; i < vb2_get_num_buffers(vq); i++) { + struct vb2_buffer *buf =3D vb2_get_buffer(vq, i); + + if (vb =3D=3D buf) { + instance->dpb[i].width =3D w; + instance->dpb[i].height =3D h; + break; + } + } =20 /* * get buffer's width/height from instance @@ -1717,7 +1734,7 @@ static int vdec_vp9_slice_setup_core_buffer(struct vd= ec_vp9_slice_instance *inst vb2_dma_contig_plane_dma_addr(vb, 0); if (plane =3D=3D 1) vsi->ref[i].c.dma_addr =3D - vsi->ref[i].y.dma_addr + size; + vsi->ref[i].y.dma_addr + vsi->fb.y.size; else vsi->ref[i].c.dma_addr =3D vb2_dma_contig_plane_dma_addr(vb, 1); @@ -1779,7 +1796,8 @@ static int vdec_vp9_slice_setup_core(struct vdec_vp9_= slice_instance *instance, if (ret) goto err; =20 - vdec_vp9_slice_setup_seg_buffer(instance, vsi, &instance->seg[1]); + if (!instance->ctx->is_secure_playback) + vdec_vp9_slice_setup_seg_buffer(instance, vsi, &instance->seg[1]); =20 return 0; =20 @@ -1874,19 +1892,30 @@ static int vdec_vp9_slice_init(struct mtk_vcodec_de= c_ctx *ctx) goto error_vsi; } instance->init_vsi =3D vsi; - instance->core_vsi =3D mtk_vcodec_fw_map_dm_addr(ctx->dev->fw_handler, - (u32)vsi->core_vsi); - if (!instance->core_vsi) { - mtk_vdec_err(ctx, "failed to get VP9 core vsi\n"); - ret =3D -EINVAL; - goto error_vsi; - } =20 - instance->irq =3D 1; + if (ctx->is_secure_playback) { + instance->core_vsi =3D mtk_vcodec_dec_get_shm_buffer_va(ctx->dev, MTK_VD= EC_CORE, + OPTEE_DATA_INDEX); + if (!instance->core_vsi) { + mtk_vdec_err(ctx, "failed to get VP9 svp core vsi\n"); + ret =3D -EINVAL; + goto error_vsi; + } + instance->irq =3D 0; + } else { + instance->core_vsi =3D mtk_vcodec_fw_map_dm_addr(ctx->dev->fw_handler, + (u32)vsi->core_vsi); + if (!instance->core_vsi) { + mtk_vdec_err(ctx, "failed to get VP9 normal core vsi\n"); + ret =3D -EINVAL; + goto error_vsi; + } + instance->irq =3D 1; =20 - ret =3D vdec_vp9_slice_init_default_frame_ctx(instance); - if (ret) - goto error_default_frame_ctx; + ret =3D vdec_vp9_slice_init_default_frame_ctx(instance); + if (ret) + goto error_default_frame_ctx; + } =20 ctx->drv_handle =3D instance; =20 @@ -2101,9 +2130,12 @@ static int vdec_vp9_slice_lat_decode(void *h_vdec, s= truct mtk_vcodec_mem *bs, (unsigned long)pfc->vsi.trans.dma_addr, (unsigned long)pfc->vsi.trans.dma_addr_end); =20 - vdec_msg_queue_update_ube_wptr(&ctx->msg_queue, - vsi->trans.dma_addr_end + - ctx->msg_queue.wdma_addr.dma_addr); + if (!instance->ctx->is_secure_playback) { + vsi->trans.dma_addr_end +=3D ctx->msg_queue.wdma_addr.dma_addr; + mtk_vdec_debug(ctx, "core dma_addr_end 0x%lx\n", + (unsigned long)pfc->vsi.trans.dma_addr_end); + } + vdec_msg_queue_update_ube_wptr(&ctx->msg_queue, vsi->trans.dma_addr_end); vdec_msg_queue_qbuf(&ctx->msg_queue.core_ctx, lat_buf); =20 return 0; @@ -2183,9 +2215,6 @@ static int vdec_vp9_slice_core_decode(struct vdec_lat= _buf *lat_buf) goto err; } =20 - pfc->vsi.trans.dma_addr_end +=3D ctx->msg_queue.wdma_addr.dma_addr; - mtk_vdec_debug(ctx, "core dma_addr_end 0x%lx\n", - (unsigned long)pfc->vsi.trans.dma_addr_end); vdec_msg_queue_update_ube_rptr(&ctx->msg_queue, pfc->vsi.trans.dma_addr_e= nd); ctx->dev->vdec_pdata->cap_to_disp(ctx, 0, lat_buf->src_buf_req); =20 --=20 2.18.0