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

vsp1_entity.h (6427B)


      1/* SPDX-License-Identifier: GPL-2.0+ */
      2/*
      3 * vsp1_entity.h  --  R-Car VSP1 Base Entity
      4 *
      5 * Copyright (C) 2013-2014 Renesas Electronics Corporation
      6 *
      7 * Contact: Laurent Pinchart (laurent.pinchart@ideasonboard.com)
      8 */
      9#ifndef __VSP1_ENTITY_H__
     10#define __VSP1_ENTITY_H__
     11
     12#include <linux/list.h>
     13#include <linux/mutex.h>
     14
     15#include <media/v4l2-subdev.h>
     16
     17struct vsp1_device;
     18struct vsp1_dl_body;
     19struct vsp1_dl_list;
     20struct vsp1_pipeline;
     21struct vsp1_partition;
     22struct vsp1_partition_window;
     23
     24enum vsp1_entity_type {
     25	VSP1_ENTITY_BRS,
     26	VSP1_ENTITY_BRU,
     27	VSP1_ENTITY_CLU,
     28	VSP1_ENTITY_HGO,
     29	VSP1_ENTITY_HGT,
     30	VSP1_ENTITY_HSI,
     31	VSP1_ENTITY_HST,
     32	VSP1_ENTITY_LIF,
     33	VSP1_ENTITY_LUT,
     34	VSP1_ENTITY_RPF,
     35	VSP1_ENTITY_SRU,
     36	VSP1_ENTITY_UDS,
     37	VSP1_ENTITY_UIF,
     38	VSP1_ENTITY_WPF,
     39};
     40
     41#define VSP1_ENTITY_MAX_INPUTS		5	/* For the BRU */
     42
     43/*
     44 * struct vsp1_route - Entity routing configuration
     45 * @type: Entity type this routing entry is associated with
     46 * @index: Entity index this routing entry is associated with
     47 * @reg: Output routing configuration register
     48 * @inputs: Target node value for each input
     49 * @output: Target node value for entity output
     50 *
     51 * Each $vsp1_route entry describes routing configuration for the entity
     52 * specified by the entry's @type and @index. @reg indicates the register that
     53 * holds output routing configuration for the entity, and the @inputs array
     54 * store the target node value for each input of the entity. The @output field
     55 * stores the target node value of the entity output when used as a source for
     56 * histogram generation.
     57 */
     58struct vsp1_route {
     59	enum vsp1_entity_type type;
     60	unsigned int index;
     61	unsigned int reg;
     62	unsigned int inputs[VSP1_ENTITY_MAX_INPUTS];
     63	unsigned int output;
     64};
     65
     66/**
     67 * struct vsp1_entity_operations - Entity operations
     68 * @destroy:	Destroy the entity.
     69 * @configure_stream:	Setup the hardware parameters for the stream which do
     70 *			not vary between frames (pipeline, formats). Note that
     71 *			the vsp1_dl_list argument is only valid for display
     72 *			pipeline and will be NULL for mem-to-mem pipelines.
     73 * @configure_frame:	Configure the runtime parameters for each frame.
     74 * @configure_partition: Configure partition specific parameters.
     75 * @max_width:	Return the max supported width of data that the entity can
     76 *		process in a single operation.
     77 * @partition:	Process the partition construction based on this entity's
     78 *		configuration.
     79 */
     80struct vsp1_entity_operations {
     81	void (*destroy)(struct vsp1_entity *);
     82	void (*configure_stream)(struct vsp1_entity *, struct vsp1_pipeline *,
     83				 struct vsp1_dl_list *, struct vsp1_dl_body *);
     84	void (*configure_frame)(struct vsp1_entity *, struct vsp1_pipeline *,
     85				struct vsp1_dl_list *, struct vsp1_dl_body *);
     86	void (*configure_partition)(struct vsp1_entity *,
     87				    struct vsp1_pipeline *,
     88				    struct vsp1_dl_list *,
     89				    struct vsp1_dl_body *);
     90	unsigned int (*max_width)(struct vsp1_entity *, struct vsp1_pipeline *);
     91	void (*partition)(struct vsp1_entity *, struct vsp1_pipeline *,
     92			  struct vsp1_partition *, unsigned int,
     93			  struct vsp1_partition_window *);
     94};
     95
     96struct vsp1_entity {
     97	struct vsp1_device *vsp1;
     98
     99	const struct vsp1_entity_operations *ops;
    100
    101	enum vsp1_entity_type type;
    102	unsigned int index;
    103	const struct vsp1_route *route;
    104
    105	struct vsp1_pipeline *pipe;
    106
    107	struct list_head list_dev;
    108	struct list_head list_pipe;
    109
    110	struct media_pad *pads;
    111	unsigned int source_pad;
    112
    113	struct vsp1_entity **sources;
    114	struct vsp1_entity *sink;
    115	unsigned int sink_pad;
    116
    117	struct v4l2_subdev subdev;
    118	struct v4l2_subdev_state *config;
    119
    120	struct mutex lock;	/* Protects the pad config */
    121};
    122
    123static inline struct vsp1_entity *to_vsp1_entity(struct v4l2_subdev *subdev)
    124{
    125	return container_of(subdev, struct vsp1_entity, subdev);
    126}
    127
    128int vsp1_entity_init(struct vsp1_device *vsp1, struct vsp1_entity *entity,
    129		     const char *name, unsigned int num_pads,
    130		     const struct v4l2_subdev_ops *ops, u32 function);
    131void vsp1_entity_destroy(struct vsp1_entity *entity);
    132
    133extern const struct v4l2_subdev_internal_ops vsp1_subdev_internal_ops;
    134
    135int vsp1_entity_link_setup(struct media_entity *entity,
    136			   const struct media_pad *local,
    137			   const struct media_pad *remote, u32 flags);
    138
    139struct v4l2_subdev_state *
    140vsp1_entity_get_pad_config(struct vsp1_entity *entity,
    141			   struct v4l2_subdev_state *sd_state,
    142			   enum v4l2_subdev_format_whence which);
    143struct v4l2_mbus_framefmt *
    144vsp1_entity_get_pad_format(struct vsp1_entity *entity,
    145			   struct v4l2_subdev_state *sd_state,
    146			   unsigned int pad);
    147struct v4l2_rect *
    148vsp1_entity_get_pad_selection(struct vsp1_entity *entity,
    149			      struct v4l2_subdev_state *sd_state,
    150			      unsigned int pad, unsigned int target);
    151int vsp1_entity_init_cfg(struct v4l2_subdev *subdev,
    152			 struct v4l2_subdev_state *sd_state);
    153
    154void vsp1_entity_route_setup(struct vsp1_entity *entity,
    155			     struct vsp1_pipeline *pipe,
    156			     struct vsp1_dl_body *dlb);
    157
    158void vsp1_entity_configure_stream(struct vsp1_entity *entity,
    159				  struct vsp1_pipeline *pipe,
    160				  struct vsp1_dl_list *dl,
    161				  struct vsp1_dl_body *dlb);
    162
    163void vsp1_entity_configure_frame(struct vsp1_entity *entity,
    164				 struct vsp1_pipeline *pipe,
    165				 struct vsp1_dl_list *dl,
    166				 struct vsp1_dl_body *dlb);
    167
    168void vsp1_entity_configure_partition(struct vsp1_entity *entity,
    169				     struct vsp1_pipeline *pipe,
    170				     struct vsp1_dl_list *dl,
    171				     struct vsp1_dl_body *dlb);
    172
    173struct media_pad *vsp1_entity_remote_pad(struct media_pad *pad);
    174
    175int vsp1_subdev_get_pad_format(struct v4l2_subdev *subdev,
    176			       struct v4l2_subdev_state *sd_state,
    177			       struct v4l2_subdev_format *fmt);
    178int vsp1_subdev_set_pad_format(struct v4l2_subdev *subdev,
    179			       struct v4l2_subdev_state *sd_state,
    180			       struct v4l2_subdev_format *fmt,
    181			       const unsigned int *codes, unsigned int ncodes,
    182			       unsigned int min_width, unsigned int min_height,
    183			       unsigned int max_width, unsigned int max_height);
    184int vsp1_subdev_enum_mbus_code(struct v4l2_subdev *subdev,
    185			       struct v4l2_subdev_state *sd_state,
    186			       struct v4l2_subdev_mbus_code_enum *code,
    187			       const unsigned int *codes, unsigned int ncodes);
    188int vsp1_subdev_enum_frame_size(struct v4l2_subdev *subdev,
    189				struct v4l2_subdev_state *sd_state,
    190				struct v4l2_subdev_frame_size_enum *fse,
    191				unsigned int min_w, unsigned int min_h,
    192				unsigned int max_w, unsigned int max_h);
    193
    194#endif /* __VSP1_ENTITY_H__ */