static int dbgdev_register_diq(struct kfd_dbgdev *dbgdev) { struct queue_properties properties; unsigned int qid; struct kernel_queue *kq = NULL; int status; BUG_ON(!dbgdev || !dbgdev->pqm || !dbgdev->dev); status = pqm_create_queue(dbgdev->pqm, dbgdev->dev, NULL, &properties, 0, KFD_QUEUE_TYPE_DIQ, &qid); if (status) { pr_err("amdkfd: Failed to create DIQ\n"); return status; } pr_debug("DIQ Created with queue id: %d\n", qid); kq = pqm_get_kernel_queue(dbgdev->pqm, qid); if (kq == NULL) { pr_err("amdkfd: Error getting DIQ\n"); pqm_destroy_queue(dbgdev->pqm, qid); return -EFAULT; } dbgdev->kq = kq; return status; }
static int dbgdev_unregister_diq(struct kfd_dbgdev *dbgdev) { /* todo - disable address watch */ int status; BUG_ON(!dbgdev || !dbgdev->pqm || !dbgdev->kq); status = pqm_destroy_queue(dbgdev->pqm, dbgdev->kq->queue->properties.queue_id); dbgdev->kq = NULL; return status; }
static int kfd_ioctl_destroy_queue(struct file *filp, struct kfd_process *p, void *data) { int retval; struct kfd_ioctl_destroy_queue_args *args = data; pr_debug("kfd: destroying queue id %d for PASID %d\n", args->queue_id, p->pasid); mutex_lock(&p->mutex); retval = pqm_destroy_queue(&p->pqm, args->queue_id); mutex_unlock(&p->mutex); return retval; }
static int kfd_ioctl_destroy_queue(struct file *filp, struct kfd_process *p, void __user *arg) { int retval; struct kfd_ioctl_destroy_queue_args args; if (copy_from_user(&args, arg, sizeof(args))) return -EFAULT; pr_debug("kfd: destroying queue id %d for PASID %d\n", args.queue_id, p->pasid); mutex_lock(&p->mutex); retval = pqm_destroy_queue(&p->pqm, args.queue_id); mutex_unlock(&p->mutex); return retval; }
static long kfd_ioctl_create_queue(struct file *filep, struct kfd_process *p, void __user *arg) { struct kfd_ioctl_create_queue_args args; struct kfd_dev *dev; int err = 0; unsigned int queue_id; struct kfd_process_device *pdd; struct queue_properties q_properties; memset(&q_properties, 0, sizeof(struct queue_properties)); if (copy_from_user(&args, arg, sizeof(args))) return -EFAULT; pr_debug("kfd: creating queue ioctl\n"); err = set_queue_properties_from_user(&q_properties, &args); if (err) return err; dev = kfd_device_by_id(args.gpu_id); if (dev == NULL) return -EINVAL; mutex_lock(&p->mutex); pdd = kfd_bind_process_to_device(dev, p); if (IS_ERR(pdd)) { err = PTR_ERR(pdd); goto err_bind_process; } pr_debug("kfd: creating queue for PASID %d on GPU 0x%x\n", p->pasid, dev->id); err = pqm_create_queue(&p->pqm, dev, filep, &q_properties, 0, KFD_QUEUE_TYPE_COMPUTE, &queue_id); if (err != 0) goto err_create_queue; args.queue_id = queue_id; /* Return gpu_id as doorbell offset for mmap usage */ args.doorbell_offset = args.gpu_id << PAGE_SHIFT; if (copy_to_user(arg, &args, sizeof(args))) { err = -EFAULT; goto err_copy_args_out; } mutex_unlock(&p->mutex); pr_debug("kfd: queue id %d was created successfully\n", args.queue_id); pr_debug("ring buffer address == 0x%016llX\n", args.ring_base_address); pr_debug("read ptr address == 0x%016llX\n", args.read_pointer_address); pr_debug("write ptr address == 0x%016llX\n", args.write_pointer_address); return 0; err_copy_args_out: pqm_destroy_queue(&p->pqm, queue_id); err_create_queue: err_bind_process: mutex_unlock(&p->mutex); return err; }