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