| /* |
| * 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_ */ |