--- drivers/gpu/drm/radeon/ci_dpm.c.bak 2015-01-06 02:05:20.000000000 +0100 +++ drivers/gpu/drm/radeon/ci_dpm.c 2015-01-07 13:24:20.326888085 +0100 @@ -1046,7 +1046,7 @@ return 0; } -#if 0 +#if 1 static int ci_fan_ctrl_stop_smc_fan_control(struct radeon_device *rdev) { PPSMC_Result ret; @@ -1166,6 +1166,62 @@ return 0; } + +static ssize_t radeon_get_fan_speed(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + u32 speed = 0; + struct drm_device *ddev = dev_get_drvdata(dev); + struct radeon_device *rdev = ddev->dev_private; + + ci_fan_ctrl_get_fan_speed_percent(rdev, &speed); + + return snprintf(buf, PAGE_SIZE, "Current fan speed is %i%%\n", speed); +} + +static ssize_t radeon_set_fan_speed(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t count) +{ + u32 speed; + int ret; + struct drm_device *ddev = dev_get_drvdata(dev); + struct radeon_device *rdev = ddev->dev_private; + + if (!ci_is_smc_running(rdev)) + return -EINVAL; + + DRM_INFO("SMC is running, proceeding...\n"); + ret = ci_fan_ctrl_start_smc_fan_control(rdev); + if (ret) + return -EINVAL; + + ret = kstrtou32(buf, 0, &speed); + if(ret) + return ret; + + if(speed > 100) + return -EINVAL; + + ci_fan_ctrl_set_fan_speed_percent(rdev, speed); + + /*// XXX: without this line nothing will happen, unknown for now*/ + /*WREG32_SMC(FAN_MANUAL_OVERRIDE_INDEX, FAN_MANUAL_OVERRIDE_ENABLE);*/ + DRM_INFO("Fan control enabled, proceeding...\n"); + + return count; +} + +static DEVICE_ATTR(power_fan_control, S_IRUGO | S_IWUSR, radeon_get_fan_speed, radeon_set_fan_speed); + +static void ci_dpm_init_files(struct radeon_device *rdev) +{ + int ret = device_create_file(rdev->dev, &dev_attr_power_fan_control); + if (ret) + DRM_ERROR("failed to create device file for fan control\n"); +} #endif static void ci_fan_ctrl_set_default_mode(struct radeon_device *rdev) @@ -5078,7 +5134,6 @@ ci_update_current_ps(rdev, new_ps); } - void ci_dpm_setup_asic(struct radeon_device *rdev) { int r; @@ -5090,6 +5145,7 @@ ci_get_memory_type(rdev); ci_enable_acpi_power_management(rdev); ci_init_sclk_t(rdev); + ci_dpm_init_files(rdev); } int ci_dpm_enable(struct radeon_device *rdev) --- drivers/gpu/drm/radeon/si_dpm.c.bak 2015-01-06 02:05:20.000000000 +0100 +++ drivers/gpu/drm/radeon/si_dpm.c 2015-01-07 11:48:02.267060094 +0100 @@ -5814,6 +5814,8 @@ } } +static void si_dpm_init_files(struct radeon_device *rdev); + void si_dpm_setup_asic(struct radeon_device *rdev) { int r; @@ -5824,6 +5826,7 @@ rv770_get_memory_type(rdev); si_read_clock_registers(rdev); si_enable_acpi_power_management(rdev); + si_dpm_init_files(rdev); } static int si_thermal_enable_alert(struct radeon_device *rdev, @@ -5993,7 +5996,7 @@ return -EINVAL; } -#if 0 +#if 1 static int si_fan_ctrl_get_fan_speed_percent(struct radeon_device *rdev, u32 *speed) { @@ -6102,6 +6105,63 @@ return 0; } + +static ssize_t radeon_get_fan_speed(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + u32 speed = 0; + struct drm_device *ddev = dev_get_drvdata(dev); + struct radeon_device *rdev = ddev->dev_private; + + si_fan_ctrl_get_fan_speed_percent(rdev, &speed); + + return snprintf(buf, PAGE_SIZE, "Current fan speed is %i%%\n", speed); +} + +static ssize_t radeon_set_fan_speed(struct device *dev, + struct device_attribute *attr, + const char *buf, + size_t count) +{ + u32 speed; + int ret; + struct drm_device *ddev = dev_get_drvdata(dev); + struct radeon_device *rdev = ddev->dev_private; + + if (!si_is_smc_running(rdev)) + return -EINVAL; + + DRM_INFO("SMC is running, proceeding...\n"); + ret = si_fan_ctrl_start_smc_fan_control(rdev); + if (ret) + return -EINVAL; + + ret = kstrtou32(buf, 0, &speed); + if(ret) + return ret; + + if(speed > 100) + return -EINVAL; + + si_fan_ctrl_set_fan_speed_percent(rdev, speed); + + /*// XXX: without this line nothing will happen, unknown for now*/ + /*WREG32_SMC(FAN_MANUAL_OVERRIDE_INDEX, FAN_MANUAL_OVERRIDE_ENABLE);*/ + DRM_INFO("Fan control enabled, proceeding...\n"); + + return count; +} + +static DEVICE_ATTR(power_fan_control, S_IRUGO | S_IWUSR, radeon_get_fan_speed, radeon_set_fan_speed); + +static void si_dpm_init_files(struct radeon_device *rdev) +{ + int ret = device_create_file(rdev->dev, &dev_attr_power_fan_control); + if (ret) + DRM_ERROR("failed to create device file for fan control\n"); +} + #endif static void si_fan_ctrl_set_default_mode(struct radeon_device *rdev)