drm/i915: Create a gtt structure
authorBen Widawsky <ben@bwidawsk.net>
Thu, 17 Jan 2013 20:45:15 +0000 (12:45 -0800)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Thu, 17 Jan 2013 21:33:56 +0000 (22:33 +0100)
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. As far as what else I feel belongs in this
structure: it is meant to encapsulate the GTT's physical properties.
This is why I've not added fields which track various drm_mm properties,
or things like gtt_mtrr (which is itself a pretty transient field).

Reviewed-by: Rodrigo Vivi <rodrigo.vivi@gmail.com>
[Ben modified commit messages]
Signed-off-by: Ben Widawsky <ben@bwidawsk.net>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
12 files changed:
drivers/gpu/drm/i915/i915_debugfs.c
drivers/gpu/drm/i915/i915_dma.c
drivers/gpu/drm/i915/i915_drv.h
drivers/gpu/drm/i915/i915_gem.c
drivers/gpu/drm/i915/i915_gem_evict.c
drivers/gpu/drm/i915/i915_gem_execbuffer.c
drivers/gpu/drm/i915/i915_gem_gtt.c
drivers/gpu/drm/i915/i915_gem_tiling.c
drivers/gpu/drm/i915/i915_irq.c
drivers/gpu/drm/i915/intel_display.c
drivers/gpu/drm/i915/intel_fb.c
drivers/gpu/drm/i915/intel_overlay.c

index 35d326d70fabc4fb81e083328c6760380e917907..773b23ecc83b4b5a3c20b9db6e6e1f7c8586adc2 100644 (file)
@@ -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);
 
index 4421182938834fc2407daad0460e557f4a149dff..bb622135798a96e46753bdea8ec0e9a693a803d3 100644 (file)
@@ -1076,7 +1076,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;
@@ -1543,17 +1543,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
@@ -1658,11 +1658,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:
@@ -1696,10 +1696,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;
        }
index 6e2c10b65c8d2b8c936e4d9308b7e5f703ae110b..f3f2e5e1393fbac1219bb8f9321428f6ddb1e0a8 100644 (file)
@@ -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 {
@@ -781,6 +800,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;
@@ -799,15 +820,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 */
@@ -885,7 +899,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;
index a2bb1891432958bed7b63d5bf36270771f528261..51fdf16181a749ec6ae95ac7cac2052814d51cbe 100644 (file)
@@ -186,7 +186,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 +637,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 +1362,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 */
@@ -1544,7 +1544,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;
        }
@@ -2910,7 +2910,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;
        }
@@ -2931,7 +2931,7 @@ i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj,
        if (map_and_fenceable)
                ret = drm_mm_insert_node_in_range_generic(&dev_priv->mm.gtt_space, node,
                                                          size, alignment, obj->cache_level,
-                                                         0, dev_priv->mm.gtt_mappable_end);
+                                                         0, dev_priv->gtt.mappable_end);
        else
                ret = drm_mm_insert_node_generic(&dev_priv->mm.gtt_space, node,
                                                 size, alignment, obj->cache_level);
@@ -2971,7 +2971,7 @@ i915_gem_object_bind_to_gtt(struct drm_i915_gem_object *obj,
                (node->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;
 
index 776a3225184ce48db7b00f89b8522b956bfd3bef..c86d5d9356fd086b756b9dc207b6d7c9e824f630 100644 (file)
@@ -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);
index f5a11ecf5494f8b44dc6aacf0c5058181921b34d..27269103b621110420ddb907c0bb87dace13321a 100644 (file)
@@ -281,7 +281,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));
index 8c42ddd467b6d68710d9624df8ed5cbd95d7cd9d..61bfb12e1016bfcbb4d2727a13761d2394533875 100644 (file)
@@ -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,
@@ -752,9 +752,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;
@@ -778,7 +778,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();
index e76f0d8470a1b0c0f90698d1da97016142deed4d..abcba2f5a788b4ad3727309de95548851513120a 100644 (file)
@@ -357,7 +357,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 */
index 2028131284415462f3f681eb8b9b4050ecff0a5d..cc49a6ddc052981b34a1760d4960762ac2edea14 100644 (file)
@@ -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);
index 40b6b5e9d6efdfe83f9cf36b657c5b699abdd30b..e4c5067a54d3cc185c403d24bb33af9569af1dbf 100644 (file)
@@ -8687,7 +8687,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" : "");
index 71d55801c0d97a4569afab58054882819336fef0..ce02af8ca96e4b550ab5737ba4e867d99e0279cc 100644 (file)
@@ -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;
index fabe0acf808d9be30e4d74d64201678aa28701d2..ba978bf93a2ed8abf096a40aeb5347cbbed52f04 100644 (file)
@@ -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;