Lines Matching +full:resume +full:- +full:offset
16 * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
18 * Authors: Thomas Hellstrom <thomas-at-tungstengraphics.com>
30 * GTT resource allocator - manage page mappings in GTT space
34 * psb_gtt_mask_pte - generate GTT pte entry
59 * psb_gtt_entry - find the GTT entries for a gtt_range
63 * Given a gtt_range object return the GTT offset of the page table
68 struct drm_psb_private *dev_priv = dev->dev_private; in psb_gtt_entry()
69 unsigned long offset; in psb_gtt_entry() local
71 offset = r->resource.start - dev_priv->gtt_mem->start; in psb_gtt_entry()
73 return dev_priv->gtt_map + (offset >> PAGE_SHIFT); in psb_gtt_entry()
77 * psb_gtt_insert - put an object into the GTT
80 * @resume: on resume
87 int resume) in psb_gtt_insert() argument
94 if (r->pages == NULL) { in psb_gtt_insert()
96 return -EINVAL; in psb_gtt_insert()
99 WARN_ON(r->stolen); /* refcount these maybe ? */ in psb_gtt_insert()
102 pages = r->pages; in psb_gtt_insert()
104 if (!resume) { in psb_gtt_insert()
106 set_pages_array_wc(pages, r->npage); in psb_gtt_insert()
110 for (i = r->roll; i < r->npage; i++) { in psb_gtt_insert()
111 pte = psb_gtt_mask_pte(page_to_pfn(r->pages[i]), in psb_gtt_insert()
115 for (i = 0; i < r->roll; i++) { in psb_gtt_insert()
116 pte = psb_gtt_mask_pte(page_to_pfn(r->pages[i]), in psb_gtt_insert()
121 ioread32(gtt_slot - 1); in psb_gtt_insert()
127 * psb_gtt_remove - remove an object from the GTT
137 struct drm_psb_private *dev_priv = dev->dev_private; in psb_gtt_remove()
142 WARN_ON(r->stolen); in psb_gtt_remove()
145 pte = psb_gtt_mask_pte(page_to_pfn(dev_priv->scratch_page), in psb_gtt_remove()
148 for (i = 0; i < r->npage; i++) in psb_gtt_remove()
150 ioread32(gtt_slot - 1); in psb_gtt_remove()
151 set_pages_array_wb(r->pages, r->npage); in psb_gtt_remove()
155 * psb_gtt_roll - set scrolling position
158 * @roll: roll offset
170 if (roll >= r->npage) { in psb_gtt_roll()
175 r->roll = roll; in psb_gtt_roll()
177 /* Not currently in the GTT - no worry we will write the mapping at in psb_gtt_roll()
179 if (!r->stolen && !r->in_gart) in psb_gtt_roll()
184 for (i = r->roll; i < r->npage; i++) { in psb_gtt_roll()
185 pte = psb_gtt_mask_pte(page_to_pfn(r->pages[i]), in psb_gtt_roll()
189 for (i = 0; i < r->roll; i++) { in psb_gtt_roll()
190 pte = psb_gtt_mask_pte(page_to_pfn(r->pages[i]), in psb_gtt_roll()
194 ioread32(gtt_slot - 1); in psb_gtt_roll()
198 * psb_gtt_attach_pages - attach and pin GEM pages
209 WARN_ON(gt->pages); in psb_gtt_attach_pages()
211 pages = drm_gem_get_pages(>->gem); in psb_gtt_attach_pages()
215 gt->npage = gt->gem.size / PAGE_SIZE; in psb_gtt_attach_pages()
216 gt->pages = pages; in psb_gtt_attach_pages()
222 * psb_gtt_detach_pages - attach and pin GEM pages
232 drm_gem_put_pages(>->gem, gt->pages, true, false); in psb_gtt_detach_pages()
233 gt->pages = NULL; in psb_gtt_detach_pages()
237 * psb_gtt_pin - pin pages into the GTT
243 * Non GEM backed objects treat this as a no-op as they are always GTT
249 struct drm_device *dev = gt->gem.dev; in psb_gtt_pin()
250 struct drm_psb_private *dev_priv = dev->dev_private; in psb_gtt_pin()
251 u32 gpu_base = dev_priv->gtt.gatt_start; in psb_gtt_pin()
253 mutex_lock(&dev_priv->gtt_mutex); in psb_gtt_pin()
255 if (gt->in_gart == 0 && gt->stolen == 0) { in psb_gtt_pin()
264 psb_mmu_insert_pages(psb_mmu_get_default_pd(dev_priv->mmu), in psb_gtt_pin()
265 gt->pages, (gpu_base + gt->offset), in psb_gtt_pin()
266 gt->npage, 0, 0, PSB_MMU_CACHED_MEMORY); in psb_gtt_pin()
268 gt->in_gart++; in psb_gtt_pin()
270 mutex_unlock(&dev_priv->gtt_mutex); in psb_gtt_pin()
275 * psb_gtt_unpin - Drop a GTT pin requirement
282 * Non GEM backed objects treat this as a no-op as they are always GTT
287 struct drm_device *dev = gt->gem.dev; in psb_gtt_unpin()
288 struct drm_psb_private *dev_priv = dev->dev_private; in psb_gtt_unpin()
289 u32 gpu_base = dev_priv->gtt.gatt_start; in psb_gtt_unpin()
293 mutex_lock(&dev_priv->gtt_mutex); in psb_gtt_unpin()
302 WARN_ON(!gt->in_gart); in psb_gtt_unpin()
304 gt->in_gart--; in psb_gtt_unpin()
305 if (gt->in_gart == 0 && gt->stolen == 0) { in psb_gtt_unpin()
306 psb_mmu_remove_pages(psb_mmu_get_default_pd(dev_priv->mmu), in psb_gtt_unpin()
307 (gpu_base + gt->offset), gt->npage, 0, 0); in psb_gtt_unpin()
313 mutex_unlock(&dev_priv->gtt_mutex); in psb_gtt_unpin()
317 * GTT resource allocator - allocate and manage GTT address space
321 * psb_gtt_alloc_range - allocate GTT address space
338 struct drm_psb_private *dev_priv = dev->dev_private; in psb_gtt_alloc_range()
340 struct resource *r = dev_priv->gtt_mem; in psb_gtt_alloc_range()
346 start = r->start; in psb_gtt_alloc_range()
347 end = r->start + dev_priv->gtt.stolen_size - 1; in psb_gtt_alloc_range()
350 start = r->start + dev_priv->gtt.stolen_size; in psb_gtt_alloc_range()
351 end = r->end; in psb_gtt_alloc_range()
357 gt->resource.name = name; in psb_gtt_alloc_range()
358 gt->stolen = backed; in psb_gtt_alloc_range()
359 gt->in_gart = backed; in psb_gtt_alloc_range()
360 gt->roll = 0; in psb_gtt_alloc_range()
362 gt->gem.dev = dev; in psb_gtt_alloc_range()
363 ret = allocate_resource(dev_priv->gtt_mem, >->resource, in psb_gtt_alloc_range()
366 gt->offset = gt->resource.start - r->start; in psb_gtt_alloc_range()
374 * psb_gtt_free_range - release GTT address space
384 if (gt->mmapping) { in psb_gtt_free_range()
386 gt->mmapping = 0; in psb_gtt_free_range()
388 WARN_ON(gt->in_gart && !gt->stolen); in psb_gtt_free_range()
389 release_resource(>->resource); in psb_gtt_free_range()
395 struct drm_psb_private *dev_priv = dev->dev_private; in psb_gtt_alloc()
396 init_rwsem(&dev_priv->gtt.sem); in psb_gtt_alloc()
401 struct drm_psb_private *dev_priv = dev->dev_private; in psb_gtt_takedown()
403 if (dev_priv->gtt_map) { in psb_gtt_takedown()
404 iounmap(dev_priv->gtt_map); in psb_gtt_takedown()
405 dev_priv->gtt_map = NULL; in psb_gtt_takedown()
407 if (dev_priv->gtt_initialized) { in psb_gtt_takedown()
408 pci_write_config_word(dev->pdev, PSB_GMCH_CTRL, in psb_gtt_takedown()
409 dev_priv->gmch_ctrl); in psb_gtt_takedown()
410 PSB_WVDC32(dev_priv->pge_ctl, PSB_PGETBL_CTL); in psb_gtt_takedown()
413 if (dev_priv->vram_addr) in psb_gtt_takedown()
414 iounmap(dev_priv->gtt_map); in psb_gtt_takedown()
417 int psb_gtt_init(struct drm_device *dev, int resume) in psb_gtt_init() argument
419 struct drm_psb_private *dev_priv = dev->dev_private; in psb_gtt_init()
429 if (!resume) { in psb_gtt_init()
430 mutex_init(&dev_priv->gtt_mutex); in psb_gtt_init()
431 mutex_init(&dev_priv->mmap_mutex); in psb_gtt_init()
435 pg = &dev_priv->gtt; in psb_gtt_init()
438 pci_read_config_word(dev->pdev, PSB_GMCH_CTRL, &dev_priv->gmch_ctrl); in psb_gtt_init()
439 pci_write_config_word(dev->pdev, PSB_GMCH_CTRL, in psb_gtt_init()
440 dev_priv->gmch_ctrl | _PSB_GMCH_ENABLED); in psb_gtt_init()
442 dev_priv->pge_ctl = PSB_RVDC32(PSB_PGETBL_CTL); in psb_gtt_init()
443 PSB_WVDC32(dev_priv->pge_ctl | _PSB_PGETBL_ENABLED, PSB_PGETBL_CTL); in psb_gtt_init()
447 dev_priv->gtt_initialized = 1; in psb_gtt_init()
449 pg->gtt_phys_start = dev_priv->pge_ctl & PAGE_MASK; in psb_gtt_init()
457 pg->mmu_gatt_start = 0xE0000000; in psb_gtt_init()
459 pg->gtt_start = pci_resource_start(dev->pdev, PSB_GTT_RESOURCE); in psb_gtt_init()
460 gtt_pages = pci_resource_len(dev->pdev, PSB_GTT_RESOURCE) in psb_gtt_init()
463 if (pg->gtt_start == 0 || gtt_pages == 0) { in psb_gtt_init()
464 dev_dbg(dev->dev, "GTT PCI BAR not initialized.\n"); in psb_gtt_init()
466 pg->gtt_start = dev_priv->pge_ctl; in psb_gtt_init()
469 pg->gatt_start = pci_resource_start(dev->pdev, PSB_GATT_RESOURCE); in psb_gtt_init()
470 pg->gatt_pages = pci_resource_len(dev->pdev, PSB_GATT_RESOURCE) in psb_gtt_init()
472 dev_priv->gtt_mem = &dev->pdev->resource[PSB_GATT_RESOURCE]; in psb_gtt_init()
474 if (pg->gatt_pages == 0 || pg->gatt_start == 0) { in psb_gtt_init()
479 dev_dbg(dev->dev, "GATT PCI BAR not initialized.\n"); in psb_gtt_init()
480 pg->gatt_start = 0x40000000; in psb_gtt_init()
481 pg->gatt_pages = (128 * 1024 * 1024) >> PAGE_SHIFT; in psb_gtt_init()
487 fudge.end = 0x40000000 + 128 * 1024 * 1024 - 1; in psb_gtt_init()
490 dev_priv->gtt_mem = &fudge; in psb_gtt_init()
493 pci_read_config_dword(dev->pdev, PSB_BSM, &dev_priv->stolen_base); in psb_gtt_init()
494 vram_stolen_size = pg->gtt_phys_start - dev_priv->stolen_base in psb_gtt_init()
495 - PAGE_SIZE; in psb_gtt_init()
499 dev_dbg(dev->dev, "Stolen memory base 0x%x, size %luK\n", in psb_gtt_init()
500 dev_priv->stolen_base, vram_stolen_size / 1024); in psb_gtt_init()
502 if (resume && (gtt_pages != pg->gtt_pages) && in psb_gtt_init()
503 (stolen_size != pg->stolen_size)) { in psb_gtt_init()
504 dev_err(dev->dev, "GTT resume error.\n"); in psb_gtt_init()
505 ret = -EINVAL; in psb_gtt_init()
509 pg->gtt_pages = gtt_pages; in psb_gtt_init()
510 pg->stolen_size = stolen_size; in psb_gtt_init()
511 dev_priv->vram_stolen_size = vram_stolen_size; in psb_gtt_init()
516 if (!resume) in psb_gtt_init()
517 dev_priv->gtt_map = ioremap_nocache(pg->gtt_phys_start, in psb_gtt_init()
519 if (!dev_priv->gtt_map) { in psb_gtt_init()
520 dev_err(dev->dev, "Failure to map gtt.\n"); in psb_gtt_init()
521 ret = -ENOMEM; in psb_gtt_init()
525 if (!resume) in psb_gtt_init()
526 dev_priv->vram_addr = ioremap_wc(dev_priv->stolen_base, in psb_gtt_init()
529 if (!dev_priv->vram_addr) { in psb_gtt_init()
530 dev_err(dev->dev, "Failure to map stolen base.\n"); in psb_gtt_init()
531 ret = -ENOMEM; in psb_gtt_init()
539 pfn_base = dev_priv->stolen_base >> PAGE_SHIFT; in psb_gtt_init()
541 dev_dbg(dev->dev, "Set up %d stolen pages starting at 0x%08x, GTT offset %dK\n", in psb_gtt_init()
545 iowrite32(pte, dev_priv->gtt_map + i); in psb_gtt_init()
552 pfn_base = page_to_pfn(dev_priv->scratch_page); in psb_gtt_init()
555 iowrite32(pte, dev_priv->gtt_map + i); in psb_gtt_init()
557 (void) ioread32(dev_priv->gtt_map + i - 1); in psb_gtt_init()
567 struct drm_psb_private *dev_priv = dev->dev_private; in psb_gtt_restore()
568 struct resource *r = dev_priv->gtt_mem->child; in psb_gtt_restore()
572 /* On resume, the gtt_mutex is already initialized */ in psb_gtt_restore()
573 mutex_lock(&dev_priv->gtt_mutex); in psb_gtt_restore()
578 if (range->pages) { in psb_gtt_restore()
580 size += range->resource.end - range->resource.start; in psb_gtt_restore()
583 r = r->sibling; in psb_gtt_restore()
586 mutex_unlock(&dev_priv->gtt_mutex); in psb_gtt_restore()