drm/amdkfd: Add kfd gtt sub-allocator functions
[firefly-linux-kernel-4.4.55.git] / drivers / gpu / drm / amd / amdkfd / kfd_priv.h
index f9fb81e3bb09b24edd7f8de6c22cf7e64a92391b..a79c21781d3b5b63d133d5e4785f269a0d7aedc4 100644 (file)
@@ -107,9 +107,17 @@ enum cache_policy {
 struct kfd_device_info {
        unsigned int max_pasid_bits;
        size_t ih_ring_entry_size;
+       uint8_t num_of_watch_points;
        uint16_t mqd_size_aligned;
 };
 
+struct kfd_mem_obj {
+       uint32_t range_start;
+       uint32_t range_end;
+       uint64_t gpu_addr;
+       uint32_t *cpu_ptr;
+};
+
 struct kfd_dev {
        struct kgd_dev *kgd;
 
@@ -135,6 +143,14 @@ struct kfd_dev {
 
        struct kgd2kfd_shared_resources shared_resources;
 
+       void *gtt_mem;
+       uint64_t gtt_start_gpu_addr;
+       void *gtt_start_cpu_ptr;
+       void *gtt_sa_bitmap;
+       struct mutex gtt_sa_lock;
+       unsigned int gtt_sa_chunk_size;
+       unsigned int gtt_sa_num_of_chunks;
+
        void *interrupt_ring;
        size_t interrupt_ring_size;
        atomic_t interrupt_ring_rptr;
@@ -162,12 +178,6 @@ void kgd2kfd_device_exit(struct kfd_dev *kfd);
 
 extern const struct kfd2kgd_calls *kfd2kgd;
 
-struct kfd_mem_obj {
-       void *bo;
-       uint64_t gpu_addr;
-       uint32_t *cpu_ptr;
-};
-
 enum kfd_mempool {
        KFD_MEMPOOL_SYSTEM_CACHEABLE = 1,
        KFD_MEMPOOL_SYSTEM_WRITECOMBINE = 2,
@@ -285,6 +295,10 @@ struct queue_properties {
        bool is_active;
        /* Not relevant for user mode queues in cp scheduling */
        unsigned int vmid;
+       /* Relevant only for sdma queues*/
+       uint32_t sdma_engine_id;
+       uint32_t sdma_queue_id;
+       uint32_t sdma_vm_addr;
 };
 
 /**
@@ -327,6 +341,8 @@ struct queue {
        uint32_t pipe;
        uint32_t queue;
 
+       unsigned int sdma_id;
+
        struct kfd_process      *process;
        struct kfd_dev          *device;
 };
@@ -472,8 +488,9 @@ struct kfd_process_device *kfd_bind_process_to_device(struct kfd_dev *dev,
                                                        struct kfd_process *p);
 void kfd_unbind_process_from_device(struct kfd_dev *dev, unsigned int pasid);
 struct kfd_process_device *kfd_get_process_device_data(struct kfd_dev *dev,
-                                                       struct kfd_process *p,
-                                                       int create_pdd);
+                                                       struct kfd_process *p);
+struct kfd_process_device *kfd_create_process_device_data(struct kfd_dev *dev,
+                                                       struct kfd_process *p);
 
 /* Process device data iterator */
 struct kfd_process_device *kfd_get_first_process_device_data(struct kfd_process *p);
@@ -501,6 +518,13 @@ unsigned int kfd_queue_id_to_doorbell(struct kfd_dev *kfd,
                                        struct kfd_process *process,
                                        unsigned int queue_id);
 
+/* GTT Sub-Allocator */
+
+int kfd_gtt_sa_allocate(struct kfd_dev *kfd, unsigned int size,
+                       struct kfd_mem_obj **mem_obj);
+
+int kfd_gtt_sa_free(struct kfd_dev *kfd, struct kfd_mem_obj *mem_obj);
+
 extern struct device *kfd_device;
 
 /* Topology */
@@ -528,6 +552,8 @@ int kfd_init_apertures(struct kfd_process *process);
 /* Queue Context Management */
 inline uint32_t lower_32(uint64_t x);
 inline uint32_t upper_32(uint64_t x);
+struct cik_sdma_rlc_registers *get_sdma_mqd(void *mqd);
+inline uint32_t get_sdma_base_addr(struct cik_sdma_rlc_registers *m);
 
 int init_queue(struct queue **q, struct queue_properties properties);
 void uninit_queue(struct queue *q);