diff options
Diffstat (limited to 'drivers/misc/habanalabs/hw_queue.c')
| -rw-r--r-- | drivers/misc/habanalabs/hw_queue.c | 46 | 
1 files changed, 32 insertions, 14 deletions
diff --git a/drivers/misc/habanalabs/hw_queue.c b/drivers/misc/habanalabs/hw_queue.c index ef3bb6951360..2894d8975933 100644 --- a/drivers/misc/habanalabs/hw_queue.c +++ b/drivers/misc/habanalabs/hw_queue.c @@ -82,7 +82,7 @@ static void ext_queue_submit_bd(struct hl_device *hdev, struct hl_hw_queue *q,  	bd += hl_pi_2_offset(q->pi);  	bd->ctl = __cpu_to_le32(ctl);  	bd->len = __cpu_to_le32(len); -	bd->ptr = __cpu_to_le64(ptr + hdev->asic_prop.host_phys_base_address); +	bd->ptr = __cpu_to_le64(ptr);  	q->pi = hl_queue_inc_ptr(q->pi);  	hdev->asic_funcs->ring_doorbell(hdev, q->hw_queue_id, q->pi); @@ -263,9 +263,7 @@ static void ext_hw_queue_schedule_job(struct hl_cs_job *job)  	 * checked in hl_queue_sanity_checks  	 */  	cq = &hdev->completion_queue[q->hw_queue_id]; -	cq_addr = cq->bus_address + -			hdev->asic_prop.host_phys_base_address; -	cq_addr += cq->pi * sizeof(struct hl_cq_entry); +	cq_addr = cq->bus_address + cq->pi * sizeof(struct hl_cq_entry);  	hdev->asic_funcs->add_end_of_cb_packets(cb->kernel_address, len,  						cq_addr, @@ -415,14 +413,20 @@ void hl_hw_queue_inc_ci_kernel(struct hl_device *hdev, u32 hw_queue_id)  }  static int ext_and_cpu_hw_queue_init(struct hl_device *hdev, -					struct hl_hw_queue *q) +				struct hl_hw_queue *q, bool is_cpu_queue)  {  	void *p;  	int rc; -	p = hdev->asic_funcs->dma_alloc_coherent(hdev, -				HL_QUEUE_SIZE_IN_BYTES, -				&q->bus_address, GFP_KERNEL | __GFP_ZERO); +	if (is_cpu_queue) +		p = hdev->asic_funcs->cpu_accessible_dma_pool_alloc(hdev, +							HL_QUEUE_SIZE_IN_BYTES, +							&q->bus_address); +	else +		p = hdev->asic_funcs->asic_dma_alloc_coherent(hdev, +						HL_QUEUE_SIZE_IN_BYTES, +						&q->bus_address, +						GFP_KERNEL | __GFP_ZERO);  	if (!p)  		return -ENOMEM; @@ -446,8 +450,15 @@ static int ext_and_cpu_hw_queue_init(struct hl_device *hdev,  	return 0;  free_queue: -	hdev->asic_funcs->dma_free_coherent(hdev, HL_QUEUE_SIZE_IN_BYTES, -			(void *) (uintptr_t) q->kernel_address, q->bus_address); +	if (is_cpu_queue) +		hdev->asic_funcs->cpu_accessible_dma_pool_free(hdev, +					HL_QUEUE_SIZE_IN_BYTES, +					(void *) (uintptr_t) q->kernel_address); +	else +		hdev->asic_funcs->asic_dma_free_coherent(hdev, +					HL_QUEUE_SIZE_IN_BYTES, +					(void *) (uintptr_t) q->kernel_address, +					q->bus_address);  	return rc;  } @@ -474,12 +485,12 @@ static int int_hw_queue_init(struct hl_device *hdev, struct hl_hw_queue *q)  static int cpu_hw_queue_init(struct hl_device *hdev, struct hl_hw_queue *q)  { -	return ext_and_cpu_hw_queue_init(hdev, q); +	return ext_and_cpu_hw_queue_init(hdev, q, true);  }  static int ext_hw_queue_init(struct hl_device *hdev, struct hl_hw_queue *q)  { -	return ext_and_cpu_hw_queue_init(hdev, q); +	return ext_and_cpu_hw_queue_init(hdev, q, false);  }  /* @@ -569,8 +580,15 @@ static void hw_queue_fini(struct hl_device *hdev, struct hl_hw_queue *q)  	kfree(q->shadow_queue); -	hdev->asic_funcs->dma_free_coherent(hdev, HL_QUEUE_SIZE_IN_BYTES, -			(void *) (uintptr_t) q->kernel_address, q->bus_address); +	if (q->queue_type == QUEUE_TYPE_CPU) +		hdev->asic_funcs->cpu_accessible_dma_pool_free(hdev, +					HL_QUEUE_SIZE_IN_BYTES, +					(void *) (uintptr_t) q->kernel_address); +	else +		hdev->asic_funcs->asic_dma_free_coherent(hdev, +					HL_QUEUE_SIZE_IN_BYTES, +					(void *) (uintptr_t) q->kernel_address, +					q->bus_address);  }  int hl_hw_queues_create(struct hl_device *hdev)  |