Home | History | Annotate | Download | only in TcgConfigDxe
      1 /** @file
      2   The module entry point for Tcg configuration module.
      3 
      4 Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>
      5 This program and the accompanying materials
      6 are licensed and made available under the terms and conditions of the BSD License
      7 which accompanies this distribution.  The full text of the license may be found at
      8 http://opensource.org/licenses/bsd-license.php
      9 
     10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     12 
     13 **/
     14 
     15 #include "TcgConfigImpl.h"
     16 #include <Guid/TpmInstance.h>
     17 
     18 /**
     19   The entry point for Tcg configuration driver.
     20 
     21   @param[in]  ImageHandle        The image handle of the driver.
     22   @param[in]  SystemTable        The system table.
     23 
     24   @retval EFI_ALREADY_STARTED    The driver already exists in system.
     25   @retval EFI_OUT_OF_RESOURCES   Fail to execute entry point due to lack of resources.
     26   @retval EFI_SUCCES             All the related protocols are installed on the driver.
     27   @retval Others                 Fail to install protocols as indicated.
     28 
     29 **/
     30 EFI_STATUS
     31 EFIAPI
     32 TcgConfigDriverEntryPoint (
     33   IN EFI_HANDLE          ImageHandle,
     34   IN EFI_SYSTEM_TABLE    *SystemTable
     35   )
     36 {
     37   EFI_STATUS                Status;
     38   TCG_CONFIG_PRIVATE_DATA   *PrivateData;
     39   EFI_TCG_PROTOCOL          *TcgProtocol;
     40 
     41   if (!CompareGuid (PcdGetPtr(PcdTpmInstanceGuid), &gEfiTpmDeviceInstanceTpm12Guid)){
     42     DEBUG ((EFI_D_ERROR, "No TPM12 instance required!\n"));
     43     return EFI_UNSUPPORTED;
     44   }
     45 
     46   Status = TisPcRequestUseTpm ((TIS_TPM_HANDLE) (UINTN) TPM_BASE_ADDRESS);
     47   if (EFI_ERROR (Status)) {
     48     DEBUG ((EFI_D_ERROR, "TPM not detected!\n"));
     49     return Status;
     50   }
     51 
     52   Status = gBS->LocateProtocol (&gEfiTcgProtocolGuid, NULL, (VOID **) &TcgProtocol);
     53   if (EFI_ERROR (Status)) {
     54     TcgProtocol = NULL;
     55   }
     56 
     57   Status = gBS->OpenProtocol (
     58                   ImageHandle,
     59                   &gEfiCallerIdGuid,
     60                   NULL,
     61                   ImageHandle,
     62                   ImageHandle,
     63                   EFI_OPEN_PROTOCOL_TEST_PROTOCOL
     64                   );
     65   if (!EFI_ERROR (Status)) {
     66     return EFI_ALREADY_STARTED;
     67   }
     68 
     69   //
     70   // Create a private data structure.
     71   //
     72   PrivateData = AllocateCopyPool (sizeof (TCG_CONFIG_PRIVATE_DATA), &mTcgConfigPrivateDateTemplate);
     73   if (PrivateData == NULL) {
     74     return EFI_OUT_OF_RESOURCES;
     75   }
     76 
     77   PrivateData->TcgProtocol = TcgProtocol;
     78 
     79   //
     80   // Install TCG configuration form
     81   //
     82   Status = InstallTcgConfigForm (PrivateData);
     83   if (EFI_ERROR (Status)) {
     84     goto ErrorExit;
     85   }
     86 
     87   //
     88   // Install private GUID.
     89   //
     90   Status = gBS->InstallMultipleProtocolInterfaces (
     91                   &ImageHandle,
     92                   &gEfiCallerIdGuid,
     93                   PrivateData,
     94                   NULL
     95                   );
     96 
     97   if (EFI_ERROR (Status)) {
     98     goto ErrorExit;
     99   }
    100 
    101   return EFI_SUCCESS;
    102 
    103 ErrorExit:
    104   if (PrivateData != NULL) {
    105     UninstallTcgConfigForm (PrivateData);
    106   }
    107 
    108   return Status;
    109 }
    110 
    111 /**
    112   Unload the Tcg configuration form.
    113 
    114   @param[in]  ImageHandle         The driver's image handle.
    115 
    116   @retval     EFI_SUCCESS         The Tcg configuration form is unloaded.
    117   @retval     Others              Failed to unload the form.
    118 
    119 **/
    120 EFI_STATUS
    121 EFIAPI
    122 TcgConfigDriverUnload (
    123   IN EFI_HANDLE  ImageHandle
    124   )
    125 {
    126   EFI_STATUS                  Status;
    127   TCG_CONFIG_PRIVATE_DATA   *PrivateData;
    128 
    129   Status = gBS->HandleProtocol (
    130                   ImageHandle,
    131                   &gEfiCallerIdGuid,
    132                   (VOID **) &PrivateData
    133                   );
    134   if (EFI_ERROR (Status)) {
    135     return Status;
    136   }
    137 
    138   ASSERT (PrivateData->Signature == TCG_CONFIG_PRIVATE_DATA_SIGNATURE);
    139 
    140   gBS->UninstallMultipleProtocolInterfaces (
    141          &ImageHandle,
    142          &gEfiCallerIdGuid,
    143          PrivateData,
    144          NULL
    145          );
    146 
    147   UninstallTcgConfigForm (PrivateData);
    148 
    149   return EFI_SUCCESS;
    150 }
    151