Merge tag 'u-boot-atmel-fixes-2021.01-b' of https://gitlab.denx.de/u-boot/custodians...
[platform/kernel/u-boot.git] / lib / efi_loader / efi_rng.c
index 432c986..8bdadad 100644 (file)
@@ -3,16 +3,30 @@
  * Copyright (c) 2019, Linaro Limited
  */
 
+#define LOG_CATEGORY LOGC_EFI
+
 #include <common.h>
 #include <dm.h>
 #include <efi_loader.h>
 #include <efi_rng.h>
+#include <log.h>
 #include <rng.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
 const efi_guid_t efi_guid_rng_protocol = EFI_RNG_PROTOCOL_GUID;
 
+/**
+ * platform_get_rng_device() - retrieve random number generator
+ *
+ * This function retrieves the udevice implementing a hardware random
+ * number generator.
+ *
+ * This function may be overridden if special initialization is needed.
+ *
+ * @dev:       udevice
+ * Return:     status code
+ */
 __weak efi_status_t platform_get_rng_device(struct udevice **dev)
 {
        int ret;
@@ -29,6 +43,18 @@ __weak efi_status_t platform_get_rng_device(struct udevice **dev)
        return EFI_SUCCESS;
 }
 
+/**
+ * rng_getinfo() - get information about random number generation
+ *
+ * This function implement the GetInfo() service of the EFI random number
+ * generator protocol. See the UEFI spec for details.
+ *
+ * @this:                      random number generator protocol instance
+ * @rng_algorithm_list_size:   number of random number generation algorithms
+ * @rng_algorithm_list:                descriptions of random number generation
+ *                             algorithms
+ * Return:                     status code
+ */
 static efi_status_t EFIAPI rng_getinfo(struct efi_rng_protocol *this,
                                       efi_uintn_t *rng_algorithm_list_size,
                                       efi_guid_t *rng_algorithm_list)
@@ -64,6 +90,18 @@ back:
        return EFI_EXIT(ret);
 }
 
+/**
+ * rng_getrng() - get random value
+ *
+ * This function implement the GetRng() service of the EFI random number
+ * generator protocol. See the UEFI spec for details.
+ *
+ * @this:              random number generator protocol instance
+ * @rng_algorithm:     random number generation algorithm
+ * @rng_value_length:  number of random bytes to generate, buffer length
+ * @rng_value:         buffer to receive random bytes
+ * Return:             status code
+ */
 static efi_status_t EFIAPI getrng(struct efi_rng_protocol *this,
                                  efi_guid_t *rng_algorithm,
                                  efi_uintn_t rng_value_length,
@@ -108,7 +146,33 @@ back:
        return EFI_EXIT(status);
 }
 
-const struct efi_rng_protocol efi_rng_protocol = {
+static const struct efi_rng_protocol efi_rng_protocol = {
        .get_info = rng_getinfo,
        .get_rng = getrng,
 };
+
+/**
+ * efi_rng_register() - register EFI_RNG_PROTOCOL
+ *
+ * If a RNG device is available, the Random Number Generator Protocol is
+ * registered.
+ *
+ * Return:     An error status is only returned if adding the protocol fails.
+ */
+efi_status_t efi_rng_register(void)
+{
+       efi_status_t ret;
+       struct udevice *dev;
+
+       ret = platform_get_rng_device(&dev);
+       if (ret != EFI_SUCCESS) {
+               log_warning("Missing RNG device for EFI_RNG_PROTOCOL\n");
+               return EFI_SUCCESS;
+       }
+       ret = efi_add_protocol(efi_root, &efi_guid_rng_protocol,
+                              (void *)&efi_rng_protocol);
+       if (ret != EFI_SUCCESS)
+               log_err("Cannot install EFI_RNG_PROTOCOL\n");
+
+       return ret;
+}