/[pkgs]/devel/kernel/drm-radeon-pm.patch
ViewVC logotype

Contents of /devel/kernel/drm-radeon-pm.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.2 - (show annotations) (download) (as text)
Tue Mar 3 21:06:24 2009 UTC (8 months, 3 weeks ago) by mjg59
Branch: MAIN
CVS Tags: kernel-2_6_31-0_94_rc4_fc12, kernel-2_6_30-0_72_rc3_git3_fc12, kernel-2_6_31-0_23_rc0_git18_fc12, kernel-2_6_31-0_174_rc7_git2_fc12, kernel-2_6_30-0_100_rc8_git6_fc12, kernel-2_6_29-0_200_rc7_fc11, kernel-2_6_30-1_fc12, kernel-2_6_29-0_258_2_2_rc8_git2_fc11, kernel-2_6_30-0_97_rc8_fc12, kernel-2_6_31-0_151_rc5_git3_fc12, kernel-2_6_31-0_69_rc3_fc12, kernel-2_6_32-0_24_rc4_git0_fc13, kernel-2_6_31-0_125_2_1_rc5_git2_fc12, kernel-2_6_31-0_112_rc4_git3_fc12, kernel-2_6_31-0_190_rc8_fc12, kernel-2_6_31-0_149_rc5_git3_fc12, kernel-2_6_31-0_125_rc5_git2_fc12, kernel-2_6_31-0_81_rc3_git4_fc12, kernel-2_6_30-0_91_rc7_git1_fc12, kernel-2_6_32-0_47_rc7_git1_fc13, kernel-2_6_30-0_81_rc5_git1_fc12, kernel-2_6_30-5_fc12, kernel-2_6_30-0_50_rc1_git2_fc12, kernel-2_6_31-0_67_rc2_git9_fc12, kernel-2_6_31-0_79_rc3_git4_fc12, kernel-2_6_31-0_11_rc0_git13_fc12, kernel-2_6_31-0_135_rc5_git3_fc12, kernel-2_6_31-0_123_rc5_git2_fc12, kernel-2_6_31-0_33_rc1_git2_fc12, kernel-2_6_29-0_266_rc8_git4_fc11, kernel-2_6_31-0_54_rc2_git2_fc12, kernel-2_6_31-0_142_rc5_git3_fc12, kernel-2_6_31-0_122_rc5_git2_fc12, kernel-2_6_31-0_121_rc5_fc12, kernel-2_6_31-0_125_4_1_rc5_git2_fc12, kernel-2_6_31-0_13_rc0_git14_fc12, kernel-2_6_31-0_80_rc3_git4_fc12, kernel-2_6_31-0_15_rc0_git14_fc12, kernel-2_6_29-0_197_rc7_fc11, kernel-2_6_31-0_28_rc1_fc12, kernel-2_6_29-0_279_rc8_git6_fc11, kernel-2_6_29-0_247_rc8_fc11, kernel-2_6_29-0_190_rc6_git6_fc11, kernel-2_6_32-0_14_rc0_git18_fc13, kernel-2_6_30-0_42_rc0_git15_fc12, kernel-2_6_29-0_258_rc8_git2_fc11, kernel-2_6_31-0_210_rc9_git1_fc12, kernel-2_6_31-0_47_rc2_git2_fc12, kernel-2_6_31-0_213_rc9_git1_fc12, kernel-2_6_29-0_229_rc7_git3_fc11, kernel-2_6_31-0_118_rc5_fc12, kernel-2_6_30-0_53_rc1_git5_fc12, kernel-2_6_30-0_44_rc1_fc12, kernel-2_6_30-0_39_rc0_git13_fc12, kernel-2_6_31-0_203_rc8_git2_fc12, kernel-2_6_31-0_42_rc2_fc12, kernel-2_6_29-0_201_rc7_fc11, kernel-2_6_31-0_157_rc6_fc12, kernel-2_6_29-0_193_rc6_git7_fc11, kernel-2_6_31-0_185_rc7_git6_fc12, kernel-2_6_30-0_29_rc0_git7_fc11, kernel-2_6_31-0_161_rc6_git2_fc12, kernel-2_6_32-0_48_rc7_git1_fc13, kernel-2_6_30-6_fc12, kernel-2_6_30-0_54_rc1_git5_fc12, kernel-2_6_31-0_21_rc0_git18_fc12, F-11-split, kernel-2_6_31-0_68_rc3_fc12, kernel-2_6_31-0_177_rc7_git2_fc12, kernel-2_6_32-0_5_rc0_git4_fc13, kernel-2_6_31-0_38_rc1_git7_fc12, kernel-2_6_29-0_255_rc8_git2_fc11, kernel-2_6_29-0_233_rc7_git4_fc11, kernel-2_6_29-0_196_rc6_git7_fc11, kernel-2_6_31-0_75_rc3_git4_fc12, kernel-2_6_31-0_183_rc7_git5_fc12, kernel-2_6_31-0_107_rc4_git3_fc12, kernel-2_6_29-0_195_rc6_git7_fc11, kernel-2_6_29-0_220_rc7_git2_fc11, kernel-2_6_31-0_139_rc5_git3_fc12, kernel-2_6_29-21_fc11, kernel-2_6_31-0_204_rc9_fc12, kernel-2_6_32-0_33_rc5_git1_fc13, kernel-2_6_29-0_235_rc7_git4_fc11, kernel-2_6_29-0_252_rc8_fc11, kernel-2_6_29-0_257_rc8_git2_fc11, kernel-2_6_29-0_267_rc8_git4_fc11, kernel-2_6_30-0_89_rc7_fc12, kernel-2_6_31-2_fc12, kernel-2_6_30-0_52_rc1_git5_fc12, kernel-2_6_29-0_192_rc6_git7_fc11, kernel-2_6_30-0_29_rc0_git7_fc12, kernel-2_6_31-0_199_rc8_git2_fc12, kernel-2_6_31-0_145_rc5_git3_fc12, kernel-2_6_31-0_32_rc1_git2_fc12, kernel-2_6_31-0_29_rc1_fc12, F-12-split, kernel-2_6_31-0_137_rc5_git3_fc12, kernel-2_6_31-0_145_2_1_rc5_git3_fc12, kernel-2_6_31-0_35_rc1_git5_fc12, kernel-2_6_30-0_33_rc0_git8_fc12, kernel-2_6_31-0_62_rc2_git4_fc12, kernel-2_6_31-0_39_rc1_git9_fc12, kernel-2_6_30-0_46_rc1_fc12, kernel-2_6_31-0_83_rc3_git4_fc12, kernel-2_6_31-0_76_rc3_git4_fc12, kernel-2_6_30-0_76_rc4_fc12, kernel-2_6_32-0_51_rc7_git2_fc13, kernel-2_6_29-16_fc11, kernel-2_6_29-0_207_rc7_fc11, kernel-2_6_31-0_219_rc9_git2_fc12, kernel-2_6_31-0_103_rc4_git2_fc12, kernel-2_6_31-0_92_rc4_fc12, kernel-2_6_31-0_155_rc6_fc12, kernel-2_6_31-1_fc12, kernel-2_6_31-0_99_rc4_fc12, kernel-2_6_31-0_175_rc7_git2_fc12, kernel-2_6_31-0_24_rc0_git18_fc12, kernel-2_6_31-0_138_rc5_git3_fc12, kernel-2_6_31-0_156_rc6_fc12, kernel-2_6_31-0_198_rc8_git2_fc12, kernel-2_6_29-0_237_rc7_git4_fc11, kernel-2_6_30-0_58_rc2_git1_fc12, kernel-2_6_29-0_215_rc7_fc11, kernel-2_6_30-0_69_rc3_git1_fc12, kernel-2_6_29-0_234_rc7_git4_fc11, kernel-2_6_31-0_37_rc1_git5_fc12, kernel-2_6_30-0_49_rc1_git2_fc12, kernel-2_6_32-0_46_rc7_git1_fc13, kernel-2_6_31-0_209_rc9_git1_fc12, kernel-2_6_31-0_125_4_2_rc5_git2_fc12, kernel-2_6_30-0_78_rc4_git3_fc12, kernel-2_6_31-0_212_rc9_git1_fc12, kernel-2_6_31-0_128_rc5_git3_fc12, kernel-2_6_32-0_15_rc1_git0_fc13, kernel-2_6_31-0_74_rc3_git4_fc12, kernel-2_6_31-0_20_rc0_git18_fc12, kernel-2_6_29-0_203_rc7_fc11, kernel-2_6_29-0_258_2_3_rc8_git2_fc11, kernel-2_6_31-0_104_rc4_git2_fc12, kernel-2_6_31-0_196_rc8_git2_fc12, kernel-2_6_31-0_218_rc9_git2_fc12, kernel-2_6_29-6_fc11, kernel-2_6_31-0_86_rc3_git5_fc12, kernel-2_6_31-0_17_rc0_git15_fc12, kernel-2_6_30-0_36_rc0_git9_fc12, kernel-2_6_31-0_64_rc2_git5_fc12, kernel-2_6_29-0_198_2_1_rc7_nfs41_030408_fc10, kernel-2_6_30-0_79_rc4_git4_fc12, kernel-2_6_30-0_66_rc3_fc12, kernel-2_6_31-0_150_rc5_git3_fc12, kernel-2_6_29-2_fc11, kernel-2_6_30-0_55_rc1_git7_fc12, kernel-2_6_30-0_35_rc0_git9_fc12, kernel-2_6_29-0_232_rc7_git4_fc11, kernel-2_6_31-0_93_rc4_fc12, kernel-2_6_30-0_28_rc0_git6_fc12, kernel-2_6_31-0_25_rc0_git22_fc12, kernel-2_6_30-0_34_rc0_git8_fc12, kernel-2_6_31-0_180_rc7_git4_fc12, kernel-2_6_30-0_57_rc2_fc12, kernel-2_6_30_rc1-pnfs_041409, kernel-2_6_31-0_167_rc6_git6_fc12, kernel-2_6_29-9_fc11, kernel-2_6_31-0_56_rc2_git2_fc12, kernel-2_6_31-0_16_rc0_git15_fc12, kernel-2_6_31-0_202_rc8_git2_fc12, kernel-2_6_31-0_214_rc9_git1_fc12, kernel-2_6_29-0_230_rc7_git3_fc11, kernel-2_6_29-0_198_2_1_rc7_nfs41_030408_fc11, kernel-2_6_31-0_100_rc4_fc12, kernel-2_6_31-0_143_rc5_git3_fc12, kernel-2_6_31-0_117_rc5_fc12, kernel-2_6_31-0_101_rc4_git2_fc12, kernel-2_6_31-0_162_rc6_git2_fc12, kernel-2_6_29-0_218_rc7_git2_fc11, kernel-2_6_32-0_39_rc5_git6_fc13, kernel-2_6_29-0_228_rc7_git3_fc11, kernel-2_6_31-0_132_rc5_git3_fc12, HEAD
Branch point for: private-fedora-12-2_6_30, kernel-2_6_30-nfs41_041509, kernel-2_6_29-0_rc7_pnfs_030408, kernel-2_6_30-nfs41_rc2_041609, kernel-2_6_31-nfs41_rc5, kernel-2_6_31-nfs41_rc6, kernel-2_6_31-nfs41_rc7, kernel-2_6_30-pnfs_rc2_041609, private-myoung-dom0-branch, kernel-2_6_29-0_rc7_nfs41_030408, kernel-2_6_30-pnfs_rc7, kernel-2_6_31-pnfs_rc6, kernel-2_6_31-pnfs_rc7, kernel-2_6_31-pnfs_rc5, kernel-2_6_29-pnfs_032409, kernel-2_6_30-nfs41_rc4, private-F-11-beta-snap, private-f12-2_6_31_rc5, kernel-2_6_30-pnfs_rc4, kernel-2_6_30-nfs41_rc7, kernel-2_6_29-nfs41_032409, kernel-2_6_30-pnfs_041409, private-f12-2_6_31_rc5-imeanit, private-f12-2_6_31_rc5-forreals
Changes since 1.1: +1 -1 lines
File MIME type: text/x-patch
Build fix
1 diff -up linux-2.6.28.x86_64/drivers/gpu/drm/radeon/atombios_crtc.c.mjg linux-2.6.28.x86_64/drivers/gpu/drm/radeon/atombios_crtc.c
2 --- linux-2.6.28.x86_64/drivers/gpu/drm/radeon/atombios_crtc.c.mjg 2009-03-03 19:41:48.000000000 +0000
3 +++ linux-2.6.28.x86_64/drivers/gpu/drm/radeon/atombios_crtc.c 2009-03-03 20:53:05.000000000 +0000
4 @@ -441,14 +441,23 @@ static bool atombios_crtc_mode_fixup(str
5
6 static void atombios_crtc_prepare(struct drm_crtc *crtc)
7 {
8 + struct drm_device *dev = crtc->dev;
9 + struct drm_radeon_private *dev_priv = dev->dev_private;
10 +
11 + mutex_lock(&dev_priv->mode_info.power.pll_mutex);
12 +
13 atombios_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
14 atombios_lock_crtc(crtc, 1);
15 }
16
17 static void atombios_crtc_commit(struct drm_crtc *crtc)
18 {
19 + struct drm_device *dev = crtc->dev;
20 + struct drm_radeon_private *dev_priv = dev->dev_private;
21 +
22 atombios_crtc_dpms(crtc, DRM_MODE_DPMS_ON);
23 atombios_lock_crtc(crtc, 0);
24 + mutex_unlock(&dev_priv->mode_info.power.pll_mutex);
25 }
26
27 static const struct drm_crtc_helper_funcs atombios_helper_funcs = {
28 diff -up linux-2.6.28.x86_64/drivers/gpu/drm/radeon/radeon_atombios.c.mjg linux-2.6.28.x86_64/drivers/gpu/drm/radeon/radeon_atombios.c
29 --- linux-2.6.28.x86_64/drivers/gpu/drm/radeon/radeon_atombios.c.mjg 2009-03-03 19:41:48.000000000 +0000
30 +++ linux-2.6.28.x86_64/drivers/gpu/drm/radeon/radeon_atombios.c 2009-03-03 20:53:05.000000000 +0000
31 @@ -620,6 +620,34 @@ void radeon_atom_static_pwrmgt_setup(str
32 atom_execute_table(dev_priv->mode_info.atom_context, index, (uint32_t *)&args);
33 }
34
35 +void radeon_atom_get_mc_arb_info(struct drm_device *dev)
36 +{
37 + struct drm_radeon_private *dev_priv = dev->dev_private;
38 + struct radeon_mode_info *mode_info = &dev_priv->mode_info;
39 + struct atom_context *ctx = mode_info->atom_context;
40 + int index = GetIndexIntoMasterTable(DATA, MC_InitParameter);
41 + uint8_t frev, crev;
42 + uint16_t size, data_offset;
43 +
44 + atom_parse_data_header(ctx, index, &size, &frev, &crev, &data_offset);
45 + dev_priv->mode_info.power.mc_arb_init_values =
46 + kmalloc(size*sizeof(int), GFP_KERNEL);
47 + memcpy(dev_priv->mode_info.power.mc_arb_init_values,
48 + ctx->bios + data_offset, size * sizeof(int));
49 +}
50 +
51 +void radeon_atom_get_engine_clock(struct drm_device *dev, int *engine_clock)
52 +{
53 + struct drm_radeon_private *dev_priv = dev->dev_private;
54 + struct radeon_mode_info *mode_info = &dev_priv->mode_info;
55 + struct atom_context *ctx = mode_info->atom_context;
56 + GET_ENGINE_CLOCK_PS_ALLOCATION args;
57 + int index = GetIndexIntoMasterTable(COMMAND, GetEngineClock);
58 +
59 + atom_execute_table(ctx, index, (uint32_t *)&args);
60 + *engine_clock = args.ulReturnEngineClock;
61 +}
62 +
63 void radeon_atom_set_engine_clock(struct drm_device *dev, int eng_clock)
64 {
65 struct drm_radeon_private *dev_priv = dev->dev_private;
66 @@ -633,6 +661,18 @@ void radeon_atom_set_engine_clock(struct
67 atom_execute_table(dev_priv->mode_info.atom_context, index, (uint32_t *)&args);
68 }
69
70 +void radeon_atom_get_memory_clock(struct drm_device *dev, int *mem_clock)
71 +{
72 + struct drm_radeon_private *dev_priv = dev->dev_private;
73 + struct radeon_mode_info *mode_info = &dev_priv->mode_info;
74 + struct atom_context *ctx = mode_info->atom_context;
75 + GET_MEMORY_CLOCK_PS_ALLOCATION args;
76 + int index = GetIndexIntoMasterTable(COMMAND, GetMemoryClock);
77 +
78 + atom_execute_table(ctx, index, (uint32_t *)&args);
79 + *mem_clock = args.ulReturnMemoryClock;
80 +}
81 +
82 void radeon_atom_set_memory_clock(struct drm_device *dev, int mem_clock)
83 {
84 struct drm_radeon_private *dev_priv = dev->dev_private;
85 @@ -646,6 +686,16 @@ void radeon_atom_set_memory_clock(struct
86 atom_execute_table(dev_priv->mode_info.atom_context, index, (uint32_t *)&args);
87 }
88
89 +void radeon_atom_initialize_memory_controller(struct drm_device *dev)
90 +{
91 + struct drm_radeon_private *dev_priv = dev->dev_private;
92 + struct atom_context *ctx = dev_priv->mode_info.atom_context;
93 + int index = GetIndexIntoMasterTable(COMMAND, MemoryDeviceInit);
94 + MEMORY_PLLINIT_PS_ALLOCATION args;
95 +
96 + atom_execute_table(ctx, index, (uint32_t *)&args);
97 +}
98 +
99 void radeon_atom_initialize_bios_scratch_regs(struct drm_device *dev)
100 {
101 struct drm_radeon_private *dev_priv = dev->dev_private;
102 diff -up linux-2.6.28.x86_64/drivers/gpu/drm/radeon/radeon_cp.c.mjg linux-2.6.28.x86_64/drivers/gpu/drm/radeon/radeon_cp.c
103 --- linux-2.6.28.x86_64/drivers/gpu/drm/radeon/radeon_cp.c.mjg 2009-03-03 19:41:48.000000000 +0000
104 +++ linux-2.6.28.x86_64/drivers/gpu/drm/radeon/radeon_cp.c 2009-03-03 20:53:05.000000000 +0000
105 @@ -3223,6 +3223,8 @@ int radeon_driver_load(struct drm_device
106 if (ret)
107 goto modeset_fail;
108
109 + mutex_init(&dev_priv->mode_info.power.pll_mutex);
110 +
111 radeon_modeset_init(dev);
112
113 radeon_modeset_cp_init(dev);
114 @@ -3231,7 +3233,7 @@ int radeon_driver_load(struct drm_device
115 drm_irq_install(dev);
116 }
117
118 -
119 + radeon_pm_init(dev);
120 return ret;
121 modeset_fail:
122 dev->driver->driver_features &= ~DRIVER_MODESET;
123 @@ -3303,6 +3305,8 @@ int radeon_driver_unload(struct drm_devi
124 {
125 drm_radeon_private_t *dev_priv = dev->dev_private;
126
127 + radeon_pm_exit(dev);
128 +
129 if (drm_core_check_feature(dev, DRIVER_MODESET)) {
130 drm_irq_uninstall(dev);
131 radeon_modeset_cleanup(dev);
132 diff -up linux-2.6.28.x86_64/drivers/gpu/drm/radeon/radeon_cs.c.mjg linux-2.6.28.x86_64/drivers/gpu/drm/radeon/radeon_cs.c
133 --- linux-2.6.28.x86_64/drivers/gpu/drm/radeon/radeon_cs.c.mjg 2009-03-03 19:41:48.000000000 +0000
134 +++ linux-2.6.28.x86_64/drivers/gpu/drm/radeon/radeon_cs.c 2009-03-03 20:53:05.000000000 +0000
135 @@ -41,6 +41,8 @@ int radeon_cs_ioctl(struct drm_device *d
136 long size;
137 int r, i;
138
139 + radeon_pm_timer_reset(dev);
140 +
141 mutex_lock(&dev_priv->cs.cs_mutex);
142 /* set command stream id to 0 which is fake id */
143 cs_id = 0;
144 diff -up linux-2.6.28.x86_64/drivers/gpu/drm/radeon/radeon_drv.h.mjg linux-2.6.28.x86_64/drivers/gpu/drm/radeon/radeon_drv.h
145 --- linux-2.6.28.x86_64/drivers/gpu/drm/radeon/radeon_drv.h.mjg 2009-03-03 19:41:48.000000000 +0000
146 +++ linux-2.6.28.x86_64/drivers/gpu/drm/radeon/radeon_drv.h 2009-03-03 20:53:05.000000000 +0000
147 @@ -612,6 +612,9 @@ extern int radeon_modeset_cp_resume(stru
148 /* radeon_pm.c */
149 int radeon_suspend(struct drm_device *dev, pm_message_t state);
150 int radeon_resume(struct drm_device *dev);
151 +void radeon_pm_init(struct drm_device *dev);
152 +void radeon_pm_exit(struct drm_device *dev);
153 +void radeon_pm_timer_reset(struct drm_device *dev);
154
155 /* Flags for stats.boxes
156 */
157 diff -up linux-2.6.28.x86_64/drivers/gpu/drm/radeon/radeon_irq.c.mjg linux-2.6.28.x86_64/drivers/gpu/drm/radeon/radeon_irq.c
158 --- linux-2.6.28.x86_64/drivers/gpu/drm/radeon/radeon_irq.c.mjg 2009-03-03 19:41:48.000000000 +0000
159 +++ linux-2.6.28.x86_64/drivers/gpu/drm/radeon/radeon_irq.c 2009-03-03 20:53:05.000000000 +0000
160 @@ -185,8 +185,10 @@ irqreturn_t radeon_driver_irq_handler(DR
161 struct drm_device *dev = (struct drm_device *) arg;
162 drm_radeon_private_t *dev_priv =
163 (drm_radeon_private_t *) dev->dev_private;
164 + struct radeon_powermanagement_info *power = &dev_priv->mode_info.power;
165 u32 stat;
166 u32 r500_disp_int;
167 + unsigned long flags;
168
169 /* Only consider the bits we're interested in - others could be used
170 * outside the DRM
171 @@ -206,15 +208,47 @@ irqreturn_t radeon_driver_irq_handler(DR
172
173 /* VBLANK interrupt */
174 if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RS690) {
175 - if (r500_disp_int & R500_D1_VBLANK_INTERRUPT)
176 + if (r500_disp_int & R500_D1_VBLANK_INTERRUPT) {
177 + spin_lock_irqsave(&power->power_lock, flags);
178 + if (power->reclock_head & 1) {
179 + power->reclock_head &= ~1;
180 + schedule_work(&power->reclock_work);
181 + drm_vblank_put(dev, 0);
182 + }
183 + spin_unlock_irqrestore(&power->power_lock, flags);
184 drm_handle_vblank(dev, 0);
185 - if (r500_disp_int & R500_D2_VBLANK_INTERRUPT)
186 + }
187 + if (r500_disp_int & R500_D2_VBLANK_INTERRUPT) {
188 + spin_lock_irqsave(&power->power_lock, flags);
189 + if (power->reclock_head & 2) {
190 + power->reclock_head &= ~2;
191 + schedule_work(&power->reclock_work);
192 + drm_vblank_put(dev, 1);
193 + }
194 + spin_unlock_irqrestore(&power->power_lock, flags);
195 drm_handle_vblank(dev, 1);
196 + }
197 } else {
198 - if (stat & RADEON_CRTC_VBLANK_STAT)
199 + if (stat & RADEON_CRTC_VBLANK_STAT) {
200 + spin_lock_irqsave(&power->power_lock, flags);
201 + if (power->reclock_head & 1) {
202 + power->reclock_head &= ~1;
203 + schedule_work(&power->reclock_work);
204 + drm_vblank_put(dev, 0);
205 + }
206 + spin_unlock_irqrestore(&power->power_lock, flags);
207 drm_handle_vblank(dev, 0);
208 - if (stat & RADEON_CRTC2_VBLANK_STAT)
209 + }
210 + if (stat & RADEON_CRTC2_VBLANK_STAT) {
211 + spin_lock_irqsave(&power->power_lock, flags);
212 + if (power->reclock_head & 2) {
213 + power->reclock_head &= ~2;
214 + schedule_work(&power->reclock_work);
215 + drm_vblank_put(dev, 1);
216 + }
217 + spin_unlock_irqrestore(&power->power_lock, flags);
218 drm_handle_vblank(dev, 1);
219 + }
220 }
221 return IRQ_HANDLED;
222 }
223 diff -up linux-2.6.28.x86_64/drivers/gpu/drm/radeon/radeon_mode.h.mjg linux-2.6.28.x86_64/drivers/gpu/drm/radeon/radeon_mode.h
224 --- linux-2.6.28.x86_64/drivers/gpu/drm/radeon/radeon_mode.h.mjg 2009-03-03 19:41:48.000000000 +0000
225 +++ linux-2.6.28.x86_64/drivers/gpu/drm/radeon/radeon_mode.h 2009-03-03 20:53:05.000000000 +0000
226 @@ -173,6 +173,22 @@ struct radeon_i2c_chan {
227 struct radeon_i2c_bus_rec rec;
228 };
229
230 +struct radeon_powermanagement_info {
231 + struct timer_list idle_power_timer;
232 + struct work_struct reclock_work;
233 + struct drm_device *dev;
234 + uint32_t orig_memory_clock;
235 + uint32_t orig_engine_clock;
236 + uint32_t *mc_arb_init_values;
237 + uint8_t orig_fbdiv;
238 + int new_mem_clock;
239 + int new_engine_clock;
240 + int current_clock_state;
241 + int reclock_head;
242 + struct mutex pll_mutex;
243 + spinlock_t power_lock;
244 +};
245 +
246 struct radeon_mode_info {
247 struct atom_context *atom_context;
248 struct radeon_bios_connector bios_connector[RADEON_MAX_BIOS_CONNECTOR];
249 @@ -182,6 +198,9 @@ struct radeon_mode_info {
250 struct radeon_pll mpll;
251 uint32_t mclk;
252 uint32_t sclk;
253 +
254 + /* power management */
255 + struct radeon_powermanagement_info power;
256 };
257
258 struct radeon_crtc {
259 @@ -307,6 +326,12 @@ extern int radeon_crtc_cursor_move(struc
260
261 extern bool radeon_atom_get_clock_info(struct drm_device *dev);
262 extern bool radeon_combios_get_clock_info(struct drm_device *dev);
263 +extern void radeon_atom_get_engine_clock(struct drm_device *dev, int *engine_clock);
264 +extern void radeon_atom_get_memory_clock(struct drm_device *dev, int *memory_clock);
265 +extern void radeon_atom_set_engine_clock(struct drm_device *dev, int engine_clock);
266 +extern void radeon_atom_set_memory_clock(struct drm_device *dev, int memory_clock);
267 +extern void radeon_atom_initialize_memory_controller(struct drm_device *dev);
268 +extern void radeon_atom_get_mc_arb_info(struct drm_device *dev);
269 extern void radeon_atombios_get_lvds_info(struct radeon_encoder *encoder);
270 extern void radeon_atombios_get_tmds_info(struct radeon_encoder *encoder);
271 extern bool radeon_combios_get_lvds_info(struct radeon_encoder *encoder);
272 diff -up linux-2.6.28.x86_64/drivers/gpu/drm/radeon/radeon_pm.c.mjg linux-2.6.28.x86_64/drivers/gpu/drm/radeon/radeon_pm.c
273 --- linux-2.6.28.x86_64/drivers/gpu/drm/radeon/radeon_pm.c.mjg 2009-03-03 19:41:48.000000000 +0000
274 +++ linux-2.6.28.x86_64/drivers/gpu/drm/radeon/radeon_pm.c 2009-03-03 20:53:05.000000000 +0000
275 @@ -31,6 +31,8 @@
276
277 #include "drm_crtc_helper.h"
278
279 +#define RADEON_DOWNCLOCK_IDLE_MS 30
280 +
281 int radeon_suspend(struct drm_device *dev, pm_message_t state)
282 {
283 struct drm_radeon_private *dev_priv = dev->dev_private;
284 @@ -255,3 +257,214 @@ bool radeon_set_pcie_lanes(struct drm_de
285 return false;
286 }
287
288 +static void radeon_pm_set_engine_clock(struct drm_device *dev, int freq)
289 +{
290 + drm_radeon_private_t *dev_priv = dev->dev_private;
291 +
292 + if (dev_priv->is_atom_bios)
293 + radeon_atom_set_engine_clock(dev, freq);
294 +}
295 +
296 +static void radeon_pm_set_memory_clock(struct drm_device *dev, int freq)
297 +{
298 + drm_radeon_private_t *dev_priv = dev->dev_private;
299 + struct radeon_powermanagement_info *power = &dev_priv->mode_info.power;
300 +
301 + mutex_lock(&power->pll_mutex);
302 + radeon_do_cp_idle(dev_priv);
303 + if (dev_priv->is_atom_bios) {
304 + int mpll, spll, hclk, sclk, fbdiv, index, factor;
305 + switch (dev_priv->chip_family) {
306 + case CHIP_R520:
307 + case CHIP_RV530:
308 + case CHIP_RV560:
309 + case CHIP_RV570:
310 + case CHIP_R580:
311 + mpll = RADEON_READ_PLL(dev_priv, MPLL_FUNC_CNTL);
312 + fbdiv = (mpll & 0x1fe0) >> 5;
313 +
314 + /* Set new fbdiv */
315 + factor = power->orig_memory_clock / freq;
316 + fbdiv = power->orig_fbdiv / factor;
317 +
318 + mpll &= ~0x1fe0;
319 + mpll |= ((fbdiv << 5) | (1 << 24));
320 + mpll &= ~(1 << 25);
321 +
322 + spll = RADEON_READ_PLL(dev_priv, SPLL_FUNC_CNTL);
323 +
324 + hclk = fbdiv << 5;
325 + hclk += 0x20;
326 + hclk *= 8;
327 +
328 + sclk = spll & 0x1fe0;
329 + sclk += 0x20;
330 + sclk *= 6;
331 + sclk = sclk >> 5;
332 +
333 + index = (hclk/sclk);
334 +
335 + R500_WRITE_MCIND(R530_MC_ARB_RATIO_CLK_SEQ,
336 + power->mc_arb_init_values[index]);
337 + RADEON_WRITE_PLL(dev_priv, MPLL_FUNC_CNTL, mpll);
338 + radeon_atom_initialize_memory_controller(dev);
339 + break;
340 + }
341 + }
342 +
343 + mutex_unlock(&power->pll_mutex);
344 +}
345 +
346 +static int radeon_pm_get_active_crtcs(struct drm_device *dev, int *crtcs)
347 +{
348 + struct drm_crtc *crtc;
349 + int count = 0;
350 + struct radeon_crtc *radeon_crtc;
351 +
352 + list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
353 + radeon_crtc = to_radeon_crtc(crtc);
354 + if (crtc->enabled) {
355 + count++;
356 + *crtcs |= (1 << radeon_crtc->crtc_id);
357 + }
358 + }
359 + return count;
360 +}
361 +
362 +
363 +static void radeon_pm_perform_transition(struct drm_device *dev)
364 +{
365 + drm_radeon_private_t *dev_priv = dev->dev_private;
366 + struct radeon_powermanagement_info *power = &dev_priv->mode_info.power;
367 + int crtcs = 0, count;
368 + unsigned long flags;
369 +
370 + count = radeon_pm_get_active_crtcs(dev, &crtcs);
371 +
372 + spin_lock_irqsave(&power->power_lock, flags);
373 + switch (count) {
374 + case 0:
375 + schedule_work(&power->reclock_work);
376 + break;
377 + case 1:
378 + if (power->reclock_head)
379 + break;
380 + if (crtcs & 1) {
381 + power->reclock_head |= 1;
382 + drm_vblank_get(dev, 0);
383 + } else {
384 + power->reclock_head |= 2;
385 + drm_vblank_get(dev, 1);
386 + }
387 + break;
388 + default:
389 + /* Too many active heads */
390 + break;
391 + }
392 + spin_unlock_irqrestore(&power->power_lock, flags);
393 +}
394 +
395 +
396 +static int radeon_pm_set_runtime_power(struct drm_device *dev, int value)
397 +{
398 + drm_radeon_private_t *dev_priv = dev->dev_private;
399 + struct radeon_powermanagement_info *power = &dev_priv->mode_info.power;
400 +
401 + if (power->current_clock_state == value)
402 + return 1;
403 +
404 + switch (value) {
405 + case 0:
406 + power->new_engine_clock = 100*100;
407 + power->new_mem_clock = 100*100;
408 + break;
409 + case 1:
410 + power->new_engine_clock = power->orig_engine_clock;
411 + power->new_mem_clock = power->orig_memory_clock;
412 + break;
413 + }
414 +
415 + power->current_clock_state = value;
416 + radeon_pm_perform_transition(dev);
417 +
418 + return 0;
419 +}
420 +
421 +static void radeon_pm_idle_timeout(unsigned long d)
422 +{
423 + struct drm_device *dev = (struct drm_device *)d;
424 + drm_radeon_private_t *dev_priv = dev->dev_private;
425 +
426 + radeon_pm_set_runtime_power(dev, 0);
427 +}
428 +
429 +static void radeon_pm_reclock_callback(struct work_struct *work)
430 +{
431 + struct radeon_powermanagement_info *power =
432 + container_of(work, struct radeon_powermanagement_info,
433 + reclock_work);
434 + struct drm_device *dev = power->dev;
435 + drm_radeon_private_t *dev_priv = dev->dev_private;
436 +
437 + mutex_lock(&dev_priv->cs.cs_mutex);
438 + radeon_pm_set_memory_clock(dev, power->new_mem_clock);
439 + radeon_pm_set_engine_clock(dev, power->new_engine_clock);
440 + mutex_unlock(&dev_priv->cs.cs_mutex);
441 +}
442 +
443 +void radeon_pm_timer_reset(struct drm_device *dev)
444 +{
445 + drm_radeon_private_t *dev_priv = dev->dev_private;
446 + struct radeon_powermanagement_info *power = &dev_priv->mode_info.power;
447 +
448 + if (!drm_core_check_feature(dev, DRIVER_MODESET))
449 + return;
450 +
451 + radeon_pm_set_runtime_power(dev, 1);
452 +
453 + mod_timer(&power->idle_power_timer,
454 + jiffies + msecs_to_jiffies(RADEON_DOWNCLOCK_IDLE_MS));
455 +}
456 +
457 +void radeon_pm_init(struct drm_device *dev)
458 +{
459 + drm_radeon_private_t *dev_priv = dev->dev_private;
460 + struct radeon_powermanagement_info *power = &dev_priv->mode_info.power;
461 +
462 + power->dev = dev;
463 +
464 + if (!drm_core_check_feature(dev, DRIVER_MODESET))
465 + return;
466 +
467 + if (dev_priv->is_atom_bios) {
468 + int mpll;
469 + radeon_atom_get_mc_arb_info(dev);
470 + radeon_atom_get_engine_clock(dev, &power->orig_engine_clock);
471 + radeon_atom_get_memory_clock(dev, &power->orig_memory_clock);
472 +
473 + mpll = RADEON_READ_PLL(dev_priv, MPLL_FUNC_CNTL);
474 + dev_priv->mode_info.power.orig_fbdiv = (mpll & 0x1fe0) >> 5;
475 + }
476 +
477 + setup_timer(&power->idle_power_timer, radeon_pm_idle_timeout,
478 + (unsigned long)dev);
479 + INIT_WORK(&power->reclock_work, radeon_pm_reclock_callback);
480 +
481 + spin_lock_init(&power->power_lock);
482 +
483 + power->current_clock_state = 1;
484 + power->reclock_head = 0;
485 +
486 + radeon_pm_timer_reset(dev);
487 +}
488 +
489 +void radeon_pm_exit(struct drm_device *dev)
490 +{
491 + drm_radeon_private_t *dev_priv = dev->dev_private;
492 + struct radeon_powermanagement_info *power = &dev_priv->mode_info.power;
493 +
494 + if (!drm_core_check_feature(dev, DRIVER_MODESET))
495 + return;
496 +
497 + del_timer_sync(&power->idle_power_timer);
498 +}
499 diff -up linux-2.6.28.x86_64/drivers/gpu/drm/radeon/radeon_reg.h.mjg linux-2.6.28.x86_64/drivers/gpu/drm/radeon/radeon_reg.h
500 --- linux-2.6.28.x86_64/drivers/gpu/drm/radeon/radeon_reg.h.mjg 2009-03-03 19:41:48.000000000 +0000
501 +++ linux-2.6.28.x86_64/drivers/gpu/drm/radeon/radeon_reg.h 2009-03-03 20:53:05.000000000 +0000
502 @@ -303,6 +303,28 @@
503 # define RADEON_PLL_WR_EN (1 << 7)
504 # define RADEON_PLL_DIV_SEL (3 << 8)
505 # define RADEON_PLL2_DIV_SEL_MASK ~(3 << 8)
506 +#define SPLL_FUNC_CNTL 0x0000
507 +#define MPLL_FUNC_CNTL 0x0004
508 +#define GENERAL_PWRMGT 0x0008
509 +# define RADEON_GLOBAL_PWRMGT_EN (1 << 0)
510 +#define SCLK_PWRMGT_CNTL 0x0009
511 +# define RADEON_SCLK_PWRMGT_OFF (1 << 0)
512 +#define MCLK_PWRMGT_CNTL 0x000a
513 +# define RADEON_MCLK_PWRMGT_OFF (1 << 0)
514 +#define DYN_PWRMGT_SCLK_CNTL 0x000b
515 +# define RADEON_ENGINE_DYNCLK_MODE (1 << 0)
516 +# define RADEON_STATIC_SCREEN_EN (1 << 20)
517 +# define RADEON_CLIENT_SELECT_POWER_EN (1 << 21)
518 +#define DYN_SCLK_PWMEN_PIPE 0x000d
519 +# define RADEON_PIPE_3D_NOT_AUTO (1 << 8)
520 +#define DYN_SCLK_VOL_CNTL 0x000e
521 +# define RADEON_IO_CG_VOLTAGE_DROP (1 << 0)
522 +# define RADEON_VOLTAGE_DROP_SYNC (1 << 2)
523 +#define CP_DYN_CNTL 0x000f
524 +# define RADEON_CP_FORCEON (1 << 0)
525 +# define RADEON_CP_LOWER_POWER_IGNORE (1 << 20)
526 +# define RADEON_CP_NORMAL_POWER_IGNORE (1 << 21)
527 +# define RADEON_CP_NORMAL_POWER_BUSY (1 << 24)
528 #define RADEON_CLK_PWRMGT_CNTL 0x0014
529 # define RADEON_ENGIN_DYNCLK_MODE (1 << 12)
530 # define RADEON_ACTIVE_HILO_LAT_MASK (3 << 13)
531 @@ -3961,7 +3983,48 @@
532 # define AVIVO_I2C_RESET (1 << 8)
533
534 #define R600_GENERAL_PWRMGT 0x618
535 +# define R600_GLOBAL_PWRMGT_EN (1 << 0)
536 +# define R600_STATIC_PM_EN (1 << 1)
537 +# define R600_MOBILE_SU (1 << 2)
538 +# define R600_THERMAL_PROTECTION_DIS (1 << 3)
539 +# define R600_THERMAL_PROTECTION_TYPE (1 << 4)
540 +# define R600_ENABLE_GEN2PCIE (1 << 5)
541 +# define R600_SW_GPIO_INDEX (1 << 6)
542 +# define R600_LOW_VOLT_D2_ACPI (1 << 8)
543 +# define R600_LOW_VOLT_D3_ACPI (1 << 9)
544 +# define R600_VOLT_PWRMGT_EN (1 << 10)
545 # define R600_OPEN_DRAIN_PADS (1 << 11)
546 +# define R600_AVP_SCLK_EN (1 << 12)
547 +# define R600_IDCT_SCLK_EN (1 << 13)
548 +# define R600_GPU_COUNTER_ACPI (1 << 14)
549 +# define R600_COUNTER_CLK (1 << 15)
550 +# define R600_BACKBIAS_PAD_EN (1 << 16)
551 +# define R600_BACKBIAS_VALUE (1 << 17)
552 +# define R600_BACKBIAS_DPM_CNTL (1 << 18)
553 +# define R600_SPREAD_SPECTRUM_INDEX (1 << 19)
554 +# define R600_DYN_SPREAD_SPECTRUM_EN (1 << 21)
555 +
556 +#define R600_SCLK_PWRMGT_CNTL 0x620
557 +# define R600_SCLK_PWRMGT_OFF (1 << 0)
558 +# define R600_SCLK_TURNOFF (1 << 1)
559 +# define R600_SPLL_TURNOFF (1 << 2)
560 +# define R600_SU_SCLK_USE_BCLK (1 << 3)
561 +# define R600_DYNAMIC_GFX_ISLAND_PWR_DOWN (1 << 4)
562 +# define R600_DYNAMIC_GFX_ISLAND_LP (1 << 5)
563 +# define R600_CLK_TURN_ON_STAGGER (1 << 6)
564 +# define R600_CLK_TURN_OFF_STAGGER (1 << 7)
565 +# define R600_FIR_FORCE_TREND_SEL (1 << 8)
566 +# define R600_FIR_TREND_MODE (1 << 9)
567 +# define R600_DYN_GFX_CLK_OFF_EN (1 << 10)
568 +# define R600_VDDC3D_TURNOFF_D1 (1 << 11)
569 +# define R600_VDDC3D_TURNOFF_D2 (1 << 12)
570 +# define R600_VDDC3D_TURNOFF_D3 (1 << 13)
571 +# define R600_SPLL_TURNOFF_D2 (1 << 14)
572 +# define R600_SCLK_LOW_D1 (1 << 15)
573 +# define R600_DYN_GFX_CLK_OFF_MC_EN (1 << 16)
574 +
575 +#define R600_MCLK_PWRMGT_CNTL 0x624
576 +# define R600_MPLL_PWRMGT_OFF (1 << 0)
577
578 #define R600_LOWER_GPIO_ENABLE 0x710
579 #define R600_CTXSW_VID_LOWER_GPIO_CNTL 0x718
580 @@ -5331,5 +5394,6 @@
581 # define R500_RS_IP_OFFSET_EN (1 << 31)
582
583 #define R500_DYN_SCLK_PWMEM_PIPE 0x000d /* PLL */
584 +#define R530_MC_ARB_RATIO_CLK_SEQ 0x0016 /* MC */
585
586 #endif

admin@fedoraproject.org
ViewVC Help
Powered by ViewVC 1.1.2