1*e7b8153eSMauro Carvalho Chehab /* SPDX-License-Identifier: GPL-2.0 */ 2*e7b8153eSMauro Carvalho Chehab /* 3*e7b8153eSMauro Carvalho Chehab * Copyright (C) STMicroelectronics SA 2015 4*e7b8153eSMauro Carvalho Chehab * Authors: Yannick Fertre <yannick.fertre@st.com> 5*e7b8153eSMauro Carvalho Chehab * Hugues Fruchet <hugues.fruchet@st.com> 6*e7b8153eSMauro Carvalho Chehab */ 7*e7b8153eSMauro Carvalho Chehab 8*e7b8153eSMauro Carvalho Chehab #ifndef HVA_H 9*e7b8153eSMauro Carvalho Chehab #define HVA_H 10*e7b8153eSMauro Carvalho Chehab 11*e7b8153eSMauro Carvalho Chehab #include <media/v4l2-ctrls.h> 12*e7b8153eSMauro Carvalho Chehab #include <media/v4l2-device.h> 13*e7b8153eSMauro Carvalho Chehab #include <media/videobuf2-v4l2.h> 14*e7b8153eSMauro Carvalho Chehab #include <media/v4l2-mem2mem.h> 15*e7b8153eSMauro Carvalho Chehab 16*e7b8153eSMauro Carvalho Chehab #define fh_to_ctx(f) (container_of(f, struct hva_ctx, fh)) 17*e7b8153eSMauro Carvalho Chehab 18*e7b8153eSMauro Carvalho Chehab #define hva_to_dev(h) (h->dev) 19*e7b8153eSMauro Carvalho Chehab 20*e7b8153eSMauro Carvalho Chehab #define ctx_to_dev(c) (c->hva_dev->dev) 21*e7b8153eSMauro Carvalho Chehab 22*e7b8153eSMauro Carvalho Chehab #define ctx_to_hdev(c) (c->hva_dev) 23*e7b8153eSMauro Carvalho Chehab 24*e7b8153eSMauro Carvalho Chehab #define HVA_NAME "st-hva" 25*e7b8153eSMauro Carvalho Chehab #define HVA_PREFIX "[---:----]" 26*e7b8153eSMauro Carvalho Chehab 27*e7b8153eSMauro Carvalho Chehab extern const struct hva_enc nv12h264enc; 28*e7b8153eSMauro Carvalho Chehab extern const struct hva_enc nv21h264enc; 29*e7b8153eSMauro Carvalho Chehab 30*e7b8153eSMauro Carvalho Chehab /** 31*e7b8153eSMauro Carvalho Chehab * struct hva_frameinfo - information about hva frame 32*e7b8153eSMauro Carvalho Chehab * 33*e7b8153eSMauro Carvalho Chehab * @pixelformat: fourcc code for uncompressed video format 34*e7b8153eSMauro Carvalho Chehab * @width: width of frame 35*e7b8153eSMauro Carvalho Chehab * @height: height of frame 36*e7b8153eSMauro Carvalho Chehab * @aligned_width: width of frame (with encoder alignment constraint) 37*e7b8153eSMauro Carvalho Chehab * @aligned_height: height of frame (with encoder alignment constraint) 38*e7b8153eSMauro Carvalho Chehab * @size: maximum size in bytes required for data 39*e7b8153eSMauro Carvalho Chehab */ 40*e7b8153eSMauro Carvalho Chehab struct hva_frameinfo { 41*e7b8153eSMauro Carvalho Chehab u32 pixelformat; 42*e7b8153eSMauro Carvalho Chehab u32 width; 43*e7b8153eSMauro Carvalho Chehab u32 height; 44*e7b8153eSMauro Carvalho Chehab u32 aligned_width; 45*e7b8153eSMauro Carvalho Chehab u32 aligned_height; 46*e7b8153eSMauro Carvalho Chehab u32 size; 47*e7b8153eSMauro Carvalho Chehab }; 48*e7b8153eSMauro Carvalho Chehab 49*e7b8153eSMauro Carvalho Chehab /** 50*e7b8153eSMauro Carvalho Chehab * struct hva_streaminfo - information about hva stream 51*e7b8153eSMauro Carvalho Chehab * 52*e7b8153eSMauro Carvalho Chehab * @streamformat: fourcc code of compressed video format (H.264...) 53*e7b8153eSMauro Carvalho Chehab * @width: width of stream 54*e7b8153eSMauro Carvalho Chehab * @height: height of stream 55*e7b8153eSMauro Carvalho Chehab * @profile: profile string 56*e7b8153eSMauro Carvalho Chehab * @level: level string 57*e7b8153eSMauro Carvalho Chehab */ 58*e7b8153eSMauro Carvalho Chehab struct hva_streaminfo { 59*e7b8153eSMauro Carvalho Chehab u32 streamformat; 60*e7b8153eSMauro Carvalho Chehab u32 width; 61*e7b8153eSMauro Carvalho Chehab u32 height; 62*e7b8153eSMauro Carvalho Chehab u8 profile[32]; 63*e7b8153eSMauro Carvalho Chehab u8 level[32]; 64*e7b8153eSMauro Carvalho Chehab }; 65*e7b8153eSMauro Carvalho Chehab 66*e7b8153eSMauro Carvalho Chehab /** 67*e7b8153eSMauro Carvalho Chehab * struct hva_controls - hva controls set 68*e7b8153eSMauro Carvalho Chehab * 69*e7b8153eSMauro Carvalho Chehab * @time_per_frame: time per frame in seconds 70*e7b8153eSMauro Carvalho Chehab * @bitrate_mode: bitrate mode (constant bitrate or variable bitrate) 71*e7b8153eSMauro Carvalho Chehab * @gop_size: groupe of picture size 72*e7b8153eSMauro Carvalho Chehab * @bitrate: bitrate (in bps) 73*e7b8153eSMauro Carvalho Chehab * @aspect: video aspect 74*e7b8153eSMauro Carvalho Chehab * @profile: H.264 profile 75*e7b8153eSMauro Carvalho Chehab * @level: H.264 level 76*e7b8153eSMauro Carvalho Chehab * @entropy_mode: H.264 entropy mode (CABAC or CVLC) 77*e7b8153eSMauro Carvalho Chehab * @cpb_size: coded picture buffer size (in kB) 78*e7b8153eSMauro Carvalho Chehab * @dct8x8: transform mode 8x8 enable 79*e7b8153eSMauro Carvalho Chehab * @qpmin: minimum quantizer 80*e7b8153eSMauro Carvalho Chehab * @qpmax: maximum quantizer 81*e7b8153eSMauro Carvalho Chehab * @vui_sar: pixel aspect ratio enable 82*e7b8153eSMauro Carvalho Chehab * @vui_sar_idc: pixel aspect ratio identifier 83*e7b8153eSMauro Carvalho Chehab * @sei_fp: sei frame packing arrangement enable 84*e7b8153eSMauro Carvalho Chehab * @sei_fp_type: sei frame packing arrangement type 85*e7b8153eSMauro Carvalho Chehab */ 86*e7b8153eSMauro Carvalho Chehab struct hva_controls { 87*e7b8153eSMauro Carvalho Chehab struct v4l2_fract time_per_frame; 88*e7b8153eSMauro Carvalho Chehab enum v4l2_mpeg_video_bitrate_mode bitrate_mode; 89*e7b8153eSMauro Carvalho Chehab u32 gop_size; 90*e7b8153eSMauro Carvalho Chehab u32 bitrate; 91*e7b8153eSMauro Carvalho Chehab enum v4l2_mpeg_video_aspect aspect; 92*e7b8153eSMauro Carvalho Chehab enum v4l2_mpeg_video_h264_profile profile; 93*e7b8153eSMauro Carvalho Chehab enum v4l2_mpeg_video_h264_level level; 94*e7b8153eSMauro Carvalho Chehab enum v4l2_mpeg_video_h264_entropy_mode entropy_mode; 95*e7b8153eSMauro Carvalho Chehab u32 cpb_size; 96*e7b8153eSMauro Carvalho Chehab bool dct8x8; 97*e7b8153eSMauro Carvalho Chehab u32 qpmin; 98*e7b8153eSMauro Carvalho Chehab u32 qpmax; 99*e7b8153eSMauro Carvalho Chehab bool vui_sar; 100*e7b8153eSMauro Carvalho Chehab enum v4l2_mpeg_video_h264_vui_sar_idc vui_sar_idc; 101*e7b8153eSMauro Carvalho Chehab bool sei_fp; 102*e7b8153eSMauro Carvalho Chehab enum v4l2_mpeg_video_h264_sei_fp_arrangement_type sei_fp_type; 103*e7b8153eSMauro Carvalho Chehab }; 104*e7b8153eSMauro Carvalho Chehab 105*e7b8153eSMauro Carvalho Chehab /** 106*e7b8153eSMauro Carvalho Chehab * struct hva_frame - hva frame buffer (output) 107*e7b8153eSMauro Carvalho Chehab * 108*e7b8153eSMauro Carvalho Chehab * @vbuf: video buffer information for V4L2 109*e7b8153eSMauro Carvalho Chehab * @list: V4L2 m2m list that the frame belongs to 110*e7b8153eSMauro Carvalho Chehab * @info: frame information (width, height, format, alignment...) 111*e7b8153eSMauro Carvalho Chehab * @paddr: physical address (for hardware) 112*e7b8153eSMauro Carvalho Chehab * @vaddr: virtual address (kernel can read/write) 113*e7b8153eSMauro Carvalho Chehab * @prepared: true if vaddr/paddr are resolved 114*e7b8153eSMauro Carvalho Chehab */ 115*e7b8153eSMauro Carvalho Chehab struct hva_frame { 116*e7b8153eSMauro Carvalho Chehab struct vb2_v4l2_buffer vbuf; 117*e7b8153eSMauro Carvalho Chehab struct list_head list; 118*e7b8153eSMauro Carvalho Chehab struct hva_frameinfo info; 119*e7b8153eSMauro Carvalho Chehab dma_addr_t paddr; 120*e7b8153eSMauro Carvalho Chehab void *vaddr; 121*e7b8153eSMauro Carvalho Chehab bool prepared; 122*e7b8153eSMauro Carvalho Chehab }; 123*e7b8153eSMauro Carvalho Chehab 124*e7b8153eSMauro Carvalho Chehab /* 125*e7b8153eSMauro Carvalho Chehab * to_hva_frame() - cast struct vb2_v4l2_buffer * to struct hva_frame * 126*e7b8153eSMauro Carvalho Chehab */ 127*e7b8153eSMauro Carvalho Chehab #define to_hva_frame(vb) \ 128*e7b8153eSMauro Carvalho Chehab container_of(vb, struct hva_frame, vbuf) 129*e7b8153eSMauro Carvalho Chehab 130*e7b8153eSMauro Carvalho Chehab /** 131*e7b8153eSMauro Carvalho Chehab * struct hva_stream - hva stream buffer (capture) 132*e7b8153eSMauro Carvalho Chehab * 133*e7b8153eSMauro Carvalho Chehab * @vbuf: video buffer information for V4L2 134*e7b8153eSMauro Carvalho Chehab * @list: V4L2 m2m list that the frame belongs to 135*e7b8153eSMauro Carvalho Chehab * @paddr: physical address (for hardware) 136*e7b8153eSMauro Carvalho Chehab * @vaddr: virtual address (kernel can read/write) 137*e7b8153eSMauro Carvalho Chehab * @prepared: true if vaddr/paddr are resolved 138*e7b8153eSMauro Carvalho Chehab * @size: size of the buffer in bytes 139*e7b8153eSMauro Carvalho Chehab * @bytesused: number of bytes occupied by data in the buffer 140*e7b8153eSMauro Carvalho Chehab */ 141*e7b8153eSMauro Carvalho Chehab struct hva_stream { 142*e7b8153eSMauro Carvalho Chehab struct vb2_v4l2_buffer vbuf; 143*e7b8153eSMauro Carvalho Chehab struct list_head list; 144*e7b8153eSMauro Carvalho Chehab dma_addr_t paddr; 145*e7b8153eSMauro Carvalho Chehab void *vaddr; 146*e7b8153eSMauro Carvalho Chehab bool prepared; 147*e7b8153eSMauro Carvalho Chehab unsigned int size; 148*e7b8153eSMauro Carvalho Chehab unsigned int bytesused; 149*e7b8153eSMauro Carvalho Chehab }; 150*e7b8153eSMauro Carvalho Chehab 151*e7b8153eSMauro Carvalho Chehab /* 152*e7b8153eSMauro Carvalho Chehab * to_hva_stream() - cast struct vb2_v4l2_buffer * to struct hva_stream * 153*e7b8153eSMauro Carvalho Chehab */ 154*e7b8153eSMauro Carvalho Chehab #define to_hva_stream(vb) \ 155*e7b8153eSMauro Carvalho Chehab container_of(vb, struct hva_stream, vbuf) 156*e7b8153eSMauro Carvalho Chehab 157*e7b8153eSMauro Carvalho Chehab #ifdef CONFIG_VIDEO_STI_HVA_DEBUGFS 158*e7b8153eSMauro Carvalho Chehab /** 159*e7b8153eSMauro Carvalho Chehab * struct hva_ctx_dbg - instance context debug info 160*e7b8153eSMauro Carvalho Chehab * 161*e7b8153eSMauro Carvalho Chehab * @debugfs_entry: debugfs entry 162*e7b8153eSMauro Carvalho Chehab * @is_valid_period: true if the sequence is valid for performance 163*e7b8153eSMauro Carvalho Chehab * @begin: start time of last HW task 164*e7b8153eSMauro Carvalho Chehab * @total_duration: total HW processing durations in 0.1ms 165*e7b8153eSMauro Carvalho Chehab * @cnt_duration: number of HW processings 166*e7b8153eSMauro Carvalho Chehab * @min_duration: minimum HW processing duration in 0.1ms 167*e7b8153eSMauro Carvalho Chehab * @max_duration: maximum HW processing duration in 0.1ms 168*e7b8153eSMauro Carvalho Chehab * @avg_duration: average HW processing duration in 0.1ms 169*e7b8153eSMauro Carvalho Chehab * @max_fps: maximum frames encoded per second (in 0.1Hz) 170*e7b8153eSMauro Carvalho Chehab * @total_period: total encoding periods in 0.1ms 171*e7b8153eSMauro Carvalho Chehab * @cnt_period: number of periods 172*e7b8153eSMauro Carvalho Chehab * @min_period: minimum encoding period in 0.1ms 173*e7b8153eSMauro Carvalho Chehab * @max_period: maximum encoding period in 0.1ms 174*e7b8153eSMauro Carvalho Chehab * @avg_period: average encoding period in 0.1ms 175*e7b8153eSMauro Carvalho Chehab * @total_stream_size: total number of encoded bytes 176*e7b8153eSMauro Carvalho Chehab * @avg_fps: average frames encoded per second (in 0.1Hz) 177*e7b8153eSMauro Carvalho Chehab * @window_duration: duration of the sampling window in 0.1ms 178*e7b8153eSMauro Carvalho Chehab * @cnt_window: number of samples in the window 179*e7b8153eSMauro Carvalho Chehab * @window_stream_size: number of encoded bytes upon the sampling window 180*e7b8153eSMauro Carvalho Chehab * @last_bitrate: bitrate upon the last sampling window 181*e7b8153eSMauro Carvalho Chehab * @min_bitrate: minimum bitrate in kbps 182*e7b8153eSMauro Carvalho Chehab * @max_bitrate: maximum bitrate in kbps 183*e7b8153eSMauro Carvalho Chehab * @avg_bitrate: average bitrate in kbps 184*e7b8153eSMauro Carvalho Chehab */ 185*e7b8153eSMauro Carvalho Chehab struct hva_ctx_dbg { 186*e7b8153eSMauro Carvalho Chehab struct dentry *debugfs_entry; 187*e7b8153eSMauro Carvalho Chehab bool is_valid_period; 188*e7b8153eSMauro Carvalho Chehab ktime_t begin; 189*e7b8153eSMauro Carvalho Chehab u32 total_duration; 190*e7b8153eSMauro Carvalho Chehab u32 cnt_duration; 191*e7b8153eSMauro Carvalho Chehab u32 min_duration; 192*e7b8153eSMauro Carvalho Chehab u32 max_duration; 193*e7b8153eSMauro Carvalho Chehab u32 avg_duration; 194*e7b8153eSMauro Carvalho Chehab u32 max_fps; 195*e7b8153eSMauro Carvalho Chehab u32 total_period; 196*e7b8153eSMauro Carvalho Chehab u32 cnt_period; 197*e7b8153eSMauro Carvalho Chehab u32 min_period; 198*e7b8153eSMauro Carvalho Chehab u32 max_period; 199*e7b8153eSMauro Carvalho Chehab u32 avg_period; 200*e7b8153eSMauro Carvalho Chehab u32 total_stream_size; 201*e7b8153eSMauro Carvalho Chehab u32 avg_fps; 202*e7b8153eSMauro Carvalho Chehab u32 window_duration; 203*e7b8153eSMauro Carvalho Chehab u32 cnt_window; 204*e7b8153eSMauro Carvalho Chehab u32 window_stream_size; 205*e7b8153eSMauro Carvalho Chehab u32 last_bitrate; 206*e7b8153eSMauro Carvalho Chehab u32 min_bitrate; 207*e7b8153eSMauro Carvalho Chehab u32 max_bitrate; 208*e7b8153eSMauro Carvalho Chehab u32 avg_bitrate; 209*e7b8153eSMauro Carvalho Chehab }; 210*e7b8153eSMauro Carvalho Chehab #endif 211*e7b8153eSMauro Carvalho Chehab 212*e7b8153eSMauro Carvalho Chehab struct hva_dev; 213*e7b8153eSMauro Carvalho Chehab struct hva_enc; 214*e7b8153eSMauro Carvalho Chehab 215*e7b8153eSMauro Carvalho Chehab /** 216*e7b8153eSMauro Carvalho Chehab * struct hva_ctx - context of hva instance 217*e7b8153eSMauro Carvalho Chehab * 218*e7b8153eSMauro Carvalho Chehab * @hva_dev: the device that this instance is associated with 219*e7b8153eSMauro Carvalho Chehab * @fh: V4L2 file handle 220*e7b8153eSMauro Carvalho Chehab * @ctrl_handler: V4L2 controls handler 221*e7b8153eSMauro Carvalho Chehab * @ctrls: hva controls set 222*e7b8153eSMauro Carvalho Chehab * @id: instance identifier 223*e7b8153eSMauro Carvalho Chehab * @aborting: true if current job aborted 224*e7b8153eSMauro Carvalho Chehab * @name: instance name (debug purpose) 225*e7b8153eSMauro Carvalho Chehab * @run_work: encode work 226*e7b8153eSMauro Carvalho Chehab * @lock: mutex used to lock access of this context 227*e7b8153eSMauro Carvalho Chehab * @flags: validity of streaminfo and frameinfo fields 228*e7b8153eSMauro Carvalho Chehab * @frame_num: frame number 229*e7b8153eSMauro Carvalho Chehab * @stream_num: stream number 230*e7b8153eSMauro Carvalho Chehab * @max_stream_size: maximum size in bytes required for stream data 231*e7b8153eSMauro Carvalho Chehab * @colorspace: colorspace identifier 232*e7b8153eSMauro Carvalho Chehab * @xfer_func: transfer function identifier 233*e7b8153eSMauro Carvalho Chehab * @ycbcr_enc: Y'CbCr encoding identifier 234*e7b8153eSMauro Carvalho Chehab * @quantization: quantization identifier 235*e7b8153eSMauro Carvalho Chehab * @streaminfo: stream properties 236*e7b8153eSMauro Carvalho Chehab * @frameinfo: frame properties 237*e7b8153eSMauro Carvalho Chehab * @enc: current encoder 238*e7b8153eSMauro Carvalho Chehab * @priv: private codec data for this instance, allocated 239*e7b8153eSMauro Carvalho Chehab * by encoder @open time 240*e7b8153eSMauro Carvalho Chehab * @hw_err: true if hardware error detected 241*e7b8153eSMauro Carvalho Chehab * @encoded_frames: number of encoded frames 242*e7b8153eSMauro Carvalho Chehab * @sys_errors: number of system errors (memory, resource, pm...) 243*e7b8153eSMauro Carvalho Chehab * @encode_errors: number of encoding errors (hw/driver errors) 244*e7b8153eSMauro Carvalho Chehab * @frame_errors: number of frame errors (format, size, header...) 245*e7b8153eSMauro Carvalho Chehab * @dbg: context debug info 246*e7b8153eSMauro Carvalho Chehab */ 247*e7b8153eSMauro Carvalho Chehab struct hva_ctx { 248*e7b8153eSMauro Carvalho Chehab struct hva_dev *hva_dev; 249*e7b8153eSMauro Carvalho Chehab struct v4l2_fh fh; 250*e7b8153eSMauro Carvalho Chehab struct v4l2_ctrl_handler ctrl_handler; 251*e7b8153eSMauro Carvalho Chehab struct hva_controls ctrls; 252*e7b8153eSMauro Carvalho Chehab u8 id; 253*e7b8153eSMauro Carvalho Chehab bool aborting; 254*e7b8153eSMauro Carvalho Chehab char name[100]; 255*e7b8153eSMauro Carvalho Chehab struct work_struct run_work; 256*e7b8153eSMauro Carvalho Chehab /* mutex protecting this data structure */ 257*e7b8153eSMauro Carvalho Chehab struct mutex lock; 258*e7b8153eSMauro Carvalho Chehab u32 flags; 259*e7b8153eSMauro Carvalho Chehab u32 frame_num; 260*e7b8153eSMauro Carvalho Chehab u32 stream_num; 261*e7b8153eSMauro Carvalho Chehab u32 max_stream_size; 262*e7b8153eSMauro Carvalho Chehab enum v4l2_colorspace colorspace; 263*e7b8153eSMauro Carvalho Chehab enum v4l2_xfer_func xfer_func; 264*e7b8153eSMauro Carvalho Chehab enum v4l2_ycbcr_encoding ycbcr_enc; 265*e7b8153eSMauro Carvalho Chehab enum v4l2_quantization quantization; 266*e7b8153eSMauro Carvalho Chehab struct hva_streaminfo streaminfo; 267*e7b8153eSMauro Carvalho Chehab struct hva_frameinfo frameinfo; 268*e7b8153eSMauro Carvalho Chehab struct hva_enc *enc; 269*e7b8153eSMauro Carvalho Chehab void *priv; 270*e7b8153eSMauro Carvalho Chehab bool hw_err; 271*e7b8153eSMauro Carvalho Chehab u32 encoded_frames; 272*e7b8153eSMauro Carvalho Chehab u32 sys_errors; 273*e7b8153eSMauro Carvalho Chehab u32 encode_errors; 274*e7b8153eSMauro Carvalho Chehab u32 frame_errors; 275*e7b8153eSMauro Carvalho Chehab #ifdef CONFIG_VIDEO_STI_HVA_DEBUGFS 276*e7b8153eSMauro Carvalho Chehab struct hva_ctx_dbg dbg; 277*e7b8153eSMauro Carvalho Chehab #endif 278*e7b8153eSMauro Carvalho Chehab }; 279*e7b8153eSMauro Carvalho Chehab 280*e7b8153eSMauro Carvalho Chehab #define HVA_FLAG_STREAMINFO 0x0001 281*e7b8153eSMauro Carvalho Chehab #define HVA_FLAG_FRAMEINFO 0x0002 282*e7b8153eSMauro Carvalho Chehab 283*e7b8153eSMauro Carvalho Chehab #ifdef CONFIG_VIDEO_STI_HVA_DEBUGFS 284*e7b8153eSMauro Carvalho Chehab /** 285*e7b8153eSMauro Carvalho Chehab * struct hva_dev_dbg - device debug info 286*e7b8153eSMauro Carvalho Chehab * 287*e7b8153eSMauro Carvalho Chehab * @debugfs_entry: debugfs entry 288*e7b8153eSMauro Carvalho Chehab * @last_ctx: debug information about last running instance context 289*e7b8153eSMauro Carvalho Chehab */ 290*e7b8153eSMauro Carvalho Chehab struct hva_dev_dbg { 291*e7b8153eSMauro Carvalho Chehab struct dentry *debugfs_entry; 292*e7b8153eSMauro Carvalho Chehab struct hva_ctx last_ctx; 293*e7b8153eSMauro Carvalho Chehab }; 294*e7b8153eSMauro Carvalho Chehab #endif 295*e7b8153eSMauro Carvalho Chehab 296*e7b8153eSMauro Carvalho Chehab #define HVA_MAX_INSTANCES 16 297*e7b8153eSMauro Carvalho Chehab #define HVA_MAX_ENCODERS 10 298*e7b8153eSMauro Carvalho Chehab #define HVA_MAX_FORMATS HVA_MAX_ENCODERS 299*e7b8153eSMauro Carvalho Chehab 300*e7b8153eSMauro Carvalho Chehab /** 301*e7b8153eSMauro Carvalho Chehab * struct hva_dev - abstraction for hva entity 302*e7b8153eSMauro Carvalho Chehab * 303*e7b8153eSMauro Carvalho Chehab * @v4l2_dev: V4L2 device 304*e7b8153eSMauro Carvalho Chehab * @vdev: video device 305*e7b8153eSMauro Carvalho Chehab * @pdev: platform device 306*e7b8153eSMauro Carvalho Chehab * @dev: device 307*e7b8153eSMauro Carvalho Chehab * @lock: mutex used for critical sections & V4L2 ops 308*e7b8153eSMauro Carvalho Chehab * serialization 309*e7b8153eSMauro Carvalho Chehab * @m2m_dev: memory-to-memory V4L2 device information 310*e7b8153eSMauro Carvalho Chehab * @instances: opened instances 311*e7b8153eSMauro Carvalho Chehab * @nb_of_instances: number of opened instances 312*e7b8153eSMauro Carvalho Chehab * @instance_id: rolling counter identifying an instance (debug purpose) 313*e7b8153eSMauro Carvalho Chehab * @regs: register io memory access 314*e7b8153eSMauro Carvalho Chehab * @esram_addr: esram address 315*e7b8153eSMauro Carvalho Chehab * @esram_size: esram size 316*e7b8153eSMauro Carvalho Chehab * @clk: hva clock 317*e7b8153eSMauro Carvalho Chehab * @irq_its: status interruption 318*e7b8153eSMauro Carvalho Chehab * @irq_err: error interruption 319*e7b8153eSMauro Carvalho Chehab * @work_queue: work queue to handle the encode jobs 320*e7b8153eSMauro Carvalho Chehab * @protect_mutex: mutex used to lock access of hardware 321*e7b8153eSMauro Carvalho Chehab * @interrupt: completion interrupt 322*e7b8153eSMauro Carvalho Chehab * @ip_version: IP hardware version 323*e7b8153eSMauro Carvalho Chehab * @encoders: registered encoders 324*e7b8153eSMauro Carvalho Chehab * @nb_of_encoders: number of registered encoders 325*e7b8153eSMauro Carvalho Chehab * @pixelformats: supported uncompressed video formats 326*e7b8153eSMauro Carvalho Chehab * @nb_of_pixelformats: number of supported umcompressed video formats 327*e7b8153eSMauro Carvalho Chehab * @streamformats: supported compressed video formats 328*e7b8153eSMauro Carvalho Chehab * @nb_of_streamformats: number of supported compressed video formats 329*e7b8153eSMauro Carvalho Chehab * @sfl_reg: status fifo level register value 330*e7b8153eSMauro Carvalho Chehab * @sts_reg: status register value 331*e7b8153eSMauro Carvalho Chehab * @lmi_err_reg: local memory interface error register value 332*e7b8153eSMauro Carvalho Chehab * @emi_err_reg: external memory interface error register value 333*e7b8153eSMauro Carvalho Chehab * @hec_mif_err_reg: HEC memory interface error register value 334*e7b8153eSMauro Carvalho Chehab * @dbg: device debug info 335*e7b8153eSMauro Carvalho Chehab */ 336*e7b8153eSMauro Carvalho Chehab struct hva_dev { 337*e7b8153eSMauro Carvalho Chehab struct v4l2_device v4l2_dev; 338*e7b8153eSMauro Carvalho Chehab struct video_device *vdev; 339*e7b8153eSMauro Carvalho Chehab struct platform_device *pdev; 340*e7b8153eSMauro Carvalho Chehab struct device *dev; 341*e7b8153eSMauro Carvalho Chehab /* mutex protecting vb2_queue structure */ 342*e7b8153eSMauro Carvalho Chehab struct mutex lock; 343*e7b8153eSMauro Carvalho Chehab struct v4l2_m2m_dev *m2m_dev; 344*e7b8153eSMauro Carvalho Chehab struct hva_ctx *instances[HVA_MAX_INSTANCES]; 345*e7b8153eSMauro Carvalho Chehab unsigned int nb_of_instances; 346*e7b8153eSMauro Carvalho Chehab unsigned int instance_id; 347*e7b8153eSMauro Carvalho Chehab void __iomem *regs; 348*e7b8153eSMauro Carvalho Chehab u32 esram_addr; 349*e7b8153eSMauro Carvalho Chehab u32 esram_size; 350*e7b8153eSMauro Carvalho Chehab struct clk *clk; 351*e7b8153eSMauro Carvalho Chehab int irq_its; 352*e7b8153eSMauro Carvalho Chehab int irq_err; 353*e7b8153eSMauro Carvalho Chehab struct workqueue_struct *work_queue; 354*e7b8153eSMauro Carvalho Chehab /* mutex protecting hardware access */ 355*e7b8153eSMauro Carvalho Chehab struct mutex protect_mutex; 356*e7b8153eSMauro Carvalho Chehab struct completion interrupt; 357*e7b8153eSMauro Carvalho Chehab unsigned long int ip_version; 358*e7b8153eSMauro Carvalho Chehab const struct hva_enc *encoders[HVA_MAX_ENCODERS]; 359*e7b8153eSMauro Carvalho Chehab u32 nb_of_encoders; 360*e7b8153eSMauro Carvalho Chehab u32 pixelformats[HVA_MAX_FORMATS]; 361*e7b8153eSMauro Carvalho Chehab u32 nb_of_pixelformats; 362*e7b8153eSMauro Carvalho Chehab u32 streamformats[HVA_MAX_FORMATS]; 363*e7b8153eSMauro Carvalho Chehab u32 nb_of_streamformats; 364*e7b8153eSMauro Carvalho Chehab u32 sfl_reg; 365*e7b8153eSMauro Carvalho Chehab u32 sts_reg; 366*e7b8153eSMauro Carvalho Chehab u32 lmi_err_reg; 367*e7b8153eSMauro Carvalho Chehab u32 emi_err_reg; 368*e7b8153eSMauro Carvalho Chehab u32 hec_mif_err_reg; 369*e7b8153eSMauro Carvalho Chehab #ifdef CONFIG_VIDEO_STI_HVA_DEBUGFS 370*e7b8153eSMauro Carvalho Chehab struct hva_dev_dbg dbg; 371*e7b8153eSMauro Carvalho Chehab #endif 372*e7b8153eSMauro Carvalho Chehab }; 373*e7b8153eSMauro Carvalho Chehab 374*e7b8153eSMauro Carvalho Chehab /** 375*e7b8153eSMauro Carvalho Chehab * struct hva_enc - hva encoder 376*e7b8153eSMauro Carvalho Chehab * 377*e7b8153eSMauro Carvalho Chehab * @name: encoder name 378*e7b8153eSMauro Carvalho Chehab * @streamformat: fourcc code for compressed video format (H.264...) 379*e7b8153eSMauro Carvalho Chehab * @pixelformat: fourcc code for uncompressed video format 380*e7b8153eSMauro Carvalho Chehab * @max_width: maximum width of frame for this encoder 381*e7b8153eSMauro Carvalho Chehab * @max_height: maximum height of frame for this encoder 382*e7b8153eSMauro Carvalho Chehab * @open: open encoder 383*e7b8153eSMauro Carvalho Chehab * @close: close encoder 384*e7b8153eSMauro Carvalho Chehab * @encode: encode a frame (struct hva_frame) in a stream 385*e7b8153eSMauro Carvalho Chehab * (struct hva_stream) 386*e7b8153eSMauro Carvalho Chehab */ 387*e7b8153eSMauro Carvalho Chehab 388*e7b8153eSMauro Carvalho Chehab struct hva_enc { 389*e7b8153eSMauro Carvalho Chehab const char *name; 390*e7b8153eSMauro Carvalho Chehab u32 streamformat; 391*e7b8153eSMauro Carvalho Chehab u32 pixelformat; 392*e7b8153eSMauro Carvalho Chehab u32 max_width; 393*e7b8153eSMauro Carvalho Chehab u32 max_height; 394*e7b8153eSMauro Carvalho Chehab int (*open)(struct hva_ctx *ctx); 395*e7b8153eSMauro Carvalho Chehab int (*close)(struct hva_ctx *ctx); 396*e7b8153eSMauro Carvalho Chehab int (*encode)(struct hva_ctx *ctx, struct hva_frame *frame, 397*e7b8153eSMauro Carvalho Chehab struct hva_stream *stream); 398*e7b8153eSMauro Carvalho Chehab }; 399*e7b8153eSMauro Carvalho Chehab 400*e7b8153eSMauro Carvalho Chehab #ifdef CONFIG_VIDEO_STI_HVA_DEBUGFS 401*e7b8153eSMauro Carvalho Chehab void hva_debugfs_create(struct hva_dev *hva); 402*e7b8153eSMauro Carvalho Chehab void hva_debugfs_remove(struct hva_dev *hva); 403*e7b8153eSMauro Carvalho Chehab void hva_dbg_ctx_create(struct hva_ctx *ctx); 404*e7b8153eSMauro Carvalho Chehab void hva_dbg_ctx_remove(struct hva_ctx *ctx); 405*e7b8153eSMauro Carvalho Chehab void hva_dbg_perf_begin(struct hva_ctx *ctx); 406*e7b8153eSMauro Carvalho Chehab void hva_dbg_perf_end(struct hva_ctx *ctx, struct hva_stream *stream); 407*e7b8153eSMauro Carvalho Chehab #endif 408*e7b8153eSMauro Carvalho Chehab 409*e7b8153eSMauro Carvalho Chehab #endif /* HVA_H */ 410