/* 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 regisration * 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 absoluate 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 */