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

camss-vfe.h (5552B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 * camss-vfe.h
      4 *
      5 * Qualcomm MSM Camera Subsystem - VFE (Video Front End) Module
      6 *
      7 * Copyright (c) 2013-2015, The Linux Foundation. All rights reserved.
      8 * Copyright (C) 2015-2018 Linaro Ltd.
      9 */
     10#ifndef QC_MSM_CAMSS_VFE_H
     11#define QC_MSM_CAMSS_VFE_H
     12
     13#include <linux/clk.h>
     14#include <linux/spinlock_types.h>
     15#include <media/media-entity.h>
     16#include <media/v4l2-device.h>
     17#include <media/v4l2-subdev.h>
     18
     19#include "camss-video.h"
     20#include "camss-vfe-gen1.h"
     21
     22#define MSM_VFE_PAD_SINK 0
     23#define MSM_VFE_PAD_SRC 1
     24#define MSM_VFE_PADS_NUM 2
     25
     26#define MSM_VFE_IMAGE_MASTERS_NUM 7
     27#define MSM_VFE_COMPOSITE_IRQ_NUM 4
     28
     29/* VFE halt timeout */
     30#define VFE_HALT_TIMEOUT_MS 100
     31/* Frame drop value. VAL + UPDATES - 1 should not exceed 31 */
     32#define VFE_FRAME_DROP_VAL 30
     33
     34#define vfe_line_array(ptr_line)	\
     35	((const struct vfe_line (*)[]) &(ptr_line)[-(ptr_line)->id])
     36
     37#define to_vfe(ptr_line)	\
     38	container_of(vfe_line_array(ptr_line), struct vfe_device, line)
     39
     40enum vfe_output_state {
     41	VFE_OUTPUT_OFF,
     42	VFE_OUTPUT_RESERVED,
     43	VFE_OUTPUT_SINGLE,
     44	VFE_OUTPUT_CONTINUOUS,
     45	VFE_OUTPUT_IDLE,
     46	VFE_OUTPUT_STOPPING,
     47	VFE_OUTPUT_ON,
     48};
     49
     50enum vfe_line_id {
     51	VFE_LINE_NONE = -1,
     52	VFE_LINE_RDI0 = 0,
     53	VFE_LINE_RDI1 = 1,
     54	VFE_LINE_RDI2 = 2,
     55	VFE_LINE_NUM_GEN2 = 3,
     56	VFE_LINE_PIX = 3,
     57	VFE_LINE_NUM_GEN1 = 4,
     58	VFE_LINE_NUM_MAX = 4
     59};
     60
     61struct vfe_output {
     62	u8 wm_num;
     63	u8 wm_idx[3];
     64
     65	struct camss_buffer *buf[2];
     66	struct camss_buffer *last_buffer;
     67	struct list_head pending_bufs;
     68
     69	unsigned int drop_update_idx;
     70
     71	union {
     72		struct {
     73			int active_buf;
     74			int wait_sof;
     75		} gen1;
     76		struct {
     77			int active_num;
     78		} gen2;
     79	};
     80	enum vfe_output_state state;
     81	unsigned int sequence;
     82
     83	int wait_reg_update;
     84	struct completion sof;
     85	struct completion reg_update;
     86};
     87
     88struct vfe_line {
     89	enum vfe_line_id id;
     90	struct v4l2_subdev subdev;
     91	struct media_pad pads[MSM_VFE_PADS_NUM];
     92	struct v4l2_mbus_framefmt fmt[MSM_VFE_PADS_NUM];
     93	struct v4l2_rect compose;
     94	struct v4l2_rect crop;
     95	struct camss_video video_out;
     96	struct vfe_output output;
     97	const struct vfe_format *formats;
     98	unsigned int nformats;
     99};
    100
    101struct vfe_device;
    102
    103struct vfe_hw_ops {
    104	void (*enable_irq_common)(struct vfe_device *vfe);
    105	void (*global_reset)(struct vfe_device *vfe);
    106	u32 (*hw_version)(struct vfe_device *vfe);
    107	irqreturn_t (*isr)(int irq, void *dev);
    108	void (*isr_read)(struct vfe_device *vfe, u32 *value0, u32 *value1);
    109	void (*pm_domain_off)(struct vfe_device *vfe);
    110	int (*pm_domain_on)(struct vfe_device *vfe);
    111	void (*reg_update)(struct vfe_device *vfe, enum vfe_line_id line_id);
    112	void (*reg_update_clear)(struct vfe_device *vfe,
    113				 enum vfe_line_id line_id);
    114	void (*subdev_init)(struct device *dev, struct vfe_device *vfe);
    115	int (*vfe_disable)(struct vfe_line *line);
    116	int (*vfe_enable)(struct vfe_line *line);
    117	int (*vfe_halt)(struct vfe_device *vfe);
    118	void (*violation_read)(struct vfe_device *vfe);
    119};
    120
    121struct vfe_isr_ops {
    122	void (*reset_ack)(struct vfe_device *vfe);
    123	void (*halt_ack)(struct vfe_device *vfe);
    124	void (*reg_update)(struct vfe_device *vfe, enum vfe_line_id line_id);
    125	void (*sof)(struct vfe_device *vfe, enum vfe_line_id line_id);
    126	void (*comp_done)(struct vfe_device *vfe, u8 comp);
    127	void (*wm_done)(struct vfe_device *vfe, u8 wm);
    128};
    129
    130struct vfe_device {
    131	struct camss *camss;
    132	u8 id;
    133	void __iomem *base;
    134	u32 irq;
    135	char irq_name[30];
    136	struct camss_clock *clock;
    137	int nclocks;
    138	struct completion reset_complete;
    139	struct completion halt_complete;
    140	struct mutex power_lock;
    141	int power_count;
    142	struct mutex stream_lock;
    143	int stream_count;
    144	spinlock_t output_lock;
    145	enum vfe_line_id wm_output_map[MSM_VFE_IMAGE_MASTERS_NUM];
    146	struct vfe_line line[VFE_LINE_NUM_MAX];
    147	u8 line_num;
    148	u32 reg_update;
    149	u8 was_streaming;
    150	const struct vfe_hw_ops *ops;
    151	const struct vfe_hw_ops_gen1 *ops_gen1;
    152	struct vfe_isr_ops isr_ops;
    153	struct camss_video_ops video_ops;
    154};
    155
    156struct resources;
    157
    158int msm_vfe_subdev_init(struct camss *camss, struct vfe_device *vfe,
    159			const struct resources *res, u8 id);
    160
    161int msm_vfe_register_entities(struct vfe_device *vfe,
    162			      struct v4l2_device *v4l2_dev);
    163
    164void msm_vfe_unregister_entities(struct vfe_device *vfe);
    165
    166void msm_vfe_get_vfe_id(struct media_entity *entity, u8 *id);
    167void msm_vfe_get_vfe_line_id(struct media_entity *entity, enum vfe_line_id *id);
    168
    169/*
    170 * vfe_buf_add_pending - Add output buffer to list of pending
    171 * @output: VFE output
    172 * @buffer: Video buffer
    173 */
    174void vfe_buf_add_pending(struct vfe_output *output, struct camss_buffer *buffer);
    175
    176struct camss_buffer *vfe_buf_get_pending(struct vfe_output *output);
    177
    178int vfe_flush_buffers(struct camss_video *vid, enum vb2_buffer_state state);
    179
    180/*
    181 * vfe_isr_comp_done - Process composite image done interrupt
    182 * @vfe: VFE Device
    183 * @comp: Composite image id
    184 */
    185void vfe_isr_comp_done(struct vfe_device *vfe, u8 comp);
    186
    187void vfe_isr_reset_ack(struct vfe_device *vfe);
    188int vfe_put_output(struct vfe_line *line);
    189int vfe_release_wm(struct vfe_device *vfe, u8 wm);
    190int vfe_reserve_wm(struct vfe_device *vfe, enum vfe_line_id line_id);
    191
    192/*
    193 * vfe_reset - Trigger reset on VFE module and wait to complete
    194 * @vfe: VFE device
    195 *
    196 * Return 0 on success or a negative error code otherwise
    197 */
    198int vfe_reset(struct vfe_device *vfe);
    199
    200extern const struct vfe_hw_ops vfe_ops_4_1;
    201extern const struct vfe_hw_ops vfe_ops_4_7;
    202extern const struct vfe_hw_ops vfe_ops_4_8;
    203extern const struct vfe_hw_ops vfe_ops_170;
    204extern const struct vfe_hw_ops vfe_ops_480;
    205
    206int vfe_get(struct vfe_device *vfe);
    207void vfe_put(struct vfe_device *vfe);
    208
    209#endif /* QC_MSM_CAMSS_VFE_H */