]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - drivers/gpu/drm/i915/i915_gem_stolen.c
drm/i915: Assorted dev_priv cleanups
[mirror_ubuntu-bionic-kernel.git] / drivers / gpu / drm / i915 / i915_gem_stolen.c
index 59989e8ee5dc8b1834eee109e72eb02961e3934d..54085df1f2272c49a7ef2010012128eac2f311a9 100644 (file)
@@ -109,13 +109,13 @@ static unsigned long i915_stolen_to_physical(struct drm_device *dev)
         *
         */
        base = 0;
-       if (INTEL_INFO(dev)->gen >= 3) {
+       if (INTEL_GEN(dev_priv) >= 3) {
                u32 bsm;
 
                pci_read_config_dword(pdev, INTEL_BSM, &bsm);
 
                base = bsm & INTEL_BSM_MASK;
-       } else if (IS_I865G(dev)) {
+       } else if (IS_I865G(dev_priv)) {
                u32 tseg_size = 0;
                u16 toud = 0;
                u8 tmp;
@@ -138,7 +138,7 @@ static unsigned long i915_stolen_to_physical(struct drm_device *dev)
                                         I865_TOUD, &toud);
 
                base = (toud << 16) + tseg_size;
-       } else if (IS_I85X(dev)) {
+       } else if (IS_I85X(dev_priv)) {
                u32 tseg_size = 0;
                u32 tom;
                u8 tmp;
@@ -154,7 +154,7 @@ static unsigned long i915_stolen_to_physical(struct drm_device *dev)
                tom = tmp * MB(32);
 
                base = tom - tseg_size - ggtt->stolen_size;
-       } else if (IS_845G(dev)) {
+       } else if (IS_845G(dev_priv)) {
                u32 tseg_size = 0;
                u32 tom;
                u8 tmp;
@@ -178,7 +178,7 @@ static unsigned long i915_stolen_to_physical(struct drm_device *dev)
                tom = tmp * MB(32);
 
                base = tom - tseg_size - ggtt->stolen_size;
-       } else if (IS_I830(dev)) {
+       } else if (IS_I830(dev_priv)) {
                u32 tseg_size = 0;
                u32 tom;
                u8 tmp;
@@ -204,7 +204,8 @@ static unsigned long i915_stolen_to_physical(struct drm_device *dev)
                return 0;
 
        /* make sure we don't clobber the GTT if it's within stolen memory */
-       if (INTEL_INFO(dev)->gen <= 4 && !IS_G33(dev) && !IS_G4X(dev)) {
+       if (INTEL_GEN(dev_priv) <= 4 && !IS_G33(dev_priv) &&
+           !IS_G4X(dev_priv)) {
                struct {
                        u32 start, end;
                } stolen[2] = {
@@ -214,7 +215,7 @@ static unsigned long i915_stolen_to_physical(struct drm_device *dev)
                u64 ggtt_start, ggtt_end;
 
                ggtt_start = I915_READ(PGTBL_CTL);
-               if (IS_GEN4(dev))
+               if (IS_GEN4(dev_priv))
                        ggtt_start = (ggtt_start & PGTBL_ADDRESS_LO_MASK) |
                                     (ggtt_start & PGTBL_ADDRESS_HI_MASK) << 28;
                else
@@ -270,7 +271,7 @@ static unsigned long i915_stolen_to_physical(struct drm_device *dev)
                 * GEN3 firmware likes to smash pci bridges into the stolen
                 * range. Apparently this works.
                 */
-               if (r == NULL && !IS_GEN3(dev)) {
+               if (r == NULL && !IS_GEN3(dev_priv)) {
                        DRM_ERROR("conflict detected with stolen region: [0x%08x - 0x%08x]\n",
                                  base, base + (uint32_t)ggtt->stolen_size);
                        base = 0;
@@ -437,7 +438,7 @@ int i915_gem_init_stolen(struct drm_device *dev)
        case 3:
                break;
        case 4:
-               if (IS_G4X(dev))
+               if (IS_G4X(dev_priv))
                        g4x_get_stolen_reserved(dev_priv, &reserved_base,
                                                &reserved_size);
                break;
@@ -456,7 +457,7 @@ int i915_gem_init_stolen(struct drm_device *dev)
                break;
        default:
                if (IS_BROADWELL(dev_priv) ||
-                   IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev))
+                   IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv))
                        bdw_get_stolen_reserved(dev_priv, &reserved_base,
                                                &reserved_size);
                else
@@ -545,25 +546,29 @@ i915_pages_create_for_stolen(struct drm_device *dev,
        return st;
 }
 
-static int i915_gem_object_get_pages_stolen(struct drm_i915_gem_object *obj)
+static struct sg_table *
+i915_gem_object_get_pages_stolen(struct drm_i915_gem_object *obj)
 {
-       BUG();
-       return -EINVAL;
+       return i915_pages_create_for_stolen(obj->base.dev,
+                                           obj->stolen->start,
+                                           obj->stolen->size);
 }
 
-static void i915_gem_object_put_pages_stolen(struct drm_i915_gem_object *obj)
+static void i915_gem_object_put_pages_stolen(struct drm_i915_gem_object *obj,
+                                            struct sg_table *pages)
 {
        /* Should only be called during free */
-       sg_free_table(obj->pages);
-       kfree(obj->pages);
+       sg_free_table(pages);
+       kfree(pages);
 }
 
-
 static void
 i915_gem_object_release_stolen(struct drm_i915_gem_object *obj)
 {
        struct drm_i915_private *dev_priv = to_i915(obj->base.dev);
 
+       __i915_gem_object_unpin_pages(obj);
+
        if (obj->stolen) {
                i915_gem_stolen_remove_node(dev_priv, obj->stolen);
                kfree(obj->stolen);
@@ -589,19 +594,13 @@ _i915_gem_object_create_stolen(struct drm_device *dev,
        drm_gem_private_object_init(dev, &obj->base, stolen->size);
        i915_gem_object_init(obj, &i915_gem_object_stolen_ops);
 
-       obj->pages = i915_pages_create_for_stolen(dev,
-                                                 stolen->start, stolen->size);
-       if (obj->pages == NULL)
-               goto cleanup;
-
-       obj->get_page.sg = obj->pages->sgl;
-       obj->get_page.last = 0;
-
-       i915_gem_object_pin_pages(obj);
        obj->stolen = stolen;
-
        obj->base.read_domains = I915_GEM_DOMAIN_CPU | I915_GEM_DOMAIN_GTT;
-       obj->cache_level = HAS_LLC(dev) ? I915_CACHE_LLC : I915_CACHE_NONE;
+       obj->cache_level = HAS_LLC(to_i915(dev)) ?
+                          I915_CACHE_LLC : I915_CACHE_NONE;
+
+       if (i915_gem_object_pin_pages(obj))
+               goto cleanup;
 
        return obj;
 
@@ -697,10 +696,14 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_device *dev,
        if (gtt_offset == I915_GTT_OFFSET_NONE)
                return obj;
 
+       ret = i915_gem_object_pin_pages(obj);
+       if (ret)
+               goto err;
+
        vma = i915_gem_obj_lookup_or_create_vma(obj, &ggtt->base, NULL);
        if (IS_ERR(vma)) {
                ret = PTR_ERR(vma);
-               goto err;
+               goto err_pages;
        }
 
        /* To simplify the initialisation sequence between KMS and GTT,
@@ -714,20 +717,20 @@ i915_gem_object_create_stolen_for_preallocated(struct drm_device *dev,
        ret = drm_mm_reserve_node(&ggtt->base.mm, &vma->node);
        if (ret) {
                DRM_DEBUG_KMS("failed to allocate stolen GTT space\n");
-               goto err;
+               goto err_pages;
        }
 
-       vma->pages = obj->pages;
+       vma->pages = obj->mm.pages;
        vma->flags |= I915_VMA_GLOBAL_BIND;
        __i915_vma_set_map_and_fenceable(vma);
        list_move_tail(&vma->vm_link, &ggtt->base.inactive_list);
+       list_move_tail(&obj->global_link, &dev_priv->mm.bound_list);
        obj->bind_count++;
 
-       list_add_tail(&obj->global_list, &dev_priv->mm.bound_list);
-       i915_gem_object_pin_pages(obj);
-
        return obj;
 
+err_pages:
+       i915_gem_object_unpin_pages(obj);
 err:
        i915_gem_object_put(obj);
        return NULL;