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