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