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

Commit 9712def2 authored by Dave Airlie's avatar Dave Airlie
Browse files

Merge tag 'drm-intel-next-2013-08-09' of...

Merge tag 'drm-intel-next-2013-08-09' of git://people.freedesktop.org/~danvet/drm-intel into drm-next

Daniel writes:
New pile of stuff for -next:
- Cleanup of the old crtc helper callbacks, all encoders are now converted
  to the i915 modeset infrastructure.
- Massive amount of wm patches from Ville for ilk, snb, ivb, hsw, this is
  prep work to eventually get things going for nuclear pageflips where we
  need to adjust watermarks on the fly.
- More vm/vma patches from Ben. This refactoring isn't yet fully rolled
  out, we miss the execbuf conversion and some of the low-level
  bind/unbind support code.
- Convert our hdmi infoframe code to use the new common helper functions
  (Damien). This contains some bugfixes for the common infoframe helpers.
- Some cruft removal from Damien.
- Various smaller bits&pieces all over, as usual.

* tag 'drm-intel-next-2013-08-09' of git://people.freedesktop.org/~danvet/drm-intel: (105 commits)
  drm/i915: Fix FB WM for HSW
  drm/i915: expose HDMI connectors on port C on BYT
  drm/i915: fix a limit check in hsw_compute_wm_results()
  drm/i915: unbreak i915_gem_object_ggtt_unbind()
  drm/i915: Make intel_set_mode() static
  drm/i915: Remove intel_modeset_disable()
  drm/i915: Make intel_encoder_dpms() static
  drm/i915: Make i915_hangcheck_elapsed() static
  drm/i915: Fix #endif comment
  drm/i915: Remove i915_gem_object_check_coherency()
  drm/i915: Remove stale prototypes
  drm/i915: List objects allocated from stolen memory in debugfs
  drm/i915: Always call intel_update_sprite_watermarks() when disabling a plane
  drm/i915: Pass plane and crtc to intel_update_sprite_watermarks
  drm/i915: Don't try to disable plane if it's already disabled
  drm/i915: Pass crtc to our update/disable_plane hooks
  drm/i915: Split plane watermark parameters into a separate struct
  drm/i915: Pull some watermarks state into a separate structure
  drm/i915: Calculate max watermark levels for ILK+
  drm/i915: Rename hsw_lp_wm_result to intel_wm_level
  ...
parents 66cc8b6b 5c536613
Loading
Loading
Loading
Loading
+4 −2
Original line number Original line Diff line number Diff line
@@ -3102,11 +3102,13 @@ drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame,
	if (err < 0)
	if (err < 0)
		return err;
		return err;


	if (mode->flags & DRM_MODE_FLAG_DBLCLK)
		frame->pixel_repeat = 1;

	frame->video_code = drm_match_cea_mode(mode);
	frame->video_code = drm_match_cea_mode(mode);
	if (!frame->video_code)
		return 0;


	frame->picture_aspect = HDMI_PICTURE_ASPECT_NONE;
	frame->picture_aspect = HDMI_PICTURE_ASPECT_NONE;
	frame->active_info_valid = 1;
	frame->active_aspect = HDMI_ACTIVE_ASPECT_PICTURE;
	frame->active_aspect = HDMI_ACTIVE_ASPECT_PICTURE;


	return 0;
	return 0;
+117 −18
Original line number Original line Diff line number Diff line
@@ -30,6 +30,7 @@
#include <linux/debugfs.h>
#include <linux/debugfs.h>
#include <linux/slab.h>
#include <linux/slab.h>
#include <linux/export.h>
#include <linux/export.h>
#include <linux/list_sort.h>
#include <drm/drmP.h>
#include <drm/drmP.h>
#include "intel_drv.h"
#include "intel_drv.h"
#include "intel_ringbuffer.h"
#include "intel_ringbuffer.h"
@@ -89,13 +90,20 @@ static const char *get_tiling_flag(struct drm_i915_gem_object *obj)
	}
	}
}
}


static inline const char *get_global_flag(struct drm_i915_gem_object *obj)
{
	return obj->has_global_gtt_mapping ? "g" : " ";
}

static void
static void
describe_obj(struct seq_file *m, struct drm_i915_gem_object *obj)
describe_obj(struct seq_file *m, struct drm_i915_gem_object *obj)
{
{
	seq_printf(m, "%pK: %s%s %8zdKiB %02x %02x %d %d %d%s%s%s",
	struct i915_vma *vma;
	seq_printf(m, "%pK: %s%s%s %8zdKiB %02x %02x %d %d %d%s%s%s",
		   &obj->base,
		   &obj->base,
		   get_pin_flag(obj),
		   get_pin_flag(obj),
		   get_tiling_flag(obj),
		   get_tiling_flag(obj),
		   get_global_flag(obj),
		   obj->base.size / 1024,
		   obj->base.size / 1024,
		   obj->base.read_domains,
		   obj->base.read_domains,
		   obj->base.write_domain,
		   obj->base.write_domain,
@@ -111,9 +119,14 @@ describe_obj(struct seq_file *m, struct drm_i915_gem_object *obj)
		seq_printf(m, " (pinned x %d)", obj->pin_count);
		seq_printf(m, " (pinned x %d)", obj->pin_count);
	if (obj->fence_reg != I915_FENCE_REG_NONE)
	if (obj->fence_reg != I915_FENCE_REG_NONE)
		seq_printf(m, " (fence: %d)", obj->fence_reg);
		seq_printf(m, " (fence: %d)", obj->fence_reg);
	if (i915_gem_obj_ggtt_bound(obj))
	list_for_each_entry(vma, &obj->vma_list, vma_link) {
		seq_printf(m, " (gtt offset: %08lx, size: %08x)",
		if (!i915_is_ggtt(vma->vm))
			   i915_gem_obj_ggtt_offset(obj), (unsigned int)i915_gem_obj_ggtt_size(obj));
			seq_puts(m, " (pp");
		else
			seq_puts(m, " (g");
		seq_printf(m, "gtt offset: %08lx, size: %08lx)",
			   vma->node.start, vma->node.size);
	}
	if (obj->stolen)
	if (obj->stolen)
		seq_printf(m, " (stolen: %08lx)", obj->stolen->start);
		seq_printf(m, " (stolen: %08lx)", obj->stolen->start);
	if (obj->pin_mappable || obj->fault_mappable) {
	if (obj->pin_mappable || obj->fault_mappable) {
@@ -137,7 +150,7 @@ static int i915_gem_object_list_info(struct seq_file *m, void *data)
	struct drm_device *dev = node->minor->dev;
	struct drm_device *dev = node->minor->dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
	struct drm_i915_private *dev_priv = dev->dev_private;
	struct i915_address_space *vm = &dev_priv->gtt.base;
	struct i915_address_space *vm = &dev_priv->gtt.base;
	struct drm_i915_gem_object *obj;
	struct i915_vma *vma;
	size_t total_obj_size, total_gtt_size;
	size_t total_obj_size, total_gtt_size;
	int count, ret;
	int count, ret;


@@ -145,6 +158,7 @@ static int i915_gem_object_list_info(struct seq_file *m, void *data)
	if (ret)
	if (ret)
		return ret;
		return ret;


	/* FIXME: the user of this interface might want more than just GGTT */
	switch (list) {
	switch (list) {
	case ACTIVE_LIST:
	case ACTIVE_LIST:
		seq_puts(m, "Active:\n");
		seq_puts(m, "Active:\n");
@@ -160,14 +174,75 @@ static int i915_gem_object_list_info(struct seq_file *m, void *data)
	}
	}


	total_obj_size = total_gtt_size = count = 0;
	total_obj_size = total_gtt_size = count = 0;
	list_for_each_entry(obj, head, mm_list) {
	list_for_each_entry(vma, head, mm_list) {
		seq_puts(m, "   ");
		seq_printf(m, "   ");
		describe_obj(m, obj);
		describe_obj(m, vma->obj);
		seq_putc(m, '\n');
		seq_printf(m, "\n");
		total_obj_size += vma->obj->base.size;
		total_gtt_size += vma->node.size;
		count++;
	}
	mutex_unlock(&dev->struct_mutex);

	seq_printf(m, "Total %d objects, %zu bytes, %zu GTT size\n",
		   count, total_obj_size, total_gtt_size);
	return 0;
}

static int obj_rank_by_stolen(void *priv,
			      struct list_head *A, struct list_head *B)
{
	struct drm_i915_gem_object *a =
		container_of(A, struct drm_i915_gem_object, exec_list);
	struct drm_i915_gem_object *b =
		container_of(B, struct drm_i915_gem_object, exec_list);

	return a->stolen->start - b->stolen->start;
}

static int i915_gem_stolen_list_info(struct seq_file *m, void *data)
{
	struct drm_info_node *node = (struct drm_info_node *) m->private;
	struct drm_device *dev = node->minor->dev;
	struct drm_i915_private *dev_priv = dev->dev_private;
	struct drm_i915_gem_object *obj;
	size_t total_obj_size, total_gtt_size;
	LIST_HEAD(stolen);
	int count, ret;

	ret = mutex_lock_interruptible(&dev->struct_mutex);
	if (ret)
		return ret;

	total_obj_size = total_gtt_size = count = 0;
	list_for_each_entry(obj, &dev_priv->mm.bound_list, global_list) {
		if (obj->stolen == NULL)
			continue;

		list_add(&obj->exec_list, &stolen);

		total_obj_size += obj->base.size;
		total_obj_size += obj->base.size;
		total_gtt_size += i915_gem_obj_ggtt_size(obj);
		total_gtt_size += i915_gem_obj_ggtt_size(obj);
		count++;
		count++;
	}
	}
	list_for_each_entry(obj, &dev_priv->mm.unbound_list, global_list) {
		if (obj->stolen == NULL)
			continue;

		list_add(&obj->exec_list, &stolen);

		total_obj_size += obj->base.size;
		count++;
	}
	list_sort(NULL, &stolen, obj_rank_by_stolen);
	seq_puts(m, "Stolen:\n");
	while (!list_empty(&stolen)) {
		obj = list_first_entry(&stolen, typeof(*obj), exec_list);
		seq_puts(m, "   ");
		describe_obj(m, obj);
		seq_putc(m, '\n');
		list_del_init(&obj->exec_list);
	}
	mutex_unlock(&dev->struct_mutex);
	mutex_unlock(&dev->struct_mutex);


	seq_printf(m, "Total %d objects, %zu bytes, %zu GTT size\n",
	seq_printf(m, "Total %d objects, %zu bytes, %zu GTT size\n",
@@ -212,6 +287,17 @@ static int per_file_stats(int id, void *ptr, void *data)
	return 0;
	return 0;
}
}


#define count_vmas(list, member) do { \
	list_for_each_entry(vma, list, member) { \
		size += i915_gem_obj_ggtt_size(vma->obj); \
		++count; \
		if (vma->obj->map_and_fenceable) { \
			mappable_size += i915_gem_obj_ggtt_size(vma->obj); \
			++mappable_count; \
		} \
	} \
} while (0)

static int i915_gem_object_info(struct seq_file *m, void* data)
static int i915_gem_object_info(struct seq_file *m, void* data)
{
{
	struct drm_info_node *node = (struct drm_info_node *) m->private;
	struct drm_info_node *node = (struct drm_info_node *) m->private;
@@ -222,6 +308,7 @@ static int i915_gem_object_info(struct seq_file *m, void *data)
	struct drm_i915_gem_object *obj;
	struct drm_i915_gem_object *obj;
	struct i915_address_space *vm = &dev_priv->gtt.base;
	struct i915_address_space *vm = &dev_priv->gtt.base;
	struct drm_file *file;
	struct drm_file *file;
	struct i915_vma *vma;
	int ret;
	int ret;


	ret = mutex_lock_interruptible(&dev->struct_mutex);
	ret = mutex_lock_interruptible(&dev->struct_mutex);
@@ -238,12 +325,12 @@ static int i915_gem_object_info(struct seq_file *m, void *data)
		   count, mappable_count, size, mappable_size);
		   count, mappable_count, size, mappable_size);


	size = count = mappable_size = mappable_count = 0;
	size = count = mappable_size = mappable_count = 0;
	count_objects(&vm->active_list, mm_list);
	count_vmas(&vm->active_list, mm_list);
	seq_printf(m, "  %u [%u] active objects, %zu [%zu] bytes\n",
	seq_printf(m, "  %u [%u] active objects, %zu [%zu] bytes\n",
		   count, mappable_count, size, mappable_size);
		   count, mappable_count, size, mappable_size);


	size = count = mappable_size = mappable_count = 0;
	size = count = mappable_size = mappable_count = 0;
	count_objects(&vm->inactive_list, mm_list);
	count_vmas(&vm->inactive_list, mm_list);
	seq_printf(m, "  %u [%u] inactive objects, %zu [%zu] bytes\n",
	seq_printf(m, "  %u [%u] inactive objects, %zu [%zu] bytes\n",
		   count, mappable_count, size, mappable_size);
		   count, mappable_count, size, mappable_size);


@@ -1099,6 +1186,12 @@ static int i915_fbc_status(struct seq_file *m, void *unused)
	} else {
	} else {
		seq_puts(m, "FBC disabled: ");
		seq_puts(m, "FBC disabled: ");
		switch (dev_priv->fbc.no_fbc_reason) {
		switch (dev_priv->fbc.no_fbc_reason) {
		case FBC_OK:
			seq_puts(m, "FBC actived, but currently disabled in hardware");
			break;
		case FBC_UNSUPPORTED:
			seq_puts(m, "unsupported by this chipset");
			break;
		case FBC_NO_OUTPUT:
		case FBC_NO_OUTPUT:
			seq_puts(m, "no outputs");
			seq_puts(m, "no outputs");
			break;
			break;
@@ -1756,7 +1849,8 @@ i915_drop_caches_set(void *data, u64 val)
	struct drm_device *dev = data;
	struct drm_device *dev = data;
	struct drm_i915_private *dev_priv = dev->dev_private;
	struct drm_i915_private *dev_priv = dev->dev_private;
	struct drm_i915_gem_object *obj, *next;
	struct drm_i915_gem_object *obj, *next;
	struct i915_address_space *vm = &dev_priv->gtt.base;
	struct i915_address_space *vm;
	struct i915_vma *vma, *x;
	int ret;
	int ret;


	DRM_DEBUG_DRIVER("Dropping caches: 0x%08llx\n", val);
	DRM_DEBUG_DRIVER("Dropping caches: 0x%08llx\n", val);
@@ -1777,14 +1871,18 @@ i915_drop_caches_set(void *data, u64 val)
		i915_gem_retire_requests(dev);
		i915_gem_retire_requests(dev);


	if (val & DROP_BOUND) {
	if (val & DROP_BOUND) {
		list_for_each_entry_safe(obj, next, &vm->inactive_list,
		list_for_each_entry(vm, &dev_priv->vm_list, global_link) {
					 mm_list)
			list_for_each_entry_safe(vma, x, &vm->inactive_list,
			if (obj->pin_count == 0) {
						 mm_list) {
				ret = i915_gem_object_unbind(obj);
				if (vma->obj->pin_count)
					continue;

				ret = i915_vma_unbind(vma);
				if (ret)
				if (ret)
					goto unlock;
					goto unlock;
			}
			}
		}
		}
	}


	if (val & DROP_UNBOUND) {
	if (val & DROP_UNBOUND) {
		list_for_each_entry_safe(obj, next, &dev_priv->mm.unbound_list,
		list_for_each_entry_safe(obj, next, &dev_priv->mm.unbound_list,
@@ -2078,6 +2176,7 @@ static struct drm_info_list i915_debugfs_list[] = {
	{"i915_gem_pinned", i915_gem_gtt_info, 0, (void *) PINNED_LIST},
	{"i915_gem_pinned", i915_gem_gtt_info, 0, (void *) PINNED_LIST},
	{"i915_gem_active", i915_gem_object_list_info, 0, (void *) ACTIVE_LIST},
	{"i915_gem_active", i915_gem_object_list_info, 0, (void *) ACTIVE_LIST},
	{"i915_gem_inactive", i915_gem_object_list_info, 0, (void *) INACTIVE_LIST},
	{"i915_gem_inactive", i915_gem_object_list_info, 0, (void *) INACTIVE_LIST},
	{"i915_gem_stolen", i915_gem_stolen_list_info },
	{"i915_gem_pageflip", i915_gem_pageflip_info, 0},
	{"i915_gem_pageflip", i915_gem_pageflip_info, 0},
	{"i915_gem_request", i915_gem_request_info, 0},
	{"i915_gem_request", i915_gem_request_info, 0},
	{"i915_gem_seqno", i915_gem_seqno_info, 0},
	{"i915_gem_seqno", i915_gem_seqno_info, 0},
@@ -2110,7 +2209,7 @@ static struct drm_info_list i915_debugfs_list[] = {
};
};
#define I915_DEBUGFS_ENTRIES ARRAY_SIZE(i915_debugfs_list)
#define I915_DEBUGFS_ENTRIES ARRAY_SIZE(i915_debugfs_list)


struct i915_debugfs_files {
static struct i915_debugfs_files {
	const char *name;
	const char *name;
	const struct file_operations *fops;
	const struct file_operations *fops;
} i915_debugfs_files[] = {
} i915_debugfs_files[] = {
+0 −4
Original line number Original line Diff line number Diff line
@@ -1485,10 +1485,6 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)


	i915_dump_device_info(dev_priv);
	i915_dump_device_info(dev_priv);


	INIT_LIST_HEAD(&dev_priv->vm_list);
	INIT_LIST_HEAD(&dev_priv->gtt.base.global_link);
	list_add(&dev_priv->gtt.base.global_link, &dev_priv->vm_list);

	if (i915_get_bridge_dev(dev)) {
	if (i915_get_bridge_dev(dev)) {
		ret = -EIO;
		ret = -EIO;
		goto free_priv;
		goto free_priv;
+110 −73
Original line number Original line Diff line number Diff line
@@ -201,7 +201,6 @@ struct intel_ddi_plls {
#define DRIVER_MINOR		6
#define DRIVER_MINOR		6
#define DRIVER_PATCHLEVEL	0
#define DRIVER_PATCHLEVEL	0


#define WATCH_COHERENCY	0
#define WATCH_LISTS	0
#define WATCH_LISTS	0
#define WATCH_GTT	0
#define WATCH_GTT	0


@@ -323,8 +322,8 @@ struct drm_i915_error_state {
		u32 purgeable:1;
		u32 purgeable:1;
		s32 ring:4;
		s32 ring:4;
		u32 cache_level:2;
		u32 cache_level:2;
	} *active_bo, *pinned_bo;
	} **active_bo, **pinned_bo;
	u32 active_bo_count, pinned_bo_count;
	u32 *active_bo_count, *pinned_bo_count;
	struct intel_overlay_error_state *overlay;
	struct intel_overlay_error_state *overlay;
	struct intel_display_error_state *display;
	struct intel_display_error_state *display;
};
};
@@ -359,9 +358,10 @@ struct drm_i915_display_funcs {
			  struct dpll *match_clock,
			  struct dpll *match_clock,
			  struct dpll *best_clock);
			  struct dpll *best_clock);
	void (*update_wm)(struct drm_device *dev);
	void (*update_wm)(struct drm_device *dev);
	void (*update_sprite_wm)(struct drm_device *dev, int pipe,
	void (*update_sprite_wm)(struct drm_plane *plane,
				 struct drm_crtc *crtc,
				 uint32_t sprite_width, int pixel_size,
				 uint32_t sprite_width, int pixel_size,
				 bool enable);
				 bool enable, bool scaled);
	void (*modeset_global_resources)(struct drm_device *dev);
	void (*modeset_global_resources)(struct drm_device *dev);
	/* Returns the active state of the crtc, and if the crtc is active,
	/* Returns the active state of the crtc, and if the crtc is active,
	 * fills out the pipe-config with the hw state. */
	 * fills out the pipe-config with the hw state. */
@@ -449,8 +449,11 @@ struct intel_device_info {


enum i915_cache_level {
enum i915_cache_level {
	I915_CACHE_NONE = 0,
	I915_CACHE_NONE = 0,
	I915_CACHE_LLC,
	I915_CACHE_LLC, /* also used for snoopable memory on non-LLC */
	I915_CACHE_LLC_MLC, /* gen6+, in docs at least! */
	I915_CACHE_L3_LLC, /* gen7+, L3 sits between the domain specifc
			      caches, eg sampler/render caches, and the
			      large Last-Level-Cache. LLC is coherent with
			      the CPU, but L3 is only visible to the GPU. */
};
};


typedef uint32_t gen6_gtt_pte_t;
typedef uint32_t gen6_gtt_pte_t;
@@ -542,7 +545,12 @@ struct i915_hw_ppgtt {
	int (*enable)(struct drm_device *dev);
	int (*enable)(struct drm_device *dev);
};
};


/* To make things as simple as possible (ie. no refcounting), a VMA's lifetime
/**
 * A VMA represents a GEM BO that is bound into an address space. Therefore, a
 * VMA's presence cannot be guaranteed before binding, or after unbinding the
 * object into/from the address space.
 *
 * To make things as simple as possible (ie. no refcounting), a VMA's lifetime
 * will always be <= an objects lifetime. So object refcounting should cover us.
 * will always be <= an objects lifetime. So object refcounting should cover us.
 */
 */
struct i915_vma {
struct i915_vma {
@@ -550,6 +558,9 @@ struct i915_vma {
	struct drm_i915_gem_object *obj;
	struct drm_i915_gem_object *obj;
	struct i915_address_space *vm;
	struct i915_address_space *vm;


	/** This object's place on the active/inactive lists */
	struct list_head mm_list;

	struct list_head vma_link; /* Link in the object's VMA list */
	struct list_head vma_link; /* Link in the object's VMA list */
};
};


@@ -589,7 +600,9 @@ struct i915_fbc {
		int interval;
		int interval;
	} *fbc_work;
	} *fbc_work;


	enum {
	enum no_fbc_reason {
		FBC_OK, /* FBC is enabled */
		FBC_UNSUPPORTED, /* FBC is not supported by this chipset */
		FBC_NO_OUTPUT, /* no outputs enabled to compress */
		FBC_NO_OUTPUT, /* no outputs enabled to compress */
		FBC_STOLEN_TOO_SMALL, /* not enough space for buffers */
		FBC_STOLEN_TOO_SMALL, /* not enough space for buffers */
		FBC_UNSUPPORTED_MODE, /* interlace or doublescanned mode */
		FBC_UNSUPPORTED_MODE, /* interlace or doublescanned mode */
@@ -1045,6 +1058,19 @@ struct intel_vbt_data {
	struct child_device_config *child_dev;
	struct child_device_config *child_dev;
};
};


enum intel_ddb_partitioning {
	INTEL_DDB_PART_1_2,
	INTEL_DDB_PART_5_6, /* IVB+ */
};

struct intel_wm_level {
	bool enable;
	uint32_t pri_val;
	uint32_t spr_val;
	uint32_t cur_val;
	uint32_t fbc_val;
};

typedef struct drm_i915_private {
typedef struct drm_i915_private {
	struct drm_device *dev;
	struct drm_device *dev;
	struct kmem_cache *slab;
	struct kmem_cache *slab;
@@ -1214,6 +1240,20 @@ typedef struct drm_i915_private {


	struct i915_suspend_saved_registers regfile;
	struct i915_suspend_saved_registers regfile;


	struct {
		/*
		 * Raw watermark latency values:
		 * in 0.1us units for WM0,
		 * in 0.5us units for WM1+.
		 */
		/* primary */
		uint16_t pri_latency[5];
		/* sprite */
		uint16_t spr_latency[5];
		/* cursor */
		uint16_t cur_latency[5];
	} wm;

	/* Old dri1 support infrastructure, beware the dragons ya fools entering
	/* Old dri1 support infrastructure, beware the dragons ya fools entering
	 * here! */
	 * here! */
	struct i915_dri1_state dri1;
	struct i915_dri1_state dri1;
@@ -1221,6 +1261,11 @@ typedef struct drm_i915_private {
	struct i915_ums_state ums;
	struct i915_ums_state ums;
} drm_i915_private_t;
} drm_i915_private_t;


static inline struct drm_i915_private *to_i915(const struct drm_device *dev)
{
	return dev->dev_private;
}

/* Iterate over initialised rings */
/* Iterate over initialised rings */
#define for_each_ring(ring__, dev_priv__, i__) \
#define for_each_ring(ring__, dev_priv__, i__) \
	for ((i__) = 0; (i__) < I915_NUM_RINGS; (i__)++) \
	for ((i__) = 0; (i__) < I915_NUM_RINGS; (i__)++) \
@@ -1265,9 +1310,7 @@ struct drm_i915_gem_object {
	struct drm_mm_node *stolen;
	struct drm_mm_node *stolen;
	struct list_head global_list;
	struct list_head global_list;


	/** This object's place on the active/inactive lists */
	struct list_head ring_list;
	struct list_head ring_list;
	struct list_head mm_list;
	/** This object's place in the batchbuffer or on the eviction list */
	/** This object's place in the batchbuffer or on the eviction list */
	struct list_head exec_list;
	struct list_head exec_list;


@@ -1386,52 +1429,6 @@ struct drm_i915_gem_object {


#define to_intel_bo(x) container_of(x, struct drm_i915_gem_object, base)
#define to_intel_bo(x) container_of(x, struct drm_i915_gem_object, base)


/* This is a temporary define to help transition us to real VMAs. If you see
 * this, you're either reviewing code, or bisecting it. */
static inline struct i915_vma *
__i915_gem_obj_to_vma(struct drm_i915_gem_object *obj)
{
	if (list_empty(&obj->vma_list))
		return NULL;
	return list_first_entry(&obj->vma_list, struct i915_vma, vma_link);
}

/* Whether or not this object is currently mapped by the translation tables */
static inline bool
i915_gem_obj_ggtt_bound(struct drm_i915_gem_object *o)
{
	struct i915_vma *vma = __i915_gem_obj_to_vma(o);
	if (vma == NULL)
		return false;
	return drm_mm_node_allocated(&vma->node);
}

/* Offset of the first PTE pointing to this object */
static inline unsigned long
i915_gem_obj_ggtt_offset(struct drm_i915_gem_object *o)
{
	BUG_ON(list_empty(&o->vma_list));
	return __i915_gem_obj_to_vma(o)->node.start;
}

/* The size used in the translation tables may be larger than the actual size of
 * the object on GEN2/GEN3 because of the way tiling is handled. See
 * i915_gem_get_gtt_size() for more details.
 */
static inline unsigned long
i915_gem_obj_ggtt_size(struct drm_i915_gem_object *o)
{
	BUG_ON(list_empty(&o->vma_list));
	return __i915_gem_obj_to_vma(o)->node.size;
}

static inline void
i915_gem_obj_ggtt_set_color(struct drm_i915_gem_object *o,
			    enum i915_cache_level color)
{
	__i915_gem_obj_to_vma(o)->node.color = color;
}

/**
/**
 * Request queue structure.
 * Request queue structure.
 *
 *
@@ -1482,7 +1479,7 @@ struct drm_i915_file_private {
	struct i915_ctx_hang_stats hang_stats;
	struct i915_ctx_hang_stats hang_stats;
};
};


#define INTEL_INFO(dev)	(((struct drm_i915_private *) (dev)->dev_private)->info)
#define INTEL_INFO(dev)	(to_i915(dev)->info)


#define IS_I830(dev)		((dev)->pci_device == 0x3577)
#define IS_I830(dev)		((dev)->pci_device == 0x3577)
#define IS_845G(dev)		((dev)->pci_device == 0x2562)
#define IS_845G(dev)		((dev)->pci_device == 0x2562)
@@ -1576,7 +1573,7 @@ struct drm_i915_file_private {
#define INTEL_PCH_LPT_DEVICE_ID_TYPE		0x8c00
#define INTEL_PCH_LPT_DEVICE_ID_TYPE		0x8c00
#define INTEL_PCH_LPT_LP_DEVICE_ID_TYPE		0x9c00
#define INTEL_PCH_LPT_LP_DEVICE_ID_TYPE		0x9c00


#define INTEL_PCH_TYPE(dev) (((struct drm_i915_private *)(dev)->dev_private)->pch_type)
#define INTEL_PCH_TYPE(dev) (to_i915(dev)->pch_type)
#define HAS_PCH_LPT(dev) (INTEL_PCH_TYPE(dev) == PCH_LPT)
#define HAS_PCH_LPT(dev) (INTEL_PCH_TYPE(dev) == PCH_LPT)
#define HAS_PCH_CPT(dev) (INTEL_PCH_TYPE(dev) == PCH_CPT)
#define HAS_PCH_CPT(dev) (INTEL_PCH_TYPE(dev) == PCH_CPT)
#define HAS_PCH_IBX(dev) (INTEL_PCH_TYPE(dev) == PCH_IBX)
#define HAS_PCH_IBX(dev) (INTEL_PCH_TYPE(dev) == PCH_IBX)
@@ -1668,7 +1665,6 @@ extern void intel_console_resume(struct work_struct *work);


/* i915_irq.c */
/* i915_irq.c */
void i915_queue_hangcheck(struct drm_device *dev);
void i915_queue_hangcheck(struct drm_device *dev);
void i915_hangcheck_elapsed(unsigned long data);
void i915_handle_error(struct drm_device *dev, bool wedged);
void i915_handle_error(struct drm_device *dev, bool wedged);


extern void intel_irq_init(struct drm_device *dev);
extern void intel_irq_init(struct drm_device *dev);
@@ -1678,7 +1674,6 @@ extern void intel_pm_init(struct drm_device *dev);
extern void intel_uncore_sanitize(struct drm_device *dev);
extern void intel_uncore_sanitize(struct drm_device *dev);
extern void intel_uncore_early_sanitize(struct drm_device *dev);
extern void intel_uncore_early_sanitize(struct drm_device *dev);
extern void intel_uncore_init(struct drm_device *dev);
extern void intel_uncore_init(struct drm_device *dev);
extern void intel_uncore_reset(struct drm_device *dev);
extern void intel_uncore_clear_errors(struct drm_device *dev);
extern void intel_uncore_clear_errors(struct drm_device *dev);
extern void intel_uncore_check_errors(struct drm_device *dev);
extern void intel_uncore_check_errors(struct drm_device *dev);


@@ -1749,11 +1744,13 @@ struct i915_vma *i915_gem_vma_create(struct drm_i915_gem_object *obj,
void i915_gem_vma_destroy(struct i915_vma *vma);
void i915_gem_vma_destroy(struct i915_vma *vma);


int __must_check i915_gem_object_pin(struct drm_i915_gem_object *obj,
int __must_check i915_gem_object_pin(struct drm_i915_gem_object *obj,
				     struct i915_address_space *vm,
				     uint32_t alignment,
				     uint32_t alignment,
				     bool map_and_fenceable,
				     bool map_and_fenceable,
				     bool nonblocking);
				     bool nonblocking);
void i915_gem_object_unpin(struct drm_i915_gem_object *obj);
void i915_gem_object_unpin(struct drm_i915_gem_object *obj);
int __must_check i915_gem_object_unbind(struct drm_i915_gem_object *obj);
int __must_check i915_vma_unbind(struct i915_vma *vma);
int __must_check i915_gem_object_ggtt_unbind(struct drm_i915_gem_object *obj);
int i915_gem_object_put_pages(struct drm_i915_gem_object *obj);
int i915_gem_object_put_pages(struct drm_i915_gem_object *obj);
void i915_gem_release_mmap(struct drm_i915_gem_object *obj);
void i915_gem_release_mmap(struct drm_i915_gem_object *obj);
void i915_gem_lastclose(struct drm_device *dev);
void i915_gem_lastclose(struct drm_device *dev);
@@ -1842,9 +1839,6 @@ static inline bool i915_terminally_wedged(struct i915_gpu_error *error)


void i915_gem_reset(struct drm_device *dev);
void i915_gem_reset(struct drm_device *dev);
void i915_gem_clflush_object(struct drm_i915_gem_object *obj);
void i915_gem_clflush_object(struct drm_i915_gem_object *obj);
int __must_check i915_gem_object_set_domain(struct drm_i915_gem_object *obj,
					    uint32_t read_domains,
					    uint32_t write_domain);
int __must_check i915_gem_object_finish_gpu(struct drm_i915_gem_object *obj);
int __must_check i915_gem_object_finish_gpu(struct drm_i915_gem_object *obj);
int __must_check i915_gem_init(struct drm_device *dev);
int __must_check i915_gem_init(struct drm_device *dev);
int __must_check i915_gem_init_hw(struct drm_device *dev);
int __must_check i915_gem_init_hw(struct drm_device *dev);
@@ -1897,6 +1891,53 @@ struct dma_buf *i915_gem_prime_export(struct drm_device *dev,


void i915_gem_restore_fences(struct drm_device *dev);
void i915_gem_restore_fences(struct drm_device *dev);


unsigned long i915_gem_obj_offset(struct drm_i915_gem_object *o,
				  struct i915_address_space *vm);
bool i915_gem_obj_bound_any(struct drm_i915_gem_object *o);
bool i915_gem_obj_bound(struct drm_i915_gem_object *o,
			struct i915_address_space *vm);
unsigned long i915_gem_obj_size(struct drm_i915_gem_object *o,
				struct i915_address_space *vm);
struct i915_vma *i915_gem_obj_to_vma(struct drm_i915_gem_object *obj,
				     struct i915_address_space *vm);
/* Some GGTT VM helpers */
#define obj_to_ggtt(obj) \
	(&((struct drm_i915_private *)(obj)->base.dev->dev_private)->gtt.base)
static inline bool i915_is_ggtt(struct i915_address_space *vm)
{
	struct i915_address_space *ggtt =
		&((struct drm_i915_private *)(vm)->dev->dev_private)->gtt.base;
	return vm == ggtt;
}

static inline bool i915_gem_obj_ggtt_bound(struct drm_i915_gem_object *obj)
{
	return i915_gem_obj_bound(obj, obj_to_ggtt(obj));
}

static inline unsigned long
i915_gem_obj_ggtt_offset(struct drm_i915_gem_object *obj)
{
	return i915_gem_obj_offset(obj, obj_to_ggtt(obj));
}

static inline unsigned long
i915_gem_obj_ggtt_size(struct drm_i915_gem_object *obj)
{
	return i915_gem_obj_size(obj, obj_to_ggtt(obj));
}

static inline int __must_check
i915_gem_obj_ggtt_pin(struct drm_i915_gem_object *obj,
		      uint32_t alignment,
		      bool map_and_fenceable,
		      bool nonblocking)
{
	return i915_gem_object_pin(obj, obj_to_ggtt(obj), alignment,
				   map_and_fenceable, nonblocking);
}
#undef obj_to_ggtt

/* i915_gem_context.c */
/* i915_gem_context.c */
void i915_gem_context_init(struct drm_device *dev);
void i915_gem_context_init(struct drm_device *dev);
void i915_gem_context_fini(struct drm_device *dev);
void i915_gem_context_fini(struct drm_device *dev);
@@ -1949,7 +1990,9 @@ static inline void i915_gem_chipset_flush(struct drm_device *dev)




/* i915_gem_evict.c */
/* i915_gem_evict.c */
int __must_check i915_gem_evict_something(struct drm_device *dev, int min_size,
int __must_check i915_gem_evict_something(struct drm_device *dev,
					  struct i915_address_space *vm,
					  int min_size,
					  unsigned alignment,
					  unsigned alignment,
					  unsigned cache_level,
					  unsigned cache_level,
					  bool mappable,
					  bool mappable,
@@ -1971,7 +2014,7 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_device *dev,
void i915_gem_object_release_stolen(struct drm_i915_gem_object *obj);
void i915_gem_object_release_stolen(struct drm_i915_gem_object *obj);


/* i915_gem_tiling.c */
/* i915_gem_tiling.c */
inline static bool i915_gem_object_needs_bit17_swizzle(struct drm_i915_gem_object *obj)
static inline bool i915_gem_object_needs_bit17_swizzle(struct drm_i915_gem_object *obj)
{
{
	drm_i915_private_t *dev_priv = obj->base.dev->dev_private;
	drm_i915_private_t *dev_priv = obj->base.dev->dev_private;


@@ -1984,17 +2027,11 @@ void i915_gem_object_do_bit_17_swizzle(struct drm_i915_gem_object *obj);
void i915_gem_object_save_bit_17_swizzle(struct drm_i915_gem_object *obj);
void i915_gem_object_save_bit_17_swizzle(struct drm_i915_gem_object *obj);


/* i915_gem_debug.c */
/* i915_gem_debug.c */
void i915_gem_dump_object(struct drm_i915_gem_object *obj, int len,
			  const char *where, uint32_t mark);
#if WATCH_LISTS
#if WATCH_LISTS
int i915_verify_lists(struct drm_device *dev);
int i915_verify_lists(struct drm_device *dev);
#else
#else
#define i915_verify_lists(dev) 0
#define i915_verify_lists(dev) 0
#endif
#endif
void i915_gem_object_check_coherency(struct drm_i915_gem_object *obj,
				     int handle);
void i915_gem_dump_object(struct drm_i915_gem_object *obj, int len,
			  const char *where, uint32_t mark);


/* i915_debugfs.c */
/* i915_debugfs.c */
int i915_debugfs_init(struct drm_minor *minor);
int i915_debugfs_init(struct drm_minor *minor);
+253 −101

File changed.

Preview size limit exceeded, changes collapsed.

Loading