Lines Matching +full:0 +full:- +full:dev
3 * SPDX-License-Identifier: MIT
26 #include "drm-uapi/msm_drm.h"
29 #include "drm-uapi/d3dkmthk.h"
50 * - /sys/kernel/debug/dri/0/rd
51 * - /sys/kernel/debug/dri/0/hangrd
53 * - echo 1 > /sys/module/msm/parameters/rd_full
57 * pre-allocate a single buffer and hope it always allocated starting
63 * Code from Freedreno/Turnip is not re-used here since the relevant
67 * For how-to see freedreno.rst
81 /* clang-format off */ in print_usage()
85 "\t-e, --exe=NAME - only use cmdstream from named process\n" in print_usage()
86 "\t-o --override=submit - № of the submit to override\n" in print_usage()
87 … "\t-g --generator=path - executable which generate cmdstream for override (default: %s)\n" in print_usage()
88 "\t-f --first=submit - first submit № to replay\n" in print_usage()
89 "\t-l --last=submit - last submit № to replay\n" in print_usage()
90 "\t-a --address=address - base iova address on WSL\n" in print_usage()
91 "\t-h, --help - show this message\n" in print_usage()
93 /* clang-format on */ in print_usage()
97 /* clang-format off */
99 { "exe", required_argument, 0, 'e' },
100 { "override", required_argument, 0, 'o' },
101 { "generator", required_argument, 0, 'g' },
102 { "first", required_argument, 0, 'f' },
103 { "last", required_argument, 0, 'l' },
104 { "address", required_argument, 0, 'a' },
105 { "help", no_argument, 0, 'h' },
107 /* clang-format on */
112 int ret = -1; in main()
115 uint32_t submit_to_override = -1; in main()
116 uint32_t first_submit = 0; in main()
117 uint32_t last_submit = -1; in main()
118 uint64_t base_addr = 0; in main()
121 snprintf(default_csgen, PATH_MAX, "%s/generate_rd", dirname(argv[0])); in main()
125 while ((c = getopt_long(argc, argv, "e:o:g:f:l:a:h", opts, NULL)) != -1) { in main()
127 case 0: in main()
134 submit_to_override = strtoul(optarg, NULL, 0); in main()
140 first_submit = strtoul(optarg, NULL, 0); in main()
143 last_submit = strtoul(optarg, NULL, 0); in main()
146 base_addr = strtoull(optarg, NULL, 0); in main()
150 print_usage(argv[0], default_csgen); in main()
165 print_usage(argv[0], default_csgen); in main()
234 void buffer_mem_free(struct device *dev, struct buffer *buf);
242 if (buf1->iova > buf2->iova) in rb_buffer_insert_cmp()
244 else if (buf1->iova < buf2->iova) in rb_buffer_insert_cmp()
245 return -1; in rb_buffer_insert_cmp()
246 return 0; in rb_buffer_insert_cmp()
254 if (buf->iova + buf->size <= iova) in rb_buffer_search_cmp()
255 return -1; in rb_buffer_search_cmp()
256 else if (buf->iova > iova) in rb_buffer_search_cmp()
258 return 0; in rb_buffer_search_cmp()
262 device_get_buffer(struct device *dev, uint64_t iova) in device_get_buffer() argument
264 if (iova == 0) in device_get_buffer()
266 return (struct buffer *)rb_tree_search(&dev->buffers, &iova, in device_get_buffer()
271 device_mark_buffers(struct device *dev) in device_mark_buffers() argument
273 rb_tree_foreach_safe (struct buffer, buf, &dev->buffers, node) { in device_mark_buffers()
274 buf->used = false; in device_mark_buffers()
279 device_free_buffers(struct device *dev) in device_free_buffers() argument
281 rb_tree_foreach_safe (struct buffer, buf, &dev->buffers, node) { in device_free_buffers()
282 buffer_mem_free(dev, buf); in device_free_buffers()
283 rb_tree_remove(&dev->buffers, &buf->node); in device_free_buffers()
289 device_print_shader_log(struct device *dev) in device_print_shader_log() argument
294 uint32_t entries_u32[0]; in device_print_shader_log()
295 float entries_float[0]; in device_print_shader_log()
299 if (dev->shader_log_iova != 0) in device_print_shader_log()
301 struct buffer *buf = device_get_buffer(dev, dev->shader_log_iova); in device_print_shader_log()
303 struct shader_log *log = buf->map + (dev->shader_log_iova - buf->iova); in device_print_shader_log()
304 uint32_t count = (log->cur_iova - dev->shader_log_iova - in device_print_shader_log()
309 for (uint32_t i = 0; i < count; i++) { in device_print_shader_log()
310 printf("[%u] %08x %.4f\n", i, log->entries_u32[i], in device_print_shader_log()
311 log->entries_float[i]); in device_print_shader_log()
320 device_print_cp_log(struct device *dev) in device_print_cp_log() argument
330 uint32_t data[0]; in device_print_cp_log()
333 if (dev->cp_log_iova == 0) in device_print_cp_log()
336 struct buffer *buf = device_get_buffer(dev, dev->cp_log_iova); in device_print_cp_log()
340 struct cp_log *log = buf->map + (dev->cp_log_iova - buf->iova); in device_print_cp_log()
341 if (log->first_entry_size == 0) in device_print_cp_log()
345 buf->map + offsetof(struct cp_log, first_entry_size); in device_print_cp_log()
346 uint32_t idx = 0; in device_print_cp_log()
347 while (log_entry->size != 0) { in device_print_cp_log()
349 uint32_t dwords = log_entry->size / 4; in device_print_cp_log()
351 for (uint32_t i = 0; i < dwords; i++) { in device_print_cp_log()
352 if (i % 8 == 0) in device_print_cp_log()
354 printf("%08x ", log_entry->data[i]); in device_print_cp_log()
360 log_entry = (void *)log_entry + log_entry->size + in device_print_cp_log()
366 device_dump_wrbuf(struct device *dev) in device_dump_wrbuf() argument
368 if (!u_vector_length(&dev->wrbufs)) in device_dump_wrbuf()
378 u_vector_foreach(wrbuf, &dev->wrbufs) { in device_dump_wrbuf()
380 snprintf(buffer_path, sizeof(buffer_path), "%s/%s", buffer_dir, wrbuf->name); in device_dump_wrbuf()
387 struct buffer *buf = device_get_buffer(dev, wrbuf->iova); in device_dump_wrbuf()
393 uint64_t offset = wrbuf->iova - buf->iova; in device_dump_wrbuf()
394 uint64_t size = MIN2(wrbuf->size, buf->size - offset); in device_dump_wrbuf()
395 if (size != wrbuf->size) { in device_dump_wrbuf()
396 …ping buffer %s as it's smaller than expected (0x%" PRIx64 " < 0x%" PRIx64 ")\n", wrbuf->name, size… in device_dump_wrbuf()
399 …printf("Dumping %s (0x%" PRIx64 " - 0x%" PRIx64 ")\n", wrbuf->name, wrbuf->iova, wrbuf->iova + siz… in device_dump_wrbuf()
401 fwrite(buf->map + offset, size, 1, f); in device_dump_wrbuf()
414 tv->tv_sec = t.tv_sec + ns / 1000000000; in get_abs_timeout()
415 tv->tv_nsec = t.tv_nsec + ns % 1000000000; in get_abs_timeout()
421 struct device *dev = calloc(sizeof(struct device), 1); in device_create() local
423 dev->fd = drmOpenWithType("msm", NULL, DRM_NODE_RENDER); in device_create()
424 if (dev->fd < 0) { in device_create()
435 int ret = drmCommandWriteRead(dev->fd, DRM_MSM_GET_PARAM, &req, sizeof(req)); in device_create()
440 ret = drmCommandWriteRead(dev->fd, DRM_MSM_GET_PARAM, &req, sizeof(req)); in device_create()
443 dev->has_set_iova = true; in device_create()
450 drmCommandWriteRead(dev->fd, DRM_MSM_GEM_NEW, &req_new, sizeof(req_new)); in device_create()
451 dev->va_id = req_new.handle; in device_create()
458 drmCommandWriteRead(dev->fd, in device_create()
460 dev->va_iova = req_info.value; in device_create()
467 drmCommandWriteRead(dev->fd, DRM_MSM_GEM_INFO, &req_offset, sizeof(req_offset)); in device_create()
469 dev->va_map = mmap(0, FAKE_ADDRESS_SPACE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, in device_create()
470 dev->fd, req_offset.value); in device_create()
471 if (dev->va_map == MAP_FAILED) { in device_create()
475 va_start = dev->va_iova; in device_create()
478 printf("Allocated iova %" PRIx64 "\n", dev->va_iova); in device_create()
482 .flags = 0, in device_create()
483 .prio = 0, in device_create()
486 ret = drmCommandWriteRead(dev->fd, DRM_MSM_SUBMITQUEUE_NEW, &req_queue, in device_create()
492 dev->queue_id = req_queue.id; in device_create()
494 rb_tree_init(&dev->buffers); in device_create()
495 util_vma_heap_init(&dev->vma, va_start, ROUND_DOWN_TO(va_size, 4096)); in device_create()
496 u_vector_init(&dev->cmdstreams, 8, sizeof(struct cmdstream)); in device_create()
497 u_vector_init(&dev->wrbufs, 8, sizeof(struct wrbuf)); in device_create()
499 return dev; in device_create()
503 device_submit_cmdstreams(struct device *dev) in device_submit_cmdstreams() argument
505 if (!u_vector_length(&dev->cmdstreams)) { in device_submit_cmdstreams()
506 device_free_buffers(dev); in device_submit_cmdstreams()
510 struct drm_msm_gem_submit_cmd cmds[u_vector_length(&dev->cmdstreams)]; in device_submit_cmdstreams()
512 uint32_t idx = 0; in device_submit_cmdstreams()
514 u_vector_foreach(cmd, &dev->cmdstreams) { in device_submit_cmdstreams()
515 struct buffer *cmdstream_buf = device_get_buffer(dev, cmd->iova); in device_submit_cmdstreams()
517 uint32_t bo_idx = 0; in device_submit_cmdstreams()
518 rb_tree_foreach (struct buffer, buf, &dev->buffers, node) { in device_submit_cmdstreams()
526 cmdstream_buf->flags = MSM_SUBMIT_BO_DUMP; in device_submit_cmdstreams()
529 submit_cmd->type = MSM_SUBMIT_CMD_BUF; in device_submit_cmdstreams()
530 submit_cmd->submit_idx = dev->has_set_iova ? bo_idx : 0; in device_submit_cmdstreams()
531 if (dev->has_set_iova) { in device_submit_cmdstreams()
532 submit_cmd->submit_offset = cmd->iova - cmdstream_buf->iova; in device_submit_cmdstreams()
534 submit_cmd->submit_offset = cmd->iova - dev->va_iova; in device_submit_cmdstreams()
536 submit_cmd->size = cmd->size; in device_submit_cmdstreams()
537 submit_cmd->pad = 0; in device_submit_cmdstreams()
538 submit_cmd->nr_relocs = 0; in device_submit_cmdstreams()
539 submit_cmd->relocs = 0; in device_submit_cmdstreams()
544 uint32_t bo_count = 0; in device_submit_cmdstreams()
545 rb_tree_foreach (struct buffer, buf, &dev->buffers, node) { in device_submit_cmdstreams()
550 if (!dev->has_set_iova) { in device_submit_cmdstreams()
557 if (dev->has_set_iova) { in device_submit_cmdstreams()
558 uint32_t bo_idx = 0; in device_submit_cmdstreams()
559 rb_tree_foreach (struct buffer, buf, &dev->buffers, node) { in device_submit_cmdstreams()
561 submit_bo->handle = buf->gem_handle; in device_submit_cmdstreams()
562 submit_bo->flags = in device_submit_cmdstreams()
563 buf->flags | MSM_SUBMIT_BO_READ | MSM_SUBMIT_BO_WRITE; in device_submit_cmdstreams()
564 submit_bo->presumed = buf->iova; in device_submit_cmdstreams()
566 buf->flags = 0; in device_submit_cmdstreams()
569 bo_list[0].handle = dev->va_id; in device_submit_cmdstreams()
570 bo_list[0].flags = in device_submit_cmdstreams()
572 bo_list[0].presumed = dev->va_iova; in device_submit_cmdstreams()
577 .queueid = dev->queue_id, in device_submit_cmdstreams()
581 .nr_cmds = u_vector_length(&dev->cmdstreams), in device_submit_cmdstreams()
582 .in_syncobjs = 0, in device_submit_cmdstreams()
583 .out_syncobjs = 0, in device_submit_cmdstreams()
584 .nr_in_syncobjs = 0, in device_submit_cmdstreams()
585 .nr_out_syncobjs = 0, in device_submit_cmdstreams()
589 int ret = drmCommandWriteRead(dev->fd, DRM_MSM_GEM_SUBMIT, &submit_req, in device_submit_cmdstreams()
602 .queueid = dev->queue_id, in device_submit_cmdstreams()
607 drmCommandWrite(dev->fd, DRM_MSM_WAIT_FENCE, &wait_req, sizeof(wait_req)); in device_submit_cmdstreams()
608 if (ret && (ret != -ETIMEDOUT)) { in device_submit_cmdstreams()
612 u_vector_finish(&dev->cmdstreams); in device_submit_cmdstreams()
613 u_vector_init(&dev->cmdstreams, 8, sizeof(struct cmdstream)); in device_submit_cmdstreams()
615 device_print_shader_log(dev); in device_submit_cmdstreams()
616 device_print_cp_log(dev); in device_submit_cmdstreams()
618 device_dump_wrbuf(dev); in device_submit_cmdstreams()
619 u_vector_finish(&dev->wrbufs); in device_submit_cmdstreams()
620 u_vector_init(&dev->wrbufs, 8, sizeof(struct wrbuf)); in device_submit_cmdstreams()
622 device_free_buffers(dev); in device_submit_cmdstreams()
626 buffer_mem_alloc(struct device *dev, struct buffer *buf) in buffer_mem_alloc() argument
628 bool success = util_vma_heap_alloc_addr(&dev->vma, buf->iova, buf->size); in buffer_mem_alloc()
632 if (!dev->has_set_iova) { in buffer_mem_alloc()
633 uint64_t offset = buf->iova - dev->va_iova; in buffer_mem_alloc()
634 assert(offset < FAKE_ADDRESS_SPACE_SIZE && (offset + buf->size) <= FAKE_ADDRESS_SPACE_SIZE); in buffer_mem_alloc()
635 buf->map = ((uint8_t*)dev->va_map) + offset; in buffer_mem_alloc()
640 struct drm_msm_gem_new req = {.size = buf->size, .flags = MSM_BO_WC}; in buffer_mem_alloc()
643 drmCommandWriteRead(dev->fd, DRM_MSM_GEM_NEW, &req, sizeof(req)); in buffer_mem_alloc()
648 buf->gem_handle = req.handle; in buffer_mem_alloc()
653 .handle = buf->gem_handle, in buffer_mem_alloc()
655 .value = buf->iova, in buffer_mem_alloc()
659 drmCommandWriteRead(dev->fd, DRM_MSM_GEM_INFO, &req, sizeof(req)); in buffer_mem_alloc()
668 .handle = buf->gem_handle, in buffer_mem_alloc()
673 drmCommandWriteRead(dev->fd, DRM_MSM_GEM_INFO, &req, sizeof(req)); in buffer_mem_alloc()
678 void *map = mmap(0, buf->size, PROT_READ | PROT_WRITE, MAP_SHARED, in buffer_mem_alloc()
679 dev->fd, req.value); in buffer_mem_alloc()
684 buf->map = map; in buffer_mem_alloc()
689 buffer_mem_free(struct device *dev, struct buffer *buf) in buffer_mem_free() argument
691 if (dev->has_set_iova) { in buffer_mem_free()
692 munmap(buf->map, buf->size); in buffer_mem_free()
695 .handle = buf->gem_handle, in buffer_mem_free()
697 .value = 0, in buffer_mem_free()
700 int ret = drmCommandWriteRead(dev->fd, DRM_MSM_GEM_INFO, &req_iova, in buffer_mem_free()
702 if (ret < 0) { in buffer_mem_free()
703 err(1, "MSM_INFO_SET_IOVA(0) failed! %d", ret); in buffer_mem_free()
708 .handle = buf->gem_handle, in buffer_mem_free()
710 drmIoctl(dev->fd, DRM_IOCTL_GEM_CLOSE, &req); in buffer_mem_free()
713 util_vma_heap_free(&dev->vma, buf->iova, buf->size); in buffer_mem_free()
724 } while (ret == -1 && (errno == EINTR || errno == EAGAIN)); in safe_ioctl()
732 struct device *dev = calloc(sizeof(struct device), 1); in device_create() local
734 static const char path[] = "/dev/kgsl-3d0"; in device_create()
736 dev->fd = open(path, O_RDWR | O_CLOEXEC); in device_create()
737 if (dev->fd < 0) { in device_create()
746 int ret = safe_ioctl(dev->fd, IOCTL_KGSL_GPUMEM_ALLOC_ID, &req); in device_create()
751 dev->va_id = req.id; in device_create()
752 dev->va_iova = req.gpuaddr; in device_create()
753 dev->va_map = mmap(0, FAKE_ADDRESS_SPACE_SIZE, PROT_READ | PROT_WRITE, in device_create()
754 MAP_SHARED, dev->fd, req.id << 12); in device_create()
756 rb_tree_init(&dev->buffers); in device_create()
757 util_vma_heap_init(&dev->vma, req.gpuaddr, ROUND_DOWN_TO(FAKE_ADDRESS_SPACE_SIZE, 4096)); in device_create()
758 u_vector_init(&dev->cmdstreams, 8, sizeof(struct cmdstream)); in device_create()
759 u_vector_init(&dev->wrbufs, 8, sizeof(struct wrbuf)); in device_create()
767 ret = safe_ioctl(dev->fd, IOCTL_KGSL_DRAWCTXT_CREATE, &drawctxt_req); in device_create()
772 printf("Allocated iova %" PRIx64 "\n", dev->va_iova); in device_create()
774 dev->context_id = drawctxt_req.drawctxt_id; in device_create()
776 return dev; in device_create()
780 device_submit_cmdstreams(struct device *dev) in device_submit_cmdstreams() argument
782 if (!u_vector_length(&dev->cmdstreams)) { in device_submit_cmdstreams()
783 device_free_buffers(dev); in device_submit_cmdstreams()
787 struct kgsl_command_object cmds[u_vector_length(&dev->cmdstreams)]; in device_submit_cmdstreams()
789 uint32_t idx = 0; in device_submit_cmdstreams()
791 u_vector_foreach(cmd, &dev->cmdstreams) { in device_submit_cmdstreams()
793 submit_cmd->gpuaddr = cmd->iova; in device_submit_cmdstreams()
794 submit_cmd->size = cmd->size; in device_submit_cmdstreams()
795 submit_cmd->flags = KGSL_CMDLIST_IB; in device_submit_cmdstreams()
796 submit_cmd->id = dev->va_id; in device_submit_cmdstreams()
803 .numcmds = u_vector_length(&dev->cmdstreams), in device_submit_cmdstreams()
804 .numsyncs = 0, in device_submit_cmdstreams()
805 .context_id = dev->context_id, in device_submit_cmdstreams()
808 int ret = safe_ioctl(dev->fd, IOCTL_KGSL_GPU_COMMAND, &submit_req); in device_submit_cmdstreams()
815 .context_id = dev->context_id, in device_submit_cmdstreams()
820 ret = safe_ioctl(dev->fd, IOCTL_KGSL_DEVICE_WAITTIMESTAMP_CTXTID, &wait); in device_submit_cmdstreams()
826 u_vector_finish(&dev->cmdstreams); in device_submit_cmdstreams()
827 u_vector_init(&dev->cmdstreams, 8, sizeof(struct cmdstream)); in device_submit_cmdstreams()
829 device_print_shader_log(dev); in device_submit_cmdstreams()
830 device_print_cp_log(dev); in device_submit_cmdstreams()
832 device_dump_wrbuf(dev); in device_submit_cmdstreams()
833 u_vector_finish(&dev->wrbufs); in device_submit_cmdstreams()
834 u_vector_init(&dev->wrbufs, 8, sizeof(struct wrbuf)); in device_submit_cmdstreams()
836 device_free_buffers(dev); in device_submit_cmdstreams()
840 buffer_mem_alloc(struct device *dev, struct buffer *buf) in buffer_mem_alloc() argument
842 bool success = util_vma_heap_alloc_addr(&dev->vma, buf->iova, buf->size); in buffer_mem_alloc()
846 buf->map = ((uint8_t*)dev->va_map) + (buf->iova - dev->va_iova); in buffer_mem_alloc()
850 buffer_mem_free(struct device *dev, struct buffer *buf) in buffer_mem_free() argument
852 util_vma_heap_free(&dev->vma, buf->iova, buf->size); in buffer_mem_free()
863 } while (ret == -1 && (errno == EINTR || errno == EAGAIN)); in safe_ioctl()
911 /* It seems that priv data can have several sub-datas
935 static_assert(offsetof(struct submit_priv_data, data0) == 0x34);
936 static_assert(offsetof(struct submit_priv_data, data0.cmdbuf.ibs) == 0x8c);
941 struct device *dev = calloc(sizeof(struct device), 1); in device_create() local
943 static const char path[] = "/dev/dxg"; in device_create()
945 dev->fd = open(path, O_RDWR | O_CLOEXEC); in device_create()
946 if (dev->fd < 0) { in device_create()
947 errx(1, "Cannot open /dev/dxg fd"); in device_create()
955 int ret = safe_ioctl(dev->fd, LX_DXENUMADAPTERS3, &enum_adapters); in device_create()
960 if (enum_adapters.adapter_count == 0) { in device_create()
964 struct winluid adapter_luid = enum_adapters.adapters[0].adapter_luid; in device_create()
969 ret = safe_ioctl(dev->fd, LX_DXOPENADAPTERFROMLUID, &open_adapter); in device_create()
979 ret = safe_ioctl(dev->fd, LX_DXCREATEDEVICE, &create_device); in device_create()
985 dev->device = device; in device_create()
988 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, in device_create()
989 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, in device_create()
990 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x0c, 0x00, 0x00, 0x00, in device_create()
991 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, in device_create()
992 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, in device_create()
993 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, in device_create()
998 .node_ordinal = 0, in device_create()
1004 ret = safe_ioctl(dev->fd, LX_DXCREATECONTEXTVIRTUAL, &create_context); in device_create()
1009 dev->context = create_context.context; in device_create()
1014 .physical_adapter_index = 0, in device_create()
1016 ret = safe_ioctl(dev->fd, LX_DXCREATEPAGINGQUEUE, &create_paging_queue); in device_create()
1051 ret = safe_ioctl(dev->fd, LX_DXCREATEALLOCATION, &create_allocation); in device_create()
1062 .allocation = create_allocation.allocation_info[0].allocation, in device_create()
1069 ret = safe_ioctl(dev->fd, LX_DXMAPGPUVIRTUALADDRESS, &map_virtual_address); in device_create()
1074 __u32 priority = 0; in device_create()
1078 .allocation_list = &create_allocation.allocation_info[0].allocation, in device_create()
1081 ret = safe_ioctl(dev->fd, LX_DXMAKERESIDENT, &make_resident); in device_create()
1088 .allocation = create_allocation.allocation_info[0].allocation, in device_create()
1090 ret = safe_ioctl(dev->fd, LX_DXLOCK2, &lock); in device_create()
1095 dev->va_iova = map_virtual_address.virtual_address; in device_create()
1096 dev->va_map = lock.data; in device_create()
1098 rb_tree_init(&dev->buffers); in device_create()
1099 util_vma_heap_init(&dev->vma, dev->va_iova, ROUND_DOWN_TO(alloc_size, 4096)); in device_create()
1100 u_vector_init(&dev->cmdstreams, 8, sizeof(struct cmdstream)); in device_create()
1101 u_vector_init(&dev->wrbufs, 8, sizeof(struct wrbuf)); in device_create()
1103 printf("Allocated iova at 0x%" PRIx64 "\n", dev->va_iova); in device_create()
1106 dev->vma.alloc_high = true; in device_create()
1107 dev->fence_iova = util_vma_heap_alloc(&dev->vma, hole_size, 4096); in device_create()
1108 dev->fence_ib_iova = dev->fence_iova + 8; in device_create()
1109 dev->fence = (uint32_t *) ((uint8_t*)dev->va_map + (dev->fence_iova - dev->va_iova)); in device_create()
1110 dev->fence_ib = (uint32_t *) ((uint8_t*)dev->va_map + (dev->fence_ib_iova - dev->va_iova)); in device_create()
1111 dev->vma.alloc_high = false; in device_create()
1113 return dev; in device_create()
1117 device_submit_cmdstreams(struct device *dev) in device_submit_cmdstreams() argument
1119 if (!u_vector_length(&dev->cmdstreams)) { in device_submit_cmdstreams()
1120 device_free_buffers(dev); in device_submit_cmdstreams()
1124 uint32_t cmdstream_count = u_vector_length(&dev->cmdstreams) + 1; in device_submit_cmdstreams()
1131 priv_data->magic0 = 0xccaabbee; in device_submit_cmdstreams()
1132 priv_data->struct_size = priv_data_size; in device_submit_cmdstreams()
1133 priv_data->datas_count = 1; in device_submit_cmdstreams()
1135 priv_data->data0.magic1 = 0xfadcab02; in device_submit_cmdstreams()
1136 priv_data->data0.data_size = in device_submit_cmdstreams()
1137 sizeof(priv_data->data0) + in device_submit_cmdstreams()
1139 priv_data->data0.cmdbuf.unk1 = 0xcccc0001; in device_submit_cmdstreams()
1140 priv_data->data0.cmdbuf.cmdbuf_size = sizeof(priv_data->data0.cmdbuf) + in device_submit_cmdstreams()
1142 priv_data->data0.cmdbuf.ib_count = cmdstream_count; in device_submit_cmdstreams()
1145 uint32_t idx = 0; in device_submit_cmdstreams()
1146 u_vector_foreach(cmd, &dev->cmdstreams) { in device_submit_cmdstreams()
1147 priv_data->data0.cmdbuf.ibs[idx].size_dwords = cmd->size / 4; in device_submit_cmdstreams()
1148 priv_data->data0.cmdbuf.ibs[idx].iova = cmd->iova; in device_submit_cmdstreams()
1152 priv_data->data0.cmdbuf.ibs[idx].size_dwords = 4; in device_submit_cmdstreams()
1153 priv_data->data0.cmdbuf.ibs[idx].iova = dev->fence_ib_iova; in device_submit_cmdstreams()
1155 *dev->fence = 0x00000000; in device_submit_cmdstreams()
1156 dev->fence_ib[0] = pm4_pkt7_hdr(0x3d, 3); // CP_MEM_WRITE in device_submit_cmdstreams()
1157 dev->fence_ib[1] = dev->fence_iova; in device_submit_cmdstreams()
1158 dev->fence_ib[2] = dev->fence_iova >> 32; in device_submit_cmdstreams()
1159 dev->fence_ib[3] = 0xababfcfc; in device_submit_cmdstreams()
1162 // uint32_t *magic_end = (uint32_t *)(((char *) priv_data) + priv_data_size - 8); in device_submit_cmdstreams()
1163 // magic_end[0] = 0xfadcab00; in device_submit_cmdstreams()
1164 // magic_end[1] = 0x00000008; in device_submit_cmdstreams()
1167 .command_buffer = priv_data->data0.cmdbuf.ibs[0].iova, in device_submit_cmdstreams()
1168 .command_length = priv_data->data0.cmdbuf.ibs[0].size_dwords * sizeof(uint32_t), in device_submit_cmdstreams()
1170 .broadcast_context[0] = dev->context, in device_submit_cmdstreams()
1175 int ret = safe_ioctl(dev->fd, LX_DXSUBMITCOMMAND, &submission); in device_submit_cmdstreams()
1182 u_vector_finish(&dev->cmdstreams); in device_submit_cmdstreams()
1183 u_vector_init(&dev->cmdstreams, 8, sizeof(struct cmdstream)); in device_submit_cmdstreams()
1186 for (unsigned i = 0; i < 1000; i++) { in device_submit_cmdstreams()
1188 if (*dev->fence != 0) in device_submit_cmdstreams()
1191 if (*dev->fence == 0) { in device_submit_cmdstreams()
1195 device_print_shader_log(dev); in device_submit_cmdstreams()
1196 device_print_cp_log(dev); in device_submit_cmdstreams()
1198 device_dump_wrbuf(dev); in device_submit_cmdstreams()
1199 u_vector_finish(&dev->wrbufs); in device_submit_cmdstreams()
1200 u_vector_init(&dev->wrbufs, 8, sizeof(struct wrbuf)); in device_submit_cmdstreams()
1202 device_free_buffers(dev); in device_submit_cmdstreams()
1206 buffer_mem_alloc(struct device *dev, struct buffer *buf) in buffer_mem_alloc() argument
1208 bool success = util_vma_heap_alloc_addr(&dev->vma, buf->iova, buf->size); in buffer_mem_alloc()
1212 buf->map = ((uint8_t*)dev->va_map) + (buf->iova - dev->va_iova); in buffer_mem_alloc()
1216 buffer_mem_free(struct device *dev, struct buffer *buf) in buffer_mem_free() argument
1218 util_vma_heap_free(&dev->vma, buf->iova, buf->size); in buffer_mem_free()
1224 upload_buffer(struct device *dev, uint64_t iova, unsigned int size, in upload_buffer() argument
1227 struct buffer *buf = device_get_buffer(dev, iova); in upload_buffer()
1231 buf->iova = iova; in upload_buffer()
1232 buf->size = size; in upload_buffer()
1234 rb_tree_insert(&dev->buffers, &buf->node, rb_buffer_insert_cmp); in upload_buffer()
1236 buffer_mem_alloc(dev, buf); in upload_buffer()
1237 } else if (buf->size != size) { in upload_buffer()
1238 buffer_mem_free(dev, buf); in upload_buffer()
1239 buf->size = size; in upload_buffer()
1240 buffer_mem_alloc(dev, buf); in upload_buffer()
1243 memcpy(buf->map, hostptr, size); in upload_buffer()
1245 buf->used = true; in upload_buffer()
1249 override_cmdstream(struct device *dev, struct cmdstream *cs, in override_cmdstream() argument
1262 uint64_t hole_size = util_vma_heap_get_max_free_continuous_size(&dev->vma); in override_cmdstream()
1263 uint64_t hole_iova = util_vma_heap_alloc(&dev->vma, hole_size, 1); in override_cmdstream()
1264 util_vma_heap_free(&dev->vma, hole_iova, hole_size); in override_cmdstream()
1268 "%s --vastart=%" PRIu64 " --vasize=%" PRIu64 " %s", cmdstreamgen, in override_cmdstream()
1276 return -1; in override_cmdstream()
1280 struct rd_parsed_section ps = {0}; in override_cmdstream()
1285 return -1; in override_cmdstream()
1291 } gpuaddr = {0}; in override_cmdstream()
1297 /* no-op */ in override_cmdstream()
1300 upload_buffer(dev, gpuaddr.gpuaddr, gpuaddr.len, ps.buf); in override_cmdstream()
1309 cs->iova = gpuaddr; in override_cmdstream()
1310 cs->size = sizedwords * sizeof(uint32_t); in override_cmdstream()
1315 parse_addr(ps.buf, ps.sz, &sizedwords, &dev->shader_log_iova); in override_cmdstream()
1320 parse_addr(ps.buf, ps.sz, &sizedwords, &dev->cp_log_iova); in override_cmdstream()
1324 struct wrbuf *wrbuf = u_vector_add(&dev->wrbufs); in override_cmdstream()
1326 wrbuf->iova = p[0]; in override_cmdstream()
1327 wrbuf->size = p[1]; in override_cmdstream()
1329 int name_len = ps.sz - (3 * sizeof(uint64_t)); in override_cmdstream()
1330 wrbuf->name = calloc(sizeof(char), name_len); in override_cmdstream()
1331 memcpy(wrbuf->name, (char*)(p + 3), name_len); // includes null terminator in override_cmdstream()
1334 struct buffer *buf = device_get_buffer(dev, wrbuf->iova); in override_cmdstream()
1337 uint64_t offset = wrbuf->iova - buf->iova; in override_cmdstream()
1338 uint64_t end = MIN2(offset + wrbuf->size, buf->size); in override_cmdstream()
1340 static const uint64_t clear_value = 0xdeadbeefdeadbeef; in override_cmdstream()
1341 memcpy(buf->map + offset, &clear_value, in override_cmdstream()
1342 MIN2(sizeof(clear_value), end - offset)); in override_cmdstream()
1355 if (ps.ret < 0) { in override_cmdstream()
1367 int submit = 0; in handle_file()
1370 struct rd_parsed_section ps = {0}; in handle_file()
1374 if (!strcmp(filename, "-")) in handle_file()
1375 io = io_openfd(0); in handle_file()
1381 return -1; in handle_file()
1384 struct device *dev = device_create(base_addr); in handle_file() local
1389 } gpuaddr = {0}; in handle_file()
1396 /* no-op */ in handle_file()
1406 skip |= ((char *)ps.buf)[0] == 'X'; in handle_file()
1413 device_submit_cmdstreams(dev); in handle_file()
1417 /* no-op */ in handle_file()
1426 upload_buffer(dev, gpuaddr.gpuaddr, gpuaddr.len, ps.buf); in handle_file()
1438 struct cmdstream *cs = u_vector_add(&dev->cmdstreams); in handle_file()
1441 if (override_cmdstream(dev, cs, cmdstreamgen) < 0) in handle_file()
1444 cs->iova = gpuaddr; in handle_file()
1445 cs->size = sizedwords * sizeof(uint32_t); in handle_file()
1462 printf("chip_id: 0x%" PRIx64 "\n", chip_id); in handle_file()
1471 device_submit_cmdstreams(dev); in handle_file()
1473 close(dev->fd); in handle_file()
1478 if (ps.ret < 0) { in handle_file()
1481 return 0; in handle_file()