92 lines
2.6 KiB
C
92 lines
2.6 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/*
|
|
* Copyright (c) 2019 MediaTek Inc.
|
|
*/
|
|
|
|
#ifndef _CONAP_SCP_MSG_THREAD_H_
|
|
#define _CONAP_SCP_MSG_THREAD_H_
|
|
#include <linux/workqueue.h>
|
|
#include <linux/mutex.h>
|
|
#include <linux/completion.h>
|
|
#include <linux/wait.h>
|
|
|
|
#define MSG_THREAD_OP_DATA_SIZE 8
|
|
#define MSG_THREAD_OP_BUF_SIZE 64
|
|
|
|
struct msg_op_data {
|
|
unsigned int op_id; /* Event ID */
|
|
unsigned int info_bit; /* Reserved */
|
|
size_t op_data[MSG_THREAD_OP_DATA_SIZE]; /* OP Data */
|
|
};
|
|
|
|
struct msg_op_signal {
|
|
struct completion comp;
|
|
unsigned int timeoutValue;
|
|
};
|
|
|
|
struct msg_op {
|
|
struct msg_op_data op;
|
|
struct msg_op_signal signal;
|
|
int result;
|
|
atomic_t ref_count;
|
|
atomic_t op_state;
|
|
};
|
|
|
|
struct msg_op_q {
|
|
spinlock_t lock;
|
|
unsigned int write;
|
|
unsigned int read;
|
|
unsigned int size;
|
|
struct msg_op *queue[MSG_THREAD_OP_BUF_SIZE];
|
|
};
|
|
|
|
typedef int(*msg_opid_func) (struct msg_op_data *);
|
|
|
|
struct msg_thread_ctx {
|
|
bool thread_stop;
|
|
struct task_struct *pThread;
|
|
wait_queue_head_t waitQueue;
|
|
|
|
struct msg_op_q free_op_q; /* free op queue */
|
|
struct msg_op_q active_op_q; /* active op queue */
|
|
struct msg_op op_q_inst[MSG_THREAD_OP_BUF_SIZE]; /* real op instances */
|
|
struct msg_op *cur_op; /* current op */
|
|
|
|
int op_func_size;
|
|
const msg_opid_func *op_func;
|
|
};
|
|
|
|
|
|
#define MSG_OP_TIMEOUT 20000
|
|
|
|
int msg_thread_init(struct msg_thread_ctx *ctx, const char *name,
|
|
const msg_opid_func *func, int op_size);
|
|
int msg_thread_deinit(struct msg_thread_ctx *ctx);
|
|
|
|
/* timeout:
|
|
* 0: default value (by MSG_OP_TIMEOUT define)
|
|
* >0: cutom timeout (ms)
|
|
*/
|
|
int msg_thread_send(struct msg_thread_ctx *ctx, int opid);
|
|
int msg_thread_send_1(struct msg_thread_ctx *ctx, int opid, size_t param1);
|
|
int msg_thread_send_2(struct msg_thread_ctx *ctx, int opid, size_t param1,
|
|
size_t param2);
|
|
int msg_thread_send_3(struct msg_thread_ctx *ctx, int opid, size_t param1,
|
|
size_t param2, size_t param3);
|
|
|
|
int msg_thread_send_5(struct msg_thread_ctx *ctx, int opid, size_t param1,
|
|
size_t param2, size_t param3,
|
|
size_t param4, size_t param5);
|
|
|
|
int msg_thread_send_wait(struct msg_thread_ctx *ctx, int opid, int timeout);
|
|
int msg_thread_send_wait_1(struct msg_thread_ctx *ctx, int opid, int timeout, size_t param1);
|
|
int msg_thread_send_wait_2(struct msg_thread_ctx *ctx, int opid, int timeout,
|
|
size_t param1, size_t param2);
|
|
int msg_thread_send_wait_3(struct msg_thread_ctx *ctx, int opid, int timeout,
|
|
size_t param1, size_t param2,
|
|
size_t param3);
|
|
int msg_thread_send_wait_4(struct msg_thread_ctx *ctx, int opid, int timeout,
|
|
size_t param1, size_t param2,
|
|
size_t param3, size_t param4);
|
|
|
|
#endif /* _BASE_MSG_THREAD_H_ */
|