mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-10 15:58:47 +00:00
a26f067fea
Changes since v8: - Corrected license identifiers Changes since v7: - Add padding to struct rogue_fwif_ccb_ctl to place read and write offsets in different cache lines Changes since v5: - Split up header commit due to size - Add BRN 71242 to device info Changes since v4: - Add FW header device info Signed-off-by: Sarah Walker <sarah.walker@imgtec.com> Signed-off-by: Donald Robson <donald.robson@imgtec.com> Acked-by: Maxime Ripard <mripard@kernel.org> Link: https://lore.kernel.org/r/aa681533a02bd2d46af17a6a6010f4d6048fbb0a.1700668843.git.donald.robson@imgtec.com Signed-off-by: Maxime Ripard <mripard@kernel.org>
2189 lines
69 KiB
C
2189 lines
69 KiB
C
/* SPDX-License-Identifier: GPL-2.0-only OR MIT */
|
|
/* Copyright (c) 2023 Imagination Technologies Ltd. */
|
|
|
|
#ifndef PVR_ROGUE_FWIF_H
|
|
#define PVR_ROGUE_FWIF_H
|
|
|
|
#include <linux/bits.h>
|
|
#include <linux/build_bug.h>
|
|
#include <linux/compiler.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/types.h>
|
|
|
|
#include "pvr_rogue_defs.h"
|
|
#include "pvr_rogue_fwif_common.h"
|
|
#include "pvr_rogue_fwif_shared.h"
|
|
|
|
/*
|
|
****************************************************************************
|
|
* Logging type
|
|
****************************************************************************
|
|
*/
|
|
#define ROGUE_FWIF_LOG_TYPE_NONE 0x00000000U
|
|
#define ROGUE_FWIF_LOG_TYPE_TRACE 0x00000001U
|
|
#define ROGUE_FWIF_LOG_TYPE_GROUP_MAIN 0x00000002U
|
|
#define ROGUE_FWIF_LOG_TYPE_GROUP_MTS 0x00000004U
|
|
#define ROGUE_FWIF_LOG_TYPE_GROUP_CLEANUP 0x00000008U
|
|
#define ROGUE_FWIF_LOG_TYPE_GROUP_CSW 0x00000010U
|
|
#define ROGUE_FWIF_LOG_TYPE_GROUP_BIF 0x00000020U
|
|
#define ROGUE_FWIF_LOG_TYPE_GROUP_PM 0x00000040U
|
|
#define ROGUE_FWIF_LOG_TYPE_GROUP_RTD 0x00000080U
|
|
#define ROGUE_FWIF_LOG_TYPE_GROUP_SPM 0x00000100U
|
|
#define ROGUE_FWIF_LOG_TYPE_GROUP_POW 0x00000200U
|
|
#define ROGUE_FWIF_LOG_TYPE_GROUP_HWR 0x00000400U
|
|
#define ROGUE_FWIF_LOG_TYPE_GROUP_HWP 0x00000800U
|
|
#define ROGUE_FWIF_LOG_TYPE_GROUP_RPM 0x00001000U
|
|
#define ROGUE_FWIF_LOG_TYPE_GROUP_DMA 0x00002000U
|
|
#define ROGUE_FWIF_LOG_TYPE_GROUP_MISC 0x00004000U
|
|
#define ROGUE_FWIF_LOG_TYPE_GROUP_DEBUG 0x80000000U
|
|
#define ROGUE_FWIF_LOG_TYPE_GROUP_MASK 0x80007FFEU
|
|
#define ROGUE_FWIF_LOG_TYPE_MASK 0x80007FFFU
|
|
|
|
/* String used in pvrdebug -h output */
|
|
#define ROGUE_FWIF_LOG_GROUPS_STRING_LIST \
|
|
"main,mts,cleanup,csw,bif,pm,rtd,spm,pow,hwr,hwp,rpm,dma,misc,debug"
|
|
|
|
/* Table entry to map log group strings to log type value */
|
|
struct rogue_fwif_log_group_map_entry {
|
|
const char *log_group_name;
|
|
u32 log_group_type;
|
|
};
|
|
|
|
/*
|
|
****************************************************************************
|
|
* ROGUE FW signature checks
|
|
****************************************************************************
|
|
*/
|
|
#define ROGUE_FW_SIG_BUFFER_SIZE_MIN (8192)
|
|
|
|
#define ROGUE_FWIF_TIMEDIFF_ID ((0x1UL << 28) | ROGUE_CR_TIMER)
|
|
|
|
/*
|
|
****************************************************************************
|
|
* Trace Buffer
|
|
****************************************************************************
|
|
*/
|
|
|
|
/* Default size of ROGUE_FWIF_TRACEBUF_SPACE in DWords */
|
|
#define ROGUE_FW_TRACE_BUF_DEFAULT_SIZE_IN_DWORDS 12000U
|
|
#define ROGUE_FW_TRACE_BUFFER_ASSERT_SIZE 200U
|
|
#define ROGUE_FW_THREAD_NUM 1U
|
|
#define ROGUE_FW_THREAD_MAX 2U
|
|
|
|
#define ROGUE_FW_POLL_TYPE_SET 0x80000000U
|
|
|
|
struct rogue_fwif_file_info_buf {
|
|
char path[ROGUE_FW_TRACE_BUFFER_ASSERT_SIZE];
|
|
char info[ROGUE_FW_TRACE_BUFFER_ASSERT_SIZE];
|
|
u32 line_num;
|
|
u32 padding;
|
|
} __aligned(8);
|
|
|
|
struct rogue_fwif_tracebuf_space {
|
|
u32 trace_pointer;
|
|
|
|
u32 trace_buffer_fw_addr;
|
|
|
|
/* To be used by host when reading from trace buffer */
|
|
u32 *trace_buffer;
|
|
|
|
struct rogue_fwif_file_info_buf assert_buf;
|
|
} __aligned(8);
|
|
|
|
/* Total number of FW fault logs stored */
|
|
#define ROGUE_FWIF_FWFAULTINFO_MAX (8U)
|
|
|
|
struct rogue_fw_fault_info {
|
|
aligned_u64 cr_timer;
|
|
aligned_u64 os_timer;
|
|
|
|
u32 data __aligned(8);
|
|
u32 reserved;
|
|
struct rogue_fwif_file_info_buf fault_buf;
|
|
} __aligned(8);
|
|
|
|
enum rogue_fwif_pow_state {
|
|
ROGUE_FWIF_POW_OFF, /* idle and ready to full power down */
|
|
ROGUE_FWIF_POW_ON, /* running HW commands */
|
|
ROGUE_FWIF_POW_FORCED_IDLE, /* forced idle */
|
|
ROGUE_FWIF_POW_IDLE, /* idle waiting for host handshake */
|
|
};
|
|
|
|
/* Firmware HWR states */
|
|
/* The HW state is ok or locked up */
|
|
#define ROGUE_FWIF_HWR_HARDWARE_OK BIT(0)
|
|
/* Tells if a HWR reset is in progress */
|
|
#define ROGUE_FWIF_HWR_RESET_IN_PROGRESS BIT(1)
|
|
/* A DM unrelated lockup has been detected */
|
|
#define ROGUE_FWIF_HWR_GENERAL_LOCKUP BIT(3)
|
|
/* At least one DM is running without being close to a lockup */
|
|
#define ROGUE_FWIF_HWR_DM_RUNNING_OK BIT(4)
|
|
/* At least one DM is close to lockup */
|
|
#define ROGUE_FWIF_HWR_DM_STALLING BIT(5)
|
|
/* The FW has faulted and needs to restart */
|
|
#define ROGUE_FWIF_HWR_FW_FAULT BIT(6)
|
|
/* The FW has requested the host to restart it */
|
|
#define ROGUE_FWIF_HWR_RESTART_REQUESTED BIT(7)
|
|
|
|
#define ROGUE_FWIF_PHR_STATE_SHIFT (8U)
|
|
/* The FW has requested the host to restart it, per PHR configuration */
|
|
#define ROGUE_FWIF_PHR_RESTART_REQUESTED ((1) << ROGUE_FWIF_PHR_STATE_SHIFT)
|
|
/* A PHR triggered GPU reset has just finished */
|
|
#define ROGUE_FWIF_PHR_RESTART_FINISHED ((2) << ROGUE_FWIF_PHR_STATE_SHIFT)
|
|
#define ROGUE_FWIF_PHR_RESTART_MASK \
|
|
(ROGUE_FWIF_PHR_RESTART_REQUESTED | ROGUE_FWIF_PHR_RESTART_FINISHED)
|
|
|
|
#define ROGUE_FWIF_PHR_MODE_OFF (0UL)
|
|
#define ROGUE_FWIF_PHR_MODE_RD_RESET (1UL)
|
|
#define ROGUE_FWIF_PHR_MODE_FULL_RESET (2UL)
|
|
|
|
/* Firmware per-DM HWR states */
|
|
/* DM is working if all flags are cleared */
|
|
#define ROGUE_FWIF_DM_STATE_WORKING (0)
|
|
/* DM is idle and ready for HWR */
|
|
#define ROGUE_FWIF_DM_STATE_READY_FOR_HWR BIT(0)
|
|
/* DM need to skip to next cmd before resuming processing */
|
|
#define ROGUE_FWIF_DM_STATE_NEEDS_SKIP BIT(2)
|
|
/* DM need partial render cleanup before resuming processing */
|
|
#define ROGUE_FWIF_DM_STATE_NEEDS_PR_CLEANUP BIT(3)
|
|
/* DM need to increment Recovery Count once fully recovered */
|
|
#define ROGUE_FWIF_DM_STATE_NEEDS_TRACE_CLEAR BIT(4)
|
|
/* DM was identified as locking up and causing HWR */
|
|
#define ROGUE_FWIF_DM_STATE_GUILTY_LOCKUP BIT(5)
|
|
/* DM was innocently affected by another lockup which caused HWR */
|
|
#define ROGUE_FWIF_DM_STATE_INNOCENT_LOCKUP BIT(6)
|
|
/* DM was identified as over-running and causing HWR */
|
|
#define ROGUE_FWIF_DM_STATE_GUILTY_OVERRUNING BIT(7)
|
|
/* DM was innocently affected by another DM over-running which caused HWR */
|
|
#define ROGUE_FWIF_DM_STATE_INNOCENT_OVERRUNING BIT(8)
|
|
/* DM was forced into HWR as it delayed more important workloads */
|
|
#define ROGUE_FWIF_DM_STATE_HARD_CONTEXT_SWITCH BIT(9)
|
|
/* DM was forced into HWR due to an uncorrected GPU ECC error */
|
|
#define ROGUE_FWIF_DM_STATE_GPU_ECC_HWR BIT(10)
|
|
|
|
/* Firmware's connection state */
|
|
enum rogue_fwif_connection_fw_state {
|
|
/* Firmware is offline */
|
|
ROGUE_FW_CONNECTION_FW_OFFLINE = 0,
|
|
/* Firmware is initialised */
|
|
ROGUE_FW_CONNECTION_FW_READY,
|
|
/* Firmware connection is fully established */
|
|
ROGUE_FW_CONNECTION_FW_ACTIVE,
|
|
/* Firmware is clearing up connection data*/
|
|
ROGUE_FW_CONNECTION_FW_OFFLOADING,
|
|
ROGUE_FW_CONNECTION_FW_STATE_COUNT
|
|
};
|
|
|
|
/* OS' connection state */
|
|
enum rogue_fwif_connection_os_state {
|
|
/* OS is offline */
|
|
ROGUE_FW_CONNECTION_OS_OFFLINE = 0,
|
|
/* OS's KM driver is setup and waiting */
|
|
ROGUE_FW_CONNECTION_OS_READY,
|
|
/* OS connection is fully established */
|
|
ROGUE_FW_CONNECTION_OS_ACTIVE,
|
|
ROGUE_FW_CONNECTION_OS_STATE_COUNT
|
|
};
|
|
|
|
struct rogue_fwif_os_runtime_flags {
|
|
unsigned int os_state : 3;
|
|
unsigned int fl_ok : 1;
|
|
unsigned int fl_grow_pending : 1;
|
|
unsigned int isolated_os : 1;
|
|
unsigned int reserved : 26;
|
|
};
|
|
|
|
#define PVR_SLR_LOG_ENTRIES 10
|
|
/* MAX_CLIENT_CCB_NAME not visible to this header */
|
|
#define PVR_SLR_LOG_STRLEN 30
|
|
|
|
struct rogue_fwif_slr_entry {
|
|
aligned_u64 timestamp;
|
|
u32 fw_ctx_addr;
|
|
u32 num_ufos;
|
|
char ccb_name[PVR_SLR_LOG_STRLEN];
|
|
char padding[2];
|
|
} __aligned(8);
|
|
|
|
#define MAX_THREAD_NUM 2
|
|
|
|
/* firmware trace control data */
|
|
struct rogue_fwif_tracebuf {
|
|
u32 log_type;
|
|
struct rogue_fwif_tracebuf_space tracebuf[MAX_THREAD_NUM];
|
|
/*
|
|
* Member initialised only when sTraceBuf is actually allocated (in
|
|
* ROGUETraceBufferInitOnDemandResources)
|
|
*/
|
|
u32 tracebuf_size_in_dwords;
|
|
/* Compatibility and other flags */
|
|
u32 tracebuf_flags;
|
|
} __aligned(8);
|
|
|
|
/* firmware system data shared with the Host driver */
|
|
struct rogue_fwif_sysdata {
|
|
/* Configuration flags from host */
|
|
u32 config_flags;
|
|
/* Extended configuration flags from host */
|
|
u32 config_flags_ext;
|
|
enum rogue_fwif_pow_state pow_state;
|
|
u32 hw_perf_ridx;
|
|
u32 hw_perf_widx;
|
|
u32 hw_perf_wrap_count;
|
|
/* Constant after setup, needed in FW */
|
|
u32 hw_perf_size;
|
|
/* The number of times the FW drops a packet due to buffer full */
|
|
u32 hw_perf_drop_count;
|
|
|
|
/*
|
|
* ui32HWPerfUt, ui32FirstDropOrdinal, ui32LastDropOrdinal only valid
|
|
* when FW is built with ROGUE_HWPERF_UTILIZATION &
|
|
* ROGUE_HWPERF_DROP_TRACKING defined in rogue_fw_hwperf.c
|
|
*/
|
|
/* Buffer utilisation, high watermark of bytes in use */
|
|
u32 hw_perf_ut;
|
|
/* The ordinal of the first packet the FW dropped */
|
|
u32 first_drop_ordinal;
|
|
/* The ordinal of the last packet the FW dropped */
|
|
u32 last_drop_ordinal;
|
|
/* State flags for each Operating System mirrored from Fw coremem */
|
|
struct rogue_fwif_os_runtime_flags
|
|
os_runtime_flags_mirror[ROGUE_FW_MAX_NUM_OS];
|
|
|
|
struct rogue_fw_fault_info fault_info[ROGUE_FWIF_FWFAULTINFO_MAX];
|
|
u32 fw_faults;
|
|
u32 cr_poll_addr[MAX_THREAD_NUM];
|
|
u32 cr_poll_mask[MAX_THREAD_NUM];
|
|
u32 cr_poll_count[MAX_THREAD_NUM];
|
|
aligned_u64 start_idle_time;
|
|
|
|
#if defined(SUPPORT_ROGUE_FW_STATS_FRAMEWORK)
|
|
# define ROGUE_FWIF_STATS_FRAMEWORK_LINESIZE (8)
|
|
# define ROGUE_FWIF_STATS_FRAMEWORK_MAX \
|
|
(2048 * ROGUE_FWIF_STATS_FRAMEWORK_LINESIZE)
|
|
u32 fw_stats_buf[ROGUE_FWIF_STATS_FRAMEWORK_MAX] __aligned(8);
|
|
#endif
|
|
u32 hwr_state_flags;
|
|
u32 hwr_recovery_flags[PVR_FWIF_DM_MAX];
|
|
/* Compatibility and other flags */
|
|
u32 fw_sys_data_flags;
|
|
/* Identify whether MC config is P-P or P-S */
|
|
u32 mc_config;
|
|
} __aligned(8);
|
|
|
|
/* per-os firmware shared data */
|
|
struct rogue_fwif_osdata {
|
|
/* Configuration flags from an OS */
|
|
u32 fw_os_config_flags;
|
|
/* Markers to signal that the host should perform a full sync check */
|
|
u32 fw_sync_check_mark;
|
|
u32 host_sync_check_mark;
|
|
|
|
u32 forced_updates_requested;
|
|
u8 slr_log_wp;
|
|
struct rogue_fwif_slr_entry slr_log_first;
|
|
struct rogue_fwif_slr_entry slr_log[PVR_SLR_LOG_ENTRIES];
|
|
aligned_u64 last_forced_update_time;
|
|
|
|
/* Interrupt count from Threads > */
|
|
u32 interrupt_count[MAX_THREAD_NUM];
|
|
u32 kccb_cmds_executed;
|
|
u32 power_sync_fw_addr;
|
|
/* Compatibility and other flags */
|
|
u32 fw_os_data_flags;
|
|
u32 padding;
|
|
} __aligned(8);
|
|
|
|
/* Firmware trace time-stamp field breakup */
|
|
|
|
/* ROGUE_CR_TIMER register read (48 bits) value*/
|
|
#define ROGUE_FWT_TIMESTAMP_TIME_SHIFT (0U)
|
|
#define ROGUE_FWT_TIMESTAMP_TIME_CLRMSK (0xFFFF000000000000ull)
|
|
|
|
/* Extra debug-info (16 bits) */
|
|
#define ROGUE_FWT_TIMESTAMP_DEBUG_INFO_SHIFT (48U)
|
|
#define ROGUE_FWT_TIMESTAMP_DEBUG_INFO_CLRMSK ~ROGUE_FWT_TIMESTAMP_TIME_CLRMSK
|
|
|
|
/* Debug-info sub-fields */
|
|
/*
|
|
* Bit 0: ROGUE_CR_EVENT_STATUS_MMU_PAGE_FAULT bit from ROGUE_CR_EVENT_STATUS
|
|
* register
|
|
*/
|
|
#define ROGUE_FWT_DEBUG_INFO_MMU_PAGE_FAULT_SHIFT (0U)
|
|
#define ROGUE_FWT_DEBUG_INFO_MMU_PAGE_FAULT_SET \
|
|
BIT(ROGUE_FWT_DEBUG_INFO_MMU_PAGE_FAULT_SHIFT)
|
|
|
|
/* Bit 1: ROGUE_CR_BIF_MMU_ENTRY_PENDING bit from ROGUE_CR_BIF_MMU_ENTRY register */
|
|
#define ROGUE_FWT_DEBUG_INFO_MMU_ENTRY_PENDING_SHIFT (1U)
|
|
#define ROGUE_FWT_DEBUG_INFO_MMU_ENTRY_PENDING_SET \
|
|
BIT(ROGUE_FWT_DEBUG_INFO_MMU_ENTRY_PENDING_SHIFT)
|
|
|
|
/* Bit 2: ROGUE_CR_SLAVE_EVENT register is non-zero */
|
|
#define ROGUE_FWT_DEBUG_INFO_SLAVE_EVENTS_SHIFT (2U)
|
|
#define ROGUE_FWT_DEBUG_INFO_SLAVE_EVENTS_SET \
|
|
BIT(ROGUE_FWT_DEBUG_INFO_SLAVE_EVENTS_SHIFT)
|
|
|
|
/* Bit 3-15: Unused bits */
|
|
|
|
#define ROGUE_FWT_DEBUG_INFO_STR_MAXLEN 64
|
|
#define ROGUE_FWT_DEBUG_INFO_STR_PREPEND " (debug info: "
|
|
#define ROGUE_FWT_DEBUG_INFO_STR_APPEND ")"
|
|
|
|
/*
|
|
******************************************************************************
|
|
* HWR Data
|
|
******************************************************************************
|
|
*/
|
|
enum rogue_hwrtype {
|
|
ROGUE_HWRTYPE_UNKNOWNFAILURE = 0,
|
|
ROGUE_HWRTYPE_OVERRUN = 1,
|
|
ROGUE_HWRTYPE_POLLFAILURE = 2,
|
|
ROGUE_HWRTYPE_BIF0FAULT = 3,
|
|
ROGUE_HWRTYPE_BIF1FAULT = 4,
|
|
ROGUE_HWRTYPE_TEXASBIF0FAULT = 5,
|
|
ROGUE_HWRTYPE_MMUFAULT = 6,
|
|
ROGUE_HWRTYPE_MMUMETAFAULT = 7,
|
|
ROGUE_HWRTYPE_MIPSTLBFAULT = 8,
|
|
ROGUE_HWRTYPE_ECCFAULT = 9,
|
|
ROGUE_HWRTYPE_MMURISCVFAULT = 10,
|
|
};
|
|
|
|
#define ROGUE_FWIF_HWRTYPE_BIF_BANK_GET(hwr_type) \
|
|
(((hwr_type) == ROGUE_HWRTYPE_BIF0FAULT) ? 0 : 1)
|
|
|
|
#define ROGUE_FWIF_HWRTYPE_PAGE_FAULT_GET(hwr_type) \
|
|
((((hwr_type) == ROGUE_HWRTYPE_BIF0FAULT) || \
|
|
((hwr_type) == ROGUE_HWRTYPE_BIF1FAULT) || \
|
|
((hwr_type) == ROGUE_HWRTYPE_TEXASBIF0FAULT) || \
|
|
((hwr_type) == ROGUE_HWRTYPE_MMUFAULT) || \
|
|
((hwr_type) == ROGUE_HWRTYPE_MMUMETAFAULT) || \
|
|
((hwr_type) == ROGUE_HWRTYPE_MIPSTLBFAULT) || \
|
|
((hwr_type) == ROGUE_HWRTYPE_MMURISCVFAULT)) \
|
|
? true \
|
|
: false)
|
|
|
|
struct rogue_bifinfo {
|
|
aligned_u64 bif_req_status;
|
|
aligned_u64 bif_mmu_status;
|
|
aligned_u64 pc_address; /* phys address of the page catalogue */
|
|
aligned_u64 reserved;
|
|
};
|
|
|
|
struct rogue_eccinfo {
|
|
u32 fault_gpu;
|
|
};
|
|
|
|
struct rogue_mmuinfo {
|
|
aligned_u64 mmu_status[2];
|
|
aligned_u64 pc_address; /* phys address of the page catalogue */
|
|
aligned_u64 reserved;
|
|
};
|
|
|
|
struct rogue_pollinfo {
|
|
u32 thread_num;
|
|
u32 cr_poll_addr;
|
|
u32 cr_poll_mask;
|
|
u32 cr_poll_last_value;
|
|
aligned_u64 reserved;
|
|
} __aligned(8);
|
|
|
|
struct rogue_tlbinfo {
|
|
u32 bad_addr;
|
|
u32 entry_lo;
|
|
};
|
|
|
|
struct rogue_hwrinfo {
|
|
union {
|
|
struct rogue_bifinfo bif_info;
|
|
struct rogue_mmuinfo mmu_info;
|
|
struct rogue_pollinfo poll_info;
|
|
struct rogue_tlbinfo tlb_info;
|
|
struct rogue_eccinfo ecc_info;
|
|
} hwr_data;
|
|
|
|
aligned_u64 cr_timer;
|
|
aligned_u64 os_timer;
|
|
u32 frame_num;
|
|
u32 pid;
|
|
u32 active_hwrt_data;
|
|
u32 hwr_number;
|
|
u32 event_status;
|
|
u32 hwr_recovery_flags;
|
|
enum rogue_hwrtype hwr_type;
|
|
u32 dm;
|
|
u32 core_id;
|
|
aligned_u64 cr_time_of_kick;
|
|
aligned_u64 cr_time_hw_reset_start;
|
|
aligned_u64 cr_time_hw_reset_finish;
|
|
aligned_u64 cr_time_freelist_ready;
|
|
aligned_u64 reserved[2];
|
|
} __aligned(8);
|
|
|
|
/* Number of first HWR logs recorded (never overwritten by newer logs) */
|
|
#define ROGUE_FWIF_HWINFO_MAX_FIRST 8U
|
|
/* Number of latest HWR logs (older logs are overwritten by newer logs) */
|
|
#define ROGUE_FWIF_HWINFO_MAX_LAST 8U
|
|
/* Total number of HWR logs stored in a buffer */
|
|
#define ROGUE_FWIF_HWINFO_MAX \
|
|
(ROGUE_FWIF_HWINFO_MAX_FIRST + ROGUE_FWIF_HWINFO_MAX_LAST)
|
|
/* Index of the last log in the HWR log buffer */
|
|
#define ROGUE_FWIF_HWINFO_LAST_INDEX (ROGUE_FWIF_HWINFO_MAX - 1U)
|
|
|
|
struct rogue_fwif_hwrinfobuf {
|
|
struct rogue_hwrinfo hwr_info[ROGUE_FWIF_HWINFO_MAX];
|
|
u32 hwr_counter;
|
|
u32 write_index;
|
|
u32 dd_req_count;
|
|
u32 hwr_info_buf_flags; /* Compatibility and other flags */
|
|
u32 hwr_dm_locked_up_count[PVR_FWIF_DM_MAX];
|
|
u32 hwr_dm_overran_count[PVR_FWIF_DM_MAX];
|
|
u32 hwr_dm_recovered_count[PVR_FWIF_DM_MAX];
|
|
u32 hwr_dm_false_detect_count[PVR_FWIF_DM_MAX];
|
|
} __aligned(8);
|
|
|
|
#define ROGUE_FWIF_CTXSWITCH_PROFILE_FAST_EN (1)
|
|
#define ROGUE_FWIF_CTXSWITCH_PROFILE_MEDIUM_EN (2)
|
|
#define ROGUE_FWIF_CTXSWITCH_PROFILE_SLOW_EN (3)
|
|
#define ROGUE_FWIF_CTXSWITCH_PROFILE_NODELAY_EN (4)
|
|
|
|
#define ROGUE_FWIF_CDM_ARBITRATION_TASK_DEMAND_EN (1)
|
|
#define ROGUE_FWIF_CDM_ARBITRATION_ROUND_ROBIN_EN (2)
|
|
|
|
#define ROGUE_FWIF_ISP_SCHEDMODE_VER1_IPP (1)
|
|
#define ROGUE_FWIF_ISP_SCHEDMODE_VER2_ISP (2)
|
|
/*
|
|
******************************************************************************
|
|
* ROGUE firmware Init Config Data
|
|
******************************************************************************
|
|
*/
|
|
|
|
/* Flag definitions affecting the firmware globally */
|
|
#define ROGUE_FWIF_INICFG_CTXSWITCH_MODE_RAND BIT(0)
|
|
#define ROGUE_FWIF_INICFG_CTXSWITCH_SRESET_EN BIT(1)
|
|
#define ROGUE_FWIF_INICFG_HWPERF_EN BIT(2)
|
|
#define ROGUE_FWIF_INICFG_DM_KILL_MODE_RAND_EN BIT(3)
|
|
#define ROGUE_FWIF_INICFG_POW_RASCALDUST BIT(4)
|
|
/* Bit 5 is reserved. */
|
|
#define ROGUE_FWIF_INICFG_FBCDC_V3_1_EN BIT(6)
|
|
#define ROGUE_FWIF_INICFG_CHECK_MLIST_EN BIT(7)
|
|
#define ROGUE_FWIF_INICFG_DISABLE_CLKGATING_EN BIT(8)
|
|
/* Bit 9 is reserved. */
|
|
/* Bit 10 is reserved. */
|
|
/* Bit 11 is reserved. */
|
|
#define ROGUE_FWIF_INICFG_REGCONFIG_EN BIT(12)
|
|
#define ROGUE_FWIF_INICFG_ASSERT_ON_OUTOFMEMORY BIT(13)
|
|
#define ROGUE_FWIF_INICFG_HWP_DISABLE_FILTER BIT(14)
|
|
/* Bit 15 is reserved. */
|
|
#define ROGUE_FWIF_INICFG_CTXSWITCH_PROFILE_SHIFT (16)
|
|
#define ROGUE_FWIF_INICFG_CTXSWITCH_PROFILE_FAST \
|
|
(ROGUE_FWIF_CTXSWITCH_PROFILE_FAST_EN \
|
|
<< ROGUE_FWIF_INICFG_CTXSWITCH_PROFILE_SHIFT)
|
|
#define ROGUE_FWIF_INICFG_CTXSWITCH_PROFILE_MEDIUM \
|
|
(ROGUE_FWIF_CTXSWITCH_PROFILE_MEDIUM_EN \
|
|
<< ROGUE_FWIF_INICFG_CTXSWITCH_PROFILE_SHIFT)
|
|
#define ROGUE_FWIF_INICFG_CTXSWITCH_PROFILE_SLOW \
|
|
(ROGUE_FWIF_CTXSWITCH_PROFILE_SLOW_EN \
|
|
<< ROGUE_FWIF_INICFG_CTXSWITCH_PROFILE_SHIFT)
|
|
#define ROGUE_FWIF_INICFG_CTXSWITCH_PROFILE_NODELAY \
|
|
(ROGUE_FWIF_CTXSWITCH_PROFILE_NODELAY_EN \
|
|
<< ROGUE_FWIF_INICFG_CTXSWITCH_PROFILE_SHIFT)
|
|
#define ROGUE_FWIF_INICFG_CTXSWITCH_PROFILE_MASK \
|
|
(7 << ROGUE_FWIF_INICFG_CTXSWITCH_PROFILE_SHIFT)
|
|
#define ROGUE_FWIF_INICFG_DISABLE_DM_OVERLAP BIT(19)
|
|
#define ROGUE_FWIF_INICFG_ASSERT_ON_HWR_TRIGGER BIT(20)
|
|
#define ROGUE_FWIF_INICFG_FABRIC_COHERENCY_ENABLED BIT(21)
|
|
#define ROGUE_FWIF_INICFG_VALIDATE_IRQ BIT(22)
|
|
#define ROGUE_FWIF_INICFG_DISABLE_PDP_EN BIT(23)
|
|
#define ROGUE_FWIF_INICFG_SPU_POWER_STATE_MASK_CHANGE_EN BIT(24)
|
|
#define ROGUE_FWIF_INICFG_WORKEST BIT(25)
|
|
#define ROGUE_FWIF_INICFG_PDVFS BIT(26)
|
|
#define ROGUE_FWIF_INICFG_CDM_ARBITRATION_SHIFT (27)
|
|
#define ROGUE_FWIF_INICFG_CDM_ARBITRATION_TASK_DEMAND \
|
|
(ROGUE_FWIF_CDM_ARBITRATION_TASK_DEMAND_EN \
|
|
<< ROGUE_FWIF_INICFG_CDM_ARBITRATION_SHIFT)
|
|
#define ROGUE_FWIF_INICFG_CDM_ARBITRATION_ROUND_ROBIN \
|
|
(ROGUE_FWIF_CDM_ARBITRATION_ROUND_ROBIN_EN \
|
|
<< ROGUE_FWIF_INICFG_CDM_ARBITRATION_SHIFT)
|
|
#define ROGUE_FWIF_INICFG_CDM_ARBITRATION_MASK \
|
|
(3 << ROGUE_FWIF_INICFG_CDM_ARBITRATION_SHIFT)
|
|
#define ROGUE_FWIF_INICFG_ISPSCHEDMODE_SHIFT (29)
|
|
#define ROGUE_FWIF_INICFG_ISPSCHEDMODE_NONE (0)
|
|
#define ROGUE_FWIF_INICFG_ISPSCHEDMODE_VER1_IPP \
|
|
(ROGUE_FWIF_ISP_SCHEDMODE_VER1_IPP \
|
|
<< ROGUE_FWIF_INICFG_ISPSCHEDMODE_SHIFT)
|
|
#define ROGUE_FWIF_INICFG_ISPSCHEDMODE_VER2_ISP \
|
|
(ROGUE_FWIF_ISP_SCHEDMODE_VER2_ISP \
|
|
<< ROGUE_FWIF_INICFG_ISPSCHEDMODE_SHIFT)
|
|
#define ROGUE_FWIF_INICFG_ISPSCHEDMODE_MASK \
|
|
(ROGUE_FWIF_INICFG_ISPSCHEDMODE_VER1_IPP | \
|
|
ROGUE_FWIF_INICFG_ISPSCHEDMODE_VER2_ISP)
|
|
#define ROGUE_FWIF_INICFG_VALIDATE_SOCUSC_TIMER BIT(31)
|
|
|
|
#define ROGUE_FWIF_INICFG_ALL (0xFFFFFFFFU)
|
|
|
|
/* Extended Flag definitions affecting the firmware globally */
|
|
#define ROGUE_FWIF_INICFG_EXT_TFBC_CONTROL_SHIFT (0)
|
|
/* [7] YUV10 override
|
|
* [6:4] Quality
|
|
* [3] Quality enable
|
|
* [2:1] Compression scheme
|
|
* [0] Lossy group
|
|
*/
|
|
#define ROGUE_FWIF_INICFG_EXT_TFBC_CONTROL_MASK (0xFF)
|
|
#define ROGUE_FWIF_INICFG_EXT_ALL (ROGUE_FWIF_INICFG_EXT_TFBC_CONTROL_MASK)
|
|
|
|
/* Flag definitions affecting only workloads submitted by a particular OS */
|
|
#define ROGUE_FWIF_INICFG_OS_CTXSWITCH_TDM_EN BIT(0)
|
|
#define ROGUE_FWIF_INICFG_OS_CTXSWITCH_GEOM_EN BIT(1)
|
|
#define ROGUE_FWIF_INICFG_OS_CTXSWITCH_FRAG_EN BIT(2)
|
|
#define ROGUE_FWIF_INICFG_OS_CTXSWITCH_CDM_EN BIT(3)
|
|
|
|
#define ROGUE_FWIF_INICFG_OS_LOW_PRIO_CS_TDM BIT(4)
|
|
#define ROGUE_FWIF_INICFG_OS_LOW_PRIO_CS_GEOM BIT(5)
|
|
#define ROGUE_FWIF_INICFG_OS_LOW_PRIO_CS_FRAG BIT(6)
|
|
#define ROGUE_FWIF_INICFG_OS_LOW_PRIO_CS_CDM BIT(7)
|
|
|
|
#define ROGUE_FWIF_INICFG_OS_ALL (0xFF)
|
|
|
|
#define ROGUE_FWIF_INICFG_OS_CTXSWITCH_DM_ALL \
|
|
(ROGUE_FWIF_INICFG_OS_CTXSWITCH_TDM_EN | \
|
|
ROGUE_FWIF_INICFG_OS_CTXSWITCH_GEOM_EN | \
|
|
ROGUE_FWIF_INICFG_OS_CTXSWITCH_FRAG_EN | \
|
|
ROGUE_FWIF_INICFG_OS_CTXSWITCH_CDM_EN)
|
|
|
|
#define ROGUE_FWIF_INICFG_OS_CTXSWITCH_CLRMSK \
|
|
~(ROGUE_FWIF_INICFG_OS_CTXSWITCH_DM_ALL)
|
|
|
|
#define ROGUE_FWIF_FILTCFG_TRUNCATE_HALF BIT(3)
|
|
#define ROGUE_FWIF_FILTCFG_TRUNCATE_INT BIT(2)
|
|
#define ROGUE_FWIF_FILTCFG_NEW_FILTER_MODE BIT(1)
|
|
|
|
enum rogue_activepm_conf {
|
|
ROGUE_ACTIVEPM_FORCE_OFF = 0,
|
|
ROGUE_ACTIVEPM_FORCE_ON = 1,
|
|
ROGUE_ACTIVEPM_DEFAULT = 2
|
|
};
|
|
|
|
enum rogue_rd_power_island_conf {
|
|
ROGUE_RD_POWER_ISLAND_FORCE_OFF = 0,
|
|
ROGUE_RD_POWER_ISLAND_FORCE_ON = 1,
|
|
ROGUE_RD_POWER_ISLAND_DEFAULT = 2
|
|
};
|
|
|
|
struct rogue_fw_register_list {
|
|
/* Register number */
|
|
u16 reg_num;
|
|
/* Indirect register number (or 0 if not used) */
|
|
u16 indirect_reg_num;
|
|
/* Start value for indirect register */
|
|
u16 indirect_start_val;
|
|
/* End value for indirect register */
|
|
u16 indirect_end_val;
|
|
};
|
|
|
|
struct rogue_fwif_dllist_node {
|
|
u32 p;
|
|
u32 n;
|
|
};
|
|
|
|
/*
|
|
* This number is used to represent an invalid page catalogue physical address
|
|
*/
|
|
#define ROGUE_FWIF_INVALID_PC_PHYADDR 0xFFFFFFFFFFFFFFFFLLU
|
|
|
|
/* This number is used to represent unallocated page catalog base register */
|
|
#define ROGUE_FW_BIF_INVALID_PCSET 0xFFFFFFFFU
|
|
|
|
/* Firmware memory context. */
|
|
struct rogue_fwif_fwmemcontext {
|
|
/* device physical address of context's page catalogue */
|
|
aligned_u64 pc_dev_paddr;
|
|
/*
|
|
* associated page catalog base register (ROGUE_FW_BIF_INVALID_PCSET ==
|
|
* unallocated)
|
|
*/
|
|
u32 page_cat_base_reg_set;
|
|
/* breakpoint address */
|
|
u32 breakpoint_addr;
|
|
/* breakpoint handler address */
|
|
u32 bp_handler_addr;
|
|
/* DM and enable control for BP */
|
|
u32 breakpoint_ctl;
|
|
/* Compatibility and other flags */
|
|
u32 fw_mem_ctx_flags;
|
|
u32 padding;
|
|
} __aligned(8);
|
|
|
|
/*
|
|
* FW context state flags
|
|
*/
|
|
#define ROGUE_FWIF_CONTEXT_FLAGS_NEED_RESUME (0x00000001U)
|
|
#define ROGUE_FWIF_CONTEXT_FLAGS_MC_NEED_RESUME_MASKFULL (0x000000FFU)
|
|
#define ROGUE_FWIF_CONTEXT_FLAGS_TDM_HEADER_STALE (0x00000100U)
|
|
#define ROGUE_FWIF_CONTEXT_FLAGS_LAST_KICK_SECURE (0x00000200U)
|
|
|
|
#define ROGUE_NUM_GEOM_CORES_MAX 4
|
|
|
|
/*
|
|
* FW-accessible TA state which must be written out to memory on context store
|
|
*/
|
|
struct rogue_fwif_geom_ctx_state_per_geom {
|
|
/* To store in mid-TA */
|
|
aligned_u64 geom_reg_vdm_call_stack_pointer;
|
|
/* Initial value (in case is 'lost' due to a lock-up */
|
|
aligned_u64 geom_reg_vdm_call_stack_pointer_init;
|
|
u32 geom_reg_vbs_so_prim[4];
|
|
u16 geom_current_idx;
|
|
u16 padding[3];
|
|
} __aligned(8);
|
|
|
|
struct rogue_fwif_geom_ctx_state {
|
|
/* FW-accessible TA state which must be written out to memory on context store */
|
|
struct rogue_fwif_geom_ctx_state_per_geom geom_core[ROGUE_NUM_GEOM_CORES_MAX];
|
|
} __aligned(8);
|
|
|
|
/*
|
|
* FW-accessible ISP state which must be written out to memory on context store
|
|
*/
|
|
struct rogue_fwif_frag_ctx_state {
|
|
u32 frag_reg_pm_deallocated_mask_status;
|
|
u32 frag_reg_dm_pds_mtilefree_status;
|
|
/* Compatibility and other flags */
|
|
u32 ctx_state_flags;
|
|
/*
|
|
* frag_reg_isp_store should be the last element of the structure as this
|
|
* is an array whose size is determined at runtime after detecting the
|
|
* ROGUE core
|
|
*/
|
|
u32 frag_reg_isp_store[];
|
|
} __aligned(8);
|
|
|
|
#define ROGUE_FWIF_CTX_USING_BUFFER_A (0)
|
|
#define ROGUE_FWIF_CTX_USING_BUFFER_B (1U)
|
|
|
|
struct rogue_fwif_compute_ctx_state {
|
|
u32 ctx_state_flags; /* Target buffer and other flags */
|
|
};
|
|
|
|
struct rogue_fwif_fwcommoncontext {
|
|
/* CCB details for this firmware context */
|
|
u32 ccbctl_fw_addr; /* CCB control */
|
|
u32 ccb_fw_addr; /* CCB base */
|
|
struct rogue_fwif_dma_addr ccb_meta_dma_addr;
|
|
|
|
/* Context suspend state */
|
|
/* geom/frag context suspend state, read/written by FW */
|
|
u32 context_state_addr __aligned(8);
|
|
|
|
/* Flags e.g. for context switching */
|
|
u32 fw_com_ctx_flags;
|
|
u32 priority;
|
|
u32 priority_seq_num;
|
|
|
|
/* Framework state */
|
|
/* Register updates for Framework */
|
|
u32 rf_cmd_addr __aligned(8);
|
|
|
|
/* Statistic updates waiting to be passed back to the host... */
|
|
/* True when some stats are pending */
|
|
bool stats_pending __aligned(4);
|
|
/* Number of stores on this context since last update */
|
|
s32 stats_num_stores;
|
|
/* Number of OOMs on this context since last update */
|
|
s32 stats_num_out_of_memory;
|
|
/* Number of PRs on this context since last update */
|
|
s32 stats_num_partial_renders;
|
|
/* Data Master type */
|
|
u32 dm;
|
|
/* Device Virtual Address of the signal the context is waiting on */
|
|
aligned_u64 wait_signal_address;
|
|
/* List entry for the wait-signal list */
|
|
struct rogue_fwif_dllist_node wait_signal_node __aligned(8);
|
|
/* List entry for the buffer stalled list */
|
|
struct rogue_fwif_dllist_node buf_stalled_node __aligned(8);
|
|
/* Address of the circular buffer queue pointers */
|
|
aligned_u64 cbuf_queue_ctrl_addr;
|
|
|
|
aligned_u64 robustness_address;
|
|
/* Max HWR deadline limit in ms */
|
|
u32 max_deadline_ms;
|
|
/* Following HWR circular buffer read-offset needs resetting */
|
|
bool read_offset_needs_reset;
|
|
|
|
/* List entry for the waiting list */
|
|
struct rogue_fwif_dllist_node waiting_node __aligned(8);
|
|
/* List entry for the run list */
|
|
struct rogue_fwif_dllist_node run_node __aligned(8);
|
|
/* UFO that last failed (or NULL) */
|
|
struct rogue_fwif_ufo last_failed_ufo;
|
|
|
|
/* Memory context */
|
|
u32 fw_mem_context_fw_addr;
|
|
|
|
/* References to the host side originators */
|
|
/* the Server Common Context */
|
|
u32 server_common_context_id;
|
|
/* associated process ID */
|
|
u32 pid;
|
|
|
|
/* True when Geom DM OOM is not allowed */
|
|
bool geom_oom_disabled __aligned(4);
|
|
} __aligned(8);
|
|
|
|
/* Firmware render context. */
|
|
struct rogue_fwif_fwrendercontext {
|
|
/* Geometry firmware context. */
|
|
struct rogue_fwif_fwcommoncontext geom_context;
|
|
/* Fragment firmware context. */
|
|
struct rogue_fwif_fwcommoncontext frag_context;
|
|
|
|
struct rogue_fwif_static_rendercontext_state static_render_context_state;
|
|
|
|
/* Number of commands submitted to the WorkEst FW CCB */
|
|
u32 work_est_ccb_submitted;
|
|
|
|
/* Compatibility and other flags */
|
|
u32 fw_render_ctx_flags;
|
|
} __aligned(8);
|
|
|
|
/* Firmware compute context. */
|
|
struct rogue_fwif_fwcomputecontext {
|
|
/* Firmware context for the CDM */
|
|
struct rogue_fwif_fwcommoncontext cdm_context;
|
|
|
|
struct rogue_fwif_static_computecontext_state
|
|
static_compute_context_state;
|
|
|
|
/* Number of commands submitted to the WorkEst FW CCB */
|
|
u32 work_est_ccb_submitted;
|
|
|
|
/* Compatibility and other flags */
|
|
u32 compute_ctx_flags;
|
|
|
|
u32 wgp_state;
|
|
u32 wgp_checksum;
|
|
u32 core_mask_a;
|
|
u32 core_mask_b;
|
|
} __aligned(8);
|
|
|
|
/* Firmware TDM context. */
|
|
struct rogue_fwif_fwtdmcontext {
|
|
/* Firmware context for the TDM */
|
|
struct rogue_fwif_fwcommoncontext tdm_context;
|
|
|
|
/* Number of commands submitted to the WorkEst FW CCB */
|
|
u32 work_est_ccb_submitted;
|
|
} __aligned(8);
|
|
|
|
/* Firmware TQ3D context. */
|
|
struct rogue_fwif_fwtransfercontext {
|
|
/* Firmware context for TQ3D. */
|
|
struct rogue_fwif_fwcommoncontext tq_context;
|
|
} __aligned(8);
|
|
|
|
/*
|
|
******************************************************************************
|
|
* Defines for CMD_TYPE corruption detection and forward compatibility check
|
|
******************************************************************************
|
|
*/
|
|
|
|
/*
|
|
* CMD_TYPE 32bit contains:
|
|
* 31:16 Reserved for magic value to detect corruption (16 bits)
|
|
* 15 Reserved for ROGUE_CCB_TYPE_TASK (1 bit)
|
|
* 14:0 Bits available for CMD_TYPEs (15 bits)
|
|
*/
|
|
|
|
/* Magic value to detect corruption */
|
|
#define ROGUE_CMD_MAGIC_DWORD (0x2ABC)
|
|
#define ROGUE_CMD_MAGIC_DWORD_MASK (0xFFFF0000U)
|
|
#define ROGUE_CMD_MAGIC_DWORD_SHIFT (16U)
|
|
#define ROGUE_CMD_MAGIC_DWORD_SHIFTED \
|
|
(ROGUE_CMD_MAGIC_DWORD << ROGUE_CMD_MAGIC_DWORD_SHIFT)
|
|
|
|
/* Kernel CCB control for ROGUE */
|
|
struct rogue_fwif_ccb_ctl {
|
|
/* write offset into array of commands (MUST be aligned to 16 bytes!) */
|
|
u32 write_offset;
|
|
/* Padding to ensure read and write offsets are in separate cache lines. */
|
|
u8 padding[128 - sizeof(u32)];
|
|
/* read offset into array of commands */
|
|
u32 read_offset;
|
|
/* Offset wrapping mask (Total capacity of the CCB - 1) */
|
|
u32 wrap_mask;
|
|
/* size of each command in bytes */
|
|
u32 cmd_size;
|
|
u32 padding2;
|
|
} __aligned(8);
|
|
|
|
/* Kernel CCB command structure for ROGUE */
|
|
|
|
#define ROGUE_FWIF_MMUCACHEDATA_FLAGS_PT (0x1U) /* MMU_CTRL_INVAL_PT_EN */
|
|
#define ROGUE_FWIF_MMUCACHEDATA_FLAGS_PD (0x2U) /* MMU_CTRL_INVAL_PD_EN */
|
|
#define ROGUE_FWIF_MMUCACHEDATA_FLAGS_PC (0x4U) /* MMU_CTRL_INVAL_PC_EN */
|
|
|
|
/*
|
|
* can't use PM_TLB0 bit from BIFPM_CTRL reg because it collides with PT
|
|
* bit from BIF_CTRL reg
|
|
*/
|
|
#define ROGUE_FWIF_MMUCACHEDATA_FLAGS_PMTLB (0x10)
|
|
/* BIF_CTRL_INVAL_TLB1_EN */
|
|
#define ROGUE_FWIF_MMUCACHEDATA_FLAGS_TLB \
|
|
(ROGUE_FWIF_MMUCACHEDATA_FLAGS_PMTLB | 0x8)
|
|
/* MMU_CTRL_INVAL_ALL_CONTEXTS_EN */
|
|
#define ROGUE_FWIF_MMUCACHEDATA_FLAGS_CTX_ALL (0x800)
|
|
|
|
/* indicates FW should interrupt the host */
|
|
#define ROGUE_FWIF_MMUCACHEDATA_FLAGS_INTERRUPT (0x4000000U)
|
|
|
|
struct rogue_fwif_mmucachedata {
|
|
u32 cache_flags;
|
|
u32 mmu_cache_sync_fw_addr;
|
|
u32 mmu_cache_sync_update_value;
|
|
};
|
|
|
|
#define ROGUE_FWIF_BPDATA_FLAGS_ENABLE BIT(0)
|
|
#define ROGUE_FWIF_BPDATA_FLAGS_WRITE BIT(1)
|
|
#define ROGUE_FWIF_BPDATA_FLAGS_CTL BIT(2)
|
|
#define ROGUE_FWIF_BPDATA_FLAGS_REGS BIT(3)
|
|
|
|
struct rogue_fwif_bpdata {
|
|
/* Memory context */
|
|
u32 fw_mem_context_fw_addr;
|
|
/* Breakpoint address */
|
|
u32 bp_addr;
|
|
/* Breakpoint handler */
|
|
u32 bp_handler_addr;
|
|
/* Breakpoint control */
|
|
u32 bp_dm;
|
|
u32 bp_data_flags;
|
|
/* Number of temporary registers to overallocate */
|
|
u32 temp_regs;
|
|
/* Number of shared registers to overallocate */
|
|
u32 shared_regs;
|
|
/* DM associated with the breakpoint */
|
|
u32 dm;
|
|
};
|
|
|
|
#define ROGUE_FWIF_KCCB_CMD_KICK_DATA_MAX_NUM_CLEANUP_CTLS \
|
|
(ROGUE_FWIF_PRBUFFER_MAXSUPPORTED + 1U) /* +1 is RTDATASET cleanup */
|
|
|
|
struct rogue_fwif_kccb_cmd_kick_data {
|
|
/* address of the firmware context */
|
|
u32 context_fw_addr;
|
|
/* Client CCB woff update */
|
|
u32 client_woff_update;
|
|
/* Client CCB wrap mask update after CCCB growth */
|
|
u32 client_wrap_mask_update;
|
|
/* number of CleanupCtl pointers attached */
|
|
u32 num_cleanup_ctl;
|
|
/* CleanupCtl structures associated with command */
|
|
u32 cleanup_ctl_fw_addr
|
|
[ROGUE_FWIF_KCCB_CMD_KICK_DATA_MAX_NUM_CLEANUP_CTLS];
|
|
/*
|
|
* offset to the CmdHeader which houses the workload estimation kick
|
|
* data.
|
|
*/
|
|
u32 work_est_cmd_header_offset;
|
|
};
|
|
|
|
struct rogue_fwif_kccb_cmd_combined_geom_frag_kick_data {
|
|
struct rogue_fwif_kccb_cmd_kick_data geom_cmd_kick_data;
|
|
struct rogue_fwif_kccb_cmd_kick_data frag_cmd_kick_data;
|
|
};
|
|
|
|
struct rogue_fwif_kccb_cmd_force_update_data {
|
|
/* address of the firmware context */
|
|
u32 context_fw_addr;
|
|
/* Client CCB fence offset */
|
|
u32 ccb_fence_offset;
|
|
};
|
|
|
|
enum rogue_fwif_cleanup_type {
|
|
/* FW common context cleanup */
|
|
ROGUE_FWIF_CLEANUP_FWCOMMONCONTEXT,
|
|
/* FW HW RT data cleanup */
|
|
ROGUE_FWIF_CLEANUP_HWRTDATA,
|
|
/* FW freelist cleanup */
|
|
ROGUE_FWIF_CLEANUP_FREELIST,
|
|
/* FW ZS Buffer cleanup */
|
|
ROGUE_FWIF_CLEANUP_ZSBUFFER,
|
|
};
|
|
|
|
struct rogue_fwif_cleanup_request {
|
|
/* Cleanup type */
|
|
enum rogue_fwif_cleanup_type cleanup_type;
|
|
union {
|
|
/* FW common context to cleanup */
|
|
u32 context_fw_addr;
|
|
/* HW RT to cleanup */
|
|
u32 hwrt_data_fw_addr;
|
|
/* Freelist to cleanup */
|
|
u32 freelist_fw_addr;
|
|
/* ZS Buffer to cleanup */
|
|
u32 zs_buffer_fw_addr;
|
|
} cleanup_data;
|
|
};
|
|
|
|
enum rogue_fwif_power_type {
|
|
ROGUE_FWIF_POW_OFF_REQ = 1,
|
|
ROGUE_FWIF_POW_FORCED_IDLE_REQ,
|
|
ROGUE_FWIF_POW_NUM_UNITS_CHANGE,
|
|
ROGUE_FWIF_POW_APM_LATENCY_CHANGE
|
|
};
|
|
|
|
enum rogue_fwif_power_force_idle_type {
|
|
ROGUE_FWIF_POWER_FORCE_IDLE = 1,
|
|
ROGUE_FWIF_POWER_CANCEL_FORCED_IDLE,
|
|
ROGUE_FWIF_POWER_HOST_TIMEOUT,
|
|
};
|
|
|
|
struct rogue_fwif_power_request {
|
|
/* Type of power request */
|
|
enum rogue_fwif_power_type pow_type;
|
|
union {
|
|
/* Number of active Dusts */
|
|
u32 num_of_dusts;
|
|
/* If the operation is mandatory */
|
|
bool forced __aligned(4);
|
|
/*
|
|
* Type of Request. Consolidating Force Idle, Cancel Forced
|
|
* Idle, Host Timeout
|
|
*/
|
|
enum rogue_fwif_power_force_idle_type pow_request_type;
|
|
} power_req_data;
|
|
};
|
|
|
|
struct rogue_fwif_slcflushinvaldata {
|
|
/* Context to fence on (only useful when bDMContext == TRUE) */
|
|
u32 context_fw_addr;
|
|
/* Invalidate the cache as well as flushing */
|
|
bool inval __aligned(4);
|
|
/* The data to flush/invalidate belongs to a specific DM context */
|
|
bool dm_context __aligned(4);
|
|
/* Optional address of range (only useful when bDMContext == FALSE) */
|
|
aligned_u64 address;
|
|
/* Optional size of range (only useful when bDMContext == FALSE) */
|
|
aligned_u64 size;
|
|
};
|
|
|
|
enum rogue_fwif_hwperf_update_config {
|
|
ROGUE_FWIF_HWPERF_CTRL_TOGGLE = 0,
|
|
ROGUE_FWIF_HWPERF_CTRL_SET = 1,
|
|
ROGUE_FWIF_HWPERF_CTRL_EMIT_FEATURES_EV = 2
|
|
};
|
|
|
|
struct rogue_fwif_hwperf_ctrl {
|
|
enum rogue_fwif_hwperf_update_config opcode; /* Control operation code */
|
|
aligned_u64 mask; /* Mask of events to toggle */
|
|
};
|
|
|
|
struct rogue_fwif_hwperf_config_enable_blks {
|
|
/* Number of ROGUE_HWPERF_CONFIG_MUX_CNTBLK in the array */
|
|
u32 num_blocks;
|
|
/* Address of the ROGUE_HWPERF_CONFIG_MUX_CNTBLK array */
|
|
u32 block_configs_fw_addr;
|
|
};
|
|
|
|
struct rogue_fwif_hwperf_config_da_blks {
|
|
/* Number of ROGUE_HWPERF_CONFIG_CNTBLK in the array */
|
|
u32 num_blocks;
|
|
/* Address of the ROGUE_HWPERF_CONFIG_CNTBLK array */
|
|
u32 block_configs_fw_addr;
|
|
};
|
|
|
|
struct rogue_fwif_coreclkspeedchange_data {
|
|
u32 new_clock_speed; /* New clock speed */
|
|
};
|
|
|
|
#define ROGUE_FWIF_HWPERF_CTRL_BLKS_MAX 16
|
|
|
|
struct rogue_fwif_hwperf_ctrl_blks {
|
|
bool enable;
|
|
/* Number of block IDs in the array */
|
|
u32 num_blocks;
|
|
/* Array of ROGUE_HWPERF_CNTBLK_ID values */
|
|
u16 block_ids[ROGUE_FWIF_HWPERF_CTRL_BLKS_MAX];
|
|
};
|
|
|
|
struct rogue_fwif_hwperf_select_custom_cntrs {
|
|
u16 custom_block;
|
|
u16 num_counters;
|
|
u32 custom_counter_ids_fw_addr;
|
|
};
|
|
|
|
struct rogue_fwif_zsbuffer_backing_data {
|
|
u32 zs_buffer_fw_addr; /* ZS-Buffer FW address */
|
|
|
|
bool done __aligned(4); /* action backing/unbacking succeeded */
|
|
};
|
|
|
|
struct rogue_fwif_freelist_gs_data {
|
|
/* Freelist FW address */
|
|
u32 freelist_fw_addr;
|
|
/* Amount of the Freelist change */
|
|
u32 delta_pages;
|
|
/* New amount of pages on the freelist (including ready pages) */
|
|
u32 new_pages;
|
|
/* Number of ready pages to be held in reserve until OOM */
|
|
u32 ready_pages;
|
|
};
|
|
|
|
#define MAX_FREELISTS_SIZE 3
|
|
#define MAX_HW_GEOM_FRAG_CONTEXTS_SIZE 3
|
|
|
|
#define ROGUE_FWIF_MAX_FREELISTS_TO_RECONSTRUCT \
|
|
(MAX_HW_GEOM_FRAG_CONTEXTS_SIZE * MAX_FREELISTS_SIZE * 2U)
|
|
#define ROGUE_FWIF_FREELISTS_RECONSTRUCTION_FAILED_FLAG 0x80000000U
|
|
|
|
struct rogue_fwif_freelists_reconstruction_data {
|
|
u32 freelist_count;
|
|
u32 freelist_ids[ROGUE_FWIF_MAX_FREELISTS_TO_RECONSTRUCT];
|
|
};
|
|
|
|
struct rogue_fwif_write_offset_update_data {
|
|
/*
|
|
* Context to that may need to be resumed following write offset update
|
|
*/
|
|
u32 context_fw_addr;
|
|
} __aligned(8);
|
|
|
|
/*
|
|
******************************************************************************
|
|
* Proactive DVFS Structures
|
|
******************************************************************************
|
|
*/
|
|
#define NUM_OPP_VALUES 16
|
|
|
|
struct pdvfs_opp {
|
|
u32 volt; /* V */
|
|
u32 freq; /* Hz */
|
|
} __aligned(8);
|
|
|
|
struct rogue_fwif_pdvfs_opp {
|
|
struct pdvfs_opp opp_values[NUM_OPP_VALUES];
|
|
u32 min_opp_point;
|
|
u32 max_opp_point;
|
|
} __aligned(8);
|
|
|
|
struct rogue_fwif_pdvfs_max_freq_data {
|
|
u32 max_opp_point;
|
|
} __aligned(8);
|
|
|
|
struct rogue_fwif_pdvfs_min_freq_data {
|
|
u32 min_opp_point;
|
|
} __aligned(8);
|
|
|
|
/*
|
|
******************************************************************************
|
|
* Register configuration structures
|
|
******************************************************************************
|
|
*/
|
|
|
|
#define ROGUE_FWIF_REG_CFG_MAX_SIZE 512
|
|
|
|
enum rogue_fwif_regdata_cmd_type {
|
|
ROGUE_FWIF_REGCFG_CMD_ADD = 101,
|
|
ROGUE_FWIF_REGCFG_CMD_CLEAR = 102,
|
|
ROGUE_FWIF_REGCFG_CMD_ENABLE = 103,
|
|
ROGUE_FWIF_REGCFG_CMD_DISABLE = 104
|
|
};
|
|
|
|
enum rogue_fwif_reg_cfg_type {
|
|
/* Sidekick power event */
|
|
ROGUE_FWIF_REG_CFG_TYPE_PWR_ON = 0,
|
|
/* Rascal / dust power event */
|
|
ROGUE_FWIF_REG_CFG_TYPE_DUST_CHANGE,
|
|
/* Geometry kick */
|
|
ROGUE_FWIF_REG_CFG_TYPE_GEOM,
|
|
/* Fragment kick */
|
|
ROGUE_FWIF_REG_CFG_TYPE_FRAG,
|
|
/* Compute kick */
|
|
ROGUE_FWIF_REG_CFG_TYPE_CDM,
|
|
/* TLA kick */
|
|
ROGUE_FWIF_REG_CFG_TYPE_TLA,
|
|
/* TDM kick */
|
|
ROGUE_FWIF_REG_CFG_TYPE_TDM,
|
|
/* Applies to all types. Keep as last element */
|
|
ROGUE_FWIF_REG_CFG_TYPE_ALL
|
|
};
|
|
|
|
struct rogue_fwif_reg_cfg_rec {
|
|
u64 sddr;
|
|
u64 mask;
|
|
u64 value;
|
|
};
|
|
|
|
struct rogue_fwif_regconfig_data {
|
|
enum rogue_fwif_regdata_cmd_type cmd_type;
|
|
enum rogue_fwif_reg_cfg_type reg_config_type;
|
|
struct rogue_fwif_reg_cfg_rec reg_config __aligned(8);
|
|
};
|
|
|
|
struct rogue_fwif_reg_cfg {
|
|
/*
|
|
* PDump WRW command write granularity is 32 bits.
|
|
* Add padding to ensure array size is 32 bit granular.
|
|
*/
|
|
u8 num_regs_type[ALIGN((u32)ROGUE_FWIF_REG_CFG_TYPE_ALL,
|
|
sizeof(u32))] __aligned(8);
|
|
struct rogue_fwif_reg_cfg_rec
|
|
reg_configs[ROGUE_FWIF_REG_CFG_MAX_SIZE] __aligned(8);
|
|
} __aligned(8);
|
|
|
|
enum rogue_fwif_os_state_change {
|
|
ROGUE_FWIF_OS_ONLINE = 1,
|
|
ROGUE_FWIF_OS_OFFLINE
|
|
};
|
|
|
|
struct rogue_fwif_os_state_change_data {
|
|
u32 osid;
|
|
enum rogue_fwif_os_state_change new_os_state;
|
|
} __aligned(8);
|
|
|
|
enum rogue_fwif_counter_dump_request {
|
|
ROGUE_FWIF_PWR_COUNTER_DUMP_START = 1,
|
|
ROGUE_FWIF_PWR_COUNTER_DUMP_STOP,
|
|
ROGUE_FWIF_PWR_COUNTER_DUMP_SAMPLE,
|
|
};
|
|
|
|
struct rogue_fwif_counter_dump_data {
|
|
enum rogue_fwif_counter_dump_request counter_dump_request;
|
|
} __aligned(8);
|
|
|
|
enum rogue_fwif_kccb_cmd_type {
|
|
/* Common commands */
|
|
ROGUE_FWIF_KCCB_CMD_KICK = 101U | ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
ROGUE_FWIF_KCCB_CMD_MMUCACHE = 102U | ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
ROGUE_FWIF_KCCB_CMD_BP = 103U | ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
/* SLC flush and invalidation request */
|
|
ROGUE_FWIF_KCCB_CMD_SLCFLUSHINVAL = 105U |
|
|
ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
/*
|
|
* Requests cleanup of a FW resource (type specified in the command
|
|
* data)
|
|
*/
|
|
ROGUE_FWIF_KCCB_CMD_CLEANUP = 106U | ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
/* Power request */
|
|
ROGUE_FWIF_KCCB_CMD_POW = 107U | ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
/* Backing for on-demand ZS-Buffer done */
|
|
ROGUE_FWIF_KCCB_CMD_ZSBUFFER_BACKING_UPDATE =
|
|
108U | ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
/* Unbacking for on-demand ZS-Buffer done */
|
|
ROGUE_FWIF_KCCB_CMD_ZSBUFFER_UNBACKING_UPDATE =
|
|
109U | ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
/* Freelist Grow done */
|
|
ROGUE_FWIF_KCCB_CMD_FREELIST_GROW_UPDATE =
|
|
110U | ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
/* Freelists Reconstruction done */
|
|
ROGUE_FWIF_KCCB_CMD_FREELISTS_RECONSTRUCTION_UPDATE =
|
|
112U | ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
/*
|
|
* Informs the firmware that the host has added more data to a CDM2
|
|
* Circular Buffer
|
|
*/
|
|
ROGUE_FWIF_KCCB_CMD_NOTIFY_WRITE_OFFSET_UPDATE =
|
|
114U | ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
/* Health check request */
|
|
ROGUE_FWIF_KCCB_CMD_HEALTH_CHECK = 115U | ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
/* Forcing signalling of all unmet UFOs for a given CCB offset */
|
|
ROGUE_FWIF_KCCB_CMD_FORCE_UPDATE = 116U | ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
|
|
/* There is a geometry and a fragment command in this single kick */
|
|
ROGUE_FWIF_KCCB_CMD_COMBINED_GEOM_FRAG_KICK = 117U | ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
/* Informs the FW that a Guest OS has come online / offline. */
|
|
ROGUE_FWIF_KCCB_CMD_OS_ONLINE_STATE_CONFIGURE = 118U | ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
|
|
/* Commands only permitted to the native or host OS */
|
|
ROGUE_FWIF_KCCB_CMD_REGCONFIG = 200U | ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
|
|
/* Configure HWPerf events (to be generated) and HWPerf buffer address (if required) */
|
|
ROGUE_FWIF_KCCB_CMD_HWPERF_UPDATE_CONFIG = 201U | ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
|
|
/* Enable or disable multiple HWPerf blocks (reusing existing configuration) */
|
|
ROGUE_FWIF_KCCB_CMD_HWPERF_CTRL_BLKS = 203U | ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
/* Core clock speed change event */
|
|
ROGUE_FWIF_KCCB_CMD_CORECLKSPEEDCHANGE = 204U | ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
|
|
/*
|
|
* Ask the firmware to update its cached ui32LogType value from the (shared)
|
|
* tracebuf control structure
|
|
*/
|
|
ROGUE_FWIF_KCCB_CMD_LOGTYPE_UPDATE = 206U | ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
/* Set a maximum frequency/OPP point */
|
|
ROGUE_FWIF_KCCB_CMD_PDVFS_LIMIT_MAX_FREQ = 207U | ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
/*
|
|
* Changes the relative scheduling priority for a particular OSid. It can
|
|
* only be serviced for the Host DDK
|
|
*/
|
|
ROGUE_FWIF_KCCB_CMD_OSID_PRIORITY_CHANGE = 208U | ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
/* Set or clear firmware state flags */
|
|
ROGUE_FWIF_KCCB_CMD_STATEFLAGS_CTRL = 209U | ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
|
|
/* Set a minimum frequency/OPP point */
|
|
ROGUE_FWIF_KCCB_CMD_PDVFS_LIMIT_MIN_FREQ = 212U | ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
/* Configure Periodic Hardware Reset behaviour */
|
|
ROGUE_FWIF_KCCB_CMD_PHR_CFG = 213U | ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
|
|
/* Configure Safety Firmware Watchdog */
|
|
ROGUE_FWIF_KCCB_CMD_WDG_CFG = 215U | ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
/* Controls counter dumping in the FW */
|
|
ROGUE_FWIF_KCCB_CMD_COUNTER_DUMP = 216U | ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
/* Configure, clear and enable multiple HWPerf blocks */
|
|
ROGUE_FWIF_KCCB_CMD_HWPERF_CONFIG_ENABLE_BLKS = 217U | ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
/* Configure the custom counters for HWPerf */
|
|
ROGUE_FWIF_KCCB_CMD_HWPERF_SELECT_CUSTOM_CNTRS = 218U | ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
|
|
/* Configure directly addressable counters for HWPerf */
|
|
ROGUE_FWIF_KCCB_CMD_HWPERF_CONFIG_BLKS = 220U | ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
};
|
|
|
|
#define ROGUE_FWIF_LAST_ALLOWED_GUEST_KCCB_CMD \
|
|
(ROGUE_FWIF_KCCB_CMD_REGCONFIG - 1)
|
|
|
|
/* Kernel CCB command packet */
|
|
struct rogue_fwif_kccb_cmd {
|
|
/* Command type */
|
|
enum rogue_fwif_kccb_cmd_type cmd_type;
|
|
/* Compatibility and other flags */
|
|
u32 kccb_flags;
|
|
|
|
/*
|
|
* NOTE: Make sure that uCmdData is the last member of this struct
|
|
* This is to calculate actual command size for device mem copy.
|
|
* (Refer ROGUEGetCmdMemCopySize())
|
|
*/
|
|
union {
|
|
/* Data for Kick command */
|
|
struct rogue_fwif_kccb_cmd_kick_data cmd_kick_data;
|
|
/* Data for combined geom/frag Kick command */
|
|
struct rogue_fwif_kccb_cmd_combined_geom_frag_kick_data
|
|
combined_geom_frag_cmd_kick_data;
|
|
/* Data for MMU cache command */
|
|
struct rogue_fwif_mmucachedata mmu_cache_data;
|
|
/* Data for Breakpoint Commands */
|
|
struct rogue_fwif_bpdata bp_data;
|
|
/* Data for SLC Flush/Inval commands */
|
|
struct rogue_fwif_slcflushinvaldata slc_flush_inval_data;
|
|
/* Data for cleanup commands */
|
|
struct rogue_fwif_cleanup_request cleanup_data;
|
|
/* Data for power request commands */
|
|
struct rogue_fwif_power_request pow_data;
|
|
/* Data for HWPerf control command */
|
|
struct rogue_fwif_hwperf_ctrl hw_perf_ctrl;
|
|
/*
|
|
* Data for HWPerf configure, clear and enable performance
|
|
* counter block command
|
|
*/
|
|
struct rogue_fwif_hwperf_config_enable_blks
|
|
hw_perf_cfg_enable_blks;
|
|
/*
|
|
* Data for HWPerf enable or disable performance counter block
|
|
* commands
|
|
*/
|
|
struct rogue_fwif_hwperf_ctrl_blks hw_perf_ctrl_blks;
|
|
/* Data for HWPerf configure the custom counters to read */
|
|
struct rogue_fwif_hwperf_select_custom_cntrs
|
|
hw_perf_select_cstm_cntrs;
|
|
/* Data for HWPerf configure Directly Addressable blocks */
|
|
struct rogue_fwif_hwperf_config_da_blks hw_perf_cfg_da_blks;
|
|
/* Data for core clock speed change */
|
|
struct rogue_fwif_coreclkspeedchange_data
|
|
core_clk_speed_change_data;
|
|
/* Feedback for Z/S Buffer backing/unbacking */
|
|
struct rogue_fwif_zsbuffer_backing_data zs_buffer_backing_data;
|
|
/* Feedback for Freelist grow/shrink */
|
|
struct rogue_fwif_freelist_gs_data free_list_gs_data;
|
|
/* Feedback for Freelists reconstruction*/
|
|
struct rogue_fwif_freelists_reconstruction_data
|
|
free_lists_reconstruction_data;
|
|
/* Data for custom register configuration */
|
|
struct rogue_fwif_regconfig_data reg_config_data;
|
|
/* Data for informing the FW about the write offset update */
|
|
struct rogue_fwif_write_offset_update_data
|
|
write_offset_update_data;
|
|
/* Data for setting the max frequency/OPP */
|
|
struct rogue_fwif_pdvfs_max_freq_data pdvfs_max_freq_data;
|
|
/* Data for setting the min frequency/OPP */
|
|
struct rogue_fwif_pdvfs_min_freq_data pdvfs_min_freq_data;
|
|
/* Data for updating the Guest Online states */
|
|
struct rogue_fwif_os_state_change_data cmd_os_online_state_data;
|
|
/* Dev address for TBI buffer allocated on demand */
|
|
u32 tbi_buffer_fw_addr;
|
|
/* Data for dumping of register ranges */
|
|
struct rogue_fwif_counter_dump_data counter_dump_config_data;
|
|
/* Data for signalling all unmet fences for a given CCB */
|
|
struct rogue_fwif_kccb_cmd_force_update_data force_update_data;
|
|
} cmd_data __aligned(8);
|
|
} __aligned(8);
|
|
|
|
PVR_FW_STRUCT_SIZE_ASSERT(struct rogue_fwif_kccb_cmd);
|
|
|
|
/*
|
|
******************************************************************************
|
|
* Firmware CCB command structure for ROGUE
|
|
******************************************************************************
|
|
*/
|
|
|
|
struct rogue_fwif_fwccb_cmd_zsbuffer_backing_data {
|
|
u32 zs_buffer_id;
|
|
};
|
|
|
|
struct rogue_fwif_fwccb_cmd_freelist_gs_data {
|
|
u32 freelist_id;
|
|
};
|
|
|
|
struct rogue_fwif_fwccb_cmd_freelists_reconstruction_data {
|
|
u32 freelist_count;
|
|
u32 hwr_counter;
|
|
u32 freelist_ids[ROGUE_FWIF_MAX_FREELISTS_TO_RECONSTRUCT];
|
|
};
|
|
|
|
/* 1 if a page fault happened */
|
|
#define ROGUE_FWIF_FWCCB_CMD_CONTEXT_RESET_FLAG_PF BIT(0)
|
|
/* 1 if applicable to all contexts */
|
|
#define ROGUE_FWIF_FWCCB_CMD_CONTEXT_RESET_FLAG_ALL_CTXS BIT(1)
|
|
|
|
struct rogue_fwif_fwccb_cmd_context_reset_data {
|
|
/* Context affected by the reset */
|
|
u32 server_common_context_id;
|
|
/* Reason for reset */
|
|
enum rogue_context_reset_reason reset_reason;
|
|
/* Data Master affected by the reset */
|
|
u32 dm;
|
|
/* Job ref running at the time of reset */
|
|
u32 reset_job_ref;
|
|
/* ROGUE_FWIF_FWCCB_CMD_CONTEXT_RESET_FLAG bitfield */
|
|
u32 flags;
|
|
/* At what page catalog address */
|
|
aligned_u64 pc_address;
|
|
/* Page fault address (only when applicable) */
|
|
aligned_u64 fault_address;
|
|
};
|
|
|
|
struct rogue_fwif_fwccb_cmd_fw_pagefault_data {
|
|
/* Page fault address */
|
|
u64 fw_fault_addr;
|
|
};
|
|
|
|
enum rogue_fwif_fwccb_cmd_type {
|
|
/* Requests ZSBuffer to be backed with physical pages */
|
|
ROGUE_FWIF_FWCCB_CMD_ZSBUFFER_BACKING = 101U |
|
|
ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
/* Requests ZSBuffer to be unbacked */
|
|
ROGUE_FWIF_FWCCB_CMD_ZSBUFFER_UNBACKING = 102U |
|
|
ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
/* Requests an on-demand freelist grow/shrink */
|
|
ROGUE_FWIF_FWCCB_CMD_FREELIST_GROW = 103U |
|
|
ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
/* Requests freelists reconstruction */
|
|
ROGUE_FWIF_FWCCB_CMD_FREELISTS_RECONSTRUCTION =
|
|
104U | ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
/* Notifies host of a HWR event on a context */
|
|
ROGUE_FWIF_FWCCB_CMD_CONTEXT_RESET_NOTIFICATION =
|
|
105U | ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
/* Requests an on-demand debug dump */
|
|
ROGUE_FWIF_FWCCB_CMD_DEBUG_DUMP = 106U | ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
/* Requests an on-demand update on process stats */
|
|
ROGUE_FWIF_FWCCB_CMD_UPDATE_STATS = 107U |
|
|
ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
|
|
ROGUE_FWIF_FWCCB_CMD_CORE_CLK_RATE_CHANGE =
|
|
108U | ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
ROGUE_FWIF_FWCCB_CMD_REQUEST_GPU_RESTART =
|
|
109U | ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
|
|
/* Notifies host of a FW pagefault */
|
|
ROGUE_FWIF_FWCCB_CMD_CONTEXT_FW_PF_NOTIFICATION =
|
|
112U | ROGUE_CMD_MAGIC_DWORD_SHIFTED,
|
|
};
|
|
|
|
enum rogue_fwif_fwccb_cmd_update_stats_type {
|
|
/*
|
|
* PVRSRVStatsUpdateRenderContextStats should increase the value of the
|
|
* ui32TotalNumPartialRenders stat
|
|
*/
|
|
ROGUE_FWIF_FWCCB_CMD_UPDATE_NUM_PARTIAL_RENDERS = 1,
|
|
/*
|
|
* PVRSRVStatsUpdateRenderContextStats should increase the value of the
|
|
* ui32TotalNumOutOfMemory stat
|
|
*/
|
|
ROGUE_FWIF_FWCCB_CMD_UPDATE_NUM_OUT_OF_MEMORY,
|
|
/*
|
|
* PVRSRVStatsUpdateRenderContextStats should increase the value of the
|
|
* ui32NumGeomStores stat
|
|
*/
|
|
ROGUE_FWIF_FWCCB_CMD_UPDATE_NUM_GEOM_STORES,
|
|
/*
|
|
* PVRSRVStatsUpdateRenderContextStats should increase the value of the
|
|
* ui32NumFragStores stat
|
|
*/
|
|
ROGUE_FWIF_FWCCB_CMD_UPDATE_NUM_FRAG_STORES,
|
|
/*
|
|
* PVRSRVStatsUpdateRenderContextStats should increase the value of the
|
|
* ui32NumCDMStores stat
|
|
*/
|
|
ROGUE_FWIF_FWCCB_CMD_UPDATE_NUM_CDM_STORES,
|
|
/*
|
|
* PVRSRVStatsUpdateRenderContextStats should increase the value of the
|
|
* ui32NumTDMStores stat
|
|
*/
|
|
ROGUE_FWIF_FWCCB_CMD_UPDATE_NUM_TDM_STORES
|
|
};
|
|
|
|
struct rogue_fwif_fwccb_cmd_update_stats_data {
|
|
/* Element to update */
|
|
enum rogue_fwif_fwccb_cmd_update_stats_type element_to_update;
|
|
/* The pid of the process whose stats are being updated */
|
|
u32 pid_owner;
|
|
/* Adjustment to be made to the statistic */
|
|
s32 adjustment_value;
|
|
};
|
|
|
|
struct rogue_fwif_fwccb_cmd_core_clk_rate_change_data {
|
|
u32 core_clk_rate;
|
|
} __aligned(8);
|
|
|
|
struct rogue_fwif_fwccb_cmd {
|
|
/* Command type */
|
|
enum rogue_fwif_fwccb_cmd_type cmd_type;
|
|
/* Compatibility and other flags */
|
|
u32 fwccb_flags;
|
|
|
|
union {
|
|
/* Data for Z/S-Buffer on-demand (un)backing*/
|
|
struct rogue_fwif_fwccb_cmd_zsbuffer_backing_data
|
|
cmd_zs_buffer_backing;
|
|
/* Data for on-demand freelist grow/shrink */
|
|
struct rogue_fwif_fwccb_cmd_freelist_gs_data cmd_free_list_gs;
|
|
/* Data for freelists reconstruction */
|
|
struct rogue_fwif_fwccb_cmd_freelists_reconstruction_data
|
|
cmd_freelists_reconstruction;
|
|
/* Data for context reset notification */
|
|
struct rogue_fwif_fwccb_cmd_context_reset_data
|
|
cmd_context_reset_notification;
|
|
/* Data for updating process stats */
|
|
struct rogue_fwif_fwccb_cmd_update_stats_data
|
|
cmd_update_stats_data;
|
|
struct rogue_fwif_fwccb_cmd_core_clk_rate_change_data
|
|
cmd_core_clk_rate_change;
|
|
struct rogue_fwif_fwccb_cmd_fw_pagefault_data cmd_fw_pagefault;
|
|
} cmd_data __aligned(8);
|
|
} __aligned(8);
|
|
|
|
PVR_FW_STRUCT_SIZE_ASSERT(struct rogue_fwif_fwccb_cmd);
|
|
|
|
/*
|
|
******************************************************************************
|
|
* Workload estimation Firmware CCB command structure for ROGUE
|
|
******************************************************************************
|
|
*/
|
|
struct rogue_fwif_workest_fwccb_cmd {
|
|
/* Index for return data array */
|
|
u16 return_data_index;
|
|
/* The cycles the workload took on the hardware */
|
|
u32 cycles_taken;
|
|
};
|
|
|
|
/*
|
|
******************************************************************************
|
|
* Client CCB commands for ROGUE
|
|
******************************************************************************
|
|
*/
|
|
|
|
/*
|
|
* Required memory alignment for 64-bit variables accessible by Meta
|
|
* (The gcc meta aligns 64-bit variables to 64-bit; therefore, memory shared
|
|
* between the host and meta that contains 64-bit variables has to maintain
|
|
* this alignment)
|
|
*/
|
|
#define ROGUE_FWIF_FWALLOC_ALIGN sizeof(u64)
|
|
|
|
#define ROGUE_CCB_TYPE_TASK BIT(15)
|
|
#define ROGUE_CCB_FWALLOC_ALIGN(size) \
|
|
(((size) + (ROGUE_FWIF_FWALLOC_ALIGN - 1)) & \
|
|
~(ROGUE_FWIF_FWALLOC_ALIGN - 1))
|
|
|
|
#define ROGUE_FWIF_CCB_CMD_TYPE_GEOM \
|
|
(201U | ROGUE_CMD_MAGIC_DWORD_SHIFTED | ROGUE_CCB_TYPE_TASK)
|
|
#define ROGUE_FWIF_CCB_CMD_TYPE_TQ_3D \
|
|
(202U | ROGUE_CMD_MAGIC_DWORD_SHIFTED | ROGUE_CCB_TYPE_TASK)
|
|
#define ROGUE_FWIF_CCB_CMD_TYPE_FRAG \
|
|
(203U | ROGUE_CMD_MAGIC_DWORD_SHIFTED | ROGUE_CCB_TYPE_TASK)
|
|
#define ROGUE_FWIF_CCB_CMD_TYPE_FRAG_PR \
|
|
(204U | ROGUE_CMD_MAGIC_DWORD_SHIFTED | ROGUE_CCB_TYPE_TASK)
|
|
#define ROGUE_FWIF_CCB_CMD_TYPE_CDM \
|
|
(205U | ROGUE_CMD_MAGIC_DWORD_SHIFTED | ROGUE_CCB_TYPE_TASK)
|
|
#define ROGUE_FWIF_CCB_CMD_TYPE_TQ_TDM \
|
|
(206U | ROGUE_CMD_MAGIC_DWORD_SHIFTED | ROGUE_CCB_TYPE_TASK)
|
|
#define ROGUE_FWIF_CCB_CMD_TYPE_FBSC_INVALIDATE \
|
|
(207U | ROGUE_CMD_MAGIC_DWORD_SHIFTED | ROGUE_CCB_TYPE_TASK)
|
|
#define ROGUE_FWIF_CCB_CMD_TYPE_TQ_2D \
|
|
(208U | ROGUE_CMD_MAGIC_DWORD_SHIFTED | ROGUE_CCB_TYPE_TASK)
|
|
#define ROGUE_FWIF_CCB_CMD_TYPE_PRE_TIMESTAMP \
|
|
(209U | ROGUE_CMD_MAGIC_DWORD_SHIFTED | ROGUE_CCB_TYPE_TASK)
|
|
#define ROGUE_FWIF_CCB_CMD_TYPE_NULL \
|
|
(210U | ROGUE_CMD_MAGIC_DWORD_SHIFTED | ROGUE_CCB_TYPE_TASK)
|
|
#define ROGUE_FWIF_CCB_CMD_TYPE_ABORT \
|
|
(211U | ROGUE_CMD_MAGIC_DWORD_SHIFTED | ROGUE_CCB_TYPE_TASK)
|
|
|
|
/* Leave a gap between CCB specific commands and generic commands */
|
|
#define ROGUE_FWIF_CCB_CMD_TYPE_FENCE (212U | ROGUE_CMD_MAGIC_DWORD_SHIFTED)
|
|
#define ROGUE_FWIF_CCB_CMD_TYPE_UPDATE (213U | ROGUE_CMD_MAGIC_DWORD_SHIFTED)
|
|
#define ROGUE_FWIF_CCB_CMD_TYPE_RMW_UPDATE \
|
|
(214U | ROGUE_CMD_MAGIC_DWORD_SHIFTED)
|
|
#define ROGUE_FWIF_CCB_CMD_TYPE_FENCE_PR (215U | ROGUE_CMD_MAGIC_DWORD_SHIFTED)
|
|
#define ROGUE_FWIF_CCB_CMD_TYPE_PRIORITY (216U | ROGUE_CMD_MAGIC_DWORD_SHIFTED)
|
|
/*
|
|
* Pre and Post timestamp commands are supposed to sandwich the DM cmd. The
|
|
* padding code with the CCB wrap upsets the FW if we don't have the task type
|
|
* bit cleared for POST_TIMESTAMPs. That's why we have 2 different cmd types.
|
|
*/
|
|
#define ROGUE_FWIF_CCB_CMD_TYPE_POST_TIMESTAMP \
|
|
(217U | ROGUE_CMD_MAGIC_DWORD_SHIFTED)
|
|
#define ROGUE_FWIF_CCB_CMD_TYPE_UNFENCED_UPDATE \
|
|
(218U | ROGUE_CMD_MAGIC_DWORD_SHIFTED)
|
|
#define ROGUE_FWIF_CCB_CMD_TYPE_UNFENCED_RMW_UPDATE \
|
|
(219U | ROGUE_CMD_MAGIC_DWORD_SHIFTED)
|
|
|
|
#define ROGUE_FWIF_CCB_CMD_TYPE_PADDING (221U | ROGUE_CMD_MAGIC_DWORD_SHIFTED)
|
|
|
|
struct rogue_fwif_workest_kick_data {
|
|
/* Index for the KM Workload estimation return data array */
|
|
u16 return_data_index __aligned(8);
|
|
/* Predicted time taken to do the work in cycles */
|
|
u32 cycles_prediction __aligned(8);
|
|
/* Deadline for the workload */
|
|
aligned_u64 deadline;
|
|
};
|
|
|
|
struct rogue_fwif_ccb_cmd_header {
|
|
u32 cmd_type;
|
|
u32 cmd_size;
|
|
/*
|
|
* external job reference - provided by client and used in debug for
|
|
* tracking submitted work
|
|
*/
|
|
u32 ext_job_ref;
|
|
/*
|
|
* internal job reference - generated by services and used in debug for
|
|
* tracking submitted work
|
|
*/
|
|
u32 int_job_ref;
|
|
/* Workload Estimation - Workload Estimation Data */
|
|
struct rogue_fwif_workest_kick_data work_est_kick_data __aligned(8);
|
|
};
|
|
|
|
/*
|
|
******************************************************************************
|
|
* Client CCB commands which are only required by the kernel
|
|
******************************************************************************
|
|
*/
|
|
struct rogue_fwif_cmd_priority {
|
|
s32 priority;
|
|
};
|
|
|
|
/*
|
|
******************************************************************************
|
|
* Signature and Checksums Buffer
|
|
******************************************************************************
|
|
*/
|
|
struct rogue_fwif_sigbuf_ctl {
|
|
/* Ptr to Signature Buffer memory */
|
|
u32 buffer_fw_addr;
|
|
/* Amount of space left for storing regs in the buffer */
|
|
u32 left_size_in_regs;
|
|
} __aligned(8);
|
|
|
|
struct rogue_fwif_counter_dump_ctl {
|
|
/* Ptr to counter dump buffer */
|
|
u32 buffer_fw_addr;
|
|
/* Amount of space for storing in the buffer */
|
|
u32 size_in_dwords;
|
|
} __aligned(8);
|
|
|
|
struct rogue_fwif_firmware_gcov_ctl {
|
|
/* Ptr to firmware gcov buffer */
|
|
u32 buffer_fw_addr;
|
|
/* Amount of space for storing in the buffer */
|
|
u32 size;
|
|
} __aligned(8);
|
|
|
|
/*
|
|
*****************************************************************************
|
|
* ROGUE Compatibility checks
|
|
*****************************************************************************
|
|
*/
|
|
|
|
/*
|
|
* WARNING: Whenever the layout of ROGUE_FWIF_COMPCHECKS_BVNC changes, the
|
|
* following define should be increased by 1 to indicate to the compatibility
|
|
* logic that layout has changed.
|
|
*/
|
|
#define ROGUE_FWIF_COMPCHECKS_LAYOUT_VERSION 3
|
|
|
|
struct rogue_fwif_compchecks_bvnc {
|
|
/* WARNING: This field must be defined as first one in this structure */
|
|
u32 layout_version;
|
|
aligned_u64 bvnc;
|
|
} __aligned(8);
|
|
|
|
struct rogue_fwif_init_options {
|
|
u8 os_count_support;
|
|
u8 padding[7];
|
|
} __aligned(8);
|
|
|
|
#define ROGUE_FWIF_COMPCHECKS_BVNC_DECLARE_AND_INIT(name) \
|
|
struct rogue_fwif_compchecks_bvnc(name) = { \
|
|
ROGUE_FWIF_COMPCHECKS_LAYOUT_VERSION, \
|
|
0, \
|
|
}
|
|
|
|
static inline void rogue_fwif_compchecks_bvnc_init(struct rogue_fwif_compchecks_bvnc *compchecks)
|
|
{
|
|
compchecks->layout_version = ROGUE_FWIF_COMPCHECKS_LAYOUT_VERSION;
|
|
compchecks->bvnc = 0;
|
|
}
|
|
|
|
struct rogue_fwif_compchecks {
|
|
/* hardware BVNC (from the ROGUE registers) */
|
|
struct rogue_fwif_compchecks_bvnc hw_bvnc;
|
|
/* firmware BVNC */
|
|
struct rogue_fwif_compchecks_bvnc fw_bvnc;
|
|
/* identifier of the FW processor version */
|
|
u32 fw_processor_version;
|
|
/* software DDK version */
|
|
u32 ddk_version;
|
|
/* software DDK build no. */
|
|
u32 ddk_build;
|
|
/* build options bit-field */
|
|
u32 build_options;
|
|
/* initialisation options bit-field */
|
|
struct rogue_fwif_init_options init_options;
|
|
/* Information is valid */
|
|
bool updated __aligned(4);
|
|
u32 padding;
|
|
} __aligned(8);
|
|
|
|
/*
|
|
******************************************************************************
|
|
* Updated configuration post FW data init.
|
|
******************************************************************************
|
|
*/
|
|
struct rogue_fwif_runtime_cfg {
|
|
/* APM latency in ms before signalling IDLE to the host */
|
|
u32 active_pm_latency_ms;
|
|
/* Compatibility and other flags */
|
|
u32 runtime_cfg_flags;
|
|
/*
|
|
* If set, APM latency does not reset to system default each GPU power
|
|
* transition
|
|
*/
|
|
bool active_pm_latency_persistant __aligned(4);
|
|
/* Core clock speed, currently only used to calculate timer ticks */
|
|
u32 core_clock_speed;
|
|
/* Last number of dusts change requested by the host */
|
|
u32 default_dusts_num_init;
|
|
/* Periodic Hardware Reset configuration values */
|
|
u32 phr_mode;
|
|
/* New number of milliseconds C/S is allowed to last */
|
|
u32 hcs_deadline_ms;
|
|
/* The watchdog period in microseconds */
|
|
u32 wdg_period_us;
|
|
/* Array of priorities per OS */
|
|
u32 osid_priority[ROGUE_FW_MAX_NUM_OS];
|
|
/* On-demand allocated HWPerf buffer address, to be passed to the FW */
|
|
u32 hwperf_buf_fw_addr;
|
|
|
|
bool padding __aligned(4);
|
|
};
|
|
|
|
/*
|
|
*****************************************************************************
|
|
* Control data for ROGUE
|
|
*****************************************************************************
|
|
*/
|
|
|
|
#define ROGUE_FWIF_HWR_DEBUG_DUMP_ALL (99999U)
|
|
|
|
enum rogue_fwif_tpu_dm {
|
|
ROGUE_FWIF_TPU_DM_PDM = 0,
|
|
ROGUE_FWIF_TPU_DM_VDM = 1,
|
|
ROGUE_FWIF_TPU_DM_CDM = 2,
|
|
ROGUE_FWIF_TPU_DM_TDM = 3,
|
|
ROGUE_FWIF_TPU_DM_LAST
|
|
};
|
|
|
|
enum rogue_fwif_gpio_val_mode {
|
|
/* No GPIO validation */
|
|
ROGUE_FWIF_GPIO_VAL_OFF = 0,
|
|
/*
|
|
* Simple test case that initiates by sending data via the GPIO and then
|
|
* sends back any data received over the GPIO
|
|
*/
|
|
ROGUE_FWIF_GPIO_VAL_GENERAL = 1,
|
|
/*
|
|
* More complex test case that writes and reads data across the entire
|
|
* GPIO AP address range.
|
|
*/
|
|
ROGUE_FWIF_GPIO_VAL_AP = 2,
|
|
/* Validates the GPIO Testbench. */
|
|
ROGUE_FWIF_GPIO_VAL_TESTBENCH = 5,
|
|
/* Send and then receive each byte in the range 0-255. */
|
|
ROGUE_FWIF_GPIO_VAL_LOOPBACK = 6,
|
|
/* Send and then receive each power-of-2 byte in the range 0-255. */
|
|
ROGUE_FWIF_GPIO_VAL_LOOPBACK_LITE = 7,
|
|
ROGUE_FWIF_GPIO_VAL_LAST
|
|
};
|
|
|
|
enum fw_perf_conf {
|
|
FW_PERF_CONF_NONE = 0,
|
|
FW_PERF_CONF_ICACHE = 1,
|
|
FW_PERF_CONF_DCACHE = 2,
|
|
FW_PERF_CONF_JTLB_INSTR = 5,
|
|
FW_PERF_CONF_INSTRUCTIONS = 6
|
|
};
|
|
|
|
enum fw_boot_stage {
|
|
FW_BOOT_STAGE_TLB_INIT_FAILURE = -2,
|
|
FW_BOOT_STAGE_NOT_AVAILABLE = -1,
|
|
FW_BOOT_NOT_STARTED = 0,
|
|
FW_BOOT_BLDR_STARTED = 1,
|
|
FW_BOOT_CACHE_DONE,
|
|
FW_BOOT_TLB_DONE,
|
|
FW_BOOT_MAIN_STARTED,
|
|
FW_BOOT_ALIGNCHECKS_DONE,
|
|
FW_BOOT_INIT_DONE,
|
|
};
|
|
|
|
/*
|
|
* Kernel CCB return slot responses. Usage of bit-fields instead of bare
|
|
* integers allows FW to possibly pack-in several responses for each single kCCB
|
|
* command.
|
|
*/
|
|
/* Command executed (return status from FW) */
|
|
#define ROGUE_FWIF_KCCB_RTN_SLOT_CMD_EXECUTED BIT(0)
|
|
/* A cleanup was requested but resource busy */
|
|
#define ROGUE_FWIF_KCCB_RTN_SLOT_CLEANUP_BUSY BIT(1)
|
|
/* Poll failed in FW for a HW operation to complete */
|
|
#define ROGUE_FWIF_KCCB_RTN_SLOT_POLL_FAILURE BIT(2)
|
|
/* Reset value of a kCCB return slot (set by host) */
|
|
#define ROGUE_FWIF_KCCB_RTN_SLOT_NO_RESPONSE 0x0U
|
|
|
|
struct rogue_fwif_connection_ctl {
|
|
/* Fw-Os connection states */
|
|
enum rogue_fwif_connection_fw_state connection_fw_state;
|
|
enum rogue_fwif_connection_os_state connection_os_state;
|
|
u32 alive_fw_token;
|
|
u32 alive_os_token;
|
|
} __aligned(8);
|
|
|
|
struct rogue_fwif_osinit {
|
|
/* Kernel CCB */
|
|
u32 kernel_ccbctl_fw_addr;
|
|
u32 kernel_ccb_fw_addr;
|
|
u32 kernel_ccb_rtn_slots_fw_addr;
|
|
|
|
/* Firmware CCB */
|
|
u32 firmware_ccbctl_fw_addr;
|
|
u32 firmware_ccb_fw_addr;
|
|
|
|
/* Workload Estimation Firmware CCB */
|
|
u32 work_est_firmware_ccbctl_fw_addr;
|
|
u32 work_est_firmware_ccb_fw_addr;
|
|
|
|
u32 rogue_fwif_hwr_info_buf_ctl_fw_addr;
|
|
|
|
u32 hwr_debug_dump_limit;
|
|
|
|
u32 fw_os_data_fw_addr;
|
|
|
|
/* Compatibility checks to be populated by the Firmware */
|
|
struct rogue_fwif_compchecks rogue_comp_checks;
|
|
} __aligned(8);
|
|
|
|
/* BVNC Features */
|
|
struct rogue_hwperf_bvnc_block {
|
|
/* Counter block ID, see ROGUE_HWPERF_CNTBLK_ID */
|
|
u16 block_id;
|
|
|
|
/* Number of counters in this block type */
|
|
u16 num_counters;
|
|
|
|
/* Number of blocks of this type */
|
|
u16 num_blocks;
|
|
|
|
u16 reserved;
|
|
};
|
|
|
|
#define ROGUE_HWPERF_MAX_BVNC_LEN (24)
|
|
|
|
#define ROGUE_HWPERF_MAX_BVNC_BLOCK_LEN (16U)
|
|
|
|
/* BVNC Features */
|
|
struct rogue_hwperf_bvnc {
|
|
/* BVNC string */
|
|
char bvnc_string[ROGUE_HWPERF_MAX_BVNC_LEN];
|
|
/* See ROGUE_HWPERF_FEATURE_FLAGS */
|
|
u32 bvnc_km_feature_flags;
|
|
/* Number of blocks described in aBvncBlocks */
|
|
u16 num_bvnc_blocks;
|
|
/* Number of GPU cores present */
|
|
u16 bvnc_gpu_cores;
|
|
/* Supported Performance Blocks for BVNC */
|
|
struct rogue_hwperf_bvnc_block
|
|
bvnc_blocks[ROGUE_HWPERF_MAX_BVNC_BLOCK_LEN];
|
|
};
|
|
|
|
PVR_FW_STRUCT_SIZE_ASSERT(struct rogue_hwperf_bvnc);
|
|
|
|
struct rogue_fwif_sysinit {
|
|
/* Fault read address */
|
|
aligned_u64 fault_phys_addr;
|
|
|
|
/* PDS execution base */
|
|
aligned_u64 pds_exec_base;
|
|
/* UCS execution base */
|
|
aligned_u64 usc_exec_base;
|
|
/* FBCDC bindless texture state table base */
|
|
aligned_u64 fbcdc_state_table_base;
|
|
aligned_u64 fbcdc_large_state_table_base;
|
|
/* Texture state base */
|
|
aligned_u64 texture_heap_base;
|
|
|
|
/* Event filter for Firmware events */
|
|
u64 hw_perf_filter;
|
|
|
|
aligned_u64 slc3_fence_dev_addr;
|
|
|
|
u32 tpu_trilinear_frac_mask[ROGUE_FWIF_TPU_DM_LAST] __aligned(8);
|
|
|
|
/* Signature and Checksum Buffers for DMs */
|
|
struct rogue_fwif_sigbuf_ctl sigbuf_ctl[PVR_FWIF_DM_MAX];
|
|
|
|
struct rogue_fwif_pdvfs_opp pdvfs_opp_info;
|
|
|
|
struct rogue_fwif_dma_addr coremem_data_store;
|
|
|
|
struct rogue_fwif_counter_dump_ctl counter_dump_ctl;
|
|
|
|
u32 filter_flags;
|
|
|
|
u32 runtime_cfg_fw_addr;
|
|
|
|
u32 trace_buf_ctl_fw_addr;
|
|
u32 fw_sys_data_fw_addr;
|
|
|
|
u32 gpu_util_fw_cb_ctl_fw_addr;
|
|
u32 reg_cfg_fw_addr;
|
|
u32 hwperf_ctl_fw_addr;
|
|
|
|
u32 align_checks;
|
|
|
|
/* Core clock speed at FW boot time */
|
|
u32 initial_core_clock_speed;
|
|
|
|
/* APM latency in ms before signalling IDLE to the host */
|
|
u32 active_pm_latency_ms;
|
|
|
|
/* Flag to be set by the Firmware after successful start */
|
|
bool firmware_started __aligned(4);
|
|
|
|
/* Host/FW Trace synchronisation Partition Marker */
|
|
u32 marker_val;
|
|
|
|
/* Firmware initialization complete time */
|
|
u32 firmware_started_timestamp;
|
|
|
|
u32 jones_disable_mask;
|
|
|
|
/* Firmware performance counter config */
|
|
enum fw_perf_conf firmware_perf;
|
|
|
|
/*
|
|
* FW Pointer to memory containing core clock rate in Hz.
|
|
* Firmware (PDVFS) updates the memory when running on non primary FW
|
|
* thread to communicate to host driver.
|
|
*/
|
|
u32 core_clock_rate_fw_addr;
|
|
|
|
enum rogue_fwif_gpio_val_mode gpio_validation_mode;
|
|
|
|
/* Used in HWPerf for decoding BVNC Features */
|
|
struct rogue_hwperf_bvnc bvnc_km_feature_flags;
|
|
|
|
/* Value to write into ROGUE_CR_TFBC_COMPRESSION_CONTROL */
|
|
u32 tfbc_compression_control;
|
|
} __aligned(8);
|
|
|
|
/*
|
|
*****************************************************************************
|
|
* Timer correlation shared data and defines
|
|
*****************************************************************************
|
|
*/
|
|
|
|
struct rogue_fwif_time_corr {
|
|
aligned_u64 os_timestamp;
|
|
aligned_u64 os_mono_timestamp;
|
|
aligned_u64 cr_timestamp;
|
|
|
|
/*
|
|
* Utility variable used to convert CR timer deltas to OS timer deltas
|
|
* (nS), where the deltas are relative to the timestamps above:
|
|
* deltaOS = (deltaCR * K) >> decimal_shift, see full explanation below
|
|
*/
|
|
aligned_u64 cr_delta_to_os_delta_kns;
|
|
|
|
u32 core_clock_speed;
|
|
u32 reserved;
|
|
} __aligned(8);
|
|
|
|
/*
|
|
* The following macros are used to help converting FW timestamps to the Host
|
|
* time domain. On the FW the ROGUE_CR_TIMER counter is used to keep track of
|
|
* time; it increments by 1 every 256 GPU clock ticks, so the general
|
|
* formula to perform the conversion is:
|
|
*
|
|
* [ GPU clock speed in Hz, if (scale == 10^9) then deltaOS is in nS,
|
|
* otherwise if (scale == 10^6) then deltaOS is in uS ]
|
|
*
|
|
* deltaCR * 256 256 * scale
|
|
* deltaOS = --------------- * scale = deltaCR * K [ K = --------------- ]
|
|
* GPUclockspeed GPUclockspeed
|
|
*
|
|
* The actual K is multiplied by 2^20 (and deltaCR * K is divided by 2^20)
|
|
* to get some better accuracy and to avoid returning 0 in the integer
|
|
* division 256000000/GPUfreq if GPUfreq is greater than 256MHz.
|
|
* This is the same as keeping K as a decimal number.
|
|
*
|
|
* The maximum deltaOS is slightly more than 5hrs for all GPU frequencies
|
|
* (deltaCR * K is more or less a constant), and it's relative to the base
|
|
* OS timestamp sampled as a part of the timer correlation data.
|
|
* This base is refreshed on GPU power-on, DVFS transition and periodic
|
|
* frequency calibration (executed every few seconds if the FW is doing
|
|
* some work), so as long as the GPU is doing something and one of these
|
|
* events is triggered then deltaCR * K will not overflow and deltaOS will be
|
|
* correct.
|
|
*/
|
|
|
|
#define ROGUE_FWIF_CRDELTA_TO_OSDELTA_ACCURACY_SHIFT (20)
|
|
|
|
#define ROGUE_FWIF_GET_DELTA_OSTIME_NS(delta_cr, k) \
|
|
(((delta_cr) * (k)) >> ROGUE_FWIF_CRDELTA_TO_OSDELTA_ACCURACY_SHIFT)
|
|
|
|
/*
|
|
******************************************************************************
|
|
* GPU Utilisation
|
|
******************************************************************************
|
|
*/
|
|
|
|
/* See rogue_common.h for a list of GPU states */
|
|
#define ROGUE_FWIF_GPU_UTIL_TIME_MASK \
|
|
(0xFFFFFFFFFFFFFFFFull & ~ROGUE_FWIF_GPU_UTIL_STATE_MASK)
|
|
|
|
#define ROGUE_FWIF_GPU_UTIL_GET_TIME(word) \
|
|
((word)(&ROGUE_FWIF_GPU_UTIL_TIME_MASK))
|
|
#define ROGUE_FWIF_GPU_UTIL_GET_STATE(word) \
|
|
((word)(&ROGUE_FWIF_GPU_UTIL_STATE_MASK))
|
|
|
|
/*
|
|
* The OS timestamps computed by the FW are approximations of the real time,
|
|
* which means they could be slightly behind or ahead the real timer on the
|
|
* Host. In some cases we can perform subtractions between FW approximated
|
|
* timestamps and real OS timestamps, so we need a form of protection against
|
|
* negative results if for instance the FW one is a bit ahead of time.
|
|
*/
|
|
#define ROGUE_FWIF_GPU_UTIL_GET_PERIOD(newtime, oldtime) \
|
|
(((newtime) > (oldtime)) ? ((newtime) - (oldtime)) : 0U)
|
|
|
|
#define ROGUE_FWIF_GPU_UTIL_MAKE_WORD(time, state) \
|
|
(ROGUE_FWIF_GPU_UTIL_GET_TIME(time) | \
|
|
ROGUE_FWIF_GPU_UTIL_GET_STATE(state))
|
|
|
|
/*
|
|
* The timer correlation array must be big enough to ensure old entries won't be
|
|
* overwritten before all the HWPerf events linked to those entries are
|
|
* processed by the MISR. The update frequency of this array depends on how fast
|
|
* the system can change state (basically how small the APM latency is) and
|
|
* perform DVFS transitions.
|
|
*
|
|
* The minimum size is 2 (not 1) to avoid race conditions between the FW reading
|
|
* an entry while the Host is updating it. With 2 entries in the worst case the
|
|
* FW will read old data, which is still quite ok if the Host is updating the
|
|
* timer correlation at that time.
|
|
*/
|
|
#define ROGUE_FWIF_TIME_CORR_ARRAY_SIZE 256U
|
|
#define ROGUE_FWIF_TIME_CORR_CURR_INDEX(seqcount) \
|
|
((seqcount) % ROGUE_FWIF_TIME_CORR_ARRAY_SIZE)
|
|
|
|
/* Make sure the timer correlation array size is a power of 2 */
|
|
static_assert((ROGUE_FWIF_TIME_CORR_ARRAY_SIZE &
|
|
(ROGUE_FWIF_TIME_CORR_ARRAY_SIZE - 1U)) == 0U,
|
|
"ROGUE_FWIF_TIME_CORR_ARRAY_SIZE must be a power of two");
|
|
|
|
struct rogue_fwif_gpu_util_fwcb {
|
|
struct rogue_fwif_time_corr time_corr[ROGUE_FWIF_TIME_CORR_ARRAY_SIZE];
|
|
u32 time_corr_seq_count;
|
|
|
|
/* Compatibility and other flags */
|
|
u32 gpu_util_flags;
|
|
|
|
/* Last GPU state + OS time of the last state update */
|
|
aligned_u64 last_word;
|
|
|
|
/* Counters for the amount of time the GPU was active/idle/blocked */
|
|
aligned_u64 stats_counters[PVR_FWIF_GPU_UTIL_STATE_NUM];
|
|
} __aligned(8);
|
|
|
|
struct rogue_fwif_rta_ctl {
|
|
/* Render number */
|
|
u32 render_target_index;
|
|
/* index in RTA */
|
|
u32 current_render_target;
|
|
/* total active RTs */
|
|
u32 active_render_targets;
|
|
/* total active RTs from the first TA kick, for OOM */
|
|
u32 cumul_active_render_targets;
|
|
/* Array of valid RT indices */
|
|
u32 valid_render_targets_fw_addr;
|
|
/* Array of number of occurred partial renders per render target */
|
|
u32 rta_num_partial_renders_fw_addr;
|
|
/* Number of render targets in the array */
|
|
u32 max_rts;
|
|
/* Compatibility and other flags */
|
|
u32 rta_ctl_flags;
|
|
} __aligned(8);
|
|
|
|
struct rogue_fwif_freelist {
|
|
aligned_u64 freelist_dev_addr;
|
|
aligned_u64 current_dev_addr;
|
|
u32 current_stack_top;
|
|
u32 max_pages;
|
|
u32 grow_pages;
|
|
/* HW pages */
|
|
u32 current_pages;
|
|
u32 allocated_page_count;
|
|
u32 allocated_mmu_page_count;
|
|
u32 freelist_id;
|
|
|
|
bool grow_pending __aligned(4);
|
|
/* Pages that should be used only when OOM is reached */
|
|
u32 ready_pages;
|
|
/* Compatibility and other flags */
|
|
u32 freelist_flags;
|
|
/* PM Global PB on which Freelist is loaded */
|
|
u32 pm_global_pb;
|
|
u32 padding;
|
|
} __aligned(8);
|
|
|
|
/*
|
|
******************************************************************************
|
|
* HWRTData
|
|
******************************************************************************
|
|
*/
|
|
|
|
/* HWRTData flags */
|
|
/* Deprecated flags 1:0 */
|
|
#define HWRTDATA_HAS_LAST_GEOM BIT(2)
|
|
#define HWRTDATA_PARTIAL_RENDERED BIT(3)
|
|
#define HWRTDATA_DISABLE_TILE_REORDERING BIT(4)
|
|
#define HWRTDATA_NEED_BRN65101_BLIT BIT(5)
|
|
#define HWRTDATA_FIRST_BRN65101_STRIP BIT(6)
|
|
#define HWRTDATA_NEED_BRN67182_2ND_RENDER BIT(7)
|
|
|
|
enum rogue_fwif_rtdata_state {
|
|
ROGUE_FWIF_RTDATA_STATE_NONE = 0,
|
|
ROGUE_FWIF_RTDATA_STATE_KICK_GEOM,
|
|
ROGUE_FWIF_RTDATA_STATE_KICK_GEOM_FIRST,
|
|
ROGUE_FWIF_RTDATA_STATE_GEOM_FINISHED,
|
|
ROGUE_FWIF_RTDATA_STATE_KICK_FRAG,
|
|
ROGUE_FWIF_RTDATA_STATE_FRAG_FINISHED,
|
|
ROGUE_FWIF_RTDATA_STATE_FRAG_CONTEXT_STORED,
|
|
ROGUE_FWIF_RTDATA_STATE_GEOM_OUTOFMEM,
|
|
ROGUE_FWIF_RTDATA_STATE_PARTIALRENDERFINISHED,
|
|
/*
|
|
* In case of HWR, we can't set the RTDATA state to NONE, as this will
|
|
* cause any TA to become a first TA. To ensure all related TA's are
|
|
* skipped, we use the HWR state
|
|
*/
|
|
ROGUE_FWIF_RTDATA_STATE_HWR,
|
|
ROGUE_FWIF_RTDATA_STATE_UNKNOWN = 0x7FFFFFFFU
|
|
};
|
|
|
|
struct rogue_fwif_hwrtdata_common {
|
|
bool geom_caches_need_zeroing __aligned(4);
|
|
|
|
u32 screen_pixel_max;
|
|
aligned_u64 multi_sample_ctl;
|
|
u64 flipped_multi_sample_ctl;
|
|
u32 tpc_stride;
|
|
u32 tpc_size;
|
|
u32 te_screen;
|
|
u32 mtile_stride;
|
|
u32 teaa;
|
|
u32 te_mtile1;
|
|
u32 te_mtile2;
|
|
u32 isp_merge_lower_x;
|
|
u32 isp_merge_lower_y;
|
|
u32 isp_merge_upper_x;
|
|
u32 isp_merge_upper_y;
|
|
u32 isp_merge_scale_x;
|
|
u32 isp_merge_scale_y;
|
|
u32 rgn_header_size;
|
|
u32 isp_mtile_size;
|
|
u32 padding;
|
|
} __aligned(8);
|
|
|
|
struct rogue_fwif_hwrtdata {
|
|
/* MList Data Store */
|
|
aligned_u64 pm_mlist_dev_addr;
|
|
|
|
aligned_u64 vce_cat_base[4];
|
|
aligned_u64 vce_last_cat_base[4];
|
|
aligned_u64 te_cat_base[4];
|
|
aligned_u64 te_last_cat_base[4];
|
|
aligned_u64 alist_cat_base;
|
|
aligned_u64 alist_last_cat_base;
|
|
|
|
aligned_u64 pm_alist_stack_pointer;
|
|
u32 pm_mlist_stack_pointer;
|
|
|
|
u32 hwrt_data_common_fw_addr;
|
|
|
|
u32 hwrt_data_flags;
|
|
enum rogue_fwif_rtdata_state state;
|
|
|
|
u32 freelists_fw_addr[MAX_FREELISTS_SIZE] __aligned(8);
|
|
u32 freelist_hwr_snapshot[MAX_FREELISTS_SIZE];
|
|
|
|
aligned_u64 vheap_table_dev_addr;
|
|
|
|
struct rogue_fwif_rta_ctl rta_ctl;
|
|
|
|
aligned_u64 tail_ptrs_dev_addr;
|
|
aligned_u64 macrotile_array_dev_addr;
|
|
aligned_u64 rgn_header_dev_addr;
|
|
aligned_u64 rtc_dev_addr;
|
|
|
|
u32 owner_geom_not_used_by_host __aligned(8);
|
|
|
|
bool geom_caches_need_zeroing __aligned(4);
|
|
|
|
struct rogue_fwif_cleanup_ctl cleanup_state __aligned(64);
|
|
} __aligned(8);
|
|
|
|
/*
|
|
******************************************************************************
|
|
* Sync checkpoints
|
|
******************************************************************************
|
|
*/
|
|
|
|
#define PVR_SYNC_CHECKPOINT_UNDEF 0x000
|
|
#define PVR_SYNC_CHECKPOINT_ACTIVE 0xac1 /* Checkpoint has not signaled. */
|
|
#define PVR_SYNC_CHECKPOINT_SIGNALED 0x519 /* Checkpoint has signaled. */
|
|
#define PVR_SYNC_CHECKPOINT_ERRORED 0xeff /* Checkpoint has been errored. */
|
|
|
|
#include "pvr_rogue_fwif_check.h"
|
|
|
|
#endif /* PVR_ROGUE_FWIF_H */
|