• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Copyright (c) 2021, HiSilicon Ltd.
4  */
5 
6 #include <linux/device.h>
7 #include <linux/eventfd.h>
8 #include <linux/file.h>
9 #include <linux/hisi_acc_qm.h>
10 #include <linux/interrupt.h>
11 #include <linux/module.h>
12 #include <linux/pci.h>
13 #include <linux/vfio.h>
14 #include <linux/vfio_pci_core.h>
15 #include <linux/anon_inodes.h>
16 
17 #include "hisi_acc_vfio_pci.h"
18 
19 /* Return 0 on VM acc device ready, -ETIMEDOUT hardware timeout */
qm_wait_dev_not_ready(struct hisi_qm * qm)20 static int qm_wait_dev_not_ready(struct hisi_qm *qm)
21 {
22 	u32 val;
23 
24 	return readl_relaxed_poll_timeout(qm->io_base + QM_VF_STATE,
25 				val, !(val & 0x1), MB_POLL_PERIOD_US,
26 				MB_POLL_TIMEOUT_US);
27 }
28 
29 /*
30  * Each state Reg is checked 100 times,
31  * with a delay of 100 microseconds after each check
32  */
qm_check_reg_state(struct hisi_qm * qm,u32 regs)33 static u32 qm_check_reg_state(struct hisi_qm *qm, u32 regs)
34 {
35 	int check_times = 0;
36 	u32 state;
37 
38 	state = readl(qm->io_base + regs);
39 	while (state && check_times < ERROR_CHECK_TIMEOUT) {
40 		udelay(CHECK_DELAY_TIME);
41 		state = readl(qm->io_base + regs);
42 		check_times++;
43 	}
44 
45 	return state;
46 }
47 
qm_read_regs(struct hisi_qm * qm,u32 reg_addr,u32 * data,u8 nums)48 static int qm_read_regs(struct hisi_qm *qm, u32 reg_addr,
49 			u32 *data, u8 nums)
50 {
51 	int i;
52 
53 	if (nums < 1 || nums > QM_REGS_MAX_LEN)
54 		return -EINVAL;
55 
56 	for (i = 0; i < nums; i++) {
57 		data[i] = readl(qm->io_base + reg_addr);
58 		reg_addr += QM_REG_ADDR_OFFSET;
59 	}
60 
61 	return 0;
62 }
63 
qm_write_regs(struct hisi_qm * qm,u32 reg,u32 * data,u8 nums)64 static int qm_write_regs(struct hisi_qm *qm, u32 reg,
65 			 u32 *data, u8 nums)
66 {
67 	int i;
68 
69 	if (nums < 1 || nums > QM_REGS_MAX_LEN)
70 		return -EINVAL;
71 
72 	for (i = 0; i < nums; i++)
73 		writel(data[i], qm->io_base + reg + i * QM_REG_ADDR_OFFSET);
74 
75 	return 0;
76 }
77 
qm_get_vft(struct hisi_qm * qm,u32 * base)78 static int qm_get_vft(struct hisi_qm *qm, u32 *base)
79 {
80 	u64 sqc_vft;
81 	u32 qp_num;
82 	int ret;
83 
84 	ret = hisi_qm_mb(qm, QM_MB_CMD_SQC_VFT_V2, 0, 0, 1);
85 	if (ret)
86 		return ret;
87 
88 	sqc_vft = readl(qm->io_base + QM_MB_CMD_DATA_ADDR_L) |
89 		  ((u64)readl(qm->io_base + QM_MB_CMD_DATA_ADDR_H) <<
90 		  QM_XQC_ADDR_OFFSET);
91 	*base = QM_SQC_VFT_BASE_MASK_V2 & (sqc_vft >> QM_SQC_VFT_BASE_SHIFT_V2);
92 	qp_num = (QM_SQC_VFT_NUM_MASK_V2 &
93 		  (sqc_vft >> QM_SQC_VFT_NUM_SHIFT_V2)) + 1;
94 
95 	return qp_num;
96 }
97 
qm_get_sqc(struct hisi_qm * qm,u64 * addr)98 static int qm_get_sqc(struct hisi_qm *qm, u64 *addr)
99 {
100 	int ret;
101 
102 	ret = hisi_qm_mb(qm, QM_MB_CMD_SQC_BT, 0, 0, 1);
103 	if (ret)
104 		return ret;
105 
106 	*addr = readl(qm->io_base + QM_MB_CMD_DATA_ADDR_L) |
107 		  ((u64)readl(qm->io_base + QM_MB_CMD_DATA_ADDR_H) <<
108 		  QM_XQC_ADDR_OFFSET);
109 
110 	return 0;
111 }
112 
qm_get_cqc(struct hisi_qm * qm,u64 * addr)113 static int qm_get_cqc(struct hisi_qm *qm, u64 *addr)
114 {
115 	int ret;
116 
117 	ret = hisi_qm_mb(qm, QM_MB_CMD_CQC_BT, 0, 0, 1);
118 	if (ret)
119 		return ret;
120 
121 	*addr = readl(qm->io_base + QM_MB_CMD_DATA_ADDR_L) |
122 		  ((u64)readl(qm->io_base + QM_MB_CMD_DATA_ADDR_H) <<
123 		  QM_XQC_ADDR_OFFSET);
124 
125 	return 0;
126 }
127 
qm_get_regs(struct hisi_qm * qm,struct acc_vf_data * vf_data)128 static int qm_get_regs(struct hisi_qm *qm, struct acc_vf_data *vf_data)
129 {
130 	struct device *dev = &qm->pdev->dev;
131 	int ret;
132 
133 	ret = qm_read_regs(qm, QM_VF_AEQ_INT_MASK, &vf_data->aeq_int_mask, 1);
134 	if (ret) {
135 		dev_err(dev, "failed to read QM_VF_AEQ_INT_MASK\n");
136 		return ret;
137 	}
138 
139 	ret = qm_read_regs(qm, QM_VF_EQ_INT_MASK, &vf_data->eq_int_mask, 1);
140 	if (ret) {
141 		dev_err(dev, "failed to read QM_VF_EQ_INT_MASK\n");
142 		return ret;
143 	}
144 
145 	ret = qm_read_regs(qm, QM_IFC_INT_SOURCE_V,
146 			   &vf_data->ifc_int_source, 1);
147 	if (ret) {
148 		dev_err(dev, "failed to read QM_IFC_INT_SOURCE_V\n");
149 		return ret;
150 	}
151 
152 	ret = qm_read_regs(qm, QM_IFC_INT_MASK, &vf_data->ifc_int_mask, 1);
153 	if (ret) {
154 		dev_err(dev, "failed to read QM_IFC_INT_MASK\n");
155 		return ret;
156 	}
157 
158 	ret = qm_read_regs(qm, QM_IFC_INT_SET_V, &vf_data->ifc_int_set, 1);
159 	if (ret) {
160 		dev_err(dev, "failed to read QM_IFC_INT_SET_V\n");
161 		return ret;
162 	}
163 
164 	ret = qm_read_regs(qm, QM_PAGE_SIZE, &vf_data->page_size, 1);
165 	if (ret) {
166 		dev_err(dev, "failed to read QM_PAGE_SIZE\n");
167 		return ret;
168 	}
169 
170 	/* QM_EQC_DW has 7 regs */
171 	ret = qm_read_regs(qm, QM_EQC_DW0, vf_data->qm_eqc_dw, 7);
172 	if (ret) {
173 		dev_err(dev, "failed to read QM_EQC_DW\n");
174 		return ret;
175 	}
176 
177 	/* QM_AEQC_DW has 7 regs */
178 	ret = qm_read_regs(qm, QM_AEQC_DW0, vf_data->qm_aeqc_dw, 7);
179 	if (ret) {
180 		dev_err(dev, "failed to read QM_AEQC_DW\n");
181 		return ret;
182 	}
183 
184 	return 0;
185 }
186 
qm_set_regs(struct hisi_qm * qm,struct acc_vf_data * vf_data)187 static int qm_set_regs(struct hisi_qm *qm, struct acc_vf_data *vf_data)
188 {
189 	struct device *dev = &qm->pdev->dev;
190 	int ret;
191 
192 	/* Check VF state */
193 	if (unlikely(hisi_qm_wait_mb_ready(qm))) {
194 		dev_err(&qm->pdev->dev, "QM device is not ready to write\n");
195 		return -EBUSY;
196 	}
197 
198 	ret = qm_write_regs(qm, QM_VF_AEQ_INT_MASK, &vf_data->aeq_int_mask, 1);
199 	if (ret) {
200 		dev_err(dev, "failed to write QM_VF_AEQ_INT_MASK\n");
201 		return ret;
202 	}
203 
204 	ret = qm_write_regs(qm, QM_VF_EQ_INT_MASK, &vf_data->eq_int_mask, 1);
205 	if (ret) {
206 		dev_err(dev, "failed to write QM_VF_EQ_INT_MASK\n");
207 		return ret;
208 	}
209 
210 	ret = qm_write_regs(qm, QM_IFC_INT_SOURCE_V,
211 			    &vf_data->ifc_int_source, 1);
212 	if (ret) {
213 		dev_err(dev, "failed to write QM_IFC_INT_SOURCE_V\n");
214 		return ret;
215 	}
216 
217 	ret = qm_write_regs(qm, QM_IFC_INT_MASK, &vf_data->ifc_int_mask, 1);
218 	if (ret) {
219 		dev_err(dev, "failed to write QM_IFC_INT_MASK\n");
220 		return ret;
221 	}
222 
223 	ret = qm_write_regs(qm, QM_IFC_INT_SET_V, &vf_data->ifc_int_set, 1);
224 	if (ret) {
225 		dev_err(dev, "failed to write QM_IFC_INT_SET_V\n");
226 		return ret;
227 	}
228 
229 	ret = qm_write_regs(qm, QM_QUE_ISO_CFG_V, &vf_data->que_iso_cfg, 1);
230 	if (ret) {
231 		dev_err(dev, "failed to write QM_QUE_ISO_CFG_V\n");
232 		return ret;
233 	}
234 
235 	ret = qm_write_regs(qm, QM_PAGE_SIZE, &vf_data->page_size, 1);
236 	if (ret) {
237 		dev_err(dev, "failed to write QM_PAGE_SIZE\n");
238 		return ret;
239 	}
240 
241 	/* QM_EQC_DW has 7 regs */
242 	ret = qm_write_regs(qm, QM_EQC_DW0, vf_data->qm_eqc_dw, 7);
243 	if (ret) {
244 		dev_err(dev, "failed to write QM_EQC_DW\n");
245 		return ret;
246 	}
247 
248 	/* QM_AEQC_DW has 7 regs */
249 	ret = qm_write_regs(qm, QM_AEQC_DW0, vf_data->qm_aeqc_dw, 7);
250 	if (ret) {
251 		dev_err(dev, "failed to write QM_AEQC_DW\n");
252 		return ret;
253 	}
254 
255 	return 0;
256 }
257 
qm_db(struct hisi_qm * qm,u16 qn,u8 cmd,u16 index,u8 priority)258 static void qm_db(struct hisi_qm *qm, u16 qn, u8 cmd,
259 		  u16 index, u8 priority)
260 {
261 	u64 doorbell;
262 	u64 dbase;
263 	u16 randata = 0;
264 
265 	if (cmd == QM_DOORBELL_CMD_SQ || cmd == QM_DOORBELL_CMD_CQ)
266 		dbase = QM_DOORBELL_SQ_CQ_BASE_V2;
267 	else
268 		dbase = QM_DOORBELL_EQ_AEQ_BASE_V2;
269 
270 	doorbell = qn | ((u64)cmd << QM_DB_CMD_SHIFT_V2) |
271 		   ((u64)randata << QM_DB_RAND_SHIFT_V2) |
272 		   ((u64)index << QM_DB_INDEX_SHIFT_V2)	 |
273 		   ((u64)priority << QM_DB_PRIORITY_SHIFT_V2);
274 
275 	writeq(doorbell, qm->io_base + dbase);
276 }
277 
pf_qm_get_qp_num(struct hisi_qm * qm,int vf_id,u32 * rbase)278 static int pf_qm_get_qp_num(struct hisi_qm *qm, int vf_id, u32 *rbase)
279 {
280 	unsigned int val;
281 	u64 sqc_vft;
282 	u32 qp_num;
283 	int ret;
284 
285 	ret = readl_relaxed_poll_timeout(qm->io_base + QM_VFT_CFG_RDY, val,
286 					 val & BIT(0), MB_POLL_PERIOD_US,
287 					 MB_POLL_TIMEOUT_US);
288 	if (ret)
289 		return ret;
290 
291 	writel(0x1, qm->io_base + QM_VFT_CFG_OP_WR);
292 	/* 0 mean SQC VFT */
293 	writel(0x0, qm->io_base + QM_VFT_CFG_TYPE);
294 	writel(vf_id, qm->io_base + QM_VFT_CFG);
295 
296 	writel(0x0, qm->io_base + QM_VFT_CFG_RDY);
297 	writel(0x1, qm->io_base + QM_VFT_CFG_OP_ENABLE);
298 
299 	ret = readl_relaxed_poll_timeout(qm->io_base + QM_VFT_CFG_RDY, val,
300 					 val & BIT(0), MB_POLL_PERIOD_US,
301 					 MB_POLL_TIMEOUT_US);
302 	if (ret)
303 		return ret;
304 
305 	sqc_vft = readl(qm->io_base + QM_VFT_CFG_DATA_L) |
306 		  ((u64)readl(qm->io_base + QM_VFT_CFG_DATA_H) <<
307 		  QM_XQC_ADDR_OFFSET);
308 	*rbase = QM_SQC_VFT_BASE_MASK_V2 &
309 		  (sqc_vft >> QM_SQC_VFT_BASE_SHIFT_V2);
310 	qp_num = (QM_SQC_VFT_NUM_MASK_V2 &
311 		  (sqc_vft >> QM_SQC_VFT_NUM_SHIFT_V2)) + 1;
312 
313 	return qp_num;
314 }
315 
qm_dev_cmd_init(struct hisi_qm * qm)316 static void qm_dev_cmd_init(struct hisi_qm *qm)
317 {
318 	/* Clear VF communication status registers. */
319 	writel(0x1, qm->io_base + QM_IFC_INT_SOURCE_V);
320 
321 	/* Enable pf and vf communication. */
322 	writel(0x0, qm->io_base + QM_IFC_INT_MASK);
323 }
324 
vf_qm_cache_wb(struct hisi_qm * qm)325 static int vf_qm_cache_wb(struct hisi_qm *qm)
326 {
327 	unsigned int val;
328 
329 	writel(0x1, qm->io_base + QM_CACHE_WB_START);
330 	if (readl_relaxed_poll_timeout(qm->io_base + QM_CACHE_WB_DONE,
331 				       val, val & BIT(0), MB_POLL_PERIOD_US,
332 				       MB_POLL_TIMEOUT_US)) {
333 		dev_err(&qm->pdev->dev, "vf QM writeback sqc cache fail\n");
334 		return -EINVAL;
335 	}
336 
337 	return 0;
338 }
339 
vf_qm_fun_reset(struct hisi_qm * qm)340 static void vf_qm_fun_reset(struct hisi_qm *qm)
341 {
342 	int i;
343 
344 	for (i = 0; i < qm->qp_num; i++)
345 		qm_db(qm, i, QM_DOORBELL_CMD_SQ, 0, 1);
346 }
347 
vf_qm_func_stop(struct hisi_qm * qm)348 static int vf_qm_func_stop(struct hisi_qm *qm)
349 {
350 	return hisi_qm_mb(qm, QM_MB_CMD_PAUSE_QM, 0, 0, 0);
351 }
352 
vf_qm_version_check(struct acc_vf_data * vf_data,struct device * dev)353 static int vf_qm_version_check(struct acc_vf_data *vf_data, struct device *dev)
354 {
355 	switch (vf_data->acc_magic) {
356 	case ACC_DEV_MAGIC_V2:
357 		if (vf_data->major_ver != ACC_DRV_MAJOR_VER) {
358 			dev_info(dev, "migration driver version<%u.%u> not match!\n",
359 				 vf_data->major_ver, vf_data->minor_ver);
360 			return -EINVAL;
361 		}
362 		break;
363 	case ACC_DEV_MAGIC_V1:
364 		/* Correct dma address */
365 		vf_data->eqe_dma = vf_data->qm_eqc_dw[QM_XQC_ADDR_HIGH];
366 		vf_data->eqe_dma <<= QM_XQC_ADDR_OFFSET;
367 		vf_data->eqe_dma |= vf_data->qm_eqc_dw[QM_XQC_ADDR_LOW];
368 		vf_data->aeqe_dma = vf_data->qm_aeqc_dw[QM_XQC_ADDR_HIGH];
369 		vf_data->aeqe_dma <<= QM_XQC_ADDR_OFFSET;
370 		vf_data->aeqe_dma |= vf_data->qm_aeqc_dw[QM_XQC_ADDR_LOW];
371 		break;
372 	default:
373 		return -EINVAL;
374 	}
375 
376 	return 0;
377 }
378 
vf_qm_check_match(struct hisi_acc_vf_core_device * hisi_acc_vdev,struct hisi_acc_vf_migration_file * migf)379 static int vf_qm_check_match(struct hisi_acc_vf_core_device *hisi_acc_vdev,
380 			     struct hisi_acc_vf_migration_file *migf)
381 {
382 	struct acc_vf_data *vf_data = &migf->vf_data;
383 	struct hisi_qm *vf_qm = &hisi_acc_vdev->vf_qm;
384 	struct hisi_qm *pf_qm = hisi_acc_vdev->pf_qm;
385 	struct device *dev = &vf_qm->pdev->dev;
386 	u32 que_iso_state;
387 	int ret;
388 
389 	if (migf->total_length < QM_MATCH_SIZE || hisi_acc_vdev->match_done)
390 		return 0;
391 
392 	ret = vf_qm_version_check(vf_data, dev);
393 	if (ret) {
394 		dev_err(dev, "failed to match ACC_DEV_MAGIC\n");
395 		return -EINVAL;
396 	}
397 
398 	if (vf_data->dev_id != hisi_acc_vdev->vf_dev->device) {
399 		dev_err(dev, "failed to match VF devices\n");
400 		return -EINVAL;
401 	}
402 
403 	/* VF qp num check */
404 	ret = qm_get_vft(vf_qm, &vf_qm->qp_base);
405 	if (ret <= 0) {
406 		dev_err(dev, "failed to get vft qp nums\n");
407 		return -EINVAL;
408 	}
409 
410 	if (ret != vf_data->qp_num) {
411 		dev_err(dev, "failed to match VF qp num\n");
412 		return -EINVAL;
413 	}
414 
415 	vf_qm->qp_num = ret;
416 
417 	/* VF isolation state check */
418 	ret = qm_read_regs(pf_qm, QM_QUE_ISO_CFG_V, &que_iso_state, 1);
419 	if (ret) {
420 		dev_err(dev, "failed to read QM_QUE_ISO_CFG_V\n");
421 		return ret;
422 	}
423 
424 	if (vf_data->que_iso_cfg != que_iso_state) {
425 		dev_err(dev, "failed to match isolation state\n");
426 		return -EINVAL;
427 	}
428 
429 	hisi_acc_vdev->match_done = true;
430 	return 0;
431 }
432 
vf_qm_get_match_data(struct hisi_acc_vf_core_device * hisi_acc_vdev,struct acc_vf_data * vf_data)433 static int vf_qm_get_match_data(struct hisi_acc_vf_core_device *hisi_acc_vdev,
434 				struct acc_vf_data *vf_data)
435 {
436 	struct hisi_qm *pf_qm = hisi_acc_vdev->pf_qm;
437 	struct device *dev = &pf_qm->pdev->dev;
438 	int vf_id = hisi_acc_vdev->vf_id;
439 	int ret;
440 
441 	vf_data->acc_magic = ACC_DEV_MAGIC_V2;
442 	vf_data->major_ver = ACC_DRV_MAJOR_VER;
443 	vf_data->minor_ver = ACC_DRV_MINOR_VER;
444 	/* Save device id */
445 	vf_data->dev_id = hisi_acc_vdev->vf_dev->device;
446 
447 	/* VF qp num save from PF */
448 	ret = pf_qm_get_qp_num(pf_qm, vf_id, &vf_data->qp_base);
449 	if (ret <= 0) {
450 		dev_err(dev, "failed to get vft qp nums!\n");
451 		return -EINVAL;
452 	}
453 
454 	vf_data->qp_num = ret;
455 
456 	/* VF isolation state save from PF */
457 	ret = qm_read_regs(pf_qm, QM_QUE_ISO_CFG_V, &vf_data->que_iso_cfg, 1);
458 	if (ret) {
459 		dev_err(dev, "failed to read QM_QUE_ISO_CFG_V!\n");
460 		return ret;
461 	}
462 
463 	return 0;
464 }
465 
vf_qm_xeqc_save(struct hisi_qm * qm,struct hisi_acc_vf_migration_file * migf)466 static void vf_qm_xeqc_save(struct hisi_qm *qm,
467 			    struct hisi_acc_vf_migration_file *migf)
468 {
469 	struct acc_vf_data *vf_data = &migf->vf_data;
470 	u16 eq_head, aeq_head;
471 
472 	eq_head = vf_data->qm_eqc_dw[0] & 0xFFFF;
473 	qm_db(qm, 0, QM_DOORBELL_CMD_EQ, eq_head, 0);
474 
475 	aeq_head = vf_data->qm_aeqc_dw[0] & 0xFFFF;
476 	qm_db(qm, 0, QM_DOORBELL_CMD_AEQ, aeq_head, 0);
477 }
478 
vf_qm_load_data(struct hisi_acc_vf_core_device * hisi_acc_vdev,struct hisi_acc_vf_migration_file * migf)479 static int vf_qm_load_data(struct hisi_acc_vf_core_device *hisi_acc_vdev,
480 			   struct hisi_acc_vf_migration_file *migf)
481 {
482 	struct hisi_qm *qm = &hisi_acc_vdev->vf_qm;
483 	struct device *dev = &qm->pdev->dev;
484 	struct acc_vf_data *vf_data = &migf->vf_data;
485 	int ret;
486 
487 	/* Return if only match data was transferred */
488 	if (migf->total_length == QM_MATCH_SIZE)
489 		return 0;
490 
491 	if (migf->total_length < sizeof(struct acc_vf_data))
492 		return -EINVAL;
493 
494 	if (!vf_data->eqe_dma || !vf_data->aeqe_dma ||
495 	    !vf_data->sqc_dma || !vf_data->cqc_dma) {
496 		dev_info(dev, "resume dma addr is NULL!\n");
497 		hisi_acc_vdev->vf_qm_state = QM_NOT_READY;
498 		return 0;
499 	}
500 
501 	ret = qm_write_regs(qm, QM_VF_STATE, &vf_data->vf_qm_state, 1);
502 	if (ret) {
503 		dev_err(dev, "failed to write QM_VF_STATE\n");
504 		return -EINVAL;
505 	}
506 	hisi_acc_vdev->vf_qm_state = vf_data->vf_qm_state;
507 
508 	qm->eqe_dma = vf_data->eqe_dma;
509 	qm->aeqe_dma = vf_data->aeqe_dma;
510 	qm->sqc_dma = vf_data->sqc_dma;
511 	qm->cqc_dma = vf_data->cqc_dma;
512 
513 	qm->qp_base = vf_data->qp_base;
514 	qm->qp_num = vf_data->qp_num;
515 
516 	ret = qm_set_regs(qm, vf_data);
517 	if (ret) {
518 		dev_err(dev, "set VF regs failed\n");
519 		return ret;
520 	}
521 
522 	ret = hisi_qm_mb(qm, QM_MB_CMD_SQC_BT, qm->sqc_dma, 0, 0);
523 	if (ret) {
524 		dev_err(dev, "set sqc failed\n");
525 		return ret;
526 	}
527 
528 	ret = hisi_qm_mb(qm, QM_MB_CMD_CQC_BT, qm->cqc_dma, 0, 0);
529 	if (ret) {
530 		dev_err(dev, "set cqc failed\n");
531 		return ret;
532 	}
533 
534 	qm_dev_cmd_init(qm);
535 	return 0;
536 }
537 
vf_qm_state_save(struct hisi_acc_vf_core_device * hisi_acc_vdev,struct hisi_acc_vf_migration_file * migf)538 static int vf_qm_state_save(struct hisi_acc_vf_core_device *hisi_acc_vdev,
539 			    struct hisi_acc_vf_migration_file *migf)
540 {
541 	struct acc_vf_data *vf_data = &migf->vf_data;
542 	struct hisi_qm *vf_qm = &hisi_acc_vdev->vf_qm;
543 	struct device *dev = &vf_qm->pdev->dev;
544 	int ret;
545 
546 	if (unlikely(qm_wait_dev_not_ready(vf_qm))) {
547 		/* Update state and return with match data */
548 		vf_data->vf_qm_state = QM_NOT_READY;
549 		hisi_acc_vdev->vf_qm_state = vf_data->vf_qm_state;
550 		migf->total_length = QM_MATCH_SIZE;
551 		return 0;
552 	}
553 
554 	vf_data->vf_qm_state = QM_READY;
555 	hisi_acc_vdev->vf_qm_state = vf_data->vf_qm_state;
556 
557 	ret = qm_get_regs(vf_qm, vf_data);
558 	if (ret)
559 		return -EINVAL;
560 
561 	/* Every reg is 32 bit, the dma address is 64 bit. */
562 	vf_data->eqe_dma = vf_data->qm_eqc_dw[QM_XQC_ADDR_HIGH];
563 	vf_data->eqe_dma <<= QM_XQC_ADDR_OFFSET;
564 	vf_data->eqe_dma |= vf_data->qm_eqc_dw[QM_XQC_ADDR_LOW];
565 	vf_data->aeqe_dma = vf_data->qm_aeqc_dw[QM_XQC_ADDR_HIGH];
566 	vf_data->aeqe_dma <<= QM_XQC_ADDR_OFFSET;
567 	vf_data->aeqe_dma |= vf_data->qm_aeqc_dw[QM_XQC_ADDR_LOW];
568 
569 	/* Through SQC_BT/CQC_BT to get sqc and cqc address */
570 	ret = qm_get_sqc(vf_qm, &vf_data->sqc_dma);
571 	if (ret) {
572 		dev_err(dev, "failed to read SQC addr!\n");
573 		return -EINVAL;
574 	}
575 
576 	ret = qm_get_cqc(vf_qm, &vf_data->cqc_dma);
577 	if (ret) {
578 		dev_err(dev, "failed to read CQC addr!\n");
579 		return -EINVAL;
580 	}
581 
582 	migf->total_length = sizeof(struct acc_vf_data);
583 	/* Save eqc and aeqc interrupt information */
584 	vf_qm_xeqc_save(vf_qm, migf);
585 
586 	return 0;
587 }
588 
hisi_acc_drvdata(struct pci_dev * pdev)589 static struct hisi_acc_vf_core_device *hisi_acc_drvdata(struct pci_dev *pdev)
590 {
591 	struct vfio_pci_core_device *core_device = dev_get_drvdata(&pdev->dev);
592 
593 	return container_of(core_device, struct hisi_acc_vf_core_device,
594 			    core_device);
595 }
596 
597 /* Check the PF's RAS state and Function INT state */
598 static int
hisi_acc_check_int_state(struct hisi_acc_vf_core_device * hisi_acc_vdev)599 hisi_acc_check_int_state(struct hisi_acc_vf_core_device *hisi_acc_vdev)
600 {
601 	struct hisi_qm *vfqm = &hisi_acc_vdev->vf_qm;
602 	struct hisi_qm *qm = hisi_acc_vdev->pf_qm;
603 	struct pci_dev *vf_pdev = hisi_acc_vdev->vf_dev;
604 	struct device *dev = &qm->pdev->dev;
605 	u32 state;
606 
607 	/* Check RAS state */
608 	state = qm_check_reg_state(qm, QM_ABNORMAL_INT_STATUS);
609 	if (state) {
610 		dev_err(dev, "failed to check QM RAS state!\n");
611 		return -EBUSY;
612 	}
613 
614 	/* Check Function Communication state between PF and VF */
615 	state = qm_check_reg_state(vfqm, QM_IFC_INT_STATUS);
616 	if (state) {
617 		dev_err(dev, "failed to check QM IFC INT state!\n");
618 		return -EBUSY;
619 	}
620 	state = qm_check_reg_state(vfqm, QM_IFC_INT_SET_V);
621 	if (state) {
622 		dev_err(dev, "failed to check QM IFC INT SET state!\n");
623 		return -EBUSY;
624 	}
625 
626 	/* Check submodule task state */
627 	switch (vf_pdev->device) {
628 	case PCI_DEVICE_ID_HUAWEI_SEC_VF:
629 		state = qm_check_reg_state(qm, SEC_CORE_INT_STATUS);
630 		if (state) {
631 			dev_err(dev, "failed to check QM SEC Core INT state!\n");
632 			return -EBUSY;
633 		}
634 		return 0;
635 	case PCI_DEVICE_ID_HUAWEI_HPRE_VF:
636 		state = qm_check_reg_state(qm, HPRE_HAC_INT_STATUS);
637 		if (state) {
638 			dev_err(dev, "failed to check QM HPRE HAC INT state!\n");
639 			return -EBUSY;
640 		}
641 		return 0;
642 	case PCI_DEVICE_ID_HUAWEI_ZIP_VF:
643 		state = qm_check_reg_state(qm, HZIP_CORE_INT_STATUS);
644 		if (state) {
645 			dev_err(dev, "failed to check QM ZIP Core INT state!\n");
646 			return -EBUSY;
647 		}
648 		return 0;
649 	default:
650 		dev_err(dev, "failed to detect acc module type!\n");
651 		return -EINVAL;
652 	}
653 }
654 
hisi_acc_vf_disable_fd(struct hisi_acc_vf_migration_file * migf)655 static void hisi_acc_vf_disable_fd(struct hisi_acc_vf_migration_file *migf)
656 {
657 	mutex_lock(&migf->lock);
658 	migf->disabled = true;
659 	migf->total_length = 0;
660 	migf->filp->f_pos = 0;
661 	mutex_unlock(&migf->lock);
662 }
663 
hisi_acc_vf_disable_fds(struct hisi_acc_vf_core_device * hisi_acc_vdev)664 static void hisi_acc_vf_disable_fds(struct hisi_acc_vf_core_device *hisi_acc_vdev)
665 {
666 	if (hisi_acc_vdev->resuming_migf) {
667 		hisi_acc_vf_disable_fd(hisi_acc_vdev->resuming_migf);
668 		fput(hisi_acc_vdev->resuming_migf->filp);
669 		hisi_acc_vdev->resuming_migf = NULL;
670 	}
671 
672 	if (hisi_acc_vdev->saving_migf) {
673 		hisi_acc_vf_disable_fd(hisi_acc_vdev->saving_migf);
674 		fput(hisi_acc_vdev->saving_migf->filp);
675 		hisi_acc_vdev->saving_migf = NULL;
676 	}
677 }
678 
hisi_acc_vf_reset(struct hisi_acc_vf_core_device * hisi_acc_vdev)679 static void hisi_acc_vf_reset(struct hisi_acc_vf_core_device *hisi_acc_vdev)
680 {
681 	hisi_acc_vdev->vf_qm_state = QM_NOT_READY;
682 	hisi_acc_vdev->mig_state = VFIO_DEVICE_STATE_RUNNING;
683 	hisi_acc_vf_disable_fds(hisi_acc_vdev);
684 }
685 
hisi_acc_vf_start_device(struct hisi_acc_vf_core_device * hisi_acc_vdev)686 static void hisi_acc_vf_start_device(struct hisi_acc_vf_core_device *hisi_acc_vdev)
687 {
688 	struct hisi_qm *vf_qm = &hisi_acc_vdev->vf_qm;
689 
690 	if (hisi_acc_vdev->vf_qm_state != QM_READY)
691 		return;
692 
693 	/* Make sure the device is enabled */
694 	qm_dev_cmd_init(vf_qm);
695 
696 	vf_qm_fun_reset(vf_qm);
697 }
698 
hisi_acc_vf_load_state(struct hisi_acc_vf_core_device * hisi_acc_vdev)699 static int hisi_acc_vf_load_state(struct hisi_acc_vf_core_device *hisi_acc_vdev)
700 {
701 	struct device *dev = &hisi_acc_vdev->vf_dev->dev;
702 	struct hisi_acc_vf_migration_file *migf = hisi_acc_vdev->resuming_migf;
703 	int ret;
704 
705 	/* Recover data to VF */
706 	ret = vf_qm_load_data(hisi_acc_vdev, migf);
707 	if (ret) {
708 		dev_err(dev, "failed to recover the VF!\n");
709 		return ret;
710 	}
711 
712 	return 0;
713 }
714 
hisi_acc_vf_release_file(struct inode * inode,struct file * filp)715 static int hisi_acc_vf_release_file(struct inode *inode, struct file *filp)
716 {
717 	struct hisi_acc_vf_migration_file *migf = filp->private_data;
718 
719 	hisi_acc_vf_disable_fd(migf);
720 	mutex_destroy(&migf->lock);
721 	kfree(migf);
722 	return 0;
723 }
724 
hisi_acc_vf_resume_write(struct file * filp,const char __user * buf,size_t len,loff_t * pos)725 static ssize_t hisi_acc_vf_resume_write(struct file *filp, const char __user *buf,
726 					size_t len, loff_t *pos)
727 {
728 	struct hisi_acc_vf_migration_file *migf = filp->private_data;
729 	u8 *vf_data = (u8 *)&migf->vf_data;
730 	loff_t requested_length;
731 	ssize_t done = 0;
732 	int ret;
733 
734 	if (pos)
735 		return -ESPIPE;
736 	pos = &filp->f_pos;
737 
738 	if (*pos < 0 ||
739 	    check_add_overflow((loff_t)len, *pos, &requested_length))
740 		return -EINVAL;
741 
742 	if (requested_length > sizeof(struct acc_vf_data))
743 		return -ENOMEM;
744 
745 	mutex_lock(&migf->lock);
746 	if (migf->disabled) {
747 		done = -ENODEV;
748 		goto out_unlock;
749 	}
750 
751 	ret = copy_from_user(vf_data + *pos, buf, len);
752 	if (ret) {
753 		done = -EFAULT;
754 		goto out_unlock;
755 	}
756 	*pos += len;
757 	done = len;
758 	migf->total_length += len;
759 
760 	ret = vf_qm_check_match(migf->hisi_acc_vdev, migf);
761 	if (ret)
762 		done = -EFAULT;
763 out_unlock:
764 	mutex_unlock(&migf->lock);
765 	return done;
766 }
767 
768 static const struct file_operations hisi_acc_vf_resume_fops = {
769 	.owner = THIS_MODULE,
770 	.write = hisi_acc_vf_resume_write,
771 	.release = hisi_acc_vf_release_file,
772 };
773 
774 static struct hisi_acc_vf_migration_file *
hisi_acc_vf_pci_resume(struct hisi_acc_vf_core_device * hisi_acc_vdev)775 hisi_acc_vf_pci_resume(struct hisi_acc_vf_core_device *hisi_acc_vdev)
776 {
777 	struct hisi_acc_vf_migration_file *migf;
778 
779 	migf = kzalloc(sizeof(*migf), GFP_KERNEL_ACCOUNT);
780 	if (!migf)
781 		return ERR_PTR(-ENOMEM);
782 
783 	migf->filp = anon_inode_getfile("hisi_acc_vf_mig", &hisi_acc_vf_resume_fops, migf,
784 					O_WRONLY);
785 	if (IS_ERR(migf->filp)) {
786 		int err = PTR_ERR(migf->filp);
787 
788 		kfree(migf);
789 		return ERR_PTR(err);
790 	}
791 
792 	stream_open(migf->filp->f_inode, migf->filp);
793 	mutex_init(&migf->lock);
794 	migf->hisi_acc_vdev = hisi_acc_vdev;
795 	return migf;
796 }
797 
hisi_acc_vf_precopy_ioctl(struct file * filp,unsigned int cmd,unsigned long arg)798 static long hisi_acc_vf_precopy_ioctl(struct file *filp,
799 				      unsigned int cmd, unsigned long arg)
800 {
801 	struct hisi_acc_vf_migration_file *migf = filp->private_data;
802 	struct hisi_acc_vf_core_device *hisi_acc_vdev = migf->hisi_acc_vdev;
803 	loff_t *pos = &filp->f_pos;
804 	struct vfio_precopy_info info;
805 	unsigned long minsz;
806 	int ret;
807 
808 	if (cmd != VFIO_MIG_GET_PRECOPY_INFO)
809 		return -ENOTTY;
810 
811 	minsz = offsetofend(struct vfio_precopy_info, dirty_bytes);
812 
813 	if (copy_from_user(&info, (void __user *)arg, minsz))
814 		return -EFAULT;
815 	if (info.argsz < minsz)
816 		return -EINVAL;
817 
818 	mutex_lock(&hisi_acc_vdev->state_mutex);
819 	if (hisi_acc_vdev->mig_state != VFIO_DEVICE_STATE_PRE_COPY) {
820 		mutex_unlock(&hisi_acc_vdev->state_mutex);
821 		return -EINVAL;
822 	}
823 
824 	mutex_lock(&migf->lock);
825 
826 	if (migf->disabled) {
827 		ret = -ENODEV;
828 		goto out;
829 	}
830 
831 	if (*pos > migf->total_length) {
832 		ret = -EINVAL;
833 		goto out;
834 	}
835 
836 	info.dirty_bytes = 0;
837 	info.initial_bytes = migf->total_length - *pos;
838 	mutex_unlock(&migf->lock);
839 	mutex_unlock(&hisi_acc_vdev->state_mutex);
840 
841 	return copy_to_user((void __user *)arg, &info, minsz) ? -EFAULT : 0;
842 out:
843 	mutex_unlock(&migf->lock);
844 	mutex_unlock(&hisi_acc_vdev->state_mutex);
845 	return ret;
846 }
847 
hisi_acc_vf_save_read(struct file * filp,char __user * buf,size_t len,loff_t * pos)848 static ssize_t hisi_acc_vf_save_read(struct file *filp, char __user *buf, size_t len,
849 				     loff_t *pos)
850 {
851 	struct hisi_acc_vf_migration_file *migf = filp->private_data;
852 	ssize_t done = 0;
853 	int ret;
854 
855 	if (pos)
856 		return -ESPIPE;
857 	pos = &filp->f_pos;
858 
859 	mutex_lock(&migf->lock);
860 	if (*pos > migf->total_length) {
861 		done = -EINVAL;
862 		goto out_unlock;
863 	}
864 
865 	if (migf->disabled) {
866 		done = -ENODEV;
867 		goto out_unlock;
868 	}
869 
870 	len = min_t(size_t, migf->total_length - *pos, len);
871 	if (len) {
872 		u8 *vf_data = (u8 *)&migf->vf_data;
873 
874 		ret = copy_to_user(buf, vf_data + *pos, len);
875 		if (ret) {
876 			done = -EFAULT;
877 			goto out_unlock;
878 		}
879 		*pos += len;
880 		done = len;
881 	}
882 out_unlock:
883 	mutex_unlock(&migf->lock);
884 	return done;
885 }
886 
887 static const struct file_operations hisi_acc_vf_save_fops = {
888 	.owner = THIS_MODULE,
889 	.read = hisi_acc_vf_save_read,
890 	.unlocked_ioctl = hisi_acc_vf_precopy_ioctl,
891 	.compat_ioctl = compat_ptr_ioctl,
892 	.release = hisi_acc_vf_release_file,
893 };
894 
895 static struct hisi_acc_vf_migration_file *
hisi_acc_open_saving_migf(struct hisi_acc_vf_core_device * hisi_acc_vdev)896 hisi_acc_open_saving_migf(struct hisi_acc_vf_core_device *hisi_acc_vdev)
897 {
898 	struct hisi_acc_vf_migration_file *migf;
899 	int ret;
900 
901 	migf = kzalloc(sizeof(*migf), GFP_KERNEL_ACCOUNT);
902 	if (!migf)
903 		return ERR_PTR(-ENOMEM);
904 
905 	migf->filp = anon_inode_getfile("hisi_acc_vf_mig", &hisi_acc_vf_save_fops, migf,
906 					O_RDONLY);
907 	if (IS_ERR(migf->filp)) {
908 		int err = PTR_ERR(migf->filp);
909 
910 		kfree(migf);
911 		return ERR_PTR(err);
912 	}
913 
914 	stream_open(migf->filp->f_inode, migf->filp);
915 	mutex_init(&migf->lock);
916 	migf->hisi_acc_vdev = hisi_acc_vdev;
917 
918 	ret = vf_qm_get_match_data(hisi_acc_vdev, &migf->vf_data);
919 	if (ret) {
920 		fput(migf->filp);
921 		return ERR_PTR(ret);
922 	}
923 
924 	return migf;
925 }
926 
927 static struct hisi_acc_vf_migration_file *
hisi_acc_vf_pre_copy(struct hisi_acc_vf_core_device * hisi_acc_vdev)928 hisi_acc_vf_pre_copy(struct hisi_acc_vf_core_device *hisi_acc_vdev)
929 {
930 	struct hisi_acc_vf_migration_file *migf;
931 
932 	migf = hisi_acc_open_saving_migf(hisi_acc_vdev);
933 	if (IS_ERR(migf))
934 		return migf;
935 
936 	migf->total_length = QM_MATCH_SIZE;
937 	return migf;
938 }
939 
940 static struct hisi_acc_vf_migration_file *
hisi_acc_vf_stop_copy(struct hisi_acc_vf_core_device * hisi_acc_vdev,bool open)941 hisi_acc_vf_stop_copy(struct hisi_acc_vf_core_device *hisi_acc_vdev, bool open)
942 {
943 	int ret;
944 	struct hisi_acc_vf_migration_file *migf = NULL;
945 
946 	if (open) {
947 		/*
948 		 * Userspace didn't use PRECOPY support. Hence saving_migf
949 		 * is not opened yet.
950 		 */
951 		migf = hisi_acc_open_saving_migf(hisi_acc_vdev);
952 		if (IS_ERR(migf))
953 			return migf;
954 	} else {
955 		migf = hisi_acc_vdev->saving_migf;
956 	}
957 
958 	ret = vf_qm_state_save(hisi_acc_vdev, migf);
959 	if (ret)
960 		return ERR_PTR(ret);
961 
962 	return open ? migf : NULL;
963 }
964 
hisi_acc_vf_stop_device(struct hisi_acc_vf_core_device * hisi_acc_vdev)965 static int hisi_acc_vf_stop_device(struct hisi_acc_vf_core_device *hisi_acc_vdev)
966 {
967 	struct device *dev = &hisi_acc_vdev->vf_dev->dev;
968 	struct hisi_qm *vf_qm = &hisi_acc_vdev->vf_qm;
969 	int ret;
970 
971 	ret = vf_qm_func_stop(vf_qm);
972 	if (ret) {
973 		dev_err(dev, "failed to stop QM VF function!\n");
974 		return ret;
975 	}
976 
977 	ret = hisi_acc_check_int_state(hisi_acc_vdev);
978 	if (ret) {
979 		dev_err(dev, "failed to check QM INT state!\n");
980 		return ret;
981 	}
982 
983 	ret = vf_qm_cache_wb(vf_qm);
984 	if (ret) {
985 		dev_err(dev, "failed to writeback QM cache!\n");
986 		return ret;
987 	}
988 
989 	return 0;
990 }
991 
992 static struct file *
hisi_acc_vf_set_device_state(struct hisi_acc_vf_core_device * hisi_acc_vdev,u32 new)993 hisi_acc_vf_set_device_state(struct hisi_acc_vf_core_device *hisi_acc_vdev,
994 			     u32 new)
995 {
996 	u32 cur = hisi_acc_vdev->mig_state;
997 	int ret;
998 
999 	if (cur == VFIO_DEVICE_STATE_RUNNING && new == VFIO_DEVICE_STATE_PRE_COPY) {
1000 		struct hisi_acc_vf_migration_file *migf;
1001 
1002 		migf = hisi_acc_vf_pre_copy(hisi_acc_vdev);
1003 		if (IS_ERR(migf))
1004 			return ERR_CAST(migf);
1005 		get_file(migf->filp);
1006 		hisi_acc_vdev->saving_migf = migf;
1007 		return migf->filp;
1008 	}
1009 
1010 	if (cur == VFIO_DEVICE_STATE_PRE_COPY && new == VFIO_DEVICE_STATE_STOP_COPY) {
1011 		struct hisi_acc_vf_migration_file *migf;
1012 
1013 		ret = hisi_acc_vf_stop_device(hisi_acc_vdev);
1014 		if (ret)
1015 			return ERR_PTR(ret);
1016 
1017 		migf = hisi_acc_vf_stop_copy(hisi_acc_vdev, false);
1018 		if (IS_ERR(migf))
1019 			return ERR_CAST(migf);
1020 
1021 		return NULL;
1022 	}
1023 
1024 	if (cur == VFIO_DEVICE_STATE_RUNNING && new == VFIO_DEVICE_STATE_STOP) {
1025 		ret = hisi_acc_vf_stop_device(hisi_acc_vdev);
1026 		if (ret)
1027 			return ERR_PTR(ret);
1028 		return NULL;
1029 	}
1030 
1031 	if (cur == VFIO_DEVICE_STATE_STOP && new == VFIO_DEVICE_STATE_STOP_COPY) {
1032 		struct hisi_acc_vf_migration_file *migf;
1033 
1034 		migf = hisi_acc_vf_stop_copy(hisi_acc_vdev, true);
1035 		if (IS_ERR(migf))
1036 			return ERR_CAST(migf);
1037 		get_file(migf->filp);
1038 		hisi_acc_vdev->saving_migf = migf;
1039 		return migf->filp;
1040 	}
1041 
1042 	if ((cur == VFIO_DEVICE_STATE_STOP_COPY && new == VFIO_DEVICE_STATE_STOP)) {
1043 		hisi_acc_vf_disable_fds(hisi_acc_vdev);
1044 		return NULL;
1045 	}
1046 
1047 	if (cur == VFIO_DEVICE_STATE_STOP && new == VFIO_DEVICE_STATE_RESUMING) {
1048 		struct hisi_acc_vf_migration_file *migf;
1049 
1050 		migf = hisi_acc_vf_pci_resume(hisi_acc_vdev);
1051 		if (IS_ERR(migf))
1052 			return ERR_CAST(migf);
1053 		get_file(migf->filp);
1054 		hisi_acc_vdev->resuming_migf = migf;
1055 		return migf->filp;
1056 	}
1057 
1058 	if (cur == VFIO_DEVICE_STATE_RESUMING && new == VFIO_DEVICE_STATE_STOP) {
1059 		ret = hisi_acc_vf_load_state(hisi_acc_vdev);
1060 		if (ret)
1061 			return ERR_PTR(ret);
1062 		hisi_acc_vf_disable_fds(hisi_acc_vdev);
1063 		return NULL;
1064 	}
1065 
1066 	if (cur == VFIO_DEVICE_STATE_PRE_COPY && new == VFIO_DEVICE_STATE_RUNNING) {
1067 		hisi_acc_vf_disable_fds(hisi_acc_vdev);
1068 		return NULL;
1069 	}
1070 
1071 	if (cur == VFIO_DEVICE_STATE_STOP && new == VFIO_DEVICE_STATE_RUNNING) {
1072 		hisi_acc_vf_start_device(hisi_acc_vdev);
1073 		return NULL;
1074 	}
1075 
1076 	/*
1077 	 * vfio_mig_get_next_state() does not use arcs other than the above
1078 	 */
1079 	WARN_ON(true);
1080 	return ERR_PTR(-EINVAL);
1081 }
1082 
1083 static struct file *
hisi_acc_vfio_pci_set_device_state(struct vfio_device * vdev,enum vfio_device_mig_state new_state)1084 hisi_acc_vfio_pci_set_device_state(struct vfio_device *vdev,
1085 				   enum vfio_device_mig_state new_state)
1086 {
1087 	struct hisi_acc_vf_core_device *hisi_acc_vdev = container_of(vdev,
1088 			struct hisi_acc_vf_core_device, core_device.vdev);
1089 	enum vfio_device_mig_state next_state;
1090 	struct file *res = NULL;
1091 	int ret;
1092 
1093 	mutex_lock(&hisi_acc_vdev->state_mutex);
1094 	while (new_state != hisi_acc_vdev->mig_state) {
1095 		ret = vfio_mig_get_next_state(vdev,
1096 					      hisi_acc_vdev->mig_state,
1097 					      new_state, &next_state);
1098 		if (ret) {
1099 			res = ERR_PTR(-EINVAL);
1100 			break;
1101 		}
1102 
1103 		res = hisi_acc_vf_set_device_state(hisi_acc_vdev, next_state);
1104 		if (IS_ERR(res))
1105 			break;
1106 		hisi_acc_vdev->mig_state = next_state;
1107 		if (WARN_ON(res && new_state != hisi_acc_vdev->mig_state)) {
1108 			fput(res);
1109 			res = ERR_PTR(-EINVAL);
1110 			break;
1111 		}
1112 	}
1113 	mutex_unlock(&hisi_acc_vdev->state_mutex);
1114 	return res;
1115 }
1116 
1117 static int
hisi_acc_vfio_pci_get_data_size(struct vfio_device * vdev,unsigned long * stop_copy_length)1118 hisi_acc_vfio_pci_get_data_size(struct vfio_device *vdev,
1119 				unsigned long *stop_copy_length)
1120 {
1121 	*stop_copy_length = sizeof(struct acc_vf_data);
1122 	return 0;
1123 }
1124 
1125 static int
hisi_acc_vfio_pci_get_device_state(struct vfio_device * vdev,enum vfio_device_mig_state * curr_state)1126 hisi_acc_vfio_pci_get_device_state(struct vfio_device *vdev,
1127 				   enum vfio_device_mig_state *curr_state)
1128 {
1129 	struct hisi_acc_vf_core_device *hisi_acc_vdev = container_of(vdev,
1130 			struct hisi_acc_vf_core_device, core_device.vdev);
1131 
1132 	mutex_lock(&hisi_acc_vdev->state_mutex);
1133 	*curr_state = hisi_acc_vdev->mig_state;
1134 	mutex_unlock(&hisi_acc_vdev->state_mutex);
1135 	return 0;
1136 }
1137 
hisi_acc_vf_pci_aer_reset_done(struct pci_dev * pdev)1138 static void hisi_acc_vf_pci_aer_reset_done(struct pci_dev *pdev)
1139 {
1140 	struct hisi_acc_vf_core_device *hisi_acc_vdev = hisi_acc_drvdata(pdev);
1141 
1142 	if (hisi_acc_vdev->core_device.vdev.migration_flags !=
1143 				VFIO_MIGRATION_STOP_COPY)
1144 		return;
1145 
1146 	mutex_lock(&hisi_acc_vdev->state_mutex);
1147 	hisi_acc_vf_reset(hisi_acc_vdev);
1148 	mutex_unlock(&hisi_acc_vdev->state_mutex);
1149 }
1150 
hisi_acc_vf_qm_init(struct hisi_acc_vf_core_device * hisi_acc_vdev)1151 static int hisi_acc_vf_qm_init(struct hisi_acc_vf_core_device *hisi_acc_vdev)
1152 {
1153 	struct vfio_pci_core_device *vdev = &hisi_acc_vdev->core_device;
1154 	struct hisi_qm *vf_qm = &hisi_acc_vdev->vf_qm;
1155 	struct pci_dev *vf_dev = vdev->pdev;
1156 
1157 	/*
1158 	 * ACC VF dev BAR2 region consists of both functional register space
1159 	 * and migration control register space. For migration to work, we
1160 	 * need access to both. Hence, we map the entire BAR2 region here.
1161 	 * But unnecessarily exposing the migration BAR region to the Guest
1162 	 * has the potential to prevent/corrupt the Guest migration. Hence,
1163 	 * we restrict access to the migration control space from
1164 	 * Guest(Please see mmap/ioctl/read/write override functions).
1165 	 *
1166 	 * Please note that it is OK to expose the entire VF BAR if migration
1167 	 * is not supported or required as this cannot affect the ACC PF
1168 	 * configurations.
1169 	 *
1170 	 * Also the HiSilicon ACC VF devices supported by this driver on
1171 	 * HiSilicon hardware platforms are integrated end point devices
1172 	 * and the platform lacks the capability to perform any PCIe P2P
1173 	 * between these devices.
1174 	 */
1175 
1176 	vf_qm->io_base =
1177 		ioremap(pci_resource_start(vf_dev, VFIO_PCI_BAR2_REGION_INDEX),
1178 			pci_resource_len(vf_dev, VFIO_PCI_BAR2_REGION_INDEX));
1179 	if (!vf_qm->io_base)
1180 		return -EIO;
1181 
1182 	vf_qm->fun_type = QM_HW_VF;
1183 	vf_qm->pdev = vf_dev;
1184 	mutex_init(&vf_qm->mailbox_lock);
1185 
1186 	return 0;
1187 }
1188 
hisi_acc_get_pf_qm(struct pci_dev * pdev)1189 static struct hisi_qm *hisi_acc_get_pf_qm(struct pci_dev *pdev)
1190 {
1191 	struct hisi_qm	*pf_qm;
1192 	struct pci_driver *pf_driver;
1193 
1194 	if (!pdev->is_virtfn)
1195 		return NULL;
1196 
1197 	switch (pdev->device) {
1198 	case PCI_DEVICE_ID_HUAWEI_SEC_VF:
1199 		pf_driver = hisi_sec_get_pf_driver();
1200 		break;
1201 	case PCI_DEVICE_ID_HUAWEI_HPRE_VF:
1202 		pf_driver = hisi_hpre_get_pf_driver();
1203 		break;
1204 	case PCI_DEVICE_ID_HUAWEI_ZIP_VF:
1205 		pf_driver = hisi_zip_get_pf_driver();
1206 		break;
1207 	default:
1208 		return NULL;
1209 	}
1210 
1211 	if (!pf_driver)
1212 		return NULL;
1213 
1214 	pf_qm = pci_iov_get_pf_drvdata(pdev, pf_driver);
1215 
1216 	return !IS_ERR(pf_qm) ? pf_qm : NULL;
1217 }
1218 
hisi_acc_pci_rw_access_check(struct vfio_device * core_vdev,size_t count,loff_t * ppos,size_t * new_count)1219 static int hisi_acc_pci_rw_access_check(struct vfio_device *core_vdev,
1220 					size_t count, loff_t *ppos,
1221 					size_t *new_count)
1222 {
1223 	unsigned int index = VFIO_PCI_OFFSET_TO_INDEX(*ppos);
1224 	struct vfio_pci_core_device *vdev =
1225 		container_of(core_vdev, struct vfio_pci_core_device, vdev);
1226 
1227 	if (index == VFIO_PCI_BAR2_REGION_INDEX) {
1228 		loff_t pos = *ppos & VFIO_PCI_OFFSET_MASK;
1229 		resource_size_t end = pci_resource_len(vdev->pdev, index) / 2;
1230 
1231 		/* Check if access is for migration control region */
1232 		if (pos >= end)
1233 			return -EINVAL;
1234 
1235 		*new_count = min(count, (size_t)(end - pos));
1236 	}
1237 
1238 	return 0;
1239 }
1240 
hisi_acc_vfio_pci_mmap(struct vfio_device * core_vdev,struct vm_area_struct * vma)1241 static int hisi_acc_vfio_pci_mmap(struct vfio_device *core_vdev,
1242 				  struct vm_area_struct *vma)
1243 {
1244 	struct vfio_pci_core_device *vdev =
1245 		container_of(core_vdev, struct vfio_pci_core_device, vdev);
1246 	unsigned int index;
1247 
1248 	index = vma->vm_pgoff >> (VFIO_PCI_OFFSET_SHIFT - PAGE_SHIFT);
1249 	if (index == VFIO_PCI_BAR2_REGION_INDEX) {
1250 		u64 req_len, pgoff, req_start;
1251 		resource_size_t end = pci_resource_len(vdev->pdev, index) / 2;
1252 
1253 		req_len = vma->vm_end - vma->vm_start;
1254 		pgoff = vma->vm_pgoff &
1255 			((1U << (VFIO_PCI_OFFSET_SHIFT - PAGE_SHIFT)) - 1);
1256 		req_start = pgoff << PAGE_SHIFT;
1257 
1258 		if (req_start + req_len > end)
1259 			return -EINVAL;
1260 	}
1261 
1262 	return vfio_pci_core_mmap(core_vdev, vma);
1263 }
1264 
hisi_acc_vfio_pci_write(struct vfio_device * core_vdev,const char __user * buf,size_t count,loff_t * ppos)1265 static ssize_t hisi_acc_vfio_pci_write(struct vfio_device *core_vdev,
1266 				       const char __user *buf, size_t count,
1267 				       loff_t *ppos)
1268 {
1269 	size_t new_count = count;
1270 	int ret;
1271 
1272 	ret = hisi_acc_pci_rw_access_check(core_vdev, count, ppos, &new_count);
1273 	if (ret)
1274 		return ret;
1275 
1276 	return vfio_pci_core_write(core_vdev, buf, new_count, ppos);
1277 }
1278 
hisi_acc_vfio_pci_read(struct vfio_device * core_vdev,char __user * buf,size_t count,loff_t * ppos)1279 static ssize_t hisi_acc_vfio_pci_read(struct vfio_device *core_vdev,
1280 				      char __user *buf, size_t count,
1281 				      loff_t *ppos)
1282 {
1283 	size_t new_count = count;
1284 	int ret;
1285 
1286 	ret = hisi_acc_pci_rw_access_check(core_vdev, count, ppos, &new_count);
1287 	if (ret)
1288 		return ret;
1289 
1290 	return vfio_pci_core_read(core_vdev, buf, new_count, ppos);
1291 }
1292 
hisi_acc_vfio_pci_ioctl(struct vfio_device * core_vdev,unsigned int cmd,unsigned long arg)1293 static long hisi_acc_vfio_pci_ioctl(struct vfio_device *core_vdev, unsigned int cmd,
1294 				    unsigned long arg)
1295 {
1296 	if (cmd == VFIO_DEVICE_GET_REGION_INFO) {
1297 		struct vfio_pci_core_device *vdev =
1298 			container_of(core_vdev, struct vfio_pci_core_device, vdev);
1299 		struct pci_dev *pdev = vdev->pdev;
1300 		struct vfio_region_info info;
1301 		unsigned long minsz;
1302 
1303 		minsz = offsetofend(struct vfio_region_info, offset);
1304 
1305 		if (copy_from_user(&info, (void __user *)arg, minsz))
1306 			return -EFAULT;
1307 
1308 		if (info.argsz < minsz)
1309 			return -EINVAL;
1310 
1311 		if (info.index == VFIO_PCI_BAR2_REGION_INDEX) {
1312 			info.offset = VFIO_PCI_INDEX_TO_OFFSET(info.index);
1313 
1314 			/*
1315 			 * ACC VF dev BAR2 region consists of both functional
1316 			 * register space and migration control register space.
1317 			 * Report only the functional region to Guest.
1318 			 */
1319 			info.size = pci_resource_len(pdev, info.index) / 2;
1320 
1321 			info.flags = VFIO_REGION_INFO_FLAG_READ |
1322 					VFIO_REGION_INFO_FLAG_WRITE |
1323 					VFIO_REGION_INFO_FLAG_MMAP;
1324 
1325 			return copy_to_user((void __user *)arg, &info, minsz) ?
1326 					    -EFAULT : 0;
1327 		}
1328 	}
1329 	return vfio_pci_core_ioctl(core_vdev, cmd, arg);
1330 }
1331 
hisi_acc_vfio_pci_open_device(struct vfio_device * core_vdev)1332 static int hisi_acc_vfio_pci_open_device(struct vfio_device *core_vdev)
1333 {
1334 	struct hisi_acc_vf_core_device *hisi_acc_vdev = container_of(core_vdev,
1335 			struct hisi_acc_vf_core_device, core_device.vdev);
1336 	struct vfio_pci_core_device *vdev = &hisi_acc_vdev->core_device;
1337 	int ret;
1338 
1339 	ret = vfio_pci_core_enable(vdev);
1340 	if (ret)
1341 		return ret;
1342 
1343 	if (core_vdev->mig_ops) {
1344 		ret = hisi_acc_vf_qm_init(hisi_acc_vdev);
1345 		if (ret) {
1346 			vfio_pci_core_disable(vdev);
1347 			return ret;
1348 		}
1349 		hisi_acc_vdev->mig_state = VFIO_DEVICE_STATE_RUNNING;
1350 	}
1351 
1352 	vfio_pci_core_finish_enable(vdev);
1353 	return 0;
1354 }
1355 
hisi_acc_vfio_pci_close_device(struct vfio_device * core_vdev)1356 static void hisi_acc_vfio_pci_close_device(struct vfio_device *core_vdev)
1357 {
1358 	struct hisi_acc_vf_core_device *hisi_acc_vdev = container_of(core_vdev,
1359 			struct hisi_acc_vf_core_device, core_device.vdev);
1360 	struct hisi_qm *vf_qm = &hisi_acc_vdev->vf_qm;
1361 
1362 	hisi_acc_vf_disable_fds(hisi_acc_vdev);
1363 	iounmap(vf_qm->io_base);
1364 	vfio_pci_core_close_device(core_vdev);
1365 }
1366 
1367 static const struct vfio_migration_ops hisi_acc_vfio_pci_migrn_state_ops = {
1368 	.migration_set_state = hisi_acc_vfio_pci_set_device_state,
1369 	.migration_get_state = hisi_acc_vfio_pci_get_device_state,
1370 	.migration_get_data_size = hisi_acc_vfio_pci_get_data_size,
1371 };
1372 
hisi_acc_vfio_pci_migrn_init_dev(struct vfio_device * core_vdev)1373 static int hisi_acc_vfio_pci_migrn_init_dev(struct vfio_device *core_vdev)
1374 {
1375 	struct hisi_acc_vf_core_device *hisi_acc_vdev = container_of(core_vdev,
1376 			struct hisi_acc_vf_core_device, core_device.vdev);
1377 	struct pci_dev *pdev = to_pci_dev(core_vdev->dev);
1378 	struct hisi_qm *pf_qm = hisi_acc_get_pf_qm(pdev);
1379 
1380 	hisi_acc_vdev->vf_id = pci_iov_vf_id(pdev) + 1;
1381 	hisi_acc_vdev->pf_qm = pf_qm;
1382 	hisi_acc_vdev->vf_dev = pdev;
1383 	hisi_acc_vdev->vf_qm_state = QM_NOT_READY;
1384 	mutex_init(&hisi_acc_vdev->state_mutex);
1385 
1386 	core_vdev->migration_flags = VFIO_MIGRATION_STOP_COPY | VFIO_MIGRATION_PRE_COPY;
1387 	core_vdev->mig_ops = &hisi_acc_vfio_pci_migrn_state_ops;
1388 
1389 	return vfio_pci_core_init_dev(core_vdev);
1390 }
1391 
1392 static const struct vfio_device_ops hisi_acc_vfio_pci_migrn_ops = {
1393 	.name = "hisi-acc-vfio-pci-migration",
1394 	.init = hisi_acc_vfio_pci_migrn_init_dev,
1395 	.release = vfio_pci_core_release_dev,
1396 	.open_device = hisi_acc_vfio_pci_open_device,
1397 	.close_device = hisi_acc_vfio_pci_close_device,
1398 	.ioctl = hisi_acc_vfio_pci_ioctl,
1399 	.device_feature = vfio_pci_core_ioctl_feature,
1400 	.read = hisi_acc_vfio_pci_read,
1401 	.write = hisi_acc_vfio_pci_write,
1402 	.mmap = hisi_acc_vfio_pci_mmap,
1403 	.request = vfio_pci_core_request,
1404 	.match = vfio_pci_core_match,
1405 	.bind_iommufd = vfio_iommufd_physical_bind,
1406 	.unbind_iommufd = vfio_iommufd_physical_unbind,
1407 	.attach_ioas = vfio_iommufd_physical_attach_ioas,
1408 	.detach_ioas = vfio_iommufd_physical_detach_ioas,
1409 };
1410 
1411 static const struct vfio_device_ops hisi_acc_vfio_pci_ops = {
1412 	.name = "hisi-acc-vfio-pci",
1413 	.init = vfio_pci_core_init_dev,
1414 	.release = vfio_pci_core_release_dev,
1415 	.open_device = hisi_acc_vfio_pci_open_device,
1416 	.close_device = vfio_pci_core_close_device,
1417 	.ioctl = vfio_pci_core_ioctl,
1418 	.device_feature = vfio_pci_core_ioctl_feature,
1419 	.read = vfio_pci_core_read,
1420 	.write = vfio_pci_core_write,
1421 	.mmap = vfio_pci_core_mmap,
1422 	.request = vfio_pci_core_request,
1423 	.match = vfio_pci_core_match,
1424 	.bind_iommufd = vfio_iommufd_physical_bind,
1425 	.unbind_iommufd = vfio_iommufd_physical_unbind,
1426 	.attach_ioas = vfio_iommufd_physical_attach_ioas,
1427 	.detach_ioas = vfio_iommufd_physical_detach_ioas,
1428 };
1429 
hisi_acc_vfio_pci_probe(struct pci_dev * pdev,const struct pci_device_id * id)1430 static int hisi_acc_vfio_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
1431 {
1432 	struct hisi_acc_vf_core_device *hisi_acc_vdev;
1433 	const struct vfio_device_ops *ops = &hisi_acc_vfio_pci_ops;
1434 	struct hisi_qm *pf_qm;
1435 	int vf_id;
1436 	int ret;
1437 
1438 	pf_qm = hisi_acc_get_pf_qm(pdev);
1439 	if (pf_qm && pf_qm->ver >= QM_HW_V3) {
1440 		vf_id = pci_iov_vf_id(pdev);
1441 		if (vf_id >= 0)
1442 			ops = &hisi_acc_vfio_pci_migrn_ops;
1443 		else
1444 			pci_warn(pdev, "migration support failed, continue with generic interface\n");
1445 	}
1446 
1447 	hisi_acc_vdev = vfio_alloc_device(hisi_acc_vf_core_device,
1448 					  core_device.vdev, &pdev->dev, ops);
1449 	if (IS_ERR(hisi_acc_vdev))
1450 		return PTR_ERR(hisi_acc_vdev);
1451 
1452 	dev_set_drvdata(&pdev->dev, &hisi_acc_vdev->core_device);
1453 	ret = vfio_pci_core_register_device(&hisi_acc_vdev->core_device);
1454 	if (ret)
1455 		goto out_put_vdev;
1456 	return 0;
1457 
1458 out_put_vdev:
1459 	vfio_put_device(&hisi_acc_vdev->core_device.vdev);
1460 	return ret;
1461 }
1462 
hisi_acc_vfio_pci_remove(struct pci_dev * pdev)1463 static void hisi_acc_vfio_pci_remove(struct pci_dev *pdev)
1464 {
1465 	struct hisi_acc_vf_core_device *hisi_acc_vdev = hisi_acc_drvdata(pdev);
1466 
1467 	vfio_pci_core_unregister_device(&hisi_acc_vdev->core_device);
1468 	vfio_put_device(&hisi_acc_vdev->core_device.vdev);
1469 }
1470 
1471 static const struct pci_device_id hisi_acc_vfio_pci_table[] = {
1472 	{ PCI_DRIVER_OVERRIDE_DEVICE_VFIO(PCI_VENDOR_ID_HUAWEI, PCI_DEVICE_ID_HUAWEI_SEC_VF) },
1473 	{ PCI_DRIVER_OVERRIDE_DEVICE_VFIO(PCI_VENDOR_ID_HUAWEI, PCI_DEVICE_ID_HUAWEI_HPRE_VF) },
1474 	{ PCI_DRIVER_OVERRIDE_DEVICE_VFIO(PCI_VENDOR_ID_HUAWEI, PCI_DEVICE_ID_HUAWEI_ZIP_VF) },
1475 	{ }
1476 };
1477 
1478 MODULE_DEVICE_TABLE(pci, hisi_acc_vfio_pci_table);
1479 
1480 static const struct pci_error_handlers hisi_acc_vf_err_handlers = {
1481 	.reset_done = hisi_acc_vf_pci_aer_reset_done,
1482 	.error_detected = vfio_pci_core_aer_err_detected,
1483 };
1484 
1485 static struct pci_driver hisi_acc_vfio_pci_driver = {
1486 	.name = KBUILD_MODNAME,
1487 	.id_table = hisi_acc_vfio_pci_table,
1488 	.probe = hisi_acc_vfio_pci_probe,
1489 	.remove = hisi_acc_vfio_pci_remove,
1490 	.err_handler = &hisi_acc_vf_err_handlers,
1491 	.driver_managed_dma = true,
1492 };
1493 
1494 module_pci_driver(hisi_acc_vfio_pci_driver);
1495 
1496 MODULE_LICENSE("GPL v2");
1497 MODULE_AUTHOR("Liu Longfang <liulongfang@huawei.com>");
1498 MODULE_AUTHOR("Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>");
1499 MODULE_DESCRIPTION("HiSilicon VFIO PCI - VFIO PCI driver with live migration support for HiSilicon ACC device family");
1500