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

286 lines
9.3 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
/*
* Copyright (c) 2019 MediaTek Inc.
*/
#ifndef __MDP_COMMON_H__
#define __MDP_COMMON_H__
#include "mdp_def.h"
#include "mdp_def_ex.h"
#include "mdp_cmdq_helper_ext.h"
#include <linux/types.h>
#ifdef CONFIG_MTK_SMI_EXT
/* translate port */
typedef uint32_t (*CmdqTranslatePort) (uint32_t engineId);
/* get request */
typedef struct mm_qos_request *(*CmdqGetRequest) (
uint32_t thread_id, uint32_t port);
/* init pmqos mdp */
typedef void (*CmdqInitPmqosMdp) (s32 index, struct plist_head *owner_list);
/* init pmqos isp */
typedef void (*CmdqInitPmqosIsp) (s32 index, struct plist_head *owner_list);
#endif /* CONFIG_MTK_SMI_EXT */
#ifdef CMDQ_SECURE_PATH_SUPPORT
extern const u32 isp_iwc_buf_size[];
#endif
/* dump mmsys config */
typedef void (*CmdqDumpMMSYSConfig) (void);
/* query MDP clock is on */
typedef bool(*CmdqMdpClockIsOn) (enum CMDQ_ENG_ENUM engine);
/* enable MDP clock */
typedef void (*CmdqEnableMdpClock) (bool enable, enum CMDQ_ENG_ENUM engine);
/* Common Clock Framework */
typedef void (*CmdqMdpInitModuleClk) (void);
/* MDP callback function */
typedef s32(*CmdqMdpClockOn) (u64 engineFlag);
typedef s32(*CmdqMdpDumpInfo) (u64 engineFlag, int level);
typedef s32(*CmdqMdpResetEng) (u64 engineFlag);
typedef s32(*CmdqMdpClockOff) (u64 engineFlag);
/* MDP Initialization setting */
typedef void(*CmdqMdpInitialSet) (void);
/* Initialization & de-initialization MDP base VA */
typedef void (*CmdqMdpInitModuleBaseVA) (void);
typedef void (*CmdqMdpDeinitModuleBaseVA) (void);
/* MDP engine dump */
typedef void (*CmdqMdpDumpRSZ) (const unsigned long base, const char *label);
typedef void (*CmdqMdpDumpTDSHP) (const unsigned long base, const char *label);
/* test MDP clock function */
typedef u32(*CmdqMdpRdmaGetRegOffsetSrcAddr) (void);
typedef u32(*CmdqMdpWrotGetRegOffsetDstAddr) (void);
typedef u32(*CmdqMdpWdmaGetRegOffsetDstAddr) (void);
typedef void (*CmdqTestcaseClkmgrMdp) (void);
typedef const char*(*CmdqDispatchModule) (u64 engineFlag);
typedef void (*CmdqTrackTask) (const struct cmdqRecStruct *task);
typedef const char *(*CmdqPraseErrorModByEngFlag) (
const struct cmdqRecStruct *task);
typedef const char *(*CmdqPraseHandleErrorModByEngFlag) (
const struct cmdqRecStruct *handle);
typedef u64 (*CmdqMdpGetEngineGroupBits) (u32 engine_group);
typedef void (*CmdqMdpEnableCommonClock) (bool enable);
typedef void (*CmdqCheckHwStatus) (struct cmdqRecStruct *handle);
typedef u64(*CmdqMdpGetSecEngine) (u64 engine_flag);
typedef void (*CmdqMdpResolveToken) (u64 engine_flag,
const struct cmdqRecStruct *task);
typedef void (*CmdqMdpComposeReadback) (struct cmdqRecStruct *handle,
u16 engine, dma_addr_t dma, u32 param);
typedef void (*CmdqMdpReadbackEngine) (struct cmdqRecStruct *handle,
u16 engine, phys_addr_t base, dma_addr_t pa, u32 param);
struct cmdqMDPFuncStruct {
#ifdef CONFIG_MTK_SMI_EXT
CmdqTranslatePort translatePort;
CmdqGetRequest getRequest;
CmdqInitPmqosMdp initPmqosMdp;
CmdqInitPmqosIsp initPmqosIsp;
#endif /* CONFIG_MTK_SMI_EXT */
CmdqDumpMMSYSConfig dumpMMSYSConfig;
CmdqMdpInitModuleBaseVA initModuleBaseVA;
CmdqMdpDeinitModuleBaseVA deinitModuleBaseVA;
CmdqMdpClockIsOn mdpClockIsOn;
CmdqEnableMdpClock enableMdpClock;
CmdqMdpInitModuleClk initModuleCLK;
CmdqMdpDumpRSZ mdpDumpRsz;
CmdqMdpDumpTDSHP mdpDumpTdshp;
CmdqMdpClockOn mdpClockOn;
CmdqMdpDumpInfo mdpDumpInfo;
CmdqMdpResetEng mdpResetEng;
CmdqMdpClockOff mdpClockOff;
CmdqMdpInitialSet mdpInitialSet;
CmdqMdpRdmaGetRegOffsetSrcAddr rdmaGetRegOffsetSrcAddr;
CmdqMdpWrotGetRegOffsetDstAddr wrotGetRegOffsetDstAddr;
CmdqMdpWdmaGetRegOffsetDstAddr wdmaGetRegOffsetDstAddr;
CmdqTestcaseClkmgrMdp testcaseClkmgrMdp;
CmdqDispatchModule dispatchModule;
CmdqTrackTask trackTask;
CmdqPraseErrorModByEngFlag parseErrModByEngFlag;
CmdqPraseHandleErrorModByEngFlag parseHandleErrModByEngFlag;
CmdqMdpGetEngineGroupBits getEngineGroupBits;
CmdqErrorResetCB errorReset;
CmdqMdpEnableCommonClock mdpEnableCommonClock;
CmdqBeginTaskCB beginTask;
CmdqEndTaskCB endTask;
CmdqBeginTaskCB beginISPTask;
CmdqEndTaskCB endISPTask;
CmdqCheckHwStatus CheckHwStatus;
CmdqMdpGetSecEngine mdpGetSecEngine;
CmdqMdpResolveToken resolve_token;
CmdqMdpComposeReadback mdpComposeReadback;
CmdqMdpReadbackEngine mdpReadbackAal;
CmdqMdpReadbackEngine mdpReadbackHdr;
};
struct mdp_pmqos_record {
uint32_t mdp_throughput;
struct timeval submit_tm;
struct timeval end_tm;
};
/* track MDP task */
#define DEBUG_STR_LEN 1024 /* debug str length */
#define MDP_MAX_TASK_NUM 5 /* num of tasks to be keep */
#define MDP_MAX_PLANE_NUM 3 /* max color format plane num */
/* each plane has 2 info address and size */
#define MDP_PORT_BUF_INFO_NUM (MDP_MAX_PLANE_NUM * 2)
#define MDP_BUF_INFO_STR_LEN 8 /* each buf info length */
/* dispatch key format is MDP_(ThreadName) */
#define MDP_DISPATCH_KEY_STR_LEN (TASK_COMM_LEN + 5)
#define MDP_TOTAL_THREAD 16
#ifdef CMDQ_SECURE_PATH_SUPPORT
#define MDP_THREAD_START (CMDQ_MIN_SECURE_THREAD_ID + 2)
#define MDP_MAX_METADATA_COUNT_SIZE ( \
(0xFFFFFFFF) / (sizeof(struct cmdqSecAddrMetadataStruct)))
#else
#define MDP_THREAD_START CMDQ_DYNAMIC_THREAD_ID_START
#endif
/* MDP common kernel logic */
void cmdq_mdp_fix_command_scenario_for_user_space(
struct cmdqCommandStruct *command);
bool cmdq_mdp_is_request_from_user_space(
const enum CMDQ_SCENARIO_ENUM scenario);
s32 cmdq_mdp_query_usage(s32 *counters);
s32 cmdq_mdp_get_smi_usage(void);
void cmdq_mdp_reset_resource(void);
void cmdq_mdp_dump_thread_usage(void);
void cmdq_mdp_dump_engine_usage(void);
void cmdq_mdp_dump_resource(u32 event);
void cmdq_mdp_init_resource(u32 engine_id,
enum cmdq_event res_event);
void cmdq_mdp_enable_res(u64 engine_flag, bool enable);
void cmdq_mdp_lock_resource(u64 engine_flag, bool from_notify);
bool cmdq_mdp_acquire_resource(enum cmdq_event res_event,
u64 *engine_flag_out);
void cmdq_mdp_release_resource(enum cmdq_event res_event,
u64 *engine_flag_out);
void cmdq_mdp_set_resource_callback(enum cmdq_event res_event,
CmdqResourceAvailableCB res_available,
CmdqResourceReleaseCB res_release);
void cmdq_mdp_unlock_thread(struct cmdqRecStruct *handle);
void cmdq_mdp_op_readback(struct cmdqRecStruct *handle, u16 engine,
dma_addr_t dma, u32 param);
s32 cmdq_mdp_flush_async(struct cmdqCommandStruct *desc, bool user_space,
struct cmdqRecStruct **handle_out);
s32 cmdq_mdp_flush_async_impl(struct cmdqRecStruct *handle);
struct cmdqRecStruct *cmdq_mdp_get_valid_handle(unsigned long job);
s32 cmdq_mdp_wait(struct cmdqRecStruct *handle,
struct cmdqRegValueStruct *results);
s32 cmdq_mdp_flush(struct cmdqCommandStruct *desc, bool user_space);
void cmdq_mdp_suspend(void);
void cmdq_mdp_resume(void);
void cmdq_mdp_release_task_by_file_node(void *file_node);
void cmdq_mdp_init(struct platform_device *pdev);
void cmdq_mdp_deinit_pmqos(void);
s32 cmdq_mdp_handle_create(struct cmdqRecStruct **handle_out);
s32 cmdq_mdp_handle_flush(struct cmdqRecStruct *handle);
s32 cmdq_mdp_handle_sec_setup(struct cmdqSecDataStruct *secData,
struct cmdqRecStruct *handle);
void cmdq_mdp_init_secure_id(void *meta_array, u32 count);
s32 cmdq_mdp_update_sec_addr_index(struct cmdqRecStruct *handle,
u32 sec_handle, u32 index, u32 instr_index);
u32 cmdq_mdp_handle_get_instr_count(struct cmdqRecStruct *handle);
void cmdq_mdp_meta_replace_sec_addr(struct op_meta *metas,
struct mdp_submit *user_job,
struct cmdqRecStruct *handle);
/* Platform dependent function */
void cmdq_mdp_virtual_function_setting(void);
void cmdq_mdp_map_mmsys_VA(void);
long cmdq_mdp_get_module_base_VA_MMSYS_CONFIG(void);
void cmdq_mdp_unmap_mmsys_VA(void);
struct cmdqMDPFuncStruct *cmdq_mdp_get_func(void);
void cmdq_mdp_enable(u64 engineFlag, enum CMDQ_ENG_ENUM engine);
int cmdq_mdp_loop_reset(enum CMDQ_ENG_ENUM engine,
const unsigned long resetReg,
const unsigned long resetStateReg,
const u32 resetMask,
const u32 resetValue, const bool pollInitResult);
void cmdq_mdp_loop_off(enum CMDQ_ENG_ENUM engine,
const unsigned long resetReg,
const unsigned long resetStateReg,
const u32 resetMask,
const u32 resetValue, const bool pollInitResult);
const char *cmdq_mdp_get_rsz_state(const u32 state);
void cmdq_mdp_dump_venc(const unsigned long base, const char *label);
void cmdq_mdp_dump_rdma(const unsigned long base, const char *label);
void cmdq_mdp_dump_rot(const unsigned long base, const char *label);
void cmdq_mdp_dump_color(const unsigned long base, const char *label);
void cmdq_mdp_dump_wdma(const unsigned long base, const char *label);
void cmdq_mdp_check_TF_address(unsigned int mva, char *module);
const char *cmdq_mdp_parse_error_module_by_hwflag(
const struct cmdqRecStruct *task);
const char *cmdq_mdp_parse_handle_error_module_by_hwflag(
const struct cmdqRecStruct *handle);
/* Platform dependent function */
s32 cmdqMdpClockOn(u64 engineFlag);
s32 cmdqMdpDumpInfo(u64 engineFlag, int level);
s32 cmdqMdpResetEng(u64 engineFlag);
s32 cmdqMdpClockOff(u64 engineFlag);
u32 cmdq_mdp_rdma_get_reg_offset_src_addr(void);
u32 cmdq_mdp_wrot_get_reg_offset_dst_addr(void);
u32 cmdq_mdp_wdma_get_reg_offset_dst_addr(void);
void testcase_clkmgr_mdp(void);
u32 cmdq_mdp_get_hw_reg(enum MDP_ENG_BASE base, u16 offset);
u32 cmdq_mdp_get_hw_port(enum MDP_ENG_BASE base);
/* Platform virtual function setting */
void cmdq_mdp_platform_function_setting(void);
long cmdq_mdp_get_module_base_VA_MDP_WROT0(void);
#endif /* __MDP_COMMON_H__ */