summaryrefslogtreecommitdiff
path: root/ReferenceCode/RapidStart/Ppi/RapidStart/RapidStart.h
blob: 48d4bfc25e7d7bd81ef576bb9b8893d7b46c54fa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
/** @file
  Header file for RapidStart PPI

@copyright
  Copyright (c) 2011 - 2012 Intel Corporation. All rights reserved
  This software and associated documentation (if any) is furnished
  under a license and may only be used or copied in accordance
  with the terms of the license. Except as permitted by such
  license, no part of this software or documentation may be
  reproduced, stored in a retrieval system, or transmitted in any
  form or by any means without the express written consent of
  Intel Corporation.

  This file contains an 'Intel Peripheral Driver' and uniquely
  identified as "Intel Mobile Silicon Support Module" and is
  licensed for Intel Mobile CPUs and chipsets under the terms of your
  license agreement with Intel or your vendor.  This file may
  be modified by the user, subject to additional terms of the
  license agreement

**/
#ifndef PPI_RAPID_START_H_
#define PPI_RAPID_START_H_

#define RAPID_START_PPI_GUID \
  { \
    0x3d0e663a, 0xdc72, 0x4489, 0x87, 0xc5, 0xe4, 0x9e, 0xe7, 0x73, 0xa4, 0x52 \
  }

#define ATA_PASSWORD_LEN  32

extern EFI_GUID                 gRapidStartPpiGuid;

typedef struct _RAPID_START_PPI RAPID_START_PPI;

///
/// PPI revision number
/// Any backwards compatible changes to this PPI will result in an update in the revision number
/// Major changes will require publication of a new PPI
///
/// Revision 1:  Original version
///
#define RAPID_START_PPI_REVISION_1  1

typedef enum {
  RapidStartNone,
  RapidStartEntry,
  RapidStartExit,
  RapidStartTransitionMax
} RAPID_START_TRANSITION;

/**
  Detremines RapidStart transition.

  This PPI function will determine which Rapid Start transition state should be
  performed. It will check current Rapid Start enable/disable by calling
  RapidStartIsEnabled(), current boot mode, wakeup source and Rapid Start Entry
  Flag. If Rapid Start enabled, current boot mode is S3 Resume and wakeup source
  is one of the supported sources, the Rapid Start Entry will be performed. Once
  Rapid Start Entry completed successfully the Rapid Start Entry Flag will be set
  and next boot GetMode() will check this flag and perform Rapid Start Resume as
  requested.

  GetMode () function will do the following check:
    - Rapid Start function is enabled or not
    - Current boot mode is S3 resume or not
    - If it is S3 resume, check wakeup source is one of enabled Rapid Start Entry
      conditions to perform Rapid Start Entry.
    - If it is not S3 resume, the Rapid Start transition mode should already be
      determined in the RapidStartPeiEntryPoint ().

  After Rapid Start Transition state determined TransitionEntryPoint () PPI
  function will do the necessary Rapid Start transition.

  @param[in] This - A pointer to RAPID_START_PPI itself.

  @retval RAPID_START_TRANSITION - The RapidStart transition being performed
**/
typedef
RAPID_START_TRANSITION
(EFIAPI *RAPID_START_GET_MODE) (
  IN      RAPID_START_PPI      *This
  );

/**
  Executes or schedules RapidStart transition if appropriate.

  This PPI function will perform or schedule an Rapid Start transition (by
  registering either EFI_PEI_PERMANENT_MEMORY_INSTALLED_PPI_GUID or
  PEI_RAPID_START_TRANSITION_START_PPI_GUID callback function). It includes Rapid
  Start Entry or Rapid Start Exit transition basing on Transition mode. If
  Transition mode is RapidStartTransitionMax which means unknown transition mode,
  GetMode() will be called again to determine current Rapid Start transition mode.
  In Rapid Start Entry transition, the memory content will be saved in "Rapid
  Start Store" and Rapid Start Entry Flag will be set then system will be
  switched to Rapid Start state. If error occurred during Rapid Start Entry
  transition, it will switch system back to S3 state. In Rapid Start Exit
  transition, Rapid Start Entry Flag will be cleared and the memory content will
  be restored from "Rapid Start Store". If no error occurred, it will boot
  from S3 resume path back to OS, otherwise it will reset system.

  TransitionEntryPoint () function will do the following check:
    - Rapid Start function is enabled or not
    - If current Rapid Start transition mode is not determined yet, call
      GetMode () PPI function.
    - If current Transition state is "RapidStartNone", do nothing and
      return to caller.
    - If transition state is "Rapid Start Entry", save memory content to
      Rapid Start Store. If no error occurring, set Rapid Start Entry Flag and
      put system to Rapid Start state, otherwise it will re-enter S3 state as
      Rapid Start Entry failed.
    - If transition state is "RapidStartExit", restore memory content from
      Rapid Start Store and override boot mode to "S3 Resume" so that
      system will perform S3 resume back to OS. If error occurred during Rapid
      Start Exit transition it will reset system.
    - When "RapidStartDoTransition ()" is executed in
      EFI_PEI_PERMANENT_MEMORY_INSTALLED_PPI_GUID or
      PEI_RAPID_START_TRANSITION_START_PPI_GUID callback function, platform
      code should ensure the NEM mode has been disabled and cache
      configuration basing on memory map has been completed prior to execute
      RapidStartDoTransition ().
    - SMRAM hashing algorithm in reference code uses SHA256 algorithm in
      "Crypto library" from UDK2010 source code. Those SMRAM hashing
      relevant functions are not included in this document since they are no
      porting required. Refer to Crypto library and BaseCryptLib.h for detail
      information regarding those functions. See section Porting
      Recommendation" for more information.

  @param[in] This       - Pointer to RapidStart PPI
  @param[out] BootMode  - Boot mode that may be overridden

  @retval EFI_SUCCESS   - RapidStart transition performed/scheduled successfully
  @retval EFI_ABORTED   - RapidStart transition aborted
**/
typedef
EFI_STATUS
(EFIAPI *RAPID_START_TRANSITION_ENTRY_POINT) (
  IN      RAPID_START_PPI      * This,
  OUT     EFI_BOOT_MODE        * BootMode
  );

/**
  Check if RapidStart support is enabled.

  This PPI function will return current Rapid Start enable/disable state.

  IsEnabled () function will return current Rapid Start enable/disable state.

  @param[in] This - Pointer to RapidStart PPI

  @retval TRUE if RapidStart support is enabled FALSE otherwise
**/
typedef
BOOLEAN
(EFIAPI *RAPID_START_IS_ENABLED) (
  IN      RAPID_START_PPI      * This
  );

/**
  This PPI provides main functions required for Rapid Start Entry and Exit flow.

  This PPI provides major functions required for Rapid Start transition. Both
  GetMode() and TransitionEntryPoint() should be executed after memory is ready
  for accessing since they will save, restore or check memory content. Besides,
  SATA controller must be initialized to AHCI mode before executing
  TransitionEntryPoint() PPI so Rapid Start Store can be accessed.
**/
struct _RAPID_START_PPI {
  ///
  /// Indicate PPI structure revision.
  ///
  UINT8                               Revision;
  ///
  /// GetMode function will base on current Rapid Start configurations and boot mode
  /// to determine which Rapid Start transition flow should be performed.
  ///
  RAPID_START_GET_MODE                GetMode;
  ///
  /// This function will perform or schedule Rapid Start transition if appropriate.
  /// This includes Rapid Start Entry, Rapid Start Exit or does nothing basing on the
  /// Rapid Start transition mode.
  ///
  RAPID_START_TRANSITION_ENTRY_POINT  TransitionEntryPoint;
  ///
  /// This function returns Rapid Start feature current enable/disable state.
  ///
  RAPID_START_IS_ENABLED              IsEnabled;
};

#endif