cregit-Linux how code gets into the kernel

Release 4.13 drivers/media/platform/qcom/venus/core.h

/*
 * Copyright (c) 2012-2016, The Linux Foundation. All rights reserved.
 * Copyright (C) 2017 Linaro Ltd.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
 * only version 2 as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 */

#ifndef __VENUS_CORE_H_

#define __VENUS_CORE_H_

#include <linux/list.h>
#include <media/videobuf2-v4l2.h>
#include <media/v4l2-ctrls.h>
#include <media/v4l2-device.h>

#include "hfi.h"


#define VIDC_CLKS_NUM_MAX	4


struct freq_tbl {
	
unsigned int load;
	
unsigned long freq;
};


struct reg_val {
	
u32 reg;
	
u32 value;
};


struct venus_resources {
	
u64 dma_mask;
	
const struct freq_tbl *freq_tbl;
	
unsigned int freq_tbl_size;
	
const struct reg_val *reg_tbl;
	
unsigned int reg_tbl_size;
	
const char * const clks[VIDC_CLKS_NUM_MAX];
	
unsigned int clks_num;
	
enum hfi_version hfi_version;
	
u32 max_load;
	
unsigned int vmem_id;
	
u32 vmem_size;
	
u32 vmem_addr;
	
const char *fwname;
};


struct venus_format {
	
u32 pixfmt;
	
unsigned int num_planes;
	
u32 type;
};

/**
 * struct venus_core - holds core parameters valid for all instances
 *
 * @base:       IO memory base address
 * @irq:                Venus irq
 * @clks:       an array of struct clk pointers
 * @core0_clk:  a struct clk pointer for core0
 * @core1_clk:  a struct clk pointer for core1
 * @vdev_dec:   a reference to video device structure for decoder instances
 * @vdev_enc:   a reference to video device structure for encoder instances
 * @v4l2_dev:   a holder for v4l2 device structure
 * @res:                a reference to venus resources structure
 * @dev:                convenience struct device pointer
 * @dev_dec:    convenience struct device pointer for decoder device
 * @dev_enc:    convenience struct device pointer for encoder device
 * @lock:       a lock for this strucure
 * @instances:  a list_head of all instances
 * @insts_count:        num of instances
 * @state:      the state of the venus core
 * @done:       a completion for sync HFI operations
 * @error:      an error returned during last HFI sync operations
 * @sys_error:  an error flag that signal system error event
 * @core_ops:   the core operations
 * @enc_codecs: encoders supported by this core
 * @dec_codecs: decoders supported by this core
 * @max_sessions_supported:     holds the maximum number of sessions
 * @core_caps:  core capabilities
 * @priv:       a private filed for HFI operations
 * @ops:                the core HFI operations
 * @work:       a delayed work for handling system fatal error
 */

struct venus_core {
	
void __iomem *base;
	
int irq;
	
struct clk *clks[VIDC_CLKS_NUM_MAX];
	
struct clk *core0_clk;
	
struct clk *core1_clk;
	
struct video_device *vdev_dec;
	
struct video_device *vdev_enc;
	
struct v4l2_device v4l2_dev;
	
const struct venus_resources *res;
	
struct device *dev;
	
struct device *dev_dec;
	
struct device *dev_enc;
	
struct mutex lock;
	
struct list_head instances;
	
atomic_t insts_count;
	
unsigned int state;
	
struct completion done;
	
unsigned int error;
	
bool sys_error;
	
const struct hfi_core_ops *core_ops;
	
u32 enc_codecs;
	
u32 dec_codecs;
	
unsigned int max_sessions_supported;

#define ENC_ROTATION_CAPABILITY		0x1

#define ENC_SCALING_CAPABILITY		0x2

#define ENC_DEINTERLACE_CAPABILITY	0x4

#define DEC_MULTI_STREAM_CAPABILITY	0x8
	
unsigned int core_caps;
	
void *priv;
	
const struct hfi_ops *ops;
	
struct delayed_work work;
};


struct vdec_controls {
	
u32 post_loop_deb_mode;
	
u32 profile;
	
u32 level;
};


struct venc_controls {
	
u16 gop_size;
	
u32 num_p_frames;
	
u32 num_b_frames;
	
u32 bitrate_mode;
	
u32 bitrate;
	
u32 bitrate_peak;

	
u32 h264_i_period;
	
u32 h264_entropy_mode;
	
u32 h264_i_qp;
	
u32 h264_p_qp;
	
u32 h264_b_qp;
	
u32 h264_min_qp;
	
u32 h264_max_qp;
	
u32 h264_loop_filter_mode;
	
u32 h264_loop_filter_alpha;
	
u32 h264_loop_filter_beta;

	
u32 vp8_min_qp;
	
u32 vp8_max_qp;

	
u32 multi_slice_mode;
	
u32 multi_slice_max_bytes;
	
u32 multi_slice_max_mb;

	
u32 header_mode;

	struct {
		
u32 mpeg4;
		
u32 h264;
		
u32 vpx;
	
} profile;
	struct {
		
u32 mpeg4;
		
u32 h264;
	
} level;
};


struct venus_buffer {
	
struct vb2_v4l2_buffer vb;
	
struct list_head list;
	
dma_addr_t dma_addr;
	
u32 size;
	
struct list_head reg_list;
	
u32 flags;
	
struct list_head ref_list;
};


#define to_venus_buffer(ptr)	container_of(ptr, struct venus_buffer, vb)

/**
 * struct venus_inst - holds per instance paramerters
 *
 * @list:       used for attach an instance to the core
 * @lock:       instance lock
 * @core:       a reference to the core struct
 * @internalbufs:       a list of internal bufferes
 * @registeredbufs:     a list of registered capture bufferes
 * @delayed_process     a list of delayed buffers
 * @delayed_process_work:       a work_struct for process delayed buffers
 * @ctrl_handler:       v4l control handler
 * @controls:   a union of decoder and encoder control parameters
 * @fh:  a holder of v4l file handle structure
 * @streamon_cap: stream on flag for capture queue
 * @streamon_out: stream on flag for output queue
 * @cmd_stop:   a flag to signal encoder/decoder commands
 * @width:      current capture width
 * @height:     current capture height
 * @out_width:  current output width
 * @out_height: current output height
 * @colorspace: current color space
 * @quantization:       current quantization
 * @xfer_func:  current xfer function
 * @fps:                holds current FPS
 * @timeperframe:       holds current time per frame structure
 * @fmt_out:    a reference to output format structure
 * @fmt_cap:    a reference to capture format structure
 * @num_input_bufs:     holds number of input buffers
 * @num_output_bufs:    holds number of output buffers
 * @input_buf_size      holds input buffer size
 * @output_buf_size:    holds output buffer size
 * @reconfig:   a flag raised by decoder when the stream resolution changed
 * @reconfig_width:     holds the new width
 * @reconfig_height:    holds the new height
 * @sequence_cap:       a sequence counter for capture queue
 * @sequence_out:       a sequence counter for output queue
 * @m2m_dev:    a reference to m2m device structure
 * @m2m_ctx:    a reference to m2m context structure
 * @state:      current state of the instance
 * @done:       a completion for sync HFI operation
 * @error:      an error returned during last HFI sync operation
 * @session_error:      a flag rised by HFI interface in case of session error
 * @ops:                HFI operations
 * @priv:       a private for HFI operations callbacks
 * @session_type:       the type of the session (decoder or encoder)
 * @hprop:      a union used as a holder by get property
 * @cap_width:  width capability
 * @cap_height: height capability
 * @cap_mbs_per_frame:  macroblocks per frame capability
 * @cap_mbs_per_sec:    macroblocks per second capability
 * @cap_framerate:      framerate capability
 * @cap_scale_x:                horizontal scaling capability
 * @cap_scale_y:                vertical scaling capability
 * @cap_bitrate:                bitrate capability
 * @cap_hier_p:         hier capability
 * @cap_ltr_count:      LTR count capability
 * @cap_secure_output2_threshold: secure OUTPUT2 threshold capability
 * @cap_bufs_mode_static:       buffers allocation mode capability
 * @cap_bufs_mode_dynamic:      buffers allocation mode capability
 * @pl_count:   count of supported profiles/levels
 * @pl:         supported profiles/levels
 * @bufreq:     holds buffer requirements
 */

struct venus_inst {
	
struct list_head list;
	
struct mutex lock;
	
struct venus_core *core;
	
struct list_head internalbufs;
	
struct list_head registeredbufs;
	
struct list_head delayed_process;
	
struct work_struct delayed_process_work;

	
struct v4l2_ctrl_handler ctrl_handler;
	union {
		
struct vdec_controls dec;
		
struct venc_controls enc;
	
} controls;
	
struct v4l2_fh fh;
	

unsigned int streamon_cap, streamon_out;
	
bool cmd_stop;
	
u32 width;
	
u32 height;
	
u32 out_width;
	
u32 out_height;
	
u32 colorspace;
	
u8 ycbcr_enc;
	
u8 quantization;
	
u8 xfer_func;
	
u64 fps;
	
struct v4l2_fract timeperframe;
	
const struct venus_format *fmt_out;
	
const struct venus_format *fmt_cap;
	
unsigned int num_input_bufs;
	
unsigned int num_output_bufs;
	
unsigned int input_buf_size;
	
unsigned int output_buf_size;
	
bool reconfig;
	
u32 reconfig_width;
	
u32 reconfig_height;
	
u32 sequence_cap;
	
u32 sequence_out;
	
struct v4l2_m2m_dev *m2m_dev;
	
struct v4l2_m2m_ctx *m2m_ctx;
	
unsigned int state;
	
struct completion done;
	
unsigned int error;
	
bool session_error;
	
const struct hfi_inst_ops *ops;
	
u32 session_type;
	
union hfi_get_property hprop;
	
struct hfi_capability cap_width;
	
struct hfi_capability cap_height;
	
struct hfi_capability cap_mbs_per_frame;
	
struct hfi_capability cap_mbs_per_sec;
	
struct hfi_capability cap_framerate;
	
struct hfi_capability cap_scale_x;
	
struct hfi_capability cap_scale_y;
	
struct hfi_capability cap_bitrate;
	
struct hfi_capability cap_hier_p;
	
struct hfi_capability cap_ltr_count;
	
struct hfi_capability cap_secure_output2_threshold;
	
bool cap_bufs_mode_static;
	
bool cap_bufs_mode_dynamic;
	
unsigned int pl_count;
	
struct hfi_profile_level pl[HFI_MAX_PROFILE_COUNT];
	
struct hfi_buffer_requirements bufreq[HFI_BUFFER_TYPE_MAX];
};


#define ctrl_to_inst(ctrl)	\
	container_of((ctrl)->handler, struct venus_inst, ctrl_handler)


static inline struct venus_inst *to_inst(struct file *filp) { return container_of(filp->private_data, struct venus_inst, fh); }

Contributors

PersonTokensPropCommitsCommitProp
Stanimir Varbanov27100.00%1100.00%
Total27100.00%1100.00%


static inline void *to_hfi_priv(struct venus_core *core) { return core->priv; }

Contributors

PersonTokensPropCommitsCommitProp
Stanimir Varbanov18100.00%1100.00%
Total18100.00%1100.00%

#endif

Overall Contributors

PersonTokensPropCommitsCommitProp
Stanimir Varbanov718100.00%2100.00%
Total718100.00%2100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.