cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

venc_drv_if.c (2196B)


      1// SPDX-License-Identifier: GPL-2.0
      2/*
      3 * Copyright (c) 2016 MediaTek Inc.
      4 * Author: Daniel Hsiao <daniel.hsiao@mediatek.com>
      5 *	Jungchang Tsao <jungchang.tsao@mediatek.com>
      6 *	Tiffany Lin <tiffany.lin@mediatek.com>
      7 */
      8
      9#include <linux/interrupt.h>
     10#include <linux/kernel.h>
     11#include <linux/slab.h>
     12
     13#include "venc_drv_base.h"
     14#include "venc_drv_if.h"
     15
     16#include "mtk_vcodec_enc.h"
     17#include "mtk_vcodec_enc_pm.h"
     18
     19int venc_if_init(struct mtk_vcodec_ctx *ctx, unsigned int fourcc)
     20{
     21	int ret = 0;
     22
     23	switch (fourcc) {
     24	case V4L2_PIX_FMT_VP8:
     25		ctx->enc_if = &venc_vp8_if;
     26		break;
     27	case V4L2_PIX_FMT_H264:
     28		ctx->enc_if = &venc_h264_if;
     29		break;
     30	default:
     31		return -EINVAL;
     32	}
     33
     34	mtk_venc_lock(ctx);
     35	mtk_vcodec_enc_clock_on(&ctx->dev->pm);
     36	ret = ctx->enc_if->init(ctx);
     37	mtk_vcodec_enc_clock_off(&ctx->dev->pm);
     38	mtk_venc_unlock(ctx);
     39
     40	return ret;
     41}
     42
     43int venc_if_set_param(struct mtk_vcodec_ctx *ctx,
     44		enum venc_set_param_type type, struct venc_enc_param *in)
     45{
     46	int ret = 0;
     47
     48	mtk_venc_lock(ctx);
     49	mtk_vcodec_enc_clock_on(&ctx->dev->pm);
     50	ret = ctx->enc_if->set_param(ctx->drv_handle, type, in);
     51	mtk_vcodec_enc_clock_off(&ctx->dev->pm);
     52	mtk_venc_unlock(ctx);
     53
     54	return ret;
     55}
     56
     57int venc_if_encode(struct mtk_vcodec_ctx *ctx,
     58		   enum venc_start_opt opt, struct venc_frm_buf *frm_buf,
     59		   struct mtk_vcodec_mem *bs_buf,
     60		   struct venc_done_result *result)
     61{
     62	int ret = 0;
     63	unsigned long flags;
     64
     65	mtk_venc_lock(ctx);
     66
     67	spin_lock_irqsave(&ctx->dev->irqlock, flags);
     68	ctx->dev->curr_ctx = ctx;
     69	spin_unlock_irqrestore(&ctx->dev->irqlock, flags);
     70
     71	mtk_vcodec_enc_clock_on(&ctx->dev->pm);
     72	ret = ctx->enc_if->encode(ctx->drv_handle, opt, frm_buf,
     73				  bs_buf, result);
     74	mtk_vcodec_enc_clock_off(&ctx->dev->pm);
     75
     76	spin_lock_irqsave(&ctx->dev->irqlock, flags);
     77	ctx->dev->curr_ctx = NULL;
     78	spin_unlock_irqrestore(&ctx->dev->irqlock, flags);
     79
     80	mtk_venc_unlock(ctx);
     81	return ret;
     82}
     83
     84int venc_if_deinit(struct mtk_vcodec_ctx *ctx)
     85{
     86	int ret = 0;
     87
     88	if (!ctx->drv_handle)
     89		return 0;
     90
     91	mtk_venc_lock(ctx);
     92	mtk_vcodec_enc_clock_on(&ctx->dev->pm);
     93	ret = ctx->enc_if->deinit(ctx->drv_handle);
     94	mtk_vcodec_enc_clock_off(&ctx->dev->pm);
     95	mtk_venc_unlock(ctx);
     96
     97	ctx->drv_handle = NULL;
     98
     99	return ret;
    100}