[PATCH 54/83] hsa/radeon: Switch to new queue scheduler

2014-07-10 Thread Oded Gabbay
From: Ben Goz 

This patch makes the switch between the old KFD queue scheduler to the new KFD
queue scheduler. The new scheduler supports H/W CP scheduling, over-subscription
of queues and pre-emption of queues.

Signed-off-by: Ben Goz 
Signed-off-by: Oded Gabbay 
---
 drivers/gpu/hsa/radeon/kfd_aperture.c  |   1 -
 drivers/gpu/hsa/radeon/kfd_chardev.c   | 107 +++--
 drivers/gpu/hsa/radeon/kfd_device.c|  31 ++
 drivers/gpu/hsa/radeon/kfd_interrupt.c |   4 +-
 drivers/gpu/hsa/radeon/kfd_priv.h  |   2 +
 drivers/gpu/hsa/radeon/kfd_process.c   |  56 -
 include/uapi/linux/kfd_ioctl.h |   4 +-
 7 files changed, 88 insertions(+), 117 deletions(-)

diff --git a/drivers/gpu/hsa/radeon/kfd_aperture.c 
b/drivers/gpu/hsa/radeon/kfd_aperture.c
index 9e2d6da..2c72b21 100644
--- a/drivers/gpu/hsa/radeon/kfd_aperture.c
+++ b/drivers/gpu/hsa/radeon/kfd_aperture.c
@@ -32,7 +32,6 @@
 #include 
 #include 
 #include "kfd_priv.h"
-#include "kfd_scheduler.h"
 #include 
 #include 
 #include 
diff --git a/drivers/gpu/hsa/radeon/kfd_chardev.c 
b/drivers/gpu/hsa/radeon/kfd_chardev.c
index 07cac88..bb2ef02 100644
--- a/drivers/gpu/hsa/radeon/kfd_chardev.c
+++ b/drivers/gpu/hsa/radeon/kfd_chardev.c
@@ -31,10 +31,11 @@
 #include 
 #include 
 #include "kfd_priv.h"
-#include "kfd_scheduler.h"
 #include 
 #include 
 #include 
+#include "kfd_hw_pointer_store.h"
+#include "kfd_device_queue_manager.h"
 
 static long kfd_ioctl(struct file *, unsigned int, unsigned long);
 static int kfd_open(struct inode *, struct file *);
@@ -128,24 +129,36 @@ kfd_ioctl_create_queue(struct file *filep, struct 
kfd_process *p, void __user *a
struct kfd_dev *dev;
int err = 0;
unsigned int queue_id;
-   struct kfd_queue *queue;
struct kfd_process_device *pdd;
+   struct queue_properties q_properties;
+
+   memset(_properties, 0, sizeof(struct queue_properties));
 
if (copy_from_user(, arg, sizeof(args)))
return -EFAULT;
 
-   dev = radeon_kfd_device_by_id(args.gpu_id);
-   if (dev == NULL)
-   return -EINVAL;
+   /* need to validate parameters */
+
+   q_properties.is_interop = false;
+   q_properties.queue_percent = args.queue_percentage;
+   q_properties.priority = args.queue_priority;
+   q_properties.queue_address = args.ring_base_address;
+   q_properties.queue_size = args.ring_size;
 
-   queue = kzalloc(
-   offsetof(struct kfd_queue, scheduler_queue) + 
dev->device_info->scheduler_class->queue_size,
-   GFP_KERNEL);
 
-   if (!queue)
-   return -ENOMEM;
+   pr_debug("%s Arguments: Queue Percentage (%d, %d)\n"
+   "Queue Priority (%d, %d)\n"
+   "Queue Address (0x%llX, 0x%llX)\n"
+   "Queue Size (%u64, %ll)\n",
+   __func__,
+   q_properties.queue_percent, args.queue_percentage,
+   q_properties.priority, args.queue_priority,
+   q_properties.queue_address, args.ring_base_address,
+   q_properties.queue_size, args.ring_size);
 
-   queue->dev = dev;
+   dev = radeon_kfd_device_by_id(args.gpu_id);
+   if (dev == NULL)
+   return -EINVAL;
 
mutex_lock(>mutex);
 
@@ -159,23 +172,14 @@ kfd_ioctl_create_queue(struct file *filep, struct 
kfd_process *p, void __user *a
p->pasid,
dev->id);
 
-   if (!radeon_kfd_allocate_queue_id(p, _id))
-   goto err_allocate_queue_id;
-
-   err = dev->device_info->scheduler_class->create_queue(dev->scheduler, 
pdd->scheduler_process,
- 
>scheduler_queue,
- (void __user 
*)args.ring_base_address,
- args.ring_size,
- (void __user 
*)args.read_pointer_address,
- (void __user 
*)args.write_pointer_address,
- 
radeon_kfd_queue_id_to_doorbell(dev, p, queue_id));
-   if (err)
+   err = pqm_create_queue(>pqm, dev, filep, _properties, 0, 
KFD_QUEUE_TYPE_COMPUTE, _id);
+   if (err != 0)
goto err_create_queue;
 
-   radeon_kfd_install_queue(p, queue_id, queue);
-
args.queue_id = queue_id;
-   args.doorbell_address = 
(uint64_t)(uintptr_t)radeon_kfd_get_doorbell(filep, p, dev, queue_id);
+   args.read_pointer_address = (uint64_t)q_properties.read_ptr;
+   args.write_pointer_address = (uint64_t)q_properties.write_ptr;
+   args.doorbell_address = (uint64_t)q_properties.doorbell_ptr;
 
if (copy_to_user(arg, , sizeof(args))) {
err 

[PATCH 54/83] hsa/radeon: Switch to new queue scheduler

2014-07-10 Thread Oded Gabbay
From: Ben Goz ben@amd.com

This patch makes the switch between the old KFD queue scheduler to the new KFD
queue scheduler. The new scheduler supports H/W CP scheduling, over-subscription
of queues and pre-emption of queues.

Signed-off-by: Ben Goz ben@amd.com
Signed-off-by: Oded Gabbay oded.gab...@amd.com
---
 drivers/gpu/hsa/radeon/kfd_aperture.c  |   1 -
 drivers/gpu/hsa/radeon/kfd_chardev.c   | 107 +++--
 drivers/gpu/hsa/radeon/kfd_device.c|  31 ++
 drivers/gpu/hsa/radeon/kfd_interrupt.c |   4 +-
 drivers/gpu/hsa/radeon/kfd_priv.h  |   2 +
 drivers/gpu/hsa/radeon/kfd_process.c   |  56 -
 include/uapi/linux/kfd_ioctl.h |   4 +-
 7 files changed, 88 insertions(+), 117 deletions(-)

diff --git a/drivers/gpu/hsa/radeon/kfd_aperture.c 
b/drivers/gpu/hsa/radeon/kfd_aperture.c
index 9e2d6da..2c72b21 100644
--- a/drivers/gpu/hsa/radeon/kfd_aperture.c
+++ b/drivers/gpu/hsa/radeon/kfd_aperture.c
@@ -32,7 +32,6 @@
 #include uapi/linux/kfd_ioctl.h
 #include linux/time.h
 #include kfd_priv.h
-#include kfd_scheduler.h
 #include linux/mm.h
 #include uapi/asm-generic/mman-common.h
 #include asm/processor.h
diff --git a/drivers/gpu/hsa/radeon/kfd_chardev.c 
b/drivers/gpu/hsa/radeon/kfd_chardev.c
index 07cac88..bb2ef02 100644
--- a/drivers/gpu/hsa/radeon/kfd_chardev.c
+++ b/drivers/gpu/hsa/radeon/kfd_chardev.c
@@ -31,10 +31,11 @@
 #include uapi/linux/kfd_ioctl.h
 #include linux/time.h
 #include kfd_priv.h
-#include kfd_scheduler.h
 #include linux/mm.h
 #include uapi/asm-generic/mman-common.h
 #include asm/processor.h
+#include kfd_hw_pointer_store.h
+#include kfd_device_queue_manager.h
 
 static long kfd_ioctl(struct file *, unsigned int, unsigned long);
 static int kfd_open(struct inode *, struct file *);
@@ -128,24 +129,36 @@ kfd_ioctl_create_queue(struct file *filep, struct 
kfd_process *p, void __user *a
struct kfd_dev *dev;
int err = 0;
unsigned int queue_id;
-   struct kfd_queue *queue;
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;
 
-   dev = radeon_kfd_device_by_id(args.gpu_id);
-   if (dev == NULL)
-   return -EINVAL;
+   /* need to validate parameters */
+
+   q_properties.is_interop = false;
+   q_properties.queue_percent = args.queue_percentage;
+   q_properties.priority = args.queue_priority;
+   q_properties.queue_address = args.ring_base_address;
+   q_properties.queue_size = args.ring_size;
 
-   queue = kzalloc(
-   offsetof(struct kfd_queue, scheduler_queue) + 
dev-device_info-scheduler_class-queue_size,
-   GFP_KERNEL);
 
-   if (!queue)
-   return -ENOMEM;
+   pr_debug(%s Arguments: Queue Percentage (%d, %d)\n
+   Queue Priority (%d, %d)\n
+   Queue Address (0x%llX, 0x%llX)\n
+   Queue Size (%u64, %ll)\n,
+   __func__,
+   q_properties.queue_percent, args.queue_percentage,
+   q_properties.priority, args.queue_priority,
+   q_properties.queue_address, args.ring_base_address,
+   q_properties.queue_size, args.ring_size);
 
-   queue-dev = dev;
+   dev = radeon_kfd_device_by_id(args.gpu_id);
+   if (dev == NULL)
+   return -EINVAL;
 
mutex_lock(p-mutex);
 
@@ -159,23 +172,14 @@ kfd_ioctl_create_queue(struct file *filep, struct 
kfd_process *p, void __user *a
p-pasid,
dev-id);
 
-   if (!radeon_kfd_allocate_queue_id(p, queue_id))
-   goto err_allocate_queue_id;
-
-   err = dev-device_info-scheduler_class-create_queue(dev-scheduler, 
pdd-scheduler_process,
- 
queue-scheduler_queue,
- (void __user 
*)args.ring_base_address,
- args.ring_size,
- (void __user 
*)args.read_pointer_address,
- (void __user 
*)args.write_pointer_address,
- 
radeon_kfd_queue_id_to_doorbell(dev, p, queue_id));
-   if (err)
+   err = pqm_create_queue(p-pqm, dev, filep, q_properties, 0, 
KFD_QUEUE_TYPE_COMPUTE, queue_id);
+   if (err != 0)
goto err_create_queue;
 
-   radeon_kfd_install_queue(p, queue_id, queue);
-
args.queue_id = queue_id;
-   args.doorbell_address = 
(uint64_t)(uintptr_t)radeon_kfd_get_doorbell(filep, p, dev, queue_id);
+   args.read_pointer_address =