116567b5fSKarolina Drobnik // SPDX-License-Identifier: GPL-2.0-or-later
216567b5fSKarolina Drobnik #include "alloc_helpers_api.h"
316567b5fSKarolina Drobnik 
416567b5fSKarolina Drobnik /*
516567b5fSKarolina Drobnik  * A simple test that tries to allocate a memory region above a specified,
616567b5fSKarolina Drobnik  * aligned address:
716567b5fSKarolina Drobnik  *
816567b5fSKarolina Drobnik  *             +
916567b5fSKarolina Drobnik  *  |          +-----------+         |
1016567b5fSKarolina Drobnik  *  |          |    rgn    |         |
1116567b5fSKarolina Drobnik  *  +----------+-----------+---------+
1216567b5fSKarolina Drobnik  *             ^
1316567b5fSKarolina Drobnik  *             |
1416567b5fSKarolina Drobnik  *             Aligned min_addr
1516567b5fSKarolina Drobnik  *
1616567b5fSKarolina Drobnik  * Expect to allocate a cleared region at the minimal memory address.
1716567b5fSKarolina Drobnik  */
alloc_from_simple_generic_check(void)1816567b5fSKarolina Drobnik static int alloc_from_simple_generic_check(void)
1916567b5fSKarolina Drobnik {
2016567b5fSKarolina Drobnik 	struct memblock_region *rgn = &memblock.reserved.regions[0];
2116567b5fSKarolina Drobnik 	void *allocated_ptr = NULL;
2216567b5fSKarolina Drobnik 	phys_addr_t size = SZ_16;
2316567b5fSKarolina Drobnik 	phys_addr_t min_addr;
2416567b5fSKarolina Drobnik 
25*42c3ba86SRebecca Mckeever 	PREFIX_PUSH();
2616567b5fSKarolina Drobnik 	setup_memblock();
2716567b5fSKarolina Drobnik 
2816567b5fSKarolina Drobnik 	min_addr = memblock_end_of_DRAM() - SMP_CACHE_BYTES;
2916567b5fSKarolina Drobnik 
3016567b5fSKarolina Drobnik 	allocated_ptr = memblock_alloc_from(size, SMP_CACHE_BYTES, min_addr);
3116567b5fSKarolina Drobnik 
3276586c00SRebecca Mckeever 	ASSERT_NE(allocated_ptr, NULL);
3325b9defbSRebecca Mckeever 	ASSERT_MEM_EQ(allocated_ptr, 0, size);
3416567b5fSKarolina Drobnik 
3576586c00SRebecca Mckeever 	ASSERT_EQ(rgn->size, size);
3676586c00SRebecca Mckeever 	ASSERT_EQ(rgn->base, min_addr);
3716567b5fSKarolina Drobnik 
3876586c00SRebecca Mckeever 	ASSERT_EQ(memblock.reserved.cnt, 1);
3976586c00SRebecca Mckeever 	ASSERT_EQ(memblock.reserved.total_size, size);
4076586c00SRebecca Mckeever 
4176586c00SRebecca Mckeever 	test_pass_pop();
4216567b5fSKarolina Drobnik 
4316567b5fSKarolina Drobnik 	return 0;
4416567b5fSKarolina Drobnik }
4516567b5fSKarolina Drobnik 
4616567b5fSKarolina Drobnik /*
4716567b5fSKarolina Drobnik  * A test that tries to allocate a memory region above a certain address.
4816567b5fSKarolina Drobnik  * The minimal address here is not aligned:
4916567b5fSKarolina Drobnik  *
5016567b5fSKarolina Drobnik  *         +      +
5116567b5fSKarolina Drobnik  *  |      +      +---------+            |
5216567b5fSKarolina Drobnik  *  |      |      |   rgn   |            |
5316567b5fSKarolina Drobnik  *  +------+------+---------+------------+
5416567b5fSKarolina Drobnik  *         ^      ^------.
5516567b5fSKarolina Drobnik  *         |             |
5616567b5fSKarolina Drobnik  *       min_addr        Aligned address
5716567b5fSKarolina Drobnik  *                       boundary
5816567b5fSKarolina Drobnik  *
5916567b5fSKarolina Drobnik  * Expect to allocate a cleared region at the closest aligned memory address.
6016567b5fSKarolina Drobnik  */
alloc_from_misaligned_generic_check(void)6116567b5fSKarolina Drobnik static int alloc_from_misaligned_generic_check(void)
6216567b5fSKarolina Drobnik {
6316567b5fSKarolina Drobnik 	struct memblock_region *rgn = &memblock.reserved.regions[0];
6416567b5fSKarolina Drobnik 	void *allocated_ptr = NULL;
6516567b5fSKarolina Drobnik 	phys_addr_t size = SZ_32;
6616567b5fSKarolina Drobnik 	phys_addr_t min_addr;
6716567b5fSKarolina Drobnik 
68*42c3ba86SRebecca Mckeever 	PREFIX_PUSH();
6916567b5fSKarolina Drobnik 	setup_memblock();
7016567b5fSKarolina Drobnik 
7116567b5fSKarolina Drobnik 	/* A misaligned address */
7216567b5fSKarolina Drobnik 	min_addr = memblock_end_of_DRAM() - (SMP_CACHE_BYTES * 2 - 1);
7316567b5fSKarolina Drobnik 
7416567b5fSKarolina Drobnik 	allocated_ptr = memblock_alloc_from(size, SMP_CACHE_BYTES, min_addr);
7516567b5fSKarolina Drobnik 
7676586c00SRebecca Mckeever 	ASSERT_NE(allocated_ptr, NULL);
7725b9defbSRebecca Mckeever 	ASSERT_MEM_EQ(allocated_ptr, 0, size);
7816567b5fSKarolina Drobnik 
7976586c00SRebecca Mckeever 	ASSERT_EQ(rgn->size, size);
8076586c00SRebecca Mckeever 	ASSERT_EQ(rgn->base, memblock_end_of_DRAM() - SMP_CACHE_BYTES);
8116567b5fSKarolina Drobnik 
8276586c00SRebecca Mckeever 	ASSERT_EQ(memblock.reserved.cnt, 1);
8376586c00SRebecca Mckeever 	ASSERT_EQ(memblock.reserved.total_size, size);
8476586c00SRebecca Mckeever 
8576586c00SRebecca Mckeever 	test_pass_pop();
8616567b5fSKarolina Drobnik 
8716567b5fSKarolina Drobnik 	return 0;
8816567b5fSKarolina Drobnik }
8916567b5fSKarolina Drobnik 
9016567b5fSKarolina Drobnik /*
9116567b5fSKarolina Drobnik  * A test that tries to allocate a memory region above an address that is too
9216567b5fSKarolina Drobnik  * close to the end of the memory:
9316567b5fSKarolina Drobnik  *
9416567b5fSKarolina Drobnik  *              +        +
9516567b5fSKarolina Drobnik  *  |           +--------+---+      |
9616567b5fSKarolina Drobnik  *  |           |   rgn  +   |      |
9716567b5fSKarolina Drobnik  *  +-----------+--------+---+------+
9816567b5fSKarolina Drobnik  *              ^        ^
9916567b5fSKarolina Drobnik  *              |        |
10016567b5fSKarolina Drobnik  *              |        min_addr
10116567b5fSKarolina Drobnik  *              |
10216567b5fSKarolina Drobnik  *              Aligned address
10316567b5fSKarolina Drobnik  *              boundary
10416567b5fSKarolina Drobnik  *
10516567b5fSKarolina Drobnik  * Expect to prioritize granting memory over satisfying the minimal address
10616567b5fSKarolina Drobnik  * requirement.
10716567b5fSKarolina Drobnik  */
alloc_from_top_down_high_addr_check(void)10816567b5fSKarolina Drobnik static int alloc_from_top_down_high_addr_check(void)
10916567b5fSKarolina Drobnik {
11016567b5fSKarolina Drobnik 	struct memblock_region *rgn = &memblock.reserved.regions[0];
11116567b5fSKarolina Drobnik 	void *allocated_ptr = NULL;
11216567b5fSKarolina Drobnik 	phys_addr_t size = SZ_32;
11316567b5fSKarolina Drobnik 	phys_addr_t min_addr;
11416567b5fSKarolina Drobnik 
115*42c3ba86SRebecca Mckeever 	PREFIX_PUSH();
11616567b5fSKarolina Drobnik 	setup_memblock();
11716567b5fSKarolina Drobnik 
11816567b5fSKarolina Drobnik 	/* The address is too close to the end of the memory */
11916567b5fSKarolina Drobnik 	min_addr = memblock_end_of_DRAM() - SZ_16;
12016567b5fSKarolina Drobnik 
12116567b5fSKarolina Drobnik 	allocated_ptr = memblock_alloc_from(size, SMP_CACHE_BYTES, min_addr);
12216567b5fSKarolina Drobnik 
12376586c00SRebecca Mckeever 	ASSERT_NE(allocated_ptr, NULL);
12476586c00SRebecca Mckeever 	ASSERT_EQ(rgn->size, size);
12576586c00SRebecca Mckeever 	ASSERT_EQ(rgn->base, memblock_end_of_DRAM() - SMP_CACHE_BYTES);
12616567b5fSKarolina Drobnik 
12776586c00SRebecca Mckeever 	ASSERT_EQ(memblock.reserved.cnt, 1);
12876586c00SRebecca Mckeever 	ASSERT_EQ(memblock.reserved.total_size, size);
12976586c00SRebecca Mckeever 
13076586c00SRebecca Mckeever 	test_pass_pop();
13116567b5fSKarolina Drobnik 
13216567b5fSKarolina Drobnik 	return 0;
13316567b5fSKarolina Drobnik }
13416567b5fSKarolina Drobnik 
13516567b5fSKarolina Drobnik /*
13616567b5fSKarolina Drobnik  * A test that tries to allocate a memory region when there is no space
13716567b5fSKarolina Drobnik  * available above the minimal address above a certain address:
13816567b5fSKarolina Drobnik  *
13916567b5fSKarolina Drobnik  *                     +
14016567b5fSKarolina Drobnik  *  |        +---------+-------------|
14116567b5fSKarolina Drobnik  *  |        |   rgn   |             |
14216567b5fSKarolina Drobnik  *  +--------+---------+-------------+
14316567b5fSKarolina Drobnik  *                     ^
14416567b5fSKarolina Drobnik  *                     |
14516567b5fSKarolina Drobnik  *                     min_addr
14616567b5fSKarolina Drobnik  *
14716567b5fSKarolina Drobnik  * Expect to prioritize granting memory over satisfying the minimal address
14816567b5fSKarolina Drobnik  * requirement and to allocate next to the previously reserved region. The
14916567b5fSKarolina Drobnik  * regions get merged into one.
15016567b5fSKarolina Drobnik  */
alloc_from_top_down_no_space_above_check(void)15116567b5fSKarolina Drobnik static int alloc_from_top_down_no_space_above_check(void)
15216567b5fSKarolina Drobnik {
15316567b5fSKarolina Drobnik 	struct memblock_region *rgn = &memblock.reserved.regions[0];
15416567b5fSKarolina Drobnik 	void *allocated_ptr = NULL;
15516567b5fSKarolina Drobnik 	phys_addr_t r1_size = SZ_64;
15616567b5fSKarolina Drobnik 	phys_addr_t r2_size = SZ_2;
15716567b5fSKarolina Drobnik 	phys_addr_t total_size = r1_size + r2_size;
15816567b5fSKarolina Drobnik 	phys_addr_t min_addr;
15916567b5fSKarolina Drobnik 
160*42c3ba86SRebecca Mckeever 	PREFIX_PUSH();
16116567b5fSKarolina Drobnik 	setup_memblock();
16216567b5fSKarolina Drobnik 
16316567b5fSKarolina Drobnik 	min_addr = memblock_end_of_DRAM() - SMP_CACHE_BYTES * 2;
16416567b5fSKarolina Drobnik 
16516567b5fSKarolina Drobnik 	/* No space above this address */
16616567b5fSKarolina Drobnik 	memblock_reserve(min_addr, r2_size);
16716567b5fSKarolina Drobnik 
16816567b5fSKarolina Drobnik 	allocated_ptr = memblock_alloc_from(r1_size, SMP_CACHE_BYTES, min_addr);
16916567b5fSKarolina Drobnik 
17076586c00SRebecca Mckeever 	ASSERT_NE(allocated_ptr, NULL);
17176586c00SRebecca Mckeever 	ASSERT_EQ(rgn->base, min_addr - r1_size);
17276586c00SRebecca Mckeever 	ASSERT_EQ(rgn->size, total_size);
17316567b5fSKarolina Drobnik 
17476586c00SRebecca Mckeever 	ASSERT_EQ(memblock.reserved.cnt, 1);
17576586c00SRebecca Mckeever 	ASSERT_EQ(memblock.reserved.total_size, total_size);
17676586c00SRebecca Mckeever 
17776586c00SRebecca Mckeever 	test_pass_pop();
17816567b5fSKarolina Drobnik 
17916567b5fSKarolina Drobnik 	return 0;
18016567b5fSKarolina Drobnik }
18116567b5fSKarolina Drobnik 
18216567b5fSKarolina Drobnik /*
18316567b5fSKarolina Drobnik  * A test that tries to allocate a memory region with a minimal address below
18416567b5fSKarolina Drobnik  * the start address of the available memory. As the allocation is top-down,
18516567b5fSKarolina Drobnik  * first reserve a region that will force allocation near the start.
18616567b5fSKarolina Drobnik  * Expect successful allocation and merge of both regions.
18716567b5fSKarolina Drobnik  */
alloc_from_top_down_min_addr_cap_check(void)18816567b5fSKarolina Drobnik static int alloc_from_top_down_min_addr_cap_check(void)
18916567b5fSKarolina Drobnik {
19016567b5fSKarolina Drobnik 	struct memblock_region *rgn = &memblock.reserved.regions[0];
19116567b5fSKarolina Drobnik 	void *allocated_ptr = NULL;
19216567b5fSKarolina Drobnik 	phys_addr_t r1_size = SZ_64;
19316567b5fSKarolina Drobnik 	phys_addr_t min_addr;
19416567b5fSKarolina Drobnik 	phys_addr_t start_addr;
19516567b5fSKarolina Drobnik 
196*42c3ba86SRebecca Mckeever 	PREFIX_PUSH();
19716567b5fSKarolina Drobnik 	setup_memblock();
19816567b5fSKarolina Drobnik 
19916567b5fSKarolina Drobnik 	start_addr = (phys_addr_t)memblock_start_of_DRAM();
20016567b5fSKarolina Drobnik 	min_addr = start_addr - SMP_CACHE_BYTES * 3;
20116567b5fSKarolina Drobnik 
20216567b5fSKarolina Drobnik 	memblock_reserve(start_addr + r1_size, MEM_SIZE - r1_size);
20316567b5fSKarolina Drobnik 
20416567b5fSKarolina Drobnik 	allocated_ptr = memblock_alloc_from(r1_size, SMP_CACHE_BYTES, min_addr);
20516567b5fSKarolina Drobnik 
20676586c00SRebecca Mckeever 	ASSERT_NE(allocated_ptr, NULL);
20776586c00SRebecca Mckeever 	ASSERT_EQ(rgn->base, start_addr);
20876586c00SRebecca Mckeever 	ASSERT_EQ(rgn->size, MEM_SIZE);
20916567b5fSKarolina Drobnik 
21076586c00SRebecca Mckeever 	ASSERT_EQ(memblock.reserved.cnt, 1);
21176586c00SRebecca Mckeever 	ASSERT_EQ(memblock.reserved.total_size, MEM_SIZE);
21276586c00SRebecca Mckeever 
21376586c00SRebecca Mckeever 	test_pass_pop();
21416567b5fSKarolina Drobnik 
21516567b5fSKarolina Drobnik 	return 0;
21616567b5fSKarolina Drobnik }
21716567b5fSKarolina Drobnik 
2180ac06631SKarolina Drobnik /*
2190ac06631SKarolina Drobnik  * A test that tries to allocate a memory region above an address that is too
2200ac06631SKarolina Drobnik  * close to the end of the memory:
2210ac06631SKarolina Drobnik  *
2220ac06631SKarolina Drobnik  *                             +
2230ac06631SKarolina Drobnik  *  |-----------+              +     |
2240ac06631SKarolina Drobnik  *  |    rgn    |              |     |
2250ac06631SKarolina Drobnik  *  +-----------+--------------+-----+
2260ac06631SKarolina Drobnik  *  ^                          ^
2270ac06631SKarolina Drobnik  *  |                          |
2280ac06631SKarolina Drobnik  *  Aligned address            min_addr
2290ac06631SKarolina Drobnik  *  boundary
2300ac06631SKarolina Drobnik  *
2310ac06631SKarolina Drobnik  * Expect to prioritize granting memory over satisfying the minimal address
2320ac06631SKarolina Drobnik  * requirement. Allocation happens at beginning of the available memory.
2330ac06631SKarolina Drobnik  */
alloc_from_bottom_up_high_addr_check(void)2340ac06631SKarolina Drobnik static int alloc_from_bottom_up_high_addr_check(void)
2350ac06631SKarolina Drobnik {
2360ac06631SKarolina Drobnik 	struct memblock_region *rgn = &memblock.reserved.regions[0];
2370ac06631SKarolina Drobnik 	void *allocated_ptr = NULL;
2380ac06631SKarolina Drobnik 	phys_addr_t size = SZ_32;
2390ac06631SKarolina Drobnik 	phys_addr_t min_addr;
2400ac06631SKarolina Drobnik 
241*42c3ba86SRebecca Mckeever 	PREFIX_PUSH();
2420ac06631SKarolina Drobnik 	setup_memblock();
2430ac06631SKarolina Drobnik 
2440ac06631SKarolina Drobnik 	/* The address is too close to the end of the memory */
2450ac06631SKarolina Drobnik 	min_addr = memblock_end_of_DRAM() - SZ_8;
2460ac06631SKarolina Drobnik 
2470ac06631SKarolina Drobnik 	allocated_ptr = memblock_alloc_from(size, SMP_CACHE_BYTES, min_addr);
2480ac06631SKarolina Drobnik 
24976586c00SRebecca Mckeever 	ASSERT_NE(allocated_ptr, NULL);
25076586c00SRebecca Mckeever 	ASSERT_EQ(rgn->size, size);
25176586c00SRebecca Mckeever 	ASSERT_EQ(rgn->base, memblock_start_of_DRAM());
2520ac06631SKarolina Drobnik 
25376586c00SRebecca Mckeever 	ASSERT_EQ(memblock.reserved.cnt, 1);
25476586c00SRebecca Mckeever 	ASSERT_EQ(memblock.reserved.total_size, size);
25576586c00SRebecca Mckeever 
25676586c00SRebecca Mckeever 	test_pass_pop();
2570ac06631SKarolina Drobnik 
2580ac06631SKarolina Drobnik 	return 0;
2590ac06631SKarolina Drobnik }
2600ac06631SKarolina Drobnik 
2610ac06631SKarolina Drobnik /*
2620ac06631SKarolina Drobnik  * A test that tries to allocate a memory region when there is no space
2630ac06631SKarolina Drobnik  * available above the minimal address above a certain address:
2640ac06631SKarolina Drobnik  *
2650ac06631SKarolina Drobnik  *                   +
2660ac06631SKarolina Drobnik  *  |-----------+    +-------------------|
2670ac06631SKarolina Drobnik  *  |    rgn    |    |                   |
2680ac06631SKarolina Drobnik  *  +-----------+----+-------------------+
2690ac06631SKarolina Drobnik  *                   ^
2700ac06631SKarolina Drobnik  *                   |
2710ac06631SKarolina Drobnik  *                   min_addr
2720ac06631SKarolina Drobnik  *
2730ac06631SKarolina Drobnik  * Expect to prioritize granting memory over satisfying the minimal address
2740ac06631SKarolina Drobnik  * requirement and to allocate at the beginning of the available memory.
2750ac06631SKarolina Drobnik  */
alloc_from_bottom_up_no_space_above_check(void)2760ac06631SKarolina Drobnik static int alloc_from_bottom_up_no_space_above_check(void)
2770ac06631SKarolina Drobnik {
2780ac06631SKarolina Drobnik 	struct memblock_region *rgn = &memblock.reserved.regions[0];
2790ac06631SKarolina Drobnik 	void *allocated_ptr = NULL;
2800ac06631SKarolina Drobnik 	phys_addr_t r1_size = SZ_64;
2810ac06631SKarolina Drobnik 	phys_addr_t min_addr;
2820ac06631SKarolina Drobnik 	phys_addr_t r2_size;
2830ac06631SKarolina Drobnik 
284*42c3ba86SRebecca Mckeever 	PREFIX_PUSH();
2850ac06631SKarolina Drobnik 	setup_memblock();
2860ac06631SKarolina Drobnik 
2870ac06631SKarolina Drobnik 	min_addr = memblock_start_of_DRAM() + SZ_128;
2880ac06631SKarolina Drobnik 	r2_size = memblock_end_of_DRAM() - min_addr;
2890ac06631SKarolina Drobnik 
2900ac06631SKarolina Drobnik 	/* No space above this address */
2910ac06631SKarolina Drobnik 	memblock_reserve(min_addr - SMP_CACHE_BYTES, r2_size);
2920ac06631SKarolina Drobnik 
2930ac06631SKarolina Drobnik 	allocated_ptr = memblock_alloc_from(r1_size, SMP_CACHE_BYTES, min_addr);
2940ac06631SKarolina Drobnik 
29576586c00SRebecca Mckeever 	ASSERT_NE(allocated_ptr, NULL);
29676586c00SRebecca Mckeever 	ASSERT_EQ(rgn->base, memblock_start_of_DRAM());
29776586c00SRebecca Mckeever 	ASSERT_EQ(rgn->size, r1_size);
2980ac06631SKarolina Drobnik 
29976586c00SRebecca Mckeever 	ASSERT_EQ(memblock.reserved.cnt, 2);
30076586c00SRebecca Mckeever 	ASSERT_EQ(memblock.reserved.total_size, r1_size + r2_size);
30176586c00SRebecca Mckeever 
30276586c00SRebecca Mckeever 	test_pass_pop();
3030ac06631SKarolina Drobnik 
3040ac06631SKarolina Drobnik 	return 0;
3050ac06631SKarolina Drobnik }
3060ac06631SKarolina Drobnik 
3070ac06631SKarolina Drobnik /*
3080ac06631SKarolina Drobnik  * A test that tries to allocate a memory region with a minimal address below
3090ac06631SKarolina Drobnik  * the start address of the available memory. Expect to allocate a region
3100ac06631SKarolina Drobnik  * at the beginning of the available memory.
3110ac06631SKarolina Drobnik  */
alloc_from_bottom_up_min_addr_cap_check(void)3120ac06631SKarolina Drobnik static int alloc_from_bottom_up_min_addr_cap_check(void)
3130ac06631SKarolina Drobnik {
3140ac06631SKarolina Drobnik 	struct memblock_region *rgn = &memblock.reserved.regions[0];
3150ac06631SKarolina Drobnik 	void *allocated_ptr = NULL;
3160ac06631SKarolina Drobnik 	phys_addr_t r1_size = SZ_64;
3170ac06631SKarolina Drobnik 	phys_addr_t min_addr;
3180ac06631SKarolina Drobnik 	phys_addr_t start_addr;
3190ac06631SKarolina Drobnik 
320*42c3ba86SRebecca Mckeever 	PREFIX_PUSH();
3210ac06631SKarolina Drobnik 	setup_memblock();
3220ac06631SKarolina Drobnik 
3230ac06631SKarolina Drobnik 	start_addr = (phys_addr_t)memblock_start_of_DRAM();
3240ac06631SKarolina Drobnik 	min_addr = start_addr - SMP_CACHE_BYTES * 3;
3250ac06631SKarolina Drobnik 
3260ac06631SKarolina Drobnik 	allocated_ptr = memblock_alloc_from(r1_size, SMP_CACHE_BYTES, min_addr);
3270ac06631SKarolina Drobnik 
32876586c00SRebecca Mckeever 	ASSERT_NE(allocated_ptr, NULL);
32976586c00SRebecca Mckeever 	ASSERT_EQ(rgn->base, start_addr);
33076586c00SRebecca Mckeever 	ASSERT_EQ(rgn->size, r1_size);
3310ac06631SKarolina Drobnik 
33276586c00SRebecca Mckeever 	ASSERT_EQ(memblock.reserved.cnt, 1);
33376586c00SRebecca Mckeever 	ASSERT_EQ(memblock.reserved.total_size, r1_size);
33476586c00SRebecca Mckeever 
33576586c00SRebecca Mckeever 	test_pass_pop();
3360ac06631SKarolina Drobnik 
3370ac06631SKarolina Drobnik 	return 0;
3380ac06631SKarolina Drobnik }
3390ac06631SKarolina Drobnik 
3400ac06631SKarolina Drobnik /* Test case wrappers */
alloc_from_simple_check(void)3410ac06631SKarolina Drobnik static int alloc_from_simple_check(void)
3420ac06631SKarolina Drobnik {
34376586c00SRebecca Mckeever 	test_print("\tRunning %s...\n", __func__);
344fb2e97feSRebecca Mckeever 	run_top_down(alloc_from_simple_generic_check);
345fb2e97feSRebecca Mckeever 	run_bottom_up(alloc_from_simple_generic_check);
3460ac06631SKarolina Drobnik 
3470ac06631SKarolina Drobnik 	return 0;
3480ac06631SKarolina Drobnik }
3490ac06631SKarolina Drobnik 
alloc_from_misaligned_check(void)3500ac06631SKarolina Drobnik static int alloc_from_misaligned_check(void)
3510ac06631SKarolina Drobnik {
35276586c00SRebecca Mckeever 	test_print("\tRunning %s...\n", __func__);
353fb2e97feSRebecca Mckeever 	run_top_down(alloc_from_misaligned_generic_check);
354fb2e97feSRebecca Mckeever 	run_bottom_up(alloc_from_misaligned_generic_check);
3550ac06631SKarolina Drobnik 
3560ac06631SKarolina Drobnik 	return 0;
3570ac06631SKarolina Drobnik }
3580ac06631SKarolina Drobnik 
alloc_from_high_addr_check(void)3590ac06631SKarolina Drobnik static int alloc_from_high_addr_check(void)
3600ac06631SKarolina Drobnik {
36176586c00SRebecca Mckeever 	test_print("\tRunning %s...\n", __func__);
3620ac06631SKarolina Drobnik 	memblock_set_bottom_up(false);
3630ac06631SKarolina Drobnik 	alloc_from_top_down_high_addr_check();
3640ac06631SKarolina Drobnik 	memblock_set_bottom_up(true);
3650ac06631SKarolina Drobnik 	alloc_from_bottom_up_high_addr_check();
3660ac06631SKarolina Drobnik 
3670ac06631SKarolina Drobnik 	return 0;
3680ac06631SKarolina Drobnik }
3690ac06631SKarolina Drobnik 
alloc_from_no_space_above_check(void)3700ac06631SKarolina Drobnik static int alloc_from_no_space_above_check(void)
3710ac06631SKarolina Drobnik {
37276586c00SRebecca Mckeever 	test_print("\tRunning %s...\n", __func__);
3730ac06631SKarolina Drobnik 	memblock_set_bottom_up(false);
3740ac06631SKarolina Drobnik 	alloc_from_top_down_no_space_above_check();
3750ac06631SKarolina Drobnik 	memblock_set_bottom_up(true);
3760ac06631SKarolina Drobnik 	alloc_from_bottom_up_no_space_above_check();
3770ac06631SKarolina Drobnik 
3780ac06631SKarolina Drobnik 	return 0;
3790ac06631SKarolina Drobnik }
3800ac06631SKarolina Drobnik 
alloc_from_min_addr_cap_check(void)3810ac06631SKarolina Drobnik static int alloc_from_min_addr_cap_check(void)
3820ac06631SKarolina Drobnik {
38376586c00SRebecca Mckeever 	test_print("\tRunning %s...\n", __func__);
3840ac06631SKarolina Drobnik 	memblock_set_bottom_up(false);
3850ac06631SKarolina Drobnik 	alloc_from_top_down_min_addr_cap_check();
3860ac06631SKarolina Drobnik 	memblock_set_bottom_up(true);
3870ac06631SKarolina Drobnik 	alloc_from_bottom_up_min_addr_cap_check();
3880ac06631SKarolina Drobnik 
3890ac06631SKarolina Drobnik 	return 0;
3900ac06631SKarolina Drobnik }
3910ac06631SKarolina Drobnik 
memblock_alloc_helpers_checks(void)39216567b5fSKarolina Drobnik int memblock_alloc_helpers_checks(void)
39316567b5fSKarolina Drobnik {
39476586c00SRebecca Mckeever 	const char *func_testing = "memblock_alloc_from";
39576586c00SRebecca Mckeever 
39676586c00SRebecca Mckeever 	prefix_reset();
39776586c00SRebecca Mckeever 	prefix_push(func_testing);
39876586c00SRebecca Mckeever 	test_print("Running %s tests...\n", func_testing);
39976586c00SRebecca Mckeever 
40016567b5fSKarolina Drobnik 	reset_memblock_attributes();
40116567b5fSKarolina Drobnik 	dummy_physical_memory_init();
40216567b5fSKarolina Drobnik 
4030ac06631SKarolina Drobnik 	alloc_from_simple_check();
4040ac06631SKarolina Drobnik 	alloc_from_misaligned_check();
4050ac06631SKarolina Drobnik 	alloc_from_high_addr_check();
4060ac06631SKarolina Drobnik 	alloc_from_no_space_above_check();
4070ac06631SKarolina Drobnik 	alloc_from_min_addr_cap_check();
40816567b5fSKarolina Drobnik 
40916567b5fSKarolina Drobnik 	dummy_physical_memory_cleanup();
41016567b5fSKarolina Drobnik 
41176586c00SRebecca Mckeever 	prefix_pop();
41276586c00SRebecca Mckeever 
41316567b5fSKarolina Drobnik 	return 0;
41416567b5fSKarolina Drobnik }
415