Home | History | Annotate | Download | only in radeon

Lines Matching refs:gart

44  * GART
45 * The GART (Graphics Aperture Remapping Table) is an aperture
51 * Radeon GPUs support both an internal GART, as described above,
52 * and AGP. AGP works similarly, but the GART table is configured
57 * Both AGP and internal GART can be used at the same time, however
60 * This file handles the common internal GART management.
64 * Common GART table functions.
67 * radeon_gart_table_ram_alloc - allocate system ram for gart page table
71 * Allocate system memory for GART page table
73 * gart table to be in system memory.
82 error = bus_dmamem_alloc(rdev->ddev->dmat, rdev->gart.table_size,
83 PAGE_SIZE, 0, &rdev->gart.rg_table_seg, 1, &rsegs, BUS_DMA_WAITOK);
87 error = bus_dmamap_create(rdev->ddev->dmat, rdev->gart.table_size, 1,
88 rdev->gart.table_size, 0, BUS_DMA_WAITOK,
89 &rdev->gart.rg_table_map);
92 error = bus_dmamem_map(rdev->ddev->dmat, &rdev->gart.rg_table_seg, 1,
93 rdev->gart.table_size, &rdev->gart.ptr,
97 error = bus_dmamap_load(rdev->ddev->dmat, rdev->gart.rg_table_map,
98 rdev->gart.ptr, rdev->gart.table_size, NULL, BUS_DMA_WAITOK);
102 memset(rdev->gart.ptr, 0, rdev->gart.table_size);
103 bus_dmamap_sync(rdev->ddev->dmat, rdev->gart.rg_table_map, 0,
104 rdev->gart.table_size, BUS_DMASYNC_PREWRITE);
107 rdev->gart.table_addr = rdev->gart.rg_table_map->dm_segs[0].ds_addr;
111 bus_dmamap_unload(rdev->ddev->dmat, rdev->gart.rg_table_map);
112 fail3: bus_dmamem_unmap(rdev->ddev->dmat, rdev->gart.ptr,
113 rdev->gart.table_size);
114 fail2: bus_dmamap_destroy(rdev->ddev->dmat, rdev->gart.rg_table_map);
115 fail1: bus_dmamem_free(rdev->ddev->dmat, &rdev->gart.rg_table_seg, 1);
122 ptr = pci_alloc_consistent(rdev->pdev, rdev->gart.table_size,
123 &rdev->gart.table_addr);
131 rdev->gart.table_size >> PAGE_SHIFT);
134 rdev->gart.ptr = ptr;
135 memset((void *)rdev->gart.ptr, 0, rdev->gart.table_size);
141 * radeon_gart_table_ram_free - free system ram for gart page table
145 * Free system memory for GART page table
147 * gart table to be in system memory.
151 if (rdev->gart.ptr == NULL) {
155 bus_dmamap_unload(rdev->ddev->dmat, rdev->gart.rg_table_map);
156 bus_dmamem_unmap(rdev->ddev->dmat, rdev->gart.ptr,
157 rdev->gart.table_size);
158 bus_dmamap_destroy(rdev->ddev->dmat, rdev->gart.rg_table_map);
159 bus_dmamem_free(rdev->ddev->dmat, &rdev->gart.rg_table_seg, 1);
164 set_memory_wb((unsigned long)rdev->gart.ptr,
165 rdev->gart.table_size >> PAGE_SHIFT);
168 pci_free_consistent(rdev->pdev, rdev->gart.table_size,
169 (void *)rdev->gart.ptr,
170 rdev->gart.table_addr);
171 rdev->gart.ptr = NULL;
172 rdev->gart.table_addr = 0;
177 * radeon_gart_table_vram_alloc - allocate vram for gart page table
181 * Allocate video memory for GART page table
183 * gart table to be in video memory.
190 if (rdev->gart.robj == NULL) {
191 r = radeon_bo_create(rdev, rdev->gart.table_size,
193 0, NULL, NULL, &rdev->gart.robj);
202 * radeon_gart_table_vram_pin - pin gart page table in vram
206 * Pin the GART page table in vram so it will not be moved
208 * gart table to be in video memory.
216 r = radeon_bo_reserve(rdev->gart.robj, false);
219 r = radeon_bo_pin(rdev->gart.robj,
222 radeon_bo_unreserve(rdev->gart.robj);
225 r = radeon_bo_kmap(rdev->gart.robj, &rdev->gart.ptr);
227 radeon_bo_unpin(rdev->gart.robj);
228 radeon_bo_unreserve(rdev->gart.robj);
229 rdev->gart.table_addr = gpu_addr;
234 /* We might have dropped some GART table updates while it wasn't
237 for (i = 0; i < rdev->gart.num_gpu_pages; i++)
238 radeon_gart_set_page(rdev, i, rdev->gart.pages_entry[i]);
247 * radeon_gart_table_vram_unpin - unpin gart page table in vram
251 * Unpin the GART page table in vram (pcie r4xx, r5xx+).
252 * These asics require the gart table to be in video memory.
258 if (rdev->gart.robj == NULL) {
261 r = radeon_bo_reserve(rdev->gart.robj, false);
263 radeon_bo_kunmap(rdev->gart.robj);
264 radeon_bo_unpin(rdev->gart.robj);
265 radeon_bo_unreserve(rdev->gart.robj);
266 rdev->gart.ptr = NULL;
271 * radeon_gart_table_vram_free - free gart page table vram
275 * Free the video memory used for the GART page table
276 * (pcie r4xx, r5xx+). These asics require the gart table to
281 if (rdev->gart.robj == NULL) {
284 radeon_bo_unref(&rdev->gart.robj);
293 if (rdev->gart.rg_table_map != NULL) {
295 rdev->gart.table_size / rdev->gart.num_gpu_pages;
297 bus_dmamap_sync(rdev->ddev->dmat, rdev->gart.rg_table_map,
308 if (rdev->gart.rg_table_map != NULL) {
310 rdev->gart.table_size / rdev->gart.num_gpu_pages;
312 bus_dmamap_sync(rdev->ddev->dmat, rdev->gart.rg_table_map,
316 if (rdev->gart.ptr != NULL) {
324 * Common gart functions.
338 KASSERT(npages <= rdev->gart.num_cpu_pages);
339 KASSERT(gpu_npages <= rdev->gart.num_cpu_pages);
341 if (!rdev->gart.ready) {
342 WARN(1, "trying to bind memory to uninitialized GART !\n");
348 if (rdev->gart.pages[pgstart + pgno] == NULL)
350 rdev->gart.pages[pgstart + pgno] = NULL;
354 rdev->gart.pages_entry[t] = rdev->dummy_page.entry;
355 if (rdev->gart.ptr == NULL)
364 * radeon_gart_unbind - unbind pages from the gart page table
367 * @offset: offset into the GPU's gart aperture
370 * Unbinds the requested pages from the gart page table and
380 if (!rdev->gart.ready) {
381 WARN(1, "trying to unbind memory from uninitialized GART !\n");
387 if (rdev->gart.pages[p]) {
388 rdev->gart.pages[p] = NULL;
390 rdev->gart.pages_entry[t] = rdev->dummy_page.entry;
391 if (rdev->gart.ptr) {
398 if (rdev->gart.ptr) {
419 KASSERT(npages <= rdev->gart.num_cpu_pages);
420 KASSERT(gpu_npages <= rdev->gart.num_cpu_pages);
422 if (!rdev->gart.ready) {
423 WARN(1, "trying to bind memory to uninitialized GART !\n");
432 rdev->gart.pages[pgstart + pgno] = pages[pgno];
438 rdev->gart.pages_entry[i] = page_entry;
439 if (rdev->gart.ptr == NULL)
450 * radeon_gart_bind - bind pages into the gart page table
453 * @offset: offset into the GPU's gart aperture
459 * Binds the requested pages to the gart page table
472 if (!rdev->gart.ready) {
473 WARN(1, "trying to bind memory to uninitialized GART !\n");
480 rdev->gart.pages[p] = pagelist[i];
484 rdev->gart.pages_entry[t] = page_entry;
485 if (rdev->gart.ptr) {
491 if (rdev->gart.ptr) {
500 * radeon_gart_init - init the driver info for managing the gart
504 * Allocate the dummy page and init the gart driver info (all asics).
511 if (rdev->gart.pages) {
523 rdev->gart.num_cpu_pages = rdev->mc.gtt_size / PAGE_SIZE;
524 rdev->gart.num_gpu_pages = rdev->mc.gtt_size / RADEON_GPU_PAGE_SIZE;
525 DRM_INFO("GART: num cpu pages %u, num gpu pages %u\n",
526 rdev->gart.num_cpu_pages, rdev->gart.num_gpu_pages);
528 rdev->gart.pages = vzalloc(array_size(sizeof(void *),
529 rdev->gart.num_cpu_pages));
530 if (rdev->gart.pages == NULL) {
534 rdev->gart.pages_entry = vmalloc(array_size(sizeof(uint64_t),
535 rdev->gart.num_gpu_pages));
536 if (rdev->gart.pages_entry == NULL) {
540 /* set GART entry to point to the dummy page by default */
541 for (i = 0; i < rdev->gart.num_gpu_pages; i++)
542 rdev->gart.pages_entry[i] = rdev->dummy_page.entry;
547 * radeon_gart_fini - tear down the driver info for managing the gart
551 * Tear down the gart driver info and free the dummy page (all asics).
555 if (rdev->gart.ready) {
557 radeon_gart_unbind(rdev, 0, rdev->gart.num_cpu_pages);
559 rdev->gart.ready = false;
560 vfree(rdev->gart.pages);
561 vfree(rdev->gart.pages_entry);
562 rdev->gart.pages = NULL;
563 rdev->gart.pages_entry = NULL;