Lines Matching refs:p

75 static int radeon_cs_parser_relocs(struct radeon_cs_parser *p)  in radeon_cs_parser_relocs()  argument
77 struct drm_device *ddev = p->rdev->ddev; in radeon_cs_parser_relocs()
84 if (p->chunk_relocs == NULL) { in radeon_cs_parser_relocs()
87 chunk = p->chunk_relocs; in radeon_cs_parser_relocs()
88 p->dma_reloc_idx = 0; in radeon_cs_parser_relocs()
90 p->nrelocs = chunk->length_dw / 4; in radeon_cs_parser_relocs()
91 p->relocs = drm_calloc_large(p->nrelocs, sizeof(struct radeon_bo_list)); in radeon_cs_parser_relocs()
92 if (p->relocs == NULL) { in radeon_cs_parser_relocs()
98 for (i = 0; i < p->nrelocs; i++) { in radeon_cs_parser_relocs()
104 gobj = drm_gem_object_lookup(ddev, p->filp, r->handle); in radeon_cs_parser_relocs()
110 p->relocs[i].robj = gem_to_radeon_bo(gobj); in radeon_cs_parser_relocs()
124 if (p->ring == R600_RING_TYPE_UVD_INDEX && in radeon_cs_parser_relocs()
125 (i == 0 || drm_pci_device_is_agp(p->rdev->ddev) || in radeon_cs_parser_relocs()
126 p->rdev->family == CHIP_RS780 || in radeon_cs_parser_relocs()
127 p->rdev->family == CHIP_RS880)) { in radeon_cs_parser_relocs()
130 p->relocs[i].prefered_domains = in radeon_cs_parser_relocs()
133 p->relocs[i].allowed_domains = in radeon_cs_parser_relocs()
148 p->relocs[i].prefered_domains = domain; in radeon_cs_parser_relocs()
151 p->relocs[i].allowed_domains = domain; in radeon_cs_parser_relocs()
154 if (radeon_ttm_tt_has_userptr(p->relocs[i].robj->tbo.ttm)) { in radeon_cs_parser_relocs()
155 uint32_t domain = p->relocs[i].prefered_domains; in radeon_cs_parser_relocs()
163 p->relocs[i].prefered_domains = domain; in radeon_cs_parser_relocs()
164 p->relocs[i].allowed_domains = domain; in radeon_cs_parser_relocs()
167 p->relocs[i].tv.bo = &p->relocs[i].robj->tbo; in radeon_cs_parser_relocs()
168 p->relocs[i].tv.shared = !r->write_domain; in radeon_cs_parser_relocs()
170 radeon_cs_buckets_add(&buckets, &p->relocs[i].tv.head, in radeon_cs_parser_relocs()
174 radeon_cs_buckets_get_list(&buckets, &p->validated); in radeon_cs_parser_relocs()
176 if (p->cs_flags & RADEON_CS_USE_VM) in radeon_cs_parser_relocs()
177 p->vm_bos = radeon_vm_get_bos(p->rdev, p->ib.vm, in radeon_cs_parser_relocs()
178 &p->validated); in radeon_cs_parser_relocs()
182 r = radeon_bo_list_validate(p->rdev, &p->ticket, &p->validated, p->ring); in radeon_cs_parser_relocs()
190 static int radeon_cs_get_ring(struct radeon_cs_parser *p, u32 ring, s32 priority) in radeon_cs_get_ring() argument
192 p->priority = priority; in radeon_cs_get_ring()
199 p->ring = RADEON_RING_TYPE_GFX_INDEX; in radeon_cs_get_ring()
202 if (p->rdev->family >= CHIP_TAHITI) { in radeon_cs_get_ring()
203 if (p->priority > 0) in radeon_cs_get_ring()
204 p->ring = CAYMAN_RING_TYPE_CP1_INDEX; in radeon_cs_get_ring()
206 p->ring = CAYMAN_RING_TYPE_CP2_INDEX; in radeon_cs_get_ring()
208 p->ring = RADEON_RING_TYPE_GFX_INDEX; in radeon_cs_get_ring()
211 if (p->rdev->family >= CHIP_CAYMAN) { in radeon_cs_get_ring()
212 if (p->priority > 0) in radeon_cs_get_ring()
213 p->ring = R600_RING_TYPE_DMA_INDEX; in radeon_cs_get_ring()
215 p->ring = CAYMAN_RING_TYPE_DMA1_INDEX; in radeon_cs_get_ring()
216 } else if (p->rdev->family >= CHIP_RV770) { in radeon_cs_get_ring()
217 p->ring = R600_RING_TYPE_DMA_INDEX; in radeon_cs_get_ring()
223 p->ring = R600_RING_TYPE_UVD_INDEX; in radeon_cs_get_ring()
227 p->ring = TN_RING_TYPE_VCE1_INDEX; in radeon_cs_get_ring()
233 static int radeon_cs_sync_rings(struct radeon_cs_parser *p) in radeon_cs_sync_rings() argument
238 list_for_each_entry(reloc, &p->validated, tv.head) { in radeon_cs_sync_rings()
242 r = radeon_sync_resv(p->rdev, &p->ib.sync, resv, in radeon_cs_sync_rings()
251 int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data) in radeon_cs_parser_init() argument
259 INIT_LIST_HEAD(&p->validated); in radeon_cs_parser_init()
266 p->idx = 0; in radeon_cs_parser_init()
267 p->ib.sa_bo = NULL; in radeon_cs_parser_init()
268 p->const_ib.sa_bo = NULL; in radeon_cs_parser_init()
269 p->chunk_ib = NULL; in radeon_cs_parser_init()
270 p->chunk_relocs = NULL; in radeon_cs_parser_init()
271 p->chunk_flags = NULL; in radeon_cs_parser_init()
272 p->chunk_const_ib = NULL; in radeon_cs_parser_init()
273 p->chunks_array = kcalloc(cs->num_chunks, sizeof(uint64_t), GFP_KERNEL); in radeon_cs_parser_init()
274 if (p->chunks_array == NULL) { in radeon_cs_parser_init()
278 if (copy_from_user(p->chunks_array, chunk_array_ptr, in radeon_cs_parser_init()
282 p->cs_flags = 0; in radeon_cs_parser_init()
283 p->nchunks = cs->num_chunks; in radeon_cs_parser_init()
284 p->chunks = kcalloc(p->nchunks, sizeof(struct radeon_cs_chunk), GFP_KERNEL); in radeon_cs_parser_init()
285 if (p->chunks == NULL) { in radeon_cs_parser_init()
288 for (i = 0; i < p->nchunks; i++) { in radeon_cs_parser_init()
293 chunk_ptr = (void __user*)(unsigned long)p->chunks_array[i]; in radeon_cs_parser_init()
298 p->chunks[i].length_dw = user_chunk.length_dw; in radeon_cs_parser_init()
300 p->chunk_relocs = &p->chunks[i]; in radeon_cs_parser_init()
303 p->chunk_ib = &p->chunks[i]; in radeon_cs_parser_init()
305 if (p->chunks[i].length_dw == 0) in radeon_cs_parser_init()
309 p->chunk_const_ib = &p->chunks[i]; in radeon_cs_parser_init()
311 if (p->chunks[i].length_dw == 0) in radeon_cs_parser_init()
315 p->chunk_flags = &p->chunks[i]; in radeon_cs_parser_init()
317 if (p->chunks[i].length_dw == 0) in radeon_cs_parser_init()
321 size = p->chunks[i].length_dw; in radeon_cs_parser_init()
323 p->chunks[i].user_ptr = cdata; in radeon_cs_parser_init()
328 if (!p->rdev || !(p->rdev->flags & RADEON_IS_AGP)) in radeon_cs_parser_init()
332 p->chunks[i].kdata = drm_malloc_ab(size, sizeof(uint32_t)); in radeon_cs_parser_init()
334 if (p->chunks[i].kdata == NULL) { in radeon_cs_parser_init()
337 if (copy_from_user(p->chunks[i].kdata, cdata, size)) { in radeon_cs_parser_init()
341 p->cs_flags = p->chunks[i].kdata[0]; in radeon_cs_parser_init()
342 if (p->chunks[i].length_dw > 1) in radeon_cs_parser_init()
343 ring = p->chunks[i].kdata[1]; in radeon_cs_parser_init()
344 if (p->chunks[i].length_dw > 2) in radeon_cs_parser_init()
345 priority = (s32)p->chunks[i].kdata[2]; in radeon_cs_parser_init()
350 if (p->rdev) { in radeon_cs_parser_init()
351 if ((p->cs_flags & RADEON_CS_USE_VM) && in radeon_cs_parser_init()
352 !p->rdev->vm_manager.enabled) { in radeon_cs_parser_init()
357 if (radeon_cs_get_ring(p, ring, priority)) in radeon_cs_parser_init()
361 if ((p->cs_flags & RADEON_CS_USE_VM) == 0) { in radeon_cs_parser_init()
362 if (p->rdev->asic->ring[p->ring]->cs_parse == NULL) { in radeon_cs_parser_init()
363 DRM_ERROR("Ring %d requires VM!\n", p->ring); in radeon_cs_parser_init()
367 if (p->rdev->asic->ring[p->ring]->ib_parse == NULL) { in radeon_cs_parser_init()
369 p->ring); in radeon_cs_parser_init()
478 static int radeon_bo_vm_update_pte(struct radeon_cs_parser *p, in radeon_bo_vm_update_pte() argument
481 struct radeon_device *rdev = p->rdev; in radeon_bo_vm_update_pte()
503 for (i = 0; i < p->nrelocs; i++) { in radeon_bo_vm_update_pte()
506 bo = p->relocs[i].robj; in radeon_bo_vm_update_pte()
517 radeon_sync_fence(&p->ib.sync, bo_va->last_pt_update); in radeon_bo_vm_update_pte()
713 int radeon_cs_packet_parse(struct radeon_cs_parser *p, in radeon_cs_packet_parse() argument
717 struct radeon_cs_chunk *ib_chunk = p->chunk_ib; in radeon_cs_packet_parse()
718 struct radeon_device *rdev = p->rdev; in radeon_cs_packet_parse()
727 header = radeon_get_ib_value(p, idx); in radeon_cs_packet_parse()
763 printk("\t0x%08x <---\n", radeon_get_ib_value(p, i)); in radeon_cs_packet_parse()
765 printk("\t0x%08x\n", radeon_get_ib_value(p, i)); in radeon_cs_packet_parse()
776 bool radeon_cs_packet_next_is_pkt3_nop(struct radeon_cs_parser *p) in radeon_cs_packet_next_is_pkt3_nop() argument
781 r = radeon_cs_packet_parse(p, &p3reloc, p->idx); in radeon_cs_packet_next_is_pkt3_nop()
798 void radeon_cs_dump_packet(struct radeon_cs_parser *p, in radeon_cs_dump_packet() argument
805 ib = p->ib.ptr; in radeon_cs_dump_packet()
822 int radeon_cs_packet_next_reloc(struct radeon_cs_parser *p, in radeon_cs_packet_next_reloc() argument
831 if (p->chunk_relocs == NULL) { in radeon_cs_packet_next_reloc()
836 relocs_chunk = p->chunk_relocs; in radeon_cs_packet_next_reloc()
837 r = radeon_cs_packet_parse(p, &p3reloc, p->idx); in radeon_cs_packet_next_reloc()
840 p->idx += p3reloc.count + 2; in radeon_cs_packet_next_reloc()
845 radeon_cs_dump_packet(p, &p3reloc); in radeon_cs_packet_next_reloc()
848 idx = radeon_get_ib_value(p, p3reloc.idx + 1); in radeon_cs_packet_next_reloc()
852 radeon_cs_dump_packet(p, &p3reloc); in radeon_cs_packet_next_reloc()
857 *cs_reloc = p->relocs; in radeon_cs_packet_next_reloc()
862 *cs_reloc = &p->relocs[(idx / 4)]; in radeon_cs_packet_next_reloc()