[PATCH 50/83] hsa/radeon: Add module parameter of scheduling policy

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

This patch adds a new parameter to the KFD module. This parameter enables the
user to select the scheduling policy of the CP. The choices are:

* CP Scheduling with support for over-subscription
* CP Scheduling without support for over-subscription
* Without CP Scheduling

Signed-off-by: Ben Goz 
Signed-off-by: Oded Gabbay 
---
 drivers/gpu/hsa/radeon/kfd_module.c |  5 +++
 drivers/gpu/hsa/radeon/kfd_priv.h   | 65 +
 2 files changed, 70 insertions(+)

diff --git a/drivers/gpu/hsa/radeon/kfd_module.c 
b/drivers/gpu/hsa/radeon/kfd_module.c
index a03743a..e8bb67c 100644
--- a/drivers/gpu/hsa/radeon/kfd_module.c
+++ b/drivers/gpu/hsa/radeon/kfd_module.c
@@ -23,6 +23,7 @@
 #include 
 #include 
 #include 
+#include 
 
 #include "kfd_priv.h"
 
@@ -43,6 +44,10 @@ static const struct kgd2kfd_calls kgd2kfd = {
.resume = kgd2kfd_resume,
 };
 
+int sched_policy = KFD_SCHED_POLICY_HWS_NO_OVERSUBSCRIPTION;
+module_param(sched_policy, int, S_IRUSR | S_IWUSR);
+MODULE_PARM_DESC(sched_policy, "Kernel comline parameter define the kfd 
scheduling policy");
+
 bool kgd2kfd_init(unsigned interface_version,
  const struct kfd2kgd_calls *f2g,
  const struct kgd2kfd_calls **g2f)
diff --git a/drivers/gpu/hsa/radeon/kfd_priv.h 
b/drivers/gpu/hsa/radeon/kfd_priv.h
index 3a5cecf..b3889aa 100644
--- a/drivers/gpu/hsa/radeon/kfd_priv.h
+++ b/drivers/gpu/hsa/radeon/kfd_priv.h
@@ -70,6 +70,15 @@ struct kfd_scheduler_class;
 /* Macro for allocating structures */
 #define kfd_alloc_struct(ptr_to_struct)((typeof(ptr_to_struct)) 
kzalloc(sizeof(*ptr_to_struct), GFP_KERNEL))
 
+/* Kernel module parameter to specify the scheduling policy */
+extern int sched_policy;
+
+enum kfd_sched_policy {
+   KFD_SCHED_POLICY_HWS = 0,
+   KFD_SCHED_POLICY_HWS_NO_OVERSUBSCRIPTION,
+   KFD_SCHED_POLICY_NO_HWS
+};
+
 /* Large enough to hold the maximum usable pasid + 1.
 ** It must also be able to store the number of doorbells reported by a KFD 
device. */
 typedef unsigned int pasid_t;
@@ -243,6 +252,51 @@ enum KFD_MQD_TYPE {
KFD_MQD_TYPE_MAX
 };
 
+struct scheduling_resources {
+   unsigned int vmid_mask;
+   enum kfd_queue_type type;
+   uint64_t queue_mask;
+   uint64_t gws_mask;
+   uint32_t oac_mask;
+   uint32_t gds_heap_base;
+   uint32_t gds_heap_size;
+};
+
+struct process_queue_manager {
+   /* data */
+   struct kfd_process  *process;
+   unsigned intnum_concurrent_processes;
+   struct list_headqueues;
+   unsigned long   *queue_slot_bitmap;
+};
+
+struct qcm_process_device {
+   /* The Device Queue Manager that owns this data */
+   struct device_queue_manager *dqm;
+   struct process_queue_manager *pqm;
+   /* Device Queue Manager lock */
+   struct mutex *lock;
+   /* Queues list */
+   struct list_head queues_list;
+   struct list_head priv_queue_list;
+
+   unsigned int queue_count;
+   unsigned int vmid;
+   bool is_debug;
+   /*
+* All the memory management data should be here too
+*/
+   uint64_t gds_context_area;
+   uint32_t sh_mem_config;
+   uint32_t sh_mem_bases;
+   uint32_t sh_mem_ape1_base;
+   uint32_t sh_mem_ape1_limit;
+   uint32_t page_table_base;
+   uint32_t gds_size;
+   uint32_t num_gws;
+   uint32_t num_oac;
+};
+
 /* Data that is per-process-per device. */
 struct kfd_process_device {
/* List of all per-device data for a process. Starts from 
kfd_process.per_device_data. */
@@ -374,6 +428,8 @@ void print_queue_properties(struct queue_properties *q);
 void print_queue(struct queue *q);
 
 struct mqd_manager *mqd_manager_init(enum KFD_MQD_TYPE type, struct kfd_dev 
*dev);
+struct kernel_queue *kernel_queue_init(struct kfd_dev *dev, enum 
kfd_queue_type type);
+void kernel_queue_uninit(struct kernel_queue *kq);
 
 /* Packet Manager */
 
@@ -391,4 +447,13 @@ struct packet_manager {
kfd_mem_obj ib_buffer_obj;
 };
 
+int pm_init(struct packet_manager *pm, struct device_queue_manager *dqm);
+void pm_uninit(struct packet_manager *pm);
+int pm_send_set_resources(struct packet_manager *pm, struct 
scheduling_resources *res);
+int pm_send_runlist(struct packet_manager *pm, struct list_head *dqm_queues);
+int pm_send_query_status(struct packet_manager *pm, uint64_t fence_address, 
uint32_t fence_value);
+int pm_send_unmap_queue(struct packet_manager *pm, enum kfd_queue_type type,
+   enum kfd_preempt_type_filter mode, uint32_t 
filter_param, bool reset);
+void pm_release_ib(struct packet_manager *pm);
+
 #endif
-- 
1.9.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH 50/83] hsa/radeon: Add module parameter of scheduling policy

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

This patch adds a new parameter to the KFD module. This parameter enables the
user to select the scheduling policy of the CP. The choices are:

* CP Scheduling with support for over-subscription
* CP Scheduling without support for over-subscription
* Without CP Scheduling

Signed-off-by: Ben Goz ben@amd.com
Signed-off-by: Oded Gabbay oded.gab...@amd.com
---
 drivers/gpu/hsa/radeon/kfd_module.c |  5 +++
 drivers/gpu/hsa/radeon/kfd_priv.h   | 65 +
 2 files changed, 70 insertions(+)

diff --git a/drivers/gpu/hsa/radeon/kfd_module.c 
b/drivers/gpu/hsa/radeon/kfd_module.c
index a03743a..e8bb67c 100644
--- a/drivers/gpu/hsa/radeon/kfd_module.c
+++ b/drivers/gpu/hsa/radeon/kfd_module.c
@@ -23,6 +23,7 @@
 #include linux/module.h
 #include linux/sched.h
 #include linux/notifier.h
+#include linux/moduleparam.h
 
 #include kfd_priv.h
 
@@ -43,6 +44,10 @@ static const struct kgd2kfd_calls kgd2kfd = {
.resume = kgd2kfd_resume,
 };
 
+int sched_policy = KFD_SCHED_POLICY_HWS_NO_OVERSUBSCRIPTION;
+module_param(sched_policy, int, S_IRUSR | S_IWUSR);
+MODULE_PARM_DESC(sched_policy, Kernel comline parameter define the kfd 
scheduling policy);
+
 bool kgd2kfd_init(unsigned interface_version,
  const struct kfd2kgd_calls *f2g,
  const struct kgd2kfd_calls **g2f)
diff --git a/drivers/gpu/hsa/radeon/kfd_priv.h 
b/drivers/gpu/hsa/radeon/kfd_priv.h
index 3a5cecf..b3889aa 100644
--- a/drivers/gpu/hsa/radeon/kfd_priv.h
+++ b/drivers/gpu/hsa/radeon/kfd_priv.h
@@ -70,6 +70,15 @@ struct kfd_scheduler_class;
 /* Macro for allocating structures */
 #define kfd_alloc_struct(ptr_to_struct)((typeof(ptr_to_struct)) 
kzalloc(sizeof(*ptr_to_struct), GFP_KERNEL))
 
+/* Kernel module parameter to specify the scheduling policy */
+extern int sched_policy;
+
+enum kfd_sched_policy {
+   KFD_SCHED_POLICY_HWS = 0,
+   KFD_SCHED_POLICY_HWS_NO_OVERSUBSCRIPTION,
+   KFD_SCHED_POLICY_NO_HWS
+};
+
 /* Large enough to hold the maximum usable pasid + 1.
 ** It must also be able to store the number of doorbells reported by a KFD 
device. */
 typedef unsigned int pasid_t;
@@ -243,6 +252,51 @@ enum KFD_MQD_TYPE {
KFD_MQD_TYPE_MAX
 };
 
+struct scheduling_resources {
+   unsigned int vmid_mask;
+   enum kfd_queue_type type;
+   uint64_t queue_mask;
+   uint64_t gws_mask;
+   uint32_t oac_mask;
+   uint32_t gds_heap_base;
+   uint32_t gds_heap_size;
+};
+
+struct process_queue_manager {
+   /* data */
+   struct kfd_process  *process;
+   unsigned intnum_concurrent_processes;
+   struct list_headqueues;
+   unsigned long   *queue_slot_bitmap;
+};
+
+struct qcm_process_device {
+   /* The Device Queue Manager that owns this data */
+   struct device_queue_manager *dqm;
+   struct process_queue_manager *pqm;
+   /* Device Queue Manager lock */
+   struct mutex *lock;
+   /* Queues list */
+   struct list_head queues_list;
+   struct list_head priv_queue_list;
+
+   unsigned int queue_count;
+   unsigned int vmid;
+   bool is_debug;
+   /*
+* All the memory management data should be here too
+*/
+   uint64_t gds_context_area;
+   uint32_t sh_mem_config;
+   uint32_t sh_mem_bases;
+   uint32_t sh_mem_ape1_base;
+   uint32_t sh_mem_ape1_limit;
+   uint32_t page_table_base;
+   uint32_t gds_size;
+   uint32_t num_gws;
+   uint32_t num_oac;
+};
+
 /* Data that is per-process-per device. */
 struct kfd_process_device {
/* List of all per-device data for a process. Starts from 
kfd_process.per_device_data. */
@@ -374,6 +428,8 @@ void print_queue_properties(struct queue_properties *q);
 void print_queue(struct queue *q);
 
 struct mqd_manager *mqd_manager_init(enum KFD_MQD_TYPE type, struct kfd_dev 
*dev);
+struct kernel_queue *kernel_queue_init(struct kfd_dev *dev, enum 
kfd_queue_type type);
+void kernel_queue_uninit(struct kernel_queue *kq);
 
 /* Packet Manager */
 
@@ -391,4 +447,13 @@ struct packet_manager {
kfd_mem_obj ib_buffer_obj;
 };
 
+int pm_init(struct packet_manager *pm, struct device_queue_manager *dqm);
+void pm_uninit(struct packet_manager *pm);
+int pm_send_set_resources(struct packet_manager *pm, struct 
scheduling_resources *res);
+int pm_send_runlist(struct packet_manager *pm, struct list_head *dqm_queues);
+int pm_send_query_status(struct packet_manager *pm, uint64_t fence_address, 
uint32_t fence_value);
+int pm_send_unmap_queue(struct packet_manager *pm, enum kfd_queue_type type,
+   enum kfd_preempt_type_filter mode, uint32_t 
filter_param, bool reset);
+void pm_release_ib(struct packet_manager *pm);
+
 #endif
-- 
1.9.1

--
To unsubscribe from this list: send the line unsubscribe linux-kernel in
the body of a message to majord...@vger.kernel.org
More majordomo info at