summaryrefslogtreecommitdiff
path: root/include/fs_loader.h
blob: 1cf6d6dd05faf8a38050a7a68fd2ab86ade72518 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
/*
 * Copyright (C) 2018 Intel Corporation <www.intel.com>
 *
 * SPDX-License-Identifier:    GPL-2.0
 */
#ifndef _FS_LOADER_H_
#define _FS_LOADER_H_

struct udevice;

/**
 * struct phandle_part - A place for storing phandle of node and its partition
 *
 * This holds information about a phandle of the block device, and its
 * partition where the firmware would be loaded from.
 *
 * @phandle: Phandle of storage device node
 * @partition: Partition of block device
 */
struct phandle_part {
	u32 phandle;
	u32 partition;
};

/**
 * struct phandle_part - A place for storing all supported storage devices
 *
 * This holds information about all supported storage devices for driver use.
 *
 * @phandlepart: Attribute data for block device.
 * @mtdpart: MTD partition for ubi partition.
 * @ubivol: UBI volume-name for ubifsmount.
 */
struct device_plat {
	struct phandle_part phandlepart;
	char *mtdpart;
	char *ubivol;
};

/**
 * request_firmware_into_buf - Load firmware into a previously allocated buffer.
 * @dev: An instance of a driver.
 * @name: Name of firmware file.
 * @buf: Address of buffer to load firmware into.
 * @size: Size of buffer.
 * @offset: Offset of a file for start reading into buffer.
 *
 * The firmware is loaded directly into the buffer pointed to by @buf.
 *
 * Return: Size of total read, negative value when error.
 */
int request_firmware_into_buf(struct udevice *dev,
			      const char *name,
			      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);

/**
 * request_firmware_into_buf_via_script() -
 * Load firmware using a U-Boot script and copy to buffer
 * @buf: Pointer to a pointer where the firmware buffer will be stored.
 * @max_size: Maximum allowed size for the firmware to be loaded.
 * @script_name: Name of the U-Boot script to execute for firmware loading.
 * @retsize: Return the actual firmware data size (optional).
 *
 * Executes a U-Boot script (@script_name) that loads firmware into
 * memory and sets the environment variables 'fw_addr' (address) and
 * 'fw_size' (size in bytes). On success, copies the firmware
 * from the given address to user buffer @buf.
 *
 * The script must set these environment variables:
 *   fw_addr - Address where firmware is loaded in memory
 *   fw_size - Size of the firmware in bytes
 *
 * The script should be defined in the U-Boot environment, for example:
 *   env set script_name 'load mmc 0:1 ${loadaddr} firmware.bin &&
 *   env set fw_addr ${loadaddr} && env set fw_size ${filesize}
 * Return: 0 on success, negative value on error.
 */
int request_firmware_into_buf_via_script(void **buf, size_t max_size,
					 const char *script_name,
					 size_t *retsize);
#endif