diff options
Diffstat (limited to 'common/recipes-kernel/linux/files/0042-drm-amdgpu-export-amd_powerplay_func-to-amdgpu-and-o.patch')
-rw-r--r-- | common/recipes-kernel/linux/files/0042-drm-amdgpu-export-amd_powerplay_func-to-amdgpu-and-o.patch | 441 |
1 files changed, 0 insertions, 441 deletions
diff --git a/common/recipes-kernel/linux/files/0042-drm-amdgpu-export-amd_powerplay_func-to-amdgpu-and-o.patch b/common/recipes-kernel/linux/files/0042-drm-amdgpu-export-amd_powerplay_func-to-amdgpu-and-o.patch deleted file mode 100644 index c8b8c2a5..00000000 --- a/common/recipes-kernel/linux/files/0042-drm-amdgpu-export-amd_powerplay_func-to-amdgpu-and-o.patch +++ /dev/null @@ -1,441 +0,0 @@ -From d7545b2f834039696946552cb68ed0bcd08a6918 Mon Sep 17 00:00:00 2001 -From: Rex Zhu <Rex.Zhu@amd.com> -Date: Tue, 10 Nov 2015 18:25:24 -0500 -Subject: [PATCH 0042/1110] drm/amdgpu: export amd_powerplay_func to amdgpu and - other ip block - -Update amdgpu to deal with the new powerplay module properly. - -v2: squash in fixes -v3: squash in Rex's power state reporting fix - -Signed-off-by: Rex Zhu <Rex.Zhu@amd.com> -Acked-by: Jammy Zhou <Jammy.Zhou@amd.com> -Reviewed-by: Alex Deucher <alexander.deucher@amd.com> ---- - drivers/gpu/drm/amd/amdgpu/amdgpu.h | 46 ++++++- - drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c | 215 +++++++++++++++++++++------------ - 2 files changed, 180 insertions(+), 81 deletions(-) - -diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h -index 9387cce..9e12df3 100644 ---- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h -+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h -@@ -2273,20 +2273,54 @@ amdgpu_get_sdma_instance(struct amdgpu_ring *ring) - #define amdgpu_dpm_set_power_state(adev) (adev)->pm.funcs->set_power_state((adev)) - #define amdgpu_dpm_post_set_power_state(adev) (adev)->pm.funcs->post_set_power_state((adev)) - #define amdgpu_dpm_display_configuration_changed(adev) (adev)->pm.funcs->display_configuration_changed((adev)) --#define amdgpu_dpm_get_sclk(adev, l) (adev)->pm.funcs->get_sclk((adev), (l)) --#define amdgpu_dpm_get_mclk(adev, l) (adev)->pm.funcs->get_mclk((adev), (l)) - #define amdgpu_dpm_print_power_state(adev, ps) (adev)->pm.funcs->print_power_state((adev), (ps)) --#define amdgpu_dpm_debugfs_print_current_performance_level(adev, m) (adev)->pm.funcs->debugfs_print_current_performance_level((adev), (m)) --#define amdgpu_dpm_force_performance_level(adev, l) (adev)->pm.funcs->force_performance_level((adev), (l)) - #define amdgpu_dpm_vblank_too_short(adev) (adev)->pm.funcs->vblank_too_short((adev)) --#define amdgpu_dpm_powergate_uvd(adev, g) (adev)->pm.funcs->powergate_uvd((adev), (g)) --#define amdgpu_dpm_powergate_vce(adev, g) (adev)->pm.funcs->powergate_vce((adev), (g)) - #define amdgpu_dpm_enable_bapm(adev, e) (adev)->pm.funcs->enable_bapm((adev), (e)) - #define amdgpu_dpm_set_fan_control_mode(adev, m) (adev)->pm.funcs->set_fan_control_mode((adev), (m)) - #define amdgpu_dpm_get_fan_control_mode(adev) (adev)->pm.funcs->get_fan_control_mode((adev)) - #define amdgpu_dpm_set_fan_speed_percent(adev, s) (adev)->pm.funcs->set_fan_speed_percent((adev), (s)) - #define amdgpu_dpm_get_fan_speed_percent(adev, s) (adev)->pm.funcs->get_fan_speed_percent((adev), (s)) - -+#define amdgpu_dpm_get_sclk(adev, l) \ -+ amdgpu_powerplay ? \ -+ (adev)->powerplay.pp_funcs->get_sclk((adev)->powerplay.pp_handle, (l)) : \ -+ (adev)->pm.funcs->get_sclk((adev), (l)) -+ -+#define amdgpu_dpm_get_mclk(adev, l) \ -+ amdgpu_powerplay ? \ -+ (adev)->powerplay.pp_funcs->get_mclk((adev)->powerplay.pp_handle, (l)) : \ -+ (adev)->pm.funcs->get_mclk((adev), (l)) -+ -+ -+#define amdgpu_dpm_force_performance_level(adev, l) \ -+ amdgpu_powerplay ? \ -+ (adev)->powerplay.pp_funcs->force_performance_level((adev)->powerplay.pp_handle, (l)) : \ -+ (adev)->pm.funcs->force_performance_level((adev), (l)) -+ -+#define amdgpu_dpm_powergate_uvd(adev, g) \ -+ amdgpu_powerplay ? \ -+ (adev)->powerplay.pp_funcs->powergate_uvd((adev)->powerplay.pp_handle, (g)) : \ -+ (adev)->pm.funcs->powergate_uvd((adev), (g)) -+ -+#define amdgpu_dpm_powergate_vce(adev, g) \ -+ amdgpu_powerplay ? \ -+ (adev)->powerplay.pp_funcs->powergate_vce((adev)->powerplay.pp_handle, (g)) : \ -+ (adev)->pm.funcs->powergate_vce((adev), (g)) -+ -+#define amdgpu_dpm_debugfs_print_current_performance_level(adev, m) \ -+ amdgpu_powerplay ? \ -+ (adev)->powerplay.pp_funcs->print_current_performance_level((adev)->powerplay.pp_handle, (m)) : \ -+ (adev)->pm.funcs->debugfs_print_current_performance_level((adev), (m)) -+ -+#define amdgpu_dpm_get_current_power_state(adev) \ -+ (adev)->powerplay.pp_funcs->get_current_power_state((adev)->powerplay.pp_handle) -+ -+#define amdgpu_dpm_get_performance_level(adev) \ -+ (adev)->powerplay.pp_funcs->get_performance_level((adev)->powerplay.pp_handle) -+ -+#define amdgpu_dpm_dispatch_task(adev, event_id, input, output) \ -+ (adev)->powerplay.pp_funcs->dispatch_tasks((adev)->powerplay.pp_handle, (event_id), (input), (output)) -+ - #define amdgpu_gds_switch(adev, r, v, d, w, a) (adev)->gds.funcs->patch_gds_switch((r), (v), (d), (w), (a)) - - /* Common functions */ -diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c -index feb247d..534bfac 100644 ---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c -+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_pm.c -@@ -30,10 +30,16 @@ - #include <linux/hwmon.h> - #include <linux/hwmon-sysfs.h> - -+#include "amd_powerplay.h" -+ - static int amdgpu_debugfs_pm_init(struct amdgpu_device *adev); - - void amdgpu_pm_acpi_event_handler(struct amdgpu_device *adev) - { -+ if (amdgpu_powerplay) -+ /* TODO */ -+ return; -+ - if (adev->pm.dpm_enabled) { - mutex_lock(&adev->pm.mutex); - if (power_supply_is_system_supplied() > 0) -@@ -52,7 +58,12 @@ static ssize_t amdgpu_get_dpm_state(struct device *dev, - { - struct drm_device *ddev = dev_get_drvdata(dev); - struct amdgpu_device *adev = ddev->dev_private; -- enum amd_pm_state_type pm = adev->pm.dpm.user_state; -+ enum amd_pm_state_type pm; -+ -+ if (amdgpu_powerplay) { -+ pm = amdgpu_dpm_get_current_power_state(adev); -+ } else -+ pm = adev->pm.dpm.user_state; - - return snprintf(buf, PAGE_SIZE, "%s\n", - (pm == POWER_STATE_TYPE_BATTERY) ? "battery" : -@@ -66,40 +77,57 @@ static ssize_t amdgpu_set_dpm_state(struct device *dev, - { - struct drm_device *ddev = dev_get_drvdata(dev); - struct amdgpu_device *adev = ddev->dev_private; -+ enum amd_pm_state_type state; - -- mutex_lock(&adev->pm.mutex); - if (strncmp("battery", buf, strlen("battery")) == 0) -- adev->pm.dpm.user_state = POWER_STATE_TYPE_BATTERY; -+ state = POWER_STATE_TYPE_BATTERY; - else if (strncmp("balanced", buf, strlen("balanced")) == 0) -- adev->pm.dpm.user_state = POWER_STATE_TYPE_BALANCED; -+ state = POWER_STATE_TYPE_BALANCED; - else if (strncmp("performance", buf, strlen("performance")) == 0) -- adev->pm.dpm.user_state = POWER_STATE_TYPE_PERFORMANCE; -+ state = POWER_STATE_TYPE_PERFORMANCE; - else { -- mutex_unlock(&adev->pm.mutex); - count = -EINVAL; - goto fail; - } -- mutex_unlock(&adev->pm.mutex); - -- /* Can't set dpm state when the card is off */ -- if (!(adev->flags & AMD_IS_PX) || -- (ddev->switch_power_state == DRM_SWITCH_POWER_ON)) -- amdgpu_pm_compute_clocks(adev); -+ if (amdgpu_powerplay) { -+ amdgpu_dpm_dispatch_task(adev, AMD_PP_EVENT_ENABLE_USER_STATE, &state, NULL); -+ } else { -+ mutex_lock(&adev->pm.mutex); -+ adev->pm.dpm.user_state = state; -+ mutex_unlock(&adev->pm.mutex); -+ -+ /* Can't set dpm state when the card is off */ -+ if (!(adev->flags & AMD_IS_PX) || -+ (ddev->switch_power_state == DRM_SWITCH_POWER_ON)) -+ amdgpu_pm_compute_clocks(adev); -+ } - fail: - return count; - } - - static ssize_t amdgpu_get_dpm_forced_performance_level(struct device *dev, -- struct device_attribute *attr, -- char *buf) -+ struct device_attribute *attr, -+ char *buf) - { - struct drm_device *ddev = dev_get_drvdata(dev); - struct amdgpu_device *adev = ddev->dev_private; -- enum amdgpu_dpm_forced_level level = adev->pm.dpm.forced_level; - -- return snprintf(buf, PAGE_SIZE, "%s\n", -- (level == AMDGPU_DPM_FORCED_LEVEL_AUTO) ? "auto" : -- (level == AMDGPU_DPM_FORCED_LEVEL_LOW) ? "low" : "high"); -+ if (amdgpu_powerplay) { -+ enum amd_dpm_forced_level level; -+ -+ level = amdgpu_dpm_get_performance_level(adev); -+ return snprintf(buf, PAGE_SIZE, "%s\n", -+ (level == AMD_DPM_FORCED_LEVEL_AUTO) ? "auto" : -+ (level == AMD_DPM_FORCED_LEVEL_LOW) ? "low" : "high"); -+ } else { -+ enum amdgpu_dpm_forced_level level; -+ -+ level = adev->pm.dpm.forced_level; -+ return snprintf(buf, PAGE_SIZE, "%s\n", -+ (level == AMDGPU_DPM_FORCED_LEVEL_AUTO) ? "auto" : -+ (level == AMDGPU_DPM_FORCED_LEVEL_LOW) ? "low" : "high"); -+ } - } - - static ssize_t amdgpu_set_dpm_forced_performance_level(struct device *dev, -@@ -112,7 +140,6 @@ static ssize_t amdgpu_set_dpm_forced_performance_level(struct device *dev, - enum amdgpu_dpm_forced_level level; - int ret = 0; - -- mutex_lock(&adev->pm.mutex); - if (strncmp("low", buf, strlen("low")) == 0) { - level = AMDGPU_DPM_FORCED_LEVEL_LOW; - } else if (strncmp("high", buf, strlen("high")) == 0) { -@@ -123,7 +150,11 @@ static ssize_t amdgpu_set_dpm_forced_performance_level(struct device *dev, - count = -EINVAL; - goto fail; - } -- if (adev->pm.funcs->force_performance_level) { -+ -+ if (amdgpu_powerplay) -+ amdgpu_dpm_force_performance_level(adev, level); -+ else { -+ mutex_lock(&adev->pm.mutex); - if (adev->pm.dpm.thermal_active) { - count = -EINVAL; - goto fail; -@@ -131,6 +162,9 @@ static ssize_t amdgpu_set_dpm_forced_performance_level(struct device *dev, - ret = amdgpu_dpm_force_performance_level(adev, level); - if (ret) - count = -EINVAL; -+ else -+ adev->pm.dpm.forced_level = level; -+ mutex_unlock(&adev->pm.mutex); - } - fail: - mutex_unlock(&adev->pm.mutex); -@@ -197,7 +231,7 @@ static ssize_t amdgpu_hwmon_set_pwm1_enable(struct device *dev, - int err; - int value; - -- if(!adev->pm.funcs->set_fan_control_mode) -+ if (!adev->pm.funcs->set_fan_control_mode) - return -EINVAL; - - err = kstrtoint(buf, 10, &value); -@@ -294,7 +328,10 @@ static umode_t hwmon_attributes_visible(struct kobject *kobj, - struct amdgpu_device *adev = dev_get_drvdata(dev); - umode_t effective_mode = attr->mode; - -- /* Skip attributes if DPM is not enabled */ -+ if (amdgpu_powerplay) -+ return 0; /* to do */ -+ -+ /* Skip limit attributes if DPM is not enabled */ - if (!adev->pm.dpm_enabled && - (attr == &sensor_dev_attr_temp1_crit.dev_attr.attr || - attr == &sensor_dev_attr_temp1_crit_hyst.dev_attr.attr || -@@ -636,49 +673,54 @@ done: - - void amdgpu_dpm_enable_uvd(struct amdgpu_device *adev, bool enable) - { -- if (adev->pm.funcs->powergate_uvd) { -- mutex_lock(&adev->pm.mutex); -- /* enable/disable UVD */ -+ if (amdgpu_powerplay) - amdgpu_dpm_powergate_uvd(adev, !enable); -- mutex_unlock(&adev->pm.mutex); -- } else { -- if (enable) { -+ else { -+ if (adev->pm.funcs->powergate_uvd) { - mutex_lock(&adev->pm.mutex); -- adev->pm.dpm.uvd_active = true; -- adev->pm.dpm.state = POWER_STATE_TYPE_INTERNAL_UVD; -+ /* enable/disable UVD */ -+ amdgpu_dpm_powergate_uvd(adev, !enable); - mutex_unlock(&adev->pm.mutex); - } else { -- mutex_lock(&adev->pm.mutex); -- adev->pm.dpm.uvd_active = false; -- mutex_unlock(&adev->pm.mutex); -+ if (enable) { -+ mutex_lock(&adev->pm.mutex); -+ adev->pm.dpm.uvd_active = true; -+ adev->pm.dpm.state = POWER_STATE_TYPE_INTERNAL_UVD; -+ mutex_unlock(&adev->pm.mutex); -+ } else { -+ mutex_lock(&adev->pm.mutex); -+ adev->pm.dpm.uvd_active = false; -+ mutex_unlock(&adev->pm.mutex); -+ } -+ amdgpu_pm_compute_clocks(adev); - } - -- amdgpu_pm_compute_clocks(adev); - } - } - - void amdgpu_dpm_enable_vce(struct amdgpu_device *adev, bool enable) - { -- if (adev->pm.funcs->powergate_vce) { -- mutex_lock(&adev->pm.mutex); -- /* enable/disable VCE */ -+ if (amdgpu_powerplay) - amdgpu_dpm_powergate_vce(adev, !enable); -- -- mutex_unlock(&adev->pm.mutex); -- } else { -- if (enable) { -+ else { -+ if (adev->pm.funcs->powergate_vce) { - mutex_lock(&adev->pm.mutex); -- adev->pm.dpm.vce_active = true; -- /* XXX select vce level based on ring/task */ -- adev->pm.dpm.vce_level = AMDGPU_VCE_LEVEL_AC_ALL; -+ amdgpu_dpm_powergate_vce(adev, !enable); - mutex_unlock(&adev->pm.mutex); - } else { -- mutex_lock(&adev->pm.mutex); -- adev->pm.dpm.vce_active = false; -- mutex_unlock(&adev->pm.mutex); -+ if (enable) { -+ mutex_lock(&adev->pm.mutex); -+ adev->pm.dpm.vce_active = true; -+ /* XXX select vce level based on ring/task */ -+ adev->pm.dpm.vce_level = AMDGPU_VCE_LEVEL_AC_ALL; -+ mutex_unlock(&adev->pm.mutex); -+ } else { -+ mutex_lock(&adev->pm.mutex); -+ adev->pm.dpm.vce_active = false; -+ mutex_unlock(&adev->pm.mutex); -+ } -+ amdgpu_pm_compute_clocks(adev); - } -- -- amdgpu_pm_compute_clocks(adev); - } - } - -@@ -686,10 +728,13 @@ void amdgpu_pm_print_power_states(struct amdgpu_device *adev) - { - int i; - -- for (i = 0; i < adev->pm.dpm.num_ps; i++) { -- printk("== power state %d ==\n", i); -+ if (amdgpu_powerplay) -+ /* TO DO */ -+ return; -+ -+ for (i = 0; i < adev->pm.dpm.num_ps; i++) - amdgpu_dpm_print_power_state(adev, &adev->pm.dpm.ps[i]); -- } -+ - } - - int amdgpu_pm_sysfs_init(struct amdgpu_device *adev) -@@ -699,8 +744,11 @@ int amdgpu_pm_sysfs_init(struct amdgpu_device *adev) - if (adev->pm.sysfs_initialized) - return 0; - -- if (adev->pm.funcs->get_temperature == NULL) -- return 0; -+ if (!amdgpu_powerplay) { -+ if (adev->pm.funcs->get_temperature == NULL) -+ return 0; -+ } -+ - adev->pm.int_hwmon_dev = hwmon_device_register_with_groups(adev->dev, - DRIVER_NAME, adev, - hwmon_groups); -@@ -749,32 +797,43 @@ void amdgpu_pm_compute_clocks(struct amdgpu_device *adev) - if (!adev->pm.dpm_enabled) - return; - -- mutex_lock(&adev->pm.mutex); -+ if (amdgpu_powerplay) { -+ int i = 0; -+ -+ amdgpu_display_bandwidth_update(adev); -+ mutex_lock(&adev->ring_lock); -+ for (i = 0; i < AMDGPU_MAX_RINGS; i++) { -+ struct amdgpu_ring *ring = adev->rings[i]; -+ if (ring && ring->ready) -+ amdgpu_fence_wait_empty(ring); -+ } -+ mutex_unlock(&adev->ring_lock); - -- /* update active crtc counts */ -- adev->pm.dpm.new_active_crtcs = 0; -- adev->pm.dpm.new_active_crtc_count = 0; -- if (adev->mode_info.num_crtc && adev->mode_info.mode_config_initialized) { -- list_for_each_entry(crtc, -- &ddev->mode_config.crtc_list, head) { -- amdgpu_crtc = to_amdgpu_crtc(crtc); -- if (crtc->enabled) { -- adev->pm.dpm.new_active_crtcs |= (1 << amdgpu_crtc->crtc_id); -- adev->pm.dpm.new_active_crtc_count++; -+ amdgpu_dpm_dispatch_task(adev, AMD_PP_EVENT_DISPLAY_CONFIG_CHANGE, NULL, NULL); -+ } else { -+ mutex_lock(&adev->pm.mutex); -+ adev->pm.dpm.new_active_crtcs = 0; -+ adev->pm.dpm.new_active_crtc_count = 0; -+ if (adev->mode_info.num_crtc && adev->mode_info.mode_config_initialized) { -+ list_for_each_entry(crtc, -+ &ddev->mode_config.crtc_list, head) { -+ amdgpu_crtc = to_amdgpu_crtc(crtc); -+ if (crtc->enabled) { -+ adev->pm.dpm.new_active_crtcs |= (1 << amdgpu_crtc->crtc_id); -+ adev->pm.dpm.new_active_crtc_count++; -+ } - } - } -- } -- -- /* update battery/ac status */ -- if (power_supply_is_system_supplied() > 0) -- adev->pm.dpm.ac_power = true; -- else -- adev->pm.dpm.ac_power = false; -- -- amdgpu_dpm_change_power_state_locked(adev); -+ /* update battery/ac status */ -+ if (power_supply_is_system_supplied() > 0) -+ adev->pm.dpm.ac_power = true; -+ else -+ adev->pm.dpm.ac_power = false; - -- mutex_unlock(&adev->pm.mutex); -+ amdgpu_dpm_change_power_state_locked(adev); - -+ mutex_unlock(&adev->pm.mutex); -+ } - } - - /* -@@ -788,7 +847,13 @@ static int amdgpu_debugfs_pm_info(struct seq_file *m, void *data) - struct drm_device *dev = node->minor->dev; - struct amdgpu_device *adev = dev->dev_private; - -- if (adev->pm.dpm_enabled) { -+ if (!adev->pm.dpm_enabled) { -+ seq_printf(m, "dpm not enabled\n"); -+ return 0; -+ } -+ if (amdgpu_powerplay) { -+ amdgpu_dpm_debugfs_print_current_performance_level(adev, m); -+ } else { - mutex_lock(&adev->pm.mutex); - if (adev->pm.funcs->debugfs_print_current_performance_level) - amdgpu_dpm_debugfs_print_current_performance_level(adev, m); --- -2.7.4 - |