1 /*
2  * Copyright (C) 2018-2022 Intel Corporation.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include <asm/guest/vm.h>
8 #include <errno.h>
9 #include <logmsg.h>
10 #include <pci.h>
11 #include "vpci_priv.h"
12 
13 /* config space of dummy multifunction device */
14 #define PCI_DUMMY_DEVICE_VENDOR		0x1D94U
15 #define PCI_DUMMY_DEVICE_ID		0x145AU
16 #define DUMMY_MF_REV			0x1U
17 #define DUMMY_MF_CLASS			0x0U
18 
init_vpci_mf_dev(struct pci_vdev * vdev)19 static void init_vpci_mf_dev(struct pci_vdev *vdev)
20 {
21 	pci_vdev_write_vcfg(vdev, PCIR_VENDOR, 2U, PCI_DUMMY_DEVICE_VENDOR);
22 	pci_vdev_write_vcfg(vdev, PCIR_DEVICE, 2U, PCI_DUMMY_DEVICE_ID);
23 	pci_vdev_write_vcfg(vdev, PCIR_REVID, 1U, DUMMY_MF_REV);
24 	pci_vdev_write_vcfg(vdev, PCIR_CLASS, 1U, DUMMY_MF_CLASS);
25 	pci_vdev_write_vcfg(vdev, PCIR_HDRTYPE, 1U, PCIM_HDRTYPE_NORMAL | PCIM_MFDEV);
26 
27 	vdev->parent_user = NULL;
28 	vdev->user = vdev;
29 }
30 
deinit_vpci_mf_dev(struct pci_vdev * vdev)31 static void deinit_vpci_mf_dev(struct pci_vdev *vdev)
32 {
33 	vdev->parent_user = NULL;
34 	vdev->user = NULL;
35 }
36 
read_vpci_mf_dev(struct pci_vdev * vdev,uint32_t offset,uint32_t bytes,uint32_t * val)37 static int32_t read_vpci_mf_dev(struct pci_vdev *vdev, uint32_t offset,
38 	uint32_t bytes, uint32_t *val)
39 {
40 	*val = pci_vdev_read_vcfg(vdev, offset, bytes);
41 
42 	return 0;
43 }
44 
write_vpci_mf_dev(__unused struct pci_vdev * vdev,__unused uint32_t offset,__unused uint32_t bytes,__unused uint32_t val)45 static int32_t write_vpci_mf_dev(__unused struct pci_vdev *vdev, __unused uint32_t offset,
46 	__unused uint32_t bytes, __unused uint32_t val)
47 {
48 	return 0;
49 }
50 
51 const struct pci_vdev_ops vpci_mf_dev_ops = {
52 	.init_vdev         = init_vpci_mf_dev,
53 	.deinit_vdev       = deinit_vpci_mf_dev,
54 	.write_vdev_cfg    = write_vpci_mf_dev,
55 	.read_vdev_cfg     = read_vpci_mf_dev,
56 };
57