1// SPDX-License-Identifier: GPL-2.0+
2/*
3 * Copyright (C) 2017 NXP Semiconductors
4 * Copyright (C) 2017 Bin Meng <bmeng.cn@gmail.com>
5 */
6
7#define LOG_CATEGORY UCLASS_NVME
8
9#include <common.h>
10#include <bootdev.h>
11#include <dm.h>
12#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
20	ucp->prio = BOOTDEVP_4_SCAN_FAST;
21
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}
42
43UCLASS_DRIVER(nvme) = {
44	.name	= "nvme",
45	.id	= UCLASS_NVME,
46};
47
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) = {
65	.prio		= BOOTDEVP_4_SCAN_FAST,
66	.uclass		= UCLASS_NVME,
67	.hunt		= nvme_bootdev_hunt,
68	.drv		= DM_DRIVER_REF(nvme_bootdev),
69};
70