]> git.karo-electronics.de Git - mv-sheeva.git/blobdiff - drivers/gpu/drm/exynos/exynos_drm_fb.c
drm/exynos: Use struct drm_mode_fb_cmd2
[mv-sheeva.git] / drivers / gpu / drm / exynos / exynos_drm_fb.c
index 48d29cfd5240197f645c6732a9360bb255656f97..df5eec6c1aba785911c6d8c0110d77f8a82ee7e3 100644 (file)
@@ -29,7 +29,9 @@
 #include "drmP.h"
 #include "drm_crtc.h"
 #include "drm_crtc_helper.h"
+#include "drm_fb_helper.h"
 
+#include "exynos_drm_drv.h"
 #include "exynos_drm_fb.h"
 #include "exynos_drm_buf.h"
 #include "exynos_drm_gem.h"
  *
  * @fb: drm framebuffer obejct.
  * @exynos_gem_obj: exynos specific gem object containing a gem object.
- * @entry: pointer to exynos drm buffer entry object.
- *     - containing only the information to physically continuous memory
- *     region allocated at default framebuffer creation.
+ * @buffer: pointer to exynos_drm_gem_buffer object.
+ *     - contain the memory information to memory region allocated
+ *     at default framebuffer creation.
  */
 struct exynos_drm_fb {
        struct drm_framebuffer          fb;
        struct exynos_drm_gem_obj       *exynos_gem_obj;
-       struct exynos_drm_buf_entry     *entry;
+       struct exynos_drm_gem_buf       *buffer;
 };
 
 static void exynos_drm_fb_destroy(struct drm_framebuffer *fb)
@@ -63,8 +65,8 @@ static void exynos_drm_fb_destroy(struct drm_framebuffer *fb)
         * default framebuffer has no gem object so
         * a buffer of the default framebuffer should be released at here.
         */
-       if (!exynos_fb->exynos_gem_obj && exynos_fb->entry)
-               exynos_drm_buf_destroy(fb->dev, exynos_fb->entry);
+       if (!exynos_fb->exynos_gem_obj && exynos_fb->buffer)
+               exynos_drm_buf_destroy(fb->dev, exynos_fb->buffer);
 
        kfree(exynos_fb);
        exynos_fb = NULL;
@@ -102,7 +104,7 @@ static struct drm_framebuffer_funcs exynos_drm_fb_funcs = {
 
 static struct drm_framebuffer *
 exynos_drm_fb_init(struct drm_file *file_priv, struct drm_device *dev,
-                   struct drm_mode_fb_cmd *mode_cmd)
+                  struct drm_mode_fb_cmd2 *mode_cmd)
 {
        struct exynos_drm_fb *exynos_fb;
        struct drm_framebuffer *fb;
@@ -113,9 +115,6 @@ exynos_drm_fb_init(struct drm_file *file_priv, struct drm_device *dev,
 
        DRM_DEBUG_KMS("%s\n", __FILE__);
 
-       mode_cmd->pitch = max(mode_cmd->pitch,
-                       mode_cmd->width * (mode_cmd->bpp >> 3));
-
        DRM_LOG_KMS("drm fb create(%dx%d)\n",
                        mode_cmd->width, mode_cmd->height);
 
@@ -134,45 +133,46 @@ exynos_drm_fb_init(struct drm_file *file_priv, struct drm_device *dev,
 
        DRM_LOG_KMS("create: fb id: %d\n", fb->base.id);
 
-       size = mode_cmd->pitch * mode_cmd->height;
+       size = mode_cmd->pitches[0] * mode_cmd->height;
 
        /*
-        * mode_cmd->handle could be NULL at booting time or
+        * mode_cmd->handles[0] could be NULL at booting time or
         * with user request. if NULL, a new buffer or a gem object
         * would be allocated.
         */
-       if (!mode_cmd->handle) {
+       if (!mode_cmd->handles[0]) {
                if (!file_priv) {
-                       struct exynos_drm_buf_entry *entry;
+                       struct exynos_drm_gem_buf *buffer;
 
                        /*
                         * in case that file_priv is NULL, it allocates
                         * only buffer and this buffer would be used
                         * for default framebuffer.
                         */
-                       entry = exynos_drm_buf_create(dev, size);
-                       if (IS_ERR(entry)) {
-                               ret = PTR_ERR(entry);
+                       buffer = exynos_drm_buf_create(dev, size);
+                       if (IS_ERR(buffer)) {
+                               ret = PTR_ERR(buffer);
                                goto err_buffer;
                        }
 
-                       exynos_fb->entry = entry;
+                       exynos_fb->buffer = buffer;
 
-                       DRM_LOG_KMS("default fb: paddr = 0x%lx, size = 0x%x\n",
-                                       (unsigned long)entry->paddr, size);
+                       DRM_LOG_KMS("default: dma_addr = 0x%lx, size = 0x%x\n",
+                                       (unsigned long)buffer->dma_addr, size);
 
                        goto out;
                } else {
-                       exynos_gem_obj = exynos_drm_gem_create(file_priv, dev,
-                                                       size,
-                                                       &mode_cmd->handle);
+                       exynos_gem_obj = exynos_drm_gem_create(dev, file_priv,
+                                                       &mode_cmd->handles[0],
+                                                       size);
                        if (IS_ERR(exynos_gem_obj)) {
                                ret = PTR_ERR(exynos_gem_obj);
                                goto err_buffer;
                        }
                }
        } else {
-               obj = drm_gem_object_lookup(dev, file_priv, mode_cmd->handle);
+               obj = drm_gem_object_lookup(dev, file_priv,
+                               mode_cmd->handles[0]);
                if (!obj) {
                        DRM_ERROR("failed to lookup gem object.\n");
                        goto err_buffer;
@@ -189,10 +189,10 @@ exynos_drm_fb_init(struct drm_file *file_priv, struct drm_device *dev,
         * so that default framebuffer has no its own gem object,
         * only its own buffer object.
         */
-       exynos_fb->entry = exynos_gem_obj->entry;
+       exynos_fb->buffer = exynos_gem_obj->buffer;
 
-       DRM_LOG_KMS("paddr = 0x%lx, size = 0x%x, gem object = 0x%x\n",
-                       (unsigned long)exynos_fb->entry->paddr, size,
+       DRM_LOG_KMS("dma_addr = 0x%lx, size = 0x%x, gem object = 0x%x\n",
+                       (unsigned long)exynos_fb->buffer->dma_addr, size,
                        (unsigned int)&exynos_gem_obj->base);
 
 out:
@@ -212,34 +212,44 @@ err_init:
 }
 
 struct drm_framebuffer *exynos_drm_fb_create(struct drm_device *dev,
-                                             struct drm_file *file_priv,
-                                             struct drm_mode_fb_cmd *mode_cmd)
+                                            struct drm_file *file_priv,
+                                            struct drm_mode_fb_cmd2 *mode_cmd)
 {
        DRM_DEBUG_KMS("%s\n", __FILE__);
 
        return exynos_drm_fb_init(file_priv, dev, mode_cmd);
 }
 
-struct exynos_drm_buf_entry *exynos_drm_fb_get_buf(struct drm_framebuffer *fb)
+struct exynos_drm_gem_buf *exynos_drm_fb_get_buf(struct drm_framebuffer *fb)
 {
        struct exynos_drm_fb *exynos_fb = to_exynos_fb(fb);
-       struct exynos_drm_buf_entry *entry;
+       struct exynos_drm_gem_buf *buffer;
 
        DRM_DEBUG_KMS("%s\n", __FILE__);
 
-       entry = exynos_fb->entry;
-       if (!entry)
+       buffer = exynos_fb->buffer;
+       if (!buffer)
                return NULL;
 
-       DRM_DEBUG_KMS("vaddr = 0x%lx, paddr = 0x%lx\n",
-                       (unsigned long)entry->vaddr,
-                       (unsigned long)entry->paddr);
+       DRM_DEBUG_KMS("vaddr = 0x%lx, dma_addr = 0x%lx\n",
+                       (unsigned long)buffer->kvaddr,
+                       (unsigned long)buffer->dma_addr);
+
+       return buffer;
+}
+
+static void exynos_drm_output_poll_changed(struct drm_device *dev)
+{
+       struct exynos_drm_private *private = dev->dev_private;
+       struct drm_fb_helper *fb_helper = private->fb_helper;
 
-       return entry;
+       if (fb_helper)
+               drm_fb_helper_hotplug_event(fb_helper);
 }
 
 static struct drm_mode_config_funcs exynos_drm_mode_config_funcs = {
        .fb_create = exynos_drm_fb_create,
+       .output_poll_changed = exynos_drm_output_poll_changed,
 };
 
 void exynos_drm_mode_config_init(struct drm_device *dev)