mm.h 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. // SPDX-License-Identifier: LGPL-2.1 OR BSD-3-Clause
  2. #ifndef __CNM_VIDEO_MEMORY_ALLOCATOR_H_
  3. #define __CNM_VIDEO_MEMORY_ALLOCATOR_H_
  4. typedef struct _video_mm_info_struct {
  5. unsigned long total_pages;
  6. unsigned long alloc_pages;
  7. unsigned long free_pages;
  8. unsigned long page_size;
  9. } vmem_info_t;
  10. #if defined(WIN32) || defined(WIN64)
  11. #if (_MSC_VER == 1200)
  12. typedef _int64 vmem_key_t;
  13. #else
  14. typedef unsigned long long vmem_key_t;
  15. #endif
  16. #else
  17. typedef unsigned long long vmem_key_t;
  18. #endif
  19. #define VMEM_PAGE_SIZE (16*1024)
  20. #define MAKE_KEY(_a, _b) (((vmem_key_t)_a)<<32 | _b)
  21. #define KEY_TO_VALUE(_key) (_key>>32)
  22. typedef struct page_struct {
  23. int pageno;
  24. unsigned long addr;
  25. int used;
  26. int alloc_pages;
  27. int first_pageno;
  28. } page_t;
  29. typedef struct avl_node_struct {
  30. vmem_key_t key;
  31. int height;
  32. page_t* page;
  33. struct avl_node_struct* left;
  34. struct avl_node_struct* right;
  35. } avl_node_t;
  36. typedef struct _video_mm_struct {
  37. avl_node_t* free_tree;
  38. avl_node_t* alloc_tree;
  39. page_t* page_list;
  40. int num_pages;
  41. unsigned long base_addr;
  42. unsigned long mem_size;
  43. int free_page_count;
  44. int alloc_page_count;
  45. } video_mm_t;
  46. #if defined (__cplusplus)
  47. extern "C" {
  48. #endif
  49. extern int
  50. vmem_init(
  51. video_mm_t* mm,
  52. unsigned long addr,
  53. unsigned long size
  54. );
  55. extern int
  56. vmem_exit(
  57. video_mm_t* mm
  58. );
  59. extern unsigned long
  60. vmem_alloc(
  61. video_mm_t* mm,
  62. int size,
  63. unsigned long pid
  64. );
  65. extern int
  66. vmem_free(
  67. video_mm_t* mm,
  68. unsigned long ptr,
  69. unsigned long pid
  70. );
  71. extern int
  72. vmem_get_info(
  73. video_mm_t* mm,
  74. vmem_info_t* info
  75. );
  76. #if defined (__cplusplus)
  77. }
  78. #endif
  79. #endif /* __CNM_VIDEO_MEMORY_ALLOCATOR_H__ */