xref: /openbmc/qemu/hw/vfio/pci-quirks.c (revision da34e65c)
1 /*
2  * device quirks for PCI devices
3  *
4  * Copyright Red Hat, Inc. 2012-2015
5  *
6  * Authors:
7  *  Alex Williamson <alex.williamson@redhat.com>
8  *
9  * This work is licensed under the terms of the GNU GPL, version 2.  See
10  * the COPYING file in the top-level directory.
11  */
12 
13 #include "qemu/osdep.h"
14 #include "pci.h"
15 #include "trace.h"
16 #include "qemu/range.h"
17 
18 /* Use uin32_t for vendor & device so PCI_ANY_ID expands and cannot match hw */
19 static bool vfio_pci_is(VFIOPCIDevice *vdev, uint32_t vendor, uint32_t device)
20 {
21     return (vendor == PCI_ANY_ID || vendor == vdev->vendor_id) &&
22            (device == PCI_ANY_ID || device == vdev->device_id);
23 }
24 
25 static bool vfio_is_vga(VFIOPCIDevice *vdev)
26 {
27     PCIDevice *pdev = &vdev->pdev;
28     uint16_t class = pci_get_word(pdev->config + PCI_CLASS_DEVICE);
29 
30     return class == PCI_CLASS_DISPLAY_VGA;
31 }
32 
33 /*
34  * List of device ids/vendor ids for which to disable
35  * option rom loading. This avoids the guest hangs during rom
36  * execution as noticed with the BCM 57810 card for lack of a
37  * more better way to handle such issues.
38  * The  user can still override by specifying a romfile or
39  * rombar=1.
40  * Please see https://bugs.launchpad.net/qemu/+bug/1284874
41  * for an analysis of the 57810 card hang. When adding
42  * a new vendor id/device id combination below, please also add
43  * your card/environment details and information that could
44  * help in debugging to the bug tracking this issue
45  */
46 static const struct {
47     uint32_t vendor;
48     uint32_t device;
49 } romblacklist[] = {
50     { 0x14e4, 0x168e }, /* Broadcom BCM 57810 */
51 };
52 
53 bool vfio_blacklist_opt_rom(VFIOPCIDevice *vdev)
54 {
55     int i;
56 
57     for (i = 0 ; i < ARRAY_SIZE(romblacklist); i++) {
58         if (vfio_pci_is(vdev, romblacklist[i].vendor, romblacklist[i].device)) {
59             trace_vfio_quirk_rom_blacklisted(vdev->vbasedev.name,
60                                              romblacklist[i].vendor,
61                                              romblacklist[i].device);
62             return true;
63         }
64     }
65     return false;
66 }
67 
68 /*
69  * Device specific region quirks (mostly backdoors to PCI config space)
70  */
71 
72 /*
73  * The generic window quirks operate on an address and data register,
74  * vfio_generic_window_address_quirk handles the address register and
75  * vfio_generic_window_data_quirk handles the data register.  These ops
76  * pass reads and writes through to hardware until a value matching the
77  * stored address match/mask is written.  When this occurs, the data
78  * register access emulated PCI config space for the device rather than
79  * passing through accesses.  This enables devices where PCI config space
80  * is accessible behind a window register to maintain the virtualization
81  * provided through vfio.
82  */
83 typedef struct VFIOConfigWindowMatch {
84     uint32_t match;
85     uint32_t mask;
86 } VFIOConfigWindowMatch;
87 
88 typedef struct VFIOConfigWindowQuirk {
89     struct VFIOPCIDevice *vdev;
90 
91     uint32_t address_val;
92 
93     uint32_t address_offset;
94     uint32_t data_offset;
95 
96     bool window_enabled;
97     uint8_t bar;
98 
99     MemoryRegion *addr_mem;
100     MemoryRegion *data_mem;
101 
102     uint32_t nr_matches;
103     VFIOConfigWindowMatch matches[];
104 } VFIOConfigWindowQuirk;
105 
106 static uint64_t vfio_generic_window_quirk_address_read(void *opaque,
107                                                        hwaddr addr,
108                                                        unsigned size)
109 {
110     VFIOConfigWindowQuirk *window = opaque;
111     VFIOPCIDevice *vdev = window->vdev;
112 
113     return vfio_region_read(&vdev->bars[window->bar].region,
114                             addr + window->address_offset, size);
115 }
116 
117 static void vfio_generic_window_quirk_address_write(void *opaque, hwaddr addr,
118                                                     uint64_t data,
119                                                     unsigned size)
120 {
121     VFIOConfigWindowQuirk *window = opaque;
122     VFIOPCIDevice *vdev = window->vdev;
123     int i;
124 
125     window->window_enabled = false;
126 
127     vfio_region_write(&vdev->bars[window->bar].region,
128                       addr + window->address_offset, data, size);
129 
130     for (i = 0; i < window->nr_matches; i++) {
131         if ((data & ~window->matches[i].mask) == window->matches[i].match) {
132             window->window_enabled = true;
133             window->address_val = data & window->matches[i].mask;
134             trace_vfio_quirk_generic_window_address_write(vdev->vbasedev.name,
135                                     memory_region_name(window->addr_mem), data);
136             break;
137         }
138     }
139 }
140 
141 static const MemoryRegionOps vfio_generic_window_address_quirk = {
142     .read = vfio_generic_window_quirk_address_read,
143     .write = vfio_generic_window_quirk_address_write,
144     .endianness = DEVICE_LITTLE_ENDIAN,
145 };
146 
147 static uint64_t vfio_generic_window_quirk_data_read(void *opaque,
148                                                     hwaddr addr, unsigned size)
149 {
150     VFIOConfigWindowQuirk *window = opaque;
151     VFIOPCIDevice *vdev = window->vdev;
152     uint64_t data;
153 
154     /* Always read data reg, discard if window enabled */
155     data = vfio_region_read(&vdev->bars[window->bar].region,
156                             addr + window->data_offset, size);
157 
158     if (window->window_enabled) {
159         data = vfio_pci_read_config(&vdev->pdev, window->address_val, size);
160         trace_vfio_quirk_generic_window_data_read(vdev->vbasedev.name,
161                                     memory_region_name(window->data_mem), data);
162     }
163 
164     return data;
165 }
166 
167 static void vfio_generic_window_quirk_data_write(void *opaque, hwaddr addr,
168                                                  uint64_t data, unsigned size)
169 {
170     VFIOConfigWindowQuirk *window = opaque;
171     VFIOPCIDevice *vdev = window->vdev;
172 
173     if (window->window_enabled) {
174         vfio_pci_write_config(&vdev->pdev, window->address_val, data, size);
175         trace_vfio_quirk_generic_window_data_write(vdev->vbasedev.name,
176                                     memory_region_name(window->data_mem), data);
177         return;
178     }
179 
180     vfio_region_write(&vdev->bars[window->bar].region,
181                       addr + window->data_offset, data, size);
182 }
183 
184 static const MemoryRegionOps vfio_generic_window_data_quirk = {
185     .read = vfio_generic_window_quirk_data_read,
186     .write = vfio_generic_window_quirk_data_write,
187     .endianness = DEVICE_LITTLE_ENDIAN,
188 };
189 
190 /*
191  * The generic mirror quirk handles devices which expose PCI config space
192  * through a region within a BAR.  When enabled, reads and writes are
193  * redirected through to emulated PCI config space.  XXX if PCI config space
194  * used memory regions, this could just be an alias.
195  */
196 typedef struct VFIOConfigMirrorQuirk {
197     struct VFIOPCIDevice *vdev;
198     uint32_t offset;
199     uint8_t bar;
200     MemoryRegion *mem;
201 } VFIOConfigMirrorQuirk;
202 
203 static uint64_t vfio_generic_quirk_mirror_read(void *opaque,
204                                                hwaddr addr, unsigned size)
205 {
206     VFIOConfigMirrorQuirk *mirror = opaque;
207     VFIOPCIDevice *vdev = mirror->vdev;
208     uint64_t data;
209 
210     /* Read and discard in case the hardware cares */
211     (void)vfio_region_read(&vdev->bars[mirror->bar].region,
212                            addr + mirror->offset, size);
213 
214     data = vfio_pci_read_config(&vdev->pdev, addr, size);
215     trace_vfio_quirk_generic_mirror_read(vdev->vbasedev.name,
216                                          memory_region_name(mirror->mem),
217                                          addr, data);
218     return data;
219 }
220 
221 static void vfio_generic_quirk_mirror_write(void *opaque, hwaddr addr,
222                                             uint64_t data, unsigned size)
223 {
224     VFIOConfigMirrorQuirk *mirror = opaque;
225     VFIOPCIDevice *vdev = mirror->vdev;
226 
227     vfio_pci_write_config(&vdev->pdev, addr, data, size);
228     trace_vfio_quirk_generic_mirror_write(vdev->vbasedev.name,
229                                           memory_region_name(mirror->mem),
230                                           addr, data);
231 }
232 
233 static const MemoryRegionOps vfio_generic_mirror_quirk = {
234     .read = vfio_generic_quirk_mirror_read,
235     .write = vfio_generic_quirk_mirror_write,
236     .endianness = DEVICE_LITTLE_ENDIAN,
237 };
238 
239 /* Is range1 fully contained within range2?  */
240 static bool vfio_range_contained(uint64_t first1, uint64_t len1,
241                                  uint64_t first2, uint64_t len2) {
242     return (first1 >= first2 && first1 + len1 <= first2 + len2);
243 }
244 
245 #define PCI_VENDOR_ID_ATI               0x1002
246 
247 /*
248  * Radeon HD cards (HD5450 & HD7850) report the upper byte of the I/O port BAR
249  * through VGA register 0x3c3.  On newer cards, the I/O port BAR is always
250  * BAR4 (older cards like the X550 used BAR1, but we don't care to support
251  * those).  Note that on bare metal, a read of 0x3c3 doesn't always return the
252  * I/O port BAR address.  Originally this was coded to return the virtual BAR
253  * address only if the physical register read returns the actual BAR address,
254  * but users have reported greater success if we return the virtual address
255  * unconditionally.
256  */
257 static uint64_t vfio_ati_3c3_quirk_read(void *opaque,
258                                         hwaddr addr, unsigned size)
259 {
260     VFIOPCIDevice *vdev = opaque;
261     uint64_t data = vfio_pci_read_config(&vdev->pdev,
262                                          PCI_BASE_ADDRESS_4 + 1, size);
263 
264     trace_vfio_quirk_ati_3c3_read(vdev->vbasedev.name, data);
265 
266     return data;
267 }
268 
269 static const MemoryRegionOps vfio_ati_3c3_quirk = {
270     .read = vfio_ati_3c3_quirk_read,
271     .endianness = DEVICE_LITTLE_ENDIAN,
272 };
273 
274 static void vfio_vga_probe_ati_3c3_quirk(VFIOPCIDevice *vdev)
275 {
276     VFIOQuirk *quirk;
277 
278     /*
279      * As long as the BAR is >= 256 bytes it will be aligned such that the
280      * lower byte is always zero.  Filter out anything else, if it exists.
281      */
282     if (!vfio_pci_is(vdev, PCI_VENDOR_ID_ATI, PCI_ANY_ID) ||
283         !vdev->bars[4].ioport || vdev->bars[4].region.size < 256) {
284         return;
285     }
286 
287     quirk = g_malloc0(sizeof(*quirk));
288     quirk->mem = g_new0(MemoryRegion, 1);
289     quirk->nr_mem = 1;
290 
291     memory_region_init_io(quirk->mem, OBJECT(vdev), &vfio_ati_3c3_quirk, vdev,
292                           "vfio-ati-3c3-quirk", 1);
293     memory_region_add_subregion(&vdev->vga->region[QEMU_PCI_VGA_IO_HI].mem,
294                                 3 /* offset 3 bytes from 0x3c0 */, quirk->mem);
295 
296     QLIST_INSERT_HEAD(&vdev->vga->region[QEMU_PCI_VGA_IO_HI].quirks,
297                       quirk, next);
298 
299     trace_vfio_quirk_ati_3c3_probe(vdev->vbasedev.name);
300 }
301 
302 /*
303  * Newer ATI/AMD devices, including HD5450 and HD7850, have a mirror to PCI
304  * config space through MMIO BAR2 at offset 0x4000.  Nothing seems to access
305  * the MMIO space directly, but a window to this space is provided through
306  * I/O port BAR4.  Offset 0x0 is the address register and offset 0x4 is the
307  * data register.  When the address is programmed to a range of 0x4000-0x4fff
308  * PCI configuration space is available.  Experimentation seems to indicate
309  * that read-only may be provided by hardware.
310  */
311 static void vfio_probe_ati_bar4_quirk(VFIOPCIDevice *vdev, int nr)
312 {
313     VFIOQuirk *quirk;
314     VFIOConfigWindowQuirk *window;
315 
316     /* This windows doesn't seem to be used except by legacy VGA code */
317     if (!vfio_pci_is(vdev, PCI_VENDOR_ID_ATI, PCI_ANY_ID) ||
318         !vdev->has_vga || nr != 4) {
319         return;
320     }
321 
322     quirk = g_malloc0(sizeof(*quirk));
323     quirk->mem = g_new0(MemoryRegion, 2);
324     quirk->nr_mem = 2;
325     window = quirk->data = g_malloc0(sizeof(*window) +
326                                      sizeof(VFIOConfigWindowMatch));
327     window->vdev = vdev;
328     window->address_offset = 0;
329     window->data_offset = 4;
330     window->nr_matches = 1;
331     window->matches[0].match = 0x4000;
332     window->matches[0].mask = vdev->config_size - 1;
333     window->bar = nr;
334     window->addr_mem = &quirk->mem[0];
335     window->data_mem = &quirk->mem[1];
336 
337     memory_region_init_io(window->addr_mem, OBJECT(vdev),
338                           &vfio_generic_window_address_quirk, window,
339                           "vfio-ati-bar4-window-address-quirk", 4);
340     memory_region_add_subregion_overlap(vdev->bars[nr].region.mem,
341                                         window->address_offset,
342                                         window->addr_mem, 1);
343 
344     memory_region_init_io(window->data_mem, OBJECT(vdev),
345                           &vfio_generic_window_data_quirk, window,
346                           "vfio-ati-bar4-window-data-quirk", 4);
347     memory_region_add_subregion_overlap(vdev->bars[nr].region.mem,
348                                         window->data_offset,
349                                         window->data_mem, 1);
350 
351     QLIST_INSERT_HEAD(&vdev->bars[nr].quirks, quirk, next);
352 
353     trace_vfio_quirk_ati_bar4_probe(vdev->vbasedev.name);
354 }
355 
356 /*
357  * Trap the BAR2 MMIO mirror to config space as well.
358  */
359 static void vfio_probe_ati_bar2_quirk(VFIOPCIDevice *vdev, int nr)
360 {
361     VFIOQuirk *quirk;
362     VFIOConfigMirrorQuirk *mirror;
363 
364     /* Only enable on newer devices where BAR2 is 64bit */
365     if (!vfio_pci_is(vdev, PCI_VENDOR_ID_ATI, PCI_ANY_ID) ||
366         !vdev->has_vga || nr != 2 || !vdev->bars[2].mem64) {
367         return;
368     }
369 
370     quirk = g_malloc0(sizeof(*quirk));
371     mirror = quirk->data = g_malloc0(sizeof(*mirror));
372     mirror->mem = quirk->mem = g_new0(MemoryRegion, 1);
373     quirk->nr_mem = 1;
374     mirror->vdev = vdev;
375     mirror->offset = 0x4000;
376     mirror->bar = nr;
377 
378     memory_region_init_io(mirror->mem, OBJECT(vdev),
379                           &vfio_generic_mirror_quirk, mirror,
380                           "vfio-ati-bar2-4000-quirk", PCI_CONFIG_SPACE_SIZE);
381     memory_region_add_subregion_overlap(vdev->bars[nr].region.mem,
382                                         mirror->offset, mirror->mem, 1);
383 
384     QLIST_INSERT_HEAD(&vdev->bars[nr].quirks, quirk, next);
385 
386     trace_vfio_quirk_ati_bar2_probe(vdev->vbasedev.name);
387 }
388 
389 /*
390  * Older ATI/AMD cards like the X550 have a similar window to that above.
391  * I/O port BAR1 provides a window to a mirror of PCI config space located
392  * in BAR2 at offset 0xf00.  We don't care to support such older cards, but
393  * note it for future reference.
394  */
395 
396 #define PCI_VENDOR_ID_NVIDIA                    0x10de
397 
398 /*
399  * Nvidia has several different methods to get to config space, the
400  * nouveu project has several of these documented here:
401  * https://github.com/pathscale/envytools/tree/master/hwdocs
402  *
403  * The first quirk is actually not documented in envytools and is found
404  * on 10de:01d1 (NVIDIA Corporation G72 [GeForce 7300 LE]).  This is an
405  * NV46 chipset.  The backdoor uses the legacy VGA I/O ports to access
406  * the mirror of PCI config space found at BAR0 offset 0x1800.  The access
407  * sequence first writes 0x338 to I/O port 0x3d4.  The target offset is
408  * then written to 0x3d0.  Finally 0x538 is written for a read and 0x738
409  * is written for a write to 0x3d4.  The BAR0 offset is then accessible
410  * through 0x3d0.  This quirk doesn't seem to be necessary on newer cards
411  * that use the I/O port BAR5 window but it doesn't hurt to leave it.
412  */
413 typedef enum {NONE = 0, SELECT, WINDOW, READ, WRITE} VFIONvidia3d0State;
414 static const char *nv3d0_states[] = { "NONE", "SELECT",
415                                       "WINDOW", "READ", "WRITE" };
416 
417 typedef struct VFIONvidia3d0Quirk {
418     VFIOPCIDevice *vdev;
419     VFIONvidia3d0State state;
420     uint32_t offset;
421 } VFIONvidia3d0Quirk;
422 
423 static uint64_t vfio_nvidia_3d4_quirk_read(void *opaque,
424                                            hwaddr addr, unsigned size)
425 {
426     VFIONvidia3d0Quirk *quirk = opaque;
427     VFIOPCIDevice *vdev = quirk->vdev;
428 
429     quirk->state = NONE;
430 
431     return vfio_vga_read(&vdev->vga->region[QEMU_PCI_VGA_IO_HI],
432                          addr + 0x14, size);
433 }
434 
435 static void vfio_nvidia_3d4_quirk_write(void *opaque, hwaddr addr,
436                                         uint64_t data, unsigned size)
437 {
438     VFIONvidia3d0Quirk *quirk = opaque;
439     VFIOPCIDevice *vdev = quirk->vdev;
440     VFIONvidia3d0State old_state = quirk->state;
441 
442     quirk->state = NONE;
443 
444     switch (data) {
445     case 0x338:
446         if (old_state == NONE) {
447             quirk->state = SELECT;
448             trace_vfio_quirk_nvidia_3d0_state(vdev->vbasedev.name,
449                                               nv3d0_states[quirk->state]);
450         }
451         break;
452     case 0x538:
453         if (old_state == WINDOW) {
454             quirk->state = READ;
455             trace_vfio_quirk_nvidia_3d0_state(vdev->vbasedev.name,
456                                               nv3d0_states[quirk->state]);
457         }
458         break;
459     case 0x738:
460         if (old_state == WINDOW) {
461             quirk->state = WRITE;
462             trace_vfio_quirk_nvidia_3d0_state(vdev->vbasedev.name,
463                                               nv3d0_states[quirk->state]);
464         }
465         break;
466     }
467 
468     vfio_vga_write(&vdev->vga->region[QEMU_PCI_VGA_IO_HI],
469                    addr + 0x14, data, size);
470 }
471 
472 static const MemoryRegionOps vfio_nvidia_3d4_quirk = {
473     .read = vfio_nvidia_3d4_quirk_read,
474     .write = vfio_nvidia_3d4_quirk_write,
475     .endianness = DEVICE_LITTLE_ENDIAN,
476 };
477 
478 static uint64_t vfio_nvidia_3d0_quirk_read(void *opaque,
479                                            hwaddr addr, unsigned size)
480 {
481     VFIONvidia3d0Quirk *quirk = opaque;
482     VFIOPCIDevice *vdev = quirk->vdev;
483     VFIONvidia3d0State old_state = quirk->state;
484     uint64_t data = vfio_vga_read(&vdev->vga->region[QEMU_PCI_VGA_IO_HI],
485                                   addr + 0x10, size);
486 
487     quirk->state = NONE;
488 
489     if (old_state == READ &&
490         (quirk->offset & ~(PCI_CONFIG_SPACE_SIZE - 1)) == 0x1800) {
491         uint8_t offset = quirk->offset & (PCI_CONFIG_SPACE_SIZE - 1);
492 
493         data = vfio_pci_read_config(&vdev->pdev, offset, size);
494         trace_vfio_quirk_nvidia_3d0_read(vdev->vbasedev.name,
495                                          offset, size, data);
496     }
497 
498     return data;
499 }
500 
501 static void vfio_nvidia_3d0_quirk_write(void *opaque, hwaddr addr,
502                                         uint64_t data, unsigned size)
503 {
504     VFIONvidia3d0Quirk *quirk = opaque;
505     VFIOPCIDevice *vdev = quirk->vdev;
506     VFIONvidia3d0State old_state = quirk->state;
507 
508     quirk->state = NONE;
509 
510     if (old_state == SELECT) {
511         quirk->offset = (uint32_t)data;
512         quirk->state = WINDOW;
513         trace_vfio_quirk_nvidia_3d0_state(vdev->vbasedev.name,
514                                           nv3d0_states[quirk->state]);
515     } else if (old_state == WRITE) {
516         if ((quirk->offset & ~(PCI_CONFIG_SPACE_SIZE - 1)) == 0x1800) {
517             uint8_t offset = quirk->offset & (PCI_CONFIG_SPACE_SIZE - 1);
518 
519             vfio_pci_write_config(&vdev->pdev, offset, data, size);
520             trace_vfio_quirk_nvidia_3d0_write(vdev->vbasedev.name,
521                                               offset, data, size);
522             return;
523         }
524     }
525 
526     vfio_vga_write(&vdev->vga->region[QEMU_PCI_VGA_IO_HI],
527                    addr + 0x10, data, size);
528 }
529 
530 static const MemoryRegionOps vfio_nvidia_3d0_quirk = {
531     .read = vfio_nvidia_3d0_quirk_read,
532     .write = vfio_nvidia_3d0_quirk_write,
533     .endianness = DEVICE_LITTLE_ENDIAN,
534 };
535 
536 static void vfio_vga_probe_nvidia_3d0_quirk(VFIOPCIDevice *vdev)
537 {
538     VFIOQuirk *quirk;
539     VFIONvidia3d0Quirk *data;
540 
541     if (!vfio_pci_is(vdev, PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID) ||
542         !vdev->bars[1].region.size) {
543         return;
544     }
545 
546     quirk = g_malloc0(sizeof(*quirk));
547     quirk->data = data = g_malloc0(sizeof(*data));
548     quirk->mem = g_new0(MemoryRegion, 2);
549     quirk->nr_mem = 2;
550     data->vdev = vdev;
551 
552     memory_region_init_io(&quirk->mem[0], OBJECT(vdev), &vfio_nvidia_3d4_quirk,
553                           data, "vfio-nvidia-3d4-quirk", 2);
554     memory_region_add_subregion(&vdev->vga->region[QEMU_PCI_VGA_IO_HI].mem,
555                                 0x14 /* 0x3c0 + 0x14 */, &quirk->mem[0]);
556 
557     memory_region_init_io(&quirk->mem[1], OBJECT(vdev), &vfio_nvidia_3d0_quirk,
558                           data, "vfio-nvidia-3d0-quirk", 2);
559     memory_region_add_subregion(&vdev->vga->region[QEMU_PCI_VGA_IO_HI].mem,
560                                 0x10 /* 0x3c0 + 0x10 */, &quirk->mem[1]);
561 
562     QLIST_INSERT_HEAD(&vdev->vga->region[QEMU_PCI_VGA_IO_HI].quirks,
563                       quirk, next);
564 
565     trace_vfio_quirk_nvidia_3d0_probe(vdev->vbasedev.name);
566 }
567 
568 /*
569  * The second quirk is documented in envytools.  The I/O port BAR5 is just
570  * a set of address/data ports to the MMIO BARs.  The BAR we care about is
571  * again BAR0.  This backdoor is apparently a bit newer than the one above
572  * so we need to not only trap 256 bytes @0x1800, but all of PCI config
573  * space, including extended space is available at the 4k @0x88000.
574  */
575 typedef struct VFIONvidiaBAR5Quirk {
576     uint32_t master;
577     uint32_t enable;
578     MemoryRegion *addr_mem;
579     MemoryRegion *data_mem;
580     bool enabled;
581     VFIOConfigWindowQuirk window; /* last for match data */
582 } VFIONvidiaBAR5Quirk;
583 
584 static void vfio_nvidia_bar5_enable(VFIONvidiaBAR5Quirk *bar5)
585 {
586     VFIOPCIDevice *vdev = bar5->window.vdev;
587 
588     if (((bar5->master & bar5->enable) & 0x1) == bar5->enabled) {
589         return;
590     }
591 
592     bar5->enabled = !bar5->enabled;
593     trace_vfio_quirk_nvidia_bar5_state(vdev->vbasedev.name,
594                                        bar5->enabled ?  "Enable" : "Disable");
595     memory_region_set_enabled(bar5->addr_mem, bar5->enabled);
596     memory_region_set_enabled(bar5->data_mem, bar5->enabled);
597 }
598 
599 static uint64_t vfio_nvidia_bar5_quirk_master_read(void *opaque,
600                                                    hwaddr addr, unsigned size)
601 {
602     VFIONvidiaBAR5Quirk *bar5 = opaque;
603     VFIOPCIDevice *vdev = bar5->window.vdev;
604 
605     return vfio_region_read(&vdev->bars[5].region, addr, size);
606 }
607 
608 static void vfio_nvidia_bar5_quirk_master_write(void *opaque, hwaddr addr,
609                                                 uint64_t data, unsigned size)
610 {
611     VFIONvidiaBAR5Quirk *bar5 = opaque;
612     VFIOPCIDevice *vdev = bar5->window.vdev;
613 
614     vfio_region_write(&vdev->bars[5].region, addr, data, size);
615 
616     bar5->master = data;
617     vfio_nvidia_bar5_enable(bar5);
618 }
619 
620 static const MemoryRegionOps vfio_nvidia_bar5_quirk_master = {
621     .read = vfio_nvidia_bar5_quirk_master_read,
622     .write = vfio_nvidia_bar5_quirk_master_write,
623     .endianness = DEVICE_LITTLE_ENDIAN,
624 };
625 
626 static uint64_t vfio_nvidia_bar5_quirk_enable_read(void *opaque,
627                                                    hwaddr addr, unsigned size)
628 {
629     VFIONvidiaBAR5Quirk *bar5 = opaque;
630     VFIOPCIDevice *vdev = bar5->window.vdev;
631 
632     return vfio_region_read(&vdev->bars[5].region, addr + 4, size);
633 }
634 
635 static void vfio_nvidia_bar5_quirk_enable_write(void *opaque, hwaddr addr,
636                                                 uint64_t data, unsigned size)
637 {
638     VFIONvidiaBAR5Quirk *bar5 = opaque;
639     VFIOPCIDevice *vdev = bar5->window.vdev;
640 
641     vfio_region_write(&vdev->bars[5].region, addr + 4, data, size);
642 
643     bar5->enable = data;
644     vfio_nvidia_bar5_enable(bar5);
645 }
646 
647 static const MemoryRegionOps vfio_nvidia_bar5_quirk_enable = {
648     .read = vfio_nvidia_bar5_quirk_enable_read,
649     .write = vfio_nvidia_bar5_quirk_enable_write,
650     .endianness = DEVICE_LITTLE_ENDIAN,
651 };
652 
653 static void vfio_probe_nvidia_bar5_quirk(VFIOPCIDevice *vdev, int nr)
654 {
655     VFIOQuirk *quirk;
656     VFIONvidiaBAR5Quirk *bar5;
657     VFIOConfigWindowQuirk *window;
658 
659     if (!vfio_pci_is(vdev, PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID) ||
660         !vdev->has_vga || nr != 5) {
661         return;
662     }
663 
664     quirk = g_malloc0(sizeof(*quirk));
665     quirk->mem = g_new0(MemoryRegion, 4);
666     quirk->nr_mem = 4;
667     bar5 = quirk->data = g_malloc0(sizeof(*bar5) +
668                                    (sizeof(VFIOConfigWindowMatch) * 2));
669     window = &bar5->window;
670 
671     window->vdev = vdev;
672     window->address_offset = 0x8;
673     window->data_offset = 0xc;
674     window->nr_matches = 2;
675     window->matches[0].match = 0x1800;
676     window->matches[0].mask = PCI_CONFIG_SPACE_SIZE - 1;
677     window->matches[1].match = 0x88000;
678     window->matches[1].mask = vdev->config_size - 1;
679     window->bar = nr;
680     window->addr_mem = bar5->addr_mem = &quirk->mem[0];
681     window->data_mem = bar5->data_mem = &quirk->mem[1];
682 
683     memory_region_init_io(window->addr_mem, OBJECT(vdev),
684                           &vfio_generic_window_address_quirk, window,
685                           "vfio-nvidia-bar5-window-address-quirk", 4);
686     memory_region_add_subregion_overlap(vdev->bars[nr].region.mem,
687                                         window->address_offset,
688                                         window->addr_mem, 1);
689     memory_region_set_enabled(window->addr_mem, false);
690 
691     memory_region_init_io(window->data_mem, OBJECT(vdev),
692                           &vfio_generic_window_data_quirk, window,
693                           "vfio-nvidia-bar5-window-data-quirk", 4);
694     memory_region_add_subregion_overlap(vdev->bars[nr].region.mem,
695                                         window->data_offset,
696                                         window->data_mem, 1);
697     memory_region_set_enabled(window->data_mem, false);
698 
699     memory_region_init_io(&quirk->mem[2], OBJECT(vdev),
700                           &vfio_nvidia_bar5_quirk_master, bar5,
701                           "vfio-nvidia-bar5-master-quirk", 4);
702     memory_region_add_subregion_overlap(vdev->bars[nr].region.mem,
703                                         0, &quirk->mem[2], 1);
704 
705     memory_region_init_io(&quirk->mem[3], OBJECT(vdev),
706                           &vfio_nvidia_bar5_quirk_enable, bar5,
707                           "vfio-nvidia-bar5-enable-quirk", 4);
708     memory_region_add_subregion_overlap(vdev->bars[nr].region.mem,
709                                         4, &quirk->mem[3], 1);
710 
711     QLIST_INSERT_HEAD(&vdev->bars[nr].quirks, quirk, next);
712 
713     trace_vfio_quirk_nvidia_bar5_probe(vdev->vbasedev.name);
714 }
715 
716 /*
717  * Finally, BAR0 itself.  We want to redirect any accesses to either
718  * 0x1800 or 0x88000 through the PCI config space access functions.
719  */
720 static void vfio_nvidia_quirk_mirror_write(void *opaque, hwaddr addr,
721                                            uint64_t data, unsigned size)
722 {
723     VFIOConfigMirrorQuirk *mirror = opaque;
724     VFIOPCIDevice *vdev = mirror->vdev;
725     PCIDevice *pdev = &vdev->pdev;
726 
727     vfio_generic_quirk_mirror_write(opaque, addr, data, size);
728 
729     /*
730      * Nvidia seems to acknowledge MSI interrupts by writing 0xff to the
731      * MSI capability ID register.  Both the ID and next register are
732      * read-only, so we allow writes covering either of those to real hw.
733      */
734     if ((pdev->cap_present & QEMU_PCI_CAP_MSI) &&
735         vfio_range_contained(addr, size, pdev->msi_cap, PCI_MSI_FLAGS)) {
736         vfio_region_write(&vdev->bars[mirror->bar].region,
737                           addr + mirror->offset, data, size);
738         trace_vfio_quirk_nvidia_bar0_msi_ack(vdev->vbasedev.name);
739     }
740 }
741 
742 static const MemoryRegionOps vfio_nvidia_mirror_quirk = {
743     .read = vfio_generic_quirk_mirror_read,
744     .write = vfio_nvidia_quirk_mirror_write,
745     .endianness = DEVICE_LITTLE_ENDIAN,
746 };
747 
748 static void vfio_probe_nvidia_bar0_quirk(VFIOPCIDevice *vdev, int nr)
749 {
750     VFIOQuirk *quirk;
751     VFIOConfigMirrorQuirk *mirror;
752 
753     if (!vfio_pci_is(vdev, PCI_VENDOR_ID_NVIDIA, PCI_ANY_ID) ||
754         !vfio_is_vga(vdev) || nr != 0) {
755         return;
756     }
757 
758     quirk = g_malloc0(sizeof(*quirk));
759     mirror = quirk->data = g_malloc0(sizeof(*mirror));
760     mirror->mem = quirk->mem = g_new0(MemoryRegion, 1);
761     quirk->nr_mem = 1;
762     mirror->vdev = vdev;
763     mirror->offset = 0x88000;
764     mirror->bar = nr;
765 
766     memory_region_init_io(mirror->mem, OBJECT(vdev),
767                           &vfio_nvidia_mirror_quirk, mirror,
768                           "vfio-nvidia-bar0-88000-mirror-quirk",
769                           vdev->config_size);
770     memory_region_add_subregion_overlap(vdev->bars[nr].region.mem,
771                                         mirror->offset, mirror->mem, 1);
772 
773     QLIST_INSERT_HEAD(&vdev->bars[nr].quirks, quirk, next);
774 
775     /* The 0x1800 offset mirror only seems to get used by legacy VGA */
776     if (vdev->has_vga) {
777         quirk = g_malloc0(sizeof(*quirk));
778         mirror = quirk->data = g_malloc0(sizeof(*mirror));
779         mirror->mem = quirk->mem = g_new0(MemoryRegion, 1);
780         quirk->nr_mem = 1;
781         mirror->vdev = vdev;
782         mirror->offset = 0x1800;
783         mirror->bar = nr;
784 
785         memory_region_init_io(mirror->mem, OBJECT(vdev),
786                               &vfio_nvidia_mirror_quirk, mirror,
787                               "vfio-nvidia-bar0-1800-mirror-quirk",
788                               PCI_CONFIG_SPACE_SIZE);
789         memory_region_add_subregion_overlap(vdev->bars[nr].region.mem,
790                                             mirror->offset, mirror->mem, 1);
791 
792         QLIST_INSERT_HEAD(&vdev->bars[nr].quirks, quirk, next);
793     }
794 
795     trace_vfio_quirk_nvidia_bar0_probe(vdev->vbasedev.name);
796 }
797 
798 /*
799  * TODO - Some Nvidia devices provide config access to their companion HDA
800  * device and even to their parent bridge via these config space mirrors.
801  * Add quirks for those regions.
802  */
803 
804 #define PCI_VENDOR_ID_REALTEK 0x10ec
805 
806 /*
807  * RTL8168 devices have a backdoor that can access the MSI-X table.  At BAR2
808  * offset 0x70 there is a dword data register, offset 0x74 is a dword address
809  * register.  According to the Linux r8169 driver, the MSI-X table is addressed
810  * when the "type" portion of the address register is set to 0x1.  This appears
811  * to be bits 16:30.  Bit 31 is both a write indicator and some sort of
812  * "address latched" indicator.  Bits 12:15 are a mask field, which we can
813  * ignore because the MSI-X table should always be accessed as a dword (full
814  * mask).  Bits 0:11 is offset within the type.
815  *
816  * Example trace:
817  *
818  * Read from MSI-X table offset 0
819  * vfio: vfio_bar_write(0000:05:00.0:BAR2+0x74, 0x1f000, 4) // store read addr
820  * vfio: vfio_bar_read(0000:05:00.0:BAR2+0x74, 4) = 0x8001f000 // latch
821  * vfio: vfio_bar_read(0000:05:00.0:BAR2+0x70, 4) = 0xfee00398 // read data
822  *
823  * Write 0xfee00000 to MSI-X table offset 0
824  * vfio: vfio_bar_write(0000:05:00.0:BAR2+0x70, 0xfee00000, 4) // write data
825  * vfio: vfio_bar_write(0000:05:00.0:BAR2+0x74, 0x8001f000, 4) // do write
826  * vfio: vfio_bar_read(0000:05:00.0:BAR2+0x74, 4) = 0x1f000 // complete
827  */
828 typedef struct VFIOrtl8168Quirk {
829     VFIOPCIDevice *vdev;
830     uint32_t addr;
831     uint32_t data;
832     bool enabled;
833 } VFIOrtl8168Quirk;
834 
835 static uint64_t vfio_rtl8168_quirk_address_read(void *opaque,
836                                                 hwaddr addr, unsigned size)
837 {
838     VFIOrtl8168Quirk *rtl = opaque;
839     VFIOPCIDevice *vdev = rtl->vdev;
840     uint64_t data = vfio_region_read(&vdev->bars[2].region, addr + 0x74, size);
841 
842     if (rtl->enabled) {
843         data = rtl->addr ^ 0x80000000U; /* latch/complete */
844         trace_vfio_quirk_rtl8168_fake_latch(vdev->vbasedev.name, data);
845     }
846 
847     return data;
848 }
849 
850 static void vfio_rtl8168_quirk_address_write(void *opaque, hwaddr addr,
851                                              uint64_t data, unsigned size)
852 {
853     VFIOrtl8168Quirk *rtl = opaque;
854     VFIOPCIDevice *vdev = rtl->vdev;
855 
856     rtl->enabled = false;
857 
858     if ((data & 0x7fff0000) == 0x10000) { /* MSI-X table */
859         rtl->enabled = true;
860         rtl->addr = (uint32_t)data;
861 
862         if (data & 0x80000000U) { /* Do write */
863             if (vdev->pdev.cap_present & QEMU_PCI_CAP_MSIX) {
864                 hwaddr offset = data & 0xfff;
865                 uint64_t val = rtl->data;
866 
867                 trace_vfio_quirk_rtl8168_msix_write(vdev->vbasedev.name,
868                                                     (uint16_t)offset, val);
869 
870                 /* Write to the proper guest MSI-X table instead */
871                 memory_region_dispatch_write(&vdev->pdev.msix_table_mmio,
872                                              offset, val, size,
873                                              MEMTXATTRS_UNSPECIFIED);
874             }
875             return; /* Do not write guest MSI-X data to hardware */
876         }
877     }
878 
879     vfio_region_write(&vdev->bars[2].region, addr + 0x74, data, size);
880 }
881 
882 static const MemoryRegionOps vfio_rtl_address_quirk = {
883     .read = vfio_rtl8168_quirk_address_read,
884     .write = vfio_rtl8168_quirk_address_write,
885     .valid = {
886         .min_access_size = 4,
887         .max_access_size = 4,
888         .unaligned = false,
889     },
890     .endianness = DEVICE_LITTLE_ENDIAN,
891 };
892 
893 static uint64_t vfio_rtl8168_quirk_data_read(void *opaque,
894                                              hwaddr addr, unsigned size)
895 {
896     VFIOrtl8168Quirk *rtl = opaque;
897     VFIOPCIDevice *vdev = rtl->vdev;
898     uint64_t data = vfio_region_read(&vdev->bars[2].region, addr + 0x74, size);
899 
900     if (rtl->enabled && (vdev->pdev.cap_present & QEMU_PCI_CAP_MSIX)) {
901         hwaddr offset = rtl->addr & 0xfff;
902         memory_region_dispatch_read(&vdev->pdev.msix_table_mmio, offset,
903                                     &data, size, MEMTXATTRS_UNSPECIFIED);
904         trace_vfio_quirk_rtl8168_msix_read(vdev->vbasedev.name, offset, data);
905     }
906 
907     return data;
908 }
909 
910 static void vfio_rtl8168_quirk_data_write(void *opaque, hwaddr addr,
911                                           uint64_t data, unsigned size)
912 {
913     VFIOrtl8168Quirk *rtl = opaque;
914     VFIOPCIDevice *vdev = rtl->vdev;
915 
916     rtl->data = (uint32_t)data;
917 
918     vfio_region_write(&vdev->bars[2].region, addr + 0x70, data, size);
919 }
920 
921 static const MemoryRegionOps vfio_rtl_data_quirk = {
922     .read = vfio_rtl8168_quirk_data_read,
923     .write = vfio_rtl8168_quirk_data_write,
924     .valid = {
925         .min_access_size = 4,
926         .max_access_size = 4,
927         .unaligned = false,
928     },
929     .endianness = DEVICE_LITTLE_ENDIAN,
930 };
931 
932 static void vfio_probe_rtl8168_bar2_quirk(VFIOPCIDevice *vdev, int nr)
933 {
934     VFIOQuirk *quirk;
935     VFIOrtl8168Quirk *rtl;
936 
937     if (!vfio_pci_is(vdev, PCI_VENDOR_ID_REALTEK, 0x8168) || nr != 2) {
938         return;
939     }
940 
941     quirk = g_malloc0(sizeof(*quirk));
942     quirk->mem = g_new0(MemoryRegion, 2);
943     quirk->nr_mem = 2;
944     quirk->data = rtl = g_malloc0(sizeof(*rtl));
945     rtl->vdev = vdev;
946 
947     memory_region_init_io(&quirk->mem[0], OBJECT(vdev),
948                           &vfio_rtl_address_quirk, rtl,
949                           "vfio-rtl8168-window-address-quirk", 4);
950     memory_region_add_subregion_overlap(vdev->bars[nr].region.mem,
951                                         0x74, &quirk->mem[0], 1);
952 
953     memory_region_init_io(&quirk->mem[1], OBJECT(vdev),
954                           &vfio_rtl_data_quirk, rtl,
955                           "vfio-rtl8168-window-data-quirk", 4);
956     memory_region_add_subregion_overlap(vdev->bars[nr].region.mem,
957                                         0x70, &quirk->mem[1], 1);
958 
959     QLIST_INSERT_HEAD(&vdev->bars[nr].quirks, quirk, next);
960 
961     trace_vfio_quirk_rtl8168_probe(vdev->vbasedev.name);
962 }
963 
964 /*
965  * Common quirk probe entry points.
966  */
967 void vfio_vga_quirk_setup(VFIOPCIDevice *vdev)
968 {
969     vfio_vga_probe_ati_3c3_quirk(vdev);
970     vfio_vga_probe_nvidia_3d0_quirk(vdev);
971 }
972 
973 void vfio_vga_quirk_exit(VFIOPCIDevice *vdev)
974 {
975     VFIOQuirk *quirk;
976     int i, j;
977 
978     for (i = 0; i < ARRAY_SIZE(vdev->vga->region); i++) {
979         QLIST_FOREACH(quirk, &vdev->vga->region[i].quirks, next) {
980             for (j = 0; j < quirk->nr_mem; j++) {
981                 memory_region_del_subregion(&vdev->vga->region[i].mem,
982                                             &quirk->mem[j]);
983             }
984         }
985     }
986 }
987 
988 void vfio_vga_quirk_finalize(VFIOPCIDevice *vdev)
989 {
990     int i, j;
991 
992     for (i = 0; i < ARRAY_SIZE(vdev->vga->region); i++) {
993         while (!QLIST_EMPTY(&vdev->vga->region[i].quirks)) {
994             VFIOQuirk *quirk = QLIST_FIRST(&vdev->vga->region[i].quirks);
995             QLIST_REMOVE(quirk, next);
996             for (j = 0; j < quirk->nr_mem; j++) {
997                 object_unparent(OBJECT(&quirk->mem[j]));
998             }
999             g_free(quirk->mem);
1000             g_free(quirk->data);
1001             g_free(quirk);
1002         }
1003     }
1004 }
1005 
1006 void vfio_bar_quirk_setup(VFIOPCIDevice *vdev, int nr)
1007 {
1008     vfio_probe_ati_bar4_quirk(vdev, nr);
1009     vfio_probe_ati_bar2_quirk(vdev, nr);
1010     vfio_probe_nvidia_bar5_quirk(vdev, nr);
1011     vfio_probe_nvidia_bar0_quirk(vdev, nr);
1012     vfio_probe_rtl8168_bar2_quirk(vdev, nr);
1013 }
1014 
1015 void vfio_bar_quirk_exit(VFIOPCIDevice *vdev, int nr)
1016 {
1017     VFIOBAR *bar = &vdev->bars[nr];
1018     VFIOQuirk *quirk;
1019     int i;
1020 
1021     QLIST_FOREACH(quirk, &bar->quirks, next) {
1022         for (i = 0; i < quirk->nr_mem; i++) {
1023             memory_region_del_subregion(bar->region.mem, &quirk->mem[i]);
1024         }
1025     }
1026 }
1027 
1028 void vfio_bar_quirk_finalize(VFIOPCIDevice *vdev, int nr)
1029 {
1030     VFIOBAR *bar = &vdev->bars[nr];
1031     int i;
1032 
1033     while (!QLIST_EMPTY(&bar->quirks)) {
1034         VFIOQuirk *quirk = QLIST_FIRST(&bar->quirks);
1035         QLIST_REMOVE(quirk, next);
1036         for (i = 0; i < quirk->nr_mem; i++) {
1037             object_unparent(OBJECT(&quirk->mem[i]));
1038         }
1039         g_free(quirk->mem);
1040         g_free(quirk->data);
1041         g_free(quirk);
1042     }
1043 }
1044 
1045 /*
1046  * Reset quirks
1047  */
1048 
1049 /*
1050  * AMD Radeon PCI config reset, based on Linux:
1051  *   drivers/gpu/drm/radeon/ci_smc.c:ci_is_smc_running()
1052  *   drivers/gpu/drm/radeon/radeon_device.c:radeon_pci_config_reset
1053  *   drivers/gpu/drm/radeon/ci_smc.c:ci_reset_smc()
1054  *   drivers/gpu/drm/radeon/ci_smc.c:ci_stop_smc_clock()
1055  * IDs: include/drm/drm_pciids.h
1056  * Registers: http://cgit.freedesktop.org/~agd5f/linux/commit/?id=4e2aa447f6f0
1057  *
1058  * Bonaire and Hawaii GPUs do not respond to a bus reset.  This is a bug in the
1059  * hardware that should be fixed on future ASICs.  The symptom of this is that
1060  * once the accerlated driver loads, Windows guests will bsod on subsequent
1061  * attmpts to load the driver, such as after VM reset or shutdown/restart.  To
1062  * work around this, we do an AMD specific PCI config reset, followed by an SMC
1063  * reset.  The PCI config reset only works if SMC firmware is running, so we
1064  * have a dependency on the state of the device as to whether this reset will
1065  * be effective.  There are still cases where we won't be able to kick the
1066  * device into working, but this greatly improves the usability overall.  The
1067  * config reset magic is relatively common on AMD GPUs, but the setup and SMC
1068  * poking is largely ASIC specific.
1069  */
1070 static bool vfio_radeon_smc_is_running(VFIOPCIDevice *vdev)
1071 {
1072     uint32_t clk, pc_c;
1073 
1074     /*
1075      * Registers 200h and 204h are index and data registers for accessing
1076      * indirect configuration registers within the device.
1077      */
1078     vfio_region_write(&vdev->bars[5].region, 0x200, 0x80000004, 4);
1079     clk = vfio_region_read(&vdev->bars[5].region, 0x204, 4);
1080     vfio_region_write(&vdev->bars[5].region, 0x200, 0x80000370, 4);
1081     pc_c = vfio_region_read(&vdev->bars[5].region, 0x204, 4);
1082 
1083     return (!(clk & 1) && (0x20100 <= pc_c));
1084 }
1085 
1086 /*
1087  * The scope of a config reset is controlled by a mode bit in the misc register
1088  * and a fuse, exposed as a bit in another register.  The fuse is the default
1089  * (0 = GFX, 1 = whole GPU), the misc bit is a toggle, with the forumula
1090  * scope = !(misc ^ fuse), where the resulting scope is defined the same as
1091  * the fuse.  A truth table therefore tells us that if misc == fuse, we need
1092  * to flip the value of the bit in the misc register.
1093  */
1094 static void vfio_radeon_set_gfx_only_reset(VFIOPCIDevice *vdev)
1095 {
1096     uint32_t misc, fuse;
1097     bool a, b;
1098 
1099     vfio_region_write(&vdev->bars[5].region, 0x200, 0xc00c0000, 4);
1100     fuse = vfio_region_read(&vdev->bars[5].region, 0x204, 4);
1101     b = fuse & 64;
1102 
1103     vfio_region_write(&vdev->bars[5].region, 0x200, 0xc0000010, 4);
1104     misc = vfio_region_read(&vdev->bars[5].region, 0x204, 4);
1105     a = misc & 2;
1106 
1107     if (a == b) {
1108         vfio_region_write(&vdev->bars[5].region, 0x204, misc ^ 2, 4);
1109         vfio_region_read(&vdev->bars[5].region, 0x204, 4); /* flush */
1110     }
1111 }
1112 
1113 static int vfio_radeon_reset(VFIOPCIDevice *vdev)
1114 {
1115     PCIDevice *pdev = &vdev->pdev;
1116     int i, ret = 0;
1117     uint32_t data;
1118 
1119     /* Defer to a kernel implemented reset */
1120     if (vdev->vbasedev.reset_works) {
1121         trace_vfio_quirk_ati_bonaire_reset_skipped(vdev->vbasedev.name);
1122         return -ENODEV;
1123     }
1124 
1125     /* Enable only memory BAR access */
1126     vfio_pci_write_config(pdev, PCI_COMMAND, PCI_COMMAND_MEMORY, 2);
1127 
1128     /* Reset only works if SMC firmware is loaded and running */
1129     if (!vfio_radeon_smc_is_running(vdev)) {
1130         ret = -EINVAL;
1131         trace_vfio_quirk_ati_bonaire_reset_no_smc(vdev->vbasedev.name);
1132         goto out;
1133     }
1134 
1135     /* Make sure only the GFX function is reset */
1136     vfio_radeon_set_gfx_only_reset(vdev);
1137 
1138     /* AMD PCI config reset */
1139     vfio_pci_write_config(pdev, 0x7c, 0x39d5e86b, 4);
1140     usleep(100);
1141 
1142     /* Read back the memory size to make sure we're out of reset */
1143     for (i = 0; i < 100000; i++) {
1144         if (vfio_region_read(&vdev->bars[5].region, 0x5428, 4) != 0xffffffff) {
1145             goto reset_smc;
1146         }
1147         usleep(1);
1148     }
1149 
1150     trace_vfio_quirk_ati_bonaire_reset_timeout(vdev->vbasedev.name);
1151 
1152 reset_smc:
1153     /* Reset SMC */
1154     vfio_region_write(&vdev->bars[5].region, 0x200, 0x80000000, 4);
1155     data = vfio_region_read(&vdev->bars[5].region, 0x204, 4);
1156     data |= 1;
1157     vfio_region_write(&vdev->bars[5].region, 0x204, data, 4);
1158 
1159     /* Disable SMC clock */
1160     vfio_region_write(&vdev->bars[5].region, 0x200, 0x80000004, 4);
1161     data = vfio_region_read(&vdev->bars[5].region, 0x204, 4);
1162     data |= 1;
1163     vfio_region_write(&vdev->bars[5].region, 0x204, data, 4);
1164 
1165     trace_vfio_quirk_ati_bonaire_reset_done(vdev->vbasedev.name);
1166 
1167 out:
1168     /* Restore PCI command register */
1169     vfio_pci_write_config(pdev, PCI_COMMAND, 0, 2);
1170 
1171     return ret;
1172 }
1173 
1174 void vfio_setup_resetfn_quirk(VFIOPCIDevice *vdev)
1175 {
1176     switch (vdev->vendor_id) {
1177     case 0x1002:
1178         switch (vdev->device_id) {
1179         /* Bonaire */
1180         case 0x6649: /* Bonaire [FirePro W5100] */
1181         case 0x6650:
1182         case 0x6651:
1183         case 0x6658: /* Bonaire XTX [Radeon R7 260X] */
1184         case 0x665c: /* Bonaire XT [Radeon HD 7790/8770 / R9 260 OEM] */
1185         case 0x665d: /* Bonaire [Radeon R7 200 Series] */
1186         /* Hawaii */
1187         case 0x67A0: /* Hawaii XT GL [FirePro W9100] */
1188         case 0x67A1: /* Hawaii PRO GL [FirePro W8100] */
1189         case 0x67A2:
1190         case 0x67A8:
1191         case 0x67A9:
1192         case 0x67AA:
1193         case 0x67B0: /* Hawaii XT [Radeon R9 290X] */
1194         case 0x67B1: /* Hawaii PRO [Radeon R9 290] */
1195         case 0x67B8:
1196         case 0x67B9:
1197         case 0x67BA:
1198         case 0x67BE:
1199             vdev->resetfn = vfio_radeon_reset;
1200             trace_vfio_quirk_ati_bonaire_reset(vdev->vbasedev.name);
1201             break;
1202         }
1203         break;
1204     }
1205 }
1206