/* SPDX-License-Identifier: GPL-2.0-only OR MIT */ /* Copyright (c) 2023 Imagination Technologies Ltd. */ #ifndef PVR_ROGUE_FWIF_SHARED_H #define PVR_ROGUE_FWIF_SHARED_H #include #include #define ROGUE_FWIF_NUM_RTDATAS 2U #define ROGUE_FWIF_NUM_GEOMDATAS 1U #define ROGUE_FWIF_NUM_RTDATA_FREELISTS 2U #define ROGUE_NUM_GEOM_CORES 1U #define ROGUE_NUM_GEOM_CORES_SIZE 2U /* * Maximum number of UFOs in a CCB command. * The number is based on having 32 sync prims (as originally), plus 32 sync * checkpoints. * Once the use of sync prims is no longer supported, we will retain * the same total (64) as the number of sync checkpoints which may be * supporting a fence is not visible to the client driver and has to * allow for the number of different timelines involved in fence merges. */ #define ROGUE_FWIF_CCB_CMD_MAX_UFOS (32U + 32U) /* * This is a generic limit imposed on any DM (GEOMETRY,FRAGMENT,CDM,TDM,2D,TRANSFER) * command passed through the bridge. * Just across the bridge in the server, any incoming kick command size is * checked against this maximum limit. * In case the incoming command size is larger than the specified limit, * the bridge call is retired with error. */ #define ROGUE_FWIF_DM_INDEPENDENT_KICK_CMD_SIZE (1024U) #define ROGUE_FWIF_PRBUFFER_START (0) #define ROGUE_FWIF_PRBUFFER_ZSBUFFER (0) #define ROGUE_FWIF_PRBUFFER_MSAABUFFER (1) #define ROGUE_FWIF_PRBUFFER_MAXSUPPORTED (2) struct rogue_fwif_dma_addr { aligned_u64 dev_addr; u32 fw_addr; u32 padding; } __aligned(8); struct rogue_fwif_ufo { u32 addr; u32 value; }; #define ROGUE_FWIF_UFO_ADDR_IS_SYNC_CHECKPOINT (1) struct rogue_fwif_sync_checkpoint { u32 state; u32 fw_ref_count; }; struct rogue_fwif_cleanup_ctl { /* Number of commands received by the FW */ u32 submitted_commands; /* Number of commands executed by the FW */ u32 executed_commands; } __aligned(8); /* * Used to share frame numbers across UM-KM-FW, * frame number is set in UM, * frame number is required in both KM for HTB and FW for FW trace. * * May be used to house Kick flags in the future. */ struct rogue_fwif_cmd_common { /* associated frame number */ u32 frame_num; }; /* * Geometry and fragment commands require set of firmware addresses that are stored in the Kernel. * Client has handle(s) to Kernel containers storing these addresses, instead of raw addresses. We * have to patch/write these addresses in KM to prevent UM from controlling FW addresses directly. * Typedefs for geometry and fragment commands are shared between Client and Firmware (both * single-BVNC). Kernel is implemented in a multi-BVNC manner, so it can't use geometry|fragment * CMD type definitions directly. Therefore we have a SHARED block that is shared between UM-KM-FW * across all BVNC configurations. */ struct rogue_fwif_cmd_geom_frag_shared { /* Common command attributes */ struct rogue_fwif_cmd_common cmn; /* * RTData associated with this command, this is used for context * selection and for storing out HW-context, when TA is switched out for * continuing later */ u32 hwrt_data_fw_addr; /* Supported PR Buffers like Z/S/MSAA Scratch */ u32 pr_buffer_fw_addr[ROGUE_FWIF_PRBUFFER_MAXSUPPORTED]; }; /* * Client Circular Command Buffer (CCCB) control structure. * This is shared between the Server and the Firmware and holds byte offsets * into the CCCB as well as the wrapping mask to aid wrap around. A given * snapshot of this queue with Cmd 1 running on the GPU might be: * * Roff Doff Woff * [..........|-1----------|=2===|=3===|=4===|~5~~~~|~6~~~~|~7~~~~|..........] * < runnable commands >< !ready to run > * * Cmd 1 : Currently executing on the GPU data master. * Cmd 2,3,4: Fence dependencies met, commands runnable. * Cmd 5... : Fence dependency not met yet. */ struct rogue_fwif_cccb_ctl { /* Host write offset into CCB. This must be aligned to 16 bytes. */ u32 write_offset; /* * Firmware read offset into CCB. Points to the command that is runnable * on GPU, if R!=W */ u32 read_offset; /* * Firmware fence dependency offset. Points to commands not ready, i.e. * fence dependencies are not met. */ u32 dep_offset; /* Offset wrapping mask, total capacity in bytes of the CCB-1 */ u32 wrap_mask; /* Only used if SUPPORT_AGP is present. */ u32 read_offset2; /* Only used if SUPPORT_AGP4 is present. */ u32 read_offset3; /* Only used if SUPPORT_AGP4 is present. */ u32 read_offset4; u32 padding; } __aligned(8); #define ROGUE_FW_LOCAL_FREELIST (0) #define ROGUE_FW_GLOBAL_FREELIST (1) #define ROGUE_FW_FREELIST_TYPE_LAST ROGUE_FW_GLOBAL_FREELIST #define ROGUE_FW_MAX_FREELISTS (ROGUE_FW_FREELIST_TYPE_LAST + 1U) struct rogue_fwif_geom_registers_caswitch { u64 geom_reg_vdm_context_state_base_addr; u64 geom_reg_vdm_context_state_resume_addr; u64 geom_reg_ta_context_state_base_addr; struct { u64 geom_reg_vdm_context_store_task0; u64 geom_reg_vdm_context_store_task1; u64 geom_reg_vdm_context_store_task2; /* VDM resume state update controls */ u64 geom_reg_vdm_context_resume_task0; u64 geom_reg_vdm_context_resume_task1; u64 geom_reg_vdm_context_resume_task2; u64 geom_reg_vdm_context_store_task3; u64 geom_reg_vdm_context_store_task4; u64 geom_reg_vdm_context_resume_task3; u64 geom_reg_vdm_context_resume_task4; } geom_state[2]; }; #define ROGUE_FWIF_GEOM_REGISTERS_CSWITCH_SIZE \ sizeof(struct rogue_fwif_geom_registers_caswitch) struct rogue_fwif_cdm_registers_cswitch { u64 cdmreg_cdm_context_pds0; u64 cdmreg_cdm_context_pds1; u64 cdmreg_cdm_terminate_pds; u64 cdmreg_cdm_terminate_pds1; /* CDM resume controls */ u64 cdmreg_cdm_resume_pds0; u64 cdmreg_cdm_context_pds0_b; u64 cdmreg_cdm_resume_pds0_b; }; struct rogue_fwif_static_rendercontext_state { /* Geom registers for ctx switch */ struct rogue_fwif_geom_registers_caswitch ctxswitch_regs[ROGUE_NUM_GEOM_CORES_SIZE] __aligned(8); }; #define ROGUE_FWIF_STATIC_RENDERCONTEXT_SIZE \ sizeof(struct rogue_fwif_static_rendercontext_state) struct rogue_fwif_static_computecontext_state { /* CDM registers for ctx switch */ struct rogue_fwif_cdm_registers_cswitch ctxswitch_regs __aligned(8); }; #define ROGUE_FWIF_STATIC_COMPUTECONTEXT_SIZE \ sizeof(struct rogue_fwif_static_computecontext_state) enum rogue_fwif_prbuffer_state { ROGUE_FWIF_PRBUFFER_UNBACKED = 0, ROGUE_FWIF_PRBUFFER_BACKED, ROGUE_FWIF_PRBUFFER_BACKING_PENDING, ROGUE_FWIF_PRBUFFER_UNBACKING_PENDING, }; struct rogue_fwif_prbuffer { /* Buffer ID*/ u32 buffer_id; /* Needs On-demand Z/S/MSAA Buffer allocation */ bool on_demand __aligned(4); /* Z/S/MSAA -Buffer state */ enum rogue_fwif_prbuffer_state state; /* Cleanup state */ struct rogue_fwif_cleanup_ctl cleanup_sate; /* Compatibility and other flags */ u32 prbuffer_flags; } __aligned(8); /* Last reset reason for a context. */ enum rogue_context_reset_reason { /* No reset reason recorded */ ROGUE_CONTEXT_RESET_REASON_NONE = 0, /* Caused a reset due to locking up */ ROGUE_CONTEXT_RESET_REASON_GUILTY_LOCKUP = 1, /* Affected by another context locking up */ ROGUE_CONTEXT_RESET_REASON_INNOCENT_LOCKUP = 2, /* Overran the global deadline */ ROGUE_CONTEXT_RESET_REASON_GUILTY_OVERRUNING = 3, /* Affected by another context overrunning */ ROGUE_CONTEXT_RESET_REASON_INNOCENT_OVERRUNING = 4, /* Forced reset to ensure scheduling requirements */ ROGUE_CONTEXT_RESET_REASON_HARD_CONTEXT_SWITCH = 5, /* FW Safety watchdog triggered */ ROGUE_CONTEXT_RESET_REASON_FW_WATCHDOG = 12, /* FW page fault (no HWR) */ ROGUE_CONTEXT_RESET_REASON_FW_PAGEFAULT = 13, /* FW execution error (GPU reset requested) */ ROGUE_CONTEXT_RESET_REASON_FW_EXEC_ERR = 14, /* Host watchdog detected FW error */ ROGUE_CONTEXT_RESET_REASON_HOST_WDG_FW_ERR = 15, /* Geometry DM OOM event is not allowed */ ROGUE_CONTEXT_GEOM_OOM_DISABLED = 16, }; struct rogue_context_reset_reason_data { enum rogue_context_reset_reason reset_reason; u32 reset_ext_job_ref; }; #include "pvr_rogue_fwif_shared_check.h" #endif /* PVR_ROGUE_FWIF_SHARED_H */