162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later 262306a36Sopenharmony_ci#include "alloc_helpers_api.h" 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci/* 562306a36Sopenharmony_ci * A simple test that tries to allocate a memory region above a specified, 662306a36Sopenharmony_ci * aligned address: 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * + 962306a36Sopenharmony_ci * | +-----------+ | 1062306a36Sopenharmony_ci * | | rgn | | 1162306a36Sopenharmony_ci * +----------+-----------+---------+ 1262306a36Sopenharmony_ci * ^ 1362306a36Sopenharmony_ci * | 1462306a36Sopenharmony_ci * Aligned min_addr 1562306a36Sopenharmony_ci * 1662306a36Sopenharmony_ci * Expect to allocate a cleared region at the minimal memory address. 1762306a36Sopenharmony_ci */ 1862306a36Sopenharmony_cistatic int alloc_from_simple_generic_check(void) 1962306a36Sopenharmony_ci{ 2062306a36Sopenharmony_ci struct memblock_region *rgn = &memblock.reserved.regions[0]; 2162306a36Sopenharmony_ci void *allocated_ptr = NULL; 2262306a36Sopenharmony_ci phys_addr_t size = SZ_16; 2362306a36Sopenharmony_ci phys_addr_t min_addr; 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci PREFIX_PUSH(); 2662306a36Sopenharmony_ci setup_memblock(); 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci min_addr = memblock_end_of_DRAM() - SMP_CACHE_BYTES; 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci allocated_ptr = memblock_alloc_from(size, SMP_CACHE_BYTES, min_addr); 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci ASSERT_NE(allocated_ptr, NULL); 3362306a36Sopenharmony_ci ASSERT_MEM_EQ(allocated_ptr, 0, size); 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci ASSERT_EQ(rgn->size, size); 3662306a36Sopenharmony_ci ASSERT_EQ(rgn->base, min_addr); 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci ASSERT_EQ(memblock.reserved.cnt, 1); 3962306a36Sopenharmony_ci ASSERT_EQ(memblock.reserved.total_size, size); 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci test_pass_pop(); 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci return 0; 4462306a36Sopenharmony_ci} 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci/* 4762306a36Sopenharmony_ci * A test that tries to allocate a memory region above a certain address. 4862306a36Sopenharmony_ci * The minimal address here is not aligned: 4962306a36Sopenharmony_ci * 5062306a36Sopenharmony_ci * + + 5162306a36Sopenharmony_ci * | + +---------+ | 5262306a36Sopenharmony_ci * | | | rgn | | 5362306a36Sopenharmony_ci * +------+------+---------+------------+ 5462306a36Sopenharmony_ci * ^ ^------. 5562306a36Sopenharmony_ci * | | 5662306a36Sopenharmony_ci * min_addr Aligned address 5762306a36Sopenharmony_ci * boundary 5862306a36Sopenharmony_ci * 5962306a36Sopenharmony_ci * Expect to allocate a cleared region at the closest aligned memory address. 6062306a36Sopenharmony_ci */ 6162306a36Sopenharmony_cistatic int alloc_from_misaligned_generic_check(void) 6262306a36Sopenharmony_ci{ 6362306a36Sopenharmony_ci struct memblock_region *rgn = &memblock.reserved.regions[0]; 6462306a36Sopenharmony_ci void *allocated_ptr = NULL; 6562306a36Sopenharmony_ci phys_addr_t size = SZ_32; 6662306a36Sopenharmony_ci phys_addr_t min_addr; 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci PREFIX_PUSH(); 6962306a36Sopenharmony_ci setup_memblock(); 7062306a36Sopenharmony_ci 7162306a36Sopenharmony_ci /* A misaligned address */ 7262306a36Sopenharmony_ci min_addr = memblock_end_of_DRAM() - (SMP_CACHE_BYTES * 2 - 1); 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci allocated_ptr = memblock_alloc_from(size, SMP_CACHE_BYTES, min_addr); 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci ASSERT_NE(allocated_ptr, NULL); 7762306a36Sopenharmony_ci ASSERT_MEM_EQ(allocated_ptr, 0, size); 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci ASSERT_EQ(rgn->size, size); 8062306a36Sopenharmony_ci ASSERT_EQ(rgn->base, memblock_end_of_DRAM() - SMP_CACHE_BYTES); 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci ASSERT_EQ(memblock.reserved.cnt, 1); 8362306a36Sopenharmony_ci ASSERT_EQ(memblock.reserved.total_size, size); 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_ci test_pass_pop(); 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ci return 0; 8862306a36Sopenharmony_ci} 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ci/* 9162306a36Sopenharmony_ci * A test that tries to allocate a memory region above an address that is too 9262306a36Sopenharmony_ci * close to the end of the memory: 9362306a36Sopenharmony_ci * 9462306a36Sopenharmony_ci * + + 9562306a36Sopenharmony_ci * | +--------+---+ | 9662306a36Sopenharmony_ci * | | rgn + | | 9762306a36Sopenharmony_ci * +-----------+--------+---+------+ 9862306a36Sopenharmony_ci * ^ ^ 9962306a36Sopenharmony_ci * | | 10062306a36Sopenharmony_ci * | min_addr 10162306a36Sopenharmony_ci * | 10262306a36Sopenharmony_ci * Aligned address 10362306a36Sopenharmony_ci * boundary 10462306a36Sopenharmony_ci * 10562306a36Sopenharmony_ci * Expect to prioritize granting memory over satisfying the minimal address 10662306a36Sopenharmony_ci * requirement. 10762306a36Sopenharmony_ci */ 10862306a36Sopenharmony_cistatic int alloc_from_top_down_high_addr_check(void) 10962306a36Sopenharmony_ci{ 11062306a36Sopenharmony_ci struct memblock_region *rgn = &memblock.reserved.regions[0]; 11162306a36Sopenharmony_ci void *allocated_ptr = NULL; 11262306a36Sopenharmony_ci phys_addr_t size = SZ_32; 11362306a36Sopenharmony_ci phys_addr_t min_addr; 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci PREFIX_PUSH(); 11662306a36Sopenharmony_ci setup_memblock(); 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci /* The address is too close to the end of the memory */ 11962306a36Sopenharmony_ci min_addr = memblock_end_of_DRAM() - SZ_16; 12062306a36Sopenharmony_ci 12162306a36Sopenharmony_ci allocated_ptr = memblock_alloc_from(size, SMP_CACHE_BYTES, min_addr); 12262306a36Sopenharmony_ci 12362306a36Sopenharmony_ci ASSERT_NE(allocated_ptr, NULL); 12462306a36Sopenharmony_ci ASSERT_EQ(rgn->size, size); 12562306a36Sopenharmony_ci ASSERT_EQ(rgn->base, memblock_end_of_DRAM() - SMP_CACHE_BYTES); 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci ASSERT_EQ(memblock.reserved.cnt, 1); 12862306a36Sopenharmony_ci ASSERT_EQ(memblock.reserved.total_size, size); 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci test_pass_pop(); 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_ci return 0; 13362306a36Sopenharmony_ci} 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci/* 13662306a36Sopenharmony_ci * A test that tries to allocate a memory region when there is no space 13762306a36Sopenharmony_ci * available above the minimal address above a certain address: 13862306a36Sopenharmony_ci * 13962306a36Sopenharmony_ci * + 14062306a36Sopenharmony_ci * | +---------+-------------| 14162306a36Sopenharmony_ci * | | rgn | | 14262306a36Sopenharmony_ci * +--------+---------+-------------+ 14362306a36Sopenharmony_ci * ^ 14462306a36Sopenharmony_ci * | 14562306a36Sopenharmony_ci * min_addr 14662306a36Sopenharmony_ci * 14762306a36Sopenharmony_ci * Expect to prioritize granting memory over satisfying the minimal address 14862306a36Sopenharmony_ci * requirement and to allocate next to the previously reserved region. The 14962306a36Sopenharmony_ci * regions get merged into one. 15062306a36Sopenharmony_ci */ 15162306a36Sopenharmony_cistatic int alloc_from_top_down_no_space_above_check(void) 15262306a36Sopenharmony_ci{ 15362306a36Sopenharmony_ci struct memblock_region *rgn = &memblock.reserved.regions[0]; 15462306a36Sopenharmony_ci void *allocated_ptr = NULL; 15562306a36Sopenharmony_ci phys_addr_t r1_size = SZ_64; 15662306a36Sopenharmony_ci phys_addr_t r2_size = SZ_2; 15762306a36Sopenharmony_ci phys_addr_t total_size = r1_size + r2_size; 15862306a36Sopenharmony_ci phys_addr_t min_addr; 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ci PREFIX_PUSH(); 16162306a36Sopenharmony_ci setup_memblock(); 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ci min_addr = memblock_end_of_DRAM() - SMP_CACHE_BYTES * 2; 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_ci /* No space above this address */ 16662306a36Sopenharmony_ci memblock_reserve(min_addr, r2_size); 16762306a36Sopenharmony_ci 16862306a36Sopenharmony_ci allocated_ptr = memblock_alloc_from(r1_size, SMP_CACHE_BYTES, min_addr); 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ci ASSERT_NE(allocated_ptr, NULL); 17162306a36Sopenharmony_ci ASSERT_EQ(rgn->base, min_addr - r1_size); 17262306a36Sopenharmony_ci ASSERT_EQ(rgn->size, total_size); 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_ci ASSERT_EQ(memblock.reserved.cnt, 1); 17562306a36Sopenharmony_ci ASSERT_EQ(memblock.reserved.total_size, total_size); 17662306a36Sopenharmony_ci 17762306a36Sopenharmony_ci test_pass_pop(); 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_ci return 0; 18062306a36Sopenharmony_ci} 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ci/* 18362306a36Sopenharmony_ci * A test that tries to allocate a memory region with a minimal address below 18462306a36Sopenharmony_ci * the start address of the available memory. As the allocation is top-down, 18562306a36Sopenharmony_ci * first reserve a region that will force allocation near the start. 18662306a36Sopenharmony_ci * Expect successful allocation and merge of both regions. 18762306a36Sopenharmony_ci */ 18862306a36Sopenharmony_cistatic int alloc_from_top_down_min_addr_cap_check(void) 18962306a36Sopenharmony_ci{ 19062306a36Sopenharmony_ci struct memblock_region *rgn = &memblock.reserved.regions[0]; 19162306a36Sopenharmony_ci void *allocated_ptr = NULL; 19262306a36Sopenharmony_ci phys_addr_t r1_size = SZ_64; 19362306a36Sopenharmony_ci phys_addr_t min_addr; 19462306a36Sopenharmony_ci phys_addr_t start_addr; 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ci PREFIX_PUSH(); 19762306a36Sopenharmony_ci setup_memblock(); 19862306a36Sopenharmony_ci 19962306a36Sopenharmony_ci start_addr = (phys_addr_t)memblock_start_of_DRAM(); 20062306a36Sopenharmony_ci min_addr = start_addr - SMP_CACHE_BYTES * 3; 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_ci memblock_reserve(start_addr + r1_size, MEM_SIZE - r1_size); 20362306a36Sopenharmony_ci 20462306a36Sopenharmony_ci allocated_ptr = memblock_alloc_from(r1_size, SMP_CACHE_BYTES, min_addr); 20562306a36Sopenharmony_ci 20662306a36Sopenharmony_ci ASSERT_NE(allocated_ptr, NULL); 20762306a36Sopenharmony_ci ASSERT_EQ(rgn->base, start_addr); 20862306a36Sopenharmony_ci ASSERT_EQ(rgn->size, MEM_SIZE); 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_ci ASSERT_EQ(memblock.reserved.cnt, 1); 21162306a36Sopenharmony_ci ASSERT_EQ(memblock.reserved.total_size, MEM_SIZE); 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_ci test_pass_pop(); 21462306a36Sopenharmony_ci 21562306a36Sopenharmony_ci return 0; 21662306a36Sopenharmony_ci} 21762306a36Sopenharmony_ci 21862306a36Sopenharmony_ci/* 21962306a36Sopenharmony_ci * A test that tries to allocate a memory region above an address that is too 22062306a36Sopenharmony_ci * close to the end of the memory: 22162306a36Sopenharmony_ci * 22262306a36Sopenharmony_ci * + 22362306a36Sopenharmony_ci * |-----------+ + | 22462306a36Sopenharmony_ci * | rgn | | | 22562306a36Sopenharmony_ci * +-----------+--------------+-----+ 22662306a36Sopenharmony_ci * ^ ^ 22762306a36Sopenharmony_ci * | | 22862306a36Sopenharmony_ci * Aligned address min_addr 22962306a36Sopenharmony_ci * boundary 23062306a36Sopenharmony_ci * 23162306a36Sopenharmony_ci * Expect to prioritize granting memory over satisfying the minimal address 23262306a36Sopenharmony_ci * requirement. Allocation happens at beginning of the available memory. 23362306a36Sopenharmony_ci */ 23462306a36Sopenharmony_cistatic int alloc_from_bottom_up_high_addr_check(void) 23562306a36Sopenharmony_ci{ 23662306a36Sopenharmony_ci struct memblock_region *rgn = &memblock.reserved.regions[0]; 23762306a36Sopenharmony_ci void *allocated_ptr = NULL; 23862306a36Sopenharmony_ci phys_addr_t size = SZ_32; 23962306a36Sopenharmony_ci phys_addr_t min_addr; 24062306a36Sopenharmony_ci 24162306a36Sopenharmony_ci PREFIX_PUSH(); 24262306a36Sopenharmony_ci setup_memblock(); 24362306a36Sopenharmony_ci 24462306a36Sopenharmony_ci /* The address is too close to the end of the memory */ 24562306a36Sopenharmony_ci min_addr = memblock_end_of_DRAM() - SZ_8; 24662306a36Sopenharmony_ci 24762306a36Sopenharmony_ci allocated_ptr = memblock_alloc_from(size, SMP_CACHE_BYTES, min_addr); 24862306a36Sopenharmony_ci 24962306a36Sopenharmony_ci ASSERT_NE(allocated_ptr, NULL); 25062306a36Sopenharmony_ci ASSERT_EQ(rgn->size, size); 25162306a36Sopenharmony_ci ASSERT_EQ(rgn->base, memblock_start_of_DRAM()); 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_ci ASSERT_EQ(memblock.reserved.cnt, 1); 25462306a36Sopenharmony_ci ASSERT_EQ(memblock.reserved.total_size, size); 25562306a36Sopenharmony_ci 25662306a36Sopenharmony_ci test_pass_pop(); 25762306a36Sopenharmony_ci 25862306a36Sopenharmony_ci return 0; 25962306a36Sopenharmony_ci} 26062306a36Sopenharmony_ci 26162306a36Sopenharmony_ci/* 26262306a36Sopenharmony_ci * A test that tries to allocate a memory region when there is no space 26362306a36Sopenharmony_ci * available above the minimal address above a certain address: 26462306a36Sopenharmony_ci * 26562306a36Sopenharmony_ci * + 26662306a36Sopenharmony_ci * |-----------+ +-------------------| 26762306a36Sopenharmony_ci * | rgn | | | 26862306a36Sopenharmony_ci * +-----------+----+-------------------+ 26962306a36Sopenharmony_ci * ^ 27062306a36Sopenharmony_ci * | 27162306a36Sopenharmony_ci * min_addr 27262306a36Sopenharmony_ci * 27362306a36Sopenharmony_ci * Expect to prioritize granting memory over satisfying the minimal address 27462306a36Sopenharmony_ci * requirement and to allocate at the beginning of the available memory. 27562306a36Sopenharmony_ci */ 27662306a36Sopenharmony_cistatic int alloc_from_bottom_up_no_space_above_check(void) 27762306a36Sopenharmony_ci{ 27862306a36Sopenharmony_ci struct memblock_region *rgn = &memblock.reserved.regions[0]; 27962306a36Sopenharmony_ci void *allocated_ptr = NULL; 28062306a36Sopenharmony_ci phys_addr_t r1_size = SZ_64; 28162306a36Sopenharmony_ci phys_addr_t min_addr; 28262306a36Sopenharmony_ci phys_addr_t r2_size; 28362306a36Sopenharmony_ci 28462306a36Sopenharmony_ci PREFIX_PUSH(); 28562306a36Sopenharmony_ci setup_memblock(); 28662306a36Sopenharmony_ci 28762306a36Sopenharmony_ci min_addr = memblock_start_of_DRAM() + SZ_128; 28862306a36Sopenharmony_ci r2_size = memblock_end_of_DRAM() - min_addr; 28962306a36Sopenharmony_ci 29062306a36Sopenharmony_ci /* No space above this address */ 29162306a36Sopenharmony_ci memblock_reserve(min_addr - SMP_CACHE_BYTES, r2_size); 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_ci allocated_ptr = memblock_alloc_from(r1_size, SMP_CACHE_BYTES, min_addr); 29462306a36Sopenharmony_ci 29562306a36Sopenharmony_ci ASSERT_NE(allocated_ptr, NULL); 29662306a36Sopenharmony_ci ASSERT_EQ(rgn->base, memblock_start_of_DRAM()); 29762306a36Sopenharmony_ci ASSERT_EQ(rgn->size, r1_size); 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_ci ASSERT_EQ(memblock.reserved.cnt, 2); 30062306a36Sopenharmony_ci ASSERT_EQ(memblock.reserved.total_size, r1_size + r2_size); 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ci test_pass_pop(); 30362306a36Sopenharmony_ci 30462306a36Sopenharmony_ci return 0; 30562306a36Sopenharmony_ci} 30662306a36Sopenharmony_ci 30762306a36Sopenharmony_ci/* 30862306a36Sopenharmony_ci * A test that tries to allocate a memory region with a minimal address below 30962306a36Sopenharmony_ci * the start address of the available memory. Expect to allocate a region 31062306a36Sopenharmony_ci * at the beginning of the available memory. 31162306a36Sopenharmony_ci */ 31262306a36Sopenharmony_cistatic int alloc_from_bottom_up_min_addr_cap_check(void) 31362306a36Sopenharmony_ci{ 31462306a36Sopenharmony_ci struct memblock_region *rgn = &memblock.reserved.regions[0]; 31562306a36Sopenharmony_ci void *allocated_ptr = NULL; 31662306a36Sopenharmony_ci phys_addr_t r1_size = SZ_64; 31762306a36Sopenharmony_ci phys_addr_t min_addr; 31862306a36Sopenharmony_ci phys_addr_t start_addr; 31962306a36Sopenharmony_ci 32062306a36Sopenharmony_ci PREFIX_PUSH(); 32162306a36Sopenharmony_ci setup_memblock(); 32262306a36Sopenharmony_ci 32362306a36Sopenharmony_ci start_addr = (phys_addr_t)memblock_start_of_DRAM(); 32462306a36Sopenharmony_ci min_addr = start_addr - SMP_CACHE_BYTES * 3; 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_ci allocated_ptr = memblock_alloc_from(r1_size, SMP_CACHE_BYTES, min_addr); 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_ci ASSERT_NE(allocated_ptr, NULL); 32962306a36Sopenharmony_ci ASSERT_EQ(rgn->base, start_addr); 33062306a36Sopenharmony_ci ASSERT_EQ(rgn->size, r1_size); 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_ci ASSERT_EQ(memblock.reserved.cnt, 1); 33362306a36Sopenharmony_ci ASSERT_EQ(memblock.reserved.total_size, r1_size); 33462306a36Sopenharmony_ci 33562306a36Sopenharmony_ci test_pass_pop(); 33662306a36Sopenharmony_ci 33762306a36Sopenharmony_ci return 0; 33862306a36Sopenharmony_ci} 33962306a36Sopenharmony_ci 34062306a36Sopenharmony_ci/* Test case wrappers */ 34162306a36Sopenharmony_cistatic int alloc_from_simple_check(void) 34262306a36Sopenharmony_ci{ 34362306a36Sopenharmony_ci test_print("\tRunning %s...\n", __func__); 34462306a36Sopenharmony_ci run_top_down(alloc_from_simple_generic_check); 34562306a36Sopenharmony_ci run_bottom_up(alloc_from_simple_generic_check); 34662306a36Sopenharmony_ci 34762306a36Sopenharmony_ci return 0; 34862306a36Sopenharmony_ci} 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_cistatic int alloc_from_misaligned_check(void) 35162306a36Sopenharmony_ci{ 35262306a36Sopenharmony_ci test_print("\tRunning %s...\n", __func__); 35362306a36Sopenharmony_ci run_top_down(alloc_from_misaligned_generic_check); 35462306a36Sopenharmony_ci run_bottom_up(alloc_from_misaligned_generic_check); 35562306a36Sopenharmony_ci 35662306a36Sopenharmony_ci return 0; 35762306a36Sopenharmony_ci} 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_cistatic int alloc_from_high_addr_check(void) 36062306a36Sopenharmony_ci{ 36162306a36Sopenharmony_ci test_print("\tRunning %s...\n", __func__); 36262306a36Sopenharmony_ci memblock_set_bottom_up(false); 36362306a36Sopenharmony_ci alloc_from_top_down_high_addr_check(); 36462306a36Sopenharmony_ci memblock_set_bottom_up(true); 36562306a36Sopenharmony_ci alloc_from_bottom_up_high_addr_check(); 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_ci return 0; 36862306a36Sopenharmony_ci} 36962306a36Sopenharmony_ci 37062306a36Sopenharmony_cistatic int alloc_from_no_space_above_check(void) 37162306a36Sopenharmony_ci{ 37262306a36Sopenharmony_ci test_print("\tRunning %s...\n", __func__); 37362306a36Sopenharmony_ci memblock_set_bottom_up(false); 37462306a36Sopenharmony_ci alloc_from_top_down_no_space_above_check(); 37562306a36Sopenharmony_ci memblock_set_bottom_up(true); 37662306a36Sopenharmony_ci alloc_from_bottom_up_no_space_above_check(); 37762306a36Sopenharmony_ci 37862306a36Sopenharmony_ci return 0; 37962306a36Sopenharmony_ci} 38062306a36Sopenharmony_ci 38162306a36Sopenharmony_cistatic int alloc_from_min_addr_cap_check(void) 38262306a36Sopenharmony_ci{ 38362306a36Sopenharmony_ci test_print("\tRunning %s...\n", __func__); 38462306a36Sopenharmony_ci memblock_set_bottom_up(false); 38562306a36Sopenharmony_ci alloc_from_top_down_min_addr_cap_check(); 38662306a36Sopenharmony_ci memblock_set_bottom_up(true); 38762306a36Sopenharmony_ci alloc_from_bottom_up_min_addr_cap_check(); 38862306a36Sopenharmony_ci 38962306a36Sopenharmony_ci return 0; 39062306a36Sopenharmony_ci} 39162306a36Sopenharmony_ci 39262306a36Sopenharmony_ciint memblock_alloc_helpers_checks(void) 39362306a36Sopenharmony_ci{ 39462306a36Sopenharmony_ci const char *func_testing = "memblock_alloc_from"; 39562306a36Sopenharmony_ci 39662306a36Sopenharmony_ci prefix_reset(); 39762306a36Sopenharmony_ci prefix_push(func_testing); 39862306a36Sopenharmony_ci test_print("Running %s tests...\n", func_testing); 39962306a36Sopenharmony_ci 40062306a36Sopenharmony_ci reset_memblock_attributes(); 40162306a36Sopenharmony_ci dummy_physical_memory_init(); 40262306a36Sopenharmony_ci 40362306a36Sopenharmony_ci alloc_from_simple_check(); 40462306a36Sopenharmony_ci alloc_from_misaligned_check(); 40562306a36Sopenharmony_ci alloc_from_high_addr_check(); 40662306a36Sopenharmony_ci alloc_from_no_space_above_check(); 40762306a36Sopenharmony_ci alloc_from_min_addr_cap_check(); 40862306a36Sopenharmony_ci 40962306a36Sopenharmony_ci dummy_physical_memory_cleanup(); 41062306a36Sopenharmony_ci 41162306a36Sopenharmony_ci prefix_pop(); 41262306a36Sopenharmony_ci 41362306a36Sopenharmony_ci return 0; 41462306a36Sopenharmony_ci} 415