misc: fs_loader: Add function to get the chosen loader
The fs_loader device is used to pull in settings via the chosen node. However, there was no library function for this, so arria10 was doing it explicitly. This function subsumes that, and uses ofnode_get_chosen_node instead of navigating the device tree directly. Because fs_loader pulls its config from the environment by default, it's fine to create a device with nothing backing it at all. Doing this allows enabling CONFIG_FS_LOADER without needing to modify the device tree. Signed-off-by: Sean Anderson <sean.anderson@seco.com> Reviewed-by: Simon Glass <sjg@chromium.org> Reviewed-by: Ramon Fried <rfried.dev@gmail.com>
This commit is contained in:
parent
7fb4aa14d4
commit
0998a20cfc
@ -181,7 +181,7 @@ int load_firmware(char *name_fw, char *name_loadaddr, u32 *loadaddr)
|
|||||||
if (!*loadaddr)
|
if (!*loadaddr)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!uclass_get_device(UCLASS_FS_FIRMWARE_LOADER, 0, &fsdev)) {
|
if (!get_fs_loader(&fsdev)) {
|
||||||
size = request_firmware_into_buf(fsdev, name, (void *)*loadaddr,
|
size = request_firmware_into_buf(fsdev, name, (void *)*loadaddr,
|
||||||
0, 0);
|
0, 0);
|
||||||
}
|
}
|
||||||
|
@ -214,7 +214,7 @@ int load_firmware(char *name_fw, u32 *loadaddr)
|
|||||||
if (!*loadaddr)
|
if (!*loadaddr)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (!uclass_get_device(UCLASS_FS_FIRMWARE_LOADER, 0, &fsdev)) {
|
if (!get_fs_loader(&fsdev)) {
|
||||||
size = request_firmware_into_buf(fsdev, name_fw,
|
size = request_firmware_into_buf(fsdev, name_fw,
|
||||||
(void *)*loadaddr, 0, 0);
|
(void *)*loadaddr, 0, 0);
|
||||||
}
|
}
|
||||||
|
@ -777,42 +777,20 @@ int socfpga_loadfs(fpga_fs_info *fpga_fsinfo, const void *buf, size_t bsize,
|
|||||||
{
|
{
|
||||||
struct fpga_loadfs_info fpga_loadfs;
|
struct fpga_loadfs_info fpga_loadfs;
|
||||||
struct udevice *dev;
|
struct udevice *dev;
|
||||||
int status, ret, size;
|
int status, ret;
|
||||||
u32 buffer = (uintptr_t)buf;
|
u32 buffer = (uintptr_t)buf;
|
||||||
size_t buffer_sizebytes = bsize;
|
size_t buffer_sizebytes = bsize;
|
||||||
size_t buffer_sizebytes_ori = bsize;
|
size_t buffer_sizebytes_ori = bsize;
|
||||||
size_t total_sizeof_image = 0;
|
size_t total_sizeof_image = 0;
|
||||||
ofnode node;
|
ofnode node;
|
||||||
const fdt32_t *phandle_p;
|
|
||||||
u32 phandle;
|
|
||||||
|
|
||||||
node = get_fpga_mgr_ofnode(ofnode_null());
|
node = get_fpga_mgr_ofnode(ofnode_null());
|
||||||
|
if (!ofnode_valid(node)) {
|
||||||
if (ofnode_valid(node)) {
|
|
||||||
phandle_p = ofnode_get_property(node, "firmware-loader", &size);
|
|
||||||
if (!phandle_p) {
|
|
||||||
node = ofnode_path("/chosen");
|
|
||||||
if (!ofnode_valid(node)) {
|
|
||||||
debug("FPGA: /chosen node was not found.\n");
|
|
||||||
return -ENOENT;
|
|
||||||
}
|
|
||||||
|
|
||||||
phandle_p = ofnode_get_property(node, "firmware-loader",
|
|
||||||
&size);
|
|
||||||
if (!phandle_p) {
|
|
||||||
debug("FPGA: firmware-loader property was not");
|
|
||||||
debug(" found.\n");
|
|
||||||
return -ENOENT;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
debug("FPGA: FPGA manager node was not found.\n");
|
debug("FPGA: FPGA manager node was not found.\n");
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
phandle = fdt32_to_cpu(*phandle_p);
|
ret = get_fs_loader(&dev);
|
||||||
ret = uclass_get_device_by_phandle_id(UCLASS_FS_FIRMWARE_LOADER,
|
|
||||||
phandle, &dev);
|
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
@ -15,6 +15,8 @@
|
|||||||
#include <fs_loader.h>
|
#include <fs_loader.h>
|
||||||
#include <log.h>
|
#include <log.h>
|
||||||
#include <asm/global_data.h>
|
#include <asm/global_data.h>
|
||||||
|
#include <dm/device-internal.h>
|
||||||
|
#include <dm/root.h>
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
#include <mapmem.h>
|
#include <mapmem.h>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
@ -297,6 +299,31 @@ U_BOOT_DRIVER(fs_loader) = {
|
|||||||
.priv_auto = sizeof(struct firmware),
|
.priv_auto = sizeof(struct firmware),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct device_plat default_plat = { 0 };
|
||||||
|
|
||||||
|
int get_fs_loader(struct udevice **dev)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
ofnode node = ofnode_get_chosen_node("firmware-loader");
|
||||||
|
|
||||||
|
if (ofnode_valid(node))
|
||||||
|
return uclass_get_device_by_ofnode(UCLASS_FS_FIRMWARE_LOADER,
|
||||||
|
node, dev);
|
||||||
|
|
||||||
|
/* Try the first device if none was chosen */
|
||||||
|
ret = uclass_first_device_err(UCLASS_FS_FIRMWARE_LOADER, dev);
|
||||||
|
if (ret != -ENODEV)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
/* Just create a new device */
|
||||||
|
ret = device_bind(dm_root(), DM_DRIVER_GET(fs_loader), "default-loader",
|
||||||
|
&default_plat, ofnode_null(), dev);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
return device_probe(*dev);
|
||||||
|
}
|
||||||
|
|
||||||
UCLASS_DRIVER(fs_loader) = {
|
UCLASS_DRIVER(fs_loader) = {
|
||||||
.id = UCLASS_FS_FIRMWARE_LOADER,
|
.id = UCLASS_FS_FIRMWARE_LOADER,
|
||||||
.name = "fs-loader",
|
.name = "fs-loader",
|
||||||
|
@ -52,4 +52,16 @@ struct device_plat {
|
|||||||
int request_firmware_into_buf(struct udevice *dev,
|
int request_firmware_into_buf(struct udevice *dev,
|
||||||
const char *name,
|
const char *name,
|
||||||
void *buf, size_t size, u32 offset);
|
void *buf, size_t size, u32 offset);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* get_fs_loader() - Get the chosen filesystem loader
|
||||||
|
* @dev: Where to store the device
|
||||||
|
*
|
||||||
|
* This gets a filesystem loader device based on the value of
|
||||||
|
* /chosen/firmware-loader. If no such property exists, it returns a
|
||||||
|
* firmware loader which is configured by environmental variables.
|
||||||
|
*
|
||||||
|
* Return: 0 on success, negative value on error
|
||||||
|
*/
|
||||||
|
int get_fs_loader(struct udevice **dev);
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user