xref: /freebsd/usr.sbin/bhyve/pci_hostbridge.c (revision 9f40a3be3d5dbddf782c3d1eeaadcd022a4dad01)
1366f6083SPeter Grehan /*-
21de7b4b8SPedro F. Giffuni  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
31de7b4b8SPedro F. Giffuni  *
4366f6083SPeter Grehan  * Copyright (c) 2011 NetApp, Inc.
5366f6083SPeter Grehan  * All rights reserved.
6366f6083SPeter Grehan  *
7366f6083SPeter Grehan  * Redistribution and use in source and binary forms, with or without
8366f6083SPeter Grehan  * modification, are permitted provided that the following conditions
9366f6083SPeter Grehan  * are met:
10366f6083SPeter Grehan  * 1. Redistributions of source code must retain the above copyright
11366f6083SPeter Grehan  *    notice, this list of conditions and the following disclaimer.
12366f6083SPeter Grehan  * 2. Redistributions in binary form must reproduce the above copyright
13366f6083SPeter Grehan  *    notice, this list of conditions and the following disclaimer in the
14366f6083SPeter Grehan  *    documentation and/or other materials provided with the distribution.
15366f6083SPeter Grehan  *
16366f6083SPeter Grehan  * THIS SOFTWARE IS PROVIDED BY NETAPP, INC ``AS IS'' AND
17366f6083SPeter Grehan  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18366f6083SPeter Grehan  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19366f6083SPeter Grehan  * ARE DISCLAIMED.  IN NO EVENT SHALL NETAPP, INC OR CONTRIBUTORS BE LIABLE
20366f6083SPeter Grehan  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21366f6083SPeter Grehan  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22366f6083SPeter Grehan  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23366f6083SPeter Grehan  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24366f6083SPeter Grehan  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25366f6083SPeter Grehan  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26366f6083SPeter Grehan  * SUCH DAMAGE.
27366f6083SPeter Grehan  *
28366f6083SPeter Grehan  * $FreeBSD$
29366f6083SPeter Grehan  */
30366f6083SPeter Grehan 
31366f6083SPeter Grehan #include <sys/cdefs.h>
32366f6083SPeter Grehan __FBSDID("$FreeBSD$");
33366f6083SPeter Grehan 
34621b5090SJohn Baldwin #include <stdlib.h>
35621b5090SJohn Baldwin 
36621b5090SJohn Baldwin #include "config.h"
37366f6083SPeter Grehan #include "pci_emul.h"
38366f6083SPeter Grehan 
39366f6083SPeter Grehan static int
40621b5090SJohn Baldwin pci_hostbridge_init(struct vmctx *ctx, struct pci_devinst *pi, nvlist_t *nvl)
41366f6083SPeter Grehan {
42621b5090SJohn Baldwin 	const char *value;
43621b5090SJohn Baldwin 	u_int vendor, device;
44621b5090SJohn Baldwin 
45621b5090SJohn Baldwin 	vendor = 0x1275;	/* NetApp */
46621b5090SJohn Baldwin 	device = 0x1275;	/* NetApp */
47621b5090SJohn Baldwin 
48621b5090SJohn Baldwin 	value = get_config_value_node(nvl, "vendor");
49621b5090SJohn Baldwin 	if (value != NULL)
50621b5090SJohn Baldwin 		vendor = strtol(value, NULL, 0);
51*9f40a3beSJohn Baldwin 	value = get_config_value_node(nvl, "devid");
52621b5090SJohn Baldwin 	if (value != NULL)
53621b5090SJohn Baldwin 		device = strtol(value, NULL, 0);
54366f6083SPeter Grehan 
55366f6083SPeter Grehan 	/* config space */
56621b5090SJohn Baldwin 	pci_set_cfgdata16(pi, PCIR_VENDOR, vendor);
57621b5090SJohn Baldwin 	pci_set_cfgdata16(pi, PCIR_DEVICE, device);
58a0df62cdSTycho Nightingale 	pci_set_cfgdata8(pi, PCIR_HDRTYPE, PCIM_HDRTYPE_NORMAL);
59366f6083SPeter Grehan 	pci_set_cfgdata8(pi, PCIR_CLASS, PCIC_BRIDGE);
60366f6083SPeter Grehan 	pci_set_cfgdata8(pi, PCIR_SUBCLASS, PCIS_BRIDGE_HOST);
61366f6083SPeter Grehan 
6274f80b23SNeel Natu 	pci_emul_add_pciecap(pi, PCIEM_TYPE_ROOT_PORT);
6374f80b23SNeel Natu 
64366f6083SPeter Grehan 	return (0);
65366f6083SPeter Grehan }
66366f6083SPeter Grehan 
67062b878fSPeter Grehan static int
68621b5090SJohn Baldwin pci_amd_hostbridge_legacy_config(nvlist_t *nvl, const char *opts)
69062b878fSPeter Grehan {
70621b5090SJohn Baldwin 
71621b5090SJohn Baldwin 	set_config_value_node(nvl, "vendor", "0x1022");	/* AMD */
72*9f40a3beSJohn Baldwin 	set_config_value_node(nvl, "devid", "0x7432");	/* made up */
73062b878fSPeter Grehan 
74062b878fSPeter Grehan 	return (0);
75062b878fSPeter Grehan }
76062b878fSPeter Grehan 
77062b878fSPeter Grehan struct pci_devemu pci_de_amd_hostbridge = {
78062b878fSPeter Grehan 	.pe_emu = "amd_hostbridge",
79621b5090SJohn Baldwin 	.pe_legacy_config = pci_amd_hostbridge_legacy_config,
80621b5090SJohn Baldwin 	.pe_alias = "hostbridge",
81062b878fSPeter Grehan };
82062b878fSPeter Grehan PCI_EMUL_SET(pci_de_amd_hostbridge);
83062b878fSPeter Grehan 
84366f6083SPeter Grehan struct pci_devemu pci_de_hostbridge = {
85366f6083SPeter Grehan 	.pe_emu = "hostbridge",
86366f6083SPeter Grehan 	.pe_init = pci_hostbridge_init,
87366f6083SPeter Grehan };
88366f6083SPeter Grehan PCI_EMUL_SET(pci_de_hostbridge);
89