blob: 99be2989a088c7cd0e1c9c4b668ead2f40977cfd [file] [log] [blame]
/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright (C) 2013 - 2020 Intel Corporation */
#ifndef IPU_ISYS_QUEUE_H
#define IPU_ISYS_QUEUE_H
#include <linux/list.h>
#include <linux/spinlock.h>
#include <media/videobuf2-v4l2.h>
#include "ipu-isys-media.h"
struct ipu_isys_video;
struct ipu_isys_pipeline;
struct ipu_fw_isys_resp_info_abi;
struct ipu_fw_isys_frame_buff_set_abi;
enum ipu_isys_buffer_type {
IPU_ISYS_VIDEO_BUFFER,
IPU_ISYS_SHORT_PACKET_BUFFER,
};
struct ipu_isys_queue {
struct list_head node; /* struct ipu_isys_pipeline.queues */
struct vb2_queue vbq;
struct device *dev;
/*
* @lock: serialise access to queued and pre_streamon_queued
*/
spinlock_t lock;
struct list_head active;
struct list_head incoming;
u32 css_pin_type;
unsigned int fw_output;
int (*buf_init)(struct vb2_buffer *vb);
void (*buf_cleanup)(struct vb2_buffer *vb);
int (*buf_prepare)(struct vb2_buffer *vb);
void (*prepare_frame_buff_set)(struct vb2_buffer *vb);
void (*fill_frame_buff_set_pin)(struct vb2_buffer *vb,
struct ipu_fw_isys_frame_buff_set_abi *
set);
int (*link_fmt_validate)(struct ipu_isys_queue *aq);
};
struct ipu_isys_buffer {
struct list_head head;
enum ipu_isys_buffer_type type;
struct list_head req_head;
struct media_device_request *req;
atomic_t str2mmio_flag;
};
struct ipu_isys_video_buffer {
struct vb2_v4l2_buffer vb_v4l2;
struct ipu_isys_buffer ib;
};
struct ipu_isys_private_buffer {
struct ipu_isys_buffer ib;
struct ipu_isys_pipeline *ip;
unsigned int index;
unsigned int bytesused;
dma_addr_t dma_addr;
void *buffer;
};
#define IPU_ISYS_BUFFER_LIST_FL_INCOMING BIT(0)
#define IPU_ISYS_BUFFER_LIST_FL_ACTIVE BIT(1)
#define IPU_ISYS_BUFFER_LIST_FL_SET_STATE BIT(2)
struct ipu_isys_buffer_list {
struct list_head head;
unsigned int nbufs;
};
#define vb2_queue_to_ipu_isys_queue(__vb2) \
container_of(__vb2, struct ipu_isys_queue, vbq)
#define ipu_isys_to_isys_video_buffer(__ib) \
container_of(__ib, struct ipu_isys_video_buffer, ib)
#define vb2_buffer_to_ipu_isys_video_buffer(__vb) \
container_of(to_vb2_v4l2_buffer(__vb), \
struct ipu_isys_video_buffer, vb_v4l2)
#define ipu_isys_buffer_to_vb2_buffer(__ib) \
(&ipu_isys_to_isys_video_buffer(__ib)->vb_v4l2.vb2_buf)
#define vb2_buffer_to_ipu_isys_buffer(__vb) \
(&vb2_buffer_to_ipu_isys_video_buffer(__vb)->ib)
#define ipu_isys_buffer_to_private_buffer(__ib) \
container_of(__ib, struct ipu_isys_private_buffer, ib)
struct ipu_isys_request {
struct media_device_request req;
/* serialise access to buffers */
spinlock_t lock;
struct list_head buffers; /* struct ipu_isys_buffer.head */
bool dispatched;
/*
* struct ipu_isys.requests;
* struct ipu_isys_pipeline.struct.*
*/
struct list_head head;
};
#define to_ipu_isys_request(__req) \
container_of(__req, struct ipu_isys_request, req)
int ipu_isys_buf_prepare(struct vb2_buffer *vb);
void ipu_isys_buffer_list_queue(struct ipu_isys_buffer_list *bl,
unsigned long op_flags,
enum vb2_buffer_state state);
struct ipu_isys_request *
ipu_isys_next_queued_request(struct ipu_isys_pipeline *ip);
void
ipu_isys_buffer_to_fw_frame_buff_pin(struct vb2_buffer *vb,
struct ipu_fw_isys_frame_buff_set_abi *
set);
void
ipu_isys_buffer_to_fw_frame_buff(struct ipu_fw_isys_frame_buff_set_abi *set,
struct ipu_isys_pipeline *ip,
struct ipu_isys_buffer_list *bl);
int ipu_isys_link_fmt_validate(struct ipu_isys_queue *aq);
void
ipu_isys_buf_calc_sequence_time(struct ipu_isys_buffer *ib,
struct ipu_fw_isys_resp_info_abi *info);
void ipu_isys_queue_buf_done(struct ipu_isys_buffer *ib);
void ipu_isys_queue_buf_ready(struct ipu_isys_pipeline *ip,
struct ipu_fw_isys_resp_info_abi *info);
void
ipu_isys_queue_short_packet_ready(struct ipu_isys_pipeline *ip,
struct ipu_fw_isys_resp_info_abi *inf);
int ipu_isys_queue_init(struct ipu_isys_queue *aq);
void ipu_isys_queue_cleanup(struct ipu_isys_queue *aq);
#endif /* IPU_ISYS_QUEUE_H */