drivers/gpu/drm/amd/pm/amdgpu_dpm.c

Source file repositories/reference/linux-study-clean/drivers/gpu/drm/amd/pm/amdgpu_dpm.c

File Facts

System
Linux kernel
Corpus path
drivers/gpu/drm/amd/pm/amdgpu_dpm.c
Extension
.c
Size
52082 bytes
Lines
2120
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 (enable) {
			adev->pm.dpm.uvd_active = true;
			adev->pm.dpm.state = POWER_STATE_TYPE_INTERNAL_UVD;
		} else {
			adev->pm.dpm.uvd_active = false;
		}
		mutex_unlock(&adev->pm.mutex);

		amdgpu_dpm_compute_clocks(adev);
		return;
	}

	ret = amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_UVD, !enable, 0);
	if (ret)
		drm_err(adev_to_drm(adev), "DPM %s uvd failed, ret = %d.\n",
			enable ? "enable" : "disable", ret);
}

void amdgpu_dpm_enable_vcn(struct amdgpu_device *adev, bool enable, int inst)
{
	int ret = 0;

	ret = amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_VCN, !enable, inst);
	if (ret)
		drm_err(adev_to_drm(adev), "DPM %s vcn failed, ret = %d.\n",
			enable ? "enable" : "disable", ret);
}

void amdgpu_dpm_enable_vce(struct amdgpu_device *adev, bool enable)
{
	int ret = 0;

	if (adev->family == AMDGPU_FAMILY_SI) {
		mutex_lock(&adev->pm.mutex);
		if (enable) {
			adev->pm.dpm.vce_active = true;
			/* XXX select vce level based on ring/task */
			adev->pm.dpm.vce_level = AMD_VCE_LEVEL_AC_ALL;
		} else {
			adev->pm.dpm.vce_active = false;
		}
		mutex_unlock(&adev->pm.mutex);

		amdgpu_dpm_compute_clocks(adev);
		return;
	}

	ret = amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_VCE, !enable, 0);
	if (ret)
		drm_err(adev_to_drm(adev), "DPM %s vce failed, ret = %d.\n",
			enable ? "enable" : "disable", ret);
}

void amdgpu_dpm_enable_jpeg(struct amdgpu_device *adev, bool enable)
{
	int ret = 0;

	ret = amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_JPEG, !enable, 0);
	if (ret)
		drm_err(adev_to_drm(adev), "Dpm %s jpeg failed, ret = %d.\n",
			enable ? "enable" : "disable", ret);
}

void amdgpu_dpm_enable_vpe(struct amdgpu_device *adev, bool enable)
{
	int ret = 0;

	ret = amdgpu_dpm_set_powergating_by_smu(adev, AMD_IP_BLOCK_TYPE_VPE, !enable, 0);
	if (ret)
		drm_err(adev_to_drm(adev), "DPM %s vpe failed, ret = %d.\n",
			enable ? "enable" : "disable", ret);
}

int amdgpu_pm_load_smu_firmware(struct amdgpu_device *adev, uint32_t *smu_version)
{
	const struct amd_pm_funcs *pp_funcs = adev->powerplay.pp_funcs;
	int r = 0;

	if (!pp_funcs || !pp_funcs->load_firmware ||
	    (is_support_sw_smu(adev) && (adev->flags & AMD_IS_APU)))
		return 0;

	mutex_lock(&adev->pm.mutex);
	r = pp_funcs->load_firmware(adev->powerplay.pp_handle);
	if (r) {
		pr_err("smu firmware loading failed\n");
		goto out;
	}

	if (smu_version)

Annotation

Implementation Notes