/*
 * Copyright (C) 2010-2013 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.
 * 
 * A copy of the licence is included with the program, and can also be obtained from Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 */

#ifndef __MALI_MEMORY_H__
#define __MALI_MEMORY_H__

#include "mali_osk.h"
#include "mali_session.h"

/** @brief Initialize Mali memory subsystem
 *
 * Allocate and initialize internal data structures. Must be called before
 * allocating Mali memory.
 *
 * @return On success _MALI_OSK_ERR_OK, othervise some error code describing the error.
 */
_mali_osk_errcode_t mali_memory_initialize(void);

/** @brief Terminate Mali memory system
 *
 * Clean up and release internal data structures.
 */
void mali_memory_terminate(void);

/** @brief Start new Mali memory session
 *
 * Allocate and prepare session specific memory allocation data data. The
 * session page directory, lock, and descriptor map is set up.
 *
 * @param mali_session_data pointer to the session data structure
 */
_mali_osk_errcode_t mali_memory_session_begin(struct mali_session_data *mali_session_data);

/** @brief Close a Mali memory session
 *
 * Release session specific memory allocation related data.
 *
 * @param mali_session_data pointer to the session data structure
 */
void mali_memory_session_end(struct mali_session_data *mali_session_data);

/** @brief Allocate a page table page
 *
 * Allocate a page for use as a page directory or page table. The page is
 * mapped into kernel space.
 *
 * @return _MALI_OSK_ERR_OK on success, othervise an error code
 * @param table_page GPU pointer to the allocated page
 * @param mapping CPU pointer to the mapping of the allocated page
 */
_mali_osk_errcode_t mali_mmu_get_table_page(u32 *table_page, mali_io_address *mapping);

/** @brief Release a page table page
 *
 * Release a page table page allocated through \a mali_mmu_get_table_page
 *
 * @param pa the GPU address of the page to release
 */
void mali_mmu_release_table_page(u32 pa);


/** @brief Parse resource and prepare the OS memory allocator
 *
 * @param size Maximum size to allocate for Mali GPU.
 * @return _MALI_OSK_ERR_OK on success, otherwise failure.
 */
_mali_osk_errcode_t mali_memory_core_resource_os_memory(u32 size);

/** @brief Parse resource and prepare the dedicated memory allocator
 *
 * @param start Physical start address of dedicated Mali GPU memory.
 * @param size Size of dedicated Mali GPU memory.
 * @return _MALI_OSK_ERR_OK on success, otherwise failure.
 */
_mali_osk_errcode_t mali_memory_core_resource_dedicated_memory(u32 start, u32 size);

mali_allocation_engine mali_mem_get_memory_engine(void);

#endif /* __MALI_MEMORY_H__ */
