1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved. 4*4882a593Smuzhiyun * Copyright (C) 2017 Linaro Ltd. 5*4882a593Smuzhiyun */ 6*4882a593Smuzhiyun #ifndef __HFI_H__ 7*4882a593Smuzhiyun #define __HFI_H__ 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #include <linux/interrupt.h> 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #include "hfi_helper.h" 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #define VIDC_SESSION_TYPE_VPE 0 14*4882a593Smuzhiyun #define VIDC_SESSION_TYPE_ENC 1 15*4882a593Smuzhiyun #define VIDC_SESSION_TYPE_DEC 2 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun #define VIDC_RESOURCE_NONE 0 18*4882a593Smuzhiyun #define VIDC_RESOURCE_OCMEM 1 19*4882a593Smuzhiyun #define VIDC_RESOURCE_VMEM 2 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun struct hfi_buffer_desc { 22*4882a593Smuzhiyun u32 buffer_type; 23*4882a593Smuzhiyun u32 buffer_size; 24*4882a593Smuzhiyun u32 num_buffers; 25*4882a593Smuzhiyun u32 device_addr; 26*4882a593Smuzhiyun u32 extradata_addr; 27*4882a593Smuzhiyun u32 extradata_size; 28*4882a593Smuzhiyun u32 response_required; 29*4882a593Smuzhiyun }; 30*4882a593Smuzhiyun 31*4882a593Smuzhiyun struct hfi_frame_data { 32*4882a593Smuzhiyun u32 buffer_type; 33*4882a593Smuzhiyun u32 device_addr; 34*4882a593Smuzhiyun u32 extradata_addr; 35*4882a593Smuzhiyun u64 timestamp; 36*4882a593Smuzhiyun u32 flags; 37*4882a593Smuzhiyun u32 offset; 38*4882a593Smuzhiyun u32 alloc_len; 39*4882a593Smuzhiyun u32 filled_len; 40*4882a593Smuzhiyun u32 mark_target; 41*4882a593Smuzhiyun u32 mark_data; 42*4882a593Smuzhiyun u32 clnt_data; 43*4882a593Smuzhiyun u32 extradata_size; 44*4882a593Smuzhiyun }; 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun union hfi_get_property { 47*4882a593Smuzhiyun struct hfi_profile_level profile_level; 48*4882a593Smuzhiyun struct hfi_buffer_requirements bufreq[HFI_BUFFER_TYPE_MAX]; 49*4882a593Smuzhiyun }; 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun /* HFI events */ 52*4882a593Smuzhiyun #define EVT_SYS_EVENT_CHANGE 1 53*4882a593Smuzhiyun #define EVT_SYS_WATCHDOG_TIMEOUT 2 54*4882a593Smuzhiyun #define EVT_SYS_ERROR 3 55*4882a593Smuzhiyun #define EVT_SESSION_ERROR 4 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun /* HFI event callback structure */ 58*4882a593Smuzhiyun struct hfi_event_data { 59*4882a593Smuzhiyun u32 error; 60*4882a593Smuzhiyun u32 height; 61*4882a593Smuzhiyun u32 width; 62*4882a593Smuzhiyun u32 event_type; 63*4882a593Smuzhiyun u32 packet_buffer; 64*4882a593Smuzhiyun u32 extradata_buffer; 65*4882a593Smuzhiyun u32 tag; 66*4882a593Smuzhiyun u32 profile; 67*4882a593Smuzhiyun u32 level; 68*4882a593Smuzhiyun /* the following properties start appear from v4 onwards */ 69*4882a593Smuzhiyun u32 bit_depth; 70*4882a593Smuzhiyun u32 pic_struct; 71*4882a593Smuzhiyun u32 colour_space; 72*4882a593Smuzhiyun u32 entropy_mode; 73*4882a593Smuzhiyun u32 buf_count; 74*4882a593Smuzhiyun struct { 75*4882a593Smuzhiyun u32 left, top; 76*4882a593Smuzhiyun u32 width, height; 77*4882a593Smuzhiyun } input_crop; 78*4882a593Smuzhiyun }; 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun /* define core states */ 81*4882a593Smuzhiyun #define CORE_UNINIT 0 82*4882a593Smuzhiyun #define CORE_INIT 1 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun /* define instance states */ 85*4882a593Smuzhiyun #define INST_UNINIT 2 86*4882a593Smuzhiyun #define INST_INIT 3 87*4882a593Smuzhiyun #define INST_LOAD_RESOURCES 4 88*4882a593Smuzhiyun #define INST_START 5 89*4882a593Smuzhiyun #define INST_STOP 6 90*4882a593Smuzhiyun #define INST_RELEASE_RESOURCES 7 91*4882a593Smuzhiyun 92*4882a593Smuzhiyun struct venus_core; 93*4882a593Smuzhiyun struct venus_inst; 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun struct hfi_core_ops { 96*4882a593Smuzhiyun void (*event_notify)(struct venus_core *core, u32 event); 97*4882a593Smuzhiyun }; 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun struct hfi_inst_ops { 100*4882a593Smuzhiyun void (*buf_done)(struct venus_inst *inst, unsigned int buf_type, 101*4882a593Smuzhiyun u32 tag, u32 bytesused, u32 data_offset, u32 flags, 102*4882a593Smuzhiyun u32 hfi_flags, u64 timestamp_us); 103*4882a593Smuzhiyun void (*event_notify)(struct venus_inst *inst, u32 event, 104*4882a593Smuzhiyun struct hfi_event_data *data); 105*4882a593Smuzhiyun void (*flush_done)(struct venus_inst *inst); 106*4882a593Smuzhiyun }; 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun struct hfi_ops { 109*4882a593Smuzhiyun int (*core_init)(struct venus_core *core); 110*4882a593Smuzhiyun int (*core_deinit)(struct venus_core *core); 111*4882a593Smuzhiyun int (*core_ping)(struct venus_core *core, u32 cookie); 112*4882a593Smuzhiyun int (*core_trigger_ssr)(struct venus_core *core, u32 trigger_type); 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun int (*session_init)(struct venus_inst *inst, u32 session_type, 115*4882a593Smuzhiyun u32 codec); 116*4882a593Smuzhiyun int (*session_end)(struct venus_inst *inst); 117*4882a593Smuzhiyun int (*session_abort)(struct venus_inst *inst); 118*4882a593Smuzhiyun int (*session_flush)(struct venus_inst *inst, u32 flush_mode); 119*4882a593Smuzhiyun int (*session_start)(struct venus_inst *inst); 120*4882a593Smuzhiyun int (*session_stop)(struct venus_inst *inst); 121*4882a593Smuzhiyun int (*session_continue)(struct venus_inst *inst); 122*4882a593Smuzhiyun int (*session_etb)(struct venus_inst *inst, struct hfi_frame_data *fd); 123*4882a593Smuzhiyun int (*session_ftb)(struct venus_inst *inst, struct hfi_frame_data *fd); 124*4882a593Smuzhiyun int (*session_set_buffers)(struct venus_inst *inst, 125*4882a593Smuzhiyun struct hfi_buffer_desc *bd); 126*4882a593Smuzhiyun int (*session_unset_buffers)(struct venus_inst *inst, 127*4882a593Smuzhiyun struct hfi_buffer_desc *bd); 128*4882a593Smuzhiyun int (*session_load_res)(struct venus_inst *inst); 129*4882a593Smuzhiyun int (*session_release_res)(struct venus_inst *inst); 130*4882a593Smuzhiyun int (*session_parse_seq_hdr)(struct venus_inst *inst, u32 seq_hdr, 131*4882a593Smuzhiyun u32 seq_hdr_len); 132*4882a593Smuzhiyun int (*session_get_seq_hdr)(struct venus_inst *inst, u32 seq_hdr, 133*4882a593Smuzhiyun u32 seq_hdr_len); 134*4882a593Smuzhiyun int (*session_set_property)(struct venus_inst *inst, u32 ptype, 135*4882a593Smuzhiyun void *pdata); 136*4882a593Smuzhiyun int (*session_get_property)(struct venus_inst *inst, u32 ptype); 137*4882a593Smuzhiyun 138*4882a593Smuzhiyun int (*resume)(struct venus_core *core); 139*4882a593Smuzhiyun int (*suspend)(struct venus_core *core); 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun /* interrupt operations */ 142*4882a593Smuzhiyun irqreturn_t (*isr)(struct venus_core *core); 143*4882a593Smuzhiyun irqreturn_t (*isr_thread)(struct venus_core *core); 144*4882a593Smuzhiyun }; 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun int hfi_create(struct venus_core *core, const struct hfi_core_ops *ops); 147*4882a593Smuzhiyun void hfi_destroy(struct venus_core *core); 148*4882a593Smuzhiyun void hfi_reinit(struct venus_core *core); 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun int hfi_core_init(struct venus_core *core); 151*4882a593Smuzhiyun int hfi_core_deinit(struct venus_core *core, bool blocking); 152*4882a593Smuzhiyun int hfi_core_suspend(struct venus_core *core); 153*4882a593Smuzhiyun int hfi_core_resume(struct venus_core *core, bool force); 154*4882a593Smuzhiyun int hfi_core_trigger_ssr(struct venus_core *core, u32 type); 155*4882a593Smuzhiyun int hfi_core_ping(struct venus_core *core); 156*4882a593Smuzhiyun int hfi_session_create(struct venus_inst *inst, const struct hfi_inst_ops *ops); 157*4882a593Smuzhiyun void hfi_session_destroy(struct venus_inst *inst); 158*4882a593Smuzhiyun int hfi_session_init(struct venus_inst *inst, u32 pixfmt); 159*4882a593Smuzhiyun int hfi_session_deinit(struct venus_inst *inst); 160*4882a593Smuzhiyun int hfi_session_start(struct venus_inst *inst); 161*4882a593Smuzhiyun int hfi_session_stop(struct venus_inst *inst); 162*4882a593Smuzhiyun int hfi_session_continue(struct venus_inst *inst); 163*4882a593Smuzhiyun int hfi_session_abort(struct venus_inst *inst); 164*4882a593Smuzhiyun int hfi_session_load_res(struct venus_inst *inst); 165*4882a593Smuzhiyun int hfi_session_unload_res(struct venus_inst *inst); 166*4882a593Smuzhiyun int hfi_session_flush(struct venus_inst *inst, u32 type, bool block); 167*4882a593Smuzhiyun int hfi_session_set_buffers(struct venus_inst *inst, 168*4882a593Smuzhiyun struct hfi_buffer_desc *bd); 169*4882a593Smuzhiyun int hfi_session_unset_buffers(struct venus_inst *inst, 170*4882a593Smuzhiyun struct hfi_buffer_desc *bd); 171*4882a593Smuzhiyun int hfi_session_get_property(struct venus_inst *inst, u32 ptype, 172*4882a593Smuzhiyun union hfi_get_property *hprop); 173*4882a593Smuzhiyun int hfi_session_set_property(struct venus_inst *inst, u32 ptype, void *pdata); 174*4882a593Smuzhiyun int hfi_session_process_buf(struct venus_inst *inst, struct hfi_frame_data *f); 175*4882a593Smuzhiyun irqreturn_t hfi_isr_thread(int irq, void *dev_id); 176*4882a593Smuzhiyun irqreturn_t hfi_isr(int irq, void *dev); 177*4882a593Smuzhiyun 178*4882a593Smuzhiyun #endif 179