/* 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 <linux/compiler.h>
#include <linux/types.h>
#define ROGUE_FWIF_NUM_RTDATAS 2 U
#define ROGUE_FWIF_NUM_GEOMDATAS 1 U
#define ROGUE_FWIF_NUM_RTDATA_FREELISTS 2 U
#define ROGUE_NUM_GEOM_CORES 1 U
#define ROGUE_NUM_GEOM_CORES_SIZE 2 U
/*
* 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 (32 U + 32 U)
/*
* This is a generic limit imposed on any DM ( GEOMETRY , FRAGMENT , CDM , TDM , 2 D , 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 (1024 U)
#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 + 1 U)
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 */
Messung V0.5 in Prozent C=85 H=100 G=92
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-10-03)
¤
*© Formatika GbR, Deutschland