1*32ffafadSjsg /* $OpenBSD: elroy.c,v 1.13 2024/05/22 14:25:47 jsg Exp $ */
2b95ee612Skettenis
3b95ee612Skettenis /*
4b95ee612Skettenis * Copyright (c) 2005 Michael Shalayeff
5b95ee612Skettenis * All rights reserved.
6b95ee612Skettenis *
7b95ee612Skettenis * Permission to use, copy, modify, and distribute this software for any
8b95ee612Skettenis * purpose with or without fee is hereby granted, provided that the above
9b95ee612Skettenis * copyright notice and this permission notice appear in all copies.
10b95ee612Skettenis *
11b95ee612Skettenis * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12b95ee612Skettenis * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13b95ee612Skettenis * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14b95ee612Skettenis * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15b95ee612Skettenis * WHATSOEVER RESULTING FROM LOSS OF MIND, USE, DATA OR PROFITS, WHETHER IN
16b95ee612Skettenis * AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
17b95ee612Skettenis * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18b95ee612Skettenis */
19b95ee612Skettenis
20b95ee612Skettenis #include "cardbus.h"
21b95ee612Skettenis
22b95ee612Skettenis #include <sys/param.h>
23b95ee612Skettenis #include <sys/systm.h>
24b95ee612Skettenis #include <sys/device.h>
25b95ee612Skettenis #include <sys/reboot.h>
26b95ee612Skettenis #include <sys/malloc.h>
27b95ee612Skettenis #include <sys/extent.h>
28b95ee612Skettenis
29b95ee612Skettenis #include <machine/iomod.h>
30b95ee612Skettenis #include <machine/autoconf.h>
31b95ee612Skettenis
32b95ee612Skettenis #include <arch/hppa/dev/cpudevs.h>
33b95ee612Skettenis
34b95ee612Skettenis #if NCARDBUS > 0
35b95ee612Skettenis #include <dev/cardbus/rbus.h>
36b95ee612Skettenis #endif
37b95ee612Skettenis
38b95ee612Skettenis #include <dev/pci/pcireg.h>
39b95ee612Skettenis #include <dev/pci/pcivar.h>
40b95ee612Skettenis #include <dev/pci/pcidevs.h>
41b95ee612Skettenis
42b95ee612Skettenis #include <hppa/dev/elroyreg.h>
43b95ee612Skettenis #include <hppa/dev/elroyvar.h>
44b95ee612Skettenis
45b95ee612Skettenis #define ELROY_MEM_CHUNK 0x800000
46b95ee612Skettenis #define ELROY_MEM_WINDOW (2 * ELROY_MEM_CHUNK)
47b95ee612Skettenis
48b95ee612Skettenis int elroy_match(struct device *, void *, void *);
49b95ee612Skettenis void elroy_attach(struct device *, struct device *, void *);
50b95ee612Skettenis
5178d5ff0eSmpi const struct cfattach elroy_ca = {
52b95ee612Skettenis sizeof(struct elroy_softc), elroy_match, elroy_attach
53b95ee612Skettenis };
54b95ee612Skettenis
55b95ee612Skettenis struct cfdriver elroy_cd = {
56b95ee612Skettenis NULL, "elroy", DV_DULL
57b95ee612Skettenis };
58b95ee612Skettenis
59dd6e4488Sderaadt void elroy_attach_hook(struct device *parent, struct device *self,
60dd6e4488Sderaadt struct pcibus_attach_args *pba);
61dd6e4488Sderaadt int elroy_maxdevs(void *v, int bus);
62dd6e4488Sderaadt pcitag_t elroy_make_tag(void *v, int bus, int dev, int func);
63dd6e4488Sderaadt void elroy_decompose_tag(void *v, pcitag_t tag, int *bus,
64dd6e4488Sderaadt int *dev, int *func);
65b1926db3Smiod int elroy_conf_size(void *v, pcitag_t tag);
66dd6e4488Sderaadt pcireg_t elroy_conf_read(void *v, pcitag_t tag, int reg);
67dd6e4488Sderaadt void elroy_conf_write(void *v, pcitag_t tag, int reg,
68dd6e4488Sderaadt pcireg_t data);
69dd6e4488Sderaadt int elroy_iomap(void *v, bus_addr_t bpa, bus_size_t size,
70dd6e4488Sderaadt int flags, bus_space_handle_t *bshp);
71dd6e4488Sderaadt int elroy_memmap(void *v, bus_addr_t bpa, bus_size_t size,
72dd6e4488Sderaadt int flags, bus_space_handle_t *bshp);
73dd6e4488Sderaadt int elroy_subregion(void *v, bus_space_handle_t bsh,
74dd6e4488Sderaadt bus_size_t offset, bus_size_t size,
75dd6e4488Sderaadt bus_space_handle_t *nbshp);
76dd6e4488Sderaadt int elroy_ioalloc(void *v, bus_addr_t rstart, bus_addr_t rend,
77dd6e4488Sderaadt bus_size_t size, bus_size_t align, bus_size_t boundary,
78dd6e4488Sderaadt int flags, bus_addr_t *addrp, bus_space_handle_t *bshp);
79dd6e4488Sderaadt int elroy_memalloc(void *v, bus_addr_t rstart, bus_addr_t rend,
80dd6e4488Sderaadt bus_size_t size, bus_size_t align, bus_size_t boundary,
81dd6e4488Sderaadt int flags, bus_addr_t *addrp, bus_space_handle_t *bshp);
82dd6e4488Sderaadt void elroy_unmap(void *v, bus_space_handle_t bsh,
83dd6e4488Sderaadt bus_size_t size);
84dd6e4488Sderaadt void elroy_free(void *v, bus_space_handle_t bh, bus_size_t size);
85dd6e4488Sderaadt void elroy_barrier(void *v, bus_space_handle_t h, bus_size_t o,
86dd6e4488Sderaadt bus_size_t l, int op);
87dd6e4488Sderaadt void * elroy_alloc_parent(struct device *self,
88dd6e4488Sderaadt struct pci_attach_args *pa, int io);
89dd6e4488Sderaadt void * elroy_vaddr(void *v, bus_space_handle_t h);
90dd6e4488Sderaadt u_int8_t elroy_r1(void *v, bus_space_handle_t h, bus_size_t o);
91dd6e4488Sderaadt u_int16_t elroy_r2(void *v, bus_space_handle_t h, bus_size_t o);
92dd6e4488Sderaadt u_int32_t elroy_r4(void *v, bus_space_handle_t h, bus_size_t o);
93dd6e4488Sderaadt u_int64_t elroy_r8(void *v, bus_space_handle_t h, bus_size_t o);
94dd6e4488Sderaadt void elroy_w1(void *v, bus_space_handle_t h, bus_size_t o,
95dd6e4488Sderaadt u_int8_t vv);
96dd6e4488Sderaadt void elroy_w2(void *v, bus_space_handle_t h, bus_size_t o,
97dd6e4488Sderaadt u_int16_t vv);
98dd6e4488Sderaadt void elroy_w4(void *v, bus_space_handle_t h, bus_size_t o,
99dd6e4488Sderaadt u_int32_t vv);
100dd6e4488Sderaadt void elroy_w8(void *v, bus_space_handle_t h, bus_size_t o,
101dd6e4488Sderaadt u_int64_t vv);
102dd6e4488Sderaadt void elroy_rm_1(void *v, bus_space_handle_t h, bus_size_t o,
103dd6e4488Sderaadt u_int8_t *a, bus_size_t c);
104dd6e4488Sderaadt void elroy_rm_2(void *v, bus_space_handle_t h, bus_size_t o,
105dd6e4488Sderaadt u_int16_t *a, bus_size_t c);
106dd6e4488Sderaadt void elroy_rm_4(void *v, bus_space_handle_t h, bus_size_t o,
107dd6e4488Sderaadt u_int32_t *a, bus_size_t c);
108dd6e4488Sderaadt void elroy_rm_8(void *v, bus_space_handle_t h, bus_size_t o,
109dd6e4488Sderaadt u_int64_t *a, bus_size_t c);
110dd6e4488Sderaadt void elroy_wm_1(void *v, bus_space_handle_t h, bus_size_t o,
111dd6e4488Sderaadt const u_int8_t *a, bus_size_t c);
112dd6e4488Sderaadt void elroy_wm_2(void *v, bus_space_handle_t h, bus_size_t o,
113dd6e4488Sderaadt const u_int16_t *a, bus_size_t c);
114dd6e4488Sderaadt void elroy_wm_4(void *v, bus_space_handle_t h, bus_size_t o,
115dd6e4488Sderaadt const u_int32_t *a, bus_size_t c);
116dd6e4488Sderaadt void elroy_wm_8(void *v, bus_space_handle_t h, bus_size_t o,
117dd6e4488Sderaadt const u_int64_t *a, bus_size_t c);
118dd6e4488Sderaadt void elroy_sm_1(void *v, bus_space_handle_t h, bus_size_t o,
119dd6e4488Sderaadt u_int8_t vv, bus_size_t c);
120dd6e4488Sderaadt void elroy_sm_2(void *v, bus_space_handle_t h, bus_size_t o,
121dd6e4488Sderaadt u_int16_t vv, bus_size_t c);
122dd6e4488Sderaadt void elroy_sm_4(void *v, bus_space_handle_t h, bus_size_t o,
123dd6e4488Sderaadt u_int32_t vv, bus_size_t c);
124dd6e4488Sderaadt void elroy_sm_8(void *v, bus_space_handle_t h, bus_size_t o,
125dd6e4488Sderaadt u_int64_t vv, bus_size_t c);
126dd6e4488Sderaadt void elroy_rrm_2(void *v, bus_space_handle_t h, bus_size_t o,
127dd6e4488Sderaadt u_int8_t *a, bus_size_t c);
128dd6e4488Sderaadt void elroy_rrm_4(void *v, bus_space_handle_t h, bus_size_t o,
129dd6e4488Sderaadt u_int8_t *a, bus_size_t c);
130dd6e4488Sderaadt void elroy_rrm_8(void *v, bus_space_handle_t h, bus_size_t o,
131dd6e4488Sderaadt u_int8_t *a, bus_size_t c);
132dd6e4488Sderaadt void elroy_wrm_2(void *v, bus_space_handle_t h, bus_size_t o,
133dd6e4488Sderaadt const u_int8_t *a, bus_size_t c);
134dd6e4488Sderaadt void elroy_wrm_4(void *v, bus_space_handle_t h, bus_size_t o,
135dd6e4488Sderaadt const u_int8_t *a, bus_size_t c);
136dd6e4488Sderaadt void elroy_wrm_8(void *v, bus_space_handle_t h, bus_size_t o,
137dd6e4488Sderaadt const u_int8_t *a, bus_size_t c);
138dd6e4488Sderaadt void elroy_rr_1(void *v, bus_space_handle_t h, bus_size_t o,
139dd6e4488Sderaadt u_int8_t *a, bus_size_t c);
140dd6e4488Sderaadt void elroy_rr_2(void *v, bus_space_handle_t h, bus_size_t o,
141dd6e4488Sderaadt u_int16_t *a, bus_size_t c);
142dd6e4488Sderaadt void elroy_rr_4(void *v, bus_space_handle_t h, bus_size_t o,
143dd6e4488Sderaadt u_int32_t *a, bus_size_t c);
144dd6e4488Sderaadt void elroy_rr_8(void *v, bus_space_handle_t h, bus_size_t o,
145dd6e4488Sderaadt u_int64_t *a, bus_size_t c);
146dd6e4488Sderaadt void elroy_wr_1(void *v, bus_space_handle_t h, bus_size_t o,
147dd6e4488Sderaadt const u_int8_t *a, bus_size_t c);
148dd6e4488Sderaadt void elroy_wr_2(void *v, bus_space_handle_t h, bus_size_t o,
149dd6e4488Sderaadt const u_int16_t *a, bus_size_t c);
150dd6e4488Sderaadt void elroy_wr_4(void *v, bus_space_handle_t h, bus_size_t o,
151dd6e4488Sderaadt const u_int32_t *a, bus_size_t c);
152dd6e4488Sderaadt void elroy_wr_8(void *v, bus_space_handle_t h, bus_size_t o,
153dd6e4488Sderaadt const u_int64_t *a, bus_size_t c);
154dd6e4488Sderaadt void elroy_rrr_2(void *v, bus_space_handle_t h, bus_size_t o,
155dd6e4488Sderaadt u_int8_t *a, bus_size_t c);
156dd6e4488Sderaadt void elroy_rrr_4(void *v, bus_space_handle_t h, bus_size_t o,
157dd6e4488Sderaadt u_int8_t *a, bus_size_t c);
158dd6e4488Sderaadt void elroy_rrr_8(void *v, bus_space_handle_t h, bus_size_t o,
159dd6e4488Sderaadt u_int8_t *a, bus_size_t c);
160dd6e4488Sderaadt void elroy_wrr_2(void *v, bus_space_handle_t h, bus_size_t o,
161dd6e4488Sderaadt const u_int8_t *a, bus_size_t c);
162dd6e4488Sderaadt void elroy_wrr_4(void *v, bus_space_handle_t h, bus_size_t o,
163dd6e4488Sderaadt const u_int8_t *a, bus_size_t c);
164dd6e4488Sderaadt void elroy_wrr_8(void *v, bus_space_handle_t h, bus_size_t o,
165dd6e4488Sderaadt const u_int8_t *a, bus_size_t c);
166dd6e4488Sderaadt void elroy_sr_1(void *v, bus_space_handle_t h, bus_size_t o,
167dd6e4488Sderaadt u_int8_t vv, bus_size_t c);
168dd6e4488Sderaadt void elroy_sr_2(void *v, bus_space_handle_t h, bus_size_t o,
169dd6e4488Sderaadt u_int16_t vv, bus_size_t c);
170dd6e4488Sderaadt void elroy_sr_4(void *v, bus_space_handle_t h, bus_size_t o,
171dd6e4488Sderaadt u_int32_t vv, bus_size_t c);
172dd6e4488Sderaadt void elroy_sr_8(void *v, bus_space_handle_t h, bus_size_t o,
173dd6e4488Sderaadt u_int64_t vv, bus_size_t c);
174dd6e4488Sderaadt void elroy_cp_1(void *v, bus_space_handle_t h1, bus_size_t o1,
175dd6e4488Sderaadt bus_space_handle_t h2, bus_size_t o2, bus_size_t c);
176dd6e4488Sderaadt void elroy_cp_2(void *v, bus_space_handle_t h1, bus_size_t o1,
177dd6e4488Sderaadt bus_space_handle_t h2, bus_size_t o2, bus_size_t c);
178dd6e4488Sderaadt void elroy_cp_4(void *v, bus_space_handle_t h1, bus_size_t o1,
179dd6e4488Sderaadt bus_space_handle_t h2, bus_size_t o2, bus_size_t c);
180dd6e4488Sderaadt void elroy_cp_8(void *v, bus_space_handle_t h1, bus_size_t o1,
181dd6e4488Sderaadt bus_space_handle_t h2, bus_size_t o2, bus_size_t c);
182dd6e4488Sderaadt
183b95ee612Skettenis int
elroy_match(struct device * parent,void * cfdata,void * aux)184b95ee612Skettenis elroy_match(struct device *parent, void *cfdata, void *aux)
185b95ee612Skettenis {
186b95ee612Skettenis struct confargs *ca = aux;
187b95ee612Skettenis /* struct cfdata *cf = cfdata; */
188b95ee612Skettenis
189b95ee612Skettenis if ((ca->ca_name && !strcmp(ca->ca_name, "lba")) ||
190b95ee612Skettenis (ca->ca_type.iodc_type == HPPA_TYPE_BRIDGE &&
191b95ee612Skettenis ca->ca_type.iodc_sv_model == HPPA_BRIDGE_DINO &&
192b95ee612Skettenis ca->ca_type.iodc_model == 0x78))
193b95ee612Skettenis return (1);
194b95ee612Skettenis
195b95ee612Skettenis return (0);
196b95ee612Skettenis }
197b95ee612Skettenis
198b95ee612Skettenis void
elroy_write32(volatile u_int32_t * p,u_int32_t v)199b95ee612Skettenis elroy_write32(volatile u_int32_t *p, u_int32_t v)
200b95ee612Skettenis {
201b95ee612Skettenis *p = v;
202b95ee612Skettenis }
203b95ee612Skettenis
204b95ee612Skettenis u_int32_t
elroy_read32(volatile u_int32_t * p)205b95ee612Skettenis elroy_read32(volatile u_int32_t *p)
206b95ee612Skettenis {
207b95ee612Skettenis return *p;
208b95ee612Skettenis }
209b95ee612Skettenis
210b95ee612Skettenis void
elroy_attach_hook(struct device * parent,struct device * self,struct pcibus_attach_args * pba)211b95ee612Skettenis elroy_attach_hook(struct device *parent, struct device *self,
212b95ee612Skettenis struct pcibus_attach_args *pba)
213b95ee612Skettenis {
214b95ee612Skettenis
215b95ee612Skettenis }
216b95ee612Skettenis
217b95ee612Skettenis int
elroy_maxdevs(void * v,int bus)218b95ee612Skettenis elroy_maxdevs(void *v, int bus)
219b95ee612Skettenis {
220b95ee612Skettenis return (32);
221b95ee612Skettenis }
222b95ee612Skettenis
223b95ee612Skettenis pcitag_t
elroy_make_tag(void * v,int bus,int dev,int func)224b95ee612Skettenis elroy_make_tag(void *v, int bus, int dev, int func)
225b95ee612Skettenis {
226b95ee612Skettenis if (bus > 255 || dev > 31 || func > 7)
227b95ee612Skettenis panic("elroy_make_tag: bad request");
228b95ee612Skettenis
229b95ee612Skettenis return ((bus << 16) | (dev << 11) | (func << 8));
230b95ee612Skettenis }
231b95ee612Skettenis
232b95ee612Skettenis void
elroy_decompose_tag(void * v,pcitag_t tag,int * bus,int * dev,int * func)233b95ee612Skettenis elroy_decompose_tag(void *v, pcitag_t tag, int *bus, int *dev, int *func)
234b95ee612Skettenis {
2357a1810dbSkettenis if (bus)
236b95ee612Skettenis *bus = (tag >> 16) & 0xff;
2377a1810dbSkettenis if (dev)
238b95ee612Skettenis *dev = (tag >> 11) & 0x1f;
2397a1810dbSkettenis if (func)
240b95ee612Skettenis *func= (tag >> 8) & 0x07;
241b95ee612Skettenis }
242b95ee612Skettenis
243b1926db3Smiod int
elroy_conf_size(void * v,pcitag_t tag)244b1926db3Smiod elroy_conf_size(void *v, pcitag_t tag)
245b1926db3Smiod {
246b1926db3Smiod return PCI_CONFIG_SPACE_SIZE;
247b1926db3Smiod }
248b1926db3Smiod
249b95ee612Skettenis pcireg_t
elroy_conf_read(void * v,pcitag_t tag,int reg)250b95ee612Skettenis elroy_conf_read(void *v, pcitag_t tag, int reg)
251b95ee612Skettenis {
252b95ee612Skettenis struct elroy_softc *sc = v;
253b95ee612Skettenis volatile struct elroy_regs *r = sc->sc_regs;
254b95ee612Skettenis u_int32_t arb_mask, err_cfg, control;
255b95ee612Skettenis pcireg_t data, data1;
256b95ee612Skettenis
257b95ee612Skettenis /* printf("elroy_conf_read(%p, 0x%08x, 0x%x)", v, tag, reg); */
258b95ee612Skettenis arb_mask = elroy_read32(&r->arb_mask);
259b95ee612Skettenis err_cfg = elroy_read32(&r->err_cfg);
260b95ee612Skettenis control = elroy_read32(&r->control);
261b95ee612Skettenis if (!arb_mask)
2621dc10f9fSmiod elroy_write32(&r->arb_mask, htole32(ELROY_ARB_ENABLE));
263b95ee612Skettenis elroy_write32(&r->err_cfg, err_cfg |
264b95ee612Skettenis htole32(ELROY_ERRCFG_SMART | ELROY_ERRCFG_CM));
265b95ee612Skettenis elroy_write32(&r->control, (control | htole32(ELROY_CONTROL_CE)) &
266b95ee612Skettenis ~htole32(ELROY_CONTROL_HF));
267b95ee612Skettenis
268b95ee612Skettenis elroy_write32(&r->pci_conf_addr, htole32(tag | reg));
269b95ee612Skettenis data1 = elroy_read32(&r->pci_conf_addr);
270b95ee612Skettenis data = elroy_read32(&r->pci_conf_data);
271b95ee612Skettenis
272b95ee612Skettenis elroy_write32(&r->control, control |
273b95ee612Skettenis htole32(ELROY_CONTROL_CE|ELROY_CONTROL_CL));
274b95ee612Skettenis elroy_write32(&r->control, control);
275b95ee612Skettenis elroy_write32(&r->err_cfg, err_cfg);
276b95ee612Skettenis if (!arb_mask)
277b95ee612Skettenis elroy_write32(&r->arb_mask, arb_mask);
278b95ee612Skettenis
279b95ee612Skettenis data = letoh32(data);
280b95ee612Skettenis /* printf("=0x%08x (@ 0x%08x)\n", data, letoh32(data1)); */
281b95ee612Skettenis return (data);
282b95ee612Skettenis }
283b95ee612Skettenis
284b95ee612Skettenis void
elroy_conf_write(void * v,pcitag_t tag,int reg,pcireg_t data)285b95ee612Skettenis elroy_conf_write(void *v, pcitag_t tag, int reg, pcireg_t data)
286b95ee612Skettenis {
287b95ee612Skettenis struct elroy_softc *sc = v;
288b95ee612Skettenis volatile struct elroy_regs *r = sc->sc_regs;
289b95ee612Skettenis u_int32_t arb_mask, err_cfg, control;
290b95ee612Skettenis pcireg_t data1;
291b95ee612Skettenis
292b95ee612Skettenis /* printf("elroy_conf_write(%p, 0x%08x, 0x%x, 0x%x)\n", v, tag, reg, data); */
293b95ee612Skettenis arb_mask = elroy_read32(&r->arb_mask);
294b95ee612Skettenis err_cfg = elroy_read32(&r->err_cfg);
295b95ee612Skettenis control = elroy_read32(&r->control);
296b95ee612Skettenis if (!arb_mask)
2971dc10f9fSmiod elroy_write32(&r->arb_mask, htole32(ELROY_ARB_ENABLE));
298b95ee612Skettenis elroy_write32(&r->err_cfg, err_cfg |
299b95ee612Skettenis htole32(ELROY_ERRCFG_SMART | ELROY_ERRCFG_CM));
300b95ee612Skettenis elroy_write32(&r->control, (control | htole32(ELROY_CONTROL_CE)) &
301b95ee612Skettenis ~htole32(ELROY_CONTROL_HF));
302b95ee612Skettenis
303b95ee612Skettenis /* fix coalescing config writes errata by interleaving w/ a read */
304b95ee612Skettenis elroy_write32(&r->pci_conf_addr, htole32(tag | PCI_ID_REG));
305b95ee612Skettenis data1 = elroy_read32(&r->pci_conf_addr);
306b95ee612Skettenis data1 = elroy_read32(&r->pci_conf_data);
307b95ee612Skettenis
308b95ee612Skettenis elroy_write32(&r->pci_conf_addr, htole32(tag | reg));
309b95ee612Skettenis data1 = elroy_read32(&r->pci_conf_addr);
310b95ee612Skettenis elroy_write32(&r->pci_conf_data, htole32(data));
311b95ee612Skettenis data1 = elroy_read32(&r->pci_conf_addr);
312b95ee612Skettenis
313b95ee612Skettenis elroy_write32(&r->control, control |
314b95ee612Skettenis htole32(ELROY_CONTROL_CE|ELROY_CONTROL_CL));
315b95ee612Skettenis elroy_write32(&r->control, control);
316b95ee612Skettenis elroy_write32(&r->err_cfg, err_cfg);
317b95ee612Skettenis if (!arb_mask)
318b95ee612Skettenis elroy_write32(&r->arb_mask, arb_mask);
319b95ee612Skettenis }
320b95ee612Skettenis
321b95ee612Skettenis int
elroy_iomap(void * v,bus_addr_t bpa,bus_size_t size,int flags,bus_space_handle_t * bshp)322b95ee612Skettenis elroy_iomap(void *v, bus_addr_t bpa, bus_size_t size,
323b95ee612Skettenis int flags, bus_space_handle_t *bshp)
324b95ee612Skettenis {
325b95ee612Skettenis struct elroy_softc *sc = v;
326b95ee612Skettenis /* volatile struct elroy_regs *r = sc->sc_regs; */
327b95ee612Skettenis int error;
328b95ee612Skettenis
329b95ee612Skettenis if ((error = bus_space_map(sc->sc_bt, bpa + sc->sc_iobase, size,
330b95ee612Skettenis flags, bshp)))
331b95ee612Skettenis return (error);
332b95ee612Skettenis
333b95ee612Skettenis return (0);
334b95ee612Skettenis }
335b95ee612Skettenis
336b95ee612Skettenis int
elroy_memmap(void * v,bus_addr_t bpa,bus_size_t size,int flags,bus_space_handle_t * bshp)337b95ee612Skettenis elroy_memmap(void *v, bus_addr_t bpa, bus_size_t size,
338b95ee612Skettenis int flags, bus_space_handle_t *bshp)
339b95ee612Skettenis {
340b95ee612Skettenis struct elroy_softc *sc = v;
341b95ee612Skettenis /* volatile struct elroy_regs *r = sc->sc_regs; */
342b95ee612Skettenis int error;
343b95ee612Skettenis
344b95ee612Skettenis if ((error = bus_space_map(sc->sc_bt, bpa, size, flags, bshp)))
345b95ee612Skettenis return (error);
346b95ee612Skettenis
347b95ee612Skettenis return (0);
348b95ee612Skettenis }
349b95ee612Skettenis
350b95ee612Skettenis int
elroy_subregion(void * v,bus_space_handle_t bsh,bus_size_t offset,bus_size_t size,bus_space_handle_t * nbshp)351b95ee612Skettenis elroy_subregion(void *v, bus_space_handle_t bsh, bus_size_t offset,
352b95ee612Skettenis bus_size_t size, bus_space_handle_t *nbshp)
353b95ee612Skettenis {
354b95ee612Skettenis *nbshp = bsh + offset;
355b95ee612Skettenis return (0);
356b95ee612Skettenis }
357b95ee612Skettenis
358b95ee612Skettenis int
elroy_ioalloc(void * v,bus_addr_t rstart,bus_addr_t rend,bus_size_t size,bus_size_t align,bus_size_t boundary,int flags,bus_addr_t * addrp,bus_space_handle_t * bshp)359b95ee612Skettenis elroy_ioalloc(void *v, bus_addr_t rstart, bus_addr_t rend, bus_size_t size,
360b95ee612Skettenis bus_size_t align, bus_size_t boundary, int flags, bus_addr_t *addrp,
361b95ee612Skettenis bus_space_handle_t *bshp)
362b95ee612Skettenis {
363b95ee612Skettenis struct elroy_softc *sc = v;
364b95ee612Skettenis volatile struct elroy_regs *r = sc->sc_regs;
365b95ee612Skettenis bus_addr_t iostart, ioend;
366b95ee612Skettenis
367b95ee612Skettenis iostart = r->io_base & ~htole32(ELROY_BASE_RE);
368b95ee612Skettenis ioend = iostart + ~htole32(r->io_mask) + 1;
369b95ee612Skettenis if (rstart < iostart || rend > ioend)
370b95ee612Skettenis panic("elroy_ioalloc: bad region start/end");
371b95ee612Skettenis
372b95ee612Skettenis rstart += sc->sc_iobase;
373b95ee612Skettenis rend += sc->sc_iobase;
374b95ee612Skettenis if (bus_space_alloc(sc->sc_bt, rstart, rend, size,
375b95ee612Skettenis align, boundary, flags, addrp, bshp))
376b95ee612Skettenis return (ENOMEM);
377b95ee612Skettenis
378b95ee612Skettenis return (0);
379b95ee612Skettenis }
380b95ee612Skettenis
381b95ee612Skettenis int
elroy_memalloc(void * v,bus_addr_t rstart,bus_addr_t rend,bus_size_t size,bus_size_t align,bus_size_t boundary,int flags,bus_addr_t * addrp,bus_space_handle_t * bshp)382b95ee612Skettenis elroy_memalloc(void *v, bus_addr_t rstart, bus_addr_t rend, bus_size_t size,
383b95ee612Skettenis bus_size_t align, bus_size_t boundary, int flags, bus_addr_t *addrp,
384b95ee612Skettenis bus_space_handle_t *bshp)
385b95ee612Skettenis {
386b95ee612Skettenis struct elroy_softc *sc = v;
387b95ee612Skettenis /* volatile struct elroy_regs *r = sc->sc_regs; */
388b95ee612Skettenis
389b95ee612Skettenis if (bus_space_alloc(sc->sc_bt, rstart, rend, size,
390b95ee612Skettenis align, boundary, flags, addrp, bshp))
391b95ee612Skettenis return (ENOMEM);
392b95ee612Skettenis
393b95ee612Skettenis return (0);
394b95ee612Skettenis }
395b95ee612Skettenis
396b95ee612Skettenis void
elroy_unmap(void * v,bus_space_handle_t bsh,bus_size_t size)397b95ee612Skettenis elroy_unmap(void *v, bus_space_handle_t bsh, bus_size_t size)
398b95ee612Skettenis {
399b95ee612Skettenis struct elroy_softc *sc = v;
400b95ee612Skettenis
401b95ee612Skettenis bus_space_free(sc->sc_bt, bsh, size);
402b95ee612Skettenis }
403b95ee612Skettenis
404b95ee612Skettenis void
elroy_free(void * v,bus_space_handle_t bh,bus_size_t size)405b95ee612Skettenis elroy_free(void *v, bus_space_handle_t bh, bus_size_t size)
406b95ee612Skettenis {
407b95ee612Skettenis /* should be enough */
408b95ee612Skettenis elroy_unmap(v, bh, size);
409b95ee612Skettenis }
410b95ee612Skettenis
411b95ee612Skettenis void
elroy_barrier(void * v,bus_space_handle_t h,bus_size_t o,bus_size_t l,int op)412b95ee612Skettenis elroy_barrier(void *v, bus_space_handle_t h, bus_size_t o, bus_size_t l, int op)
413b95ee612Skettenis {
414b95ee612Skettenis struct elroy_softc *sc = v;
415b95ee612Skettenis volatile struct elroy_regs *r = sc->sc_regs;
416b95ee612Skettenis u_int32_t data;
417b95ee612Skettenis
418b95ee612Skettenis sync_caches();
419b95ee612Skettenis if (op & BUS_SPACE_BARRIER_WRITE) {
420b95ee612Skettenis data = r->pci_id; /* flush write fifo */
421b95ee612Skettenis sync_caches();
422b95ee612Skettenis }
423b95ee612Skettenis }
424b95ee612Skettenis
425b95ee612Skettenis #if NCARDBUS > 0
426b95ee612Skettenis void *
elroy_alloc_parent(struct device * self,struct pci_attach_args * pa,int io)427b95ee612Skettenis elroy_alloc_parent(struct device *self, struct pci_attach_args *pa, int io)
428b95ee612Skettenis {
429b95ee612Skettenis #if 0 /* TODO */
430b95ee612Skettenis
431b95ee612Skettenis struct elroy_softc *sc = pa->pa_pc->_cookie;
432b95ee612Skettenis struct extent *ex;
433b95ee612Skettenis bus_space_tag_t tag;
434b95ee612Skettenis bus_addr_t start;
435b95ee612Skettenis bus_size_t size;
436b95ee612Skettenis
437b95ee612Skettenis if (io) {
438b95ee612Skettenis ex = sc->sc_ioex;
439b95ee612Skettenis tag = pa->pa_iot;
440b95ee612Skettenis start = 0xa000;
441b95ee612Skettenis size = 0x1000;
442b95ee612Skettenis } else {
443b95ee612Skettenis if (!sc->sc_memex) {
444b95ee612Skettenis bus_space_handle_t memh;
445b95ee612Skettenis bus_addr_t mem_start;
446b95ee612Skettenis
447b95ee612Skettenis if (elroy_memalloc(sc, 0xf0800000, 0xff7fffff,
448b95ee612Skettenis ELROY_MEM_WINDOW, ELROY_MEM_WINDOW, EX_NOBOUNDARY,
449b95ee612Skettenis 0, &mem_start, &memh))
450b95ee612Skettenis return (NULL);
451b95ee612Skettenis
452b95ee612Skettenis snprintf(sc->sc_memexname, sizeof(sc->sc_memexname),
453b95ee612Skettenis "%s_mem", sc->sc_dv.dv_xname);
454b95ee612Skettenis if ((sc->sc_memex = extent_create(sc->sc_memexname,
455b95ee612Skettenis mem_start, mem_start + ELROY_MEM_WINDOW, M_DEVBUF,
456b95ee612Skettenis NULL, 0, EX_NOWAIT | EX_MALLOCOK)) == NULL) {
457b95ee612Skettenis extent_destroy(sc->sc_ioex);
458b95ee612Skettenis bus_space_free(sc->sc_bt, memh,
459b95ee612Skettenis ELROY_MEM_WINDOW);
460b95ee612Skettenis return (NULL);
461b95ee612Skettenis }
462b95ee612Skettenis }
463b95ee612Skettenis ex = sc->sc_memex;
464b95ee612Skettenis tag = pa->pa_memt;
465b95ee612Skettenis start = ex->ex_start;
466b95ee612Skettenis size = ELROY_MEM_CHUNK;
467b95ee612Skettenis }
468b95ee612Skettenis
469b95ee612Skettenis if (extent_alloc_subregion(ex, start, ex->ex_end, size, size, 0,
470b95ee612Skettenis EX_NOBOUNDARY, EX_NOWAIT, &start))
471b95ee612Skettenis return (NULL);
472b95ee612Skettenis
473b95ee612Skettenis extent_free(ex, start, size, EX_NOWAIT);
474a5c223f8Sjsg return rbus_new_root_share(tag, ex, start, size);
475b95ee612Skettenis #else
476b95ee612Skettenis return (NULL);
477b95ee612Skettenis #endif
478b95ee612Skettenis }
479b95ee612Skettenis #endif
480b95ee612Skettenis
48187b07e5cSkettenis void *
elroy_vaddr(void * v,bus_space_handle_t h)48287b07e5cSkettenis elroy_vaddr(void *v, bus_space_handle_t h)
48387b07e5cSkettenis {
48487b07e5cSkettenis return ((void *)h);
48587b07e5cSkettenis }
48687b07e5cSkettenis
487b95ee612Skettenis u_int8_t
elroy_r1(void * v,bus_space_handle_t h,bus_size_t o)488b95ee612Skettenis elroy_r1(void *v, bus_space_handle_t h, bus_size_t o)
489b95ee612Skettenis {
490b95ee612Skettenis h += o;
491b95ee612Skettenis return *(volatile u_int8_t *)h;
492b95ee612Skettenis }
493b95ee612Skettenis
494b95ee612Skettenis u_int16_t
elroy_r2(void * v,bus_space_handle_t h,bus_size_t o)495b95ee612Skettenis elroy_r2(void *v, bus_space_handle_t h, bus_size_t o)
496b95ee612Skettenis {
497b95ee612Skettenis volatile u_int16_t *p;
498b95ee612Skettenis
499b95ee612Skettenis h += o;
500b95ee612Skettenis p = (volatile u_int16_t *)h;
501b95ee612Skettenis return (letoh16(*p));
502b95ee612Skettenis }
503b95ee612Skettenis
504b95ee612Skettenis u_int32_t
elroy_r4(void * v,bus_space_handle_t h,bus_size_t o)505b95ee612Skettenis elroy_r4(void *v, bus_space_handle_t h, bus_size_t o)
506b95ee612Skettenis {
507b95ee612Skettenis u_int32_t data;
508b95ee612Skettenis
509b95ee612Skettenis h += o;
510b95ee612Skettenis data = *(volatile u_int32_t *)h;
511b95ee612Skettenis return (letoh32(data));
512b95ee612Skettenis }
513b95ee612Skettenis
514b95ee612Skettenis u_int64_t
elroy_r8(void * v,bus_space_handle_t h,bus_size_t o)515b95ee612Skettenis elroy_r8(void *v, bus_space_handle_t h, bus_size_t o)
516b95ee612Skettenis {
517b95ee612Skettenis u_int64_t data;
518b95ee612Skettenis
519b95ee612Skettenis h += o;
520b95ee612Skettenis data = *(volatile u_int64_t *)h;
521b95ee612Skettenis return (letoh64(data));
522b95ee612Skettenis }
523b95ee612Skettenis
524b95ee612Skettenis void
elroy_w1(void * v,bus_space_handle_t h,bus_size_t o,u_int8_t vv)525b95ee612Skettenis elroy_w1(void *v, bus_space_handle_t h, bus_size_t o, u_int8_t vv)
526b95ee612Skettenis {
527b95ee612Skettenis h += o;
528b95ee612Skettenis *(volatile u_int8_t *)h = vv;
529b95ee612Skettenis }
530b95ee612Skettenis
531b95ee612Skettenis void
elroy_w2(void * v,bus_space_handle_t h,bus_size_t o,u_int16_t vv)532b95ee612Skettenis elroy_w2(void *v, bus_space_handle_t h, bus_size_t o, u_int16_t vv)
533b95ee612Skettenis {
534b95ee612Skettenis volatile u_int16_t *p;
535b95ee612Skettenis
536b95ee612Skettenis h += o;
537b95ee612Skettenis p = (volatile u_int16_t *)h;
538b95ee612Skettenis *p = htole16(vv);
539b95ee612Skettenis }
540b95ee612Skettenis
541b95ee612Skettenis void
elroy_w4(void * v,bus_space_handle_t h,bus_size_t o,u_int32_t vv)542b95ee612Skettenis elroy_w4(void *v, bus_space_handle_t h, bus_size_t o, u_int32_t vv)
543b95ee612Skettenis {
544b95ee612Skettenis h += o;
545b95ee612Skettenis vv = htole32(vv);
546b95ee612Skettenis *(volatile u_int32_t *)h = vv;
547b95ee612Skettenis }
548b95ee612Skettenis
549b95ee612Skettenis void
elroy_w8(void * v,bus_space_handle_t h,bus_size_t o,u_int64_t vv)550b95ee612Skettenis elroy_w8(void *v, bus_space_handle_t h, bus_size_t o, u_int64_t vv)
551b95ee612Skettenis {
552b95ee612Skettenis h += o;
553b95ee612Skettenis *(volatile u_int64_t *)h = htole64(vv);
554b95ee612Skettenis }
555b95ee612Skettenis
556b95ee612Skettenis
557b95ee612Skettenis void
elroy_rm_1(void * v,bus_space_handle_t h,bus_size_t o,u_int8_t * a,bus_size_t c)558b95ee612Skettenis elroy_rm_1(void *v, bus_space_handle_t h, bus_size_t o, u_int8_t *a, bus_size_t c)
559b95ee612Skettenis {
560b95ee612Skettenis volatile u_int8_t *p;
561b95ee612Skettenis
562b95ee612Skettenis h += o;
563b95ee612Skettenis p = (volatile u_int8_t *)h;
564b95ee612Skettenis while (c--)
565b95ee612Skettenis *a++ = *p;
566b95ee612Skettenis }
567b95ee612Skettenis
568b95ee612Skettenis void
elroy_rm_2(void * v,bus_space_handle_t h,bus_size_t o,u_int16_t * a,bus_size_t c)569b95ee612Skettenis elroy_rm_2(void *v, bus_space_handle_t h, bus_size_t o, u_int16_t *a, bus_size_t c)
570b95ee612Skettenis {
571b95ee612Skettenis volatile u_int16_t *p;
572b95ee612Skettenis
573b95ee612Skettenis h += o;
574b95ee612Skettenis p = (volatile u_int16_t *)h;
575b95ee612Skettenis while (c--)
576b95ee612Skettenis *a++ = letoh16(*p);
577b95ee612Skettenis }
578b95ee612Skettenis
579b95ee612Skettenis void
elroy_rm_4(void * v,bus_space_handle_t h,bus_size_t o,u_int32_t * a,bus_size_t c)580b95ee612Skettenis elroy_rm_4(void *v, bus_space_handle_t h, bus_size_t o, u_int32_t *a, bus_size_t c)
581b95ee612Skettenis {
582b95ee612Skettenis volatile u_int32_t *p;
583b95ee612Skettenis
584b95ee612Skettenis h += o;
585b95ee612Skettenis p = (volatile u_int32_t *)h;
586b95ee612Skettenis while (c--)
587b95ee612Skettenis *a++ = letoh32(*p);
588b95ee612Skettenis }
589b95ee612Skettenis
590b95ee612Skettenis void
elroy_rm_8(void * v,bus_space_handle_t h,bus_size_t o,u_int64_t * a,bus_size_t c)591b95ee612Skettenis elroy_rm_8(void *v, bus_space_handle_t h, bus_size_t o, u_int64_t *a, bus_size_t c)
592b95ee612Skettenis {
593b95ee612Skettenis volatile u_int64_t *p;
594b95ee612Skettenis
595b95ee612Skettenis h += o;
596b95ee612Skettenis p = (volatile u_int64_t *)h;
597b95ee612Skettenis while (c--)
598b95ee612Skettenis *a++ = letoh64(*p);
599b95ee612Skettenis }
600b95ee612Skettenis
601b95ee612Skettenis void
elroy_wm_1(void * v,bus_space_handle_t h,bus_size_t o,const u_int8_t * a,bus_size_t c)602b95ee612Skettenis elroy_wm_1(void *v, bus_space_handle_t h, bus_size_t o, const u_int8_t *a, bus_size_t c)
603b95ee612Skettenis {
604b95ee612Skettenis volatile u_int8_t *p;
605b95ee612Skettenis
606b95ee612Skettenis h += o;
607b95ee612Skettenis p = (volatile u_int8_t *)h;
608b95ee612Skettenis while (c--)
609b95ee612Skettenis *p = *a++;
610b95ee612Skettenis }
611b95ee612Skettenis
612b95ee612Skettenis void
elroy_wm_2(void * v,bus_space_handle_t h,bus_size_t o,const u_int16_t * a,bus_size_t c)613b95ee612Skettenis elroy_wm_2(void *v, bus_space_handle_t h, bus_size_t o, const u_int16_t *a, bus_size_t c)
614b95ee612Skettenis {
615b95ee612Skettenis volatile u_int16_t *p;
616b95ee612Skettenis
617b95ee612Skettenis h += o;
618b95ee612Skettenis p = (volatile u_int16_t *)h;
619b95ee612Skettenis while (c--)
620b95ee612Skettenis *p = htole16(*a++);
621b95ee612Skettenis }
622b95ee612Skettenis
623b95ee612Skettenis void
elroy_wm_4(void * v,bus_space_handle_t h,bus_size_t o,const u_int32_t * a,bus_size_t c)624b95ee612Skettenis elroy_wm_4(void *v, bus_space_handle_t h, bus_size_t o, const u_int32_t *a, bus_size_t c)
625b95ee612Skettenis {
626b95ee612Skettenis volatile u_int32_t *p;
627b95ee612Skettenis
628b95ee612Skettenis h += o;
629b95ee612Skettenis p = (volatile u_int32_t *)h;
630b95ee612Skettenis while (c--)
631b95ee612Skettenis *p = htole32(*a++);
632b95ee612Skettenis }
633b95ee612Skettenis
634b95ee612Skettenis void
elroy_wm_8(void * v,bus_space_handle_t h,bus_size_t o,const u_int64_t * a,bus_size_t c)635b95ee612Skettenis elroy_wm_8(void *v, bus_space_handle_t h, bus_size_t o, const u_int64_t *a, bus_size_t c)
636b95ee612Skettenis {
637b95ee612Skettenis volatile u_int64_t *p;
638b95ee612Skettenis
639b95ee612Skettenis h += o;
640b95ee612Skettenis p = (volatile u_int64_t *)h;
641b95ee612Skettenis while (c--)
642b95ee612Skettenis *p = htole64(*a++);
643b95ee612Skettenis }
644b95ee612Skettenis
645b95ee612Skettenis void
elroy_sm_1(void * v,bus_space_handle_t h,bus_size_t o,u_int8_t vv,bus_size_t c)646b95ee612Skettenis elroy_sm_1(void *v, bus_space_handle_t h, bus_size_t o, u_int8_t vv, bus_size_t c)
647b95ee612Skettenis {
648b95ee612Skettenis volatile u_int8_t *p;
649b95ee612Skettenis
650b95ee612Skettenis h += o;
651b95ee612Skettenis p = (volatile u_int8_t *)h;
652b95ee612Skettenis while (c--)
653b95ee612Skettenis *p = vv;
654b95ee612Skettenis }
655b95ee612Skettenis
656b95ee612Skettenis void
elroy_sm_2(void * v,bus_space_handle_t h,bus_size_t o,u_int16_t vv,bus_size_t c)657b95ee612Skettenis elroy_sm_2(void *v, bus_space_handle_t h, bus_size_t o, u_int16_t vv, bus_size_t c)
658b95ee612Skettenis {
659b95ee612Skettenis volatile u_int16_t *p;
660b95ee612Skettenis
661b95ee612Skettenis h += o;
662b95ee612Skettenis p = (volatile u_int16_t *)h;
663b95ee612Skettenis vv = htole16(vv);
664b95ee612Skettenis while (c--)
665b95ee612Skettenis *p = vv;
666b95ee612Skettenis }
667b95ee612Skettenis
668b95ee612Skettenis void
elroy_sm_4(void * v,bus_space_handle_t h,bus_size_t o,u_int32_t vv,bus_size_t c)669b95ee612Skettenis elroy_sm_4(void *v, bus_space_handle_t h, bus_size_t o, u_int32_t vv, bus_size_t c)
670b95ee612Skettenis {
671b95ee612Skettenis volatile u_int32_t *p;
672b95ee612Skettenis
673b95ee612Skettenis h += o;
674b95ee612Skettenis p = (volatile u_int32_t *)h;
675b95ee612Skettenis vv = htole32(vv);
676b95ee612Skettenis while (c--)
677b95ee612Skettenis *p = vv;
678b95ee612Skettenis }
679b95ee612Skettenis
680b95ee612Skettenis void
elroy_sm_8(void * v,bus_space_handle_t h,bus_size_t o,u_int64_t vv,bus_size_t c)681b95ee612Skettenis elroy_sm_8(void *v, bus_space_handle_t h, bus_size_t o, u_int64_t vv, bus_size_t c)
682b95ee612Skettenis {
683b95ee612Skettenis volatile u_int64_t *p;
684b95ee612Skettenis
685b95ee612Skettenis h += o;
686b95ee612Skettenis p = (volatile u_int64_t *)h;
687b95ee612Skettenis vv = htole64(vv);
688b95ee612Skettenis while (c--)
689b95ee612Skettenis *p = vv;
690b95ee612Skettenis }
691b95ee612Skettenis
692b95ee612Skettenis void
elroy_rrm_2(void * v,bus_space_handle_t h,bus_size_t o,u_int8_t * a,bus_size_t c)693b95ee612Skettenis elroy_rrm_2(void *v, bus_space_handle_t h, bus_size_t o,
694b95ee612Skettenis u_int8_t *a, bus_size_t c)
695b95ee612Skettenis {
696b95ee612Skettenis volatile u_int16_t *p, *q = (u_int16_t *)a;
697b95ee612Skettenis
698b95ee612Skettenis h += o;
699b95ee612Skettenis p = (volatile u_int16_t *)h;
700b95ee612Skettenis c /= 2;
701b95ee612Skettenis while (c--)
702b95ee612Skettenis *q++ = *p;
703b95ee612Skettenis }
704b95ee612Skettenis
705b95ee612Skettenis void
elroy_rrm_4(void * v,bus_space_handle_t h,bus_size_t o,u_int8_t * a,bus_size_t c)706b95ee612Skettenis elroy_rrm_4(void *v, bus_space_handle_t h, bus_size_t o,
707b95ee612Skettenis u_int8_t *a, bus_size_t c)
708b95ee612Skettenis {
709b95ee612Skettenis volatile u_int32_t *p, *q = (u_int32_t *)a;
710b95ee612Skettenis
711b95ee612Skettenis h += o;
712b95ee612Skettenis p = (volatile u_int32_t *)h;
713b95ee612Skettenis c /= 4;
714b95ee612Skettenis while (c--)
715b95ee612Skettenis *q++ = *p;
716b95ee612Skettenis }
717b95ee612Skettenis
718b95ee612Skettenis void
elroy_rrm_8(void * v,bus_space_handle_t h,bus_size_t o,u_int8_t * a,bus_size_t c)719b95ee612Skettenis elroy_rrm_8(void *v, bus_space_handle_t h, bus_size_t o,
720b95ee612Skettenis u_int8_t *a, bus_size_t c)
721b95ee612Skettenis {
722b95ee612Skettenis volatile u_int64_t *p, *q = (u_int64_t *)a;
723b95ee612Skettenis
724b95ee612Skettenis h += o;
725b95ee612Skettenis p = (volatile u_int64_t *)h;
726b95ee612Skettenis c /= 8;
727b95ee612Skettenis while (c--)
728b95ee612Skettenis *q++ = *p;
729b95ee612Skettenis }
730b95ee612Skettenis
731b95ee612Skettenis void
elroy_wrm_2(void * v,bus_space_handle_t h,bus_size_t o,const u_int8_t * a,bus_size_t c)732b95ee612Skettenis elroy_wrm_2(void *v, bus_space_handle_t h, bus_size_t o,
733b95ee612Skettenis const u_int8_t *a, bus_size_t c)
734b95ee612Skettenis {
735b95ee612Skettenis volatile u_int16_t *p;
736b95ee612Skettenis const u_int16_t *q = (const u_int16_t *)a;
737b95ee612Skettenis
738b95ee612Skettenis h += o;
739b95ee612Skettenis p = (volatile u_int16_t *)h;
740b95ee612Skettenis c /= 2;
741b95ee612Skettenis while (c--)
742b95ee612Skettenis *p = *q++;
743b95ee612Skettenis }
744b95ee612Skettenis
745b95ee612Skettenis void
elroy_wrm_4(void * v,bus_space_handle_t h,bus_size_t o,const u_int8_t * a,bus_size_t c)746b95ee612Skettenis elroy_wrm_4(void *v, bus_space_handle_t h, bus_size_t o,
747b95ee612Skettenis const u_int8_t *a, bus_size_t c)
748b95ee612Skettenis {
749b95ee612Skettenis volatile u_int32_t *p;
750b95ee612Skettenis const u_int32_t *q = (const u_int32_t *)a;
751b95ee612Skettenis
752b95ee612Skettenis h += o;
753b95ee612Skettenis p = (volatile u_int32_t *)h;
754b95ee612Skettenis c /= 4;
755b95ee612Skettenis while (c--)
756b95ee612Skettenis *p = *q++;
757b95ee612Skettenis }
758b95ee612Skettenis
759b95ee612Skettenis void
elroy_wrm_8(void * v,bus_space_handle_t h,bus_size_t o,const u_int8_t * a,bus_size_t c)760b95ee612Skettenis elroy_wrm_8(void *v, bus_space_handle_t h, bus_size_t o,
761b95ee612Skettenis const u_int8_t *a, bus_size_t c)
762b95ee612Skettenis {
763b95ee612Skettenis volatile u_int64_t *p;
764b95ee612Skettenis const u_int64_t *q = (const u_int64_t *)a;
765b95ee612Skettenis
766b95ee612Skettenis h += o;
767b95ee612Skettenis p = (volatile u_int64_t *)h;
768b95ee612Skettenis c /= 8;
769b95ee612Skettenis while (c--)
770b95ee612Skettenis *p = *q++;
771b95ee612Skettenis }
772b95ee612Skettenis
773b95ee612Skettenis void
elroy_rr_1(void * v,bus_space_handle_t h,bus_size_t o,u_int8_t * a,bus_size_t c)774b95ee612Skettenis elroy_rr_1(void *v, bus_space_handle_t h, bus_size_t o, u_int8_t *a, bus_size_t c)
775b95ee612Skettenis {
776b95ee612Skettenis volatile u_int8_t *p;
777b95ee612Skettenis
778b95ee612Skettenis h += o;
779b95ee612Skettenis p = (volatile u_int8_t *)h;
780b95ee612Skettenis while (c--)
781b95ee612Skettenis *a++ = *p++;
782b95ee612Skettenis }
783b95ee612Skettenis
784b95ee612Skettenis void
elroy_rr_2(void * v,bus_space_handle_t h,bus_size_t o,u_int16_t * a,bus_size_t c)785b95ee612Skettenis elroy_rr_2(void *v, bus_space_handle_t h, bus_size_t o, u_int16_t *a, bus_size_t c)
786b95ee612Skettenis {
787b95ee612Skettenis volatile u_int16_t *p, data;
788b95ee612Skettenis
789b95ee612Skettenis h += o;
790b95ee612Skettenis p = (volatile u_int16_t *)h;
791b95ee612Skettenis while (c--) {
792b95ee612Skettenis data = *p++;
793b95ee612Skettenis *a++ = letoh16(data);
794b95ee612Skettenis }
795b95ee612Skettenis }
796b95ee612Skettenis
797b95ee612Skettenis void
elroy_rr_4(void * v,bus_space_handle_t h,bus_size_t o,u_int32_t * a,bus_size_t c)798b95ee612Skettenis elroy_rr_4(void *v, bus_space_handle_t h, bus_size_t o, u_int32_t *a, bus_size_t c)
799b95ee612Skettenis {
800b95ee612Skettenis volatile u_int32_t *p, data;
801b95ee612Skettenis
802b95ee612Skettenis h += o;
803b95ee612Skettenis p = (volatile u_int32_t *)h;
804b95ee612Skettenis while (c--) {
805b95ee612Skettenis data = *p++;
806b95ee612Skettenis *a++ = letoh32(data);
807b95ee612Skettenis }
808b95ee612Skettenis }
809b95ee612Skettenis
810b95ee612Skettenis void
elroy_rr_8(void * v,bus_space_handle_t h,bus_size_t o,u_int64_t * a,bus_size_t c)811b95ee612Skettenis elroy_rr_8(void *v, bus_space_handle_t h, bus_size_t o, u_int64_t *a, bus_size_t c)
812b95ee612Skettenis {
813b95ee612Skettenis volatile u_int64_t *p, data;
814b95ee612Skettenis
815b95ee612Skettenis h += o;
816b95ee612Skettenis p = (volatile u_int64_t *)h;
817b95ee612Skettenis while (c--) {
818b95ee612Skettenis data = *p++;
819b95ee612Skettenis *a++ = letoh64(data);
820b95ee612Skettenis }
821b95ee612Skettenis }
822b95ee612Skettenis
823b95ee612Skettenis void
elroy_wr_1(void * v,bus_space_handle_t h,bus_size_t o,const u_int8_t * a,bus_size_t c)824b95ee612Skettenis elroy_wr_1(void *v, bus_space_handle_t h, bus_size_t o, const u_int8_t *a, bus_size_t c)
825b95ee612Skettenis {
826b95ee612Skettenis volatile u_int8_t *p;
827b95ee612Skettenis
828b95ee612Skettenis h += o;
829b95ee612Skettenis p = (volatile u_int8_t *)h;
830b95ee612Skettenis while (c--)
831b95ee612Skettenis *p++ = *a++;
832b95ee612Skettenis }
833b95ee612Skettenis
834b95ee612Skettenis void
elroy_wr_2(void * v,bus_space_handle_t h,bus_size_t o,const u_int16_t * a,bus_size_t c)835b95ee612Skettenis elroy_wr_2(void *v, bus_space_handle_t h, bus_size_t o, const u_int16_t *a, bus_size_t c)
836b95ee612Skettenis {
837b95ee612Skettenis volatile u_int16_t *p, data;
838b95ee612Skettenis
839b95ee612Skettenis h += o;
840b95ee612Skettenis p = (volatile u_int16_t *)h;
841b95ee612Skettenis while (c--) {
842b95ee612Skettenis data = *a++;
843b95ee612Skettenis *p++ = htole16(data);
844b95ee612Skettenis }
845b95ee612Skettenis }
846b95ee612Skettenis
847b95ee612Skettenis void
elroy_wr_4(void * v,bus_space_handle_t h,bus_size_t o,const u_int32_t * a,bus_size_t c)848b95ee612Skettenis elroy_wr_4(void *v, bus_space_handle_t h, bus_size_t o, const u_int32_t *a, bus_size_t c)
849b95ee612Skettenis {
850b95ee612Skettenis volatile u_int32_t *p, data;
851b95ee612Skettenis
852b95ee612Skettenis h += o;
853b95ee612Skettenis p = (volatile u_int32_t *)h;
854b95ee612Skettenis while (c--) {
855b95ee612Skettenis data = *a++;
856b95ee612Skettenis *p++ = htole32(data);
857b95ee612Skettenis }
858b95ee612Skettenis }
859b95ee612Skettenis
860b95ee612Skettenis void
elroy_wr_8(void * v,bus_space_handle_t h,bus_size_t o,const u_int64_t * a,bus_size_t c)861b95ee612Skettenis elroy_wr_8(void *v, bus_space_handle_t h, bus_size_t o, const u_int64_t *a, bus_size_t c)
862b95ee612Skettenis {
863b95ee612Skettenis volatile u_int64_t *p, data;
864b95ee612Skettenis
865b95ee612Skettenis h += o;
866b95ee612Skettenis p = (volatile u_int64_t *)h;
867b95ee612Skettenis while (c--) {
868b95ee612Skettenis data = *a++;
869b95ee612Skettenis *p++ = htole64(data);
870b95ee612Skettenis }
871b95ee612Skettenis }
872b95ee612Skettenis
873b95ee612Skettenis void
elroy_rrr_2(void * v,bus_space_handle_t h,bus_size_t o,u_int8_t * a,bus_size_t c)874b95ee612Skettenis elroy_rrr_2(void *v, bus_space_handle_t h, bus_size_t o,
875b95ee612Skettenis u_int8_t *a, bus_size_t c)
876b95ee612Skettenis {
877b95ee612Skettenis volatile u_int16_t *p, *q = (u_int16_t *)a;
878b95ee612Skettenis
879b95ee612Skettenis c /= 2;
880b95ee612Skettenis h += o;
881b95ee612Skettenis p = (volatile u_int16_t *)h;
882b95ee612Skettenis while (c--)
883b95ee612Skettenis *q++ = *p++;
884b95ee612Skettenis }
885b95ee612Skettenis
886b95ee612Skettenis void
elroy_rrr_4(void * v,bus_space_handle_t h,bus_size_t o,u_int8_t * a,bus_size_t c)887b95ee612Skettenis elroy_rrr_4(void *v, bus_space_handle_t h, bus_size_t o,
888b95ee612Skettenis u_int8_t *a, bus_size_t c)
889b95ee612Skettenis {
890b95ee612Skettenis volatile u_int32_t *p, *q = (u_int32_t *)a;
891b95ee612Skettenis
892b95ee612Skettenis c /= 4;
893b95ee612Skettenis h += o;
894b95ee612Skettenis p = (volatile u_int32_t *)h;
895b95ee612Skettenis while (c--)
896b95ee612Skettenis *q++ = *p++;
897b95ee612Skettenis }
898b95ee612Skettenis
899b95ee612Skettenis void
elroy_rrr_8(void * v,bus_space_handle_t h,bus_size_t o,u_int8_t * a,bus_size_t c)900b95ee612Skettenis elroy_rrr_8(void *v, bus_space_handle_t h, bus_size_t o,
901b95ee612Skettenis u_int8_t *a, bus_size_t c)
902b95ee612Skettenis {
903b95ee612Skettenis volatile u_int64_t *p, *q = (u_int64_t *)a;
904b95ee612Skettenis
905b95ee612Skettenis c /= 8;
906b95ee612Skettenis h += o;
907b95ee612Skettenis p = (volatile u_int64_t *)h;
908b95ee612Skettenis while (c--)
909b95ee612Skettenis *q++ = *p++;
910b95ee612Skettenis }
911b95ee612Skettenis
912b95ee612Skettenis void
elroy_wrr_2(void * v,bus_space_handle_t h,bus_size_t o,const u_int8_t * a,bus_size_t c)913b95ee612Skettenis elroy_wrr_2(void *v, bus_space_handle_t h, bus_size_t o,
914b95ee612Skettenis const u_int8_t *a, bus_size_t c)
915b95ee612Skettenis {
916b95ee612Skettenis volatile u_int16_t *p;
917b95ee612Skettenis const u_int16_t *q = (u_int16_t *)a;
918b95ee612Skettenis
919b95ee612Skettenis c /= 2;
920b95ee612Skettenis h += o;
921b95ee612Skettenis p = (volatile u_int16_t *)h;
922b95ee612Skettenis while (c--)
923b95ee612Skettenis *p++ = *q++;
924b95ee612Skettenis }
925b95ee612Skettenis
926b95ee612Skettenis void
elroy_wrr_4(void * v,bus_space_handle_t h,bus_size_t o,const u_int8_t * a,bus_size_t c)927b95ee612Skettenis elroy_wrr_4(void *v, bus_space_handle_t h, bus_size_t o,
928b95ee612Skettenis const u_int8_t *a, bus_size_t c)
929b95ee612Skettenis {
930b95ee612Skettenis volatile u_int32_t *p;
931b95ee612Skettenis const u_int32_t *q = (u_int32_t *)a;
932b95ee612Skettenis
933b95ee612Skettenis c /= 4;
934b95ee612Skettenis h += o;
935b95ee612Skettenis p = (volatile u_int32_t *)h;
936b95ee612Skettenis while (c--)
937b95ee612Skettenis *p++ = *q++;
938b95ee612Skettenis }
939b95ee612Skettenis
940b95ee612Skettenis void
elroy_wrr_8(void * v,bus_space_handle_t h,bus_size_t o,const u_int8_t * a,bus_size_t c)941b95ee612Skettenis elroy_wrr_8(void *v, bus_space_handle_t h, bus_size_t o,
942b95ee612Skettenis const u_int8_t *a, bus_size_t c)
943b95ee612Skettenis {
944b95ee612Skettenis volatile u_int64_t *p;
945b95ee612Skettenis const u_int64_t *q = (u_int64_t *)a;
946b95ee612Skettenis
947b95ee612Skettenis c /= 8;
948b95ee612Skettenis h += o;
949b95ee612Skettenis p = (volatile u_int64_t *)h;
950b95ee612Skettenis while (c--)
951b95ee612Skettenis *p++ = *q++;
952b95ee612Skettenis }
953b95ee612Skettenis
954b95ee612Skettenis void
elroy_sr_1(void * v,bus_space_handle_t h,bus_size_t o,u_int8_t vv,bus_size_t c)955b95ee612Skettenis elroy_sr_1(void *v, bus_space_handle_t h, bus_size_t o, u_int8_t vv, bus_size_t c)
956b95ee612Skettenis {
957b95ee612Skettenis volatile u_int8_t *p;
958b95ee612Skettenis
959b95ee612Skettenis h += o;
960b95ee612Skettenis p = (volatile u_int8_t *)h;
961b95ee612Skettenis while (c--)
962b95ee612Skettenis *p++ = vv;
963b95ee612Skettenis }
964b95ee612Skettenis
965b95ee612Skettenis void
elroy_sr_2(void * v,bus_space_handle_t h,bus_size_t o,u_int16_t vv,bus_size_t c)966b95ee612Skettenis elroy_sr_2(void *v, bus_space_handle_t h, bus_size_t o, u_int16_t vv, bus_size_t c)
967b95ee612Skettenis {
968b95ee612Skettenis volatile u_int16_t *p;
969b95ee612Skettenis
970b95ee612Skettenis h += o;
971b95ee612Skettenis vv = htole16(vv);
972b95ee612Skettenis p = (volatile u_int16_t *)h;
973b95ee612Skettenis while (c--)
974b95ee612Skettenis *p++ = vv;
975b95ee612Skettenis }
976b95ee612Skettenis
977b95ee612Skettenis void
elroy_sr_4(void * v,bus_space_handle_t h,bus_size_t o,u_int32_t vv,bus_size_t c)978b95ee612Skettenis elroy_sr_4(void *v, bus_space_handle_t h, bus_size_t o, u_int32_t vv, bus_size_t c)
979b95ee612Skettenis {
980b95ee612Skettenis volatile u_int32_t *p;
981b95ee612Skettenis
982b95ee612Skettenis h += o;
983b95ee612Skettenis vv = htole32(vv);
984b95ee612Skettenis p = (volatile u_int32_t *)h;
985b95ee612Skettenis while (c--)
986b95ee612Skettenis *p++ = vv;
987b95ee612Skettenis }
988b95ee612Skettenis
989b95ee612Skettenis void
elroy_sr_8(void * v,bus_space_handle_t h,bus_size_t o,u_int64_t vv,bus_size_t c)990b95ee612Skettenis elroy_sr_8(void *v, bus_space_handle_t h, bus_size_t o, u_int64_t vv, bus_size_t c)
991b95ee612Skettenis {
992b95ee612Skettenis volatile u_int64_t *p;
993b95ee612Skettenis
994b95ee612Skettenis h += o;
995b95ee612Skettenis vv = htole64(vv);
996b95ee612Skettenis p = (volatile u_int64_t *)h;
997b95ee612Skettenis while (c--)
998b95ee612Skettenis *p++ = vv;
999b95ee612Skettenis }
1000b95ee612Skettenis
1001b95ee612Skettenis void
elroy_cp_1(void * v,bus_space_handle_t h1,bus_size_t o1,bus_space_handle_t h2,bus_size_t o2,bus_size_t c)1002b95ee612Skettenis elroy_cp_1(void *v, bus_space_handle_t h1, bus_size_t o1,
1003b95ee612Skettenis bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
1004b95ee612Skettenis {
1005b95ee612Skettenis while (c--)
1006b95ee612Skettenis elroy_w1(v, h1, o1++, elroy_r1(v, h2, o2++));
1007b95ee612Skettenis }
1008b95ee612Skettenis
1009b95ee612Skettenis void
elroy_cp_2(void * v,bus_space_handle_t h1,bus_size_t o1,bus_space_handle_t h2,bus_size_t o2,bus_size_t c)1010b95ee612Skettenis elroy_cp_2(void *v, bus_space_handle_t h1, bus_size_t o1,
1011b95ee612Skettenis bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
1012b95ee612Skettenis {
1013b95ee612Skettenis while (c--) {
1014b95ee612Skettenis elroy_w2(v, h1, o1, elroy_r2(v, h2, o2));
1015b95ee612Skettenis o1 += 2;
1016b95ee612Skettenis o2 += 2;
1017b95ee612Skettenis }
1018b95ee612Skettenis }
1019b95ee612Skettenis
1020b95ee612Skettenis void
elroy_cp_4(void * v,bus_space_handle_t h1,bus_size_t o1,bus_space_handle_t h2,bus_size_t o2,bus_size_t c)1021b95ee612Skettenis elroy_cp_4(void *v, bus_space_handle_t h1, bus_size_t o1,
1022b95ee612Skettenis bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
1023b95ee612Skettenis {
1024b95ee612Skettenis while (c--) {
1025b95ee612Skettenis elroy_w4(v, h1, o1, elroy_r4(v, h2, o2));
1026b95ee612Skettenis o1 += 4;
1027b95ee612Skettenis o2 += 4;
1028b95ee612Skettenis }
1029b95ee612Skettenis }
1030b95ee612Skettenis
1031b95ee612Skettenis void
elroy_cp_8(void * v,bus_space_handle_t h1,bus_size_t o1,bus_space_handle_t h2,bus_size_t o2,bus_size_t c)1032b95ee612Skettenis elroy_cp_8(void *v, bus_space_handle_t h1, bus_size_t o1,
1033b95ee612Skettenis bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
1034b95ee612Skettenis {
1035b95ee612Skettenis while (c--) {
1036b95ee612Skettenis elroy_w8(v, h1, o1, elroy_r8(v, h2, o2));
1037b95ee612Skettenis o1 += 8;
1038b95ee612Skettenis o2 += 8;
1039b95ee612Skettenis }
1040b95ee612Skettenis }
1041b95ee612Skettenis
1042b95ee612Skettenis const struct hppa_bus_space_tag elroy_iomemt = {
1043b95ee612Skettenis NULL,
1044b95ee612Skettenis
1045b95ee612Skettenis NULL, elroy_unmap, elroy_subregion, NULL, elroy_free,
104687b07e5cSkettenis elroy_barrier, elroy_vaddr,
1047b95ee612Skettenis elroy_r1, elroy_r2, elroy_r4, elroy_r8,
1048b95ee612Skettenis elroy_w1, elroy_w2, elroy_w4, elroy_w8,
1049b95ee612Skettenis elroy_rm_1, elroy_rm_2, elroy_rm_4, elroy_rm_8,
1050b95ee612Skettenis elroy_wm_1, elroy_wm_2, elroy_wm_4, elroy_wm_8,
1051b95ee612Skettenis elroy_sm_1, elroy_sm_2, elroy_sm_4, elroy_sm_8,
1052b95ee612Skettenis elroy_rrm_2, elroy_rrm_4, elroy_rrm_8,
1053b95ee612Skettenis elroy_wrm_2, elroy_wrm_4, elroy_wrm_8,
1054b95ee612Skettenis elroy_rr_1, elroy_rr_2, elroy_rr_4, elroy_rr_8,
1055b95ee612Skettenis elroy_wr_1, elroy_wr_2, elroy_wr_4, elroy_wr_8,
1056b95ee612Skettenis elroy_rrr_2, elroy_rrr_4, elroy_rrr_8,
1057b95ee612Skettenis elroy_wrr_2, elroy_wrr_4, elroy_wrr_8,
1058b95ee612Skettenis elroy_sr_1, elroy_sr_2, elroy_sr_4, elroy_sr_8,
1059b95ee612Skettenis elroy_cp_1, elroy_cp_2, elroy_cp_4, elroy_cp_8
1060b95ee612Skettenis };
1061b95ee612Skettenis
1062dd6e4488Sderaadt int elroy_dmamap_create(void *v, bus_size_t size,
1063dd6e4488Sderaadt int nsegments, bus_size_t maxsegsz,
1064dd6e4488Sderaadt bus_size_t boundary, int flags,
1065dd6e4488Sderaadt bus_dmamap_t *dmamp);
1066dd6e4488Sderaadt void elroy_dmamap_destroy(void *v, bus_dmamap_t map);
1067dd6e4488Sderaadt int elroy_dmamap_load(void *v, bus_dmamap_t map,
1068dd6e4488Sderaadt void *addr, bus_size_t size,
1069dd6e4488Sderaadt struct proc *p, int flags);
1070dd6e4488Sderaadt int elroy_dmamap_load_mbuf(void *v, bus_dmamap_t map,
1071dd6e4488Sderaadt struct mbuf *m, int flags);
1072dd6e4488Sderaadt int elroy_dmamap_load_uio(void *v, bus_dmamap_t map,
1073dd6e4488Sderaadt struct uio *uio, int flags);
1074dd6e4488Sderaadt int elroy_dmamap_load_raw(void *v, bus_dmamap_t map,
1075dd6e4488Sderaadt bus_dma_segment_t *segs,
1076dd6e4488Sderaadt int nsegs, bus_size_t size, int flags);
1077dd6e4488Sderaadt void elroy_dmamap_unload(void *v, bus_dmamap_t map);
1078dd6e4488Sderaadt void elroy_dmamap_sync(void *v, bus_dmamap_t map, bus_addr_t off,
1079dd6e4488Sderaadt bus_size_t len, int ops);
1080dd6e4488Sderaadt int elroy_dmamem_alloc(void *v, bus_size_t size,
1081dd6e4488Sderaadt bus_size_t alignment, bus_size_t boundary,
1082dd6e4488Sderaadt bus_dma_segment_t *segs, int nsegs, int *rsegs, int flags);
1083dd6e4488Sderaadt void elroy_dmamem_free(void *v, bus_dma_segment_t *segs,
1084dd6e4488Sderaadt int nsegs);
1085dd6e4488Sderaadt int elroy_dmamem_map(void *v, bus_dma_segment_t *segs, int nsegs,
1086dd6e4488Sderaadt size_t size, caddr_t *kvap, int flags);
1087dd6e4488Sderaadt void elroy_dmamem_unmap(void *v, caddr_t kva, size_t size);
1088dd6e4488Sderaadt paddr_t elroy_dmamem_mmap(void *v, bus_dma_segment_t *segs,
1089dd6e4488Sderaadt int nsegs, off_t off, int prot, int flags);
1090dd6e4488Sderaadt
1091b95ee612Skettenis int
elroy_dmamap_create(void * v,bus_size_t size,int nsegments,bus_size_t maxsegsz,bus_size_t boundary,int flags,bus_dmamap_t * dmamp)1092b95ee612Skettenis elroy_dmamap_create(void *v, bus_size_t size, int nsegments,
1093b95ee612Skettenis bus_size_t maxsegsz, bus_size_t boundary, int flags, bus_dmamap_t *dmamp)
1094b95ee612Skettenis {
1095b95ee612Skettenis struct elroy_softc *sc = v;
1096b95ee612Skettenis
1097b95ee612Skettenis /* TODO check the addresses, boundary, enable dma */
1098b95ee612Skettenis
1099b95ee612Skettenis return (bus_dmamap_create(sc->sc_dmat, size, nsegments,
1100b95ee612Skettenis maxsegsz, boundary, flags, dmamp));
1101b95ee612Skettenis }
1102b95ee612Skettenis
1103b95ee612Skettenis void
elroy_dmamap_destroy(void * v,bus_dmamap_t map)1104b95ee612Skettenis elroy_dmamap_destroy(void *v, bus_dmamap_t map)
1105b95ee612Skettenis {
1106b95ee612Skettenis struct elroy_softc *sc = v;
1107b95ee612Skettenis
1108b95ee612Skettenis bus_dmamap_destroy(sc->sc_dmat, map);
1109b95ee612Skettenis }
1110b95ee612Skettenis
1111b95ee612Skettenis int
elroy_dmamap_load(void * v,bus_dmamap_t map,void * addr,bus_size_t size,struct proc * p,int flags)1112b95ee612Skettenis elroy_dmamap_load(void *v, bus_dmamap_t map, void *addr, bus_size_t size,
1113b95ee612Skettenis struct proc *p, int flags)
1114b95ee612Skettenis {
1115b95ee612Skettenis struct elroy_softc *sc = v;
1116b95ee612Skettenis
1117b95ee612Skettenis return (bus_dmamap_load(sc->sc_dmat, map, addr, size, p, flags));
1118b95ee612Skettenis }
1119b95ee612Skettenis
1120b95ee612Skettenis int
elroy_dmamap_load_mbuf(void * v,bus_dmamap_t map,struct mbuf * m,int flags)1121b95ee612Skettenis elroy_dmamap_load_mbuf(void *v, bus_dmamap_t map, struct mbuf *m, int flags)
1122b95ee612Skettenis {
1123b95ee612Skettenis struct elroy_softc *sc = v;
1124b95ee612Skettenis
1125b95ee612Skettenis return (bus_dmamap_load_mbuf(sc->sc_dmat, map, m, flags));
1126b95ee612Skettenis }
1127b95ee612Skettenis
1128b95ee612Skettenis int
elroy_dmamap_load_uio(void * v,bus_dmamap_t map,struct uio * uio,int flags)1129b95ee612Skettenis elroy_dmamap_load_uio(void *v, bus_dmamap_t map, struct uio *uio, int flags)
1130b95ee612Skettenis {
1131b95ee612Skettenis struct elroy_softc *sc = v;
1132b95ee612Skettenis
1133b95ee612Skettenis return (bus_dmamap_load_uio(sc->sc_dmat, map, uio, flags));
1134b95ee612Skettenis }
1135b95ee612Skettenis
1136b95ee612Skettenis int
elroy_dmamap_load_raw(void * v,bus_dmamap_t map,bus_dma_segment_t * segs,int nsegs,bus_size_t size,int flags)1137b95ee612Skettenis elroy_dmamap_load_raw(void *v, bus_dmamap_t map, bus_dma_segment_t *segs,
1138b95ee612Skettenis int nsegs, bus_size_t size, int flags)
1139b95ee612Skettenis {
1140b95ee612Skettenis struct elroy_softc *sc = v;
1141b95ee612Skettenis
1142b95ee612Skettenis return (bus_dmamap_load_raw(sc->sc_dmat, map, segs, nsegs, size, flags));
1143b95ee612Skettenis }
1144b95ee612Skettenis
1145b95ee612Skettenis void
elroy_dmamap_unload(void * v,bus_dmamap_t map)1146b95ee612Skettenis elroy_dmamap_unload(void *v, bus_dmamap_t map)
1147b95ee612Skettenis {
1148b95ee612Skettenis struct elroy_softc *sc = v;
1149b95ee612Skettenis
1150b95ee612Skettenis bus_dmamap_unload(sc->sc_dmat, map);
1151b95ee612Skettenis }
1152b95ee612Skettenis
1153b95ee612Skettenis void
elroy_dmamap_sync(void * v,bus_dmamap_t map,bus_addr_t off,bus_size_t len,int ops)1154b95ee612Skettenis elroy_dmamap_sync(void *v, bus_dmamap_t map, bus_addr_t off,
1155b95ee612Skettenis bus_size_t len, int ops)
1156b95ee612Skettenis {
1157b95ee612Skettenis struct elroy_softc *sc = v;
1158b95ee612Skettenis
1159b95ee612Skettenis bus_dmamap_sync(sc->sc_dmat, map, off, len, ops);
1160b95ee612Skettenis }
1161b95ee612Skettenis
1162b95ee612Skettenis int
elroy_dmamem_alloc(void * v,bus_size_t size,bus_size_t alignment,bus_size_t boundary,bus_dma_segment_t * segs,int nsegs,int * rsegs,int flags)1163b95ee612Skettenis elroy_dmamem_alloc(void *v, bus_size_t size, bus_size_t alignment,
1164b95ee612Skettenis bus_size_t boundary, bus_dma_segment_t *segs,
1165b95ee612Skettenis int nsegs, int *rsegs, int flags)
1166b95ee612Skettenis {
1167b95ee612Skettenis struct elroy_softc *sc = v;
1168b95ee612Skettenis
1169b95ee612Skettenis return (bus_dmamem_alloc(sc->sc_dmat, size, alignment, boundary,
1170b95ee612Skettenis segs, nsegs, rsegs, flags));
1171b95ee612Skettenis }
1172b95ee612Skettenis
1173b95ee612Skettenis void
elroy_dmamem_free(void * v,bus_dma_segment_t * segs,int nsegs)1174b95ee612Skettenis elroy_dmamem_free(void *v, bus_dma_segment_t *segs, int nsegs)
1175b95ee612Skettenis {
1176b95ee612Skettenis struct elroy_softc *sc = v;
1177b95ee612Skettenis
1178b95ee612Skettenis bus_dmamem_free(sc->sc_dmat, segs, nsegs);
1179b95ee612Skettenis }
1180b95ee612Skettenis
1181b95ee612Skettenis int
elroy_dmamem_map(void * v,bus_dma_segment_t * segs,int nsegs,size_t size,caddr_t * kvap,int flags)1182b95ee612Skettenis elroy_dmamem_map(void *v, bus_dma_segment_t *segs, int nsegs, size_t size,
1183b95ee612Skettenis caddr_t *kvap, int flags)
1184b95ee612Skettenis {
1185b95ee612Skettenis struct elroy_softc *sc = v;
1186b95ee612Skettenis
1187b95ee612Skettenis return (bus_dmamem_map(sc->sc_dmat, segs, nsegs, size, kvap, flags));
1188b95ee612Skettenis }
1189b95ee612Skettenis
1190b95ee612Skettenis void
elroy_dmamem_unmap(void * v,caddr_t kva,size_t size)1191b95ee612Skettenis elroy_dmamem_unmap(void *v, caddr_t kva, size_t size)
1192b95ee612Skettenis {
1193b95ee612Skettenis struct elroy_softc *sc = v;
1194b95ee612Skettenis
1195b95ee612Skettenis bus_dmamem_unmap(sc->sc_dmat, kva, size);
1196b95ee612Skettenis }
1197b95ee612Skettenis
1198b95ee612Skettenis paddr_t
elroy_dmamem_mmap(void * v,bus_dma_segment_t * segs,int nsegs,off_t off,int prot,int flags)1199b95ee612Skettenis elroy_dmamem_mmap(void *v, bus_dma_segment_t *segs, int nsegs, off_t off,
1200b95ee612Skettenis int prot, int flags)
1201b95ee612Skettenis {
1202b95ee612Skettenis struct elroy_softc *sc = v;
1203b95ee612Skettenis
1204b95ee612Skettenis return (bus_dmamem_mmap(sc->sc_dmat, segs, nsegs, off, prot, flags));
1205b95ee612Skettenis }
1206b95ee612Skettenis
1207b95ee612Skettenis const struct hppa_bus_dma_tag elroy_dmat = {
1208b95ee612Skettenis NULL,
1209b95ee612Skettenis elroy_dmamap_create, elroy_dmamap_destroy,
1210b95ee612Skettenis elroy_dmamap_load, elroy_dmamap_load_mbuf,
1211b95ee612Skettenis elroy_dmamap_load_uio, elroy_dmamap_load_raw,
1212b95ee612Skettenis elroy_dmamap_unload, elroy_dmamap_sync,
1213b95ee612Skettenis
1214b95ee612Skettenis elroy_dmamem_alloc, elroy_dmamem_free, elroy_dmamem_map,
1215b95ee612Skettenis elroy_dmamem_unmap, elroy_dmamem_mmap
1216b95ee612Skettenis };
1217b95ee612Skettenis
1218b95ee612Skettenis const struct hppa_pci_chipset_tag elroy_pc = {
1219b95ee612Skettenis NULL,
1220b95ee612Skettenis elroy_attach_hook, elroy_maxdevs, elroy_make_tag, elroy_decompose_tag,
1221b1926db3Smiod elroy_conf_size, elroy_conf_read, elroy_conf_write,
1222b95ee612Skettenis apic_intr_map, apic_intr_string,
1223b95ee612Skettenis apic_intr_establish, apic_intr_disestablish,
1224b95ee612Skettenis #if NCARDBUS > 0
1225b95ee612Skettenis elroy_alloc_parent
1226b95ee612Skettenis #else
1227b95ee612Skettenis NULL
1228b95ee612Skettenis #endif
1229b95ee612Skettenis };
1230b95ee612Skettenis
1231dd6e4488Sderaadt int elroy_print(void *aux, const char *pnp);
1232dd6e4488Sderaadt
1233b95ee612Skettenis int
elroy_print(void * aux,const char * pnp)1234b95ee612Skettenis elroy_print(void *aux, const char *pnp)
1235b95ee612Skettenis {
1236b95ee612Skettenis struct pcibus_attach_args *pba = aux;
1237b95ee612Skettenis
1238b95ee612Skettenis if (pnp)
1239b95ee612Skettenis printf("%s at %s\n", pba->pba_busname, pnp);
1240b95ee612Skettenis return (UNCONF);
1241b95ee612Skettenis }
1242b95ee612Skettenis
1243b95ee612Skettenis void
elroy_attach(struct device * parent,struct device * self,void * aux)1244b95ee612Skettenis elroy_attach(struct device *parent, struct device *self, void *aux)
1245b95ee612Skettenis {
1246b95ee612Skettenis struct elroy_softc *sc = (struct elroy_softc *)self;
1247b95ee612Skettenis struct confargs *ca = (struct confargs *)aux;
1248b95ee612Skettenis struct pcibus_attach_args pba;
1249b95ee612Skettenis volatile struct elroy_regs *r;
1250b95ee612Skettenis const char *p = NULL, *q;
1251b95ee612Skettenis int i;
1252b95ee612Skettenis
125389a56fa7Skettenis sc->sc_hpa = ca->ca_hpa;
1254b95ee612Skettenis sc->sc_bt = ca->ca_iot;
1255b95ee612Skettenis sc->sc_dmat = ca->ca_dmatag;
1256b95ee612Skettenis if (bus_space_map(sc->sc_bt, ca->ca_hpa, ca->ca_hpasz, 0, &sc->sc_bh)) {
1257b95ee612Skettenis printf(": can't map space\n");
1258b95ee612Skettenis return;
1259b95ee612Skettenis }
1260b95ee612Skettenis
1261c7fb7543Skettenis sc->sc_regs = r = bus_space_vaddr(sc->sc_bt, sc->sc_bh);
1262b95ee612Skettenis elroy_write32(&r->pci_cmdstat, htole32(PCI_COMMAND_IO_ENABLE |
1263b95ee612Skettenis PCI_COMMAND_MEM_ENABLE | PCI_COMMAND_MASTER_ENABLE));
1264b95ee612Skettenis
1265b95ee612Skettenis elroy_write32(&r->control, elroy_read32(&r->control) &
1266b95ee612Skettenis ~htole32(ELROY_CONTROL_RF));
1267b95ee612Skettenis for (i = 5000; i-- &&
1268b95ee612Skettenis elroy_read32(&r->status) & htole32(ELROY_STATUS_RC); DELAY(10));
1269b95ee612Skettenis if (i < 0) {
1270b95ee612Skettenis printf(": reset failed; status %b\n",
1271d5c380ebSmiod htole32(r->status), ELROY_STATUS_BITS);
1272b95ee612Skettenis return;
1273b95ee612Skettenis }
1274b95ee612Skettenis
1275b95ee612Skettenis q = "";
1276b95ee612Skettenis sc->sc_ver = PCI_REVISION(letoh32(elroy_read32(&r->pci_class)));
1277b95ee612Skettenis switch ((ca->ca_type.iodc_model << 4) |
1278b95ee612Skettenis (ca->ca_type.iodc_revision >> 4)) {
1279b95ee612Skettenis case 0x782:
1280b95ee612Skettenis p = "Elroy";
1281b95ee612Skettenis switch (sc->sc_ver) {
1282b95ee612Skettenis default:
1283b95ee612Skettenis q = "+";
1284b95ee612Skettenis case 5: sc->sc_ver = 0x40; break;
1285b95ee612Skettenis case 4: sc->sc_ver = 0x30; break;
1286b95ee612Skettenis case 3: sc->sc_ver = 0x22; break;
1287b95ee612Skettenis case 2: sc->sc_ver = 0x21; break;
1288b95ee612Skettenis case 1: sc->sc_ver = 0x20; break;
1289b95ee612Skettenis case 0: sc->sc_ver = 0x10; break;
1290b95ee612Skettenis }
1291b95ee612Skettenis break;
1292b95ee612Skettenis
1293b95ee612Skettenis case 0x783:
1294b95ee612Skettenis p = "Mercury";
1295b95ee612Skettenis break;
1296b95ee612Skettenis
1297b95ee612Skettenis case 0x784:
1298b95ee612Skettenis p = "Quicksilver";
1299b95ee612Skettenis break;
1300b95ee612Skettenis
1301b95ee612Skettenis default:
1302b95ee612Skettenis p = "Mojo";
1303b95ee612Skettenis break;
1304b95ee612Skettenis }
1305b95ee612Skettenis
1306b95ee612Skettenis printf(": %s TR%d.%d%s", p, sc->sc_ver >> 4, sc->sc_ver & 0xf, q);
1307b95ee612Skettenis apic_attach(sc);
1308b95ee612Skettenis printf("\n");
1309b95ee612Skettenis
1310b95ee612Skettenis elroy_write32(&r->imask, htole32(0xffffffff << 30));
1311b95ee612Skettenis elroy_write32(&r->ibase, htole32(ELROY_BASE_RE));
1312b95ee612Skettenis
1313b95ee612Skettenis /* TODO reserve elroy's pci space ? */
1314b95ee612Skettenis
1315b95ee612Skettenis #if 0
1316b95ee612Skettenis printf("lmm %llx/%llx gmm %llx/%llx wlm %llx/%llx wgm %llx/%llx io %llx/%llx eio %llx/%llx\n",
1317b95ee612Skettenis letoh64(r->lmmio_base), letoh64(r->lmmio_mask),
1318b95ee612Skettenis letoh64(r->gmmio_base), letoh64(r->gmmio_mask),
1319b95ee612Skettenis letoh64(r->wlmmio_base), letoh64(r->wlmmio_mask),
1320b95ee612Skettenis letoh64(r->wgmmio_base), letoh64(r->wgmmio_mask),
1321b95ee612Skettenis letoh64(r->io_base), letoh64(r->io_mask),
1322b95ee612Skettenis letoh64(r->eio_base), letoh64(r->eio_mask));
1323b95ee612Skettenis #endif
1324b95ee612Skettenis
1325b95ee612Skettenis /* XXX evil hack! */
1326b95ee612Skettenis sc->sc_iobase = 0xfee00000;
1327b95ee612Skettenis
1328b95ee612Skettenis sc->sc_iot = elroy_iomemt;
1329b95ee612Skettenis sc->sc_iot.hbt_cookie = sc;
1330b95ee612Skettenis sc->sc_iot.hbt_map = elroy_iomap;
1331b95ee612Skettenis sc->sc_iot.hbt_alloc = elroy_ioalloc;
1332b95ee612Skettenis sc->sc_memt = elroy_iomemt;
1333b95ee612Skettenis sc->sc_memt.hbt_cookie = sc;
1334b95ee612Skettenis sc->sc_memt.hbt_map = elroy_memmap;
1335b95ee612Skettenis sc->sc_memt.hbt_alloc = elroy_memalloc;
1336b95ee612Skettenis sc->sc_pc = elroy_pc;
1337b95ee612Skettenis sc->sc_pc._cookie = sc;
1338b95ee612Skettenis sc->sc_dmatag = elroy_dmat;
1339b95ee612Skettenis sc->sc_dmatag._cookie = sc;
1340b95ee612Skettenis
13415464da24Skettenis bzero(&pba, sizeof(pba));
1342b95ee612Skettenis pba.pba_busname = "pci";
1343b95ee612Skettenis pba.pba_iot = &sc->sc_iot;
1344b95ee612Skettenis pba.pba_memt = &sc->sc_memt;
1345b95ee612Skettenis pba.pba_dmat = &sc->sc_dmatag;
1346b95ee612Skettenis pba.pba_pc = &sc->sc_pc;
1347b95ee612Skettenis pba.pba_domain = pci_ndomains++;
1348b95ee612Skettenis pba.pba_bus = 0; /* (letoh32(elroy_read32(&r->busnum)) & 0xff) >> 4; */
1349b95ee612Skettenis config_found(self, &pba, elroy_print);
1350b95ee612Skettenis }
1351