Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 832fb4a0 authored by Linus Torvalds's avatar Linus Torvalds
Browse files
* '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.
parents 4a456592 2906f025
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -33,10 +33,11 @@

#include "drmP.h"
#include <linux/module.h>
#include <asm/agp.h>

#if __OS_HAS_AGP

#include <asm/agp.h>

/**
 * Get AGP information.
 *
+9 −5
Original line number Diff line number Diff line
@@ -194,7 +194,6 @@ char *drm_get_connector_status_name(enum drm_connector_status status)
 * @type: object type
 *
 * LOCKING:
 * Caller must hold DRM mode_config lock.
 *
 * Create a unique identifier based on @ptr in @dev's identifier space.  Used
 * for tracking modes, CRTCs and connectors.
@@ -209,15 +208,15 @@ static int drm_mode_object_get(struct drm_device *dev,
	int new_id = 0;
	int ret;

	WARN(!mutex_is_locked(&dev->mode_config.mutex),
	     "%s called w/o mode_config lock\n", __func__);
again:
	if (idr_pre_get(&dev->mode_config.crtc_idr, GFP_KERNEL) == 0) {
		DRM_ERROR("Ran out memory getting a mode number\n");
		return -EINVAL;
	}

	mutex_lock(&dev->mode_config.idr_mutex);
	ret = idr_get_new_above(&dev->mode_config.crtc_idr, obj, 1, &new_id);
	mutex_unlock(&dev->mode_config.idr_mutex);
	if (ret == -EAGAIN)
		goto again;

@@ -239,16 +238,20 @@ again:
static void drm_mode_object_put(struct drm_device *dev,
				struct drm_mode_object *object)
{
	mutex_lock(&dev->mode_config.idr_mutex);
	idr_remove(&dev->mode_config.crtc_idr, object->id);
	mutex_unlock(&dev->mode_config.idr_mutex);
}

void *drm_mode_object_find(struct drm_device *dev, uint32_t id, uint32_t type)
{
	struct drm_mode_object *obj;
	struct drm_mode_object *obj = NULL;

	mutex_lock(&dev->mode_config.idr_mutex);
	obj = idr_find(&dev->mode_config.crtc_idr, id);
	if (!obj || (obj->type != type) || (obj->id != id))
		return NULL;
		obj = NULL;
	mutex_unlock(&dev->mode_config.idr_mutex);

	return obj;
}
@@ -786,6 +789,7 @@ EXPORT_SYMBOL(drm_mode_create_dithering_property);
void drm_mode_config_init(struct drm_device *dev)
{
	mutex_init(&dev->mode_config.mutex);
	mutex_init(&dev->mode_config.idr_mutex);
	INIT_LIST_HEAD(&dev->mode_config.fb_list);
	INIT_LIST_HEAD(&dev->mode_config.fb_kernel_list);
	INIT_LIST_HEAD(&dev->mode_config.crtc_list);
+4 −0
Original line number Diff line number Diff line
@@ -294,6 +294,7 @@ EXPORT_SYMBOL(drm_init);
 */
static void drm_cleanup(struct drm_device * dev)
{
	struct drm_map_list *r_list, *list_temp;
	DRM_DEBUG("\n");

	if (!dev) {
@@ -325,6 +326,9 @@ static void drm_cleanup(struct drm_device * dev)
	drm_ht_remove(&dev->map_hash);
	drm_ctxbitmap_cleanup(dev);

	list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head)
		drm_rmmap(dev, r_list->map);

	if (drm_core_check_feature(dev, DRIVER_MODESET))
		drm_put_minor(&dev->control);

+1 −1
Original line number Diff line number Diff line
@@ -660,7 +660,7 @@ struct edid *drm_get_edid(struct drm_connector *connector,

	edid = (struct edid *)drm_ddc_read(adapter);
	if (!edid) {
		dev_warn(&connector->dev->pdev->dev, "%s: no EDID data\n",
		dev_info(&connector->dev->pdev->dev, "%s: no EDID data\n",
			 drm_get_connector_name(connector));
		return NULL;
	}
+8 −0
Original line number Diff line number Diff line
@@ -118,12 +118,20 @@ static void drm_master_destroy(struct kref *kref)
	struct drm_master *master = container_of(kref, struct drm_master, refcount);
	struct drm_magic_entry *pt, *next;
	struct drm_device *dev = master->minor->dev;
	struct drm_map_list *r_list, *list_temp;

	list_del(&master->head);

	if (dev->driver->master_destroy)
		dev->driver->master_destroy(dev, master);

	list_for_each_entry_safe(r_list, list_temp, &dev->maplist, head) {
		if (r_list->master == master) {
			drm_rmmap_locked(dev, r_list->map);
			r_list = NULL;
		}
	}

	if (master->unique) {
		drm_free(master->unique, master->unique_size, DRM_MEM_DRIVER);
		master->unique = NULL;
Loading