xref: /haiku/src/system/kernel/device_manager/IOCache.h (revision 83b1a68c52ba3e0e8796282759f694b7fdddf06d)
1 /*
2  * Copyright 2010, Ingo Weinhold, ingo_weinhold@gmx.de.
3  * Distributed under the terms of the MIT License.
4  */
5 #ifndef IO_CACHE_H
6 #define IO_CACHE_H
7 
8 
9 #include <lock.h>
10 #include <vm/vm_page.h>
11 
12 #include "dma_resources.h"
13 #include "IOScheduler.h"
14 
15 
16 struct VMCache;
17 struct vm_page;
18 
19 
20 class IOCache : public IOScheduler {
21 public:
22 								IOCache(DMAResource* resource,
23 									size_t cacheLineSize);
24 	virtual						~IOCache();
25 
26 	virtual	status_t			Init(const char* name);
27 
28 	virtual	void				SetDeviceCapacity(off_t deviceCapacity);
29 	virtual void				MediaChanged();
30 
31 	virtual	status_t			ScheduleRequest(IORequest* request);
32 
33 	virtual	void				AbortRequest(IORequest* request,
34 									status_t status = B_CANCELED);
35 	virtual	void				OperationCompleted(IOOperation* operation,
36 									status_t status,
37 									generic_size_t transferredBytes);
38 
39 	virtual	void				Dump() const;
40 
41 private:
42 			struct Operation;
43 
44 private:
45 			status_t			_DoRequest(IORequest* request,
46 									generic_size_t& _bytesTransferred);
47 			status_t			_TransferRequestLine(IORequest* request,
48 									off_t lineOffset, size_t lineSize,
49 									off_t requestOffset, size_t requestLength);
50 			status_t			_TransferRequestLineUncached(IORequest* request,
51 									off_t lineOffset, off_t requestOffset,
52 									size_t requestLength);
53 			status_t			_DoOperation(Operation& operation);
54 
55 			status_t			_TransferPages(size_t firstPage,
56 									size_t pageCount, bool isWrite, bool isVIP);
57 			void				_DiscardPages(size_t firstPage,
58 									size_t pageCount);
59 			void				_CachePages(size_t firstPage, size_t pageCount);
60 
61 			status_t			_CopyPages(IORequest* request,
62 									size_t pagesRelativeOffset,
63 									off_t requestOffset, size_t requestLength,
64 									bool toRequest);
65 
66 			status_t			_MapPages(size_t firstPage, size_t endPage);
67 			void				_UnmapPages(size_t firstPage, size_t endPage);
68 
69 private:
70 			mutex				fSerializationLock;
71 			off_t				fDeviceCapacity;
72 			size_t				fLineSize;
73 			uint32				fLineSizeShift;
74 			size_t				fPagesPerLine;
75 			area_id				fArea;
76 			void*				fAreaBase;
77 			vm_page_reservation	fMappingReservation;
78 			VMCache*			fCache;
79 			vm_page**			fPages;
80 			generic_io_vec*		fVecs;
81 };
82 
83 
84 #endif	// IO_CACHE_H
85