|  | /* | 
|  | * Copyright (c) 2022 Intel Corporation | 
|  | * SPDX-License-Identifier: Apache-2.0 | 
|  | * | 
|  | * Derived from FreeBSD original driver made by Jim Harris | 
|  | * with contributions from Alexander Motin and Wojciech Macek | 
|  | */ | 
|  |  | 
|  | #ifndef ZEPHYR_DRIVERS_DISK_NVME_NVME_NAMESPACE_H_ | 
|  | #define ZEPHYR_DRIVERS_DISK_NVME_NVME_NAMESPACE_H_ | 
|  |  | 
|  | #include <zephyr/drivers/disk.h> | 
|  |  | 
|  | struct nvme_namespace_data { | 
|  | /** namespace size */ | 
|  | uint64_t		nsze; | 
|  |  | 
|  | /** namespace capacity */ | 
|  | uint64_t		ncap; | 
|  |  | 
|  | /** namespace utilization */ | 
|  | uint64_t		nuse; | 
|  |  | 
|  | /** namespace features */ | 
|  | uint8_t			nsfeat; | 
|  |  | 
|  | /** number of lba formats */ | 
|  | uint8_t			nlbaf; | 
|  |  | 
|  | /** formatted lba size */ | 
|  | uint8_t			flbas; | 
|  |  | 
|  | /** metadata capabilities */ | 
|  | uint8_t			mc; | 
|  |  | 
|  | /** end-to-end data protection capabilities */ | 
|  | uint8_t			dpc; | 
|  |  | 
|  | /** end-to-end data protection type settings */ | 
|  | uint8_t			dps; | 
|  |  | 
|  | /** Namespace Multi-path I/O and Namespace Sharing Capabilities */ | 
|  | uint8_t			nmic; | 
|  |  | 
|  | /** Reservation Capabilities */ | 
|  | uint8_t			rescap; | 
|  |  | 
|  | /** Format Progress Indicator */ | 
|  | uint8_t			fpi; | 
|  |  | 
|  | /** Deallocate Logical Block Features */ | 
|  | uint8_t			dlfeat; | 
|  |  | 
|  | /** Namespace Atomic Write Unit Normal  */ | 
|  | uint16_t		nawun; | 
|  |  | 
|  | /** Namespace Atomic Write Unit Power Fail */ | 
|  | uint16_t		nawupf; | 
|  |  | 
|  | /** Namespace Atomic Compare & Write Unit */ | 
|  | uint16_t		nacwu; | 
|  |  | 
|  | /** Namespace Atomic Boundary Size Normal */ | 
|  | uint16_t		nabsn; | 
|  |  | 
|  | /** Namespace Atomic Boundary Offset */ | 
|  | uint16_t		nabo; | 
|  |  | 
|  | /** Namespace Atomic Boundary Size Power Fail */ | 
|  | uint16_t		nabspf; | 
|  |  | 
|  | /** Namespace Optimal IO Boundary */ | 
|  | uint16_t		noiob; | 
|  |  | 
|  | /** NVM Capacity */ | 
|  | uint8_t			nvmcap[16]; | 
|  |  | 
|  | /** Namespace Preferred Write Granularity  */ | 
|  | uint16_t		npwg; | 
|  |  | 
|  | /** Namespace Preferred Write Alignment */ | 
|  | uint16_t		npwa; | 
|  |  | 
|  | /** Namespace Preferred Deallocate Granularity */ | 
|  | uint16_t		npdg; | 
|  |  | 
|  | /** Namespace Preferred Deallocate Alignment */ | 
|  | uint16_t		npda; | 
|  |  | 
|  | /** Namespace Optimal Write Size */ | 
|  | uint16_t		nows; | 
|  |  | 
|  | /* bytes 74-91: Reserved */ | 
|  | uint8_t			reserved5[18]; | 
|  |  | 
|  | /** ANA Group Identifier */ | 
|  | uint32_t		anagrpid; | 
|  |  | 
|  | /* bytes 96-98: Reserved */ | 
|  | uint8_t			reserved6[3]; | 
|  |  | 
|  | /** Namespace Attributes */ | 
|  | uint8_t			nsattr; | 
|  |  | 
|  | /** NVM Set Identifier */ | 
|  | uint16_t		nvmsetid; | 
|  |  | 
|  | /** Endurance Group Identifier */ | 
|  | uint16_t		endgid; | 
|  |  | 
|  | /** Namespace Globally Unique Identifier */ | 
|  | uint8_t			nguid[16]; | 
|  |  | 
|  | /** IEEE Extended Unique Identifier */ | 
|  | uint8_t			eui64[8]; | 
|  |  | 
|  | /** lba format support */ | 
|  | uint32_t		lbaf[16]; | 
|  |  | 
|  | uint8_t			reserved7[192]; | 
|  |  | 
|  | uint8_t			vendor_specific[3712]; | 
|  | } __packed __aligned(4); | 
|  |  | 
|  | static inline | 
|  | void nvme_namespace_data_swapbytes(struct nvme_namespace_data *s) | 
|  | { | 
|  | #if _BYTE_ORDER != _LITTLE_ENDIAN | 
|  | int i; | 
|  |  | 
|  | s->nsze = sys_le64_to_cpu(s->nsze); | 
|  | s->ncap = sys_le64_to_cpu(s->ncap); | 
|  | s->nuse = sys_le64_to_cpu(s->nuse); | 
|  | s->nawun = sys_le16_to_cpu(s->nawun); | 
|  | s->nawupf = sys_le16_to_cpu(s->nawupf); | 
|  | s->nacwu = sys_le16_to_cpu(s->nacwu); | 
|  | s->nabsn = sys_le16_to_cpu(s->nabsn); | 
|  | s->nabo = sys_le16_to_cpu(s->nabo); | 
|  | s->nabspf = sys_le16_to_cpu(s->nabspf); | 
|  | s->noiob = sys_le16_to_cpu(s->noiob); | 
|  | s->npwg = sys_le16_to_cpu(s->npwg); | 
|  | s->npwa = sys_le16_to_cpu(s->npwa); | 
|  | s->npdg = sys_le16_to_cpu(s->npdg); | 
|  | s->npda = sys_le16_to_cpu(s->npda); | 
|  | s->nows = sys_le16_to_cpu(s->nows); | 
|  | s->anagrpid = sys_le32_to_cpu(s->anagrpid); | 
|  | s->nvmsetid = sys_le16_to_cpu(s->nvmsetid); | 
|  | s->endgid = sys_le16_to_cpu(s->endgid); | 
|  | for (i = 0; i < 16; i++) { | 
|  | s->lbaf[i] = sys_le32_to_cpu(s->lbaf[i]); | 
|  | } | 
|  | #else | 
|  | ARG_UNUSED(s); | 
|  | #endif | 
|  | } | 
|  |  | 
|  | /* Readable identifier: nvme%%n%%\0 */ | 
|  | #define NVME_NAMESPACE_NAME_MAX_LENGTH 10 | 
|  |  | 
|  | struct nvme_namespace { | 
|  | struct nvme_controller *ctrlr; | 
|  | struct nvme_namespace_data data; | 
|  | struct disk_info disk; | 
|  | uint32_t id; | 
|  | uint32_t flags; | 
|  | uint32_t boundary; | 
|  | char name[NVME_NAMESPACE_NAME_MAX_LENGTH]; | 
|  | }; | 
|  |  | 
|  | enum nvme_namespace_flags { | 
|  | NVME_NS_DEALLOCATE_SUPPORTED	= 0x1, | 
|  | NVME_NS_FLUSH_SUPPORTED		= 0x2, | 
|  | }; | 
|  |  | 
|  | uint32_t nvme_namespace_get_sector_size(struct nvme_namespace *ns); | 
|  |  | 
|  | uint64_t nvme_namespace_get_num_sectors(struct nvme_namespace *ns); | 
|  |  | 
|  | uint64_t nvme_namespace_get_size(struct nvme_namespace *ns); | 
|  |  | 
|  | uint32_t nvme_namespace_get_flags(struct nvme_namespace *ns); | 
|  |  | 
|  | const char *nvme_namespace_get_serial_number(struct nvme_namespace *ns); | 
|  |  | 
|  | const char *nvme_namespace_get_model_number(struct nvme_namespace *ns); | 
|  |  | 
|  | const struct nvme_namespace_data * | 
|  | nvme_namespace_get_data(struct nvme_namespace *ns); | 
|  |  | 
|  | uint32_t nvme_namespace_get_stripesize(struct nvme_namespace *ns); | 
|  |  | 
|  | int nvme_namespace_construct(struct nvme_namespace *ns, | 
|  | uint32_t id, | 
|  | struct nvme_controller *ctrlr); | 
|  |  | 
|  | int nvme_namespace_disk_setup(struct nvme_namespace *ns, | 
|  | struct disk_info *disk); | 
|  |  | 
|  | #endif /* ZEPHYR_DRIVERS_DISK_NVME_NVME_NAMESPACE_H_ */ |