You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

108 lines
2.2 KiB

//-----------------------------------------------------------------------------
// COPYRIGHT (C) 2020 CHIPS&MEDIA INC. ALL RIGHTS RESERVED
//
// This file is distributed under BSD 3 clause and LGPL2.1 (dual license)
// SPDX License Identifier: BSD-3-Clause
// SPDX License Identifier: LGPL-2.1-only
//
// The entire notice above must be reproduced on all authorized copies.
//
// Description :
//-----------------------------------------------------------------------------
#ifndef __CNM_VIDEO_MEMORY_ALLOCATOR_H_
#define __CNM_VIDEO_MEMORY_ALLOCATOR_H_
#include "vputypes.h"
typedef struct _video_mm_info_struct {
unsigned long total_pages;
unsigned long alloc_pages;
unsigned long free_pages;
unsigned long page_size;
} vmem_info_t;
#if defined(WIN32) || defined(WIN64)
#if (_MSC_VER == 1200)
typedef _int64 vmem_key_t;
#else
typedef unsigned long long vmem_key_t;
#endif
#else
typedef unsigned long long vmem_key_t;
#endif
#define VMEM_PAGE_SIZE (16*1024ULL)
#define MAKE_KEY(_a, _b) (((vmem_key_t)_a)<<32 | _b)
#define KEY_TO_VALUE(_key) (_key>>32)
typedef struct page_struct {
int pageno;
unsigned long addr;
int used;
int alloc_pages;
int first_pageno;
} page_t;
typedef struct avl_node_struct {
vmem_key_t key;
int height;
page_t* page;
struct avl_node_struct* left;
struct avl_node_struct* right;
} avl_node_t;
typedef struct _video_mm_struct {
avl_node_t* free_tree;
avl_node_t* alloc_tree;
page_t* page_list;
int num_pages;
unsigned long base_addr;
unsigned long mem_size;
int free_page_count;
int alloc_page_count;
} video_mm_t;
#if defined (__cplusplus)
extern "C" {
#endif
extern int
vmem_init(
video_mm_t* mm,
unsigned long addr,
unsigned long size
);
extern int
vmem_exit(
video_mm_t* mm
);
extern PhysicalAddress
vmem_alloc(
video_mm_t* mm,
int size,
unsigned long pid
);
extern int
vmem_free(
video_mm_t* mm,
unsigned long ptr,
unsigned long pid
);
extern int
vmem_get_info(
video_mm_t* mm,
vmem_info_t* info
);
#if defined (__cplusplus)
}
#endif
#endif /* __CNM_VIDEO_MEMORY_ALLOCATOR_H__ */