#include <IOKit/IOLib.h>
#include "AppleNVRAM.h"
#define super IONVRAMController
OSDefineMetaClassAndStructors(AppleNVRAM, IONVRAMController);
bool AppleNVRAM::start(IOService *provider)
{
IOItemCount numRanges;
IOMemoryMap *map;
numRanges = provider->getDeviceMemoryCount();
if (numRanges == 1) {
_nvramType = kNVRAMTypeIOMem;
map = provider->mapDeviceMemoryWithIndex(0);
if (map == 0) return false;
_nvramData = (UInt8 *)map->getVirtualAddress();
} else if (numRanges == 2) {
_nvramType = kNVRAMTypePort;
map = provider->mapDeviceMemoryWithIndex(0);
if (map == 0) return false;
_nvramPort = (UInt8 *)map->getVirtualAddress();
map = provider->mapDeviceMemoryWithIndex(1);
if (map == 0) return false;
_nvramData = (UInt8 *)map->getVirtualAddress();
} else {
return false;
}
return super::start(provider);
}
IOReturn AppleNVRAM::read(IOByteCount offset, UInt8 *buffer,
IOByteCount length)
{
UInt32 cnt;
if ((buffer == 0) || (length <= 0) || (offset < 0) ||
(offset + length > kNVRAMImageSize))
return kIOReturnBadArgument;
switch (_nvramType) {
case kNVRAMTypeIOMem :
for (cnt = 0; cnt < length; cnt++) {
buffer[cnt] = _nvramData[(offset + cnt) << 4];
}
break;
case kNVRAMTypePort:
for (cnt = 0; cnt < length; cnt++) {
*_nvramPort = (offset + length) >> 5;
eieio();
buffer[cnt] = _nvramData[((offset + length) & 0x1F) << 4];
}
break;
default :
return kIOReturnNotReady;
}
return kIOReturnSuccess;
}
IOReturn AppleNVRAM::write(IOByteCount offset, UInt8 *buffer,
IOByteCount length)
{
UInt32 cnt;
if ((buffer == 0) || (length <= 0) || (offset < 0) ||
(offset + length > kNVRAMImageSize))
return kIOReturnBadArgument;
switch (_nvramType) {
case kNVRAMTypeIOMem :
for (cnt = 0; cnt < length; cnt++) {
_nvramData[(offset + cnt) << 4] = buffer[cnt];
eieio();
}
break;
case kNVRAMTypePort:
for (cnt = 0; cnt < length; cnt++) {
*_nvramPort = (offset + length) >> 5;
eieio();
_nvramData[((offset + length) & 0x1F) << 4] = buffer[cnt];
eieio();
}
break;
default :
return kIOReturnNotReady;
}
return kIOReturnSuccess;
}