drm/gma500: Move GEM memory management functions to gem.c
authorThomas Zimmermann <tzimmermann@suse.de>
Tue, 8 Mar 2022 19:52:20 +0000 (20:52 +0100)
committerPatrik Jakobsson <patrik.r.jakobsson@gmail.com>
Wed, 16 Mar 2022 16:42:23 +0000 (17:42 +0100)
Move GEM functions from gtt.c to gem.c. Adapt some names. No
functional changes.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Acked-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220308195222.13471-11-tzimmermann@suse.de
drivers/gpu/drm/gma500/gem.c
drivers/gpu/drm/gma500/gem.h
drivers/gpu/drm/gma500/gtt.c
drivers/gpu/drm/gma500/gtt.h
drivers/gpu/drm/gma500/power.c
drivers/gpu/drm/gma500/psb_drv.c

index 2f44535..dffe374 100644 (file)
 #include "gem.h"
 #include "psb_drv.h"
 
+/*
+ * PSB GEM object
+ */
+
 int psb_gem_pin(struct psb_gem_object *pobj)
 {
        struct drm_gem_object *obj = &pobj->base;
@@ -296,3 +300,132 @@ fail:
 
        return ret;
 }
+
+/*
+ * Memory management
+ */
+
+/* Insert vram stolen pages into the GTT. */
+static void psb_gem_mm_populate_stolen(struct drm_psb_private *pdev)
+{
+       struct drm_device *dev = &pdev->dev;
+       unsigned int pfn_base;
+       unsigned int i, num_pages;
+       uint32_t pte;
+
+       pfn_base = pdev->stolen_base >> PAGE_SHIFT;
+       num_pages = pdev->vram_stolen_size >> PAGE_SHIFT;
+
+       drm_dbg(dev, "Set up %u stolen pages starting at 0x%08x, GTT offset %dK\n",
+               num_pages, pfn_base << PAGE_SHIFT, 0);
+
+       for (i = 0; i < num_pages; ++i) {
+               pte = psb_gtt_mask_pte(pfn_base + i, PSB_MMU_CACHED_MEMORY);
+               iowrite32(pte, pdev->gtt_map + i);
+       }
+
+       (void)ioread32(pdev->gtt_map + i - 1);
+}
+
+int psb_gem_mm_init(struct drm_device *dev)
+{
+       struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
+       struct pci_dev *pdev = to_pci_dev(dev->dev);
+       unsigned long stolen_size, vram_stolen_size;
+       struct psb_gtt *pg;
+       int ret;
+
+       mutex_init(&dev_priv->mmap_mutex);
+
+       pg = &dev_priv->gtt;
+
+       pci_read_config_dword(pdev, PSB_BSM, &dev_priv->stolen_base);
+       vram_stolen_size = pg->gtt_phys_start - dev_priv->stolen_base - PAGE_SIZE;
+
+       stolen_size = vram_stolen_size;
+
+       dev_dbg(dev->dev, "Stolen memory base 0x%x, size %luK\n",
+               dev_priv->stolen_base, vram_stolen_size / 1024);
+
+       pg->stolen_size = stolen_size;
+       dev_priv->vram_stolen_size = vram_stolen_size;
+
+       dev_priv->vram_addr = ioremap_wc(dev_priv->stolen_base, stolen_size);
+       if (!dev_priv->vram_addr) {
+               dev_err(dev->dev, "Failure to map stolen base.\n");
+               ret = -ENOMEM;
+               goto err_mutex_destroy;
+       }
+
+       psb_gem_mm_populate_stolen(dev_priv);
+
+       return 0;
+
+err_mutex_destroy:
+       mutex_destroy(&dev_priv->mmap_mutex);
+       return ret;
+}
+
+void psb_gem_mm_fini(struct drm_device *dev)
+{
+       struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
+
+       iounmap(dev_priv->vram_addr);
+
+       mutex_destroy(&dev_priv->mmap_mutex);
+}
+
+/* Re-insert all pinned GEM objects into GTT. */
+static void psb_gem_mm_populate_resources(struct drm_psb_private *pdev)
+{
+       unsigned int restored = 0, total = 0, size = 0;
+       struct resource *r = pdev->gtt_mem->child;
+       struct drm_device *dev = &pdev->dev;
+       struct psb_gem_object *pobj;
+
+       while (r) {
+               /*
+                * TODO: GTT restoration needs a refactoring, so that we don't have to touch
+                *       struct psb_gem_object here. The type represents a GEM object and is
+                *       not related to the GTT itself.
+                */
+               pobj = container_of(r, struct psb_gem_object, resource);
+               if (pobj->pages) {
+                       psb_gtt_insert_pages(pdev, &pobj->resource, pobj->pages);
+                       size += resource_size(&pobj->resource);
+                       ++restored;
+               }
+               r = r->sibling;
+               ++total;
+       }
+
+       drm_dbg(dev, "Restored %u of %u gtt ranges (%u KB)", restored, total, (size / 1024));
+}
+
+int psb_gem_mm_resume(struct drm_device *dev)
+{
+       struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
+       struct pci_dev *pdev = to_pci_dev(dev->dev);
+       unsigned long stolen_size, vram_stolen_size;
+       struct psb_gtt *pg;
+
+       pg = &dev_priv->gtt;
+
+       pci_read_config_dword(pdev, PSB_BSM, &dev_priv->stolen_base);
+       vram_stolen_size = pg->gtt_phys_start - dev_priv->stolen_base - PAGE_SIZE;
+
+       stolen_size = vram_stolen_size;
+
+       dev_dbg(dev->dev, "Stolen memory base 0x%x, size %luK\n", dev_priv->stolen_base,
+               vram_stolen_size / 1024);
+
+       if (stolen_size != pg->stolen_size) {
+               dev_err(dev->dev, "GTT resume error.\n");
+               return -EINVAL;
+       }
+
+       psb_gem_mm_populate_stolen(dev_priv);
+       psb_gem_mm_populate_resources(dev_priv);
+
+       return 0;
+}
index 96ef864..27df6ff 100644 (file)
 
 struct drm_device;
 
+/*
+ * PSB GEM object
+ */
+
 struct psb_gem_object {
        struct drm_gem_object base;
 
@@ -36,4 +40,12 @@ psb_gem_create(struct drm_device *dev, u64 size, const char *name, bool stolen,
 int psb_gem_pin(struct psb_gem_object *pobj);
 void psb_gem_unpin(struct psb_gem_object *pobj);
 
+/*
+ * Memory management
+ */
+
+int psb_gem_mm_init(struct drm_device *dev);
+void psb_gem_mm_fini(struct drm_device *dev);
+int psb_gem_mm_resume(struct drm_device *dev);
+
 #endif
index 9e1b19f..b03feec 100644 (file)
@@ -49,7 +49,7 @@ int psb_gtt_allocate_resource(struct drm_psb_private *pdev, struct resource *res
  *
  *     Set the GTT entry for the appropriate memory type.
  */
-static inline uint32_t psb_gtt_mask_pte(uint32_t pfn, int type)
+uint32_t psb_gtt_mask_pte(uint32_t pfn, int type)
 {
        uint32_t mask = PSB_PTE_VALID;
 
@@ -125,15 +125,6 @@ void psb_gtt_remove_pages(struct drm_psb_private *pdev, const struct resource *r
        mutex_unlock(&pdev->gtt_mutex);
 }
 
-void psb_gem_mm_fini(struct drm_device *dev)
-{
-       struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
-
-       iounmap(dev_priv->vram_addr);
-
-       mutex_destroy(&dev_priv->mmap_mutex);
-}
-
 void psb_gtt_fini(struct drm_device *dev)
 {
        struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
@@ -164,55 +155,6 @@ static void psb_gtt_clear(struct drm_psb_private *pdev)
        (void)ioread32(pdev->gtt_map + i - 1);
 }
 
-/* Insert vram stolen pages into the GTT. */
-static void psb_gtt_populate_stolen(struct drm_psb_private *pdev)
-{
-       struct drm_device *dev = &pdev->dev;
-       unsigned int pfn_base;
-       unsigned int i, num_pages;
-       uint32_t pte;
-
-       pfn_base = pdev->stolen_base >> PAGE_SHIFT;
-       num_pages = pdev->vram_stolen_size >> PAGE_SHIFT;
-
-       drm_dbg(dev, "Set up %u stolen pages starting at 0x%08x, GTT offset %dK\n",
-               num_pages, pfn_base << PAGE_SHIFT, 0);
-
-       for (i = 0; i < num_pages; ++i) {
-               pte = psb_gtt_mask_pte(pfn_base + i, PSB_MMU_CACHED_MEMORY);
-               iowrite32(pte, pdev->gtt_map + i);
-       }
-
-       (void)ioread32(pdev->gtt_map + i - 1);
-}
-
-/* Re-insert all pinned GEM objects into GTT. */
-static void psb_gtt_populate_resources(struct drm_psb_private *pdev)
-{
-       unsigned int restored = 0, total = 0, size = 0;
-       struct resource *r = pdev->gtt_mem->child;
-       struct drm_device *dev = &pdev->dev;
-       struct psb_gem_object *pobj;
-
-       while (r) {
-               /*
-                * TODO: GTT restoration needs a refactoring, so that we don't have to touch
-                *       struct psb_gem_object here. The type represents a GEM object and is
-                *       not related to the GTT itself.
-                */
-               pobj = container_of(r, struct psb_gem_object, resource);
-               if (pobj->pages) {
-                       psb_gtt_insert_pages(pdev, &pobj->resource, pobj->pages);
-                       size += resource_size(&pobj->resource);
-                       ++restored;
-               }
-               r = r->sibling;
-               ++total;
-       }
-
-       drm_dbg(dev, "Restored %u of %u gtt ranges (%u KB)", restored, total, (size / 1024));
-}
-
 int psb_gtt_init(struct drm_device *dev)
 {
        struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
@@ -300,45 +242,6 @@ err_gtt_disable:
        return ret;
 }
 
-int psb_gem_mm_init(struct drm_device *dev)
-{
-       struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
-       struct pci_dev *pdev = to_pci_dev(dev->dev);
-       unsigned long stolen_size, vram_stolen_size;
-       struct psb_gtt *pg;
-       int ret;
-
-       mutex_init(&dev_priv->mmap_mutex);
-
-       pg = &dev_priv->gtt;
-
-       pci_read_config_dword(pdev, PSB_BSM, &dev_priv->stolen_base);
-       vram_stolen_size = pg->gtt_phys_start - dev_priv->stolen_base - PAGE_SIZE;
-
-       stolen_size = vram_stolen_size;
-
-       dev_dbg(dev->dev, "Stolen memory base 0x%x, size %luK\n",
-               dev_priv->stolen_base, vram_stolen_size / 1024);
-
-       pg->stolen_size = stolen_size;
-       dev_priv->vram_stolen_size = vram_stolen_size;
-
-       dev_priv->vram_addr = ioremap_wc(dev_priv->stolen_base, stolen_size);
-       if (!dev_priv->vram_addr) {
-               dev_err(dev->dev, "Failure to map stolen base.\n");
-               ret = -ENOMEM;
-               goto err_mutex_destroy;
-       }
-
-       psb_gtt_populate_stolen(dev_priv);
-
-       return 0;
-
-err_mutex_destroy:
-       mutex_destroy(&dev_priv->mmap_mutex);
-       return ret;
-}
-
 int psb_gtt_resume(struct drm_device *dev)
 {
        struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
@@ -421,31 +324,3 @@ err_gtt_disable:
        (void)PSB_RVDC32(PSB_PGETBL_CTL);
        return ret;
 }
-
-int psb_gem_mm_resume(struct drm_device *dev)
-{
-       struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
-       struct pci_dev *pdev = to_pci_dev(dev->dev);
-       unsigned long stolen_size, vram_stolen_size;
-       struct psb_gtt *pg;
-
-       pg = &dev_priv->gtt;
-
-       pci_read_config_dword(pdev, PSB_BSM, &dev_priv->stolen_base);
-       vram_stolen_size = pg->gtt_phys_start - dev_priv->stolen_base - PAGE_SIZE;
-
-       stolen_size = vram_stolen_size;
-
-       dev_dbg(dev->dev, "Stolen memory base 0x%x, size %luK\n", dev_priv->stolen_base,
-               vram_stolen_size / 1024);
-
-       if (stolen_size != pg->stolen_size) {
-               dev_err(dev->dev, "GTT resume error.\n");
-               return -EINVAL;
-       }
-
-       psb_gtt_populate_stolen(dev_priv);
-       psb_gtt_populate_resources(dev_priv);
-
-       return 0;
-}
index 9a6d792..d5a5fd4 100644 (file)
@@ -33,12 +33,9 @@ int psb_gtt_allocate_resource(struct drm_psb_private *pdev, struct resource *res
                              const char *name, resource_size_t size, resource_size_t align,
                              bool stolen, u32 *offset);
 
+uint32_t psb_gtt_mask_pte(uint32_t pfn, int type);
 void psb_gtt_insert_pages(struct drm_psb_private *pdev, const struct resource *res,
                          struct page **pages);
 void psb_gtt_remove_pages(struct drm_psb_private *pdev, const struct resource *res);
 
-int psb_gem_mm_init(struct drm_device *dev);
-void psb_gem_mm_fini(struct drm_device *dev);
-int psb_gem_mm_resume(struct drm_device *dev);
-
 #endif
index 28e472b..6f917cf 100644 (file)
@@ -28,6 +28,7 @@
  *    Alan Cox <alan@linux.intel.com>
  */
 
+#include "gem.h"
 #include "power.h"
 #include "psb_drv.h"
 #include "psb_reg.h"
index 6547967..e30b581 100644 (file)
@@ -28,6 +28,7 @@
 #include <drm/drm_vblank.h>
 
 #include "framebuffer.h"
+#include "gem.h"
 #include "intel_bios.h"
 #include "mid_bios.h"
 #include "power.h"