18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * Copyright (C) STMicroelectronics SA 2015 48c2ecf20Sopenharmony_ci * Authors: Yannick Fertre <yannick.fertre@st.com> 58c2ecf20Sopenharmony_ci * Hugues Fruchet <hugues.fruchet@st.com> 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci#ifndef HVA_H 98c2ecf20Sopenharmony_ci#define HVA_H 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_ci#include <media/v4l2-ctrls.h> 128c2ecf20Sopenharmony_ci#include <media/v4l2-device.h> 138c2ecf20Sopenharmony_ci#include <media/videobuf2-v4l2.h> 148c2ecf20Sopenharmony_ci#include <media/v4l2-mem2mem.h> 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci#define fh_to_ctx(f) (container_of(f, struct hva_ctx, fh)) 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci#define hva_to_dev(h) (h->dev) 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci#define ctx_to_dev(c) (c->hva_dev->dev) 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ci#define ctx_to_hdev(c) (c->hva_dev) 238c2ecf20Sopenharmony_ci 248c2ecf20Sopenharmony_ci#define HVA_NAME "st-hva" 258c2ecf20Sopenharmony_ci#define HVA_PREFIX "[---:----]" 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ciextern const struct hva_enc nv12h264enc; 288c2ecf20Sopenharmony_ciextern const struct hva_enc nv21h264enc; 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_ci/** 318c2ecf20Sopenharmony_ci * struct hva_frameinfo - information about hva frame 328c2ecf20Sopenharmony_ci * 338c2ecf20Sopenharmony_ci * @pixelformat: fourcc code for uncompressed video format 348c2ecf20Sopenharmony_ci * @width: width of frame 358c2ecf20Sopenharmony_ci * @height: height of frame 368c2ecf20Sopenharmony_ci * @aligned_width: width of frame (with encoder alignment constraint) 378c2ecf20Sopenharmony_ci * @aligned_height: height of frame (with encoder alignment constraint) 388c2ecf20Sopenharmony_ci * @size: maximum size in bytes required for data 398c2ecf20Sopenharmony_ci*/ 408c2ecf20Sopenharmony_cistruct hva_frameinfo { 418c2ecf20Sopenharmony_ci u32 pixelformat; 428c2ecf20Sopenharmony_ci u32 width; 438c2ecf20Sopenharmony_ci u32 height; 448c2ecf20Sopenharmony_ci u32 aligned_width; 458c2ecf20Sopenharmony_ci u32 aligned_height; 468c2ecf20Sopenharmony_ci u32 size; 478c2ecf20Sopenharmony_ci}; 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci/** 508c2ecf20Sopenharmony_ci * struct hva_streaminfo - information about hva stream 518c2ecf20Sopenharmony_ci * 528c2ecf20Sopenharmony_ci * @streamformat: fourcc code of compressed video format (H.264...) 538c2ecf20Sopenharmony_ci * @width: width of stream 548c2ecf20Sopenharmony_ci * @height: height of stream 558c2ecf20Sopenharmony_ci * @profile: profile string 568c2ecf20Sopenharmony_ci * @level: level string 578c2ecf20Sopenharmony_ci */ 588c2ecf20Sopenharmony_cistruct hva_streaminfo { 598c2ecf20Sopenharmony_ci u32 streamformat; 608c2ecf20Sopenharmony_ci u32 width; 618c2ecf20Sopenharmony_ci u32 height; 628c2ecf20Sopenharmony_ci u8 profile[32]; 638c2ecf20Sopenharmony_ci u8 level[32]; 648c2ecf20Sopenharmony_ci}; 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_ci/** 678c2ecf20Sopenharmony_ci * struct hva_controls - hva controls set 688c2ecf20Sopenharmony_ci * 698c2ecf20Sopenharmony_ci * @time_per_frame: time per frame in seconds 708c2ecf20Sopenharmony_ci * @bitrate_mode: bitrate mode (constant bitrate or variable bitrate) 718c2ecf20Sopenharmony_ci * @gop_size: groupe of picture size 728c2ecf20Sopenharmony_ci * @bitrate: bitrate (in bps) 738c2ecf20Sopenharmony_ci * @aspect: video aspect 748c2ecf20Sopenharmony_ci * @profile: H.264 profile 758c2ecf20Sopenharmony_ci * @level: H.264 level 768c2ecf20Sopenharmony_ci * @entropy_mode: H.264 entropy mode (CABAC or CVLC) 778c2ecf20Sopenharmony_ci * @cpb_size: coded picture buffer size (in kB) 788c2ecf20Sopenharmony_ci * @dct8x8: transform mode 8x8 enable 798c2ecf20Sopenharmony_ci * @qpmin: minimum quantizer 808c2ecf20Sopenharmony_ci * @qpmax: maximum quantizer 818c2ecf20Sopenharmony_ci * @vui_sar: pixel aspect ratio enable 828c2ecf20Sopenharmony_ci * @vui_sar_idc: pixel aspect ratio identifier 838c2ecf20Sopenharmony_ci * @sei_fp: sei frame packing arrangement enable 848c2ecf20Sopenharmony_ci * @sei_fp_type: sei frame packing arrangement type 858c2ecf20Sopenharmony_ci */ 868c2ecf20Sopenharmony_cistruct hva_controls { 878c2ecf20Sopenharmony_ci struct v4l2_fract time_per_frame; 888c2ecf20Sopenharmony_ci enum v4l2_mpeg_video_bitrate_mode bitrate_mode; 898c2ecf20Sopenharmony_ci u32 gop_size; 908c2ecf20Sopenharmony_ci u32 bitrate; 918c2ecf20Sopenharmony_ci enum v4l2_mpeg_video_aspect aspect; 928c2ecf20Sopenharmony_ci enum v4l2_mpeg_video_h264_profile profile; 938c2ecf20Sopenharmony_ci enum v4l2_mpeg_video_h264_level level; 948c2ecf20Sopenharmony_ci enum v4l2_mpeg_video_h264_entropy_mode entropy_mode; 958c2ecf20Sopenharmony_ci u32 cpb_size; 968c2ecf20Sopenharmony_ci bool dct8x8; 978c2ecf20Sopenharmony_ci u32 qpmin; 988c2ecf20Sopenharmony_ci u32 qpmax; 998c2ecf20Sopenharmony_ci bool vui_sar; 1008c2ecf20Sopenharmony_ci enum v4l2_mpeg_video_h264_vui_sar_idc vui_sar_idc; 1018c2ecf20Sopenharmony_ci bool sei_fp; 1028c2ecf20Sopenharmony_ci enum v4l2_mpeg_video_h264_sei_fp_arrangement_type sei_fp_type; 1038c2ecf20Sopenharmony_ci}; 1048c2ecf20Sopenharmony_ci 1058c2ecf20Sopenharmony_ci/** 1068c2ecf20Sopenharmony_ci * struct hva_frame - hva frame buffer (output) 1078c2ecf20Sopenharmony_ci * 1088c2ecf20Sopenharmony_ci * @vbuf: video buffer information for V4L2 1098c2ecf20Sopenharmony_ci * @list: V4L2 m2m list that the frame belongs to 1108c2ecf20Sopenharmony_ci * @info: frame information (width, height, format, alignment...) 1118c2ecf20Sopenharmony_ci * @paddr: physical address (for hardware) 1128c2ecf20Sopenharmony_ci * @vaddr: virtual address (kernel can read/write) 1138c2ecf20Sopenharmony_ci * @prepared: true if vaddr/paddr are resolved 1148c2ecf20Sopenharmony_ci */ 1158c2ecf20Sopenharmony_cistruct hva_frame { 1168c2ecf20Sopenharmony_ci struct vb2_v4l2_buffer vbuf; 1178c2ecf20Sopenharmony_ci struct list_head list; 1188c2ecf20Sopenharmony_ci struct hva_frameinfo info; 1198c2ecf20Sopenharmony_ci dma_addr_t paddr; 1208c2ecf20Sopenharmony_ci void *vaddr; 1218c2ecf20Sopenharmony_ci bool prepared; 1228c2ecf20Sopenharmony_ci}; 1238c2ecf20Sopenharmony_ci 1248c2ecf20Sopenharmony_ci/* 1258c2ecf20Sopenharmony_ci * to_hva_frame() - cast struct vb2_v4l2_buffer * to struct hva_frame * 1268c2ecf20Sopenharmony_ci */ 1278c2ecf20Sopenharmony_ci#define to_hva_frame(vb) \ 1288c2ecf20Sopenharmony_ci container_of(vb, struct hva_frame, vbuf) 1298c2ecf20Sopenharmony_ci 1308c2ecf20Sopenharmony_ci/** 1318c2ecf20Sopenharmony_ci * struct hva_stream - hva stream buffer (capture) 1328c2ecf20Sopenharmony_ci * 1338c2ecf20Sopenharmony_ci * @v4l2: video buffer information for V4L2 1348c2ecf20Sopenharmony_ci * @list: V4L2 m2m list that the frame belongs to 1358c2ecf20Sopenharmony_ci * @paddr: physical address (for hardware) 1368c2ecf20Sopenharmony_ci * @vaddr: virtual address (kernel can read/write) 1378c2ecf20Sopenharmony_ci * @prepared: true if vaddr/paddr are resolved 1388c2ecf20Sopenharmony_ci * @size: size of the buffer in bytes 1398c2ecf20Sopenharmony_ci * @bytesused: number of bytes occupied by data in the buffer 1408c2ecf20Sopenharmony_ci */ 1418c2ecf20Sopenharmony_cistruct hva_stream { 1428c2ecf20Sopenharmony_ci struct vb2_v4l2_buffer vbuf; 1438c2ecf20Sopenharmony_ci struct list_head list; 1448c2ecf20Sopenharmony_ci dma_addr_t paddr; 1458c2ecf20Sopenharmony_ci void *vaddr; 1468c2ecf20Sopenharmony_ci bool prepared; 1478c2ecf20Sopenharmony_ci unsigned int size; 1488c2ecf20Sopenharmony_ci unsigned int bytesused; 1498c2ecf20Sopenharmony_ci}; 1508c2ecf20Sopenharmony_ci 1518c2ecf20Sopenharmony_ci/* 1528c2ecf20Sopenharmony_ci * to_hva_stream() - cast struct vb2_v4l2_buffer * to struct hva_stream * 1538c2ecf20Sopenharmony_ci */ 1548c2ecf20Sopenharmony_ci#define to_hva_stream(vb) \ 1558c2ecf20Sopenharmony_ci container_of(vb, struct hva_stream, vbuf) 1568c2ecf20Sopenharmony_ci 1578c2ecf20Sopenharmony_ci#ifdef CONFIG_VIDEO_STI_HVA_DEBUGFS 1588c2ecf20Sopenharmony_ci/** 1598c2ecf20Sopenharmony_ci * struct hva_ctx_dbg - instance context debug info 1608c2ecf20Sopenharmony_ci * 1618c2ecf20Sopenharmony_ci * @debugfs_entry: debugfs entry 1628c2ecf20Sopenharmony_ci * @is_valid_period: true if the sequence is valid for performance 1638c2ecf20Sopenharmony_ci * @begin: start time of last HW task 1648c2ecf20Sopenharmony_ci * @total_duration: total HW processing durations in 0.1ms 1658c2ecf20Sopenharmony_ci * @cnt_duration: number of HW processings 1668c2ecf20Sopenharmony_ci * @min_duration: minimum HW processing duration in 0.1ms 1678c2ecf20Sopenharmony_ci * @max_duration: maximum HW processing duration in 0.1ms 1688c2ecf20Sopenharmony_ci * @avg_duration: average HW processing duration in 0.1ms 1698c2ecf20Sopenharmony_ci * @max_fps: maximum frames encoded per second (in 0.1Hz) 1708c2ecf20Sopenharmony_ci * @total_period: total encoding periods in 0.1ms 1718c2ecf20Sopenharmony_ci * @cnt_period: number of periods 1728c2ecf20Sopenharmony_ci * @min_period: minimum encoding period in 0.1ms 1738c2ecf20Sopenharmony_ci * @max_period: maximum encoding period in 0.1ms 1748c2ecf20Sopenharmony_ci * @avg_period: average encoding period in 0.1ms 1758c2ecf20Sopenharmony_ci * @total_stream_size: total number of encoded bytes 1768c2ecf20Sopenharmony_ci * @avg_fps: average frames encoded per second (in 0.1Hz) 1778c2ecf20Sopenharmony_ci * @window_duration: duration of the sampling window in 0.1ms 1788c2ecf20Sopenharmony_ci * @cnt_window: number of samples in the window 1798c2ecf20Sopenharmony_ci * @window_stream_size: number of encoded bytes upon the sampling window 1808c2ecf20Sopenharmony_ci * @last_bitrate: bitrate upon the last sampling window 1818c2ecf20Sopenharmony_ci * @min_bitrate: minimum bitrate in kbps 1828c2ecf20Sopenharmony_ci * @max_bitrate: maximum bitrate in kbps 1838c2ecf20Sopenharmony_ci * @avg_bitrate: average bitrate in kbps 1848c2ecf20Sopenharmony_ci */ 1858c2ecf20Sopenharmony_cistruct hva_ctx_dbg { 1868c2ecf20Sopenharmony_ci struct dentry *debugfs_entry; 1878c2ecf20Sopenharmony_ci bool is_valid_period; 1888c2ecf20Sopenharmony_ci ktime_t begin; 1898c2ecf20Sopenharmony_ci u32 total_duration; 1908c2ecf20Sopenharmony_ci u32 cnt_duration; 1918c2ecf20Sopenharmony_ci u32 min_duration; 1928c2ecf20Sopenharmony_ci u32 max_duration; 1938c2ecf20Sopenharmony_ci u32 avg_duration; 1948c2ecf20Sopenharmony_ci u32 max_fps; 1958c2ecf20Sopenharmony_ci u32 total_period; 1968c2ecf20Sopenharmony_ci u32 cnt_period; 1978c2ecf20Sopenharmony_ci u32 min_period; 1988c2ecf20Sopenharmony_ci u32 max_period; 1998c2ecf20Sopenharmony_ci u32 avg_period; 2008c2ecf20Sopenharmony_ci u32 total_stream_size; 2018c2ecf20Sopenharmony_ci u32 avg_fps; 2028c2ecf20Sopenharmony_ci u32 window_duration; 2038c2ecf20Sopenharmony_ci u32 cnt_window; 2048c2ecf20Sopenharmony_ci u32 window_stream_size; 2058c2ecf20Sopenharmony_ci u32 last_bitrate; 2068c2ecf20Sopenharmony_ci u32 min_bitrate; 2078c2ecf20Sopenharmony_ci u32 max_bitrate; 2088c2ecf20Sopenharmony_ci u32 avg_bitrate; 2098c2ecf20Sopenharmony_ci}; 2108c2ecf20Sopenharmony_ci#endif 2118c2ecf20Sopenharmony_ci 2128c2ecf20Sopenharmony_cistruct hva_dev; 2138c2ecf20Sopenharmony_cistruct hva_enc; 2148c2ecf20Sopenharmony_ci 2158c2ecf20Sopenharmony_ci/** 2168c2ecf20Sopenharmony_ci * struct hva_ctx - context of hva instance 2178c2ecf20Sopenharmony_ci * 2188c2ecf20Sopenharmony_ci * @hva_dev: the device that this instance is associated with 2198c2ecf20Sopenharmony_ci * @fh: V4L2 file handle 2208c2ecf20Sopenharmony_ci * @ctrl_handler: V4L2 controls handler 2218c2ecf20Sopenharmony_ci * @ctrls: hva controls set 2228c2ecf20Sopenharmony_ci * @id: instance identifier 2238c2ecf20Sopenharmony_ci * @aborting: true if current job aborted 2248c2ecf20Sopenharmony_ci * @name: instance name (debug purpose) 2258c2ecf20Sopenharmony_ci * @run_work: encode work 2268c2ecf20Sopenharmony_ci * @lock: mutex used to lock access of this context 2278c2ecf20Sopenharmony_ci * @flags: validity of streaminfo and frameinfo fields 2288c2ecf20Sopenharmony_ci * @frame_num: frame number 2298c2ecf20Sopenharmony_ci * @stream_num: stream number 2308c2ecf20Sopenharmony_ci * @max_stream_size: maximum size in bytes required for stream data 2318c2ecf20Sopenharmony_ci * @colorspace: colorspace identifier 2328c2ecf20Sopenharmony_ci * @xfer_func: transfer function identifier 2338c2ecf20Sopenharmony_ci * @ycbcr_enc: Y'CbCr encoding identifier 2348c2ecf20Sopenharmony_ci * @quantization: quantization identifier 2358c2ecf20Sopenharmony_ci * @streaminfo: stream properties 2368c2ecf20Sopenharmony_ci * @frameinfo: frame properties 2378c2ecf20Sopenharmony_ci * @enc: current encoder 2388c2ecf20Sopenharmony_ci * @priv: private codec data for this instance, allocated 2398c2ecf20Sopenharmony_ci * by encoder @open time 2408c2ecf20Sopenharmony_ci * @hw_err: true if hardware error detected 2418c2ecf20Sopenharmony_ci * @encoded_frames: number of encoded frames 2428c2ecf20Sopenharmony_ci * @sys_errors: number of system errors (memory, resource, pm...) 2438c2ecf20Sopenharmony_ci * @encode_errors: number of encoding errors (hw/driver errors) 2448c2ecf20Sopenharmony_ci * @frame_errors: number of frame errors (format, size, header...) 2458c2ecf20Sopenharmony_ci * @dbg: context debug info 2468c2ecf20Sopenharmony_ci */ 2478c2ecf20Sopenharmony_cistruct hva_ctx { 2488c2ecf20Sopenharmony_ci struct hva_dev *hva_dev; 2498c2ecf20Sopenharmony_ci struct v4l2_fh fh; 2508c2ecf20Sopenharmony_ci struct v4l2_ctrl_handler ctrl_handler; 2518c2ecf20Sopenharmony_ci struct hva_controls ctrls; 2528c2ecf20Sopenharmony_ci u8 id; 2538c2ecf20Sopenharmony_ci bool aborting; 2548c2ecf20Sopenharmony_ci char name[100]; 2558c2ecf20Sopenharmony_ci struct work_struct run_work; 2568c2ecf20Sopenharmony_ci /* mutex protecting this data structure */ 2578c2ecf20Sopenharmony_ci struct mutex lock; 2588c2ecf20Sopenharmony_ci u32 flags; 2598c2ecf20Sopenharmony_ci u32 frame_num; 2608c2ecf20Sopenharmony_ci u32 stream_num; 2618c2ecf20Sopenharmony_ci u32 max_stream_size; 2628c2ecf20Sopenharmony_ci enum v4l2_colorspace colorspace; 2638c2ecf20Sopenharmony_ci enum v4l2_xfer_func xfer_func; 2648c2ecf20Sopenharmony_ci enum v4l2_ycbcr_encoding ycbcr_enc; 2658c2ecf20Sopenharmony_ci enum v4l2_quantization quantization; 2668c2ecf20Sopenharmony_ci struct hva_streaminfo streaminfo; 2678c2ecf20Sopenharmony_ci struct hva_frameinfo frameinfo; 2688c2ecf20Sopenharmony_ci struct hva_enc *enc; 2698c2ecf20Sopenharmony_ci void *priv; 2708c2ecf20Sopenharmony_ci bool hw_err; 2718c2ecf20Sopenharmony_ci u32 encoded_frames; 2728c2ecf20Sopenharmony_ci u32 sys_errors; 2738c2ecf20Sopenharmony_ci u32 encode_errors; 2748c2ecf20Sopenharmony_ci u32 frame_errors; 2758c2ecf20Sopenharmony_ci#ifdef CONFIG_VIDEO_STI_HVA_DEBUGFS 2768c2ecf20Sopenharmony_ci struct hva_ctx_dbg dbg; 2778c2ecf20Sopenharmony_ci#endif 2788c2ecf20Sopenharmony_ci}; 2798c2ecf20Sopenharmony_ci 2808c2ecf20Sopenharmony_ci#define HVA_FLAG_STREAMINFO 0x0001 2818c2ecf20Sopenharmony_ci#define HVA_FLAG_FRAMEINFO 0x0002 2828c2ecf20Sopenharmony_ci 2838c2ecf20Sopenharmony_ci#ifdef CONFIG_VIDEO_STI_HVA_DEBUGFS 2848c2ecf20Sopenharmony_ci/** 2858c2ecf20Sopenharmony_ci * struct hva_dev_dbg - device debug info 2868c2ecf20Sopenharmony_ci * 2878c2ecf20Sopenharmony_ci * @debugfs_entry: debugfs entry 2888c2ecf20Sopenharmony_ci * @last_ctx: debug information about last running instance context 2898c2ecf20Sopenharmony_ci */ 2908c2ecf20Sopenharmony_cistruct hva_dev_dbg { 2918c2ecf20Sopenharmony_ci struct dentry *debugfs_entry; 2928c2ecf20Sopenharmony_ci struct hva_ctx last_ctx; 2938c2ecf20Sopenharmony_ci}; 2948c2ecf20Sopenharmony_ci#endif 2958c2ecf20Sopenharmony_ci 2968c2ecf20Sopenharmony_ci#define HVA_MAX_INSTANCES 16 2978c2ecf20Sopenharmony_ci#define HVA_MAX_ENCODERS 10 2988c2ecf20Sopenharmony_ci#define HVA_MAX_FORMATS HVA_MAX_ENCODERS 2998c2ecf20Sopenharmony_ci 3008c2ecf20Sopenharmony_ci/** 3018c2ecf20Sopenharmony_ci * struct hva_dev - abstraction for hva entity 3028c2ecf20Sopenharmony_ci * 3038c2ecf20Sopenharmony_ci * @v4l2_dev: V4L2 device 3048c2ecf20Sopenharmony_ci * @vdev: video device 3058c2ecf20Sopenharmony_ci * @pdev: platform device 3068c2ecf20Sopenharmony_ci * @dev: device 3078c2ecf20Sopenharmony_ci * @lock: mutex used for critical sections & V4L2 ops 3088c2ecf20Sopenharmony_ci * serialization 3098c2ecf20Sopenharmony_ci * @m2m_dev: memory-to-memory V4L2 device information 3108c2ecf20Sopenharmony_ci * @instances: opened instances 3118c2ecf20Sopenharmony_ci * @nb_of_instances: number of opened instances 3128c2ecf20Sopenharmony_ci * @instance_id: rolling counter identifying an instance (debug purpose) 3138c2ecf20Sopenharmony_ci * @regs: register io memory access 3148c2ecf20Sopenharmony_ci * @esram_addr: esram address 3158c2ecf20Sopenharmony_ci * @esram_size: esram size 3168c2ecf20Sopenharmony_ci * @clk: hva clock 3178c2ecf20Sopenharmony_ci * @irq_its: status interruption 3188c2ecf20Sopenharmony_ci * @irq_err: error interruption 3198c2ecf20Sopenharmony_ci * @work_queue: work queue to handle the encode jobs 3208c2ecf20Sopenharmony_ci * @protect_mutex: mutex used to lock access of hardware 3218c2ecf20Sopenharmony_ci * @interrupt: completion interrupt 3228c2ecf20Sopenharmony_ci * @ip_version: IP hardware version 3238c2ecf20Sopenharmony_ci * @encoders: registered encoders 3248c2ecf20Sopenharmony_ci * @nb_of_encoders: number of registered encoders 3258c2ecf20Sopenharmony_ci * @pixelformats: supported uncompressed video formats 3268c2ecf20Sopenharmony_ci * @nb_of_pixelformats: number of supported umcompressed video formats 3278c2ecf20Sopenharmony_ci * @streamformats: supported compressed video formats 3288c2ecf20Sopenharmony_ci * @nb_of_streamformats: number of supported compressed video formats 3298c2ecf20Sopenharmony_ci * @sfl_reg: status fifo level register value 3308c2ecf20Sopenharmony_ci * @sts_reg: status register value 3318c2ecf20Sopenharmony_ci * @lmi_err_reg: local memory interface error register value 3328c2ecf20Sopenharmony_ci * @emi_err_reg: external memory interface error register value 3338c2ecf20Sopenharmony_ci * @hec_mif_err_reg: HEC memory interface error register value 3348c2ecf20Sopenharmony_ci * @dbg: device debug info 3358c2ecf20Sopenharmony_ci */ 3368c2ecf20Sopenharmony_cistruct hva_dev { 3378c2ecf20Sopenharmony_ci struct v4l2_device v4l2_dev; 3388c2ecf20Sopenharmony_ci struct video_device *vdev; 3398c2ecf20Sopenharmony_ci struct platform_device *pdev; 3408c2ecf20Sopenharmony_ci struct device *dev; 3418c2ecf20Sopenharmony_ci /* mutex protecting vb2_queue structure */ 3428c2ecf20Sopenharmony_ci struct mutex lock; 3438c2ecf20Sopenharmony_ci struct v4l2_m2m_dev *m2m_dev; 3448c2ecf20Sopenharmony_ci struct hva_ctx *instances[HVA_MAX_INSTANCES]; 3458c2ecf20Sopenharmony_ci unsigned int nb_of_instances; 3468c2ecf20Sopenharmony_ci unsigned int instance_id; 3478c2ecf20Sopenharmony_ci void __iomem *regs; 3488c2ecf20Sopenharmony_ci u32 esram_addr; 3498c2ecf20Sopenharmony_ci u32 esram_size; 3508c2ecf20Sopenharmony_ci struct clk *clk; 3518c2ecf20Sopenharmony_ci int irq_its; 3528c2ecf20Sopenharmony_ci int irq_err; 3538c2ecf20Sopenharmony_ci struct workqueue_struct *work_queue; 3548c2ecf20Sopenharmony_ci /* mutex protecting hardware access */ 3558c2ecf20Sopenharmony_ci struct mutex protect_mutex; 3568c2ecf20Sopenharmony_ci struct completion interrupt; 3578c2ecf20Sopenharmony_ci unsigned long int ip_version; 3588c2ecf20Sopenharmony_ci const struct hva_enc *encoders[HVA_MAX_ENCODERS]; 3598c2ecf20Sopenharmony_ci u32 nb_of_encoders; 3608c2ecf20Sopenharmony_ci u32 pixelformats[HVA_MAX_FORMATS]; 3618c2ecf20Sopenharmony_ci u32 nb_of_pixelformats; 3628c2ecf20Sopenharmony_ci u32 streamformats[HVA_MAX_FORMATS]; 3638c2ecf20Sopenharmony_ci u32 nb_of_streamformats; 3648c2ecf20Sopenharmony_ci u32 sfl_reg; 3658c2ecf20Sopenharmony_ci u32 sts_reg; 3668c2ecf20Sopenharmony_ci u32 lmi_err_reg; 3678c2ecf20Sopenharmony_ci u32 emi_err_reg; 3688c2ecf20Sopenharmony_ci u32 hec_mif_err_reg; 3698c2ecf20Sopenharmony_ci#ifdef CONFIG_VIDEO_STI_HVA_DEBUGFS 3708c2ecf20Sopenharmony_ci struct hva_dev_dbg dbg; 3718c2ecf20Sopenharmony_ci#endif 3728c2ecf20Sopenharmony_ci}; 3738c2ecf20Sopenharmony_ci 3748c2ecf20Sopenharmony_ci/** 3758c2ecf20Sopenharmony_ci * struct hva_enc - hva encoder 3768c2ecf20Sopenharmony_ci * 3778c2ecf20Sopenharmony_ci * @name: encoder name 3788c2ecf20Sopenharmony_ci * @streamformat: fourcc code for compressed video format (H.264...) 3798c2ecf20Sopenharmony_ci * @pixelformat: fourcc code for uncompressed video format 3808c2ecf20Sopenharmony_ci * @max_width: maximum width of frame for this encoder 3818c2ecf20Sopenharmony_ci * @max_height: maximum height of frame for this encoder 3828c2ecf20Sopenharmony_ci * @open: open encoder 3838c2ecf20Sopenharmony_ci * @close: close encoder 3848c2ecf20Sopenharmony_ci * @encode: encode a frame (struct hva_frame) in a stream 3858c2ecf20Sopenharmony_ci * (struct hva_stream) 3868c2ecf20Sopenharmony_ci */ 3878c2ecf20Sopenharmony_ci 3888c2ecf20Sopenharmony_cistruct hva_enc { 3898c2ecf20Sopenharmony_ci const char *name; 3908c2ecf20Sopenharmony_ci u32 streamformat; 3918c2ecf20Sopenharmony_ci u32 pixelformat; 3928c2ecf20Sopenharmony_ci u32 max_width; 3938c2ecf20Sopenharmony_ci u32 max_height; 3948c2ecf20Sopenharmony_ci int (*open)(struct hva_ctx *ctx); 3958c2ecf20Sopenharmony_ci int (*close)(struct hva_ctx *ctx); 3968c2ecf20Sopenharmony_ci int (*encode)(struct hva_ctx *ctx, struct hva_frame *frame, 3978c2ecf20Sopenharmony_ci struct hva_stream *stream); 3988c2ecf20Sopenharmony_ci}; 3998c2ecf20Sopenharmony_ci 4008c2ecf20Sopenharmony_ci#ifdef CONFIG_VIDEO_STI_HVA_DEBUGFS 4018c2ecf20Sopenharmony_civoid hva_debugfs_create(struct hva_dev *hva); 4028c2ecf20Sopenharmony_civoid hva_debugfs_remove(struct hva_dev *hva); 4038c2ecf20Sopenharmony_civoid hva_dbg_ctx_create(struct hva_ctx *ctx); 4048c2ecf20Sopenharmony_civoid hva_dbg_ctx_remove(struct hva_ctx *ctx); 4058c2ecf20Sopenharmony_civoid hva_dbg_perf_begin(struct hva_ctx *ctx); 4068c2ecf20Sopenharmony_civoid hva_dbg_perf_end(struct hva_ctx *ctx, struct hva_stream *stream); 4078c2ecf20Sopenharmony_ci#endif 4088c2ecf20Sopenharmony_ci 4098c2ecf20Sopenharmony_ci#endif /* HVA_H */ 410