Add support for decoder firmware version 2, which makes the kernel
responsible for managing the VSI context and is used for stateless
codecs.

Signed-off-by: Alexandre Courbot <acour...@chromium.org>
---
 .../media/platform/mtk-vcodec/vdec_ipi_msg.h  | 18 +++++++++---
 .../media/platform/mtk-vcodec/vdec_vpu_if.c   | 28 +++++++++++++++----
 .../media/platform/mtk-vcodec/vdec_vpu_if.h   |  5 ++++
 3 files changed, 42 insertions(+), 9 deletions(-)

diff --git a/drivers/media/platform/mtk-vcodec/vdec_ipi_msg.h 
b/drivers/media/platform/mtk-vcodec/vdec_ipi_msg.h
index eb66729fda63..a0e773ae3ab3 100644
--- a/drivers/media/platform/mtk-vcodec/vdec_ipi_msg.h
+++ b/drivers/media/platform/mtk-vcodec/vdec_ipi_msg.h
@@ -29,11 +29,15 @@ enum vdec_ipi_msgid {
 /**
  * struct vdec_ap_ipi_cmd - generic AP to VPU ipi command format
  * @msg_id     : vdec_ipi_msgid
- * @vpu_inst_addr      : VPU decoder instance address
+ * @vpu_inst_addr : VPU decoder instance address. Used if ABI version < 2.
+ * @inst_id     : instance ID. Used if the ABI version >= 2.
  */
 struct vdec_ap_ipi_cmd {
        uint32_t msg_id;
-       uint32_t vpu_inst_addr;
+       union {
+               uint32_t vpu_inst_addr;
+               uint32_t inst_id;
+       };
 };
 
 /**
@@ -63,7 +67,8 @@ struct vdec_ap_ipi_init {
 /**
  * struct vdec_ap_ipi_dec_start - for AP_IPIMSG_DEC_START
  * @msg_id     : AP_IPIMSG_DEC_START
- * @vpu_inst_addr      : VPU decoder instance address
+ * @vpu_inst_addr : VPU decoder instance address. Used if ABI version < 2.
+ * @inst_id     : instance ID. Used if the ABI version >= 2.
  * @data       : Header info
  *     H264 decoder [0]:buf_sz [1]:nal_start
  *     VP8 decoder  [0]:width/height
@@ -72,7 +77,10 @@ struct vdec_ap_ipi_init {
  */
 struct vdec_ap_ipi_dec_start {
        uint32_t msg_id;
-       uint32_t vpu_inst_addr;
+       union {
+               uint32_t vpu_inst_addr;
+               uint32_t inst_id;
+       };
        uint32_t data[3];
        uint32_t reserved;
 };
@@ -87,6 +95,7 @@ struct vdec_ap_ipi_dec_start {
  *                     ensure that it is compatible with the firmware.
  *                     This field is not valid for MT8173 and must not be
  *                     accessed for this chip.
+ * @inst_id     : instance ID. Valid only if the ABI version >= 2.
  */
 struct vdec_vpu_ipi_init_ack {
        uint32_t msg_id;
@@ -94,6 +103,7 @@ struct vdec_vpu_ipi_init_ack {
        uint64_t ap_inst_addr;
        uint32_t vpu_inst_addr;
        uint32_t vdec_abi_version;
+       uint32_t inst_id;
 };
 
 #endif
diff --git a/drivers/media/platform/mtk-vcodec/vdec_vpu_if.c 
b/drivers/media/platform/mtk-vcodec/vdec_vpu_if.c
index 203089213e67..5dffc459a33d 100644
--- a/drivers/media/platform/mtk-vcodec/vdec_vpu_if.c
+++ b/drivers/media/platform/mtk-vcodec/vdec_vpu_if.c
@@ -25,18 +25,30 @@ static void handle_init_ack_msg(const struct 
vdec_vpu_ipi_init_ack *msg)
 
        mtk_vcodec_debug(vpu, "- vpu_inst_addr = 0x%x", vpu->inst_addr);
 
+       /* Set default ABI version if dealing with unversioned firmware. */
+       vpu->fw_abi_version = 0;
+       /*
+        * Instance ID is only used if ABI version >= 2. Initialize it with
+        * garbage by default.
+        */
+       vpu->inst_id = 0xdeadbeef;
+
        /* Firmware version field does not exist on MT8173. */
        if (vpu->ctx->dev->vdec_pdata->chip == MTK_MT8173)
                return;
 
        /* Check firmware version. */
-       mtk_vcodec_debug(vpu, "firmware version 0x%x\n", msg->vdec_abi_version);
-       switch (msg->vdec_abi_version) {
+       vpu->fw_abi_version = msg->vdec_abi_version;
+       mtk_vcodec_debug(vpu, "firmware version 0x%x\n", vpu->fw_abi_version);
+       switch (vpu->fw_abi_version) {
        case 1:
                break;
+       case 2:
+               vpu->inst_id = msg->inst_id;
+               break;
        default:
                mtk_vcodec_err(vpu, "unhandled firmware version 0x%x\n",
-                              msg->vdec_abi_version);
+                              vpu->fw_abi_version);
                vpu->failure = 1;
                break;
        }
@@ -113,7 +125,10 @@ static int vcodec_send_ap_ipi(struct vdec_vpu_inst *vpu, 
unsigned int msg_id)
 
        memset(&msg, 0, sizeof(msg));
        msg.msg_id = msg_id;
-       msg.vpu_inst_addr = vpu->inst_addr;
+       if (vpu->fw_abi_version < 2)
+               msg.vpu_inst_addr = vpu->inst_addr;
+       else
+               msg.inst_id = vpu->inst_id;
 
        err = vcodec_vpu_send_msg(vpu, &msg, sizeof(msg));
        mtk_vcodec_debug(vpu, "- id=%X ret=%d", msg_id, err);
@@ -163,7 +178,10 @@ int vpu_dec_start(struct vdec_vpu_inst *vpu, uint32_t 
*data, unsigned int len)
 
        memset(&msg, 0, sizeof(msg));
        msg.msg_id = AP_IPIMSG_DEC_START;
-       msg.vpu_inst_addr = vpu->inst_addr;
+       if (vpu->fw_abi_version < 2)
+               msg.vpu_inst_addr = vpu->inst_addr;
+       else
+               msg.inst_id = vpu->inst_id;
 
        for (i = 0; i < len; i++)
                msg.data[i] = data[i];
diff --git a/drivers/media/platform/mtk-vcodec/vdec_vpu_if.h 
b/drivers/media/platform/mtk-vcodec/vdec_vpu_if.h
index 85224eb7e34b..c2ed5b6cab8b 100644
--- a/drivers/media/platform/mtk-vcodec/vdec_vpu_if.h
+++ b/drivers/media/platform/mtk-vcodec/vdec_vpu_if.h
@@ -18,6 +18,9 @@ struct mtk_vcodec_ctx;
  *                for control and info share
  * @failure     : VPU execution result status, 0: success, others: fail
  * @inst_addr  : VPU decoder instance address
+ * @fw_abi_version : ABI version of the firmware.
+ * @inst_id    : if fw_abi_version >= 2, contains the instance ID to be given
+ *                in place of inst_addr in messages.
  * @signaled    : 1 - Host has received ack message from VPU, 0 - not received
  * @ctx         : context for v4l2 layer integration
  * @dev                : platform device of VPU
@@ -29,6 +32,8 @@ struct vdec_vpu_inst {
        void *vsi;
        int32_t failure;
        uint32_t inst_addr;
+       uint32_t fw_abi_version;
+       uint32_t inst_id;
        unsigned int signaled;
        struct mtk_vcodec_ctx *ctx;
        wait_queue_head_t wq;
-- 
2.27.0.212.ge8ba1cc988-goog

Reply via email to