CloverBootloader/Include/Protocol/AppleSMC.h
2019-09-03 12:58:42 +03:00

309 lines
9.5 KiB
C

//********************************************************************
// created: 29:9:2012 13:49
// filename: AppleSMC.h
// author: tiamo
// purpose: apple smc
//********************************************************************
#ifndef _APPLE_SMC_H_
#define _APPLE_SMC_H_
#define APPLE_SMC_PROTOCOL_GUID {0x17407e5a, 0xaf6c, 0x4ee8, {0x98, 0xa8, 0x00, 0x21, 0x04, 0x53, 0xcd, 0xd9}}
//EFI_FORWARD_DECLARATION(APPLE_SMC_PROTOCOL);
//typedef struct _##x x
typedef struct _APPLE_SMC_PROTOCOL APPLE_SMC_PROTOCOL;
typedef EFI_STATUS (EFIAPI* APPLE_SMC_READ_DATA)(IN APPLE_SMC_PROTOCOL* This, IN UINT32 DataId, IN UINT32 DataLength, OUT VOID* DataBuffer);
typedef EFI_STATUS (EFIAPI* APPLE_SMC_WRITE_DATA)(IN APPLE_SMC_PROTOCOL* This, IN UINT32 DataId, IN UINT32 DataLength, IN VOID* DataBuffer);
typedef EFI_STATUS (EFIAPI* APPLE_SMC_DUMP_DATA)(IN APPLE_SMC_PROTOCOL* This);
struct _APPLE_SMC_PROTOCOL
{
UINT64 Signature;
APPLE_SMC_READ_DATA ReadData;
APPLE_SMC_WRITE_DATA WriteData;
APPLE_SMC_DUMP_DATA DumpData;
};
#define SMC_PORT_BASE 0x0300
#define SMC_PORT_LENGTH 0x0020
#define APPLE_SMC_IO_PROTOCOL_REVISION 0x33
#define SMC_MAKE_IDENTIFIER(A, B, C, D) \
(((A) << 24) | ((B) << 16) | ((C) << 8) | (D))
#define SMC_MAKE_KEY(A, B, C, D) SMC_MAKE_IDENTIFIER ((A), (B), (C), (D))
#define SMC_MAKE_KEY_TYPE(A, B, C, D) SMC_MAKE_IDENTIFIER ((A), (B), (C), (D))
#define SMC_KEY_NUM SMC_MAKE_KEY ('$', 'N', 'u', 'm')
#define SMC_KEY_ADR SMC_MAKE_KEY ('$', 'A', 'd', 'r')
#define SMC_KEY_NO_KEYS SMC_MAKE_KEY ('#', 'K', 'e', 'y')
#define SMC_KEY_LDKN SMC_MAKE_KEY ('L', 'D', 'K', 'N')
// Modes
#define SMC_MODE_APPCODE 'A'
#define SMC_MODE_UPDATE 'U'
#define SMC_MODE_BASE 'B'
// SMC_MODE
typedef CHAR8 *SMC_MODE;
// SMC_KEY_TYPE
typedef UINT32 SMC_KEY_TYPE;
enum {
SmcKeyTypeCh8 = SMC_MAKE_KEY_TYPE ('c', 'h', '8', '*'),
SmcKeyTypeChar = SMC_MAKE_KEY_TYPE ('c', 'h', 'a', 'r'),
SmcKeyTypeFlag = SMC_MAKE_KEY_TYPE ('f', 'l', 'a', 'g'),
SmcKeyTypeFp1f = SMC_MAKE_KEY_TYPE ('f', 'p', '1', 'f'),
SmcKeyTypeFp4c = SMC_MAKE_KEY_TYPE ('f', 'p', '4', 'c'),
SmcKeyTypeFp5b = SMC_MAKE_KEY_TYPE ('f', 'p', '5', 'b'),
SmcKeyTypeFp6a5b = SMC_MAKE_KEY_TYPE ('f', 'p', '6', 'a'),
SmcKeyTypeFp79 = SMC_MAKE_KEY_TYPE ('f', 'p', '7', '9'),
SmcKeyTypeFpa6 = SMC_MAKE_KEY_TYPE ('f', 'p', 'a', '6'),
SmcKeyTypeFpc4 = SMC_MAKE_KEY_TYPE ('f', 'p', 'c', '4'),
SmcKeyTypeFpe2 = SMC_MAKE_KEY_TYPE ('f', 'p', 'e', '2'),
SmcKeyTypeSint8 = SMC_MAKE_KEY_TYPE ('s', 'i', '8', ' '),
SmcKeyTypeSint16 = SMC_MAKE_KEY_TYPE ('s', 'i', '1', '6'),
SmcKeyTypeSp1e = SMC_MAKE_KEY_TYPE ('s', 'p', '1', 'e'),
SmcKeyTypeSp3c = SMC_MAKE_KEY_TYPE ('s', 'p', '3', 'c'),
SmcKeyTypeSp4b = SMC_MAKE_KEY_TYPE ('s', 'p', '4', 'b'),
SmcKeyTypeSp5a = SMC_MAKE_KEY_TYPE ('s', 'p', '5', 'a'),
SmcKeyTypeSp69 = SMC_MAKE_KEY_TYPE ('s', 'p', '6', '9'),
SmcKeyTypeSp78 = SMC_MAKE_KEY_TYPE ('s', 'p', '7', '8'),
SmcKeyTypeSp87 = SMC_MAKE_KEY_TYPE ('s', 'p', '8', '7'),
SmcKeyTypeSp96 = SMC_MAKE_KEY_TYPE ('s', 'p', '9', '6'),
SmcKeyTypeSpb4 = SMC_MAKE_KEY_TYPE ('s', 'p', 'b', '4'),
SmcKeyTypeSpf0 = SMC_MAKE_KEY_TYPE ('s', 'p', 'f', '0'),
SmcKeyTypeUint8 = SMC_MAKE_KEY_TYPE ('u', 'i', '8', ' '),
SmcKeyTypeUint16 = SMC_MAKE_KEY_TYPE ('u', 'i', '1', '6'),
SmcKeyTypeUint32 = SMC_MAKE_KEY_TYPE ('u', 'i', '3', '2'),
SmcKeyTypeLim = SMC_MAKE_KEY_TYPE ('{', 'l', 'i', 'm'),
SmcKeyTypePwm = SMC_MAKE_KEY_TYPE ('{', 'p', 'w', 'm'),
SmcKeyTypeAla = SMC_MAKE_KEY_TYPE ('{', 'a', 'l', 'a'),
SmcKeyTypeAlc = SMC_MAKE_KEY_TYPE ('{', 'a', 'l', 'c'),
SmcKeyTypeAli = SMC_MAKE_KEY_TYPE ('{', 'a', 'l', 'i'),
SmcKeyTypeAlr = SMC_MAKE_KEY_TYPE ('{', 'a', 'l', 'r'),
SmcKeyTypeAlt = SMC_MAKE_KEY_TYPE ('{', 'a', 'l', 't')
};
typedef UINT32 SMC_KEY;
typedef UINT32 SMC_INDEX;
typedef UINT8 SMC_DATA;
typedef UINT8 SMC_DATA_SIZE;
typedef UINT8 SMC_RESULT;
typedef UINT32 SMC_ADDRESS;
typedef UINT8 SMC_KEY_ATTRIBUTES;
// Key Attributes
#define BIT(n) (1u << (n))
#define SMC_KEY_ATTRIBUTE_PRIVATE BIT (0)
#define SMC_KEY_ATTRIBUTE_UKN_0x02 BIT (1)
#define SMC_KEY_ATTRIBUTE_UKN_0x04 BIT (2)
#define SMC_KEY_ATTRIBUTE_CONST BIT (3)
#define SMC_KEY_ATTRIBUTE_FUNCTION BIT (4)
#define SMC_KEY_ATTRIBUTE_UKN_0x20 BIT (5)
#define SMC_KEY_ATTRIBUTE_WRITE BIT (6)
#define SMC_KEY_ATTRIBUTE_READ BIT (7)
typedef struct _APPLE_SMC_IO_PROTOCOL APPLE_SMC_IO_PROTOCOL;
typedef struct _APPLE_SMC_STATE_PROTOCOL APPLE_SMC_STATE_PROTOCOL;
// SMC_IO_SMC_READ_VALUE
typedef
EFI_STATUS
(EFIAPI *SMC_IO_SMC_READ_VALUE)(
IN APPLE_SMC_IO_PROTOCOL *This,
IN SMC_KEY Key,
IN SMC_DATA_SIZE Size,
OUT SMC_DATA *Value
);
// SMC_IO_SMC_WRITE_VALUE
typedef
EFI_STATUS
(EFIAPI *SMC_IO_SMC_WRITE_VALUE)(
IN APPLE_SMC_IO_PROTOCOL *This,
IN SMC_KEY Key,
IN SMC_DATA_SIZE Size,
OUT SMC_DATA *Value
);
// SMC_IO_SMC_GET_KEY_COUNT
typedef
EFI_STATUS
(EFIAPI *SMC_IO_SMC_GET_KEY_COUNT)(
IN APPLE_SMC_IO_PROTOCOL *This,
OUT SMC_DATA *Count
);
// SMC_IO_SMC_MAKE_KEY
typedef
EFI_STATUS
(EFIAPI *SMC_IO_SMC_MAKE_KEY)(
IN APPLE_SMC_IO_PROTOCOL *This,
IN CHAR8 *Name,
OUT SMC_KEY *Key
);
typedef
EFI_STATUS
(EFIAPI *SMC_IO_SMC_ADD_KEY)(
IN APPLE_SMC_IO_PROTOCOL *This,
IN SMC_KEY Key,
IN SMC_DATA_SIZE Size,
IN SMC_KEY_TYPE Type,
IN SMC_KEY_ATTRIBUTES Attributes
);
// SMC_IO_SMC_GET_KEY_FROM_INDEX
typedef
EFI_STATUS
(EFIAPI *SMC_IO_SMC_GET_KEY_FROM_INDEX)(
IN APPLE_SMC_IO_PROTOCOL *This,
IN SMC_INDEX Index,
OUT SMC_KEY *Key
);
// SMC_IO_SMC_GET_KEY_INFO
typedef
EFI_STATUS
(EFIAPI *SMC_IO_SMC_GET_KEY_INFO)(
IN APPLE_SMC_IO_PROTOCOL *This,
IN SMC_KEY Key,
OUT SMC_DATA_SIZE *Size,
OUT SMC_KEY_TYPE *Type,
OUT SMC_KEY_ATTRIBUTES *Attributes
);
// SMC_IO_SMC_RESET
typedef
EFI_STATUS
(EFIAPI *SMC_IO_SMC_RESET)(
IN APPLE_SMC_IO_PROTOCOL *This,
IN UINT32 Mode
);
// SMC_IO_SMC_FLASH_TYPE
typedef
EFI_STATUS
(EFIAPI *SMC_IO_SMC_FLASH_TYPE)(
IN APPLE_SMC_IO_PROTOCOL *This,
IN UINT32 Type
);
// SMC_IO_SMC_FLASH_WRITE
typedef
EFI_STATUS
(EFIAPI *SMC_IO_SMC_FLASH_WRITE)(
IN APPLE_SMC_IO_PROTOCOL *This,
IN UINT32 Unknown,
IN UINT32 Size,
IN SMC_DATA *Data
);
// SMC_IO_SMC_FLASH_AUTH
typedef
EFI_STATUS
(EFIAPI *SMC_IO_SMC_FLASH_AUTH)(
IN APPLE_SMC_IO_PROTOCOL *This,
IN UINT32 Size,
IN SMC_DATA *Data
);
// SMC_IO_SMC_UNSUPPORTED
typedef
EFI_STATUS
(EFIAPI *SMC_IO_SMC_UNSUPPORTED)(
IN APPLE_SMC_IO_PROTOCOL *This
);
// SMC_IO_SMC_UNKNOWN_1
typedef
EFI_STATUS
(EFIAPI *SMC_STATE_UNKNOWN_1)(
IN APPLE_SMC_STATE_PROTOCOL *This
);
// SMC_IO_SMC_UNKNOWN_2
typedef
EFI_STATUS
(EFIAPI *SMC_STATE_UNKNOWN_2)(
IN APPLE_SMC_STATE_PROTOCOL *This,
IN UINTN Ukn1,
IN UINTN Ukn2
);
// SMC_IO_SMC_UNKNOWN_3
typedef
EFI_STATUS
(EFIAPI *SMC_STATE_UNKNOWN_3)(
IN APPLE_SMC_STATE_PROTOCOL *This,
IN UINTN Ukn1,
IN UINTN Ukn2
);
// SMC_IO_SMC_UNKNOWN_4
typedef
EFI_STATUS
(EFIAPI *SMC_STATE_GET_STATE)(
IN APPLE_SMC_STATE_PROTOCOL *This,
OUT UINTN *Ukn1
);
// SMC_IO_SMC_UNKNOWN_5
typedef
EFI_STATUS
(EFIAPI *SMC_STATE_UNKNOWN_5)(
IN APPLE_SMC_STATE_PROTOCOL *This,
IN UINTN Ukn1
);
// APPLE_SMC_IO_PROTOCOL
struct _APPLE_SMC_IO_PROTOCOL {
UINT64 Signature; //Revision;
SMC_IO_SMC_READ_VALUE SmcReadValue; ///< 0x08
SMC_IO_SMC_WRITE_VALUE SmcWriteValue; ///< 0x10
SMC_IO_SMC_GET_KEY_COUNT SmcGetKeyCount; ///<
//SMC_IO_SMC_MAKE_KEY SmcMakeKey; ///<
SMC_IO_SMC_ADD_KEY SmcAddKey; ///<
SMC_IO_SMC_GET_KEY_FROM_INDEX SmcGetKeyFromIndex; ///<
SMC_IO_SMC_GET_KEY_INFO SmcGetKeyInfo; ///<
SMC_IO_SMC_RESET SmcReset; ///<
SMC_IO_SMC_FLASH_TYPE SmcFlashType; ///<
SMC_IO_SMC_UNSUPPORTED SmcUnsupported; ///<
SMC_IO_SMC_FLASH_WRITE SmcFlashWrite; ///<
SMC_IO_SMC_FLASH_AUTH SmcFlashAuth; ///<
SMC_INDEX Index; ///<
SMC_ADDRESS Address; ///<
BOOLEAN Mmio; ///<
/* SMC_IO_SMC_UNKNOWN_1 SmcUnknown1; ///<
SMC_IO_SMC_UNKNOWN_2 SmcUnknown2; ///<
SMC_IO_SMC_UNKNOWN_3 SmcUnknown3; ///<
SMC_IO_SMC_UNKNOWN_4 SmcUnknown4; ///<
SMC_IO_SMC_UNKNOWN_5 SmcUnknown5; ///< */
};
struct _APPLE_SMC_STATE_PROTOCOL {
UINT64 Revision; ///<
SMC_STATE_UNKNOWN_1 SmcUnknown1; ///< 0x08
SMC_STATE_UNKNOWN_2 SmcUnknown2; ///< 0x10
SMC_STATE_UNKNOWN_3 SmcUnknown3; ///< 0x18
SMC_STATE_GET_STATE SmcUnknown4; ///< 0x20 - really called
SMC_STATE_UNKNOWN_5 SmcUnknown5; ///<
};
extern EFI_GUID gAppleSMCProtocolGuid;
extern EFI_GUID gAppleSMCStateProtocolGuid;
#endif