xref: /freebsd/usr.sbin/bhyve/pci_passthru_quirks.c (revision effcd0ded0ef1c92bef29c1e9bbf517c97bb45b8)
1*effcd0deSCorvin Köhne /*-
2*effcd0deSCorvin Köhne  * SPDX-License-Identifier: BSD-2-Clause
3*effcd0deSCorvin Köhne  *
4*effcd0deSCorvin Köhne  * Copyright (c) 2025 Beckhoff Automation GmbH & Co. KG
5*effcd0deSCorvin Köhne  * Author: Corvin Köhne <c.koehne@beckhoff.com>
6*effcd0deSCorvin Köhne  */
7*effcd0deSCorvin Köhne 
8*effcd0deSCorvin Köhne #include <dev/pci/pcireg.h>
9*effcd0deSCorvin Köhne 
10*effcd0deSCorvin Köhne #include <errno.h>
11*effcd0deSCorvin Köhne 
12*effcd0deSCorvin Köhne #include "pci_passthru.h"
13*effcd0deSCorvin Köhne 
14*effcd0deSCorvin Köhne #define PCI_VENDOR_NVIDIA 0x10DE
15*effcd0deSCorvin Köhne 
16*effcd0deSCorvin Köhne static int
nvidia_gpu_probe(struct pci_devinst * const pi)17*effcd0deSCorvin Köhne nvidia_gpu_probe(struct pci_devinst *const pi)
18*effcd0deSCorvin Köhne {
19*effcd0deSCorvin Köhne 	struct passthru_softc *sc;
20*effcd0deSCorvin Köhne 	uint16_t vendor;
21*effcd0deSCorvin Köhne 	uint8_t class;
22*effcd0deSCorvin Köhne 
23*effcd0deSCorvin Köhne 	sc = pi->pi_arg;
24*effcd0deSCorvin Köhne 
25*effcd0deSCorvin Köhne 	vendor = pci_host_read_config(passthru_get_sel(sc), PCIR_VENDOR, 0x02);
26*effcd0deSCorvin Köhne 	if (vendor != PCI_VENDOR_NVIDIA)
27*effcd0deSCorvin Köhne 		return (ENXIO);
28*effcd0deSCorvin Köhne 
29*effcd0deSCorvin Köhne 	class = pci_host_read_config(passthru_get_sel(sc), PCIR_CLASS, 0x01);
30*effcd0deSCorvin Köhne 	if (class != PCIC_DISPLAY)
31*effcd0deSCorvin Köhne 		return (ENXIO);
32*effcd0deSCorvin Köhne 
33*effcd0deSCorvin Köhne 	return (0);
34*effcd0deSCorvin Köhne }
35*effcd0deSCorvin Köhne 
36*effcd0deSCorvin Köhne static int
nvidia_gpu_init(struct pci_devinst * const pi,nvlist_t * const nvl __unused)37*effcd0deSCorvin Köhne nvidia_gpu_init(struct pci_devinst *const pi, nvlist_t *const nvl __unused)
38*effcd0deSCorvin Köhne {
39*effcd0deSCorvin Köhne 	pci_set_cfgdata8(pi, PCIR_INTPIN, 1);
40*effcd0deSCorvin Köhne 
41*effcd0deSCorvin Köhne 	return (0);
42*effcd0deSCorvin Köhne }
43*effcd0deSCorvin Köhne 
44*effcd0deSCorvin Köhne static struct passthru_dev nvidia_gpu = {
45*effcd0deSCorvin Köhne 	.probe = nvidia_gpu_probe,
46*effcd0deSCorvin Köhne 	.init = nvidia_gpu_init,
47*effcd0deSCorvin Köhne };
48*effcd0deSCorvin Köhne PASSTHRU_DEV_SET(nvidia_gpu);
49