16db7f8e5SKonstantin Belousov /*- 26db7f8e5SKonstantin Belousov * Copyright (c) 2017 The FreeBSD Foundation 36db7f8e5SKonstantin Belousov * All rights reserved. 4fc4a961aSKonstantin Belousov * Copyright (c) 2018, 2019 Intel Corporation 56db7f8e5SKonstantin Belousov * 66db7f8e5SKonstantin Belousov * This software was developed by Konstantin Belousov <kib@FreeBSD.org> 76db7f8e5SKonstantin Belousov * under sponsorship from the FreeBSD Foundation. 86db7f8e5SKonstantin Belousov * 96db7f8e5SKonstantin Belousov * Redistribution and use in source and binary forms, with or without 106db7f8e5SKonstantin Belousov * modification, are permitted provided that the following conditions 116db7f8e5SKonstantin Belousov * are met: 126db7f8e5SKonstantin Belousov * 1. Redistributions of source code must retain the above copyright 136db7f8e5SKonstantin Belousov * notice, this list of conditions and the following disclaimer. 146db7f8e5SKonstantin Belousov * 2. Redistributions in binary form must reproduce the above copyright 156db7f8e5SKonstantin Belousov * notice, this list of conditions and the following disclaimer in the 166db7f8e5SKonstantin Belousov * documentation and/or other materials provided with the distribution. 176db7f8e5SKonstantin Belousov * 186db7f8e5SKonstantin Belousov * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 196db7f8e5SKonstantin Belousov * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 206db7f8e5SKonstantin Belousov * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 216db7f8e5SKonstantin Belousov * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 226db7f8e5SKonstantin Belousov * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 236db7f8e5SKonstantin Belousov * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 246db7f8e5SKonstantin Belousov * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 256db7f8e5SKonstantin Belousov * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 266db7f8e5SKonstantin Belousov * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 276db7f8e5SKonstantin Belousov * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 286db7f8e5SKonstantin Belousov * SUCH DAMAGE. 296db7f8e5SKonstantin Belousov */ 306db7f8e5SKonstantin Belousov 316db7f8e5SKonstantin Belousov #ifndef __DEV_NVDIMM_VAR_H__ 326db7f8e5SKonstantin Belousov #define __DEV_NVDIMM_VAR_H__ 336db7f8e5SKonstantin Belousov 34ad30b2f2SBen Widawsky #define NVDIMM_INDEX_BLOCK_SIGNATURE "NAMESPACE_INDEX" 35ad30b2f2SBen Widawsky 36ad30b2f2SBen Widawsky struct nvdimm_label_index { 37ad30b2f2SBen Widawsky char signature[16]; 38ad30b2f2SBen Widawsky uint8_t flags[3]; 39ad30b2f2SBen Widawsky uint8_t label_size; 40ad30b2f2SBen Widawsky uint32_t seq; 41ad30b2f2SBen Widawsky uint64_t this_offset; 42ad30b2f2SBen Widawsky uint64_t this_size; 43ad30b2f2SBen Widawsky uint64_t other_offset; 44ad30b2f2SBen Widawsky uint64_t label_offset; 45ad30b2f2SBen Widawsky uint32_t slot_cnt; 46ad30b2f2SBen Widawsky uint16_t rev_major; 47ad30b2f2SBen Widawsky uint16_t rev_minor; 48ad30b2f2SBen Widawsky uint64_t checksum; 49ad30b2f2SBen Widawsky uint8_t free[0]; 50ad30b2f2SBen Widawsky }; 51ad30b2f2SBen Widawsky 52ad30b2f2SBen Widawsky struct nvdimm_label { 53ad30b2f2SBen Widawsky struct uuid uuid; 54ad30b2f2SBen Widawsky char name[64]; 55ad30b2f2SBen Widawsky uint32_t flags; 56ad30b2f2SBen Widawsky uint16_t nlabel; 57ad30b2f2SBen Widawsky uint16_t position; 58ad30b2f2SBen Widawsky uint64_t set_cookie; 59ad30b2f2SBen Widawsky uint64_t lba_size; 60ad30b2f2SBen Widawsky uint64_t dimm_phys_addr; 61ad30b2f2SBen Widawsky uint64_t raw_size; 62ad30b2f2SBen Widawsky uint32_t slot; 63ad30b2f2SBen Widawsky uint8_t alignment; 64ad30b2f2SBen Widawsky uint8_t reserved[3]; 65ad30b2f2SBen Widawsky struct uuid type_guid; 66ad30b2f2SBen Widawsky struct uuid address_abstraction_guid; 67ad30b2f2SBen Widawsky uint8_t reserved1[88]; 68ad30b2f2SBen Widawsky uint64_t checksum; 69ad30b2f2SBen Widawsky }; 70ad30b2f2SBen Widawsky 71ad30b2f2SBen Widawsky struct nvdimm_label_entry { 72ad30b2f2SBen Widawsky SLIST_ENTRY(nvdimm_label_entry) link; 73ad30b2f2SBen Widawsky struct nvdimm_label label; 74ad30b2f2SBen Widawsky }; 75ad30b2f2SBen Widawsky 76ad30b2f2SBen Widawsky _Static_assert(sizeof(struct nvdimm_label_index) == 72, "Incorrect layout"); 77ad30b2f2SBen Widawsky _Static_assert(sizeof(struct nvdimm_label) == 256, "Incorrect layout"); 78ad30b2f2SBen Widawsky 796db7f8e5SKonstantin Belousov typedef uint32_t nfit_handle_t; 806db7f8e5SKonstantin Belousov 81963c89ffSConrad Meyer enum nvdimm_acpi_ivar { 82fc4a961aSKonstantin Belousov NVDIMM_ROOT_IVAR_ACPI_HANDLE, 83fc4a961aSKonstantin Belousov NVDIMM_ROOT_IVAR_DEVICE_HANDLE, 84fc4a961aSKonstantin Belousov NVDIMM_ROOT_IVAR_MAX, 85fc4a961aSKonstantin Belousov }; 86fc4a961aSKonstantin Belousov __BUS_ACCESSOR(nvdimm_root, acpi_handle, NVDIMM_ROOT, ACPI_HANDLE, ACPI_HANDLE) 87fc4a961aSKonstantin Belousov __BUS_ACCESSOR(nvdimm_root, device_handle, NVDIMM_ROOT, DEVICE_HANDLE, 88fc4a961aSKonstantin Belousov nfit_handle_t) 89fc4a961aSKonstantin Belousov 906db7f8e5SKonstantin Belousov struct nvdimm_dev { 916db7f8e5SKonstantin Belousov device_t nv_dev; 926db7f8e5SKonstantin Belousov nfit_handle_t nv_handle; 936db7f8e5SKonstantin Belousov uint64_t **nv_flush_addr; 94*bdde49b7SRavi Pokala char *nv_flags_str; 956db7f8e5SKonstantin Belousov int nv_flush_addr_cnt; 96ad30b2f2SBen Widawsky uint32_t label_area_size; 97ad30b2f2SBen Widawsky uint32_t max_label_xfer; 98ad30b2f2SBen Widawsky struct nvdimm_label_index *label_index; 99ad30b2f2SBen Widawsky SLIST_HEAD(, nvdimm_label_entry) labels; 1006db7f8e5SKonstantin Belousov }; 1016db7f8e5SKonstantin Belousov 1026db7f8e5SKonstantin Belousov enum SPA_mapping_type { 1036db7f8e5SKonstantin Belousov SPA_TYPE_VOLATILE_MEMORY = 0, 1046db7f8e5SKonstantin Belousov SPA_TYPE_PERSISTENT_MEMORY = 1, 1056db7f8e5SKonstantin Belousov SPA_TYPE_CONTROL_REGION = 2, 1066db7f8e5SKonstantin Belousov SPA_TYPE_DATA_REGION = 3, 1076db7f8e5SKonstantin Belousov SPA_TYPE_VOLATILE_VIRTUAL_DISK = 4, 1086db7f8e5SKonstantin Belousov SPA_TYPE_VOLATILE_VIRTUAL_CD = 5, 1096db7f8e5SKonstantin Belousov SPA_TYPE_PERSISTENT_VIRTUAL_DISK= 6, 1106db7f8e5SKonstantin Belousov SPA_TYPE_PERSISTENT_VIRTUAL_CD = 7, 1116465f315SKonstantin Belousov SPA_TYPE_UNKNOWN = 127, 1126db7f8e5SKonstantin Belousov }; 1136db7f8e5SKonstantin Belousov 114228e377dSBen Widawsky struct nvdimm_spa_dev { 1156db7f8e5SKonstantin Belousov int spa_domain; 11651501370SConrad Meyer vm_memattr_t spa_memattr; 1176db7f8e5SKonstantin Belousov uint64_t spa_phys_base; 1186db7f8e5SKonstantin Belousov uint64_t spa_len; 1196db7f8e5SKonstantin Belousov uint64_t spa_efi_mem_flags; 1206db7f8e5SKonstantin Belousov void *spa_kva; 121228e377dSBen Widawsky struct vm_object *spa_obj; 1226db7f8e5SKonstantin Belousov struct cdev *spa_dev; 1236db7f8e5SKonstantin Belousov struct g_geom *spa_g; 124228e377dSBen Widawsky }; 125228e377dSBen Widawsky 126228e377dSBen Widawsky struct g_spa { 127228e377dSBen Widawsky struct nvdimm_spa_dev *dev; 1286db7f8e5SKonstantin Belousov struct g_provider *spa_p; 1296db7f8e5SKonstantin Belousov struct bio_queue_head spa_g_queue; 1306db7f8e5SKonstantin Belousov struct mtx spa_g_mtx; 1316db7f8e5SKonstantin Belousov struct devstat *spa_g_devstat; 1326db7f8e5SKonstantin Belousov struct proc *spa_g_proc; 1336db7f8e5SKonstantin Belousov bool spa_g_proc_run; 1346db7f8e5SKonstantin Belousov bool spa_g_proc_exiting; 1356db7f8e5SKonstantin Belousov }; 1366db7f8e5SKonstantin Belousov 1378ebb6dddSBen Widawsky struct nvdimm_namespace { 1388ebb6dddSBen Widawsky SLIST_ENTRY(nvdimm_namespace) link; 1398ebb6dddSBen Widawsky struct SPA_mapping *spa; 1408ebb6dddSBen Widawsky struct nvdimm_spa_dev dev; 1418ebb6dddSBen Widawsky }; 1428ebb6dddSBen Widawsky 143228e377dSBen Widawsky struct SPA_mapping { 144228e377dSBen Widawsky SLIST_ENTRY(SPA_mapping) link; 145228e377dSBen Widawsky enum SPA_mapping_type spa_type; 146228e377dSBen Widawsky int spa_nfit_idx; 147228e377dSBen Widawsky struct nvdimm_spa_dev dev; 1488ebb6dddSBen Widawsky SLIST_HEAD(, nvdimm_namespace) namespaces; 149228e377dSBen Widawsky }; 150228e377dSBen Widawsky 1516db7f8e5SKonstantin Belousov MALLOC_DECLARE(M_NVDIMM); 1526db7f8e5SKonstantin Belousov 1537674dce0SKonstantin Belousov void acpi_nfit_get_dimm_ids(ACPI_TABLE_NFIT *nfitbl, nfit_handle_t **listp, 1547674dce0SKonstantin Belousov int *countp); 1557674dce0SKonstantin Belousov void acpi_nfit_get_spa_range(ACPI_TABLE_NFIT *nfitbl, uint16_t range_index, 1567674dce0SKonstantin Belousov ACPI_NFIT_SYSTEM_ADDRESS **spa); 1577674dce0SKonstantin Belousov void acpi_nfit_get_spa_ranges(ACPI_TABLE_NFIT *nfitbl, 1587674dce0SKonstantin Belousov ACPI_NFIT_SYSTEM_ADDRESS ***listp, int *countp); 1597674dce0SKonstantin Belousov void acpi_nfit_get_region_mappings_by_spa_range(ACPI_TABLE_NFIT *nfitbl, 1607674dce0SKonstantin Belousov uint16_t spa_range_index, ACPI_NFIT_MEMORY_MAP ***listp, int *countp); 1617674dce0SKonstantin Belousov void acpi_nfit_get_control_region(ACPI_TABLE_NFIT *nfitbl, 1627674dce0SKonstantin Belousov uint16_t control_region_index, ACPI_NFIT_CONTROL_REGION **out); 1637674dce0SKonstantin Belousov void acpi_nfit_get_flush_addrs(ACPI_TABLE_NFIT *nfitbl, nfit_handle_t dimm, 1647674dce0SKonstantin Belousov uint64_t ***listp, int *countp); 165*bdde49b7SRavi Pokala void acpi_nfit_get_memory_maps_by_dimm(ACPI_TABLE_NFIT *nfitbl, 166*bdde49b7SRavi Pokala nfit_handle_t dimm, ACPI_NFIT_MEMORY_MAP ***listp, int *countp); 167cbd974b4SConrad Meyer enum SPA_mapping_type nvdimm_spa_type_from_name(const char *); 1686465f315SKonstantin Belousov enum SPA_mapping_type nvdimm_spa_type_from_uuid(struct uuid *); 169cf8b104fSD Scott Phillips bool nvdimm_spa_type_user_accessible(enum SPA_mapping_type); 1706db7f8e5SKonstantin Belousov struct nvdimm_dev *nvdimm_find_by_handle(nfit_handle_t nv_handle); 1717dcbca8dSKonstantin Belousov int nvdimm_spa_init(struct SPA_mapping *spa, ACPI_NFIT_SYSTEM_ADDRESS *nfitaddr, 1727dcbca8dSKonstantin Belousov enum SPA_mapping_type spa_type); 1737dcbca8dSKonstantin Belousov void nvdimm_spa_fini(struct SPA_mapping *spa); 17443e4b6caSConrad Meyer int nvdimm_spa_dev_init(struct nvdimm_spa_dev *dev, const char *name, int unit); 175228e377dSBen Widawsky void nvdimm_spa_dev_fini(struct nvdimm_spa_dev *dev); 1768ebb6dddSBen Widawsky int nvdimm_create_namespaces(struct SPA_mapping *spa, ACPI_TABLE_NFIT *nfitbl); 1778ebb6dddSBen Widawsky void nvdimm_destroy_namespaces(struct SPA_mapping *spa); 1786db7f8e5SKonstantin Belousov 1796db7f8e5SKonstantin Belousov #endif /* __DEV_NVDIMM_VAR_H__ */ 180