diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2009-01-26 13:16:11 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2009-01-26 13:16:11 -0500 |
| commit | 832fb4a01ca27ded735421de2b090f03e20039fc (patch) | |
| tree | eceb6e49b6752218377a361e7050a3f9f622a44e | |
| parent | 4a4565921aa9255be01921ff8ae339fa7b0a5468 (diff) | |
| parent | 2906f0258770d3a9c4e65364df8acc904e148bbe (diff) | |
Merge branch 'drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6
* 'drm-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/airlied/drm-2.6:
drm/i915: Fix cursor physical address choice to match the 2D driver.
drm: stash AGP include under the do-we-have-AGP ifdef
drm: don't whine about not reading EDID data
drm/i915: hook up LVDS DPMS property
drm/i915: remove unnecessary debug output in KMS init
i915: fix freeing path for gem phys objects.
drm: create mode_config idr lock
drm: fix leak of device mappings since multi-master changes.
| -rw-r--r-- | drivers/gpu/drm/drm_agpsupport.c | 3 | ||||
| -rw-r--r-- | drivers/gpu/drm/drm_crtc.c | 14 | ||||
| -rw-r--r-- | drivers/gpu/drm/drm_drv.c | 4 | ||||
| -rw-r--r-- | drivers/gpu/drm/drm_edid.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/drm_stub.c | 8 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_dma.c | 7 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 2 | ||||
| -rw-r--r-- | drivers/gpu/drm/i915/intel_lvds.c | 13 | ||||
| -rw-r--r-- | include/drm/drm_crtc.h | 3 |
9 files changed, 44 insertions, 12 deletions
diff --git a/drivers/gpu/drm/drm_agpsupport.c b/drivers/gpu/drm/drm_agpsupport.c index 3d33b8252b58..14796594e5d9 100644 --- a/drivers/gpu/drm/drm_agpsupport.c +++ b/drivers/gpu/drm/drm_agpsupport.c | |||
| @@ -33,10 +33,11 @@ | |||
| 33 | 33 | ||
| 34 | #include "drmP.h" | 34 | #include "drmP.h" |
| 35 | #include <linux/module.h> | 35 | #include <linux/module.h> |
| 36 | #include <asm/agp.h> | ||
| 37 | 36 | ||
| 38 | #if __OS_HAS_AGP | 37 | #if __OS_HAS_AGP |
| 39 | 38 | ||
| 39 | #include <asm/agp.h> | ||
| 40 | |||
| 40 | /** | 41 | /** |
| 41 | * Get AGP information. | 42 | * Get AGP information. |
| 42 | * | 43 | * |
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c index 5b2cbb778162..bfce0992fefb 100644 --- a/drivers/gpu/drm/drm_crtc.c +++ b/drivers/gpu/drm/drm_crtc.c | |||
| @@ -194,7 +194,6 @@ char *drm_get_connector_status_name(enum drm_connector_status status) | |||
| 194 | * @type: object type | 194 | * @type: object type |
| 195 | * | 195 | * |
| 196 | * LOCKING: | 196 | * LOCKING: |
| 197 | * Caller must hold DRM mode_config lock. | ||
| 198 | * | 197 | * |
| 199 | * Create a unique identifier based on @ptr in @dev's identifier space. Used | 198 | * Create a unique identifier based on @ptr in @dev's identifier space. Used |
| 200 | * for tracking modes, CRTCs and connectors. | 199 | * for tracking modes, CRTCs and connectors. |
| @@ -209,15 +208,15 @@ static int drm_mode_object_get(struct drm_device *dev, | |||
| 209 | int new_id = 0; | 208 | int new_id = 0; |
| 210 | int ret; | 209 | int ret; |
| 211 | 210 | ||
| 212 | WARN(!mutex_is_locked(&dev->mode_config.mutex), | ||
| 213 | "%s called w/o mode_config lock\n", __func__); | ||
| 214 | again: | 211 | again: |
| 215 | if (idr_pre_get(&dev->mode_config.crtc_idr, GFP_KERNEL) == 0) { | 212 | if (idr_pre_get(&dev->mode_config.crtc_idr, GFP_KERNEL) == 0) { |
| 216 | DRM_ERROR("Ran out memory getting a mode number\n"); | 213 | DRM_ERROR("Ran out memory getting a mode number\n"); |
| 217 | return -EINVAL; | 214 | return -EINVAL; |
| 218 | } | 215 | } |
| 219 | 216 | ||
| 217 | mutex_lock(&dev->mode_config.idr_mutex); | ||
| 220 | ret = idr_get_new_above(&dev->mode_config.crtc_idr, obj, 1, &new_id); | 218 | ret = idr_get_new_above(&dev->mode_config.crtc_idr, obj, 1, &new_id); |
| 219 | mutex_unlock(&dev->mode_config.idr_mutex); | ||
| 221 | if (ret == -EAGAIN) | 220 | if (ret == -EAGAIN) |
| 222 | goto again; | 221 | goto again; |
| 223 | 222 | ||
| @@ -239,16 +238,20 @@ again: | |||
| 239 | static void drm_mode_object_put(struct drm_device *dev, | 238 | static void drm_mode_object_put(struct drm_device *dev, |
| 240 | struct drm_mode_object *object) | 239 | struct drm_mode_object *object) |
| 241 | { | 240 | { |
| 241 | mutex_lock(&dev->mode_config.idr_mutex); | ||
| 242 | idr_remove(&dev->mode_config.crtc_idr, object->id); | 242 | idr_remove(&dev->mode_config.crtc_idr, object->id); |
| 243 | mutex_unlock(&dev->mode_config.idr_mutex); | ||
| 243 | } | 244 | } |
| 244 | 245 | ||
| 245 | void *drm_mode_object_find(struct drm_device *dev, uint32_t id, uint32_t type) | 246 | void *drm_mode_object_find(struct drm_device *dev, uint32_t id, uint32_t type) |
| 246 | { | 247 | { |
| 247 | struct drm_mode_object *obj; | 248 | struct drm_mode_object *obj = NULL; |
| 248 | 249 | ||
| 250 | mutex_lock(&dev->mode_config.idr_mutex); | ||
| 249 | obj = idr_find(&dev->mode_config.crtc_idr, id); | 251 | obj = idr_find(&dev->mode_config.crtc_idr, id); |
| 250 | if (!obj || (obj->type != type) || (obj->id != id)) | 252 | if (!obj || (obj->type != type) || (obj->id != id)) |
| 251 | return NULL; | 253 | obj = NULL; |
| 254 | mutex_unlock(&dev->mode_config.idr_mutex); | ||
| 252 | 255 | ||
| 253 | return obj; | 256 | return obj; |
| 254 | } | 257 | } |
| @@ -786,6 +789,7 @@ EXPORT_SYMBOL(drm_mode_create_dithering_property); | |||
| 786 | void drm_mode_config_init(struct drm_device *dev) | 789 | void drm_mode_config_init(struct drm_device *dev) |
| 787 | { | 790 | { |
| 788 | mutex_init(&dev->mode_config.mutex); | 791 | mutex_init(&dev->mode_config.mutex); |
| 792 | mutex_init(&dev->mode_config.idr_mutex); | ||
| 789 | INIT_LIST_HEAD(&dev->mode_config.fb_list); | 793 | INIT_LIST_HEAD(&dev->mode_config.fb_list); |
| 790 | INIT_LIST_HEAD(&dev->mode_config.fb_kernel_list); | 794 | INIT_LIST_HEAD(&dev->mode_config.fb_kernel_list); |
| 791 | INIT_LIST_HEAD(&dev->mode_config.crtc_list); | 795 | INIT_LIST_HEAD(&dev->mode_config.crtc_list); |
diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c index 5ff88d952226..14c7a23dc157 100644 --- a/drivers/gpu/drm/drm_drv.c +++ b/drivers/gpu/drm/drm_drv.c | |||
| @@ -294,6 +294,7 @@ EXPORT_SYMBOL(drm_init); | |||
| 294 | */ | 294 | */ |
| 295 | static void drm_cleanup(struct drm_device * dev) | 295 | static void drm_cleanup(struct drm_device * dev) |
| 296 | { | 296 | { |
| 297 | struct drm_map_list *r_list, *list_temp; | ||
| 297 | DRM_DEBUG("\n"); | 298 | DRM_DEBUG("\n"); |
| 298 | 299 | ||
| 299 | if (!dev) { | 300 | if (!dev) { |
| @@ -325,6 +326,9 @@ static void drm_cleanup(struct drm_device * dev) | |||
| 325 | drm_ht_remove(&dev->map_hash); | 326 | drm_ht_remove(&dev->map_hash); |
| 326 | drm_ctxbitmap_cleanup(dev); | 327 | drm_ctxbitmap_cleanup(dev); |
| 327 | 328 | ||
| 329 | list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head) | ||
| 330 | drm_rmmap(dev, r_list->map); | ||
| 331 | |||
| 328 | if (drm_core_check_feature(dev, DRIVER_MODESET)) | 332 | if (drm_core_check_feature(dev, DRIVER_MODESET)) |
| 329 | drm_put_minor(&dev->control); | 333 | drm_put_minor(&dev->control); |
| 330 | 334 | ||
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c index 0fbb0da342cb..5a4d3244758a 100644 --- a/drivers/gpu/drm/drm_edid.c +++ b/drivers/gpu/drm/drm_edid.c | |||
| @@ -660,7 +660,7 @@ struct edid *drm_get_edid(struct drm_connector *connector, | |||
| 660 | 660 | ||
| 661 | edid = (struct edid *)drm_ddc_read(adapter); | 661 | edid = (struct edid *)drm_ddc_read(adapter); |
| 662 | if (!edid) { | 662 | if (!edid) { |
| 663 | dev_warn(&connector->dev->pdev->dev, "%s: no EDID data\n", | 663 | dev_info(&connector->dev->pdev->dev, "%s: no EDID data\n", |
| 664 | drm_get_connector_name(connector)); | 664 | drm_get_connector_name(connector)); |
| 665 | return NULL; | 665 | return NULL; |
| 666 | } | 666 | } |
diff --git a/drivers/gpu/drm/drm_stub.c b/drivers/gpu/drm/drm_stub.c index 5ca132afa4f2..46bb923b097c 100644 --- a/drivers/gpu/drm/drm_stub.c +++ b/drivers/gpu/drm/drm_stub.c | |||
| @@ -118,12 +118,20 @@ static void drm_master_destroy(struct kref *kref) | |||
| 118 | struct drm_master *master = container_of(kref, struct drm_master, refcount); | 118 | struct drm_master *master = container_of(kref, struct drm_master, refcount); |
| 119 | struct drm_magic_entry *pt, *next; | 119 | struct drm_magic_entry *pt, *next; |
| 120 | struct drm_device *dev = master->minor->dev; | 120 | struct drm_device *dev = master->minor->dev; |
| 121 | struct drm_map_list *r_list, *list_temp; | ||
| 121 | 122 | ||
| 122 | list_del(&master->head); | 123 | list_del(&master->head); |
| 123 | 124 | ||
| 124 | if (dev->driver->master_destroy) | 125 | if (dev->driver->master_destroy) |
| 125 | dev->driver->master_destroy(dev, master); | 126 | dev->driver->master_destroy(dev, master); |
| 126 | 127 | ||
| 128 | list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head) { | ||
| 129 | if (r_list->master == master) { | ||
| 130 | drm_rmmap_locked(dev, r_list->map); | ||
| 131 | r_list = NULL; | ||
| 132 | } | ||
| 133 | } | ||
| 134 | |||
| 127 | if (master->unique) { | 135 | if (master->unique) { |
| 128 | drm_free(master->unique, master->unique_size, DRM_MEM_DRIVER); | 136 | drm_free(master->unique, master->unique_size, DRM_MEM_DRIVER); |
| 129 | master->unique = NULL; | 137 | master->unique = NULL; |
diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c index bbadf1c04142..ee64b7301f67 100644 --- a/drivers/gpu/drm/i915/i915_dma.c +++ b/drivers/gpu/drm/i915/i915_dma.c | |||
| @@ -944,13 +944,14 @@ static int i915_load_modeset_init(struct drm_device *dev) | |||
| 944 | dev->mode_config.fb_base = drm_get_resource_start(dev, fb_bar) & | 944 | dev->mode_config.fb_base = drm_get_resource_start(dev, fb_bar) & |
| 945 | 0xff000000; | 945 | 0xff000000; |
| 946 | 946 | ||
| 947 | DRM_DEBUG("*** fb base 0x%08lx\n", dev->mode_config.fb_base); | 947 | if (IS_MOBILE(dev) || IS_I9XX(dev)) |
| 948 | |||
| 949 | if (IS_MOBILE(dev) || (IS_I9XX(dev) && !IS_I965G(dev) && !IS_G33(dev))) | ||
| 950 | dev_priv->cursor_needs_physical = true; | 948 | dev_priv->cursor_needs_physical = true; |
| 951 | else | 949 | else |
| 952 | dev_priv->cursor_needs_physical = false; | 950 | dev_priv->cursor_needs_physical = false; |
| 953 | 951 | ||
| 952 | if (IS_I965G(dev) || IS_G33(dev)) | ||
| 953 | dev_priv->cursor_needs_physical = false; | ||
| 954 | |||
| 954 | ret = i915_probe_agp(dev, &agp_size, &prealloc_size); | 955 | ret = i915_probe_agp(dev, &agp_size, &prealloc_size); |
| 955 | if (ret) | 956 | if (ret) |
| 956 | goto kfree_devname; | 957 | goto kfree_devname; |
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c index 33fbeb664f08..debad5c04cc0 100644 --- a/drivers/gpu/drm/i915/i915_gem.c +++ b/drivers/gpu/drm/i915/i915_gem.c | |||
| @@ -3364,7 +3364,7 @@ void i915_gem_free_all_phys_object(struct drm_device *dev) | |||
| 3364 | { | 3364 | { |
| 3365 | int i; | 3365 | int i; |
| 3366 | 3366 | ||
| 3367 | for (i = 0; i < I915_MAX_PHYS_OBJECT; i++) | 3367 | for (i = I915_GEM_PHYS_CURSOR_0; i <= I915_MAX_PHYS_OBJECT; i++) |
| 3368 | i915_gem_free_phys_object(dev, i); | 3368 | i915_gem_free_phys_object(dev, i); |
| 3369 | } | 3369 | } |
| 3370 | 3370 | ||
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c index 2fafdcc108fe..6b1148fc2cbe 100644 --- a/drivers/gpu/drm/i915/intel_lvds.c +++ b/drivers/gpu/drm/i915/intel_lvds.c | |||
| @@ -340,6 +340,18 @@ static void intel_lvds_destroy(struct drm_connector *connector) | |||
| 340 | kfree(connector); | 340 | kfree(connector); |
| 341 | } | 341 | } |
| 342 | 342 | ||
| 343 | static int intel_lvds_set_property(struct drm_connector *connector, | ||
| 344 | struct drm_property *property, | ||
| 345 | uint64_t value) | ||
| 346 | { | ||
| 347 | struct drm_device *dev = connector->dev; | ||
| 348 | |||
| 349 | if (property == dev->mode_config.dpms_property && connector->encoder) | ||
| 350 | intel_lvds_dpms(connector->encoder, (uint32_t)(value & 0xf)); | ||
| 351 | |||
| 352 | return 0; | ||
| 353 | } | ||
| 354 | |||
| 343 | static const struct drm_encoder_helper_funcs intel_lvds_helper_funcs = { | 355 | static const struct drm_encoder_helper_funcs intel_lvds_helper_funcs = { |
| 344 | .dpms = intel_lvds_dpms, | 356 | .dpms = intel_lvds_dpms, |
| 345 | .mode_fixup = intel_lvds_mode_fixup, | 357 | .mode_fixup = intel_lvds_mode_fixup, |
| @@ -359,6 +371,7 @@ static const struct drm_connector_funcs intel_lvds_connector_funcs = { | |||
| 359 | .restore = intel_lvds_restore, | 371 | .restore = intel_lvds_restore, |
| 360 | .detect = intel_lvds_detect, | 372 | .detect = intel_lvds_detect, |
| 361 | .fill_modes = drm_helper_probe_single_connector_modes, | 373 | .fill_modes = drm_helper_probe_single_connector_modes, |
| 374 | .set_property = intel_lvds_set_property, | ||
| 362 | .destroy = intel_lvds_destroy, | 375 | .destroy = intel_lvds_destroy, |
| 363 | }; | 376 | }; |
| 364 | 377 | ||
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h index 47809ac94bc3..d54de24bf371 100644 --- a/include/drm/drm_crtc.h +++ b/include/drm/drm_crtc.h | |||
| @@ -528,7 +528,8 @@ struct drm_mode_group { | |||
| 528 | * | 528 | * |
| 529 | */ | 529 | */ |
| 530 | struct drm_mode_config { | 530 | struct drm_mode_config { |
| 531 | struct mutex mutex; /* protects configuration and IDR */ | 531 | struct mutex mutex; /* protects configuration (mode lists etc.) */ |
| 532 | struct mutex idr_mutex; /* for IDR management */ | ||
| 532 | struct idr crtc_idr; /* use this idr for all IDs, fb, crtc, connector, modes - just makes life easier */ | 533 | struct idr crtc_idr; /* use this idr for all IDs, fb, crtc, connector, modes - just makes life easier */ |
| 533 | /* this is limited to one for now */ | 534 | /* this is limited to one for now */ |
| 534 | int num_fb; | 535 | int num_fb; |
