All of lore.kernel.org
 help / color / mirror / Atom feed
From: Jerome Glisse <j.glisse@gmail.com>
To: alexdeucher@gmail.com
Cc: Alex Deucher <alexander.deucher@amd.com>,
	dri-devel@lists.freedesktop.org
Subject: Re: [PATCH 069/165] drm/radeon/kms: add common dpm infrastructure
Date: Wed, 26 Jun 2013 06:27:27 -0400	[thread overview]
Message-ID: <20130626102727.GC2480@gmail.com> (raw)
In-Reply-To: <1372253045-17042-70-git-send-email-alexdeucher@gmail.com>

On Wed, Jun 26, 2013 at 09:22:29AM -0400, alexdeucher@gmail.com wrote:
> From: Alex Deucher <alexander.deucher@amd.com>
> 
> This adds the common dpm (dynamic power management)
> infrastructure:
> - dpm callbacks
> - dpm init/fini/suspend/resume
> - dpm power state selection
> 
> No device specific code is enabled yet.
> 
> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

Reviewed-by: Jerome Glisse <jglisse@redhat.com>

> ---
>  drivers/gpu/drm/radeon/radeon.h     |  100 +++++++-
>  drivers/gpu/drm/radeon/radeon_drv.c |    4 +
>  drivers/gpu/drm/radeon/radeon_pm.c  |  496 ++++++++++++++++++++++++++++++++++-
>  3 files changed, 591 insertions(+), 9 deletions(-)
> 
> diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
> index 6c445f5..c43673c 100644
> --- a/drivers/gpu/drm/radeon/radeon.h
> +++ b/drivers/gpu/drm/radeon/radeon.h
> @@ -96,6 +96,7 @@ extern int radeon_pcie_gen2;
>  extern int radeon_msi;
>  extern int radeon_lockup_timeout;
>  extern int radeon_fastfb;
> +extern int radeon_dpm;
>  
>  /*
>   * Copy from radeon_drv.h so we don't have to include both and have conflicting
> @@ -1048,6 +1049,7 @@ struct radeon_wb {
>  enum radeon_pm_method {
>  	PM_METHOD_PROFILE,
>  	PM_METHOD_DYNPM,
> +	PM_METHOD_DPM,
>  };
>  
>  enum radeon_dynpm_state {
> @@ -1073,11 +1075,23 @@ enum radeon_voltage_type {
>  };
>  
>  enum radeon_pm_state_type {
> +	/* not used for dpm */
>  	POWER_STATE_TYPE_DEFAULT,
>  	POWER_STATE_TYPE_POWERSAVE,
> +	/* user selectable states */
>  	POWER_STATE_TYPE_BATTERY,
>  	POWER_STATE_TYPE_BALANCED,
>  	POWER_STATE_TYPE_PERFORMANCE,
> +	/* internal states */
> +	POWER_STATE_TYPE_INTERNAL_UVD,
> +	POWER_STATE_TYPE_INTERNAL_UVD_SD,
> +	POWER_STATE_TYPE_INTERNAL_UVD_HD,
> +	POWER_STATE_TYPE_INTERNAL_UVD_HD2,
> +	POWER_STATE_TYPE_INTERNAL_UVD_MVC,
> +	POWER_STATE_TYPE_INTERNAL_BOOT,
> +	POWER_STATE_TYPE_INTERNAL_THERMAL,
> +	POWER_STATE_TYPE_INTERNAL_ACPI,
> +	POWER_STATE_TYPE_INTERNAL_ULV,
>  };
>  
>  enum radeon_pm_profile_type {
> @@ -1106,12 +1120,16 @@ struct radeon_pm_profile {
>  
>  enum radeon_int_thermal_type {
>  	THERMAL_TYPE_NONE,
> +	THERMAL_TYPE_EXTERNAL,
> +	THERMAL_TYPE_EXTERNAL_GPIO,
>  	THERMAL_TYPE_RV6XX,
>  	THERMAL_TYPE_RV770,
> +	THERMAL_TYPE_ADT7473_WITH_INTERNAL,
>  	THERMAL_TYPE_EVERGREEN,
>  	THERMAL_TYPE_SUMO,
>  	THERMAL_TYPE_NI,
>  	THERMAL_TYPE_SI,
> +	THERMAL_TYPE_EMC2103_WITH_INTERNAL,
>  	THERMAL_TYPE_CI,
>  };
>  
> @@ -1166,6 +1184,60 @@ struct radeon_power_state {
>   */
>  #define RADEON_MODE_OVERCLOCK_MARGIN 500 /* 5 MHz */
>  
> +struct radeon_ps {
> +	u32 caps; /* vbios flags */
> +	u32 class; /* vbios flags */
> +	u32 class2; /* vbios flags */
> +	/* UVD clocks */
> +	u32 vclk;
> +	u32 dclk;
> +	/* asic priv */
> +	void *ps_priv;
> +};
> +
> +struct radeon_dpm_thermal {
> +	/* thermal interrupt work */
> +	struct work_struct work;
> +	/* low temperature threshold */
> +	int                min_temp;
> +	/* high temperature threshold */
> +	int                max_temp;
> +	/* was interrupt low to high or high to low */
> +	bool               high_to_low;
> +};
> +
> +struct radeon_dpm {
> +	struct radeon_ps        *ps;
> +	/* number of valid power states */
> +	int                     num_ps;
> +	/* current power state that is active */
> +	struct radeon_ps        *current_ps;
> +	/* requested power state */
> +	struct radeon_ps        *requested_ps;
> +	/* boot up power state */
> +	struct radeon_ps        *boot_ps;
> +	/* default uvd power state */
> +	struct radeon_ps        *uvd_ps;
> +	enum radeon_pm_state_type state;
> +	enum radeon_pm_state_type user_state;
> +	u32                     platform_caps;
> +	u32                     voltage_response_time;
> +	u32                     backbias_response_time;
> +	void                    *priv;

Just nitpick all of the above have broken indentation space instead of tab.

> +	u32			new_active_crtcs;
> +	int			new_active_crtc_count;
> +	u32			current_active_crtcs;
> +	int			current_active_crtc_count;
> +	/* special states active */
> +	bool                    thermal_active;
> +	/* thermal handling */
> +	struct radeon_dpm_thermal thermal;
> +};
> +
> +void radeon_dpm_enable_power_state(struct radeon_device *rdev,
> +				    enum radeon_pm_state_type dpm_state);
> +
> +
>  struct radeon_pm {
>  	struct mutex		mutex;
>  	/* write locked while reprogramming mclk */
> @@ -1219,6 +1291,9 @@ struct radeon_pm {
>  	/* internal thermal controller on rv6xx+ */
>  	enum radeon_int_thermal_type int_thermal_type;
>  	struct device	        *int_hwmon_dev;
> +	/* dpm */
> +	bool                    dpm_enabled;
> +	struct radeon_dpm       dpm;
>  };
>  
>  int radeon_pm_get_type_index(struct radeon_device *rdev,
> @@ -1416,7 +1491,7 @@ struct radeon_asic {
>  		bool (*sense)(struct radeon_device *rdev, enum radeon_hpd_id hpd);
>  		void (*set_polarity)(struct radeon_device *rdev, enum radeon_hpd_id hpd);
>  	} hpd;
> -	/* power management */
> +	/* static power management */
>  	struct {
>  		void (*misc)(struct radeon_device *rdev);
>  		void (*prepare)(struct radeon_device *rdev);
> @@ -1433,6 +1508,19 @@ struct radeon_asic {
>  		int (*set_uvd_clocks)(struct radeon_device *rdev, u32 vclk, u32 dclk);
>  		int (*get_temperature)(struct radeon_device *rdev);
>  	} pm;
> +	/* dynamic power management */
> +	struct {
> +		int (*init)(struct radeon_device *rdev);
> +		void (*setup_asic)(struct radeon_device *rdev);
> +		int (*enable)(struct radeon_device *rdev);
> +		void (*disable)(struct radeon_device *rdev);
> +		int (*set_power_state)(struct radeon_device *rdev);
> +		void (*display_configuration_changed)(struct radeon_device *rdev);
> +		void (*fini)(struct radeon_device *rdev);
> +		u32 (*get_sclk)(struct radeon_device *rdev, bool low);
> +		u32 (*get_mclk)(struct radeon_device *rdev, bool low);
> +		void (*print_power_state)(struct radeon_device *rdev, struct radeon_ps *ps);
> +	} dpm;
>  	/* pageflipping */
>  	struct {
>  		void (*pre_page_flip)(struct radeon_device *rdev, int crtc);
> @@ -2122,6 +2210,16 @@ void radeon_ring_write(struct radeon_ring *ring, uint32_t v);
>  #define radeon_mc_wait_for_idle(rdev) (rdev)->asic->mc_wait_for_idle((rdev))
>  #define radeon_get_xclk(rdev) (rdev)->asic->get_xclk((rdev))
>  #define radeon_get_gpu_clock_counter(rdev) (rdev)->asic->get_gpu_clock_counter((rdev))
> +#define radeon_dpm_init(rdev) rdev->asic->dpm.init((rdev))
> +#define radeon_dpm_setup_asic(rdev) rdev->asic->dpm.setup_asic((rdev))
> +#define radeon_dpm_enable(rdev) rdev->asic->dpm.enable((rdev))
> +#define radeon_dpm_disable(rdev) rdev->asic->dpm.disable((rdev))
> +#define radeon_dpm_set_power_state(rdev) rdev->asic->dpm.set_power_state((rdev))
> +#define radeon_dpm_display_configuration_changed(rdev) rdev->asic->dpm.display_configuration_changed((rdev))
> +#define radeon_dpm_fini(rdev) rdev->asic->dpm.fini((rdev))
> +#define radeon_dpm_get_sclk(rdev, l) rdev->asic->dpm.get_sclk((rdev), (l))
> +#define radeon_dpm_get_mclk(rdev, l) rdev->asic->dpm.get_mclk((rdev), (l))
> +#define radeon_dpm_print_power_state(rdev, ps) rdev->asic->dpm.print_power_state((rdev), (ps))
>  
>  /* Common functions */
>  /* AGP */
> diff --git a/drivers/gpu/drm/radeon/radeon_drv.c b/drivers/gpu/drm/radeon/radeon_drv.c
> index 02709e4..00cc52e 100644
> --- a/drivers/gpu/drm/radeon/radeon_drv.c
> +++ b/drivers/gpu/drm/radeon/radeon_drv.c
> @@ -165,6 +165,7 @@ int radeon_pcie_gen2 = -1;
>  int radeon_msi = -1;
>  int radeon_lockup_timeout = 10000;
>  int radeon_fastfb = 0;
> +int radeon_dpm = -1;
>  
>  MODULE_PARM_DESC(no_wb, "Disable AGP writeback for scratch registers");
>  module_param_named(no_wb, radeon_no_wb, int, 0444);
> @@ -220,6 +221,9 @@ module_param_named(lockup_timeout, radeon_lockup_timeout, int, 0444);
>  MODULE_PARM_DESC(fastfb, "Direct FB access for IGP chips (0 = disable, 1 = enable)");
>  module_param_named(fastfb, radeon_fastfb, int, 0444);
>  
> +MODULE_PARM_DESC(dpm, "DPM support (1 = enable, 0 = disable, -1 = auto)");
> +module_param_named(dpm, radeon_dpm, int, 0444);
> +
>  static struct pci_device_id pciidlist[] = {
>  	radeon_PCI_IDS
>  };
> diff --git a/drivers/gpu/drm/radeon/radeon_pm.c b/drivers/gpu/drm/radeon/radeon_pm.c
> index e8c1bea..4f5422e 100644
> --- a/drivers/gpu/drm/radeon/radeon_pm.c
> +++ b/drivers/gpu/drm/radeon/radeon_pm.c
> @@ -388,7 +388,8 @@ static ssize_t radeon_get_pm_method(struct device *dev,
>  	int pm = rdev->pm.pm_method;
>  
>  	return snprintf(buf, PAGE_SIZE, "%s\n",
> -			(pm == PM_METHOD_DYNPM) ? "dynpm" : "profile");
> +			(pm == PM_METHOD_DYNPM) ? "dynpm" :
> +			(pm == PM_METHOD_PROFILE) ? "profile" : "dpm");
>  }
>  
>  static ssize_t radeon_set_pm_method(struct device *dev,
> @@ -399,6 +400,11 @@ static ssize_t radeon_set_pm_method(struct device *dev,
>  	struct drm_device *ddev = pci_get_drvdata(to_pci_dev(dev));
>  	struct radeon_device *rdev = ddev->dev_private;
>  
> +	/* we don't support the legacy modes with dpm */
> +	if (rdev->pm.pm_method == PM_METHOD_DPM) {
> +		count = -EINVAL;
> +		goto fail;
> +	}
>  
>  	if (strncmp("dynpm", buf, strlen("dynpm")) == 0) {
>  		mutex_lock(&rdev->pm.mutex);
> @@ -423,8 +429,48 @@ fail:
>  	return count;
>  }
>  
> +static ssize_t radeon_get_dpm_state(struct device *dev,
> +				    struct device_attribute *attr,
> +				    char *buf)
> +{
> +	struct drm_device *ddev = pci_get_drvdata(to_pci_dev(dev));
> +	struct radeon_device *rdev = ddev->dev_private;
> +	enum radeon_pm_state_type pm = rdev->pm.dpm.user_state;
> +
> +	return snprintf(buf, PAGE_SIZE, "%s\n",
> +			(pm == POWER_STATE_TYPE_BATTERY) ? "battery" :
> +			(pm == POWER_STATE_TYPE_BALANCED) ? "balanced" : "performance");
> +}
> +
> +static ssize_t radeon_set_dpm_state(struct device *dev,
> +				    struct device_attribute *attr,
> +				    const char *buf,
> +				    size_t count)
> +{
> +	struct drm_device *ddev = pci_get_drvdata(to_pci_dev(dev));
> +	struct radeon_device *rdev = ddev->dev_private;
> +
> +	mutex_lock(&rdev->pm.mutex);
> +	if (strncmp("battery", buf, strlen("battery")) == 0)
> +		rdev->pm.dpm.user_state = POWER_STATE_TYPE_BATTERY;
> +	else if (strncmp("balanced", buf, strlen("balanced")) == 0)
> +		rdev->pm.dpm.user_state = POWER_STATE_TYPE_BALANCED;
> +	else if (strncmp("performance", buf, strlen("performance")) == 0)
> +		rdev->pm.dpm.user_state = POWER_STATE_TYPE_PERFORMANCE;
> +	else {
> +		mutex_unlock(&rdev->pm.mutex);
> +		count = -EINVAL;
> +		goto fail;
> +	}
> +	mutex_unlock(&rdev->pm.mutex);
> +	radeon_pm_compute_clocks(rdev);
> +fail:
> +	return count;
> +}
> +
>  static DEVICE_ATTR(power_profile, S_IRUGO | S_IWUSR, radeon_get_pm_profile, radeon_set_pm_profile);
>  static DEVICE_ATTR(power_method, S_IRUGO | S_IWUSR, radeon_get_pm_method, radeon_set_pm_method);
> +static DEVICE_ATTR(power_dpm_state, S_IRUGO | S_IWUSR, radeon_get_dpm_state, radeon_set_dpm_state);
>  
>  static ssize_t radeon_hwmon_show_temp(struct device *dev,
>  				      struct device_attribute *attr,
> @@ -508,7 +554,228 @@ static void radeon_hwmon_fini(struct radeon_device *rdev)
>  	}
>  }
>  
> -void radeon_pm_suspend(struct radeon_device *rdev)
> +static void radeon_dpm_thermal_work_handler(struct work_struct *work)
> +{
> +	struct radeon_device *rdev =
> +		container_of(work, struct radeon_device,
> +			     pm.dpm.thermal.work);
> +	/* switch to the thermal state */
> +	enum radeon_pm_state_type dpm_state = POWER_STATE_TYPE_INTERNAL_THERMAL;
> +
> +	if (!rdev->pm.dpm_enabled)
> +		return;
> +
> +	if (rdev->asic->pm.get_temperature) {
> +		int temp = radeon_get_temperature(rdev);
> +
> +		if (temp < rdev->pm.dpm.thermal.min_temp)
> +			/* switch back the user state */
> +			dpm_state = rdev->pm.dpm.user_state;
> +	} else {
> +		if (rdev->pm.dpm.thermal.high_to_low)
> +			/* switch back the user state */
> +			dpm_state = rdev->pm.dpm.user_state;
> +	}
> +	radeon_dpm_enable_power_state(rdev, dpm_state);
> +}
> +
> +static struct radeon_ps *radeon_dpm_pick_power_state(struct radeon_device *rdev,
> +						     enum radeon_pm_state_type dpm_state)
> +{
> +	int i;
> +	struct radeon_ps *ps;
> +	u32 ui_class;
> +
> +restart_search:
> +	/* balanced states don't exist at the moment */
> +	if (dpm_state == POWER_STATE_TYPE_BALANCED)
> +		dpm_state = POWER_STATE_TYPE_PERFORMANCE;
> +
> +	/* Pick the best power state based on current conditions */
> +	for (i = 0; i < rdev->pm.dpm.num_ps; i++) {
> +		ps = &rdev->pm.dpm.ps[i];
> +		ui_class = ps->class & ATOM_PPLIB_CLASSIFICATION_UI_MASK;
> +		switch (dpm_state) {
> +		/* user states */
> +		case POWER_STATE_TYPE_BATTERY:
> +			if (ui_class == ATOM_PPLIB_CLASSIFICATION_UI_BATTERY) {
> +				if (ps->caps & ATOM_PPLIB_SINGLE_DISPLAY_ONLY) {
> +					if (rdev->pm.dpm.new_active_crtc_count < 2)
> +						return ps;
> +				} else
> +					return ps;
> +			}
> +			break;
> +		case POWER_STATE_TYPE_BALANCED:
> +			if (ui_class == ATOM_PPLIB_CLASSIFICATION_UI_BALANCED) {
> +				if (ps->caps & ATOM_PPLIB_SINGLE_DISPLAY_ONLY) {
> +					if (rdev->pm.dpm.new_active_crtc_count < 2)
> +						return ps;
> +				} else
> +					return ps;
> +			}
> +			break;
> +		case POWER_STATE_TYPE_PERFORMANCE:
> +			if (ui_class == ATOM_PPLIB_CLASSIFICATION_UI_PERFORMANCE) {
> +				if (ps->caps & ATOM_PPLIB_SINGLE_DISPLAY_ONLY) {
> +					if (rdev->pm.dpm.new_active_crtc_count < 2)
> +						return ps;
> +				} else
> +					return ps;
> +			}
> +			break;
> +		/* internal states */
> +		case POWER_STATE_TYPE_INTERNAL_UVD:
> +			return rdev->pm.dpm.uvd_ps;
> +		case POWER_STATE_TYPE_INTERNAL_UVD_SD:
> +			if (ps->class & ATOM_PPLIB_CLASSIFICATION_SDSTATE)
> +				return ps;
> +			break;
> +		case POWER_STATE_TYPE_INTERNAL_UVD_HD:
> +			if (ps->class & ATOM_PPLIB_CLASSIFICATION_HDSTATE)
> +				return ps;
> +			break;
> +		case POWER_STATE_TYPE_INTERNAL_UVD_HD2:
> +			if (ps->class & ATOM_PPLIB_CLASSIFICATION_HD2STATE)
> +				return ps;
> +			break;
> +		case POWER_STATE_TYPE_INTERNAL_UVD_MVC:
> +			if (ps->class2 & ATOM_PPLIB_CLASSIFICATION2_MVC)
> +				return ps;
> +			break;
> +		case POWER_STATE_TYPE_INTERNAL_BOOT:
> +			return rdev->pm.dpm.boot_ps;
> +		case POWER_STATE_TYPE_INTERNAL_THERMAL:
> +			if (ps->class & ATOM_PPLIB_CLASSIFICATION_THERMAL)
> +				return ps;
> +			break;
> +		case POWER_STATE_TYPE_INTERNAL_ACPI:
> +			if (ps->class & ATOM_PPLIB_CLASSIFICATION_ACPI)
> +				return ps;
> +			break;
> +		case POWER_STATE_TYPE_INTERNAL_ULV:
> +			if (ps->class2 & ATOM_PPLIB_CLASSIFICATION2_ULV)
> +				return ps;
> +			break;
> +		default:
> +			break;
> +		}
> +	}
> +	/* use a fallback state if we didn't match */
> +	switch (dpm_state) {
> +	case POWER_STATE_TYPE_INTERNAL_UVD_SD:
> +	case POWER_STATE_TYPE_INTERNAL_UVD_HD:
> +	case POWER_STATE_TYPE_INTERNAL_UVD_HD2:
> +	case POWER_STATE_TYPE_INTERNAL_UVD_MVC:
> +		return rdev->pm.dpm.uvd_ps;
> +	case POWER_STATE_TYPE_INTERNAL_THERMAL:
> +		dpm_state = POWER_STATE_TYPE_INTERNAL_ACPI;
> +		goto restart_search;
> +	case POWER_STATE_TYPE_INTERNAL_ACPI:
> +		dpm_state = POWER_STATE_TYPE_BATTERY;
> +		goto restart_search;
> +	case POWER_STATE_TYPE_BATTERY:
> +		dpm_state = POWER_STATE_TYPE_PERFORMANCE;
> +		goto restart_search;
> +	default:
> +		break;
> +	}
> +
> +	return NULL;
> +}
> +
> +static void radeon_dpm_change_power_state_locked(struct radeon_device *rdev)
> +{
> +	int i;
> +	struct radeon_ps *ps;
> +	enum radeon_pm_state_type dpm_state;
> +
> +	/* if dpm init failed */
> +	if (!rdev->pm.dpm_enabled)
> +		return;
> +
> +	if (rdev->pm.dpm.user_state != rdev->pm.dpm.state) {
> +		/* add other state override checks here */
> +		if (!rdev->pm.dpm.thermal_active)
> +			rdev->pm.dpm.state = rdev->pm.dpm.user_state;
> +	}
> +	dpm_state = rdev->pm.dpm.state;
> +
> +	ps = radeon_dpm_pick_power_state(rdev, dpm_state);
> +	if (ps)
> +		rdev->pm.dpm.requested_ps = ps;
> +	else
> +		return;
> +
> +	/* no need to reprogram if nothing changed */
> +	if (rdev->pm.dpm.current_ps == rdev->pm.dpm.requested_ps) {
> +		/* update display watermarks based on new power state */
> +		if (rdev->pm.dpm.new_active_crtcs != rdev->pm.dpm.current_active_crtcs) {
> +			radeon_bandwidth_update(rdev);
> +			/* update displays */
> +			radeon_dpm_display_configuration_changed(rdev);
> +			rdev->pm.dpm.current_active_crtcs = rdev->pm.dpm.new_active_crtcs;
> +			rdev->pm.dpm.current_active_crtc_count = rdev->pm.dpm.new_active_crtc_count;
> +		}
> +		return;
> +	}
> +
> +	printk("switching from power state:\n");
> +	radeon_dpm_print_power_state(rdev, rdev->pm.dpm.current_ps);
> +	printk("switching to power state:\n");
> +	radeon_dpm_print_power_state(rdev, rdev->pm.dpm.requested_ps);
> +
> +	mutex_lock(&rdev->ddev->struct_mutex);
> +	down_write(&rdev->pm.mclk_lock);
> +	mutex_lock(&rdev->ring_lock);
> +
> +	/* update display watermarks based on new power state */
> +	radeon_bandwidth_update(rdev);
> +	/* update displays */
> +	radeon_dpm_display_configuration_changed(rdev);
> +
> +	rdev->pm.dpm.current_active_crtcs = rdev->pm.dpm.new_active_crtcs;
> +	rdev->pm.dpm.current_active_crtc_count = rdev->pm.dpm.new_active_crtc_count;
> +
> +	/* wait for the rings to drain */
> +	for (i = 0; i < RADEON_NUM_RINGS; i++) {
> +		struct radeon_ring *ring = &rdev->ring[i];
> +		if (ring->ready)
> +			radeon_fence_wait_empty_locked(rdev, i);
> +	}
> +
> +	/* program the new power state */
> +	radeon_dpm_set_power_state(rdev);
> +
> +	/* update current power state */
> +	rdev->pm.dpm.current_ps = rdev->pm.dpm.requested_ps;
> +
> +	mutex_unlock(&rdev->ring_lock);
> +	up_write(&rdev->pm.mclk_lock);
> +	mutex_unlock(&rdev->ddev->struct_mutex);
> +}
> +
> +void radeon_dpm_enable_power_state(struct radeon_device *rdev,
> +				   enum radeon_pm_state_type dpm_state)
> +{
> +	if (!rdev->pm.dpm_enabled)
> +		return;
> +
> +	mutex_lock(&rdev->pm.mutex);
> +	switch (dpm_state) {
> +	case POWER_STATE_TYPE_INTERNAL_THERMAL:
> +		rdev->pm.dpm.thermal_active = true;
> +		break;
> +	default:
> +		rdev->pm.dpm.thermal_active = false;
> +		break;
> +	}
> +	rdev->pm.dpm.state = dpm_state;
> +	mutex_unlock(&rdev->pm.mutex);
> +	radeon_pm_compute_clocks(rdev);
> +}
> +
> +static void radeon_pm_suspend_old(struct radeon_device *rdev)
>  {
>  	mutex_lock(&rdev->pm.mutex);
>  	if (rdev->pm.pm_method == PM_METHOD_DYNPM) {
> @@ -520,7 +787,26 @@ void radeon_pm_suspend(struct radeon_device *rdev)
>  	cancel_delayed_work_sync(&rdev->pm.dynpm_idle_work);
>  }
>  
> -void radeon_pm_resume(struct radeon_device *rdev)
> +static void radeon_pm_suspend_dpm(struct radeon_device *rdev)
> +{
> +	mutex_lock(&rdev->pm.mutex);
> +	/* disable dpm */
> +	radeon_dpm_disable(rdev);
> +	/* reset the power state */
> +	rdev->pm.dpm.current_ps = rdev->pm.dpm.requested_ps = rdev->pm.dpm.boot_ps;
> +	rdev->pm.dpm_enabled = false;
> +	mutex_unlock(&rdev->pm.mutex);
> +}
> +
> +void radeon_pm_suspend(struct radeon_device *rdev)
> +{
> +	if (rdev->pm.pm_method == PM_METHOD_DPM)
> +		radeon_pm_suspend_dpm(rdev);
> +	else
> +		radeon_pm_suspend_old(rdev);
> +}
> +
> +static void radeon_pm_resume_old(struct radeon_device *rdev)
>  {
>  	/* set up the default clocks if the MC ucode is loaded */
>  	if ((rdev->family >= CHIP_BARTS) &&
> @@ -555,12 +841,50 @@ void radeon_pm_resume(struct radeon_device *rdev)
>  	radeon_pm_compute_clocks(rdev);
>  }
>  
> -int radeon_pm_init(struct radeon_device *rdev)
> +static void radeon_pm_resume_dpm(struct radeon_device *rdev)
> +{
> +	int ret;
> +
> +	/* asic init will reset to the boot state */
> +	mutex_lock(&rdev->pm.mutex);
> +	rdev->pm.dpm.current_ps = rdev->pm.dpm.requested_ps = rdev->pm.dpm.boot_ps;
> +	radeon_dpm_setup_asic(rdev);
> +	ret = radeon_dpm_enable(rdev);
> +	mutex_unlock(&rdev->pm.mutex);
> +	if (ret) {
> +		DRM_ERROR("radeon: dpm resume failed\n");
> +		if ((rdev->family >= CHIP_BARTS) &&
> +		    (rdev->family <= CHIP_CAYMAN) &&
> +		    rdev->mc_fw) {
> +			if (rdev->pm.default_vddc)
> +				radeon_atom_set_voltage(rdev, rdev->pm.default_vddc,
> +							SET_VOLTAGE_TYPE_ASIC_VDDC);
> +			if (rdev->pm.default_vddci)
> +				radeon_atom_set_voltage(rdev, rdev->pm.default_vddci,
> +							SET_VOLTAGE_TYPE_ASIC_VDDCI);
> +			if (rdev->pm.default_sclk)
> +				radeon_set_engine_clock(rdev, rdev->pm.default_sclk);
> +			if (rdev->pm.default_mclk)
> +				radeon_set_memory_clock(rdev, rdev->pm.default_mclk);
> +		}
> +	} else {
> +		rdev->pm.dpm_enabled = true;
> +		radeon_pm_compute_clocks(rdev);
> +	}
> +}
> +
> +void radeon_pm_resume(struct radeon_device *rdev)
> +{
> +	if (rdev->pm.pm_method == PM_METHOD_DPM)
> +		radeon_pm_resume_dpm(rdev);
> +	else
> +		radeon_pm_resume_old(rdev);
> +}
> +
> +static int radeon_pm_init_old(struct radeon_device *rdev)
>  {
>  	int ret;
>  
> -	/* default to profile method */
> -	rdev->pm.pm_method = PM_METHOD_PROFILE;
>  	rdev->pm.profile = PM_PROFILE_DEFAULT;
>  	rdev->pm.dynpm_state = DYNPM_STATE_DISABLED;
>  	rdev->pm.dynpm_planned_action = DYNPM_ACTION_NONE;
> @@ -622,7 +946,103 @@ int radeon_pm_init(struct radeon_device *rdev)
>  	return 0;
>  }
>  
> -void radeon_pm_fini(struct radeon_device *rdev)
> +static void radeon_dpm_print_power_states(struct radeon_device *rdev)
> +{
> +	int i;
> +
> +	for (i = 0; i < rdev->pm.dpm.num_ps; i++) {
> +		printk("== power state %d ==\n", i);
> +		radeon_dpm_print_power_state(rdev, &rdev->pm.dpm.ps[i]);
> +	}
> +}
> +
> +static int radeon_pm_init_dpm(struct radeon_device *rdev)
> +{
> +	int ret;
> +
> +	/* default to performance state */
> +	rdev->pm.dpm.state = POWER_STATE_TYPE_PERFORMANCE;
> +	rdev->pm.dpm.user_state = POWER_STATE_TYPE_PERFORMANCE;
> +	rdev->pm.default_sclk = rdev->clock.default_sclk;
> +	rdev->pm.default_mclk = rdev->clock.default_mclk;
> +	rdev->pm.current_sclk = rdev->clock.default_sclk;
> +	rdev->pm.current_mclk = rdev->clock.default_mclk;
> +	rdev->pm.int_thermal_type = THERMAL_TYPE_NONE;
> +
> +	if (rdev->bios && rdev->is_atom_bios)
> +		radeon_atombios_get_power_modes(rdev);
> +	else
> +		return -EINVAL;
> +
> +	/* set up the internal thermal sensor if applicable */
> +	ret = radeon_hwmon_init(rdev);
> +	if (ret)
> +		return ret;
> +
> +	INIT_WORK(&rdev->pm.dpm.thermal.work, radeon_dpm_thermal_work_handler);
> +	mutex_lock(&rdev->pm.mutex);
> +	radeon_dpm_init(rdev);
> +	rdev->pm.dpm.current_ps = rdev->pm.dpm.requested_ps = rdev->pm.dpm.boot_ps;
> +	radeon_dpm_print_power_states(rdev);
> +	radeon_dpm_setup_asic(rdev);
> +	ret = radeon_dpm_enable(rdev);
> +	mutex_unlock(&rdev->pm.mutex);
> +	if (ret) {
> +		rdev->pm.dpm_enabled = false;
> +		if ((rdev->family >= CHIP_BARTS) &&
> +		    (rdev->family <= CHIP_CAYMAN) &&
> +		    rdev->mc_fw) {
> +			if (rdev->pm.default_vddc)
> +				radeon_atom_set_voltage(rdev, rdev->pm.default_vddc,
> +							SET_VOLTAGE_TYPE_ASIC_VDDC);
> +			if (rdev->pm.default_vddci)
> +				radeon_atom_set_voltage(rdev, rdev->pm.default_vddci,
> +							SET_VOLTAGE_TYPE_ASIC_VDDCI);
> +			if (rdev->pm.default_sclk)
> +				radeon_set_engine_clock(rdev, rdev->pm.default_sclk);
> +			if (rdev->pm.default_mclk)
> +				radeon_set_memory_clock(rdev, rdev->pm.default_mclk);
> +		}
> +		DRM_ERROR("radeon: dpm initialization failed\n");
> +		return ret;
> +	}
> +	rdev->pm.dpm_enabled = true;
> +	radeon_pm_compute_clocks(rdev);
> +
> +	if (rdev->pm.num_power_states > 1) {
> +		ret = device_create_file(rdev->dev, &dev_attr_power_dpm_state);
> +		if (ret)
> +			DRM_ERROR("failed to create device file for dpm state\n");
> +		/* XXX: these are noops for dpm but are here for backwards compat */
> +		ret = device_create_file(rdev->dev, &dev_attr_power_profile);
> +		if (ret)
> +			DRM_ERROR("failed to create device file for power profile\n");
> +		ret = device_create_file(rdev->dev, &dev_attr_power_method);
> +		if (ret)
> +			DRM_ERROR("failed to create device file for power method\n");
> +		DRM_INFO("radeon: dpm initialized\n");
> +	}
> +
> +	return 0;
> +}
> +
> +int radeon_pm_init(struct radeon_device *rdev)
> +{
> +	/* enable dpm on rv6xx+ */
> +	switch (rdev->family) {
> +	default:
> +		/* default to profile method */
> +		rdev->pm.pm_method = PM_METHOD_PROFILE;
> +		break;
> +	}
> +
> +	if (rdev->pm.pm_method == PM_METHOD_DPM)
> +		return radeon_pm_init_dpm(rdev);
> +	else
> +		return radeon_pm_init_old(rdev);
> +}
> +
> +static void radeon_pm_fini_old(struct radeon_device *rdev)
>  {
>  	if (rdev->pm.num_power_states > 1) {
>  		mutex_lock(&rdev->pm.mutex);
> @@ -650,7 +1070,35 @@ void radeon_pm_fini(struct radeon_device *rdev)
>  	radeon_hwmon_fini(rdev);
>  }
>  
> -void radeon_pm_compute_clocks(struct radeon_device *rdev)
> +static void radeon_pm_fini_dpm(struct radeon_device *rdev)
> +{
> +	if (rdev->pm.num_power_states > 1) {
> +		mutex_lock(&rdev->pm.mutex);
> +		radeon_dpm_disable(rdev);
> +		mutex_unlock(&rdev->pm.mutex);
> +
> +		device_remove_file(rdev->dev, &dev_attr_power_dpm_state);
> +		/* XXX backwards compat */
> +		device_remove_file(rdev->dev, &dev_attr_power_profile);
> +		device_remove_file(rdev->dev, &dev_attr_power_method);
> +	}
> +	radeon_dpm_fini(rdev);
> +
> +	if (rdev->pm.power_state)
> +		kfree(rdev->pm.power_state);
> +
> +	radeon_hwmon_fini(rdev);
> +}
> +
> +void radeon_pm_fini(struct radeon_device *rdev)
> +{
> +	if (rdev->pm.pm_method == PM_METHOD_DPM)
> +		radeon_pm_fini_dpm(rdev);
> +	else
> +		radeon_pm_fini_old(rdev);
> +}
> +
> +static void radeon_pm_compute_clocks_old(struct radeon_device *rdev)
>  {
>  	struct drm_device *ddev = rdev->ddev;
>  	struct drm_crtc *crtc;
> @@ -721,6 +1169,38 @@ void radeon_pm_compute_clocks(struct radeon_device *rdev)
>  	mutex_unlock(&rdev->pm.mutex);
>  }
>  
> +static void radeon_pm_compute_clocks_dpm(struct radeon_device *rdev)
> +{
> +	struct drm_device *ddev = rdev->ddev;
> +	struct drm_crtc *crtc;
> +	struct radeon_crtc *radeon_crtc;
> +
> +	mutex_lock(&rdev->pm.mutex);
> +
> +	rdev->pm.dpm.new_active_crtcs = 0;
> +	rdev->pm.dpm.new_active_crtc_count = 0;
> +	list_for_each_entry(crtc,
> +		&ddev->mode_config.crtc_list, head) {
> +		radeon_crtc = to_radeon_crtc(crtc);
> +		if (crtc->enabled) {
> +			rdev->pm.dpm.new_active_crtcs |= (1 << radeon_crtc->crtc_id);
> +			rdev->pm.dpm.new_active_crtc_count++;
> +		}
> +	}
> +
> +	radeon_dpm_change_power_state_locked(rdev);
> +
> +	mutex_unlock(&rdev->pm.mutex);
> +}
> +
> +void radeon_pm_compute_clocks(struct radeon_device *rdev)
> +{
> +	if (rdev->pm.pm_method == PM_METHOD_DPM)
> +		radeon_pm_compute_clocks_dpm(rdev);
> +	else
> +		radeon_pm_compute_clocks_old(rdev);
> +}
> +
>  static bool radeon_pm_in_vbl(struct radeon_device *rdev)
>  {
>  	int  crtc, vpos, hpos, vbl_status;
> -- 
> 1.7.7.5
> 
> _______________________________________________
> dri-devel mailing list
> dri-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel

  reply	other threads:[~2013-06-26 15:32 UTC|newest]

Thread overview: 142+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-06-26 13:21 [PATCH 000/165] radeon drm-next patches alexdeucher
2013-06-26 12:55 ` Jerome Glisse
2013-06-26 13:21 ` [PATCH 001/165] drm/radeon: fix AVI infoframe generation alexdeucher
2013-06-26 13:21 ` [PATCH 002/165] drm/radeon: add backlight quirk for hybrid mac alexdeucher
2013-06-26 13:21 ` [PATCH 003/165] drm/radeon: add a reset work handler alexdeucher
2013-06-26 13:21 ` [PATCH 004/165] drm/radeon: add CIK chip families alexdeucher
2013-06-26 13:21 ` [PATCH 005/165] drm/radeon: add DCE8 macro for CIK alexdeucher
2013-06-26 13:21 ` [PATCH 006/165] drm/radeon: adapt to PCI BAR changes on CIK alexdeucher
2013-06-26 13:21 ` [PATCH 007/165] drm/radeon: add gpu init support for CIK (v9) alexdeucher
2013-06-26 13:21 ` [PATCH 008/165] drm/radeon: Add support for CIK GPU reset (v2) alexdeucher
2013-06-26 13:21 ` [PATCH 009/165] drm/radeon: add support for MC/VM setup on CIK (v6) alexdeucher
2013-06-26 13:21 ` [PATCH 010/165] drm/radeon/cik: stop page faults from hanging the system (v2) alexdeucher
2013-06-26 13:21 ` [PATCH 011/165] drm/radeon: add initial ucode loading for CIK (v5) alexdeucher
2013-06-26 13:21 ` [PATCH 012/165] drm/radeon: add support mc ucode loading on CIK (v2) alexdeucher
2013-06-26 13:21 ` [PATCH 013/165] drm/radeon: Add CP init for CIK (v7) alexdeucher
2013-06-26 13:21 ` [PATCH 014/165] drm/radeon: add IB and fence dispatch functions for CIK gfx (v7) alexdeucher
2013-06-26 13:21 ` [PATCH 015/165] drm/radeon: add ring and IB tests for CIK (v3) alexdeucher
2013-06-26 13:21 ` [PATCH 016/165] drm/radeon: implement async vm_flush for the CP (v7) alexdeucher
2013-06-26 13:21 ` [PATCH 017/165] drm/radeon: Add support for RLC init on CIK (v4) alexdeucher
2013-06-26 13:21 ` [PATCH 018/165] drm/radeon: add support for interrupts on CIK (v5) alexdeucher
2013-06-26 13:21 ` [PATCH 019/165] drm/radeon/cik: log and handle VM page fault interrupts alexdeucher
2013-06-26 13:21 ` [PATCH 020/165] drm/radeon/cik: add support for sDMA dma engines (v8) alexdeucher
2013-06-26 13:21 ` [PATCH 021/165] drm/radeon: implement async vm_flush for the sDMA (v6) alexdeucher
2013-06-26 13:21 ` [PATCH 022/165] drm/radeon/cik: add support for doing async VM pt updates (v5) alexdeucher
2013-06-26 13:21 ` [PATCH 023/165] drm/radeon/cik: fill in startup/shutdown callbacks (v4) alexdeucher
2013-06-26 15:03   ` Christian König
2013-06-26 13:21 ` [PATCH 024/165] drm/radeon: upstream ObjectID.h updates (v2) alexdeucher
2013-06-26 13:21 ` [PATCH 025/165] drm/radeon: upstream atombios.h " alexdeucher
2013-06-26 13:21 ` [PATCH 026/165] drm/radeon: atombios power table " alexdeucher
2013-06-26 13:21 ` [PATCH 027/165] drm/radeon: handle the integrated thermal controller on CI alexdeucher
2013-06-26 13:21 ` [PATCH 028/165] drm/radeon: update power state parsing for CI alexdeucher
2013-06-26 13:21 ` [PATCH 029/165] drm/radeon/dce8: add support for display watermark setup alexdeucher
2013-06-26 13:21 ` [PATCH 030/165] drm/radeon/cik: add hw cursor support (v2) alexdeucher
2013-06-26 13:21 ` [PATCH 031/165] drm/radeon/dce8: properly handle interlaced timing alexdeucher
2013-06-26 13:21 ` [PATCH 032/165] drm/radeon/dce8: crtc_set_base updates alexdeucher
2013-06-26 13:21 ` [PATCH 033/165] drm/radeon/atom: add DCE8 encoder support alexdeucher
2013-06-26 13:21 ` [PATCH 034/165] drm/radeon/atom: add support for new DVO tables alexdeucher
2013-06-26 13:21 ` [PATCH 035/165] drm/radeon: update DISPCLK programming for DCE8 alexdeucher
2013-06-26 13:21 ` [PATCH 036/165] drm/radeon: add support pll selection for DCE8 (v4) alexdeucher
2013-06-26 13:21 ` [PATCH 037/165] drm/radeon: Handle PPLL0 powerdown on DCE8 alexdeucher
2013-06-26 13:21 ` [PATCH 038/165] drm/radeon: use frac fb div " alexdeucher
2013-06-26 13:21 ` [PATCH 039/165] drm/radeon: add SS override support for KB/KV alexdeucher
2013-06-26 13:22 ` [PATCH 040/165] drm/radeon: Update radeon_info_ioctl for CIK (v2) alexdeucher
2013-06-26 13:22 ` [PATCH 041/165] drm/radeon: add get_gpu_clock_counter() callback for cik alexdeucher
2013-06-26 13:22 ` [PATCH 042/165] drm/radeon: update CIK soft reset alexdeucher
2013-06-26 13:22 ` [PATCH 043/165] drm/radeon: add indirect register accessors for SMC registers alexdeucher
2013-06-26 13:22 ` [PATCH 044/165] drm/radeon: add get_xclk() callback for CIK alexdeucher
2013-06-26 13:22 ` [PATCH 045/165] drm/radeon/cik: add pcie_port indirect register accessors alexdeucher
2013-06-26 13:22 ` [PATCH 046/165] drm/radeon: update radeon_atom_get_clock_dividers() for SI alexdeucher
2013-06-26 13:22 ` [PATCH 047/165] drm/radeon: update radeon_atom_get_clock_dividers for CIK alexdeucher
2013-06-26 13:22 ` [PATCH 048/165] drm/radeon: add UVD support for CIK (v3) alexdeucher
2013-06-26 13:22 ` [PATCH 049/165] drm/radeon/cik: add srbm_select function alexdeucher
2013-06-26 13:22 ` [PATCH 050/165] drm/radeon: use callbacks for ring pointer handling alexdeucher
2013-06-26 15:31   ` Christian König
2013-06-26 13:22 ` [PATCH 051/165] drm/radeon: implement simple doorbell page allocator alexdeucher
2013-06-26 12:57   ` Jerome Glisse
2013-06-26 18:38     ` Alex Deucher
2013-06-26 13:22 ` [PATCH 052/165] drm/radeon/cik: Add support for compute queues (v2) alexdeucher
2013-06-26 10:08   ` Jerome Glisse
2013-06-26 13:22 ` [PATCH 053/165] drm/radeon/cik: switch to type3 nop packet for compute rings alexdeucher
2013-06-26 10:10   ` Jerome Glisse
2013-06-26 13:22 ` [PATCH 054/165] drm/radeon: fix up ring functions " alexdeucher
2013-06-26 13:22 ` [PATCH 055/165] drm/radeon/cik: add support for compute interrupts alexdeucher
2013-06-26 13:22 ` [PATCH 056/165] drm/radeon/cik: add support for golden register init alexdeucher
2013-06-26 13:22 ` [PATCH 057/165] drm/radeon: add radeon_asic struct for CIK (v11) alexdeucher
2013-06-26 13:22 ` [PATCH 058/165] drm/radeon: add cik tile mode array query alexdeucher
2013-06-26 13:22 ` [PATCH 059/165] drm/radeon: add current Bonaire PCI ids alexdeucher
2013-06-26 13:22 ` [PATCH 060/165] drm/radeon: add current KB pci ids alexdeucher
2013-06-26 13:22 ` [PATCH 061/165] drm/radeon/kms: add accessors for RCU indirect space alexdeucher
2013-06-26 13:22 ` [PATCH 062/165] drm/radeon/evergreen: add indirect register accessors for CG registers alexdeucher
2013-06-26 13:22 ` [PATCH 063/165] drm/radeon: make get_temperature functions a callback alexdeucher
2013-06-26 13:22 ` [PATCH 064/165] drm/radeon: add support for thermal sensor on tn alexdeucher
2013-06-26 13:22 ` [PATCH 065/165] drm/radeon/kms: move ucode defines to a separate header alexdeucher
2013-06-26 13:22 ` [PATCH 066/165] drm/radeon: properly set up the RLC on ON/LN/TN (v3) alexdeucher
2013-06-26 13:22 ` [PATCH 067/165] drm/radeon/kms: add atom helper functions for dpm (v3) alexdeucher
2013-06-26 13:22 ` [PATCH 068/165] drm/radeon/kms: add new asic struct for rv6xx (v3) alexdeucher
2013-06-26 13:22 ` [PATCH 069/165] drm/radeon/kms: add common dpm infrastructure alexdeucher
2013-06-26 10:27   ` Jerome Glisse [this message]
2013-06-27 13:52   ` K. Schnass
2013-06-26 13:22 ` [PATCH 070/165] drm/radeon/kms: fix up rs780/rs880 display watermark calc for dpm alexdeucher
2013-06-26 13:22 ` [PATCH 071/165] drm/radeon/kms: fix up 6xx/7xx " alexdeucher
2013-06-26 13:22 ` [PATCH 072/165] drm/radeon/kms: fix up dce4/5 " alexdeucher
2013-06-26 13:22 ` [PATCH 073/165] drm/radeon/kms: fix up dce6 " alexdeucher
2013-06-26 13:22 ` [PATCH 074/165] drm/radeon/kms: add common r600 dpm functions alexdeucher
2013-06-26 13:22 ` [PATCH 075/165] drm/radeon/kms: add dpm support for rs780/rs880 alexdeucher
2013-06-26 10:46   ` Jerome Glisse
2013-06-26 18:19     ` Alex Deucher
2013-06-26 13:18       ` Jerome Glisse
2013-06-26 18:41         ` Alex Deucher
2013-06-26 13:22 ` [PATCH 076/165] drm/radeon/kms: add dpm support for rv6xx alexdeucher
2013-06-26 16:45   ` Christian König
2013-06-26 13:22 ` [PATCH 077/165] drm/radeon/kms: add dpm support for rv7xx (v2) alexdeucher
2013-06-26 13:22 ` [PATCH 078/165] drm/radeon/kms: add dpm support for evergreen (v2) alexdeucher
2013-06-26 13:22 ` [PATCH 079/165] drm/radeon/kms: add dpm support for btc (v2) alexdeucher
2013-06-26 13:22 ` [PATCH 080/165] drm/radeon/kms: add dpm support for sumo asics alexdeucher
2013-06-26 11:19   ` Jerome Glisse
2013-06-26 13:22 ` [PATCH 081/165] drm/radeon/kms: add dpm support for trinity asics alexdeucher
2013-06-26 13:22 ` [PATCH 082/165] drm/radeon/dpm: let atom control display phy powergating alexdeucher
2013-06-26 13:22 ` [PATCH 083/165] drm/radeon: add dpm UVD handling for r7xx asics alexdeucher
2013-06-26 13:22 ` [PATCH 084/165] drm/radeon: add dpm UVD handling for evergreen/btc asics alexdeucher
2013-06-26 13:22 ` [PATCH 085/165] drm/radeon: add dpm UVD handling for sumo asics alexdeucher
2013-06-26 13:22 ` [PATCH 086/165] drm/radeon: add dpm UVD handling for TN asics (v2) alexdeucher
2013-06-26 13:22 ` [PATCH 087/165] drm/radeon/kms: enable UVD as needed (v9) alexdeucher
2013-06-26 13:22 ` [PATCH 088/165] drm/radeon/dpm: add helpers for extended power tables (v2) alexdeucher
2013-06-26 13:22 ` [PATCH 089/165] drm/radeon/dpm: track whether we are on AC or battery alexdeucher
2013-06-26 13:22 ` [PATCH 090/165] drm/radeon/dpm: fixup dynamic state adjust for sumo alexdeucher
2013-06-26 13:22 ` [PATCH 091/165] drm/radeon/dpm: fixup dynamic state adjust for TN alexdeucher
2013-06-26 13:22 ` [PATCH 092/165] drm/radeon/dpm: fixup dynamic state adjust for btc (v2) alexdeucher
2013-06-26 13:22 ` [PATCH 093/165] drm/radeon/kms: add dpm support for cayman alexdeucher
2013-06-26 11:29   ` Jerome Glisse
2013-06-26 13:22 ` [PATCH 094/165] drm/radeon/cayman: update tdp limits in set_power_state alexdeucher
2013-06-26 13:22 ` [PATCH 095/165] drm/radeon/dpm/rs780: restructure code alexdeucher
2013-06-26 13:22 ` [PATCH 096/165] drm/radeon/dpm/rv6xx: " alexdeucher
2013-06-26 13:22 ` [PATCH 097/165] drm/radeon/dpm/rv7xx: " alexdeucher
2013-06-26 13:22 ` [PATCH 098/165] drm/radeon/dpm/evergreen: " alexdeucher
2013-06-26 13:22 ` [PATCH 099/165] drm/radeon/dpm/btc: " alexdeucher
2013-06-26 13:23 ` [PATCH 100/165] drm/radeon/dpm/cayman: " alexdeucher
2013-06-26 13:23 ` [PATCH 101/165] drm/radeon/dpm/sumo: " alexdeucher
2013-06-26 13:23 ` [PATCH 102/165] drm/radeon/dpm/tn: " alexdeucher
2013-06-26 13:23 ` [PATCH 103/165] drm/radeon/dpm: add new pre/post_set_power_state callbacks alexdeucher
2013-06-26 13:23 ` [PATCH 104/165] drm/radeon/dpm: add pre/post_set_power_state callbacks (6xx-eg) alexdeucher
2013-06-26 13:23 ` [PATCH 105/165] drm/radeon/dpm: add pre/post_set_power_state callback (sumo) alexdeucher
2013-06-26 13:23 ` [PATCH 106/165] drm/radeon/dpm: add pre/post_set_power_state callback (TN) alexdeucher
2013-06-26 13:23 ` [PATCH 107/165] drm/radeon/dpm: add pre/post_set_power_state callback (BTC) alexdeucher
2013-06-26 13:23 ` [PATCH 108/165] drm/radeon/dpm: add pre/post_set_power_state callback (cayman) alexdeucher
2013-06-26 13:23 ` [PATCH 109/165] drm/radeon/dpm: remove broken dyn state remnants alexdeucher
2013-06-26 13:23 ` [PATCH 110/165] drm/radeon: add missing UVD clock set in cayman dpm code alexdeucher
2013-06-26 13:23 ` [PATCH 111/165] drm/radeon/dpm: remove local sumo_get_xclk() alexdeucher
2013-06-26 21:57 ` [PATCH 000/165] radeon drm-next patches Julian Wollrath
2013-06-26 22:51   ` Julian Wollrath
2013-06-27 14:21     ` Jerome Glisse
2013-06-27 21:26       ` Julian Wollrath
2013-06-29 17:37   ` Grigori Goronzy
2013-06-26 22:23 ` Alex Deucher
2013-06-27 13:12   ` Andy Furniss
2013-06-27 14:55     ` Alex Deucher
2013-06-27 22:19       ` James Cloos
2013-06-27 22:52         ` Jerome Glisse
2013-06-27 23:55     ` Alex Deucher
2013-06-28 13:00       ` Laurent Carlier
2013-06-29  9:28       ` Andy Furniss
2013-06-29 10:23         ` Ilyes Gouta

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20130626102727.GC2480@gmail.com \
    --to=j.glisse@gmail.com \
    --cc=alexander.deucher@amd.com \
    --cc=alexdeucher@gmail.com \
    --cc=dri-devel@lists.freedesktop.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.