diff options
author | Jason Wessel <jason.wessel@windriver.com> | 2010-09-26 07:47:26 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2010-10-05 21:50:37 -0400 |
commit | ff773714dd30b802c336064109c535d8b2774e2f (patch) | |
tree | d040dbf8cff59f984dc1d1773c804e52d4c49010 | |
parent | 413d45d3627be4748058dea697718ed6fb88bd01 (diff) |
radeon, kdb, kms: Save and restore the LUT on atomic KMS enter/exit
When changing VTs non-atomically the kernel works in conjunction with
the Xserver in user space and receives the LUT information from the
Xserver via a system call. When changing modes atomically for kdb,
this information must be saved and restored without disturbing user
space as if nothing ever happened.
Signed-off-by: Jason Wessel <jason.wessel@windriver.com>
CC: Jesse Barnes <jbarnes@virtuousgeek.org>
CC: David Airlie <airlied@linux.ie>
CC: dri-devel@lists.freedesktop.org
Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_display.c | 32 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_legacy_crtc.c | 5 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_mode.h | 3 |
3 files changed, 40 insertions, 0 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c index b92d2f2fcbed..26935cf2c3b3 100644 --- a/drivers/gpu/drm/radeon/radeon_display.c +++ b/drivers/gpu/drm/radeon/radeon_display.c | |||
@@ -138,6 +138,38 @@ void radeon_crtc_load_lut(struct drm_crtc *crtc) | |||
138 | legacy_crtc_load_lut(crtc); | 138 | legacy_crtc_load_lut(crtc); |
139 | } | 139 | } |
140 | 140 | ||
141 | void radeon_crtc_save_lut(struct drm_crtc *crtc) | ||
142 | { | ||
143 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); | ||
144 | int i; | ||
145 | |||
146 | if (!crtc->enabled) | ||
147 | return; | ||
148 | |||
149 | for (i = 0; i < 256; i++) { | ||
150 | radeon_crtc->lut_r_copy[i] = radeon_crtc->lut_r[i]; | ||
151 | radeon_crtc->lut_g_copy[i] = radeon_crtc->lut_g[i]; | ||
152 | radeon_crtc->lut_b_copy[i] = radeon_crtc->lut_b[i]; | ||
153 | } | ||
154 | } | ||
155 | |||
156 | void radeon_crtc_restore_lut(struct drm_crtc *crtc) | ||
157 | { | ||
158 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); | ||
159 | int i; | ||
160 | |||
161 | if (!crtc->enabled) | ||
162 | return; | ||
163 | |||
164 | for (i = 0; i < 256; i++) { | ||
165 | radeon_crtc->lut_r[i] = radeon_crtc->lut_r_copy[i]; | ||
166 | radeon_crtc->lut_g[i] = radeon_crtc->lut_g_copy[i]; | ||
167 | radeon_crtc->lut_b[i] = radeon_crtc->lut_b_copy[i]; | ||
168 | } | ||
169 | |||
170 | radeon_crtc_load_lut(crtc); | ||
171 | } | ||
172 | |||
141 | /** Sets the color ramps on behalf of fbcon */ | 173 | /** Sets the color ramps on behalf of fbcon */ |
142 | void radeon_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green, | 174 | void radeon_crtc_fb_gamma_set(struct drm_crtc *crtc, u16 red, u16 green, |
143 | u16 blue, int regno) | 175 | u16 blue, int regno) |
diff --git a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c index 8752d3447b72..42954785247f 100644 --- a/drivers/gpu/drm/radeon/radeon_legacy_crtc.c +++ b/drivers/gpu/drm/radeon/radeon_legacy_crtc.c | |||
@@ -355,6 +355,11 @@ int radeon_crtc_set_base_atomic(struct drm_crtc *crtc, | |||
355 | struct drm_framebuffer *fb, | 355 | struct drm_framebuffer *fb, |
356 | int x, int y, int enter) | 356 | int x, int y, int enter) |
357 | { | 357 | { |
358 | if (enter) | ||
359 | radeon_crtc_save_lut(crtc); | ||
360 | else | ||
361 | radeon_crtc_restore_lut(crtc); | ||
362 | |||
358 | return radeon_crtc_do_set_base(crtc, fb, x, y, 1); | 363 | return radeon_crtc_do_set_base(crtc, fb, x, y, 1); |
359 | } | 364 | } |
360 | 365 | ||
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h index c4116d3d8d06..2f78615f02aa 100644 --- a/drivers/gpu/drm/radeon/radeon_mode.h +++ b/drivers/gpu/drm/radeon/radeon_mode.h | |||
@@ -267,6 +267,7 @@ struct radeon_crtc { | |||
267 | struct drm_crtc base; | 267 | struct drm_crtc base; |
268 | int crtc_id; | 268 | int crtc_id; |
269 | u16 lut_r[256], lut_g[256], lut_b[256]; | 269 | u16 lut_r[256], lut_g[256], lut_b[256]; |
270 | u16 lut_r_copy[256], lut_g_copy[256], lut_b_copy[256]; | ||
270 | bool enabled; | 271 | bool enabled; |
271 | bool can_tile; | 272 | bool can_tile; |
272 | uint32_t crtc_offset; | 273 | uint32_t crtc_offset; |
@@ -512,6 +513,8 @@ extern int atombios_get_encoder_mode(struct drm_encoder *encoder); | |||
512 | extern void radeon_encoder_set_active_device(struct drm_encoder *encoder); | 513 | extern void radeon_encoder_set_active_device(struct drm_encoder *encoder); |
513 | 514 | ||
514 | extern void radeon_crtc_load_lut(struct drm_crtc *crtc); | 515 | extern void radeon_crtc_load_lut(struct drm_crtc *crtc); |
516 | extern void radeon_crtc_save_lut(struct drm_crtc *crtc); | ||
517 | extern void radeon_crtc_restore_lut(struct drm_crtc *crtc); | ||
515 | extern int atombios_crtc_set_base(struct drm_crtc *crtc, int x, int y, | 518 | extern int atombios_crtc_set_base(struct drm_crtc *crtc, int x, int y, |
516 | struct drm_framebuffer *old_fb); | 519 | struct drm_framebuffer *old_fb); |
517 | extern int atombios_crtc_set_base_atomic(struct drm_crtc *crtc, | 520 | extern int atombios_crtc_set_base_atomic(struct drm_crtc *crtc, |