142 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			142 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* SPDX-License-Identifier: GPL-2.0-only */
 | 
						|
/* Copyright (C) 2013--2024 Intel Corporation */
 | 
						|
 | 
						|
#ifndef IPU6_ISYS_VIDEO_H
 | 
						|
#define IPU6_ISYS_VIDEO_H
 | 
						|
 | 
						|
#include <linux/atomic.h>
 | 
						|
#include <linux/completion.h>
 | 
						|
#include <linux/container_of.h>
 | 
						|
#include <linux/list.h>
 | 
						|
#include <linux/mutex.h>
 | 
						|
 | 
						|
#include <media/media-entity.h>
 | 
						|
#include <media/v4l2-dev.h>
 | 
						|
 | 
						|
#include "ipu6-isys-queue.h"
 | 
						|
 | 
						|
#define IPU6_ISYS_OUTPUT_PINS 11
 | 
						|
#define IPU6_ISYS_MAX_PARALLEL_SOF 2
 | 
						|
 | 
						|
struct file;
 | 
						|
struct ipu6_isys;
 | 
						|
struct ipu6_isys_csi2;
 | 
						|
struct ipu6_isys_subdev;
 | 
						|
 | 
						|
struct ipu6_isys_pixelformat {
 | 
						|
	u32 pixelformat;
 | 
						|
	u32 bpp;
 | 
						|
	u32 bpp_packed;
 | 
						|
	u32 code;
 | 
						|
	u32 css_pixelformat;
 | 
						|
	bool is_meta;
 | 
						|
};
 | 
						|
 | 
						|
struct sequence_info {
 | 
						|
	unsigned int sequence;
 | 
						|
	u64 timestamp;
 | 
						|
};
 | 
						|
 | 
						|
struct output_pin_data {
 | 
						|
	void (*pin_ready)(struct ipu6_isys_stream *stream,
 | 
						|
			  struct ipu6_fw_isys_resp_info_abi *info);
 | 
						|
	struct ipu6_isys_queue *aq;
 | 
						|
};
 | 
						|
 | 
						|
/*
 | 
						|
 * Align with firmware stream. Each stream represents a CSI virtual channel.
 | 
						|
 * May map to multiple video devices
 | 
						|
 */
 | 
						|
struct ipu6_isys_stream {
 | 
						|
	struct mutex mutex;
 | 
						|
	struct media_entity *source_entity;
 | 
						|
	atomic_t sequence;
 | 
						|
	unsigned int seq_index;
 | 
						|
	struct sequence_info seq[IPU6_ISYS_MAX_PARALLEL_SOF];
 | 
						|
	int stream_source;
 | 
						|
	int stream_handle;
 | 
						|
	unsigned int nr_output_pins;
 | 
						|
	struct ipu6_isys_subdev *asd;
 | 
						|
 | 
						|
	int nr_queues;	/* Number of capture queues */
 | 
						|
	int nr_streaming;
 | 
						|
	int streaming;	/* Has streaming been really started? */
 | 
						|
	struct list_head queues;
 | 
						|
	struct completion stream_open_completion;
 | 
						|
	struct completion stream_close_completion;
 | 
						|
	struct completion stream_start_completion;
 | 
						|
	struct completion stream_stop_completion;
 | 
						|
	struct ipu6_isys *isys;
 | 
						|
 | 
						|
	struct output_pin_data output_pins[IPU6_ISYS_OUTPUT_PINS];
 | 
						|
	int error;
 | 
						|
	u8 vc;
 | 
						|
};
 | 
						|
 | 
						|
struct video_stream_watermark {
 | 
						|
	u32 width;
 | 
						|
	u32 height;
 | 
						|
	u32 hblank;
 | 
						|
	u32 frame_rate;
 | 
						|
	u64 pixel_rate;
 | 
						|
	u64 stream_data_rate;
 | 
						|
	u16 sram_gran_shift;
 | 
						|
	u16 sram_gran_size;
 | 
						|
	struct list_head stream_node;
 | 
						|
};
 | 
						|
 | 
						|
struct ipu6_isys_video {
 | 
						|
	struct ipu6_isys_queue aq;
 | 
						|
	/* Serialise access to other fields in the struct. */
 | 
						|
	struct mutex mutex;
 | 
						|
	struct media_pad pad;
 | 
						|
	struct video_device vdev;
 | 
						|
	struct v4l2_pix_format pix_fmt;
 | 
						|
	struct v4l2_meta_format meta_fmt;
 | 
						|
	struct ipu6_isys *isys;
 | 
						|
	struct ipu6_isys_csi2 *csi2;
 | 
						|
	struct ipu6_isys_stream *stream;
 | 
						|
	unsigned int streaming;
 | 
						|
	struct video_stream_watermark watermark;
 | 
						|
	u32 source_stream;
 | 
						|
	u8 vc;
 | 
						|
	u8 dt;
 | 
						|
};
 | 
						|
 | 
						|
#define ipu6_isys_queue_to_video(__aq) \
 | 
						|
	container_of(__aq, struct ipu6_isys_video, aq)
 | 
						|
 | 
						|
extern const struct ipu6_isys_pixelformat ipu6_isys_pfmts[];
 | 
						|
extern const struct ipu6_isys_pixelformat ipu6_isys_pfmts_packed[];
 | 
						|
 | 
						|
const struct ipu6_isys_pixelformat *
 | 
						|
ipu6_isys_get_isys_format(u32 pixelformat, u32 code);
 | 
						|
int ipu6_isys_video_prepare_stream(struct ipu6_isys_video *av,
 | 
						|
				   struct media_entity *source_entity,
 | 
						|
				   int nr_queues);
 | 
						|
int ipu6_isys_video_set_streaming(struct ipu6_isys_video *av, int state,
 | 
						|
				  struct ipu6_isys_buffer_list *bl);
 | 
						|
int ipu6_isys_fw_open(struct ipu6_isys *isys);
 | 
						|
void ipu6_isys_fw_close(struct ipu6_isys *isys);
 | 
						|
int ipu6_isys_setup_video(struct ipu6_isys_video *av,
 | 
						|
			  struct media_entity **source_entity, int *nr_queues);
 | 
						|
int ipu6_isys_video_init(struct ipu6_isys_video *av);
 | 
						|
void ipu6_isys_video_cleanup(struct ipu6_isys_video *av);
 | 
						|
void ipu6_isys_put_stream(struct ipu6_isys_stream *stream);
 | 
						|
struct ipu6_isys_stream *
 | 
						|
ipu6_isys_query_stream_by_handle(struct ipu6_isys *isys, u8 stream_handle);
 | 
						|
struct ipu6_isys_stream *
 | 
						|
ipu6_isys_query_stream_by_source(struct ipu6_isys *isys, int source, u8 vc);
 | 
						|
 | 
						|
void ipu6_isys_configure_stream_watermark(struct ipu6_isys_video *av,
 | 
						|
					  bool state);
 | 
						|
void ipu6_isys_update_stream_watermark(struct ipu6_isys_video *av, bool state);
 | 
						|
 | 
						|
u32 ipu6_isys_get_format(struct ipu6_isys_video *av);
 | 
						|
u32 ipu6_isys_get_data_size(struct ipu6_isys_video *av);
 | 
						|
u32 ipu6_isys_get_bytes_per_line(struct ipu6_isys_video *av);
 | 
						|
u32 ipu6_isys_get_frame_width(struct ipu6_isys_video *av);
 | 
						|
u32 ipu6_isys_get_frame_height(struct ipu6_isys_video *av);
 | 
						|
 | 
						|
#endif /* IPU6_ISYS_VIDEO_H */
 |