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