uboot/include/lmb.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0+ */
   2#ifndef _LINUX_LMB_H
   3#define _LINUX_LMB_H
   4#ifdef __KERNEL__
   5
   6#include <asm/types.h>
   7#include <asm/u-boot.h>
   8
   9/*
  10 * Logical memory blocks.
  11 *
  12 * Copyright (C) 2001 Peter Bergner, IBM Corp.
  13 */
  14
  15/**
  16 * enum lmb_flags - definition of memory region attributes
  17 * @LMB_NONE: no special request
  18 * @LMB_NOMAP: don't add to mmu configuration
  19 */
  20enum lmb_flags {
  21        LMB_NONE                = 0x0,
  22        LMB_NOMAP               = 0x4,
  23};
  24
  25/**
  26 * struct lmb_property - Description of one region.
  27 *
  28 * @base: Base address of the region.
  29 * @size: Size of the region
  30 */
  31struct lmb_property {
  32        phys_addr_t base;
  33        phys_size_t size;
  34        enum lmb_flags flags;
  35};
  36
  37/**
  38 * struct lmb_region - Description of a set of region.
  39 *
  40 * @cnt: Number of regions.
  41 * @max: Size of the region array, max value of cnt.
  42 * @region: Array of the region properties
  43 */
  44struct lmb_region {
  45        unsigned long cnt;
  46        unsigned long max;
  47#if IS_ENABLED(CONFIG_LMB_USE_MAX_REGIONS)
  48        struct lmb_property region[CONFIG_LMB_MAX_REGIONS];
  49#else
  50        struct lmb_property *region;
  51#endif
  52};
  53
  54/**
  55 * struct lmb - Logical memory block handle.
  56 *
  57 * Clients provide storage for Logical memory block (lmb) handles.
  58 * The content of the structure is managed by the lmb library.
  59 * A lmb struct is  initialized by lmb_init() functions.
  60 * The lmb struct is passed to all other lmb APIs.
  61 *
  62 * @memory: Description of memory regions.
  63 * @reserved: Description of reserved regions.
  64 * @memory_regions: Array of the memory regions (statically allocated)
  65 * @reserved_regions: Array of the reserved regions (statically allocated)
  66 */
  67struct lmb {
  68        struct lmb_region memory;
  69        struct lmb_region reserved;
  70#if !IS_ENABLED(CONFIG_LMB_USE_MAX_REGIONS)
  71        struct lmb_property memory_regions[CONFIG_LMB_MEMORY_REGIONS];
  72        struct lmb_property reserved_regions[CONFIG_LMB_RESERVED_REGIONS];
  73#endif
  74};
  75
  76extern void lmb_init(struct lmb *lmb);
  77extern void lmb_init_and_reserve(struct lmb *lmb, struct bd_info *bd,
  78                                 void *fdt_blob);
  79extern void lmb_init_and_reserve_range(struct lmb *lmb, phys_addr_t base,
  80                                       phys_size_t size, void *fdt_blob);
  81extern long lmb_add(struct lmb *lmb, phys_addr_t base, phys_size_t size);
  82extern long lmb_reserve(struct lmb *lmb, phys_addr_t base, phys_size_t size);
  83/**
  84 * lmb_reserve_flags - Reserve one region with a specific flags bitfield.
  85 *
  86 * @lmb         the logical memory block struct
  87 * @base        base address of the memory region
  88 * @size        size of the memory region
  89 * @flags       flags for the memory region
  90 * @return 0 if OK, > 0 for coalesced region or a negative error code.
  91 */
  92long lmb_reserve_flags(struct lmb *lmb, phys_addr_t base,
  93                       phys_size_t size, enum lmb_flags flags);
  94extern phys_addr_t lmb_alloc(struct lmb *lmb, phys_size_t size, ulong align);
  95extern phys_addr_t lmb_alloc_base(struct lmb *lmb, phys_size_t size, ulong align,
  96                            phys_addr_t max_addr);
  97extern phys_addr_t __lmb_alloc_base(struct lmb *lmb, phys_size_t size, ulong align,
  98                              phys_addr_t max_addr);
  99extern phys_addr_t lmb_alloc_addr(struct lmb *lmb, phys_addr_t base,
 100                                  phys_size_t size);
 101extern phys_size_t lmb_get_free_size(struct lmb *lmb, phys_addr_t addr);
 102extern int lmb_is_reserved(struct lmb *lmb, phys_addr_t addr);
 103/**
 104 * lmb_is_reserved_flags - test if tha address is in reserved region with a bitfield flag
 105 *
 106 * @lmb         the logical memory block struct
 107 * @addr        address to be tested
 108 * @flags       flags bitfied to be tested
 109 * @return 0 if not reserved or reserved without the requested flag else 1
 110 */
 111int lmb_is_reserved_flags(struct lmb *lmb, phys_addr_t addr, int flags);
 112extern long lmb_free(struct lmb *lmb, phys_addr_t base, phys_size_t size);
 113
 114extern void lmb_dump_all(struct lmb *lmb);
 115extern void lmb_dump_all_force(struct lmb *lmb);
 116
 117static inline phys_size_t
 118lmb_size_bytes(struct lmb_region *type, unsigned long region_nr)
 119{
 120        return type->region[region_nr].size;
 121}
 122
 123void board_lmb_reserve(struct lmb *lmb);
 124void arch_lmb_reserve(struct lmb *lmb);
 125
 126/* Low level functions */
 127
 128static inline bool lmb_is_nomap(struct lmb_property *m)
 129{
 130        return m->flags & LMB_NOMAP;
 131}
 132
 133#endif /* __KERNEL__ */
 134
 135#endif /* _LINUX_LMB_H */
 136