1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3 *
4 * Copyright (c) 2009 Neelkanth Natu
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26 * SUCH DAMAGE.
27 */
28
29 #include <sys/param.h>
30 #include <sys/kernel.h>
31 #include <sys/systm.h>
32 #include <sys/module.h>
33 #include <sys/bus.h>
34 #include <sys/rman.h>
35 #include <sys/lock.h>
36 #include <sys/mutex.h>
37 #include <sys/sema.h>
38 #include <sys/taskqueue.h>
39
40 #include <machine/bus.h>
41
42 #include <vm/uma.h>
43
44 #include <sys/ata.h>
45 #include <dev/ata/ata-all.h>
46
47 #include <machine/resource.h>
48
49 __FBSDID("$FreeBSD$");
50
51 static int
52 ata_zbbus_probe(device_t dev)
53 {
54
55 return (ata_probe(dev));
56 }
57
58 static int
59 ata_zbbus_attach(device_t dev)
60 {
61 int i, rid, regshift, regoffset;
62 struct ata_channel *ch;
63 struct resource *io;
64
65 ch = device_get_softc(dev);
66
67 if (ch->attached)
68 return (0);
69 ch->attached = 1;
70
71 rid = 0;
72 io = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, RF_ACTIVE);
73 if (io == NULL)
74 return (ENXIO);
75
76 /*
77 * SWARM needs an address shift of 5 when accessing ATA registers.
78 *
79 * For e.g. an access to register 4 actually needs an address
80 * of (4 << 5) to be output on the generic bus.
81 */
82 regshift = 5;
83 resource_int_value(device_get_name(dev), device_get_unit(dev),
84 "regshift", ®shift);
85 if (regshift && bootverbose)
86 device_printf(dev, "using a register shift of %d\n", regshift);
87
88 regoffset = 0x1F0;
89 resource_int_value(device_get_name(dev), device_get_unit(dev),
90 "regoffset", ®offset);
91 if (regoffset && bootverbose) {
92 device_printf(dev, "using a register offset of 0x%0x\n",
93 regoffset);
94 }
95
96 /* setup the ata register addresses */
97 for (i = ATA_DATA; i <= ATA_COMMAND; ++i) {
98 ch->r_io[i].res = io;
99 ch->r_io[i].offset = (regoffset + i) << regshift;
100 }
101
102 ch->r_io[ATA_CONTROL].res = io;
103 ch->r_io[ATA_CONTROL].offset = (regoffset + ATA_CTLOFFSET) << regshift;
104 ch->r_io[ATA_IDX_ADDR].res = io; /* XXX what is this used for */
105 ata_default_registers(dev);
106
107 /* initialize softc for this channel */
108 ch->unit = 0;
109 ch->flags |= ATA_USE_16BIT;
110 ata_generic_hw(dev);
111
112 return (ata_attach(dev));
113 }
114
115 static int
116 ata_zbbus_detach(device_t dev)
117 {
118 int error;
119 struct ata_channel *ch = device_get_softc(dev);
120
121 if (!ch->attached)
122 return (0);
123 ch->attached = 0;
124
125 error = ata_detach(dev);
126
127 bus_release_resource(dev, SYS_RES_MEMORY, 0,
128 ch->r_io[ATA_IDX_ADDR].res);
129
130 return (error);
131 }
132
133 static int
134 ata_zbbus_suspend(device_t dev)
135 {
136 struct ata_channel *ch = device_get_softc(dev);
137
138 if (!ch->attached)
139 return (0);
140
141 return (ata_suspend(dev));
142 }
143
144 static int
145 ata_zbbus_resume(device_t dev)
146 {
147 struct ata_channel *ch = device_get_softc(dev);
148
149 if (!ch->attached)
150 return (0);
151
152 return (ata_resume(dev));
153 }
154
155 static device_method_t ata_zbbus_methods[] = {
156 /* device interface */
157 DEVMETHOD(device_probe, ata_zbbus_probe),
158 DEVMETHOD(device_attach, ata_zbbus_attach),
159 DEVMETHOD(device_detach, ata_zbbus_detach),
160 DEVMETHOD(device_suspend, ata_zbbus_suspend),
161 DEVMETHOD(device_resume, ata_zbbus_resume),
162
163 { 0, 0 }
164 };
165
166 static driver_t ata_zbbus_driver = {
167 "ata",
168 ata_zbbus_methods,
169 sizeof(struct ata_channel)
170 };
171
172 DRIVER_MODULE(ata, zbbus, ata_zbbus_driver, ata_devclass, 0, 0);
Cache object: 401eee576579e30c76b8362f2aacff6f
|