[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