/* SPDX-License-Identifier: MIT */
/*
* Copyright © 2021 - 2022 Intel Corporation
*/
#ifndef _INTEL_GUC_CAPTURE_FWIF_H
#define _INTEL_GUC_CAPTURE_FWIF_H
#include <linux/types.h>
#include "intel_guc_fwif.h"
struct intel_guc;
struct file;
/*
* struct _ _ guc_capture_bufstate
*
* Book - keeping structure used to track read and write pointers
* as we extract error capture data from the GuC - log - buffer ' s
* error - capture region as a stream of dwords .
*/
struct __guc_capture_bufstate {
u32 size;
void *data;
u32 rd;
u32 wr;
};
/*
* struct _ _ guc_capture_parsed_output - extracted error capture node
*
* A single unit of extracted error - capture output data grouped together
* at an engine - instance level . We keep these nodes in a linked list .
* See cachelist and outlist below .
*/
struct __guc_capture_parsed_output {
/*
* A single set of 3 capture lists : a global - list
* an engine - class - list and an engine - instance list .
* outlist in _ _ guc_capture_parsed_output will keep
* a linked list of these nodes that will eventually
* be detached from outlist and attached into to
* i915_gpu_codedump in response to a context reset
*/
struct list_head link;
bool is_partial;
u32 eng_class;
u32 eng_inst;
u32 guc_id;
u32 lrca;
struct gcap_reg_list_info {
u32 vfid;
u32 num_regs;
struct guc_mmio_reg *regs;
} reginfo[GUC_CAPTURE_LIST_TYPE_MAX];
#define GCAP_PARSED_REGLIST_INDEX_GLOBAL BIT(GUC_CAPTURE_LIST_TYPE_GLOBAL)
#define GCAP_PARSED_REGLIST_INDEX_ENGCLASS BIT(GUC_CAPTURE_LIST_TYPE_ENGINE_CLASS)
#define GCAP_PARSED_REGLIST_INDEX_ENGINST BIT(GUC_CAPTURE_LIST_TYPE_ENGINE_INSTANCE)
};
/*
* struct guc_debug_capture_list_header / struct guc_debug_capture_list
*
* As part of ADS registration , these header structures ( followed by
* an array of ' struct guc_mmio_reg ' entries ) are used to register with
* GuC microkernel the list of registers we want it to dump out prior
* to a engine reset .
*/
struct guc_debug_capture_list_header {
u32 info;
#define GUC_CAPTURELISTHDR_NUMDESCR GENMASK(15 , 0 )
} __packed;
struct guc_debug_capture_list {
struct guc_debug_capture_list_header header;
struct guc_mmio_reg regs[];
} __packed;
/*
* struct _ _ guc_mmio_reg_descr / struct _ _ guc_mmio_reg_descr_group
*
* intel_guc_capture module uses these structures to maintain static
* tables ( per unique platform ) that consists of lists of registers
* ( offsets , names , flags , . . . ) that are used at the ADS registration
* time as well as during runtime processing and reporting of error -
* capture states generated by GuC just prior to engine reset events .
*/
struct __guc_mmio_reg_descr {
i915_reg_t reg;
u32 flags;
u32 mask;
const char *regname;
};
struct __guc_mmio_reg_descr_group {
const struct __guc_mmio_reg_descr *list;
u32 num_regs;
u32 owner; /* see enum guc_capture_owner */
u32 type; /* see enum guc_capture_type */
u32 engine; /* as per MAX_ENGINE_CLASS */
struct __guc_mmio_reg_descr *extlist; /* only used for steered registers */
};
/*
* struct guc_state_capture_header_t / struct guc_state_capture_t /
* guc_state_capture_group_header_t / guc_state_capture_group_t
*
* Prior to resetting engines that have hung or faulted , GuC microkernel
* reports the engine error - state ( register values that was read ) by
* logging them into the shared GuC log buffer using these hierarchy
* of structures .
*/
struct guc_state_capture_header_t {
u32 owner;
#define CAP_HDR_CAPTURE_VFID GENMASK(7 , 0 )
u32 info;
#define CAP_HDR_CAPTURE_TYPE GENMASK(3 , 0 ) /* see enum guc_capture_type */
#define CAP_HDR_ENGINE_CLASS GENMASK(7 , 4 ) /* see GUC_MAX_ENGINE_CLASSES */
#define CAP_HDR_ENGINE_INSTANCE GENMASK(11 , 8 )
u32 lrca; /* if type-instance, LRCA (address) that hung, else set to ~0 */
u32 guc_id; /* if type-instance, context index of hung context, else set to ~0 */
u32 num_mmios;
#define CAP_HDR_NUM_MMIOS GENMASK(9 , 0 )
} __packed;
struct guc_state_capture_t {
struct guc_state_capture_header_t header;
struct guc_mmio_reg mmio_entries[];
} __packed;
enum guc_capture_group_types {
GUC_STATE_CAPTURE_GROUP_TYPE_FULL,
GUC_STATE_CAPTURE_GROUP_TYPE_PARTIAL,
GUC_STATE_CAPTURE_GROUP_TYPE_MAX,
};
struct guc_state_capture_group_header_t {
u32 owner;
#define CAP_GRP_HDR_CAPTURE_VFID GENMASK(7 , 0 )
u32 info;
#define CAP_GRP_HDR_NUM_CAPTURES GENMASK(7 , 0 )
#define CAP_GRP_HDR_CAPTURE_TYPE GENMASK(15 , 8 ) /* guc_capture_group_types */
} __packed;
/* this is the top level structure where an error-capture dump starts */
struct guc_state_capture_group_t {
struct guc_state_capture_group_header_t grp_header;
struct guc_state_capture_t capture_entries[];
} __packed;
/*
* struct _ _ guc_capture_ads_cache
*
* A structure to cache register lists that were populated and registered
* with GuC at startup during ADS registration . This allows much quicker
* GuC resets without re - parsing all the tables for the given gt .
*/
struct __guc_capture_ads_cache {
bool is_valid;
void *ptr;
size_t size;
int status;
};
/**
* struct intel_guc_state_capture
*
* Internal context of the intel_guc_capture module .
*/
struct intel_guc_state_capture {
/**
* @ reglists : static table of register lists used for error - capture state .
*/
const struct __guc_mmio_reg_descr_group *reglists;
/**
* @ extlists : allocated table of steered register lists used for error - capture state .
*
* NOTE : steered registers have multiple instances depending on the HW configuration
* ( slices or dual - sub - slices ) and thus depends on HW fuses discovered at startup
*/
struct __guc_mmio_reg_descr_group *extlists;
/**
* @ ads_cache : cached register lists that is ADS format ready
*/
struct __guc_capture_ads_cache ads_cache[GUC_CAPTURE_LIST_INDEX_MAX]
[GUC_CAPTURE_LIST_TYPE_MAX]
[GUC_MAX_ENGINE_CLASSES];
/**
* @ ads_null_cache : ADS null cache .
*/
void *ads_null_cache;
/**
* @ cachelist : Pool of pre - allocated nodes for error capture output
*
* We need this pool of pre - allocated nodes because we cannot
* dynamically allocate new nodes when receiving the G2H notification
* because the event handlers for all G2H event - processing is called
* by the ct processing worker queue and when that queue is being
* processed , there is no absolute guarantee that we are not in the
* midst of a GT reset operation ( which doesn ' t allow allocations ) .
*/
struct list_head cachelist;
#define PREALLOC_NODES_MAX_COUNT (3 * GUC_MAX_ENGINE_CLASSES * GUC_MAX_INSTANCES_PER_CLASS)
#define PREALLOC_NODES_DEFAULT_NUMREGS 64
/**
* @ max_mmio_per_node : Max MMIO per node .
*/
int max_mmio_per_node;
/**
* @ outlist : Pool of pre - allocated nodes for error capture output
*
* A linked list of parsed GuC error - capture output data before
* reporting with formatting via i915_gpu_coredump . Each node in this linked list shall
* contain a single engine - capture including global , engine - class and
* engine - instance register dumps as per guc_capture_parsed_output_node
*/
struct list_head outlist;
};
#endif /* _INTEL_GUC_CAPTURE_FWIF_H */
Messung V0.5 in Prozent C=95 H=96 G=95
¤ Dauer der Verarbeitung: 0.6 Sekunden
¤
*© Formatika GbR, Deutschland