cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

core.h (14050B)


      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
      7#ifndef __VENUS_CORE_H_
      8#define __VENUS_CORE_H_
      9
     10#include <linux/bitops.h>
     11#include <linux/list.h>
     12#include <media/videobuf2-v4l2.h>
     13#include <media/v4l2-ctrls.h>
     14#include <media/v4l2-device.h>
     15
     16#include "dbgfs.h"
     17#include "hfi.h"
     18#include "hfi_platform.h"
     19
     20#define VDBGL	"VenusLow : "
     21#define VDBGM	"VenusMed : "
     22#define VDBGH	"VenusHigh: "
     23#define VDBGFW	"VenusFW  : "
     24
     25#define VIDC_CLKS_NUM_MAX		4
     26#define VIDC_VCODEC_CLKS_NUM_MAX	2
     27#define VIDC_PMDOMAINS_NUM_MAX		3
     28#define VIDC_RESETS_NUM_MAX		2
     29
     30extern int venus_fw_debug;
     31
     32struct freq_tbl {
     33	unsigned int load;
     34	unsigned long freq;
     35};
     36
     37struct reg_val {
     38	u32 reg;
     39	u32 value;
     40};
     41
     42struct bw_tbl {
     43	u32 mbs_per_sec;
     44	u32 avg;
     45	u32 peak;
     46	u32 avg_10bit;
     47	u32 peak_10bit;
     48};
     49
     50struct venus_resources {
     51	u64 dma_mask;
     52	const struct freq_tbl *freq_tbl;
     53	unsigned int freq_tbl_size;
     54	const struct bw_tbl *bw_tbl_enc;
     55	unsigned int bw_tbl_enc_size;
     56	const struct bw_tbl *bw_tbl_dec;
     57	unsigned int bw_tbl_dec_size;
     58	const struct reg_val *reg_tbl;
     59	unsigned int reg_tbl_size;
     60	const char * const clks[VIDC_CLKS_NUM_MAX];
     61	unsigned int clks_num;
     62	const char * const vcodec0_clks[VIDC_VCODEC_CLKS_NUM_MAX];
     63	const char * const vcodec1_clks[VIDC_VCODEC_CLKS_NUM_MAX];
     64	unsigned int vcodec_clks_num;
     65	const char * const vcodec_pmdomains[VIDC_PMDOMAINS_NUM_MAX];
     66	unsigned int vcodec_pmdomains_num;
     67	const char **opp_pmdomain;
     68	unsigned int vcodec_num;
     69	const char * const resets[VIDC_RESETS_NUM_MAX];
     70	unsigned int resets_num;
     71	enum hfi_version hfi_version;
     72	u8 num_vpp_pipes;
     73	u32 max_load;
     74	unsigned int vmem_id;
     75	u32 vmem_size;
     76	u32 vmem_addr;
     77	u32 cp_start;
     78	u32 cp_size;
     79	u32 cp_nonpixel_start;
     80	u32 cp_nonpixel_size;
     81	const char *fwname;
     82};
     83
     84struct venus_format {
     85	u32 pixfmt;
     86	unsigned int num_planes;
     87	u32 type;
     88	u32 flags;
     89};
     90
     91/**
     92 * struct venus_core - holds core parameters valid for all instances
     93 *
     94 * @base:	IO memory base address
     95 * @vbif_base:	IO memory vbif base address
     96 * @cpu_base:	IO memory cpu base address
     97 * @cpu_cs_base:	IO memory cpu_cs base address
     98 * @cpu_ic_base:	IO memory cpu_ic base address
     99 * @wrapper_base:	IO memory wrapper base address
    100 * @wrapper_tz_base:	IO memory wrapper TZ base address
    101 * @aon_base:	AON base address
    102 * @irq:		Venus irq
    103 * @clks:	an array of struct clk pointers
    104 * @vcodec0_clks: an array of vcodec0 struct clk pointers
    105 * @vcodec1_clks: an array of vcodec1 struct clk pointers
    106 * @video_path: an interconnect handle to video to/from memory path
    107 * @cpucfg_path: an interconnect handle to cpu configuration path
    108 * @opp_table: an device OPP table handle
    109 * @has_opp_table: does OPP table exist
    110 * @pmdomains:	an array of pmdomains struct device pointers
    111 * @opp_dl_venus: an device-link for device OPP
    112 * @opp_pmdomain: an OPP power-domain
    113 * @resets: an array of reset signals
    114 * @vdev_dec:	a reference to video device structure for decoder instances
    115 * @vdev_enc:	a reference to video device structure for encoder instances
    116 * @v4l2_dev:	a holder for v4l2 device structure
    117 * @res:		a reference to venus resources structure
    118 * @dev:		convenience struct device pointer
    119 * @dev_dec:	convenience struct device pointer for decoder device
    120 * @dev_enc:	convenience struct device pointer for encoder device
    121 * @use_tz:	a flag that suggests presence of trustzone
    122 * @fw:		structure of firmware parameters
    123 * @lock:	a lock for this strucure
    124 * @instances:	a list_head of all instances
    125 * @insts_count:	num of instances
    126 * @state:	the state of the venus core
    127 * @done:	a completion for sync HFI operations
    128 * @error:	an error returned during last HFI sync operations
    129 * @sys_error:	an error flag that signal system error event
    130 * @sys_err_done: a waitqueue to wait for system error recovery end
    131 * @core_ops:	the core operations
    132 * @pm_ops:	a pointer to pm operations
    133 * @pm_lock:	a lock for PM operations
    134 * @enc_codecs:	encoders supported by this core
    135 * @dec_codecs:	decoders supported by this core
    136 * @max_sessions_supported:	holds the maximum number of sessions
    137 * @priv:	a private filed for HFI operations
    138 * @ops:		the core HFI operations
    139 * @work:	a delayed work for handling system fatal error
    140 * @caps:	an array of supported HFI capabilities
    141 * @codecs_count: platform codecs count
    142 * @core0_usage_count: usage counter for core0
    143 * @core1_usage_count: usage counter for core1
    144 * @root:	debugfs root directory
    145 */
    146struct venus_core {
    147	void __iomem *base;
    148	void __iomem *vbif_base;
    149	void __iomem *cpu_base;
    150	void __iomem *cpu_cs_base;
    151	void __iomem *cpu_ic_base;
    152	void __iomem *wrapper_base;
    153	void __iomem *wrapper_tz_base;
    154	void __iomem *aon_base;
    155	int irq;
    156	struct clk *clks[VIDC_CLKS_NUM_MAX];
    157	struct clk *vcodec0_clks[VIDC_VCODEC_CLKS_NUM_MAX];
    158	struct clk *vcodec1_clks[VIDC_VCODEC_CLKS_NUM_MAX];
    159	struct icc_path *video_path;
    160	struct icc_path *cpucfg_path;
    161	bool has_opp_table;
    162	struct device *pmdomains[VIDC_PMDOMAINS_NUM_MAX];
    163	struct device_link *opp_dl_venus;
    164	struct device *opp_pmdomain;
    165	struct reset_control *resets[VIDC_RESETS_NUM_MAX];
    166	struct video_device *vdev_dec;
    167	struct video_device *vdev_enc;
    168	struct v4l2_device v4l2_dev;
    169	const struct venus_resources *res;
    170	struct device *dev;
    171	struct device *dev_dec;
    172	struct device *dev_enc;
    173	unsigned int use_tz;
    174	struct video_firmware {
    175		struct device *dev;
    176		struct iommu_domain *iommu_domain;
    177		size_t mapped_mem_size;
    178		phys_addr_t mem_phys;
    179		size_t mem_size;
    180	} fw;
    181	struct mutex lock;
    182	struct list_head instances;
    183	atomic_t insts_count;
    184	unsigned int state;
    185	struct completion done;
    186	unsigned int error;
    187	unsigned long sys_error;
    188	wait_queue_head_t sys_err_done;
    189	const struct hfi_core_ops *core_ops;
    190	const struct venus_pm_ops *pm_ops;
    191	struct mutex pm_lock;
    192	unsigned long enc_codecs;
    193	unsigned long dec_codecs;
    194	unsigned int max_sessions_supported;
    195	void *priv;
    196	const struct hfi_ops *ops;
    197	struct delayed_work work;
    198	struct hfi_plat_caps caps[MAX_CODEC_NUM];
    199	unsigned int codecs_count;
    200	unsigned int core0_usage_count;
    201	unsigned int core1_usage_count;
    202	struct dentry *root;
    203};
    204
    205struct vdec_controls {
    206	u32 post_loop_deb_mode;
    207	u32 profile;
    208	u32 level;
    209	u32 display_delay;
    210	u32 display_delay_enable;
    211	u64 conceal_color;
    212};
    213
    214struct venc_controls {
    215	u16 gop_size;
    216	u32 num_p_frames;
    217	u32 num_b_frames;
    218	u32 bitrate_mode;
    219	u32 bitrate;
    220	u32 bitrate_peak;
    221	u32 rc_enable;
    222	u32 const_quality;
    223	u32 frame_skip_mode;
    224
    225	u32 h264_i_period;
    226	u32 h264_entropy_mode;
    227	u32 h264_i_qp;
    228	u32 h264_p_qp;
    229	u32 h264_b_qp;
    230	u32 h264_min_qp;
    231	u32 h264_max_qp;
    232	u32 h264_i_min_qp;
    233	u32 h264_i_max_qp;
    234	u32 h264_p_min_qp;
    235	u32 h264_p_max_qp;
    236	u32 h264_b_min_qp;
    237	u32 h264_b_max_qp;
    238	u32 h264_loop_filter_mode;
    239	s32 h264_loop_filter_alpha;
    240	s32 h264_loop_filter_beta;
    241	u32 h264_8x8_transform;
    242
    243	u32 hevc_i_qp;
    244	u32 hevc_p_qp;
    245	u32 hevc_b_qp;
    246	u32 hevc_min_qp;
    247	u32 hevc_max_qp;
    248	u32 hevc_i_min_qp;
    249	u32 hevc_i_max_qp;
    250	u32 hevc_p_min_qp;
    251	u32 hevc_p_max_qp;
    252	u32 hevc_b_min_qp;
    253	u32 hevc_b_max_qp;
    254
    255	u32 vp8_min_qp;
    256	u32 vp8_max_qp;
    257
    258	u32 multi_slice_mode;
    259	u32 multi_slice_max_bytes;
    260	u32 multi_slice_max_mb;
    261
    262	u32 header_mode;
    263	bool aud_enable;
    264	u32 intra_refresh_type;
    265	u32 intra_refresh_period;
    266
    267	struct {
    268		u32 h264;
    269		u32 mpeg4;
    270		u32 hevc;
    271		u32 vp8;
    272		u32 vp9;
    273	} profile;
    274	struct {
    275		u32 h264;
    276		u32 mpeg4;
    277		u32 hevc;
    278		u32 vp9;
    279	} level;
    280
    281	u32 base_priority_id;
    282	u32 ltr_count;
    283	struct v4l2_ctrl_hdr10_cll_info cll;
    284	struct v4l2_ctrl_hdr10_mastering_display mastering;
    285};
    286
    287struct venus_buffer {
    288	struct vb2_v4l2_buffer vb;
    289	struct list_head list;
    290	dma_addr_t dma_addr;
    291	u32 size;
    292	struct list_head reg_list;
    293	u32 flags;
    294	struct list_head ref_list;
    295};
    296
    297struct clock_data {
    298	u32 core_id;
    299	unsigned long freq;
    300	unsigned long vpp_freq;
    301	unsigned long vsp_freq;
    302	unsigned long low_power_freq;
    303};
    304
    305#define to_venus_buffer(ptr)	container_of(ptr, struct venus_buffer, vb)
    306
    307enum venus_dec_state {
    308	VENUS_DEC_STATE_DEINIT		= 0,
    309	VENUS_DEC_STATE_INIT		= 1,
    310	VENUS_DEC_STATE_CAPTURE_SETUP	= 2,
    311	VENUS_DEC_STATE_STOPPED		= 3,
    312	VENUS_DEC_STATE_SEEK		= 4,
    313	VENUS_DEC_STATE_DRAIN		= 5,
    314	VENUS_DEC_STATE_DECODING	= 6,
    315	VENUS_DEC_STATE_DRC		= 7,
    316};
    317
    318struct venus_ts_metadata {
    319	bool used;
    320	u64 ts_ns;
    321	u64 ts_us;
    322	u32 flags;
    323	struct v4l2_timecode tc;
    324};
    325
    326enum venus_inst_modes {
    327	VENUS_LOW_POWER = BIT(0),
    328};
    329
    330/**
    331 * struct venus_inst - holds per instance parameters
    332 *
    333 * @list:	used for attach an instance to the core
    334 * @lock:	instance lock
    335 * @core:	a reference to the core struct
    336 * @clk_data:	clock data per core ID
    337 * @dpbbufs:	a list of decoded picture buffers
    338 * @internalbufs:	a list of internal bufferes
    339 * @registeredbufs:	a list of registered capture bufferes
    340 * @delayed_process:	a list of delayed buffers
    341 * @delayed_process_work:	a work_struct for process delayed buffers
    342 * @nonblock:		nonblocking flag
    343 * @ctrl_handler:	v4l control handler
    344 * @controls:	a union of decoder and encoder control parameters
    345 * @fh:	 a holder of v4l file handle structure
    346 * @streamon_cap: stream on flag for capture queue
    347 * @streamon_out: stream on flag for output queue
    348 * @width:	current capture width
    349 * @height:	current capture height
    350 * @crop:	current crop rectangle
    351 * @fw_min_cnt:	 firmware minimum buffer count
    352 * @out_width:	current output width
    353 * @out_height:	current output height
    354 * @colorspace:	current color space
    355 * @ycbcr_enc:	current YCbCr encoding
    356 * @quantization:	current quantization
    357 * @xfer_func:	current xfer function
    358 * @codec_state:	current codec API state (see DEC/ENC_STATE_)
    359 * @reconf_wait:	wait queue for resolution change event
    360 * @subscriptions:	used to hold current events subscriptions
    361 * @buf_count:		used to count number of buffers (reqbuf(0))
    362 * @tss:		timestamp metadata
    363 * @payloads:		cache plane payload to use it for clock/BW scaling
    364 * @fps:		holds current FPS
    365 * @timeperframe:	holds current time per frame structure
    366 * @fmt_out:	a reference to output format structure
    367 * @fmt_cap:	a reference to capture format structure
    368 * @num_input_bufs:	holds number of input buffers
    369 * @num_output_bufs:	holds number of output buffers
    370 * @input_buf_size:	holds input buffer size
    371 * @output_buf_size:	holds output buffer size
    372 * @output2_buf_size:	holds secondary decoder output buffer size
    373 * @dpb_buftype:	decoded picture buffer type
    374 * @dpb_fmt:		decoded picture buffer raw format
    375 * @opb_buftype:	output picture buffer type
    376 * @opb_fmt:		output picture buffer raw format
    377 * @reconfig:	a flag raised by decoder when the stream resolution changed
    378 * @hfi_codec:		current codec for this instance in HFI space
    379 * @sequence_cap:	a sequence counter for capture queue
    380 * @sequence_out:	a sequence counter for output queue
    381 * @m2m_dev:	a reference to m2m device structure
    382 * @m2m_ctx:	a reference to m2m context structure
    383 * @state:	current state of the instance
    384 * @done:	a completion for sync HFI operation
    385 * @error:	an error returned during last HFI sync operation
    386 * @session_error:	a flag rised by HFI interface in case of session error
    387 * @ops:		HFI operations
    388 * @priv:	a private for HFI operations callbacks
    389 * @session_type:	the type of the session (decoder or encoder)
    390 * @hprop:	a union used as a holder by get property
    391 * @core_acquired:	the Core has been acquired
    392 * @bit_depth:		current bitstream bit-depth
    393 * @pic_struct:		bitstream progressive vs interlaced
    394 * @next_buf_last: a flag to mark next queued capture buffer as last
    395 * @drain_active:	Drain sequence is in progress
    396 * @flags:	bitmask flags describing current instance mode
    397 * @dpb_ids:	DPB buffer ID's
    398 */
    399struct venus_inst {
    400	struct list_head list;
    401	struct mutex lock;
    402	struct venus_core *core;
    403	struct clock_data clk_data;
    404	struct list_head dpbbufs;
    405	struct list_head internalbufs;
    406	struct list_head registeredbufs;
    407	struct list_head delayed_process;
    408	struct work_struct delayed_process_work;
    409	bool nonblock;
    410
    411	struct v4l2_ctrl_handler ctrl_handler;
    412	union {
    413		struct vdec_controls dec;
    414		struct venc_controls enc;
    415	} controls;
    416	struct v4l2_fh fh;
    417	unsigned int streamon_cap, streamon_out;
    418	u32 width;
    419	u32 height;
    420	struct v4l2_rect crop;
    421	u32 fw_min_cnt;
    422	u32 out_width;
    423	u32 out_height;
    424	u32 colorspace;
    425	u8 ycbcr_enc;
    426	u8 quantization;
    427	u8 xfer_func;
    428	enum venus_dec_state codec_state;
    429	wait_queue_head_t reconf_wait;
    430	unsigned int subscriptions;
    431	int buf_count;
    432	struct venus_ts_metadata tss[VIDEO_MAX_FRAME];
    433	unsigned long payloads[VIDEO_MAX_FRAME];
    434	u64 fps;
    435	struct v4l2_fract timeperframe;
    436	const struct venus_format *fmt_out;
    437	const struct venus_format *fmt_cap;
    438	unsigned int num_input_bufs;
    439	unsigned int num_output_bufs;
    440	unsigned int input_buf_size;
    441	unsigned int output_buf_size;
    442	unsigned int output2_buf_size;
    443	u32 dpb_buftype;
    444	u32 dpb_fmt;
    445	u32 opb_buftype;
    446	u32 opb_fmt;
    447	bool reconfig;
    448	u32 hfi_codec;
    449	u32 sequence_cap;
    450	u32 sequence_out;
    451	struct v4l2_m2m_dev *m2m_dev;
    452	struct v4l2_m2m_ctx *m2m_ctx;
    453	unsigned int state;
    454	struct completion done;
    455	unsigned int error;
    456	bool session_error;
    457	const struct hfi_inst_ops *ops;
    458	u32 session_type;
    459	union hfi_get_property hprop;
    460	unsigned int core_acquired: 1;
    461	unsigned int bit_depth;
    462	unsigned int pic_struct;
    463	bool next_buf_last;
    464	bool drain_active;
    465	enum venus_inst_modes flags;
    466	struct ida dpb_ids;
    467};
    468
    469#define IS_V1(core)	((core)->res->hfi_version == HFI_VERSION_1XX)
    470#define IS_V3(core)	((core)->res->hfi_version == HFI_VERSION_3XX)
    471#define IS_V4(core)	((core)->res->hfi_version == HFI_VERSION_4XX)
    472#define IS_V6(core)	((core)->res->hfi_version == HFI_VERSION_6XX)
    473
    474#define ctrl_to_inst(ctrl)	\
    475	container_of((ctrl)->handler, struct venus_inst, ctrl_handler)
    476
    477static inline struct venus_inst *to_inst(struct file *filp)
    478{
    479	return container_of(filp->private_data, struct venus_inst, fh);
    480}
    481
    482static inline void *to_hfi_priv(struct venus_core *core)
    483{
    484	return core->priv;
    485}
    486
    487static inline struct hfi_plat_caps *
    488venus_caps_by_codec(struct venus_core *core, u32 codec, u32 domain)
    489{
    490	unsigned int c;
    491
    492	for (c = 0; c < core->codecs_count; c++) {
    493		if (core->caps[c].codec == codec &&
    494		    core->caps[c].domain == domain)
    495			return &core->caps[c];
    496	}
    497
    498	return NULL;
    499}
    500
    501#endif