|
@@ -99,7 +99,7 @@ static bool initialize(struct kernel_queue *kq, struct kfd_dev *dev,
|
|
|
kq->rptr_kernel = kq->rptr_mem->cpu_ptr;
|
|
|
kq->rptr_gpu_addr = kq->rptr_mem->gpu_addr;
|
|
|
|
|
|
- retval = kfd_gtt_sa_allocate(dev, sizeof(*kq->wptr_kernel),
|
|
|
+ retval = kfd_gtt_sa_allocate(dev, dev->device_info->doorbell_size,
|
|
|
&kq->wptr_mem);
|
|
|
|
|
|
if (retval != 0)
|
|
@@ -208,6 +208,7 @@ static int acquire_packet_buffer(struct kernel_queue *kq,
|
|
|
size_t available_size;
|
|
|
size_t queue_size_dwords;
|
|
|
uint32_t wptr, rptr;
|
|
|
+ uint64_t wptr64;
|
|
|
unsigned int *queue_address;
|
|
|
|
|
|
/* When rptr == wptr, the buffer is empty.
|
|
@@ -216,7 +217,8 @@ static int acquire_packet_buffer(struct kernel_queue *kq,
|
|
|
* the opposite. So we can only use up to queue_size_dwords - 1 dwords.
|
|
|
*/
|
|
|
rptr = *kq->rptr_kernel;
|
|
|
- wptr = *kq->wptr_kernel;
|
|
|
+ wptr = kq->pending_wptr;
|
|
|
+ wptr64 = kq->pending_wptr64;
|
|
|
queue_address = (unsigned int *)kq->pq_kernel_addr;
|
|
|
queue_size_dwords = kq->queue->properties.queue_size / 4;
|
|
|
|
|
@@ -246,11 +248,13 @@ static int acquire_packet_buffer(struct kernel_queue *kq,
|
|
|
while (wptr > 0) {
|
|
|
queue_address[wptr] = kq->nop_packet;
|
|
|
wptr = (wptr + 1) % queue_size_dwords;
|
|
|
+ wptr64++;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
*buffer_ptr = &queue_address[wptr];
|
|
|
kq->pending_wptr = wptr + packet_size_in_dwords;
|
|
|
+ kq->pending_wptr64 = wptr64 + packet_size_in_dwords;
|
|
|
|
|
|
return 0;
|
|
|
|
|
@@ -272,14 +276,18 @@ static void submit_packet(struct kernel_queue *kq)
|
|
|
pr_debug("\n");
|
|
|
#endif
|
|
|
|
|
|
- *kq->wptr_kernel = kq->pending_wptr;
|
|
|
- write_kernel_doorbell(kq->queue->properties.doorbell_ptr,
|
|
|
- kq->pending_wptr);
|
|
|
+ kq->ops_asic_specific.submit_packet(kq);
|
|
|
}
|
|
|
|
|
|
static void rollback_packet(struct kernel_queue *kq)
|
|
|
{
|
|
|
- kq->pending_wptr = *kq->wptr_kernel;
|
|
|
+ if (kq->dev->device_info->doorbell_size == 8) {
|
|
|
+ kq->pending_wptr64 = *kq->wptr64_kernel;
|
|
|
+ kq->pending_wptr = *kq->wptr_kernel %
|
|
|
+ (kq->queue->properties.queue_size / 4);
|
|
|
+ } else {
|
|
|
+ kq->pending_wptr = *kq->wptr_kernel;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
struct kernel_queue *kernel_queue_init(struct kfd_dev *dev,
|
|
@@ -310,6 +318,11 @@ struct kernel_queue *kernel_queue_init(struct kfd_dev *dev,
|
|
|
case CHIP_HAWAII:
|
|
|
kernel_queue_init_cik(&kq->ops_asic_specific);
|
|
|
break;
|
|
|
+
|
|
|
+ case CHIP_VEGA10:
|
|
|
+ case CHIP_RAVEN:
|
|
|
+ kernel_queue_init_v9(&kq->ops_asic_specific);
|
|
|
+ break;
|
|
|
default:
|
|
|
WARN(1, "Unexpected ASIC family %u",
|
|
|
dev->device_info->asic_family);
|