xref: /haiku/src/add-ons/kernel/bus_managers/usb/PhysicalMemoryAllocator.h (revision efafab643ce980e3f3c916795ed302599f6b4f66)
1 /*
2  * Copyright 2006, Haiku Inc. All rights reserved.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Michael Lotz <mmlr@mlotz.ch>
7  */
8 #ifndef _PHYSICAL_MEMORY_ALLOCATOR_H_
9 #define _PHYSICAL_MEMORY_ALLOCATOR_H_
10 
11 
12 #include <condition_variable.h>
13 #include <SupportDefs.h>
14 #include <lock.h>
15 
16 
17 class PhysicalMemoryAllocator {
18 public:
19 									PhysicalMemoryAllocator(const char *name,
20 										size_t minSize,
21 										size_t maxSize,
22 										uint32 minCountPerBlock);
23 									~PhysicalMemoryAllocator();
24 
25 		status_t					InitCheck() { return fStatus; };
26 
27 		status_t					Allocate(size_t size,
28 										void **logicalAddress,
29 										phys_addr_t *physicalAddress);
30 
31 		// one of both addresses needs to be provided, the other may be NULL
32 		status_t					Deallocate(size_t size,
33 										void *logicalAddress,
34 										phys_addr_t physicalAddress);
35 
36 		void						PrintToStream();
37 		void						DumpArrays();
38 		void						DumpLastArray();
39 		void						DumpFreeSlots();
40 
41 private:
42 		bool						_Lock();
43 		void						_Unlock();
44 
45 		char						*fName;
46 
47 		size_t						fOverhead;
48 		size_t						fManagedMemory;
49 		status_t					fStatus;
50 
51 		mutex						fLock;
52 		area_id						fArea;
53 		void						*fLogicalBase;
54 		phys_addr_t					fPhysicalBase;
55 
56 		int32						fArrayCount;
57 		size_t						*fBlockSize;
58 		size_t						*fArrayLength;
59 		size_t						*fArrayOffset;
60 		uint8						**fArray;
61 
62 		ConditionVariable			fNoMemoryCondition;
63 		uint32						fMemoryWaitersCount;
64 
65 		uint32						fDebugBase;
66 		uint32						fDebugChunkSize;
67 		uint64						fDebugUseMap;
68 };
69 
70 #endif // !_PHYSICAL_MEMORY_ALLOCATOR_H_
71