iBoot/apps/EmbeddedIOP/function_sdio/iop_sdio_protocol.h

260 lines
5.6 KiB
C

/*
* Copyright (C) 2008 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.
*/
#ifndef _IOP_SDIO_PROTOCOL_H_
#define _IOP_SDIO_PROTOCOL_H_
#include <sys/types.h>
#ifdef PLATFORM_VARIANT_IOP
#include <sdiocommon/sdio_types.h>
#else
#include <IOKit/sdio/sdio_types.h>
#endif
/*
* Command size is (somewhat) tunable.
*
* The principal consideration here is the maximum scatter/gather list size
* this permits.
*/
#define kIOPSDIO_MESSAGE_SIZE (512)
typedef UInt32 IOPSDIO_opcode_t;
enum IOPSDIOOpcode
{
kIOPSDIOOpcodeUnknown = 0,
kIOPSDIOOpcodePing = 1,
kIOPSDIOOpcodeInit = 2,
kIOPSDIOOpcodeFree = 3,
kIOPSDIOOpcodeReset = 4,
kIOPSDIOOpcodeSetBusParam = 5,
kIOPSDIOOpcodeSendCommand = 6,
kIOPSDIOOpcodeTransferData = 7,
};
typedef UInt32 IOPSDIO_flags_t;
enum IOPSDIOFlags
{
kIOPSDIOFlagsNone = 0,
};
typedef UInt32 IOPSDIO_status_t;
enum IOPSDIOStatus
{
// IOP Messaging Errors
/** @brief Command succeeded. */
kIOPSDIOStatusSuccess = 0,
/** @brief Status is not yet known (e.g. message has not been sent or processed). */
kIOPSDIOStatusUnknown = 1,
/** @brief One of the IOP parameters was invalid. */
kIOPSDIOParameterInvalid = 2,
// Common IOReturn Values
// If the IOP Status is in the range [0x200 0x300) then it is a standard
// IOKit IOReturn value without the "iokit_common_err( )" bits set
// SDIOReturn_t Values
// If the IOP status is in the range [0x300 0x800) it is an SDIOReturn_t
// value. This value is the same as the base value of IOSDIOReturn in the
// IOKit SDIO family, without the "iokit_family_err(sub_iokit_sdio, )"
// bits set.
};
/* this must match <drivers/dma.h>::struct dma_segment */
struct IOPSDIO_dma_segment {
u_int32_t paddr;
u_int32_t length;
};
/** @brief Standard header on all IOP SDIO Commands. */
struct IOPSDIOHeader
{
IOPSDIO_opcode_t opcode;
IOPSDIO_flags_t flags;
IOPSDIO_status_t status;
};
/** @brief Info about the target SDIO Host Controller. */
struct IOPSDIOTargetSDHC
{
/** @brief The Base physical address of the SDIO block's register file. */
UInt32 basePhysicalAddr;
/** @brief Wake event. */
UInt32 dmaCompleteEventAddr;
};
// SDIO INIT
/** @brief Bus Parameter Command. */
struct IOPSDIOInitCmd
{
/** @brief The capabilities of the SDHC. */
UInt64 sdhcCapabilities;
/** @brief The Maximum current capabilities of the SDHC. */
UInt64 sdhcMaxCurrentCapabilities;
};
// SDIO FREE
/** @brief Bus Parameter Command. */
struct IOPSDIOFreeCmd
{
// Nothing at the moment
};
// SDIO RESET
/** @brief SDHC Reset Command. */
struct IOPSDIOResetCmd
{
/** @brief Reset flags. */
UInt32 resetFlags;
};
// BUS PARAMETERS
/** @brief Bus Parameter Command. */
struct IOPSDIOSetBusParamCmd
{
/** @brief Base clock rate input to the SD Block.
* If 0, the value from the SDHC capabilities register is used instead.
*/
UInt32 baseClockRateHz;
/** @brief New SDIO clock rate in Hz. No change if 0.
* On return, this is set the value that was actually programmed into the
* SDHC block.
*/
UInt32 clockRateHz;
/** @brief New SDIO bus width (1 or 4). No change if 0. */
UInt8 busWidth;
/** @brief 1 if the SDIO clock should be on, -1 if off, 0 to leave unchanged */
int clockMode;
/** @brief 2 for high speed mode, 1 for normal speed, 0 to leave unchanged. */
int busSpeedMode;
};
// SDIO COMMAND
/** @brief Send an SDIO Command using the command line.
* Note that the status of the command will be reflected by the iopsdio.status field.
*/
struct IOPSDIOCommandCmd
{
/** @brief The SDIO Command. */
struct SDIOCommand command;
/** @brief The command response. */
struct SDIOCommandResponse response;
};
// SDIO DATA COMMAND
/** @brief Send an SDIO Command with data (including the command line)
* Note that the status of the command will be reflected by the iopsdio.status field.
*/
struct IOPSDIOTransferCmd
{
/** @brief The SDIO Command. */
struct SDIOCommand command;
/** @brief The command response. */
struct SDIOCommandResponse response;
/** @brief The SDIO transfer parameters. */
struct SDIOTransfer transfer;
/** @brief Information about the memory segments involved in the transfer. */
struct SDIOMemorySegments memory;
/** @brief Physical segments for DMA engine. Variable Size. */
struct IOPSDIO_dma_segment segment[];
};
// IOP MESSAGES
/** @brief IOP SDIO Message. */
union IOPSDIOMessage
{
struct {
/** @brief IOP Header. */
struct IOPSDIOHeader header;
/** @brief Target SDIO block. */
struct IOPSDIOTargetSDHC targetSDHC;
/** @brief Command Data. */
union {
struct IOPSDIOInitCmd initCmd;
struct IOPSDIOFreeCmd freeCmd;
struct IOPSDIOResetCmd resetCmd;
struct IOPSDIOSetBusParamCmd setBusParamCmd;
struct IOPSDIOCommandCmd commandCmd;
struct IOPSDIOTransferCmd transferCmd;
};
};
UInt8 _pad[kIOPSDIO_MESSAGE_SIZE] SDIO_RESERVED;
};
union _IOPSDIO_sgl_sizing_tool
{
struct {
/** @brief IOP Header. */
struct IOPSDIOHeader header;
/** @brief Target SDIO block. */
struct IOPSDIOTargetSDHC targetSDHC;
/** @brief Command Data. */
union {
struct IOPSDIOTransferCmd transferCmd;
/* XXX add other sgl-using commands */
};
};
};
#define kIOPSDIO_MAX_SEGMENTS ((kIOPSDIO_MESSAGE_SIZE - sizeof(union _IOPSDIO_sgl_sizing_tool)) / sizeof(IOPSDIO_dma_segment))
#endif // _IOP_SDIO_PROTOCOL_H_