xref: /freebsd-src/sys/dev/nvdimm/nvdimm_var.h (revision 95ee2897e98f5d444f26ed2334cc7c439f9c16c6)
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