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

115 lines
2.6 KiB
C
Raw Permalink Normal View History

2023-07-08 13:03:17 -07:00
/*
* Copyright (c) 2008-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_cmdprop.h"
#include "sdio_types.h"
enum CommandRegFieldOffsets
{
kResponseTypeOffset = 0,
kCmdCRCCheckEnabledOffset = 3,
kCmdIndexCheckEnabledOffset = 4,
kDataPresentSelectOffset = 5,
kCommandTypeOffset = 6,
kCommandIndexOffset = 8,
};
enum CommandRegFieldMasks
{
kResponseTypeSelectMask = (0x3 << kResponseTypeOffset),
kCmdCRCCheckEnabled = (1 << kCmdCRCCheckEnabledOffset),
kCmdIndexCheckEnabled = (1 << kCmdIndexCheckEnabledOffset),
kDataPresentSelect = (1 << kDataPresentSelectOffset),
kCommandTypeMask = (0x3 << kCommandTypeOffset),
kCommandIndexMask = (0x3F << kCommandIndexOffset),
};
enum CommandRegCommandType
{
kSDIOCommandNormal = (0x0 << kCommandTypeOffset),
kSDIOCommandSuspend = (0x1 << kCommandTypeOffset),
kSDIOCommandResume = (0x2 << kCommandTypeOffset),
kSDIOCommandAbort = (0x3 << kCommandTypeOffset),
};
enum CommandRegResponseTypeSelect
{
kNoResponse = (0x0 << kResponseTypeOffset),
kResponseLength136 = (0x1 << kResponseTypeOffset),
kResponseLength48 = (0x2 << kResponseTypeOffset),
kResponseLength48CheckBusy = (0x3 << kResponseTypeOffset),
};
bool
sdio_isDataPresent(UInt16 cmdIndex)
{
// TODO: Support other data commands
return kSDIOCmd53_IORWExtended == cmdIndex;
}
static bool
sdio_shouldCheckIndex(UInt16 cmdIndex)
{
return cmdIndex != kSDIOCmd5_IOSendOpCond;
}
static bool
sdio_shouldCheckCRC(UInt16 cmdIndex)
{
return cmdIndex != kSDIOCmd5_IOSendOpCond;
}
static enum CommandRegResponseTypeSelect
sdio_getResponseType(UInt16 cmdIndex)
{
// TODO: Support other response types
return kResponseLength48;
}
UInt16 sdio_generateCommand(UInt16 cmdIndex)
{
UInt16 cmd = 0;
// Command Index
cmd |= (cmdIndex << kCommandIndexOffset) & kCommandIndexMask;
// Command Type
// TODO: Support abort & suspend / resume commands
cmd |= kSDIOCommandNormal;
// Data present select
if(sdio_isDataPresent(cmdIndex)) {
cmd |= kDataPresentSelect;
}
// Command Index Check
if(sdio_shouldCheckIndex(cmdIndex)) {
cmd |= kCmdIndexCheckEnabled;
}
// Command CRC Check
if(sdio_shouldCheckCRC(cmdIndex)) {
cmd |= kCmdCRCCheckEnabled;
}
// Response type select
cmd |= sdio_getResponseType(cmdIndex);
return cmd;
}