MALI: rockchip: upgrade utgard DDK to r6p0-01rel1
[firefly-linux-kernel-4.4.55.git] / drivers / gpu / arm / mali400 / mali / linux / mali_memory_cow.c
index bcd0f871377191d90079f9f67e2b6563c15692ee..65fb38b327b88a3fc2aba971b517b5e82394dce9 100644 (file)
@@ -117,7 +117,7 @@ _mali_osk_errcode_t mali_memory_cow_os_memory(mali_mem_backend *target_bk,
        pages = _mali_memory_cow_get_node_list(target_bk, target_offset, target_size);\r
 \r
        if (NULL == pages) {\r
-               MALI_DEBUG_ASSERT(0);\r
+               MALI_DEBUG_PRINT_ERROR(("No memory page  need to cow ! \n"));\r
                return _MALI_OSK_ERR_FAULT;\r
        }\r
 \r
@@ -195,7 +195,7 @@ _mali_osk_errcode_t mali_memory_cow_swap_memory(mali_mem_backend *target_bk,
 \r
        pages = _mali_memory_cow_get_node_list(target_bk, target_offset, target_size);\r
        if (NULL == pages) {\r
-               MALI_DEBUG_ASSERT(0);\r
+               MALI_DEBUG_PRINT_ERROR(("No swap memory page need to cow ! \n"));\r
                return _MALI_OSK_ERR_FAULT;\r
        }\r
 \r
@@ -290,6 +290,7 @@ _mali_osk_errcode_t mali_memory_cow_modify_range(mali_mem_backend *backend,
                u32 range_size)\r
 {\r
        mali_mem_allocation *alloc = NULL;\r
+       struct mali_session_data *session;\r
        mali_mem_cow *cow = &backend->cow_mem;\r
        struct mali_page_node *m_page, *m_tmp;\r
        LIST_HEAD(pages);\r
@@ -304,6 +305,9 @@ _mali_osk_errcode_t mali_memory_cow_modify_range(mali_mem_backend *backend,
        alloc = backend->mali_allocation;\r
        MALI_DEBUG_ASSERT_POINTER(alloc);\r
 \r
+       session = alloc->session;\r
+       MALI_DEBUG_ASSERT_POINTER(session);\r
+\r
        MALI_DEBUG_ASSERT(MALI_MEM_COW == backend->type);\r
        MALI_DEBUG_ASSERT(((range_start + range_size) / _MALI_OSK_MALI_PAGE_SIZE) <= cow->count);\r
 \r
@@ -324,10 +328,13 @@ _mali_osk_errcode_t mali_memory_cow_modify_range(mali_mem_backend *backend,
                                if (1 != _mali_page_node_get_ref_count(m_page))\r
                                        change_pages_nr++;\r
                                /* unref old page*/\r
+                               _mali_osk_mutex_wait(session->cow_lock);\r
                                if (_mali_mem_put_page_node(m_page)) {\r
                                        __free_page(new_page);\r
+                                       _mali_osk_mutex_signal(session->cow_lock);\r
                                        goto error;\r
                                }\r
+                               _mali_osk_mutex_signal(session->cow_lock);\r
                                /* add new page*/\r
                                /* always use OS for COW*/\r
                                m_page->type = MALI_PAGE_NODE_OS;\r
@@ -448,19 +455,23 @@ _mali_osk_errcode_t mali_memory_do_cow(mali_mem_backend *target_bk,
                break;\r
        case MALI_MEM_EXTERNAL:\r
                /*NOT support yet*/\r
-               MALI_DEBUG_ASSERT(0);\r
+               MALI_DEBUG_PRINT_ERROR(("External physical memory not supported ! \n"));\r
+               return _MALI_OSK_ERR_UNSUPPORTED;\r
                break;\r
        case MALI_MEM_DMA_BUF:\r
                /*NOT support yet*/\r
-               MALI_DEBUG_ASSERT(0);\r
+               MALI_DEBUG_PRINT_ERROR(("DMA buffer not supported ! \n"));\r
+               return _MALI_OSK_ERR_UNSUPPORTED;\r
                break;\r
        case MALI_MEM_UMP:\r
                /*NOT support yet*/\r
-               MALI_DEBUG_ASSERT(0);\r
+               MALI_DEBUG_PRINT_ERROR(("UMP buffer not supported ! \n"));\r
+               return _MALI_OSK_ERR_UNSUPPORTED;\r
                break;\r
        default:\r
                /*Not support yet*/\r
-               MALI_DEBUG_ASSERT(0);\r
+               MALI_DEBUG_PRINT_ERROR(("Invalid memory type not supported ! \n"));\r
+               return _MALI_OSK_ERR_UNSUPPORTED;\r
                break;\r
        }\r
        return _MALI_OSK_ERR_OK;\r
@@ -582,18 +593,25 @@ _mali_osk_errcode_t mali_mem_cow_cpu_map_pages_locked(mali_mem_backend *mem_bken
 u32 mali_mem_cow_release(mali_mem_backend *mem_bkend, mali_bool is_mali_mapped)\r
 {\r
        mali_mem_allocation *alloc;\r
+       struct mali_session_data *session;\r
        u32 free_pages_nr = 0;\r
        MALI_DEBUG_ASSERT_POINTER(mem_bkend);\r
        MALI_DEBUG_ASSERT(MALI_MEM_COW == mem_bkend->type);\r
        alloc = mem_bkend->mali_allocation;\r
        MALI_DEBUG_ASSERT_POINTER(alloc);\r
 \r
+        session = alloc->session;\r
+        MALI_DEBUG_ASSERT_POINTER(session);\r
+\r
        if (MALI_MEM_BACKEND_FLAG_SWAP_COWED != (MALI_MEM_BACKEND_FLAG_SWAP_COWED & mem_bkend->flags)) {\r
                /* Unmap the memory from the mali virtual address space. */\r
                if (MALI_TRUE == is_mali_mapped)\r
                        mali_mem_os_mali_unmap(alloc);\r
                /* free cow backend list*/\r
+               _mali_osk_mutex_wait(session->cow_lock);\r
                free_pages_nr = mali_mem_os_free(&mem_bkend->cow_mem.pages, mem_bkend->cow_mem.count, MALI_TRUE);\r
+               _mali_osk_mutex_signal(session->cow_lock);\r
+\r
                free_pages_nr += mali_mem_block_free_list(&mem_bkend->cow_mem.pages);\r
 \r
                MALI_DEBUG_ASSERT(list_empty(&mem_bkend->cow_mem.pages));\r
@@ -736,11 +754,15 @@ _mali_osk_errcode_t mali_mem_cow_allocate_on_demand(mali_mem_backend *mem_bkend,
                }\r
                mem_bkend->cow_mem.change_pages_nr++;\r
        }\r
+\r
+       _mali_osk_mutex_wait(session->cow_lock);\r
        if (_mali_mem_put_page_node(found_node)) {\r
                __free_page(new_page);\r
                kfree(new_node);\r
+               _mali_osk_mutex_signal(session->cow_lock);\r
                return _MALI_OSK_ERR_NOMEM;\r
        }\r
+       _mali_osk_mutex_signal(session->cow_lock);\r
 \r
        list_replace(&found_node->list, &new_node->list);\r
 \r