board: samsung: e850-96: Extract device info from fw loading code
authorSam Protsenko <semen.protsenko@linaro.org>
Wed, 6 Aug 2025 22:27:06 +0000 (17:27 -0500)
committerMinkyu Kang <mk7.kang@samsung.com>
Mon, 1 Sep 2025 07:37:13 +0000 (16:37 +0900)
Make it possible to provide the information about storage device where
LDFW firmware resides to the firmware loading routine. The firmware
loader code shouldn't have that data hard-coded anyway, and it also
allows for implementing more dynamic behavior later, like choosing the
storage device containing LDFW via some environment variables.

No functional change.

Signed-off-by: Sam Protsenko <semen.protsenko@linaro.org>
Signed-off-by: Minkyu Kang <mk7.kang@samsung.com>
board/samsung/e850-96/e850-96.c
board/samsung/e850-96/fw.c
board/samsung/e850-96/fw.h

index 2cf874f..b5f6ba2 100644 (file)
 #define EXYNOS850_APM_SHMEM_OFFSET     0x3200
 #define EXYNOS850_IPC_AP_I3C           10
 
+/* LDFW firmware definitions */
+#define LDFW_NWD_ADDR                  0x88000000
+#define EMMC_IFNAME                    "mmc"
+#define EMMC_DEV_NUM                   0
+#define EMMC_ESP_PART                  1
+
 struct efi_fw_image fw_images[] = {
        {
                .image_type_id = E850_96_FWBL1_IMAGE_GUID,
@@ -141,7 +147,8 @@ int board_late_init(void)
         * Do this in board_late_init() to make sure MMC is not probed before
         * efi_init_early().
         */
-       err = load_ldfw();
+       err = load_ldfw(EMMC_IFNAME, EMMC_DEV_NUM, EMMC_ESP_PART,
+                       LDFW_NWD_ADDR);
        if (err)
                printf("ERROR: LDFW loading failed (%d)\n", err);
 
index 8f64e75..64235c0 100644 (file)
 #include <linux/arm-smccc.h>
 #include "fw.h"
 
-#define EMMC_IFACE             "mmc"
-#define EMMC_DEV_NUM           0
 #define LDFW_RAW_PART          "ldfw"
-#define LDFW_FAT_PART          "esp"
 #define LDFW_FAT_PATH          "/EFI/firmware/ldfw.bin"
 
-#define LDFW_NWD_ADDR          0x88000000
 #define LDFW_MAGIC             0x10adab1e
 #define SMC_CMD_LOAD_LDFW      -0x500
 #define SDM_HW_RESET_STATUS    0x1230
@@ -39,19 +35,23 @@ struct ldfw_header {
 };
 
 /* Load LDFW binary as a file from FAT partition */
-static int read_fw_from_fat(const char *part_name, const char *path, void *buf)
+static int read_fw_from_fat(const char *ifname, int dev, int part,
+                           const char *path, void *buf)
 {
-       char dev_part_str[8];
+       struct blk_desc *blk_desc;
        loff_t len_read;
        int err;
 
-       snprintf(dev_part_str, sizeof(dev_part_str), "%d#%s", EMMC_DEV_NUM,
-                LDFW_FAT_PART);
+       blk_desc = blk_get_dev(ifname, dev);
+       if (!blk_desc) {
+               debug("%s: Can't get block device\n", __func__);
+               return -ENODEV;
+       }
 
-       err = fs_set_blk_dev(EMMC_IFACE, dev_part_str, FS_TYPE_FAT);
+       err = fs_set_blk_dev_with_part(blk_desc, part);
        if (err) {
-               debug("%s: Can't set block device\n", __func__);
-               return -ENODEV;
+               debug("%s: Can't set partition\n", __func__);
+               return -ENOENT;
        }
 
        err = fs_read(path, (ulong)buf, 0, 0, &len_read);
@@ -64,16 +64,17 @@ static int read_fw_from_fat(const char *part_name, const char *path, void *buf)
 }
 
 /* Load LDFW binary from raw partition on block device into RAM buffer */
-static int read_fw_from_raw(const char *part_name, void *buf)
+static int read_fw_from_raw(const char *ifname, int dev, const char *part_name,
+                           void *buf)
 {
        struct blk_desc *blk_desc;
        struct disk_partition part;
        unsigned long cnt;
        int part_num;
 
-       blk_desc = blk_get_dev(EMMC_IFACE, EMMC_DEV_NUM);
+       blk_desc = blk_get_dev(ifname, dev);
        if (!blk_desc) {
-               debug("%s: Can't get eMMC device\n", __func__);
+               debug("%s: Can't get block device\n", __func__);
                return -ENODEV;
        }
 
@@ -92,9 +93,17 @@ static int read_fw_from_raw(const char *part_name, void *buf)
        return 0;
 }
 
-int load_ldfw(void)
+/**
+ * load_ldfw - Load the loadable firmware (LDFW)
+ * @ifname: Interface name of the block device to load the firmware from
+ * @dev: Device number
+ * @part: Partition number
+ * @addr: Temporary memory (Normal World) to use for loading the firmware
+ *
+ * Return: 0 on success or a negative value on error.
+ */
+int load_ldfw(const char *ifname, int dev, int part, phys_addr_t addr)
 {
-       const phys_addr_t addr = (phys_addr_t)LDFW_NWD_ADDR;
        struct ldfw_header *hdr;
        struct arm_smccc_res res;
        void *buf = (void *)addr;
@@ -102,9 +111,9 @@ int load_ldfw(void)
        int err, i;
 
        /* First try to read LDFW from EFI partition, then from the raw one */
-       err = read_fw_from_fat(LDFW_FAT_PART, LDFW_FAT_PATH, buf);
+       err = read_fw_from_fat(ifname, dev, part, LDFW_FAT_PATH, buf);
        if (err) {
-               err = read_fw_from_raw(LDFW_RAW_PART, buf);
+               err = read_fw_from_raw(ifname, dev, LDFW_RAW_PART, buf);
                if (err)
                        return err;
        }
index 472664e..73d9615 100644 (file)
@@ -7,6 +7,8 @@
 #ifndef __E850_96_FW_H
 #define __E850_96_FW_H
 
-int load_ldfw(void);
+#include <asm/types.h>
+
+int load_ldfw(const char *ifname, int dev, int part, phys_addr_t addr);
 
 #endif /* __E850_96_FW_H */