+ Mike On Tue, Mar 30, 2021 at 1:56 AM EDK wrote: > Hi , > > For our products, we have UEFI Driver and HII Driver as two separate > images (this is a requirement for our product because we want to keep UEFI > Driver as thin as possible). > > - Main role of UEFI Driver is providing boot services, > reporting/solving health issues, posting messages in message list, EXT SPT > etc. > > FYI: UEFI Driver will install HII Config access protocol (*CAP*) and > driver health formset on the controller handle if the controller has health > issue; at this time, HII image won't be in picture (HII image come into > play ONLY when controller is healthy); if UEFI Driver detects controller is > healthy then it will not install HII Config access protocol (if it had > installed, it would uninstall before loading HII image from controller > flash to host) > > Note: We have our own API to load the HII Image from controller flash to > host > > - Role of HII is, installing HII config access protocol and Management > formset on the controller handle and allowing the user to view > controller/PD/VD/other hardware properties, perform various > controller/PD/VD level operations etc. > > > > Requirement (need to see whether this is feasible or not): There are cases > where our controller is healthy but we would like to post certain > informational messages in messageList. > > How do I achieve this? That is I want UEFI Driver to have the capability > to post the message in messageList and our HII Image also to be > loaded/present. > > > > Can UEFI Driver and HII driver install HII Config access protocol on the > same handle? AFAIK, the answer is “no”. > > I experimented just adding the driver health formset to the package via > the HiiAddPackages() on the controller handle (that is from UEFI Driver I > was not installing HII CAP but just installed the formset on controller > handle) and it is not working. In this case HII image is also loaded (this > means HII image would have installed HII CAP and its own formset on the > same controller handle). > > > > Appreciate your input. > > > > Thanks, > > Daniel > > Backup: > > *Excerpt from UEFI Spec: * > > *MessageList *A pointer to an array of warning or error messages asso > ciated with > > the controller specified by *ControllerHandle *and *ChildHandle*. > > This is an optional parameter that may be *NULL*. *M**essageList *is > > allocated by this function with the EFI Boot Service > > *AllocatePool()*, and it is the caller’s responsibility to free > > *MessageList *with the EFI Boot Service *F**reePool()*. Each > > message is specified by tuple of an *EFI_HII_HANDLE *and an > > *EFI_STRING_ID*. The array of messages is terminated by tuple > > containing a *EFI_HII_HANDLE *with a value of *NULL*. The > > *EFI_HII_STRING_PROTOCOL.GetString() *function can be used > > to retrieve the warning or error message as a Null-terminated string > > in a specific language. Messages may be returned for any of the > > *HealthStatus *values except > > *EfiDriverHealthStatusReconnectRequired *and > > *EfiDriverHealthStatusRebootRequired*. > > *FormHiiHandle *A pointer to the HII handle containing the HII form > used when configuration is required. The HII handle is associated with the > controller specified by *ControllerHandle *and > > *C**hildHandle*. If this is *N**ULL*, then no HII form is available. An > HII handle will only be returned with a *HealthStatus *value of > > *E**fiDriverHealthStatusConfigurationRequired*. > > > > … > > > > > > > > If *MessageList *is not *NULL*, and *HealthStatu**s *is *EfiDriverHealthStatusReconnectRequired > *or *EfiDriverHealthStatusRebootRequired *then no messages are returned > and **MessageList *must be set to *NULL*. > > If *MessageList *is not *NULL*, and there are no warning or error > messages associated with the controller specified by *ControllerHandle *and > *ChildHandle*, then **MessageList *must be set to *NULL*. > > If *MessageList *is not *NULL*, and there are one or more warning or > error messages associated with the controller specified by *ControllerHandle > *and *ChildHandle*, then **MessageList *must point to a buffer allocated > with the EFI Boot Service *AllocatePool()*. The number of *EFI_DRIVER_HEALTH_HII_MESSAGE > *structures allocated in the buffer must be one more than the total > number of warning or error messages, and the *HiiHandle *field of the > last *EFI_DRIVER_HEALTH_HII_MESSAGE *structure must be set to *NULL *to > terminate the list of messages. It is the caller’s responsibility to free > the buffer returned in **MessageList *using the EFI Boot Service > *FreePool()*. Each message is specified by an *EFI_HII_HANDLE *and an > *EFI_STRING_ID*. The caller may use the *EFI_HII_STRING_PROTOCOL.GetString() > *function to convert each message into a Null-terminated string that can > may be displayed on a console device. > > If *FormHiiHandle *is *NULL*, then no forms are returned from this > function. > > If *FormHiiHandle *is not *NULL*, and *HealthStatus *is not > *EfiDriverHealthStatusConfigurationRequired*, then no forms are returned > and **FormHiiHandle *must be set to *NULL*. > > If *FormHiiHandle *is not *NULL*, and *FormSetGuid *is not *NULL*, and *HealthStatus > *is *EfiDriverHealthStatusConfigurationRequired*, then *FormHiiHandle *is > assigned to the HII handle which contains the HII form required to perform > the configuration operation. > > > > … > > *//******************************************************** > > *// EFI_DRIVER_HEALTH_HII_MESSAGE* > > *//******************************************************** > > *typedef struct { EFI_HII_HANDLE **H**iiHandle**; **EF**I_STRING_ID **S* > *tringId**; **UI**NT64 **MessageCode;* > > *} EFI_DRIVER_HEALTH_HII_MESSAGE;* > > *HiiHandle *The *EFI_HII_HANDLE *that was returned by *EFI_HII_DATABASE_PROTOCOL.NewPackageList() > *when the string pack containing StringId was registered with the HII Data > base. > > *StringId *The identifier for a single string token in the string > pack associated with *HiiHandle.* > > *MessageCode *64-bit numeric value of the warning/error specified by > this message. > > A value of *0x0000000000000000 *is used to indicate that > > *MessageCode *is not specified. > > The values *0**x0000000000000001 *to *0x0fffffffffffffff *are reserved for > allocation by the UEFI Specification. > > The values *0**x1000000000000000 *to *0x1fffffffffffffff *are reserved for > IHV-developed drivers. > > The values *0**x8000000000000000 *to *0x8fffffffffffffff *is reserved for > platform/OEM drivers. > > All other values are reserved and should not be used. >