blob: 0c3ccf94e71e3f58cedd272b2b35b706bc94abe2 [file] [log] [blame]
/*
* 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_CONTEXT_H__
#define __VIPX_CONTEXT_H__
#include <linux/mutex.h>
#include "vipx-queue.h"
#include "vipx-graph.h"
#include "vipx-ioctl.h"
#include "vipx-core.h"
enum vipx_context_state {
VIPX_CONTEXT_OPEN,
VIPX_CONTEXT_GRAPH,
VIPX_CONTEXT_FORMAT,
VIPX_CONTEXT_START,
VIPX_CONTEXT_STOP
};
struct vipx_context;
struct vipx_context_ops {
int (*load_kernel_binary)(struct vipx_context *vctx,
struct vipx_ioc_load_kernel_binary *kernel_bin);
int (*unload_kernel_binary)(struct vipx_context *vctx,
struct vipx_ioc_unload_kernel_binary *unload_kbin);
int (*load_graph_info)(struct vipx_context *vctx,
struct vipx_ioc_load_graph_info *ginfo);
int (*unload_graph_info)(struct vipx_context *vctx,
struct vipx_ioc_unload_graph_info *ginfo);
int (*execute_submodel)(struct vipx_context *vctx,
struct vipx_ioc_execute_submodel *execute);
};
struct vipx_context_qops {
int (*poll)(struct vipx_queue_list *qlist,
struct file *file, struct poll_table_struct *poll);
int (*set_graph)(struct vipx_queue_list *qlist,
struct vs4l_graph *ginfo);
int (*set_format)(struct vipx_queue_list *qlist,
struct vs4l_format_list *flist);
int (*set_param)(struct vipx_queue_list *qlist,
struct vs4l_param_list *plist);
int (*set_ctrl)(struct vipx_queue_list *qlist,
struct vs4l_ctrl *ctrl);
int (*qbuf)(struct vipx_queue_list *qlist,
struct vs4l_container_list *clist);
int (*dqbuf)(struct vipx_queue_list *qlist,
struct vs4l_container_list *clist);
int (*streamon)(struct vipx_queue_list *qlist);
int (*streamoff)(struct vipx_queue_list *qlist);
};
struct vipx_context_gops {
struct vipx_graph_model *(*create_model)(struct vipx_graph *graph,
struct vipx_common_graph_info *ginfo);
struct vipx_graph_model *(*get_model)(struct vipx_graph *graph,
unsigned int id);
int (*destroy_model)(struct vipx_graph *graph,
struct vipx_graph_model *gmodel);
int (*register_model)(struct vipx_graph *graph,
struct vipx_graph_model *gmodel);
int (*unregister_model)(struct vipx_graph *graph,
struct vipx_graph_model *gmodel);
int (*start_model)(struct vipx_graph *graph,
struct vipx_graph_model *gmodel);
int (*stop_model)(struct vipx_graph *graph,
struct vipx_graph_model *gmodel);
int (*execute_model)(struct vipx_graph *graph,
struct vipx_graph_model *gmodel,
struct vipx_common_execute_info *einfo);
};
struct vipx_context {
unsigned int state;
unsigned int idx;
struct list_head list;
struct mutex lock;
const struct vipx_context_ops *vops;
int binary_count;
struct list_head binary_list;
spinlock_t binary_slock;
const struct vipx_context_gops *graph_ops;
const struct vipx_context_qops *queue_ops;
struct vipx_queue_list queue_list;
struct vipx_core *core;
struct vipx_graph *graph;
};
struct vipx_context *vipx_context_create(struct vipx_core *core);
void vipx_context_destroy(struct vipx_context *vctx);
#endif