1 // SPDX-License-Identifier: GPL-2.0+
2 /*
3  * EFI device path from u-boot device-model mapping
4  *
5  * (C) Copyright 2017 Rob Clark
6  */
7 
8 #include <common.h>
9 #include <blk.h>
10 #include <dm.h>
11 #include <log.h>
12 #include <net.h>
13 #include <usb.h>
14 #include <mmc.h>
15 #include <nvme.h>
16 #include <efi_loader.h>
17 #include <part.h>
18 #include <sandboxblockdev.h>
19 #include <asm-generic/unaligned.h>
20 #include <linux/compat.h> /* U16_MAX */
21 
22 #ifdef CONFIG_SANDBOX
23 const efi_guid_t efi_guid_host_dev = U_BOOT_HOST_DEV_GUID;
24 #endif
25 #ifdef CONFIG_VIRTIO_BLK
26 const efi_guid_t efi_guid_virtio_dev = U_BOOT_VIRTIO_DEV_GUID;
27 #endif
28 
29 /* template END node: */
30 static const struct efi_device_path END = {
31 	.type     = DEVICE_PATH_TYPE_END,
32 	.sub_type = DEVICE_PATH_SUB_TYPE_END,
33 	.length   = sizeof(END),
34 };
35 
36 /* template ROOT node: */
37 static const struct efi_device_path_vendor ROOT = {
38 	.dp = {
39 		.type     = DEVICE_PATH_TYPE_HARDWARE_DEVICE,
40 		.sub_type = DEVICE_PATH_SUB_TYPE_VENDOR,
41 		.length   = sizeof(ROOT),
42 	},
43 	.guid = U_BOOT_GUID,
44 };
45 
46 #if defined(CONFIG_DM_MMC) && defined(CONFIG_MMC)
47 /*
48  * Determine if an MMC device is an SD card.
49  *
50  * @desc	block device descriptor
51  * @return	true if the device is an SD card
52  */
is_sd(struct blk_desc * desc)53 static bool is_sd(struct blk_desc *desc)
54 {
55 	struct mmc *mmc = find_mmc_device(desc->devnum);
56 
57 	if (!mmc)
58 		return false;
59 
60 	return IS_SD(mmc) != 0U;
61 }
62 #endif
63 
dp_alloc(size_t sz)64 static void *dp_alloc(size_t sz)
65 {
66 	void *buf;
67 
68 	if (efi_allocate_pool(EFI_ALLOCATE_ANY_PAGES, sz, &buf) !=
69 	    EFI_SUCCESS) {
70 		debug("EFI: ERROR: out of memory in %s\n", __func__);
71 		return NULL;
72 	}
73 
74 	memset(buf, 0, sz);
75 	return buf;
76 }
77 
78 /*
79  * Iterate to next block in device-path, terminating (returning NULL)
80  * at /End* node.
81  */
efi_dp_next(const struct efi_device_path * dp)82 struct efi_device_path *efi_dp_next(const struct efi_device_path *dp)
83 {
84 	if (dp == NULL)
85 		return NULL;
86 	if (dp->type == DEVICE_PATH_TYPE_END)
87 		return NULL;
88 	dp = ((void *)dp) + dp->length;
89 	if (dp->type == DEVICE_PATH_TYPE_END)
90 		return NULL;
91 	return (struct efi_device_path *)dp;
92 }
93 
94 /*
95  * Compare two device-paths, stopping when the shorter of the two hits
96  * an End* node. This is useful to, for example, compare a device-path
97  * representing a device with one representing a file on the device, or
98  * a device with a parent device.
99  */
efi_dp_match(const struct efi_device_path * a,const struct efi_device_path * b)100 int efi_dp_match(const struct efi_device_path *a,
101 		 const struct efi_device_path *b)
102 {
103 	while (1) {
104 		int ret;
105 
106 		ret = memcmp(&a->length, &b->length, sizeof(a->length));
107 		if (ret)
108 			return ret;
109 
110 		ret = memcmp(a, b, a->length);
111 		if (ret)
112 			return ret;
113 
114 		a = efi_dp_next(a);
115 		b = efi_dp_next(b);
116 
117 		if (!a || !b)
118 			return 0;
119 	}
120 }
121 
122 /*
123  * We can have device paths that start with a USB WWID or a USB Class node,
124  * and a few other cases which don't encode the full device path with bus
125  * hierarchy:
126  *
127  *   - MESSAGING:USB_WWID
128  *   - MESSAGING:USB_CLASS
129  *   - MEDIA:FILE_PATH
130  *   - MEDIA:HARD_DRIVE
131  *   - MESSAGING:URI
132  *
133  * See UEFI spec (section 3.1.2, about short-form device-paths)
134  */
shorten_path(struct efi_device_path * dp)135 static struct efi_device_path *shorten_path(struct efi_device_path *dp)
136 {
137 	while (dp) {
138 		/*
139 		 * TODO: Add MESSAGING:USB_WWID and MESSAGING:URI..
140 		 * in practice fallback.efi just uses MEDIA:HARD_DRIVE
141 		 * so not sure when we would see these other cases.
142 		 */
143 		if (EFI_DP_TYPE(dp, MESSAGING_DEVICE, MSG_USB_CLASS) ||
144 		    EFI_DP_TYPE(dp, MEDIA_DEVICE, HARD_DRIVE_PATH) ||
145 		    EFI_DP_TYPE(dp, MEDIA_DEVICE, FILE_PATH))
146 			return dp;
147 
148 		dp = efi_dp_next(dp);
149 	}
150 
151 	return dp;
152 }
153 
find_obj(struct efi_device_path * dp,bool short_path,struct efi_device_path ** rem)154 static struct efi_object *find_obj(struct efi_device_path *dp, bool short_path,
155 				   struct efi_device_path **rem)
156 {
157 	struct efi_object *efiobj;
158 	efi_uintn_t dp_size = efi_dp_instance_size(dp);
159 
160 	list_for_each_entry(efiobj, &efi_obj_list, link) {
161 		struct efi_handler *handler;
162 		struct efi_device_path *obj_dp;
163 		efi_status_t ret;
164 
165 		ret = efi_search_protocol(efiobj,
166 					  &efi_guid_device_path, &handler);
167 		if (ret != EFI_SUCCESS)
168 			continue;
169 		obj_dp = handler->protocol_interface;
170 
171 		do {
172 			if (efi_dp_match(dp, obj_dp) == 0) {
173 				if (rem) {
174 					/*
175 					 * Allow partial matches, but inform
176 					 * the caller.
177 					 */
178 					*rem = ((void *)dp) +
179 						efi_dp_instance_size(obj_dp);
180 					return efiobj;
181 				} else {
182 					/* Only return on exact matches */
183 					if (efi_dp_instance_size(obj_dp) ==
184 					    dp_size)
185 						return efiobj;
186 				}
187 			}
188 
189 			obj_dp = shorten_path(efi_dp_next(obj_dp));
190 		} while (short_path && obj_dp);
191 	}
192 
193 	return NULL;
194 }
195 
196 /*
197  * Find an efiobj from device-path, if 'rem' is not NULL, returns the
198  * remaining part of the device path after the matched object.
199  */
efi_dp_find_obj(struct efi_device_path * dp,struct efi_device_path ** rem)200 struct efi_object *efi_dp_find_obj(struct efi_device_path *dp,
201 				   struct efi_device_path **rem)
202 {
203 	struct efi_object *efiobj;
204 
205 	/* Search for an exact match first */
206 	efiobj = find_obj(dp, false, NULL);
207 
208 	/* Then for a fuzzy match */
209 	if (!efiobj)
210 		efiobj = find_obj(dp, false, rem);
211 
212 	/* And now for a fuzzy short match */
213 	if (!efiobj)
214 		efiobj = find_obj(dp, true, rem);
215 
216 	return efiobj;
217 }
218 
219 /*
220  * Determine the last device path node that is not the end node.
221  *
222  * @dp		device path
223  * @return	last node before the end node if it exists
224  *		otherwise NULL
225  */
efi_dp_last_node(const struct efi_device_path * dp)226 const struct efi_device_path *efi_dp_last_node(const struct efi_device_path *dp)
227 {
228 	struct efi_device_path *ret;
229 
230 	if (!dp || dp->type == DEVICE_PATH_TYPE_END)
231 		return NULL;
232 	while (dp) {
233 		ret = (struct efi_device_path *)dp;
234 		dp = efi_dp_next(dp);
235 	}
236 	return ret;
237 }
238 
239 /* get size of the first device path instance excluding end node */
efi_dp_instance_size(const struct efi_device_path * dp)240 efi_uintn_t efi_dp_instance_size(const struct efi_device_path *dp)
241 {
242 	efi_uintn_t sz = 0;
243 
244 	if (!dp || dp->type == DEVICE_PATH_TYPE_END)
245 		return 0;
246 	while (dp) {
247 		sz += dp->length;
248 		dp = efi_dp_next(dp);
249 	}
250 
251 	return sz;
252 }
253 
254 /* get size of multi-instance device path excluding end node */
efi_dp_size(const struct efi_device_path * dp)255 efi_uintn_t efi_dp_size(const struct efi_device_path *dp)
256 {
257 	const struct efi_device_path *p = dp;
258 
259 	if (!p)
260 		return 0;
261 	while (p->type != DEVICE_PATH_TYPE_END ||
262 	       p->sub_type != DEVICE_PATH_SUB_TYPE_END)
263 		p = (void *)p + p->length;
264 
265 	return (void *)p - (void *)dp;
266 }
267 
268 /* copy multi-instance device path */
efi_dp_dup(const struct efi_device_path * dp)269 struct efi_device_path *efi_dp_dup(const struct efi_device_path *dp)
270 {
271 	struct efi_device_path *ndp;
272 	size_t sz = efi_dp_size(dp) + sizeof(END);
273 
274 	if (!dp)
275 		return NULL;
276 
277 	ndp = dp_alloc(sz);
278 	if (!ndp)
279 		return NULL;
280 	memcpy(ndp, dp, sz);
281 
282 	return ndp;
283 }
284 
efi_dp_append(const struct efi_device_path * dp1,const struct efi_device_path * dp2)285 struct efi_device_path *efi_dp_append(const struct efi_device_path *dp1,
286 				      const struct efi_device_path *dp2)
287 {
288 	struct efi_device_path *ret;
289 
290 	if (!dp1 && !dp2) {
291 		/* return an end node */
292 		ret = efi_dp_dup(&END);
293 	} else if (!dp1) {
294 		ret = efi_dp_dup(dp2);
295 	} else if (!dp2) {
296 		ret = efi_dp_dup(dp1);
297 	} else {
298 		/* both dp1 and dp2 are non-null */
299 		unsigned sz1 = efi_dp_size(dp1);
300 		unsigned sz2 = efi_dp_size(dp2);
301 		void *p = dp_alloc(sz1 + sz2 + sizeof(END));
302 		if (!p)
303 			return NULL;
304 		memcpy(p, dp1, sz1);
305 		/* the end node of the second device path has to be retained */
306 		memcpy(p + sz1, dp2, sz2 + sizeof(END));
307 		ret = p;
308 	}
309 
310 	return ret;
311 }
312 
efi_dp_append_node(const struct efi_device_path * dp,const struct efi_device_path * node)313 struct efi_device_path *efi_dp_append_node(const struct efi_device_path *dp,
314 					   const struct efi_device_path *node)
315 {
316 	struct efi_device_path *ret;
317 
318 	if (!node && !dp) {
319 		ret = efi_dp_dup(&END);
320 	} else if (!node) {
321 		ret = efi_dp_dup(dp);
322 	} else if (!dp) {
323 		size_t sz = node->length;
324 		void *p = dp_alloc(sz + sizeof(END));
325 		if (!p)
326 			return NULL;
327 		memcpy(p, node, sz);
328 		memcpy(p + sz, &END, sizeof(END));
329 		ret = p;
330 	} else {
331 		/* both dp and node are non-null */
332 		size_t sz = efi_dp_size(dp);
333 		void *p = dp_alloc(sz + node->length + sizeof(END));
334 		if (!p)
335 			return NULL;
336 		memcpy(p, dp, sz);
337 		memcpy(p + sz, node, node->length);
338 		memcpy(p + sz + node->length, &END, sizeof(END));
339 		ret = p;
340 	}
341 
342 	return ret;
343 }
344 
efi_dp_create_device_node(const u8 type,const u8 sub_type,const u16 length)345 struct efi_device_path *efi_dp_create_device_node(const u8 type,
346 						  const u8 sub_type,
347 						  const u16 length)
348 {
349 	struct efi_device_path *ret;
350 
351 	if (length < sizeof(struct efi_device_path))
352 		return NULL;
353 
354 	ret = dp_alloc(length);
355 	if (!ret)
356 		return ret;
357 	ret->type = type;
358 	ret->sub_type = sub_type;
359 	ret->length = length;
360 	return ret;
361 }
362 
efi_dp_append_instance(const struct efi_device_path * dp,const struct efi_device_path * dpi)363 struct efi_device_path *efi_dp_append_instance(
364 		const struct efi_device_path *dp,
365 		const struct efi_device_path *dpi)
366 {
367 	size_t sz, szi;
368 	struct efi_device_path *p, *ret;
369 
370 	if (!dpi)
371 		return NULL;
372 	if (!dp)
373 		return efi_dp_dup(dpi);
374 	sz = efi_dp_size(dp);
375 	szi = efi_dp_instance_size(dpi);
376 	p = dp_alloc(sz + szi + 2 * sizeof(END));
377 	if (!p)
378 		return NULL;
379 	ret = p;
380 	memcpy(p, dp, sz + sizeof(END));
381 	p = (void *)p + sz;
382 	p->sub_type = DEVICE_PATH_SUB_TYPE_INSTANCE_END;
383 	p = (void *)p + sizeof(END);
384 	memcpy(p, dpi, szi);
385 	p = (void *)p + szi;
386 	memcpy(p, &END, sizeof(END));
387 	return ret;
388 }
389 
efi_dp_get_next_instance(struct efi_device_path ** dp,efi_uintn_t * size)390 struct efi_device_path *efi_dp_get_next_instance(struct efi_device_path **dp,
391 						 efi_uintn_t *size)
392 {
393 	size_t sz;
394 	struct efi_device_path *p;
395 
396 	if (size)
397 		*size = 0;
398 	if (!dp || !*dp)
399 		return NULL;
400 	sz = efi_dp_instance_size(*dp);
401 	p = dp_alloc(sz + sizeof(END));
402 	if (!p)
403 		return NULL;
404 	memcpy(p, *dp, sz + sizeof(END));
405 	*dp = (void *)*dp + sz;
406 	if ((*dp)->sub_type == DEVICE_PATH_SUB_TYPE_INSTANCE_END)
407 		*dp = (void *)*dp + sizeof(END);
408 	else
409 		*dp = NULL;
410 	if (size)
411 		*size = sz + sizeof(END);
412 	return p;
413 }
414 
efi_dp_is_multi_instance(const struct efi_device_path * dp)415 bool efi_dp_is_multi_instance(const struct efi_device_path *dp)
416 {
417 	const struct efi_device_path *p = dp;
418 
419 	if (!p)
420 		return false;
421 	while (p->type != DEVICE_PATH_TYPE_END)
422 		p = (void *)p + p->length;
423 	return p->sub_type == DEVICE_PATH_SUB_TYPE_INSTANCE_END;
424 }
425 
426 #ifdef CONFIG_DM
427 /* size of device-path not including END node for device and all parents
428  * up to the root device.
429  */
dp_size(struct udevice * dev)430 __maybe_unused static unsigned int dp_size(struct udevice *dev)
431 {
432 	if (!dev || !dev->driver)
433 		return sizeof(ROOT);
434 
435 	switch (dev->driver->id) {
436 	case UCLASS_ROOT:
437 	case UCLASS_SIMPLE_BUS:
438 		/* stop traversing parents at this point: */
439 		return sizeof(ROOT);
440 	case UCLASS_ETH:
441 		return dp_size(dev->parent) +
442 			sizeof(struct efi_device_path_mac_addr);
443 #ifdef CONFIG_BLK
444 	case UCLASS_BLK:
445 		switch (dev->parent->uclass->uc_drv->id) {
446 #ifdef CONFIG_IDE
447 		case UCLASS_IDE:
448 			return dp_size(dev->parent) +
449 				sizeof(struct efi_device_path_atapi);
450 #endif
451 #if defined(CONFIG_SCSI) && defined(CONFIG_DM_SCSI)
452 		case UCLASS_SCSI:
453 			return dp_size(dev->parent) +
454 				sizeof(struct efi_device_path_scsi);
455 #endif
456 #if defined(CONFIG_DM_MMC) && defined(CONFIG_MMC)
457 		case UCLASS_MMC:
458 			return dp_size(dev->parent) +
459 				sizeof(struct efi_device_path_sd_mmc_path);
460 #endif
461 #if defined(CONFIG_AHCI) || defined(CONFIG_SATA)
462 		case UCLASS_AHCI:
463 			return dp_size(dev->parent) +
464 				sizeof(struct efi_device_path_sata);
465 #endif
466 #if defined(CONFIG_NVME)
467 		case UCLASS_NVME:
468 			return dp_size(dev->parent) +
469 				sizeof(struct efi_device_path_nvme);
470 #endif
471 #ifdef CONFIG_SANDBOX
472 		case UCLASS_ROOT:
473 			 /*
474 			  * Sandbox's host device will be represented
475 			  * as vendor device with extra one byte for
476 			  * device number
477 			  */
478 			return dp_size(dev->parent)
479 				+ sizeof(struct efi_device_path_vendor) + 1;
480 #endif
481 #ifdef CONFIG_VIRTIO_BLK
482 		case UCLASS_VIRTIO:
483 			 /*
484 			  * Virtio devices will be represented as a vendor
485 			  * device node with an extra byte for the device
486 			  * number.
487 			  */
488 			return dp_size(dev->parent)
489 				+ sizeof(struct efi_device_path_vendor) + 1;
490 #endif
491 		default:
492 			return dp_size(dev->parent);
493 		}
494 #endif
495 #if defined(CONFIG_DM_MMC) && defined(CONFIG_MMC)
496 	case UCLASS_MMC:
497 		return dp_size(dev->parent) +
498 			sizeof(struct efi_device_path_sd_mmc_path);
499 #endif
500 	case UCLASS_MASS_STORAGE:
501 	case UCLASS_USB_HUB:
502 		return dp_size(dev->parent) +
503 			sizeof(struct efi_device_path_usb_class);
504 	default:
505 		/* just skip over unknown classes: */
506 		return dp_size(dev->parent);
507 	}
508 }
509 
510 /*
511  * Recursively build a device path.
512  *
513  * @buf		pointer to the end of the device path
514  * @dev		device
515  * @return	pointer to the end of the device path
516  */
dp_fill(void * buf,struct udevice * dev)517 __maybe_unused static void *dp_fill(void *buf, struct udevice *dev)
518 {
519 	if (!dev || !dev->driver)
520 		return buf;
521 
522 	switch (dev->driver->id) {
523 	case UCLASS_ROOT:
524 	case UCLASS_SIMPLE_BUS: {
525 		/* stop traversing parents at this point: */
526 		struct efi_device_path_vendor *vdp = buf;
527 		*vdp = ROOT;
528 		return &vdp[1];
529 	}
530 #ifdef CONFIG_DM_ETH
531 	case UCLASS_ETH: {
532 		struct efi_device_path_mac_addr *dp =
533 			dp_fill(buf, dev->parent);
534 		struct eth_pdata *pdata = dev_get_plat(dev);
535 
536 		dp->dp.type = DEVICE_PATH_TYPE_MESSAGING_DEVICE;
537 		dp->dp.sub_type = DEVICE_PATH_SUB_TYPE_MSG_MAC_ADDR;
538 		dp->dp.length = sizeof(*dp);
539 		memset(&dp->mac, 0, sizeof(dp->mac));
540 		/* We only support IPv4 */
541 		memcpy(&dp->mac, &pdata->enetaddr, ARP_HLEN);
542 		/* Ethernet */
543 		dp->if_type = 1;
544 		return &dp[1];
545 	}
546 #endif
547 #ifdef CONFIG_BLK
548 	case UCLASS_BLK:
549 		switch (dev->parent->uclass->uc_drv->id) {
550 #ifdef CONFIG_SANDBOX
551 		case UCLASS_ROOT: {
552 			/* stop traversing parents at this point: */
553 			struct efi_device_path_vendor *dp;
554 			struct blk_desc *desc = dev_get_uclass_plat(dev);
555 
556 			dp_fill(buf, dev->parent);
557 			dp = buf;
558 			++dp;
559 			dp->dp.type = DEVICE_PATH_TYPE_HARDWARE_DEVICE;
560 			dp->dp.sub_type = DEVICE_PATH_SUB_TYPE_VENDOR;
561 			dp->dp.length = sizeof(*dp) + 1;
562 			memcpy(&dp->guid, &efi_guid_host_dev,
563 			       sizeof(efi_guid_t));
564 			dp->vendor_data[0] = desc->devnum;
565 			return &dp->vendor_data[1];
566 			}
567 #endif
568 #ifdef CONFIG_VIRTIO_BLK
569 		case UCLASS_VIRTIO: {
570 			struct efi_device_path_vendor *dp;
571 			struct blk_desc *desc = dev_get_uclass_plat(dev);
572 
573 			dp_fill(buf, dev->parent);
574 			dp = buf;
575 			++dp;
576 			dp->dp.type = DEVICE_PATH_TYPE_HARDWARE_DEVICE;
577 			dp->dp.sub_type = DEVICE_PATH_SUB_TYPE_VENDOR;
578 			dp->dp.length = sizeof(*dp) + 1;
579 			memcpy(&dp->guid, &efi_guid_virtio_dev,
580 			       sizeof(efi_guid_t));
581 			dp->vendor_data[0] = desc->devnum;
582 			return &dp->vendor_data[1];
583 			}
584 #endif
585 #ifdef CONFIG_IDE
586 		case UCLASS_IDE: {
587 			struct efi_device_path_atapi *dp =
588 			dp_fill(buf, dev->parent);
589 			struct blk_desc *desc = dev_get_uclass_plat(dev);
590 
591 			dp->dp.type = DEVICE_PATH_TYPE_MESSAGING_DEVICE;
592 			dp->dp.sub_type = DEVICE_PATH_SUB_TYPE_MSG_ATAPI;
593 			dp->dp.length = sizeof(*dp);
594 			dp->logical_unit_number = desc->devnum;
595 			dp->primary_secondary = IDE_BUS(desc->devnum);
596 			dp->slave_master = desc->devnum %
597 				(CONFIG_SYS_IDE_MAXDEVICE /
598 				 CONFIG_SYS_IDE_MAXBUS);
599 			return &dp[1];
600 			}
601 #endif
602 #if defined(CONFIG_SCSI) && defined(CONFIG_DM_SCSI)
603 		case UCLASS_SCSI: {
604 			struct efi_device_path_scsi *dp =
605 				dp_fill(buf, dev->parent);
606 			struct blk_desc *desc = dev_get_uclass_plat(dev);
607 
608 			dp->dp.type = DEVICE_PATH_TYPE_MESSAGING_DEVICE;
609 			dp->dp.sub_type = DEVICE_PATH_SUB_TYPE_MSG_SCSI;
610 			dp->dp.length = sizeof(*dp);
611 			dp->logical_unit_number = desc->lun;
612 			dp->target_id = desc->target;
613 			return &dp[1];
614 			}
615 #endif
616 #if defined(CONFIG_DM_MMC) && defined(CONFIG_MMC)
617 		case UCLASS_MMC: {
618 			struct efi_device_path_sd_mmc_path *sddp =
619 				dp_fill(buf, dev->parent);
620 			struct blk_desc *desc = dev_get_uclass_plat(dev);
621 
622 			sddp->dp.type     = DEVICE_PATH_TYPE_MESSAGING_DEVICE;
623 			sddp->dp.sub_type = is_sd(desc) ?
624 				DEVICE_PATH_SUB_TYPE_MSG_SD :
625 				DEVICE_PATH_SUB_TYPE_MSG_MMC;
626 			sddp->dp.length   = sizeof(*sddp);
627 			sddp->slot_number = dev_seq(dev);
628 			return &sddp[1];
629 			}
630 #endif
631 #if defined(CONFIG_AHCI) || defined(CONFIG_SATA)
632 		case UCLASS_AHCI: {
633 			struct efi_device_path_sata *dp =
634 				dp_fill(buf, dev->parent);
635 			struct blk_desc *desc = dev_get_uclass_plat(dev);
636 
637 			dp->dp.type     = DEVICE_PATH_TYPE_MESSAGING_DEVICE;
638 			dp->dp.sub_type = DEVICE_PATH_SUB_TYPE_MSG_SATA;
639 			dp->dp.length   = sizeof(*dp);
640 			dp->hba_port = desc->devnum;
641 			/* default 0xffff implies no port multiplier */
642 			dp->port_multiplier_port = 0xffff;
643 			dp->logical_unit_number = desc->lun;
644 			return &dp[1];
645 			}
646 #endif
647 #if defined(CONFIG_NVME)
648 		case UCLASS_NVME: {
649 			struct efi_device_path_nvme *dp =
650 				dp_fill(buf, dev->parent);
651 			u32 ns_id;
652 
653 			dp->dp.type     = DEVICE_PATH_TYPE_MESSAGING_DEVICE;
654 			dp->dp.sub_type = DEVICE_PATH_SUB_TYPE_MSG_NVME;
655 			dp->dp.length   = sizeof(*dp);
656 			nvme_get_namespace_id(dev, &ns_id, dp->eui64);
657 			memcpy(&dp->ns_id, &ns_id, sizeof(ns_id));
658 			return &dp[1];
659 			}
660 #endif
661 		default:
662 			debug("%s(%u) %s: unhandled parent class: %s (%u)\n",
663 			      __FILE__, __LINE__, __func__,
664 			      dev->name, dev->parent->uclass->uc_drv->id);
665 			return dp_fill(buf, dev->parent);
666 		}
667 #endif
668 #if defined(CONFIG_DM_MMC) && defined(CONFIG_MMC)
669 	case UCLASS_MMC: {
670 		struct efi_device_path_sd_mmc_path *sddp =
671 			dp_fill(buf, dev->parent);
672 		struct mmc *mmc = mmc_get_mmc_dev(dev);
673 		struct blk_desc *desc = mmc_get_blk_desc(mmc);
674 
675 		sddp->dp.type     = DEVICE_PATH_TYPE_MESSAGING_DEVICE;
676 		sddp->dp.sub_type = is_sd(desc) ?
677 			DEVICE_PATH_SUB_TYPE_MSG_SD :
678 			DEVICE_PATH_SUB_TYPE_MSG_MMC;
679 		sddp->dp.length   = sizeof(*sddp);
680 		sddp->slot_number = dev_seq(dev);
681 
682 		return &sddp[1];
683 	}
684 #endif
685 	case UCLASS_MASS_STORAGE:
686 	case UCLASS_USB_HUB: {
687 		struct efi_device_path_usb_class *udp =
688 			dp_fill(buf, dev->parent);
689 		struct usb_device *udev = dev_get_parent_priv(dev);
690 		struct usb_device_descriptor *desc = &udev->descriptor;
691 
692 		udp->dp.type     = DEVICE_PATH_TYPE_MESSAGING_DEVICE;
693 		udp->dp.sub_type = DEVICE_PATH_SUB_TYPE_MSG_USB_CLASS;
694 		udp->dp.length   = sizeof(*udp);
695 		udp->vendor_id   = desc->idVendor;
696 		udp->product_id  = desc->idProduct;
697 		udp->device_class    = desc->bDeviceClass;
698 		udp->device_subclass = desc->bDeviceSubClass;
699 		udp->device_protocol = desc->bDeviceProtocol;
700 
701 		return &udp[1];
702 	}
703 	default:
704 		debug("%s(%u) %s: unhandled device class: %s (%u)\n",
705 		      __FILE__, __LINE__, __func__,
706 		      dev->name, dev->driver->id);
707 		return dp_fill(buf, dev->parent);
708 	}
709 }
710 #endif
711 
dp_part_size(struct blk_desc * desc,int part)712 static unsigned dp_part_size(struct blk_desc *desc, int part)
713 {
714 	unsigned dpsize;
715 
716 #ifdef CONFIG_BLK
717 	{
718 		struct udevice *dev;
719 		int ret = blk_find_device(desc->if_type, desc->devnum, &dev);
720 
721 		if (ret)
722 			dev = desc->bdev->parent;
723 		dpsize = dp_size(dev);
724 	}
725 #else
726 	dpsize = sizeof(ROOT) + sizeof(struct efi_device_path_usb);
727 #endif
728 
729 	if (part == 0) /* the actual disk, not a partition */
730 		return dpsize;
731 
732 	if (desc->part_type == PART_TYPE_ISO)
733 		dpsize += sizeof(struct efi_device_path_cdrom_path);
734 	else
735 		dpsize += sizeof(struct efi_device_path_hard_drive_path);
736 
737 	return dpsize;
738 }
739 
740 /*
741  * Create a device node for a block device partition.
742  *
743  * @buf		buffer to which the device path is written
744  * @desc	block device descriptor
745  * @part	partition number, 0 identifies a block device
746  */
dp_part_node(void * buf,struct blk_desc * desc,int part)747 static void *dp_part_node(void *buf, struct blk_desc *desc, int part)
748 {
749 	struct disk_partition info;
750 
751 	part_get_info(desc, part, &info);
752 
753 	if (desc->part_type == PART_TYPE_ISO) {
754 		struct efi_device_path_cdrom_path *cddp = buf;
755 
756 		cddp->boot_entry = part;
757 		cddp->dp.type = DEVICE_PATH_TYPE_MEDIA_DEVICE;
758 		cddp->dp.sub_type = DEVICE_PATH_SUB_TYPE_CDROM_PATH;
759 		cddp->dp.length = sizeof(*cddp);
760 		cddp->partition_start = info.start;
761 		cddp->partition_size = info.size;
762 
763 		buf = &cddp[1];
764 	} else {
765 		struct efi_device_path_hard_drive_path *hddp = buf;
766 
767 		hddp->dp.type = DEVICE_PATH_TYPE_MEDIA_DEVICE;
768 		hddp->dp.sub_type = DEVICE_PATH_SUB_TYPE_HARD_DRIVE_PATH;
769 		hddp->dp.length = sizeof(*hddp);
770 		hddp->partition_number = part;
771 		hddp->partition_start = info.start;
772 		hddp->partition_end = info.size;
773 		if (desc->part_type == PART_TYPE_EFI)
774 			hddp->partmap_type = 2;
775 		else
776 			hddp->partmap_type = 1;
777 
778 		switch (desc->sig_type) {
779 		case SIG_TYPE_NONE:
780 		default:
781 			hddp->signature_type = 0;
782 			memset(hddp->partition_signature, 0,
783 			       sizeof(hddp->partition_signature));
784 			break;
785 		case SIG_TYPE_MBR:
786 			hddp->signature_type = 1;
787 			memset(hddp->partition_signature, 0,
788 			       sizeof(hddp->partition_signature));
789 			memcpy(hddp->partition_signature, &desc->mbr_sig,
790 			       sizeof(desc->mbr_sig));
791 			break;
792 		case SIG_TYPE_GUID:
793 			hddp->signature_type = 2;
794 			memcpy(hddp->partition_signature, &desc->guid_sig,
795 			       sizeof(hddp->partition_signature));
796 			break;
797 		}
798 
799 		buf = &hddp[1];
800 	}
801 
802 	return buf;
803 }
804 
805 /*
806  * Create a device path for a block device or one of its partitions.
807  *
808  * @buf		buffer to which the device path is written
809  * @desc	block device descriptor
810  * @part	partition number, 0 identifies a block device
811  */
dp_part_fill(void * buf,struct blk_desc * desc,int part)812 static void *dp_part_fill(void *buf, struct blk_desc *desc, int part)
813 {
814 #ifdef CONFIG_BLK
815 	{
816 		struct udevice *dev;
817 		int ret = blk_find_device(desc->if_type, desc->devnum, &dev);
818 
819 		if (ret)
820 			dev = desc->bdev->parent;
821 		buf = dp_fill(buf, dev);
822 	}
823 #else
824 	/*
825 	 * We *could* make a more accurate path, by looking at if_type
826 	 * and handling all the different cases like we do for non-
827 	 * legacy (i.e. CONFIG_BLK=y) case. But most important thing
828 	 * is just to have a unique device-path for if_type+devnum.
829 	 * So map things to a fictitious USB device.
830 	 */
831 	struct efi_device_path_usb *udp;
832 
833 	memcpy(buf, &ROOT, sizeof(ROOT));
834 	buf += sizeof(ROOT);
835 
836 	udp = buf;
837 	udp->dp.type = DEVICE_PATH_TYPE_MESSAGING_DEVICE;
838 	udp->dp.sub_type = DEVICE_PATH_SUB_TYPE_MSG_USB;
839 	udp->dp.length = sizeof(*udp);
840 	udp->parent_port_number = desc->if_type;
841 	udp->usb_interface = desc->devnum;
842 	buf = &udp[1];
843 #endif
844 
845 	if (part == 0) /* the actual disk, not a partition */
846 		return buf;
847 
848 	return dp_part_node(buf, desc, part);
849 }
850 
851 /* Construct a device-path from a partition on a block device: */
efi_dp_from_part(struct blk_desc * desc,int part)852 struct efi_device_path *efi_dp_from_part(struct blk_desc *desc, int part)
853 {
854 	void *buf, *start;
855 
856 	start = buf = dp_alloc(dp_part_size(desc, part) + sizeof(END));
857 	if (!buf)
858 		return NULL;
859 
860 	buf = dp_part_fill(buf, desc, part);
861 
862 	*((struct efi_device_path *)buf) = END;
863 
864 	return start;
865 }
866 
867 /*
868  * Create a device node for a block device partition.
869  *
870  * @buf		buffer to which the device path is written
871  * @desc	block device descriptor
872  * @part	partition number, 0 identifies a block device
873  */
efi_dp_part_node(struct blk_desc * desc,int part)874 struct efi_device_path *efi_dp_part_node(struct blk_desc *desc, int part)
875 {
876 	efi_uintn_t dpsize;
877 	void *buf;
878 
879 	if (desc->part_type == PART_TYPE_ISO)
880 		dpsize = sizeof(struct efi_device_path_cdrom_path);
881 	else
882 		dpsize = sizeof(struct efi_device_path_hard_drive_path);
883 	buf = dp_alloc(dpsize);
884 
885 	dp_part_node(buf, desc, part);
886 
887 	return buf;
888 }
889 
890 /**
891  * path_to_uefi() - convert UTF-8 path to an UEFI style path
892  *
893  * Convert UTF-8 path to a UEFI style path (i.e. with backslashes as path
894  * separators and UTF-16).
895  *
896  * @src:	source buffer
897  * @uefi:	target buffer, possibly unaligned
898  */
path_to_uefi(void * uefi,const char * src)899 static void path_to_uefi(void *uefi, const char *src)
900 {
901 	u16 *pos = uefi;
902 
903 	/*
904 	 * efi_set_bootdev() calls this routine indirectly before the UEFI
905 	 * subsystem is initialized. So we cannot assume unaligned access to be
906 	 * enabled.
907 	 */
908 	allow_unaligned();
909 
910 	while (*src) {
911 		s32 code = utf8_get(&src);
912 
913 		if (code < 0)
914 			code = '?';
915 		else if (code == '/')
916 			code = '\\';
917 		utf16_put(code, &pos);
918 	}
919 	*pos = 0;
920 }
921 
922 /*
923  * If desc is NULL, this creates a path with only the file component,
924  * otherwise it creates a full path with both device and file components
925  */
efi_dp_from_file(struct blk_desc * desc,int part,const char * path)926 struct efi_device_path *efi_dp_from_file(struct blk_desc *desc, int part,
927 		const char *path)
928 {
929 	struct efi_device_path_file_path *fp;
930 	void *buf, *start;
931 	size_t dpsize = 0, fpsize;
932 
933 	if (desc)
934 		dpsize = dp_part_size(desc, part);
935 
936 	fpsize = sizeof(struct efi_device_path) +
937 		 2 * (utf8_utf16_strlen(path) + 1);
938 	if (fpsize > U16_MAX)
939 		return NULL;
940 
941 	dpsize += fpsize;
942 
943 	start = buf = dp_alloc(dpsize + sizeof(END));
944 	if (!buf)
945 		return NULL;
946 
947 	if (desc)
948 		buf = dp_part_fill(buf, desc, part);
949 
950 	/* add file-path: */
951 	fp = buf;
952 	fp->dp.type = DEVICE_PATH_TYPE_MEDIA_DEVICE;
953 	fp->dp.sub_type = DEVICE_PATH_SUB_TYPE_FILE_PATH;
954 	fp->dp.length = (u16)fpsize;
955 	path_to_uefi(fp->str, path);
956 	buf += fpsize;
957 
958 	*((struct efi_device_path *)buf) = END;
959 
960 	return start;
961 }
962 
efi_dp_from_uart(void)963 struct efi_device_path *efi_dp_from_uart(void)
964 {
965 	void *buf, *pos;
966 	struct efi_device_path_uart *uart;
967 	size_t dpsize = sizeof(ROOT) + sizeof(*uart) + sizeof(END);
968 
969 	buf = dp_alloc(dpsize);
970 	if (!buf)
971 		return NULL;
972 	pos = buf;
973 	memcpy(pos, &ROOT, sizeof(ROOT));
974 	pos += sizeof(ROOT);
975 	uart = pos;
976 	uart->dp.type = DEVICE_PATH_TYPE_MESSAGING_DEVICE;
977 	uart->dp.sub_type = DEVICE_PATH_SUB_TYPE_MSG_UART;
978 	uart->dp.length = sizeof(*uart);
979 	pos += sizeof(*uart);
980 	memcpy(pos, &END, sizeof(END));
981 
982 	return buf;
983 }
984 
985 #ifdef CONFIG_NET
efi_dp_from_eth(void)986 struct efi_device_path *efi_dp_from_eth(void)
987 {
988 #ifndef CONFIG_DM_ETH
989 	struct efi_device_path_mac_addr *ndp;
990 #endif
991 	void *buf, *start;
992 	unsigned dpsize = 0;
993 
994 	assert(eth_get_dev());
995 
996 #ifdef CONFIG_DM_ETH
997 	dpsize += dp_size(eth_get_dev());
998 #else
999 	dpsize += sizeof(ROOT);
1000 	dpsize += sizeof(*ndp);
1001 #endif
1002 
1003 	start = buf = dp_alloc(dpsize + sizeof(END));
1004 	if (!buf)
1005 		return NULL;
1006 
1007 #ifdef CONFIG_DM_ETH
1008 	buf = dp_fill(buf, eth_get_dev());
1009 #else
1010 	memcpy(buf, &ROOT, sizeof(ROOT));
1011 	buf += sizeof(ROOT);
1012 
1013 	ndp = buf;
1014 	ndp->dp.type = DEVICE_PATH_TYPE_MESSAGING_DEVICE;
1015 	ndp->dp.sub_type = DEVICE_PATH_SUB_TYPE_MSG_MAC_ADDR;
1016 	ndp->dp.length = sizeof(*ndp);
1017 	ndp->if_type = 1; /* Ethernet */
1018 	memcpy(ndp->mac.addr, eth_get_ethaddr(), ARP_HLEN);
1019 	buf = &ndp[1];
1020 #endif
1021 
1022 	*((struct efi_device_path *)buf) = END;
1023 
1024 	return start;
1025 }
1026 #endif
1027 
1028 /* Construct a device-path for memory-mapped image */
efi_dp_from_mem(uint32_t memory_type,uint64_t start_address,uint64_t end_address)1029 struct efi_device_path *efi_dp_from_mem(uint32_t memory_type,
1030 					uint64_t start_address,
1031 					uint64_t end_address)
1032 {
1033 	struct efi_device_path_memory *mdp;
1034 	void *buf, *start;
1035 
1036 	start = buf = dp_alloc(sizeof(*mdp) + sizeof(END));
1037 	if (!buf)
1038 		return NULL;
1039 
1040 	mdp = buf;
1041 	mdp->dp.type = DEVICE_PATH_TYPE_HARDWARE_DEVICE;
1042 	mdp->dp.sub_type = DEVICE_PATH_SUB_TYPE_MEMORY;
1043 	mdp->dp.length = sizeof(*mdp);
1044 	mdp->memory_type = memory_type;
1045 	mdp->start_address = start_address;
1046 	mdp->end_address = end_address;
1047 	buf = &mdp[1];
1048 
1049 	*((struct efi_device_path *)buf) = END;
1050 
1051 	return start;
1052 }
1053 
1054 /**
1055  * efi_dp_split_file_path() - split of relative file path from device path
1056  *
1057  * Given a device path indicating a file on a device, separate the device
1058  * path in two: the device path of the actual device and the file path
1059  * relative to this device.
1060  *
1061  * @full_path:		device path including device and file path
1062  * @device_path:	path of the device
1063  * @file_path:		relative path of the file or NULL if there is none
1064  * Return:		status code
1065  */
efi_dp_split_file_path(struct efi_device_path * full_path,struct efi_device_path ** device_path,struct efi_device_path ** file_path)1066 efi_status_t efi_dp_split_file_path(struct efi_device_path *full_path,
1067 				    struct efi_device_path **device_path,
1068 				    struct efi_device_path **file_path)
1069 {
1070 	struct efi_device_path *p, *dp, *fp = NULL;
1071 
1072 	*device_path = NULL;
1073 	*file_path = NULL;
1074 	dp = efi_dp_dup(full_path);
1075 	if (!dp)
1076 		return EFI_OUT_OF_RESOURCES;
1077 	p = dp;
1078 	while (!EFI_DP_TYPE(p, MEDIA_DEVICE, FILE_PATH)) {
1079 		p = efi_dp_next(p);
1080 		if (!p)
1081 			goto out;
1082 	}
1083 	fp = efi_dp_dup(p);
1084 	if (!fp)
1085 		return EFI_OUT_OF_RESOURCES;
1086 	p->type = DEVICE_PATH_TYPE_END;
1087 	p->sub_type = DEVICE_PATH_SUB_TYPE_END;
1088 	p->length = sizeof(*p);
1089 
1090 out:
1091 	*device_path = dp;
1092 	*file_path = fp;
1093 	return EFI_SUCCESS;
1094 }
1095 
1096 /**
1097  * efi_dp_from_name() - convert U-Boot device and file path to device path
1098  *
1099  * @dev:	U-Boot device, e.g. 'mmc'
1100  * @devnr:	U-Boot device number, e.g. 1 for 'mmc:1'
1101  * @path:	file path relative to U-Boot device, may be NULL
1102  * @device:	pointer to receive device path of the device
1103  * @file:	pointer to receive device path for the file
1104  * Return:	status code
1105  */
efi_dp_from_name(const char * dev,const char * devnr,const char * path,struct efi_device_path ** device,struct efi_device_path ** file)1106 efi_status_t efi_dp_from_name(const char *dev, const char *devnr,
1107 			      const char *path,
1108 			      struct efi_device_path **device,
1109 			      struct efi_device_path **file)
1110 {
1111 	struct blk_desc *desc = NULL;
1112 	struct disk_partition fs_partition;
1113 	int part = 0;
1114 	char filename[32] = { 0 }; /* dp->str is u16[32] long */
1115 	char *s;
1116 
1117 	if (path && !file)
1118 		return EFI_INVALID_PARAMETER;
1119 
1120 	if (!strcmp(dev, "Net")) {
1121 #ifdef CONFIG_NET
1122 		if (device)
1123 			*device = efi_dp_from_eth();
1124 #endif
1125 	} else if (!strcmp(dev, "Uart")) {
1126 		if (device)
1127 			*device = efi_dp_from_uart();
1128 	} else {
1129 		part = blk_get_device_part_str(dev, devnr, &desc, &fs_partition,
1130 					       1);
1131 		if (part < 0 || !desc)
1132 			return EFI_INVALID_PARAMETER;
1133 
1134 		if (device)
1135 			*device = efi_dp_from_part(desc, part);
1136 	}
1137 
1138 	if (!path)
1139 		return EFI_SUCCESS;
1140 
1141 	snprintf(filename, sizeof(filename), "%s", path);
1142 	/* DOS style file path: */
1143 	s = filename;
1144 	while ((s = strchr(s, '/')))
1145 		*s++ = '\\';
1146 	*file = efi_dp_from_file(desc, part, filename);
1147 
1148 	if (!*file)
1149 		return EFI_INVALID_PARAMETER;
1150 
1151 	return EFI_SUCCESS;
1152 }
1153 
1154 /**
1155  * efi_dp_check_length() - check length of a device path
1156  *
1157  * @dp:		pointer to device path
1158  * @maxlen:	maximum length of the device path
1159  * Return:
1160  * * length of the device path if it is less or equal @maxlen
1161  * * -1 if the device path is longer then @maxlen
1162  * * -1 if a device path node has a length of less than 4
1163  * * -EINVAL if maxlen exceeds SSIZE_MAX
1164  */
efi_dp_check_length(const struct efi_device_path * dp,const size_t maxlen)1165 ssize_t efi_dp_check_length(const struct efi_device_path *dp,
1166 			    const size_t maxlen)
1167 {
1168 	ssize_t ret = 0;
1169 	u16 len;
1170 
1171 	if (maxlen > SSIZE_MAX)
1172 		return -EINVAL;
1173 	for (;;) {
1174 		len = dp->length;
1175 		if (len < 4)
1176 			return -1;
1177 		ret += len;
1178 		if (ret > maxlen)
1179 			return -1;
1180 		if (dp->type == DEVICE_PATH_TYPE_END &&
1181 		    dp->sub_type == DEVICE_PATH_SUB_TYPE_END)
1182 			return ret;
1183 		dp = (const struct efi_device_path *)((const u8 *)dp + len);
1184 	}
1185 }
1186