[Openchrome-devel] drm-openchrome: 2 commits - drivers/gpu/drm include/drm/drm_fb_helper.h

James Simmons jsimmons at kemper.freedesktop.org
Sat May 25 07:10:54 PDT 2013


 drivers/gpu/drm/via/via_fb.c   |   49 ++++++++++++++++++++---------------------
 drivers/gpu/drm/via/via_hdmi.c |   18 ++++++++-------
 include/drm/drm_fb_helper.h    |    1 
 3 files changed, 34 insertions(+), 34 deletions(-)

New commits:
commit eacf12f070d96fa4307da51d659ad2d0f2553a7c
Author: James Simmons <jsimmons at infradead.org>
Date:   Sat May 25 10:07:58 2013 -0400

    Instead of stuffing some pointer into struct drm_fb_helper that we
    added instead create a special container that holds the ttm_bo_kmap_obj
    for the fbdev framebuffer. This will make it acceptable for merging
    upstream.

diff --git a/drivers/gpu/drm/via/via_fb.c b/drivers/gpu/drm/via/via_fb.c
index 5a9ea9b..abd7b3a 100644
--- a/drivers/gpu/drm/via/via_fb.c
+++ b/drivers/gpu/drm/via/via_fb.c
@@ -25,6 +25,11 @@
 #include "drm_fb_helper.h"
 #include "drm_crtc_helper.h"
 
+struct ttm_fb_helper {
+	struct drm_fb_helper base;
+	struct ttm_bo_kmap_obj kmap;
+};
+
 static int
 cle266_mem_type(struct drm_via_private *dev_priv, struct pci_dev *bridge)
 {
@@ -990,26 +995,23 @@ static int
 via_fb_probe(struct drm_fb_helper *helper,
 		struct drm_fb_helper_surface_size *sizes)
 {
+	struct ttm_fb_helper *ttmfb = container_of(helper, struct ttm_fb_helper, base);
 	struct drm_via_private *dev_priv = helper->dev->dev_private;
+	struct ttm_bo_kmap_obj *kmap = &ttmfb->kmap;
 	struct fb_info *info = helper->fbdev;
-	struct ttm_bo_kmap_obj *kmap = NULL;
 	struct drm_framebuffer *fb = NULL;
 	struct drm_gem_object *obj = NULL;
 	struct drm_mode_fb_cmd2 mode_cmd;
 	struct apertures_struct *ap;
 	int size, ret = 0;
-	void *ptr;
 
 	/* Already exist */
 	if (helper->fb)
 		return ret;
 
-	size = sizeof(*fb) + sizeof(*kmap);
-	ptr = kzalloc(size, GFP_KERNEL);
-	if (ptr == NULL)
+	fb = kzalloc(sizeof(*fb), GFP_KERNEL);
+	if (fb == NULL)
 		return -ENOMEM;
-	fb = ptr;
-	kmap = ptr + sizeof(*fb);
 
 	mode_cmd.height = sizes->surface_height;
 	mode_cmd.width = sizes->surface_width;
@@ -1041,11 +1043,9 @@ via_fb_probe(struct drm_fb_helper *helper,
 
 	obj->driver_private = kmap->bo;
 	fb->helper_private = obj;
+	ttmfb->base.fb = fb;
 
 	drm_helper_mode_fill_fb_struct(fb, &mode_cmd);
-	helper->helper_private = kmap;
-	helper->fb = fb;
-
 	info->fix.smem_start = kmap->bo->mem.bus.base +
 				kmap->bo->mem.bus.offset;
 	info->fix.smem_len = info->screen_size = size;
@@ -1069,14 +1069,13 @@ out_err:
 		if (kmap->bo) {
 			ttm_bo_unpin(kmap->bo, kmap);
 			ttm_bo_unref(&kmap->bo);
-			helper->helper_private = NULL;
 		}
 
 		if (obj) {
 			drm_gem_object_unreference_unlocked(obj);
 			helper->fb->helper_private = NULL;
 		}
-		kfree(ptr);
+		kfree(fb);
 	}
 	return ret;
 }
@@ -1175,7 +1174,7 @@ static struct fb_ops viafb_ops = {
 int
 via_framebuffer_init(struct drm_device *dev, struct drm_fb_helper **ptr)
 {
-	struct drm_fb_helper *helper;
+	struct ttm_fb_helper *helper;
 	struct fb_info *info;
 	int ret = -ENOMEM;
 
@@ -1188,8 +1187,8 @@ via_framebuffer_init(struct drm_device *dev, struct drm_fb_helper **ptr)
 	}
 
 	helper = info->par;
-	helper->fbdev = info;
-	helper->funcs = &via_fb_helper_funcs;
+	helper->base.fbdev = info;
+	helper->base.funcs = &via_fb_helper_funcs;
 
 	strcpy(info->fix.id, dev->driver->name);
 	strcat(info->fix.id, "drmfb");
@@ -1207,18 +1206,18 @@ via_framebuffer_init(struct drm_device *dev, struct drm_fb_helper **ptr)
 	if (ret)
 		goto out_err;
 
-	ret = drm_fb_helper_init(dev, helper, dev->num_crtcs,
+	ret = drm_fb_helper_init(dev, &helper->base, dev->num_crtcs,
 				dev->mode_config.num_connector);
 	if (ret) {
 		fb_dealloc_cmap(&info->cmap);
 		goto out_err;
 	}
 
-	drm_fb_helper_single_add_all_connectors(helper);
+	drm_fb_helper_single_add_all_connectors(&helper->base);
 	drm_helper_disable_unused_functions(dev);
-	drm_fb_helper_initial_config(helper, 32);
+	drm_fb_helper_initial_config(&helper->base, 32);
 	drm_kms_helper_poll_init(dev);
-	*ptr = helper;
+	*ptr = (struct drm_fb_helper *) helper;
 out_err:
 	if (ret)
 		framebuffer_release(info);
@@ -1230,13 +1229,14 @@ via_framebuffer_fini(struct drm_device *dev)
 {
 	struct drm_via_private *dev_priv = dev->dev_private;
 	struct drm_fb_helper *helper = dev_priv->helper;
-	struct ttm_bo_kmap_obj *kmap;
+	struct ttm_fb_helper *ttmfb;
 	struct drm_gem_object *obj;
 	struct fb_info *info;
 
 	if (!helper)
 		return;
 
+	ttmfb = container_of(helper, struct ttm_fb_helper, base);
 	info = helper->fbdev;
 	if (info) {
 		unregister_framebuffer(info);
@@ -1249,11 +1249,10 @@ via_framebuffer_fini(struct drm_device *dev)
 		helper->fbdev = NULL;
 	}
 
-	kmap = helper->helper_private;
-	if (kmap) {
-		ttm_bo_unpin(kmap->bo, kmap);
-		ttm_bo_unref(&kmap->bo);
-		helper->helper_private = NULL;
+	ttmfb = container_of(helper, struct ttm_fb_helper, base);
+	if (ttmfb->kmap.bo) {
+		ttm_bo_unpin(ttmfb->kmap.bo, &ttmfb->kmap);
+		ttm_bo_unref(&ttmfb->kmap.bo);
 	}
 
 	obj = helper->fb->helper_private;
diff --git a/include/drm/drm_fb_helper.h b/include/drm/drm_fb_helper.h
index 9187e8b..471f276 100644
--- a/include/drm/drm_fb_helper.h
+++ b/include/drm/drm_fb_helper.h
@@ -91,7 +91,6 @@ struct drm_fb_helper {
 	struct fb_info *fbdev;
 	u32 pseudo_palette[17];
 	struct list_head kernel_fb_list;
-	void *helper_private;
 
 	/* we got a hotplug but fbdev wasn't running the console
 	   delay until next set_par */
commit 484c66c400daa76bd6840f195e8effa9d39dfb3c
Author: James Simmons <jsimmons at infradead.org>
Date:   Sat May 25 09:28:13 2013 -0400

    Fixed proper detection of the presence of a HDMI monitor. Register
    0xC0B4 expects the absolute offset in the edid not the relative
    offset in respect of each section. Fixed a one off for reallocating
    the EDID buffer if the number of extenstions obtain is different
    then reported in the last byte of the first block of EDID data.

diff --git a/drivers/gpu/drm/via/via_hdmi.c b/drivers/gpu/drm/via/via_hdmi.c
index 8caaf9f..b37405a 100644
--- a/drivers/gpu/drm/via/via_hdmi.c
+++ b/drivers/gpu/drm/via/via_hdmi.c
@@ -408,7 +408,8 @@ via_check_hdmi_i2c_status(struct drm_via_private *dev_priv,
 }
 
 unsigned int
-via_ddc_read_bytes_by_hdmi(struct drm_via_private *dev_priv, unsigned char *block)
+via_ddc_read_bytes_by_hdmi(struct drm_via_private *dev_priv, unsigned int offset,
+			   unsigned char *block)
 {
 	unsigned int status = true, temp = 0, i;
 
@@ -432,8 +433,8 @@ via_ddc_read_bytes_by_hdmi(struct drm_via_private *dev_priv, unsigned char *bloc
 	if (status)
 		status = via_check_hdmi_i2c_status(dev_priv, 0x0008, true);
 
-	/* Offset - always read at start of buffer */
-	temp = 0;
+	/* Offset */
+	temp = offset;
 	temp <<= 16;
 	temp |= VIA_READ(0xC0B4) & 0xFF00FFFF;
 	VIA_WRITE(0xC0B4, temp);
@@ -496,7 +497,7 @@ via_hdmi_get_edid(struct drm_connector *connector)
 
 	/* base block fetch */
 	for (i = 0; i < 4; i++) {
-		if (!via_ddc_read_bytes_by_hdmi(dev_priv, block))
+		if (!via_ddc_read_bytes_by_hdmi(dev_priv, 0, block))
 			goto out;
 
 		if (drm_edid_block_valid(block, 0, print_bad_edid))
@@ -513,7 +514,7 @@ via_hdmi_get_edid(struct drm_connector *connector)
 	/* parse the extensions if present */
 	if (block[0x7e]) {
 		u8 *new = krealloc(block, (block[0x7e] + 1) * EDID_LENGTH, GFP_KERNEL);
-		int valid_extensions = 0;
+		int valid_extensions = 0, offset = 0;
 
 		if (!new)
 			goto out;
@@ -521,9 +522,10 @@ via_hdmi_get_edid(struct drm_connector *connector)
 
 		for (j = 1; j <= block[0x7e]; j++) {
 			for (i = 0; i < 4; i++) {
-				new = block + (valid_extensions + 1) * EDID_LENGTH;
+				offset = (valid_extensions + 1) * EDID_LENGTH;
+				new = block + offset;
 
-				if (!via_ddc_read_bytes_by_hdmi(dev_priv, new))
+				if (!via_ddc_read_bytes_by_hdmi(dev_priv, offset, new))
 					goto out;
 
 				if (drm_edid_block_valid(new, j, print_bad_edid)) {
@@ -545,7 +547,7 @@ via_hdmi_get_edid(struct drm_connector *connector)
 			block[EDID_LENGTH - 1] += block[0x7e] - valid_extensions;
 			block[0x7e] = valid_extensions;
 
-			new = krealloc(block, valid_extensions * EDID_LENGTH, GFP_KERNEL);
+			new = krealloc(block, (valid_extensions + 1) * EDID_LENGTH, GFP_KERNEL);
 			if (!new)
 				goto out;
 			block = new;


More information about the Openchrome-devel mailing list