kernel_samsung_a34x-permissive/drivers/misc/mediatek/smi/mmdvfs_mgr.h
2024-04-28 15:51:13 +02:00

261 lines
8.2 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright (c) 2020 MediaTek Inc.
*/
#ifndef __MMDVFS_MGR_H__
#define __MMDVFS_MGR_H__
#include <linux/plist.h>
#include <linux/of_address.h>
#include <aee.h>
#include "mtk_smi.h"
#define _BIT_(_bit_) (unsigned int)(1 << (_bit_))
#define _BITS_(_bits_, _val_) ((((unsigned int) -1 >> (31 - ((1) ? _bits_))) \
& ~((1U << ((0) ? _bits_)) - 1)) & ((_val_)<<((0) ? _bits_)))
#define _BITMASK_(_bits_) \
(((unsigned int) -1 >> (31 - ((1) ? _bits_))) & ~((1U << ((0) ? _bits_)) - 1))
#define _GET_BITS_VAL_(_bits_, _val_) \
(((_val_) & (_BITMASK_(_bits_))) >> ((0) ? _bits_))
/* MMDVFS extern APIs */
extern int set_mm_info_ioctl_wrapper(
struct file *pFile, unsigned int cmd, unsigned long param);
extern int get_mm_info_ioctl_wrapper(
struct file *pFile, unsigned int cmd, unsigned long param);
extern void mmdvfs_clks_init(struct device_node *of_node);
extern void mmdvfs_init(void);
extern void mmdvfs_handle_cmd(struct MTK_MMDVFS_CMD *cmd);
extern void mmdvfs_notify_scenario_enter(enum MTK_SMI_BWC_SCEN scen);
extern void mmdvfs_notify_scenario_exit(enum MTK_SMI_BWC_SCEN scen);
extern void mmdvfs_notify_scenario_concurrency(unsigned int u4Concurrency);
extern void mmdvfs_mhl_enable(int enable);
extern void mmdvfs_mjc_enable(int enable);
/* screen size */
extern unsigned int DISP_GetScreenWidth(void);
extern unsigned int DISP_GetScreenHeight(void);
#define MMDVFS_MMSYS_CLK_COUNT (3)
#define MMSYS_CLK_LOW (0)
#define MMSYS_CLK_HIGH (1)
#define MMSYS_CLK_MEDIUM (2)
#define MMDVFS_EVENT_OVL_SINGLE_LAYER_ENTER 0
#define MMDVFS_EVENT_OVL_SINGLE_LAYER_EXIT 1
#define MMDVFS_EVENT_UI_IDLE_ENTER 2
#define MMDVFS_EVENT_UI_IDLE_EXIT 3
#define MMDVFS_CLIENT_ID_ISP 0
#define QOS_ALL_SCENARIO 99
enum {
MMDVFS_CAM_MON_SCEN = SMI_BWC_SCEN_CNT,
MMDVFS_SCEN_MHL, MMDVFS_SCEN_MJC, MMDVFS_SCEN_DISP,
MMDVFS_SCEN_ISP, MMDVFS_SCEN_VP_HIGH_RESOLUTION,
MMDVFS_SCEN_VPU, MMDVFS_MGR,
MMDVFS_SCEN_VPU_KERNEL, MMDVFS_PMQOS_ISP,
MMDVFS_SCEN_VP_WFD, MMDVFS_SCEN_COUNT
};
#define LEGACY_CAM_SCENS ((1 << SMI_BWC_SCEN_VR) | \
(1 << SMI_BWC_SCEN_VR_SLOW) | \
(1 << SMI_BWC_SCEN_VSS) | \
(1 << SMI_BWC_SCEN_CAM_PV) | \
(1 << SMI_BWC_SCEN_CAM_CP) | \
(1 << SMI_BWC_SCEN_ICFP) | \
(1 << MMDVFS_SCEN_ISP))
enum mmdvfs_vpu_clk {
vpu_clk_0, vpu_clk_1, vpu_clk_2, vpu_clk_3
};
enum mmdvfs_vpu_if_clk {
vpu_if_clk_0, vpu_if_clk_1, vpu_if_clk_2, vpu_if_clk_3
};
enum mmdvfs_vimvo_vol {
vimvo_vol_0, vimvo_vol_1, vimvo_vol_2, vimvo_vol_3
};
struct mmdvfs_state_change_event {
int scenario;
int feature_flag;
int sensor_size;
int sensor_fps;
int vcore_vol_step;
int mmsys_clk_step;
int vpu_clk_step;
int vpu_if_clk_step;
int vimvo_vol_step;
};
struct mmdvfs_pm_qos_request {
struct plist_node node; /* reserved for QoS function */
int pm_qos_class;
struct delayed_work work; /* reserved for timeout handling */
};
#define MMDVFS_EVENT_PREPARE_CALIBRATION_START 0
#define MMDVFS_EVENT_PREPARE_CALIBRATION_END 1
struct mmdvfs_prepare_action_event {
int event_type;
};
typedef int (*clk_switch_cb)(
int ori_mmsys_clk_mode, int update_mmsys_clk_mode);
typedef int (*vdec_ctrl_cb)(void);
typedef int (*mmdvfs_state_change_cb)(
struct mmdvfs_state_change_event *event);
typedef int (*mmdvfs_prepare_action_cb)(
struct mmdvfs_prepare_action_event *event);
/* num: Display HRT capability drop times 100 */
/* ex: 150 => display HRT capability decrease 1.5 layer */
typedef int (*disp_hrt_change_cb)(int num);
/* MMDVFS V2 only APIs */
extern int mmdvfs_notify_mmclk_switch_request(int event);
extern int mmdvfs_raise_mmsys_by_mux(void);
extern int mmdvfs_lower_mmsys_by_mux(void);
extern int register_mmclk_switch_cb(clk_switch_cb notify_cb,
clk_switch_cb notify_cb_nolock);
extern int mmdvfs_register_mmclk_switch_cb(
clk_switch_cb notify_cb, int mmdvfs_client_id);
extern void dump_mmdvfs_info(void);
/* Extern from other module */
extern enum MTK_SMI_BWC_SCEN smi_get_current_profile(void);
extern int is_mmdvfs_freq_hopping_disabled(void);
extern int is_mmdvfs_freq_mux_disabled(void);
extern int is_force_max_mmsys_clk(void);
extern int is_force_camera_hpm(void);
extern int is_mmdvfs_disabled(void);
extern int force_always_on_mm_clks(void);
extern int mmdvfs_get_stable_isp_clk(void);
extern int get_mmdvfs_clk_mux_mask(void);
extern void mmdvfs_set_disp_hrt_cb(disp_hrt_change_cb change_cb);
extern void mmdvfs_set_md_on(bool to_on);
#ifdef MMDVFS_STANDALONE
#define vcorefs_request_dvfs_opp(scen, mode) do { \
MMDVFSMSG("vcorefs_request_dvfs_opp"); \
MMDVFSMSG("MMDVFS_STANDALONE mode enabled\n"); \
} while (0)
#define fliper_set_bw(BW_THRESHOLD_HIGH) do { \
MMDVFSMSG("MMDVFS_STANDALONE mode enabled\n"); \
MMDVFSMSG("fliper_set_bw");\
} while (0)
#define fliper_restore_bw() do {\
MMDVFSMSG("MMDVFS_STANDALONE mode enabled\n"); \
MMDVFSMSG("fliper_restore_bw(): fliper normal\n"); \
} while (0)
#endif /* MMDVFS_STANDALONE */
#ifdef MMDVFS_WQHD_1_0V
#include "disp_session.h"
extern int primary_display_switch_mode_for_mmdvfs(
int sess_mode, unsigned int session, int blocking);
#endif
/* D2 plus only */
/* extern void mt_set_vencpll_con1(int val); */
/* extern int clkmux_sel(int id, unsigned int clksrc, char *name); */
/* D1 plus implementation only */
/* extern u32 get_devinfo_with_index(u32 index); */
#define MMDVFS_PROFILE_UNKNOWN (0)
#define MMDVFS_PROFILE_R1 (1)
#define MMDVFS_PROFILE_J1 (2)
#define MMDVFS_PROFILE_D1 (3)
#define MMDVFS_PROFILE_D1_PLUS (4)
#define MMDVFS_PROFILE_D2 (5)
#define MMDVFS_PROFILE_D2_M_PLUS (6)
#define MMDVFS_PROFILE_D2_P_PLUS (7)
#define MMDVFS_PROFILE_D3 (8)
#define MMDVFS_PROFILE_E1 (9)
#define MMDVFS_PROFILE_WHY (10)
#define MMDVFS_PROFILE_WHY2 (11)
#define MMDVFS_PROFILE_ALA (12)
#define MMDVFS_PROFILE_BIA (13)
#define MMDVFS_PROFILE_VIN (14)
#define MMDVFS_PROFILE_ZIO (15)
#define MMDVFS_PROFILE_SYL (16)
#define MMDVFS_PROFILE_CAN (17)
#define MMDVFS_PROFILE_MER (18)
/* Macro used to resovling step setting ioctl command */
#define MMDVFS_IOCTL_CMD_STEP_FIELD_LEN (8)
#define MMDVFS_IOCTL_CMD_STEP_FIELD_MASK (0xFF)
#define MMDVFS_IOCTL_CMD_MMCLK_FIELD_MASK (0xFF00)
#define MMDVFS_IOCTL_CMD_DDR_TYPE_AUTO_SELECT (0xFF)
#define MMDVFS_IOCTL_CMD_VPU_STEP_UNREQUEST (0xFFFF)
/* Backward compatible */
#define SMI_BWC_SCEN_120HZ MMDVFS_SCEN_DISP
/* mmdvfs display sizes */
#define MMDVFS_DISPLAY_SIZE_HD (1280 * 832)
#define MMDVFS_DISPLAY_SIZE_FHD (1920 * 1216)
enum mmdvfs_lcd_size_enum {
MMDVFS_LCD_SIZE_HD, MMDVFS_LCD_SIZE_FHD,
MMDVFS_LCD_SIZE_WQHD, MMDVFS_LCD_SIZE_END_OF_ENUM
};
#ifndef CONFIG_MTK_SMI_EXT
#define mmdvfs_set_step(scenario, step)
#define mmdvfs_set_fine_step(scenario, step)
#else
int mmdvfs_set_step(enum MTK_SMI_BWC_SCEN scenario,
enum mmdvfs_voltage_enum step);
int mmdvfs_set_fine_step(enum MTK_SMI_BWC_SCEN smi_scenario,
int mmdvfs_fine_step);
#endif /* CONFIG_MTK_SMI_EXT */
extern int mmdvfs_get_mmdvfs_profile(void);
extern int is_mmdvfs_supported(void);
extern int mmdvfs_set_mmsys_clk(enum MTK_SMI_BWC_SCEN scenario,
int mmsys_clk_mode);
extern enum mmdvfs_lcd_size_enum mmdvfs_get_lcd_resolution(void);
extern int register_mmdvfs_state_change_cb(int mmdvfs_client_id,
mmdvfs_state_change_cb func);
extern void mmdvfs_notify_prepare_action(
struct mmdvfs_prepare_action_event *event);
extern int register_mmdvfs_prepare_cb(int mmdvfs_client_id,
mmdvfs_prepare_action_cb func);
/* The following interface can only used by mmdvfs itself for */
/* default step configuration */
extern void mmdvfs_default_step_set(int default_step);
extern void mmdvfs_default_start_delayed_setting(void);
extern void mmdvfs_default_stop_delayed_setting(void);
extern void mmdvfs_debug_set_mmdvfs_clks_enabled(int clk_enable_request);
extern int mmdvfs_get_current_fine_step(void);
extern void mmdvfs_pm_qos_update_request(struct mmdvfs_pm_qos_request *req,
u32 mmdvfs_pm_qos_class, u32 new_value);
extern void mmdvfs_pm_qos_remove_request(struct mmdvfs_pm_qos_request *req);
extern void mmdvfs_pm_qos_add_request(struct mmdvfs_pm_qos_request *req,
u32 mmdvfs_pm_qos_class, u32 value);
extern u32 mmdvfs_qos_get_thres_count(struct mmdvfs_pm_qos_request *req,
u32 mmdvfs_pm_qos_class);
extern u32 mmdvfs_qos_get_thres_value(struct mmdvfs_pm_qos_request *req,
u32 mmdvfs_pm_qos_class, u32 thres_idx);
extern u32 mmdvfs_qos_get_cur_thres(struct mmdvfs_pm_qos_request *req,
u32 mmdvfs_pm_qos_class);
#include "mmdvfs_config_util.h"
#endif /* __MMDVFS_MGR_H__ */