/* SPDX-License-Identifier: GPL-2.0 */ 
 | 
/* 
 | 
 * Copyright (c) 2016 MediaTek Inc. 
 | 
 * Author: Jungchang Tsao <jungchang.tsao@mediatek.com> 
 | 
 *       Daniel Hsiao <daniel.hsiao@mediatek.com> 
 | 
 *       Tiffany Lin <tiffany.lin@mediatek.com> 
 | 
 */ 
 | 
  
 | 
#ifndef _VENC_IPI_MSG_H_ 
 | 
#define _VENC_IPI_MSG_H_ 
 | 
  
 | 
#define AP_IPIMSG_VENC_BASE 0xC000 
 | 
#define VPU_IPIMSG_VENC_BASE 0xD000 
 | 
  
 | 
/** 
 | 
 * enum venc_ipi_msg_id - message id between AP and VPU 
 | 
 * (ipi stands for inter-processor interrupt) 
 | 
 * @AP_IPIMSG_ENC_XXX:        AP to VPU cmd message id 
 | 
 * @VPU_IPIMSG_ENC_XXX_DONE:    VPU ack AP cmd message id 
 | 
 */ 
 | 
enum venc_ipi_msg_id { 
 | 
    AP_IPIMSG_ENC_INIT = AP_IPIMSG_VENC_BASE, 
 | 
    AP_IPIMSG_ENC_SET_PARAM, 
 | 
    AP_IPIMSG_ENC_ENCODE, 
 | 
    AP_IPIMSG_ENC_DEINIT, 
 | 
  
 | 
    VPU_IPIMSG_ENC_INIT_DONE = VPU_IPIMSG_VENC_BASE, 
 | 
    VPU_IPIMSG_ENC_SET_PARAM_DONE, 
 | 
    VPU_IPIMSG_ENC_ENCODE_DONE, 
 | 
    VPU_IPIMSG_ENC_DEINIT_DONE, 
 | 
}; 
 | 
  
 | 
/** 
 | 
 * struct venc_ap_ipi_msg_init - AP to VPU init cmd structure 
 | 
 * @msg_id:    message id (AP_IPIMSG_XXX_ENC_INIT) 
 | 
 * @reserved:    reserved for future use. vpu is running in 32bit. Without 
 | 
 *        this reserved field, if kernel run in 64bit. this struct size 
 | 
 *        will be different between kernel and vpu 
 | 
 * @venc_inst:    AP encoder instance 
 | 
 *        (struct venc_vp8_inst/venc_h264_inst *) 
 | 
 */ 
 | 
struct venc_ap_ipi_msg_init { 
 | 
    uint32_t msg_id; 
 | 
    uint32_t reserved; 
 | 
    uint64_t venc_inst; 
 | 
}; 
 | 
  
 | 
/** 
 | 
 * struct venc_ap_ipi_msg_set_param - AP to VPU set_param cmd structure 
 | 
 * @msg_id:    message id (AP_IPIMSG_XXX_ENC_SET_PARAM) 
 | 
 * @vpu_inst_addr:    VPU encoder instance addr 
 | 
 *            (struct venc_vp8_vsi/venc_h264_vsi *) 
 | 
 * @param_id:    parameter id (venc_set_param_type) 
 | 
 * @data_item:    number of items in the data array 
 | 
 * @data[8]:    data array to store the set parameters 
 | 
 */ 
 | 
struct venc_ap_ipi_msg_set_param { 
 | 
    uint32_t msg_id; 
 | 
    uint32_t vpu_inst_addr; 
 | 
    uint32_t param_id; 
 | 
    uint32_t data_item; 
 | 
    uint32_t data[8]; 
 | 
}; 
 | 
  
 | 
struct venc_ap_ipi_msg_set_param_ext { 
 | 
    struct venc_ap_ipi_msg_set_param base; 
 | 
    uint32_t data_ext[24]; 
 | 
}; 
 | 
  
 | 
/** 
 | 
 * struct venc_ap_ipi_msg_enc - AP to VPU enc cmd structure 
 | 
 * @msg_id:    message id (AP_IPIMSG_XXX_ENC_ENCODE) 
 | 
 * @vpu_inst_addr:    VPU encoder instance addr 
 | 
 *            (struct venc_vp8_vsi/venc_h264_vsi *) 
 | 
 * @bs_mode:    bitstream mode for h264 
 | 
 *        (H264_BS_MODE_SPS/H264_BS_MODE_PPS/H264_BS_MODE_FRAME) 
 | 
 * @input_addr:    pointer to input image buffer plane 
 | 
 * @bs_addr:    pointer to output bit stream buffer 
 | 
 * @bs_size:    bit stream buffer size 
 | 
 */ 
 | 
struct venc_ap_ipi_msg_enc { 
 | 
    uint32_t msg_id; 
 | 
    uint32_t vpu_inst_addr; 
 | 
    uint32_t bs_mode; 
 | 
    uint32_t input_addr[3]; 
 | 
    uint32_t bs_addr; 
 | 
    uint32_t bs_size; 
 | 
}; 
 | 
  
 | 
/** 
 | 
 * struct venc_ap_ipi_msg_enc_ext - AP to SCP extended enc cmd structure 
 | 
 * 
 | 
 * @base:    base msg structure 
 | 
 * @data_item:    number of items in the data array 
 | 
 * @data[8]:    data array to store the set parameters 
 | 
 */ 
 | 
struct venc_ap_ipi_msg_enc_ext { 
 | 
    struct venc_ap_ipi_msg_enc base; 
 | 
    uint32_t data_item; 
 | 
    uint32_t data[32]; 
 | 
}; 
 | 
  
 | 
/** 
 | 
 * struct venc_ap_ipi_msg_deinit - AP to VPU deinit cmd structure 
 | 
 * @msg_id:    message id (AP_IPIMSG_XXX_ENC_DEINIT) 
 | 
 * @vpu_inst_addr:    VPU encoder instance addr 
 | 
 *            (struct venc_vp8_vsi/venc_h264_vsi *) 
 | 
 */ 
 | 
struct venc_ap_ipi_msg_deinit { 
 | 
    uint32_t msg_id; 
 | 
    uint32_t vpu_inst_addr; 
 | 
}; 
 | 
  
 | 
/** 
 | 
 * enum venc_ipi_msg_status - VPU ack AP cmd status 
 | 
 */ 
 | 
enum venc_ipi_msg_status { 
 | 
    VENC_IPI_MSG_STATUS_OK, 
 | 
    VENC_IPI_MSG_STATUS_FAIL, 
 | 
}; 
 | 
  
 | 
/** 
 | 
 * struct venc_vpu_ipi_msg_common - VPU ack AP cmd common structure 
 | 
 * @msg_id:    message id (VPU_IPIMSG_XXX_DONE) 
 | 
 * @status:    cmd status (venc_ipi_msg_status) 
 | 
 * @venc_inst:    AP encoder instance (struct venc_vp8_inst/venc_h264_inst *) 
 | 
 */ 
 | 
struct venc_vpu_ipi_msg_common { 
 | 
    uint32_t msg_id; 
 | 
    uint32_t status; 
 | 
    uint64_t venc_inst; 
 | 
}; 
 | 
  
 | 
/** 
 | 
 * struct venc_vpu_ipi_msg_init - VPU ack AP init cmd structure 
 | 
 * @msg_id:    message id (VPU_IPIMSG_XXX_ENC_SET_PARAM_DONE) 
 | 
 * @status:    cmd status (venc_ipi_msg_status) 
 | 
 * @venc_inst:    AP encoder instance (struct venc_vp8_inst/venc_h264_inst *) 
 | 
 * @vpu_inst_addr:    VPU encoder instance addr 
 | 
 *            (struct venc_vp8_vsi/venc_h264_vsi *) 
 | 
 * @venc_abi_version:    ABI version of the firmware. Kernel can use it to 
 | 
 *            ensure that it is compatible with the firmware. 
 | 
 *            For MT8173 the value of this field is undefined and 
 | 
 *            should not be used. 
 | 
 */ 
 | 
struct venc_vpu_ipi_msg_init { 
 | 
    uint32_t msg_id; 
 | 
    uint32_t status; 
 | 
    uint64_t venc_inst; 
 | 
    uint32_t vpu_inst_addr; 
 | 
    uint32_t venc_abi_version; 
 | 
}; 
 | 
  
 | 
/** 
 | 
 * struct venc_vpu_ipi_msg_set_param - VPU ack AP set_param cmd structure 
 | 
 * @msg_id:    message id (VPU_IPIMSG_XXX_ENC_SET_PARAM_DONE) 
 | 
 * @status:    cmd status (venc_ipi_msg_status) 
 | 
 * @venc_inst:    AP encoder instance (struct venc_vp8_inst/venc_h264_inst *) 
 | 
 * @param_id:    parameter id (venc_set_param_type) 
 | 
 * @data_item:    number of items in the data array 
 | 
 * @data[6]:    data array to store the return result 
 | 
 */ 
 | 
struct venc_vpu_ipi_msg_set_param { 
 | 
    uint32_t msg_id; 
 | 
    uint32_t status; 
 | 
    uint64_t venc_inst; 
 | 
    uint32_t param_id; 
 | 
    uint32_t data_item; 
 | 
    uint32_t data[6]; 
 | 
}; 
 | 
  
 | 
/** 
 | 
 * enum venc_ipi_msg_enc_state - Type of encode state 
 | 
 * VEN_IPI_MSG_ENC_STATE_FRAME:    one frame being encoded 
 | 
 * VEN_IPI_MSG_ENC_STATE_PART:    bit stream buffer full 
 | 
 * VEN_IPI_MSG_ENC_STATE_SKIP:    encoded skip frame 
 | 
 * VEN_IPI_MSG_ENC_STATE_ERROR:    encounter error 
 | 
 */ 
 | 
enum venc_ipi_msg_enc_state { 
 | 
    VEN_IPI_MSG_ENC_STATE_FRAME, 
 | 
    VEN_IPI_MSG_ENC_STATE_PART, 
 | 
    VEN_IPI_MSG_ENC_STATE_SKIP, 
 | 
    VEN_IPI_MSG_ENC_STATE_ERROR, 
 | 
}; 
 | 
  
 | 
/** 
 | 
 * struct venc_vpu_ipi_msg_enc - VPU ack AP enc cmd structure 
 | 
 * @msg_id:    message id (VPU_IPIMSG_XXX_ENC_ENCODE_DONE) 
 | 
 * @status:    cmd status (venc_ipi_msg_status) 
 | 
 * @venc_inst:    AP encoder instance (struct venc_vp8_inst/venc_h264_inst *) 
 | 
 * @state:    encode state (venc_ipi_msg_enc_state) 
 | 
 * @is_key_frm:    whether the encoded frame is key frame 
 | 
 * @bs_size:    encoded bitstream size 
 | 
 * @reserved:    reserved for future use. vpu is running in 32bit. Without 
 | 
 *        this reserved field, if kernel run in 64bit. this struct size 
 | 
 *        will be different between kernel and vpu 
 | 
 */ 
 | 
struct venc_vpu_ipi_msg_enc { 
 | 
    uint32_t msg_id; 
 | 
    uint32_t status; 
 | 
    uint64_t venc_inst; 
 | 
    uint32_t state; 
 | 
    uint32_t is_key_frm; 
 | 
    uint32_t bs_size; 
 | 
    uint32_t reserved; 
 | 
}; 
 | 
  
 | 
/** 
 | 
 * struct venc_vpu_ipi_msg_deinit - VPU ack AP deinit cmd structure 
 | 
 * @msg_id:   message id (VPU_IPIMSG_XXX_ENC_DEINIT_DONE) 
 | 
 * @status:   cmd status (venc_ipi_msg_status) 
 | 
 * @venc_inst:    AP encoder instance (struct venc_vp8_inst/venc_h264_inst *) 
 | 
 */ 
 | 
struct venc_vpu_ipi_msg_deinit { 
 | 
    uint32_t msg_id; 
 | 
    uint32_t status; 
 | 
    uint64_t venc_inst; 
 | 
}; 
 | 
  
 | 
#endif /* _VENC_IPI_MSG_H_ */ 
 |