radeon_ms: fix framebuffer code
authorJerome Glisse <glisse@freedesktop.org>
Sun, 6 Apr 2008 17:23:20 +0000 (19:23 +0200)
committerJerome Glisse <glisse@freedesktop.org>
Sun, 6 Apr 2008 17:23:20 +0000 (19:23 +0200)
linux-core/amd.h [new symlink]
linux-core/radeon_ms_fb.c
shared-core/amd.h [new file with mode: 0644]
shared-core/radeon_ms.h

diff --git a/linux-core/amd.h b/linux-core/amd.h
new file mode 120000 (symlink)
index 0000000..b488244
--- /dev/null
@@ -0,0 +1 @@
+../shared-core/amd.h
\ No newline at end of file
index a7f39f1..8b720f8 100644 (file)
 #include "drm.h"
 #include "drm_crtc.h"
 #include "radeon_ms.h"
+#include "amd.h"
 
-struct radeonfb_par {
-       struct drm_device       *dev;
-       struct drm_crtc         *crtc;
-       struct drm_display_mode *fb_mode;
-       struct drm_framebuffer  *fb;
-};
 
 static int radeonfb_setcolreg(unsigned regno, unsigned red,
                               unsigned green, unsigned blue,
                               unsigned transp, struct fb_info *info)
 {
-       struct radeonfb_par *par = info->par;
+       struct amd_fb *par = info->par;
        struct drm_framebuffer *fb = par->fb;
        struct drm_crtc *crtc = par->crtc;
 
@@ -88,7 +83,7 @@ static int radeonfb_setcolreg(unsigned regno, unsigned red,
 static int radeonfb_check_var(struct fb_var_screeninfo *var,
                               struct fb_info *info)
 {
-        struct radeonfb_par *par = info->par;
+        struct amd_fb *par = info->par;
        struct drm_framebuffer *fb = par->fb;
 
         if (!var->pixclock)
@@ -177,7 +172,7 @@ static bool radeonfb_mode_equal(struct drm_display_mode *mode1,
 
 static int radeonfb_set_par(struct fb_info *info)
 {
-       struct radeonfb_par *par = info->par;
+       struct amd_fb *par = info->par;
        struct drm_framebuffer *fb = par->fb;
        struct drm_device *dev = par->dev;
         struct drm_display_mode *drm_mode, *search_mode;
@@ -249,6 +244,7 @@ static int radeonfb_set_par(struct fb_info *info)
 
        if (par->crtc->enabled) {
                if (!drm_mode_equal(&par->crtc->mode, drm_mode)) {
+                       par->crtc->fb = par->fb;
                        if (!drm_crtc_set_mode(par->crtc, drm_mode, 0, 0)) {
                                return -EINVAL;
                        }
@@ -275,14 +271,15 @@ static struct fb_ops radeonfb_ops = {
 
 int radeonfb_probe(struct drm_device *dev, struct drm_crtc *crtc)
 {
+       struct drm_radeon_private *dev_priv = dev->dev_private;
        struct fb_info *info;
-       struct radeonfb_par *par;
+       struct amd_fb *par;
        struct device *device = &dev->pdev->dev; 
        struct drm_framebuffer *fb;
        struct drm_display_mode *mode = crtc->desired_mode;
        int ret;
 
-       info = framebuffer_alloc(sizeof(struct radeonfb_par), device);
+       info = framebuffer_alloc(sizeof(struct amd_fb), device);
        if (!info){
                DRM_INFO("[radeon_ms] framebuffer_alloc failed\n");
                return -EINVAL;
@@ -325,6 +322,7 @@ int radeonfb_probe(struct drm_device *dev, struct drm_crtc *crtc)
 
        fb->fbdev = info;
        par = info->par;
+       dev_priv->fb = par;
        par->dev = dev;
        par->crtc = crtc;
        par->fb = fb;
@@ -441,16 +439,22 @@ EXPORT_SYMBOL(radeonfb_probe);
 
 int radeonfb_remove(struct drm_device *dev, struct drm_crtc *crtc)
 {
-       struct drm_framebuffer *fb = crtc->fb;
-       struct fb_info *info = fb->fbdev;
-       
-       if (info) {
-               unregister_framebuffer(info);
-               drm_bo_kunmap(&fb->kmap);
-               drm_bo_usage_deref_unlocked(&fb->bo);
-               drm_framebuffer_destroy(fb);
-               framebuffer_release(info);
+       struct drm_radeon_private *dev_priv = dev->dev_private;
+       struct amd_fb *fb = dev_priv->fb;
+       struct fb_info *info;
+
+       if (fb == NULL || fb->fb == NULL || fb->fb->fbdev == NULL) {
+               DRM_INFO("[radeon_ms] %s: no crtc, or fb or fbdev\n",
+                        __func__);
+               return 0;
        }
+       info = fb->fb->fbdev;
+       unregister_framebuffer(info);
+       drm_bo_kunmap(&fb->fb->kmap);
+       drm_bo_usage_deref_unlocked(&fb->fb->bo);
+       drm_framebuffer_destroy(fb->fb);
+       framebuffer_release(info);
+       dev_priv->fb = NULL;
        return 0;
 }
 EXPORT_SYMBOL(radeonfb_remove);
diff --git a/shared-core/amd.h b/shared-core/amd.h
new file mode 100644 (file)
index 0000000..ac6195e
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2007 Jérôme Glisse
+ * All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+ * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Authors:
+ *    Jerome Glisse <glisse@freedesktop.org>
+ */
+#ifndef __AMD_H__
+#define __AMD_H__
+
+/* struct amd_fb amd is for storing amd framebuffer informations
+ */
+struct amd_fb
+{
+       struct drm_device       *dev;
+       struct drm_crtc         *crtc;
+       struct drm_display_mode *fb_mode;
+       struct drm_framebuffer  *fb;
+};
+
+#endif
index e4010d8..bbd0477 100644 (file)
@@ -35,6 +35,7 @@
 #include "radeon_ms_drm.h"
 #include "radeon_ms_rom.h"
 #include "radeon_ms_properties.h"
+#include "amd.h"
 #include "amd_cbuffer.h"
 
 #define DRIVER_AUTHOR      "Jerome Glisse, Dave Airlie,  Gareth Hughes, "\
@@ -292,6 +293,8 @@ struct drm_radeon_private {
        uint32_t                    *ring_buffer;
        uint32_t                    *write_back_area;
        const uint32_t              *microcode;
+       /* framebuffer */
+       struct amd_fb               *fb;
        /* card family */
        uint32_t                    usec_timeout;
        uint32_t                    family;