From patchwork Wed Aug 20 14:46:13 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Glass X-Patchwork-Id: 89 Return-Path: X-Original-To: u-boot-concept@u-boot.org Delivered-To: u-boot-concept@u-boot.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1755701225; bh=Mi390UkZ8K0gcIFgCdDNh74r1y0bpogUKXDcYgLdQjU=; h=From:To:Date:In-Reply-To:References:CC:Subject:List-Id: List-Archive:List-Help:List-Owner:List-Post:List-Subscribe: List-Unsubscribe:From; b=MOEzFEp/qokMRq1Fn64RqO2fYvKw66eXRdO1sbC9dI1L20sjnkpTM3O8oJhp19BAJ J5ni0GmIBjZvUgEkF8DrkFvBK/hjkkntKUGwLyZGpI8/hpdH+tUO9OOwLbnuv8EhvZ 515OcOO+apvBDpzvb4cWg854SRD7qySVK7ol0OFvgyEWMno1vxhj8PyTuYQlC/bnjy zHK4tY+sSd8qlBlEC85tGvG5cHEtOb583iLGAvCMDcPmDYDzlR26K2NVOvf8lVQfnZ +yP845CLLxcPGiNcrZXgHGJ+7j0G5ZO8zEfzn002rLrnEXB+/6fB+54g7pSHrT/StG 8dFVd5c+W/84Q== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id DAECB674FA for ; Wed, 20 Aug 2025 08:47:05 -0600 (MDT) X-Virus-Scanned: Debian amavis at Received: from mail.u-boot.org ([127.0.0.1]) by localhost (mail.u-boot.org [127.0.0.1]) (amavis, port 10024) with ESMTP id u2ySafTtNvxM for ; Wed, 20 Aug 2025 08:47:05 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1755701224; bh=Mi390UkZ8K0gcIFgCdDNh74r1y0bpogUKXDcYgLdQjU=; h=From:To:Date:In-Reply-To:References:CC:Subject:List-Id: List-Archive:List-Help:List-Owner:List-Post:List-Subscribe: List-Unsubscribe:From; b=QET8/36D0OZSWU5ry9OuMDfeRiz1RSKWQ2NcghctRzNyhRdx2SVVt8L1vlL629Iqn CFnMVjZTIWt2NNO9PwFjMvNGCIGxTRf5inr7EYSsp4zy8q8wwG/ncIHiah64NS7G4/ Qn1j6cgTGmbhplOw/aIeNQ7qJak9IEYxHfMbU5QiUL3+w719gsSqXtbYpS/CjTwtXR BdVbuz9w9dqU9KlxVlR5/Ht0buW4VN0Dg2oWeKtZD+S6GZAXI2YyavfzhtZvDk4T1t XYj4ceRDg/uQQegfSJxSwCr8nv5LDtC/lS+Tmk71NmjLmQDymQmNqmdPH7LMfP0QrC bl3nt6XXdrrVA== Received: from mail.u-boot.org (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 30D3767695 for ; Wed, 20 Aug 2025 08:47:04 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1755701218; bh=KPJDMUHLatah6F5ABF2XxJ6FWaCDq9j3Z9ZW6wID4W0=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=i+LcX9Qes8ZsqED1OH6xtZpN1qm+5ZmJUOreojX/94oX7Zp/TgvSGaIafNaEjNItl PanZTC8g93HzJiki3LkZpdNC79jiUq51kX2ygdVF6Bz5p2lGPXPmwk3YnrnLjss9A4 5tTO3WMQb76dVyNJRf2u5sWnetYqJyaaiQ4If2u2lrgCezzU12EippYE1f3VJoh+Zg 3emL2yoRrw/gUrgE0iYiS6pzZLR4qyQrdD/kVQ8cKutNiBttDkzjpTGWdK3uG0ghtp 2RjvpAZzwksqZo0/9+UYXqrXsqlVedmOVTIrOPsBUy/FGXZzSL7V4d+KVhxCQz340B X33F11ODUosuQ== Received: from localhost (localhost [127.0.0.1]) by mail.u-boot.org (Postfix) with ESMTP id 58F1F676A2; Wed, 20 Aug 2025 08:46:58 -0600 (MDT) X-Virus-Scanned: Debian amavis at Received: from mail.u-boot.org ([127.0.0.1]) by localhost (mail.u-boot.org [127.0.0.1]) (amavis, port 10026) with ESMTP id tmyEL7Jpiewz; Wed, 20 Aug 2025 08:46:58 -0600 (MDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=u-boot.org; s=default; t=1755701212; bh=7NW4yY6VNmzPYcB7AYp7Ry4CBW1G0FfwiKS7RYAFkk4=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=vnjBVyejZuGEPxkR1PNkI9USUDTqdDI6Is/zZ+O8GWkJaK1HhnlsxpV2BfETZpzgb cxOEv6Ca4cyNWc3NEB1ULLg1MaaK9PMjwuv0TcXpwya1DaVBhe6QVVxJppMYrRIXEq Bg2rjQ/JYCyySgFVhMkg1Flxp5xMSn6Hs0FwRdHIJ78oebBMAiN5Ri2BrLK7a37IOU IdVU9Y+MVCOQ5JNZ4n0BOwwaBEWYgTlkcYYLOnTuuEnnVbWqYdfLMkRschI+oMTNYO TftVmX80Luvvi+yV4wnaY50Onen7jZ//+Yrwtn5m6zy9aU52oX/Gz1a2WHJ528ZomL j1h27ANP/2/Vg== Received: from u-boot.org (unknown [73.34.74.121]) by mail.u-boot.org (Postfix) with ESMTPSA id 466AB67695; Wed, 20 Aug 2025 08:46:52 -0600 (MDT) From: Simon Glass To: U-Boot Concept Date: Wed, 20 Aug 2025 08:46:13 -0600 Message-ID: <20250820144621.1073679-12-sjg@u-boot.org> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20250820144621.1073679-1-sjg@u-boot.org> References: <20250820144621.1073679-1-sjg@u-boot.org> MIME-Version: 1.0 Message-ID-Hash: Q33X7FTB5T3NQJW7TT3QYETTV6RYWO54 X-Message-ID-Hash: Q33X7FTB5T3NQJW7TT3QYETTV6RYWO54 X-MailFrom: sjg@u-boot.org X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; loop; banned-address; emergency; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: Heinrich Schuchardt , Simon Glass , Claude X-Mailman-Version: 3.3.10 Precedence: list Subject: [Concept] [PATCH 11/14] efi: Add device-path support for EFI media devices List-Id: Discussion and patches related to U-Boot Concept Archived-At: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: From: Simon Glass Add proper device-path handling for UCLASS_EFI_MEDIA devices in both dp_size() and dp_fill() functions. This enables EFI applications to use firmware device-paths for media devices accessed through the EFI block I/O protocol. Add some debugging while we are here. Co-developed-by: Claude Signed-off-by: Simon Glass --- lib/efi/device_path.c | 116 +++++++++++++++++++++++++++++++++++++++++- 1 file changed, 115 insertions(+), 1 deletion(-) diff --git a/lib/efi/device_path.c b/lib/efi/device_path.c index 0b2eb7561b1..449b9d4239b 100644 --- a/lib/efi/device_path.c +++ b/lib/efi/device_path.c @@ -375,6 +375,10 @@ __maybe_unused static unsigned int dp_size(struct udevice *dev) size = sizeof(struct efi_device_path_controller); break; + case UCLASS_EFI_MEDIA: + /* EFI app */ + size = sizeof(struct efi_device_path_udevice); + break; default: /* UCLASS_BLKMAP, UCLASS_HOST, UCLASS_VIRTIO */ size = sizeof(struct efi_device_path_udevice); @@ -389,6 +393,9 @@ __maybe_unused static unsigned int dp_size(struct udevice *dev) case UCLASS_USB_HUB: size = sizeof(struct efi_device_path_usb); break; + case UCLASS_EFI_MEDIA: + size = sizeof(struct efi_device_path_udevice); + break; default: size = sizeof(struct efi_device_path_udevice); break; @@ -519,6 +526,22 @@ __maybe_unused static void *dp_fill(void *buf, struct udevice *dev) return &dp[1]; } break; + case UCLASS_EFI_MEDIA: + if (IS_ENABLED(CONFIG_EFI_APP)) { + struct efi_device_path_udevice *dp = buf; + struct blk_desc *desc = dev_get_uclass_plat(dev); + + dp->dp.type = DEVICE_PATH_TYPE_HARDWARE_DEVICE; + dp->dp.sub_type = DEVICE_PATH_SUB_TYPE_VENDOR; + dp->dp.length = sizeof(*dp); + memcpy(&dp->guid, &efi_u_boot_guid, sizeof(efi_guid_t)); + dp->uclass_id = (UCLASS_BLK & 0xffff) | + (desc->uclass_id << 16); + dp->dev_number = desc->devnum; + + return &dp[1]; + } + break; default: { /* UCLASS_BLKMAP, UCLASS_HOST, UCLASS_VIRTIO */ struct efi_device_path_udevice *dp = buf; @@ -1013,6 +1036,86 @@ out: return EFI_SUCCESS; } +/** + * efi_dp_from_efi_app() - create device path for EFI app + * + * Create a device path for EFI applications using firmware device paths + * from EFI media devices + * + * @devnr: device number string (format: "dev:part") + * @descp: pointer to store block device descriptor + * @partp: pointer to store partition number + * @dp: pointer to store created device path + * Return: U-Boot error code (0 on success, negative on error) + */ +static int efi_dp_from_efi_app(const char *devnr, + struct blk_desc **descp, int *partp, + struct efi_device_path **dpp) +{ + struct efi_media_plat *plat; + struct efi_device_path *dp; + struct udevice *media_dev; + struct blk_desc *desc; + int part, dev_num; + char *ep; + int ret; + + log_debug("using EFI app firmware device path for devnr='%s'\n", devnr); + + /* parse device number from devnr (format: "devnum:part") */ + dev_num = hextoul(devnr, &ep); + if (*ep != ':') { + log_err("invalid EFI device format: '%s'\n", devnr); + return log_msg_ret("eda", -EINVAL); + } + + /* find the EFI media device */ + ret = uclass_get_device(UCLASS_EFI_MEDIA, dev_num, &media_dev); + if (ret) { + log_err("cannot find EFI media device %d\n", dev_num); + return log_msg_ret("eda", -ENODEV); + } + plat = dev_get_plat(media_dev); + + log_debug("found EFI media device %d with firmware device path: %pD\n", + dev_num, plat->device_path); + + /* use the firmware device path and append partition */ + part = simple_strtoul(ep + 1, NULL, 16); + if (part > 0) { + struct efi_device_path *part_dp; + struct disk_partition pinfo; + + /* Get partition info */ + part = blk_get_device_part_str("efi", devnr, &desc, &pinfo, 1); + if (part < 0 || !desc) { + log_err("cannot get partition info for '%s'\n", devnr); + return log_msg_ret("edb", part < 0 ? part : -ENODEV); + } + + /* Create partition node */ + part_dp = efi_dp_part_node(desc, part); + if (!part_dp) + return log_msg_ret("edn", -ENOMEM); + + /* Combine firmware device path with partition */ + dp = efi_dp_append_node(plat->device_path, part_dp); + efi_free_pool(part_dp); + } else { + /* Use whole device */ + dp = efi_dp_dup(plat->device_path); + } + if (!dp) + return log_msg_ret("ede", -ENOMEM); + + log_debug("created final device path: %pD\n", dp); + *descp = desc; + *partp = part; + *dpp = dp; + + return 0; +} + /** * efi_dp_from_name() - convert U-Boot device and file path to device path * @@ -1050,11 +1153,22 @@ efi_status_t efi_dp_from_name(const char *dev, const char *devnr, efi_net_dp_from_dev(&dp, eth_get_dev(), false); } else if (!strcmp(dev, "Uart")) { dp = efi_dp_from_uart(); + } else if (IS_ENABLED(CONFIG_EFI_APP) && !strcmp(dev, "efi")) { + int ret; + + ret = efi_dp_from_efi_app(devnr, &desc, &part, &dp); + if (ret) + return EFI_INVALID_PARAMETER; } else { + log_debug("calling blk_get_device_part_str dev='%s', devnr='%s'\n", + dev, devnr); part = blk_get_device_part_str(dev, devnr, &desc, &fs_partition, 1); - if (part < 0 || !desc) + if (part < 0 || !desc) { + log_err("Failed to find fs: dev='%s', devnr='%s', part=%d, desc=%p\n", + dev, devnr, part, desc); return EFI_INVALID_PARAMETER; + } dp = efi_dp_from_part(desc, part); }