Skip to content

Commit 009a16b

Browse files
fyin1acrnsi
authored andcommitted
vhostbridge: update vhostbridge to use vdev_ops
And use vhostbridge for both SOS and pre-launched VM. Tracked-On: #3241 Signed-off-by: Yin Fengwei <fengwei.yin@intel.com> Acked-by: Eddie Dong <eddie.dong@intel.com>
1 parent 9eba328 commit 009a16b

File tree

4 files changed

+66
-67
lines changed

4 files changed

+66
-67
lines changed

hypervisor/dm/vpci/vhostbridge.c

Lines changed: 58 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -45,54 +45,52 @@
4545
* @pre vdev->vpci != NULL
4646
* @pre vdev->vpci->vm != NULL
4747
*/
48-
void init_vhostbridge(struct pci_vdev *vdev)
48+
static void init_vhostbridge(struct pci_vdev *vdev)
4949
{
50-
if (is_hostbridge(vdev) && is_prelaunched_vm(vdev->vpci->vm)) {
51-
/* PCI config space */
52-
pci_vdev_write_cfg_u16(vdev, PCIR_VENDOR, (uint16_t)0x8086U);
53-
pci_vdev_write_cfg_u16(vdev, PCIR_DEVICE, (uint16_t)0x5af0U);
50+
/* PCI config space */
51+
pci_vdev_write_cfg_u16(vdev, PCIR_VENDOR, (uint16_t)0x8086U);
52+
pci_vdev_write_cfg_u16(vdev, PCIR_DEVICE, (uint16_t)0x5af0U);
5453

55-
pci_vdev_write_cfg_u8(vdev, PCIR_REVID, (uint8_t)0xbU);
54+
pci_vdev_write_cfg_u8(vdev, PCIR_REVID, (uint8_t)0xbU);
5655

57-
pci_vdev_write_cfg_u8(vdev, PCIR_HDRTYPE, (uint8_t)PCIM_HDRTYPE_NORMAL
56+
pci_vdev_write_cfg_u8(vdev, PCIR_HDRTYPE, (uint8_t)PCIM_HDRTYPE_NORMAL
5857
| PCIM_MFDEV);
59-
pci_vdev_write_cfg_u8(vdev, PCIR_CLASS, (uint8_t)PCIC_BRIDGE);
60-
pci_vdev_write_cfg_u8(vdev, PCIR_SUBCLASS, (uint8_t)PCIS_BRIDGE_HOST);
61-
62-
pci_vdev_write_cfg_u8(vdev, 0x34U, (uint8_t)0xe0U);
63-
pci_vdev_write_cfg_u8(vdev, 0x3cU, (uint8_t)0xe0U);
64-
pci_vdev_write_cfg_u8(vdev, 0x48U, (uint8_t)0x1U);
65-
pci_vdev_write_cfg_u8(vdev, 0x4aU, (uint8_t)0xd1U);
66-
pci_vdev_write_cfg_u8(vdev, 0x4bU, (uint8_t)0xfeU);
67-
pci_vdev_write_cfg_u8(vdev, 0x50U, (uint8_t)0xc1U);
68-
pci_vdev_write_cfg_u8(vdev, 0x51U, (uint8_t)0x2U);
69-
pci_vdev_write_cfg_u8(vdev, 0x54U, (uint8_t)0x33U);
70-
pci_vdev_write_cfg_u8(vdev, 0x58U, (uint8_t)0x7U);
71-
pci_vdev_write_cfg_u8(vdev, 0x5aU, (uint8_t)0xf0U);
72-
pci_vdev_write_cfg_u8(vdev, 0x5bU, (uint8_t)0x7fU);
73-
pci_vdev_write_cfg_u8(vdev, 0x60U, (uint8_t)0x1U);
74-
pci_vdev_write_cfg_u8(vdev, 0x63U, (uint8_t)0xe0U);
75-
pci_vdev_write_cfg_u8(vdev, 0xabU, (uint8_t)0x80U);
76-
pci_vdev_write_cfg_u8(vdev, 0xacU, (uint8_t)0x2U);
77-
pci_vdev_write_cfg_u8(vdev, 0xb0U, (uint8_t)0x1U);
78-
pci_vdev_write_cfg_u8(vdev, 0xb3U, (uint8_t)0x7cU);
79-
pci_vdev_write_cfg_u8(vdev, 0xb4U, (uint8_t)0x1U);
80-
pci_vdev_write_cfg_u8(vdev, 0xb6U, (uint8_t)0x80U);
81-
pci_vdev_write_cfg_u8(vdev, 0xb7U, (uint8_t)0x7bU);
82-
pci_vdev_write_cfg_u8(vdev, 0xb8U, (uint8_t)0x1U);
83-
pci_vdev_write_cfg_u8(vdev, 0xbbU, (uint8_t)0x7bU);
84-
pci_vdev_write_cfg_u8(vdev, 0xbcU, (uint8_t)0x1U);
85-
pci_vdev_write_cfg_u8(vdev, 0xbfU, (uint8_t)0x80U);
86-
pci_vdev_write_cfg_u8(vdev, 0xe0U, (uint8_t)0x9U);
87-
pci_vdev_write_cfg_u8(vdev, 0xe2U, (uint8_t)0xcU);
88-
pci_vdev_write_cfg_u8(vdev, 0xe3U, (uint8_t)0x1U);
89-
pci_vdev_write_cfg_u8(vdev, 0xf5U, (uint8_t)0xfU);
90-
pci_vdev_write_cfg_u8(vdev, 0xf6U, (uint8_t)0x1cU);
91-
pci_vdev_write_cfg_u8(vdev, 0xf7U, (uint8_t)0x1U);
92-
}
58+
pci_vdev_write_cfg_u8(vdev, PCIR_CLASS, (uint8_t)PCIC_BRIDGE);
59+
pci_vdev_write_cfg_u8(vdev, PCIR_SUBCLASS, (uint8_t)PCIS_BRIDGE_HOST);
60+
61+
pci_vdev_write_cfg_u8(vdev, 0x34U, (uint8_t)0xe0U);
62+
pci_vdev_write_cfg_u8(vdev, 0x3cU, (uint8_t)0xe0U);
63+
pci_vdev_write_cfg_u8(vdev, 0x48U, (uint8_t)0x1U);
64+
pci_vdev_write_cfg_u8(vdev, 0x4aU, (uint8_t)0xd1U);
65+
pci_vdev_write_cfg_u8(vdev, 0x4bU, (uint8_t)0xfeU);
66+
pci_vdev_write_cfg_u8(vdev, 0x50U, (uint8_t)0xc1U);
67+
pci_vdev_write_cfg_u8(vdev, 0x51U, (uint8_t)0x2U);
68+
pci_vdev_write_cfg_u8(vdev, 0x54U, (uint8_t)0x33U);
69+
pci_vdev_write_cfg_u8(vdev, 0x58U, (uint8_t)0x7U);
70+
pci_vdev_write_cfg_u8(vdev, 0x5aU, (uint8_t)0xf0U);
71+
pci_vdev_write_cfg_u8(vdev, 0x5bU, (uint8_t)0x7fU);
72+
pci_vdev_write_cfg_u8(vdev, 0x60U, (uint8_t)0x1U);
73+
pci_vdev_write_cfg_u8(vdev, 0x63U, (uint8_t)0xe0U);
74+
pci_vdev_write_cfg_u8(vdev, 0xabU, (uint8_t)0x80U);
75+
pci_vdev_write_cfg_u8(vdev, 0xacU, (uint8_t)0x2U);
76+
pci_vdev_write_cfg_u8(vdev, 0xb0U, (uint8_t)0x1U);
77+
pci_vdev_write_cfg_u8(vdev, 0xb3U, (uint8_t)0x7cU);
78+
pci_vdev_write_cfg_u8(vdev, 0xb4U, (uint8_t)0x1U);
79+
pci_vdev_write_cfg_u8(vdev, 0xb6U, (uint8_t)0x80U);
80+
pci_vdev_write_cfg_u8(vdev, 0xb7U, (uint8_t)0x7bU);
81+
pci_vdev_write_cfg_u8(vdev, 0xb8U, (uint8_t)0x1U);
82+
pci_vdev_write_cfg_u8(vdev, 0xbbU, (uint8_t)0x7bU);
83+
pci_vdev_write_cfg_u8(vdev, 0xbcU, (uint8_t)0x1U);
84+
pci_vdev_write_cfg_u8(vdev, 0xbfU, (uint8_t)0x80U);
85+
pci_vdev_write_cfg_u8(vdev, 0xe0U, (uint8_t)0x9U);
86+
pci_vdev_write_cfg_u8(vdev, 0xe2U, (uint8_t)0xcU);
87+
pci_vdev_write_cfg_u8(vdev, 0xe3U, (uint8_t)0x1U);
88+
pci_vdev_write_cfg_u8(vdev, 0xf5U, (uint8_t)0xfU);
89+
pci_vdev_write_cfg_u8(vdev, 0xf6U, (uint8_t)0x1cU);
90+
pci_vdev_write_cfg_u8(vdev, 0xf7U, (uint8_t)0x1U);
9391
}
9492

95-
void deinit_vhostbridge(__unused const struct pci_vdev *vdev)
93+
static void deinit_vhostbridge(__unused struct pci_vdev *vdev)
9694
{
9795
}
9896

@@ -102,17 +100,11 @@ void deinit_vhostbridge(__unused const struct pci_vdev *vdev)
102100
* @pre vdev->vpci != NULL
103101
* @pre vdev->vpci->vm != NULL
104102
*/
105-
int32_t vhostbridge_read_cfg(const struct pci_vdev *vdev, uint32_t offset,
103+
static int32_t vhostbridge_read_cfg(struct pci_vdev *vdev, uint32_t offset,
106104
uint32_t bytes, uint32_t *val)
107105
{
108-
int32_t ret = -ENODEV;
109-
110-
if (is_hostbridge(vdev) && is_prelaunched_vm(vdev->vpci->vm)) {
111-
*val = pci_vdev_read_cfg(vdev, offset, bytes);
112-
ret = 0;
113-
}
114-
115-
return ret;
106+
*val = pci_vdev_read_cfg(vdev, offset, bytes);
107+
return 0;
116108
}
117109

118110

@@ -121,18 +113,23 @@ int32_t vhostbridge_read_cfg(const struct pci_vdev *vdev, uint32_t offset,
121113
* @pre vdev->vpci != NULL
122114
* @pre vdev->vpci->vm != NULL
123115
*/
124-
int32_t vhostbridge_write_cfg(struct pci_vdev *vdev, uint32_t offset,
116+
static int32_t vhostbridge_write_cfg(struct pci_vdev *vdev, uint32_t offset,
125117
uint32_t bytes, uint32_t val)
126118
{
127-
int32_t ret = -ENODEV;
128-
129-
if (is_hostbridge(vdev) && is_prelaunched_vm(vdev->vpci->vm)) {
130-
if (!is_bar_offset(PCI_BAR_COUNT, offset)) {
131-
pci_vdev_write_cfg(vdev, offset, bytes, val);
132-
}
133-
134-
ret = 0;
119+
if (!is_bar_offset(PCI_BAR_COUNT, offset)) {
120+
pci_vdev_write_cfg(vdev, offset, bytes, val);
135121
}
122+
return 0;
123+
}
136124

137-
return ret;
125+
static struct pci_vdev_ops vhostbridge_ops = {
126+
.init_vdev = init_vhostbridge,
127+
.deinit_vdev = deinit_vhostbridge,
128+
.write_vdev_cfg = vhostbridge_write_cfg,
129+
.read_vdev_cfg = vhostbridge_read_cfg,
130+
};
131+
132+
struct pci_vdev_ops *get_vhostbridge_ops(void)
133+
{
134+
return &vhostbridge_ops;
138135
}

hypervisor/dm/vpci/vpci.c

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -473,7 +473,12 @@ static void init_vdev_for_pdev(struct pci_pdev *pdev, const struct acrn_vm *vm)
473473
vdev->bdf.value = pdev->bdf.value;
474474
}
475475

476-
vdev->vdev_ops = &pci_pt_dev_ops;
476+
if (is_hostbridge(vdev)) {
477+
vdev->vdev_ops = get_vhostbridge_ops();
478+
} else {
479+
vdev->vdev_ops = &pci_pt_dev_ops;
480+
}
481+
477482
vdev->vdev_ops->init_vdev(vdev);
478483
}
479484
}

hypervisor/dm/vpci/vpci_priv.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -133,11 +133,6 @@ static inline bool is_hostbridge(const struct pci_vdev *vdev)
133133
return (vdev->bdf.value == 0U);
134134
}
135135

136-
void init_vhostbridge(struct pci_vdev *vdev);
137-
int32_t vhostbridge_read_cfg(const struct pci_vdev *vdev, uint32_t offset, uint32_t bytes, uint32_t *val);
138-
int32_t vhostbridge_write_cfg(struct pci_vdev *vdev, uint32_t offset, uint32_t bytes, uint32_t val);
139-
void deinit_vhostbridge(__unused const struct pci_vdev *vdev);
140-
141136
void init_vdev_pt(struct pci_vdev *vdev);
142137
int32_t vdev_pt_read_cfg(const struct pci_vdev *vdev, uint32_t offset, uint32_t bytes, uint32_t *val);
143138
int32_t vdev_pt_write_cfg(struct pci_vdev *vdev, uint32_t offset, uint32_t bytes, uint32_t val);

hypervisor/include/dm/vpci.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,4 +116,6 @@ void vpci_cleanup(const struct acrn_vm *vm);
116116
void vpci_set_ptdev_intr_info(const struct acrn_vm *target_vm, uint16_t vbdf, uint16_t pbdf);
117117
void vpci_reset_ptdev_intr_info(const struct acrn_vm *target_vm, uint16_t vbdf, uint16_t pbdf);
118118

119+
struct pci_vdev_ops *get_vhostbridge_ops(void);
120+
119121
#endif /* VPCI_H_ */

0 commit comments

Comments
 (0)