drivers/gpu/drm/msm/adreno/adreno_gpu.c

Source file repositories/reference/linux-study-clean/drivers/gpu/drm/msm/adreno/adreno_gpu.c

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/msm/adreno/adreno_gpu.c
Extension
.c
Size
33596 bytes
Lines
1260
Domain
Driver Families
Bucket
drivers/gpu
Inferred role
Driver Families: implementation source
Status
source implementation candidate

Why This File Exists

Repeatable hardware-adapter layer. Deep compatibility for every driver is out of scope; this atlas records patterns, probe lifecycles, bus glue, IRQ/DMA usage, and links back to core abstractions.

Dependency Surface

Detected Declarations

Annotated Snippet

if (adreno_gpu->funcs->get_timestamp) {
			pm_runtime_get_sync(&gpu->pdev->dev);
			*value = adreno_gpu->funcs->get_timestamp(gpu);
			pm_runtime_put_autosuspend(&gpu->pdev->dev);

			return 0;
		}
		return -EINVAL;
	case MSM_PARAM_PRIORITIES:
		*value = gpu->nr_rings * NR_SCHED_PRIORITIES;
		return 0;
	case MSM_PARAM_PP_PGTABLE:
		*value = 0;
		return 0;
	case MSM_PARAM_FAULTS:
		if (vm)
			*value = gpu->global_faults + to_msm_vm(vm)->faults;
		else
			*value = gpu->global_faults;
		return 0;
	case MSM_PARAM_SUSPENDS:
		*value = gpu->suspend_count;
		return 0;
	case MSM_PARAM_VA_START:
		if (vm == gpu->vm)
			return UERR(EINVAL, drm, "requires per-process pgtables");
		*value = vm->mm_start;
		return 0;
	case MSM_PARAM_VA_SIZE:
		if (vm == gpu->vm)
			return UERR(EINVAL, drm, "requires per-process pgtables");
		*value = vm->mm_range;
		return 0;
	case MSM_PARAM_HIGHEST_BANK_BIT:
		if (!adreno_gpu->ubwc_config)
			return UERR(ENOENT, drm, "no UBWC on this platform");
		*value = adreno_gpu->ubwc_config->highest_bank_bit;
		return 0;
	case MSM_PARAM_RAYTRACING:
		*value = adreno_gpu->has_ray_tracing;
		return 0;
	case MSM_PARAM_UBWC_SWIZZLE:
		if (!adreno_gpu->ubwc_config)
			return UERR(ENOENT, drm, "no UBWC on this platform");
		*value = qcom_ubwc_swizzle(adreno_gpu->ubwc_config);
		return 0;
	case MSM_PARAM_MACROTILE_MODE:
		if (!adreno_gpu->ubwc_config)
			return UERR(ENOENT, drm, "no UBWC on this platform");
		*value = qcom_ubwc_macrotile_mode(adreno_gpu->ubwc_config);
		return 0;
	case MSM_PARAM_UCHE_TRAP_BASE:
		*value = adreno_gpu->uche_trap_base;
		return 0;
	case MSM_PARAM_HAS_PRR:
		*value = adreno_smmu_has_prr(gpu);
		return 0;
	case MSM_PARAM_AQE:
		*value = !!(adreno_gpu->funcs->aqe_is_enabled &&
			    adreno_gpu->funcs->aqe_is_enabled(adreno_gpu));
		return 0;
	default:
		return UERR(EINVAL, drm, "%s: invalid param: %u", gpu->name, param);
	}
}

int adreno_set_param(struct msm_gpu *gpu, struct msm_context *ctx,
		     uint32_t param, uint64_t value, uint32_t len)
{
	struct drm_device *drm = gpu->dev;

	switch (param) {
	case MSM_PARAM_COMM:
	case MSM_PARAM_CMDLINE:
		/* kstrdup_quotable_cmdline() limits to PAGE_SIZE, so
		 * that should be a reasonable upper bound
		 */
		if (len > PAGE_SIZE)
			return UERR(EINVAL, drm, "invalid len");
		break;
	default:
		if (len != 0)
			return UERR(EINVAL, drm, "invalid len");
	}

	switch (param) {
	case MSM_PARAM_COMM:
	case MSM_PARAM_CMDLINE: {
		char *str, **paramp;

Annotation

Implementation Notes