162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * SPDX-License-Identifier: MIT 362306a36Sopenharmony_ci */ 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include "gem/i915_gem_mman.h" 662306a36Sopenharmony_ci#include "gt/intel_engine_user.h" 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include "pxp/intel_pxp.h" 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include "i915_cmd_parser.h" 1162306a36Sopenharmony_ci#include "i915_drv.h" 1262306a36Sopenharmony_ci#include "i915_getparam.h" 1362306a36Sopenharmony_ci#include "i915_perf.h" 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ciint i915_getparam_ioctl(struct drm_device *dev, void *data, 1662306a36Sopenharmony_ci struct drm_file *file_priv) 1762306a36Sopenharmony_ci{ 1862306a36Sopenharmony_ci struct drm_i915_private *i915 = to_i915(dev); 1962306a36Sopenharmony_ci struct pci_dev *pdev = to_pci_dev(dev->dev); 2062306a36Sopenharmony_ci const struct sseu_dev_info *sseu = &to_gt(i915)->info.sseu; 2162306a36Sopenharmony_ci drm_i915_getparam_t *param = data; 2262306a36Sopenharmony_ci int value = 0; 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_ci switch (param->param) { 2562306a36Sopenharmony_ci case I915_PARAM_IRQ_ACTIVE: 2662306a36Sopenharmony_ci case I915_PARAM_ALLOW_BATCHBUFFER: 2762306a36Sopenharmony_ci case I915_PARAM_LAST_DISPATCH: 2862306a36Sopenharmony_ci case I915_PARAM_HAS_EXEC_CONSTANTS: 2962306a36Sopenharmony_ci /* Reject all old ums/dri params. */ 3062306a36Sopenharmony_ci return -ENODEV; 3162306a36Sopenharmony_ci case I915_PARAM_CHIPSET_ID: 3262306a36Sopenharmony_ci value = pdev->device; 3362306a36Sopenharmony_ci break; 3462306a36Sopenharmony_ci case I915_PARAM_REVISION: 3562306a36Sopenharmony_ci value = pdev->revision; 3662306a36Sopenharmony_ci break; 3762306a36Sopenharmony_ci case I915_PARAM_NUM_FENCES_AVAIL: 3862306a36Sopenharmony_ci value = to_gt(i915)->ggtt->num_fences; 3962306a36Sopenharmony_ci break; 4062306a36Sopenharmony_ci case I915_PARAM_HAS_OVERLAY: 4162306a36Sopenharmony_ci value = !!i915->display.overlay; 4262306a36Sopenharmony_ci break; 4362306a36Sopenharmony_ci case I915_PARAM_HAS_BSD: 4462306a36Sopenharmony_ci value = !!intel_engine_lookup_user(i915, 4562306a36Sopenharmony_ci I915_ENGINE_CLASS_VIDEO, 0); 4662306a36Sopenharmony_ci break; 4762306a36Sopenharmony_ci case I915_PARAM_HAS_BLT: 4862306a36Sopenharmony_ci value = !!intel_engine_lookup_user(i915, 4962306a36Sopenharmony_ci I915_ENGINE_CLASS_COPY, 0); 5062306a36Sopenharmony_ci break; 5162306a36Sopenharmony_ci case I915_PARAM_HAS_VEBOX: 5262306a36Sopenharmony_ci value = !!intel_engine_lookup_user(i915, 5362306a36Sopenharmony_ci I915_ENGINE_CLASS_VIDEO_ENHANCE, 0); 5462306a36Sopenharmony_ci break; 5562306a36Sopenharmony_ci case I915_PARAM_HAS_BSD2: 5662306a36Sopenharmony_ci value = !!intel_engine_lookup_user(i915, 5762306a36Sopenharmony_ci I915_ENGINE_CLASS_VIDEO, 1); 5862306a36Sopenharmony_ci break; 5962306a36Sopenharmony_ci case I915_PARAM_HAS_LLC: 6062306a36Sopenharmony_ci value = HAS_LLC(i915); 6162306a36Sopenharmony_ci break; 6262306a36Sopenharmony_ci case I915_PARAM_HAS_WT: 6362306a36Sopenharmony_ci value = HAS_WT(i915); 6462306a36Sopenharmony_ci break; 6562306a36Sopenharmony_ci case I915_PARAM_HAS_ALIASING_PPGTT: 6662306a36Sopenharmony_ci value = INTEL_PPGTT(i915); 6762306a36Sopenharmony_ci break; 6862306a36Sopenharmony_ci case I915_PARAM_HAS_SEMAPHORES: 6962306a36Sopenharmony_ci value = !!(i915->caps.scheduler & I915_SCHEDULER_CAP_SEMAPHORES); 7062306a36Sopenharmony_ci break; 7162306a36Sopenharmony_ci case I915_PARAM_HAS_SECURE_BATCHES: 7262306a36Sopenharmony_ci value = HAS_SECURE_BATCHES(i915) && capable(CAP_SYS_ADMIN); 7362306a36Sopenharmony_ci break; 7462306a36Sopenharmony_ci case I915_PARAM_CMD_PARSER_VERSION: 7562306a36Sopenharmony_ci value = i915_cmd_parser_get_version(i915); 7662306a36Sopenharmony_ci break; 7762306a36Sopenharmony_ci case I915_PARAM_SUBSLICE_TOTAL: 7862306a36Sopenharmony_ci value = intel_sseu_subslice_total(sseu); 7962306a36Sopenharmony_ci if (!value) 8062306a36Sopenharmony_ci return -ENODEV; 8162306a36Sopenharmony_ci break; 8262306a36Sopenharmony_ci case I915_PARAM_EU_TOTAL: 8362306a36Sopenharmony_ci value = sseu->eu_total; 8462306a36Sopenharmony_ci if (!value) 8562306a36Sopenharmony_ci return -ENODEV; 8662306a36Sopenharmony_ci break; 8762306a36Sopenharmony_ci case I915_PARAM_HAS_GPU_RESET: 8862306a36Sopenharmony_ci value = i915->params.enable_hangcheck && 8962306a36Sopenharmony_ci intel_has_gpu_reset(to_gt(i915)); 9062306a36Sopenharmony_ci if (value && intel_has_reset_engine(to_gt(i915))) 9162306a36Sopenharmony_ci value = 2; 9262306a36Sopenharmony_ci break; 9362306a36Sopenharmony_ci case I915_PARAM_HAS_RESOURCE_STREAMER: 9462306a36Sopenharmony_ci value = 0; 9562306a36Sopenharmony_ci break; 9662306a36Sopenharmony_ci case I915_PARAM_HAS_POOLED_EU: 9762306a36Sopenharmony_ci value = HAS_POOLED_EU(i915); 9862306a36Sopenharmony_ci break; 9962306a36Sopenharmony_ci case I915_PARAM_MIN_EU_IN_POOL: 10062306a36Sopenharmony_ci value = sseu->min_eu_in_pool; 10162306a36Sopenharmony_ci break; 10262306a36Sopenharmony_ci case I915_PARAM_HUC_STATUS: 10362306a36Sopenharmony_ci /* On platform with a media GT, the HuC is on that GT */ 10462306a36Sopenharmony_ci if (i915->media_gt) 10562306a36Sopenharmony_ci value = intel_huc_check_status(&i915->media_gt->uc.huc); 10662306a36Sopenharmony_ci else 10762306a36Sopenharmony_ci value = intel_huc_check_status(&to_gt(i915)->uc.huc); 10862306a36Sopenharmony_ci if (value < 0) 10962306a36Sopenharmony_ci return value; 11062306a36Sopenharmony_ci break; 11162306a36Sopenharmony_ci case I915_PARAM_PXP_STATUS: 11262306a36Sopenharmony_ci value = intel_pxp_get_readiness_status(i915->pxp); 11362306a36Sopenharmony_ci if (value < 0) 11462306a36Sopenharmony_ci return value; 11562306a36Sopenharmony_ci break; 11662306a36Sopenharmony_ci case I915_PARAM_MMAP_GTT_VERSION: 11762306a36Sopenharmony_ci /* Though we've started our numbering from 1, and so class all 11862306a36Sopenharmony_ci * earlier versions as 0, in effect their value is undefined as 11962306a36Sopenharmony_ci * the ioctl will report EINVAL for the unknown param! 12062306a36Sopenharmony_ci */ 12162306a36Sopenharmony_ci value = i915_gem_mmap_gtt_version(); 12262306a36Sopenharmony_ci break; 12362306a36Sopenharmony_ci case I915_PARAM_HAS_SCHEDULER: 12462306a36Sopenharmony_ci value = i915->caps.scheduler; 12562306a36Sopenharmony_ci break; 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci case I915_PARAM_MMAP_VERSION: 12862306a36Sopenharmony_ci /* Remember to bump this if the version changes! */ 12962306a36Sopenharmony_ci case I915_PARAM_HAS_GEM: 13062306a36Sopenharmony_ci case I915_PARAM_HAS_PAGEFLIPPING: 13162306a36Sopenharmony_ci case I915_PARAM_HAS_EXECBUF2: /* depends on GEM */ 13262306a36Sopenharmony_ci case I915_PARAM_HAS_RELAXED_FENCING: 13362306a36Sopenharmony_ci case I915_PARAM_HAS_COHERENT_RINGS: 13462306a36Sopenharmony_ci case I915_PARAM_HAS_RELAXED_DELTA: 13562306a36Sopenharmony_ci case I915_PARAM_HAS_GEN7_SOL_RESET: 13662306a36Sopenharmony_ci case I915_PARAM_HAS_WAIT_TIMEOUT: 13762306a36Sopenharmony_ci case I915_PARAM_HAS_PRIME_VMAP_FLUSH: 13862306a36Sopenharmony_ci case I915_PARAM_HAS_PINNED_BATCHES: 13962306a36Sopenharmony_ci case I915_PARAM_HAS_EXEC_NO_RELOC: 14062306a36Sopenharmony_ci case I915_PARAM_HAS_EXEC_HANDLE_LUT: 14162306a36Sopenharmony_ci case I915_PARAM_HAS_COHERENT_PHYS_GTT: 14262306a36Sopenharmony_ci case I915_PARAM_HAS_EXEC_SOFTPIN: 14362306a36Sopenharmony_ci case I915_PARAM_HAS_EXEC_ASYNC: 14462306a36Sopenharmony_ci case I915_PARAM_HAS_EXEC_FENCE: 14562306a36Sopenharmony_ci case I915_PARAM_HAS_EXEC_CAPTURE: 14662306a36Sopenharmony_ci case I915_PARAM_HAS_EXEC_BATCH_FIRST: 14762306a36Sopenharmony_ci case I915_PARAM_HAS_EXEC_FENCE_ARRAY: 14862306a36Sopenharmony_ci case I915_PARAM_HAS_EXEC_SUBMIT_FENCE: 14962306a36Sopenharmony_ci case I915_PARAM_HAS_EXEC_TIMELINE_FENCES: 15062306a36Sopenharmony_ci case I915_PARAM_HAS_USERPTR_PROBE: 15162306a36Sopenharmony_ci /* For the time being all of these are always true; 15262306a36Sopenharmony_ci * if some supported hardware does not have one of these 15362306a36Sopenharmony_ci * features this value needs to be provided from 15462306a36Sopenharmony_ci * INTEL_INFO(), a feature macro, or similar. 15562306a36Sopenharmony_ci */ 15662306a36Sopenharmony_ci value = 1; 15762306a36Sopenharmony_ci break; 15862306a36Sopenharmony_ci case I915_PARAM_HAS_CONTEXT_ISOLATION: 15962306a36Sopenharmony_ci value = intel_engines_has_context_isolation(i915); 16062306a36Sopenharmony_ci break; 16162306a36Sopenharmony_ci case I915_PARAM_SLICE_MASK: 16262306a36Sopenharmony_ci /* Not supported from Xe_HP onward; use topology queries */ 16362306a36Sopenharmony_ci if (GRAPHICS_VER_FULL(i915) >= IP_VER(12, 50)) 16462306a36Sopenharmony_ci return -EINVAL; 16562306a36Sopenharmony_ci 16662306a36Sopenharmony_ci value = sseu->slice_mask; 16762306a36Sopenharmony_ci if (!value) 16862306a36Sopenharmony_ci return -ENODEV; 16962306a36Sopenharmony_ci break; 17062306a36Sopenharmony_ci case I915_PARAM_SUBSLICE_MASK: 17162306a36Sopenharmony_ci /* Not supported from Xe_HP onward; use topology queries */ 17262306a36Sopenharmony_ci if (GRAPHICS_VER_FULL(i915) >= IP_VER(12, 50)) 17362306a36Sopenharmony_ci return -EINVAL; 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_ci /* Only copy bits from the first slice */ 17662306a36Sopenharmony_ci value = intel_sseu_get_hsw_subslices(sseu, 0); 17762306a36Sopenharmony_ci if (!value) 17862306a36Sopenharmony_ci return -ENODEV; 17962306a36Sopenharmony_ci break; 18062306a36Sopenharmony_ci case I915_PARAM_CS_TIMESTAMP_FREQUENCY: 18162306a36Sopenharmony_ci value = to_gt(i915)->clock_frequency; 18262306a36Sopenharmony_ci break; 18362306a36Sopenharmony_ci case I915_PARAM_MMAP_GTT_COHERENT: 18462306a36Sopenharmony_ci value = INTEL_INFO(i915)->has_coherent_ggtt; 18562306a36Sopenharmony_ci break; 18662306a36Sopenharmony_ci case I915_PARAM_PERF_REVISION: 18762306a36Sopenharmony_ci value = i915_perf_ioctl_version(i915); 18862306a36Sopenharmony_ci break; 18962306a36Sopenharmony_ci case I915_PARAM_OA_TIMESTAMP_FREQUENCY: 19062306a36Sopenharmony_ci value = i915_perf_oa_timestamp_frequency(i915); 19162306a36Sopenharmony_ci break; 19262306a36Sopenharmony_ci default: 19362306a36Sopenharmony_ci drm_dbg(&i915->drm, "Unknown parameter %d\n", param->param); 19462306a36Sopenharmony_ci return -EINVAL; 19562306a36Sopenharmony_ci } 19662306a36Sopenharmony_ci 19762306a36Sopenharmony_ci if (put_user(value, param->value)) 19862306a36Sopenharmony_ci return -EFAULT; 19962306a36Sopenharmony_ci 20062306a36Sopenharmony_ci return 0; 20162306a36Sopenharmony_ci} 202