File Index
Files and directories
Sign in
FILE

hisi_acc_vfio_pci.c

File preview with syntax highlighting.

linux-6.19.14/drivers/vfio/pci/hisilicon/hisi_acc_vfio_pci.c C
   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 */
  20static 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 */
  33static 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
  48static 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
  64static 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
  78static 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
  98static 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
 113static 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
 128static void qm_xqc_reg_offsets(struct hisi_qm *qm,
 129			       u32 *eqc_addr, u32 *aeqc_addr)
 130{
 131	struct hisi_acc_vf_core_device *hisi_acc_vdev =
 132		container_of(qm, struct hisi_acc_vf_core_device, vf_qm);
 133
 134	if (hisi_acc_vdev->drv_mode == HW_ACC_MIG_VF_CTRL) {
 135		*eqc_addr = QM_EQC_VF_DW0;
 136		*aeqc_addr = QM_AEQC_VF_DW0;
 137	} else {
 138		*eqc_addr = QM_EQC_PF_DW0;
 139		*aeqc_addr = QM_AEQC_PF_DW0;
 140	}
 141}
 142
 143static int qm_get_regs(struct hisi_qm *qm, struct acc_vf_data *vf_data)
 144{
 145	struct device *dev = &qm->pdev->dev;
 146	u32 eqc_addr, aeqc_addr;
 147	int ret;
 148
 149	ret = qm_read_regs(qm, QM_VF_AEQ_INT_MASK, &vf_data->aeq_int_mask, 1);
 150	if (ret) {
 151		dev_err(dev, "failed to read QM_VF_AEQ_INT_MASK\n");
 152		return ret;
 153	}
 154
 155	ret = qm_read_regs(qm, QM_VF_EQ_INT_MASK, &vf_data->eq_int_mask, 1);
 156	if (ret) {
 157		dev_err(dev, "failed to read QM_VF_EQ_INT_MASK\n");
 158		return ret;
 159	}
 160
 161	ret = qm_read_regs(qm, QM_IFC_INT_SOURCE_V,
 162			   &vf_data->ifc_int_source, 1);
 163	if (ret) {
 164		dev_err(dev, "failed to read QM_IFC_INT_SOURCE_V\n");
 165		return ret;
 166	}
 167
 168	ret = qm_read_regs(qm, QM_IFC_INT_MASK, &vf_data->ifc_int_mask, 1);
 169	if (ret) {
 170		dev_err(dev, "failed to read QM_IFC_INT_MASK\n");
 171		return ret;
 172	}
 173
 174	ret = qm_read_regs(qm, QM_IFC_INT_SET_V, &vf_data->ifc_int_set, 1);
 175	if (ret) {
 176		dev_err(dev, "failed to read QM_IFC_INT_SET_V\n");
 177		return ret;
 178	}
 179
 180	ret = qm_read_regs(qm, QM_PAGE_SIZE, &vf_data->page_size, 1);
 181	if (ret) {
 182		dev_err(dev, "failed to read QM_PAGE_SIZE\n");
 183		return ret;
 184	}
 185
 186	qm_xqc_reg_offsets(qm, &eqc_addr, &aeqc_addr);
 187	/* QM_EQC_DW has 7 regs */
 188	ret = qm_read_regs(qm, eqc_addr, vf_data->qm_eqc_dw, 7);
 189	if (ret) {
 190		dev_err(dev, "failed to read QM_EQC_DW\n");
 191		return ret;
 192	}
 193
 194	/* QM_AEQC_DW has 7 regs */
 195	ret = qm_read_regs(qm, aeqc_addr, vf_data->qm_aeqc_dw, 7);
 196	if (ret) {
 197		dev_err(dev, "failed to read QM_AEQC_DW\n");
 198		return ret;
 199	}
 200
 201	return 0;
 202}
 203
 204static int qm_set_regs(struct hisi_qm *qm, struct acc_vf_data *vf_data)
 205{
 206	struct device *dev = &qm->pdev->dev;
 207	u32 eqc_addr, aeqc_addr;
 208	int ret;
 209
 210	/* Check VF state */
 211	ret = hisi_qm_wait_mb_ready(qm);
 212	if (unlikely(ret)) {
 213		dev_err(&qm->pdev->dev, "QM device is not ready to write\n");
 214		return ret;
 215	}
 216
 217	ret = qm_write_regs(qm, QM_VF_AEQ_INT_MASK, &vf_data->aeq_int_mask, 1);
 218	if (ret) {
 219		dev_err(dev, "failed to write QM_VF_AEQ_INT_MASK\n");
 220		return ret;
 221	}
 222
 223	ret = qm_write_regs(qm, QM_VF_EQ_INT_MASK, &vf_data->eq_int_mask, 1);
 224	if (ret) {
 225		dev_err(dev, "failed to write QM_VF_EQ_INT_MASK\n");
 226		return ret;
 227	}
 228
 229	ret = qm_write_regs(qm, QM_IFC_INT_SOURCE_V,
 230			    &vf_data->ifc_int_source, 1);
 231	if (ret) {
 232		dev_err(dev, "failed to write QM_IFC_INT_SOURCE_V\n");
 233		return ret;
 234	}
 235
 236	ret = qm_write_regs(qm, QM_IFC_INT_MASK, &vf_data->ifc_int_mask, 1);
 237	if (ret) {
 238		dev_err(dev, "failed to write QM_IFC_INT_MASK\n");
 239		return ret;
 240	}
 241
 242	ret = qm_write_regs(qm, QM_IFC_INT_SET_V, &vf_data->ifc_int_set, 1);
 243	if (ret) {
 244		dev_err(dev, "failed to write QM_IFC_INT_SET_V\n");
 245		return ret;
 246	}
 247
 248	ret = qm_write_regs(qm, QM_QUE_ISO_CFG_V, &vf_data->que_iso_cfg, 1);
 249	if (ret) {
 250		dev_err(dev, "failed to write QM_QUE_ISO_CFG_V\n");
 251		return ret;
 252	}
 253
 254	ret = qm_write_regs(qm, QM_PAGE_SIZE, &vf_data->page_size, 1);
 255	if (ret) {
 256		dev_err(dev, "failed to write QM_PAGE_SIZE\n");
 257		return ret;
 258	}
 259
 260	qm_xqc_reg_offsets(qm, &eqc_addr, &aeqc_addr);
 261	/* QM_EQC_DW has 7 regs */
 262	ret = qm_write_regs(qm, eqc_addr, vf_data->qm_eqc_dw, 7);
 263	if (ret) {
 264		dev_err(dev, "failed to write QM_EQC_DW\n");
 265		return ret;
 266	}
 267
 268	/* QM_AEQC_DW has 7 regs */
 269	ret = qm_write_regs(qm, aeqc_addr, vf_data->qm_aeqc_dw, 7);
 270	if (ret) {
 271		dev_err(dev, "failed to write QM_AEQC_DW\n");
 272		return ret;
 273	}
 274
 275	return 0;
 276}
 277
 278static void qm_db(struct hisi_qm *qm, u16 qn, u8 cmd,
 279		  u16 index, u8 priority)
 280{
 281	u64 doorbell;
 282	u64 dbase;
 283	u16 randata = 0;
 284
 285	if (cmd == QM_DOORBELL_CMD_SQ || cmd == QM_DOORBELL_CMD_CQ)
 286		dbase = QM_DOORBELL_SQ_CQ_BASE_V2;
 287	else
 288		dbase = QM_DOORBELL_EQ_AEQ_BASE_V2;
 289
 290	doorbell = qn | ((u64)cmd << QM_DB_CMD_SHIFT_V2) |
 291		   ((u64)randata << QM_DB_RAND_SHIFT_V2) |
 292		   ((u64)index << QM_DB_INDEX_SHIFT_V2)	 |
 293		   ((u64)priority << QM_DB_PRIORITY_SHIFT_V2);
 294
 295	writeq(doorbell, qm->io_base + dbase);
 296}
 297
 298static int pf_qm_get_qp_num(struct hisi_qm *qm, int vf_id, u32 *rbase)
 299{
 300	unsigned int val;
 301	u64 sqc_vft;
 302	u32 qp_num;
 303	int ret;
 304
 305	ret = readl_relaxed_poll_timeout(qm->io_base + QM_VFT_CFG_RDY, val,
 306					 val & BIT(0), MB_POLL_PERIOD_US,
 307					 MB_POLL_TIMEOUT_US);
 308	if (ret)
 309		return ret;
 310
 311	writel(0x1, qm->io_base + QM_VFT_CFG_OP_WR);
 312	/* 0 mean SQC VFT */
 313	writel(0x0, qm->io_base + QM_VFT_CFG_TYPE);
 314	writel(vf_id, qm->io_base + QM_VFT_CFG);
 315
 316	writel(0x0, qm->io_base + QM_VFT_CFG_RDY);
 317	writel(0x1, qm->io_base + QM_VFT_CFG_OP_ENABLE);
 318
 319	ret = readl_relaxed_poll_timeout(qm->io_base + QM_VFT_CFG_RDY, val,
 320					 val & BIT(0), MB_POLL_PERIOD_US,
 321					 MB_POLL_TIMEOUT_US);
 322	if (ret)
 323		return ret;
 324
 325	sqc_vft = readl(qm->io_base + QM_VFT_CFG_DATA_L) |
 326		  ((u64)readl(qm->io_base + QM_VFT_CFG_DATA_H) <<
 327		  QM_XQC_ADDR_OFFSET);
 328	*rbase = QM_SQC_VFT_BASE_MASK_V2 &
 329		  (sqc_vft >> QM_SQC_VFT_BASE_SHIFT_V2);
 330	qp_num = (QM_SQC_VFT_NUM_MASK_V2 &
 331		  (sqc_vft >> QM_SQC_VFT_NUM_SHIFT_V2)) + 1;
 332
 333	return qp_num;
 334}
 335
 336static void qm_dev_cmd_init(struct hisi_qm *qm)
 337{
 338	/* Clear VF communication status registers. */
 339	writel(0x1, qm->io_base + QM_IFC_INT_SOURCE_V);
 340
 341	/* Enable pf and vf communication. */
 342	writel(0x0, qm->io_base + QM_IFC_INT_MASK);
 343}
 344
 345static int vf_qm_cache_wb(struct hisi_qm *qm)
 346{
 347	unsigned int val;
 348	int ret;
 349
 350	writel(0x1, qm->io_base + QM_CACHE_WB_START);
 351	ret = readl_relaxed_poll_timeout(qm->io_base + QM_CACHE_WB_DONE,
 352				       val, val & BIT(0), MB_POLL_PERIOD_US,
 353				       MB_POLL_TIMEOUT_US);
 354	if (ret) {
 355		dev_err(&qm->pdev->dev, "vf QM writeback sqc cache fail\n");
 356		return ret;
 357	}
 358
 359	return 0;
 360}
 361
 362static void vf_qm_fun_reset(struct hisi_qm *qm)
 363{
 364	int i;
 365
 366	for (i = 0; i < qm->qp_num; i++)
 367		qm_db(qm, i, QM_DOORBELL_CMD_SQ, 0, 1);
 368}
 369
 370static int vf_qm_func_stop(struct hisi_qm *qm)
 371{
 372	return hisi_qm_mb(qm, QM_MB_CMD_PAUSE_QM, 0, 0, 0);
 373}
 374
 375static int vf_qm_version_check(struct acc_vf_data *vf_data, struct device *dev)
 376{
 377	switch (vf_data->acc_magic) {
 378	case ACC_DEV_MAGIC_V2:
 379		if (vf_data->major_ver != ACC_DRV_MAJOR_VER) {
 380			dev_info(dev, "migration driver version<%u.%u> not match!\n",
 381				 vf_data->major_ver, vf_data->minor_ver);
 382			return -EINVAL;
 383		}
 384		break;
 385	case ACC_DEV_MAGIC_V1:
 386		/* Correct dma address */
 387		vf_data->eqe_dma = vf_data->qm_eqc_dw[QM_XQC_ADDR_HIGH];
 388		vf_data->eqe_dma <<= QM_XQC_ADDR_OFFSET;
 389		vf_data->eqe_dma |= vf_data->qm_eqc_dw[QM_XQC_ADDR_LOW];
 390		vf_data->aeqe_dma = vf_data->qm_aeqc_dw[QM_XQC_ADDR_HIGH];
 391		vf_data->aeqe_dma <<= QM_XQC_ADDR_OFFSET;
 392		vf_data->aeqe_dma |= vf_data->qm_aeqc_dw[QM_XQC_ADDR_LOW];
 393		break;
 394	default:
 395		return -EINVAL;
 396	}
 397
 398	return 0;
 399}
 400
 401static int vf_qm_check_match(struct hisi_acc_vf_core_device *hisi_acc_vdev,
 402			     struct hisi_acc_vf_migration_file *migf)
 403{
 404	struct acc_vf_data *vf_data = &migf->vf_data;
 405	struct hisi_qm *vf_qm = &hisi_acc_vdev->vf_qm;
 406	struct hisi_qm *pf_qm = hisi_acc_vdev->pf_qm;
 407	struct device *dev = &vf_qm->pdev->dev;
 408	u32 que_iso_state;
 409	int ret;
 410
 411	if (migf->total_length < QM_MATCH_SIZE || hisi_acc_vdev->match_done)
 412		return 0;
 413
 414	ret = vf_qm_version_check(vf_data, dev);
 415	if (ret) {
 416		dev_err(dev, "failed to match ACC_DEV_MAGIC\n");
 417		return ret;
 418	}
 419
 420	if (vf_data->dev_id != hisi_acc_vdev->vf_dev->device) {
 421		dev_err(dev, "failed to match VF devices\n");
 422		return -EINVAL;
 423	}
 424
 425	/* VF qp num check */
 426	ret = qm_get_vft(vf_qm, &vf_qm->qp_base);
 427	if (ret <= 0) {
 428		dev_err(dev, "failed to get vft qp nums\n");
 429		return ret < 0 ? ret : -EINVAL;
 430	}
 431
 432	if (ret != vf_data->qp_num) {
 433		dev_err(dev, "failed to match VF qp num\n");
 434		return -EINVAL;
 435	}
 436
 437	vf_qm->qp_num = ret;
 438
 439	/* VF isolation state check */
 440	ret = qm_read_regs(pf_qm, QM_QUE_ISO_CFG_V, &que_iso_state, 1);
 441	if (ret) {
 442		dev_err(dev, "failed to read QM_QUE_ISO_CFG_V\n");
 443		return ret;
 444	}
 445
 446	if (vf_data->que_iso_cfg != que_iso_state) {
 447		dev_err(dev, "failed to match isolation state\n");
 448		return -EINVAL;
 449	}
 450
 451	hisi_acc_vdev->match_done = true;
 452	return 0;
 453}
 454
 455static int vf_qm_get_match_data(struct hisi_acc_vf_core_device *hisi_acc_vdev,
 456				struct acc_vf_data *vf_data)
 457{
 458	struct hisi_qm *pf_qm = hisi_acc_vdev->pf_qm;
 459	struct device *dev = &pf_qm->pdev->dev;
 460	int vf_id = hisi_acc_vdev->vf_id;
 461	int ret;
 462
 463	vf_data->acc_magic = ACC_DEV_MAGIC_V2;
 464	vf_data->major_ver = ACC_DRV_MAJOR_VER;
 465	vf_data->minor_ver = ACC_DRV_MINOR_VER;
 466	/* Save device id */
 467	vf_data->dev_id = hisi_acc_vdev->vf_dev->device;
 468
 469	/* VF qp num save from PF */
 470	ret = pf_qm_get_qp_num(pf_qm, vf_id, &vf_data->qp_base);
 471	if (ret <= 0) {
 472		dev_err(dev, "failed to get vft qp nums!\n");
 473		return -EINVAL;
 474	}
 475
 476	vf_data->qp_num = ret;
 477
 478	/* VF isolation state save from PF */
 479	ret = qm_read_regs(pf_qm, QM_QUE_ISO_CFG_V, &vf_data->que_iso_cfg, 1);
 480	if (ret) {
 481		dev_err(dev, "failed to read QM_QUE_ISO_CFG_V!\n");
 482		return ret;
 483	}
 484
 485	return 0;
 486}
 487
 488static void vf_qm_xeqc_save(struct hisi_qm *qm,
 489			    struct hisi_acc_vf_migration_file *migf)
 490{
 491	struct acc_vf_data *vf_data = &migf->vf_data;
 492	u16 eq_head, aeq_head;
 493
 494	eq_head = vf_data->qm_eqc_dw[0] & 0xFFFF;
 495	qm_db(qm, 0, QM_DOORBELL_CMD_EQ, eq_head, 0);
 496
 497	aeq_head = vf_data->qm_aeqc_dw[0] & 0xFFFF;
 498	qm_db(qm, 0, QM_DOORBELL_CMD_AEQ, aeq_head, 0);
 499}
 500
 501static int vf_qm_load_data(struct hisi_acc_vf_core_device *hisi_acc_vdev,
 502			   struct hisi_acc_vf_migration_file *migf)
 503{
 504	struct hisi_qm *qm = &hisi_acc_vdev->vf_qm;
 505	struct device *dev = &qm->pdev->dev;
 506	struct acc_vf_data *vf_data = &migf->vf_data;
 507	int ret;
 508
 509	/* Return if only match data was transferred */
 510	if (migf->total_length == QM_MATCH_SIZE)
 511		return 0;
 512
 513	if (migf->total_length < sizeof(struct acc_vf_data))
 514		return -EINVAL;
 515
 516	if (!vf_data->eqe_dma || !vf_data->aeqe_dma ||
 517	    !vf_data->sqc_dma || !vf_data->cqc_dma) {
 518		dev_info(dev, "resume dma addr is NULL!\n");
 519		hisi_acc_vdev->vf_qm_state = QM_NOT_READY;
 520		return 0;
 521	}
 522
 523	ret = qm_write_regs(qm, QM_VF_STATE, &vf_data->vf_qm_state, 1);
 524	if (ret) {
 525		dev_err(dev, "failed to write QM_VF_STATE\n");
 526		return ret;
 527	}
 528	hisi_acc_vdev->vf_qm_state = vf_data->vf_qm_state;
 529
 530	qm->eqe_dma = vf_data->eqe_dma;
 531	qm->aeqe_dma = vf_data->aeqe_dma;
 532	qm->sqc_dma = vf_data->sqc_dma;
 533	qm->cqc_dma = vf_data->cqc_dma;
 534
 535	qm->qp_base = vf_data->qp_base;
 536	qm->qp_num = vf_data->qp_num;
 537
 538	ret = qm_set_regs(qm, vf_data);
 539	if (ret) {
 540		dev_err(dev, "set VF regs failed\n");
 541		return ret;
 542	}
 543
 544	ret = hisi_qm_mb(qm, QM_MB_CMD_SQC_BT, qm->sqc_dma, 0, 0);
 545	if (ret) {
 546		dev_err(dev, "set sqc failed\n");
 547		return ret;
 548	}
 549
 550	ret = hisi_qm_mb(qm, QM_MB_CMD_CQC_BT, qm->cqc_dma, 0, 0);
 551	if (ret) {
 552		dev_err(dev, "set cqc failed\n");
 553		return ret;
 554	}
 555
 556	qm_dev_cmd_init(qm);
 557	return 0;
 558}
 559
 560static int vf_qm_read_data(struct hisi_qm *vf_qm, struct acc_vf_data *vf_data)
 561{
 562	struct device *dev = &vf_qm->pdev->dev;
 563	int ret;
 564
 565	ret = qm_get_regs(vf_qm, vf_data);
 566	if (ret)
 567		return ret;
 568
 569	/* Every reg is 32 bit, the dma address is 64 bit. */
 570	vf_data->eqe_dma = vf_data->qm_eqc_dw[QM_XQC_ADDR_HIGH];
 571	vf_data->eqe_dma <<= QM_XQC_ADDR_OFFSET;
 572	vf_data->eqe_dma |= vf_data->qm_eqc_dw[QM_XQC_ADDR_LOW];
 573	vf_data->aeqe_dma = vf_data->qm_aeqc_dw[QM_XQC_ADDR_HIGH];
 574	vf_data->aeqe_dma <<= QM_XQC_ADDR_OFFSET;
 575	vf_data->aeqe_dma |= vf_data->qm_aeqc_dw[QM_XQC_ADDR_LOW];
 576
 577	/* Through SQC_BT/CQC_BT to get sqc and cqc address */
 578	ret = qm_get_sqc(vf_qm, &vf_data->sqc_dma);
 579	if (ret) {
 580		dev_err(dev, "failed to read SQC addr!\n");
 581		return ret;
 582	}
 583
 584	ret = qm_get_cqc(vf_qm, &vf_data->cqc_dma);
 585	if (ret) {
 586		dev_err(dev, "failed to read CQC addr!\n");
 587		return ret;
 588	}
 589
 590	return 0;
 591}
 592
 593static int vf_qm_state_save(struct hisi_acc_vf_core_device *hisi_acc_vdev,
 594			    struct hisi_acc_vf_migration_file *migf)
 595{
 596	struct acc_vf_data *vf_data = &migf->vf_data;
 597	struct hisi_qm *vf_qm = &hisi_acc_vdev->vf_qm;
 598	int ret;
 599
 600	if (unlikely(qm_wait_dev_not_ready(vf_qm))) {
 601		/* Update state and return with match data */
 602		vf_data->vf_qm_state = QM_NOT_READY;
 603		hisi_acc_vdev->vf_qm_state = vf_data->vf_qm_state;
 604		migf->total_length = QM_MATCH_SIZE;
 605		return 0;
 606	}
 607
 608	vf_data->vf_qm_state = QM_READY;
 609	hisi_acc_vdev->vf_qm_state = vf_data->vf_qm_state;
 610
 611	ret = vf_qm_read_data(vf_qm, vf_data);
 612	if (ret)
 613		return ret;
 614
 615	migf->total_length = sizeof(struct acc_vf_data);
 616	/* Save eqc and aeqc interrupt information */
 617	vf_qm_xeqc_save(vf_qm, migf);
 618
 619	return 0;
 620}
 621
 622static struct hisi_acc_vf_core_device *hisi_acc_drvdata(struct pci_dev *pdev)
 623{
 624	struct vfio_pci_core_device *core_device = dev_get_drvdata(&pdev->dev);
 625
 626	return container_of(core_device, struct hisi_acc_vf_core_device,
 627			    core_device);
 628}
 629
 630/* Check the PF's RAS state and Function INT state */
 631static int
 632hisi_acc_check_int_state(struct hisi_acc_vf_core_device *hisi_acc_vdev)
 633{
 634	struct hisi_qm *vfqm = &hisi_acc_vdev->vf_qm;
 635	struct hisi_qm *qm = hisi_acc_vdev->pf_qm;
 636	struct pci_dev *vf_pdev = hisi_acc_vdev->vf_dev;
 637	struct device *dev = &qm->pdev->dev;
 638	u32 state;
 639
 640	/* Check RAS state */
 641	state = qm_check_reg_state(qm, QM_ABNORMAL_INT_STATUS);
 642	if (state) {
 643		dev_err(dev, "failed to check QM RAS state!\n");
 644		return -EBUSY;
 645	}
 646
 647	/* Check Function Communication state between PF and VF */
 648	state = qm_check_reg_state(vfqm, QM_IFC_INT_STATUS);
 649	if (state) {
 650		dev_err(dev, "failed to check QM IFC INT state!\n");
 651		return -EBUSY;
 652	}
 653	state = qm_check_reg_state(vfqm, QM_IFC_INT_SET_V);
 654	if (state) {
 655		dev_err(dev, "failed to check QM IFC INT SET state!\n");
 656		return -EBUSY;
 657	}
 658
 659	/* Check submodule task state */
 660	switch (vf_pdev->device) {
 661	case PCI_DEVICE_ID_HUAWEI_SEC_VF:
 662		state = qm_check_reg_state(qm, SEC_CORE_INT_STATUS);
 663		if (state) {
 664			dev_err(dev, "failed to check QM SEC Core INT state!\n");
 665			return -EBUSY;
 666		}
 667		return 0;
 668	case PCI_DEVICE_ID_HUAWEI_HPRE_VF:
 669		state = qm_check_reg_state(qm, HPRE_HAC_INT_STATUS);
 670		if (state) {
 671			dev_err(dev, "failed to check QM HPRE HAC INT state!\n");
 672			return -EBUSY;
 673		}
 674		return 0;
 675	case PCI_DEVICE_ID_HUAWEI_ZIP_VF:
 676		state = qm_check_reg_state(qm, HZIP_CORE_INT_STATUS);
 677		if (state) {
 678			dev_err(dev, "failed to check QM ZIP Core INT state!\n");
 679			return -EBUSY;
 680		}
 681		return 0;
 682	default:
 683		dev_err(dev, "failed to detect acc module type!\n");
 684		return -EINVAL;
 685	}
 686}
 687
 688static void hisi_acc_vf_disable_fd(struct hisi_acc_vf_migration_file *migf)
 689{
 690	mutex_lock(&migf->lock);
 691	migf->disabled = true;
 692	migf->total_length = 0;
 693	migf->filp->f_pos = 0;
 694	mutex_unlock(&migf->lock);
 695}
 696
 697static void
 698hisi_acc_debug_migf_copy(struct hisi_acc_vf_core_device *hisi_acc_vdev,
 699			 struct hisi_acc_vf_migration_file *src_migf)
 700{
 701	struct hisi_acc_vf_migration_file *dst_migf = hisi_acc_vdev->debug_migf;
 702
 703	if (!dst_migf)
 704		return;
 705
 706	dst_migf->total_length = src_migf->total_length;
 707	memcpy(&dst_migf->vf_data, &src_migf->vf_data,
 708	       sizeof(struct acc_vf_data));
 709}
 710
 711static void hisi_acc_vf_disable_fds(struct hisi_acc_vf_core_device *hisi_acc_vdev)
 712{
 713	if (hisi_acc_vdev->resuming_migf) {
 714		hisi_acc_debug_migf_copy(hisi_acc_vdev, hisi_acc_vdev->resuming_migf);
 715		hisi_acc_vf_disable_fd(hisi_acc_vdev->resuming_migf);
 716		fput(hisi_acc_vdev->resuming_migf->filp);
 717		hisi_acc_vdev->resuming_migf = NULL;
 718	}
 719
 720	if (hisi_acc_vdev->saving_migf) {
 721		hisi_acc_debug_migf_copy(hisi_acc_vdev, hisi_acc_vdev->saving_migf);
 722		hisi_acc_vf_disable_fd(hisi_acc_vdev->saving_migf);
 723		fput(hisi_acc_vdev->saving_migf->filp);
 724		hisi_acc_vdev->saving_migf = NULL;
 725	}
 726}
 727
 728static struct hisi_acc_vf_core_device *hisi_acc_get_vf_dev(struct vfio_device *vdev)
 729{
 730	return container_of(vdev, struct hisi_acc_vf_core_device,
 731			    core_device.vdev);
 732}
 733
 734static void hisi_acc_vf_reset(struct hisi_acc_vf_core_device *hisi_acc_vdev)
 735{
 736	hisi_acc_vdev->vf_qm_state = QM_NOT_READY;
 737	hisi_acc_vdev->mig_state = VFIO_DEVICE_STATE_RUNNING;
 738	hisi_acc_vf_disable_fds(hisi_acc_vdev);
 739}
 740
 741static void hisi_acc_vf_start_device(struct hisi_acc_vf_core_device *hisi_acc_vdev)
 742{
 743	struct hisi_qm *vf_qm = &hisi_acc_vdev->vf_qm;
 744
 745	if (hisi_acc_vdev->vf_qm_state != QM_READY)
 746		return;
 747
 748	/* Make sure the device is enabled */
 749	qm_dev_cmd_init(vf_qm);
 750
 751	vf_qm_fun_reset(vf_qm);
 752}
 753
 754static int hisi_acc_vf_load_state(struct hisi_acc_vf_core_device *hisi_acc_vdev)
 755{
 756	struct device *dev = &hisi_acc_vdev->vf_dev->dev;
 757	struct hisi_acc_vf_migration_file *migf = hisi_acc_vdev->resuming_migf;
 758	int ret;
 759
 760	/* Recover data to VF */
 761	ret = vf_qm_load_data(hisi_acc_vdev, migf);
 762	if (ret) {
 763		dev_err(dev, "failed to recover the VF!\n");
 764		return ret;
 765	}
 766
 767	return 0;
 768}
 769
 770static int hisi_acc_vf_release_file(struct inode *inode, struct file *filp)
 771{
 772	struct hisi_acc_vf_migration_file *migf = filp->private_data;
 773
 774	hisi_acc_vf_disable_fd(migf);
 775	mutex_destroy(&migf->lock);
 776	kfree(migf);
 777	return 0;
 778}
 779
 780static ssize_t hisi_acc_vf_resume_write(struct file *filp, const char __user *buf,
 781					size_t len, loff_t *pos)
 782{
 783	struct hisi_acc_vf_migration_file *migf = filp->private_data;
 784	u8 *vf_data = (u8 *)&migf->vf_data;
 785	loff_t requested_length;
 786	ssize_t done = 0;
 787	int ret;
 788
 789	if (pos)
 790		return -ESPIPE;
 791	pos = &filp->f_pos;
 792
 793	if (*pos < 0 ||
 794	    check_add_overflow((loff_t)len, *pos, &requested_length))
 795		return -EINVAL;
 796
 797	if (requested_length > sizeof(struct acc_vf_data))
 798		return -ENOMEM;
 799
 800	mutex_lock(&migf->lock);
 801	if (migf->disabled) {
 802		done = -ENODEV;
 803		goto out_unlock;
 804	}
 805
 806	ret = copy_from_user(vf_data + *pos, buf, len);
 807	if (ret) {
 808		done = -EFAULT;
 809		goto out_unlock;
 810	}
 811	*pos += len;
 812	done = len;
 813	migf->total_length += len;
 814
 815	ret = vf_qm_check_match(migf->hisi_acc_vdev, migf);
 816	if (ret)
 817		done = -EFAULT;
 818out_unlock:
 819	mutex_unlock(&migf->lock);
 820	return done;
 821}
 822
 823static const struct file_operations hisi_acc_vf_resume_fops = {
 824	.owner = THIS_MODULE,
 825	.write = hisi_acc_vf_resume_write,
 826	.release = hisi_acc_vf_release_file,
 827};
 828
 829static struct hisi_acc_vf_migration_file *
 830hisi_acc_vf_pci_resume(struct hisi_acc_vf_core_device *hisi_acc_vdev)
 831{
 832	struct hisi_acc_vf_migration_file *migf;
 833
 834	migf = kzalloc(sizeof(*migf), GFP_KERNEL_ACCOUNT);
 835	if (!migf)
 836		return ERR_PTR(-ENOMEM);
 837
 838	migf->filp = anon_inode_getfile("hisi_acc_vf_mig", &hisi_acc_vf_resume_fops, migf,
 839					O_WRONLY);
 840	if (IS_ERR(migf->filp)) {
 841		int err = PTR_ERR(migf->filp);
 842
 843		kfree(migf);
 844		return ERR_PTR(err);
 845	}
 846
 847	stream_open(migf->filp->f_inode, migf->filp);
 848	mutex_init(&migf->lock);
 849	migf->hisi_acc_vdev = hisi_acc_vdev;
 850	return migf;
 851}
 852
 853static long hisi_acc_vf_precopy_ioctl(struct file *filp,
 854				      unsigned int cmd, unsigned long arg)
 855{
 856	struct hisi_acc_vf_migration_file *migf = filp->private_data;
 857	struct hisi_acc_vf_core_device *hisi_acc_vdev = migf->hisi_acc_vdev;
 858	loff_t *pos = &filp->f_pos;
 859	struct vfio_precopy_info info;
 860	unsigned long minsz;
 861	int ret;
 862
 863	if (cmd != VFIO_MIG_GET_PRECOPY_INFO)
 864		return -ENOTTY;
 865
 866	minsz = offsetofend(struct vfio_precopy_info, dirty_bytes);
 867
 868	if (copy_from_user(&info, (void __user *)arg, minsz))
 869		return -EFAULT;
 870	if (info.argsz < minsz)
 871		return -EINVAL;
 872
 873	mutex_lock(&hisi_acc_vdev->state_mutex);
 874	if (hisi_acc_vdev->mig_state != VFIO_DEVICE_STATE_PRE_COPY) {
 875		mutex_unlock(&hisi_acc_vdev->state_mutex);
 876		return -EINVAL;
 877	}
 878
 879	mutex_lock(&migf->lock);
 880
 881	if (migf->disabled) {
 882		ret = -ENODEV;
 883		goto out;
 884	}
 885
 886	if (*pos > migf->total_length) {
 887		ret = -EINVAL;
 888		goto out;
 889	}
 890
 891	info.dirty_bytes = 0;
 892	info.initial_bytes = migf->total_length - *pos;
 893	mutex_unlock(&migf->lock);
 894	mutex_unlock(&hisi_acc_vdev->state_mutex);
 895
 896	return copy_to_user((void __user *)arg, &info, minsz) ? -EFAULT : 0;
 897out:
 898	mutex_unlock(&migf->lock);
 899	mutex_unlock(&hisi_acc_vdev->state_mutex);
 900	return ret;
 901}
 902
 903static ssize_t hisi_acc_vf_save_read(struct file *filp, char __user *buf, size_t len,
 904				     loff_t *pos)
 905{
 906	struct hisi_acc_vf_migration_file *migf = filp->private_data;
 907	ssize_t done = 0;
 908	int ret;
 909
 910	if (pos)
 911		return -ESPIPE;
 912	pos = &filp->f_pos;
 913
 914	mutex_lock(&migf->lock);
 915	if (*pos > migf->total_length) {
 916		done = -EINVAL;
 917		goto out_unlock;
 918	}
 919
 920	if (migf->disabled) {
 921		done = -ENODEV;
 922		goto out_unlock;
 923	}
 924
 925	len = min_t(size_t, migf->total_length - *pos, len);
 926	if (len) {
 927		u8 *vf_data = (u8 *)&migf->vf_data;
 928
 929		ret = copy_to_user(buf, vf_data + *pos, len);
 930		if (ret) {
 931			done = -EFAULT;
 932			goto out_unlock;
 933		}
 934		*pos += len;
 935		done = len;
 936	}
 937out_unlock:
 938	mutex_unlock(&migf->lock);
 939	return done;
 940}
 941
 942static const struct file_operations hisi_acc_vf_save_fops = {
 943	.owner = THIS_MODULE,
 944	.read = hisi_acc_vf_save_read,
 945	.unlocked_ioctl = hisi_acc_vf_precopy_ioctl,
 946	.compat_ioctl = compat_ptr_ioctl,
 947	.release = hisi_acc_vf_release_file,
 948};
 949
 950static struct hisi_acc_vf_migration_file *
 951hisi_acc_open_saving_migf(struct hisi_acc_vf_core_device *hisi_acc_vdev)
 952{
 953	struct hisi_acc_vf_migration_file *migf;
 954	int ret;
 955
 956	migf = kzalloc(sizeof(*migf), GFP_KERNEL_ACCOUNT);
 957	if (!migf)
 958		return ERR_PTR(-ENOMEM);
 959
 960	migf->filp = anon_inode_getfile("hisi_acc_vf_mig", &hisi_acc_vf_save_fops, migf,
 961					O_RDONLY);
 962	if (IS_ERR(migf->filp)) {
 963		int err = PTR_ERR(migf->filp);
 964
 965		kfree(migf);
 966		return ERR_PTR(err);
 967	}
 968
 969	stream_open(migf->filp->f_inode, migf->filp);
 970	mutex_init(&migf->lock);
 971	migf->hisi_acc_vdev = hisi_acc_vdev;
 972
 973	ret = vf_qm_get_match_data(hisi_acc_vdev, &migf->vf_data);
 974	if (ret) {
 975		fput(migf->filp);
 976		return ERR_PTR(ret);
 977	}
 978
 979	return migf;
 980}
 981
 982static struct hisi_acc_vf_migration_file *
 983hisi_acc_vf_pre_copy(struct hisi_acc_vf_core_device *hisi_acc_vdev)
 984{
 985	struct hisi_acc_vf_migration_file *migf;
 986
 987	migf = hisi_acc_open_saving_migf(hisi_acc_vdev);
 988	if (IS_ERR(migf))
 989		return migf;
 990
 991	migf->total_length = QM_MATCH_SIZE;
 992	return migf;
 993}
 994
 995static struct hisi_acc_vf_migration_file *
 996hisi_acc_vf_stop_copy(struct hisi_acc_vf_core_device *hisi_acc_vdev, bool open)
 997{
 998	int ret;
 999	struct hisi_acc_vf_migration_file *migf = NULL;
1000
1001	if (open) {
1002		/*
1003		 * Userspace didn't use PRECOPY support. Hence saving_migf
1004		 * is not opened yet.
1005		 */
1006		migf = hisi_acc_open_saving_migf(hisi_acc_vdev);
1007		if (IS_ERR(migf))
1008			return migf;
1009	} else {
1010		migf = hisi_acc_vdev->saving_migf;
1011	}
1012
1013	ret = vf_qm_state_save(hisi_acc_vdev, migf);
1014	if (ret)
1015		return ERR_PTR(ret);
1016
1017	return open ? migf : NULL;
1018}
1019
1020static int hisi_acc_vf_stop_device(struct hisi_acc_vf_core_device *hisi_acc_vdev)
1021{
1022	struct device *dev = &hisi_acc_vdev->vf_dev->dev;
1023	struct hisi_qm *vf_qm = &hisi_acc_vdev->vf_qm;
1024	int ret;
1025
1026	ret = vf_qm_func_stop(vf_qm);
1027	if (ret) {
1028		dev_err(dev, "failed to stop QM VF function!\n");
1029		return ret;
1030	}
1031
1032	ret = hisi_acc_check_int_state(hisi_acc_vdev);
1033	if (ret) {
1034		dev_err(dev, "failed to check QM INT state!\n");
1035		return ret;
1036	}
1037
1038	ret = vf_qm_cache_wb(vf_qm);
1039	if (ret) {
1040		dev_err(dev, "failed to writeback QM cache!\n");
1041		return ret;
1042	}
1043
1044	return 0;
1045}
1046
1047static struct file *
1048hisi_acc_vf_set_device_state(struct hisi_acc_vf_core_device *hisi_acc_vdev,
1049			     u32 new)
1050{
1051	u32 cur = hisi_acc_vdev->mig_state;
1052	int ret;
1053
1054	if (cur == VFIO_DEVICE_STATE_RUNNING && new == VFIO_DEVICE_STATE_PRE_COPY) {
1055		struct hisi_acc_vf_migration_file *migf;
1056
1057		migf = hisi_acc_vf_pre_copy(hisi_acc_vdev);
1058		if (IS_ERR(migf))
1059			return ERR_CAST(migf);
1060		get_file(migf->filp);
1061		hisi_acc_vdev->saving_migf = migf;
1062		return migf->filp;
1063	}
1064
1065	if (cur == VFIO_DEVICE_STATE_PRE_COPY && new == VFIO_DEVICE_STATE_STOP_COPY) {
1066		struct hisi_acc_vf_migration_file *migf;
1067
1068		ret = hisi_acc_vf_stop_device(hisi_acc_vdev);
1069		if (ret)
1070			return ERR_PTR(ret);
1071
1072		migf = hisi_acc_vf_stop_copy(hisi_acc_vdev, false);
1073		if (IS_ERR(migf))
1074			return ERR_CAST(migf);
1075
1076		return NULL;
1077	}
1078
1079	if (cur == VFIO_DEVICE_STATE_RUNNING && new == VFIO_DEVICE_STATE_STOP) {
1080		ret = hisi_acc_vf_stop_device(hisi_acc_vdev);
1081		if (ret)
1082			return ERR_PTR(ret);
1083		return NULL;
1084	}
1085
1086	if (cur == VFIO_DEVICE_STATE_STOP && new == VFIO_DEVICE_STATE_STOP_COPY) {
1087		struct hisi_acc_vf_migration_file *migf;
1088
1089		migf = hisi_acc_vf_stop_copy(hisi_acc_vdev, true);
1090		if (IS_ERR(migf))
1091			return ERR_CAST(migf);
1092		get_file(migf->filp);
1093		hisi_acc_vdev->saving_migf = migf;
1094		return migf->filp;
1095	}
1096
1097	if ((cur == VFIO_DEVICE_STATE_STOP_COPY && new == VFIO_DEVICE_STATE_STOP)) {
1098		hisi_acc_vf_disable_fds(hisi_acc_vdev);
1099		return NULL;
1100	}
1101
1102	if (cur == VFIO_DEVICE_STATE_STOP && new == VFIO_DEVICE_STATE_RESUMING) {
1103		struct hisi_acc_vf_migration_file *migf;
1104
1105		migf = hisi_acc_vf_pci_resume(hisi_acc_vdev);
1106		if (IS_ERR(migf))
1107			return ERR_CAST(migf);
1108		get_file(migf->filp);
1109		hisi_acc_vdev->resuming_migf = migf;
1110		return migf->filp;
1111	}
1112
1113	if (cur == VFIO_DEVICE_STATE_RESUMING && new == VFIO_DEVICE_STATE_STOP) {
1114		ret = hisi_acc_vf_load_state(hisi_acc_vdev);
1115		if (ret)
1116			return ERR_PTR(ret);
1117		hisi_acc_vf_disable_fds(hisi_acc_vdev);
1118		return NULL;
1119	}
1120
1121	if (cur == VFIO_DEVICE_STATE_PRE_COPY && new == VFIO_DEVICE_STATE_RUNNING) {
1122		hisi_acc_vf_disable_fds(hisi_acc_vdev);
1123		return NULL;
1124	}
1125
1126	if (cur == VFIO_DEVICE_STATE_STOP && new == VFIO_DEVICE_STATE_RUNNING) {
1127		hisi_acc_vf_start_device(hisi_acc_vdev);
1128		return NULL;
1129	}
1130
1131	/*
1132	 * vfio_mig_get_next_state() does not use arcs other than the above
1133	 */
1134	WARN_ON(true);
1135	return ERR_PTR(-EINVAL);
1136}
1137
1138static struct file *
1139hisi_acc_vfio_pci_set_device_state(struct vfio_device *vdev,
1140				   enum vfio_device_mig_state new_state)
1141{
1142	struct hisi_acc_vf_core_device *hisi_acc_vdev = hisi_acc_get_vf_dev(vdev);
1143	enum vfio_device_mig_state next_state;
1144	struct file *res = NULL;
1145	int ret;
1146
1147	mutex_lock(&hisi_acc_vdev->state_mutex);
1148	while (new_state != hisi_acc_vdev->mig_state) {
1149		ret = vfio_mig_get_next_state(vdev,
1150					      hisi_acc_vdev->mig_state,
1151					      new_state, &next_state);
1152		if (ret) {
1153			res = ERR_PTR(-EINVAL);
1154			break;
1155		}
1156
1157		res = hisi_acc_vf_set_device_state(hisi_acc_vdev, next_state);
1158		if (IS_ERR(res))
1159			break;
1160		hisi_acc_vdev->mig_state = next_state;
1161		if (WARN_ON(res && new_state != hisi_acc_vdev->mig_state)) {
1162			fput(res);
1163			res = ERR_PTR(-EINVAL);
1164			break;
1165		}
1166	}
1167	mutex_unlock(&hisi_acc_vdev->state_mutex);
1168	return res;
1169}
1170
1171static int
1172hisi_acc_vfio_pci_get_data_size(struct vfio_device *vdev,
1173				unsigned long *stop_copy_length)
1174{
1175	*stop_copy_length = sizeof(struct acc_vf_data);
1176	return 0;
1177}
1178
1179static int
1180hisi_acc_vfio_pci_get_device_state(struct vfio_device *vdev,
1181				   enum vfio_device_mig_state *curr_state)
1182{
1183	struct hisi_acc_vf_core_device *hisi_acc_vdev = hisi_acc_get_vf_dev(vdev);
1184
1185	mutex_lock(&hisi_acc_vdev->state_mutex);
1186	*curr_state = hisi_acc_vdev->mig_state;
1187	mutex_unlock(&hisi_acc_vdev->state_mutex);
1188	return 0;
1189}
1190
1191static void hisi_acc_vf_pci_reset_prepare(struct pci_dev *pdev)
1192{
1193	struct hisi_acc_vf_core_device *hisi_acc_vdev = hisi_acc_drvdata(pdev);
1194	struct hisi_qm *qm = hisi_acc_vdev->pf_qm;
1195	struct device *dev = &qm->pdev->dev;
1196	u32 delay = 0;
1197
1198	/* All reset requests need to be queued for processing */
1199	while (test_and_set_bit(QM_RESETTING, &qm->misc_ctl)) {
1200		msleep(1);
1201		if (++delay > QM_RESET_WAIT_TIMEOUT) {
1202			dev_err(dev, "reset prepare failed\n");
1203			return;
1204		}
1205	}
1206
1207	hisi_acc_vdev->set_reset_flag = true;
1208}
1209
1210static void hisi_acc_vf_pci_aer_reset_done(struct pci_dev *pdev)
1211{
1212	struct hisi_acc_vf_core_device *hisi_acc_vdev = hisi_acc_drvdata(pdev);
1213	struct hisi_qm *qm = hisi_acc_vdev->pf_qm;
1214
1215	if (hisi_acc_vdev->set_reset_flag)
1216		clear_bit(QM_RESETTING, &qm->misc_ctl);
1217
1218	if (!hisi_acc_vdev->core_device.vdev.mig_ops)
1219		return;
1220
1221	mutex_lock(&hisi_acc_vdev->state_mutex);
1222	hisi_acc_vf_reset(hisi_acc_vdev);
1223	mutex_unlock(&hisi_acc_vdev->state_mutex);
1224}
1225
1226static int hisi_acc_vf_qm_init(struct hisi_acc_vf_core_device *hisi_acc_vdev)
1227{
1228	struct vfio_pci_core_device *vdev = &hisi_acc_vdev->core_device;
1229	struct hisi_qm *vf_qm = &hisi_acc_vdev->vf_qm;
1230	struct hisi_qm *pf_qm = hisi_acc_vdev->pf_qm;
1231	struct pci_dev *vf_dev = vdev->pdev;
1232	u32 val;
1233
1234	val = readl(pf_qm->io_base + QM_MIG_REGION_SEL);
1235	if (pf_qm->ver > QM_HW_V3 && (val & QM_MIG_REGION_EN))
1236		hisi_acc_vdev->drv_mode = HW_ACC_MIG_PF_CTRL;
1237	else
1238		hisi_acc_vdev->drv_mode = HW_ACC_MIG_VF_CTRL;
1239
1240	if (hisi_acc_vdev->drv_mode == HW_ACC_MIG_PF_CTRL) {
1241		/*
1242		 * On hardware platforms greater than QM_HW_V3, the migration function
1243		 * register is placed in the BAR2 configuration region of the PF,
1244		 * and each VF device occupies 8KB of configuration space.
1245		 */
1246		vf_qm->io_base = pf_qm->io_base + QM_MIG_REGION_OFFSET +
1247				 hisi_acc_vdev->vf_id * QM_MIG_REGION_SIZE;
1248	} else {
1249		/*
1250		 * ACC VF dev BAR2 region consists of both functional register space
1251		 * and migration control register space. For migration to work, we
1252		 * need access to both. Hence, we map the entire BAR2 region here.
1253		 * But unnecessarily exposing the migration BAR region to the Guest
1254		 * has the potential to prevent/corrupt the Guest migration. Hence,
1255		 * we restrict access to the migration control space from
1256		 * Guest(Please see mmap/ioctl/read/write override functions).
1257		 *
1258		 * Please note that it is OK to expose the entire VF BAR if migration
1259		 * is not supported or required as this cannot affect the ACC PF
1260		 * configurations.
1261		 *
1262		 * Also the HiSilicon ACC VF devices supported by this driver on
1263		 * HiSilicon hardware platforms are integrated end point devices
1264		 * and the platform lacks the capability to perform any PCIe P2P
1265		 * between these devices.
1266		 */
1267
1268		vf_qm->io_base =
1269			ioremap(pci_resource_start(vf_dev, VFIO_PCI_BAR2_REGION_INDEX),
1270				pci_resource_len(vf_dev, VFIO_PCI_BAR2_REGION_INDEX));
1271		if (!vf_qm->io_base)
1272			return -EIO;
1273	}
1274	vf_qm->fun_type = QM_HW_VF;
1275	vf_qm->ver = pf_qm->ver;
1276	vf_qm->pdev = vf_dev;
1277	mutex_init(&vf_qm->mailbox_lock);
1278
1279	return 0;
1280}
1281
1282static struct hisi_qm *hisi_acc_get_pf_qm(struct pci_dev *pdev)
1283{
1284	struct hisi_qm	*pf_qm;
1285	struct pci_driver *pf_driver;
1286
1287	if (!pdev->is_virtfn)
1288		return NULL;
1289
1290	switch (pdev->device) {
1291	case PCI_DEVICE_ID_HUAWEI_SEC_VF:
1292		pf_driver = hisi_sec_get_pf_driver();
1293		break;
1294	case PCI_DEVICE_ID_HUAWEI_HPRE_VF:
1295		pf_driver = hisi_hpre_get_pf_driver();
1296		break;
1297	case PCI_DEVICE_ID_HUAWEI_ZIP_VF:
1298		pf_driver = hisi_zip_get_pf_driver();
1299		break;
1300	default:
1301		return NULL;
1302	}
1303
1304	if (!pf_driver)
1305		return NULL;
1306
1307	pf_qm = pci_iov_get_pf_drvdata(pdev, pf_driver);
1308
1309	return !IS_ERR(pf_qm) ? pf_qm : NULL;
1310}
1311
1312static size_t hisi_acc_get_resource_len(struct vfio_pci_core_device *vdev,
1313					unsigned int index)
1314{
1315	struct hisi_acc_vf_core_device *hisi_acc_vdev =
1316			hisi_acc_drvdata(vdev->pdev);
1317
1318	/*
1319	 * On the old HW_ACC_MIG_VF_CTRL mode device, the ACC VF device
1320	 * BAR2 region encompasses both functional register space
1321	 * and migration control register space.
1322	 * only the functional region should be report to Guest.
1323	 */
1324	if (hisi_acc_vdev->drv_mode == HW_ACC_MIG_VF_CTRL)
1325		return (pci_resource_len(vdev->pdev, index) >> 1);
1326	/*
1327	 * On the new HW device, the migration control register
1328	 * has been moved to the PF device BAR2 region.
1329	 * The VF device BAR2 is entirely functional register space.
1330	 */
1331	return pci_resource_len(vdev->pdev, index);
1332}
1333
1334static int hisi_acc_pci_rw_access_check(struct vfio_device *core_vdev,
1335					size_t count, loff_t *ppos,
1336					size_t *new_count)
1337{
1338	unsigned int index = VFIO_PCI_OFFSET_TO_INDEX(*ppos);
1339	struct vfio_pci_core_device *vdev =
1340		container_of(core_vdev, struct vfio_pci_core_device, vdev);
1341
1342	if (index == VFIO_PCI_BAR2_REGION_INDEX) {
1343		loff_t pos = *ppos & VFIO_PCI_OFFSET_MASK;
1344		resource_size_t end;
1345
1346		end = hisi_acc_get_resource_len(vdev, index);
1347		/* Check if access is for migration control region */
1348		if (pos >= end)
1349			return -EINVAL;
1350
1351		*new_count = min(count, (size_t)(end - pos));
1352	}
1353
1354	return 0;
1355}
1356
1357static int hisi_acc_vfio_pci_mmap(struct vfio_device *core_vdev,
1358				  struct vm_area_struct *vma)
1359{
1360	struct vfio_pci_core_device *vdev =
1361		container_of(core_vdev, struct vfio_pci_core_device, vdev);
1362	unsigned int index;
1363
1364	index = vma->vm_pgoff >> (VFIO_PCI_OFFSET_SHIFT - PAGE_SHIFT);
1365	if (index == VFIO_PCI_BAR2_REGION_INDEX) {
1366		u64 req_len, pgoff, req_start;
1367		resource_size_t end;
1368
1369		end = hisi_acc_get_resource_len(vdev, index);
1370		req_len = vma->vm_end - vma->vm_start;
1371		pgoff = vma->vm_pgoff &
1372			((1U << (VFIO_PCI_OFFSET_SHIFT - PAGE_SHIFT)) - 1);
1373		req_start = pgoff << PAGE_SHIFT;
1374
1375		if (req_start + req_len > end)
1376			return -EINVAL;
1377	}
1378
1379	return vfio_pci_core_mmap(core_vdev, vma);
1380}
1381
1382static ssize_t hisi_acc_vfio_pci_write(struct vfio_device *core_vdev,
1383				       const char __user *buf, size_t count,
1384				       loff_t *ppos)
1385{
1386	size_t new_count = count;
1387	int ret;
1388
1389	ret = hisi_acc_pci_rw_access_check(core_vdev, count, ppos, &new_count);
1390	if (ret)
1391		return ret;
1392
1393	return vfio_pci_core_write(core_vdev, buf, new_count, ppos);
1394}
1395
1396static ssize_t hisi_acc_vfio_pci_read(struct vfio_device *core_vdev,
1397				      char __user *buf, size_t count,
1398				      loff_t *ppos)
1399{
1400	size_t new_count = count;
1401	int ret;
1402
1403	ret = hisi_acc_pci_rw_access_check(core_vdev, count, ppos, &new_count);
1404	if (ret)
1405		return ret;
1406
1407	return vfio_pci_core_read(core_vdev, buf, new_count, ppos);
1408}
1409
1410static int hisi_acc_vfio_ioctl_get_region(struct vfio_device *core_vdev,
1411					  struct vfio_region_info *info,
1412					  struct vfio_info_cap *caps)
1413{
1414	struct vfio_pci_core_device *vdev =
1415		container_of(core_vdev, struct vfio_pci_core_device, vdev);
1416
1417	if (info->index != VFIO_PCI_BAR2_REGION_INDEX)
1418		return vfio_pci_ioctl_get_region_info(core_vdev, info, caps);
1419
1420	info->offset = VFIO_PCI_INDEX_TO_OFFSET(info->index);
1421
1422	info->size = hisi_acc_get_resource_len(vdev, info->index);
1423
1424	info->flags = VFIO_REGION_INFO_FLAG_READ | VFIO_REGION_INFO_FLAG_WRITE |
1425		     VFIO_REGION_INFO_FLAG_MMAP;
1426	return 0;
1427}
1428
1429static int hisi_acc_vf_debug_check(struct seq_file *seq, struct vfio_device *vdev)
1430{
1431	struct hisi_acc_vf_core_device *hisi_acc_vdev = hisi_acc_get_vf_dev(vdev);
1432	struct hisi_qm *vf_qm = &hisi_acc_vdev->vf_qm;
1433	int ret;
1434
1435	lockdep_assert_held(&hisi_acc_vdev->open_mutex);
1436	/*
1437	 * When the device is not opened, the io_base is not mapped.
1438	 * The driver cannot perform device read and write operations.
1439	 */
1440	if (!hisi_acc_vdev->dev_opened) {
1441		seq_puts(seq, "device not opened!\n");
1442		return -EINVAL;
1443	}
1444
1445	ret = qm_wait_dev_not_ready(vf_qm);
1446	if (ret) {
1447		seq_puts(seq, "VF device not ready!\n");
1448		return ret;
1449	}
1450
1451	return 0;
1452}
1453
1454static int hisi_acc_vf_debug_cmd(struct seq_file *seq, void *data)
1455{
1456	struct device *vf_dev = seq->private;
1457	struct vfio_pci_core_device *core_device = dev_get_drvdata(vf_dev);
1458	struct vfio_device *vdev = &core_device->vdev;
1459	struct hisi_acc_vf_core_device *hisi_acc_vdev = hisi_acc_get_vf_dev(vdev);
1460	struct hisi_qm *vf_qm = &hisi_acc_vdev->vf_qm;
1461	u64 value;
1462	int ret;
1463
1464	mutex_lock(&hisi_acc_vdev->open_mutex);
1465	ret = hisi_acc_vf_debug_check(seq, vdev);
1466	if (ret) {
1467		mutex_unlock(&hisi_acc_vdev->open_mutex);
1468		return ret;
1469	}
1470
1471	value = readl(vf_qm->io_base + QM_MB_CMD_SEND_BASE);
1472	if (value == QM_MB_CMD_NOT_READY) {
1473		mutex_unlock(&hisi_acc_vdev->open_mutex);
1474		seq_puts(seq, "mailbox cmd channel not ready!\n");
1475		return -EINVAL;
1476	}
1477	mutex_unlock(&hisi_acc_vdev->open_mutex);
1478	seq_puts(seq, "mailbox cmd channel ready!\n");
1479
1480	return 0;
1481}
1482
1483static int hisi_acc_vf_dev_read(struct seq_file *seq, void *data)
1484{
1485	struct device *vf_dev = seq->private;
1486	struct vfio_pci_core_device *core_device = dev_get_drvdata(vf_dev);
1487	struct vfio_device *vdev = &core_device->vdev;
1488	struct hisi_acc_vf_core_device *hisi_acc_vdev = hisi_acc_get_vf_dev(vdev);
1489	size_t vf_data_sz = offsetofend(struct acc_vf_data, padding);
1490	struct acc_vf_data *vf_data;
1491	int ret;
1492
1493	mutex_lock(&hisi_acc_vdev->open_mutex);
1494	ret = hisi_acc_vf_debug_check(seq, vdev);
1495	if (ret) {
1496		mutex_unlock(&hisi_acc_vdev->open_mutex);
1497		return ret;
1498	}
1499
1500	mutex_lock(&hisi_acc_vdev->state_mutex);
1501	vf_data = kzalloc(sizeof(*vf_data), GFP_KERNEL);
1502	if (!vf_data) {
1503		ret = -ENOMEM;
1504		goto mutex_release;
1505	}
1506
1507	vf_data->vf_qm_state = hisi_acc_vdev->vf_qm_state;
1508	ret = vf_qm_read_data(&hisi_acc_vdev->vf_qm, vf_data);
1509	if (ret)
1510		goto migf_err;
1511
1512	seq_hex_dump(seq, "Dev Data:", DUMP_PREFIX_OFFSET, 16, 1,
1513		     (const void *)vf_data, vf_data_sz, false);
1514
1515	seq_printf(seq,
1516		   "guest driver load: %u\n"
1517		   "data size: %lu\n",
1518		   hisi_acc_vdev->vf_qm_state,
1519		   sizeof(struct acc_vf_data));
1520
1521migf_err:
1522	kfree(vf_data);
1523mutex_release:
1524	mutex_unlock(&hisi_acc_vdev->state_mutex);
1525	mutex_unlock(&hisi_acc_vdev->open_mutex);
1526
1527	return ret;
1528}
1529
1530static int hisi_acc_vf_migf_read(struct seq_file *seq, void *data)
1531{
1532	struct device *vf_dev = seq->private;
1533	struct vfio_pci_core_device *core_device = dev_get_drvdata(vf_dev);
1534	struct vfio_device *vdev = &core_device->vdev;
1535	struct hisi_acc_vf_core_device *hisi_acc_vdev = hisi_acc_get_vf_dev(vdev);
1536	size_t vf_data_sz = offsetofend(struct acc_vf_data, padding);
1537	struct hisi_acc_vf_migration_file *debug_migf = hisi_acc_vdev->debug_migf;
1538
1539	/* Check whether the live migration operation has been performed */
1540	if (debug_migf->total_length < QM_MATCH_SIZE) {
1541		seq_puts(seq, "device not migrated!\n");
1542		return -EAGAIN;
1543	}
1544
1545	seq_hex_dump(seq, "Mig Data:", DUMP_PREFIX_OFFSET, 16, 1,
1546		     (const void *)&debug_migf->vf_data, vf_data_sz, false);
1547	seq_printf(seq, "migrate data length: %lu\n", debug_migf->total_length);
1548
1549	return 0;
1550}
1551
1552static int hisi_acc_vfio_pci_open_device(struct vfio_device *core_vdev)
1553{
1554	struct hisi_acc_vf_core_device *hisi_acc_vdev = hisi_acc_get_vf_dev(core_vdev);
1555	struct vfio_pci_core_device *vdev = &hisi_acc_vdev->core_device;
1556	int ret;
1557
1558	ret = vfio_pci_core_enable(vdev);
1559	if (ret)
1560		return ret;
1561
1562	if (core_vdev->mig_ops) {
1563		mutex_lock(&hisi_acc_vdev->open_mutex);
1564		ret = hisi_acc_vf_qm_init(hisi_acc_vdev);
1565		if (ret) {
1566			mutex_unlock(&hisi_acc_vdev->open_mutex);
1567			vfio_pci_core_disable(vdev);
1568			return ret;
1569		}
1570		hisi_acc_vdev->mig_state = VFIO_DEVICE_STATE_RUNNING;
1571		hisi_acc_vdev->dev_opened = true;
1572		hisi_acc_vdev->match_done = 0;
1573		mutex_unlock(&hisi_acc_vdev->open_mutex);
1574	}
1575
1576	vfio_pci_core_finish_enable(vdev);
1577	return 0;
1578}
1579
1580static void hisi_acc_vfio_pci_close_device(struct vfio_device *core_vdev)
1581{
1582	struct hisi_acc_vf_core_device *hisi_acc_vdev = hisi_acc_get_vf_dev(core_vdev);
1583	struct hisi_qm *vf_qm = &hisi_acc_vdev->vf_qm;
1584
1585	hisi_acc_vf_disable_fds(hisi_acc_vdev);
1586	mutex_lock(&hisi_acc_vdev->open_mutex);
1587	hisi_acc_vdev->dev_opened = false;
1588	if (hisi_acc_vdev->drv_mode == HW_ACC_MIG_VF_CTRL)
1589		iounmap(vf_qm->io_base);
1590	mutex_unlock(&hisi_acc_vdev->open_mutex);
1591	vfio_pci_core_close_device(core_vdev);
1592}
1593
1594static const struct vfio_migration_ops hisi_acc_vfio_pci_migrn_state_ops = {
1595	.migration_set_state = hisi_acc_vfio_pci_set_device_state,
1596	.migration_get_state = hisi_acc_vfio_pci_get_device_state,
1597	.migration_get_data_size = hisi_acc_vfio_pci_get_data_size,
1598};
1599
1600static int hisi_acc_vfio_pci_migrn_init_dev(struct vfio_device *core_vdev)
1601{
1602	struct hisi_acc_vf_core_device *hisi_acc_vdev = hisi_acc_get_vf_dev(core_vdev);
1603	struct pci_dev *pdev = to_pci_dev(core_vdev->dev);
1604	struct hisi_qm *pf_qm = hisi_acc_get_pf_qm(pdev);
1605
1606	hisi_acc_vdev->vf_id = pci_iov_vf_id(pdev) + 1;
1607	hisi_acc_vdev->pf_qm = pf_qm;
1608	hisi_acc_vdev->vf_dev = pdev;
1609	hisi_acc_vdev->vf_qm_state = QM_NOT_READY;
1610	mutex_init(&hisi_acc_vdev->state_mutex);
1611	mutex_init(&hisi_acc_vdev->open_mutex);
1612
1613	core_vdev->migration_flags = VFIO_MIGRATION_STOP_COPY | VFIO_MIGRATION_PRE_COPY;
1614	core_vdev->mig_ops = &hisi_acc_vfio_pci_migrn_state_ops;
1615
1616	return vfio_pci_core_init_dev(core_vdev);
1617}
1618
1619static const struct vfio_device_ops hisi_acc_vfio_pci_migrn_ops = {
1620	.name = "hisi-acc-vfio-pci-migration",
1621	.init = hisi_acc_vfio_pci_migrn_init_dev,
1622	.release = vfio_pci_core_release_dev,
1623	.open_device = hisi_acc_vfio_pci_open_device,
1624	.close_device = hisi_acc_vfio_pci_close_device,
1625	.ioctl = vfio_pci_core_ioctl,
1626	.get_region_info_caps = hisi_acc_vfio_ioctl_get_region,
1627	.device_feature = vfio_pci_core_ioctl_feature,
1628	.read = hisi_acc_vfio_pci_read,
1629	.write = hisi_acc_vfio_pci_write,
1630	.mmap = hisi_acc_vfio_pci_mmap,
1631	.request = vfio_pci_core_request,
1632	.match = vfio_pci_core_match,
1633	.match_token_uuid = vfio_pci_core_match_token_uuid,
1634	.bind_iommufd = vfio_iommufd_physical_bind,
1635	.unbind_iommufd = vfio_iommufd_physical_unbind,
1636	.attach_ioas = vfio_iommufd_physical_attach_ioas,
1637	.detach_ioas = vfio_iommufd_physical_detach_ioas,
1638};
1639
1640static const struct vfio_device_ops hisi_acc_vfio_pci_ops = {
1641	.name = "hisi-acc-vfio-pci",
1642	.init = vfio_pci_core_init_dev,
1643	.release = vfio_pci_core_release_dev,
1644	.open_device = hisi_acc_vfio_pci_open_device,
1645	.close_device = vfio_pci_core_close_device,
1646	.ioctl = vfio_pci_core_ioctl,
1647	.get_region_info_caps = vfio_pci_ioctl_get_region_info,
1648	.device_feature = vfio_pci_core_ioctl_feature,
1649	.read = vfio_pci_core_read,
1650	.write = vfio_pci_core_write,
1651	.mmap = vfio_pci_core_mmap,
1652	.request = vfio_pci_core_request,
1653	.match = vfio_pci_core_match,
1654	.match_token_uuid = vfio_pci_core_match_token_uuid,
1655	.bind_iommufd = vfio_iommufd_physical_bind,
1656	.unbind_iommufd = vfio_iommufd_physical_unbind,
1657	.attach_ioas = vfio_iommufd_physical_attach_ioas,
1658	.detach_ioas = vfio_iommufd_physical_detach_ioas,
1659};
1660
1661static void hisi_acc_vfio_debug_init(struct hisi_acc_vf_core_device *hisi_acc_vdev)
1662{
1663	struct vfio_device *vdev = &hisi_acc_vdev->core_device.vdev;
1664	struct hisi_acc_vf_migration_file *migf;
1665	struct dentry *vfio_dev_migration;
1666	struct dentry *vfio_hisi_acc;
1667	struct device *dev = vdev->dev;
1668
1669	if (!debugfs_initialized() ||
1670	    !IS_ENABLED(CONFIG_VFIO_DEBUGFS))
1671		return;
1672
1673	if (vdev->ops != &hisi_acc_vfio_pci_migrn_ops)
1674		return;
1675
1676	vfio_dev_migration = debugfs_lookup("migration", vdev->debug_root);
1677	if (!vfio_dev_migration) {
1678		dev_err(dev, "failed to lookup migration debugfs file!\n");
1679		return;
1680	}
1681
1682	migf = kzalloc(sizeof(*migf), GFP_KERNEL);
1683	if (!migf) {
1684		dput(vfio_dev_migration);
1685		return;
1686	}
1687	hisi_acc_vdev->debug_migf = migf;
1688
1689	vfio_hisi_acc = debugfs_create_dir("hisi_acc", vfio_dev_migration);
1690	debugfs_create_devm_seqfile(dev, "dev_data", vfio_hisi_acc,
1691				    hisi_acc_vf_dev_read);
1692	debugfs_create_devm_seqfile(dev, "migf_data", vfio_hisi_acc,
1693				    hisi_acc_vf_migf_read);
1694	debugfs_create_devm_seqfile(dev, "cmd_state", vfio_hisi_acc,
1695				    hisi_acc_vf_debug_cmd);
1696
1697	dput(vfio_dev_migration);
1698}
1699
1700static void hisi_acc_vf_debugfs_exit(struct hisi_acc_vf_core_device *hisi_acc_vdev)
1701{
1702	kfree(hisi_acc_vdev->debug_migf);
1703	hisi_acc_vdev->debug_migf = NULL;
1704}
1705
1706static int hisi_acc_vfio_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
1707{
1708	struct hisi_acc_vf_core_device *hisi_acc_vdev;
1709	const struct vfio_device_ops *ops = &hisi_acc_vfio_pci_ops;
1710	struct hisi_qm *pf_qm;
1711	int vf_id;
1712	int ret;
1713
1714	pf_qm = hisi_acc_get_pf_qm(pdev);
1715	if (pf_qm && pf_qm->ver >= QM_HW_V3) {
1716		vf_id = pci_iov_vf_id(pdev);
1717		if (vf_id >= 0)
1718			ops = &hisi_acc_vfio_pci_migrn_ops;
1719		else
1720			pci_warn(pdev, "migration support failed, continue with generic interface\n");
1721	}
1722
1723	hisi_acc_vdev = vfio_alloc_device(hisi_acc_vf_core_device,
1724					  core_device.vdev, &pdev->dev, ops);
1725	if (IS_ERR(hisi_acc_vdev))
1726		return PTR_ERR(hisi_acc_vdev);
1727
1728	dev_set_drvdata(&pdev->dev, &hisi_acc_vdev->core_device);
1729	ret = vfio_pci_core_register_device(&hisi_acc_vdev->core_device);
1730	if (ret)
1731		goto out_put_vdev;
1732
1733	hisi_acc_vfio_debug_init(hisi_acc_vdev);
1734	return 0;
1735
1736out_put_vdev:
1737	vfio_put_device(&hisi_acc_vdev->core_device.vdev);
1738	return ret;
1739}
1740
1741static void hisi_acc_vfio_pci_remove(struct pci_dev *pdev)
1742{
1743	struct hisi_acc_vf_core_device *hisi_acc_vdev = hisi_acc_drvdata(pdev);
1744
1745	vfio_pci_core_unregister_device(&hisi_acc_vdev->core_device);
1746	hisi_acc_vf_debugfs_exit(hisi_acc_vdev);
1747	vfio_put_device(&hisi_acc_vdev->core_device.vdev);
1748}
1749
1750static const struct pci_device_id hisi_acc_vfio_pci_table[] = {
1751	{ PCI_DRIVER_OVERRIDE_DEVICE_VFIO(PCI_VENDOR_ID_HUAWEI, PCI_DEVICE_ID_HUAWEI_SEC_VF) },
1752	{ PCI_DRIVER_OVERRIDE_DEVICE_VFIO(PCI_VENDOR_ID_HUAWEI, PCI_DEVICE_ID_HUAWEI_HPRE_VF) },
1753	{ PCI_DRIVER_OVERRIDE_DEVICE_VFIO(PCI_VENDOR_ID_HUAWEI, PCI_DEVICE_ID_HUAWEI_ZIP_VF) },
1754	{ }
1755};
1756
1757MODULE_DEVICE_TABLE(pci, hisi_acc_vfio_pci_table);
1758
1759static const struct pci_error_handlers hisi_acc_vf_err_handlers = {
1760	.reset_prepare = hisi_acc_vf_pci_reset_prepare,
1761	.reset_done = hisi_acc_vf_pci_aer_reset_done,
1762	.error_detected = vfio_pci_core_aer_err_detected,
1763};
1764
1765static struct pci_driver hisi_acc_vfio_pci_driver = {
1766	.name = KBUILD_MODNAME,
1767	.id_table = hisi_acc_vfio_pci_table,
1768	.probe = hisi_acc_vfio_pci_probe,
1769	.remove = hisi_acc_vfio_pci_remove,
1770	.err_handler = &hisi_acc_vf_err_handlers,
1771	.driver_managed_dma = true,
1772};
1773
1774module_pci_driver(hisi_acc_vfio_pci_driver);
1775
1776MODULE_LICENSE("GPL v2");
1777MODULE_AUTHOR("Liu Longfang <liulongfang@huawei.com>");
1778MODULE_AUTHOR("Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>");
1779MODULE_DESCRIPTION("HiSilicon VFIO PCI - VFIO PCI driver with live migration support for HiSilicon ACC device family");
~/ Read-only file preview.