drm, kdb, kms: Add an enter argument to mode_set_base_atomic() API
authorJason Wessel <jason.wessel@windriver.com>
Sun, 26 Sep 2010 11:47:25 +0000 (06:47 -0500)
committerDave Airlie <airlied@redhat.com>
Wed, 6 Oct 2010 01:50:31 +0000 (11:50 +1000)
Some devices such as the radeon chips receive information from user
space which needs to be saved when executing an atomic mode set
operation, else the user space would have to be queried again for the
information.

This patch extends the mode_set_base_atomic() call to pass an argument
to indicate if this is an entry or an exit from an atomic kernel mode
set change.  Individual drm drivers can properly save and restore
state accordingly.

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>
drivers/gpu/drm/drm_fb_helper.c
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/nouveau/nv04_crtc.c
drivers/gpu/drm/nouveau/nv50_crtc.c
drivers/gpu/drm/radeon/atombios_crtc.c
drivers/gpu/drm/radeon/radeon_legacy_crtc.c
drivers/gpu/drm/radeon/radeon_mode.h
include/drm/drm_crtc_helper.h

index 6a5e403f9aa160b54caad1bca22ba93dd27415e6..625a2d551d6a3db6c963eb65b759e1502339c7fd 100644 (file)
@@ -263,7 +263,8 @@ int drm_fb_helper_debug_enter(struct fb_info *info)
                        funcs->mode_set_base_atomic(mode_set->crtc,
                                                    mode_set->fb,
                                                    mode_set->x,
-                                                   mode_set->y);
+                                                   mode_set->y,
+                                                   1);
 
                }
        }
@@ -309,7 +310,7 @@ int drm_fb_helper_debug_leave(struct fb_info *info)
                }
 
                funcs->mode_set_base_atomic(mode_set->crtc, fb, crtc->x,
-                                           crtc->y);
+                                           crtc->y, 0);
        }
 
        return 0;
index 69c54c5a42546d21e4e46dd3958925664840d9e1..9109c00f3ead42f9f04601a6922fa1f28a2478cc 100644 (file)
@@ -1492,7 +1492,7 @@ err_unpin:
 /* Assume fb object is pinned & idle & fenced and just update base pointers */
 static int
 intel_pipe_set_base_atomic(struct drm_crtc *crtc, struct drm_framebuffer *fb,
-                          int x, int y)
+                          int x, int y, int enter)
 {
        struct drm_device *dev = crtc->dev;
        struct drm_i915_private *dev_priv = dev->dev_private;
@@ -1614,7 +1614,7 @@ intel_pipe_set_base(struct drm_crtc *crtc, int x, int y,
                           atomic_read(&obj_priv->pending_flip) == 0);
        }
 
-       ret = intel_pipe_set_base_atomic(crtc, crtc->fb, x, y);
+       ret = intel_pipe_set_base_atomic(crtc, crtc->fb, x, y, 0);
        if (ret) {
                i915_gem_object_unpin(to_intel_framebuffer(crtc->fb)->obj);
                mutex_unlock(&dev->struct_mutex);
index f5bbd46f76bcdb0da85120e9538e376d3fa17670..fb669dd39c3cf356bfbaf554b7f758643c2b3631 100644 (file)
@@ -858,7 +858,7 @@ nv04_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
 static int
 nv04_crtc_mode_set_base_atomic(struct drm_crtc *crtc,
                               struct drm_framebuffer *fb,
-                              int x, int y)
+                              int x, int y, int enter)
 {
        return nv04_crtc_do_mode_set_base(crtc, fb, x, y, true);
 }
index f41b44864e809a618244a22046ab776941b224c9..727a7a12fed9b5d675748a2bfa7ebef6d3f6dce7 100644 (file)
@@ -712,7 +712,7 @@ nv50_crtc_mode_set_base(struct drm_crtc *crtc, int x, int y,
 static int
 nv50_crtc_mode_set_base_atomic(struct drm_crtc *crtc,
                               struct drm_framebuffer *fb,
-                              int x, int y)
+                              int x, int y, int enter)
 {
        return nv50_crtc_do_mode_set_base(crtc, fb, x, y, true, true);
 }
index 2ab9b360d3c9b28b0a844001c129b5a94fced051..501e5286ec3faeab04e4255701c76a4014c9c01a 100644 (file)
@@ -1180,7 +1180,7 @@ int atombios_crtc_set_base(struct drm_crtc *crtc, int x, int y,
 
 int atombios_crtc_set_base_atomic(struct drm_crtc *crtc,
                                   struct drm_framebuffer *fb,
-                                  int x, int y)
+                                  int x, int y, int enter)
 {
        struct drm_device *dev = crtc->dev;
        struct radeon_device *rdev = dev->dev_private;
index bfa090e1f512851e5702742d3eb01315306b624f..8752d3447b72a36e3305cb52d29113ccd2dcf567 100644 (file)
@@ -353,7 +353,7 @@ int radeon_crtc_set_base(struct drm_crtc *crtc, int x, int y,
 
 int radeon_crtc_set_base_atomic(struct drm_crtc *crtc,
                                struct drm_framebuffer *fb,
-                               int x, int y)
+                               int x, int y, int enter)
 {
        return radeon_crtc_do_set_base(crtc, fb, x, y, 1);
 }
index 9dd27c23a79891417a793181724cea985b950c7e..c4116d3d8d0650a60a8dfa9c14a4e6ba2d8c757e 100644 (file)
@@ -516,7 +516,7 @@ extern int atombios_crtc_set_base(struct drm_crtc *crtc, int x, int y,
                                   struct drm_framebuffer *old_fb);
 extern int atombios_crtc_set_base_atomic(struct drm_crtc *crtc,
                                         struct drm_framebuffer *fb,
-                                        int x, int y);
+                                        int x, int y, int enter);
 extern int atombios_crtc_mode_set(struct drm_crtc *crtc,
                                   struct drm_display_mode *mode,
                                   struct drm_display_mode *adjusted_mode,
@@ -528,7 +528,7 @@ extern int radeon_crtc_set_base(struct drm_crtc *crtc, int x, int y,
                                 struct drm_framebuffer *old_fb);
 extern int radeon_crtc_set_base_atomic(struct drm_crtc *crtc,
                                       struct drm_framebuffer *fb,
-                                      int x, int y);
+                                      int x, int y, int enter);
 extern int radeon_crtc_do_set_base(struct drm_crtc *crtc,
                                   struct drm_framebuffer *fb,
                                   int x, int y, int atomic);
index 59b7073b13fe334815fc3dd290b49e73c4e162d4..6a9f3935ea0b83df8e2bec54c35f0fe3c92c8189 100644 (file)
@@ -61,7 +61,8 @@ struct drm_crtc_helper_funcs {
        int (*mode_set_base)(struct drm_crtc *crtc, int x, int y,
                             struct drm_framebuffer *old_fb);
        int (*mode_set_base_atomic)(struct drm_crtc *crtc,
-                                   struct drm_framebuffer *fb, int x, int y);
+                                   struct drm_framebuffer *fb, int x, int y,
+                                   int is_enter);
 
        /* reload the current crtc LUT */
        void (*load_lut)(struct drm_crtc *crtc);