diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdkfd/kfd_chardev.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdkfd/kfd_chardev.c | 122 | 
1 files changed, 50 insertions, 72 deletions
| diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c index 8cc51cec988a..43de260b2230 100644 --- a/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c +++ b/drivers/gpu/drm/amd/amdkfd/kfd_chardev.c @@ -556,11 +556,7 @@ static int kfd_ioctl_set_trap_handler(struct file *filep,  		goto out;  	} -	if (dev->dqm->ops.set_trap_handler(dev->dqm, -					&pdd->qpd, -					args->tba_addr, -					args->tma_addr)) -		err = -EINVAL; +	kfd_process_set_trap_handler(&pdd->qpd, args->tba_addr, args->tma_addr);  out:  	mutex_unlock(&p->mutex); @@ -874,52 +870,47 @@ static int kfd_ioctl_get_process_apertures(struct file *filp,  {  	struct kfd_ioctl_get_process_apertures_args *args = data;  	struct kfd_process_device_apertures *pAperture; -	struct kfd_process_device *pdd; +	int i;  	dev_dbg(kfd_device, "get apertures for PASID 0x%x", p->pasid);  	args->num_of_nodes = 0;  	mutex_lock(&p->mutex); +	/* Run over all pdd of the process */ +	for (i = 0; i < p->n_pdds; i++) { +		struct kfd_process_device *pdd = p->pdds[i]; + +		pAperture = +			&args->process_apertures[args->num_of_nodes]; +		pAperture->gpu_id = pdd->dev->id; +		pAperture->lds_base = pdd->lds_base; +		pAperture->lds_limit = pdd->lds_limit; +		pAperture->gpuvm_base = pdd->gpuvm_base; +		pAperture->gpuvm_limit = pdd->gpuvm_limit; +		pAperture->scratch_base = pdd->scratch_base; +		pAperture->scratch_limit = pdd->scratch_limit; -	/*if the process-device list isn't empty*/ -	if (kfd_has_process_device_data(p)) { -		/* Run over all pdd of the process */ -		pdd = kfd_get_first_process_device_data(p); -		do { -			pAperture = -				&args->process_apertures[args->num_of_nodes]; -			pAperture->gpu_id = pdd->dev->id; -			pAperture->lds_base = pdd->lds_base; -			pAperture->lds_limit = pdd->lds_limit; -			pAperture->gpuvm_base = pdd->gpuvm_base; -			pAperture->gpuvm_limit = pdd->gpuvm_limit; -			pAperture->scratch_base = pdd->scratch_base; -			pAperture->scratch_limit = pdd->scratch_limit; - -			dev_dbg(kfd_device, -				"node id %u\n", args->num_of_nodes); -			dev_dbg(kfd_device, -				"gpu id %u\n", pdd->dev->id); -			dev_dbg(kfd_device, -				"lds_base %llX\n", pdd->lds_base); -			dev_dbg(kfd_device, -				"lds_limit %llX\n", pdd->lds_limit); -			dev_dbg(kfd_device, -				"gpuvm_base %llX\n", pdd->gpuvm_base); -			dev_dbg(kfd_device, -				"gpuvm_limit %llX\n", pdd->gpuvm_limit); -			dev_dbg(kfd_device, -				"scratch_base %llX\n", pdd->scratch_base); -			dev_dbg(kfd_device, -				"scratch_limit %llX\n", pdd->scratch_limit); - -			args->num_of_nodes++; - -			pdd = kfd_get_next_process_device_data(p, pdd); -		} while (pdd && (args->num_of_nodes < NUM_OF_SUPPORTED_GPUS)); -	} +		dev_dbg(kfd_device, +			"node id %u\n", args->num_of_nodes); +		dev_dbg(kfd_device, +			"gpu id %u\n", pdd->dev->id); +		dev_dbg(kfd_device, +			"lds_base %llX\n", pdd->lds_base); +		dev_dbg(kfd_device, +			"lds_limit %llX\n", pdd->lds_limit); +		dev_dbg(kfd_device, +			"gpuvm_base %llX\n", pdd->gpuvm_base); +		dev_dbg(kfd_device, +			"gpuvm_limit %llX\n", pdd->gpuvm_limit); +		dev_dbg(kfd_device, +			"scratch_base %llX\n", pdd->scratch_base); +		dev_dbg(kfd_device, +			"scratch_limit %llX\n", pdd->scratch_limit); +		if (++args->num_of_nodes >= NUM_OF_SUPPORTED_GPUS) +			break; +	}  	mutex_unlock(&p->mutex);  	return 0; @@ -930,9 +921,8 @@ static int kfd_ioctl_get_process_apertures_new(struct file *filp,  {  	struct kfd_ioctl_get_process_apertures_new_args *args = data;  	struct kfd_process_device_apertures *pa; -	struct kfd_process_device *pdd; -	uint32_t nodes = 0;  	int ret; +	int i;  	dev_dbg(kfd_device, "get apertures for PASID 0x%x", p->pasid); @@ -941,17 +931,7 @@ static int kfd_ioctl_get_process_apertures_new(struct file *filp,  		 * sufficient memory  		 */  		mutex_lock(&p->mutex); - -		if (!kfd_has_process_device_data(p)) -			goto out_unlock; - -		/* Run over all pdd of the process */ -		pdd = kfd_get_first_process_device_data(p); -		do { -			args->num_of_nodes++; -			pdd = kfd_get_next_process_device_data(p, pdd); -		} while (pdd); - +		args->num_of_nodes = p->n_pdds;  		goto out_unlock;  	} @@ -966,22 +946,23 @@ static int kfd_ioctl_get_process_apertures_new(struct file *filp,  	mutex_lock(&p->mutex); -	if (!kfd_has_process_device_data(p)) { +	if (!p->n_pdds) {  		args->num_of_nodes = 0;  		kfree(pa);  		goto out_unlock;  	}  	/* Run over all pdd of the process */ -	pdd = kfd_get_first_process_device_data(p); -	do { -		pa[nodes].gpu_id = pdd->dev->id; -		pa[nodes].lds_base = pdd->lds_base; -		pa[nodes].lds_limit = pdd->lds_limit; -		pa[nodes].gpuvm_base = pdd->gpuvm_base; -		pa[nodes].gpuvm_limit = pdd->gpuvm_limit; -		pa[nodes].scratch_base = pdd->scratch_base; -		pa[nodes].scratch_limit = pdd->scratch_limit; +	for (i = 0; i < min(p->n_pdds, args->num_of_nodes); i++) { +		struct kfd_process_device *pdd = p->pdds[i]; + +		pa[i].gpu_id = pdd->dev->id; +		pa[i].lds_base = pdd->lds_base; +		pa[i].lds_limit = pdd->lds_limit; +		pa[i].gpuvm_base = pdd->gpuvm_base; +		pa[i].gpuvm_limit = pdd->gpuvm_limit; +		pa[i].scratch_base = pdd->scratch_base; +		pa[i].scratch_limit = pdd->scratch_limit;  		dev_dbg(kfd_device,  			"gpu id %u\n", pdd->dev->id); @@ -997,17 +978,14 @@ static int kfd_ioctl_get_process_apertures_new(struct file *filp,  			"scratch_base %llX\n", pdd->scratch_base);  		dev_dbg(kfd_device,  			"scratch_limit %llX\n", pdd->scratch_limit); -		nodes++; - -		pdd = kfd_get_next_process_device_data(p, pdd); -	} while (pdd && (nodes < args->num_of_nodes)); +	}  	mutex_unlock(&p->mutex); -	args->num_of_nodes = nodes; +	args->num_of_nodes = i;  	ret = copy_to_user(  			(void __user *)args->kfd_process_device_apertures_ptr,  			pa, -			(nodes * sizeof(struct kfd_process_device_apertures))); +			(i * sizeof(struct kfd_process_device_apertures)));  	kfree(pa);  	return ret ? -EFAULT : 0; | 
