/**
 * @brief       VRAM Manager
 * @author      AXELL CORPORATION
 * @description VRAM Manager Layer
 * @note        none
 * @history     2017_02_22  初版
 * @history     2017_10_26  Ver2.0
*/
/* DOM-IGNORE-BEGIN */
/*
 * This program was created by AXELL CORPORATION.
 * Copyright (C) 2017-2019 AXELL CORPORATION, all rights reserved.
 */
/* DOM-IGNORE-END */

#include "AG903_errno.h"
#include "vram/vrammgr.h"



/**
 * @brief           VRAMマネージャ管理下のVRAM領域の初期化
 * @param           vramtop [in] VRAM領域開始アドレス
 * @param           vramsize [in] VRAM領域サイズ
 * @return          VRAM領域初期化結果
 * @retval          AG903_ENONE    正常終了
 * @retval          -AG903_EINVAL  引数異常
 * @description     VRAMマネージャ管理化のVRAM領域のアドレス変換テーブルを初期化します。
 * @note
 * - VRAMマネージャによるメモリプールの生成はここで初期化した領域内でのみ可能です
 * - この関数はMMUとアドレス変換テーブルが初期化された後、
VRAMマネージャの他の関数を実行する前に一度だけ実行して下さい
（AG903_OSWprInitMemory を呼び出します）。
 * - VRAM領域の開始アドレスとサイズは1MB単位で指定して下さい。 <p>
 * - VRAM領域の一部は管理のために使用されます。
*/
int32_t AG903_VRAMMgrInit(uintptr_t vramtop, uint32_t vramsize)
{
	int32_t retval;
	retval = AG903_OSWprInitMemory(vramtop, vramsize);
	return retval;
}

/**
 * @brief           可変長メモリプール生成
 * @param           mplprm [in] メモリプール生成情報
 * @return          可変長メモリプール生成結果
 * @retval          メモリプールID番号  正常終了時
 * @retval          -AG903_EINVAL  引数異常
 * @retval          -AG903_EPERM   不正使用(割り込みからのCALLなど)
 * @retval          -AG903_EFAULT  処理失敗(メモリ不足)
 * @retval          -AG903_ENOID   空ID無し
 * @retval          -AG903_ESYS    システムエラー(想定外エラー)
 * @description     可変長メモリプールを生成します。
 *                  （AG903_OSWprCreMplAuto を呼び出します。）
*/
int32_t AG903_VRAMMgrCreateMpl(AG903_VRAMMgrMplPrm* mplprm)
{
	int32_t retval;
	retval = AG903_OSWprCreMplAuto((AG903_OSWCMpl*)mplprm);
	return retval;
}

/**
 * @brief           可変長メモリプール生成(ID指定)
 * @param           mplid [in] メモリプールID
 * @param           mplprm [in] メモリプール生成情報
 * @return          可変長メモリプール生成(ID指定)結果
 * @retval          AG903_ENONE    正常終了
 * @retval          -AG903_EINVAL  引数異常
 * @retval          -AG903_EPERM   不正使用(割り込みからのCALLなど)
 * @retval          -AG903_EFAULT  処理失敗(メモリ不足)
 * @retval          -AG903_EEXIST  既に生成済み
 * @retval          -AG903_ESYS    システムエラー(想定外エラー)
 * @description     可変長メモリプールをID指定で生成します。
 *                  （AG903_OSWprCreMpl を呼び出します。）
*/
int32_t AG903_VRAMMgrCreateMplFixedId(int32_t mplid, AG903_VRAMMgrMplPrm* mplprm)
{
	int32_t retval;
	retval = AG903_OSWprCreMpl(mplid, (AG903_OSWCMpl*)mplprm);
	return retval;
}

/**
 * @brief           可変長メモリプール削除
 * @param           mplid [in] メモリプールID番号
 * @return          可変長メモリプール削除結果
 * @retval          AG903_ENONE    正常終了
 * @retval          -AG903_EINVAL  引数異常
 * @retval          -AG903_EPERM   不正使用(割り込みからのCALLなど)
 * @description     可変長メモリプールを削除します。
 *                  （AG903_OSWprDelMpl を呼び出します。）
*/
int32_t AG903_VRAMMgrDeleteMpl(int32_t mplid)
{
	int32_t retval;
	retval = AG903_OSWprDelMpl(mplid);
	return retval;
}

/**
 * @brief           可変長メモリ獲得
 * @param           mplid [in] メモリプールID番号
 * @param           blksz [in] メモリブロックサイズ(バイト数)
 * @return          可変長メモリ獲得結果
 * @retval          獲得したメモリブロックへのポインタ NULL:獲得失敗
 * @description     可変長メモリを獲得します。
 *                  （AG903_OSWprGetMpl を呼び出します。）
*/
void* AG903_VRAMMgrMalloc(int32_t mplid, uint32_t blksz)
{
	int32_t result;
	void*	p_blk;
	
	result = AG903_OSWprGetMpl(mplid, blksz, &p_blk);
	if(AG903_ENONE != result) {
		p_blk = NULL;
	}

	return p_blk;
}

/**
 * @brief           可変長メモリ獲得 (Align)
 * @param           mplid [in] メモリプールID番号
 * @param           align [in] アラインサイズ(バイト数)
 * @param           blksz [in] メモリブロックサイズ(バイト数)
 * @return          可変長メモリ獲得 (Align)結果
 * @retval          獲得したメモリブロックへのポインタ NULL:獲得失敗
 * @description     可変長メモリを(Align指定で)獲得します。
 *                  （AG903_OSWprGetMplAlign を呼び出します。）
*/
void* AG903_VRAMMgrMallocAlign(int32_t mplid, uint32_t align, uint32_t blksz)
{
	int32_t result;
	void*	p_blk;
	
	result = AG903_OSWprGetMplAlign(mplid, align, blksz, &p_blk);
	if(AG903_ENONE != result) {
		p_blk = NULL;
	}

	return p_blk;
}

/**
 * @brief           可変長メモリ返却
 * @param           mplid [in] メモリプールID
 * @param           blk [in] メモリブロックへのポインタ
 * @return          可変長メモリ返却結果
 * @retval          AG903_ENONE    正常終了
 * @retval          -AG903_EINVAL  引数異常
 * @retval          -AG903_EPERM   不正使用(割り込みからのCALLなど)
 * @description     可変長メモリを返却します。
 *                  （AG903_OSWprRelMpl を呼び出します。）
 */
int32_t AG903_VRAMMgrFree(int32_t mplid, void* blk)
{
	int32_t retval;
	retval = AG903_OSWprRelMpl(mplid, blk);
	return retval;
}

/**
 * @brief           可変長メモリプールの状態参照
 * @param           mplid [in] メモリプールID
 * @param           mplsta [out] 状態情報返却アドレス
 * @return          可変長メモリプールの状態参照結果
 * @retval          AG903_ENONE    正常終了
 * @retval          -AG903_EINVAL  引数異常
 * @retval          -AG903_EPERM   不正使用(割り込みからのCALLなど)
 * @description     可変長メモリプールの状態を参照します。
 *                  （AG903_OSWprRefMpl を呼び出します。）
*/
int32_t AG903_VRAMMgrMrefer(int32_t mplid, AG903_VRAMMgrMplStat* mplsta)
{
	int32_t retval;
	retval = AG903_OSWprRefMpl(mplid, (AG903_OSWRMpl*)mplsta);
	return retval;
}

/**
 * @brief           固定長メモリプール生成
 * @param           mpfprm [in] メモリプール生成情報
 * @return          固定長メモリプール生成結果
 * @retval          メモリプールID番号
 * @retval          -AG903_EINVAL  引数異常
 * @retval          -AG903_EPERM   不正使用(割り込みからのCALLなど)
 * @retval          -AG903_EFAULT  処理失敗(メモリ不足)
 * @retval          -AG903_ENOID  空ID無し
 * @retval          -AG903_ESYS    システムエラー(想定外エラー)
 * @description     固定長メモリプールを生成します。
 *                  （AG903_OSWprCreMpfAuto を呼び出します。）
*/
int32_t AG903_VRAMMgrCreateMpf(AG903_VRAMMgrMpfPrm* mpfprm)
{
	int32_t retval;
	retval = AG903_OSWprCreMpfAuto((AG903_OSWCMpf*)mpfprm);
	return retval;
}


/**
 * @brief           固定長メモリプール生成(ID指定)
 * @param           mplid [in] メモリプールID
 * @param           mpfprm [in] メモリプール生成情報
 * @return          固定長メモリプール生成(ID指定)結果
 * @retval          AG903_ENONE    正常終了
 * @retval          -AG903_EINVAL  引数異常
 * @retval          -AG903_EPERM   不正使用(割り込みからのCALLなど)
 * @retval          -AG903_EFAULT  処理失敗(メモリ不足)
 * @retval          -AG903_EEXIST  既に生成済み
 * @retval          -AG903_ESYS    システムエラー(想定外エラー)
 * @description     固定長メモリプールをID指定で生成します。
 *                  （AG903_OSWprCreMpf を呼び出します。）
*/
int32_t AG903_VRAMMgrCreateMpfFixedId(int32_t mplid, AG903_VRAMMgrMpfPrm* mpfprm)
{
	int32_t retval;
	retval = AG903_OSWprCreMpf(mplid, (AG903_OSWCMpf*)mpfprm);
	return retval;
}

/**
 * @brief           固定長メモリプール削除
 * @param           mplid [in] メモリプールID番号
 * @return          固定長メモリプール削除結果
 * @retval          AG903_ENONE    正常終了
 * @retval          -AG903_EINVAL  引数異常
 * @retval          -AG903_EPERM   不正使用(割り込みからのCALLなど)
 * @description     固定長メモリプールを削除します。
 *                  （AG903_OSWprDelMpf を呼び出します。）
*/
int32_t AG903_VRAMMgrDeleteMpf(int32_t mplid)
{
	int32_t retval;
	retval = AG903_OSWprDelMpf(mplid);
	return retval;
}

/**
 * @brief           固定長メモリ獲得（ポーリング）
 * @param           mplid [in] メモリプールID
 * @return          固定長メモリ獲得（ポーリング）結果
 * @retval          メモリブロックへのポインタ NULL:獲得失敗
 * @description     固定長メモリを獲得（ポーリング）します。
 *                  （AG903_OSWprGetMpf を呼び出します。）
*/
void* AG903_VRAMMgrFmalloc(int32_t mplid)
{
	int32_t result;
	void*	p_blk;
	
	result = AG903_OSWprGetMpf(mplid, &p_blk);
	if(AG903_ENONE != result) {
		p_blk = NULL;
	}

	return p_blk;
}

/**
 * @brief           固定長メモリ返却
 * @param           mplid [in] メモリプールID
 * @param           blk [in] メモリブロックへのポインタ
 * @return          固定長メモリ返却結果
 * @retval          AG903_ENONE    正常終了
 * @retval          -AG903_EINVAL  引数異常
 * @retval          -AG903_EPERM   不正使用(割り込みからのCALLなど)
 * @description     固定長メモリを返却します。
 *                  （AG903_OSWprRelMpf を呼び出します。）
*/
int32_t AG903_VRAMMgrFmfree(int32_t mplid, void* blk)
{
	int32_t retval;
	retval = AG903_OSWprRelMpf(mplid, blk);
	return retval;
}

/**
 * @brief           固定長メモリプールの状態参照
 * @param           mplid [in] メモリプールID
 * @param           mplsta [out] 状態情報返却アドレス
 * @return          固定長メモリプールの状態参照結果
 * @retval          AG903_ENONE    正常終了
 * @retval          -AG903_EINVAL  引数異常
 * @retval          -AG903_EPERM   不正使用(割り込みからのCALLなど)
 * @description     固定長メモリプールの状態を参照します。
 *                  （AG903_OSWprRefMpf を呼び出します。）
*/
int32_t AG903_VRAMMgrFmrefer(int32_t mplid, AG903_VRAMMgrMpfStat* mplsta)
{
	int32_t retval;
	retval = AG903_OSWprRefMpf(mplid, (AG903_OSWRMpf*)mplsta);
	return retval;
}

