Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dc2b2463 authored by Sandeep Patil's avatar Sandeep Patil
Browse files

ANDROID: staging: ion: reserve specific heap ids for known heap types.



Since its inception, ion used heap types and heap ids interchangeably.
The 'heap type' is not part of the UAPI but 'heap ids' are. The sad part
is that heap ids are dynamically generated and heap types aren't. This
causes all sorts of problems trying to support following things
	1. No UAPI breakage for ION in GKI
	2. Support multiple CMA heaps (i.e. heap with same type but
	different ids)
	3. Allow Android system code to reliably talk to any ION
	driver using the standard / reserved heap types. etc.
	4. Allow someone to override standard heap implementation.
	5. Allow for new heap types to register to ion core.

With this change, we start the process of reserving heap ids for
long known heap types like system, carveout etc. In order to not
break ABI and UAPI, we continue to use 32-bits with following caveats

	1. BIT(0)-BIT(15) are reserved for standard / GKI heap ids
	that Android platform can use from now on reliably.
	2. BIT(16)-BIT(31) are reserved for custom heap types that
	only vendor specific processes can rely upon.
	3. BIT(3)-BIT(7) are reserved for CARVEOUT heaps.
	4. BIT(8)-BIT(15) are reserved for CMA / DMA heaps that manage
	different CMA regions. The heap ids will be allocated in ascending
	order and are first come first served.

Bug: 133508579
Test:ion-unit-tests

Change-Id: I53af694113b62d29e0d2933fbcf7079d845099e9
Signed-off-by: default avatarSandeep Patil <sspatil@google.com>
parent 89791c3f
Loading
Loading
Loading
Loading
+55 −19
Original line number Diff line number Diff line
@@ -12,29 +12,65 @@
#include <linux/types.h>

/**
 * enum ion_heap_types - list of all possible types of heaps
 * @ION_HEAP_TYPE_SYSTEM:        memory allocated via vmalloc
 * @ION_HEAP_TYPE_SYSTEM_CONTIG: memory allocated via kmalloc
 * @ION_HEAP_TYPE_CARVEOUT:      memory allocated from a prereserved
 *                               carveout heap, allocations are physically
 *                               contiguous
 * @ION_HEAP_TYPE_DMA:           memory allocated via DMA API
 * @ION_HEAP_TYPE_MAX:		 helper for iterating over standard
 *				 (not device specific) heaps
 * @ION_NUM_HEAPS_IDS:           helper for iterating over heaps, a bit mask
 *                               is used to identify the heaps, so only 32
 *                               total heap types are supported
 * ion_heap_types - list of all possible types of heaps that Android can use
 *
 * @ION_HEAP_TYPE_SYSTEM:        Reserved heap id for ion heap that allocates
 *				 memory using alloc_page(). Also, supports
 *				 deferred free and allocation pools.
 * @ION_HEAP_TYPE_SYSTEM_CONTIG: Reserved heap id for ion heap that is the same
 *				 as SYSTEM_HEAP, except doesn't support
 *				 allocation pools.
 * @ION_HEAP_TYPE_CARVEOUT:      Reserved heap id for ion heap that allocates
 *				 memory from a pre-reserved memory region
 *				 aka 'carveout'.
 * @ION_HEAP_TYPE_DMA:		 Reserved heap id for ion heap that manages
 * 				 single CMA (contiguous memory allocator)
 * 				 region. Uses standard DMA APIs for
 *				 managing memory within the CMA region.
 */
enum ion_heap_type {
	ION_HEAP_TYPE_SYSTEM = (1 << 0),
	ION_HEAP_TYPE_SYSTEM_CONTIG = (1 << 1),
	ION_HEAP_TYPE_CARVEOUT = (1 << 2),
	ION_HEAP_TYPE_CHUNK = (1 << 3),
	ION_HEAP_TYPE_DMA = (1 << 4),
	ION_HEAP_TYPE_MAX = (1 << 15),
	ION_HEAP_TYPE_SYSTEM = 0,
	ION_HEAP_TYPE_SYSTEM_CONTIG = 1,
	ION_HEAP_TYPE_CHUNK = 2,
	ION_HEAP_TYPE_CARVEOUT = 3,
	ION_HEAP_TYPE_DMA = 4,
	/* reserved range for future standard heap types */
	ION_HEAP_TYPE_CUSTOM = 16,
	ION_HEAP_TYPE_MAX = 31,
};

/**
 * ion_heap_id - list of standard heap ids that Android can use
 *
 * @ION_HEAP_SYSTEM		Id for the ION_HEAP_TYPE_SYSTEM
 * @ION_HEAP_SYSTEM_CONTIG	Id for the ION_HEAP_TYPE_SYSTEM_CONTIG
 * @ION_HEAP_CHUNK		Id for the ION_HEAP_TYPE_CHUNK
 * @ION_HEAP_CARVEOUT_START	Start of reserved id range for heaps of type
 *				ION_HEAP_TYPE_CARVEOUT
 * @ION_HEAP_CARVEOUT_END	End of reserved id range for heaps of type
 *				ION_HEAP_TYPE_CARVEOUT
 * @ION_HEAP_DMA_START 		Start of reserved id range for heaps of type
 *				ION_HEAP_TYPE_DMA
 * @ION_HEAP_DMA_END		End of reserved id range for heaps of type
 *				ION_HEAP_TYPE_DMA
 * @ION_HEAP_CUSTOM_START	Start of reserved id range for heaps of custom
 *				type
 * @ION_HEAP_CUSTOM_END		End of reserved id range for heaps of custom
 *				type
 */
enum ion_heap_id {
	ION_HEAP_SYSTEM = (1 << ION_HEAP_TYPE_SYSTEM),
	ION_HEAP_SYSTEM_CONTIG = (ION_HEAP_SYSTEM << 1),
	ION_HEAP_CHUNK = (ION_HEAP_SYSTEM_CONTIG << 1),
	ION_HEAP_CARVEOUT_START = (ION_HEAP_CHUNK << 1),
	ION_HEAP_CARVEOUT_END = (ION_HEAP_CARVEOUT_START << 4),
	ION_HEAP_DMA_START = (ION_HEAP_CARVEOUT_END << 1),
	ION_HEAP_DMA_END = (ION_HEAP_DMA_START << 7),
	ION_HEAP_CUSTOM_START = (ION_HEAP_DMA_END << 1),
	ION_HEAP_CUSTOM_END = (ION_HEAP_CUSTOM_START << 15),
};

#define ION_NUM_HEAP_IDS		(sizeof(unsigned int) * 8)
#define ION_NUM_MAX_HEAPS	(32)

/**
 * allocation flags - the lower 16 bits are used by core ion, the upper 16