| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204 |
- #include "cmdq_core.h"
- #include "cmdq_reg.h"
- #include "cmdq_device.h"
- #include "cmdq_virtual.h"
- #include <linux/seq_file.h>
- #ifdef CMDQ_CONFIG_SMI
- #include "smi_debug.h"
- #endif
- #ifdef CMDQ_CG_M4U_LARB0
- #include "m4u.h"
- #endif
- static cmdqCoreFuncStruct gFunctionPointer;
- uint64_t cmdq_virtual_flag_from_scenario_default(CMDQ_SCENARIO_ENUM scn)
- {
- uint64_t flag = 0;
- switch (scn) {
- case CMDQ_SCENARIO_JPEG_DEC:
- flag = (1LL << CMDQ_ENG_JPEG_DEC);
- break;
- case CMDQ_SCENARIO_SUB_MEMOUT:
- flag = ((1LL << CMDQ_ENG_DISP_OVL1) | (1LL << CMDQ_ENG_DISP_WDMA1));
- break;
- case CMDQ_SCENARIO_KERNEL_CONFIG_GENERAL:
- flag = 0LL;
- break;
- case CMDQ_SCENARIO_DISP_CONFIG_AAL:
- case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_GAMMA:
- case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_DITHER:
- case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_PWM:
- case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_PQ:
- case CMDQ_SCENARIO_DISP_CONFIG_SUB_GAMMA:
- case CMDQ_SCENARIO_DISP_CONFIG_SUB_DITHER:
- case CMDQ_SCENARIO_DISP_CONFIG_SUB_PWM:
- case CMDQ_SCENARIO_DISP_CONFIG_SUB_PQ:
- case CMDQ_SCENARIO_DISP_CONFIG_OD:
- flag = 0LL;
- break;
- case CMDQ_SCENARIO_TRIGGER_LOOP:
- case CMDQ_SCENARIO_HIGHP_TRIGGER_LOOP:
- case CMDQ_SCENARIO_LOWP_TRIGGER_LOOP:
- /* Trigger loop does not related to any HW by itself. */
- flag = 0LL;
- break;
- case CMDQ_SCENARIO_USER_SPACE:
- /* user space case, engine flag is passed seprately */
- flag = 0LL;
- break;
- case CMDQ_SCENARIO_DEBUG:
- case CMDQ_SCENARIO_DEBUG_PREFETCH:
- flag = 0LL;
- break;
- case CMDQ_SCENARIO_DISP_ESD_CHECK:
- case CMDQ_SCENARIO_DISP_SCREEN_CAPTURE:
- /* ESD check uses separate thread (not config, not trigger) */
- flag = 0LL;
- break;
- case CMDQ_SCENARIO_DISP_COLOR:
- case CMDQ_SCENARIO_USER_DISP_COLOR:
- /* color path */
- flag = 0LL;
- break;
- case CMDQ_SCENARIO_DISP_MIRROR_MODE:
- flag = 0LL;
- break;
- case CMDQ_SCENARIO_DISP_PRIMARY_DISABLE_SECURE_PATH:
- case CMDQ_SCENARIO_DISP_SUB_DISABLE_SECURE_PATH:
- /* secure path */
- flag = 0LL;
- break;
- case CMDQ_SCENARIO_SECURE_NOTIFY_LOOP:
- flag = 0LL;
- break;
- default:
- if (scn < 0 || scn >= CMDQ_MAX_SCENARIO_COUNT) {
- /* Error status print */
- CMDQ_ERR("Unknown scenario type %d\n", scn);
- }
- flag = 0LL;
- break;
- }
- return flag;
- }
- const char *cmdq_virtual_parse_module_from_reg_addr_legacy(uint32_t reg_addr)
- {
- const uint32_t addr_base_and_page = (reg_addr & 0xFFFFF000);
- /* for well-known base, we check them with 12-bit mask */
- /* defined in mt_reg_base.h */
- /* TODO: comfirm with SS if IO_VIRT_TO_PHYS workable when enable device tree? */
- switch (addr_base_and_page) {
- case 0x14000000:
- return "MMSYS";
- case 0x14001000:
- return "MDP_RDMA0";
- case 0x14002000:
- return "MDP_RDMA1";
- case 0x14003000:
- return "MDP_RSZ0";
- case 0x14004000:
- return "MDP_RSZ1";
- case 0x14005000:
- return "MDP_RSZ2";
- case 0x14006000:
- return "MDP_WDMA";
- case 0x14007000:
- return "MDP_WROT0";
- case 0x14008000:
- return "MDP_WROT1";
- case 0x14009000:
- return "MDP_TDSHP0";
- case 0x1400A000:
- return "MDP_TDSHP1";
- case 0x1400B000:
- return "MDP_CROP";
- case 0x1400C000:
- return "DISP_OVL0";
- case 0x1400D000:
- return "DISP_OVL1";
- case 0x14013000:
- return "COLOR0";
- case 0x14014000:
- return "COLOR1";
- case 0x14015000:
- return "AAL";
- case 0x14016000:
- return "GAMA";
- case 0x14020000:
- return "MMSYS_MUTEX";
- case 0x18000000:
- return "VENC_GCON";
- case 0x18002000:
- return "VENC";
- case 0x18003000:
- return "JPGENC";
- case 0x18004000:
- return "JPGDEC";
- }
- /* for other register address we rely on GCE subsys to group them with */
- /* 16-bit mask. */
- return cmdq_core_parse_subsys_from_reg_addr(reg_addr);
- }
- uint64_t cmdq_virtual_flag_from_scenario_legacy(CMDQ_SCENARIO_ENUM scn)
- {
- uint64_t flag = 0;
- switch (scn) {
- case CMDQ_SCENARIO_PRIMARY_DISP:
- flag = (1LL << CMDQ_ENG_DISP_OVL0) |
- (1LL << CMDQ_ENG_DISP_COLOR0) |
- (1LL << CMDQ_ENG_DISP_AAL) |
- (1LL << CMDQ_ENG_DISP_RDMA0) |
- (1LL << CMDQ_ENG_DISP_UFOE) | (1LL << CMDQ_ENG_DISP_DSI0_CMD);
- break;
- case CMDQ_SCENARIO_PRIMARY_MEMOUT:
- flag = ((1LL << CMDQ_ENG_DISP_OVL0) | (1LL << CMDQ_ENG_DISP_WDMA0));
- break;
- case CMDQ_SCENARIO_PRIMARY_ALL:
- flag = ((1LL << CMDQ_ENG_DISP_OVL0) |
- (1LL << CMDQ_ENG_DISP_WDMA0) |
- (1LL << CMDQ_ENG_DISP_COLOR0) |
- (1LL << CMDQ_ENG_DISP_AAL) |
- (1LL << CMDQ_ENG_DISP_RDMA0) |
- (1LL << CMDQ_ENG_DISP_UFOE) | (1LL << CMDQ_ENG_DISP_DSI0_CMD));
- break;
- case CMDQ_SCENARIO_SUB_DISP:
- flag = ((1LL << CMDQ_ENG_DISP_OVL1) |
- (1LL << CMDQ_ENG_DISP_COLOR1) |
- (1LL << CMDQ_ENG_DISP_GAMMA) |
- (1LL << CMDQ_ENG_DISP_RDMA1) | (1LL << CMDQ_ENG_DISP_DSI1_CMD));
- break;
- case CMDQ_SCENARIO_SUB_ALL:
- flag = ((1LL << CMDQ_ENG_DISP_OVL1) |
- (1LL << CMDQ_ENG_DISP_WDMA1) |
- (1LL << CMDQ_ENG_DISP_COLOR1) |
- (1LL << CMDQ_ENG_DISP_GAMMA) |
- (1LL << CMDQ_ENG_DISP_RDMA1) | (1LL << CMDQ_ENG_DISP_DSI1_CMD));
- break;
- case CMDQ_SCENARIO_MHL_DISP:
- flag = ((1LL << CMDQ_ENG_DISP_OVL1) |
- (1LL << CMDQ_ENG_DISP_COLOR1) |
- (1LL << CMDQ_ENG_DISP_GAMMA) |
- (1LL << CMDQ_ENG_DISP_RDMA1) | (1LL << CMDQ_ENG_DISP_DPI));
- break;
- case CMDQ_SCENARIO_RDMA0_DISP:
- flag = ((1LL << CMDQ_ENG_DISP_RDMA0) |
- (1LL << CMDQ_ENG_DISP_UFOE) | (1LL << CMDQ_ENG_DISP_DSI0_CMD));
- break;
- case CMDQ_SCENARIO_RDMA2_DISP:
- flag = ((1LL << CMDQ_ENG_DISP_RDMA2) | (1LL << CMDQ_ENG_DISP_DPI));
- break;
- default:
- flag = 0LL;
- break;
- }
- return flag;
- }
- /*
- * GCE capability
- */
- uint32_t cmdq_virtual_get_subsys_LSB_in_argA(void)
- {
- return 16;
- }
- /* HW thread related */
- bool cmdq_virtual_is_a_secure_thread(const int32_t thread)
- {
- #ifdef CMDQ_SECURE_PATH_SUPPORT
- if ((CMDQ_MIN_SECURE_THREAD_ID <= thread) &&
- (CMDQ_MIN_SECURE_THREAD_ID + CMDQ_MAX_SECURE_THREAD_COUNT > thread)) {
- return true;
- }
- #endif
- return false;
- }
- bool cmdq_virtual_is_valid_notify_thread_for_secure_path(const int32_t thread)
- {
- #if defined(CMDQ_SECURE_PATH_SUPPORT) && !defined(CMDQ_SECURE_PATH_NORMAL_IRQ)
- return (15 == thread) ? (true) : (false);
- #else
- return false;
- #endif
- }
- /**
- * Scenario related
- *
- */
- bool cmdq_virtual_is_disp_scenario(const CMDQ_SCENARIO_ENUM scenario)
- {
- bool dispScenario = false;
- switch (scenario) {
- case CMDQ_SCENARIO_PRIMARY_DISP:
- case CMDQ_SCENARIO_PRIMARY_MEMOUT:
- case CMDQ_SCENARIO_PRIMARY_ALL:
- case CMDQ_SCENARIO_SUB_DISP:
- case CMDQ_SCENARIO_SUB_MEMOUT:
- case CMDQ_SCENARIO_SUB_ALL:
- case CMDQ_SCENARIO_MHL_DISP:
- case CMDQ_SCENARIO_RDMA0_DISP:
- case CMDQ_SCENARIO_RDMA1_DISP:
- case CMDQ_SCENARIO_RDMA2_DISP:
- case CMDQ_SCENARIO_RDMA0_COLOR0_DISP:
- case CMDQ_SCENARIO_TRIGGER_LOOP:
- case CMDQ_SCENARIO_HIGHP_TRIGGER_LOOP:
- case CMDQ_SCENARIO_LOWP_TRIGGER_LOOP:
- case CMDQ_SCENARIO_DISP_CONFIG_AAL:
- case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_GAMMA:
- case CMDQ_SCENARIO_DISP_CONFIG_SUB_GAMMA:
- case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_DITHER:
- case CMDQ_SCENARIO_DISP_CONFIG_SUB_DITHER:
- case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_PWM:
- case CMDQ_SCENARIO_DISP_CONFIG_SUB_PWM:
- case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_PQ:
- case CMDQ_SCENARIO_DISP_CONFIG_SUB_PQ:
- case CMDQ_SCENARIO_DISP_ESD_CHECK:
- case CMDQ_SCENARIO_DISP_SCREEN_CAPTURE:
- case CMDQ_SCENARIO_DISP_MIRROR_MODE:
- case CMDQ_SCENARIO_DISP_CONFIG_OD:
- /* color path */
- case CMDQ_SCENARIO_DISP_COLOR:
- case CMDQ_SCENARIO_USER_DISP_COLOR:
- /* secure path */
- case CMDQ_SCENARIO_DISP_PRIMARY_DISABLE_SECURE_PATH:
- case CMDQ_SCENARIO_DISP_SUB_DISABLE_SECURE_PATH:
- dispScenario = true;
- break;
- default:
- break;
- }
- /* freely dispatch */
- return dispScenario;
- }
- bool cmdq_virtual_should_enable_prefetch(CMDQ_SCENARIO_ENUM scenario)
- {
- bool shouldPrefetch = false;
- switch (scenario) {
- case CMDQ_SCENARIO_PRIMARY_DISP:
- case CMDQ_SCENARIO_PRIMARY_ALL:
- case CMDQ_SCENARIO_HIGHP_TRIGGER_LOOP:
- case CMDQ_SCENARIO_DEBUG_PREFETCH: /* HACK: force debug into 0/1 thread */
- /* any path that connects to Primary DISP HW */
- /* should enable prefetch. */
- /* MEMOUT scenarios does not. */
- /* Also, since thread 0/1 shares one prefetch buffer, */
- /* we allow only PRIMARY path to use prefetch. */
- shouldPrefetch = true;
- break;
- default:
- break;
- }
- return shouldPrefetch;
- }
- bool cmdq_virtual_should_profile(CMDQ_SCENARIO_ENUM scenario)
- {
- bool shouldProfile = false;
- #ifdef CMDQ_GPR_SUPPORT
- switch (scenario) {
- case CMDQ_SCENARIO_DEBUG_PREFETCH:
- case CMDQ_SCENARIO_DEBUG:
- return true;
- default:
- break;
- }
- #else
- /* note command profile method depends on GPR */
- CMDQ_ERR("func:%s failed since CMDQ doesn't support GPR\n", __func__);
- #endif
- return shouldProfile;
- }
- int cmdq_virtual_disp_thread(CMDQ_SCENARIO_ENUM scenario)
- {
- switch (scenario) {
- case CMDQ_SCENARIO_PRIMARY_DISP:
- case CMDQ_SCENARIO_PRIMARY_ALL:
- case CMDQ_SCENARIO_DISP_CONFIG_AAL:
- case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_GAMMA:
- case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_DITHER:
- case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_PWM:
- case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_PQ:
- case CMDQ_SCENARIO_DISP_CONFIG_OD:
- case CMDQ_SCENARIO_RDMA0_DISP:
- case CMDQ_SCENARIO_RDMA0_COLOR0_DISP:
- case CMDQ_SCENARIO_DEBUG_PREFETCH: /* HACK: force debug into 0/1 thread */
- /* primary config: thread 0 */
- return 0;
- case CMDQ_SCENARIO_SUB_DISP:
- case CMDQ_SCENARIO_SUB_ALL:
- case CMDQ_SCENARIO_MHL_DISP:
- case CMDQ_SCENARIO_RDMA1_DISP:
- case CMDQ_SCENARIO_RDMA2_DISP:
- case CMDQ_SCENARIO_DISP_CONFIG_SUB_GAMMA:
- case CMDQ_SCENARIO_DISP_CONFIG_SUB_DITHER:
- case CMDQ_SCENARIO_DISP_CONFIG_SUB_PQ:
- case CMDQ_SCENARIO_DISP_CONFIG_SUB_PWM:
- case CMDQ_SCENARIO_SUB_MEMOUT:
- /* when HW thread 0 enables pre-fetch, */
- /* any thread 1 operation will let HW thread 0's behavior abnormally */
- /* forbid thread 1 */
- return 5;
- case CMDQ_SCENARIO_HIGHP_TRIGGER_LOOP:
- return 2;
- case CMDQ_SCENARIO_DISP_ESD_CHECK:
- return 6;
- case CMDQ_SCENARIO_DISP_SCREEN_CAPTURE:
- case CMDQ_SCENARIO_DISP_MIRROR_MODE:
- return 3;
- case CMDQ_SCENARIO_DISP_COLOR:
- case CMDQ_SCENARIO_USER_DISP_COLOR:
- case CMDQ_SCENARIO_PRIMARY_MEMOUT:
- return 4;
- default:
- /* freely dispatch */
- return CMDQ_INVALID_THREAD;
- }
- /* freely dispatch */
- return CMDQ_INVALID_THREAD;
- }
- int cmdq_virtual_get_thread_index(CMDQ_SCENARIO_ENUM scenario, const bool secure)
- {
- #if defined(CMDQ_SECURE_PATH_SUPPORT) && !defined(CMDQ_SECURE_PATH_NORMAL_IRQ)
- if (!secure && CMDQ_SCENARIO_SECURE_NOTIFY_LOOP == scenario)
- return 15;
- #endif
- if (!secure)
- return cmdq_get_func()->dispThread(scenario);
- /* dispatch secure thread according to scenario */
- switch (scenario) {
- case CMDQ_SCENARIO_DISP_PRIMARY_DISABLE_SECURE_PATH:
- case CMDQ_SCENARIO_PRIMARY_DISP:
- case CMDQ_SCENARIO_PRIMARY_ALL:
- case CMDQ_SCENARIO_RDMA0_DISP:
- case CMDQ_SCENARIO_DEBUG_PREFETCH:
- /* CMDQ_MIN_SECURE_THREAD_ID */
- return 12;
- case CMDQ_SCENARIO_DISP_SUB_DISABLE_SECURE_PATH:
- case CMDQ_SCENARIO_SUB_DISP:
- case CMDQ_SCENARIO_SUB_ALL:
- case CMDQ_SCENARIO_MHL_DISP:
- /* because mirror mode and sub disp never use at the same time in secure path, */
- /* dispatch to same HW thread */
- case CMDQ_SCENARIO_DISP_MIRROR_MODE:
- case CMDQ_SCENARIO_DISP_COLOR:
- case CMDQ_SCENARIO_PRIMARY_MEMOUT:
- return 13;
- case CMDQ_SCENARIO_USER_MDP:
- case CMDQ_SCENARIO_USER_SPACE:
- case CMDQ_SCENARIO_DEBUG:
- /* because there is one input engine for MDP, reserve one secure thread is enough */
- return 14;
- default:
- CMDQ_ERR("no dedicated secure thread for senario:%d\n", scenario);
- return CMDQ_INVALID_THREAD;
- }
- }
- CMDQ_HW_THREAD_PRIORITY_ENUM cmdq_virtual_priority_from_scenario(CMDQ_SCENARIO_ENUM scenario)
- {
- switch (scenario) {
- case CMDQ_SCENARIO_PRIMARY_DISP:
- case CMDQ_SCENARIO_PRIMARY_ALL:
- case CMDQ_SCENARIO_SUB_MEMOUT:
- case CMDQ_SCENARIO_SUB_DISP:
- case CMDQ_SCENARIO_SUB_ALL:
- case CMDQ_SCENARIO_RDMA1_DISP:
- case CMDQ_SCENARIO_RDMA2_DISP:
- case CMDQ_SCENARIO_MHL_DISP:
- case CMDQ_SCENARIO_RDMA0_DISP:
- case CMDQ_SCENARIO_RDMA0_COLOR0_DISP:
- case CMDQ_SCENARIO_DISP_MIRROR_MODE:
- case CMDQ_SCENARIO_PRIMARY_MEMOUT:
- case CMDQ_SCENARIO_DISP_CONFIG_AAL:
- case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_GAMMA:
- case CMDQ_SCENARIO_DISP_CONFIG_SUB_GAMMA:
- case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_DITHER:
- case CMDQ_SCENARIO_DISP_CONFIG_SUB_DITHER:
- case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_PWM:
- case CMDQ_SCENARIO_DISP_CONFIG_SUB_PWM:
- case CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_PQ:
- case CMDQ_SCENARIO_DISP_CONFIG_SUB_PQ:
- case CMDQ_SCENARIO_DISP_CONFIG_OD:
- /* color path */
- case CMDQ_SCENARIO_DISP_COLOR:
- case CMDQ_SCENARIO_USER_DISP_COLOR:
- /* secure path */
- case CMDQ_SCENARIO_DISP_PRIMARY_DISABLE_SECURE_PATH:
- case CMDQ_SCENARIO_DISP_SUB_DISABLE_SECURE_PATH:
- /* currently, a prefetch thread is always in high priority. */
- return CMDQ_THR_PRIO_DISPLAY_CONFIG;
- /* HACK: force debug into 0/1 thread */
- case CMDQ_SCENARIO_DEBUG_PREFETCH:
- return CMDQ_THR_PRIO_DISPLAY_CONFIG;
- case CMDQ_SCENARIO_DISP_ESD_CHECK:
- case CMDQ_SCENARIO_DISP_SCREEN_CAPTURE:
- return CMDQ_THR_PRIO_DISPLAY_ESD;
- case CMDQ_SCENARIO_HIGHP_TRIGGER_LOOP:
- return CMDQ_THR_PRIO_SUPERHIGH;
- case CMDQ_SCENARIO_LOWP_TRIGGER_LOOP:
- return CMDQ_THR_PRIO_SUPERLOW;
- default:
- /* other cases need exta logic, see below. */
- break;
- }
- if (cmdq_get_func()->isLoopScenario(scenario, true))
- return CMDQ_THR_PRIO_DISPLAY_TRIGGER;
- else
- return CMDQ_THR_PRIO_NORMAL;
- }
- bool cmdq_virtual_force_loop_irq(CMDQ_SCENARIO_ENUM scenario)
- {
- bool forceLoop = false;
- #ifdef CMDQ_SECURE_PATH_SUPPORT
- if (CMDQ_SCENARIO_SECURE_NOTIFY_LOOP == scenario) {
- /* For secure notify loop, we need IRQ to update secure task */
- forceLoop = true;
- }
- #endif
- if (CMDQ_SCENARIO_HIGHP_TRIGGER_LOOP == scenario
- || CMDQ_SCENARIO_LOWP_TRIGGER_LOOP == scenario) {
- /* For monitor thread loop, we need IRQ to set callback function */
- forceLoop = true;
- }
- return forceLoop;
- }
- bool cmdq_virtual_is_loop_scenario(CMDQ_SCENARIO_ENUM scenario, bool displayOnly)
- {
- #ifdef CMDQ_SECURE_PATH_SUPPORT
- if (!displayOnly && CMDQ_SCENARIO_SECURE_NOTIFY_LOOP == scenario)
- return true;
- #endif
- if (CMDQ_SCENARIO_TRIGGER_LOOP == scenario
- || CMDQ_SCENARIO_HIGHP_TRIGGER_LOOP == scenario
- || CMDQ_SCENARIO_LOWP_TRIGGER_LOOP == scenario)
- return true;
- return false;
- }
- /**
- * Module dependent
- *
- */
- void cmdq_virtual_get_reg_id_from_hwflag(uint64_t hwflag, CMDQ_DATA_REGISTER_ENUM *valueRegId,
- CMDQ_DATA_REGISTER_ENUM *destRegId,
- CMDQ_EVENT_ENUM *regAccessToken)
- {
- *regAccessToken = CMDQ_SYNC_TOKEN_INVALID;
- if (hwflag & (1LL << CMDQ_ENG_JPEG_ENC)) {
- *valueRegId = CMDQ_DATA_REG_JPEG;
- *destRegId = CMDQ_DATA_REG_JPEG_DST;
- *regAccessToken = CMDQ_SYNC_TOKEN_GPR_SET_0;
- } else if (hwflag & (1LL << CMDQ_ENG_MDP_TDSHP0)) {
- *valueRegId = CMDQ_DATA_REG_2D_SHARPNESS_0;
- *destRegId = CMDQ_DATA_REG_2D_SHARPNESS_0_DST;
- *regAccessToken = CMDQ_SYNC_TOKEN_GPR_SET_1;
- } else if (hwflag & (1LL << CMDQ_ENG_MDP_TDSHP1)) {
- *valueRegId = CMDQ_DATA_REG_2D_SHARPNESS_1;
- *destRegId = CMDQ_DATA_REG_2D_SHARPNESS_1_DST;
- *regAccessToken = CMDQ_SYNC_TOKEN_GPR_SET_2;
- } else if (hwflag & ((1LL << CMDQ_ENG_DISP_COLOR0 | (1LL << CMDQ_ENG_DISP_COLOR1)))) {
- *valueRegId = CMDQ_DATA_REG_PQ_COLOR;
- *destRegId = CMDQ_DATA_REG_PQ_COLOR_DST;
- *regAccessToken = CMDQ_SYNC_TOKEN_GPR_SET_3;
- } else {
- /* assume others are debug cases */
- *valueRegId = CMDQ_DATA_REG_DEBUG;
- *destRegId = CMDQ_DATA_REG_DEBUG_DST;
- *regAccessToken = CMDQ_SYNC_TOKEN_GPR_SET_4;
- }
- }
- const char *cmdq_virtual_module_from_event_id(const int32_t event)
- {
- const char *module = "CMDQ";
- switch (event) {
- case CMDQ_EVENT_DISP_RDMA0_SOF:
- case CMDQ_EVENT_DISP_RDMA1_SOF:
- case CMDQ_EVENT_DISP_RDMA2_SOF:
- case CMDQ_EVENT_DISP_RDMA0_EOF:
- case CMDQ_EVENT_DISP_RDMA1_EOF:
- case CMDQ_EVENT_DISP_RDMA2_EOF:
- case CMDQ_EVENT_DISP_RDMA0_UNDERRUN:
- case CMDQ_EVENT_DISP_RDMA1_UNDERRUN:
- case CMDQ_EVENT_DISP_RDMA2_UNDERRUN:
- module = "DISP_RDMA";
- break;
- case CMDQ_EVENT_DISP_WDMA0_SOF:
- case CMDQ_EVENT_DISP_WDMA1_SOF:
- case CMDQ_EVENT_DISP_WDMA0_EOF:
- case CMDQ_EVENT_DISP_WDMA1_EOF:
- module = "DISP_WDMA";
- break;
- case CMDQ_EVENT_DISP_OVL0_SOF:
- case CMDQ_EVENT_DISP_OVL1_SOF:
- case CMDQ_EVENT_DISP_2L_OVL0_SOF:
- case CMDQ_EVENT_DISP_2L_OVL1_SOF:
- case CMDQ_EVENT_DISP_OVL0_EOF:
- case CMDQ_EVENT_DISP_OVL1_EOF:
- case CMDQ_EVENT_DISP_2L_OVL0_EOF:
- case CMDQ_EVENT_DISP_2L_OVL1_EOF:
- module = "DISP_OVL";
- break;
- case CMDQ_EVENT_UFOD_RAMA0_L0_SOF ... CMDQ_EVENT_UFOD_RAMA1_L3_SOF:
- case CMDQ_EVENT_UFOD_RAMA0_L0_EOF ... CMDQ_EVENT_UFOD_RAMA1_L3_EOF:
- module = "DISP_UFOD";
- break;
- case CMDQ_EVENT_DSI_TE:
- case CMDQ_EVENT_DSI0_TE:
- case CMDQ_EVENT_DSI1_TE:
- case CMDQ_EVENT_MDP_DSI0_TE_SOF:
- case CMDQ_EVENT_MDP_DSI1_TE_SOF:
- case CMDQ_EVENT_DISP_DSI0_EOF:
- case CMDQ_EVENT_DISP_DSI1_EOF:
- case CMDQ_EVENT_DISP_DPI0_EOF:
- case CMDQ_EVENT_DISP_COLOR_SOF ... CMDQ_EVENT_DISP_DSC_SOF:
- case CMDQ_EVENT_DISP_COLOR_EOF ... CMDQ_EVENT_DISP_DSC_EOF:
- case CMDQ_EVENT_MUTEX0_STREAM_EOF ... CMDQ_EVENT_MUTEX4_STREAM_EOF:
- module = "DISP";
- break;
- case CMDQ_SYNC_TOKEN_CONFIG_DIRTY:
- case CMDQ_SYNC_TOKEN_STREAM_EOF:
- module = "DISP";
- break;
- case CMDQ_EVENT_MDP_RDMA0_SOF ... CMDQ_EVENT_MDP_CROP_SOF:
- case CMDQ_EVENT_MDP_RDMA0_EOF ... CMDQ_EVENT_MDP_CROP_EOF:
- case CMDQ_EVENT_MUTEX5_STREAM_EOF ... CMDQ_EVENT_MUTEX9_STREAM_EOF:
- module = "MDP";
- break;
- case CMDQ_EVENT_ISP_PASS2_2_EOF ... CMDQ_EVENT_ISP_PASS1_0_EOF:
- case CMDQ_EVENT_DIP_CQ_THREAD0_EOF ... CMDQ_EVENT_DIP_CQ_THREAD14_EOF:
- case CMDQ_EVENT_DPE_EOF:
- case CMDQ_EVENT_WMF_EOF:
- case CMDQ_EVENT_ISP_SENINF_CAM1_2_3_FULL:
- case CMDQ_EVENT_ISP_SENINF_CAM0_FULL:
- case CMDQ_EVENT_ISP_FRAME_DONE_A:
- case CMDQ_EVENT_ISP_FRAME_DONE_B:
- case CMDQ_EVENT_ISP_CAMSV_0_PASS1_DONE:
- case CMDQ_EVENT_ISP_CAMSV_1_PASS1_DONE:
- case CMDQ_EVENT_ISP_CAMSV_2_PASS1_DONE:
- case CMDQ_EVENT_SENINF_0_FIFO_FULL ... CMDQ_EVENT_SENINF_7_FIFO_FULL:
- module = "ISP";
- break;
- case CMDQ_EVENT_JPEG_ENC_EOF:
- case CMDQ_EVENT_JPEG_ENC_PASS2_EOF:
- case CMDQ_EVENT_JPEG_ENC_PASS1_EOF:
- case CMDQ_EVENT_JPEG_DEC_EOF:
- module = "JPGE";
- break;
- case CMDQ_EVENT_VENC_EOF:
- case CMDQ_EVENT_VENC_MB_DONE:
- case CMDQ_EVENT_VENC_128BYTE_CNT_DONE:
- module = "VENC";
- break;
- default:
- module = "CMDQ";
- break;
- }
- return module;
- }
- const char *cmdq_virtual_parse_module_from_reg_addr(uint32_t reg_addr)
- {
- const uint32_t addr_base_and_page = (reg_addr & 0xFFFFF000);
- #ifdef CMDQ_USE_LEGACY
- return cmdq_virtual_parse_module_from_reg_addr_legacy(reg_addr);
- #else
- /* for well-known base, we check them with 12-bit mask */
- /* defined in mt_reg_base.h */
- /* TODO: comfirm with SS if IO_VIRT_TO_PHYS workable when enable device tree? */
- switch (addr_base_and_page) {
- case 0x14001000: /* MDP_RDMA */
- case 0x14002000: /* MDP_RSZ0 */
- case 0x14003000: /* MDP_RSZ1 */
- case 0x14004000: /* MDP_WDMA */
- case 0x14005000: /* MDP_WROT */
- case 0x14006000: /* MDP_TDSHP */
- return "MDP";
- case 0x1400C000: /* DISP_COLOR */
- return "COLOR";
- case 0x1400D000: /* DISP_COLOR */
- return "CCORR";
- case 0x14007000: /* DISP_OVL0 */
- return "OVL0";
- case 0x14008000: /* DISP_OVL1 */
- return "OVL1";
- case 0x1400E000: /* DISP_AAL */
- case 0x1400F000: /* DISP_GAMMA */
- return "AAL";
- case 0x17002FFF: /* VENC */
- return "VENC";
- case 0x17003FFF: /* JPGENC */
- return "JPGENC";
- case 0x17004FFF: /* JPGDEC */
- return "JPGDEC";
- }
- /* for other register address we rely on GCE subsys to group them with */
- /* 16-bit mask. */
- return cmdq_core_parse_subsys_from_reg_addr(reg_addr);
- #endif
- }
- int32_t cmdq_virtual_can_module_entry_suspend(EngineStruct *engineList)
- {
- int32_t status = 0;
- int i;
- CMDQ_ENG_ENUM e = 0;
- CMDQ_ENG_ENUM mdpEngines[] = {
- CMDQ_ENG_ISP_IMGI,
- CMDQ_ENG_MDP_RDMA0,
- CMDQ_ENG_MDP_RDMA1,
- CMDQ_ENG_MDP_RSZ0,
- CMDQ_ENG_MDP_RSZ1,
- CMDQ_ENG_MDP_RSZ2,
- CMDQ_ENG_MDP_TDSHP0,
- CMDQ_ENG_MDP_TDSHP1,
- CMDQ_ENG_MDP_COLOR0,
- CMDQ_ENG_MDP_WROT0,
- CMDQ_ENG_MDP_WROT1,
- CMDQ_ENG_MDP_WDMA
- };
- for (i = 0; i < (sizeof(mdpEngines) / sizeof(CMDQ_ENG_ENUM)); ++i) {
- e = mdpEngines[i];
- if (0 != engineList[e].userCount) {
- CMDQ_ERR("suspend but engine %d has userCount %d, owner=%d\n",
- e, engineList[e].userCount, engineList[e].currOwner);
- status = -EBUSY;
- }
- }
- return status;
- }
- ssize_t cmdq_virtual_print_status_clock(char *buf)
- {
- int32_t length = 0;
- char *pBuffer = buf;
- #ifdef CMDQ_PWR_AWARE
- /* MT_CG_DISP0_MUTEX_32K is removed in this platform */
- pBuffer += sprintf(pBuffer, "MT_CG_INFRA_GCE: %d\n", cmdq_dev_gce_clock_is_enable());
- #if !defined(CMDQ_USE_CCF) && defined(CMDQ_USE_LEGACY)
- pBuffer += sprintf(pBuffer, ", MT_CG_DISP0_MUTEX_32K: %d", clock_is_on(MT_CG_DISP0_MUTEX_32K));
- #endif
- pBuffer += sprintf(pBuffer, "\n");
- #endif
- length = pBuffer - buf;
- return length;
- }
- void cmdq_virtual_print_status_seq_clock(struct seq_file *m)
- {
- #ifdef CMDQ_PWR_AWARE
- /* MT_CG_DISP0_MUTEX_32K is removed in this platform */
- seq_printf(m, "MT_CG_INFRA_GCE: %d", cmdq_dev_gce_clock_is_enable());
- #if !defined(CMDQ_USE_CCF) && defined(CMDQ_USE_LEGACY)
- seq_printf(m, ", MT_CG_DISP0_MUTEX_32K: %d", clock_is_on(MT_CG_DISP0_MUTEX_32K));
- #endif
- seq_puts(m, "\n");
- #endif
- }
- void cmdq_virtual_enable_common_clock_locked(bool enable)
- {
- #ifdef CMDQ_PWR_AWARE
- if (enable) {
- CMDQ_VERBOSE("[CLOCK] Enable SMI & LARB0 Clock\n");
- cmdq_dev_enable_clock_SMI_COMMON(enable);
- #ifdef CMDQ_CG_M4U_LARB0
- m4u_larb0_enable("CMDQ_MDP");
- #else
- cmdq_dev_enable_clock_SMI_LARB0(enable);
- #endif
- #ifdef CMDQ_USE_LEGACY
- CMDQ_VERBOSE("[CLOCK] enable MT_CG_DISP0_MUTEX_32K\n");
- cmdq_dev_enable_clock_MUTEX_32K(enable);
- #endif
- } else {
- CMDQ_VERBOSE("[CLOCK] Disable SMI & LARB0 Clock\n");
- /* disable, reverse the sequence */
- #ifdef CMDQ_CG_M4U_LARB0
- m4u_larb0_disable("CMDQ_MDP");
- #else
- cmdq_dev_enable_clock_SMI_LARB0(enable);
- #endif
- cmdq_dev_enable_clock_SMI_COMMON(enable);
- #ifdef CMDQ_USE_LEGACY
- CMDQ_VERBOSE("[CLOCK] disable MT_CG_DISP0_MUTEX_32K\n");
- cmdq_dev_enable_clock_MUTEX_32K(enable);
- #endif
- }
- #endif /* CMDQ_PWR_AWARE */
- }
- void cmdq_virtual_enable_gce_clock_locked(bool enable)
- {
- #ifdef CMDQ_PWR_AWARE
- if (enable) {
- CMDQ_VERBOSE("[CLOCK] Enable CMDQ(GCE) Clock\n");
- cmdq_dev_enable_gce_clock(enable);
- } else {
- CMDQ_VERBOSE("[CLOCK] Disable CMDQ(GCE) Clock\n");
- cmdq_dev_enable_gce_clock(enable);
- }
- #endif
- }
- const char *cmdq_virtual_parse_error_module_by_hwflag_impl(const TaskStruct *pTask)
- {
- const char *module = NULL;
- const uint32_t ISP_ONLY[2] = {
- ((1LL << CMDQ_ENG_ISP_IMGI) | (1LL << CMDQ_ENG_ISP_IMG2O)),
- ((1LL << CMDQ_ENG_ISP_IMGI) | (1LL << CMDQ_ENG_ISP_IMG2O) |
- (1LL << CMDQ_ENG_ISP_IMGO))
- };
- /* common part for both normal and secure path */
- /* for JPEG scenario, use HW flag is sufficient */
- if (pTask->engineFlag & (1LL << CMDQ_ENG_JPEG_ENC))
- module = "JPGENC";
- else if (pTask->engineFlag & (1LL << CMDQ_ENG_JPEG_DEC))
- module = "JPGDEC";
- else if ((ISP_ONLY[0] == pTask->engineFlag) || (ISP_ONLY[1] == pTask->engineFlag))
- module = "ISP_ONLY";
- else if (cmdq_get_func()->isDispScenario(pTask->scenario))
- module = "DISP";
- /* for secure path, use HW flag is sufficient */
- do {
- if (NULL != module)
- break;
- if (false == pTask->secData.isSecure) {
- /* normal path, need parse current running instruciton for more detail */
- break;
- } else if (CMDQ_ENG_MDP_GROUP_FLAG(pTask->engineFlag)) {
- module = "MDP";
- break;
- } else if (CMDQ_ENG_DPE_GROUP_FLAG(pTask->engineFlag)) {
- module = "DPE";
- break;
- }
- module = "CMDQ";
- } while (0);
- /* other case, we need to analysis instruction for more detail */
- return module;
- }
- /**
- * Debug
- *
- */
- void cmdq_virtual_dump_mmsys_config(void)
- {
- /* do nothing */
- }
- void cmdq_virtual_dump_clock_gating(void)
- {
- uint32_t value[3] = { 0 };
- value[0] = CMDQ_REG_GET32(MMSYS_CONFIG_BASE + 0x100);
- value[1] = CMDQ_REG_GET32(MMSYS_CONFIG_BASE + 0x110);
- CMDQ_ERR("MMSYS_CG_CON0(deprecated): 0x%08x, MMSYS_CG_CON1: 0x%08x\n", value[0], value[1]);
- #ifdef CMDQ_USE_LEGACY
- value[2] = CMDQ_REG_GET32(MMSYS_CONFIG_BASE + 0x890);
- CMDQ_ERR("MMSYS_DUMMY_REG: 0x%08x\n", value[2]);
- #endif
- #if !defined(CMDQ_USE_CCF) && !defined(CONFIG_MTK_FPGA)
- CMDQ_ERR("DisSys clock state %d\n", subsys_is_on(SYS_DIS));
- #ifdef CMDQ_DUMP_IMG_CLOCK_STATE
- CMDQ_ERR("IMGSys clock state %d\n", subsys_is_on(SYS_IMG));
- #else
- CMDQ_ERR("ISPSys clock state %d\n", subsys_is_on(SYS_ISP));
- CMDQ_ERR("VDESys clock state %d\n", subsys_is_on(SYS_VDE));
- #endif
- #endif
- }
- int cmdq_virtual_dump_smi(const int showSmiDump)
- {
- int isSMIHang = 0;
- #if defined(CMDQ_CONFIG_SMI) && !defined(CONFIG_MTK_FPGA)
- isSMIHang =
- smi_debug_bus_hanging_detect_ext(SMI_DBG_DISPSYS | SMI_DBG_VDEC | SMI_DBG_IMGSYS |
- SMI_DBG_VENC | SMI_DBG_MJC, showSmiDump, 1);
- CMDQ_ERR("SMI Hang? = %d\n", isSMIHang);
- #else
- CMDQ_LOG("[WARNING]not enable SMI dump now\n");
- #endif
- return isSMIHang;
- }
- void cmdq_virtual_dump_gpr(void)
- {
- int i = 0;
- long offset = 0;
- uint32_t value = 0;
- CMDQ_LOG("========= GPR dump =========\n");
- for (i = 0; i < 16; i++) {
- offset = CMDQ_GPR_R32(i);
- value = CMDQ_REG_GET32(offset);
- CMDQ_LOG("[GPR %2d]+0x%lx = 0x%08x\n", i, offset, value);
- }
- CMDQ_LOG("========= GPR dump =========\n");
- }
- /**
- * Record usage
- *
- */
- uint64_t cmdq_virtual_flag_from_scenario(CMDQ_SCENARIO_ENUM scn)
- {
- uint64_t flag = 0;
- #ifdef CMDQ_USE_LEGACY
- cmdq_virtual_flag_from_scenario_legacy(scn);
- #else
- switch (scn) {
- case CMDQ_SCENARIO_PRIMARY_DISP:
- flag = (1LL << CMDQ_ENG_DISP_OVL0) |
- (1LL << CMDQ_ENG_DISP_COLOR0) |
- (1LL << CMDQ_ENG_DISP_AAL) |
- (1LL << CMDQ_ENG_DISP_GAMMA) |
- (1LL << CMDQ_ENG_DISP_RDMA0) |
- (1LL << CMDQ_ENG_DISP_UFOE) | (1LL << CMDQ_ENG_DISP_DSI0_CMD);
- break;
- case CMDQ_SCENARIO_PRIMARY_MEMOUT:
- flag = 0LL;
- break;
- case CMDQ_SCENARIO_PRIMARY_ALL:
- flag = ((1LL << CMDQ_ENG_DISP_OVL0) |
- (1LL << CMDQ_ENG_DISP_WDMA0) |
- (1LL << CMDQ_ENG_DISP_COLOR0) |
- (1LL << CMDQ_ENG_DISP_AAL) |
- (1LL << CMDQ_ENG_DISP_GAMMA) |
- (1LL << CMDQ_ENG_DISP_RDMA0) |
- (1LL << CMDQ_ENG_DISP_UFOE) | (1LL << CMDQ_ENG_DISP_DSI0_CMD));
- break;
- case CMDQ_SCENARIO_SUB_DISP:
- flag = ((1LL << CMDQ_ENG_DISP_OVL1) |
- (1LL << CMDQ_ENG_DISP_RDMA1) | (1LL << CMDQ_ENG_DISP_DPI));
- break;
- case CMDQ_SCENARIO_SUB_ALL:
- flag = ((1LL << CMDQ_ENG_DISP_OVL1) |
- (1LL << CMDQ_ENG_DISP_WDMA1) |
- (1LL << CMDQ_ENG_DISP_RDMA1) | (1LL << CMDQ_ENG_DISP_DPI));
- break;
- case CMDQ_SCENARIO_RDMA0_DISP:
- flag = ((1LL << CMDQ_ENG_DISP_RDMA0) | (1LL << CMDQ_ENG_DISP_DSI0_CMD));
- break;
- case CMDQ_SCENARIO_RDMA0_COLOR0_DISP:
- flag = ((1LL << CMDQ_ENG_DISP_RDMA0) |
- (1LL << CMDQ_ENG_DISP_COLOR0) |
- (1LL << CMDQ_ENG_DISP_AAL) |
- (1LL << CMDQ_ENG_DISP_GAMMA) |
- (1LL << CMDQ_ENG_DISP_UFOE) | (1LL << CMDQ_ENG_DISP_DSI0_CMD));
- break;
- case CMDQ_SCENARIO_MHL_DISP:
- case CMDQ_SCENARIO_RDMA1_DISP:
- flag = ((1LL << CMDQ_ENG_DISP_RDMA1) | (1LL << CMDQ_ENG_DISP_DPI));
- break;
- default:
- flag = 0LL;
- break;
- }
- #endif
- if (0 == flag)
- cmdq_virtual_flag_from_scenario_default(scn);
- return flag;
- }
- /**
- * Event backup
- *
- */
- #ifdef CMDQ_EVENT_NEED_BACKUP
- #define CMDQ_EVENT_BACKUP_COUNT (2)
- typedef struct cmdqBackupEventStruct {
- CMDQ_EVENT_ENUM EventID[CMDQ_EVENT_BACKUP_COUNT];
- uint32_t BackupValue[CMDQ_EVENT_BACKUP_COUNT];
- } cmdqBackupEventStruct;
- cmdqBackupEventStruct gCmdqBackupEvent;
- #endif /* CMDQ_EVENT_NEED_BACKUP */
- void cmdq_virtual_initial_backup_event(void)
- {
- #ifdef CMDQ_EVENT_NEED_BACKUP
- memset(&(gCmdqBackupEvent.BackupValue[0]), 0, sizeof(gCmdqBackupEvent.BackupValue));
- memset(&(gCmdqBackupEvent.EventID[0]), -1, sizeof(gCmdqBackupEvent.EventID));
- gCmdqBackupEvent.EventID[0] = cmdq_core_get_event_value(CMDQ_SYNC_TOKEN_VENC_EOF);
- gCmdqBackupEvent.EventID[1] = cmdq_core_get_event_value(CMDQ_SYNC_TOKEN_VENC_INPUT_READY);
- #endif /* CMDQ_EVENT_NEED_BACKUP */
- }
- void cmdq_virtual_event_backup(void)
- {
- #ifdef CMDQ_EVENT_NEED_BACKUP
- int i;
- for (i = 0; i < CMDQ_EVENT_BACKUP_COUNT; i++) {
- if (-1 == gCmdqBackupEvent.EventID[i])
- continue;
- cmdqCoreGetEvent(gCmdqBackupEvent.EventID[i]);
- }
- #endif /* CMDQ_EVENT_NEED_BACKUP */
- }
- void cmdq_virtual_event_restore(void)
- {
- #ifdef CMDQ_EVENT_NEED_BACKUP
- int i;
- for (i = 0; i < CMDQ_EVENT_BACKUP_COUNT; i++) {
- if (-1 == gCmdqBackupEvent.EventID[i])
- continue;
- cmdqCoreSetEvent(gCmdqBackupEvent.EventID[i]);
- }
- #endif /* CMDQ_EVENT_NEED_BACKUP */
- }
- /**
- * Test
- *
- */
- void cmdq_virtual_test_setup(void)
- {
- /* unconditionally set CMDQ_SYNC_TOKEN_CONFIG_ALLOW and mutex STREAM_DONE */
- /* so that DISPSYS scenarios may pass check. */
- cmdqCoreSetEvent(CMDQ_SYNC_TOKEN_STREAM_EOF);
- cmdqCoreSetEvent(CMDQ_EVENT_MUTEX0_STREAM_EOF);
- cmdqCoreSetEvent(CMDQ_EVENT_MUTEX1_STREAM_EOF);
- cmdqCoreSetEvent(CMDQ_EVENT_MUTEX2_STREAM_EOF);
- cmdqCoreSetEvent(CMDQ_EVENT_MUTEX3_STREAM_EOF);
- }
- void cmdq_virtual_test_cleanup(void)
- {
- /* do nothing */
- }
- void cmdq_virtual_init_module_PA_stat(void)
- {
- #if defined(CMDQ_OF_SUPPORT) && defined(CMDQ_INSTRUCTION_COUNT)
- int32_t i;
- CmdqModulePAStatStruct *modulePAStat = cmdq_core_Initial_and_get_module_stat();
- /* Get MM_SYS config registers range */
- cmdq_dev_get_module_PA("mediatek,mmsys_config", 0,
- &modulePAStat->start[CMDQ_MODULE_STAT_MMSYS_CONFIG],
- &modulePAStat->end[CMDQ_MODULE_STAT_MMSYS_CONFIG]);
- /* Get MDP module registers range */
- cmdq_dev_get_module_PA("mediatek,mdp_rdma", 0,
- &modulePAStat->start[CMDQ_MODULE_STAT_MDP_RDMA],
- &modulePAStat->end[CMDQ_MODULE_STAT_MDP_RDMA]);
- cmdq_dev_get_module_PA("mediatek,mdp_rsz0", 0,
- &modulePAStat->start[CMDQ_MODULE_STAT_MDP_RSZ0],
- &modulePAStat->end[CMDQ_MODULE_STAT_MDP_RSZ0]);
- cmdq_dev_get_module_PA("mediatek,mdp_rsz1", 0,
- &modulePAStat->start[CMDQ_MODULE_STAT_MDP_RSZ1],
- &modulePAStat->end[CMDQ_MODULE_STAT_MDP_RSZ1]);
- cmdq_dev_get_module_PA("mediatek,mdp_wdma", 0,
- &modulePAStat->start[CMDQ_MODULE_STAT_MDP_WDMA],
- &modulePAStat->end[CMDQ_MODULE_STAT_MDP_WDMA]);
- cmdq_dev_get_module_PA("mediatek,mdp_wrot", 0,
- &modulePAStat->start[CMDQ_MODULE_STAT_MDP_WROT],
- &modulePAStat->end[CMDQ_MODULE_STAT_MDP_WROT]);
- cmdq_dev_get_module_PA("mediatek,mdp_tdshp", 0,
- &modulePAStat->start[CMDQ_MODULE_STAT_MDP_TDSHP],
- &modulePAStat->end[CMDQ_MODULE_STAT_MDP_TDSHP]);
- cmdq_dev_get_module_PA("mediatek,MM_MUTEX", 0,
- &modulePAStat->start[CMDQ_MODULE_STAT_MM_MUTEX],
- &modulePAStat->end[CMDQ_MODULE_STAT_MM_MUTEX]);
- cmdq_dev_get_module_PA("mediatek,VENC", 0,
- &modulePAStat->start[CMDQ_MODULE_STAT_VENC],
- &modulePAStat->end[CMDQ_MODULE_STAT_VENC]);
- /* Get DISP module registers range */
- for (i = CMDQ_MODULE_STAT_DISP_OVL0; i <= CMDQ_MODULE_STAT_DISP_DPI0; i++) {
- cmdq_dev_get_module_PA("mediatek,DISPSYS",
- (i - CMDQ_MODULE_STAT_DISP_OVL0),
- &modulePAStat->start[i], &modulePAStat->end[i]);
- }
- cmdq_dev_get_module_PA("mediatek,DISPSYS", 31,
- &modulePAStat->start[CMDQ_MODULE_STAT_DISP_OD],
- &modulePAStat->end[CMDQ_MODULE_STAT_DISP_OD]);
- /* Get CAM module registers range */
- cmdq_dev_get_module_PA("mediatek,CAM0", 0,
- &modulePAStat->start[CMDQ_MODULE_STAT_CAM0],
- &modulePAStat->end[CMDQ_MODULE_STAT_CAM0]);
- cmdq_dev_get_module_PA("mediatek,CAM1", 0,
- &modulePAStat->start[CMDQ_MODULE_STAT_CAM1],
- &modulePAStat->end[CMDQ_MODULE_STAT_CAM1]);
- cmdq_dev_get_module_PA("mediatek,CAM2", 0,
- &modulePAStat->start[CMDQ_MODULE_STAT_CAM2],
- &modulePAStat->end[CMDQ_MODULE_STAT_CAM2]);
- cmdq_dev_get_module_PA("mediatek,CAM3", 0,
- &modulePAStat->start[CMDQ_MODULE_STAT_CAM3],
- &modulePAStat->end[CMDQ_MODULE_STAT_CAM3]);
- /* Get SODI registers range */
- cmdq_dev_get_module_PA("mediatek,SLEEP", 0,
- &modulePAStat->start[CMDQ_MODULE_STAT_SODI],
- &modulePAStat->end[CMDQ_MODULE_STAT_SODI]);
- #endif
- }
- void cmdq_virtual_function_setting(void)
- {
- cmdqCoreFuncStruct *pFunc;
- pFunc = &(gFunctionPointer);
- /*
- * GCE capability
- */
- pFunc->getSubsysLSBArgA = cmdq_virtual_get_subsys_LSB_in_argA;
- /* HW thread related */
- pFunc->isSecureThread = cmdq_virtual_is_a_secure_thread;
- pFunc->isValidNotifyThread = cmdq_virtual_is_valid_notify_thread_for_secure_path;
- /**
- * Scenario related
- *
- */
- pFunc->isDispScenario = cmdq_virtual_is_disp_scenario;
- pFunc->shouldEnablePrefetch = cmdq_virtual_should_enable_prefetch;
- pFunc->shouldProfile = cmdq_virtual_should_profile;
- pFunc->dispThread = cmdq_virtual_disp_thread;
- pFunc->getThreadID = cmdq_virtual_get_thread_index;
- pFunc->priority = cmdq_virtual_priority_from_scenario;
- pFunc->forceLoopIRQ = cmdq_virtual_force_loop_irq;
- pFunc->isLoopScenario = cmdq_virtual_is_loop_scenario;
- /**
- * Module dependent
- *
- */
- pFunc->getRegID = cmdq_virtual_get_reg_id_from_hwflag;
- pFunc->moduleFromEvent = cmdq_virtual_module_from_event_id;
- pFunc->parseModule = cmdq_virtual_parse_module_from_reg_addr;
- pFunc->moduleEntrySuspend = cmdq_virtual_can_module_entry_suspend;
- pFunc->printStatusClock = cmdq_virtual_print_status_clock;
- pFunc->printStatusSeqClock = cmdq_virtual_print_status_seq_clock;
- pFunc->enableCommonClockLocked = cmdq_virtual_enable_common_clock_locked;
- pFunc->enableGCEClockLocked = cmdq_virtual_enable_gce_clock_locked;
- pFunc->parseErrorModule = cmdq_virtual_parse_error_module_by_hwflag_impl;
- /**
- * Debug
- *
- */
- pFunc->dumpMMSYSConfig = cmdq_virtual_dump_mmsys_config;
- pFunc->dumpClockGating = cmdq_virtual_dump_clock_gating;
- pFunc->dumpSMI = cmdq_virtual_dump_smi;
- pFunc->dumpGPR = cmdq_virtual_dump_gpr;
- /**
- * Record usage
- *
- */
- pFunc->flagFromScenario = cmdq_virtual_flag_from_scenario;
- /**
- * Event backup
- *
- */
- pFunc->initialBackupEvent = cmdq_virtual_initial_backup_event;
- pFunc->eventBackup = cmdq_virtual_event_backup;
- pFunc->eventRestore = cmdq_virtual_event_restore;
- /**
- * Test
- *
- */
- pFunc->testSetup = cmdq_virtual_test_setup;
- pFunc->testCleanup = cmdq_virtual_test_cleanup;
- pFunc->initModulePAStat = cmdq_virtual_init_module_PA_stat;
- }
- cmdqCoreFuncStruct *cmdq_get_func(void)
- {
- return &gFunctionPointer;
- }
|