xref: /openbmc/u-boot/drivers/nvme/nvme-uclass.c (revision d5b7ee9c)
1982388eaSZhikang Zhang /*
2982388eaSZhikang Zhang  * Copyright (C) 2017 NXP Semiconductors
3982388eaSZhikang Zhang  * Copyright (C) 2017 Bin Meng <bmeng.cn@gmail.com>
4982388eaSZhikang Zhang  *
5982388eaSZhikang Zhang  * SPDX-License-Identifier:	GPL-2.0+
6982388eaSZhikang Zhang  */
7982388eaSZhikang Zhang 
8982388eaSZhikang Zhang #include <common.h>
9982388eaSZhikang Zhang #include <errno.h>
10982388eaSZhikang Zhang #include <dm.h>
11982388eaSZhikang Zhang #include <dm/device.h>
12982388eaSZhikang Zhang #include "nvme.h"
13982388eaSZhikang Zhang 
14982388eaSZhikang Zhang static int nvme_info_init(struct uclass *uc)
15982388eaSZhikang Zhang {
16982388eaSZhikang Zhang 	struct nvme_info *info = (struct nvme_info *)uc->priv;
17982388eaSZhikang Zhang 
18982388eaSZhikang Zhang 	info->ns_num = 0;
19982388eaSZhikang Zhang 	info->ndev_num = 0;
20982388eaSZhikang Zhang 	INIT_LIST_HEAD(&info->dev_list);
21982388eaSZhikang Zhang 	nvme_info = info;
22982388eaSZhikang Zhang 
23982388eaSZhikang Zhang 	return 0;
24982388eaSZhikang Zhang }
25982388eaSZhikang Zhang 
26982388eaSZhikang Zhang static int nvme_uclass_post_probe(struct udevice *udev)
27982388eaSZhikang Zhang {
28982388eaSZhikang Zhang 	char name[20];
29982388eaSZhikang Zhang 	struct udevice *ns_udev;
30982388eaSZhikang Zhang 	int i, ret;
31982388eaSZhikang Zhang 	struct nvme_dev *ndev = dev_get_priv(udev);
32982388eaSZhikang Zhang 
33982388eaSZhikang Zhang 	/* Create a blk device for each namespace */
34982388eaSZhikang Zhang 	for (i = 0; i < ndev->nn; i++) {
35*d5b7ee9cSBin Meng 		sprintf(name, "blk#%d", nvme_info->ns_num);
36982388eaSZhikang Zhang 
37982388eaSZhikang Zhang 		/* The real blksz and size will be set by nvme_blk_probe() */
38*d5b7ee9cSBin Meng 		ret = blk_create_devicef(udev, "nvme-blk", name, IF_TYPE_NVME,
39982388eaSZhikang Zhang 					 nvme_info->ns_num++, 512, 0, &ns_udev);
40982388eaSZhikang Zhang 		if (ret) {
41982388eaSZhikang Zhang 			nvme_info->ns_num--;
42982388eaSZhikang Zhang 
43982388eaSZhikang Zhang 			return ret;
44982388eaSZhikang Zhang 		}
45982388eaSZhikang Zhang 	}
46982388eaSZhikang Zhang 
47982388eaSZhikang Zhang 	return 0;
48982388eaSZhikang Zhang }
49982388eaSZhikang Zhang 
50982388eaSZhikang Zhang UCLASS_DRIVER(nvme) = {
51982388eaSZhikang Zhang 	.name	= "nvme",
52982388eaSZhikang Zhang 	.id	= UCLASS_NVME,
53982388eaSZhikang Zhang 	.init	= nvme_info_init,
54982388eaSZhikang Zhang 	.post_probe = nvme_uclass_post_probe,
55982388eaSZhikang Zhang 	.priv_auto_alloc_size = sizeof(struct nvme_info),
56982388eaSZhikang Zhang };
57