From: <al...@ke...> - 2007-05-17 16:00:23
|
linux-core/drm_crtc.c | 16 ++++++++++++++-- linux-core/drm_fb.c | 4 +++- 2 files changed, 17 insertions(+), 3 deletions(-) New commits: diff-tree fd63ea971322246734fca5977a800c3ef51cc3fe (from 2222bd767f9fc02d05ebd0f35a8ceeff2f032c94) Author: Alan Hourihane <al...@fa...> Date: Thu May 17 17:00:11 2007 +0100 Grab the default mode if the preferred mode isn't available. Fix an overflow problem. diff --git a/linux-core/drm_crtc.c b/linux-core/drm_crtc.c index d710a4e..13a01fe 100644 --- a/linux-core/drm_crtc.c +++ b/linux-core/drm_crtc.c @@ -252,7 +252,7 @@ EXPORT_SYMBOL(drm_crtc_in_use); * Detailed mode info for a standard 640x480@60Hz monitor */ static struct drm_display_mode std_mode[] = { - { DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25200, 640, 656, + { DRM_MODE("640x480", DRM_MODE_TYPE_DEFAULT, 25200, 640, 656, 752, 800, 0, 480, 490, 492, 525, 0, V_NHSYNC | V_NVSYNC) }, /* 640x480@60Hz */ }; @@ -792,6 +792,18 @@ static void drm_pick_crtcs (drm_device_t break; } + + /* No preferred mode, let's select another which should pick + * the default 640x480 if nothing else is here. + * + */ + if (!des_mode || !(des_mode->flags & DRM_MODE_TYPE_PREFERRED)) { + list_for_each_entry(des_mode, &output->modes, head) { + if (des_mode->flags & DRM_MODE_TYPE_DEFAULT) + break; + } + } + c = -1; list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { c++; @@ -823,7 +835,7 @@ clone: output->crtc->desired_mode = des_mode; output->initial_x = 0; output->initial_y = 0; - DRM_DEBUG("Desired mode for CRTC %d is %dx%x\n",c,des_mode->hdisplay,des_mode->vdisplay); + DRM_DEBUG("Desired mode for CRTC %d is %s\n",c,des_mode->name); break; } } diff --git a/linux-core/drm_fb.c b/linux-core/drm_fb.c index 27d80d7..118967b 100644 --- a/linux-core/drm_fb.c +++ b/linux-core/drm_fb.c @@ -351,7 +351,9 @@ int drmfb_probe(struct drm_device *dev, info->var.vsync_len = mode->vsync_end - mode->vsync_start; info->var.upper_margin = mode->vtotal - mode->vsync_end; info->var.pixclock = 10000000 / mode->htotal * 1000 / - mode->vtotal * 100000 / mode->vrefresh; + mode->vtotal * 100; + /* avoid overflow */ + info->var.pixclock = info->var.pixclock * 1000 / mode->vrefresh; DRM_DEBUG("fb depth is %d\n", fb->depth); switch(fb->depth) { |
From: <al...@ke...> - 2007-05-17 18:28:20
|
linux-core/drm_crtc.c | 9 +++++---- 1 files changed, 5 insertions(+), 4 deletions(-) New commits: diff-tree 07a5fbaa612a777de37b5dc0112f6f3f3f84c486 (from b7bf317f42915dc4f5fde4a696e37985cea45104) Author: Alan Hourihane <al...@fa...> Date: Thu May 17 19:28:03 2007 +0100 Move destruction of crtc as intelfb_remove uses the crtc to locate the fb. diff --git a/linux-core/drm_crtc.c b/linux-core/drm_crtc.c index ab8b468..7544eac 100644 --- a/linux-core/drm_crtc.c +++ b/linux-core/drm_crtc.c @@ -971,10 +971,6 @@ void drm_mode_config_cleanup(drm_device_ drm_output_destroy(output); } - list_for_each_entry_safe(crtc, ct, &dev->mode_config.crtc_list, head) { - drm_crtc_destroy(crtc); - } - list_for_each_entry_safe(mode, mt, &dev->mode_config.usermode_list, head) { drm_mode_destroy(dev, mode); } @@ -989,6 +985,11 @@ void drm_mode_config_cleanup(drm_device_ } drm_framebuffer_destroy(fb); } + + list_for_each_entry_safe(crtc, ct, &dev->mode_config.crtc_list, head) { + drm_crtc_destroy(crtc); + } + } EXPORT_SYMBOL(drm_mode_config_cleanup); |
From: <al...@ke...> - 2007-05-17 18:32:56
|
linux-core/intel_fb.c | 4 +++- 1 files changed, 3 insertions(+), 1 deletion(-) New commits: diff-tree c0479dad8e34a51efebfaa05b0d329aa7d2b95d1 (from 07a5fbaa612a777de37b5dc0112f6f3f3f84c486) Author: Alan Hourihane <al...@fa...> Date: Thu May 17 19:32:46 2007 +0100 bring in change from drm_fb.c diff --git a/linux-core/intel_fb.c b/linux-core/intel_fb.c index 7126c16..9d7b732 100644 --- a/linux-core/intel_fb.c +++ b/linux-core/intel_fb.c @@ -504,7 +504,9 @@ int intelfb_probe(struct drm_device *dev info->var.vsync_len = mode->vsync_end - mode->vsync_start; info->var.upper_margin = mode->vtotal - mode->vsync_end; info->var.pixclock = 10000000 / mode->htotal * 1000 / - mode->vtotal * 100000 / mode->vrefresh; + mode->vtotal * 100; + /* avoid overflow */ + info->var.pixclock = info->var.pixclock * 1000 / mode->vrefresh; info->pixmap.size = 64*1024; info->pixmap.buf_align = 8; |
From: <al...@ke...> - 2007-05-17 22:33:59
|
linux-core/drm_fb.c | 1 + linux-core/intel_fb.c | 1 + 2 files changed, 2 insertions(+) New commits: diff-tree 95945bbf226610ba4f41381fd0436722082397ec (from c0479dad8e34a51efebfaa05b0d329aa7d2b95d1) Author: Alan Hourihane <al...@fa...> Date: Thu May 17 23:33:48 2007 +0100 Set crtcinfo on temporary mode diff --git a/linux-core/drm_fb.c b/linux-core/drm_fb.c index 5f2b1ce..173864d 100644 --- a/linux-core/drm_fb.c +++ b/linux-core/drm_fb.c @@ -259,6 +259,7 @@ static int drmfb_set_par(struct fb_info drm_mode->clock = PICOS2KHZ(var->pixclock); drm_mode->vrefresh = drm_mode_vrefresh(drm_mode); drm_mode_set_name(drm_mode); + drm_mode_set_crtcinfo(drm_mode, CRTC_INTERLACE_HALVE_V); #endif if (!drm_crtc_set_mode(par->crtc, drm_mode, 0, 0)) diff --git a/linux-core/intel_fb.c b/linux-core/intel_fb.c index 9d7b732..3c865a2 100644 --- a/linux-core/intel_fb.c +++ b/linux-core/intel_fb.c @@ -262,6 +262,7 @@ static int intelfb_set_par(struct fb_inf drm_mode->clock = PICOS2KHZ(var->pixclock); drm_mode->vrefresh = drm_mode_vrefresh(drm_mode); drm_mode_set_name(drm_mode); + drm_mode_set_crtcinfo(drm_mode, CRTC_INTERLACE_HALVE_V); #endif if (!drm_crtc_set_mode(par->crtc, drm_mode, 0, 0)) |
From: <al...@ke...> - 2007-05-18 12:59:57
|
shared-core/drm.h | 1 - 1 files changed, 1 deletion(-) New commits: diff-tree 3851600b3450697e20286b1937f3e51397f1965a (from 315cf14af814da60285adb95238181de430c6f68) Author: Alan Hourihane <al...@fa...> Date: Fri May 18 13:59:46 2007 +0100 Fix merge problem. diff --git a/shared-core/drm.h b/shared-core/drm.h index 6453669..0f4a878 100644 --- a/shared-core/drm.h +++ b/shared-core/drm.h @@ -789,7 +789,6 @@ typedef struct drm_fence_arg { typedef enum { drm_bo_type_dc, - drm_bo_type_kernel, /* for initial kernel allocations */ drm_bo_type_user, drm_bo_type_fake, drm_bo_type_kernel, /* for initial kernel allocations */ |
From: <jb...@ke...> - 2007-05-25 01:41:55
|
linux-core/i915_drv.c | 5 ++--- 1 files changed, 2 insertions(+), 3 deletions(-) New commits: diff-tree fa92e1f2ec396d2e772734f726a0958801b9fc99 (from 462d5a0dfc80dfa02da3d24d30ad90ad0387f0a2) Author: Jesse Barnes <jb...@ho...> Date: Thu May 24 18:41:44 2007 -0700 Suspend/resume shouldn't call drm_initial_config (seems to work ok for me now), also we should fail if we can't enable the device at resume time. diff --git a/linux-core/i915_drv.c b/linux-core/i915_drv.c index ffdbab0..d58ca58 100644 --- a/linux-core/i915_drv.c +++ b/linux-core/i915_drv.c @@ -172,7 +172,8 @@ static int i915_resume(struct pci_dev *p pci_set_power_state(pdev, PCI_D0); pci_restore_state(pdev); - pci_enable_device(pdev); + if (pci_enable_device(pdev)) + return -1; /* Disable outputs */ list_for_each_entry(output, &dev->mode_config.output_list, head) @@ -294,8 +295,6 @@ static int i915_resume(struct pci_dev *p vgaHWLock(hwp); #endif - drm_initial_config(dev, 0); - return 0; } |
From: <al...@ke...> - 2007-06-28 20:25:32
|
linux-core/drm_crtc.c | 15 ++++++++------- linux-core/drm_modes.c | 8 +++++--- 2 files changed, 13 insertions(+), 10 deletions(-) New commits: diff-tree e79e2a58161d44754fd55507e155b7e12a09c4d2 (from fa92e1f2ec396d2e772734f726a0958801b9fc99) Author: Alan Hourihane <al...@fa...> Date: Thu Jun 28 21:25:13 2007 +0100 Fix type/flags usage problem to check for preferred modes. Add more debugging to help diagnose problems. diff --git a/linux-core/drm_crtc.c b/linux-core/drm_crtc.c index 245fe5b..04d3b72 100644 --- a/linux-core/drm_crtc.c +++ b/linux-core/drm_crtc.c @@ -436,8 +436,11 @@ bool drm_crtc_set_mode(struct drm_crtc * */ crtc->funcs->mode_set(crtc, mode, adjusted_mode, x, y); list_for_each_entry(output, &dev->mode_config.output_list, head) { - if (output->crtc == crtc) + if (output->crtc == crtc) { + dev_warn(&output->dev->pdev->dev, "%s: set mode %s\n", + output->name, mode->name); output->funcs->mode_set(output, mode, adjusted_mode); + } } /* Now, enable the clocks, plane, pipe, and outputs that we set up. */ @@ -787,16 +790,14 @@ static void drm_pick_crtcs (drm_device_t des_mode = NULL; list_for_each_entry(des_mode, &output->modes, head) { - if (des_mode->flags & DRM_MODE_TYPE_PREFERRED) + if (des_mode->type & DRM_MODE_TYPE_PREFERRED) break; } - /* No preferred mode, let's select another which should pick - * the default 640x480 if nothing else is here. - */ - if (!des_mode || !(des_mode->flags & DRM_MODE_TYPE_PREFERRED)) { + /* No preferred mode, let's just select the first available */ + if (!des_mode || !(des_mode->type & DRM_MODE_TYPE_PREFERRED)) { list_for_each_entry(des_mode, &output->modes, head) { - if (des_mode->flags & DRM_MODE_TYPE_DEFAULT) + if (des_mode) break; } } diff --git a/linux-core/drm_modes.c b/linux-core/drm_modes.c index 41b5fad..fd00841 100644 --- a/linux-core/drm_modes.c +++ b/linux-core/drm_modes.c @@ -46,12 +46,12 @@ void drm_mode_debug_printmodeline(struct drm_device *dev, struct drm_display_mode *mode) { - DRM_DEBUG("Modeline %d:\"%s\" %d %d %d %d %d %d %d %d %d %d\n", + DRM_DEBUG("Modeline %d:\"%s\" %d %d %d %d %d %d %d %d %d %d 0x%x\n", mode->mode_id, mode->name, mode->vrefresh, mode->clock, mode->hdisplay, mode->hsync_start, mode->hsync_end, mode->htotal, mode->vdisplay, mode->vsync_start, - mode->vsync_end, mode->vtotal); + mode->vsync_end, mode->vtotal, mode->type); } EXPORT_SYMBOL(drm_mode_debug_printmodeline); @@ -387,8 +387,10 @@ void drm_mode_prune_invalid(struct drm_d list_for_each_entry_safe(mode, t, mode_list, head) { if (mode->status != MODE_OK) { list_del(&mode->head); - if (verbose) + if (verbose) { + drm_mode_debug_printmodeline(dev, mode); DRM_DEBUG("Not using %s mode %d\n", mode->name, mode->status); + } kfree(mode); } } |
From: <al...@ke...> - 2007-06-29 19:59:31
|
shared-core/i915_dma.c | 28 ++++++++++++++++++++++++++++ 1 files changed, 28 insertions(+) New commits: diff-tree adff58223f4568d084cf62d03d4ecfc3a6cec000 (from 14c49df06bb0b1adc0fa2a9bd575c454d39c7cf0) Author: Alan Hourihane <al...@fa...> Date: Fri Jun 29 20:58:16 2007 +0100 Bring back code from merge that was accidentally removed. diff --git a/shared-core/i915_dma.c b/shared-core/i915_dma.c index 59bf15e..008adc0 100644 --- a/shared-core/i915_dma.c +++ b/shared-core/i915_dma.c @@ -80,13 +80,41 @@ void i915_kernel_lost_context(drm_device int i915_dma_cleanup(drm_device_t * dev) { + drm_i915_private_t *dev_priv = (drm_i915_private_t *) dev->dev_private; + /* Make sure interrupts are disabled here because the uninstall ioctl * may not have been called from userspace and after dev_private * is freed, it's too late. */ + I915_WRITE(LP_RING + RING_LEN, 0); + if (dev->irq) drm_irq_uninstall(dev); + if (dev->dev_private) { + drm_i915_private_t *dev_priv = + (drm_i915_private_t *) dev->dev_private; + + if (dev_priv->ring.virtual_start) { + drm_core_ioremapfree(&dev_priv->ring.map, dev); + } + + if (dev_priv->status_page_dmah) { + drm_pci_free(dev, dev_priv->status_page_dmah); + /* Need to rewrite hardware status page */ + I915_WRITE(I915REG_HWS_PGA, 0x1ffff000); + } + if (dev_priv->status_gfx_addr) { + dev_priv->status_gfx_addr = 0; + drm_core_ioremapfree(&dev_priv->hws_map, dev); + I915_WRITE(I915REG_HWS_PGA, 0x1ffff000); + } + drm_free(dev->dev_private, sizeof(drm_i915_private_t), + DRM_MEM_DRIVER); + + dev->dev_private = NULL; + } + return 0; } |
From: <al...@ke...> - 2007-06-29 20:04:27
|
shared-core/i915_dma.c | 24 ------------------------ shared-core/i915_init.c | 10 ++++++++++ 2 files changed, 10 insertions(+), 24 deletions(-) New commits: diff-tree 70fd9351ed6c666def710fd61b542a7c975d9ac9 (from adff58223f4568d084cf62d03d4ecfc3a6cec000) Author: Alan Hourihane <al...@fa...> Date: Fri Jun 29 21:04:17 2007 +0100 Move out the code from i915_dma_cleanup to unload to match existing code. This needs verifying. diff --git a/shared-core/i915_dma.c b/shared-core/i915_dma.c index 008adc0..7dd6895 100644 --- a/shared-core/i915_dma.c +++ b/shared-core/i915_dma.c @@ -91,30 +91,6 @@ int i915_dma_cleanup(drm_device_t * dev) if (dev->irq) drm_irq_uninstall(dev); - if (dev->dev_private) { - drm_i915_private_t *dev_priv = - (drm_i915_private_t *) dev->dev_private; - - if (dev_priv->ring.virtual_start) { - drm_core_ioremapfree(&dev_priv->ring.map, dev); - } - - if (dev_priv->status_page_dmah) { - drm_pci_free(dev, dev_priv->status_page_dmah); - /* Need to rewrite hardware status page */ - I915_WRITE(I915REG_HWS_PGA, 0x1ffff000); - } - if (dev_priv->status_gfx_addr) { - dev_priv->status_gfx_addr = 0; - drm_core_ioremapfree(&dev_priv->hws_map, dev); - I915_WRITE(I915REG_HWS_PGA, 0x1ffff000); - } - drm_free(dev->dev_private, sizeof(drm_i915_private_t), - DRM_MEM_DRIVER); - - dev->dev_private = NULL; - } - return 0; } diff --git a/shared-core/i915_init.c b/shared-core/i915_init.c index e4a2cde..fd102b3 100644 --- a/shared-core/i915_init.c +++ b/shared-core/i915_init.c @@ -257,6 +257,10 @@ int i915_driver_unload(drm_device_t *dev { drm_i915_private_t *dev_priv = dev->dev_private; + if (dev_priv->ring.virtual_start) { + drm_core_ioremapfree(&dev_priv->ring.map, dev); + } + if (dev_priv->status_page_dmah) { drm_pci_free(dev, dev_priv->status_page_dmah); dev_priv->status_page_dmah = NULL; @@ -266,6 +270,12 @@ int i915_driver_unload(drm_device_t *dev I915_WRITE(I915REG_HWS_PGA, 0x1ffff000); } + if (dev_priv->status_gfx_addr) { + dev_priv->status_gfx_addr = 0; + drm_core_ioremapfree(&dev_priv->hws_map, dev); + I915_WRITE(I915REG_HWS_PGA, 0x1ffff000); + } + I915_WRITE(LP_RING + RING_LEN, 0); intel_modeset_cleanup(dev); |
From: <wal...@ke...> - 2007-07-19 14:59:02
|
linux-core/drm_crtc.c | 6 ++---- 1 files changed, 2 insertions(+), 4 deletions(-) New commits: diff-tree 43c9abdedc88807a40034513de842d6eeb8c3ed2 (from 70fd9351ed6c666def710fd61b542a7c975d9ac9) Author: Jakob Bornecrantz <ja...@tu...> Date: Thu Jul 19 16:58:23 2007 +0200 Fix unlocking of spinlock when we should not diff --git a/linux-core/drm_crtc.c b/linux-core/drm_crtc.c index 65ccc87..0ede157 100644 --- a/linux-core/drm_crtc.c +++ b/linux-core/drm_crtc.c @@ -59,10 +59,8 @@ again: } ret = idr_get_new_above(&dev->mode_config.crtc_idr, ptr, 1, &new_id); - if (ret == -EAGAIN) { - spin_unlock(&dev->mode_config.config_lock); - goto again; - } + if (ret == -EAGAIN) + goto again; return new_id; } |
From: <wal...@ke...> - 2007-07-20 09:38:02
|
linux-core/drm_crtc.c | 64 +++++++++++++++++++++++++------------------------- linux-core/drm_crtc.h | 2 - 2 files changed, 33 insertions(+), 33 deletions(-) New commits: diff-tree 9ccb8440f393a395941b211ee87d9addcfa6d69a (from 43c9abdedc88807a40034513de842d6eeb8c3ed2) Author: Jakob Bornecrantz <ja...@tu...> Date: Fri Jul 20 11:36:57 2007 +0200 Changed mode config spinlock to mutex diff --git a/linux-core/drm_crtc.c b/linux-core/drm_crtc.c index 0ede157..df00a7d 100644 --- a/linux-core/drm_crtc.c +++ b/linux-core/drm_crtc.c @@ -123,7 +123,7 @@ struct drm_framebuffer *drm_framebuffer_ /* Limit to single framebuffer for now */ if (dev->mode_config.num_fb > 1) { - spin_unlock(&dev->mode_config.config_lock); + mutex_unlock(&dev->mode_config.mutex); DRM_ERROR("Attempt to add multiple framebuffers failed\n"); return NULL; } @@ -572,11 +572,11 @@ struct drm_output *drm_output_create(drm /* output_set_monitor(output)? */ /* check for output_ignored(output)? */ - spin_lock(&dev->mode_config.config_lock); + mutex_lock(&dev->mode_config.mutex); list_add_tail(&output->head, &dev->mode_config.output_list); dev->mode_config.num_output++; - spin_unlock(&dev->mode_config.config_lock); + mutex_unlock(&dev->mode_config.mutex); return output; @@ -607,10 +607,10 @@ void drm_output_destroy(struct drm_outpu list_for_each_entry_safe(mode, t, &output->modes, head) drm_mode_remove(output, mode); - spin_lock(&dev->mode_config.config_lock); + mutex_lock(&dev->mode_config.mutex); drm_idr_put(dev, output->id); list_del(&output->head); - spin_unlock(&dev->mode_config.config_lock); + mutex_unlock(&dev->mode_config.mutex); kfree(output); } EXPORT_SYMBOL(drm_output_destroy); @@ -700,7 +700,7 @@ EXPORT_SYMBOL(drm_mode_destroy); */ void drm_mode_config_init(drm_device_t *dev) { - spin_lock_init(&dev->mode_config.config_lock); + mutex_init(&dev->mode_config.mutex); INIT_LIST_HEAD(&dev->mode_config.fb_list); INIT_LIST_HEAD(&dev->mode_config.crtc_list); INIT_LIST_HEAD(&dev->mode_config.output_list); @@ -858,7 +858,7 @@ bool drm_initial_config(drm_device_t *de struct drm_output *output; int ret = false; - spin_lock(&dev->mode_config.config_lock); + mutex_lock(&dev->mode_config.mutex); drm_crtc_probe_output_modes(dev, 2048, 2048); @@ -874,7 +874,7 @@ bool drm_initial_config(drm_device_t *de } drm_disable_unused_functions(dev); - spin_unlock(&dev->mode_config.config_lock); + mutex_unlock(&dev->mode_config.mutex); return ret; } EXPORT_SYMBOL(drm_initial_config); @@ -1107,7 +1107,7 @@ int drm_mode_getresources(struct inode * memset(&u_mode, 0, sizeof(struct drm_mode_modeinfo)); - spin_lock(&dev->mode_config.config_lock); + mutex_lock(&dev->mode_config.mutex); list_for_each(lh, &dev->mode_config.fb_list) fb_count++; @@ -1215,7 +1215,7 @@ done: ret = -EFAULT; out_unlock: - spin_unlock(&dev->mode_config.config_lock); + mutex_unlock(&dev->mode_config.mutex); return ret; } @@ -1251,7 +1251,7 @@ int drm_mode_getcrtc(struct inode *inode if (copy_from_user(&crtc_resp, argp, sizeof(crtc_resp))) return -EFAULT; - spin_lock(&dev->mode_config.config_lock); + mutex_lock(&dev->mode_config.mutex); crtc = idr_find(&dev->mode_config.crtc_idr, crtc_resp.crtc_id); if (!crtc || (crtc->id != crtc_resp.crtc_id)) { ret = -EINVAL; @@ -1279,7 +1279,7 @@ int drm_mode_getcrtc(struct inode *inode ret = -EFAULT; out: - spin_unlock(&dev->mode_config.config_lock); + mutex_unlock(&dev->mode_config.mutex); return ret; } @@ -1319,7 +1319,7 @@ int drm_mode_getoutput(struct inode *ino DRM_DEBUG("output id %d:\n", out_resp.output); - spin_lock(&dev->mode_config.config_lock); + mutex_lock(&dev->mode_config.mutex); output= idr_find(&dev->mode_config.crtc_idr, out_resp.output); if (!output || (output->id != out_resp.output)) { ret = -EINVAL; @@ -1369,7 +1369,7 @@ done: ret = -EFAULT; out_unlock: - spin_unlock(&dev->mode_config.config_lock); + mutex_unlock(&dev->mode_config.mutex); return ret; } @@ -1407,7 +1407,7 @@ int drm_mode_setcrtc(struct inode *inode if (copy_from_user(&crtc_req, argp, sizeof(crtc_req))) return -EFAULT; - spin_lock(&dev->mode_config.config_lock); + mutex_lock(&dev->mode_config.mutex); crtc = idr_find(&dev->mode_config.crtc_idr, crtc_req.crtc_id); if (!crtc || (crtc->id != crtc_req.crtc_id)) { DRM_DEBUG("Unknown CRTC ID %d\n", crtc_req.crtc_id); @@ -1487,7 +1487,7 @@ int drm_mode_setcrtc(struct inode *inode ret = drm_crtc_set_config(crtc, &crtc_req, mode, output_set, fb); out: - spin_unlock(&dev->mode_config.config_lock); + mutex_unlock(&dev->mode_config.mutex); return ret; } @@ -1533,7 +1533,7 @@ int drm_mode_addfb(struct inode *inode, return -EINVAL; } - spin_lock(&dev->mode_config.config_lock); + mutex_lock(&dev->mode_config.mutex); /* TODO check limits are okay */ ret = drm_get_buffer_object(dev, &bo, r.handle); if (ret || !bo) { @@ -1574,7 +1574,7 @@ int drm_mode_addfb(struct inode *inode, } out: - spin_unlock(&dev->mode_config.config_lock); + mutex_unlock(&dev->mode_config.mutex); return ret; } @@ -1604,7 +1604,7 @@ int drm_mode_rmfb(struct inode *inode, s uint32_t id = arg; int ret = 0; - spin_lock(&dev->mode_config.config_lock); + mutex_lock(&dev->mode_config.mutex); fb = idr_find(&dev->mode_config.crtc_idr, id); /* TODO check that we realy get a framebuffer back. */ if (!fb || (id != fb->id)) { @@ -1623,7 +1623,7 @@ int drm_mode_rmfb(struct inode *inode, s drm_framebuffer_destroy(fb); out: - spin_unlock(&dev->mode_config.config_lock); + mutex_unlock(&dev->mode_config.mutex); return ret; } @@ -1657,7 +1657,7 @@ int drm_mode_getfb(struct inode *inode, if (copy_from_user(&r, argp, sizeof(r))) return -EFAULT; - spin_lock(&dev->mode_config.config_lock); + mutex_lock(&dev->mode_config.mutex); fb = idr_find(&dev->mode_config.crtc_idr, r.buffer_id); if (!fb || (r.buffer_id != fb->id)) { DRM_ERROR("invalid framebuffer id\n"); @@ -1676,7 +1676,7 @@ int drm_mode_getfb(struct inode *inode, ret = -EFAULT; out: - spin_unlock(&dev->mode_config.config_lock); + mutex_unlock(&dev->mode_config.mutex); return ret; } @@ -1700,13 +1700,13 @@ void drm_fb_release(struct file *filp) drm_device_t *dev = priv->head->dev; struct drm_framebuffer *fb, *tfb; - spin_lock(&dev->mode_config.config_lock); + mutex_lock(&dev->mode_config.mutex); list_for_each_entry_safe(fb, tfb, &priv->fbs, filp_head) { list_del(&fb->filp_head); dev->driver->fb_remove(dev, drm_crtc_from_fb(dev, fb)); drm_framebuffer_destroy(fb); } - spin_unlock(&dev->mode_config.config_lock); + mutex_unlock(&dev->mode_config.mutex); } /** @@ -1737,7 +1737,7 @@ int drm_mode_addmode(struct inode *inode if (copy_from_user(&new_mode, argp, sizeof(new_mode))) return -EFAULT; - spin_lock(&dev->mode_config.config_lock); + mutex_lock(&dev->mode_config.mutex); user_mode = drm_mode_create(dev); if (!user_mode) { ret = -ENOMEM; @@ -1756,7 +1756,7 @@ int drm_mode_addmode(struct inode *inode ret = -EFAULT; out: - spin_unlock(&dev->mode_config.config_lock); + mutex_unlock(&dev->mode_config.mutex); return ret; } @@ -1783,7 +1783,7 @@ int drm_mode_rmmode(struct inode *inode, struct drm_display_mode *mode, *t; int ret = -EINVAL; - spin_lock(&dev->mode_config.config_lock); + mutex_lock(&dev->mode_config.mutex); mode = idr_find(&dev->mode_config.crtc_idr, id); if (!mode || (id != mode->mode_id)) { ret = -EINVAL; @@ -1810,7 +1810,7 @@ int drm_mode_rmmode(struct inode *inode, } out: - spin_unlock(&dev->mode_config.config_lock); + mutex_unlock(&dev->mode_config.mutex); return ret; } @@ -1841,7 +1841,7 @@ int drm_mode_attachmode(struct inode *in if (copy_from_user(&mode_cmd, argp, sizeof(mode_cmd))) return -EFAULT; - spin_lock(&dev->mode_config.config_lock); + mutex_lock(&dev->mode_config.mutex); mode = idr_find(&dev->mode_config.crtc_idr, mode_cmd.mode_id); if (!mode || (mode->mode_id != mode_cmd.mode_id)) { @@ -1867,7 +1867,7 @@ int drm_mode_attachmode(struct inode *in ret = -ENOSPC; out: - spin_unlock(&dev->mode_config.config_lock); + mutex_unlock(&dev->mode_config.mutex); return ret; } @@ -1898,7 +1898,7 @@ int drm_mode_detachmode(struct inode *in if (copy_from_user(&mode_cmd, argp, sizeof(mode_cmd))) return -EFAULT; - spin_lock(&dev->mode_config.config_lock); + mutex_lock(&dev->mode_config.mutex); mode = idr_find(&dev->mode_config.crtc_idr, mode_cmd.mode_id); if (!mode || (mode->mode_id != mode_cmd.mode_id)) { @@ -1925,6 +1925,6 @@ int drm_mode_detachmode(struct inode *in ret = -EINVAL; out: - spin_unlock(&dev->mode_config.config_lock); + mutex_unlock(&dev->mode_config.mutex); return ret; } diff --git a/linux-core/drm_crtc.h b/linux-core/drm_crtc.h index e8a527b..75db5b0 100644 --- a/linux-core/drm_crtc.h +++ b/linux-core/drm_crtc.h @@ -459,7 +459,7 @@ struct drm_mode_config_funcs { * */ struct drm_mode_config { - spinlock_t config_lock; /* protects configuration and IDR */ + struct mutex mutex; /* protects configuration and IDR */ struct idr crtc_idr; /* use this idr for all IDs, fb, crtc, output, modes - just makes life easier */ /* this is limited to one for now */ int num_fb; |
From: <wal...@ke...> - 2007-09-24 12:55:12
|
tests/mode/Makefile | 11 + tests/mode/modetest.c | 337 ++++++++++++++++++++++++++++++++++++++++++++++++++ tests/mode/test | 1 3 files changed, 349 insertions(+) New commits: diff-tree 2a2d02bbc500140a861380df52ce66abcac39312 (from 9ccb8440f393a395941b211ee87d9addcfa6d69a) Author: Jakob Bornecrantz <ja...@tu...> Date: Mon Sep 24 14:53:10 2007 +0200 Added small modesetting test diff --git a/tests/mode/Makefile b/tests/mode/Makefile new file mode 100644 index 0000000..205c2ba --- /dev/null +++ b/tests/mode/Makefile @@ -0,0 +1,11 @@ + +all: modetest + +#CFLAGS = -g -ansi -pedantic -DPOSIX_C_SOURCE=199309L \ +# -D_POSIX_SOURCE -D_XOPEN_SOURCE -D_BSD_SOURCE -D_SVID_SOURCE \ + +modetest: modetest.c + @gcc -o modetest -Wall -I../../libdrm -I../../shared-core -L../../libdrm/.libs -ldrm modetest.c + +clean: + @rm -f modetest diff --git a/tests/mode/modetest.c b/tests/mode/modetest.c new file mode 100644 index 0000000..bf1a516 --- /dev/null +++ b/tests/mode/modetest.c @@ -0,0 +1,337 @@ + +#include <assert.h> +#include <stdio.h> +#include <stdlib.h> +#include <stdint.h> + +#include "xf86drm.h" +#include "xf86drmMode.h" + +const char* getConnectionText(drmModeConnection conn) +{ + switch (conn) { + case DRM_MODE_CONNECTED: + return "connected"; + case DRM_MODE_DISCONNECTED: + return "disconnected"; + default: + return "unknown"; + } + +} + +struct drm_mode_modeinfo* findMode(drmModeResPtr res, uint32_t id) +{ + int i; + for (i = 0; i < res->count_modes; i++) { + if (res->modes[i].id == id) + return &res->modes[i]; + } + + return 0; +} + +int printMode(struct drm_mode_modeinfo *mode) +{ +#if 0 + printf("Mode: %s\n", mode->name); + printf("\tclock : %i\n", mode->clock); + printf("\thdisplay : %i\n", mode->hdisplay); + printf("\thsync_start : %i\n", mode->hsync_start); + printf("\thsync_end : %i\n", mode->hsync_end); + printf("\thtotal : %i\n", mode->htotal); + printf("\thskew : %i\n", mode->hskew); + printf("\tvdisplay : %i\n", mode->vdisplay); + printf("\tvsync_start : %i\n", mode->vsync_start); + printf("\tvsync_end : %i\n", mode->vsync_end); + printf("\tvtotal : %i\n", mode->vtotal); + printf("\tvscan : %i\n", mode->vscan); + printf("\tvrefresh : %i\n", mode->vrefresh); + printf("\tflags : %i\n", mode->flags); +#else + printf("Mode: %i \"%s\" %ix%i %.0f\n", mode->id, mode->name, + mode->hdisplay, mode->vdisplay, mode->vrefresh / 1000.0); +#endif + return 0; +} + +int printOutput(int fd, drmModeResPtr res, drmModeOutputPtr output, uint32_t id) +{ + int i = 0; + struct drm_mode_modeinfo *mode = NULL; + + printf("Output: %s\n", output->name); + printf("\tid : %i\n", id); + printf("\tcrtc id : %i\n", output->crtc); + printf("\tconn : %s\n", getConnectionText(output->connection)); + printf("\tsize : %ix%i (mm)\n", output->mmWidth, output->mmHeight); + printf("\tcount_crtcs : %i\n", output->count_crtcs); + printf("\tcrtcs : %i\n", output->crtcs); + printf("\tcount_clones : %i\n", output->count_clones); + printf("\tclones : %i\n", output->clones); + printf("\tcount_modes : %i\n", output->count_modes); + + for (i = 0; i < output->count_modes; i++) { + mode = findMode(res, output->modes[i]); + + if (mode) + printf("\t\tmode: %i \"%s\" %ix%i %.0f\n", mode->id, mode->name, + mode->hdisplay, mode->vdisplay, mode->vrefresh / 1000.0); + else + printf("\t\tmode: Invalid mode %i\n", output->modes[i]); + } + + return 0; +} + +int printCrtc(int fd, drmModeResPtr res, drmModeCrtcPtr crtc, uint32_t id) +{ + printf("Crtc\n"); + printf("\tid : %i\n", id); + printf("\tx : %i\n", crtc->x); + printf("\ty : %i\n", crtc->y); + printf("\twidth : %i\n", crtc->width); + printf("\theight : %i\n", crtc->height); + printf("\tmode : %i\n", crtc->mode); + printf("\tnum outputs : %i\n", crtc->count_outputs); + printf("\toutputs : %i\n", crtc->outputs); + printf("\tnum possible : %i\n", crtc->count_possibles); + printf("\tpossibles : %i\n", crtc->possibles); + + return 0; +} + +int printFrameBuffer(int fd, drmModeResPtr res, drmModeFBPtr fb) +{ + printf("Framebuffer\n"); + printf("\thandle : %i\n", fb->handle); + printf("\twidth : %i\n", fb->width); + printf("\theight : %i\n", fb->height); + printf("\tpitch : %i\n", fb->pitch);; + printf("\tbpp : %i\n", fb->bpp); + printf("\tdepth : %i\n", fb->depth); + printf("\tbuffer_id : %i\n", fb->buffer_id); + + return 0; +} + +int printRes(int fd, drmModeResPtr res) +{ + int i; + drmModeOutputPtr output; + drmModeCrtcPtr crtc; + drmModeFBPtr fb; + + for (i = 0; i < res->count_modes; i++) { + printMode(&res->modes[i]); + } + + for (i = 0; i < res->count_outputs; i++) { + output = drmModeGetOutput(fd, res->outputs[i]); + + if (!output) + printf("Could not get output %i\n", i); + else { + printOutput(fd, res, output, res->outputs[i]); + drmModeFreeOutput(output); + } + } + + for (i = 0; i < res->count_crtcs; i++) { + crtc = drmModeGetCrtc(fd, res->crtcs[i]); + + if (!crtc) + printf("Could not get crtc %i\n", i); + else { + printCrtc(fd, res, crtc, res->crtcs[i]); + drmModeFreeCrtc(crtc); + } + } + + for (i = 0; i < res->count_fbs; i++) { + fb = drmModeGetFB(fd, res->fbs[i]); + + if (!fb) + printf("Could not get fb %i\n", res->fbs[i]); + else { + printFrameBuffer(fd, res, fb); + drmModeFreeFB(fb); + } + } + + return 0; +} + +static struct drm_mode_modeinfo mode = { + .name = "Test mode", + .clock = 25200, + .hdisplay = 640, + .hsync_start = 656, + .hsync_end = 752, + .htotal = 800, + .hskew = 0, + .vdisplay = 480, + .vsync_start = 490, + .vsync_end = 492, + .vtotal = 525, + .vscan = 0, + .vrefresh = 60000, /* vertical refresh * 1000 */ + .flags = 10, +}; + +int testMode(int fd, drmModeResPtr res) +{ + uint32_t output = res->outputs[0]; + uint32_t newMode = 0; + int ret = 0; + int error = 0; + + printf("Test: adding mode to output %i\n", output); + + /* printMode(&mode); */ + + printf("\tAdding mode\n"); + newMode = drmModeAddMode(fd, &mode); + if (!newMode) + goto err; + + printf("\tAttaching mode %i to output %i\n", newMode, output); + + ret = drmModeAttachMode(fd, output, newMode); + + if (ret) + goto err_mode; + + printf("\tDetaching mode %i from output %i\n", newMode, output); + ret = drmModeDetachMode(fd, output, newMode); + + if (ret) + goto err_mode; + + printf("\tRemoveing new mode %i\n", newMode); + ret = drmModeRmMode(fd, newMode); + if (ret) + goto err; + + return 0; + +err_mode: + error = drmModeRmMode(fd, newMode); + +err: + printf("\tFailed\n"); + + if (error) + printf("\tFailed to delete mode %i\n", newMode); + + return 1; +} + +/* +int testFrameBufferGet(int fd, uint32_t fb) +{ + drmModeFBPtr frame; + + printf("Test: get framebuffer %i\n", fb); + + frame = drmModeGetFB(fd, fb); + + if (!frame) { + printf("\tFailed\n"); + } else { + printFrameBuffer(fd, frame); + drmModeFreeFB(frame); + } + + return 0; +} +*/ + +int testFrameBufferAdd(int fd, drmModeResPtr res) +{ + uint32_t fb = 0; + int ret = 0; + drmModeFBPtr frame = 0; + drmBO bo; + + printf("Test: adding framebuffer\n"); + + printf("\tCreating BO\n"); + + /* TODO */ + ret = 1; + if (ret) + goto err; + + printf("\tAdding FB\n"); + ret = drmModeAddFB(fd, 640, 480, 32, 8, 0, &bo, &fb); + if (ret) + goto err_bo; + + frame = drmModeGetFB(fd, fb); + + if (!frame) { + printf("Couldn't retrive created framebuffer\n"); + } else { + printFrameBuffer(fd, res, frame); + drmModeFreeFB(frame); + } + + printf("\tRemoveing FB\n"); + + ret = drmModeRmFB(fd, fb); + + if (ret) { + printf("\tFailed this shouldn't happen!\n"); + goto err_bo; + } + + printf("\tRemoveing BO\n"); + + ret = drmBODestroy(fb, &bo); + + return 0; + +err_bo: + drmBODestroy(fd, &bo); + +err: + printf("\tFailed\n"); + + return 1; +} + + +int main(int argc, char **argv) +{ + int fd; + const char *driver = "i915"; /* hardcoded for now */ + drmModeResPtr res; + + printf("Starting test\n"); + + fd = drmOpen(driver, NULL); + + if (fd < 0) { + printf("Failed to open the card fb\n"); + return 1; + } + + res = drmModeGetResources(fd); + if (res == 0) { + printf("Failed to get resources from card\n"); + drmClose(fd); + return 1; + } + + printRes(fd, res); + + testMode(fd, res); + + testFrameBufferAdd(fd, res); + + drmModeFreeResources(res); + printf("Ok\n"); + + return 0; +} diff --git a/tests/mode/test b/tests/mode/test new file mode 100755 index 0000000..fa155f4 --- /dev/null +++ b/tests/mode/test @@ -0,0 +1 @@ +LD_PRELOAD=../../libdrm/.libs/libdrm.so ./modetest |
From: <jb...@ke...> - 2007-09-24 22:41:04
|
shared-core/i915_drv.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) New commits: diff-tree 0be6e919aa3e7af884980e2004755848a2aa7519 (from 5cc3083179b19678456905a9122a3d0f04e6f623) Author: Jesse Barnes <jes...@in...> Date: Mon Sep 24 15:40:55 2007 -0700 Add 965GM macro bits Update IS_MOBILE macro to include new IS_I965GM test. diff --git a/shared-core/i915_drv.h b/shared-core/i915_drv.h index d6b64b6..2d2d3a2 100644 --- a/shared-core/i915_drv.h +++ b/shared-core/i915_drv.h @@ -1160,6 +1160,7 @@ extern int i915_wait_ring(struct drm_dev (dev)->pci_device == 0x2A02 || \ (dev)->pci_device == 0x2A12) +#define IS_I965GM(dev) (((dev)->pci_device == 0x2A02)) #define IS_I9XX(dev) (IS_I915G(dev) || IS_I915GM(dev) || IS_I945G(dev) || \ IS_I945GM(dev) || IS_I965G(dev)) @@ -1169,7 +1170,7 @@ extern int i915_wait_ring(struct drm_dev (dev)->pci_device == 0x29D2) #define IS_MOBILE(dev) (IS_I830(dev) || IS_I85X(dev) || IS_I915GM(dev) || \ - IS_I945GM(dev)) + IS_I945GM(dev) || IS_I965GM(dev)) #define PRIMARY_RINGBUFFER_SIZE (128*1024) |
From: <jb...@ke...> - 2007-09-24 22:43:25
|
linux-core/intel_sdvo.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) New commits: diff-tree cbcbe80c09bd95485ce8a9b0d86242fedcd7c182 (from 0be6e919aa3e7af884980e2004755848a2aa7519) Author: Jesse Barnes <jes...@in...> Date: Mon Sep 24 15:43:00 2007 -0700 Cleanup SDVO debug output SDVO debug messages were incorrectly including severity prefixes in each print rather than each unique line. Fix it up. diff --git a/linux-core/intel_sdvo.c b/linux-core/intel_sdvo.c index 11f3a0a..19df1d4 100644 --- a/linux-core/intel_sdvo.c +++ b/linux-core/intel_sdvo.c @@ -215,18 +215,18 @@ static void intel_sdvo_write_cmd(struct if (1) { DRM_DEBUG("%s: W: %02X ", SDVO_NAME(sdvo_priv), cmd); for (i = 0; i < args_len; i++) - DRM_DEBUG("%02X ", ((u8 *)args)[i]); + printk("%02X ", ((u8 *)args)[i]); for (; i < 8; i++) - DRM_DEBUG(" "); + printk(" "); for (i = 0; i < sizeof(sdvo_cmd_names) / sizeof(sdvo_cmd_names[0]); i++) { if (cmd == sdvo_cmd_names[i].cmd) { - DRM_DEBUG("(%s)", sdvo_cmd_names[i].name); + printk("(%s)", sdvo_cmd_names[i].name); break; } } if (i == sizeof(sdvo_cmd_names)/ sizeof(sdvo_cmd_names[0])) - DRM_DEBUG("(%02X)",cmd); - DRM_DEBUG("\n"); + printk("(%02X)",cmd); + printk("\n"); } for (i = 0; i < args_len; i++) { @@ -268,14 +268,14 @@ static u8 intel_sdvo_read_response(struc if (1) { DRM_DEBUG("%s: R: ", SDVO_NAME(sdvo_priv)); for (i = 0; i < response_len; i++) - DRM_DEBUG("%02X ", ((u8 *)response)[i]); + printk("%02X ", ((u8 *)response)[i]); for (; i < 8; i++) - DRM_DEBUG(" "); + printk(" "); if (status <= SDVO_CMD_STATUS_SCALING_NOT_SUPP) - DRM_DEBUG("(%s)", cmd_status_names[status]); + printk("(%s)", cmd_status_names[status]); else - DRM_DEBUG("(??? %d)", status); - DRM_DEBUG("\n"); + printk("(??? %d)", status); + printk("\n"); } if (status != SDVO_CMD_STATUS_PENDING) |
From: <al...@ke...> - 2007-09-26 15:18:35
|
linux-core/drm_drv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) New commits: diff-tree 61dfd19de81716aea0eaba90518fcb110b46b8f0 (from dfcf9272ce4427d959098b0f9e1748832a47a786) Author: Alan Hourihane <al...@fa...> Date: Wed Sep 26 16:18:19 2007 +0100 Add brackets diff --git a/linux-core/drm_drv.c b/linux-core/drm_drv.c index e991f11..a313c26 100644 --- a/linux-core/drm_drv.c +++ b/linux-core/drm_drv.c @@ -660,7 +660,7 @@ long drm_unlocked_ioctl(struct file *fil retcode = func(dev, kdata, file_priv); } - if ((retcode == 0) && cmd & IOC_OUT) { + if ((retcode == 0) && (cmd & IOC_OUT)) { if (copy_to_user((void __user *)arg, kdata, _IOC_SIZE(cmd)) != 0) retcode = -EACCES; |
From: <al...@ke...> - 2007-09-28 08:21:12
|
linux-core/intel_display.c | 6 ++++++ 1 file changed, 6 insertions(+) New commits: diff-tree d69721a14a8954420b4e0022ecf10bb040c6b807 (from bf9bd5671c184e1caeeb25ead588cbb2ab77c360) Author: Alan Hourihane <al...@tu...> Date: Fri Sep 28 09:21:09 2007 +0100 Set the fb_base, so userspace applications can actually work now instead of locking up. diff --git a/linux-core/intel_display.c b/linux-core/intel_display.c index 3ff9f82..a81cfe6 100644 --- a/linux-core/intel_display.c +++ b/linux-core/intel_display.c @@ -1207,6 +1207,12 @@ void intel_modeset_init(struct drm_devic dev->mode_config.max_width = 4096; dev->mode_config.max_height = 4096; + /* set memory base */ + if (IS_I9XX(dev)) + dev->mode_config.fb_base = pci_resource_start(dev->pdev, 2); + else + dev->mode_config.fb_base = pci_resource_start(dev->pdev, 0); + if (IS_MOBILE(dev) || IS_I9XX(dev)) num_pipe = 2; else |
From: <al...@ke...> - 2007-10-15 10:51:33
|
linux-core/drm_crtc.c | 25 ++++++++++++------------- linux-core/intel_fb.c | 1 + 2 files changed, 13 insertions(+), 13 deletions(-) New commits: commit cc9be8ac323e47616e48adebc5cc85c654524b45 Author: Alan Hourihane <al...@tu...> Date: Mon Oct 15 11:51:19 2007 +0100 Fix some buffer teardown problems. diff --git a/linux-core/drm_crtc.c b/linux-core/drm_crtc.c index fcddc7d..bdea20c 100644 --- a/linux-core/drm_crtc.c +++ b/linux-core/drm_crtc.c @@ -951,14 +951,10 @@ void drm_mode_config_cleanup(struct drm_device *dev) } list_for_each_entry_safe(fb, fbt, &dev->mode_config.fb_list, head) { - dev->driver->fb_remove(dev, drm_crtc_from_fb(dev, fb)); - /* If this FB was the kernel one, free it */ - if (fb->bo->type == drm_bo_type_kernel) { - mutex_lock(&dev->struct_mutex); - drm_bo_usage_deref_locked(&fb->bo); - mutex_unlock(&dev->struct_mutex); - } - drm_framebuffer_destroy(fb); + if (fb->bo->type != drm_bo_type_kernel) + drm_framebuffer_destroy(fb); + else + dev->driver->fb_remove(dev, drm_crtc_from_fb(dev, fb)); } list_for_each_entry_safe(crtc, ct, &dev->mode_config.crtc_list, head) { @@ -1585,14 +1581,15 @@ int drm_mode_rmfb(struct drm_device *dev, goto out; } - dev->driver->fb_remove(dev, drm_crtc_from_fb(dev, fb)); - /* TODO check if we own the buffer */ /* TODO release all crtc connected to the framebuffer */ /* bind the fb to the crtc for now */ /* TODO unhock the destructor from the buffer object */ - drm_framebuffer_destroy(fb); + if (fb->bo->type != drm_bo_type_kernel) + drm_framebuffer_destroy(fb); + else + dev->driver->fb_remove(dev, drm_crtc_from_fb(dev, fb)); out: mutex_unlock(&dev->mode_config.mutex); @@ -1666,8 +1663,10 @@ void drm_fb_release(struct file *filp) mutex_lock(&dev->mode_config.mutex); list_for_each_entry_safe(fb, tfb, &priv->fbs, filp_head) { list_del(&fb->filp_head); - dev->driver->fb_remove(dev, drm_crtc_from_fb(dev, fb)); - drm_framebuffer_destroy(fb); + if (fb->bo->type != drm_bo_type_kernel) + drm_framebuffer_destroy(fb); + else + dev->driver->fb_remove(dev, drm_crtc_from_fb(dev, fb)); } mutex_unlock(&dev->mode_config.mutex); } diff --git a/linux-core/intel_fb.c b/linux-core/intel_fb.c index 04fd0fd..ecfab3e 100644 --- a/linux-core/intel_fb.c +++ b/linux-core/intel_fb.c @@ -657,6 +657,7 @@ int intelfb_remove(struct drm_device *dev, struct drm_crtc *crtc) unregister_framebuffer(info); framebuffer_release(info); drm_mem_reg_iounmap(dev, &fb->bo->mem, fb->virtual_base); + drm_bo_usage_deref_locked(&fb->bo); drm_framebuffer_destroy(fb); } return 0; |
From: <al...@ke...> - 2007-10-15 10:54:31
|
linux-core/intel_fb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) New commits: commit 2b07b0a45d32a9ffb7f6b9bb1b8f6f8e615524cb Author: Alan Hourihane <al...@tu...> Date: Mon Oct 15 11:54:18 2007 +0100 should be unlocked diff --git a/linux-core/intel_fb.c b/linux-core/intel_fb.c index ecfab3e..c9cb293 100644 --- a/linux-core/intel_fb.c +++ b/linux-core/intel_fb.c @@ -657,7 +657,7 @@ int intelfb_remove(struct drm_device *dev, struct drm_crtc *crtc) unregister_framebuffer(info); framebuffer_release(info); drm_mem_reg_iounmap(dev, &fb->bo->mem, fb->virtual_base); - drm_bo_usage_deref_locked(&fb->bo); + drm_bo_usage_deref_unlocked(&fb->bo); drm_framebuffer_destroy(fb); } return 0; |
From: <al...@ke...> - 2007-10-17 08:35:58
|
shared-core/i915_dma.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) New commits: commit be2d68914d0992a37b9fb4d93338aeaf2240c4f5 Author: Alan Hourihane <al...@tu...> Date: Wed Oct 17 09:35:44 2007 +0100 Fix a crash on X startup diff --git a/shared-core/i915_dma.c b/shared-core/i915_dma.c index 2399482..54621d9 100644 --- a/shared-core/i915_dma.c +++ b/shared-core/i915_dma.c @@ -86,8 +86,6 @@ int i915_dma_cleanup(struct drm_device * dev) * may not have been called from userspace and after dev_private * is freed, it's too late. */ - I915_WRITE(LP_RING + RING_LEN, 0); - if (dev->irq) drm_irq_uninstall(dev); @@ -1042,7 +1040,7 @@ int i915_do_cleanup_pageflip(struct drm_device * dev) DRM_DEBUG("%s\n", __FUNCTION__); - for (i = 0, planes = 0; i < 2; i++) + for (i = 0, planes = 0; i < 2; i++) { if (dev_priv->sarea_priv->pf_current_page & (0x3 << (2 * i))) { dev_priv->sarea_priv->pf_current_page = (dev_priv->sarea_priv->pf_current_page & @@ -1050,6 +1048,7 @@ int i915_do_cleanup_pageflip(struct drm_device * dev) planes |= 1 << i; } + } if (planes) i915_dispatch_flip(dev, planes, 0); |
From: <al...@ke...> - 2007-10-23 14:33:34
|
linux-core/drm_crtc.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) New commits: commit 198170ab97bbf2ca6362bb7100e9ed86d90aa51f Author: Alan Hourihane <al...@tu...> Date: Tue Oct 23 15:33:20 2007 +0100 Need fb attached diff --git a/linux-core/drm_crtc.c b/linux-core/drm_crtc.c index bdea20c..5bc0220 100644 --- a/linux-core/drm_crtc.c +++ b/linux-core/drm_crtc.c @@ -914,7 +914,9 @@ bool drm_initial_config(struct drm_device *dev, bool can_grow) if (!output->crtc || !output->crtc->desired_mode) continue; - drm_crtc_set_mode(output->crtc, output->crtc->desired_mode, 0, 0); + /* and needs an attached fb */ + if (output->crtc->fb) + drm_crtc_set_mode(output->crtc, output->crtc->desired_mode, 0, 0); } drm_disable_unused_functions(dev); |
From: <th...@ke...> - 2007-10-26 08:32:53
|
linux-core/drm_bo.c | 12 ++++++------ linux-core/drm_bo_move.c | 12 ++++++------ linux-core/drm_objects.h | 3 ++- 3 files changed, 14 insertions(+), 13 deletions(-) New commits: commit 26c32a3d797efb7474e5ae88c46afcb0e6015294 Author: Thomas Hellstrom <thomas-at-tungstengraphics-dot-com> Date: Fri Oct 26 10:25:57 2007 +0200 Buffer flags and masks are 64-bit. don't mask off the high dword. diff --git a/linux-core/drm_bo.c b/linux-core/drm_bo.c index b6a972e..04900fe 100644 --- a/linux-core/drm_bo.c +++ b/linux-core/drm_bo.c @@ -54,9 +54,9 @@ static int drm_bo_setup_vm_locked(struct drm_buffer_object * bo); static void drm_bo_takedown_vm_locked(struct drm_buffer_object * bo); static void drm_bo_unmap_virtual(struct drm_buffer_object * bo); -static inline uint32_t drm_bo_type_flags(unsigned type) +static inline uint64_t drm_bo_type_flags(unsigned type) { - return (1 << (24 + type)); + return (1ULL << (24 + type)); } /* @@ -784,10 +784,10 @@ static int drm_bo_mem_force_space(struct drm_device * dev, static int drm_bo_mt_compatible(struct drm_mem_type_manager * man, uint32_t mem_type, - uint32_t mask, uint32_t * res_mask) + uint64_t mask, uint32_t * res_mask) { - uint32_t cur_flags = drm_bo_type_flags(mem_type); - uint32_t flag_diff; + uint64_t cur_flags = drm_bo_type_flags(mem_type); + uint64_t flag_diff; if (man->flags & _DRM_FLAG_MEMTYPE_CACHED) cur_flags |= DRM_BO_FLAG_CACHED; @@ -1270,7 +1270,7 @@ static void drm_buffer_user_object_unmap(struct drm_file *file_priv, * Note that new_mem_flags are NOT transferred to the bo->mem.mask. */ -int drm_bo_move_buffer(struct drm_buffer_object * bo, uint32_t new_mem_flags, +int drm_bo_move_buffer(struct drm_buffer_object * bo, uint64_t new_mem_flags, int no_wait, int move_unfenced) { struct drm_device *dev = bo->dev; diff --git a/linux-core/drm_bo_move.c b/linux-core/drm_bo_move.c index d6c5897..06b2e5a 100644 --- a/linux-core/drm_bo_move.c +++ b/linux-core/drm_bo_move.c @@ -53,8 +53,8 @@ int drm_bo_move_ttm(struct drm_buffer_object * bo, { struct drm_ttm *ttm = bo->ttm; struct drm_bo_mem_reg *old_mem = &bo->mem; - uint32_t save_flags = old_mem->flags; - uint32_t save_mask = old_mem->mask; + uint64_t save_flags = old_mem->flags; + uint64_t save_mask = old_mem->mask; int ret; if (old_mem->mem_type == DRM_BO_MEM_TT) { @@ -211,8 +211,8 @@ int drm_bo_move_memcpy(struct drm_buffer_object * bo, void *old_iomap; void *new_iomap; int ret; - uint32_t save_flags = old_mem->flags; - uint32_t save_mask = old_mem->mask; + uint64_t save_flags = old_mem->flags; + uint64_t save_mask = old_mem->mask; unsigned long i; unsigned long page; unsigned long add = 0; @@ -334,8 +334,8 @@ int drm_bo_move_accel_cleanup(struct drm_buffer_object * bo, struct drm_mem_type_manager *man = &dev->bm.man[new_mem->mem_type]; struct drm_bo_mem_reg *old_mem = &bo->mem; int ret; - uint32_t save_flags = old_mem->flags; - uint32_t save_mask = old_mem->mask; + uint64_t save_flags = old_mem->flags; + uint64_t save_mask = old_mem->mask; struct drm_buffer_object *old_obj; if (bo->fence) diff --git a/linux-core/drm_objects.h b/linux-core/drm_objects.h index 8ae55bf..ed9a87a 100644 --- a/linux-core/drm_objects.h +++ b/linux-core/drm_objects.h @@ -511,7 +511,8 @@ extern int drm_bo_wait(struct drm_buffer_object * bo, int lazy, int ignore_signa int no_wait); extern int drm_bo_mem_space(struct drm_buffer_object * bo, struct drm_bo_mem_reg * mem, int no_wait); -extern int drm_bo_move_buffer(struct drm_buffer_object * bo, uint32_t new_mem_flags, +extern int drm_bo_move_buffer(struct drm_buffer_object * bo, + uint64_t new_mem_flags, int no_wait, int move_unfenced); extern int drm_bo_clean_mm(struct drm_device * dev, unsigned mem_type); extern int drm_bo_init_mm(struct drm_device * dev, unsigned type, |
From: <ai...@ke...> - 2007-11-09 01:53:49
|
shared-core/i915_dma.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) New commits: commit d983ed90cb9de559271817e04bddc8b40fc16a0d Author: Dave Airlie <ai...@re...> Date: Fri Nov 9 11:30:50 2007 +1000 i915: cleanup pageflip derefs sarea even if no sarea exists diff --git a/shared-core/i915_dma.c b/shared-core/i915_dma.c index 47befeb..117f126 100644 --- a/shared-core/i915_dma.c +++ b/shared-core/i915_dma.c @@ -1070,10 +1070,12 @@ out_free: int i915_do_cleanup_pageflip(struct drm_device * dev) { struct drm_i915_private *dev_priv = dev->dev_private; - int i, planes, num_pages = dev_priv->sarea_priv->third_handle ? 3 : 2; + int i, planes, num_pages; DRM_DEBUG("%s\n", __FUNCTION__); - + if (!dev_priv->sarea_priv) + return 0; + num_pages = dev_priv->sarea_priv->third_handle ? 3 : 2; for (i = 0, planes = 0; i < 2; i++) { if (dev_priv->sarea_priv->pf_current_page & (0x3 << (2 * i))) { dev_priv->sarea_priv->pf_current_page = |
From: <gl...@ke...> - 2007-11-09 14:57:50
|
linux-core/drm_crtc.h | 5 +++-- linux-core/drm_edid.c | 40 +++++++++++++++++++++++++--------------- linux-core/intel_modes.c | 9 ++++++++- 3 files changed, 36 insertions(+), 18 deletions(-) New commits: commit ffb89d4c3b6650551aaab06076896540a78faddf Author: Jerome Glisse <gl...@fr...> Date: Fri Nov 9 15:47:24 2007 +0100 drm: split edid handling in get_edid & add_edid_mode This way driver can get_edid in output status detection (using all workaround which are in get_edid) and then provide this edid data in get_mode callback of output. diff --git a/linux-core/drm_crtc.h b/linux-core/drm_crtc.h index d97cd19..9dd00b3 100644 --- a/linux-core/drm_crtc.h +++ b/linux-core/drm_crtc.h @@ -487,8 +487,9 @@ extern void drm_output_destroy(struct drm_output *output); extern bool drm_output_rename(struct drm_output *output, const char *name); extern void drm_fb_release(struct file *filp); -extern int drm_add_edid_modes(struct drm_output *output, - struct i2c_adapter *adapter); +extern struct edid *drm_get_edid(struct drm_output *output, + struct i2c_adapter *adapter); +extern int drm_add_edid_modes(struct drm_output *output, struct edid *edid); extern void drm_mode_probed_add(struct drm_output *output, struct drm_display_mode *mode); extern void drm_mode_remove(struct drm_output *output, struct drm_display_mode *mode); extern struct drm_display_mode *drm_mode_duplicate(struct drm_device *dev, diff --git a/linux-core/drm_edid.c b/linux-core/drm_edid.c index d7d3939..b8eee1a 100644 --- a/linux-core/drm_edid.c +++ b/linux-core/drm_edid.c @@ -427,41 +427,51 @@ static unsigned char *drm_ddc_read(struct i2c_adapter *adapter) } /** - * drm_add_edid_modes - add modes from EDID data, if available + * drm_get_edid - get EDID data, if available * @output: output we're probing * @adapter: i2c adapter to use for DDC * - * Poke the given output's i2c channel to grab EDID data if possible. If we - * get any, add the specified modes to the output's mode list. - * - * Return number of modes added or 0 if we couldn't find any. + * Poke the given output's i2c channel to grab EDID data if possible. + * + * Return edid data or NULL if we couldn't find any. */ -int drm_add_edid_modes(struct drm_output *output, struct i2c_adapter *adapter) +struct edid *drm_get_edid(struct drm_output *output, + struct i2c_adapter *adapter) { struct edid *edid; - int num_modes = 0; edid = (struct edid *)drm_ddc_read(adapter); if (!edid) { dev_warn(&output->dev->pdev->dev, "%s: no EDID data\n", output->name); - goto out_err; + return NULL; } - if (!edid_valid(edid)) { dev_warn(&output->dev->pdev->dev, "%s: EDID invalid.\n", output->name); - goto out_err; + kfree(edid); + return NULL; } + return edid; +} +EXPORT_SYMBOL(drm_get_edid); + +/** + * drm_add_edid_modes - add modes from EDID data, if available + * @output: output we're probing + * @edid: edid data + * + * Add the specified modes to the output's mode list. + * + * Return number of modes added or 0 if we couldn't find any. + */ +int drm_add_edid_modes(struct drm_output *output, struct edid *edid) +{ + int num_modes = 0; num_modes += add_established_modes(output, edid); num_modes += add_standard_modes(output, edid); num_modes += add_detailed_info(output, edid); - return num_modes; - -out_err: - kfree(edid); - return 0; } EXPORT_SYMBOL(drm_add_edid_modes); diff --git a/linux-core/intel_modes.c b/linux-core/intel_modes.c index 601770e..346cf1a 100644 --- a/linux-core/intel_modes.c +++ b/linux-core/intel_modes.c @@ -50,6 +50,13 @@ bool intel_ddc_probe(struct drm_output *output) int intel_ddc_get_modes(struct drm_output *output) { struct intel_output *intel_output = output->driver_private; + struct edid *edid; + int ret = 0; - return drm_add_edid_modes(output, &intel_output->ddc_bus->adapter); + edid = drm_get_edid(output, &intel_output->ddc_bus->adapter); + if (edid) { + ret = drm_add_edid_modes(output, edid); + kfree(edid); + } + return ret; } |
From: <gl...@ke...> - 2007-11-09 16:37:22
|
linux-core/drm_edid.c | 8 ++++++++ 1 file changed, 8 insertions(+) New commits: commit e1bc147ac9aa8ac2ac271b0a21f4138b17875ce5 Author: Jerome Glisse <gl...@fr...> Date: Fri Nov 9 17:28:56 2007 +0100 drm: check edid data, so we deal well with broken driver. diff --git a/linux-core/drm_edid.c b/linux-core/drm_edid.c index b8eee1a..7068cef 100644 --- a/linux-core/drm_edid.c +++ b/linux-core/drm_edid.c @@ -469,6 +469,14 @@ int drm_add_edid_modes(struct drm_output *output, struct edid *edid) { int num_modes = 0; + if (edid == NULL) { + return 0; + } + if (!edid_valid(edid)) { + dev_warn(&output->dev->pdev->dev, "%s: EDID invalid.\n", + output->name); + return 0; + } num_modes += add_established_modes(output, edid); num_modes += add_standard_modes(output, edid); num_modes += add_detailed_info(output, edid); |
From: <ai...@ke...> - 2007-11-15 08:22:11
|
libdrm/xf86drmMode.c | 1 + 1 file changed, 1 insertion(+) New commits: commit ca499f4d14ae29159f13957f2adc0536c71bf6d4 Author: Dave Airlie <ai...@li...> Date: Thu Nov 15 19:22:01 2007 +1100 libdrm: return crtc id to userspace diff --git a/libdrm/xf86drmMode.c b/libdrm/xf86drmMode.c index c3abb2d..e400f21 100644 --- a/libdrm/xf86drmMode.c +++ b/libdrm/xf86drmMode.c @@ -339,6 +339,7 @@ drmModeOutputPtr drmModeGetOutput(int fd, uint32_t output_id) return 0; r->output_id = out.output; + r->crtc = out.crtc; r->connection = out.connection; r->mmWidth = out.mm_width; r->mmHeight = out.mm_height; |