root/drivers/media/platform/qcom/venus/hfi.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


   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 
  21 struct 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 
  31 struct 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 
  46 union 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 */
  58 struct 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 
  92 struct venus_core;
  93 struct venus_inst;
  94 
  95 struct hfi_core_ops {
  96         void (*event_notify)(struct venus_core *core, u32 event);
  97 };
  98 
  99 struct 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 };
 106 
 107 struct hfi_ops {
 108         int (*core_init)(struct venus_core *core);
 109         int (*core_deinit)(struct venus_core *core);
 110         int (*core_ping)(struct venus_core *core, u32 cookie);
 111         int (*core_trigger_ssr)(struct venus_core *core, u32 trigger_type);
 112 
 113         int (*session_init)(struct venus_inst *inst, u32 session_type,
 114                             u32 codec);
 115         int (*session_end)(struct venus_inst *inst);
 116         int (*session_abort)(struct venus_inst *inst);
 117         int (*session_flush)(struct venus_inst *inst, u32 flush_mode);
 118         int (*session_start)(struct venus_inst *inst);
 119         int (*session_stop)(struct venus_inst *inst);
 120         int (*session_continue)(struct venus_inst *inst);
 121         int (*session_etb)(struct venus_inst *inst, struct hfi_frame_data *fd);
 122         int (*session_ftb)(struct venus_inst *inst, struct hfi_frame_data *fd);
 123         int (*session_set_buffers)(struct venus_inst *inst,
 124                                    struct hfi_buffer_desc *bd);
 125         int (*session_unset_buffers)(struct venus_inst *inst,
 126                                      struct hfi_buffer_desc *bd);
 127         int (*session_load_res)(struct venus_inst *inst);
 128         int (*session_release_res)(struct venus_inst *inst);
 129         int (*session_parse_seq_hdr)(struct venus_inst *inst, u32 seq_hdr,
 130                                      u32 seq_hdr_len);
 131         int (*session_get_seq_hdr)(struct venus_inst *inst, u32 seq_hdr,
 132                                    u32 seq_hdr_len);
 133         int (*session_set_property)(struct venus_inst *inst, u32 ptype,
 134                                     void *pdata);
 135         int (*session_get_property)(struct venus_inst *inst, u32 ptype);
 136 
 137         int (*resume)(struct venus_core *core);
 138         int (*suspend)(struct venus_core *core);
 139 
 140         /* interrupt operations */
 141         irqreturn_t (*isr)(struct venus_core *core);
 142         irqreturn_t (*isr_thread)(struct venus_core *core);
 143 };
 144 
 145 int hfi_create(struct venus_core *core, const struct hfi_core_ops *ops);
 146 void hfi_destroy(struct venus_core *core);
 147 
 148 int hfi_core_init(struct venus_core *core);
 149 int hfi_core_deinit(struct venus_core *core, bool blocking);
 150 int hfi_core_suspend(struct venus_core *core);
 151 int hfi_core_resume(struct venus_core *core, bool force);
 152 int hfi_core_trigger_ssr(struct venus_core *core, u32 type);
 153 int hfi_core_ping(struct venus_core *core);
 154 int hfi_session_create(struct venus_inst *inst, const struct hfi_inst_ops *ops);
 155 void hfi_session_destroy(struct venus_inst *inst);
 156 int hfi_session_init(struct venus_inst *inst, u32 pixfmt);
 157 int hfi_session_deinit(struct venus_inst *inst);
 158 int hfi_session_start(struct venus_inst *inst);
 159 int hfi_session_stop(struct venus_inst *inst);
 160 int hfi_session_continue(struct venus_inst *inst);
 161 int hfi_session_abort(struct venus_inst *inst);
 162 int hfi_session_load_res(struct venus_inst *inst);
 163 int hfi_session_unload_res(struct venus_inst *inst);
 164 int hfi_session_flush(struct venus_inst *inst, u32 type);
 165 int hfi_session_set_buffers(struct venus_inst *inst,
 166                             struct hfi_buffer_desc *bd);
 167 int hfi_session_unset_buffers(struct venus_inst *inst,
 168                               struct hfi_buffer_desc *bd);
 169 int hfi_session_get_property(struct venus_inst *inst, u32 ptype,
 170                              union hfi_get_property *hprop);
 171 int hfi_session_set_property(struct venus_inst *inst, u32 ptype, void *pdata);
 172 int hfi_session_process_buf(struct venus_inst *inst, struct hfi_frame_data *f);
 173 irqreturn_t hfi_isr_thread(int irq, void *dev_id);
 174 irqreturn_t hfi_isr(int irq, void *dev);
 175 
 176 #endif

/* [<][>][^][v][top][bottom][index][help] */