/*
 * Copyright (c) Huawei Technologies Co., Ltd. 2025. All rights reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 and
 * only version 2 as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU General Public License for more details.
 */

#ifndef PBL_MEM_ALLOC_INTERFACE_H
#define PBL_MEM_ALLOC_INTERFACE_H

#include <linux/types.h>
#include <linux/printk.h>
#include <linux/slab.h>
#include <linux/module.h>
#include <linux/uaccess.h>
#include <linux/mman.h>
#include <linux/dma-mapping.h>
#include <linux/slab.h>
#include <linux/vmalloc.h>
#include <linux/version.h>
#include <linux/nodemask.h>
#ifdef DAVINCI_DEVICE
#include <linux/share_pool.h>
#endif
#include "pbl_ka_memory.h"
#include "ascend_hal_define.h"

/*******
    module_type: HAL_MODULE_TYPE_DEV_MANAGER
        KA_SUB_MODULE_TYPE_0: asdrv_dms.ko / asdrv_vdms.ko
        KA_SUB_MODULE_TYPE_1: uda
        KA_SUB_MODULE_TYPE_2: urd
        KA_SUB_MODULE_TYPE_3: NULL
        KA_SUB_MODULE_TYPE_4: NULL

    module_type: HAL_MODULE_TYPE_DMP
        KA_SUB_MODULE_TYPE_0: drv_ascend_ctl
        KA_SUB_MODULE_TYPE_1: drv_davinci_intf/drv_davinci_intf_host
        KA_SUB_MODULE_TYPE_2: ascend_udis.ko
        KA_SUB_MODULE_TYPE_3: NULL
        KA_SUB_MODULE_TYPE_4: NULL

    module_type: HAL_MODULE_TYPE_FAULT
        KA_SUB_MODULE_TYPE_0: asdrv_fms.ko
        KA_SUB_MODULE_TYPE_1:
        KA_SUB_MODULE_TYPE_2:
        KA_SUB_MODULE_TYPE_3: dfm
        KA_SUB_MODULE_TYPE_4:

    module_type: HAL_MODULE_TYPE_UPGRADE
        KA_SUB_MODULE_TYPE_0: drv_upgrade.ko
        KA_SUB_MODULE_TYPE_1: drv_user_cfg
        KA_SUB_MODULE_TYPE_2: drv_pkicms
        KA_SUB_MODULE_TYPE_3: NULL
        KA_SUB_MODULE_TYPE_4: NULL
*/
#if defined(CFG_FEATURE_MEMALLOC_MODULE_TYPE) && defined(CFG_FEATURE_MEMALLOC_SUBMODULE_TYPE)
    #define DMS_MODULE_TYPE CFG_FEATURE_MEMALLOC_MODULE_TYPE
    #define DMS_KA_SUB_MODULE_TYPE CFG_FEATURE_MEMALLOC_SUBMODULE_TYPE
#endif

#define dbl_kmalloc(size, flags) \
    ka_kmalloc(size, flags, ka_get_module_id(DMS_MODULE_TYPE, DMS_KA_SUB_MODULE_TYPE))
#define dbl_kzalloc(size, flags) \
    ka_kzalloc(size, flags, ka_get_module_id(DMS_MODULE_TYPE, DMS_KA_SUB_MODULE_TYPE))
#define dbl_kcalloc(size, flags) \
    ka_kcalloc(size, flags, ka_get_module_id(DMS_MODULE_TYPE, DMS_KA_SUB_MODULE_TYPE))

#define dbl_kfree(addr) \
    ka_kfree(addr, ka_get_module_id(DMS_MODULE_TYPE, DMS_KA_SUB_MODULE_TYPE))

#define dbl_vzalloc(size)  \
    ka_vzalloc(size, ka_get_module_id(DMS_MODULE_TYPE, DMS_KA_SUB_MODULE_TYPE))
#define dbl_vmalloc(size, gfp_mask, prot) \
    __ka_vmalloc(size, gfp_mask, prot, ka_get_module_id(DMS_MODULE_TYPE, DMS_KA_SUB_MODULE_TYPE))

#define dbl_vfree(addr) \
    ka_vfree(addr, ka_get_module_id(DMS_MODULE_TYPE, DMS_KA_SUB_MODULE_TYPE))

#define dbl_get_free_pages(gfp_mask, order) \
    ka_get_free_pages(gfp_mask, order, ka_get_module_id(DMS_MODULE_TYPE, DMS_KA_SUB_MODULE_TYPE))
#define dbl_alloc_pages(gfp_mask, order) \
    ka_alloc_pages(gfp_mask, order, ka_get_module_id(DMS_MODULE_TYPE, DMS_KA_SUB_MODULE_TYPE))
#define dbl_free_pages(addr, order) \
    ka_free_pages(addr, order, ka_get_module_id(DMS_MODULE_TYPE, DMS_KA_SUB_MODULE_TYPE))

#define dbl_mg_sp_alloc_nodemask(size, sp_flags, spg_id, nodemask) \
    ka_mg_sp_alloc_nodemask(size, sp_flags, spg_id, nodemask, ka_get_module_id(DMS_MODULE_TYPE, DMS_KA_SUB_MODULE_TYPE))
#define dbl_mg_sp_alloc(size, sp_flags, spg_id) \
    ka_mg_sp_alloc(size, sp_flags, spg_id, ka_get_module_id(DMS_MODULE_TYPE, DMS_KA_SUB_MODULE_TYPE))
#define dbl_mg_sp_free(addr, id) \
    ka_mg_sp_free(addr, id, module_id)

#define dbl_alloc_pages_exact(size, gfp_mask) \
    ka_alloc_pages_exact(size, gfp_mask, ka_get_module_id(DMS_MODULE_TYPE, DMS_KA_SUB_MODULE_TYPE))
#define dbl_free_pages_exact(virt, size) \
    ka_free_pages_exact(virt, size, ka_get_module_id(DMS_MODULE_TYPE, DMS_KA_SUB_MODULE_TYPE))

#define dbl_alloc_pages_node(nid, gfp_mask, order) \
    ka_alloc_pages_node(nid, gfp_mask, order, ka_get_module_id(DMS_MODULE_TYPE, DMS_KA_SUB_MODULE_TYPE))
#define dbl_free_pages_ex(page, order) \
    __ka_free_pages(page, order, ka_get_module_id(DMS_MODULE_TYPE, DMS_KA_SUB_MODULE_TYPE))

#define dbl_kvzalloc(size, flags) \
    ka_kvzalloc(size, flags, ka_get_module_id(DMS_MODULE_TYPE, DMS_KA_SUB_MODULE_TYPE))
#define dbl_kvmalloc_node(size, flags, node) \
    ka_kvmalloc_node(size, flags, node, ka_get_module_id(DMS_MODULE_TYPE, DMS_KA_SUB_MODULE_TYPE))
#define dbl_kvmalloc(size, flags) \
    ka_kvmalloc(size, flags, ka_get_module_id(DMS_MODULE_TYPE, DMS_KA_SUB_MODULE_TYPE))
#define dbl_kvfree(addr)  \
    ka_kvfree(addr, ka_get_module_id(DMS_MODULE_TYPE, DMS_KA_SUB_MODULE_TYPE))
#endif