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