drivers/media/platform/mediatek/vcodec/encoder/venc_vpu_if.c

Source file repositories/reference/linux-study-clean/drivers/media/platform/mediatek/vcodec/encoder/venc_vpu_if.c

File Facts

System
Linux kernel
Corpus path
drivers/media/platform/mediatek/vcodec/encoder/venc_vpu_if.c
Extension
.c
Size
9910 bytes
Lines
378
Domain
Driver Families
Bucket
drivers/media
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

if (!IS_ERR_OR_NULL(ctx) && ctx->vpu_inst == vpu) {
			ret = true;
			break;
		}
	}
	spin_unlock_irqrestore(&enc_dev->dev_ctx_lock, flags);

	return ret;
}

static void vpu_enc_ipi_handler(void *data, unsigned int len, void *priv)
{
	struct mtk_vcodec_enc_dev *enc_dev;
	const struct venc_vpu_ipi_msg_common *msg = data;
	struct venc_vpu_inst *vpu;

	enc_dev = (struct mtk_vcodec_enc_dev *)priv;
	vpu = (struct venc_vpu_inst *)(unsigned long)msg->venc_inst;
	if (!priv || !vpu) {
		pr_err(MTK_DBG_V4L2_STR "venc_inst is NULL, did the SCP hang or crash?");
		return;
	}

	mtk_venc_debug(vpu->ctx, "msg_id %x inst %p status %d", msg->msg_id, vpu, msg->status);
	if (!vpu_enc_check_ap_inst(enc_dev, vpu) || msg->msg_id < VPU_IPIMSG_ENC_INIT_DONE ||
	    msg->msg_id > VPU_IPIMSG_ENC_DEINIT_DONE) {
		mtk_v4l2_venc_err(vpu->ctx, "venc msg id not correctly => 0x%x", msg->msg_id);
		vpu->failure = -EINVAL;
		goto error;
	}

	vpu->failure = (msg->status != VENC_IPI_MSG_STATUS_OK);
	if (vpu->failure) {
		mtk_venc_err(vpu->ctx, "vpu enc status failure %d", vpu->failure);
		goto error;
	}

	switch (msg->msg_id) {
	case VPU_IPIMSG_ENC_INIT_DONE:
		handle_enc_init_msg(vpu, data);
		break;
	case VPU_IPIMSG_ENC_SET_PARAM_DONE:
		break;
	case VPU_IPIMSG_ENC_ENCODE_DONE:
		handle_enc_encode_msg(vpu, data);
		break;
	case VPU_IPIMSG_ENC_DEINIT_DONE:
		break;
	default:
		mtk_venc_err(vpu->ctx, "unknown msg id %x", msg->msg_id);
		break;
	}

error:
	vpu->signaled = 1;
}

static int vpu_enc_send_msg(struct venc_vpu_inst *vpu, void *msg,
			    int len)
{
	int status;

	if (!vpu->ctx->dev->fw_handler) {
		mtk_venc_err(vpu->ctx, "inst dev is NULL");
		return -EINVAL;
	}

	status = mtk_vcodec_fw_ipi_send(vpu->ctx->dev->fw_handler, vpu->id, msg,
					len, 2000);
	if (status) {
		mtk_venc_err(vpu->ctx, "vpu_ipi_send msg_id %x len %d fail %d",
			     *(uint32_t *)msg, len, status);
		return -EINVAL;
	}
	if (vpu->failure)
		return -EINVAL;

	return 0;
}

int vpu_enc_init(struct venc_vpu_inst *vpu)
{
	int status;
	struct venc_ap_ipi_msg_init out = { };

	init_waitqueue_head(&vpu->wq_hd);
	vpu->signaled = 0;
	vpu->failure = 0;
	vpu->ctx->vpu_inst = vpu;

Annotation

Implementation Notes