/*****************************************************************************
* 函 数 名  : bsp_sfree
*
* 功能描述  : BSP 动态内存释放(加spin lock保护,多核场景使用)
*
* 输入参数  : pMem: 动态内存指针
* 输出参数  : 无
* 返 回 值  : 无
*****************************************************************************/
void  bsp_sfree(void* pMem)
{
    u32 u32Size;
    u32 u32Flags;

    if(0 == *g_mem_init_mark)
    {
        return;
    }

    /* Invalid Cache */
    if (!MEM_IS_AXI_ADDR(pMem))
    {
        MEM_INVALID_CACHE(MEM_GET_ALLOC_ADDR(pMem), MEM_MGR_SIZE_FOR_CACHE);
    }

#ifdef __BSP_MEM_DEBUG__
    /* 检查当前内存是否有效 */
    if (bsp_ptr_invalid(pMem)                     ||
        MEM_FREE == MEM_ITEM_STATUS(pMem)       ||
        MEM_ITEM_FLAGS(pMem) == MEM_NORM_DDR_POOL)
    {
        printk("warning! ptr:0x%x, invalid mem block, or may free twice, or wrong mem flags line:%d\n", (unsigned int)pMem, __LINE__);
        return;
    }
#endif

    u32Size = MEM_ITEM_SIZE(pMem);
    u32Flags = MEM_ITEM_FLAGS(pMem);

    bsp_memory_free(u32Flags, pMem, u32Size);
    return;
}
/*****************************************************************************
* 函 数 名  : bsp_free
*
* 功能描述  : BSP 动态内存释放
*
* 输入参数  : pMem: 动态内存指针
* 输出参数  : 无
* 返 回 值  : 无
*****************************************************************************/
void  bsp_free(void* pMem)
{
#if 1
	if(pMem)
        /* coverity[freed_arg] */
	    kfree(pMem);
#else
    u32 u32Size;
    u32 u32Flags;
    u32 u32MagicNumber;

    MEM_SPIN_LOCK();
    u32Size = MEM_ITEM_SIZE(pMem);
    u32Flags = MEM_ITEM_FLAGS(pMem);
    u32MagicNumber= MEM_ITEM_MAGIC(pMem);
    MEM_SPIN_UNLOCK();

    if(MEM_MAGIC_NUM != u32MagicNumber)
    {
        kfree(pMem);
    }
    else if(MEM_NORM_DDR_POOL < u32Flags)
    {
	 bsp_memory_free(u32Flags, pMem, u32Size);
    }
    else
    {
        printk("bsp_free failed: pMem is  0x%x, u32MagicNumber is 0x%x, u32Flags is 0x%x\n",(u32)pMem, u32MagicNumber, u32Flags);
    }
#endif
}
/*****************************************************************************
* 函 数 名  : bsp_sfree
*
* 功能描述  : BSP 动态内存释放(加spin lock保护,多核场景使用)
*
* 输入参数  : pMem: 动态内存指针
* 输出参数  : 无
* 返 回 值  : 无
*****************************************************************************/
void  bsp_sfree(void* pMem)
{
    u32 u32Size;
    u32 u32Flags;
    if(0 == *g_mem_init_mark)
    {
        return;
    }

#ifdef __BSP_MEM_DEBUG__
    if (bsp_ptr_invalid(pMem))
    {
        bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,
                  "warning! ptr:0x%x, invalid mem block line:%d\n", pMem, __LINE__);
        return;
    }
#endif

    /* Invalid Cache */
    if (!MEM_IS_AXI_ADDR(pMem))
    {
        MEM_INVALID_CACHE(MEM_GET_ALLOC_ADDR(pMem), MEM_MGR_SIZE_FOR_CACHE);
    }

#ifdef __BSP_MEM_DEBUG__
    /* 检查当前内存是否有效 */
    if (MEM_FREE == MEM_ITEM_STATUS(pMem))
    {
        bsp_trace(BSP_LOG_LEVEL_ERROR, BSP_MODU_MEM,
                  "warning! ptr:0x%x, may free twice, or wrong mem status line:%d\n", (unsigned int)pMem, __LINE__);
        return;
    }
#endif

    u32Size = MEM_ITEM_SIZE(pMem);
    u32Flags = MEM_ITEM_FLAGS(pMem);

    bsp_memory_free(u32Flags, pMem, u32Size);
    return;
}