139 lines
3.2 KiB
C
Executable File
139 lines
3.2 KiB
C
Executable File
/*
|
|
* Samsung Exynos SoC series VIPx driver
|
|
*
|
|
* Copyright (c) 2018 Samsung Electronics Co., 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 as
|
|
* published by the Free Software Foundation.
|
|
*/
|
|
|
|
#ifndef __VIPX_QUEUE_H__
|
|
#define __VIPX_QUEUE_H__
|
|
|
|
#include <linux/poll.h>
|
|
#include <linux/types.h>
|
|
#include <linux/mutex.h>
|
|
|
|
#include "vipx-config.h"
|
|
#include "vs4l.h"
|
|
#include "vipx-memory.h"
|
|
#include "vipx-graph.h"
|
|
|
|
struct vipx_context;
|
|
struct vipx_queue_list;
|
|
|
|
struct vipx_format_type {
|
|
char *name;
|
|
unsigned int colorspace;
|
|
unsigned int planes;
|
|
unsigned int bitsperpixel[VIPX_MAX_PLANES];
|
|
};
|
|
|
|
struct vipx_buffer_format {
|
|
unsigned int target;
|
|
struct vipx_format_type *fmt;
|
|
unsigned int colorspace;
|
|
unsigned int plane;
|
|
unsigned int width;
|
|
unsigned int height;
|
|
unsigned int size[VIPX_MAX_PLANES];
|
|
};
|
|
|
|
struct vipx_buffer_format_list {
|
|
unsigned int count;
|
|
struct vipx_buffer_format *formats;
|
|
};
|
|
|
|
struct vipx_container {
|
|
unsigned int type;
|
|
unsigned int target;
|
|
unsigned int memory;
|
|
unsigned int reserved[4];
|
|
unsigned int count;
|
|
struct vipx_buffer *buffers;
|
|
struct vipx_buffer_format *format;
|
|
};
|
|
|
|
struct vipx_container_list {
|
|
unsigned int direction;
|
|
unsigned int id;
|
|
unsigned int index;
|
|
unsigned long flags;
|
|
struct timeval timestamp[6];
|
|
unsigned int count;
|
|
unsigned int user_params[MAX_NUM_OF_USER_PARAMS];
|
|
struct vipx_container *containers;
|
|
};
|
|
|
|
enum vipx_bundle_state {
|
|
VIPX_BUNDLE_STATE_DEQUEUED,
|
|
VIPX_BUNDLE_STATE_QUEUED,
|
|
VIPX_BUNDLE_STATE_PROCESS,
|
|
VIPX_BUNDLE_STATE_DONE,
|
|
};
|
|
|
|
struct vipx_bundle {
|
|
unsigned long flags;
|
|
unsigned int state;
|
|
struct list_head queued_entry;
|
|
struct list_head process_entry;
|
|
struct list_head done_entry;
|
|
|
|
struct vipx_container_list clist;
|
|
};
|
|
|
|
struct vipx_queue {
|
|
unsigned int direction;
|
|
unsigned int streaming;
|
|
struct mutex *lock;
|
|
|
|
struct list_head queued_list;
|
|
atomic_t queued_count;
|
|
struct list_head process_list;
|
|
atomic_t process_count;
|
|
struct list_head done_list;
|
|
atomic_t done_count;
|
|
|
|
spinlock_t done_lock;
|
|
wait_queue_head_t done_wq;
|
|
|
|
struct vipx_buffer_format_list flist;
|
|
struct vipx_bundle *bufs[VIPX_MAX_BUFFER];
|
|
unsigned int num_buffers;
|
|
|
|
struct vipx_queue_list *qlist;
|
|
};
|
|
|
|
struct vipx_queue_gops {
|
|
int (*set_graph)(struct vipx_graph *graph, struct vs4l_graph *ginfo);
|
|
int (*set_format)(struct vipx_graph *graph,
|
|
struct vs4l_format_list *flist);
|
|
int (*set_param)(struct vipx_graph *graph,
|
|
struct vs4l_param_list *plist);
|
|
int (*set_ctrl)(struct vipx_graph *graph, struct vs4l_ctrl *ctrl);
|
|
int (*queue)(struct vipx_graph *graph,
|
|
struct vipx_container_list *incl,
|
|
struct vipx_container_list *otcl);
|
|
int (*deque)(struct vipx_graph *graph,
|
|
struct vipx_container_list *clist);
|
|
int (*start)(struct vipx_graph *graph);
|
|
int (*stop)(struct vipx_graph *graph);
|
|
};
|
|
|
|
struct vipx_queue_list {
|
|
struct vipx_queue in_queue;
|
|
struct vipx_queue out_queue;
|
|
const struct vipx_queue_gops *gops;
|
|
struct vipx_context *vctx;
|
|
};
|
|
|
|
void vipx_queue_done(struct vipx_queue_list *qlist,
|
|
struct vipx_container_list *inclist,
|
|
struct vipx_container_list *otclist,
|
|
unsigned long flags);
|
|
|
|
int vipx_queue_init(struct vipx_context *vctx);
|
|
|
|
#endif
|