Lines Matching +full:sub +full:- +full:system

44 	const int slot = pt->base >> pt->ptp->shift;  in nvkm_mmu_ptp_put()
45 struct nvkm_mmu_ptp *ptp = pt->ptp; in nvkm_mmu_ptp_put()
50 if (!ptp->free) in nvkm_mmu_ptp_put()
51 list_add(&ptp->head, &mmu->ptp.list); in nvkm_mmu_ptp_put()
52 ptp->free |= BIT(slot); in nvkm_mmu_ptp_put()
54 /* If there's no more sub-allocations, destroy PTP. */ in nvkm_mmu_ptp_put()
55 if (ptp->free == ptp->mask) { in nvkm_mmu_ptp_put()
56 nvkm_mmu_ptc_put(mmu, force, &ptp->pt); in nvkm_mmu_ptp_put()
57 list_del(&ptp->head); in nvkm_mmu_ptp_put()
74 ptp = list_first_entry_or_null(&mmu->ptp.list, typeof(*ptp), head); in nvkm_mmu_ptp_get()
76 /* Need to allocate a new parent to sub-allocate from. */ in nvkm_mmu_ptp_get()
82 ptp->pt = nvkm_mmu_ptc_get(mmu, 0x1000, 0x1000, false); in nvkm_mmu_ptp_get()
83 if (!ptp->pt) { in nvkm_mmu_ptp_get()
89 ptp->shift = order_base_2(size); in nvkm_mmu_ptp_get()
90 slot = nvkm_memory_size(ptp->pt->memory) >> ptp->shift; in nvkm_mmu_ptp_get()
91 ptp->mask = (1 << slot) - 1; in nvkm_mmu_ptp_get()
92 ptp->free = ptp->mask; in nvkm_mmu_ptp_get()
93 list_add(&ptp->head, &mmu->ptp.list); in nvkm_mmu_ptp_get()
95 pt->ptp = ptp; in nvkm_mmu_ptp_get()
96 pt->sub = true; in nvkm_mmu_ptp_get()
98 /* Sub-allocate from parent object, removing PTP from cache in nvkm_mmu_ptp_get()
101 slot = __ffs(ptp->free); in nvkm_mmu_ptp_get()
102 ptp->free &= ~BIT(slot); in nvkm_mmu_ptp_get()
103 if (!ptp->free) in nvkm_mmu_ptp_get()
104 list_del(&ptp->head); in nvkm_mmu_ptp_get()
106 pt->memory = pt->ptp->pt->memory; in nvkm_mmu_ptp_get()
107 pt->base = slot << ptp->shift; in nvkm_mmu_ptp_get()
108 pt->addr = pt->ptp->pt->addr + pt->base; in nvkm_mmu_ptp_get()
124 list_for_each_entry(ptc, &mmu->ptc.list, head) { in nvkm_mmu_ptc_find()
125 if (ptc->size == size) in nvkm_mmu_ptc_find()
131 INIT_LIST_HEAD(&ptc->item); in nvkm_mmu_ptc_find()
132 ptc->size = size; in nvkm_mmu_ptc_find()
133 ptc->refs = 0; in nvkm_mmu_ptc_find()
134 list_add(&ptc->head, &mmu->ptc.list); in nvkm_mmu_ptc_find()
145 /* Handle sub-allocated page tables. */ in nvkm_mmu_ptc_put()
146 if (pt->sub) { in nvkm_mmu_ptc_put()
147 mutex_lock(&mmu->ptp.mutex); in nvkm_mmu_ptc_put()
149 mutex_unlock(&mmu->ptp.mutex); in nvkm_mmu_ptc_put()
154 mutex_lock(&mmu->ptc.mutex); in nvkm_mmu_ptc_put()
155 if (pt->ptc->refs < 8 /* Heuristic. */ && !force) { in nvkm_mmu_ptc_put()
156 list_add_tail(&pt->head, &pt->ptc->item); in nvkm_mmu_ptc_put()
157 pt->ptc->refs++; in nvkm_mmu_ptc_put()
159 nvkm_memory_unref(&pt->memory); in nvkm_mmu_ptc_put()
162 mutex_unlock(&mmu->ptc.mutex); in nvkm_mmu_ptc_put()
173 /* Sub-allocated page table (ie. GP100 LPT). */ in nvkm_mmu_ptc_get()
175 mutex_lock(&mmu->ptp.mutex); in nvkm_mmu_ptc_get()
177 mutex_unlock(&mmu->ptp.mutex); in nvkm_mmu_ptc_get()
182 mutex_lock(&mmu->ptc.mutex); in nvkm_mmu_ptc_get()
185 mutex_unlock(&mmu->ptc.mutex); in nvkm_mmu_ptc_get()
190 pt = list_first_entry_or_null(&ptc->item, typeof(*pt), head); in nvkm_mmu_ptc_get()
193 nvkm_fo64(pt->memory, 0, 0, size >> 3); in nvkm_mmu_ptc_get()
194 list_del(&pt->head); in nvkm_mmu_ptc_get()
195 ptc->refs--; in nvkm_mmu_ptc_get()
196 mutex_unlock(&mmu->ptc.mutex); in nvkm_mmu_ptc_get()
199 mutex_unlock(&mmu->ptc.mutex); in nvkm_mmu_ptc_get()
204 pt->ptc = ptc; in nvkm_mmu_ptc_get()
205 pt->sub = false; in nvkm_mmu_ptc_get()
207 ret = nvkm_memory_new(mmu->subdev.device, NVKM_MEM_TARGET_INST, in nvkm_mmu_ptc_get()
208 size, align, zero, &pt->memory); in nvkm_mmu_ptc_get()
214 pt->base = 0; in nvkm_mmu_ptc_get()
215 pt->addr = nvkm_memory_addr(pt->memory); in nvkm_mmu_ptc_get()
223 list_for_each_entry(ptc, &mmu->ptc.list, head) { in nvkm_mmu_ptc_dump()
225 list_for_each_entry_safe(pt, tt, &ptc->item, head) { in nvkm_mmu_ptc_dump()
226 nvkm_memory_unref(&pt->memory); in nvkm_mmu_ptc_dump()
227 list_del(&pt->head); in nvkm_mmu_ptc_dump()
238 list_for_each_entry_safe(ptc, ptct, &mmu->ptc.list, head) { in nvkm_mmu_ptc_fini()
239 WARN_ON(!list_empty(&ptc->item)); in nvkm_mmu_ptc_fini()
240 list_del(&ptc->head); in nvkm_mmu_ptc_fini()
248 mutex_init(&mmu->ptc.mutex); in nvkm_mmu_ptc_init()
249 INIT_LIST_HEAD(&mmu->ptc.list); in nvkm_mmu_ptc_init()
250 mutex_init(&mmu->ptp.mutex); in nvkm_mmu_ptc_init()
251 INIT_LIST_HEAD(&mmu->ptp.list); in nvkm_mmu_ptc_init()
257 if (heap >= 0 && !WARN_ON(mmu->type_nr == ARRAY_SIZE(mmu->type))) { in nvkm_mmu_type()
258 mmu->type[mmu->type_nr].type = type | mmu->heap[heap].type; in nvkm_mmu_type()
259 mmu->type[mmu->type_nr].heap = heap; in nvkm_mmu_type()
260 mmu->type_nr++; in nvkm_mmu_type()
268 if (!WARN_ON(mmu->heap_nr == ARRAY_SIZE(mmu->heap))) { in nvkm_mmu_heap()
269 mmu->heap[mmu->heap_nr].type = type; in nvkm_mmu_heap()
270 mmu->heap[mmu->heap_nr].size = size; in nvkm_mmu_heap()
271 return mmu->heap_nr++; in nvkm_mmu_heap()
274 return -EINVAL; in nvkm_mmu_heap()
280 struct nvkm_device *device = mmu->subdev.device; in nvkm_mmu_host()
281 u8 type = NVKM_MEM_KIND * !!mmu->func->kind_sys; in nvkm_mmu_host()
284 /* Non-mappable system memory. */ in nvkm_mmu_host()
288 /* Non-coherent, cached, system memory. in nvkm_mmu_host()
290 * Block-linear mappings of system memory must be done through in nvkm_mmu_host()
292 * to map BAR1 with write-combining. in nvkm_mmu_host()
295 if (!device->bar || device->bar->iomap_uncached) in nvkm_mmu_host()
300 /* Coherent, cached, system memory. in nvkm_mmu_host()
303 * mappings, and also for block-linear mappings which must be in nvkm_mmu_host()
307 if (device->func->cpu_coherent) in nvkm_mmu_host()
310 /* Uncached system memory. */ in nvkm_mmu_host()
317 struct nvkm_device *device = mmu->subdev.device; in nvkm_mmu_vram()
318 struct nvkm_mm *mm = &device->fb->ram->vram; in nvkm_mmu_vram()
322 u8 type = NVKM_MEM_KIND * !!mmu->func->kind; in nvkm_mmu_vram()
326 /* Mixed-memory doesn't support compression or display. */ in nvkm_mmu_vram()
334 /* Add non-mappable VRAM types first so that they're preferred in nvkm_mmu_vram()
335 * over anything else. Mixed-memory will be slower than other in nvkm_mmu_vram()
351 if (device->bar) { in nvkm_mmu_vram()
352 /* Write-combined BAR1 access. */ in nvkm_mmu_vram()
354 if (!device->bar->iomap_uncached) { in nvkm_mmu_vram()
373 if (mmu->subdev.device->fb && mmu->subdev.device->fb->ram) in nvkm_mmu_oneinit()
378 if (mmu->func->vmm.global) { in nvkm_mmu_oneinit()
379 int ret = nvkm_vmm_new(subdev->device, 0, 0, NULL, 0, NULL, in nvkm_mmu_oneinit()
380 "gart", &mmu->vmm); in nvkm_mmu_oneinit()
392 if (mmu->func->init) in nvkm_mmu_init()
393 mmu->func->init(mmu); in nvkm_mmu_init()
402 nvkm_vmm_unref(&mmu->vmm); in nvkm_mmu_dtor()
405 mutex_destroy(&mmu->mutex); in nvkm_mmu_dtor()
407 if (mmu->func->dtor) in nvkm_mmu_dtor()
408 mmu->func->dtor(mmu); in nvkm_mmu_dtor()
424 nvkm_subdev_ctor(&nvkm_mmu, device, type, inst, &mmu->subdev); in nvkm_mmu_ctor()
425 mmu->func = func; in nvkm_mmu_ctor()
426 mmu->dma_bits = func->dma_bits; in nvkm_mmu_ctor()
428 mutex_init(&mmu->mutex); in nvkm_mmu_ctor()
429 mmu->user.ctor = nvkm_ummu_new; in nvkm_mmu_ctor()
430 mmu->user.base = func->mmu.user; in nvkm_mmu_ctor()
438 return -ENOMEM; in nvkm_mmu_new_()