13d0407baSopenharmony_ci/*
23d0407baSopenharmony_ci * Copyright 2020 Rockchip Electronics Co. LTD
33d0407baSopenharmony_ci *
43d0407baSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
53d0407baSopenharmony_ci * you may not use this file except in compliance with the License.
63d0407baSopenharmony_ci * You may obtain a copy of the License at
73d0407baSopenharmony_ci *
83d0407baSopenharmony_ci *      http://www.apache.org/licenses/LICENSE-2.0
93d0407baSopenharmony_ci *
103d0407baSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
113d0407baSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
123d0407baSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133d0407baSopenharmony_ci * See the License for the specific language governing permissions and
143d0407baSopenharmony_ci * limitations under the License.
153d0407baSopenharmony_ci */
163d0407baSopenharmony_ci
173d0407baSopenharmony_ci#ifndef __MPP_DEVICE_H__
183d0407baSopenharmony_ci#define __MPP_DEVICE_H__
193d0407baSopenharmony_ci
203d0407baSopenharmony_ci#include "mpp_err.h"
213d0407baSopenharmony_ci#include "mpp_dev_defs.h"
223d0407baSopenharmony_ci#include "mpp_callback.h"
233d0407baSopenharmony_ci
243d0407baSopenharmony_citypedef enum MppDevIoctlCmd_e {
253d0407baSopenharmony_ci    /* device batch mode config */
263d0407baSopenharmony_ci    MPP_DEV_BATCH_ON,
273d0407baSopenharmony_ci    MPP_DEV_BATCH_OFF,
283d0407baSopenharmony_ci    MPP_DEV_DELIMIT,
293d0407baSopenharmony_ci    MPP_DEV_SET_CB_CTX,
303d0407baSopenharmony_ci
313d0407baSopenharmony_ci    /* hardware operation setup config */
323d0407baSopenharmony_ci    MPP_DEV_REG_WR,
333d0407baSopenharmony_ci    MPP_DEV_REG_RD,
343d0407baSopenharmony_ci    MPP_DEV_REG_OFFSET,
353d0407baSopenharmony_ci    MPP_DEV_REG_OFFS,
363d0407baSopenharmony_ci    MPP_DEV_RCB_INFO,
373d0407baSopenharmony_ci    MPP_DEV_SET_INFO,
383d0407baSopenharmony_ci
393d0407baSopenharmony_ci    MPP_DEV_CMD_SEND,
403d0407baSopenharmony_ci    MPP_DEV_CMD_POLL,
413d0407baSopenharmony_ci
423d0407baSopenharmony_ci    MPP_DEV_IOCTL_CMD_BUTT,
433d0407baSopenharmony_ci} MppDevIoctlCmd;
443d0407baSopenharmony_ci
453d0407baSopenharmony_ci/* for MPP_DEV_REG_WR */
463d0407baSopenharmony_citypedef struct MppDevRegWrCfg_t {
473d0407baSopenharmony_ci    void    *reg;
483d0407baSopenharmony_ci    RK_U32  size;
493d0407baSopenharmony_ci    RK_U32  offset;
503d0407baSopenharmony_ci} MppDevRegWrCfg;
513d0407baSopenharmony_ci
523d0407baSopenharmony_ci/* for MPP_DEV_REG_RD */
533d0407baSopenharmony_citypedef struct MppDevRegRdCfg_t {
543d0407baSopenharmony_ci    void    *reg;
553d0407baSopenharmony_ci    RK_U32  size;
563d0407baSopenharmony_ci    RK_U32  offset;
573d0407baSopenharmony_ci} MppDevRegRdCfg;
583d0407baSopenharmony_ci
593d0407baSopenharmony_ci/* for MPP_DEV_REG_OFFSET */
603d0407baSopenharmony_citypedef struct MppDevRegOffsetCfg_t {
613d0407baSopenharmony_ci    RK_U32  reg_idx;
623d0407baSopenharmony_ci    RK_U32  offset;
633d0407baSopenharmony_ci} MppDevRegOffsetCfg;
643d0407baSopenharmony_ci
653d0407baSopenharmony_ci/* for multi MPP_DEV_REG_OFFSET */
663d0407baSopenharmony_citypedef struct MppDevRegOffsCfg_t {
673d0407baSopenharmony_ci    RK_S32  size;
683d0407baSopenharmony_ci    RK_S32  count;
693d0407baSopenharmony_ci    MppDevRegOffsetCfg cfgs[];
703d0407baSopenharmony_ci} MppDevRegOffCfgs;
713d0407baSopenharmony_ci
723d0407baSopenharmony_ci/* for MPP_DEV_RCB_INFO */
733d0407baSopenharmony_citypedef struct MppDevRcbInfoCfg_t {
743d0407baSopenharmony_ci    RK_U32  reg_idx;
753d0407baSopenharmony_ci    RK_U32  size;
763d0407baSopenharmony_ci} MppDevRcbInfoCfg;
773d0407baSopenharmony_ci
783d0407baSopenharmony_ci/* for MPP_DEV_SET_INFO */
793d0407baSopenharmony_citypedef struct MppDevSetInfoCfg_t {
803d0407baSopenharmony_ci    RK_U32  type;
813d0407baSopenharmony_ci    RK_U32  flag;
823d0407baSopenharmony_ci    RK_U64  data;
833d0407baSopenharmony_ci} MppDevInfoCfg;
843d0407baSopenharmony_ci
853d0407baSopenharmony_citypedef union MppDevPollEncSliceInfo_u {
863d0407baSopenharmony_ci    RK_U32  val;
873d0407baSopenharmony_ci    struct {
883d0407baSopenharmony_ci        RK_U32  length  : 31;
893d0407baSopenharmony_ci        RK_U32  last    : 1;
903d0407baSopenharmony_ci    };
913d0407baSopenharmony_ci} MppDevPollEncSliceInfo;
923d0407baSopenharmony_ci
933d0407baSopenharmony_ci/* for MPP_DEV_POLL */
943d0407baSopenharmony_citypedef struct MppDevPollCfg_t {
953d0407baSopenharmony_ci    RK_S32  poll_type;
963d0407baSopenharmony_ci    RK_S32  poll_ret;
973d0407baSopenharmony_ci    RK_S32  count_max;
983d0407baSopenharmony_ci    RK_S32  count_ret;
993d0407baSopenharmony_ci    MppDevPollEncSliceInfo slice_info[];
1003d0407baSopenharmony_ci} MppDevPollCfg;
1013d0407baSopenharmony_ci
1023d0407baSopenharmony_citypedef struct MppDevApi_t {
1033d0407baSopenharmony_ci    const char  *name;
1043d0407baSopenharmony_ci    RK_U32      ctx_size;
1053d0407baSopenharmony_ci    MPP_RET     (*init)(void *ctx, MppClientType type);
1063d0407baSopenharmony_ci    MPP_RET     (*deinit)(void *ctx);
1073d0407baSopenharmony_ci
1083d0407baSopenharmony_ci    /* bat mode function */
1093d0407baSopenharmony_ci    MPP_RET     (*attach)(void *ctx);
1103d0407baSopenharmony_ci    MPP_RET     (*detach)(void *ctx);
1113d0407baSopenharmony_ci    MPP_RET     (*delimit)(void *ctx);
1123d0407baSopenharmony_ci    MPP_RET     (*set_cb_ctx)(void *ctx, MppCbCtx *cb);
1133d0407baSopenharmony_ci
1143d0407baSopenharmony_ci    /* config the cmd on preparing */
1153d0407baSopenharmony_ci    MPP_RET     (*reg_wr)(void *ctx, MppDevRegWrCfg *cfg);
1163d0407baSopenharmony_ci    MPP_RET     (*reg_rd)(void *ctx, MppDevRegRdCfg *cfg);
1173d0407baSopenharmony_ci    MPP_RET     (*reg_offset)(void *ctx, MppDevRegOffsetCfg *cfg);
1183d0407baSopenharmony_ci    MPP_RET     (*reg_offs)(void *ctx, MppDevRegOffCfgs *cfg);
1193d0407baSopenharmony_ci    MPP_RET     (*rcb_info)(void *ctx, MppDevRcbInfoCfg *cfg);
1203d0407baSopenharmony_ci    MPP_RET     (*set_info)(void *ctx, MppDevInfoCfg *cfg);
1213d0407baSopenharmony_ci
1223d0407baSopenharmony_ci    /* send cmd to hardware */
1233d0407baSopenharmony_ci    MPP_RET     (*cmd_send)(void *ctx);
1243d0407baSopenharmony_ci
1253d0407baSopenharmony_ci    /* poll cmd from hardware */
1263d0407baSopenharmony_ci    MPP_RET     (*cmd_poll)(void *ctx, MppDevPollCfg *cfg);
1273d0407baSopenharmony_ci} MppDevApi;
1283d0407baSopenharmony_ci
1293d0407baSopenharmony_citypedef void* MppDev;
1303d0407baSopenharmony_ci
1313d0407baSopenharmony_ci#ifdef __cplusplus
1323d0407baSopenharmony_ciextern "C" {
1333d0407baSopenharmony_ci#endif
1343d0407baSopenharmony_ci
1353d0407baSopenharmony_ciMPP_RET mpp_dev_init(MppDev *ctx, MppClientType type);
1363d0407baSopenharmony_ciMPP_RET mpp_dev_deinit(MppDev ctx);
1373d0407baSopenharmony_ci
1383d0407baSopenharmony_ciMPP_RET mpp_dev_ioctl(MppDev ctx, RK_S32 cmd, void *param);
1393d0407baSopenharmony_ci
1403d0407baSopenharmony_ci/* special helper function for large address offset config */
1413d0407baSopenharmony_ciMPP_RET mpp_dev_set_reg_offset(MppDev dev, RK_S32 index, RK_U32 offset);
1423d0407baSopenharmony_ci
1433d0407baSopenharmony_ci/* register offset multi config */
1443d0407baSopenharmony_ciMPP_RET mpp_dev_multi_offset_init(MppDevRegOffCfgs **cfgs, RK_S32 size);
1453d0407baSopenharmony_ciMPP_RET mpp_dev_multi_offset_deinit(MppDevRegOffCfgs *cfgs);
1463d0407baSopenharmony_ci
1473d0407baSopenharmony_ciMPP_RET mpp_dev_multi_offset_reset(MppDevRegOffCfgs *cfgs);
1483d0407baSopenharmony_ciMPP_RET mpp_dev_multi_offset_update(MppDevRegOffCfgs *cfgs, RK_S32 index, RK_U32 offset);
1493d0407baSopenharmony_ci
1503d0407baSopenharmony_ci#ifdef __cplusplus
1513d0407baSopenharmony_ci}
1523d0407baSopenharmony_ci#endif
1533d0407baSopenharmony_ci
1543d0407baSopenharmony_ci#endif /* __MPP_DEVICE_H__ */
155