Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 | /* * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * * The contents of this file constitute Original Code as defined in and * are subject to the Apple Public Source License Version 1.1 (the * "License"). You may not use this file except in compliance with the * License. Please obtain a copy of the License at * http://www.apple.com/publicsource and read it before using this file. * * This Original Code and all software distributed under the License are * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the * License for the specific language governing rights and limitations * under the License. * * @APPLE_LICENSE_HEADER_END@ */ #ifndef _IOMULTIMEMORYDESCRIPTOR_H #define _IOMULTIMEMORYDESCRIPTOR_H #include <IOKit/IOMemoryDescriptor.h> /*! @class IOMultiMemoryDescriptor : public IOMemoryDescriptor @abstract The IOMultiMemoryDescriptor object describes a memory area made up of several other IOMemoryDescriptors. @discussion The IOMultiMemoryDescriptor object represents multiple ranges of memory, specified as an ordered list of IOMemoryDescriptors. The descriptors are chained end-to-end to make up a single contiguous buffer. */ class IOMultiMemoryDescriptor : public IOMemoryDescriptor { OSDeclareDefaultStructors(IOMultiMemoryDescriptor); protected: IOMemoryDescriptor ** _descriptors; UInt32 _descriptorsCount; bool _descriptorsIsAllocated; virtual void free(); /* * These methods are not supported under this subclass. */ virtual bool initWithAddress( void * address, /* not supported */ IOByteCount withLength, IODirection withDirection ); virtual bool initWithAddress( vm_address_t address, /* not supported */ IOByteCount withLength, IODirection withDirection, task_t withTask ); virtual bool initWithPhysicalAddress( IOPhysicalAddress address, /* not supported */ IOByteCount withLength, IODirection withDirection ); virtual bool initWithPhysicalRanges( IOPhysicalRange * ranges, /* not supported */ UInt32 withCount, IODirection withDirection, bool asReference = false ); virtual bool initWithRanges( IOVirtualRange * ranges, /* not supported */ UInt32 withCount, IODirection withDirection, task_t withTask, bool asReference = false ); virtual void * getVirtualSegment( IOByteCount offset, /* not supported */ IOByteCount * length ); IOMemoryDescriptor::withAddress; /* not supported */ IOMemoryDescriptor::withPhysicalAddress; /* not supported */ IOMemoryDescriptor::withPhysicalRanges; /* not supported */ IOMemoryDescriptor::withRanges; /* not supported */ IOMemoryDescriptor::withSubRange; /* not supported */ public: /*! @function withDescriptors @abstract Create an IOMultiMemoryDescriptor to describe a memory area made up of several other IOMemoryDescriptors. @discussion This method creates and initializes an IOMultiMemoryDescriptor for memory consisting of a number of other IOMemoryDescriptors, chained end-to-end (in the order they appear in the array) to represent a single contiguous memory buffer. Passing the descriptor array as a reference will avoid an extra allocation. @param descriptors An array of IOMemoryDescriptors which make up the memory to be described. @param withCount The object count for the descriptors array. @param withDirection An I/O direction to be associated with the descriptor, which may affect the operation of the prepare and complete methods on some architectures. @param asReference If false, the IOMultiMemoryDescriptor object will make a copy of the descriptors array, otherwise, the array will be used in situ, avoiding an extra allocation. @result The created IOMultiMemoryDescriptor on success, to be released by the caller, or zero on failure. */ static IOMultiMemoryDescriptor * withDescriptors( IOMemoryDescriptor ** descriptors, UInt32 withCount, IODirection withDirection, bool asReference = false ); /*! @function withDescriptors @abstract Initialize an IOMultiMemoryDescriptor to describe a memory area made up of several other IOMemoryDescriptors. @discussion This method initializes an IOMultiMemoryDescriptor for memory consisting of a number of other IOMemoryDescriptors, chained end-to-end (in the order they appear in the array) to represent a single contiguous memory buffer. Passing the descriptor array as a reference will avoid an extra allocation. @param descriptors An array of IOMemoryDescriptors which make up the memory to be described. @param withCount The object count for the descriptors array. @param withDirection An I/O direction to be associated with the descriptor, which may affect the operation of the prepare and complete methods on some architectures. @param asReference If false, the IOMultiMemoryDescriptor object will make a copy of the descriptors array, otherwise, the array will be used in situ, avoiding an extra allocation. @result The created IOMultiMemoryDescriptor on success, to be released by the caller, or zero on failure. */ virtual bool initWithDescriptors( IOMemoryDescriptor ** descriptors, UInt32 withCount, IODirection withDirection, bool asReference = false ); /*! @function getPhysicalAddress @abstract Return the physical address of the first byte in the memory. @discussion This method returns the physical address of the first byte in the memory. It is most useful on memory known to be physically contiguous. @result A physical address. */ virtual IOPhysicalAddress getPhysicalSegment( IOByteCount offset, IOByteCount * length ); /*! @function prepare @abstract Prepare the memory for an I/O transfer. @discussion This involves paging in the memory, if necessary, and wiring it down for the duration of the transfer. The complete() method completes the processing of the memory after the I/O transfer finishes. This method needn't called for non-pageable memory. @param forDirection The direction of the I/O just completed, or kIODirectionNone for the direction specified by the memory descriptor. @result An IOReturn code. */ virtual IOReturn prepare(IODirection forDirection = kIODirectionNone); /*! @function complete @abstract Complete processing of the memory after an I/O transfer finishes. @discussion This method should not be called unless a prepare was previously issued; the prepare() and complete() must occur in pairs, before and after an I/O transfer involving pageable memory. @param forDirection The direction of the I/O just completed, or kIODirectionNone for the direction specified by the memory descriptor. @result An IOReturn code. */ virtual IOReturn complete(IODirection forDirection = kIODirectionNone); /*! @function readBytes @abstract Copy data from the memory descriptor's buffer to the specified buffer. @discussion This method copies data from the memory descriptor's memory at the given offset, to the caller's buffer. @param offset A byte offset into the memory descriptor's memory. @param bytes The caller supplied buffer to copy the data to. @param withLength The length of the data to copy. @result The number of bytes copied, zero will be returned if the specified offset is beyond the length of the descriptor. */ virtual IOByteCount readBytes( IOByteCount offset, void * bytes, IOByteCount withLength ); /*! @function writeBytes @abstract Copy data to the memory descriptor's buffer from the specified buffer. @discussion This method copies data to the memory descriptor's memory at the given offset, from the caller's buffer. @param offset A byte offset into the memory descriptor's memory. @param bytes The caller supplied buffer to copy the data from. @param withLength The length of the data to copy. @result The number of bytes copied, zero will be returned if the specified offset is beyond the length of the descriptor. */ virtual IOByteCount writeBytes( IOByteCount offset, const void * bytes, IOByteCount withLength ); }; #endif /* !_IOMULTIMEMORYDESCRIPTOR_H */ |