HiiResourcesSample.c revision d90434ccb53d7ca320c84624bca8cf4ba8542196
16446c98725949dbc5bbf51a2ce1ae004c74a511clgao/** @file
26446c98725949dbc5bbf51a2ce1ae004c74a511clgaoThis is an example of how a driver retrieve HII data using HII Package List
36446c98725949dbc5bbf51a2ce1ae004c74a511clgaoProtocol, and how to publish the HII data.
46446c98725949dbc5bbf51a2ce1ae004c74a511clgao
56446c98725949dbc5bbf51a2ce1ae004c74a511clgaoCopyright (c) 2009, Intel Corporation
66446c98725949dbc5bbf51a2ce1ae004c74a511clgaoAll rights reserved. This program and the accompanying materials
76446c98725949dbc5bbf51a2ce1ae004c74a511clgaoare licensed and made available under the terms and conditions of the BSD License
86446c98725949dbc5bbf51a2ce1ae004c74a511clgaowhich accompanies this distribution.  The full text of the license may be found at
96446c98725949dbc5bbf51a2ce1ae004c74a511clgaohttp://opensource.org/licenses/bsd-license.php
106446c98725949dbc5bbf51a2ce1ae004c74a511clgao
116446c98725949dbc5bbf51a2ce1ae004c74a511clgaoTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
126446c98725949dbc5bbf51a2ce1ae004c74a511clgaoWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
136446c98725949dbc5bbf51a2ce1ae004c74a511clgao
146446c98725949dbc5bbf51a2ce1ae004c74a511clgao**/
156446c98725949dbc5bbf51a2ce1ae004c74a511clgao
166446c98725949dbc5bbf51a2ce1ae004c74a511clgao#include <Uefi.h>
176446c98725949dbc5bbf51a2ce1ae004c74a511clgao#include <Protocol/HiiPackageList.h>
186446c98725949dbc5bbf51a2ce1ae004c74a511clgao#include <Library/DevicePathLib.h>
196446c98725949dbc5bbf51a2ce1ae004c74a511clgao#include <Library/UefiDriverEntryPoint.h>
206446c98725949dbc5bbf51a2ce1ae004c74a511clgao#include <Library/UefiBootServicesTableLib.h>
216446c98725949dbc5bbf51a2ce1ae004c74a511clgao#include <Library/UefiHiiServicesLib.h>
226446c98725949dbc5bbf51a2ce1ae004c74a511clgao#include <Library/HiiLib.h>
236446c98725949dbc5bbf51a2ce1ae004c74a511clgao
246446c98725949dbc5bbf51a2ce1ae004c74a511clgao#pragma pack(1)
256446c98725949dbc5bbf51a2ce1ae004c74a511clgao///
266446c98725949dbc5bbf51a2ce1ae004c74a511clgao/// HII specific Vendor Device Path definition.
276446c98725949dbc5bbf51a2ce1ae004c74a511clgao///
286446c98725949dbc5bbf51a2ce1ae004c74a511clgaotypedef struct {
296446c98725949dbc5bbf51a2ce1ae004c74a511clgao  VENDOR_DEVICE_PATH             VendorDevicePath;
306446c98725949dbc5bbf51a2ce1ae004c74a511clgao  EFI_DEVICE_PATH_PROTOCOL       End;
316446c98725949dbc5bbf51a2ce1ae004c74a511clgao} HII_VENDOR_DEVICE_PATH;
326446c98725949dbc5bbf51a2ce1ae004c74a511clgao#pragma pack()
336446c98725949dbc5bbf51a2ce1ae004c74a511clgao
346446c98725949dbc5bbf51a2ce1ae004c74a511clgao
356446c98725949dbc5bbf51a2ce1ae004c74a511clgaoEFI_HII_HANDLE  mHiiHandle = NULL;
366446c98725949dbc5bbf51a2ce1ae004c74a511clgaoEFI_HANDLE      mDriverHandle = NULL;
376446c98725949dbc5bbf51a2ce1ae004c74a511clgao
386446c98725949dbc5bbf51a2ce1ae004c74a511clgaoHII_VENDOR_DEVICE_PATH  mHiiVendorDevicePath = {
396446c98725949dbc5bbf51a2ce1ae004c74a511clgao  {
406446c98725949dbc5bbf51a2ce1ae004c74a511clgao    {
416446c98725949dbc5bbf51a2ce1ae004c74a511clgao      HARDWARE_DEVICE_PATH,
426446c98725949dbc5bbf51a2ce1ae004c74a511clgao      HW_VENDOR_DP,
436446c98725949dbc5bbf51a2ce1ae004c74a511clgao      {
446446c98725949dbc5bbf51a2ce1ae004c74a511clgao        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),
456446c98725949dbc5bbf51a2ce1ae004c74a511clgao        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
466446c98725949dbc5bbf51a2ce1ae004c74a511clgao      }
476446c98725949dbc5bbf51a2ce1ae004c74a511clgao    },
486446c98725949dbc5bbf51a2ce1ae004c74a511clgao    //
496446c98725949dbc5bbf51a2ce1ae004c74a511clgao    // {D49D2EB0-44D5-4621-9FD6-1A92C9109B99}
506446c98725949dbc5bbf51a2ce1ae004c74a511clgao    //
516446c98725949dbc5bbf51a2ce1ae004c74a511clgao    { 0xD49D2EB0, 0x44D5, 0x4621, { 0x9F, 0xD6, 0x1A, 0x92, 0xC9, 0x10, 0x9B, 0x99 } }
526446c98725949dbc5bbf51a2ce1ae004c74a511clgao  },
536446c98725949dbc5bbf51a2ce1ae004c74a511clgao  {
546446c98725949dbc5bbf51a2ce1ae004c74a511clgao    END_DEVICE_PATH_TYPE,
556446c98725949dbc5bbf51a2ce1ae004c74a511clgao    END_ENTIRE_DEVICE_PATH_SUBTYPE,
566446c98725949dbc5bbf51a2ce1ae004c74a511clgao    {
576446c98725949dbc5bbf51a2ce1ae004c74a511clgao      (UINT8) (END_DEVICE_PATH_LENGTH),
586446c98725949dbc5bbf51a2ce1ae004c74a511clgao      (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)
596446c98725949dbc5bbf51a2ce1ae004c74a511clgao    }
606446c98725949dbc5bbf51a2ce1ae004c74a511clgao  }
616446c98725949dbc5bbf51a2ce1ae004c74a511clgao};
626446c98725949dbc5bbf51a2ce1ae004c74a511clgao
636446c98725949dbc5bbf51a2ce1ae004c74a511clgao/**
646446c98725949dbc5bbf51a2ce1ae004c74a511clgao  Main entry for this driver.
656446c98725949dbc5bbf51a2ce1ae004c74a511clgao
666446c98725949dbc5bbf51a2ce1ae004c74a511clgao  @param[in] ImageHandle     Image handle this driver.
676446c98725949dbc5bbf51a2ce1ae004c74a511clgao  @param[in] SystemTable     Pointer to SystemTable.
686446c98725949dbc5bbf51a2ce1ae004c74a511clgao
696446c98725949dbc5bbf51a2ce1ae004c74a511clgao  @retval EFI_SUCESS     This function always complete successfully.
706446c98725949dbc5bbf51a2ce1ae004c74a511clgao
716446c98725949dbc5bbf51a2ce1ae004c74a511clgao**/
726446c98725949dbc5bbf51a2ce1ae004c74a511clgaoEFI_STATUS
736446c98725949dbc5bbf51a2ce1ae004c74a511clgaoEFIAPI
746446c98725949dbc5bbf51a2ce1ae004c74a511clgaoHiiResourcesSampleInit (
756446c98725949dbc5bbf51a2ce1ae004c74a511clgao  IN EFI_HANDLE                   ImageHandle,
766446c98725949dbc5bbf51a2ce1ae004c74a511clgao  IN EFI_SYSTEM_TABLE             *SystemTable
776446c98725949dbc5bbf51a2ce1ae004c74a511clgao  )
786446c98725949dbc5bbf51a2ce1ae004c74a511clgao{
796446c98725949dbc5bbf51a2ce1ae004c74a511clgao  EFI_STATUS                      Status;
806446c98725949dbc5bbf51a2ce1ae004c74a511clgao  EFI_HII_PACKAGE_LIST_HEADER     *PackageList;
816446c98725949dbc5bbf51a2ce1ae004c74a511clgao
826446c98725949dbc5bbf51a2ce1ae004c74a511clgao  //
836446c98725949dbc5bbf51a2ce1ae004c74a511clgao  // Retrieve HII package list from ImageHandle
846446c98725949dbc5bbf51a2ce1ae004c74a511clgao  //
856446c98725949dbc5bbf51a2ce1ae004c74a511clgao  Status = gBS->OpenProtocol (
866446c98725949dbc5bbf51a2ce1ae004c74a511clgao                  ImageHandle,
876446c98725949dbc5bbf51a2ce1ae004c74a511clgao                  &gEfiHiiPackageListProtocolGuid,
886446c98725949dbc5bbf51a2ce1ae004c74a511clgao                  (VOID **) &PackageList,
896446c98725949dbc5bbf51a2ce1ae004c74a511clgao                  ImageHandle,
906446c98725949dbc5bbf51a2ce1ae004c74a511clgao                  NULL,
916446c98725949dbc5bbf51a2ce1ae004c74a511clgao                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
926446c98725949dbc5bbf51a2ce1ae004c74a511clgao                  );
936446c98725949dbc5bbf51a2ce1ae004c74a511clgao  if (EFI_ERROR (Status)) {
946446c98725949dbc5bbf51a2ce1ae004c74a511clgao    return Status;
956446c98725949dbc5bbf51a2ce1ae004c74a511clgao  }
966446c98725949dbc5bbf51a2ce1ae004c74a511clgao
976446c98725949dbc5bbf51a2ce1ae004c74a511clgao  //
986446c98725949dbc5bbf51a2ce1ae004c74a511clgao  // Publish sample Fromset
996446c98725949dbc5bbf51a2ce1ae004c74a511clgao  //
1006446c98725949dbc5bbf51a2ce1ae004c74a511clgao  Status = gBS->InstallProtocolInterface (
1016446c98725949dbc5bbf51a2ce1ae004c74a511clgao                  &mDriverHandle,
1026446c98725949dbc5bbf51a2ce1ae004c74a511clgao                  &gEfiDevicePathProtocolGuid,
1036446c98725949dbc5bbf51a2ce1ae004c74a511clgao                  EFI_NATIVE_INTERFACE,
1046446c98725949dbc5bbf51a2ce1ae004c74a511clgao                  &mHiiVendorDevicePath
1056446c98725949dbc5bbf51a2ce1ae004c74a511clgao                  );
1066446c98725949dbc5bbf51a2ce1ae004c74a511clgao  if (EFI_ERROR (Status)) {
1076446c98725949dbc5bbf51a2ce1ae004c74a511clgao    return Status;
1086446c98725949dbc5bbf51a2ce1ae004c74a511clgao  }
1096446c98725949dbc5bbf51a2ce1ae004c74a511clgao
1106446c98725949dbc5bbf51a2ce1ae004c74a511clgao  //
111d90434ccb53d7ca320c84624bca8cf4ba8542196xdu  // Publish HII package list to HII Database.
1126446c98725949dbc5bbf51a2ce1ae004c74a511clgao  //
1136446c98725949dbc5bbf51a2ce1ae004c74a511clgao  Status = gHiiDatabase->NewPackageList (
1146446c98725949dbc5bbf51a2ce1ae004c74a511clgao                          gHiiDatabase,
1156446c98725949dbc5bbf51a2ce1ae004c74a511clgao                          PackageList,
1166446c98725949dbc5bbf51a2ce1ae004c74a511clgao                          mDriverHandle,
1176446c98725949dbc5bbf51a2ce1ae004c74a511clgao                          &mHiiHandle
1186446c98725949dbc5bbf51a2ce1ae004c74a511clgao                          );
1196446c98725949dbc5bbf51a2ce1ae004c74a511clgao  if (EFI_ERROR (Status)) {
1206446c98725949dbc5bbf51a2ce1ae004c74a511clgao    return Status;
1216446c98725949dbc5bbf51a2ce1ae004c74a511clgao  }
1226446c98725949dbc5bbf51a2ce1ae004c74a511clgao
1236446c98725949dbc5bbf51a2ce1ae004c74a511clgao  return EFI_SUCCESS;
1246446c98725949dbc5bbf51a2ce1ae004c74a511clgao}
1256446c98725949dbc5bbf51a2ce1ae004c74a511clgao
1266446c98725949dbc5bbf51a2ce1ae004c74a511clgao/**
1276446c98725949dbc5bbf51a2ce1ae004c74a511clgao  Unloads the application and its installed protocol.
1286446c98725949dbc5bbf51a2ce1ae004c74a511clgao
1296446c98725949dbc5bbf51a2ce1ae004c74a511clgao  @param[in]  ImageHandle       Handle that identifies the image to be unloaded.
1306446c98725949dbc5bbf51a2ce1ae004c74a511clgao
1316446c98725949dbc5bbf51a2ce1ae004c74a511clgao  @retval EFI_SUCCESS           The image has been unloaded.
1326446c98725949dbc5bbf51a2ce1ae004c74a511clgao**/
1336446c98725949dbc5bbf51a2ce1ae004c74a511clgaoEFI_STATUS
1346446c98725949dbc5bbf51a2ce1ae004c74a511clgaoEFIAPI
1356446c98725949dbc5bbf51a2ce1ae004c74a511clgaoHiiResourcesSampleUnload (
1366446c98725949dbc5bbf51a2ce1ae004c74a511clgao  IN EFI_HANDLE  ImageHandle
1376446c98725949dbc5bbf51a2ce1ae004c74a511clgao  )
1386446c98725949dbc5bbf51a2ce1ae004c74a511clgao{
1396446c98725949dbc5bbf51a2ce1ae004c74a511clgao  if (mDriverHandle != NULL) {
1406446c98725949dbc5bbf51a2ce1ae004c74a511clgao    gBS->UninstallProtocolInterface (
1416446c98725949dbc5bbf51a2ce1ae004c74a511clgao            mDriverHandle,
1426446c98725949dbc5bbf51a2ce1ae004c74a511clgao            &gEfiDevicePathProtocolGuid,
1436446c98725949dbc5bbf51a2ce1ae004c74a511clgao            &mHiiVendorDevicePath
1446446c98725949dbc5bbf51a2ce1ae004c74a511clgao           );
1456446c98725949dbc5bbf51a2ce1ae004c74a511clgao    mDriverHandle = NULL;
1466446c98725949dbc5bbf51a2ce1ae004c74a511clgao  }
1476446c98725949dbc5bbf51a2ce1ae004c74a511clgao
1486446c98725949dbc5bbf51a2ce1ae004c74a511clgao  if (mHiiHandle != NULL) {
1496446c98725949dbc5bbf51a2ce1ae004c74a511clgao    HiiRemovePackages (mHiiHandle);
1506446c98725949dbc5bbf51a2ce1ae004c74a511clgao    mHiiHandle = NULL;
1516446c98725949dbc5bbf51a2ce1ae004c74a511clgao  }
1526446c98725949dbc5bbf51a2ce1ae004c74a511clgao
1536446c98725949dbc5bbf51a2ce1ae004c74a511clgao  return EFI_SUCCESS;
1546446c98725949dbc5bbf51a2ce1ae004c74a511clgao}
155