ARM64: DTS: Add rk3399-firefly uart4 device, node as /dev/ttyS1
[firefly-linux-kernel-4.4.55.git] / drivers / gpu / arm / mali400 / mali / linux / mali_memory_types.h
index 3ab3acbdfa3a388d71b287a6946a90fa12cfce0e..60cd9f47cbd86c18f412b03e1a33832a208bcf9b 100755 (executable)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2013-2014 ARM Limited. All rights reserved.
+ * Copyright (C) 2013-2016 ARM Limited. All rights reserved.
  * 
  * This program is free software and is provided to you under the terms of the GNU General Public License version 2
  * as published by the Free Software Foundation, and any use by you of this program is subject to the terms of such GNU licence.
@@ -11,6 +11,8 @@
 #ifndef __MALI_MEMORY_TYPES_H__
 #define __MALI_MEMORY_TYPES_H__
 
+#include <linux/mm.h>
+
 #if defined(CONFIG_MALI400_UMP)
 #include "ump_kernel_interface.h"
 #endif
@@ -20,12 +22,50 @@ typedef u32 mali_address_t;
 typedef enum mali_mem_type {
        MALI_MEM_OS,
        MALI_MEM_EXTERNAL,
+       MALI_MEM_SWAP,
        MALI_MEM_DMA_BUF,
        MALI_MEM_UMP,
        MALI_MEM_BLOCK,
+       MALI_MEM_COW,
+       MALI_MEM_SECURE,
        MALI_MEM_TYPE_MAX,
 } mali_mem_type;
 
+typedef struct mali_block_item {
+       /* for block type, the block_phy is alway page size align
+       * so use low 12bit used for ref_cout.
+       */
+       unsigned long phy_addr;
+} mali_block_item;
+
+/**
+ * idx is used to locate the given page in the address space of swap file.
+ * ref_count is used to mark how many memory backends are using this item.
+ */
+typedef struct mali_swap_item {
+       u32 idx;
+       atomic_t ref_count;
+       struct page *page;
+       dma_addr_t dma_addr;
+} mali_swap_item;
+
+typedef enum mali_page_node_type {
+       MALI_PAGE_NODE_OS,
+       MALI_PAGE_NODE_BLOCK,
+       MALI_PAGE_NODE_SWAP,
+} mali_page_node_type;
+
+typedef struct mali_page_node {
+       struct list_head list;
+       union {
+               struct page *page;
+               mali_block_item *blk_it; /*pointer to block item*/
+               mali_swap_item *swap_it;
+       };
+
+       u32 type;
+} mali_page_node;
+
 typedef struct mali_mem_os_mem {
        struct list_head pages;
        u32 count;
@@ -56,7 +96,8 @@ typedef struct block_allocator_allocation {
 } block_allocator_allocation;
 
 typedef struct mali_mem_block_mem {
-       block_allocator_allocation mem;
+       struct list_head pfns;
+       u32 count;
 } mali_mem_block_mem;
 
 typedef struct mali_mem_virt_mali_mapping {
@@ -66,22 +107,92 @@ typedef struct mali_mem_virt_mali_mapping {
 
 typedef struct mali_mem_virt_cpu_mapping {
        void __user *addr;
-       u32 ref;
+       struct vm_area_struct *vma;
 } mali_mem_virt_cpu_mapping;
 
 #define MALI_MEM_ALLOCATION_VALID_MAGIC 0xdeda110c
 #define MALI_MEM_ALLOCATION_FREED_MAGIC 0x10101010
 
+typedef struct mali_mm_node {
+       /* MALI GPU vaddr start, use u32 for mmu only support 32bit address*/
+       uint32_t start; /* GPU vaddr */
+       uint32_t size;  /* GPU allocation virtual size */
+       unsigned allocated : 1;
+} mali_mm_node;
+
+typedef struct mali_vma_node {
+       struct mali_mm_node vm_node;
+       struct rb_node vm_rb;
+} mali_vma_node;
+
+
 typedef struct mali_mem_allocation {
        MALI_DEBUG_CODE(u32 magic);
        mali_mem_type type;                /**< Type of memory */
-       int id;                            /**< ID in the descriptor map for this allocation */
-
-       u32 size;                          /**< Size of the allocation */
        u32 flags;                         /**< Flags for this allocation */
 
        struct mali_session_data *session; /**< Pointer to session that owns the allocation */
 
+       mali_mem_virt_cpu_mapping cpu_mapping; /**< CPU mapping */
+       mali_mem_virt_mali_mapping mali_mapping; /**< Mali mapping */
+
+       /* add for new memory system */
+       struct mali_vma_node mali_vma_node;
+       u32 vsize; /* virtual size*/
+       u32 psize; /* physical backend memory size*/
+       struct list_head list;
+       s32 backend_handle; /* idr for mem_backend */
+       _mali_osk_atomic_t mem_alloc_refcount;
+} mali_mem_allocation;
+
+struct mali_mem_os_allocator {
+       spinlock_t pool_lock;
+       struct list_head pool_pages;
+       size_t pool_count;
+
+       atomic_t allocated_pages;
+       size_t allocation_limit;
+
+       struct shrinker shrinker;
+       struct delayed_work timed_shrinker;
+       struct workqueue_struct *wq;
+};
+
+/* COW backend memory type */
+typedef struct mali_mem_cow {
+       struct list_head pages;  /**< all pages for this cow backend allocation,
+                                                                including new allocated pages for modified range*/
+       u32 count;               /**< number of pages */
+       s32 change_pages_nr;
+} mali_mem_cow;
+
+typedef struct mali_mem_swap {
+       struct list_head pages;
+       u32 count;
+} mali_mem_swap;
+
+typedef struct mali_mem_secure {
+#if defined(CONFIG_DMA_SHARED_BUFFER)
+       struct dma_buf *buf;
+       struct dma_buf_attachment *attachment;
+       struct sg_table *sgt;
+#endif
+       u32 count;
+} mali_mem_secure;
+
+#define MALI_MEM_BACKEND_FLAG_COWED                   (0x1)  /* COW has happen on this backend */
+#define MALI_MEM_BACKEND_FLAG_COW_CPU_NO_WRITE        (0x2)  /* This is an COW backend, mapped as not allowed cpu to write */
+#define MALI_MEM_BACKEND_FLAG_SWAP_COWED              (0x4)  /* Mark the given backend is cowed from swappable memory. */
+/* Mark this backend is not swapped_in in MALI driver, and before using it,
+ * we should swap it in and set up corresponding page table. */
+#define MALI_MEM_BACKEND_FLAG_UNSWAPPED_IN            (0x8)
+#define MALI_MEM_BACKEND_FLAG_NOT_BINDED              (0x1 << 5) /* this backend it not back with physical memory, used for defer bind */
+#define MALI_MEM_BACKEND_FLAG_BINDED              (0x1 << 6) /* this backend it back with physical memory, used for defer bind */
+
+typedef struct mali_mem_backend {
+       mali_mem_type type;                /**< Type of backend memory */
+       u32 flags;                         /**< Flags for this allocation */
+       u32 size;
        /* Union selected by type. */
        union {
                mali_mem_os_mem os_mem;       /**< MALI_MEM_OS */
@@ -89,13 +200,20 @@ typedef struct mali_mem_allocation {
                mali_mem_dma_buf dma_buf;     /**< MALI_MEM_DMA_BUF */
                mali_mem_ump ump_mem;         /**< MALI_MEM_UMP */
                mali_mem_block_mem block_mem; /**< MALI_MEM_BLOCK */
+               mali_mem_cow cow_mem;
+               mali_mem_swap swap_mem;
+               mali_mem_secure secure_mem;
        };
+       mali_mem_allocation *mali_allocation;
+       struct mutex mutex;
+       mali_mem_type cow_type;
 
-       mali_mem_virt_cpu_mapping cpu_mapping; /**< CPU mapping */
-       mali_mem_virt_mali_mapping mali_mapping; /**< Mali mapping */
-} mali_mem_allocation;
+       struct list_head list;           /**< Used to link swappable memory backend to the global swappable list */
+       int using_count;                 /**< Mark how many PP jobs are using this memory backend */
+       u32 start_idx;                   /**< If the correspondign vma of this backend is linear, this value will be used to set vma->vm_pgoff */
+} mali_mem_backend;
 
-#define MALI_MEM_FLAG_MALI_GUARD_PAGE (1 << 0)
+#define MALI_MEM_FLAG_MALI_GUARD_PAGE (_MALI_MAP_EXTERNAL_MAP_GUARD_PAGE)
 #define MALI_MEM_FLAG_DONT_CPU_MAP    (1 << 1)
-
+#define MALI_MEM_FLAG_CAN_RESIZE  (_MALI_MEMORY_ALLOCATE_RESIZEABLE)
 #endif /* __MALI_MEMORY_TYPES__ */