[Intel-gfx] [PATCH 04/13] drm/i915: Create a gtt structure
Rodrigo Vivi
rodrigo.vivi at gmail.com
Wed Jan 16 21:44:00 CET 2013
why not put gtt_mtrr to new gtt struct?
anyways, feel free to use Reviewed-by: Rodrigo Vivi <rodrigo.vivi at gmail.com>
On Tue, Jan 15, 2013 at 7:26 PM, Ben Widawsky <ben at bwidawsk.net> wrote:
> The purpose of the gtt structure is to help isolate our gtt specific
> properties from the rest of the code (in doing so it help us finish the
> isolation from the AGP connection).
>
> The following members are pulled out (and renamed):
> gtt_start
> gtt_total
> gtt_mappable_end
> gtt_mappable
> gtt_base_addr
> gsm
>
> The gtt structure will serve as a nice place to put gen specific gtt
> routines in upcoming patches.
>
> Signed-off-by: Ben Widawsky <ben at bwidawsk.net>
> ---
> drivers/gpu/drm/i915/i915_debugfs.c | 4 ++--
> drivers/gpu/drm/i915/i915_dma.c | 20 ++++++++++----------
> drivers/gpu/drm/i915/i915_drv.h | 29 +++++++++++++++++++++--------
> drivers/gpu/drm/i915/i915_gem.c | 17 +++++++++--------
> drivers/gpu/drm/i915/i915_gem_evict.c | 2 +-
> drivers/gpu/drm/i915/i915_gem_execbuffer.c | 2 +-
> drivers/gpu/drm/i915/i915_gem_gtt.c | 24 ++++++++++++------------
> drivers/gpu/drm/i915/i915_gem_tiling.c | 2 +-
> drivers/gpu/drm/i915/i915_irq.c | 4 ++--
> drivers/gpu/drm/i915/intel_display.c | 2 +-
> drivers/gpu/drm/i915/intel_fb.c | 2 +-
> drivers/gpu/drm/i915/intel_overlay.c | 4 ++--
> 12 files changed, 63 insertions(+), 49 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_debugfs.c b/drivers/gpu/drm/i915/i915_debugfs.c
> index 2f14b6d..7123af4 100644
> --- a/drivers/gpu/drm/i915/i915_debugfs.c
> +++ b/drivers/gpu/drm/i915/i915_debugfs.c
> @@ -259,8 +259,8 @@ static int i915_gem_object_info(struct seq_file *m, void* data)
> count, size);
>
> seq_printf(m, "%zu [%zu] gtt total\n",
> - dev_priv->mm.gtt_total,
> - dev_priv->mm.gtt_mappable_end - dev_priv->mm.gtt_start);
> + dev_priv->gtt.total,
> + dev_priv->gtt.mappable_end - dev_priv->gtt.start);
>
> mutex_unlock(&dev->struct_mutex);
>
> diff --git a/drivers/gpu/drm/i915/i915_dma.c b/drivers/gpu/drm/i915/i915_dma.c
> index 272e500..bb4382f 100644
> --- a/drivers/gpu/drm/i915/i915_dma.c
> +++ b/drivers/gpu/drm/i915/i915_dma.c
> @@ -1067,7 +1067,7 @@ static int i915_set_status_page(struct drm_device *dev, void *data,
> ring->status_page.gfx_addr = hws->addr & (0x1ffff<<12);
>
> dev_priv->dri1.gfx_hws_cpu_addr =
> - ioremap_wc(dev_priv->mm.gtt_base_addr + hws->addr, 4096);
> + ioremap_wc(dev_priv->gtt.mappable_base + hws->addr, 4096);
> if (dev_priv->dri1.gfx_hws_cpu_addr == NULL) {
> i915_dma_cleanup(dev);
> ring->status_page.gfx_addr = 0;
> @@ -1534,17 +1534,17 @@ int i915_driver_load(struct drm_device *dev, unsigned long flags)
> }
>
> aperture_size = dev_priv->mm.gtt->gtt_mappable_entries << PAGE_SHIFT;
> - dev_priv->mm.gtt_base_addr = dev_priv->mm.gtt->gma_bus_addr;
> + dev_priv->gtt.mappable_base = dev_priv->mm.gtt->gma_bus_addr;
>
> - dev_priv->mm.gtt_mapping =
> - io_mapping_create_wc(dev_priv->mm.gtt_base_addr,
> + dev_priv->gtt.mappable =
> + io_mapping_create_wc(dev_priv->gtt.mappable_base,
> aperture_size);
> - if (dev_priv->mm.gtt_mapping == NULL) {
> + if (dev_priv->gtt.mappable == NULL) {
> ret = -EIO;
> goto out_rmmap;
> }
>
> - i915_mtrr_setup(dev_priv, dev_priv->mm.gtt_base_addr,
> + i915_mtrr_setup(dev_priv, dev_priv->gtt.mappable_base,
> aperture_size);
>
> /* The i915 workqueue is primarily used for batched retirement of
> @@ -1649,11 +1649,11 @@ out_gem_unload:
> out_mtrrfree:
> if (dev_priv->mm.gtt_mtrr >= 0) {
> mtrr_del(dev_priv->mm.gtt_mtrr,
> - dev_priv->mm.gtt_base_addr,
> + dev_priv->gtt.mappable_base,
> aperture_size);
> dev_priv->mm.gtt_mtrr = -1;
> }
> - io_mapping_free(dev_priv->mm.gtt_mapping);
> + io_mapping_free(dev_priv->gtt.mappable);
> out_rmmap:
> pci_iounmap(dev->pdev, dev_priv->regs);
> put_gmch:
> @@ -1687,10 +1687,10 @@ int i915_driver_unload(struct drm_device *dev)
> /* Cancel the retire work handler, which should be idle now. */
> cancel_delayed_work_sync(&dev_priv->mm.retire_work);
>
> - io_mapping_free(dev_priv->mm.gtt_mapping);
> + io_mapping_free(dev_priv->gtt.mappable);
> if (dev_priv->mm.gtt_mtrr >= 0) {
> mtrr_del(dev_priv->mm.gtt_mtrr,
> - dev_priv->mm.gtt_base_addr,
> + dev_priv->gtt.mappable_base,
> dev_priv->mm.gtt->gtt_mappable_entries * PAGE_SIZE);
> dev_priv->mm.gtt_mtrr = -1;
> }
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index 5985ed0..51766d2 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -364,6 +364,25 @@ struct intel_device_info {
> u8 has_llc:1;
> };
>
> +/* The Graphics Translation Table is the way in which GEN hardware translates a
> + * Graphics Virtual Address into a Physical Address. In addition to the normal
> + * collateral associated with any va->pa translations GEN hardware also has a
> + * portion of the GTT which can be mapped by the CPU and remain both coherent
> + * and correct (in cases like swizzling). That region is referred to as GMADR in
> + * the spec.
> + */
> +struct i915_gtt {
> + unsigned long start; /* Start offset of used GTT */
> + size_t total; /* Total size GTT can map */
> +
> + unsigned long mappable_end; /* End offset that we can CPU map */
> + struct io_mapping *mappable; /* Mapping to our CPU mappable region */
> + phys_addr_t mappable_base; /* PA of our GMADR */
> +
> + /** "Graphics Stolen Memory" holds the global PTEs */
> + void __iomem *gsm;
> +};
> +
> #define I915_PPGTT_PD_ENTRIES 512
> #define I915_PPGTT_PT_ENTRIES 1024
> struct i915_hw_ppgtt {
> @@ -777,6 +796,8 @@ typedef struct drm_i915_private {
> /* Register state */
> bool modeset_on_lid;
>
> + struct i915_gtt gtt;
> +
> struct {
> /** Bridge to intel-gtt-ko */
> struct intel_gtt *gtt;
> @@ -795,15 +816,8 @@ typedef struct drm_i915_private {
> struct list_head unbound_list;
>
> /** Usable portion of the GTT for GEM */
> - unsigned long gtt_start;
> - unsigned long gtt_mappable_end;
> unsigned long stolen_base; /* limited to low memory (32-bit) */
>
> - /** "Graphics Stolen Memory" holds the global PTEs */
> - void __iomem *gsm;
> -
> - struct io_mapping *gtt_mapping;
> - phys_addr_t gtt_base_addr;
> int gtt_mtrr;
>
> /** PPGTT used for aliasing the PPGTT with the GTT */
> @@ -880,7 +894,6 @@ typedef struct drm_i915_private {
> struct drm_i915_gem_phys_object *phys_objs[I915_MAX_PHYS_OBJECT];
>
> /* accounting, useful for userland debugging */
> - size_t gtt_total;
> size_t object_memory;
> u32 object_count;
> } mm;
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index ad98db5..4ec66a9 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -149,6 +149,7 @@ int
> i915_gem_init_ioctl(struct drm_device *dev, void *data,
> struct drm_file *file)
> {
> + struct drm_i915_private *dev_priv = dev->dev_private;
> struct drm_i915_gem_init *args = data;
>
> if (drm_core_check_feature(dev, DRIVER_MODESET))
> @@ -186,7 +187,7 @@ i915_gem_get_aperture_ioctl(struct drm_device *dev, void *data,
> pinned += obj->gtt_space->size;
> mutex_unlock(&dev->struct_mutex);
>
> - args->aper_size = dev_priv->mm.gtt_total;
> + args->aper_size = dev_priv->gtt.total;
> args->aper_available_size = args->aper_size - pinned;
>
> return 0;
> @@ -637,7 +638,7 @@ i915_gem_gtt_pwrite_fast(struct drm_device *dev,
> * source page isn't available. Return the error and we'll
> * retry in the slow path.
> */
> - if (fast_user_write(dev_priv->mm.gtt_mapping, page_base,
> + if (fast_user_write(dev_priv->gtt.mappable, page_base,
> page_offset, user_data, page_length)) {
> ret = -EFAULT;
> goto out_unpin;
> @@ -1362,7 +1363,7 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
>
> obj->fault_mappable = true;
>
> - pfn = ((dev_priv->mm.gtt_base_addr + obj->gtt_offset) >> PAGE_SHIFT) +
> + pfn = ((dev_priv->gtt.mappable_base + obj->gtt_offset) >> PAGE_SHIFT) +
> page_offset;
>
> /* Finally, remap it using the new GTT offset */
> @@ -1568,7 +1569,7 @@ i915_gem_mmap_gtt(struct drm_file *file,
> goto unlock;
> }
>
> - if (obj->base.size > dev_priv->mm.gtt_mappable_end) {
> + if (obj->base.size > dev_priv->gtt.mappable_end) {
> ret = -E2BIG;
> goto out;
> }
> @@ -2944,7 +2945,7 @@ i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj,
> * before evicting everything in a vain attempt to find space.
> */
> if (obj->base.size >
> - (map_and_fenceable ? dev_priv->mm.gtt_mappable_end : dev_priv->mm.gtt_total)) {
> + (map_and_fenceable ? dev_priv->gtt.mappable_end : dev_priv->gtt.total)) {
> DRM_ERROR("Attempting to bind an object larger than the aperture\n");
> return -E2BIG;
> }
> @@ -2959,7 +2960,7 @@ i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj,
> if (map_and_fenceable)
> free_space = drm_mm_search_free_in_range_color(&dev_priv->mm.gtt_space,
> size, alignment, obj->cache_level,
> - 0, dev_priv->mm.gtt_mappable_end,
> + 0, dev_priv->gtt.mappable_end,
> false);
> else
> free_space = drm_mm_search_free_color(&dev_priv->mm.gtt_space,
> @@ -2971,7 +2972,7 @@ i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj,
> free_space =
> drm_mm_get_block_range_generic(free_space,
> size, alignment, obj->cache_level,
> - 0, dev_priv->mm.gtt_mappable_end,
> + 0, dev_priv->gtt.mappable_end,
> false);
> else
> free_space =
> @@ -3017,7 +3018,7 @@ i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj,
> (free_space->start & (fence_alignment - 1)) == 0;
>
> mappable =
> - obj->gtt_offset + obj->base.size <= dev_priv->mm.gtt_mappable_end;
> + obj->gtt_offset + obj->base.size <= dev_priv->gtt.mappable_end;
>
> obj->map_and_fenceable = mappable && fenceable;
>
> diff --git a/drivers/gpu/drm/i915/i915_gem_evict.c b/drivers/gpu/drm/i915/i915_gem_evict.c
> index 776a322..c86d5d9 100644
> --- a/drivers/gpu/drm/i915/i915_gem_evict.c
> +++ b/drivers/gpu/drm/i915/i915_gem_evict.c
> @@ -80,7 +80,7 @@ i915_gem_evict_something(struct drm_device *dev, int min_size,
> if (mappable)
> drm_mm_init_scan_with_range(&dev_priv->mm.gtt_space,
> min_size, alignment, cache_level,
> - 0, dev_priv->mm.gtt_mappable_end);
> + 0, dev_priv->gtt.mappable_end);
> else
> drm_mm_init_scan(&dev_priv->mm.gtt_space,
> min_size, alignment, cache_level);
> diff --git a/drivers/gpu/drm/i915/i915_gem_execbuffer.c b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> index 6cd3e1c..0924be9 100644
> --- a/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> +++ b/drivers/gpu/drm/i915/i915_gem_execbuffer.c
> @@ -209,7 +209,7 @@ i915_gem_execbuffer_relocate_entry(struct drm_i915_gem_object *obj,
>
> /* Map the page containing the relocation we're going to perform. */
> reloc->offset += obj->gtt_offset;
> - reloc_page = io_mapping_map_atomic_wc(dev_priv->mm.gtt_mapping,
> + reloc_page = io_mapping_map_atomic_wc(dev_priv->gtt.mappable,
> reloc->offset & PAGE_MASK);
> reloc_entry = (uint32_t __iomem *)
> (reloc_page + (reloc->offset & ~PAGE_MASK));
> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
> index f79081e..e044f58 100644
> --- a/drivers/gpu/drm/i915/i915_gem_gtt.c
> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
> @@ -290,7 +290,7 @@ void i915_gem_init_ppgtt(struct drm_device *dev)
> return;
>
>
> - pd_addr = (gtt_pte_t __iomem*)dev_priv->mm.gsm + ppgtt->pd_offset/sizeof(gtt_pte_t);
> + pd_addr = (gtt_pte_t __iomem*)dev_priv->gtt.gsm + ppgtt->pd_offset/sizeof(gtt_pte_t);
> for (i = 0; i < ppgtt->num_pd_entries; i++) {
> dma_addr_t pt_addr;
>
> @@ -367,7 +367,7 @@ static void i915_ggtt_clear_range(struct drm_device *dev,
> {
> struct drm_i915_private *dev_priv = dev->dev_private;
> gtt_pte_t scratch_pte;
> - gtt_pte_t __iomem *gtt_base = (gtt_pte_t __iomem *) dev_priv->mm.gsm + first_entry;
> + gtt_pte_t __iomem *gtt_base = (gtt_pte_t __iomem *) dev_priv->gtt.gsm + first_entry;
> const int max_entries = dev_priv->mm.gtt->gtt_total_entries - first_entry;
> int i;
>
> @@ -393,8 +393,8 @@ void i915_gem_restore_gtt_mappings(struct drm_device *dev)
> struct drm_i915_gem_object *obj;
>
> /* First fill our portion of the GTT with scratch pages */
> - i915_ggtt_clear_range(dev, dev_priv->mm.gtt_start / PAGE_SIZE,
> - dev_priv->mm.gtt_total / PAGE_SIZE);
> + i915_ggtt_clear_range(dev, dev_priv->gtt.start / PAGE_SIZE,
> + dev_priv->gtt.total / PAGE_SIZE);
>
> list_for_each_entry(obj, &dev_priv->mm.bound_list, gtt_list) {
> i915_gem_clflush_object(obj);
> @@ -433,7 +433,7 @@ static void gen6_ggtt_bind_object(struct drm_i915_gem_object *obj,
> const int first_entry = obj->gtt_space->start >> PAGE_SHIFT;
> const int max_entries = dev_priv->mm.gtt->gtt_total_entries - first_entry;
> gtt_pte_t __iomem *gtt_entries =
> - (gtt_pte_t __iomem *)dev_priv->mm.gsm + first_entry;
> + (gtt_pte_t __iomem *)dev_priv->gtt.gsm + first_entry;
> int unused, i = 0;
> unsigned int len, m = 0;
> dma_addr_t addr;
> @@ -556,9 +556,9 @@ void i915_gem_setup_global_gtt(struct drm_device *dev,
> obj->has_global_gtt_mapping = 1;
> }
>
> - dev_priv->mm.gtt_start = start;
> - dev_priv->mm.gtt_mappable_end = mappable_end;
> - dev_priv->mm.gtt_total = end - start;
> + dev_priv->gtt.start = start;
> + dev_priv->gtt.mappable_end = mappable_end;
> + dev_priv->gtt.total = end - start;
>
> /* Clear any non-preallocated blocks */
> drm_mm_for_each_hole(entry, &dev_priv->mm.gtt_space,
> @@ -748,9 +748,9 @@ int i915_gem_gtt_init(struct drm_device *dev)
> goto err_out;
> }
>
> - dev_priv->mm.gsm = ioremap_wc(gtt_bus_addr,
> - dev_priv->mm.gtt->gtt_total_entries * sizeof(gtt_pte_t));
> - if (!dev_priv->mm.gsm) {
> + dev_priv->gtt.gsm = ioremap_wc(gtt_bus_addr,
> + dev_priv->mm.gtt->gtt_total_entries * sizeof(gtt_pte_t));
> + if (!dev_priv->gtt.gsm) {
> DRM_ERROR("Failed to map the gtt page table\n");
> teardown_scratch_page(dev);
> ret = -ENOMEM;
> @@ -774,7 +774,7 @@ err_out:
> void i915_gem_gtt_fini(struct drm_device *dev)
> {
> struct drm_i915_private *dev_priv = dev->dev_private;
> - iounmap(dev_priv->mm.gsm);
> + iounmap(dev_priv->gtt.gsm);
> teardown_scratch_page(dev);
> if (INTEL_INFO(dev)->gen < 6)
> intel_gmch_remove();
> diff --git a/drivers/gpu/drm/i915/i915_gem_tiling.c b/drivers/gpu/drm/i915/i915_gem_tiling.c
> index 65f1d4f..eaaf2be 100644
> --- a/drivers/gpu/drm/i915/i915_gem_tiling.c
> +++ b/drivers/gpu/drm/i915/i915_gem_tiling.c
> @@ -368,7 +368,7 @@ i915_gem_set_tiling(struct drm_device *dev, void *data,
>
> obj->map_and_fenceable =
> obj->gtt_space == NULL ||
> - (obj->gtt_offset + obj->base.size <= dev_priv->mm.gtt_mappable_end &&
> + (obj->gtt_offset + obj->base.size <= dev_priv->gtt.mappable_end &&
> i915_gem_object_fence_ok(obj, args->tiling_mode));
>
> /* Rebind if we need a change of alignment */
> diff --git a/drivers/gpu/drm/i915/i915_irq.c b/drivers/gpu/drm/i915/i915_irq.c
> index 6ba0573..62aae5d 100644
> --- a/drivers/gpu/drm/i915/i915_irq.c
> +++ b/drivers/gpu/drm/i915/i915_irq.c
> @@ -939,7 +939,7 @@ i915_error_object_create(struct drm_i915_private *dev_priv,
> goto unwind;
>
> local_irq_save(flags);
> - if (reloc_offset < dev_priv->mm.gtt_mappable_end &&
> + if (reloc_offset < dev_priv->gtt.mappable_end &&
> src->has_global_gtt_mapping) {
> void __iomem *s;
>
> @@ -948,7 +948,7 @@ i915_error_object_create(struct drm_i915_private *dev_priv,
> * captures what the GPU read.
> */
>
> - s = io_mapping_map_atomic_wc(dev_priv->mm.gtt_mapping,
> + s = io_mapping_map_atomic_wc(dev_priv->gtt.mappable,
> reloc_offset);
> memcpy_fromio(d, s, PAGE_SIZE);
> io_mapping_unmap_atomic(s);
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index 162cb22..723161b 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -8506,7 +8506,7 @@ void intel_modeset_init(struct drm_device *dev)
> dev->mode_config.max_width = 8192;
> dev->mode_config.max_height = 8192;
> }
> - dev->mode_config.fb_base = dev_priv->mm.gtt_base_addr;
> + dev->mode_config.fb_base = dev_priv->gtt.mappable_base;
>
> DRM_DEBUG_KMS("%d display pipe%s available.\n",
> dev_priv->num_pipe, dev_priv->num_pipe > 1 ? "s" : "");
> diff --git a/drivers/gpu/drm/i915/intel_fb.c b/drivers/gpu/drm/i915/intel_fb.c
> index 71d5580..ce02af8 100644
> --- a/drivers/gpu/drm/i915/intel_fb.c
> +++ b/drivers/gpu/drm/i915/intel_fb.c
> @@ -142,7 +142,7 @@ static int intelfb_create(struct intel_fbdev *ifbdev,
> info->fix.smem_len = size;
>
> info->screen_base =
> - ioremap_wc(dev_priv->mm.gtt_base_addr + obj->gtt_offset,
> + ioremap_wc(dev_priv->gtt.mappable_base + obj->gtt_offset,
> size);
> if (!info->screen_base) {
> ret = -ENOSPC;
> diff --git a/drivers/gpu/drm/i915/intel_overlay.c b/drivers/gpu/drm/i915/intel_overlay.c
> index fabe0ac..ba978bf 100644
> --- a/drivers/gpu/drm/i915/intel_overlay.c
> +++ b/drivers/gpu/drm/i915/intel_overlay.c
> @@ -195,7 +195,7 @@ intel_overlay_map_regs(struct intel_overlay *overlay)
> if (OVERLAY_NEEDS_PHYSICAL(overlay->dev))
> regs = (struct overlay_registers __iomem *)overlay->reg_bo->phys_obj->handle->vaddr;
> else
> - regs = io_mapping_map_wc(dev_priv->mm.gtt_mapping,
> + regs = io_mapping_map_wc(dev_priv->gtt.mappable,
> overlay->reg_bo->gtt_offset);
>
> return regs;
> @@ -1434,7 +1434,7 @@ intel_overlay_map_regs_atomic(struct intel_overlay *overlay)
> regs = (struct overlay_registers __iomem *)
> overlay->reg_bo->phys_obj->handle->vaddr;
> else
> - regs = io_mapping_map_atomic_wc(dev_priv->mm.gtt_mapping,
> + regs = io_mapping_map_atomic_wc(dev_priv->gtt.mappable,
> overlay->reg_bo->gtt_offset);
>
> return regs;
> --
> 1.8.1
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
--
Rodrigo Vivi
Blog: http://blog.vivi.eng.br
More information about the Intel-gfx
mailing list