vmbus_acpi.c revision 1.4 1 1.4 thorpej /* $NetBSD: vmbus_acpi.c,v 1.4 2021/01/29 15:49:55 thorpej Exp $ */
2 1.1 nonaka
3 1.1 nonaka /*
4 1.1 nonaka * Copyright (c) 2018 Kimihiro Nonaka <nonaka (at) NetBSD.org>
5 1.1 nonaka * All rights reserved.
6 1.1 nonaka *
7 1.1 nonaka * Redistribution and use in source and binary forms, with or without
8 1.1 nonaka * modification, are permitted provided that the following conditions
9 1.1 nonaka * are met:
10 1.1 nonaka * 1. Redistributions of source code must retain the above copyright
11 1.1 nonaka * notice, this list of conditions and the following disclaimer.
12 1.1 nonaka * 2. The name of the author may not be used to endorse or promote products
13 1.1 nonaka * derived from this software without specific prior written permission.
14 1.1 nonaka *
15 1.1 nonaka * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16 1.1 nonaka * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17 1.1 nonaka * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18 1.1 nonaka * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19 1.1 nonaka * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
20 1.1 nonaka * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21 1.1 nonaka * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
22 1.1 nonaka * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
23 1.1 nonaka * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 1.1 nonaka * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 1.1 nonaka * SUCH DAMAGE.
26 1.1 nonaka */
27 1.1 nonaka
28 1.1 nonaka #include <sys/cdefs.h>
29 1.4 thorpej __KERNEL_RCSID(0, "$NetBSD: vmbus_acpi.c,v 1.4 2021/01/29 15:49:55 thorpej Exp $");
30 1.1 nonaka
31 1.1 nonaka #include <sys/param.h>
32 1.1 nonaka #include <sys/device.h>
33 1.1 nonaka #include <sys/systm.h>
34 1.1 nonaka #include <sys/kmem.h>
35 1.1 nonaka
36 1.1 nonaka #include <dev/acpi/acpireg.h>
37 1.1 nonaka #include <dev/acpi/acpivar.h>
38 1.1 nonaka
39 1.1 nonaka #include <dev/hyperv/vmbusvar.h>
40 1.1 nonaka
41 1.1 nonaka #define _COMPONENT ACPI_RESOURCE_COMPONENT
42 1.1 nonaka ACPI_MODULE_NAME ("vmbus_acpi")
43 1.1 nonaka
44 1.1 nonaka static int vmbus_acpi_match(device_t, cfdata_t, void *);
45 1.1 nonaka static void vmbus_acpi_attach(device_t, device_t, void *);
46 1.1 nonaka static int vmbus_acpi_detach(device_t, int);
47 1.1 nonaka
48 1.1 nonaka struct vmbus_acpi_softc {
49 1.1 nonaka struct vmbus_softc sc;
50 1.1 nonaka };
51 1.1 nonaka
52 1.1 nonaka CFATTACH_DECL_NEW(vmbus_acpi, sizeof(struct vmbus_acpi_softc),
53 1.1 nonaka vmbus_acpi_match, vmbus_acpi_attach, vmbus_acpi_detach, NULL);
54 1.1 nonaka
55 1.4 thorpej static const struct device_compatible_entry compat_data[] = {
56 1.4 thorpej { .compat = "VMBUS" },
57 1.4 thorpej { .compat = "VMBus" },
58 1.4 thorpej DEVICE_COMPAT_EOL
59 1.1 nonaka };
60 1.1 nonaka
61 1.1 nonaka static int
62 1.1 nonaka vmbus_acpi_match(device_t parent, cfdata_t match, void *opaque)
63 1.1 nonaka {
64 1.1 nonaka struct acpi_attach_args *aa = opaque;
65 1.4 thorpej int ret;
66 1.1 nonaka
67 1.4 thorpej ret = acpi_compatible_match(aa, compat_data);
68 1.1 nonaka
69 1.1 nonaka if (!vmbus_match(parent, match, opaque))
70 1.1 nonaka return 0;
71 1.1 nonaka
72 1.4 thorpej return ret;
73 1.1 nonaka }
74 1.1 nonaka
75 1.1 nonaka static void
76 1.1 nonaka vmbus_acpi_attach(device_t parent, device_t self, void *opaque)
77 1.1 nonaka {
78 1.1 nonaka struct vmbus_acpi_softc *sc = device_private(self);
79 1.1 nonaka struct acpi_attach_args *aa = opaque;
80 1.1 nonaka
81 1.1 nonaka sc->sc.sc_dev = self;
82 1.2 nonaka sc->sc.sc_iot = aa->aa_iot;
83 1.2 nonaka sc->sc.sc_memt = aa->aa_memt;
84 1.3 skrll sc->sc.sc_dmat = BUS_DMA_TAG_VALID(aa->aa_dmat64) ?
85 1.3 skrll aa->aa_dmat64 : aa->aa_dmat;
86 1.1 nonaka
87 1.1 nonaka if (vmbus_attach(&sc->sc))
88 1.1 nonaka return;
89 1.1 nonaka
90 1.1 nonaka (void)pmf_device_register(self, NULL, NULL);
91 1.1 nonaka }
92 1.1 nonaka
93 1.1 nonaka static int
94 1.1 nonaka vmbus_acpi_detach(device_t self, int flags)
95 1.1 nonaka {
96 1.1 nonaka struct vmbus_acpi_softc *sc = device_private(self);
97 1.1 nonaka int rv;
98 1.1 nonaka
99 1.1 nonaka rv = vmbus_detach(&sc->sc, flags);
100 1.1 nonaka if (rv)
101 1.1 nonaka return rv;
102 1.1 nonaka
103 1.1 nonaka pmf_device_deregister(self);
104 1.1 nonaka
105 1.1 nonaka return 0;
106 1.1 nonaka }
107