kernel-brax3-ubuntu-touch/drivers/misc/mediatek/slbc/slbc_ops.h
erascape f319b992b1 kernel-5.15: Initial import brax3 UT kernel
* halium configs enabled

Signed-off-by: erascape <erascape@proton.me>
2025-09-23 15:17:10 +00:00

207 lines
4.6 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright (c) 2019 MediaTek Inc.
*/
#ifndef _SLBC_OPS_H_
#define _SLBC_OPS_H_
#include <linux/list.h>
#include <linux/bitops.h>
/* error code */
#define EWAIT_RELEASE 1 /* wait for release */
#define ENOT_AVAILABLE 2 /* not available for now */
#define EREQ_DONE 3 /* already requested */
#define EREQ_MASKED 4 /* req madk bit set */
#define EDISABLED 5 /* req madk bit set */
#define EID_WRONG 6 /* wrong id */
#define EREF_NOT_ZERO 7 /* ref not zero */
#define EREQ_TIMEOUT 8 /* req timeout */
#define EREQ_WAIT_FAIL 9 /* req wait fail */
/* call back return value */
#define CB_DONE 0 /* no need to use*/
#define CB_OK 1 /* ready to use/release */
/* slot status */
#define SLOT_AVAILABLE 0 /* slot available*/
#define SLOT_NOT_FOUND 1 /* slot not found */
#define SLOT_USED 2 /* slot used */
/* sid status */
#define SID_NOT_FOUND 0xffff
/* need to modify slbc_uid_str */
enum slbc_uid {
UID_ZERO = 0,
UID_MM_VENC,
UID_MM_DISP,
UID_MM_MDP,
UID_MM_VDEC,
UID_AI_MDLA,
UID_AI_ISP,
UID_GPU,
UID_HIFI3,
UID_CPU,
UID_AOV,
UID_SH_P2,
UID_SH_APU,
UID_MML,
UID_DSC_IDLE,
UID_AINR,
UID_TEST_BUFFER, /* 0x10 */
UID_TEST_CACHE,
UID_TEST_ACP,
UID_DISP,
UID_AOV_DC,
UID_AOV_APU,
UID_AISR_APU,
UID_AISR_MML,
UID_SH_P1,
UID_SMT,
UID_APU,
UID_AOD,
UID_BIF,
UID_MAX,
};
#define UID_MM_BITS_1 (BIT(UID_MM_DISP) | BIT(UID_MM_MDP))
#define BIT_IN_MM_BITS_1(x) ((x) & UID_MM_BITS_1)
#define UID_MM_BITS_2 (BIT(UID_SH_P2) | BIT(UID_SH_APU))
#define BIT_IN_MM_BITS_2(x) ((x) & UID_MM_BITS_2)
#define UID_MM_BITS_3 (BIT(UID_MML) | BIT(UID_DISP))
#define BIT_IN_MM_BITS_3(x) ((x) & UID_MM_BITS_3)
enum slbc_type {
TP_BUFFER = 0,
TP_CACHE,
TP_ACP,
};
enum slbc_force {
FR_DIS = 0,
FR_CPU,
FR_GPU,
FR_APU,
FR_MAX,
};
#define ACP_ONLY_BIT 2
enum slbc_flag {
FG_SECURE = BIT(0),
FG_POWER = BIT(1),
FG_ACP_ONLY = BIT(ACP_ONLY_BIT),
FG_ACP_1_4 = BIT(ACP_ONLY_BIT + 1),
FG_ACP_2_4 = BIT(ACP_ONLY_BIT + 2),
FG_ACP_3_4 = BIT(ACP_ONLY_BIT + 3),
FG_ACP_4_4 = BIT(ACP_ONLY_BIT + 4),
};
#define FG_ACP_BITS (FG_ACP_1_4 | FG_ACP_2_4 | FG_ACP_3_4 | FG_ACP_4_4)
#define SLBC_TRY_FLAG_BIT(d, bit) (((d)->flag & (bit)) == (bit))
struct slbc_data {
unsigned int uid;
unsigned int type;
ssize_t size;
unsigned int flag;
int ret;
unsigned int timeout;
void *user_cb_data;
/* below used by slbc driver */
void __iomem *paddr;
void __iomem *vaddr;
void __iomem *emi_paddr;
unsigned int sid;
unsigned int slot_used;
void *config;
int ref;
int pwr_ref;
struct slbc_data *private;
};
#define ui_to_slbc_data(d, ui) \
do { \
(d)->uid = ((ui) >> 24 & 0xff); \
(d)->type = ((ui) >> 16 & 0xff); \
(d)->flag = ((ui) >> 8 & 0xff); \
} while (0)
#define slbc_data_to_ui(d) \
((((d)->uid) & 0xff) << 24 | \
(((d)->type) & 0xff) << 16 | \
(((d)->flag) & 0xff) << 8)
struct slbc_ops {
struct list_head node;
struct slbc_data *data;
int (*activate)(struct slbc_data *data);
int (*deactivate)(struct slbc_data *data);
};
extern unsigned int slbc_enable;
extern char *slbc_uid_str[UID_MAX + 1];
extern int popcount(unsigned int x);
#if IS_ENABLED(CONFIG_MTK_SLBC)
extern int slbc_status(struct slbc_data *d);
extern int slbc_request(struct slbc_data *d);
extern int slbc_release(struct slbc_data *d);
extern int slbc_power_on(struct slbc_data *d);
extern int slbc_power_off(struct slbc_data *d);
extern int slbc_secure_on(struct slbc_data *d);
extern int slbc_secure_off(struct slbc_data *d);
extern int slbc_register_activate_ops(struct slbc_ops *ops);
extern int slbc_activate_status(struct slbc_data *d);
extern void slbc_update_mm_bw(unsigned int bw);
extern void slbc_update_mic_num(unsigned int num);
extern void slbc_update_inner(unsigned int inner);
extern void slbc_update_outer(unsigned int outer);
#else
__weak int slbc_status(struct slbc_data *d)
{
return -EDISABLED;
};
__weak int slbc_request(struct slbc_data *d)
{
return -EDISABLED;
};
__weak int slbc_release(struct slbc_data *d)
{
return -EDISABLED;
};
__weak int slbc_power_on(struct slbc_data *d)
{
return -EDISABLED;
};
__weak int slbc_power_off(struct slbc_data *d)
{
return -EDISABLED;
};
__weak int slbc_secure_on(struct slbc_data *d)
{
return -EDISABLED;
};
__weak int slbc_secure_off(struct slbc_data *d)
{
return -EDISABLED;
};
__weak int slbc_register_activate_ops(struct slbc_ops *ops)
{
return -EDISABLED;
};
__weak int slbc_activate_status(struct slbc_data *d)
{
return -EDISABLED;
};
__weak void slbc_update_mm_bw(unsigned int bw) {}
__weak void slbc_update_mic_num(unsigned int num) {}
__weak void slbc_update_inner(unsigned int inner) {}
__weak void slbc_update_outer(unsigned int outer) {}
#endif /* CONFIG_MTK_SLBC */
#endif /* _SLBC_OPS_H_ */