]> git.saurik.com Git - apple/xnu.git/blob - iokit/Drivers/platform/drvAppleNVRAM/AppleNVRAM.cpp
3391d78635fd1a93b2334db4a97b5d6e66dd198d
[apple/xnu.git] / iokit / Drivers / platform / drvAppleNVRAM / AppleNVRAM.cpp
1 /*
2 * Copyright (c) 1998-2008 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
14 *
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
17 *
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
25 *
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27 */
28
29 #include <IOKit/IOLib.h>
30 #include "AppleNVRAM.h"
31
32
33 #define super IONVRAMController
34 OSDefineMetaClassAndStructors(AppleNVRAM, IONVRAMController);
35
36
37 // ****************************************************************************
38 // start
39 //
40 // ****************************************************************************
41 bool AppleNVRAM::start(IOService *provider)
42 {
43 IOItemCount numRanges;
44 IOMemoryMap *map;
45
46 numRanges = provider->getDeviceMemoryCount();
47
48 if (numRanges == 1) {
49 _nvramType = kNVRAMTypeIOMem;
50
51 // Get the address of the data register.
52 map = provider->mapDeviceMemoryWithIndex(0);
53 if (map == 0) return false;
54 _nvramData = (UInt8 *)map->getVirtualAddress();
55
56 } else if (numRanges == 2) {
57 _nvramType = kNVRAMTypePort;
58
59 // Get the address of the port register.
60 map = provider->mapDeviceMemoryWithIndex(0);
61 if (map == 0) return false;
62 _nvramPort = (UInt8 *)map->getVirtualAddress();
63
64 // Get the address of the data register.
65 map = provider->mapDeviceMemoryWithIndex(1);
66 if (map == 0) return false;
67 _nvramData = (UInt8 *)map->getVirtualAddress();
68
69 } else {
70 return false;
71 }
72
73 return super::start(provider);
74 }
75
76 // ****************************************************************************
77 // read
78 //
79 // Read data from the NVRAM and return it in buffer.
80 //
81 // ****************************************************************************
82 IOReturn AppleNVRAM::read(IOByteCount offset, UInt8 *buffer,
83 IOByteCount length)
84 {
85 UInt32 cnt;
86
87 // length and offset can't be less than zero (unsigned), so we don't check
88 if ((buffer == 0) || (length == 0) || (offset + length > kNVRAMImageSize))
89 return kIOReturnBadArgument;
90
91 switch (_nvramType) {
92 case kNVRAMTypeIOMem :
93 for (cnt = 0; cnt < length; cnt++) {
94 buffer[cnt] = _nvramData[(offset + cnt) << 4];
95 }
96 break;
97
98 case kNVRAMTypePort:
99 for (cnt = 0; cnt < length; cnt++) {
100 *_nvramPort = (offset + length) >> 5;
101 eieio();
102 buffer[cnt] = _nvramData[((offset + length) & 0x1F) << 4];
103 }
104 break;
105
106 default :
107 return kIOReturnNotReady;
108 }
109
110 return kIOReturnSuccess;
111 }
112
113
114 // ****************************************************************************
115 // write
116 //
117 // Write data from buffer into NVRAM.
118 //
119 // ****************************************************************************
120 IOReturn AppleNVRAM::write(IOByteCount offset, UInt8 *buffer,
121 IOByteCount length)
122 {
123 UInt32 cnt;
124
125 // length and offset can't be less than zero (unsigned), so we don't check
126 if ((buffer == 0) || (length == 0) || (offset + length > kNVRAMImageSize))
127 return kIOReturnBadArgument;
128
129 switch (_nvramType) {
130 case kNVRAMTypeIOMem :
131 for (cnt = 0; cnt < length; cnt++) {
132 _nvramData[(offset + cnt) << 4] = buffer[cnt];
133 eieio();
134 }
135 break;
136
137 case kNVRAMTypePort:
138 for (cnt = 0; cnt < length; cnt++) {
139 *_nvramPort = (offset + length) >> 5;
140 eieio();
141 _nvramData[((offset + length) & 0x1F) << 4] = buffer[cnt];
142 eieio();
143 }
144 break;
145
146 default :
147 return kIOReturnNotReady;
148 }
149
150 return kIOReturnSuccess;
151 }