efi_loader: provide a function to create a partition node
Provide new function efi_dp_part_node() to create a device node for a partition. Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de> Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
b3dd14b6b1
commit
98d48bdf41
@ -300,6 +300,8 @@ struct efi_device_path *efi_dp_append_node(const struct efi_device_path *dp,
|
|||||||
|
|
||||||
struct efi_device_path *efi_dp_from_dev(struct udevice *dev);
|
struct efi_device_path *efi_dp_from_dev(struct udevice *dev);
|
||||||
struct efi_device_path *efi_dp_from_part(struct blk_desc *desc, int part);
|
struct efi_device_path *efi_dp_from_part(struct blk_desc *desc, int part);
|
||||||
|
/* Create a device node for a block device partition. */
|
||||||
|
struct efi_device_path *efi_dp_part_node(struct blk_desc *desc, int part);
|
||||||
struct efi_device_path *efi_dp_from_file(struct blk_desc *desc, int part,
|
struct efi_device_path *efi_dp_from_file(struct blk_desc *desc, int part,
|
||||||
const char *path);
|
const char *path);
|
||||||
struct efi_device_path *efi_dp_from_eth(void);
|
struct efi_device_path *efi_dp_from_eth(void);
|
||||||
|
@ -484,50 +484,16 @@ static unsigned dp_part_size(struct blk_desc *desc, int part)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Create a device path for a block device or one of its partitions.
|
* Create a device node for a block device partition.
|
||||||
*
|
*
|
||||||
* @buf buffer to which the device path is wirtten
|
* @buf buffer to which the device path is wirtten
|
||||||
* @desc block device descriptor
|
* @desc block device descriptor
|
||||||
* @part partition number, 0 identifies a block device
|
* @part partition number, 0 identifies a block device
|
||||||
*/
|
*/
|
||||||
static void *dp_part_fill(void *buf, struct blk_desc *desc, int part)
|
static void *dp_part_node(void *buf, struct blk_desc *desc, int part)
|
||||||
{
|
{
|
||||||
disk_partition_t info;
|
disk_partition_t info;
|
||||||
|
|
||||||
#ifdef CONFIG_BLK
|
|
||||||
{
|
|
||||||
struct udevice *dev;
|
|
||||||
int ret = blk_find_device(desc->if_type, desc->devnum, &dev);
|
|
||||||
|
|
||||||
if (ret)
|
|
||||||
dev = desc->bdev->parent;
|
|
||||||
buf = dp_fill(buf, dev);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
/*
|
|
||||||
* We *could* make a more accurate path, by looking at if_type
|
|
||||||
* and handling all the different cases like we do for non-
|
|
||||||
* legacy (ie CONFIG_BLK=y) case. But most important thing
|
|
||||||
* is just to have a unique device-path for if_type+devnum.
|
|
||||||
* So map things to a fictitious USB device.
|
|
||||||
*/
|
|
||||||
struct efi_device_path_usb *udp;
|
|
||||||
|
|
||||||
memcpy(buf, &ROOT, sizeof(ROOT));
|
|
||||||
buf += sizeof(ROOT);
|
|
||||||
|
|
||||||
udp = buf;
|
|
||||||
udp->dp.type = DEVICE_PATH_TYPE_MESSAGING_DEVICE;
|
|
||||||
udp->dp.sub_type = DEVICE_PATH_SUB_TYPE_MSG_USB;
|
|
||||||
udp->dp.length = sizeof(*udp);
|
|
||||||
udp->parent_port_number = desc->if_type;
|
|
||||||
udp->usb_interface = desc->devnum;
|
|
||||||
buf = &udp[1];
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (part == 0) /* the actual disk, not a partition */
|
|
||||||
return buf;
|
|
||||||
|
|
||||||
part_get_info(desc, part, &info);
|
part_get_info(desc, part, &info);
|
||||||
|
|
||||||
if (desc->part_type == PART_TYPE_ISO) {
|
if (desc->part_type == PART_TYPE_ISO) {
|
||||||
@ -582,6 +548,51 @@ static void *dp_part_fill(void *buf, struct blk_desc *desc, int part)
|
|||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create a device path for a block device or one of its partitions.
|
||||||
|
*
|
||||||
|
* @buf buffer to which the device path is wirtten
|
||||||
|
* @desc block device descriptor
|
||||||
|
* @part partition number, 0 identifies a block device
|
||||||
|
*/
|
||||||
|
static void *dp_part_fill(void *buf, struct blk_desc *desc, int part)
|
||||||
|
{
|
||||||
|
#ifdef CONFIG_BLK
|
||||||
|
{
|
||||||
|
struct udevice *dev;
|
||||||
|
int ret = blk_find_device(desc->if_type, desc->devnum, &dev);
|
||||||
|
|
||||||
|
if (ret)
|
||||||
|
dev = desc->bdev->parent;
|
||||||
|
buf = dp_fill(buf, dev);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
/*
|
||||||
|
* We *could* make a more accurate path, by looking at if_type
|
||||||
|
* and handling all the different cases like we do for non-
|
||||||
|
* legacy (ie CONFIG_BLK=y) case. But most important thing
|
||||||
|
* is just to have a unique device-path for if_type+devnum.
|
||||||
|
* So map things to a fictitious USB device.
|
||||||
|
*/
|
||||||
|
struct efi_device_path_usb *udp;
|
||||||
|
|
||||||
|
memcpy(buf, &ROOT, sizeof(ROOT));
|
||||||
|
buf += sizeof(ROOT);
|
||||||
|
|
||||||
|
udp = buf;
|
||||||
|
udp->dp.type = DEVICE_PATH_TYPE_MESSAGING_DEVICE;
|
||||||
|
udp->dp.sub_type = DEVICE_PATH_SUB_TYPE_MSG_USB;
|
||||||
|
udp->dp.length = sizeof(*udp);
|
||||||
|
udp->parent_port_number = desc->if_type;
|
||||||
|
udp->usb_interface = desc->devnum;
|
||||||
|
buf = &udp[1];
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (part == 0) /* the actual disk, not a partition */
|
||||||
|
return buf;
|
||||||
|
|
||||||
|
return dp_part_node(buf, desc, part);
|
||||||
|
}
|
||||||
|
|
||||||
/* Construct a device-path from a partition on a blk device: */
|
/* Construct a device-path from a partition on a blk device: */
|
||||||
struct efi_device_path *efi_dp_from_part(struct blk_desc *desc, int part)
|
struct efi_device_path *efi_dp_from_part(struct blk_desc *desc, int part)
|
||||||
@ -599,6 +610,29 @@ struct efi_device_path *efi_dp_from_part(struct blk_desc *desc, int part)
|
|||||||
return start;
|
return start;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create a device node for a block device partition.
|
||||||
|
*
|
||||||
|
* @buf buffer to which the device path is wirtten
|
||||||
|
* @desc block device descriptor
|
||||||
|
* @part partition number, 0 identifies a block device
|
||||||
|
*/
|
||||||
|
struct efi_device_path *efi_dp_part_node(struct blk_desc *desc, int part)
|
||||||
|
{
|
||||||
|
efi_uintn_t dpsize;
|
||||||
|
void *buf;
|
||||||
|
|
||||||
|
if (desc->part_type == PART_TYPE_ISO)
|
||||||
|
dpsize = sizeof(struct efi_device_path_cdrom_path);
|
||||||
|
else
|
||||||
|
dpsize = sizeof(struct efi_device_path_hard_drive_path);
|
||||||
|
buf = dp_alloc(dpsize);
|
||||||
|
|
||||||
|
dp_part_node(buf, desc, part);
|
||||||
|
|
||||||
|
return buf;
|
||||||
|
}
|
||||||
|
|
||||||
/* convert path to an UEFI style path (ie. DOS style backslashes and utf16) */
|
/* convert path to an UEFI style path (ie. DOS style backslashes and utf16) */
|
||||||
static void path_to_uefi(u16 *uefi, const char *path)
|
static void path_to_uefi(u16 *uefi, const char *path)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user