Home | History | Annotate | Download | only in CdExpressPei
      1 /** @file
      2   Header file for CD recovery PEIM
      3 
      4 Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>
      5 
      6 This program and the accompanying materials
      7 are licensed and made available under the terms and conditions
      8 of the BSD License which accompanies this distribution.  The
      9 full text of the license may be found at
     10 http://opensource.org/licenses/bsd-license.php
     11 
     12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     14 
     15 **/
     16 
     17 #ifndef _PEI_CD_EXPRESS_H_
     18 #define _PEI_CD_EXPRESS_H_
     19 
     20 
     21 #include <PiPei.h>
     22 
     23 #include <Ppi/BlockIo.h>
     24 #include <Ppi/BlockIo2.h>
     25 #include <Guid/RecoveryDevice.h>
     26 #include <Ppi/DeviceRecoveryModule.h>
     27 
     28 #include <Library/DebugLib.h>
     29 #include <Library/PcdLib.h>
     30 #include <Library/PeimEntryPoint.h>
     31 #include <Library/BaseMemoryLib.h>
     32 #include <Library/PeiServicesTablePointerLib.h>
     33 #include <Library/PeiServicesLib.h>
     34 #include <Library/MemoryAllocationLib.h>
     35 
     36 
     37 #pragma pack(1)
     38 
     39 #define PEI_CD_EXPRESS_MAX_BLOCK_IO_PPI   8
     40 #define PEI_CD_EXPRESS_MAX_CAPSULE_NUMBER 16
     41 
     42 #define PEI_CD_BLOCK_SIZE                 0x800
     43 #define PEI_MEMMORY_PAGE_SIZE             0x1000
     44 
     45 //
     46 // Recovery file name (in root directory)
     47 //
     48 #define PEI_RECOVERY_FILE_NAME  "FVMAIN.FV"
     49 
     50 //
     51 // Following are defined according to ISO-9660 specification
     52 //
     53 #define PEI_CD_STANDARD_ID                      "CD001"
     54 #define PEI_CD_EXPRESS_STANDARD_ID_SIZE         5
     55 
     56 #define PEI_CD_EXPRESS_VOLUME_TYPE_OFFSET       0
     57 #define PEI_CD_EXPRESS_STANDARD_ID_OFFSET       1
     58 #define PEI_CD_EXPRESS_VOLUME_SPACE_OFFSET      80
     59 #define PEI_CD_EXPRESS_ROOT_DIR_RECORD_OFFSET   156
     60 
     61 #define PEI_CD_EXPRESS_VOLUME_TYPE_PRIMARY      1
     62 #define PEI_CD_EXPRESS_VOLUME_TYPE_TERMINATOR   255
     63 
     64 #define PEI_CD_EXPRESS_DIR_FILE_REC_FLAG_ISDIR  0x02
     65 
     66 typedef struct {
     67   UINTN                           CapsuleStartLBA;
     68   UINTN                           CapsuleSize;
     69   UINTN                           IndexBlock;
     70   EFI_PEI_RECOVERY_BLOCK_IO_PPI   *BlockIo;
     71   EFI_PEI_RECOVERY_BLOCK_IO2_PPI  *BlockIo2;
     72 } PEI_CD_EXPRESS_CAPSULE_DATA;
     73 
     74 #define PEI_CD_EXPRESS_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('p', 'c', 'd', 'e')
     75 
     76 typedef struct {
     77 
     78   UINTN                                 Signature;
     79   EFI_PEI_DEVICE_RECOVERY_MODULE_PPI    DeviceRecoveryPpi;
     80   EFI_PEI_PPI_DESCRIPTOR                PpiDescriptor;
     81   EFI_PEI_NOTIFY_DESCRIPTOR             NotifyDescriptor;
     82   EFI_PEI_NOTIFY_DESCRIPTOR             NotifyDescriptor2;
     83 
     84   UINT8                                 *BlockBuffer;
     85   UINTN                                 CapsuleCount;
     86   PEI_CD_EXPRESS_CAPSULE_DATA           CapsuleData[PEI_CD_EXPRESS_MAX_CAPSULE_NUMBER];
     87 
     88 } PEI_CD_EXPRESS_PRIVATE_DATA;
     89 
     90 #define PEI_CD_EXPRESS_PRIVATE_DATA_FROM_THIS(a) \
     91   CR (a, \
     92           PEI_CD_EXPRESS_PRIVATE_DATA, \
     93           DeviceRecoveryPpi, \
     94           PEI_CD_EXPRESS_PRIVATE_DATA_SIGNATURE \
     95       )
     96 
     97 typedef struct {
     98   UINT8   Length;
     99   UINT8   ExtendedAttributeRecordLength;
    100   UINT32  LocationOfExtent[2];
    101   UINT32  DataLength[2];
    102   UINT8   DateTime[7];
    103   UINT8   Flag;
    104   UINT8   FileUnitSize;
    105   UINT8   InterleaveGapSize;
    106   UINT32  VolumeSequenceNumber;
    107   UINT8   FileIDLength;
    108   UINT8   FileID[1];
    109 } PEI_CD_EXPRESS_DIR_FILE_RECORD;
    110 
    111 /**
    112   BlockIo installation notification function.
    113 
    114   This function finds out all the current Block IO PPIs in the system and add them
    115   into private data.
    116 
    117   @param  PeiServices            Indirect reference to the PEI Services Table.
    118   @param  NotifyDescriptor       Address of the notification descriptor data structure.
    119   @param  Ppi                    Address of the PPI that was installed.
    120 
    121   @retval EFI_SUCCESS            The function completes successfully.
    122 
    123 **/
    124 EFI_STATUS
    125 EFIAPI
    126 BlockIoNotifyEntry (
    127   IN EFI_PEI_SERVICES           **PeiServices,
    128   IN EFI_PEI_NOTIFY_DESCRIPTOR  *NotifyDescriptor,
    129   IN VOID                       *Ppi
    130   );
    131 
    132 /**
    133   Finds out all the current Block IO PPIs in the system and add them into private data.
    134 
    135   @param PrivateData                    The private data structure that contains recovery module information.
    136   @param BlockIo2                       Boolean to show whether using BlockIo2 or BlockIo.
    137 
    138   @retval EFI_SUCCESS                   The blocks and volumes are updated successfully.
    139 
    140 **/
    141 EFI_STATUS
    142 UpdateBlocksAndVolumes (
    143   IN OUT PEI_CD_EXPRESS_PRIVATE_DATA     *PrivateData,
    144   IN     BOOLEAN                         BlockIo2
    145   );
    146 
    147 /**
    148   Returns the number of DXE capsules residing on the device.
    149 
    150   This function searches for DXE capsules from the associated device and returns
    151   the number and maximum size in bytes of the capsules discovered. Entry 1 is
    152   assumed to be the highest load priority and entry N is assumed to be the lowest
    153   priority.
    154 
    155   @param[in]  PeiServices              General-purpose services that are available
    156                                        to every PEIM
    157   @param[in]  This                     Indicates the EFI_PEI_DEVICE_RECOVERY_MODULE_PPI
    158                                        instance.
    159   @param[out] NumberRecoveryCapsules   Pointer to a caller-allocated UINTN. On
    160                                        output, *NumberRecoveryCapsules contains
    161                                        the number of recovery capsule images
    162                                        available for retrieval from this PEIM
    163                                        instance.
    164 
    165   @retval EFI_SUCCESS        One or more capsules were discovered.
    166   @retval EFI_DEVICE_ERROR   A device error occurred.
    167   @retval EFI_NOT_FOUND      A recovery DXE capsule cannot be found.
    168 
    169 **/
    170 EFI_STATUS
    171 EFIAPI
    172 GetNumberRecoveryCapsules (
    173   IN EFI_PEI_SERVICES                               **PeiServices,
    174   IN EFI_PEI_DEVICE_RECOVERY_MODULE_PPI             *This,
    175   OUT UINTN                                         *NumberRecoveryCapsules
    176   );
    177 
    178 /**
    179   Returns the size and type of the requested recovery capsule.
    180 
    181   This function gets the size and type of the capsule specified by CapsuleInstance.
    182 
    183   @param[in]  PeiServices       General-purpose services that are available to every PEIM
    184   @param[in]  This              Indicates the EFI_PEI_DEVICE_RECOVERY_MODULE_PPI
    185                                 instance.
    186   @param[in]  CapsuleInstance   Specifies for which capsule instance to retrieve
    187                                 the information.  This parameter must be between
    188                                 one and the value returned by GetNumberRecoveryCapsules()
    189                                 in NumberRecoveryCapsules.
    190   @param[out] Size              A pointer to a caller-allocated UINTN in which
    191                                 the size of the requested recovery module is
    192                                 returned.
    193   @param[out] CapsuleType       A pointer to a caller-allocated EFI_GUID in which
    194                                 the type of the requested recovery capsule is
    195                                 returned.  The semantic meaning of the value
    196                                 returned is defined by the implementation.
    197 
    198   @retval EFI_SUCCESS        One or more capsules were discovered.
    199   @retval EFI_DEVICE_ERROR   A device error occurred.
    200   @retval EFI_NOT_FOUND      A recovery DXE capsule cannot be found.
    201 
    202 **/
    203 EFI_STATUS
    204 EFIAPI
    205 GetRecoveryCapsuleInfo (
    206   IN  EFI_PEI_SERVICES                              **PeiServices,
    207   IN  EFI_PEI_DEVICE_RECOVERY_MODULE_PPI            *This,
    208   IN  UINTN                                         CapsuleInstance,
    209   OUT UINTN                                         *Size,
    210   OUT EFI_GUID                                      *CapsuleType
    211   );
    212 
    213 /**
    214   Loads a DXE capsule from some media into memory.
    215 
    216   This function, by whatever mechanism, retrieves a DXE capsule from some device
    217   and loads it into memory. Note that the published interface is device neutral.
    218 
    219   @param[in]     PeiServices       General-purpose services that are available
    220                                    to every PEIM
    221   @param[in]     This              Indicates the EFI_PEI_DEVICE_RECOVERY_MODULE_PPI
    222                                    instance.
    223   @param[in]     CapsuleInstance   Specifies which capsule instance to retrieve.
    224   @param[out]    Buffer            Specifies a caller-allocated buffer in which
    225                                    the requested recovery capsule will be returned.
    226 
    227   @retval EFI_SUCCESS        The capsule was loaded correctly.
    228   @retval EFI_DEVICE_ERROR   A device error occurred.
    229   @retval EFI_NOT_FOUND      A requested recovery DXE capsule cannot be found.
    230 
    231 **/
    232 EFI_STATUS
    233 EFIAPI
    234 LoadRecoveryCapsule (
    235   IN EFI_PEI_SERVICES                             **PeiServices,
    236   IN EFI_PEI_DEVICE_RECOVERY_MODULE_PPI           *This,
    237   IN UINTN                                        CapsuleInstance,
    238   OUT VOID                                        *Buffer
    239   );
    240 
    241 /**
    242   Finds out the recovery capsule in the current volume.
    243 
    244   @param PrivateData                    The private data structure that contains recovery module information.
    245 
    246   @retval EFI_SUCCESS                   The recovery capsule is successfully found in the volume.
    247   @retval EFI_NOT_FOUND                 The recovery capsule is not found in the volume.
    248 
    249 **/
    250 EFI_STATUS
    251 EFIAPI
    252 FindRecoveryCapsules (
    253   IN OUT PEI_CD_EXPRESS_PRIVATE_DATA            *PrivateData
    254   );
    255 
    256 /**
    257   Retrieves the recovery capsule in root directory of the current volume.
    258 
    259   @param PrivateData                    The private data structure that contains recovery module information.
    260   @param BlockIoPpi                     The Block IO PPI used to access the volume.
    261   @param BlockIo2Ppi                    The Block IO 2 PPI used to access the volume.
    262   @param IndexBlockDevice               The index of current block device.
    263   @param Lba                            The starting logic block address to retrieve capsule.
    264 
    265   @retval EFI_SUCCESS                   The recovery capsule is successfully found in the volume.
    266   @retval EFI_NOT_FOUND                 The recovery capsule is not found in the volume.
    267   @retval Others
    268 
    269 **/
    270 EFI_STATUS
    271 EFIAPI
    272 RetrieveCapsuleFileFromRoot (
    273   IN OUT PEI_CD_EXPRESS_PRIVATE_DATA        *PrivateData,
    274   IN EFI_PEI_RECOVERY_BLOCK_IO_PPI          *BlockIoPpi,
    275   IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI         *BlockIo2Ppi,
    276   IN UINTN                                  IndexBlockDevice,
    277   IN UINT32                                 Lba
    278   );
    279 
    280 
    281 /**
    282   This function compares two ASCII strings in case sensitive/insensitive way.
    283 
    284   @param  Source1           The first string.
    285   @param  Source2           The second string.
    286   @param  Size              The maximum comparison length.
    287   @param  CaseSensitive     Flag to indicate whether the comparison is case sensitive.
    288 
    289   @retval TRUE              The two strings are the same.
    290   @retval FALSE             The two string are not the same.
    291 
    292 **/
    293 BOOLEAN
    294 StringCmp (
    295   IN UINT8      *Source1,
    296   IN UINT8      *Source2,
    297   IN UINTN      Size,
    298   IN BOOLEAN    CaseSensitive
    299   );
    300 
    301 #pragma pack()
    302 
    303 #endif
    304