unplugged-kernel/drivers/misc/mediatek/apusys/midware/1.1/mdw_rsc.h

148 lines
3.3 KiB
C

// SPDX-License-Identifier: GPL-2.0
/*
* Copyright (c) 2020 MediaTek Inc.
*/
#ifndef __APUSYS_MDW_RSC_H__
#define __APUSYS_MDW_RSC_H__
#include "mdw_queue.h"
#define MDW_DEV_NAME_SIZE 16
#define MDW_RSC_MAX_NUM 64 //max device type
#define MDW_RSC_TAB_DEV_MAX 16 //max device num per type
#define MDW_RSC_SET_PWR_TIMEOUT (3*1000)
#define MDW_RSC_SET_PWR_ALLON (0)
#define APUSYS_THD_TASK_FILE_PATH "/dev/stune/low_latency/tasks"
enum MDW_PREEMPT_PLCY {
MDW_PREEMPT_PLCY_RR_SIMPLE,
MDW_PREEMPT_PLCY_RR_PRIORITY,
MDW_PREEMPT_PLCY_MAX,
};
enum MDW_DEV_INFO_GET_POLICY {
MDW_DEV_INFO_GET_POLICY_SEQ,
MDW_DEV_INFO_GET_POLICY_RR,
MDW_DEV_INFO_GET_POLICY_MAX,
};
enum MDW_DEV_INFO_GET_MODE {
MDW_DEV_INFO_GET_MODE_TRY,
MDW_DEV_INFO_GET_MODE_SYNC,
MDW_DEV_INFO_GET_MODE_ASYNC,
MDW_DEV_INFO_GET_MODE_MAX,
};
enum MDW_DEV_INFO_STATE {
MDW_DEV_INFO_STATE_IDLE,
MDW_DEV_INFO_STATE_BUSY,
MDW_DEV_INFO_STATE_LOCK,
};
struct mdw_dev_info {
int idx;
int type;
int state;
char name[32];
struct apusys_device *dev;
struct list_head t_item; //to rsc_tab
struct list_head r_item; //to rsc_req
struct list_head u_item; //to mdw_usr
int (*exec)(struct mdw_dev_info *d, void *s);
int (*pwr_on)(struct mdw_dev_info *d, int bst, int to);
int (*pwr_off)(struct mdw_dev_info *d);
int (*suspend)(struct mdw_dev_info *d);
int (*resume)(struct mdw_dev_info *d);
int (*fw)(struct mdw_dev_info *d, uint32_t magic, const char *name,
uint64_t kva, uint32_t iova, uint32_t size, int op);
int (*ucmd)(struct mdw_dev_info *d,
uint64_t kva, uint32_t iova, uint32_t size);
int (*sec_on)(struct mdw_dev_info *d);
int (*sec_off)(struct mdw_dev_info *d);
int (*lock)(struct mdw_dev_info *d);
int (*unlock)(struct mdw_dev_info *d);
void *sc;
int stop;
struct task_struct *thd;
struct completion cmplt;
struct completion thd_done;
struct mutex mtx;
};
struct mdw_rsc_tab {
int type;
char name[MDW_DEV_NAME_SIZE];
int dev_num;
int avl_num;
uint32_t norm_sc_cnt;
struct mdw_dev_info *array[MDW_RSC_TAB_DEV_MAX]; //for mdw_dev_info
struct list_head list; //for mdw_dev_info
struct mutex mtx;
struct mdw_queue q;
struct dentry *dbg_dir;
};
struct mdw_rsc_req {
uint8_t num[APUSYS_DEVICE_MAX]; //in
uint8_t get_num[APUSYS_DEVICE_MAX]; //in
uint32_t total_num; //in
uint64_t acq_bmp; //in
int mode; //in
int policy; //in
uint32_t ready_num;
void (*cb_async)(struct mdw_rsc_req *r); //call if async
bool in_list;
struct kref ref;
struct completion complt;
struct list_head r_item; // to rsc mgr
struct list_head d_list; // for rsc_dev
struct mutex mtx;
};
extern struct dentry *mdw_dbg_device;
uint64_t mdw_rsc_get_avl_bmp(void);
void mdw_rsc_update_avl_bmp(int type);
struct mdw_queue *mdw_rsc_get_queue(int type);
int mdw_rsc_get_dev(struct mdw_rsc_req *req);
int mdw_rsc_put_dev(struct mdw_dev_info *d);
struct mdw_rsc_tab *mdw_rsc_get_tab(int type);
struct mdw_dev_info *mdw_rsc_get_dinfo(int type, int idx);
void mdw_rsc_dump(struct seq_file *s);
int mdw_rsc_set_preempt_plcy(uint32_t preempt_policy);
uint32_t mdw_rsc_get_preempt_plcy(void);
int mdw_rsc_init(void);
void mdw_rsc_exit(void);
uint64_t mdw_rsc_get_dev_bmp(void);
int mdw_rsc_get_dev_num(int type);
void mdw_rsc_set_thd_group(void);
#ifdef CONFIG_MTK_GZ_SUPPORT_SDSP
extern int mtee_sdsp_enable(u32 on);
#endif
#endif