xref: /dpdk/drivers/common/qat/qat_pf2vf.c (revision f665790a5dbad7b645ff46f31d65e977324e7bfc)
1b17d16fbSArek Kusztal /* SPDX-License-Identifier: BSD-3-Clause
2b17d16fbSArek Kusztal  * Copyright(c) 2021 Intel Corporation
3b17d16fbSArek Kusztal  */
4b17d16fbSArek Kusztal 
5b17d16fbSArek Kusztal #include "qat_pf2vf.h"
6b17d16fbSArek Kusztal #include "adf_pf2vf_msg.h"
7b17d16fbSArek Kusztal 
8b17d16fbSArek Kusztal #include <rte_cycles.h>
9b17d16fbSArek Kusztal 
10b17d16fbSArek Kusztal int qat_pf2vf_exch_msg(struct qat_pci_device *qat_dev,
11b17d16fbSArek Kusztal 		struct qat_pf2vf_msg pf2vf_msg,
12b17d16fbSArek Kusztal 		int len, uint8_t *ret)
13b17d16fbSArek Kusztal {
14b17d16fbSArek Kusztal 	int i = 0;
15b17d16fbSArek Kusztal 	struct qat_pf2vf_dev *qat_pf2vf =
16b17d16fbSArek Kusztal 	qat_gen_config[qat_dev->qat_dev_gen].pf2vf_dev;
17b17d16fbSArek Kusztal 	void *pmisc_bar_addr = qat_dev->misc_bar_io_addr;
18b17d16fbSArek Kusztal 	uint32_t msg = 0, count = 0, val = 0;
19b17d16fbSArek Kusztal 	uint32_t vf_csr_off = qat_pf2vf->vf2pf_offset;
20b17d16fbSArek Kusztal 	uint32_t pf_csr_off = qat_pf2vf->pf2vf_offset;
21b17d16fbSArek Kusztal 	int type_shift = qat_pf2vf->pf2vf_type_shift;
22b17d16fbSArek Kusztal 	uint32_t type_mask = qat_pf2vf->pf2vf_type_mask;
23b17d16fbSArek Kusztal 	int blck_hdr_shift = qat_pf2vf->pf2vf_data_shift;
24b17d16fbSArek Kusztal 	int data_shift = blck_hdr_shift;
25b17d16fbSArek Kusztal 
26b17d16fbSArek Kusztal 	switch (pf2vf_msg.msg_type) {
27b17d16fbSArek Kusztal 	case ADF_VF2PF_MSGTYPE_GET_SMALL_BLOCK_REQ:
28b17d16fbSArek Kusztal 		data_shift += ADF_VF2PF_SMALL_BLOCK_BYTE_NUM_SHIFT;
29b17d16fbSArek Kusztal 		break;
30b17d16fbSArek Kusztal 	case ADF_VF2PF_MSGTYPE_GET_MEDIUM_BLOCK_REQ:
31b17d16fbSArek Kusztal 		data_shift += ADF_VF2PF_MEDIUM_BLOCK_BYTE_NUM_SHIFT;
32b17d16fbSArek Kusztal 		break;
33b17d16fbSArek Kusztal 	case ADF_VF2PF_MSGTYPE_GET_LARGE_BLOCK_REQ:
34b17d16fbSArek Kusztal 		data_shift += ADF_VF2PF_LARGE_BLOCK_BYTE_NUM_SHIFT;
35b17d16fbSArek Kusztal 		break;
36b17d16fbSArek Kusztal 	}
37b17d16fbSArek Kusztal 
38b17d16fbSArek Kusztal 	if ((pf2vf_msg.msg_type & type_mask) != pf2vf_msg.msg_type) {
39*f665790aSDavid Marchand 		QAT_LOG(ERR, "PF2VF message type 0x%X out of range",
40b17d16fbSArek Kusztal 			pf2vf_msg.msg_type);
41b17d16fbSArek Kusztal 		return -EINVAL;
42b17d16fbSArek Kusztal 	}
43b17d16fbSArek Kusztal 
44b17d16fbSArek Kusztal 	for (; i < len; i++) {
45b17d16fbSArek Kusztal 		count = 0;
46b17d16fbSArek Kusztal 		if (len == 1) {
47b17d16fbSArek Kusztal 			msg = (pf2vf_msg.msg_type << type_shift) |
48b17d16fbSArek Kusztal 				(pf2vf_msg.msg_data << (data_shift));
49b17d16fbSArek Kusztal 		} else
50b17d16fbSArek Kusztal 			msg = (pf2vf_msg.msg_type << type_shift) |
51b17d16fbSArek Kusztal 				((pf2vf_msg.msg_data + i) << (data_shift));
52b17d16fbSArek Kusztal 		if (pf2vf_msg.block_hdr > 0)
53b17d16fbSArek Kusztal 			msg |= pf2vf_msg.block_hdr << blck_hdr_shift;
54b17d16fbSArek Kusztal 		msg |= ADF_PFVF_INT | ADF_PFVF_MSGORIGIN_SYSTEM;
55b17d16fbSArek Kusztal 
56b17d16fbSArek Kusztal 		ADF_CSR_WR(pmisc_bar_addr, vf_csr_off, msg);
57b17d16fbSArek Kusztal 		/*
58b17d16fbSArek Kusztal 		 * Wait for confirmation from remote that it received
59b17d16fbSArek Kusztal 		 * the message
60b17d16fbSArek Kusztal 		 */
61b17d16fbSArek Kusztal 		do {
6266c0ad1fSArek Kusztal 			rte_delay_us_sleep(ADF_IOV_MSG_ACK_DELAY_US * 2);
63b17d16fbSArek Kusztal 			val = ADF_CSR_RD(pmisc_bar_addr, vf_csr_off);
64b17d16fbSArek Kusztal 		} while ((val & ADF_PFVF_INT) &&
65b17d16fbSArek Kusztal 			(++count < ADF_IOV_MSG_ACK_MAX_RETRY));
66b17d16fbSArek Kusztal 
67b17d16fbSArek Kusztal 		if (val & ADF_PFVF_INT) {
68*f665790aSDavid Marchand 			QAT_LOG(ERR, "ACK not received from remote");
69b17d16fbSArek Kusztal 			return -EIO;
70b17d16fbSArek Kusztal 		}
71b17d16fbSArek Kusztal 
72b17d16fbSArek Kusztal 		uint32_t pf_val = ADF_CSR_RD(pmisc_bar_addr, pf_csr_off);
7366c0ad1fSArek Kusztal 		msg &= ~ADF_PFVF_INT;
7466c0ad1fSArek Kusztal 		ADF_CSR_WR(pmisc_bar_addr, pf_csr_off, msg);
75b17d16fbSArek Kusztal 
76b17d16fbSArek Kusztal 		*(ret + i) = (uint8_t)(pf_val >> (pf2vf_msg.block_hdr > 0 ?
77b17d16fbSArek Kusztal 				10 : 8) & 0xff);
78b17d16fbSArek Kusztal 	}
79b17d16fbSArek Kusztal 	return 0;
80b17d16fbSArek Kusztal }
81