[ltp] Re: [PATCH 2/2] Thinkpad Suspend Powersave: Add D2 power saving code for Thinkpads with Radeon video chipsets

Benjamin Herrenschmidt linux-thinkpad@linux-thinkpad.org
Thu, 17 Mar 2005 10:19:04 +1100


On Wed, 2005-03-16 at 10:16 -0500, Theodore Y. Ts'o wrote:
> Force the Radeon video chipset on IBM Thinkpads to use the D2 state when
> suspending in order to save a much greater amount of power.
> 
> This patch is based on an earlier version by Volker Braun, but instead
> of using an explicit whitelist that would have to contain hundreds of
> entries, instead we enable going to the D2 state for IBM Thinkpads if a
> CONFIG_EXPERIMENTAL option (CONFIG_FB_RADEON_THINKPAD_PM) is enabled and
> use a black-list if necessary.
> 
> Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>

You probably want to remove the bit that does

	OUTREG(TV_DAC_CNTL, INREG(TV_DAC_CNTL) | 0x07000000);

Or you'll lose TV output :)

Ben.

> 
> Index: src/drivers/video/Kconfig
> ===================================================================
> --- src.orig/drivers/video/Kconfig	2005-03-14 12:40:48.000000000 -0500
> +++ src/drivers/video/Kconfig	2005-03-16 00:40:21.000000000 -0500
> @@ -711,6 +711,15 @@
>  	help
>  	  Say Y here if you want DDC/I2C support for your Radeon board. 
>  
> +config FB_RADEON_THINKPAD_PM
> +	bool "Video Power Management for Thinkpads (EXPERIMENTAL)"
> +	depends on PM && FB_RADEON && X86 && EXPERIMENTAL
> +	default n
> +	help
> +	  Say Y here if you want to force the Radeon video chipset on 
> +	  IBM Thinkpads to use the D2 state when suspending in order to
> +	  save a much greater amount of power.
> +
>  config FB_RADEON_DEBUG
>  	bool "Lots of debug output from Radeon driver"
>  	depends on FB_RADEON
> Index: src/drivers/video/aty/radeon_base.c
> ===================================================================
> --- src.orig/drivers/video/aty/radeon_base.c	2005-03-14 12:40:48.000000000 -0500
> +++ src/drivers/video/aty/radeon_base.c	2005-03-14 12:40:48.000000000 -0500
> @@ -273,6 +273,9 @@
>  #ifdef CONFIG_MTRR
>  static int nomtrr = 0;
>  #endif
> +#ifdef CONFIG_FB_RADEON_THINKPAD_PM
> +int radeon_force_sleep = 0;
> +#endif
>  
>  /*
>   * prototypes
> @@ -2535,6 +2538,10 @@
>  			force_measure_pll = 1;
>  		} else if (!strncmp(this_opt, "ignore_edid", 11)) {
>  			ignore_edid = 1;
> +#ifdef CONFIG_FB_RADEON_THINKPAD_PM
> +		} else if (!strncmp(this_opt, "force_sleep", 11)) {
> +			radeon_force_sleep = 1;
> +#endif
>  		} else
>  			mode_option = this_opt;
>  	}
> @@ -2574,3 +2581,7 @@
>  MODULE_PARM_DESC(panel_yres, "int: set panel yres");
>  module_param(mode_option, charp, 0);
>  MODULE_PARM_DESC(mode_option, "Specify resolution as \"<xres>x<yres>[-<bpp>][@<refresh>]\" ");
> +#ifdef CONFIG_FB_RADEON_THINKPAD_PM
> +module_param(radeon_force_sleep, int, 0);
> +MODULE_PARM_DESC(radeon_force_sleep, "bool: force ACPI sleep mode on untested machines");
> +#endif
> Index: src/drivers/video/aty/radeon_pm.c
> ===================================================================
> --- src.orig/drivers/video/aty/radeon_pm.c	2005-03-14 12:40:48.000000000 -0500
> +++ src/drivers/video/aty/radeon_pm.c	2005-03-14 12:40:48.000000000 -0500
> @@ -27,6 +27,27 @@
>  
>  #include "ati_ids.h"
>  
> +#ifdef CONFIG_FB_RADEON_THINKPAD_PM
> +#include <linux/dmi.h>
> +
> +static struct dmi_system_id __devinitdata radeonfb_dmi_table[] = {
> +	{
> +		.ident = "IBM ThinkPad",
> +		.matches = {
> +			DMI_MATCH(DMI_SYS_VENDOR, "IBM"),
> +			DMI_MATCH(DMI_PRODUCT_VERSION, "ThinkPad"),
> +		},
> +	},
> +	{ },
> +};
> +
> +static struct dmi_system_id __devinitdata radeonfb_dmi_blacklist[] = {
> +	{ },
> +};
> +
> +extern int radeon_force_sleep;
> +#endif
> +
>  void radeon_pm_disable_dynamic_mode(struct radeonfb_info *rinfo)
>  {
>  	u32 tmp;
> @@ -2750,6 +2771,30 @@
>  #endif
>  	}
>  #endif /* defined(CONFIG_PM) && defined(CONFIG_PPC_OF) */
> +
> +	/* The PM code also seems to work on many IBM ThinkPad models, 
> +	 * but of course Your Mileage May Vary.
> +	 */
> +#ifdef CONFIG_FB_RADEON_THINKPAD_PM
> +	if (radeon_force_sleep || 
> +	    (rinfo->is_mobility && rinfo->pm_reg &&
> +	     (rinfo->family <= CHIP_FAMILY_RV250) &&
> +	     dmi_check_system(radeonfb_dmi_table) && 
> +	     !dmi_check_system(radeonfb_dmi_blacklist))) {
> +		if (radeon_force_sleep)
> +			printk("radeonfb: forcefully enabling sleep mode\n");
> +		else
> +			printk("radeonfb: enabling sleep mode\n");
> +
> +		rinfo->pm_mode |= radeon_pm_d2;
> +
> +		/* Power down TV DAC, that saves a significant amount of power,
> +		 * we'll have something better once we actually have some TVOut
> +		 * support
> +		 */
> +		OUTREG(TV_DAC_CNTL, INREG(TV_DAC_CNTL) | 0x07000000);
> +	}
> +#endif /* CONFIG_FB_RADEON_THINKPAD_PM */
>  }
>  
>  void radeonfb_pm_exit(struct radeonfb_info *rinfo)
-- 
Benjamin Herrenschmidt <benh@kernel.crashing.org>