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