Changeset View
Changeset View
Standalone View
Standalone View
head/sys/dev/hyperv/vmbus/vmbus.c
Show First 20 Lines • Show All 62 Lines • ▼ Show 20 Lines | |||||
#include <dev/hyperv/vmbus/hv_vmbus_priv.h> | #include <dev/hyperv/vmbus/hv_vmbus_priv.h> | ||||
#include <dev/hyperv/vmbus/hyperv_reg.h> | #include <dev/hyperv/vmbus/hyperv_reg.h> | ||||
#include <dev/hyperv/vmbus/hyperv_var.h> | #include <dev/hyperv/vmbus/hyperv_var.h> | ||||
#include <dev/hyperv/vmbus/vmbus_reg.h> | #include <dev/hyperv/vmbus/vmbus_reg.h> | ||||
#include <dev/hyperv/vmbus/vmbus_var.h> | #include <dev/hyperv/vmbus/vmbus_var.h> | ||||
#include <contrib/dev/acpica/include/acpi.h> | #include <contrib/dev/acpica/include/acpi.h> | ||||
#include "acpi_if.h" | #include "acpi_if.h" | ||||
#include "vmbus_if.h" | |||||
struct vmbus_msghc { | struct vmbus_msghc { | ||||
struct hypercall_postmsg_in *mh_inprm; | struct hypercall_postmsg_in *mh_inprm; | ||||
struct hypercall_postmsg_in mh_inprm_save; | struct hypercall_postmsg_in mh_inprm_save; | ||||
struct hyperv_dma mh_inprm_dma; | struct hyperv_dma mh_inprm_dma; | ||||
struct vmbus_message *mh_resp; | struct vmbus_message *mh_resp; | ||||
struct vmbus_message mh_resp0; | struct vmbus_message mh_resp0; | ||||
Show All 29 Lines | |||||
static struct vmbus_msghc *vmbus_msghc_get1(struct vmbus_msghc_ctx *, | static struct vmbus_msghc *vmbus_msghc_get1(struct vmbus_msghc_ctx *, | ||||
uint32_t); | uint32_t); | ||||
struct vmbus_softc *vmbus_sc; | struct vmbus_softc *vmbus_sc; | ||||
extern inthand_t IDTVEC(vmbus_isr); | extern inthand_t IDTVEC(vmbus_isr); | ||||
static const uint32_t vmbus_version[] = { | static const uint32_t vmbus_version[] = { | ||||
HV_VMBUS_VERSION_WIN8_1, | VMBUS_VERSION_WIN8_1, | ||||
HV_VMBUS_VERSION_WIN8, | VMBUS_VERSION_WIN8, | ||||
HV_VMBUS_VERSION_WIN7, | VMBUS_VERSION_WIN7, | ||||
HV_VMBUS_VERSION_WS2008 | VMBUS_VERSION_WS2008 | ||||
}; | }; | ||||
static struct vmbus_msghc * | static struct vmbus_msghc * | ||||
vmbus_msghc_alloc(bus_dma_tag_t parent_dtag) | vmbus_msghc_alloc(bus_dma_tag_t parent_dtag) | ||||
{ | { | ||||
struct vmbus_msghc *mh; | struct vmbus_msghc *mh; | ||||
mh = malloc(sizeof(*mh), M_DEVBUF, M_WAITOK | M_ZERO); | mh = malloc(sizeof(*mh), M_DEVBUF, M_WAITOK | M_ZERO); | ||||
▲ Show 20 Lines • Show All 282 Lines • ▼ Show 20 Lines | |||||
{ | { | ||||
int i; | int i; | ||||
for (i = 0; i < nitems(vmbus_version); ++i) { | for (i = 0; i < nitems(vmbus_version); ++i) { | ||||
int error; | int error; | ||||
error = vmbus_connect(sc, vmbus_version[i]); | error = vmbus_connect(sc, vmbus_version[i]); | ||||
if (!error) { | if (!error) { | ||||
hv_vmbus_protocal_version = vmbus_version[i]; | sc->vmbus_version = vmbus_version[i]; | ||||
device_printf(sc->vmbus_dev, "version %u.%u\n", | device_printf(sc->vmbus_dev, "version %u.%u\n", | ||||
(hv_vmbus_protocal_version >> 16), | VMBUS_VERSION_MAJOR(sc->vmbus_version), | ||||
(hv_vmbus_protocal_version & 0xffff)); | VMBUS_VERSION_MINOR(sc->vmbus_version)); | ||||
return 0; | return 0; | ||||
} | } | ||||
} | } | ||||
return ENXIO; | return ENXIO; | ||||
} | } | ||||
static void | static void | ||||
vmbus_disconnect(struct vmbus_softc *sc) | vmbus_disconnect(struct vmbus_softc *sc) | ||||
▲ Show 20 Lines • Show All 629 Lines • ▼ Show 20 Lines | hv_vmbus_child_device_unregister(struct hv_device *child_dev) | ||||
ret = device_delete_child(vmbus_get_device(), child_dev->device); | ret = device_delete_child(vmbus_get_device(), child_dev->device); | ||||
mtx_unlock(&Giant); | mtx_unlock(&Giant); | ||||
return(ret); | return(ret); | ||||
} | } | ||||
static int | static int | ||||
vmbus_sysctl_version(SYSCTL_HANDLER_ARGS) | vmbus_sysctl_version(SYSCTL_HANDLER_ARGS) | ||||
{ | { | ||||
struct vmbus_softc *sc = arg1; | |||||
char verstr[16]; | char verstr[16]; | ||||
snprintf(verstr, sizeof(verstr), "%u.%u", | snprintf(verstr, sizeof(verstr), "%u.%u", | ||||
hv_vmbus_protocal_version >> 16, | VMBUS_VERSION_MAJOR(sc->vmbus_version), | ||||
hv_vmbus_protocal_version & 0xffff); | VMBUS_VERSION_MINOR(sc->vmbus_version)); | ||||
return sysctl_handle_string(oidp, verstr, sizeof(verstr), req); | return sysctl_handle_string(oidp, verstr, sizeof(verstr), req); | ||||
} | } | ||||
static uint32_t | |||||
vmbus_get_version_method(device_t bus, device_t dev) | |||||
{ | |||||
struct vmbus_softc *sc = device_get_softc(bus); | |||||
return sc->vmbus_version; | |||||
} | |||||
static int | static int | ||||
vmbus_probe(device_t dev) | vmbus_probe(device_t dev) | ||||
{ | { | ||||
char *id[] = { "VMBUS", NULL }; | char *id[] = { "VMBUS", NULL }; | ||||
if (ACPI_ID_PROBE(device_get_parent(dev), dev, id) == NULL || | if (ACPI_ID_PROBE(device_get_parent(dev), dev, id) == NULL || | ||||
device_get_unit(dev) != 0 || vm_guest != VM_GUEST_HV || | device_get_unit(dev) != 0 || vm_guest != VM_GUEST_HV || | ||||
(hyperv_features & CPUID_HV_MSR_SYNIC) == 0) | (hyperv_features & CPUID_HV_MSR_SYNIC) == 0) | ||||
▲ Show 20 Lines • Show All 67 Lines • ▼ Show 20 Lines | vmbus_doattach(struct vmbus_softc *sc) | ||||
ret = hv_vmbus_connect(sc); | ret = hv_vmbus_connect(sc); | ||||
if (ret != 0) | if (ret != 0) | ||||
goto cleanup; | goto cleanup; | ||||
ret = vmbus_init(sc); | ret = vmbus_init(sc); | ||||
if (ret != 0) | if (ret != 0) | ||||
goto cleanup; | goto cleanup; | ||||
if (hv_vmbus_protocal_version == HV_VMBUS_VERSION_WS2008 || | if (sc->vmbus_version == VMBUS_VERSION_WS2008 || | ||||
hv_vmbus_protocal_version == HV_VMBUS_VERSION_WIN7) | sc->vmbus_version == VMBUS_VERSION_WIN7) | ||||
sc->vmbus_event_proc = vmbus_event_proc_compat; | sc->vmbus_event_proc = vmbus_event_proc_compat; | ||||
else | else | ||||
sc->vmbus_event_proc = vmbus_event_proc; | sc->vmbus_event_proc = vmbus_event_proc; | ||||
ret = vmbus_scan(sc); | ret = vmbus_scan(sc); | ||||
if (ret != 0) | if (ret != 0) | ||||
goto cleanup; | goto cleanup; | ||||
ctx = device_get_sysctl_ctx(sc->vmbus_dev); | ctx = device_get_sysctl_ctx(sc->vmbus_dev); | ||||
child = SYSCTL_CHILDREN(device_get_sysctl_tree(sc->vmbus_dev)); | child = SYSCTL_CHILDREN(device_get_sysctl_tree(sc->vmbus_dev)); | ||||
SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "version", | SYSCTL_ADD_PROC(ctx, child, OID_AUTO, "version", | ||||
CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, 0, | CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE, sc, 0, | ||||
vmbus_sysctl_version, "A", "vmbus version"); | vmbus_sysctl_version, "A", "vmbus version"); | ||||
return (ret); | return (ret); | ||||
cleanup: | cleanup: | ||||
vmbus_intr_teardown(sc); | vmbus_intr_teardown(sc); | ||||
vmbus_dma_free(sc); | vmbus_dma_free(sc); | ||||
if (sc->vmbus_msg_hc != NULL) { | if (sc->vmbus_msg_hc != NULL) { | ||||
▲ Show 20 Lines • Show All 95 Lines • ▼ Show 20 Lines | static device_method_t vmbus_methods[] = { | ||||
DEVMETHOD(device_resume, bus_generic_resume), | DEVMETHOD(device_resume, bus_generic_resume), | ||||
/* Bus interface */ | /* Bus interface */ | ||||
DEVMETHOD(bus_add_child, bus_generic_add_child), | DEVMETHOD(bus_add_child, bus_generic_add_child), | ||||
DEVMETHOD(bus_print_child, bus_generic_print_child), | DEVMETHOD(bus_print_child, bus_generic_print_child), | ||||
DEVMETHOD(bus_read_ivar, vmbus_read_ivar), | DEVMETHOD(bus_read_ivar, vmbus_read_ivar), | ||||
DEVMETHOD(bus_write_ivar, vmbus_write_ivar), | DEVMETHOD(bus_write_ivar, vmbus_write_ivar), | ||||
DEVMETHOD(bus_child_pnpinfo_str, vmbus_child_pnpinfo_str), | DEVMETHOD(bus_child_pnpinfo_str, vmbus_child_pnpinfo_str), | ||||
/* Vmbus interface */ | |||||
DEVMETHOD(vmbus_get_version, vmbus_get_version_method), | |||||
DEVMETHOD_END | DEVMETHOD_END | ||||
}; | }; | ||||
static driver_t vmbus_driver = { | static driver_t vmbus_driver = { | ||||
"vmbus", | "vmbus", | ||||
vmbus_methods, | vmbus_methods, | ||||
sizeof(struct vmbus_softc) | sizeof(struct vmbus_softc) | ||||
Show All 16 Lines |