coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
memrange.c File Reference
#include <assert.h>
#include <stdlib.h>
#include <commonlib/helpers.h>
#include <console/console.h>
#include <memrange.h>
Include dependency graph for memrange.c:

Go to the source code of this file.

Data Structures

struct  collect_context
 

Typedefs

typedef void(* range_action_t) (struct memranges *ranges, resource_t begin, resource_t end, unsigned long tag)
 

Functions

static void range_entry_link (struct range_entry **prev_ptr, struct range_entry *r)
 
static void range_entry_unlink (struct range_entry **prev_ptr, struct range_entry *r)
 
static void range_entry_unlink_and_free (struct memranges *ranges, struct range_entry **prev_ptr, struct range_entry *r)
 
static struct range_entryalloc_range (struct memranges *ranges)
 
static struct range_entryrange_list_add (struct memranges *ranges, struct range_entry **prev_ptr, resource_t begin, resource_t end, unsigned long tag)
 
static void merge_neighbor_entries (struct memranges *ranges)
 
static void remove_memranges (struct memranges *ranges, resource_t begin, resource_t end, unsigned long unused)
 
static void merge_add_memranges (struct memranges *ranges, resource_t begin, resource_t end, unsigned long tag)
 
void memranges_update_tag (struct memranges *ranges, unsigned long old_tag, unsigned long new_tag)
 
static void do_action (struct memranges *ranges, resource_t base, resource_t size, unsigned long tag, range_action_t action)
 
void memranges_create_hole (struct memranges *ranges, resource_t base, resource_t size)
 
void memranges_insert (struct memranges *ranges, resource_t base, resource_t size, unsigned long tag)
 
static void collect_ranges (void *gp, struct device *dev, struct resource *res)
 
void memranges_add_resources_filter (struct memranges *ranges, unsigned long mask, unsigned long match, unsigned long tag, memrange_filter_t filter)
 
void memranges_add_resources (struct memranges *ranges, unsigned long mask, unsigned long match, unsigned long tag)
 
void memranges_init_empty_with_alignment (struct memranges *ranges, struct range_entry *to_free, size_t num_free, unsigned char align)
 
void memranges_init_with_alignment (struct memranges *ranges, unsigned long mask, unsigned long match, unsigned long tag, unsigned char align)
 
void memranges_clone (struct memranges *newranges, struct memranges *oldranges)
 
void memranges_teardown (struct memranges *ranges)
 
void memranges_fill_holes_up_to (struct memranges *ranges, resource_t limit, unsigned long tag)
 
struct range_entrymemranges_next_entry (struct memranges *ranges, const struct range_entry *r)
 
static const struct range_entrymemranges_find_entry (struct memranges *ranges, resource_t limit, resource_t size, unsigned char align, unsigned long tag)
 
bool memranges_steal (struct memranges *ranges, resource_t limit, resource_t size, unsigned char align, unsigned long tag, resource_t *stolen_base)
 

Typedef Documentation

◆ range_action_t

typedef void(* range_action_t) (struct memranges *ranges, resource_t begin, resource_t end, unsigned long tag)

Definition at line 207 of file memrange.c.

Function Documentation

◆ alloc_range()

static struct range_entry* alloc_range ( struct memranges ranges)
static

Definition at line 31 of file memrange.c.

References ENV_PAYLOAD_LOADER, memranges::free_list, malloc(), NULL, and range_entry_unlink().

Referenced by range_list_add().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ collect_ranges()

static void collect_ranges ( void gp,
struct device dev,
struct resource res 
)
static

Definition at line 248 of file memrange.c.

References resource::base, collect_context::filter, memranges_insert(), NULL, collect_context::ranges, resource::size, and collect_context::tag.

Referenced by memranges_add_resources_filter().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ do_action()

static void do_action ( struct memranges ranges,
resource_t  base,
resource_t  size,
unsigned long  tag,
range_action_t  action 
)
static

Definition at line 211 of file memrange.c.

References memranges::align, ALIGN_DOWN, ALIGN_UP, base, and POWER_OF_2.

Referenced by memranges_create_hole(), and memranges_insert().

Here is the caller graph for this function:

◆ memranges_add_resources()

void memranges_add_resources ( struct memranges ranges,
unsigned long  mask,
unsigned long  match,
unsigned long  tag 
)

Definition at line 276 of file memrange.c.

References mask, memranges_add_resources_filter(), NULL, collect_context::ranges, and collect_context::tag.

Referenced by bootmem_init(), get_physical_address_space(), and memranges_init_with_alignment().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ memranges_add_resources_filter()

void memranges_add_resources_filter ( struct memranges ranges,
unsigned long  mask,
unsigned long  match,
unsigned long  tag,
memrange_filter_t  filter 
)

Definition at line 259 of file memrange.c.

References collect_ranges(), collect_context::filter, IORESOURCE_MEM, mask, collect_context::ranges, search_global_resources(), and collect_context::tag.

Referenced by get_physical_address_space(), and memranges_add_resources().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ memranges_clone()

void memranges_clone ( struct memranges newranges,
struct memranges oldranges 
)

Definition at line 306 of file memrange.c.

References memranges::align, range_entry::begin, range_entry::end, memranges::entries, memranges_each_entry, memranges_init_empty_with_alignment(), range_entry::next, NULL, range_list_add(), and range_entry::tag.

Referenced by bootmem_init().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ memranges_create_hole()

void memranges_create_hole ( struct memranges ranges,
resource_t  base,
resource_t  size 
)

Definition at line 230 of file memrange.c.

References base, do_action(), and remove_memranges().

Referenced by constrain_domain_resources(), memranges_steal(), and update_constraints().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ memranges_fill_holes_up_to()

void memranges_fill_holes_up_to ( struct memranges ranges,
resource_t  limit,
unsigned long  tag 
)

Definition at line 329 of file memrange.c.

References range_entry::begin, range_entry::end, memranges::entries, merge_neighbor_entries(), range_entry::next, NULL, range_entry_end(), range_list_add(), and range_entry::tag.

Referenced by get_physical_address_space().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ memranges_find_entry()

static const struct range_entry* memranges_find_entry ( struct memranges ranges,
resource_t  limit,
resource_t  size,
unsigned char  align,
unsigned long  tag 
)
static

Definition at line 381 of file memrange.c.

References ALIGN_UP, base, range_entry::begin, range_entry::end, memranges_each_entry, NULL, POWER_OF_2, and range_entry::tag.

Referenced by memranges_steal().

Here is the caller graph for this function:

◆ memranges_init_empty_with_alignment()

void memranges_init_empty_with_alignment ( struct memranges ranges,
struct range_entry to_free,
size_t  num_free,
unsigned char  align 
)

Definition at line 283 of file memrange.c.

References memranges::align, memranges::entries, memranges::free_list, NULL, range_entry_link(), and collect_context::ranges.

Referenced by initialize_bridge_memranges(), initialize_domain_memranges(), memranges_clone(), and memranges_init_with_alignment().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ memranges_init_with_alignment()

void memranges_init_with_alignment ( struct memranges ranges,
unsigned long  mask,
unsigned long  match,
unsigned long  tag,
unsigned char  align 
)

Definition at line 297 of file memrange.c.

References mask, memranges_add_resources(), memranges_init_empty_with_alignment(), NULL, collect_context::ranges, and collect_context::tag.

Here is the call graph for this function:

◆ memranges_insert()

void memranges_insert ( struct memranges ranges,
resource_t  base,
resource_t  size,
unsigned long  tag 
)

Definition at line 236 of file memrange.c.

References base, do_action(), and merge_add_memranges().

Referenced by bootmem_add_range(), clear_memory(), collect_ranges(), initialize_bridge_memranges(), initialize_domain_io_resource_memranges(), initialize_domain_mem_resource_memranges(), mtrr_use_temp_range(), and walk_memory_table().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ memranges_next_entry()

struct range_entry* memranges_next_entry ( struct memranges ranges,
const struct range_entry r 
)

Definition at line 373 of file memrange.c.

References range_entry::next.

Referenced by calc_var_mtrrs_with_hole().

Here is the caller graph for this function:

◆ memranges_steal()

bool memranges_steal ( struct memranges ranges,
resource_t  limit,
resource_t  size,
unsigned char  align,
unsigned long  tag,
resource_t stolen_base 
)

Definition at line 416 of file memrange.c.

References ALIGN_UP, base, range_entry::begin, memranges_create_hole(), memranges_find_entry(), NULL, POWER_OF_2, and range_entry::tag.

Referenced by allocate_child_resources().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ memranges_teardown()

void memranges_teardown ( struct memranges ranges)

Definition at line 321 of file memrange.c.

References memranges::entries, NULL, and range_entry_unlink_and_free().

Referenced by cleanup_resource_ranges(), clear_memory(), fit_update_memory(), and mtrr_use_temp_range().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ memranges_update_tag()

void memranges_update_tag ( struct memranges ranges,
unsigned long  old_tag,
unsigned long  new_tag 
)

Definition at line 194 of file memrange.c.

References memranges_each_entry, merge_neighbor_entries(), range_entry_tag(), and range_entry_update_tag().

Referenced by calc_var_mtrrs().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ merge_add_memranges()

static void merge_add_memranges ( struct memranges ranges,
resource_t  begin,
resource_t  end,
unsigned long  tag 
)
static

Definition at line 160 of file memrange.c.

References range_entry::begin, range_entry::end, memranges::entries, merge_neighbor_entries(), range_entry::next, NULL, range_list_add(), remove_memranges(), and range_entry::tag.

Referenced by memranges_insert().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ merge_neighbor_entries()

static void merge_neighbor_entries ( struct memranges ranges)
static

Definition at line 64 of file memrange.c.

References range_entry::begin, range_entry::end, memranges::entries, range_entry::next, NULL, range_entry_unlink_and_free(), and range_entry::tag.

Referenced by memranges_fill_holes_up_to(), memranges_update_tag(), and merge_add_memranges().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ range_entry_link()

static void range_entry_link ( struct range_entry **  prev_ptr,
struct range_entry r 
)
inlinestatic

Definition at line 9 of file memrange.c.

References range_entry::next.

Referenced by memranges_init_empty_with_alignment(), range_entry_unlink_and_free(), and range_list_add().

Here is the caller graph for this function:

◆ range_entry_unlink()

static void range_entry_unlink ( struct range_entry **  prev_ptr,
struct range_entry r 
)
inlinestatic

Definition at line 16 of file memrange.c.

References range_entry::next, and NULL.

Referenced by alloc_range(), and range_entry_unlink_and_free().

Here is the caller graph for this function:

◆ range_entry_unlink_and_free()

static void range_entry_unlink_and_free ( struct memranges ranges,
struct range_entry **  prev_ptr,
struct range_entry r 
)
inlinestatic

Definition at line 23 of file memrange.c.

References memranges::free_list, range_entry_link(), and range_entry_unlink().

Referenced by memranges_teardown(), merge_neighbor_entries(), and remove_memranges().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ range_list_add()

static struct range_entry* range_list_add ( struct memranges ranges,
struct range_entry **  prev_ptr,
resource_t  begin,
resource_t  end,
unsigned long  tag 
)
inlinestatic

Definition at line 46 of file memrange.c.

References alloc_range(), range_entry::begin, BIOS_ERR, range_entry::end, NULL, printk, range_entry_link(), and range_entry::tag.

Referenced by memranges_clone(), memranges_fill_holes_up_to(), merge_add_memranges(), and remove_memranges().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ remove_memranges()

static void remove_memranges ( struct memranges ranges,
resource_t  begin,
resource_t  end,
unsigned long  unused 
)
static

Definition at line 94 of file memrange.c.

References range_entry::begin, range_entry::end, memranges::entries, range_entry::next, NULL, range_entry_unlink_and_free(), range_list_add(), and range_entry::tag.

Referenced by memranges_create_hole(), and merge_add_memranges().

Here is the call graph for this function:
Here is the caller graph for this function: