iBoot/drivers/arasan/sdio/sdiocommon/sdio_cmdfields.c

146 lines
2.8 KiB
C

/*
* Copyright (c) 2009-2010 Apple Inc. All rights reserved.
*
* This document is the property of Apple Inc.
* It is considered confidential and proprietary.
*
* This document may not be reproduced or transmitted in any form,
* in whole or in part, without the express written permission of
* Apple Inc.
*/
#include "sdio_cmdfields.h"
#pragma mark -
#pragma mark Common
enum CommandOffset
{
kSDIOCmdAddressOffset = 9,
kSDIOCmdFunctionOffset = 28,
};
enum CommandMask
{
kSDIOCmdFunctionMask = 0x7,
kSDIOCmdAddressMask = 0x1FFFF,
};
enum SDIOCmdDirection
{
kSDIOCmdDirectionRead = (0 << 31),
kSDIOCmdDirectionWrite = (1 << 31),
};
static inline UInt32
convertFunctionToArg(UInt8 function)
{
return (function & kSDIOCmdFunctionMask) << kSDIOCmdFunctionOffset;
}
static inline UInt32
convertAddressToArg(UInt32 address)
{
return (address & kSDIOCmdAddressMask) << kSDIOCmdAddressOffset;
}
enum SDIODirection
sdio_getCommandDirection(enum SDIOCommandIndex index, UInt32 argument)
{
switch (index) {
case kSDIOCmd52_IORWDirect:
case kSDIOCmd53_IORWExtended:
return (argument & kSDIOCmdDirectionWrite) ? kSDIODirectionWrite : kSDIODirectionRead;
default:
return kSDIODirectionNone;
}
}
#pragma mark -
#pragma mark Cmd5
UInt32
sdio_getOCR(const struct SDIOCommandResponse *cmd5Response)
{
return cmd5Response->response[0] & 0x00fffff;
}
bool
sdio_getNumIOFunctions(const struct SDIOCommandResponse *cmd5Response)
{
return (cmd5Response->response[0] & 0x70000000) >> 28;
}
bool
sdio_isMemoryPresent(const struct SDIOCommandResponse *cmd5Response)
{
return cmd5Response->response[0] & 0x08000000; // >> 27
}
bool
sdio_isIOReady(const struct SDIOCommandResponse *cmd5Response)
{
return cmd5Response->response[0] & 0x80000000; // >> 31
}
#pragma mark -
#pragma mark Cmd52
UInt32
sdio_generateCmd52Arg(enum SDIODirection direction,
UInt8 sdioFunction, UInt32 cardAddress, UInt8 data,
SDIOCmd52Flags flags)
{
UInt32 dir = (direction & kSDIODirectionWrite) ? kSDIOCmdDirectionWrite : kSDIOCmdDirectionRead;
return dir | convertFunctionToArg(sdioFunction) | flags
| convertAddressToArg(cardAddress) | data;
}
#pragma mark -
#pragma mark Cmd53
enum SDIOCmd53Mask
{
kSDIOCmd53CountMask = 0x1FF
};
static inline UInt32
convertCmd53CountToArg(UInt32 count)
{
return (count & kSDIOCmd53CountMask);
}
UInt32
sdio_generateCmd53Arg(enum SDIODirection direction,
UInt8 sdioFunction, UInt32 cardAddress, UInt16 count,
SDIOCmd53Flags flags)
{
UInt32 dir = (direction & kSDIODirectionWrite) ? kSDIOCmdDirectionWrite : kSDIOCmdDirectionRead;
return dir | convertFunctionToArg(sdioFunction) | flags
| convertAddressToArg(cardAddress) | convertCmd53CountToArg(count);
}
UInt16
sdio_getCmd53Count(UInt32 cmdArg)
{
return cmdArg & kSDIOCmd53CountMask;
}