xref: /freebsd-src/sys/dev/nvmf/controller/nvmft_var.h (revision 365b89e8ea4af34a05f68aa28e77573e89fa00b2)
1a15f7c96SJohn Baldwin /*-
2a15f7c96SJohn Baldwin  * SPDX-License-Identifier: BSD-2-Clause
3a15f7c96SJohn Baldwin  *
4a15f7c96SJohn Baldwin  * Copyright (c) 2023-2024 Chelsio Communications, Inc.
5a15f7c96SJohn Baldwin  * Written by: John Baldwin <jhb@FreeBSD.org>
6a15f7c96SJohn Baldwin  */
7a15f7c96SJohn Baldwin 
8a15f7c96SJohn Baldwin #ifndef __NVMFT_VAR_H__
9a15f7c96SJohn Baldwin #define	__NVMFT_VAR_H__
10a15f7c96SJohn Baldwin 
11a15f7c96SJohn Baldwin #include <sys/_callout.h>
12*365b89e8SJohn Baldwin #include <sys/_nv.h>
13a15f7c96SJohn Baldwin #include <sys/refcount.h>
14a15f7c96SJohn Baldwin #include <sys/taskqueue.h>
15a15f7c96SJohn Baldwin 
16a15f7c96SJohn Baldwin #include <dev/nvmf/nvmf_proto.h>
17a15f7c96SJohn Baldwin 
18a15f7c96SJohn Baldwin #include <cam/ctl/ctl.h>
19a15f7c96SJohn Baldwin #include <cam/ctl/ctl_io.h>
20a15f7c96SJohn Baldwin #include <cam/ctl/ctl_frontend.h>
21a15f7c96SJohn Baldwin 
22a15f7c96SJohn Baldwin struct nvmf_capsule;
23a15f7c96SJohn Baldwin struct nvmft_controller;
24a15f7c96SJohn Baldwin struct nvmft_qpair;
25a15f7c96SJohn Baldwin 
26a15f7c96SJohn Baldwin #define	NVMFT_NUM_AER		16
27a15f7c96SJohn Baldwin 
28a15f7c96SJohn Baldwin struct nvmft_port {
29a15f7c96SJohn Baldwin 	TAILQ_ENTRY(nvmft_port) link;
30a15f7c96SJohn Baldwin 	u_int	refs;
31a15f7c96SJohn Baldwin 	struct ctl_port port;
32a15f7c96SJohn Baldwin 	struct nvme_controller_data cdata;
33a15f7c96SJohn Baldwin 	struct nvme_firmware_page fp;
34a15f7c96SJohn Baldwin 	uint64_t cap;
35a15f7c96SJohn Baldwin 	uint32_t max_io_qsize;
36a15f7c96SJohn Baldwin 	bool	online;
37a15f7c96SJohn Baldwin 
38a15f7c96SJohn Baldwin 	struct sx lock;
39a15f7c96SJohn Baldwin 
40a15f7c96SJohn Baldwin 	struct unrhdr *ids;
41a15f7c96SJohn Baldwin 	TAILQ_HEAD(, nvmft_controller) controllers;
42a15f7c96SJohn Baldwin 
43a15f7c96SJohn Baldwin 	uint32_t *active_ns;
44a15f7c96SJohn Baldwin 	u_int	num_ns;
45a15f7c96SJohn Baldwin };
46a15f7c96SJohn Baldwin 
47a15f7c96SJohn Baldwin struct nvmft_io_qpair {
48a15f7c96SJohn Baldwin 	struct nvmft_qpair *qp;
49a15f7c96SJohn Baldwin 
50a15f7c96SJohn Baldwin 	bool shutdown;
51a15f7c96SJohn Baldwin };
52a15f7c96SJohn Baldwin 
53a15f7c96SJohn Baldwin struct nvmft_controller {
54a15f7c96SJohn Baldwin 	struct nvmft_qpair *admin;
55a15f7c96SJohn Baldwin 	struct nvmft_io_qpair *io_qpairs;
56a15f7c96SJohn Baldwin 	u_int	num_io_queues;
57a15f7c96SJohn Baldwin 	bool	shutdown;
58a15f7c96SJohn Baldwin 	bool	admin_closed;
59a15f7c96SJohn Baldwin 	uint16_t cntlid;
60a15f7c96SJohn Baldwin 	uint32_t cc;
61a15f7c96SJohn Baldwin 	uint32_t csts;
62a15f7c96SJohn Baldwin 
63a15f7c96SJohn Baldwin 	struct nvmft_port *np;
64a15f7c96SJohn Baldwin 	struct mtx lock;
65a15f7c96SJohn Baldwin 
66a15f7c96SJohn Baldwin 	struct nvme_controller_data cdata;
67a15f7c96SJohn Baldwin 	struct nvme_health_information_page hip;
68a15f7c96SJohn Baldwin 	sbintime_t create_time;
69a15f7c96SJohn Baldwin 	sbintime_t start_busy;
70a15f7c96SJohn Baldwin 	sbintime_t busy_total;
71a15f7c96SJohn Baldwin 	uint16_t partial_dur;
72a15f7c96SJohn Baldwin 	uint16_t partial_duw;
73a15f7c96SJohn Baldwin 
74a15f7c96SJohn Baldwin 	uint8_t	hostid[16];
75a15f7c96SJohn Baldwin 	uint8_t	hostnqn[NVME_NQN_FIELD_SIZE];
76a15f7c96SJohn Baldwin 	u_int	trtype;
77a15f7c96SJohn Baldwin 
78a15f7c96SJohn Baldwin 	TAILQ_ENTRY(nvmft_controller) link;
79a15f7c96SJohn Baldwin 
80a15f7c96SJohn Baldwin 	/*
81a15f7c96SJohn Baldwin 	 * Each queue can have at most UINT16_MAX commands, so the total
82a15f7c96SJohn Baldwin 	 * across all queues will fit in a uint32_t.
83a15f7c96SJohn Baldwin 	 */
84a15f7c96SJohn Baldwin 	uint32_t pending_commands;
85a15f7c96SJohn Baldwin 
86a15f7c96SJohn Baldwin 	volatile int ka_active_traffic;
87a15f7c96SJohn Baldwin 	struct callout ka_timer;
88a15f7c96SJohn Baldwin 	sbintime_t ka_sbt;
89a15f7c96SJohn Baldwin 
90a15f7c96SJohn Baldwin 	/* AER fields. */
91a15f7c96SJohn Baldwin 	uint32_t aer_mask;
92a15f7c96SJohn Baldwin 	uint16_t aer_cids[NVMFT_NUM_AER];
93a15f7c96SJohn Baldwin 	uint8_t aer_pending;
94a15f7c96SJohn Baldwin 	uint8_t aer_cidx;
95a15f7c96SJohn Baldwin 	uint8_t aer_pidx;
96a15f7c96SJohn Baldwin 
97a15f7c96SJohn Baldwin 	/* Changed namespace IDs. */
98a15f7c96SJohn Baldwin 	struct nvme_ns_list *changed_ns;
99a15f7c96SJohn Baldwin 	bool	changed_ns_reported;
100a15f7c96SJohn Baldwin 
101a15f7c96SJohn Baldwin 	struct task shutdown_task;
102a15f7c96SJohn Baldwin 	struct timeout_task terminate_task;
103a15f7c96SJohn Baldwin };
104a15f7c96SJohn Baldwin 
105a15f7c96SJohn Baldwin MALLOC_DECLARE(M_NVMFT);
106a15f7c96SJohn Baldwin 
107a15f7c96SJohn Baldwin /* ctl_frontend_nvmf.c */
108a15f7c96SJohn Baldwin void	nvmft_port_free(struct nvmft_port *np);
109a15f7c96SJohn Baldwin void	nvmft_populate_active_nslist(struct nvmft_port *np, uint32_t nsid,
110a15f7c96SJohn Baldwin     struct nvme_ns_list *nslist);
111a15f7c96SJohn Baldwin void	nvmft_dispatch_command(struct nvmft_qpair *qp,
112a15f7c96SJohn Baldwin     struct nvmf_capsule *nc, bool admin);
113a15f7c96SJohn Baldwin void	nvmft_terminate_commands(struct nvmft_controller *ctrlr);
1141b3fa1acSJohn Baldwin void	nvmft_abort_datamove(union ctl_io *io);
1151b3fa1acSJohn Baldwin void	nvmft_handle_datamove(union ctl_io *io);
1161b3fa1acSJohn Baldwin void	nvmft_drain_task(struct task *task);
1171b3fa1acSJohn Baldwin void	nvmft_enqueue_task(struct task *task);
118a15f7c96SJohn Baldwin 
119a15f7c96SJohn Baldwin /* nvmft_controller.c */
120a15f7c96SJohn Baldwin void	nvmft_controller_error(struct nvmft_controller *ctrlr,
121a15f7c96SJohn Baldwin     struct nvmft_qpair *qp, int error);
122a15f7c96SJohn Baldwin void	nvmft_controller_lun_changed(struct nvmft_controller *ctrlr,
123a15f7c96SJohn Baldwin     int lun_id);
124a15f7c96SJohn Baldwin void	nvmft_handle_admin_command(struct nvmft_controller *ctrlr,
125a15f7c96SJohn Baldwin     struct nvmf_capsule *nc);
126a15f7c96SJohn Baldwin void	nvmft_handle_io_command(struct nvmft_qpair *qp, uint16_t qid,
127a15f7c96SJohn Baldwin     struct nvmf_capsule *nc);
128a15f7c96SJohn Baldwin int	nvmft_handoff_admin_queue(struct nvmft_port *np,
129*365b89e8SJohn Baldwin     enum nvmf_trtype trtype, const nvlist_t *params,
130a15f7c96SJohn Baldwin     const struct nvmf_fabric_connect_cmd *cmd,
131a15f7c96SJohn Baldwin     const struct nvmf_fabric_connect_data *data);
132*365b89e8SJohn Baldwin int	nvmft_handoff_io_queue(struct nvmft_port *np, enum nvmf_trtype trtype,
133*365b89e8SJohn Baldwin     const nvlist_t *params, const struct nvmf_fabric_connect_cmd *cmd,
134a15f7c96SJohn Baldwin     const struct nvmf_fabric_connect_data *data);
135a15f7c96SJohn Baldwin int	nvmft_printf(struct nvmft_controller *ctrlr, const char *fmt, ...)
136a15f7c96SJohn Baldwin     __printflike(2, 3);
137a15f7c96SJohn Baldwin 
138a15f7c96SJohn Baldwin /* nvmft_qpair.c */
139a15f7c96SJohn Baldwin struct nvmft_qpair *nvmft_qpair_init(enum nvmf_trtype trtype,
140*365b89e8SJohn Baldwin     const nvlist_t *params, uint16_t qid, const char *name);
141a15f7c96SJohn Baldwin void	nvmft_qpair_shutdown(struct nvmft_qpair *qp);
142a15f7c96SJohn Baldwin void	nvmft_qpair_destroy(struct nvmft_qpair *qp);
143a15f7c96SJohn Baldwin struct nvmft_controller *nvmft_qpair_ctrlr(struct nvmft_qpair *qp);
1441b3fa1acSJohn Baldwin void	nvmft_qpair_datamove(struct nvmft_qpair *qp, union ctl_io *io);
145a15f7c96SJohn Baldwin uint16_t nvmft_qpair_id(struct nvmft_qpair *qp);
146a15f7c96SJohn Baldwin const char *nvmft_qpair_name(struct nvmft_qpair *qp);
147a15f7c96SJohn Baldwin void	nvmft_command_completed(struct nvmft_qpair *qp,
148a15f7c96SJohn Baldwin     struct nvmf_capsule *nc);
149a15f7c96SJohn Baldwin int	nvmft_send_response(struct nvmft_qpair *qp, const void *cqe);
150a15f7c96SJohn Baldwin void	nvmft_init_cqe(void *cqe, struct nvmf_capsule *nc, uint16_t status);
151a15f7c96SJohn Baldwin int	nvmft_send_error(struct nvmft_qpair *qp, struct nvmf_capsule *nc,
152a15f7c96SJohn Baldwin     uint8_t sc_type, uint8_t sc_status);
153a15f7c96SJohn Baldwin int	nvmft_send_generic_error(struct nvmft_qpair *qp,
154a15f7c96SJohn Baldwin     struct nvmf_capsule *nc, uint8_t sc_status);
155a15f7c96SJohn Baldwin int	nvmft_send_success(struct nvmft_qpair *qp,
156a15f7c96SJohn Baldwin     struct nvmf_capsule *nc);
157a15f7c96SJohn Baldwin void	nvmft_connect_error(struct nvmft_qpair *qp,
158a15f7c96SJohn Baldwin     const struct nvmf_fabric_connect_cmd *cmd, uint8_t sc_type,
159a15f7c96SJohn Baldwin     uint8_t sc_status);
160a15f7c96SJohn Baldwin void	nvmft_connect_invalid_parameters(struct nvmft_qpair *qp,
161a15f7c96SJohn Baldwin     const struct nvmf_fabric_connect_cmd *cmd, bool data, uint16_t offset);
162a15f7c96SJohn Baldwin int	nvmft_finish_accept(struct nvmft_qpair *qp,
163a15f7c96SJohn Baldwin     const struct nvmf_fabric_connect_cmd *cmd, struct nvmft_controller *ctrlr);
164a15f7c96SJohn Baldwin 
165a15f7c96SJohn Baldwin static __inline void
166a15f7c96SJohn Baldwin nvmft_port_ref(struct nvmft_port *np)
167a15f7c96SJohn Baldwin {
168a15f7c96SJohn Baldwin 	refcount_acquire(&np->refs);
169a15f7c96SJohn Baldwin }
170a15f7c96SJohn Baldwin 
171a15f7c96SJohn Baldwin static __inline void
172a15f7c96SJohn Baldwin nvmft_port_rele(struct nvmft_port *np)
173a15f7c96SJohn Baldwin {
174a15f7c96SJohn Baldwin 	if (refcount_release(&np->refs))
175a15f7c96SJohn Baldwin 		nvmft_port_free(np);
176a15f7c96SJohn Baldwin }
177a15f7c96SJohn Baldwin 
178a15f7c96SJohn Baldwin #endif	/* !__NVMFT_VAR_H__ */
179