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
5c8ad2d7a296c851c2a91519f80dab479df0fdf46lgaoCopyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>
6e5eed7d3641d71d7ea539e5379ea9c6a5cd97004hhtianThis 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>
17c8ad2d7a296c851c2a91519f80dab479df0fdf46lgao#include <Guid/HiiResourceSampleHii.h>
186446c98725949dbc5bbf51a2ce1ae004c74a511clgao#include <Protocol/HiiPackageList.h>
196446c98725949dbc5bbf51a2ce1ae004c74a511clgao#include <Library/DevicePathLib.h>
206446c98725949dbc5bbf51a2ce1ae004c74a511clgao#include <Library/UefiDriverEntryPoint.h>
216446c98725949dbc5bbf51a2ce1ae004c74a511clgao#include <Library/UefiBootServicesTableLib.h>
226446c98725949dbc5bbf51a2ce1ae004c74a511clgao#include <Library/UefiHiiServicesLib.h>
236446c98725949dbc5bbf51a2ce1ae004c74a511clgao#include <Library/HiiLib.h>
246446c98725949dbc5bbf51a2ce1ae004c74a511clgao
256446c98725949dbc5bbf51a2ce1ae004c74a511clgao#pragma pack(1)
266446c98725949dbc5bbf51a2ce1ae004c74a511clgao///
276446c98725949dbc5bbf51a2ce1ae004c74a511clgao/// HII specific Vendor Device Path definition.
286446c98725949dbc5bbf51a2ce1ae004c74a511clgao///
296446c98725949dbc5bbf51a2ce1ae004c74a511clgaotypedef struct {
306446c98725949dbc5bbf51a2ce1ae004c74a511clgao  VENDOR_DEVICE_PATH             VendorDevicePath;
316446c98725949dbc5bbf51a2ce1ae004c74a511clgao  EFI_DEVICE_PATH_PROTOCOL       End;
326446c98725949dbc5bbf51a2ce1ae004c74a511clgao} HII_VENDOR_DEVICE_PATH;
336446c98725949dbc5bbf51a2ce1ae004c74a511clgao#pragma pack()
346446c98725949dbc5bbf51a2ce1ae004c74a511clgao
356446c98725949dbc5bbf51a2ce1ae004c74a511clgao
366446c98725949dbc5bbf51a2ce1ae004c74a511clgaoEFI_HII_HANDLE  mHiiHandle = NULL;
376446c98725949dbc5bbf51a2ce1ae004c74a511clgaoEFI_HANDLE      mDriverHandle = NULL;
386446c98725949dbc5bbf51a2ce1ae004c74a511clgao
396446c98725949dbc5bbf51a2ce1ae004c74a511clgaoHII_VENDOR_DEVICE_PATH  mHiiVendorDevicePath = {
406446c98725949dbc5bbf51a2ce1ae004c74a511clgao  {
416446c98725949dbc5bbf51a2ce1ae004c74a511clgao    {
426446c98725949dbc5bbf51a2ce1ae004c74a511clgao      HARDWARE_DEVICE_PATH,
436446c98725949dbc5bbf51a2ce1ae004c74a511clgao      HW_VENDOR_DP,
446446c98725949dbc5bbf51a2ce1ae004c74a511clgao      {
456446c98725949dbc5bbf51a2ce1ae004c74a511clgao        (UINT8) (sizeof (VENDOR_DEVICE_PATH)),
466446c98725949dbc5bbf51a2ce1ae004c74a511clgao        (UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
476446c98725949dbc5bbf51a2ce1ae004c74a511clgao      }
486446c98725949dbc5bbf51a2ce1ae004c74a511clgao    },
49c8ad2d7a296c851c2a91519f80dab479df0fdf46lgao    HII_RESOURCE_SAMPLE_FORM_SET_GUID
506446c98725949dbc5bbf51a2ce1ae004c74a511clgao  },
516446c98725949dbc5bbf51a2ce1ae004c74a511clgao  {
526446c98725949dbc5bbf51a2ce1ae004c74a511clgao    END_DEVICE_PATH_TYPE,
536446c98725949dbc5bbf51a2ce1ae004c74a511clgao    END_ENTIRE_DEVICE_PATH_SUBTYPE,
546446c98725949dbc5bbf51a2ce1ae004c74a511clgao    {
556446c98725949dbc5bbf51a2ce1ae004c74a511clgao      (UINT8) (END_DEVICE_PATH_LENGTH),
566446c98725949dbc5bbf51a2ce1ae004c74a511clgao      (UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)
576446c98725949dbc5bbf51a2ce1ae004c74a511clgao    }
586446c98725949dbc5bbf51a2ce1ae004c74a511clgao  }
596446c98725949dbc5bbf51a2ce1ae004c74a511clgao};
606446c98725949dbc5bbf51a2ce1ae004c74a511clgao
616446c98725949dbc5bbf51a2ce1ae004c74a511clgao/**
626446c98725949dbc5bbf51a2ce1ae004c74a511clgao  Main entry for this driver.
636446c98725949dbc5bbf51a2ce1ae004c74a511clgao
646446c98725949dbc5bbf51a2ce1ae004c74a511clgao  @param[in] ImageHandle     Image handle this driver.
656446c98725949dbc5bbf51a2ce1ae004c74a511clgao  @param[in] SystemTable     Pointer to SystemTable.
666446c98725949dbc5bbf51a2ce1ae004c74a511clgao
676446c98725949dbc5bbf51a2ce1ae004c74a511clgao  @retval EFI_SUCESS     This function always complete successfully.
686446c98725949dbc5bbf51a2ce1ae004c74a511clgao
696446c98725949dbc5bbf51a2ce1ae004c74a511clgao**/
706446c98725949dbc5bbf51a2ce1ae004c74a511clgaoEFI_STATUS
716446c98725949dbc5bbf51a2ce1ae004c74a511clgaoEFIAPI
726446c98725949dbc5bbf51a2ce1ae004c74a511clgaoHiiResourcesSampleInit (
736446c98725949dbc5bbf51a2ce1ae004c74a511clgao  IN EFI_HANDLE                   ImageHandle,
746446c98725949dbc5bbf51a2ce1ae004c74a511clgao  IN EFI_SYSTEM_TABLE             *SystemTable
756446c98725949dbc5bbf51a2ce1ae004c74a511clgao  )
766446c98725949dbc5bbf51a2ce1ae004c74a511clgao{
776446c98725949dbc5bbf51a2ce1ae004c74a511clgao  EFI_STATUS                      Status;
786446c98725949dbc5bbf51a2ce1ae004c74a511clgao  EFI_HII_PACKAGE_LIST_HEADER     *PackageList;
796446c98725949dbc5bbf51a2ce1ae004c74a511clgao
806446c98725949dbc5bbf51a2ce1ae004c74a511clgao  //
816446c98725949dbc5bbf51a2ce1ae004c74a511clgao  // Retrieve HII package list from ImageHandle
826446c98725949dbc5bbf51a2ce1ae004c74a511clgao  //
836446c98725949dbc5bbf51a2ce1ae004c74a511clgao  Status = gBS->OpenProtocol (
846446c98725949dbc5bbf51a2ce1ae004c74a511clgao                  ImageHandle,
856446c98725949dbc5bbf51a2ce1ae004c74a511clgao                  &gEfiHiiPackageListProtocolGuid,
866446c98725949dbc5bbf51a2ce1ae004c74a511clgao                  (VOID **) &PackageList,
876446c98725949dbc5bbf51a2ce1ae004c74a511clgao                  ImageHandle,
886446c98725949dbc5bbf51a2ce1ae004c74a511clgao                  NULL,
896446c98725949dbc5bbf51a2ce1ae004c74a511clgao                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
906446c98725949dbc5bbf51a2ce1ae004c74a511clgao                  );
916446c98725949dbc5bbf51a2ce1ae004c74a511clgao  if (EFI_ERROR (Status)) {
926446c98725949dbc5bbf51a2ce1ae004c74a511clgao    return Status;
936446c98725949dbc5bbf51a2ce1ae004c74a511clgao  }
946446c98725949dbc5bbf51a2ce1ae004c74a511clgao
956446c98725949dbc5bbf51a2ce1ae004c74a511clgao  //
966446c98725949dbc5bbf51a2ce1ae004c74a511clgao  // Publish sample Fromset
976446c98725949dbc5bbf51a2ce1ae004c74a511clgao  //
986446c98725949dbc5bbf51a2ce1ae004c74a511clgao  Status = gBS->InstallProtocolInterface (
996446c98725949dbc5bbf51a2ce1ae004c74a511clgao                  &mDriverHandle,
1006446c98725949dbc5bbf51a2ce1ae004c74a511clgao                  &gEfiDevicePathProtocolGuid,
1016446c98725949dbc5bbf51a2ce1ae004c74a511clgao                  EFI_NATIVE_INTERFACE,
1026446c98725949dbc5bbf51a2ce1ae004c74a511clgao                  &mHiiVendorDevicePath
1036446c98725949dbc5bbf51a2ce1ae004c74a511clgao                  );
1046446c98725949dbc5bbf51a2ce1ae004c74a511clgao  if (EFI_ERROR (Status)) {
1056446c98725949dbc5bbf51a2ce1ae004c74a511clgao    return Status;
1066446c98725949dbc5bbf51a2ce1ae004c74a511clgao  }
1076446c98725949dbc5bbf51a2ce1ae004c74a511clgao
1086446c98725949dbc5bbf51a2ce1ae004c74a511clgao  //
109d90434ccb53d7ca320c84624bca8cf4ba8542196xdu  // Publish HII package list to HII Database.
1106446c98725949dbc5bbf51a2ce1ae004c74a511clgao  //
1116446c98725949dbc5bbf51a2ce1ae004c74a511clgao  Status = gHiiDatabase->NewPackageList (
1126446c98725949dbc5bbf51a2ce1ae004c74a511clgao                          gHiiDatabase,
1136446c98725949dbc5bbf51a2ce1ae004c74a511clgao                          PackageList,
1146446c98725949dbc5bbf51a2ce1ae004c74a511clgao                          mDriverHandle,
1156446c98725949dbc5bbf51a2ce1ae004c74a511clgao                          &mHiiHandle
1166446c98725949dbc5bbf51a2ce1ae004c74a511clgao                          );
1176446c98725949dbc5bbf51a2ce1ae004c74a511clgao  if (EFI_ERROR (Status)) {
1186446c98725949dbc5bbf51a2ce1ae004c74a511clgao    return Status;
1196446c98725949dbc5bbf51a2ce1ae004c74a511clgao  }
1206446c98725949dbc5bbf51a2ce1ae004c74a511clgao
1216446c98725949dbc5bbf51a2ce1ae004c74a511clgao  return EFI_SUCCESS;
1226446c98725949dbc5bbf51a2ce1ae004c74a511clgao}
1236446c98725949dbc5bbf51a2ce1ae004c74a511clgao
1246446c98725949dbc5bbf51a2ce1ae004c74a511clgao/**
1256446c98725949dbc5bbf51a2ce1ae004c74a511clgao  Unloads the application and its installed protocol.
1266446c98725949dbc5bbf51a2ce1ae004c74a511clgao
1276446c98725949dbc5bbf51a2ce1ae004c74a511clgao  @param[in]  ImageHandle       Handle that identifies the image to be unloaded.
1286446c98725949dbc5bbf51a2ce1ae004c74a511clgao
1296446c98725949dbc5bbf51a2ce1ae004c74a511clgao  @retval EFI_SUCCESS           The image has been unloaded.
1306446c98725949dbc5bbf51a2ce1ae004c74a511clgao**/
1316446c98725949dbc5bbf51a2ce1ae004c74a511clgaoEFI_STATUS
1326446c98725949dbc5bbf51a2ce1ae004c74a511clgaoEFIAPI
1336446c98725949dbc5bbf51a2ce1ae004c74a511clgaoHiiResourcesSampleUnload (
1346446c98725949dbc5bbf51a2ce1ae004c74a511clgao  IN EFI_HANDLE  ImageHandle
1356446c98725949dbc5bbf51a2ce1ae004c74a511clgao  )
1366446c98725949dbc5bbf51a2ce1ae004c74a511clgao{
1376446c98725949dbc5bbf51a2ce1ae004c74a511clgao  if (mDriverHandle != NULL) {
1386446c98725949dbc5bbf51a2ce1ae004c74a511clgao    gBS->UninstallProtocolInterface (
1396446c98725949dbc5bbf51a2ce1ae004c74a511clgao            mDriverHandle,
1406446c98725949dbc5bbf51a2ce1ae004c74a511clgao            &gEfiDevicePathProtocolGuid,
1416446c98725949dbc5bbf51a2ce1ae004c74a511clgao            &mHiiVendorDevicePath
1426446c98725949dbc5bbf51a2ce1ae004c74a511clgao           );
1436446c98725949dbc5bbf51a2ce1ae004c74a511clgao    mDriverHandle = NULL;
1446446c98725949dbc5bbf51a2ce1ae004c74a511clgao  }
1456446c98725949dbc5bbf51a2ce1ae004c74a511clgao
1466446c98725949dbc5bbf51a2ce1ae004c74a511clgao  if (mHiiHandle != NULL) {
1476446c98725949dbc5bbf51a2ce1ae004c74a511clgao    HiiRemovePackages (mHiiHandle);
1486446c98725949dbc5bbf51a2ce1ae004c74a511clgao    mHiiHandle = NULL;
1496446c98725949dbc5bbf51a2ce1ae004c74a511clgao  }
1506446c98725949dbc5bbf51a2ce1ae004c74a511clgao
1516446c98725949dbc5bbf51a2ce1ae004c74a511clgao  return EFI_SUCCESS;
1526446c98725949dbc5bbf51a2ce1ae004c74a511clgao}
153