lmb.h 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /* SPDX-License-Identifier: GPL-2.0+ */
  2. #ifndef _LINUX_LMB_H
  3. #define _LINUX_LMB_H
  4. #ifdef __KERNEL__
  5. #include <asm/types.h>
  6. #include <asm/u-boot.h>
  7. /*
  8. * Logical memory blocks.
  9. *
  10. * Copyright (C) 2001 Peter Bergner, IBM Corp.
  11. */
  12. /**
  13. * struct lmb_property - Description of one region.
  14. *
  15. * @base: Base address of the region.
  16. * @size: Size of the region
  17. */
  18. struct lmb_property {
  19. phys_addr_t base;
  20. phys_size_t size;
  21. };
  22. /**
  23. * struct lmb_region - Description of a set of region.
  24. *
  25. * @cnt: Number of regions.
  26. * @max: Size of the region array, max value of cnt.
  27. * @region: Array of the region properties
  28. */
  29. struct lmb_region {
  30. unsigned long cnt;
  31. unsigned long max;
  32. #if IS_ENABLED(CONFIG_LMB_USE_MAX_REGIONS)
  33. struct lmb_property region[CONFIG_LMB_MAX_REGIONS];
  34. #else
  35. struct lmb_property *region;
  36. #endif
  37. };
  38. /**
  39. * struct lmb - Logical memory block handle.
  40. *
  41. * Clients provide storage for Logical memory block (lmb) handles.
  42. * The content of the structure is managed by the lmb library.
  43. * A lmb struct is initialized by lmb_init() functions.
  44. * The lmb struct is passed to all other lmb APIs.
  45. *
  46. * @memory: Description of memory regions.
  47. * @reserved: Description of reserved regions.
  48. * @memory_regions: Array of the memory regions (statically allocated)
  49. * @reserved_regions: Array of the reserved regions (statically allocated)
  50. */
  51. struct lmb {
  52. struct lmb_region memory;
  53. struct lmb_region reserved;
  54. #if !IS_ENABLED(CONFIG_LMB_USE_MAX_REGIONS)
  55. struct lmb_property memory_regions[CONFIG_LMB_MEMORY_REGIONS];
  56. struct lmb_property reserved_regions[CONFIG_LMB_RESERVED_REGIONS];
  57. #endif
  58. };
  59. extern void lmb_init(struct lmb *lmb);
  60. extern void lmb_init_and_reserve(struct lmb *lmb, struct bd_info *bd,
  61. void *fdt_blob);
  62. extern void lmb_init_and_reserve_range(struct lmb *lmb, phys_addr_t base,
  63. phys_size_t size, void *fdt_blob);
  64. extern long lmb_add(struct lmb *lmb, phys_addr_t base, phys_size_t size);
  65. extern long lmb_reserve(struct lmb *lmb, phys_addr_t base, phys_size_t size);
  66. extern phys_addr_t lmb_alloc(struct lmb *lmb, phys_size_t size, ulong align);
  67. extern phys_addr_t lmb_alloc_base(struct lmb *lmb, phys_size_t size, ulong align,
  68. phys_addr_t max_addr);
  69. extern phys_addr_t __lmb_alloc_base(struct lmb *lmb, phys_size_t size, ulong align,
  70. phys_addr_t max_addr);
  71. extern phys_addr_t lmb_alloc_addr(struct lmb *lmb, phys_addr_t base,
  72. phys_size_t size);
  73. extern phys_size_t lmb_get_free_size(struct lmb *lmb, phys_addr_t addr);
  74. extern int lmb_is_reserved(struct lmb *lmb, phys_addr_t addr);
  75. extern long lmb_free(struct lmb *lmb, phys_addr_t base, phys_size_t size);
  76. extern void lmb_dump_all(struct lmb *lmb);
  77. extern void lmb_dump_all_force(struct lmb *lmb);
  78. static inline phys_size_t
  79. lmb_size_bytes(struct lmb_region *type, unsigned long region_nr)
  80. {
  81. return type->region[region_nr].size;
  82. }
  83. void board_lmb_reserve(struct lmb *lmb);
  84. void arch_lmb_reserve(struct lmb *lmb);
  85. #endif /* __KERNEL__ */
  86. #endif /* _LINUX_LMB_H */