Changeset View
Changeset View
Standalone View
Standalone View
usr.sbin/bhyve/pci_hostbridge.c
Show All 31 Lines | |||||
__FBSDID("$FreeBSD$"); | __FBSDID("$FreeBSD$"); | ||||
#include <stdlib.h> | #include <stdlib.h> | ||||
#include "config.h" | #include "config.h" | ||||
#include "pci_emul.h" | #include "pci_emul.h" | ||||
static int | static int | ||||
pci_hostbridge_init(struct vmctx *ctx, struct pci_devinst *pi, nvlist_t *nvl) | pci_hostbridge_init(struct vmctx *ctx, struct pci_devinst *pi, | ||||
config_node_t *node) | |||||
{ | { | ||||
const char *value; | const char *value; | ||||
u_int vendor, device; | u_int vendor, device; | ||||
vendor = 0x1275; /* NetApp */ | vendor = 0x1275; /* NetApp */ | ||||
device = 0x1275; /* NetApp */ | device = 0x1275; /* NetApp */ | ||||
value = get_config_value_node(nvl, "vendor"); | value = get_config_value_node(node, "vendor"); | ||||
if (value != NULL) | if (value != NULL) | ||||
vendor = strtol(value, NULL, 0); | vendor = strtol(value, NULL, 0); | ||||
value = get_config_value_node(nvl, "devid"); | value = get_config_value_node(node, "devid"); | ||||
if (value != NULL) | if (value != NULL) | ||||
device = strtol(value, NULL, 0); | device = strtol(value, NULL, 0); | ||||
/* config space */ | /* config space */ | ||||
pci_set_cfgdata16(pi, PCIR_VENDOR, vendor); | pci_set_cfgdata16(pi, PCIR_VENDOR, vendor); | ||||
pci_set_cfgdata16(pi, PCIR_DEVICE, device); | pci_set_cfgdata16(pi, PCIR_DEVICE, device); | ||||
pci_set_cfgdata8(pi, PCIR_HDRTYPE, PCIM_HDRTYPE_NORMAL); | pci_set_cfgdata8(pi, PCIR_HDRTYPE, PCIM_HDRTYPE_NORMAL); | ||||
pci_set_cfgdata8(pi, PCIR_CLASS, PCIC_BRIDGE); | pci_set_cfgdata8(pi, PCIR_CLASS, PCIC_BRIDGE); | ||||
pci_set_cfgdata8(pi, PCIR_SUBCLASS, PCIS_BRIDGE_HOST); | pci_set_cfgdata8(pi, PCIR_SUBCLASS, PCIS_BRIDGE_HOST); | ||||
pci_emul_add_pciecap(pi, PCIEM_TYPE_ROOT_PORT); | pci_emul_add_pciecap(pi, PCIEM_TYPE_ROOT_PORT); | ||||
return (0); | return (0); | ||||
} | } | ||||
static int | static int | ||||
pci_amd_hostbridge_legacy_config(nvlist_t *nvl, const char *opts) | pci_amd_hostbridge_legacy_config(config_node_t *node, const char *opts) | ||||
{ | { | ||||
set_config_value_node(nvl, "vendor", "0x1022"); /* AMD */ | set_config_value_node(node, "vendor", "0x1022"); /* AMD */ | ||||
set_config_value_node(nvl, "devid", "0x7432"); /* made up */ | set_config_value_node(node, "devid", "0x7432"); /* made up */ | ||||
return (0); | return (0); | ||||
} | } | ||||
struct pci_devemu pci_de_amd_hostbridge = { | struct pci_devemu pci_de_amd_hostbridge = { | ||||
.pe_emu = "amd_hostbridge", | .pe_emu = "amd_hostbridge", | ||||
.pe_legacy_config = pci_amd_hostbridge_legacy_config, | .pe_legacy_config = pci_amd_hostbridge_legacy_config, | ||||
.pe_alias = "hostbridge", | .pe_alias = "hostbridge", | ||||
}; | }; | ||||
PCI_EMUL_SET(pci_de_amd_hostbridge); | PCI_EMUL_SET(pci_de_amd_hostbridge); | ||||
struct pci_devemu pci_de_hostbridge = { | struct pci_devemu pci_de_hostbridge = { | ||||
.pe_emu = "hostbridge", | .pe_emu = "hostbridge", | ||||
.pe_init = pci_hostbridge_init, | .pe_init = pci_hostbridge_init, | ||||
}; | }; | ||||
PCI_EMUL_SET(pci_de_hostbridge); | PCI_EMUL_SET(pci_de_hostbridge); |