efi_loader: efi_device_path: Pass net udevice as argument
In preparation to support multiple EFI net objects, support
constructing device paths using an ethernet device different
than the default. Add a udevice argument to the device path
generation, and keep the callsites with eth_get_dev() to
preserve existing functionality.
Signed-off-by: Adriano Cordova <adriano.cordova@canonical.com>
diff --git a/include/efi_loader.h b/include/efi_loader.h
index c2fb3e6..47c0434 100644
--- a/include/efi_loader.h
+++ b/include/efi_loader.h
@@ -925,8 +925,8 @@
struct efi_device_path *efi_dp_part_node(struct blk_desc *desc, int part);
struct efi_device_path *efi_dp_from_file(const struct efi_device_path *dp,
const char *path);
-struct efi_device_path *efi_dp_from_eth(void);
-struct efi_device_path *efi_dp_from_http(const char *server);
+struct efi_device_path *efi_dp_from_eth(struct udevice *dev);
+struct efi_device_path *efi_dp_from_http(const char *server, struct udevice *dev);
struct efi_device_path *efi_dp_from_mem(uint32_t mem_type,
uint64_t start_address,
size_t size);
diff --git a/lib/efi_loader/efi_device_path.c b/lib/efi_loader/efi_device_path.c
index c0633a7..64183d4 100644
--- a/lib/efi_loader/efi_device_path.c
+++ b/lib/efi_loader/efi_device_path.c
@@ -954,20 +954,20 @@
return buf;
}
-struct efi_device_path __maybe_unused *efi_dp_from_eth(void)
+struct efi_device_path __maybe_unused *efi_dp_from_eth(struct udevice *dev)
{
void *buf, *start;
unsigned dpsize = 0;
- assert(eth_get_dev());
+ assert(dev);
- dpsize += dp_size(eth_get_dev());
+ dpsize += dp_size(dev);
start = buf = efi_alloc(dpsize + sizeof(END));
if (!buf)
return NULL;
- buf = dp_fill(buf, eth_get_dev());
+ buf = dp_fill(buf, dev);
*((struct efi_device_path *)buf) = END;
@@ -984,11 +984,13 @@
* @ip: IPv4 local address
* @mask: network mask
* @srv: IPv4 remote/server address
+ * @dev: net udevice
* Return: pointer to device path, NULL on error
*/
static struct efi_device_path *efi_dp_from_ipv4(struct efi_ipv4_address *ip,
struct efi_ipv4_address *mask,
- struct efi_ipv4_address *srv)
+ struct efi_ipv4_address *srv,
+ struct udevice *dev)
{
struct efi_device_path *dp1, *dp2, *pos;
struct {
@@ -1010,7 +1012,7 @@
pos = &dp.end;
memcpy(pos, &END, sizeof(END));
- dp1 = efi_dp_from_eth();
+ dp1 = efi_dp_from_eth(dev);
if (!dp1)
return NULL;
@@ -1029,9 +1031,10 @@
* and an END node.
*
* @server: URI of remote server
+ * @dev: net udevice
* Return: pointer to HTTP device path, NULL on error
*/
-struct efi_device_path *efi_dp_from_http(const char *server)
+struct efi_device_path *efi_dp_from_http(const char *server, struct udevice *dev)
{
struct efi_device_path *dp1, *dp2;
struct efi_device_path_uri *uridp;
@@ -1047,10 +1050,11 @@
efi_net_get_addr(&ip, &mask, NULL);
- dp1 = efi_dp_from_ipv4(&ip, &mask, NULL);
+ dp1 = efi_dp_from_ipv4(&ip, &mask, NULL, dev);
if (!dp1)
return NULL;
+
strcpy(tmp, "http://");
if (server) {
diff --git a/lib/efi_loader/efi_net.c b/lib/efi_loader/efi_net.c
index 27fc401..ebb7f4a 100644
--- a/lib/efi_loader/efi_net.c
+++ b/lib/efi_loader/efi_net.c
@@ -952,14 +952,12 @@
if (r != EFI_SUCCESS)
goto failure_to_add_protocol;
- if (net_dp)
- r = efi_add_protocol(&netobj->header, &efi_guid_device_path,
- net_dp);
- else
- r = efi_net_set_dp("Net", NULL);
+ if (!net_dp)
+ efi_net_set_dp("Net", NULL);
+ r = efi_add_protocol(&netobj->header, &efi_guid_device_path,
+ net_dp);
if (r != EFI_SUCCESS)
goto failure_to_add_protocol;
-
r = efi_add_protocol(&netobj->header, &efi_pxe_base_code_protocol_guid,
&netobj->pxe);
if (r != EFI_SUCCESS)
@@ -1077,58 +1075,18 @@
*/
efi_status_t efi_net_set_dp(const char *dev, const char *server)
{
- efi_status_t ret = EFI_SUCCESS;
- struct efi_handler *phandler;
- struct efi_device_path *old_net_dp, *new_net_dp;
+ efi_free_pool(net_dp);
- old_net_dp = net_dp;
- new_net_dp = NULL;
+ net_dp = NULL;
if (!strcmp(dev, "Net"))
- new_net_dp = efi_dp_from_eth();
+ net_dp = efi_dp_from_eth(eth_get_dev());
else if (!strcmp(dev, "Http"))
- new_net_dp = efi_dp_from_http(server);
+ net_dp = efi_dp_from_http(server, eth_get_dev());
- if (!new_net_dp) {
+ if (!net_dp)
return EFI_OUT_OF_RESOURCES;
- }
-
- // If netobj is not started yet, end here.
- if (!netobj) {
- goto exit;
- }
-
- phandler = NULL;
- efi_search_protocol(&netobj->header, &efi_guid_device_path, &phandler);
-
- // If the device path protocol is not yet installed, install it
- if (!phandler)
- goto add;
-
- // If it is already installed, try to update it
- ret = efi_reinstall_protocol_interface(&netobj->header, &efi_guid_device_path,
- old_net_dp, new_net_dp);
- if (ret != EFI_SUCCESS)
- goto error;
-
- net_dp = new_net_dp;
- efi_free_pool(old_net_dp);
return EFI_SUCCESS;
-add:
- ret = efi_add_protocol(&netobj->header, &efi_guid_device_path,
- new_net_dp);
- if (ret != EFI_SUCCESS)
- goto error;
-exit:
- net_dp = new_net_dp;
- efi_free_pool(old_net_dp);
-
- return ret;
-error:
- // Failed, restore
- efi_free_pool(new_net_dp);
-
- return ret;
}
/**