32
32
#include <logmsg.h>
33
33
#include "pci_priv.h"
34
34
35
- static uint32_t num_pci_vdev ;
36
- static struct pci_vdev sharing_mode_vdev_array [CONFIG_MAX_PCI_DEV_NUM ];
37
35
38
- struct pci_vdev * sharing_mode_find_vdev (union pci_bdf pbdf )
36
+ /**
37
+ * @pre tmp != NULL
38
+ */
39
+ static struct pci_vdev * sharing_mode_find_vdev (const struct acrn_vpci * vpci , union pci_bdf pbdf )
39
40
{
40
41
struct pci_vdev * vdev , * tmp ;
41
42
uint32_t i ;
42
43
43
44
vdev = NULL ;
44
- /* SOS_VM uses phys BDF */
45
- for (i = 0U ; i < num_pci_vdev ; i ++ ) {
46
- tmp = & sharing_mode_vdev_array [i ];
47
- if ((tmp -> pdev != NULL ) && bdf_is_equal ((union pci_bdf * )& (tmp -> pdev -> bdf ), & pbdf )) {
45
+ for (i = 0U ; i < vpci -> pci_vdev_cnt ; i ++ ) {
46
+ tmp = (struct pci_vdev * )& (vpci -> pci_vdevs [i ]);
47
+ if ((tmp -> pdev != NULL ) && bdf_is_equal ((union pci_bdf * )& (tmp -> pdev -> bdf ), & pbdf )) {
48
48
vdev = tmp ;
49
49
break ;
50
50
}
@@ -53,20 +53,39 @@ struct pci_vdev *sharing_mode_find_vdev(union pci_bdf pbdf)
53
53
return vdev ;
54
54
}
55
55
56
+ /**
57
+ * @pre vpci != NULL
58
+ */
59
+ static struct pci_vdev * sharing_mode_find_vdev_sos (union pci_bdf pbdf )
60
+ {
61
+ struct acrn_vm * vm ;
62
+ struct acrn_vpci * vpci ;
63
+ struct pci_vdev * vdev = NULL ;
64
+
65
+ vm = get_sos_vm ();
66
+ if (vm != NULL ) {
67
+ vpci = & vm -> vpci ;
68
+ vdev = sharing_mode_find_vdev (vpci , pbdf );
69
+ }
70
+
71
+ return vdev ;
72
+ }
73
+
74
+
56
75
static void sharing_mode_cfgread (__unused struct acrn_vpci * vpci , union pci_bdf bdf ,
57
76
uint32_t offset , uint32_t bytes , uint32_t * val )
58
77
{
59
78
struct pci_vdev * vdev ;
60
79
bool handled = false;
61
80
uint32_t i ;
62
81
63
- vdev = sharing_mode_find_vdev (bdf );
82
+ vdev = sharing_mode_find_vdev_sos (bdf );
64
83
65
84
/* vdev == NULL: Could be hit for PCI enumeration from guests */
66
85
if ((vdev == NULL ) || ((bytes != 1U ) && (bytes != 2U ) && (bytes != 4U ))) {
67
86
* val = ~0U ;
68
87
} else {
69
- for (i = 0U ; (i < vdev -> nr_ops ) && !handled ; i ++ ) {
88
+ for (i = 0U ; (i < vdev -> nr_ops ) && ( !handled ) ; i ++ ) {
70
89
if (vdev -> ops [i ].cfgread != NULL ) {
71
90
if (vdev -> ops [i ].cfgread (vdev , offset , bytes , val ) == 0 ) {
72
91
handled = true;
@@ -89,9 +108,9 @@ static void sharing_mode_cfgwrite(__unused struct acrn_vpci *vpci, union pci_bdf
89
108
uint32_t i ;
90
109
91
110
if ((bytes == 1U ) || (bytes == 2U ) || (bytes == 4U )) {
92
- vdev = sharing_mode_find_vdev (bdf );
111
+ vdev = sharing_mode_find_vdev_sos (bdf );
93
112
if (vdev != NULL ) {
94
- for (i = 0U ; (i < vdev -> nr_ops ) && !handled ; i ++ ) {
113
+ for (i = 0U ; (i < vdev -> nr_ops ) && ( !handled ) ; i ++ ) {
95
114
if (vdev -> ops [i ].cfgwrite != NULL ) {
96
115
if (vdev -> ops [i ].cfgwrite (vdev , offset , bytes , val ) == 0 ) {
97
116
handled = true;
@@ -107,20 +126,25 @@ static void sharing_mode_cfgwrite(__unused struct acrn_vpci *vpci, union pci_bdf
107
126
}
108
127
}
109
128
129
+ /**
130
+ * @pre vm != NULL
131
+ * @pre pdev_ref != NULL
132
+ * @pre vm->vpci->pci_vdev_cnt <= CONFIG_MAX_PCI_DEV_NUM
133
+ * @pre vdev != NULL
134
+ */
110
135
static struct pci_vdev * alloc_pci_vdev (const struct acrn_vm * vm , struct pci_pdev * pdev_ref )
111
136
{
112
137
struct pci_vdev * vdev = NULL ;
138
+ struct acrn_vpci * vpci = (struct acrn_vpci * )& (vm -> vpci );
113
139
114
- if (num_pci_vdev < CONFIG_MAX_PCI_DEV_NUM ) {
115
- vdev = & sharing_mode_vdev_array [ num_pci_vdev ];
116
- num_pci_vdev ++ ;
140
+ if (vpci -> pci_vdev_cnt < CONFIG_MAX_PCI_DEV_NUM ) {
141
+ vdev = & vpci -> pci_vdevs [ vpci -> pci_vdev_cnt ];
142
+ vpci -> pci_vdev_cnt ++ ;
117
143
118
- if ((vm != NULL ) && (vdev != NULL ) && (pdev_ref != NULL )) {
119
- vdev -> vpci = & vm -> vpci ;
120
- /* vbdf equals to pbdf otherwise remapped */
121
- vdev -> vbdf = pdev_ref -> bdf ;
122
- vdev -> pdev = pdev_ref ;
123
- }
144
+ vdev -> vpci = vpci ;
145
+ /* vbdf equals to pbdf otherwise remapped */
146
+ vdev -> vbdf = pdev_ref -> bdf ;
147
+ vdev -> pdev = pdev_ref ;
124
148
}
125
149
126
150
return vdev ;
@@ -137,6 +161,9 @@ static void init_vdev_for_pdev(struct pci_pdev *pdev, const void *cb_data)
137
161
}
138
162
}
139
163
164
+ /**
165
+ * @pre vdev != NULL
166
+ */
140
167
static int32_t sharing_mode_vpci_init (const struct acrn_vm * vm )
141
168
{
142
169
struct pci_vdev * vdev ;
@@ -153,8 +180,8 @@ static int32_t sharing_mode_vpci_init(const struct acrn_vm *vm)
153
180
/* Build up vdev array for sos_vm */
154
181
pci_pdev_foreach (init_vdev_for_pdev , vm );
155
182
156
- for (i = 0U ; i < num_pci_vdev ; i ++ ) {
157
- vdev = & sharing_mode_vdev_array [i ];
183
+ for (i = 0U ; i < vm -> vpci . pci_vdev_cnt ; i ++ ) {
184
+ vdev = ( struct pci_vdev * ) & ( vm -> vpci . pci_vdevs [i ]) ;
158
185
for (j = 0U ; j < vdev -> nr_ops ; j ++ ) {
159
186
if (vdev -> ops [j ].init != NULL ) {
160
187
(void )vdev -> ops [j ].init (vdev );
@@ -167,14 +194,17 @@ static int32_t sharing_mode_vpci_init(const struct acrn_vm *vm)
167
194
return ret ;
168
195
}
169
196
170
- static void sharing_mode_vpci_deinit (__unused const struct acrn_vm * vm )
197
+ /**
198
+ * @pre vdev != NULL
199
+ */
200
+ static void sharing_mode_vpci_deinit (const struct acrn_vm * vm )
171
201
{
172
202
struct pci_vdev * vdev ;
173
203
uint32_t i , j ;
174
204
175
205
if (is_sos_vm (vm )) {
176
- for (i = 0U ; i < num_pci_vdev ; i ++ ) {
177
- vdev = & sharing_mode_vdev_array [i ];
206
+ for (i = 0U ; i < vm -> vpci . pci_vdev_cnt ; i ++ ) {
207
+ vdev = ( struct pci_vdev * ) & ( vm -> vpci . pci_vdevs [i ]) ;
178
208
for (j = 0U ; j < vdev -> nr_ops ; j ++ ) {
179
209
if (vdev -> ops [j ].deinit != NULL ) {
180
210
(void )vdev -> ops [j ].deinit (vdev );
@@ -204,8 +234,10 @@ const struct vpci_ops sharing_mode_vpci_ops = {
204
234
void vpci_set_ptdev_intr_info (const struct acrn_vm * target_vm , uint16_t vbdf , uint16_t pbdf )
205
235
{
206
236
struct pci_vdev * vdev ;
237
+ union pci_bdf bdf ;
207
238
208
- vdev = sharing_mode_find_vdev ((union pci_bdf )pbdf );
239
+ bdf .value = pbdf ;
240
+ vdev = sharing_mode_find_vdev_sos (bdf );
209
241
if (vdev == NULL ) {
210
242
pr_err ("%s, can't find PCI device for vm%d, vbdf (0x%x) pbdf (0x%x)" , __func__ ,
211
243
target_vm -> vm_id , vbdf , pbdf );
@@ -221,8 +253,10 @@ void vpci_reset_ptdev_intr_info(const struct acrn_vm *target_vm, uint16_t vbdf,
221
253
{
222
254
struct pci_vdev * vdev ;
223
255
struct acrn_vm * vm ;
256
+ union pci_bdf bdf ;
224
257
225
- vdev = sharing_mode_find_vdev ((union pci_bdf )pbdf );
258
+ bdf .value = pbdf ;
259
+ vdev = sharing_mode_find_vdev_sos (bdf );
226
260
if (vdev == NULL ) {
227
261
pr_err ("%s, can't find PCI device for vm%d, vbdf (0x%x) pbdf (0x%x)" , __func__ ,
228
262
target_vm -> vm_id , vbdf , pbdf );
0 commit comments