Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.1.
   1// SPDX-License-Identifier: GPL-2.0-or-later
   2#include "basic_api.h"
   3#include <string.h>
   4#include <linux/memblock.h>
   5
   6#define EXPECTED_MEMBLOCK_REGIONS			128
   7#define FUNC_ADD					"memblock_add"
   8#define FUNC_RESERVE					"memblock_reserve"
   9#define FUNC_REMOVE					"memblock_remove"
  10#define FUNC_FREE					"memblock_free"
  11#define FUNC_TRIM					"memblock_trim_memory"
  12
  13static int memblock_initialization_check(void)
  14{
  15	PREFIX_PUSH();
  16
  17	ASSERT_NE(memblock.memory.regions, NULL);
  18	ASSERT_EQ(memblock.memory.cnt, 1);
  19	ASSERT_EQ(memblock.memory.max, EXPECTED_MEMBLOCK_REGIONS);
  20	ASSERT_EQ(strcmp(memblock.memory.name, "memory"), 0);
  21
  22	ASSERT_NE(memblock.reserved.regions, NULL);
  23	ASSERT_EQ(memblock.reserved.cnt, 1);
  24	ASSERT_EQ(memblock.memory.max, EXPECTED_MEMBLOCK_REGIONS);
  25	ASSERT_EQ(strcmp(memblock.reserved.name, "reserved"), 0);
  26
  27	ASSERT_EQ(memblock.bottom_up, false);
  28	ASSERT_EQ(memblock.current_limit, MEMBLOCK_ALLOC_ANYWHERE);
  29
  30	test_pass_pop();
  31
  32	return 0;
  33}
  34
  35/*
  36 * A simple test that adds a memory block of a specified base address
  37 * and size to the collection of available memory regions (memblock.memory).
  38 * Expect to create a new entry. The region counter and total memory get
  39 * updated.
  40 */
  41static int memblock_add_simple_check(void)
  42{
  43	struct memblock_region *rgn;
  44
  45	rgn = &memblock.memory.regions[0];
  46
  47	struct region r = {
  48		.base = SZ_1G,
  49		.size = SZ_4M
  50	};
  51
  52	PREFIX_PUSH();
  53
  54	reset_memblock_regions();
  55	memblock_add(r.base, r.size);
  56
  57	ASSERT_EQ(rgn->base, r.base);
  58	ASSERT_EQ(rgn->size, r.size);
  59
  60	ASSERT_EQ(memblock.memory.cnt, 1);
  61	ASSERT_EQ(memblock.memory.total_size, r.size);
  62
  63	test_pass_pop();
  64
  65	return 0;
  66}
  67
  68/*
  69 * A simple test that adds a memory block of a specified base address, size,
  70 * NUMA node and memory flags to the collection of available memory regions.
  71 * Expect to create a new entry. The region counter and total memory get
  72 * updated.
  73 */
  74static int memblock_add_node_simple_check(void)
  75{
  76	struct memblock_region *rgn;
  77
  78	rgn = &memblock.memory.regions[0];
  79
  80	struct region r = {
  81		.base = SZ_1M,
  82		.size = SZ_16M
  83	};
  84
  85	PREFIX_PUSH();
  86
  87	reset_memblock_regions();
  88	memblock_add_node(r.base, r.size, 1, MEMBLOCK_HOTPLUG);
  89
  90	ASSERT_EQ(rgn->base, r.base);
  91	ASSERT_EQ(rgn->size, r.size);
  92#ifdef CONFIG_NUMA
  93	ASSERT_EQ(rgn->nid, 1);
  94#endif
  95	ASSERT_EQ(rgn->flags, MEMBLOCK_HOTPLUG);
  96
  97	ASSERT_EQ(memblock.memory.cnt, 1);
  98	ASSERT_EQ(memblock.memory.total_size, r.size);
  99
 100	test_pass_pop();
 101
 102	return 0;
 103}
 104
 105/*
 106 * A test that tries to add two memory blocks that don't overlap with one
 107 * another:
 108 *
 109 *  |        +--------+        +--------+  |
 110 *  |        |   r1   |        |   r2   |  |
 111 *  +--------+--------+--------+--------+--+
 112 *
 113 * Expect to add two correctly initialized entries to the collection of
 114 * available memory regions (memblock.memory). The total size and
 115 * region counter fields get updated.
 116 */
 117static int memblock_add_disjoint_check(void)
 118{
 119	struct memblock_region *rgn1, *rgn2;
 120
 121	rgn1 = &memblock.memory.regions[0];
 122	rgn2 = &memblock.memory.regions[1];
 123
 124	struct region r1 = {
 125		.base = SZ_1G,
 126		.size = SZ_8K
 127	};
 128	struct region r2 = {
 129		.base = SZ_1G + SZ_16K,
 130		.size = SZ_8K
 131	};
 132
 133	PREFIX_PUSH();
 134
 135	reset_memblock_regions();
 136	memblock_add(r1.base, r1.size);
 137	memblock_add(r2.base, r2.size);
 138
 139	ASSERT_EQ(rgn1->base, r1.base);
 140	ASSERT_EQ(rgn1->size, r1.size);
 141
 142	ASSERT_EQ(rgn2->base, r2.base);
 143	ASSERT_EQ(rgn2->size, r2.size);
 144
 145	ASSERT_EQ(memblock.memory.cnt, 2);
 146	ASSERT_EQ(memblock.memory.total_size, r1.size + r2.size);
 147
 148	test_pass_pop();
 149
 150	return 0;
 151}
 152
 153/*
 154 * A test that tries to add two memory blocks r1 and r2, where r2 overlaps
 155 * with the beginning of r1 (that is r1.base < r2.base + r2.size):
 156 *
 157 *  |    +----+----+------------+          |
 158 *  |    |    |r2  |   r1       |          |
 159 *  +----+----+----+------------+----------+
 160 *       ^    ^
 161 *       |    |
 162 *       |    r1.base
 163 *       |
 164 *       r2.base
 165 *
 166 * Expect to merge the two entries into one region that starts at r2.base
 167 * and has size of two regions minus their intersection. The total size of
 168 * the available memory is updated, and the region counter stays the same.
 169 */
 170static int memblock_add_overlap_top_check(void)
 171{
 172	struct memblock_region *rgn;
 173	phys_addr_t total_size;
 174
 175	rgn = &memblock.memory.regions[0];
 176
 177	struct region r1 = {
 178		.base = SZ_512M,
 179		.size = SZ_1G
 180	};
 181	struct region r2 = {
 182		.base = SZ_256M,
 183		.size = SZ_512M
 184	};
 185
 186	PREFIX_PUSH();
 187
 188	total_size = (r1.base - r2.base) + r1.size;
 189
 190	reset_memblock_regions();
 191	memblock_add(r1.base, r1.size);
 192	memblock_add(r2.base, r2.size);
 193
 194	ASSERT_EQ(rgn->base, r2.base);
 195	ASSERT_EQ(rgn->size, total_size);
 196
 197	ASSERT_EQ(memblock.memory.cnt, 1);
 198	ASSERT_EQ(memblock.memory.total_size, total_size);
 199
 200	test_pass_pop();
 201
 202	return 0;
 203}
 204
 205/*
 206 * A test that tries to add two memory blocks r1 and r2, where r2 overlaps
 207 * with the end of r1 (that is r2.base < r1.base + r1.size):
 208 *
 209 *  |  +--+------+----------+              |
 210 *  |  |  | r1   | r2       |              |
 211 *  +--+--+------+----------+--------------+
 212 *     ^  ^
 213 *     |  |
 214 *     |  r2.base
 215 *     |
 216 *     r1.base
 217 *
 218 * Expect to merge the two entries into one region that starts at r1.base
 219 * and has size of two regions minus their intersection. The total size of
 220 * the available memory is updated, and the region counter stays the same.
 221 */
 222static int memblock_add_overlap_bottom_check(void)
 223{
 224	struct memblock_region *rgn;
 225	phys_addr_t total_size;
 226
 227	rgn = &memblock.memory.regions[0];
 228
 229	struct region r1 = {
 230		.base = SZ_128M,
 231		.size = SZ_512M
 232	};
 233	struct region r2 = {
 234		.base = SZ_256M,
 235		.size = SZ_1G
 236	};
 237
 238	PREFIX_PUSH();
 239
 240	total_size = (r2.base - r1.base) + r2.size;
 241
 242	reset_memblock_regions();
 243	memblock_add(r1.base, r1.size);
 244	memblock_add(r2.base, r2.size);
 245
 246	ASSERT_EQ(rgn->base, r1.base);
 247	ASSERT_EQ(rgn->size, total_size);
 248
 249	ASSERT_EQ(memblock.memory.cnt, 1);
 250	ASSERT_EQ(memblock.memory.total_size, total_size);
 251
 252	test_pass_pop();
 253
 254	return 0;
 255}
 256
 257/*
 258 * A test that tries to add two memory blocks r1 and r2, where r2 is
 259 * within the range of r1 (that is r1.base < r2.base &&
 260 * r2.base + r2.size < r1.base + r1.size):
 261 *
 262 *  |   +-------+--+-----------------------+
 263 *  |   |       |r2|      r1               |
 264 *  +---+-------+--+-----------------------+
 265 *      ^
 266 *      |
 267 *      r1.base
 268 *
 269 * Expect to merge two entries into one region that stays the same.
 270 * The counter and total size of available memory are not updated.
 271 */
 272static int memblock_add_within_check(void)
 273{
 274	struct memblock_region *rgn;
 275
 276	rgn = &memblock.memory.regions[0];
 277
 278	struct region r1 = {
 279		.base = SZ_8M,
 280		.size = SZ_32M
 281	};
 282	struct region r2 = {
 283		.base = SZ_16M,
 284		.size = SZ_1M
 285	};
 286
 287	PREFIX_PUSH();
 288
 289	reset_memblock_regions();
 290	memblock_add(r1.base, r1.size);
 291	memblock_add(r2.base, r2.size);
 292
 293	ASSERT_EQ(rgn->base, r1.base);
 294	ASSERT_EQ(rgn->size, r1.size);
 295
 296	ASSERT_EQ(memblock.memory.cnt, 1);
 297	ASSERT_EQ(memblock.memory.total_size, r1.size);
 298
 299	test_pass_pop();
 300
 301	return 0;
 302}
 303
 304/*
 305 * A simple test that tries to add the same memory block twice. Expect
 306 * the counter and total size of available memory to not be updated.
 307 */
 308static int memblock_add_twice_check(void)
 309{
 310	struct region r = {
 311		.base = SZ_16K,
 312		.size = SZ_2M
 313	};
 314
 315	PREFIX_PUSH();
 316
 317	reset_memblock_regions();
 318
 319	memblock_add(r.base, r.size);
 320	memblock_add(r.base, r.size);
 321
 322	ASSERT_EQ(memblock.memory.cnt, 1);
 323	ASSERT_EQ(memblock.memory.total_size, r.size);
 324
 325	test_pass_pop();
 326
 327	return 0;
 328}
 329
 330/*
 331 * A test that tries to add two memory blocks that don't overlap with one
 332 * another and then add a third memory block in the space between the first two:
 333 *
 334 *  |        +--------+--------+--------+  |
 335 *  |        |   r1   |   r3   |   r2   |  |
 336 *  +--------+--------+--------+--------+--+
 337 *
 338 * Expect to merge the three entries into one region that starts at r1.base
 339 * and has size of r1.size + r2.size + r3.size. The region counter and total
 340 * size of the available memory are updated.
 341 */
 342static int memblock_add_between_check(void)
 343{
 344	struct memblock_region *rgn;
 345	phys_addr_t total_size;
 346
 347	rgn = &memblock.memory.regions[0];
 348
 349	struct region r1 = {
 350		.base = SZ_1G,
 351		.size = SZ_8K
 352	};
 353	struct region r2 = {
 354		.base = SZ_1G + SZ_16K,
 355		.size = SZ_8K
 356	};
 357	struct region r3 = {
 358		.base = SZ_1G + SZ_8K,
 359		.size = SZ_8K
 360	};
 361
 362	PREFIX_PUSH();
 363
 364	total_size = r1.size + r2.size + r3.size;
 365
 366	reset_memblock_regions();
 367	memblock_add(r1.base, r1.size);
 368	memblock_add(r2.base, r2.size);
 369	memblock_add(r3.base, r3.size);
 370
 371	ASSERT_EQ(rgn->base, r1.base);
 372	ASSERT_EQ(rgn->size, total_size);
 373
 374	ASSERT_EQ(memblock.memory.cnt, 1);
 375	ASSERT_EQ(memblock.memory.total_size, total_size);
 376
 377	test_pass_pop();
 378
 379	return 0;
 380}
 381
 382/*
 383 * A simple test that tries to add a memory block r when r extends past
 384 * PHYS_ADDR_MAX:
 385 *
 386 *                               +--------+
 387 *                               |    r   |
 388 *                               +--------+
 389 *  |                            +----+
 390 *  |                            | rgn|
 391 *  +----------------------------+----+
 392 *
 393 * Expect to add a memory block of size PHYS_ADDR_MAX - r.base. Expect the
 394 * total size of available memory and the counter to be updated.
 395 */
 396static int memblock_add_near_max_check(void)
 397{
 398	struct memblock_region *rgn;
 399	phys_addr_t total_size;
 400
 401	rgn = &memblock.memory.regions[0];
 402
 403	struct region r = {
 404		.base = PHYS_ADDR_MAX - SZ_1M,
 405		.size = SZ_2M
 406	};
 407
 408	PREFIX_PUSH();
 409
 410	total_size = PHYS_ADDR_MAX - r.base;
 411
 412	reset_memblock_regions();
 413	memblock_add(r.base, r.size);
 414
 415	ASSERT_EQ(rgn->base, r.base);
 416	ASSERT_EQ(rgn->size, total_size);
 417
 418	ASSERT_EQ(memblock.memory.cnt, 1);
 419	ASSERT_EQ(memblock.memory.total_size, total_size);
 420
 421	test_pass_pop();
 422
 423	return 0;
 424}
 425
 426/*
 427 * A test that trying to add the 129th memory block.
 428 * Expect to trigger memblock_double_array() to double the
 429 * memblock.memory.max, find a new valid memory as
 430 * memory.regions.
 431 */
 432static int memblock_add_many_check(void)
 433{
 434	int i;
 435	void *orig_region;
 436	struct region r = {
 437		.base = SZ_16K,
 438		.size = SZ_16K,
 439	};
 440	phys_addr_t new_memory_regions_size;
 441	phys_addr_t base, size = SZ_64;
 442	phys_addr_t gap_size = SZ_64;
 443
 444	PREFIX_PUSH();
 445
 446	reset_memblock_regions();
 447	memblock_allow_resize();
 448
 449	dummy_physical_memory_init();
 450	/*
 451	 * We allocated enough memory by using dummy_physical_memory_init(), and
 452	 * split it into small block. First we split a large enough memory block
 453	 * as the memory region which will be choosed by memblock_double_array().
 454	 */
 455	base = PAGE_ALIGN(dummy_physical_memory_base());
 456	new_memory_regions_size = PAGE_ALIGN(INIT_MEMBLOCK_REGIONS * 2 *
 457					     sizeof(struct memblock_region));
 458	memblock_add(base, new_memory_regions_size);
 459
 460	/* This is the base of small memory block. */
 461	base += new_memory_regions_size + gap_size;
 462
 463	orig_region = memblock.memory.regions;
 464
 465	for (i = 0; i < INIT_MEMBLOCK_REGIONS; i++) {
 466		/*
 467		 * Add these small block to fulfill the memblock. We keep a
 468		 * gap between the nearby memory to avoid being merged.
 469		 */
 470		memblock_add(base, size);
 471		base += size + gap_size;
 472
 473		ASSERT_EQ(memblock.memory.cnt, i + 2);
 474		ASSERT_EQ(memblock.memory.total_size, new_memory_regions_size +
 475						      (i + 1) * size);
 476	}
 477
 478	/*
 479	 * At there, memblock_double_array() has been succeed, check if it
 480	 * update the memory.max.
 481	 */
 482	ASSERT_EQ(memblock.memory.max, INIT_MEMBLOCK_REGIONS * 2);
 483
 484	/* memblock_double_array() will reserve the memory it used. Check it. */
 485	ASSERT_EQ(memblock.reserved.cnt, 1);
 486	ASSERT_EQ(memblock.reserved.total_size, new_memory_regions_size);
 487
 488	/*
 489	 * Now memblock_double_array() works fine. Let's check after the
 490	 * double_array(), the memblock_add() still works as normal.
 491	 */
 492	memblock_add(r.base, r.size);
 493	ASSERT_EQ(memblock.memory.regions[0].base, r.base);
 494	ASSERT_EQ(memblock.memory.regions[0].size, r.size);
 495
 496	ASSERT_EQ(memblock.memory.cnt, INIT_MEMBLOCK_REGIONS + 2);
 497	ASSERT_EQ(memblock.memory.total_size, INIT_MEMBLOCK_REGIONS * size +
 498					      new_memory_regions_size +
 499					      r.size);
 500	ASSERT_EQ(memblock.memory.max, INIT_MEMBLOCK_REGIONS * 2);
 501
 502	dummy_physical_memory_cleanup();
 503
 504	/*
 505	 * The current memory.regions is occupying a range of memory that
 506	 * allocated from dummy_physical_memory_init(). After free the memory,
 507	 * we must not use it. So restore the origin memory region to make sure
 508	 * the tests can run as normal and not affected by the double array.
 509	 */
 510	memblock.memory.regions = orig_region;
 511	memblock.memory.cnt = INIT_MEMBLOCK_REGIONS;
 512
 513	test_pass_pop();
 514
 515	return 0;
 516}
 517
 518static int memblock_add_checks(void)
 519{
 520	prefix_reset();
 521	prefix_push(FUNC_ADD);
 522	test_print("Running %s tests...\n", FUNC_ADD);
 523
 524	memblock_add_simple_check();
 525	memblock_add_node_simple_check();
 526	memblock_add_disjoint_check();
 527	memblock_add_overlap_top_check();
 528	memblock_add_overlap_bottom_check();
 529	memblock_add_within_check();
 530	memblock_add_twice_check();
 531	memblock_add_between_check();
 532	memblock_add_near_max_check();
 533	memblock_add_many_check();
 534
 535	prefix_pop();
 536
 537	return 0;
 538}
 539
 540/*
 541 * A simple test that marks a memory block of a specified base address
 542 * and size as reserved and to the collection of reserved memory regions
 543 * (memblock.reserved). Expect to create a new entry. The region counter
 544 * and total memory size are updated.
 545 */
 546static int memblock_reserve_simple_check(void)
 547{
 548	struct memblock_region *rgn;
 549
 550	rgn =  &memblock.reserved.regions[0];
 551
 552	struct region r = {
 553		.base = SZ_2G,
 554		.size = SZ_128M
 555	};
 556
 557	PREFIX_PUSH();
 558
 559	reset_memblock_regions();
 560	memblock_reserve(r.base, r.size);
 561
 562	ASSERT_EQ(rgn->base, r.base);
 563	ASSERT_EQ(rgn->size, r.size);
 564
 565	test_pass_pop();
 566
 567	return 0;
 568}
 569
 570/*
 571 * A test that tries to mark two memory blocks that don't overlap as reserved:
 572 *
 573 *  |        +--+      +----------------+  |
 574 *  |        |r1|      |       r2       |  |
 575 *  +--------+--+------+----------------+--+
 576 *
 577 * Expect to add two entries to the collection of reserved memory regions
 578 * (memblock.reserved). The total size and region counter for
 579 * memblock.reserved are updated.
 580 */
 581static int memblock_reserve_disjoint_check(void)
 582{
 583	struct memblock_region *rgn1, *rgn2;
 584
 585	rgn1 = &memblock.reserved.regions[0];
 586	rgn2 = &memblock.reserved.regions[1];
 587
 588	struct region r1 = {
 589		.base = SZ_256M,
 590		.size = SZ_16M
 591	};
 592	struct region r2 = {
 593		.base = SZ_512M,
 594		.size = SZ_512M
 595	};
 596
 597	PREFIX_PUSH();
 598
 599	reset_memblock_regions();
 600	memblock_reserve(r1.base, r1.size);
 601	memblock_reserve(r2.base, r2.size);
 602
 603	ASSERT_EQ(rgn1->base, r1.base);
 604	ASSERT_EQ(rgn1->size, r1.size);
 605
 606	ASSERT_EQ(rgn2->base, r2.base);
 607	ASSERT_EQ(rgn2->size, r2.size);
 608
 609	ASSERT_EQ(memblock.reserved.cnt, 2);
 610	ASSERT_EQ(memblock.reserved.total_size, r1.size + r2.size);
 611
 612	test_pass_pop();
 613
 614	return 0;
 615}
 616
 617/*
 618 * A test that tries to mark two memory blocks r1 and r2 as reserved,
 619 * where r2 overlaps with the beginning of r1 (that is
 620 * r1.base < r2.base + r2.size):
 621 *
 622 *  |  +--------------+--+--------------+  |
 623 *  |  |       r2     |  |     r1       |  |
 624 *  +--+--------------+--+--------------+--+
 625 *     ^              ^
 626 *     |              |
 627 *     |              r1.base
 628 *     |
 629 *     r2.base
 630 *
 631 * Expect to merge two entries into one region that starts at r2.base and
 632 * has size of two regions minus their intersection. The total size of the
 633 * reserved memory is updated, and the region counter is not updated.
 634 */
 635static int memblock_reserve_overlap_top_check(void)
 636{
 637	struct memblock_region *rgn;
 638	phys_addr_t total_size;
 639
 640	rgn = &memblock.reserved.regions[0];
 641
 642	struct region r1 = {
 643		.base = SZ_1G,
 644		.size = SZ_1G
 645	};
 646	struct region r2 = {
 647		.base = SZ_128M,
 648		.size = SZ_1G
 649	};
 650
 651	PREFIX_PUSH();
 652
 653	total_size = (r1.base - r2.base) + r1.size;
 654
 655	reset_memblock_regions();
 656	memblock_reserve(r1.base, r1.size);
 657	memblock_reserve(r2.base, r2.size);
 658
 659	ASSERT_EQ(rgn->base, r2.base);
 660	ASSERT_EQ(rgn->size, total_size);
 661
 662	ASSERT_EQ(memblock.reserved.cnt, 1);
 663	ASSERT_EQ(memblock.reserved.total_size, total_size);
 664
 665	test_pass_pop();
 666
 667	return 0;
 668}
 669
 670/*
 671 * A test that tries to mark two memory blocks r1 and r2 as reserved,
 672 * where r2 overlaps with the end of r1 (that is
 673 * r2.base < r1.base + r1.size):
 674 *
 675 *  |  +--------------+--+--------------+  |
 676 *  |  |       r1     |  |     r2       |  |
 677 *  +--+--------------+--+--------------+--+
 678 *     ^              ^
 679 *     |              |
 680 *     |              r2.base
 681 *     |
 682 *     r1.base
 683 *
 684 * Expect to merge two entries into one region that starts at r1.base and
 685 * has size of two regions minus their intersection. The total size of the
 686 * reserved memory is updated, and the region counter is not updated.
 687 */
 688static int memblock_reserve_overlap_bottom_check(void)
 689{
 690	struct memblock_region *rgn;
 691	phys_addr_t total_size;
 692
 693	rgn = &memblock.reserved.regions[0];
 694
 695	struct region r1 = {
 696		.base = SZ_2K,
 697		.size = SZ_128K
 698	};
 699	struct region r2 = {
 700		.base = SZ_128K,
 701		.size = SZ_128K
 702	};
 703
 704	PREFIX_PUSH();
 705
 706	total_size = (r2.base - r1.base) + r2.size;
 707
 708	reset_memblock_regions();
 709	memblock_reserve(r1.base, r1.size);
 710	memblock_reserve(r2.base, r2.size);
 711
 712	ASSERT_EQ(rgn->base, r1.base);
 713	ASSERT_EQ(rgn->size, total_size);
 714
 715	ASSERT_EQ(memblock.reserved.cnt, 1);
 716	ASSERT_EQ(memblock.reserved.total_size, total_size);
 717
 718	test_pass_pop();
 719
 720	return 0;
 721}
 722
 723/*
 724 * A test that tries to mark two memory blocks r1 and r2 as reserved,
 725 * where r2 is within the range of r1 (that is
 726 * (r1.base < r2.base) && (r2.base + r2.size < r1.base + r1.size)):
 727 *
 728 *  | +-----+--+---------------------------|
 729 *  | |     |r2|          r1               |
 730 *  +-+-----+--+---------------------------+
 731 *    ^     ^
 732 *    |     |
 733 *    |     r2.base
 734 *    |
 735 *    r1.base
 736 *
 737 * Expect to merge two entries into one region that stays the same. The
 738 * counter and total size of available memory are not updated.
 739 */
 740static int memblock_reserve_within_check(void)
 741{
 742	struct memblock_region *rgn;
 743
 744	rgn = &memblock.reserved.regions[0];
 745
 746	struct region r1 = {
 747		.base = SZ_1M,
 748		.size = SZ_8M
 749	};
 750	struct region r2 = {
 751		.base = SZ_2M,
 752		.size = SZ_64K
 753	};
 754
 755	PREFIX_PUSH();
 756
 757	reset_memblock_regions();
 758	memblock_reserve(r1.base, r1.size);
 759	memblock_reserve(r2.base, r2.size);
 760
 761	ASSERT_EQ(rgn->base, r1.base);
 762	ASSERT_EQ(rgn->size, r1.size);
 763
 764	ASSERT_EQ(memblock.reserved.cnt, 1);
 765	ASSERT_EQ(memblock.reserved.total_size, r1.size);
 766
 767	test_pass_pop();
 768
 769	return 0;
 770}
 771
 772/*
 773 * A simple test that tries to reserve the same memory block twice.
 774 * Expect the region counter and total size of reserved memory to not
 775 * be updated.
 776 */
 777static int memblock_reserve_twice_check(void)
 778{
 779	struct region r = {
 780		.base = SZ_16K,
 781		.size = SZ_2M
 782	};
 783
 784	PREFIX_PUSH();
 785
 786	reset_memblock_regions();
 787
 788	memblock_reserve(r.base, r.size);
 789	memblock_reserve(r.base, r.size);
 790
 791	ASSERT_EQ(memblock.reserved.cnt, 1);
 792	ASSERT_EQ(memblock.reserved.total_size, r.size);
 793
 794	test_pass_pop();
 795
 796	return 0;
 797}
 798
 799/*
 800 * A test that tries to mark two memory blocks that don't overlap as reserved
 801 * and then reserve a third memory block in the space between the first two:
 802 *
 803 *  |        +--------+--------+--------+  |
 804 *  |        |   r1   |   r3   |   r2   |  |
 805 *  +--------+--------+--------+--------+--+
 806 *
 807 * Expect to merge the three entries into one reserved region that starts at
 808 * r1.base and has size of r1.size + r2.size + r3.size. The region counter and
 809 * total for memblock.reserved are updated.
 810 */
 811static int memblock_reserve_between_check(void)
 812{
 813	struct memblock_region *rgn;
 814	phys_addr_t total_size;
 815
 816	rgn = &memblock.reserved.regions[0];
 817
 818	struct region r1 = {
 819		.base = SZ_1G,
 820		.size = SZ_8K
 821	};
 822	struct region r2 = {
 823		.base = SZ_1G + SZ_16K,
 824		.size = SZ_8K
 825	};
 826	struct region r3 = {
 827		.base = SZ_1G + SZ_8K,
 828		.size = SZ_8K
 829	};
 830
 831	PREFIX_PUSH();
 832
 833	total_size = r1.size + r2.size + r3.size;
 834
 835	reset_memblock_regions();
 836	memblock_reserve(r1.base, r1.size);
 837	memblock_reserve(r2.base, r2.size);
 838	memblock_reserve(r3.base, r3.size);
 839
 840	ASSERT_EQ(rgn->base, r1.base);
 841	ASSERT_EQ(rgn->size, total_size);
 842
 843	ASSERT_EQ(memblock.reserved.cnt, 1);
 844	ASSERT_EQ(memblock.reserved.total_size, total_size);
 845
 846	test_pass_pop();
 847
 848	return 0;
 849}
 850
 851/*
 852 * A simple test that tries to reserve a memory block r when r extends past
 853 * PHYS_ADDR_MAX:
 854 *
 855 *                               +--------+
 856 *                               |    r   |
 857 *                               +--------+
 858 *  |                            +----+
 859 *  |                            | rgn|
 860 *  +----------------------------+----+
 861 *
 862 * Expect to reserve a memory block of size PHYS_ADDR_MAX - r.base. Expect the
 863 * total size of reserved memory and the counter to be updated.
 864 */
 865static int memblock_reserve_near_max_check(void)
 866{
 867	struct memblock_region *rgn;
 868	phys_addr_t total_size;
 869
 870	rgn = &memblock.reserved.regions[0];
 871
 872	struct region r = {
 873		.base = PHYS_ADDR_MAX - SZ_1M,
 874		.size = SZ_2M
 875	};
 876
 877	PREFIX_PUSH();
 878
 879	total_size = PHYS_ADDR_MAX - r.base;
 880
 881	reset_memblock_regions();
 882	memblock_reserve(r.base, r.size);
 883
 884	ASSERT_EQ(rgn->base, r.base);
 885	ASSERT_EQ(rgn->size, total_size);
 886
 887	ASSERT_EQ(memblock.reserved.cnt, 1);
 888	ASSERT_EQ(memblock.reserved.total_size, total_size);
 889
 890	test_pass_pop();
 891
 892	return 0;
 893}
 894
 895/*
 896 * A test that trying to reserve the 129th memory block.
 897 * Expect to trigger memblock_double_array() to double the
 898 * memblock.memory.max, find a new valid memory as
 899 * reserved.regions.
 900 */
 901static int memblock_reserve_many_check(void)
 902{
 903	int i;
 904	void *orig_region;
 905	struct region r = {
 906		.base = SZ_16K,
 907		.size = SZ_16K,
 908	};
 909	phys_addr_t memory_base = SZ_128K;
 910	phys_addr_t new_reserved_regions_size;
 911
 912	PREFIX_PUSH();
 913
 914	reset_memblock_regions();
 915	memblock_allow_resize();
 916
 917	/* Add a valid memory region used by double_array(). */
 918	dummy_physical_memory_init();
 919	memblock_add(dummy_physical_memory_base(), MEM_SIZE);
 920
 921	for (i = 0; i < INIT_MEMBLOCK_REGIONS; i++) {
 922		/* Reserve some fakes memory region to fulfill the memblock. */
 923		memblock_reserve(memory_base, MEM_SIZE);
 924
 925		ASSERT_EQ(memblock.reserved.cnt, i + 1);
 926		ASSERT_EQ(memblock.reserved.total_size, (i + 1) * MEM_SIZE);
 927
 928		/* Keep the gap so these memory region will not be merged. */
 929		memory_base += MEM_SIZE * 2;
 930	}
 931
 932	orig_region = memblock.reserved.regions;
 933
 934	/* This reserve the 129 memory_region, and makes it double array. */
 935	memblock_reserve(memory_base, MEM_SIZE);
 936
 937	/*
 938	 * This is the memory region size used by the doubled reserved.regions,
 939	 * and it has been reserved due to it has been used. The size is used to
 940	 * calculate the total_size that the memblock.reserved have now.
 941	 */
 942	new_reserved_regions_size = PAGE_ALIGN((INIT_MEMBLOCK_REGIONS * 2) *
 943					sizeof(struct memblock_region));
 944	/*
 945	 * The double_array() will find a free memory region as the new
 946	 * reserved.regions, and the used memory region will be reserved, so
 947	 * there will be one more region exist in the reserved memblock. And the
 948	 * one more reserved region's size is new_reserved_regions_size.
 949	 */
 950	ASSERT_EQ(memblock.reserved.cnt, INIT_MEMBLOCK_REGIONS + 2);
 951	ASSERT_EQ(memblock.reserved.total_size, (INIT_MEMBLOCK_REGIONS + 1) * MEM_SIZE +
 952						new_reserved_regions_size);
 953	ASSERT_EQ(memblock.reserved.max, INIT_MEMBLOCK_REGIONS * 2);
 954
 955	/*
 956	 * Now memblock_double_array() works fine. Let's check after the
 957	 * double_array(), the memblock_reserve() still works as normal.
 958	 */
 959	memblock_reserve(r.base, r.size);
 960	ASSERT_EQ(memblock.reserved.regions[0].base, r.base);
 961	ASSERT_EQ(memblock.reserved.regions[0].size, r.size);
 962
 963	ASSERT_EQ(memblock.reserved.cnt, INIT_MEMBLOCK_REGIONS + 3);
 964	ASSERT_EQ(memblock.reserved.total_size, (INIT_MEMBLOCK_REGIONS + 1) * MEM_SIZE +
 965						new_reserved_regions_size +
 966						r.size);
 967	ASSERT_EQ(memblock.reserved.max, INIT_MEMBLOCK_REGIONS * 2);
 968
 969	dummy_physical_memory_cleanup();
 970
 971	/*
 972	 * The current reserved.regions is occupying a range of memory that
 973	 * allocated from dummy_physical_memory_init(). After free the memory,
 974	 * we must not use it. So restore the origin memory region to make sure
 975	 * the tests can run as normal and not affected by the double array.
 976	 */
 977	memblock.reserved.regions = orig_region;
 978	memblock.reserved.cnt = INIT_MEMBLOCK_RESERVED_REGIONS;
 979
 980	test_pass_pop();
 981
 982	return 0;
 983}
 984
 985static int memblock_reserve_checks(void)
 986{
 987	prefix_reset();
 988	prefix_push(FUNC_RESERVE);
 989	test_print("Running %s tests...\n", FUNC_RESERVE);
 990
 991	memblock_reserve_simple_check();
 992	memblock_reserve_disjoint_check();
 993	memblock_reserve_overlap_top_check();
 994	memblock_reserve_overlap_bottom_check();
 995	memblock_reserve_within_check();
 996	memblock_reserve_twice_check();
 997	memblock_reserve_between_check();
 998	memblock_reserve_near_max_check();
 999	memblock_reserve_many_check();
1000
1001	prefix_pop();
1002
1003	return 0;
1004}
1005
1006/*
1007 * A simple test that tries to remove a region r1 from the array of
1008 * available memory regions. By "removing" a region we mean overwriting it
1009 * with the next region r2 in memblock.memory:
1010 *
1011 *  |  ......          +----------------+  |
1012 *  |  : r1 :          |       r2       |  |
1013 *  +--+----+----------+----------------+--+
1014 *                     ^
1015 *                     |
1016 *                     rgn.base
1017 *
1018 * Expect to add two memory blocks r1 and r2 and then remove r1 so that
1019 * r2 is the first available region. The region counter and total size
1020 * are updated.
1021 */
1022static int memblock_remove_simple_check(void)
1023{
1024	struct memblock_region *rgn;
1025
1026	rgn = &memblock.memory.regions[0];
1027
1028	struct region r1 = {
1029		.base = SZ_2K,
1030		.size = SZ_4K
1031	};
1032	struct region r2 = {
1033		.base = SZ_128K,
1034		.size = SZ_4M
1035	};
1036
1037	PREFIX_PUSH();
1038
1039	reset_memblock_regions();
1040	memblock_add(r1.base, r1.size);
1041	memblock_add(r2.base, r2.size);
1042	memblock_remove(r1.base, r1.size);
1043
1044	ASSERT_EQ(rgn->base, r2.base);
1045	ASSERT_EQ(rgn->size, r2.size);
1046
1047	ASSERT_EQ(memblock.memory.cnt, 1);
1048	ASSERT_EQ(memblock.memory.total_size, r2.size);
1049
1050	test_pass_pop();
1051
1052	return 0;
1053}
1054
1055/*
1056 * A test that tries to remove a region r2 that was not registered as
1057 * available memory (i.e. has no corresponding entry in memblock.memory):
1058 *
1059 *                     +----------------+
1060 *                     |       r2       |
1061 *                     +----------------+
1062 *  |  +----+                              |
1063 *  |  | r1 |                              |
1064 *  +--+----+------------------------------+
1065 *     ^
1066 *     |
1067 *     rgn.base
1068 *
1069 * Expect the array, regions counter and total size to not be modified.
1070 */
1071static int memblock_remove_absent_check(void)
1072{
1073	struct memblock_region *rgn;
1074
1075	rgn = &memblock.memory.regions[0];
1076
1077	struct region r1 = {
1078		.base = SZ_512K,
1079		.size = SZ_4M
1080	};
1081	struct region r2 = {
1082		.base = SZ_64M,
1083		.size = SZ_1G
1084	};
1085
1086	PREFIX_PUSH();
1087
1088	reset_memblock_regions();
1089	memblock_add(r1.base, r1.size);
1090	memblock_remove(r2.base, r2.size);
1091
1092	ASSERT_EQ(rgn->base, r1.base);
1093	ASSERT_EQ(rgn->size, r1.size);
1094
1095	ASSERT_EQ(memblock.memory.cnt, 1);
1096	ASSERT_EQ(memblock.memory.total_size, r1.size);
1097
1098	test_pass_pop();
1099
1100	return 0;
1101}
1102
1103/*
1104 * A test that tries to remove a region r2 that overlaps with the
1105 * beginning of the already existing entry r1
1106 * (that is r1.base < r2.base + r2.size):
1107 *
1108 *           +-----------------+
1109 *           |       r2        |
1110 *           +-----------------+
1111 *  |                 .........+--------+  |
1112 *  |                 :     r1 |  rgn   |  |
1113 *  +-----------------+--------+--------+--+
1114 *                    ^        ^
1115 *                    |        |
1116 *                    |        rgn.base
1117 *                    r1.base
1118 *
1119 * Expect that only the intersection of both regions is removed from the
1120 * available memory pool. The regions counter and total size are updated.
1121 */
1122static int memblock_remove_overlap_top_check(void)
1123{
1124	struct memblock_region *rgn;
1125	phys_addr_t r1_end, r2_end, total_size;
1126
1127	rgn = &memblock.memory.regions[0];
1128
1129	struct region r1 = {
1130		.base = SZ_32M,
1131		.size = SZ_32M
1132	};
1133	struct region r2 = {
1134		.base = SZ_16M,
1135		.size = SZ_32M
1136	};
1137
1138	PREFIX_PUSH();
1139
1140	r1_end = r1.base + r1.size;
1141	r2_end = r2.base + r2.size;
1142	total_size = r1_end - r2_end;
1143
1144	reset_memblock_regions();
1145	memblock_add(r1.base, r1.size);
1146	memblock_remove(r2.base, r2.size);
1147
1148	ASSERT_EQ(rgn->base, r1.base + r2.base);
1149	ASSERT_EQ(rgn->size, total_size);
1150
1151	ASSERT_EQ(memblock.memory.cnt, 1);
1152	ASSERT_EQ(memblock.memory.total_size, total_size);
1153
1154	test_pass_pop();
1155
1156	return 0;
1157}
1158
1159/*
1160 * A test that tries to remove a region r2 that overlaps with the end of
1161 * the already existing region r1 (that is r2.base < r1.base + r1.size):
1162 *
1163 *        +--------------------------------+
1164 *        |               r2               |
1165 *        +--------------------------------+
1166 *  | +---+.....                           |
1167 *  | |rgn| r1 :                           |
1168 *  +-+---+----+---------------------------+
1169 *    ^
1170 *    |
1171 *    r1.base
1172 *
1173 * Expect that only the intersection of both regions is removed from the
1174 * available memory pool. The regions counter and total size are updated.
1175 */
1176static int memblock_remove_overlap_bottom_check(void)
1177{
1178	struct memblock_region *rgn;
1179	phys_addr_t total_size;
1180
1181	rgn = &memblock.memory.regions[0];
1182
1183	struct region r1 = {
1184		.base = SZ_2M,
1185		.size = SZ_64M
1186	};
1187	struct region r2 = {
1188		.base = SZ_32M,
1189		.size = SZ_256M
1190	};
1191
1192	PREFIX_PUSH();
1193
1194	total_size = r2.base - r1.base;
1195
1196	reset_memblock_regions();
1197	memblock_add(r1.base, r1.size);
1198	memblock_remove(r2.base, r2.size);
1199
1200	ASSERT_EQ(rgn->base, r1.base);
1201	ASSERT_EQ(rgn->size, total_size);
1202
1203	ASSERT_EQ(memblock.memory.cnt, 1);
1204	ASSERT_EQ(memblock.memory.total_size, total_size);
1205
1206	test_pass_pop();
1207
1208	return 0;
1209}
1210
1211/*
1212 * A test that tries to remove a region r2 that is within the range of
1213 * the already existing entry r1 (that is
1214 * (r1.base < r2.base) && (r2.base + r2.size < r1.base + r1.size)):
1215 *
1216 *                  +----+
1217 *                  | r2 |
1218 *                  +----+
1219 *  | +-------------+....+---------------+ |
1220 *  | |     rgn1    | r1 |     rgn2      | |
1221 *  +-+-------------+----+---------------+-+
1222 *    ^
1223 *    |
1224 *    r1.base
1225 *
1226 * Expect that the region is split into two - one that ends at r2.base and
1227 * another that starts at r2.base + r2.size, with appropriate sizes. The
1228 * region counter and total size are updated.
1229 */
1230static int memblock_remove_within_check(void)
1231{
1232	struct memblock_region *rgn1, *rgn2;
1233	phys_addr_t r1_size, r2_size, total_size;
1234
1235	rgn1 = &memblock.memory.regions[0];
1236	rgn2 = &memblock.memory.regions[1];
1237
1238	struct region r1 = {
1239		.base = SZ_1M,
1240		.size = SZ_32M
1241	};
1242	struct region r2 = {
1243		.base = SZ_16M,
1244		.size = SZ_1M
1245	};
1246
1247	PREFIX_PUSH();
1248
1249	r1_size = r2.base - r1.base;
1250	r2_size = (r1.base + r1.size) - (r2.base + r2.size);
1251	total_size = r1_size + r2_size;
1252
1253	reset_memblock_regions();
1254	memblock_add(r1.base, r1.size);
1255	memblock_remove(r2.base, r2.size);
1256
1257	ASSERT_EQ(rgn1->base, r1.base);
1258	ASSERT_EQ(rgn1->size, r1_size);
1259
1260	ASSERT_EQ(rgn2->base, r2.base + r2.size);
1261	ASSERT_EQ(rgn2->size, r2_size);
1262
1263	ASSERT_EQ(memblock.memory.cnt, 2);
1264	ASSERT_EQ(memblock.memory.total_size, total_size);
1265
1266	test_pass_pop();
1267
1268	return 0;
1269}
1270
1271/*
1272 * A simple test that tries to remove a region r1 from the array of
1273 * available memory regions when r1 is the only available region.
1274 * Expect to add a memory block r1 and then remove r1 so that a dummy
1275 * region is added. The region counter stays the same, and the total size
1276 * is updated.
1277 */
1278static int memblock_remove_only_region_check(void)
1279{
1280	struct memblock_region *rgn;
1281
1282	rgn = &memblock.memory.regions[0];
1283
1284	struct region r1 = {
1285		.base = SZ_2K,
1286		.size = SZ_4K
1287	};
1288
1289	PREFIX_PUSH();
1290
1291	reset_memblock_regions();
1292	memblock_add(r1.base, r1.size);
1293	memblock_remove(r1.base, r1.size);
1294
1295	ASSERT_EQ(rgn->base, 0);
1296	ASSERT_EQ(rgn->size, 0);
1297
1298	ASSERT_EQ(memblock.memory.cnt, 1);
1299	ASSERT_EQ(memblock.memory.total_size, 0);
1300
1301	test_pass_pop();
1302
1303	return 0;
1304}
1305
1306/*
1307 * A simple test that tries remove a region r2 from the array of available
1308 * memory regions when r2 extends past PHYS_ADDR_MAX:
1309 *
1310 *                               +--------+
1311 *                               |   r2   |
1312 *                               +--------+
1313 *  |                        +---+....+
1314 *  |                        |rgn|    |
1315 *  +------------------------+---+----+
1316 *
1317 * Expect that only the portion between PHYS_ADDR_MAX and r2.base is removed.
1318 * Expect the total size of available memory to be updated and the counter to
1319 * not be updated.
1320 */
1321static int memblock_remove_near_max_check(void)
1322{
1323	struct memblock_region *rgn;
1324	phys_addr_t total_size;
1325
1326	rgn = &memblock.memory.regions[0];
1327
1328	struct region r1 = {
1329		.base = PHYS_ADDR_MAX - SZ_2M,
1330		.size = SZ_2M
1331	};
1332
1333	struct region r2 = {
1334		.base = PHYS_ADDR_MAX - SZ_1M,
1335		.size = SZ_2M
1336	};
1337
1338	PREFIX_PUSH();
1339
1340	total_size = r1.size - (PHYS_ADDR_MAX - r2.base);
1341
1342	reset_memblock_regions();
1343	memblock_add(r1.base, r1.size);
1344	memblock_remove(r2.base, r2.size);
1345
1346	ASSERT_EQ(rgn->base, r1.base);
1347	ASSERT_EQ(rgn->size, total_size);
1348
1349	ASSERT_EQ(memblock.memory.cnt, 1);
1350	ASSERT_EQ(memblock.memory.total_size, total_size);
1351
1352	test_pass_pop();
1353
1354	return 0;
1355}
1356
1357/*
1358 * A test that tries to remove a region r3 that overlaps with two existing
1359 * regions r1 and r2:
1360 *
1361 *            +----------------+
1362 *            |       r3       |
1363 *            +----------------+
1364 *  |    +----+.....   ........+--------+
1365 *  |    |    |r1  :   :       |r2      |     |
1366 *  +----+----+----+---+-------+--------+-----+
1367 *
1368 * Expect that only the intersections of r1 with r3 and r2 with r3 are removed
1369 * from the available memory pool. Expect the total size of available memory to
1370 * be updated and the counter to not be updated.
1371 */
1372static int memblock_remove_overlap_two_check(void)
1373{
1374	struct memblock_region *rgn1, *rgn2;
1375	phys_addr_t new_r1_size, new_r2_size, r2_end, r3_end, total_size;
1376
1377	rgn1 = &memblock.memory.regions[0];
1378	rgn2 = &memblock.memory.regions[1];
1379
1380	struct region r1 = {
1381		.base = SZ_16M,
1382		.size = SZ_32M
1383	};
1384	struct region r2 = {
1385		.base = SZ_64M,
1386		.size = SZ_64M
1387	};
1388	struct region r3 = {
1389		.base = SZ_32M,
1390		.size = SZ_64M
1391	};
1392
1393	PREFIX_PUSH();
1394
1395	r2_end = r2.base + r2.size;
1396	r3_end = r3.base + r3.size;
1397	new_r1_size = r3.base - r1.base;
1398	new_r2_size = r2_end - r3_end;
1399	total_size = new_r1_size + new_r2_size;
1400
1401	reset_memblock_regions();
1402	memblock_add(r1.base, r1.size);
1403	memblock_add(r2.base, r2.size);
1404	memblock_remove(r3.base, r3.size);
1405
1406	ASSERT_EQ(rgn1->base, r1.base);
1407	ASSERT_EQ(rgn1->size, new_r1_size);
1408
1409	ASSERT_EQ(rgn2->base, r3_end);
1410	ASSERT_EQ(rgn2->size, new_r2_size);
1411
1412	ASSERT_EQ(memblock.memory.cnt, 2);
1413	ASSERT_EQ(memblock.memory.total_size, total_size);
1414
1415	test_pass_pop();
1416
1417	return 0;
1418}
1419
1420static int memblock_remove_checks(void)
1421{
1422	prefix_reset();
1423	prefix_push(FUNC_REMOVE);
1424	test_print("Running %s tests...\n", FUNC_REMOVE);
1425
1426	memblock_remove_simple_check();
1427	memblock_remove_absent_check();
1428	memblock_remove_overlap_top_check();
1429	memblock_remove_overlap_bottom_check();
1430	memblock_remove_within_check();
1431	memblock_remove_only_region_check();
1432	memblock_remove_near_max_check();
1433	memblock_remove_overlap_two_check();
1434
1435	prefix_pop();
1436
1437	return 0;
1438}
1439
1440/*
1441 * A simple test that tries to free a memory block r1 that was marked
1442 * earlier as reserved. By "freeing" a region we mean overwriting it with
1443 * the next entry r2 in memblock.reserved:
1444 *
1445 *  |              ......           +----+ |
1446 *  |              : r1 :           | r2 | |
1447 *  +--------------+----+-----------+----+-+
1448 *                                  ^
1449 *                                  |
1450 *                                  rgn.base
1451 *
1452 * Expect to reserve two memory regions and then erase r1 region with the
1453 * value of r2. The region counter and total size are updated.
1454 */
1455static int memblock_free_simple_check(void)
1456{
1457	struct memblock_region *rgn;
1458
1459	rgn = &memblock.reserved.regions[0];
1460
1461	struct region r1 = {
1462		.base = SZ_4M,
1463		.size = SZ_1M
1464	};
1465	struct region r2 = {
1466		.base = SZ_8M,
1467		.size = SZ_1M
1468	};
1469
1470	PREFIX_PUSH();
1471
1472	reset_memblock_regions();
1473	memblock_reserve(r1.base, r1.size);
1474	memblock_reserve(r2.base, r2.size);
1475	memblock_free((void *)r1.base, r1.size);
1476
1477	ASSERT_EQ(rgn->base, r2.base);
1478	ASSERT_EQ(rgn->size, r2.size);
1479
1480	ASSERT_EQ(memblock.reserved.cnt, 1);
1481	ASSERT_EQ(memblock.reserved.total_size, r2.size);
1482
1483	test_pass_pop();
1484
1485	return 0;
1486}
1487
1488/*
1489 * A test that tries to free a region r2 that was not marked as reserved
1490 * (i.e. has no corresponding entry in memblock.reserved):
1491 *
1492 *                     +----------------+
1493 *                     |       r2       |
1494 *                     +----------------+
1495 *  |  +----+                              |
1496 *  |  | r1 |                              |
1497 *  +--+----+------------------------------+
1498 *     ^
1499 *     |
1500 *     rgn.base
1501 *
1502 * The array, regions counter and total size are not modified.
1503 */
1504static int memblock_free_absent_check(void)
1505{
1506	struct memblock_region *rgn;
1507
1508	rgn = &memblock.reserved.regions[0];
1509
1510	struct region r1 = {
1511		.base = SZ_2M,
1512		.size = SZ_8K
1513	};
1514	struct region r2 = {
1515		.base = SZ_16M,
1516		.size = SZ_128M
1517	};
1518
1519	PREFIX_PUSH();
1520
1521	reset_memblock_regions();
1522	memblock_reserve(r1.base, r1.size);
1523	memblock_free((void *)r2.base, r2.size);
1524
1525	ASSERT_EQ(rgn->base, r1.base);
1526	ASSERT_EQ(rgn->size, r1.size);
1527
1528	ASSERT_EQ(memblock.reserved.cnt, 1);
1529	ASSERT_EQ(memblock.reserved.total_size, r1.size);
1530
1531	test_pass_pop();
1532
1533	return 0;
1534}
1535
1536/*
1537 * A test that tries to free a region r2 that overlaps with the beginning
1538 * of the already existing entry r1 (that is r1.base < r2.base + r2.size):
1539 *
1540 *     +----+
1541 *     | r2 |
1542 *     +----+
1543 *  |    ...+--------------+               |
1544 *  |    :  |    r1        |               |
1545 *  +----+--+--------------+---------------+
1546 *       ^  ^
1547 *       |  |
1548 *       |  rgn.base
1549 *       |
1550 *       r1.base
1551 *
1552 * Expect that only the intersection of both regions is freed. The
1553 * regions counter and total size are updated.
1554 */
1555static int memblock_free_overlap_top_check(void)
1556{
1557	struct memblock_region *rgn;
1558	phys_addr_t total_size;
1559
1560	rgn = &memblock.reserved.regions[0];
1561
1562	struct region r1 = {
1563		.base = SZ_8M,
1564		.size = SZ_32M
1565	};
1566	struct region r2 = {
1567		.base = SZ_1M,
1568		.size = SZ_8M
1569	};
1570
1571	PREFIX_PUSH();
1572
1573	total_size = (r1.size + r1.base) - (r2.base + r2.size);
1574
1575	reset_memblock_regions();
1576	memblock_reserve(r1.base, r1.size);
1577	memblock_free((void *)r2.base, r2.size);
1578
1579	ASSERT_EQ(rgn->base, r2.base + r2.size);
1580	ASSERT_EQ(rgn->size, total_size);
1581
1582	ASSERT_EQ(memblock.reserved.cnt, 1);
1583	ASSERT_EQ(memblock.reserved.total_size, total_size);
1584
1585	test_pass_pop();
1586
1587	return 0;
1588}
1589
1590/*
1591 * A test that tries to free a region r2 that overlaps with the end of
1592 * the already existing entry r1 (that is r2.base < r1.base + r1.size):
1593 *
1594 *                   +----------------+
1595 *                   |       r2       |
1596 *                   +----------------+
1597 *  |    +-----------+.....                |
1598 *  |    |       r1  |    :                |
1599 *  +----+-----------+----+----------------+
1600 *
1601 * Expect that only the intersection of both regions is freed. The
1602 * regions counter and total size are updated.
1603 */
1604static int memblock_free_overlap_bottom_check(void)
1605{
1606	struct memblock_region *rgn;
1607	phys_addr_t total_size;
1608
1609	rgn = &memblock.reserved.regions[0];
1610
1611	struct region r1 = {
1612		.base = SZ_8M,
1613		.size = SZ_32M
1614	};
1615	struct region r2 = {
1616		.base = SZ_32M,
1617		.size = SZ_32M
1618	};
1619
1620	PREFIX_PUSH();
1621
1622	total_size = r2.base - r1.base;
1623
1624	reset_memblock_regions();
1625	memblock_reserve(r1.base, r1.size);
1626	memblock_free((void *)r2.base, r2.size);
1627
1628	ASSERT_EQ(rgn->base, r1.base);
1629	ASSERT_EQ(rgn->size, total_size);
1630
1631	ASSERT_EQ(memblock.reserved.cnt, 1);
1632	ASSERT_EQ(memblock.reserved.total_size, total_size);
1633
1634	test_pass_pop();
1635
1636	return 0;
1637}
1638
1639/*
1640 * A test that tries to free a region r2 that is within the range of the
1641 * already existing entry r1 (that is
1642 * (r1.base < r2.base) && (r2.base + r2.size < r1.base + r1.size)):
1643 *
1644 *                    +----+
1645 *                    | r2 |
1646 *                    +----+
1647 *  |    +------------+....+---------------+
1648 *  |    |    rgn1    | r1 |     rgn2      |
1649 *  +----+------------+----+---------------+
1650 *       ^
1651 *       |
1652 *       r1.base
1653 *
1654 * Expect that the region is split into two - one that ends at r2.base and
1655 * another that starts at r2.base + r2.size, with appropriate sizes. The
1656 * region counter and total size fields are updated.
1657 */
1658static int memblock_free_within_check(void)
1659{
1660	struct memblock_region *rgn1, *rgn2;
1661	phys_addr_t r1_size, r2_size, total_size;
1662
1663	rgn1 = &memblock.reserved.regions[0];
1664	rgn2 = &memblock.reserved.regions[1];
1665
1666	struct region r1 = {
1667		.base = SZ_1M,
1668		.size = SZ_8M
1669	};
1670	struct region r2 = {
1671		.base = SZ_4M,
1672		.size = SZ_1M
1673	};
1674
1675	PREFIX_PUSH();
1676
1677	r1_size = r2.base - r1.base;
1678	r2_size = (r1.base + r1.size) - (r2.base + r2.size);
1679	total_size = r1_size + r2_size;
1680
1681	reset_memblock_regions();
1682	memblock_reserve(r1.base, r1.size);
1683	memblock_free((void *)r2.base, r2.size);
1684
1685	ASSERT_EQ(rgn1->base, r1.base);
1686	ASSERT_EQ(rgn1->size, r1_size);
1687
1688	ASSERT_EQ(rgn2->base, r2.base + r2.size);
1689	ASSERT_EQ(rgn2->size, r2_size);
1690
1691	ASSERT_EQ(memblock.reserved.cnt, 2);
1692	ASSERT_EQ(memblock.reserved.total_size, total_size);
1693
1694	test_pass_pop();
1695
1696	return 0;
1697}
1698
1699/*
1700 * A simple test that tries to free a memory block r1 that was marked
1701 * earlier as reserved when r1 is the only available region.
1702 * Expect to reserve a memory block r1 and then free r1 so that r1 is
1703 * overwritten with a dummy region. The region counter stays the same,
1704 * and the total size is updated.
1705 */
1706static int memblock_free_only_region_check(void)
1707{
1708	struct memblock_region *rgn;
1709
1710	rgn = &memblock.reserved.regions[0];
1711
1712	struct region r1 = {
1713		.base = SZ_2K,
1714		.size = SZ_4K
1715	};
1716
1717	PREFIX_PUSH();
1718
1719	reset_memblock_regions();
1720	memblock_reserve(r1.base, r1.size);
1721	memblock_free((void *)r1.base, r1.size);
1722
1723	ASSERT_EQ(rgn->base, 0);
1724	ASSERT_EQ(rgn->size, 0);
1725
1726	ASSERT_EQ(memblock.reserved.cnt, 1);
1727	ASSERT_EQ(memblock.reserved.total_size, 0);
1728
1729	test_pass_pop();
1730
1731	return 0;
1732}
1733
1734/*
1735 * A simple test that tries free a region r2 when r2 extends past PHYS_ADDR_MAX:
1736 *
1737 *                               +--------+
1738 *                               |   r2   |
1739 *                               +--------+
1740 *  |                        +---+....+
1741 *  |                        |rgn|    |
1742 *  +------------------------+---+----+
1743 *
1744 * Expect that only the portion between PHYS_ADDR_MAX and r2.base is freed.
1745 * Expect the total size of reserved memory to be updated and the counter to
1746 * not be updated.
1747 */
1748static int memblock_free_near_max_check(void)
1749{
1750	struct memblock_region *rgn;
1751	phys_addr_t total_size;
1752
1753	rgn = &memblock.reserved.regions[0];
1754
1755	struct region r1 = {
1756		.base = PHYS_ADDR_MAX - SZ_2M,
1757		.size = SZ_2M
1758	};
1759
1760	struct region r2 = {
1761		.base = PHYS_ADDR_MAX - SZ_1M,
1762		.size = SZ_2M
1763	};
1764
1765	PREFIX_PUSH();
1766
1767	total_size = r1.size - (PHYS_ADDR_MAX - r2.base);
1768
1769	reset_memblock_regions();
1770	memblock_reserve(r1.base, r1.size);
1771	memblock_free((void *)r2.base, r2.size);
1772
1773	ASSERT_EQ(rgn->base, r1.base);
1774	ASSERT_EQ(rgn->size, total_size);
1775
1776	ASSERT_EQ(memblock.reserved.cnt, 1);
1777	ASSERT_EQ(memblock.reserved.total_size, total_size);
1778
1779	test_pass_pop();
1780
1781	return 0;
1782}
1783
1784/*
1785 * A test that tries to free a reserved region r3 that overlaps with two
1786 * existing reserved regions r1 and r2:
1787 *
1788 *            +----------------+
1789 *            |       r3       |
1790 *            +----------------+
1791 *  |    +----+.....   ........+--------+
1792 *  |    |    |r1  :   :       |r2      |     |
1793 *  +----+----+----+---+-------+--------+-----+
1794 *
1795 * Expect that only the intersections of r1 with r3 and r2 with r3 are freed
1796 * from the collection of reserved memory. Expect the total size of reserved
1797 * memory to be updated and the counter to not be updated.
1798 */
1799static int memblock_free_overlap_two_check(void)
1800{
1801	struct memblock_region *rgn1, *rgn2;
1802	phys_addr_t new_r1_size, new_r2_size, r2_end, r3_end, total_size;
1803
1804	rgn1 = &memblock.reserved.regions[0];
1805	rgn2 = &memblock.reserved.regions[1];
1806
1807	struct region r1 = {
1808		.base = SZ_16M,
1809		.size = SZ_32M
1810	};
1811	struct region r2 = {
1812		.base = SZ_64M,
1813		.size = SZ_64M
1814	};
1815	struct region r3 = {
1816		.base = SZ_32M,
1817		.size = SZ_64M
1818	};
1819
1820	PREFIX_PUSH();
1821
1822	r2_end = r2.base + r2.size;
1823	r3_end = r3.base + r3.size;
1824	new_r1_size = r3.base - r1.base;
1825	new_r2_size = r2_end - r3_end;
1826	total_size = new_r1_size + new_r2_size;
1827
1828	reset_memblock_regions();
1829	memblock_reserve(r1.base, r1.size);
1830	memblock_reserve(r2.base, r2.size);
1831	memblock_free((void *)r3.base, r3.size);
1832
1833	ASSERT_EQ(rgn1->base, r1.base);
1834	ASSERT_EQ(rgn1->size, new_r1_size);
1835
1836	ASSERT_EQ(rgn2->base, r3_end);
1837	ASSERT_EQ(rgn2->size, new_r2_size);
1838
1839	ASSERT_EQ(memblock.reserved.cnt, 2);
1840	ASSERT_EQ(memblock.reserved.total_size, total_size);
1841
1842	test_pass_pop();
1843
1844	return 0;
1845}
1846
1847static int memblock_free_checks(void)
1848{
1849	prefix_reset();
1850	prefix_push(FUNC_FREE);
1851	test_print("Running %s tests...\n", FUNC_FREE);
1852
1853	memblock_free_simple_check();
1854	memblock_free_absent_check();
1855	memblock_free_overlap_top_check();
1856	memblock_free_overlap_bottom_check();
1857	memblock_free_within_check();
1858	memblock_free_only_region_check();
1859	memblock_free_near_max_check();
1860	memblock_free_overlap_two_check();
1861
1862	prefix_pop();
1863
1864	return 0;
1865}
1866
1867static int memblock_set_bottom_up_check(void)
1868{
1869	prefix_push("memblock_set_bottom_up");
1870
1871	memblock_set_bottom_up(false);
1872	ASSERT_EQ(memblock.bottom_up, false);
1873	memblock_set_bottom_up(true);
1874	ASSERT_EQ(memblock.bottom_up, true);
1875
1876	reset_memblock_attributes();
1877	test_pass_pop();
1878
1879	return 0;
1880}
1881
1882static int memblock_bottom_up_check(void)
1883{
1884	prefix_push("memblock_bottom_up");
1885
1886	memblock_set_bottom_up(false);
1887	ASSERT_EQ(memblock_bottom_up(), memblock.bottom_up);
1888	ASSERT_EQ(memblock_bottom_up(), false);
1889	memblock_set_bottom_up(true);
1890	ASSERT_EQ(memblock_bottom_up(), memblock.bottom_up);
1891	ASSERT_EQ(memblock_bottom_up(), true);
1892
1893	reset_memblock_attributes();
1894	test_pass_pop();
1895
1896	return 0;
1897}
1898
1899static int memblock_bottom_up_checks(void)
1900{
1901	test_print("Running memblock_*bottom_up tests...\n");
1902
1903	prefix_reset();
1904	memblock_set_bottom_up_check();
1905	prefix_reset();
1906	memblock_bottom_up_check();
1907
1908	return 0;
1909}
1910
1911/*
1912 * A test that tries to trim memory when both ends of the memory region are
1913 * aligned. Expect that the memory will not be trimmed. Expect the counter to
1914 * not be updated.
1915 */
1916static int memblock_trim_memory_aligned_check(void)
1917{
1918	struct memblock_region *rgn;
1919	const phys_addr_t alignment = SMP_CACHE_BYTES;
1920
1921	rgn = &memblock.memory.regions[0];
1922
1923	struct region r = {
1924		.base = alignment,
1925		.size = alignment * 4
1926	};
1927
1928	PREFIX_PUSH();
1929
1930	reset_memblock_regions();
1931	memblock_add(r.base, r.size);
1932	memblock_trim_memory(alignment);
1933
1934	ASSERT_EQ(rgn->base, r.base);
1935	ASSERT_EQ(rgn->size, r.size);
1936
1937	ASSERT_EQ(memblock.memory.cnt, 1);
1938
1939	test_pass_pop();
1940
1941	return 0;
1942}
1943
1944/*
1945 * A test that tries to trim memory when there are two available regions, r1 and
1946 * r2. Region r1 is aligned on both ends and region r2 is unaligned on one end
1947 * and smaller than the alignment:
1948 *
1949 *                                     alignment
1950 *                                     |--------|
1951 * |        +-----------------+        +------+   |
1952 * |        |        r1       |        |  r2  |   |
1953 * +--------+-----------------+--------+------+---+
1954 *          ^        ^        ^        ^      ^
1955 *          |________|________|________|      |
1956 *                            |               Unaligned address
1957 *                Aligned addresses
1958 *
1959 * Expect that r1 will not be trimmed and r2 will be removed. Expect the
1960 * counter to be updated.
1961 */
1962static int memblock_trim_memory_too_small_check(void)
1963{
1964	struct memblock_region *rgn;
1965	const phys_addr_t alignment = SMP_CACHE_BYTES;
1966
1967	rgn = &memblock.memory.regions[0];
1968
1969	struct region r1 = {
1970		.base = alignment,
1971		.size = alignment * 2
1972	};
1973	struct region r2 = {
1974		.base = alignment * 4,
1975		.size = alignment - SZ_2
1976	};
1977
1978	PREFIX_PUSH();
1979
1980	reset_memblock_regions();
1981	memblock_add(r1.base, r1.size);
1982	memblock_add(r2.base, r2.size);
1983	memblock_trim_memory(alignment);
1984
1985	ASSERT_EQ(rgn->base, r1.base);
1986	ASSERT_EQ(rgn->size, r1.size);
1987
1988	ASSERT_EQ(memblock.memory.cnt, 1);
1989
1990	test_pass_pop();
1991
1992	return 0;
1993}
1994
1995/*
1996 * A test that tries to trim memory when there are two available regions, r1 and
1997 * r2. Region r1 is aligned on both ends and region r2 is unaligned at the base
1998 * and aligned at the end:
1999 *
2000 *                               Unaligned address
2001 *                                       |
2002 *                                       v
2003 * |        +-----------------+          +---------------+   |
2004 * |        |        r1       |          |      r2       |   |
2005 * +--------+-----------------+----------+---------------+---+
2006 *          ^        ^        ^        ^        ^        ^
2007 *          |________|________|________|________|________|
2008 *                            |
2009 *                    Aligned addresses
2010 *
2011 * Expect that r1 will not be trimmed and r2 will be trimmed at the base.
2012 * Expect the counter to not be updated.
2013 */
2014static int memblock_trim_memory_unaligned_base_check(void)
2015{
2016	struct memblock_region *rgn1, *rgn2;
2017	const phys_addr_t alignment = SMP_CACHE_BYTES;
2018	phys_addr_t offset = SZ_2;
2019	phys_addr_t new_r2_base, new_r2_size;
2020
2021	rgn1 = &memblock.memory.regions[0];
2022	rgn2 = &memblock.memory.regions[1];
2023
2024	struct region r1 = {
2025		.base = alignment,
2026		.size = alignment * 2
2027	};
2028	struct region r2 = {
2029		.base = alignment * 4 + offset,
2030		.size = alignment * 2 - offset
2031	};
2032
2033	PREFIX_PUSH();
2034
2035	new_r2_base = r2.base + (alignment - offset);
2036	new_r2_size = r2.size - (alignment - offset);
2037
2038	reset_memblock_regions();
2039	memblock_add(r1.base, r1.size);
2040	memblock_add(r2.base, r2.size);
2041	memblock_trim_memory(alignment);
2042
2043	ASSERT_EQ(rgn1->base, r1.base);
2044	ASSERT_EQ(rgn1->size, r1.size);
2045
2046	ASSERT_EQ(rgn2->base, new_r2_base);
2047	ASSERT_EQ(rgn2->size, new_r2_size);
2048
2049	ASSERT_EQ(memblock.memory.cnt, 2);
2050
2051	test_pass_pop();
2052
2053	return 0;
2054}
2055
2056/*
2057 * A test that tries to trim memory when there are two available regions, r1 and
2058 * r2. Region r1 is aligned on both ends and region r2 is aligned at the base
2059 * and unaligned at the end:
2060 *
2061 *                                             Unaligned address
2062 *                                                     |
2063 *                                                     v
2064 * |        +-----------------+        +---------------+   |
2065 * |        |        r1       |        |      r2       |   |
2066 * +--------+-----------------+--------+---------------+---+
2067 *          ^        ^        ^        ^        ^        ^
2068 *          |________|________|________|________|________|
2069 *                            |
2070 *                    Aligned addresses
2071 *
2072 * Expect that r1 will not be trimmed and r2 will be trimmed at the end.
2073 * Expect the counter to not be updated.
2074 */
2075static int memblock_trim_memory_unaligned_end_check(void)
2076{
2077	struct memblock_region *rgn1, *rgn2;
2078	const phys_addr_t alignment = SMP_CACHE_BYTES;
2079	phys_addr_t offset = SZ_2;
2080	phys_addr_t new_r2_size;
2081
2082	rgn1 = &memblock.memory.regions[0];
2083	rgn2 = &memblock.memory.regions[1];
2084
2085	struct region r1 = {
2086		.base = alignment,
2087		.size = alignment * 2
2088	};
2089	struct region r2 = {
2090		.base = alignment * 4,
2091		.size = alignment * 2 - offset
2092	};
2093
2094	PREFIX_PUSH();
2095
2096	new_r2_size = r2.size - (alignment - offset);
2097
2098	reset_memblock_regions();
2099	memblock_add(r1.base, r1.size);
2100	memblock_add(r2.base, r2.size);
2101	memblock_trim_memory(alignment);
2102
2103	ASSERT_EQ(rgn1->base, r1.base);
2104	ASSERT_EQ(rgn1->size, r1.size);
2105
2106	ASSERT_EQ(rgn2->base, r2.base);
2107	ASSERT_EQ(rgn2->size, new_r2_size);
2108
2109	ASSERT_EQ(memblock.memory.cnt, 2);
2110
2111	test_pass_pop();
2112
2113	return 0;
2114}
2115
2116static int memblock_trim_memory_checks(void)
2117{
2118	prefix_reset();
2119	prefix_push(FUNC_TRIM);
2120	test_print("Running %s tests...\n", FUNC_TRIM);
2121
2122	memblock_trim_memory_aligned_check();
2123	memblock_trim_memory_too_small_check();
2124	memblock_trim_memory_unaligned_base_check();
2125	memblock_trim_memory_unaligned_end_check();
2126
2127	prefix_pop();
2128
2129	return 0;
2130}
2131
2132int memblock_basic_checks(void)
2133{
2134	memblock_initialization_check();
2135	memblock_add_checks();
2136	memblock_reserve_checks();
2137	memblock_remove_checks();
2138	memblock_free_checks();
2139	memblock_bottom_up_checks();
2140	memblock_trim_memory_checks();
2141
2142	return 0;
2143}