Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/gma500: Move GEM memory management functions to gem.c

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

authored by

Thomas Zimmermann and committed by
Patrik Jakobsson
d339386c 42ceddb6

+149 -130
+133
drivers/gpu/drm/gma500/gem.c
··· 21 21 #include "gem.h" 22 22 #include "psb_drv.h" 23 23 24 + /* 25 + * PSB GEM object 26 + */ 27 + 24 28 int psb_gem_pin(struct psb_gem_object *pobj) 25 29 { 26 30 struct drm_gem_object *obj = &pobj->base; ··· 299 295 mutex_unlock(&dev_priv->mmap_mutex); 300 296 301 297 return ret; 298 + } 299 + 300 + /* 301 + * Memory management 302 + */ 303 + 304 + /* Insert vram stolen pages into the GTT. */ 305 + static void psb_gem_mm_populate_stolen(struct drm_psb_private *pdev) 306 + { 307 + struct drm_device *dev = &pdev->dev; 308 + unsigned int pfn_base; 309 + unsigned int i, num_pages; 310 + uint32_t pte; 311 + 312 + pfn_base = pdev->stolen_base >> PAGE_SHIFT; 313 + num_pages = pdev->vram_stolen_size >> PAGE_SHIFT; 314 + 315 + drm_dbg(dev, "Set up %u stolen pages starting at 0x%08x, GTT offset %dK\n", 316 + num_pages, pfn_base << PAGE_SHIFT, 0); 317 + 318 + for (i = 0; i < num_pages; ++i) { 319 + pte = psb_gtt_mask_pte(pfn_base + i, PSB_MMU_CACHED_MEMORY); 320 + iowrite32(pte, pdev->gtt_map + i); 321 + } 322 + 323 + (void)ioread32(pdev->gtt_map + i - 1); 324 + } 325 + 326 + int psb_gem_mm_init(struct drm_device *dev) 327 + { 328 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 329 + struct pci_dev *pdev = to_pci_dev(dev->dev); 330 + unsigned long stolen_size, vram_stolen_size; 331 + struct psb_gtt *pg; 332 + int ret; 333 + 334 + mutex_init(&dev_priv->mmap_mutex); 335 + 336 + pg = &dev_priv->gtt; 337 + 338 + pci_read_config_dword(pdev, PSB_BSM, &dev_priv->stolen_base); 339 + vram_stolen_size = pg->gtt_phys_start - dev_priv->stolen_base - PAGE_SIZE; 340 + 341 + stolen_size = vram_stolen_size; 342 + 343 + dev_dbg(dev->dev, "Stolen memory base 0x%x, size %luK\n", 344 + dev_priv->stolen_base, vram_stolen_size / 1024); 345 + 346 + pg->stolen_size = stolen_size; 347 + dev_priv->vram_stolen_size = vram_stolen_size; 348 + 349 + dev_priv->vram_addr = ioremap_wc(dev_priv->stolen_base, stolen_size); 350 + if (!dev_priv->vram_addr) { 351 + dev_err(dev->dev, "Failure to map stolen base.\n"); 352 + ret = -ENOMEM; 353 + goto err_mutex_destroy; 354 + } 355 + 356 + psb_gem_mm_populate_stolen(dev_priv); 357 + 358 + return 0; 359 + 360 + err_mutex_destroy: 361 + mutex_destroy(&dev_priv->mmap_mutex); 362 + return ret; 363 + } 364 + 365 + void psb_gem_mm_fini(struct drm_device *dev) 366 + { 367 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 368 + 369 + iounmap(dev_priv->vram_addr); 370 + 371 + mutex_destroy(&dev_priv->mmap_mutex); 372 + } 373 + 374 + /* Re-insert all pinned GEM objects into GTT. */ 375 + static void psb_gem_mm_populate_resources(struct drm_psb_private *pdev) 376 + { 377 + unsigned int restored = 0, total = 0, size = 0; 378 + struct resource *r = pdev->gtt_mem->child; 379 + struct drm_device *dev = &pdev->dev; 380 + struct psb_gem_object *pobj; 381 + 382 + while (r) { 383 + /* 384 + * TODO: GTT restoration needs a refactoring, so that we don't have to touch 385 + * struct psb_gem_object here. The type represents a GEM object and is 386 + * not related to the GTT itself. 387 + */ 388 + pobj = container_of(r, struct psb_gem_object, resource); 389 + if (pobj->pages) { 390 + psb_gtt_insert_pages(pdev, &pobj->resource, pobj->pages); 391 + size += resource_size(&pobj->resource); 392 + ++restored; 393 + } 394 + r = r->sibling; 395 + ++total; 396 + } 397 + 398 + drm_dbg(dev, "Restored %u of %u gtt ranges (%u KB)", restored, total, (size / 1024)); 399 + } 400 + 401 + int psb_gem_mm_resume(struct drm_device *dev) 402 + { 403 + struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 404 + struct pci_dev *pdev = to_pci_dev(dev->dev); 405 + unsigned long stolen_size, vram_stolen_size; 406 + struct psb_gtt *pg; 407 + 408 + pg = &dev_priv->gtt; 409 + 410 + pci_read_config_dword(pdev, PSB_BSM, &dev_priv->stolen_base); 411 + vram_stolen_size = pg->gtt_phys_start - dev_priv->stolen_base - PAGE_SIZE; 412 + 413 + stolen_size = vram_stolen_size; 414 + 415 + dev_dbg(dev->dev, "Stolen memory base 0x%x, size %luK\n", dev_priv->stolen_base, 416 + vram_stolen_size / 1024); 417 + 418 + if (stolen_size != pg->stolen_size) { 419 + dev_err(dev->dev, "GTT resume error.\n"); 420 + return -EINVAL; 421 + } 422 + 423 + psb_gem_mm_populate_stolen(dev_priv); 424 + psb_gem_mm_populate_resources(dev_priv); 425 + 426 + return 0; 302 427 }
+12
drivers/gpu/drm/gma500/gem.h
··· 14 14 15 15 struct drm_device; 16 16 17 + /* 18 + * PSB GEM object 19 + */ 20 + 17 21 struct psb_gem_object { 18 22 struct drm_gem_object base; 19 23 ··· 39 35 40 36 int psb_gem_pin(struct psb_gem_object *pobj); 41 37 void psb_gem_unpin(struct psb_gem_object *pobj); 38 + 39 + /* 40 + * Memory management 41 + */ 42 + 43 + int psb_gem_mm_init(struct drm_device *dev); 44 + void psb_gem_mm_fini(struct drm_device *dev); 45 + int psb_gem_mm_resume(struct drm_device *dev); 42 46 43 47 #endif
+1 -126
drivers/gpu/drm/gma500/gtt.c
··· 49 49 * 50 50 * Set the GTT entry for the appropriate memory type. 51 51 */ 52 - static inline uint32_t psb_gtt_mask_pte(uint32_t pfn, int type) 52 + uint32_t psb_gtt_mask_pte(uint32_t pfn, int type) 53 53 { 54 54 uint32_t mask = PSB_PTE_VALID; 55 55 ··· 125 125 mutex_unlock(&pdev->gtt_mutex); 126 126 } 127 127 128 - void psb_gem_mm_fini(struct drm_device *dev) 129 - { 130 - struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 131 - 132 - iounmap(dev_priv->vram_addr); 133 - 134 - mutex_destroy(&dev_priv->mmap_mutex); 135 - } 136 - 137 128 void psb_gtt_fini(struct drm_device *dev) 138 129 { 139 130 struct drm_psb_private *dev_priv = to_drm_psb_private(dev); ··· 153 162 iowrite32(pte, pdev->gtt_map + i); 154 163 155 164 (void)ioread32(pdev->gtt_map + i - 1); 156 - } 157 - 158 - /* Insert vram stolen pages into the GTT. */ 159 - static void psb_gtt_populate_stolen(struct drm_psb_private *pdev) 160 - { 161 - struct drm_device *dev = &pdev->dev; 162 - unsigned int pfn_base; 163 - unsigned int i, num_pages; 164 - uint32_t pte; 165 - 166 - pfn_base = pdev->stolen_base >> PAGE_SHIFT; 167 - num_pages = pdev->vram_stolen_size >> PAGE_SHIFT; 168 - 169 - drm_dbg(dev, "Set up %u stolen pages starting at 0x%08x, GTT offset %dK\n", 170 - num_pages, pfn_base << PAGE_SHIFT, 0); 171 - 172 - for (i = 0; i < num_pages; ++i) { 173 - pte = psb_gtt_mask_pte(pfn_base + i, PSB_MMU_CACHED_MEMORY); 174 - iowrite32(pte, pdev->gtt_map + i); 175 - } 176 - 177 - (void)ioread32(pdev->gtt_map + i - 1); 178 - } 179 - 180 - /* Re-insert all pinned GEM objects into GTT. */ 181 - static void psb_gtt_populate_resources(struct drm_psb_private *pdev) 182 - { 183 - unsigned int restored = 0, total = 0, size = 0; 184 - struct resource *r = pdev->gtt_mem->child; 185 - struct drm_device *dev = &pdev->dev; 186 - struct psb_gem_object *pobj; 187 - 188 - while (r) { 189 - /* 190 - * TODO: GTT restoration needs a refactoring, so that we don't have to touch 191 - * struct psb_gem_object here. The type represents a GEM object and is 192 - * not related to the GTT itself. 193 - */ 194 - pobj = container_of(r, struct psb_gem_object, resource); 195 - if (pobj->pages) { 196 - psb_gtt_insert_pages(pdev, &pobj->resource, pobj->pages); 197 - size += resource_size(&pobj->resource); 198 - ++restored; 199 - } 200 - r = r->sibling; 201 - ++total; 202 - } 203 - 204 - drm_dbg(dev, "Restored %u of %u gtt ranges (%u KB)", restored, total, (size / 1024)); 205 165 } 206 166 207 167 int psb_gtt_init(struct drm_device *dev) ··· 242 300 return ret; 243 301 } 244 302 245 - int psb_gem_mm_init(struct drm_device *dev) 246 - { 247 - struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 248 - struct pci_dev *pdev = to_pci_dev(dev->dev); 249 - unsigned long stolen_size, vram_stolen_size; 250 - struct psb_gtt *pg; 251 - int ret; 252 - 253 - mutex_init(&dev_priv->mmap_mutex); 254 - 255 - pg = &dev_priv->gtt; 256 - 257 - pci_read_config_dword(pdev, PSB_BSM, &dev_priv->stolen_base); 258 - vram_stolen_size = pg->gtt_phys_start - dev_priv->stolen_base - PAGE_SIZE; 259 - 260 - stolen_size = vram_stolen_size; 261 - 262 - dev_dbg(dev->dev, "Stolen memory base 0x%x, size %luK\n", 263 - dev_priv->stolen_base, vram_stolen_size / 1024); 264 - 265 - pg->stolen_size = stolen_size; 266 - dev_priv->vram_stolen_size = vram_stolen_size; 267 - 268 - dev_priv->vram_addr = ioremap_wc(dev_priv->stolen_base, stolen_size); 269 - if (!dev_priv->vram_addr) { 270 - dev_err(dev->dev, "Failure to map stolen base.\n"); 271 - ret = -ENOMEM; 272 - goto err_mutex_destroy; 273 - } 274 - 275 - psb_gtt_populate_stolen(dev_priv); 276 - 277 - return 0; 278 - 279 - err_mutex_destroy: 280 - mutex_destroy(&dev_priv->mmap_mutex); 281 - return ret; 282 - } 283 - 284 303 int psb_gtt_resume(struct drm_device *dev) 285 304 { 286 305 struct drm_psb_private *dev_priv = to_drm_psb_private(dev); ··· 323 420 PSB_WVDC32(dev_priv->pge_ctl, PSB_PGETBL_CTL); 324 421 (void)PSB_RVDC32(PSB_PGETBL_CTL); 325 422 return ret; 326 - } 327 - 328 - int psb_gem_mm_resume(struct drm_device *dev) 329 - { 330 - struct drm_psb_private *dev_priv = to_drm_psb_private(dev); 331 - struct pci_dev *pdev = to_pci_dev(dev->dev); 332 - unsigned long stolen_size, vram_stolen_size; 333 - struct psb_gtt *pg; 334 - 335 - pg = &dev_priv->gtt; 336 - 337 - pci_read_config_dword(pdev, PSB_BSM, &dev_priv->stolen_base); 338 - vram_stolen_size = pg->gtt_phys_start - dev_priv->stolen_base - PAGE_SIZE; 339 - 340 - stolen_size = vram_stolen_size; 341 - 342 - dev_dbg(dev->dev, "Stolen memory base 0x%x, size %luK\n", dev_priv->stolen_base, 343 - vram_stolen_size / 1024); 344 - 345 - if (stolen_size != pg->stolen_size) { 346 - dev_err(dev->dev, "GTT resume error.\n"); 347 - return -EINVAL; 348 - } 349 - 350 - psb_gtt_populate_stolen(dev_priv); 351 - psb_gtt_populate_resources(dev_priv); 352 - 353 - return 0; 354 423 }
+1 -4
drivers/gpu/drm/gma500/gtt.h
··· 33 33 const char *name, resource_size_t size, resource_size_t align, 34 34 bool stolen, u32 *offset); 35 35 36 + uint32_t psb_gtt_mask_pte(uint32_t pfn, int type); 36 37 void psb_gtt_insert_pages(struct drm_psb_private *pdev, const struct resource *res, 37 38 struct page **pages); 38 39 void psb_gtt_remove_pages(struct drm_psb_private *pdev, const struct resource *res); 39 - 40 - int psb_gem_mm_init(struct drm_device *dev); 41 - void psb_gem_mm_fini(struct drm_device *dev); 42 - int psb_gem_mm_resume(struct drm_device *dev); 43 40 44 41 #endif
+1
drivers/gpu/drm/gma500/power.c
··· 28 28 * Alan Cox <alan@linux.intel.com> 29 29 */ 30 30 31 + #include "gem.h" 31 32 #include "power.h" 32 33 #include "psb_drv.h" 33 34 #include "psb_reg.h"
+1
drivers/gpu/drm/gma500/psb_drv.c
··· 28 28 #include <drm/drm_vblank.h> 29 29 30 30 #include "framebuffer.h" 31 + #include "gem.h" 31 32 #include "intel_bios.h" 32 33 #include "mid_bios.h" 33 34 #include "power.h"