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