blob: f3af6a27b63bdb70db7f77e2ababe942255760e0 [file] [log] [blame]
Tom Rini83d290c2018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Zhikang Zhang982388e2017-08-03 02:30:57 -07002/*
3 * Copyright (C) 2017 NXP Semiconductors
4 * Copyright (C) 2017 Bin Meng <bmeng.cn@gmail.com>
Zhikang Zhang982388e2017-08-03 02:30:57 -07005 */
6
Patrick Delaunayb953ec22021-04-27 11:02:19 +02007#define LOG_CATEGORY UCLASS_NVME
8
Zhikang Zhang982388e2017-08-03 02:30:57 -07009#include <common.h>
Simon Glass758c7062023-01-17 10:47:47 -070010#include <bootdev.h>
Zhikang Zhang982388e2017-08-03 02:30:57 -070011#include <dm.h>
Simon Glass758c7062023-01-17 10:47:47 -070012#include <init.h>
13#include <log.h>
14#include <nvme.h>
15
16static int nvme_bootdev_bind(struct udevice *dev)
17{
18 struct bootdev_uc_plat *ucp = dev_get_uclass_plat(dev);
19
Simon Glasseacc2612023-01-17 10:48:08 -070020 ucp->prio = BOOTDEVP_4_SCAN_FAST;
Simon Glass758c7062023-01-17 10:47:47 -070021
22 return 0;
23}
24
25static int nvme_bootdev_hunt(struct bootdev_hunter *info, bool show)
26{
27 int ret;
28
29 /* init PCI first since this is often used to provide NVMe */
30 if (IS_ENABLED(CONFIG_PCI)) {
31 ret = pci_init();
32 if (ret)
33 log_warning("Failed to init PCI (%dE)\n", ret);
34 }
35
36 ret = nvme_scan_namespace();
37 if (ret)
38 return log_msg_ret("scan", ret);
39
40 return 0;
41}
Zhikang Zhang982388e2017-08-03 02:30:57 -070042
43UCLASS_DRIVER(nvme) = {
44 .name = "nvme",
45 .id = UCLASS_NVME,
Zhikang Zhang982388e2017-08-03 02:30:57 -070046};
Simon Glass758c7062023-01-17 10:47:47 -070047
48struct bootdev_ops nvme_bootdev_ops = {
49};
50
51static const struct udevice_id nvme_bootdev_ids[] = {
52 { .compatible = "u-boot,bootdev-nvme" },
53 { }
54};
55
56U_BOOT_DRIVER(nvme_bootdev) = {
57 .name = "nvme_bootdev",
58 .id = UCLASS_BOOTDEV,
59 .ops = &nvme_bootdev_ops,
60 .bind = nvme_bootdev_bind,
61 .of_match = nvme_bootdev_ids,
62};
63
64BOOTDEV_HUNTER(nvme_bootdev_hunter) = {
Simon Glasseacc2612023-01-17 10:48:08 -070065 .prio = BOOTDEVP_4_SCAN_FAST,
Simon Glass758c7062023-01-17 10:47:47 -070066 .uclass = UCLASS_NVME,
67 .hunt = nvme_bootdev_hunt,
68 .drv = DM_DRIVER_REF(nvme_bootdev),
69};