1b729ea27SRiana Tauro // SPDX-License-Identifier: MIT 2b729ea27SRiana Tauro /* 3b729ea27SRiana Tauro * Copyright © 2025 Intel Corporation 4b729ea27SRiana Tauro */ 5b729ea27SRiana Tauro 6b729ea27SRiana Tauro #include <drm/drm_managed.h> 7b729ea27SRiana Tauro 8b729ea27SRiana Tauro #include "abi/guc_actions_abi.h" 9b729ea27SRiana Tauro #include "regs/xe_gt_regs.h" 10b729ea27SRiana Tauro 11b729ea27SRiana Tauro #include "xe_bo.h" 12b729ea27SRiana Tauro #include "xe_force_wake.h" 13b729ea27SRiana Tauro #include "xe_gt_printk.h" 14b729ea27SRiana Tauro #include "xe_guc.h" 15b729ea27SRiana Tauro #include "xe_guc_engine_activity.h" 16b729ea27SRiana Tauro #include "xe_guc_ct.h" 17b729ea27SRiana Tauro #include "xe_hw_engine.h" 18b729ea27SRiana Tauro #include "xe_map.h" 19b729ea27SRiana Tauro #include "xe_mmio.h" 209e19f429SRiana Tauro #include "xe_trace_guc.h" 21b729ea27SRiana Tauro 22b729ea27SRiana Tauro #define TOTAL_QUANTA 0x8000 23b729ea27SRiana Tauro 24b729ea27SRiana Tauro static struct iosys_map engine_activity_map(struct xe_guc *guc, struct xe_hw_engine *hwe) 25b729ea27SRiana Tauro { 26b729ea27SRiana Tauro struct xe_guc_engine_activity *engine_activity = &guc->engine_activity; 27b729ea27SRiana Tauro struct engine_activity_buffer *buffer = &engine_activity->device_buffer; 28b729ea27SRiana Tauro u16 guc_class = xe_engine_class_to_guc_class(hwe->class); 29b729ea27SRiana Tauro size_t offset; 30b729ea27SRiana Tauro 31b729ea27SRiana Tauro offset = offsetof(struct guc_engine_activity_data, 32b729ea27SRiana Tauro engine_activity[guc_class][hwe->logical_instance]); 33b729ea27SRiana Tauro 34b729ea27SRiana Tauro return IOSYS_MAP_INIT_OFFSET(&buffer->activity_bo->vmap, offset); 35b729ea27SRiana Tauro } 36b729ea27SRiana Tauro 37b729ea27SRiana Tauro static struct iosys_map engine_metadata_map(struct xe_guc *guc) 38b729ea27SRiana Tauro { 39b729ea27SRiana Tauro struct xe_guc_engine_activity *engine_activity = &guc->engine_activity; 40b729ea27SRiana Tauro struct engine_activity_buffer *buffer = &engine_activity->device_buffer; 41b729ea27SRiana Tauro 42b729ea27SRiana Tauro return buffer->metadata_bo->vmap; 43b729ea27SRiana Tauro } 44b729ea27SRiana Tauro 45b729ea27SRiana Tauro static int allocate_engine_activity_group(struct xe_guc *guc) 46b729ea27SRiana Tauro { 47b729ea27SRiana Tauro struct xe_guc_engine_activity *engine_activity = &guc->engine_activity; 48b729ea27SRiana Tauro struct xe_device *xe = guc_to_xe(guc); 49b729ea27SRiana Tauro u32 num_activity_group = 1; /* Will be modified for VF */ 50b729ea27SRiana Tauro 51b729ea27SRiana Tauro engine_activity->eag = drmm_kcalloc(&xe->drm, num_activity_group, 52b729ea27SRiana Tauro sizeof(struct engine_activity_group), GFP_KERNEL); 53b729ea27SRiana Tauro 54b729ea27SRiana Tauro if (!engine_activity->eag) 55b729ea27SRiana Tauro return -ENOMEM; 56b729ea27SRiana Tauro 57b729ea27SRiana Tauro engine_activity->num_activity_group = num_activity_group; 58b729ea27SRiana Tauro 59b729ea27SRiana Tauro return 0; 60b729ea27SRiana Tauro } 61b729ea27SRiana Tauro 62b729ea27SRiana Tauro static int allocate_engine_activity_buffers(struct xe_guc *guc, 63b729ea27SRiana Tauro struct engine_activity_buffer *buffer) 64b729ea27SRiana Tauro { 65b729ea27SRiana Tauro u32 metadata_size = sizeof(struct guc_engine_activity_metadata); 66b729ea27SRiana Tauro u32 size = sizeof(struct guc_engine_activity_data); 67b729ea27SRiana Tauro struct xe_gt *gt = guc_to_gt(guc); 68b729ea27SRiana Tauro struct xe_tile *tile = gt_to_tile(gt); 69b729ea27SRiana Tauro struct xe_bo *bo, *metadata_bo; 70b729ea27SRiana Tauro 71b729ea27SRiana Tauro metadata_bo = xe_bo_create_pin_map(gt_to_xe(gt), tile, NULL, PAGE_ALIGN(metadata_size), 72b729ea27SRiana Tauro ttm_bo_type_kernel, XE_BO_FLAG_SYSTEM | 73b729ea27SRiana Tauro XE_BO_FLAG_GGTT | XE_BO_FLAG_GGTT_INVALIDATE); 74b729ea27SRiana Tauro 75b729ea27SRiana Tauro if (IS_ERR(metadata_bo)) 76b729ea27SRiana Tauro return PTR_ERR(metadata_bo); 77b729ea27SRiana Tauro 78b729ea27SRiana Tauro bo = xe_bo_create_pin_map(gt_to_xe(gt), tile, NULL, PAGE_ALIGN(size), 79b729ea27SRiana Tauro ttm_bo_type_kernel, XE_BO_FLAG_VRAM_IF_DGFX(tile) | 80b729ea27SRiana Tauro XE_BO_FLAG_GGTT | XE_BO_FLAG_GGTT_INVALIDATE); 81b729ea27SRiana Tauro 82b729ea27SRiana Tauro if (IS_ERR(bo)) { 83b729ea27SRiana Tauro xe_bo_unpin_map_no_vm(metadata_bo); 84b729ea27SRiana Tauro return PTR_ERR(bo); 85b729ea27SRiana Tauro } 86b729ea27SRiana Tauro 87b729ea27SRiana Tauro buffer->metadata_bo = metadata_bo; 88b729ea27SRiana Tauro buffer->activity_bo = bo; 89b729ea27SRiana Tauro return 0; 90b729ea27SRiana Tauro } 91b729ea27SRiana Tauro 92b729ea27SRiana Tauro static void free_engine_activity_buffers(struct engine_activity_buffer *buffer) 93b729ea27SRiana Tauro { 94b729ea27SRiana Tauro xe_bo_unpin_map_no_vm(buffer->metadata_bo); 95b729ea27SRiana Tauro xe_bo_unpin_map_no_vm(buffer->activity_bo); 96b729ea27SRiana Tauro } 97b729ea27SRiana Tauro 98*0e6ffdb2SRiana Tauro static bool is_engine_activity_supported(struct xe_guc *guc) 99*0e6ffdb2SRiana Tauro { 100*0e6ffdb2SRiana Tauro struct xe_uc_fw_version *version = &guc->fw.versions.found[XE_UC_FW_VER_COMPATIBILITY]; 101*0e6ffdb2SRiana Tauro struct xe_uc_fw_version required = { 1, 14, 1 }; 102*0e6ffdb2SRiana Tauro struct xe_gt *gt = guc_to_gt(guc); 103*0e6ffdb2SRiana Tauro 104*0e6ffdb2SRiana Tauro if (IS_SRIOV_VF(gt_to_xe(gt))) { 105*0e6ffdb2SRiana Tauro xe_gt_info(gt, "engine activity stats not supported on VFs\n"); 106*0e6ffdb2SRiana Tauro return false; 107*0e6ffdb2SRiana Tauro } 108*0e6ffdb2SRiana Tauro 109*0e6ffdb2SRiana Tauro /* engine activity stats is supported from GuC interface version (1.14.1) */ 110*0e6ffdb2SRiana Tauro if (GUC_SUBMIT_VER(guc) < MAKE_GUC_VER_STRUCT(required)) { 111*0e6ffdb2SRiana Tauro xe_gt_info(gt, 112*0e6ffdb2SRiana Tauro "engine activity stats unsupported in GuC interface v%u.%u.%u, need v%u.%u.%u or higher\n", 113*0e6ffdb2SRiana Tauro version->major, version->minor, version->patch, required.major, 114*0e6ffdb2SRiana Tauro required.minor, required.patch); 115*0e6ffdb2SRiana Tauro return false; 116*0e6ffdb2SRiana Tauro } 117*0e6ffdb2SRiana Tauro 118*0e6ffdb2SRiana Tauro return true; 119*0e6ffdb2SRiana Tauro } 120*0e6ffdb2SRiana Tauro 121b729ea27SRiana Tauro static struct engine_activity *hw_engine_to_engine_activity(struct xe_hw_engine *hwe) 122b729ea27SRiana Tauro { 123b729ea27SRiana Tauro struct xe_guc *guc = &hwe->gt->uc.guc; 124b729ea27SRiana Tauro struct engine_activity_group *eag = &guc->engine_activity.eag[0]; 125b729ea27SRiana Tauro u16 guc_class = xe_engine_class_to_guc_class(hwe->class); 126b729ea27SRiana Tauro 127b729ea27SRiana Tauro return &eag->engine[guc_class][hwe->logical_instance]; 128b729ea27SRiana Tauro } 129b729ea27SRiana Tauro 130b729ea27SRiana Tauro static u64 cpu_ns_to_guc_tsc_tick(ktime_t ns, u32 freq) 131b729ea27SRiana Tauro { 132b729ea27SRiana Tauro return mul_u64_u32_div(ns, freq, NSEC_PER_SEC); 133b729ea27SRiana Tauro } 134b729ea27SRiana Tauro 135b729ea27SRiana Tauro #define read_engine_activity_record(xe_, map_, field_) \ 136b729ea27SRiana Tauro xe_map_rd_field(xe_, map_, 0, struct guc_engine_activity, field_) 137b729ea27SRiana Tauro 138b729ea27SRiana Tauro #define read_metadata_record(xe_, map_, field_) \ 139b729ea27SRiana Tauro xe_map_rd_field(xe_, map_, 0, struct guc_engine_activity_metadata, field_) 140b729ea27SRiana Tauro 141b729ea27SRiana Tauro static u64 get_engine_active_ticks(struct xe_guc *guc, struct xe_hw_engine *hwe) 142b729ea27SRiana Tauro { 143b729ea27SRiana Tauro struct engine_activity *ea = hw_engine_to_engine_activity(hwe); 144b729ea27SRiana Tauro struct guc_engine_activity *cached_activity = &ea->activity; 145b729ea27SRiana Tauro struct guc_engine_activity_metadata *cached_metadata = &ea->metadata; 146b729ea27SRiana Tauro struct xe_guc_engine_activity *engine_activity = &guc->engine_activity; 147b729ea27SRiana Tauro struct iosys_map activity_map, metadata_map; 148b729ea27SRiana Tauro struct xe_device *xe = guc_to_xe(guc); 149b729ea27SRiana Tauro struct xe_gt *gt = guc_to_gt(guc); 150b729ea27SRiana Tauro u32 last_update_tick, global_change_num; 151b729ea27SRiana Tauro u64 active_ticks, gpm_ts; 152b729ea27SRiana Tauro u16 change_num; 153b729ea27SRiana Tauro 154b729ea27SRiana Tauro activity_map = engine_activity_map(guc, hwe); 155b729ea27SRiana Tauro metadata_map = engine_metadata_map(guc); 156b729ea27SRiana Tauro global_change_num = read_metadata_record(xe, &metadata_map, global_change_num); 157b729ea27SRiana Tauro 158b729ea27SRiana Tauro /* GuC has not initialized activity data yet, return 0 */ 159b729ea27SRiana Tauro if (!global_change_num) 160b729ea27SRiana Tauro goto update; 161b729ea27SRiana Tauro 162b729ea27SRiana Tauro if (global_change_num == cached_metadata->global_change_num) 163b729ea27SRiana Tauro goto update; 164b729ea27SRiana Tauro 165b729ea27SRiana Tauro cached_metadata->global_change_num = global_change_num; 166b729ea27SRiana Tauro change_num = read_engine_activity_record(xe, &activity_map, change_num); 167b729ea27SRiana Tauro 168b729ea27SRiana Tauro if (!change_num || change_num == cached_activity->change_num) 169b729ea27SRiana Tauro goto update; 170b729ea27SRiana Tauro 171b729ea27SRiana Tauro /* read engine activity values */ 172b729ea27SRiana Tauro last_update_tick = read_engine_activity_record(xe, &activity_map, last_update_tick); 173b729ea27SRiana Tauro active_ticks = read_engine_activity_record(xe, &activity_map, active_ticks); 174b729ea27SRiana Tauro 175b729ea27SRiana Tauro /* activity calculations */ 176b729ea27SRiana Tauro ea->running = !!last_update_tick; 177b729ea27SRiana Tauro ea->total += active_ticks - cached_activity->active_ticks; 178b729ea27SRiana Tauro ea->active = 0; 179b729ea27SRiana Tauro 180b729ea27SRiana Tauro /* cache the counter */ 181b729ea27SRiana Tauro cached_activity->change_num = change_num; 182b729ea27SRiana Tauro cached_activity->last_update_tick = last_update_tick; 183b729ea27SRiana Tauro cached_activity->active_ticks = active_ticks; 184b729ea27SRiana Tauro 185b729ea27SRiana Tauro update: 186b729ea27SRiana Tauro if (ea->running) { 187b729ea27SRiana Tauro gpm_ts = xe_mmio_read64_2x32(>->mmio, MISC_STATUS_0) >> 188b729ea27SRiana Tauro engine_activity->gpm_timestamp_shift; 189b729ea27SRiana Tauro ea->active = lower_32_bits(gpm_ts) - cached_activity->last_update_tick; 190b729ea27SRiana Tauro } 191b729ea27SRiana Tauro 1929e19f429SRiana Tauro trace_xe_guc_engine_activity(xe, ea, hwe->name, hwe->instance); 1939e19f429SRiana Tauro 194b729ea27SRiana Tauro return ea->total + ea->active; 195b729ea27SRiana Tauro } 196b729ea27SRiana Tauro 197b729ea27SRiana Tauro static u64 get_engine_total_ticks(struct xe_guc *guc, struct xe_hw_engine *hwe) 198b729ea27SRiana Tauro { 199b729ea27SRiana Tauro struct engine_activity *ea = hw_engine_to_engine_activity(hwe); 200b729ea27SRiana Tauro struct guc_engine_activity_metadata *cached_metadata = &ea->metadata; 201b729ea27SRiana Tauro struct guc_engine_activity *cached_activity = &ea->activity; 202b729ea27SRiana Tauro struct iosys_map activity_map, metadata_map; 203b729ea27SRiana Tauro struct xe_device *xe = guc_to_xe(guc); 204b729ea27SRiana Tauro ktime_t now, cpu_delta; 205b729ea27SRiana Tauro u64 numerator; 206b729ea27SRiana Tauro u16 quanta_ratio; 207b729ea27SRiana Tauro 208b729ea27SRiana Tauro activity_map = engine_activity_map(guc, hwe); 209b729ea27SRiana Tauro metadata_map = engine_metadata_map(guc); 210b729ea27SRiana Tauro 211b729ea27SRiana Tauro if (!cached_metadata->guc_tsc_frequency_hz) 212b729ea27SRiana Tauro cached_metadata->guc_tsc_frequency_hz = read_metadata_record(xe, &metadata_map, 213b729ea27SRiana Tauro guc_tsc_frequency_hz); 214b729ea27SRiana Tauro 215b729ea27SRiana Tauro quanta_ratio = read_engine_activity_record(xe, &activity_map, quanta_ratio); 216b729ea27SRiana Tauro cached_activity->quanta_ratio = quanta_ratio; 217b729ea27SRiana Tauro 218b729ea27SRiana Tauro /* Total ticks calculations */ 219b729ea27SRiana Tauro now = ktime_get(); 220b729ea27SRiana Tauro cpu_delta = now - ea->last_cpu_ts; 221b729ea27SRiana Tauro ea->last_cpu_ts = now; 222b729ea27SRiana Tauro numerator = (ea->quanta_remainder_ns + cpu_delta) * cached_activity->quanta_ratio; 223b729ea27SRiana Tauro ea->quanta_ns += numerator / TOTAL_QUANTA; 224b729ea27SRiana Tauro ea->quanta_remainder_ns = numerator % TOTAL_QUANTA; 225b729ea27SRiana Tauro ea->quanta = cpu_ns_to_guc_tsc_tick(ea->quanta_ns, cached_metadata->guc_tsc_frequency_hz); 226b729ea27SRiana Tauro 2279e19f429SRiana Tauro trace_xe_guc_engine_activity(xe, ea, hwe->name, hwe->instance); 2289e19f429SRiana Tauro 229b729ea27SRiana Tauro return ea->quanta; 230b729ea27SRiana Tauro } 231b729ea27SRiana Tauro 232b729ea27SRiana Tauro static int enable_engine_activity_stats(struct xe_guc *guc) 233b729ea27SRiana Tauro { 234b729ea27SRiana Tauro struct xe_guc_engine_activity *engine_activity = &guc->engine_activity; 235b729ea27SRiana Tauro struct engine_activity_buffer *buffer = &engine_activity->device_buffer; 236b729ea27SRiana Tauro u32 action[] = { 237b729ea27SRiana Tauro XE_GUC_ACTION_SET_DEVICE_ENGINE_ACTIVITY_BUFFER, 238b729ea27SRiana Tauro xe_bo_ggtt_addr(buffer->metadata_bo), 239b729ea27SRiana Tauro 0, 240b729ea27SRiana Tauro xe_bo_ggtt_addr(buffer->activity_bo), 241b729ea27SRiana Tauro 0, 242b729ea27SRiana Tauro }; 243b729ea27SRiana Tauro 244b729ea27SRiana Tauro /* Blocking here to ensure the buffers are ready before reading them */ 245b729ea27SRiana Tauro return xe_guc_ct_send_block(&guc->ct, action, ARRAY_SIZE(action)); 246b729ea27SRiana Tauro } 247b729ea27SRiana Tauro 248b729ea27SRiana Tauro static void engine_activity_set_cpu_ts(struct xe_guc *guc) 249b729ea27SRiana Tauro { 250b729ea27SRiana Tauro struct xe_guc_engine_activity *engine_activity = &guc->engine_activity; 251b729ea27SRiana Tauro struct engine_activity_group *eag = &engine_activity->eag[0]; 252b729ea27SRiana Tauro int i, j; 253b729ea27SRiana Tauro 254b729ea27SRiana Tauro for (i = 0; i < GUC_MAX_ENGINE_CLASSES; i++) 255b729ea27SRiana Tauro for (j = 0; j < GUC_MAX_INSTANCES_PER_CLASS; j++) 256b729ea27SRiana Tauro eag->engine[i][j].last_cpu_ts = ktime_get(); 257b729ea27SRiana Tauro } 258b729ea27SRiana Tauro 259b729ea27SRiana Tauro static u32 gpm_timestamp_shift(struct xe_gt *gt) 260b729ea27SRiana Tauro { 261b729ea27SRiana Tauro u32 reg; 262b729ea27SRiana Tauro 263b729ea27SRiana Tauro reg = xe_mmio_read32(>->mmio, RPM_CONFIG0); 264b729ea27SRiana Tauro 265b729ea27SRiana Tauro return 3 - REG_FIELD_GET(RPM_CONFIG0_CTC_SHIFT_PARAMETER_MASK, reg); 266b729ea27SRiana Tauro } 267b729ea27SRiana Tauro 268b729ea27SRiana Tauro /** 269b729ea27SRiana Tauro * xe_guc_engine_activity_active_ticks - Get engine active ticks 270b729ea27SRiana Tauro * @guc: The GuC object 271b729ea27SRiana Tauro * @hwe: The hw_engine object 272b729ea27SRiana Tauro * 273b729ea27SRiana Tauro * Return: accumulated ticks @hwe was active since engine activity stats were enabled. 274b729ea27SRiana Tauro */ 275b729ea27SRiana Tauro u64 xe_guc_engine_activity_active_ticks(struct xe_guc *guc, struct xe_hw_engine *hwe) 276b729ea27SRiana Tauro { 277*0e6ffdb2SRiana Tauro if (!xe_guc_engine_activity_supported(guc)) 278*0e6ffdb2SRiana Tauro return 0; 279*0e6ffdb2SRiana Tauro 280b729ea27SRiana Tauro return get_engine_active_ticks(guc, hwe); 281b729ea27SRiana Tauro } 282b729ea27SRiana Tauro 283b729ea27SRiana Tauro /** 284b729ea27SRiana Tauro * xe_guc_engine_activity_total_ticks - Get engine total ticks 285b729ea27SRiana Tauro * @guc: The GuC object 286b729ea27SRiana Tauro * @hwe: The hw_engine object 287b729ea27SRiana Tauro * 288b729ea27SRiana Tauro * Return: accumulated quanta of ticks allocated for the engine 289b729ea27SRiana Tauro */ 290b729ea27SRiana Tauro u64 xe_guc_engine_activity_total_ticks(struct xe_guc *guc, struct xe_hw_engine *hwe) 291b729ea27SRiana Tauro { 292*0e6ffdb2SRiana Tauro if (!xe_guc_engine_activity_supported(guc)) 293*0e6ffdb2SRiana Tauro return 0; 294*0e6ffdb2SRiana Tauro 295b729ea27SRiana Tauro return get_engine_total_ticks(guc, hwe); 296b729ea27SRiana Tauro } 297b729ea27SRiana Tauro 298b729ea27SRiana Tauro /** 299*0e6ffdb2SRiana Tauro * xe_guc_engine_activity_supported - Check support for engine activity stats 300*0e6ffdb2SRiana Tauro * @guc: The GuC object 301*0e6ffdb2SRiana Tauro * 302*0e6ffdb2SRiana Tauro * Engine activity stats is supported from GuC interface version (1.14.1) 303*0e6ffdb2SRiana Tauro * 304*0e6ffdb2SRiana Tauro * Return: true if engine activity stats supported, false otherwise 305*0e6ffdb2SRiana Tauro */ 306*0e6ffdb2SRiana Tauro bool xe_guc_engine_activity_supported(struct xe_guc *guc) 307*0e6ffdb2SRiana Tauro { 308*0e6ffdb2SRiana Tauro struct xe_guc_engine_activity *engine_activity = &guc->engine_activity; 309*0e6ffdb2SRiana Tauro 310*0e6ffdb2SRiana Tauro return engine_activity->supported; 311*0e6ffdb2SRiana Tauro } 312*0e6ffdb2SRiana Tauro 313*0e6ffdb2SRiana Tauro /** 314b729ea27SRiana Tauro * xe_guc_engine_activity_enable_stats - Enable engine activity stats 315b729ea27SRiana Tauro * @guc: The GuC object 316b729ea27SRiana Tauro * 317b729ea27SRiana Tauro * Enable engine activity stats and set initial timestamps 318b729ea27SRiana Tauro */ 319b729ea27SRiana Tauro void xe_guc_engine_activity_enable_stats(struct xe_guc *guc) 320b729ea27SRiana Tauro { 321b729ea27SRiana Tauro int ret; 322b729ea27SRiana Tauro 323*0e6ffdb2SRiana Tauro if (!xe_guc_engine_activity_supported(guc)) 324*0e6ffdb2SRiana Tauro return; 325*0e6ffdb2SRiana Tauro 326b729ea27SRiana Tauro ret = enable_engine_activity_stats(guc); 327b729ea27SRiana Tauro if (ret) 328b729ea27SRiana Tauro xe_gt_err(guc_to_gt(guc), "failed to enable activity stats%d\n", ret); 329b729ea27SRiana Tauro else 330b729ea27SRiana Tauro engine_activity_set_cpu_ts(guc); 331b729ea27SRiana Tauro } 332b729ea27SRiana Tauro 333b729ea27SRiana Tauro static void engine_activity_fini(void *arg) 334b729ea27SRiana Tauro { 335b729ea27SRiana Tauro struct xe_guc_engine_activity *engine_activity = arg; 336b729ea27SRiana Tauro struct engine_activity_buffer *buffer = &engine_activity->device_buffer; 337b729ea27SRiana Tauro 338b729ea27SRiana Tauro free_engine_activity_buffers(buffer); 339b729ea27SRiana Tauro } 340b729ea27SRiana Tauro 341b729ea27SRiana Tauro /** 342b729ea27SRiana Tauro * xe_guc_engine_activity_init - Initialize the engine activity data 343b729ea27SRiana Tauro * @guc: The GuC object 344b729ea27SRiana Tauro * 345b729ea27SRiana Tauro * Return: 0 on success, negative error code otherwise. 346b729ea27SRiana Tauro */ 347b729ea27SRiana Tauro int xe_guc_engine_activity_init(struct xe_guc *guc) 348b729ea27SRiana Tauro { 349b729ea27SRiana Tauro struct xe_guc_engine_activity *engine_activity = &guc->engine_activity; 350b729ea27SRiana Tauro struct xe_gt *gt = guc_to_gt(guc); 351b729ea27SRiana Tauro int ret; 352b729ea27SRiana Tauro 353*0e6ffdb2SRiana Tauro engine_activity->supported = is_engine_activity_supported(guc); 354*0e6ffdb2SRiana Tauro if (!engine_activity->supported) 355b729ea27SRiana Tauro return 0; 356b729ea27SRiana Tauro 357b729ea27SRiana Tauro ret = allocate_engine_activity_group(guc); 358b729ea27SRiana Tauro if (ret) { 359b729ea27SRiana Tauro xe_gt_err(gt, "failed to allocate engine activity group (%pe)\n", ERR_PTR(ret)); 360b729ea27SRiana Tauro return ret; 361b729ea27SRiana Tauro } 362b729ea27SRiana Tauro 363b729ea27SRiana Tauro ret = allocate_engine_activity_buffers(guc, &engine_activity->device_buffer); 364b729ea27SRiana Tauro if (ret) { 365b729ea27SRiana Tauro xe_gt_err(gt, "failed to allocate engine activity buffers (%pe)\n", ERR_PTR(ret)); 366b729ea27SRiana Tauro return ret; 367b729ea27SRiana Tauro } 368b729ea27SRiana Tauro 369b729ea27SRiana Tauro engine_activity->gpm_timestamp_shift = gpm_timestamp_shift(gt); 370b729ea27SRiana Tauro 371b729ea27SRiana Tauro return devm_add_action_or_reset(gt_to_xe(gt)->drm.dev, engine_activity_fini, 372b729ea27SRiana Tauro engine_activity); 373b729ea27SRiana Tauro } 374