Sun May 24 15:27:08 2009 UTC ()
Remove a bunch of garbage from previous.


(skrll)
diff -r1.50 -r1.51 src/sys/arch/hp700/hp700/mainbus.c

cvs diff -r1.50 -r1.51 src/sys/arch/hp700/hp700/Attic/mainbus.c (switch to unified diff)

--- src/sys/arch/hp700/hp700/Attic/mainbus.c 2009/05/21 20:59:11 1.50
+++ src/sys/arch/hp700/hp700/Attic/mainbus.c 2009/05/24 15:27:08 1.51
@@ -1,1687 +1,1661 @@ @@ -1,1687 +1,1661 @@
1/* $NetBSD: mainbus.c,v 1.50 2009/05/21 20:59:11 skrll Exp $ */ 1/* $NetBSD: mainbus.c,v 1.51 2009/05/24 15:27:08 skrll Exp $ */
2 2
3/*- 3/*-
4 * Copyright (c) 2001, 2002 The NetBSD Foundation, Inc. 4 * Copyright (c) 2001, 2002 The NetBSD Foundation, Inc.
5 * All rights reserved. 5 * All rights reserved.
6 * 6 *
7 * This code is derived from software contributed to The NetBSD Foundation 7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Matthew Fredette. 8 * by Matthew Fredette.
9 * 9 *
10 * Redistribution and use in source and binary forms, with or without 10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions 11 * modification, are permitted provided that the following conditions
12 * are met: 12 * are met:
13 * 1. Redistributions of source code must retain the above copyright 13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer. 14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright 15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the 16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution. 17 * documentation and/or other materials provided with the distribution.
18 * 18 *
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS 19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS 22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE. 29 * POSSIBILITY OF SUCH DAMAGE.
30 */ 30 */
31 31
32/* $OpenBSD: mainbus.c,v 1.13 2001/09/19 20:50:56 mickey Exp $ */ 32/* $OpenBSD: mainbus.c,v 1.13 2001/09/19 20:50:56 mickey Exp $ */
33 33
34/* 34/*
35 * Copyright (c) 1998-2000 Michael Shalayeff 35 * Copyright (c) 1998-2000 Michael Shalayeff
36 * All rights reserved. 36 * All rights reserved.
37 * 37 *
38 * Redistribution and use in source and binary forms, with or without 38 * Redistribution and use in source and binary forms, with or without
39 * modification, are permitted provided that the following conditions 39 * modification, are permitted provided that the following conditions
40 * are met: 40 * are met:
41 * 1. Redistributions of source code must retain the above copyright 41 * 1. Redistributions of source code must retain the above copyright
42 * notice, this list of conditions and the following disclaimer. 42 * notice, this list of conditions and the following disclaimer.
43 * 2. Redistributions in binary form must reproduce the above copyright 43 * 2. Redistributions in binary form must reproduce the above copyright
44 * notice, this list of conditions and the following disclaimer in the 44 * notice, this list of conditions and the following disclaimer in the
45 * documentation and/or other materials provided with the distribution. 45 * documentation and/or other materials provided with the distribution.
46 * 3. All advertising materials mentioning features or use of this software 46 * 3. All advertising materials mentioning features or use of this software
47 * must display the following acknowledgement: 47 * must display the following acknowledgement:
48 * This product includes software developed by Michael Shalayeff. 48 * This product includes software developed by Michael Shalayeff.
49 * 4. The name of the author may not be used to endorse or promote products 49 * 4. The name of the author may not be used to endorse or promote products
50 * derived from this software without specific prior written permission. 50 * derived from this software without specific prior written permission.
51 * 51 *
52 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 52 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
53 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 53 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
54 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 54 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
55 * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT, 55 * IN NO EVENT SHALL THE AUTHOR OR HIS RELATIVES BE LIABLE FOR ANY DIRECT,
56 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 56 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
57 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 57 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
58 * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 58 * SERVICES; LOSS OF MIND, USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
59 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 59 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
60 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 60 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
61 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 61 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
62 * THE POSSIBILITY OF SUCH DAMAGE. 62 * THE POSSIBILITY OF SUCH DAMAGE.
63 */ 63 */
64 64
65#include <sys/cdefs.h> 65#include <sys/cdefs.h>
66__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.50 2009/05/21 20:59:11 skrll Exp $"); 66__KERNEL_RCSID(0, "$NetBSD: mainbus.c,v 1.51 2009/05/24 15:27:08 skrll Exp $");
67 67
68#include "locators.h" 68#include "locators.h"
69#include "power.h" 69#include "power.h"
70 70
71#include <sys/param.h> 71#include <sys/param.h>
72#include <sys/systm.h> 72#include <sys/systm.h>
73#include <sys/device.h> 73#include <sys/device.h>
74#include <sys/reboot.h> 74#include <sys/reboot.h>
75#include <sys/extent.h> 75#include <sys/extent.h>
76#include <sys/mbuf.h> 76#include <sys/mbuf.h>
77 77
78#include <uvm/uvm_page.h> 78#include <uvm/uvm_page.h>
79#include <uvm/uvm.h> 79#include <uvm/uvm.h>
80 80
81#include <machine/pdc.h> 81#include <machine/pdc.h>
82#include <machine/iomod.h> 82#include <machine/iomod.h>
83#include <machine/autoconf.h> 83#include <machine/autoconf.h>
84 84
85#include <hp700/hp700/machdep.h> 85#include <hp700/hp700/machdep.h>
86#include <hp700/hp700/intr.h> 86#include <hp700/hp700/intr.h>
87#include <hp700/dev/cpudevs.h> 87#include <hp700/dev/cpudevs.h>
88 88
89static struct pdc_hpa pdc_hpa PDC_ALIGNMENT; 89static struct pdc_hpa pdc_hpa PDC_ALIGNMENT;
90 90
91struct mainbus_softc { 91struct mainbus_softc {
92 device_t sc_dv; 92 device_t sc_dv;
93 93
94 hppa_hpa_t sc_hpa; 94 hppa_hpa_t sc_hpa;
95}; 95};
96 96
97int mbmatch(device_t, cfdata_t, void *); 97int mbmatch(device_t, cfdata_t, void *);
98void mbattach(device_t, device_t, void *); 98void mbattach(device_t, device_t, void *);
99 99
100CFATTACH_DECL_NEW(mainbus, sizeof(struct mainbus_softc), 100CFATTACH_DECL_NEW(mainbus, sizeof(struct mainbus_softc),
101 mbmatch, mbattach, NULL, NULL); 101 mbmatch, mbattach, NULL, NULL);
102 102
103extern struct cfdriver mainbus_cd; 103extern struct cfdriver mainbus_cd;
104 104
105static int mb_attached; 105static int mb_attached;
106 106
107/* from machdep.c */ 107/* from machdep.c */
108extern struct extent *hp700_io_extent; 108extern struct extent *hp700_io_extent;
109extern struct extent *dma24_ex; 109extern struct extent *dma24_ex;
110 110
111u_int8_t mbus_r1(void *, bus_space_handle_t, bus_size_t); 111u_int8_t mbus_r1(void *, bus_space_handle_t, bus_size_t);
112u_int16_t mbus_r2(void *, bus_space_handle_t, bus_size_t); 112u_int16_t mbus_r2(void *, bus_space_handle_t, bus_size_t);
113u_int32_t mbus_r4(void *, bus_space_handle_t, bus_size_t); 113u_int32_t mbus_r4(void *, bus_space_handle_t, bus_size_t);
114u_int64_t mbus_r8(void *, bus_space_handle_t, bus_size_t); 114u_int64_t mbus_r8(void *, bus_space_handle_t, bus_size_t);
115void mbus_w1(void *, bus_space_handle_t, bus_size_t, u_int8_t); 115void mbus_w1(void *, bus_space_handle_t, bus_size_t, u_int8_t);
116void mbus_w2(void *, bus_space_handle_t, bus_size_t, u_int16_t); 116void mbus_w2(void *, bus_space_handle_t, bus_size_t, u_int16_t);
117void mbus_w4(void *, bus_space_handle_t, bus_size_t, u_int32_t); 117void mbus_w4(void *, bus_space_handle_t, bus_size_t, u_int32_t);
118void mbus_w8(void *, bus_space_handle_t, bus_size_t, u_int64_t); 118void mbus_w8(void *, bus_space_handle_t, bus_size_t, u_int64_t);
119void mbus_rm_1(void *, bus_space_handle_t, bus_size_t, u_int8_t *, bus_size_t); 119void mbus_rm_1(void *, bus_space_handle_t, bus_size_t, u_int8_t *, bus_size_t);
120void mbus_rm_2(void *, bus_space_handle_t, bus_size_t, u_int16_t *, bus_size_t); 120void mbus_rm_2(void *, bus_space_handle_t, bus_size_t, u_int16_t *, bus_size_t);
121void mbus_rm_4(void *, bus_space_handle_t, bus_size_t, u_int32_t *, bus_size_t); 121void mbus_rm_4(void *, bus_space_handle_t, bus_size_t, u_int32_t *, bus_size_t);
122void mbus_rm_8(void *, bus_space_handle_t, bus_size_t, u_int64_t *, bus_size_t); 122void mbus_rm_8(void *, bus_space_handle_t, bus_size_t, u_int64_t *, bus_size_t);
123void mbus_wm_1(void *, bus_space_handle_t, bus_size_t, const u_int8_t *, bus_size_t); 123void mbus_wm_1(void *, bus_space_handle_t, bus_size_t, const u_int8_t *, bus_size_t);
124void mbus_wm_2(void *, bus_space_handle_t, bus_size_t, const u_int16_t *, bus_size_t); 124void mbus_wm_2(void *, bus_space_handle_t, bus_size_t, const u_int16_t *, bus_size_t);
125void mbus_wm_4(void *, bus_space_handle_t, bus_size_t, const u_int32_t *, bus_size_t); 125void mbus_wm_4(void *, bus_space_handle_t, bus_size_t, const u_int32_t *, bus_size_t);
126void mbus_wm_8(void *, bus_space_handle_t, bus_size_t, const u_int64_t *, bus_size_t); 126void mbus_wm_8(void *, bus_space_handle_t, bus_size_t, const u_int64_t *, bus_size_t);
127void mbus_rr_1(void *, bus_space_handle_t, bus_size_t, u_int8_t *, bus_size_t); 127void mbus_rr_1(void *, bus_space_handle_t, bus_size_t, u_int8_t *, bus_size_t);
128void mbus_rr_2(void *, bus_space_handle_t, bus_size_t, u_int16_t *, bus_size_t); 128void mbus_rr_2(void *, bus_space_handle_t, bus_size_t, u_int16_t *, bus_size_t);
129void mbus_rr_4(void *, bus_space_handle_t, bus_size_t, u_int32_t *, bus_size_t); 129void mbus_rr_4(void *, bus_space_handle_t, bus_size_t, u_int32_t *, bus_size_t);
130void mbus_rr_8(void *, bus_space_handle_t, bus_size_t, u_int64_t *, bus_size_t); 130void mbus_rr_8(void *, bus_space_handle_t, bus_size_t, u_int64_t *, bus_size_t);
131void mbus_wr_1(void *, bus_space_handle_t, bus_size_t, const u_int8_t *, bus_size_t); 131void mbus_wr_1(void *, bus_space_handle_t, bus_size_t, const u_int8_t *, bus_size_t);
132void mbus_wr_2(void *, bus_space_handle_t, bus_size_t, const u_int16_t *, bus_size_t); 132void mbus_wr_2(void *, bus_space_handle_t, bus_size_t, const u_int16_t *, bus_size_t);
133void mbus_wr_4(void *, bus_space_handle_t, bus_size_t, const u_int32_t *, bus_size_t); 133void mbus_wr_4(void *, bus_space_handle_t, bus_size_t, const u_int32_t *, bus_size_t);
134void mbus_wr_8(void *, bus_space_handle_t, bus_size_t, const u_int64_t *, bus_size_t); 134void mbus_wr_8(void *, bus_space_handle_t, bus_size_t, const u_int64_t *, bus_size_t);
135void mbus_sm_1(void *, bus_space_handle_t, bus_size_t, u_int8_t, bus_size_t); 135void mbus_sm_1(void *, bus_space_handle_t, bus_size_t, u_int8_t, bus_size_t);
136void mbus_sm_2(void *, bus_space_handle_t, bus_size_t, u_int16_t, bus_size_t); 136void mbus_sm_2(void *, bus_space_handle_t, bus_size_t, u_int16_t, bus_size_t);
137void mbus_sm_4(void *, bus_space_handle_t, bus_size_t, u_int32_t, bus_size_t); 137void mbus_sm_4(void *, bus_space_handle_t, bus_size_t, u_int32_t, bus_size_t);
138void mbus_sm_8(void *, bus_space_handle_t, bus_size_t, u_int64_t, bus_size_t); 138void mbus_sm_8(void *, bus_space_handle_t, bus_size_t, u_int64_t, bus_size_t);
139void mbus_sr_1(void *, bus_space_handle_t, bus_size_t, u_int8_t, bus_size_t); 139void mbus_sr_1(void *, bus_space_handle_t, bus_size_t, u_int8_t, bus_size_t);
140void mbus_sr_2(void *, bus_space_handle_t, bus_size_t, u_int16_t, bus_size_t); 140void mbus_sr_2(void *, bus_space_handle_t, bus_size_t, u_int16_t, bus_size_t);
141void mbus_sr_4(void *, bus_space_handle_t, bus_size_t, u_int32_t, bus_size_t); 141void mbus_sr_4(void *, bus_space_handle_t, bus_size_t, u_int32_t, bus_size_t);
142void mbus_sr_8(void *, bus_space_handle_t, bus_size_t, u_int64_t, bus_size_t); 142void mbus_sr_8(void *, bus_space_handle_t, bus_size_t, u_int64_t, bus_size_t);
143void mbus_cp_1(void *, bus_space_handle_t, bus_size_t, bus_space_handle_t, bus_size_t, bus_size_t); 143void mbus_cp_1(void *, bus_space_handle_t, bus_size_t, bus_space_handle_t, bus_size_t, bus_size_t);
144void mbus_cp_2(void *, bus_space_handle_t, bus_size_t, bus_space_handle_t, bus_size_t, bus_size_t); 144void mbus_cp_2(void *, bus_space_handle_t, bus_size_t, bus_space_handle_t, bus_size_t, bus_size_t);
145void mbus_cp_4(void *, bus_space_handle_t, bus_size_t, bus_space_handle_t, bus_size_t, bus_size_t); 145void mbus_cp_4(void *, bus_space_handle_t, bus_size_t, bus_space_handle_t, bus_size_t, bus_size_t);
146void mbus_cp_8(void *, bus_space_handle_t, bus_size_t, bus_space_handle_t, bus_size_t, bus_size_t); 146void mbus_cp_8(void *, bus_space_handle_t, bus_size_t, bus_space_handle_t, bus_size_t, bus_size_t);
147 147
148int mbus_add_mapping(bus_addr_t, bus_size_t, int, bus_space_handle_t *); 148int mbus_add_mapping(bus_addr_t, bus_size_t, int, bus_space_handle_t *);
149int mbus_remove_mapping(bus_space_handle_t, bus_size_t, bus_addr_t *); 149int mbus_remove_mapping(bus_space_handle_t, bus_size_t, bus_addr_t *);
150int mbus_map(void *, bus_addr_t, bus_size_t, int, bus_space_handle_t *); 150int mbus_map(void *, bus_addr_t, bus_size_t, int, bus_space_handle_t *);
151void mbus_unmap(void *, bus_space_handle_t, bus_size_t); 151void mbus_unmap(void *, bus_space_handle_t, bus_size_t);
152int mbus_alloc(void *, bus_addr_t, bus_addr_t, bus_size_t, bus_size_t, bus_size_t, int, bus_addr_t *, bus_space_handle_t *); 152int mbus_alloc(void *, bus_addr_t, bus_addr_t, bus_size_t, bus_size_t, bus_size_t, int, bus_addr_t *, bus_space_handle_t *);
153void mbus_free(void *, bus_space_handle_t, bus_size_t); 153void mbus_free(void *, bus_space_handle_t, bus_size_t);
154int mbus_subregion(void *, bus_space_handle_t, bus_size_t, bus_size_t, bus_space_handle_t *); 154int mbus_subregion(void *, bus_space_handle_t, bus_size_t, bus_size_t, bus_space_handle_t *);
155void mbus_barrier(void *, bus_space_handle_t, bus_size_t, bus_size_t, int); 155void mbus_barrier(void *, bus_space_handle_t, bus_size_t, bus_size_t, int);
156void *mbus_vaddr(void *, bus_space_handle_t); 156void *mbus_vaddr(void *, bus_space_handle_t);
157 157
158int mbus_dmamap_create(void *, bus_size_t, int, bus_size_t, bus_size_t, int, bus_dmamap_t *); 158int mbus_dmamap_create(void *, bus_size_t, int, bus_size_t, bus_size_t, int, bus_dmamap_t *);
159void mbus_dmamap_destroy(void *, bus_dmamap_t); 159void mbus_dmamap_destroy(void *, bus_dmamap_t);
160int mbus_dmamap_load(void *, bus_dmamap_t, void *, bus_size_t, struct proc *, int); 160int mbus_dmamap_load(void *, bus_dmamap_t, void *, bus_size_t, struct proc *, int);
161int mbus_dmamap_load_mbuf(void *, bus_dmamap_t, struct mbuf *, int); 161int mbus_dmamap_load_mbuf(void *, bus_dmamap_t, struct mbuf *, int);
162int mbus_dmamap_load_uio(void *, bus_dmamap_t, struct uio *, int); 162int mbus_dmamap_load_uio(void *, bus_dmamap_t, struct uio *, int);
163int mbus_dmamap_load_raw(void *, bus_dmamap_t, bus_dma_segment_t *, int, bus_size_t, int); 163int mbus_dmamap_load_raw(void *, bus_dmamap_t, bus_dma_segment_t *, int, bus_size_t, int);
164void mbus_dmamap_unload(void *, bus_dmamap_t); 164void mbus_dmamap_unload(void *, bus_dmamap_t);
165void mbus_dmamap_sync(void *, bus_dmamap_t, bus_addr_t, bus_size_t, int); 165void mbus_dmamap_sync(void *, bus_dmamap_t, bus_addr_t, bus_size_t, int);
166int mbus_dmamem_alloc(void *, bus_size_t, bus_size_t, bus_size_t, bus_dma_segment_t *, int, int *, int); 166int mbus_dmamem_alloc(void *, bus_size_t, bus_size_t, bus_size_t, bus_dma_segment_t *, int, int *, int);
167void mbus_dmamem_free(void *, bus_dma_segment_t *, int); 167void mbus_dmamem_free(void *, bus_dma_segment_t *, int);
168int mbus_dmamem_map(void *, bus_dma_segment_t *, int, size_t, void **, int); 168int mbus_dmamem_map(void *, bus_dma_segment_t *, int, size_t, void **, int);
169void mbus_dmamem_unmap(void *, void *, size_t); 169void mbus_dmamem_unmap(void *, void *, size_t);
170paddr_t mbus_dmamem_mmap(void *, bus_dma_segment_t *, int, off_t, int, int); 170paddr_t mbus_dmamem_mmap(void *, bus_dma_segment_t *, int, off_t, int, int);
171int _bus_dmamap_load_buffer(bus_dma_tag_t t, bus_dmamap_t map, void *buf, 171int _bus_dmamap_load_buffer(bus_dma_tag_t t, bus_dmamap_t map, void *buf,
172 bus_size_t buflen, struct vmspace *vm, int flags, paddr_t *lastaddrp, 172 bus_size_t buflen, struct vmspace *vm, int flags, paddr_t *lastaddrp,
173 int *segp, int first); 173 int *segp, int first);
174 174
175int 175int
176mbus_add_mapping(bus_addr_t bpa, bus_size_t size, int flags, 176mbus_add_mapping(bus_addr_t bpa, bus_size_t size, int flags,
177 bus_space_handle_t *bshp) 177 bus_space_handle_t *bshp)
178{ 178{
179 u_int frames; 179 u_int frames;
180#ifdef USE_BTLB 180#ifdef USE_BTLB
181 vsize_t btlb_size; 181 vsize_t btlb_size;
182 int error; 182 int error;
183#endif /* USE_BTLB */ 183#endif /* USE_BTLB */
184 184
185 /* 185 /*
186 * We must be called with a page-aligned address in 186 * We must be called with a page-aligned address in
187 * I/O space, and with a multiple of the page size. 187 * I/O space, and with a multiple of the page size.
188 */ 188 */
189 KASSERT((bpa & PGOFSET) == 0); 189 KASSERT((bpa & PGOFSET) == 0);
190 KASSERT(bpa >= HPPA_IOSPACE); 190 KASSERT(bpa >= HPPA_IOSPACE);
191 KASSERT((size & PGOFSET) == 0); 191 KASSERT((size & PGOFSET) == 0);
192 192
193 /* 193 /*
194 * Assume that this will succeed. 194 * Assume that this will succeed.
195 */ 195 */
196 *bshp = bpa; 196 *bshp = bpa;
197 197
198printf("%s: bpa 0x%016llx size 0x%016llx\n", __func__, (unsigned long long)bpa, (unsigned long long)size); 
199 /* 198 /*
200 * Loop while there is space left to map. 199 * Loop while there is space left to map.
201 */ 200 */
202 frames = size >> PGSHIFT; 201 frames = size >> PGSHIFT;
203 while (frames > 0) { 202 while (frames > 0) {
204 203
205 /* 204 /*
206 * If this mapping is more than eight pages long, 205 * If this mapping is more than eight pages long,
207 * try to add a BTLB entry. 206 * try to add a BTLB entry.
208 */ 207 */
209#ifdef USE_BTLB 208#ifdef USE_BTLB
210 if (frames > 8 && 209 if (frames > 8 &&
211 frames >= hppa_btlb_size_min) { 210 frames >= hppa_btlb_size_min) {
212 btlb_size = frames; 211 btlb_size = frames;
213 if (btlb_size > hppa_btlb_size_max) 212 if (btlb_size > hppa_btlb_size_max)
214 btlb_size = hppa_btlb_size_max; 213 btlb_size = hppa_btlb_size_max;
215 btlb_size <<= PGSHIFT; 214 btlb_size <<= PGSHIFT;
216 error = hppa_btlb_insert(pmap_kernel()->pmap_space, 215 error = hppa_btlb_insert(pmap_kernel()->pmap_space,
217 bpa, bpa, &btlb_size, 216 bpa, bpa, &btlb_size,
218 pmap_kernel()->pmap_pid | 217 pmap_kernel()->pmap_pid |
219 pmap_prot(pmap_kernel(), VM_PROT_READ | VM_PROT_WRITE)); 218 pmap_prot(pmap_kernel(), VM_PROT_READ | VM_PROT_WRITE));
220 if (error == 0) { 219 if (error == 0) {
221 bpa += btlb_size; 220 bpa += btlb_size;
222 frames -= (btlb_size >> PGSHIFT); 221 frames -= (btlb_size >> PGSHIFT);
223 continue; 222 continue;
224 } 223 }
225 else if (error != ENOMEM) 224 else if (error != ENOMEM)
226 return error; 225 return error;
227 } 226 }
228#endif /* USE_BTLB */ 227#endif /* USE_BTLB */
229 228
230 /* 229 /*
231 * Enter another single-page mapping. 230 * Enter another single-page mapping.
232 */ 231 */
233 pmap_kenter_pa(bpa, bpa, VM_PROT_READ | VM_PROT_WRITE | PMAP_NC); 232 pmap_kenter_pa(bpa, bpa, VM_PROT_READ | VM_PROT_WRITE);
234 bpa += PAGE_SIZE; 233 bpa += PAGE_SIZE;
235 frames--; 234 frames--;
236 } 235 }
237 236
238 /* Success. */ 237 /* Success. */
239 return 0; 238 return 0;
240} 239}
241 240
242/* 241/*
243 * This removes a mapping added by mbus_add_mapping. 242 * This removes a mapping added by mbus_add_mapping.
244 */ 243 */
245int 244int
246mbus_remove_mapping(bus_space_handle_t bsh, bus_size_t size, bus_addr_t *bpap) 245mbus_remove_mapping(bus_space_handle_t bsh, bus_size_t size, bus_addr_t *bpap)
247{ 246{
248 bus_addr_t bpa; 247 bus_addr_t bpa;
249 u_int frames; 248 u_int frames;
250#ifdef USE_BTLB 249#ifdef USE_BTLB
251 vsize_t btlb_size; 250 vsize_t btlb_size;
252 int error; 251 int error;
253#endif /* USE_BTLB */ 252#endif /* USE_BTLB */
254 253
255 /* 254 /*
256 * We must be called with a page-aligned address in 255 * We must be called with a page-aligned address in
257 * I/O space, and with a multiple of the page size. 256 * I/O space, and with a multiple of the page size.
258 */ 257 */
259 bpa = *bpap = bsh; 258 bpa = *bpap = bsh;
260 KASSERT((bpa & PGOFSET) == 0); 259 KASSERT((bpa & PGOFSET) == 0);
261 KASSERT(bpa >= HPPA_IOSPACE); 260 KASSERT(bpa >= HPPA_IOSPACE);
262 KASSERT((size & PGOFSET) == 0); 261 KASSERT((size & PGOFSET) == 0);
263 262
264 /* 263 /*
265 * Loop while there is space left to unmap. 264 * Loop while there is space left to unmap.
266 */ 265 */
267 frames = size >> PGSHIFT; 266 frames = size >> PGSHIFT;
268 while (frames > 0) { 267 while (frames > 0) {
269 268
270 /* 269 /*
271 * If this mapping is more than eight pages long, 270 * If this mapping is more than eight pages long,
272 * try to remove a BTLB entry. 271 * try to remove a BTLB entry.
273 */ 272 */
274#ifdef USE_BTLB 273#ifdef USE_BTLB
275 if (frames > 8 && 274 if (frames > 8 &&
276 frames >= hppa_btlb_size_min) { 275 frames >= hppa_btlb_size_min) {
277 btlb_size = frames; 276 btlb_size = frames;
278 if (btlb_size > hppa_btlb_size_max) 277 if (btlb_size > hppa_btlb_size_max)
279 btlb_size = hppa_btlb_size_max; 278 btlb_size = hppa_btlb_size_max;
280 btlb_size <<= PGSHIFT; 279 btlb_size <<= PGSHIFT;
281 error = hppa_btlb_purge(pmap_kernel()->pmap_space, 280 error = hppa_btlb_purge(pmap_kernel()->pmap_space,
282 bpa, &btlb_size); 281 bpa, &btlb_size);
283 if (error == 0) { 282 if (error == 0) {
284 bpa += btlb_size; 283 bpa += btlb_size;
285 frames -= (btlb_size >> PGSHIFT); 284 frames -= (btlb_size >> PGSHIFT);
286 continue; 285 continue;
287 } 286 }
288 else if (error != ENOENT) 287 else if (error != ENOENT)
289 return error; 288 return error;
290 } 289 }
291#endif /* USE_BTLB */ 290#endif /* USE_BTLB */
292 291
293 /* 292 /*
294 * Remove another single-page mapping. 293 * Remove another single-page mapping.
295 */ 294 */
296 pmap_kremove(bpa, PAGE_SIZE); 295 pmap_kremove(bpa, PAGE_SIZE);
297 bpa += PAGE_SIZE; 296 bpa += PAGE_SIZE;
298 frames--; 297 frames--;
299 } 298 }
300 299
301 /* Success. */ 300 /* Success. */
302 return 0; 301 return 0;
303} 302}
304 303
305int 304int
306mbus_map(void *v, bus_addr_t bpa, bus_size_t size, int flags, 305mbus_map(void *v, bus_addr_t bpa, bus_size_t size, int flags,
307 bus_space_handle_t *bshp) 306 bus_space_handle_t *bshp)
308{ 307{
309 int error; 308 int error;
310 bus_size_t offset; 309 bus_size_t offset;
311 310
312 /* 311 /*
313 * We must only be called with addresses in I/O space. 312 * We must only be called with addresses in I/O space.
314 */ 313 */
315 KASSERT(bpa >= HPPA_IOSPACE); 314 KASSERT(bpa >= HPPA_IOSPACE);
316 315
317 /* 316 /*
318 * Page-align the I/O address and size. 317 * Page-align the I/O address and size.
319 */ 318 */
320 offset = (bpa & PGOFSET); 319 offset = (bpa & PGOFSET);
321 bpa -= offset; 320 bpa -= offset;
322 size += offset; 321 size += offset;
323 size = round_page(size); 322 size = round_page(size);
324 323
325 /* 324 /*
326 * Allocate the region of I/O space. 325 * Allocate the region of I/O space.
327 */ 326 */
328 error = extent_alloc_region(hp700_io_extent, bpa, size, EX_NOWAIT); 327 error = extent_alloc_region(hp700_io_extent, bpa, size, EX_NOWAIT);
329 if (error) 328 if (error)
330 return (error); 329 return (error);
331 330
332 /* 331 /*
333 * Map the region of I/O space. 332 * Map the region of I/O space.
334 */ 333 */
335 error = mbus_add_mapping(bpa, size, flags, bshp); 334 error = mbus_add_mapping(bpa, size, flags, bshp);
336 *bshp |= offset; 335 *bshp |= offset;
337 if (error) { 336 if (error) {
338 if (extent_free(hp700_io_extent, bpa, size, EX_NOWAIT)) { 337 if (extent_free(hp700_io_extent, bpa, size, EX_NOWAIT)) {
339 printf ("bus_space_map: pa 0x%lx, size 0x%lx\n", 338 printf ("bus_space_map: pa 0x%lx, size 0x%lx\n",
340 bpa, size); 339 bpa, size);
341 printf ("bus_space_map: can't free region\n"); 340 printf ("bus_space_map: can't free region\n");
342 } 341 }
343 } 342 }
344 343
345 return error; 344 return error;
346} 345}
347 346
348void 347void
349mbus_unmap(void *v, bus_space_handle_t bsh, bus_size_t size) 348mbus_unmap(void *v, bus_space_handle_t bsh, bus_size_t size)
350{ 349{
351 bus_size_t offset; 350 bus_size_t offset;
352 bus_addr_t bpa; 351 bus_addr_t bpa;
353 int error; 352 int error;
354 353
355 /* 354 /*
356 * Page-align the bus_space handle and size. 355 * Page-align the bus_space handle and size.
357 */ 356 */
358 offset = bsh & PGOFSET; 357 offset = bsh & PGOFSET;
359 bsh -= offset; 358 bsh -= offset;
360 size += offset; 359 size += offset;
361 size = round_page(size); 360 size = round_page(size);
362 361
363 /* 362 /*
364 * Unmap the region of I/O space. 363 * Unmap the region of I/O space.
365 */ 364 */
366 error = mbus_remove_mapping(bsh, size, &bpa); 365 error = mbus_remove_mapping(bsh, size, &bpa);
367 if (error) 366 if (error)
368 panic("mbus_unmap: can't unmap region (%d)", error); 367 panic("mbus_unmap: can't unmap region (%d)", error);
369 368
370 /* 369 /*
371 * Free the region of I/O space. 370 * Free the region of I/O space.
372 */ 371 */
373 error = extent_free(hp700_io_extent, bpa, size, EX_NOWAIT); 372 error = extent_free(hp700_io_extent, bpa, size, EX_NOWAIT);
374 if (error) { 373 if (error) {
375 printf("bus_space_unmap: ps 0x%lx, size 0x%lx\n", 374 printf("bus_space_unmap: ps 0x%lx, size 0x%lx\n",
376 bpa, size); 375 bpa, size);
377 panic("bus_space_unmap: can't free region (%d)", error); 376 panic("bus_space_unmap: can't free region (%d)", error);
378 } 377 }
379} 378}
380 379
381int 380int
382mbus_alloc(void *v, bus_addr_t rstart, bus_addr_t rend, bus_size_t size, 381mbus_alloc(void *v, bus_addr_t rstart, bus_addr_t rend, bus_size_t size,
383 bus_size_t align, bus_size_t boundary, int flags, bus_addr_t *addrp, 382 bus_size_t align, bus_size_t boundary, int flags, bus_addr_t *addrp,
384 bus_space_handle_t *bshp) 383 bus_space_handle_t *bshp)
385{ 384{
386 bus_addr_t bpa; 385 bus_addr_t bpa;
387 int error; 386 int error;
388 387
389 if (rstart < hp700_io_extent->ex_start || 388 if (rstart < hp700_io_extent->ex_start ||
390 rend > hp700_io_extent->ex_end) 389 rend > hp700_io_extent->ex_end)
391 panic("bus_space_alloc: bad region start/end"); 390 panic("bus_space_alloc: bad region start/end");
392 391
393 /* 392 /*
394 * Force the allocated region to be page-aligned. 393 * Force the allocated region to be page-aligned.
395 */ 394 */
396 if (align < PAGE_SIZE) 395 if (align < PAGE_SIZE)
397 align = PAGE_SIZE; 396 align = PAGE_SIZE;
398 size = round_page(size); 397 size = round_page(size);
399 398
400 /* 399 /*
401 * Allocate the region of I/O space. 400 * Allocate the region of I/O space.
402 */ 401 */
403 error = extent_alloc_subregion1(hp700_io_extent, rstart, rend, size, 402 error = extent_alloc_subregion1(hp700_io_extent, rstart, rend, size,
404 align, 0, boundary, EX_NOWAIT, &bpa); 403 align, 0, boundary, EX_NOWAIT, &bpa);
405 if (error) 404 if (error)
406 return (error); 405 return (error);
407 406
408 /* 407 /*
409 * Map the region of I/O space. 408 * Map the region of I/O space.
410 */ 409 */
411 error = mbus_add_mapping(bpa, size, flags, bshp); 410 error = mbus_add_mapping(bpa, size, flags, bshp);
412 if (error) { 411 if (error) {
413 if (extent_free(hp700_io_extent, bpa, size, EX_NOWAIT)) { 412 if (extent_free(hp700_io_extent, bpa, size, EX_NOWAIT)) {
414 printf("bus_space_alloc: pa 0x%lx, size 0x%lx\n", 413 printf("bus_space_alloc: pa 0x%lx, size 0x%lx\n",
415 bpa, size); 414 bpa, size);
416 printf("bus_space_alloc: can't free region\n"); 415 printf("bus_space_alloc: can't free region\n");
417 } 416 }
418 } 417 }
419 418
420 *addrp = bpa; 419 *addrp = bpa;
421 420
422 return error; 421 return error;
423} 422}
424 423
425void 424void
426mbus_free(void *v, bus_space_handle_t h, bus_size_t size) 425mbus_free(void *v, bus_space_handle_t h, bus_size_t size)
427{ 426{
428 /* bus_space_unmap() does all that we need to do. */ 427 /* bus_space_unmap() does all that we need to do. */
429 mbus_unmap(v, h, size); 428 mbus_unmap(v, h, size);
430} 429}
431 430
432int 431int
433mbus_subregion(void *v, bus_space_handle_t bsh, bus_size_t offset, 432mbus_subregion(void *v, bus_space_handle_t bsh, bus_size_t offset,
434 bus_size_t size, bus_space_handle_t *nbshp) 433 bus_size_t size, bus_space_handle_t *nbshp)
435{ 434{
436 *nbshp = bsh + offset; 435 *nbshp = bsh + offset;
437 return(0); 436 return(0);
438} 437}
439 438
440void 439void
441mbus_barrier(void *v, bus_space_handle_t h, bus_size_t o, bus_size_t l, int op) 440mbus_barrier(void *v, bus_space_handle_t h, bus_size_t o, bus_size_t l, int op)
442{ 441{
443 sync_caches(); 442 sync_caches();
444} 443}
445 444
446void* 445void*
447mbus_vaddr(void *v, bus_space_handle_t h) 446mbus_vaddr(void *v, bus_space_handle_t h)
448{ 447{
449 /* 448 /*
450 * We must only be called with addresses in I/O space. 449 * We must only be called with addresses in I/O space.
451 */ 450 */
452 KASSERT(h >= HPPA_IOSPACE); 451 KASSERT(h >= HPPA_IOSPACE);
453 return (void*)h; 452 return (void*)h;
454} 453}
455 454
456u_int8_t 455u_int8_t
457mbus_r1(void *v, bus_space_handle_t h, bus_size_t o) 456mbus_r1(void *v, bus_space_handle_t h, bus_size_t o)
458{ 457{
459 return *((volatile u_int8_t *)(h + o)); 458 return *((volatile u_int8_t *)(h + o));
460} 459}
461 460
462u_int16_t 461u_int16_t
463mbus_r2(void *v, bus_space_handle_t h, bus_size_t o) 462mbus_r2(void *v, bus_space_handle_t h, bus_size_t o)
464{ 463{
465 return *((volatile u_int16_t *)(h + o)); 464 return *((volatile u_int16_t *)(h + o));
466} 465}
467 466
468u_int32_t 467u_int32_t
469mbus_r4(void *v, bus_space_handle_t h, bus_size_t o) 468mbus_r4(void *v, bus_space_handle_t h, bus_size_t o)
470{ 469{
471 return *((volatile u_int32_t *)(h + o)); 470 return *((volatile u_int32_t *)(h + o));
472} 471}
473 472
474u_int64_t 473u_int64_t
475mbus_r8(void *v, bus_space_handle_t h, bus_size_t o) 474mbus_r8(void *v, bus_space_handle_t h, bus_size_t o)
476{ 475{
477 return *((volatile u_int64_t *)(h + o)); 476 return *((volatile u_int64_t *)(h + o));
478} 477}
479 478
480void 479void
481mbus_w1(void *v, bus_space_handle_t h, bus_size_t o, u_int8_t vv) 480mbus_w1(void *v, bus_space_handle_t h, bus_size_t o, u_int8_t vv)
482{ 481{
483 *((volatile u_int8_t *)(h + o)) = vv; 482 *((volatile u_int8_t *)(h + o)) = vv;
484} 483}
485 484
486void 485void
487mbus_w2(void *v, bus_space_handle_t h, bus_size_t o, u_int16_t vv) 486mbus_w2(void *v, bus_space_handle_t h, bus_size_t o, u_int16_t vv)
488{ 487{
489 *((volatile u_int16_t *)(h + o)) = vv; 488 *((volatile u_int16_t *)(h + o)) = vv;
490} 489}
491 490
492void 491void
493mbus_w4(void *v, bus_space_handle_t h, bus_size_t o, u_int32_t vv) 492mbus_w4(void *v, bus_space_handle_t h, bus_size_t o, u_int32_t vv)
494{ 493{
495 *((volatile u_int32_t *)(h + o)) = vv; 494 *((volatile u_int32_t *)(h + o)) = vv;
496} 495}
497 496
498void 497void
499mbus_w8(void *v, bus_space_handle_t h, bus_size_t o, u_int64_t vv) 498mbus_w8(void *v, bus_space_handle_t h, bus_size_t o, u_int64_t vv)
500{ 499{
501 *((volatile u_int64_t *)(h + o)) = vv; 500 *((volatile u_int64_t *)(h + o)) = vv;
502} 501}
503 502
504 503
505void 504void
506mbus_rm_1(void *v, bus_space_handle_t h, bus_size_t o, u_int8_t *a, bus_size_t c) 505mbus_rm_1(void *v, bus_space_handle_t h, bus_size_t o, u_int8_t *a, bus_size_t c)
507{ 506{
508 h += o; 507 h += o;
509 while (c--) 508 while (c--)
510 *(a++) = *(volatile u_int8_t *)h; 509 *(a++) = *(volatile u_int8_t *)h;
511} 510}
512 511
513void 512void
514mbus_rm_2(void *v, bus_space_handle_t h, bus_size_t o, u_int16_t *a, bus_size_t c) 513mbus_rm_2(void *v, bus_space_handle_t h, bus_size_t o, u_int16_t *a, bus_size_t c)
515{ 514{
516 h += o; 515 h += o;
517 while (c--) 516 while (c--)
518 *(a++) = *(volatile u_int16_t *)h; 517 *(a++) = *(volatile u_int16_t *)h;
519} 518}
520 519
521void 520void
522mbus_rm_4(void *v, bus_space_handle_t h, bus_size_t o, u_int32_t *a, bus_size_t c) 521mbus_rm_4(void *v, bus_space_handle_t h, bus_size_t o, u_int32_t *a, bus_size_t c)
523{ 522{
524 h += o; 523 h += o;
525 while (c--) 524 while (c--)
526 *(a++) = *(volatile u_int32_t *)h; 525 *(a++) = *(volatile u_int32_t *)h;
527} 526}
528 527
529void 528void
530mbus_rm_8(void *v, bus_space_handle_t h, bus_size_t o, u_int64_t *a, bus_size_t c) 529mbus_rm_8(void *v, bus_space_handle_t h, bus_size_t o, u_int64_t *a, bus_size_t c)
531{ 530{
532 h += o; 531 h += o;
533 while (c--) 532 while (c--)
534 *(a++) = *(volatile u_int64_t *)h; 533 *(a++) = *(volatile u_int64_t *)h;
535} 534}
536 535
537void 536void
538mbus_wm_1(void *v, bus_space_handle_t h, bus_size_t o, const u_int8_t *a, bus_size_t c) 537mbus_wm_1(void *v, bus_space_handle_t h, bus_size_t o, const u_int8_t *a, bus_size_t c)
539{ 538{
540 h += o; 539 h += o;
541 while (c--) 540 while (c--)
542 *(volatile u_int8_t *)h = *(a++); 541 *(volatile u_int8_t *)h = *(a++);
543} 542}
544 543
545void 544void
546mbus_wm_2(void *v, bus_space_handle_t h, bus_size_t o, const u_int16_t *a, bus_size_t c) 545mbus_wm_2(void *v, bus_space_handle_t h, bus_size_t o, const u_int16_t *a, bus_size_t c)
547{ 546{
548 h += o; 547 h += o;
549 while (c--) 548 while (c--)
550 *(volatile u_int16_t *)h = *(a++); 549 *(volatile u_int16_t *)h = *(a++);
551} 550}
552 551
553void 552void
554mbus_wm_4(void *v, bus_space_handle_t h, bus_size_t o, const u_int32_t *a, bus_size_t c) 553mbus_wm_4(void *v, bus_space_handle_t h, bus_size_t o, const u_int32_t *a, bus_size_t c)
555{ 554{
556 h += o; 555 h += o;
557 while (c--) 556 while (c--)
558 *(volatile u_int32_t *)h = *(a++); 557 *(volatile u_int32_t *)h = *(a++);
559} 558}
560 559
561void 560void
562mbus_wm_8(void *v, bus_space_handle_t h, bus_size_t o, const u_int64_t *a, bus_size_t c) 561mbus_wm_8(void *v, bus_space_handle_t h, bus_size_t o, const u_int64_t *a, bus_size_t c)
563{ 562{
564 h += o; 563 h += o;
565 while (c--) 564 while (c--)
566 *(volatile u_int64_t *)h = *(a++); 565 *(volatile u_int64_t *)h = *(a++);
567} 566}
568 567
569void 568void
570mbus_sm_1(void *v, bus_space_handle_t h, bus_size_t o, u_int8_t vv, bus_size_t c) 569mbus_sm_1(void *v, bus_space_handle_t h, bus_size_t o, u_int8_t vv, bus_size_t c)
571{ 570{
572 h += o; 571 h += o;
573 while (c--) 572 while (c--)
574 *(volatile u_int8_t *)h = vv; 573 *(volatile u_int8_t *)h = vv;
575} 574}
576 575
577void 576void
578mbus_sm_2(void *v, bus_space_handle_t h, bus_size_t o, u_int16_t vv, bus_size_t c) 577mbus_sm_2(void *v, bus_space_handle_t h, bus_size_t o, u_int16_t vv, bus_size_t c)
579{ 578{
580 h += o; 579 h += o;
581 while (c--) 580 while (c--)
582 *(volatile u_int16_t *)h = vv; 581 *(volatile u_int16_t *)h = vv;
583} 582}
584 583
585void 584void
586mbus_sm_4(void *v, bus_space_handle_t h, bus_size_t o, u_int32_t vv, bus_size_t c) 585mbus_sm_4(void *v, bus_space_handle_t h, bus_size_t o, u_int32_t vv, bus_size_t c)
587{ 586{
588 h += o; 587 h += o;
589 while (c--) 588 while (c--)
590 *(volatile u_int32_t *)h = vv; 589 *(volatile u_int32_t *)h = vv;
591} 590}
592 591
593void 592void
594mbus_sm_8(void *v, bus_space_handle_t h, bus_size_t o, u_int64_t vv, bus_size_t c) 593mbus_sm_8(void *v, bus_space_handle_t h, bus_size_t o, u_int64_t vv, bus_size_t c)
595{ 594{
596 h += o; 595 h += o;
597 while (c--) 596 while (c--)
598 *(volatile u_int64_t *)h = vv; 597 *(volatile u_int64_t *)h = vv;
599} 598}
600 599
601void mbus_rrm_2(void *v, bus_space_handle_t h, bus_size_t o, u_int16_t*a, bus_size_t c); 600void mbus_rrm_2(void *v, bus_space_handle_t h, bus_size_t o, u_int16_t*a, bus_size_t c);
602void mbus_rrm_4(void *v, bus_space_handle_t h, bus_size_t o, u_int32_t*a, bus_size_t c); 601void mbus_rrm_4(void *v, bus_space_handle_t h, bus_size_t o, u_int32_t*a, bus_size_t c);
603void mbus_rrm_8(void *v, bus_space_handle_t h, bus_size_t o, u_int64_t*a, bus_size_t c); 602void mbus_rrm_8(void *v, bus_space_handle_t h, bus_size_t o, u_int64_t*a, bus_size_t c);
604 603
605void mbus_wrm_2(void *v, bus_space_handle_t h, bus_size_t o, const u_int16_t *a, bus_size_t c); 604void mbus_wrm_2(void *v, bus_space_handle_t h, bus_size_t o, const u_int16_t *a, bus_size_t c);
606void mbus_wrm_4(void *v, bus_space_handle_t h, bus_size_t o, const u_int32_t *a, bus_size_t c); 605void mbus_wrm_4(void *v, bus_space_handle_t h, bus_size_t o, const u_int32_t *a, bus_size_t c);
607void mbus_wrm_8(void *v, bus_space_handle_t h, bus_size_t o, const u_int64_t *a, bus_size_t c); 606void mbus_wrm_8(void *v, bus_space_handle_t h, bus_size_t o, const u_int64_t *a, bus_size_t c);
608 607
609void 608void
610mbus_rr_1(void *v, bus_space_handle_t h, bus_size_t o, u_int8_t *a, bus_size_t c) 609mbus_rr_1(void *v, bus_space_handle_t h, bus_size_t o, u_int8_t *a, bus_size_t c)
611{ 610{
612 volatile u_int8_t *p; 611 volatile u_int8_t *p;
613 612
614 h += o; 613 h += o;
615 p = (void *)h; 614 p = (void *)h;
616 while (c--) 615 while (c--)
617 *a++ = *p++; 616 *a++ = *p++;
618} 617}
619 618
620void 619void
621mbus_rr_2(void *v, bus_space_handle_t h, bus_size_t o, u_int16_t *a, bus_size_t c) 620mbus_rr_2(void *v, bus_space_handle_t h, bus_size_t o, u_int16_t *a, bus_size_t c)
622{ 621{
623 volatile u_int16_t *p; 622 volatile u_int16_t *p;
624 623
625 h += o; 624 h += o;
626 p = (void *)h; 625 p = (void *)h;
627 while (c--) 626 while (c--)
628 *a++ = *p++; 627 *a++ = *p++;
629} 628}
630 629
631void 630void
632mbus_rr_4(void *v, bus_space_handle_t h, bus_size_t o, u_int32_t *a, bus_size_t c) 631mbus_rr_4(void *v, bus_space_handle_t h, bus_size_t o, u_int32_t *a, bus_size_t c)
633{ 632{
634 volatile u_int32_t *p; 633 volatile u_int32_t *p;
635 634
636 h += o; 635 h += o;
637 p = (void *)h; 636 p = (void *)h;
638 while (c--) 637 while (c--)
639 *a++ = *p++; 638 *a++ = *p++;
640} 639}
641 640
642void 641void
643mbus_rr_8(void *v, bus_space_handle_t h, bus_size_t o, u_int64_t *a, bus_size_t c) 642mbus_rr_8(void *v, bus_space_handle_t h, bus_size_t o, u_int64_t *a, bus_size_t c)
644{ 643{
645 volatile u_int64_t *p; 644 volatile u_int64_t *p;
646 645
647 h += o; 646 h += o;
648 p = (void *)h; 647 p = (void *)h;
649 while (c--) 648 while (c--)
650 *a++ = *p++; 649 *a++ = *p++;
651} 650}
652 651
653void 652void
654mbus_wr_1(void *v, bus_space_handle_t h, bus_size_t o, const u_int8_t *a, bus_size_t c) 653mbus_wr_1(void *v, bus_space_handle_t h, bus_size_t o, const u_int8_t *a, bus_size_t c)
655{ 654{
656 volatile u_int8_t *p; 655 volatile u_int8_t *p;
657 656
658 h += o; 657 h += o;
659 p = (void *)h; 658 p = (void *)h;
660 while (c--) 659 while (c--)
661 *p++ = *a++; 660 *p++ = *a++;
662} 661}
663 662
664void 663void
665mbus_wr_2(void *v, bus_space_handle_t h, bus_size_t o, const u_int16_t *a, bus_size_t c) 664mbus_wr_2(void *v, bus_space_handle_t h, bus_size_t o, const u_int16_t *a, bus_size_t c)
666{ 665{
667 volatile u_int16_t *p; 666 volatile u_int16_t *p;
668 667
669 h += o; 668 h += o;
670 p = (void *)h; 669 p = (void *)h;
671 while (c--) 670 while (c--)
672 *p++ = *a++; 671 *p++ = *a++;
673} 672}
674 673
675void 674void
676mbus_wr_4(void *v, bus_space_handle_t h, bus_size_t o, const u_int32_t *a, bus_size_t c) 675mbus_wr_4(void *v, bus_space_handle_t h, bus_size_t o, const u_int32_t *a, bus_size_t c)
677{ 676{
678 volatile u_int32_t *p; 677 volatile u_int32_t *p;
679 678
680 h += o; 679 h += o;
681 p = (void *)h; 680 p = (void *)h;
682 while (c--) 681 while (c--)
683 *p++ = *a++; 682 *p++ = *a++;
684} 683}
685 684
686void 685void
687mbus_wr_8(void *v, bus_space_handle_t h, bus_size_t o, const u_int64_t *a, bus_size_t c) 686mbus_wr_8(void *v, bus_space_handle_t h, bus_size_t o, const u_int64_t *a, bus_size_t c)
688{ 687{
689 volatile u_int64_t *p; 688 volatile u_int64_t *p;
690 689
691 h += o; 690 h += o;
692 p = (void *)h; 691 p = (void *)h;
693 while (c--) 692 while (c--)
694 *p++ = *a++; 693 *p++ = *a++;
695} 694}
696 695
697void mbus_rrr_2(void *, bus_space_handle_t, bus_size_t, u_int16_t *, bus_size_t); 696void mbus_rrr_2(void *, bus_space_handle_t, bus_size_t, u_int16_t *, bus_size_t);
698void mbus_rrr_4(void *, bus_space_handle_t, bus_size_t, u_int32_t *, bus_size_t); 697void mbus_rrr_4(void *, bus_space_handle_t, bus_size_t, u_int32_t *, bus_size_t);
699void mbus_rrr_8(void *, bus_space_handle_t, bus_size_t, u_int64_t *, bus_size_t); 698void mbus_rrr_8(void *, bus_space_handle_t, bus_size_t, u_int64_t *, bus_size_t);
700 699
701void mbus_wrr_2(void *, bus_space_handle_t, bus_size_t, const u_int16_t *, bus_size_t); 700void mbus_wrr_2(void *, bus_space_handle_t, bus_size_t, const u_int16_t *, bus_size_t);
702void mbus_wrr_4(void *, bus_space_handle_t, bus_size_t, const u_int32_t *, bus_size_t); 701void mbus_wrr_4(void *, bus_space_handle_t, bus_size_t, const u_int32_t *, bus_size_t);
703void mbus_wrr_8(void *, bus_space_handle_t, bus_size_t, const u_int64_t *, bus_size_t); 702void mbus_wrr_8(void *, bus_space_handle_t, bus_size_t, const u_int64_t *, bus_size_t);
704 703
705void 704void
706mbus_sr_1(void *v, bus_space_handle_t h, bus_size_t o, u_int8_t vv, bus_size_t c) 705mbus_sr_1(void *v, bus_space_handle_t h, bus_size_t o, u_int8_t vv, bus_size_t c)
707{ 706{
708 volatile u_int8_t *p; 707 volatile u_int8_t *p;
709 708
710 h += o; 709 h += o;
711 p = (void *)h; 710 p = (void *)h;
712 while (c--) 711 while (c--)
713 *p++ = vv; 712 *p++ = vv;
714} 713}
715 714
716void 715void
717mbus_sr_2(void *v, bus_space_handle_t h, bus_size_t o, u_int16_t vv, bus_size_t c) 716mbus_sr_2(void *v, bus_space_handle_t h, bus_size_t o, u_int16_t vv, bus_size_t c)
718{ 717{
719 volatile u_int16_t *p; 718 volatile u_int16_t *p;
720 719
721 h += o; 720 h += o;
722 p = (void *)h; 721 p = (void *)h;
723 while (c--) 722 while (c--)
724 *p++ = vv; 723 *p++ = vv;
725} 724}
726 725
727void 726void
728mbus_sr_4(void *v, bus_space_handle_t h, bus_size_t o, u_int32_t vv, bus_size_t c) 727mbus_sr_4(void *v, bus_space_handle_t h, bus_size_t o, u_int32_t vv, bus_size_t c)
729{ 728{
730 volatile u_int32_t *p; 729 volatile u_int32_t *p;
731 730
732 h += o; 731 h += o;
733 p = (void *)h; 732 p = (void *)h;
734 while (c--) 733 while (c--)
735 *p++ = vv; 734 *p++ = vv;
736} 735}
737 736
738void 737void
739mbus_sr_8(void *v, bus_space_handle_t h, bus_size_t o, u_int64_t vv, bus_size_t c) 738mbus_sr_8(void *v, bus_space_handle_t h, bus_size_t o, u_int64_t vv, bus_size_t c)
740{ 739{
741 volatile u_int64_t *p; 740 volatile u_int64_t *p;
742 741
743 h += o; 742 h += o;
744 p = (void *)h; 743 p = (void *)h;
745 while (c--) 744 while (c--)
746 *p++ = vv; 745 *p++ = vv;
747} 746}
748 747
749void 748void
750mbus_cp_1(void *v, bus_space_handle_t h1, bus_size_t o1, 749mbus_cp_1(void *v, bus_space_handle_t h1, bus_size_t o1,
751 bus_space_handle_t h2, bus_size_t o2, bus_size_t c) 750 bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
752{ 751{
753 volatile u_int8_t *p1, *p2; 752 volatile u_int8_t *p1, *p2;
754 753
755 h1 += o1; 754 h1 += o1;
756 h2 += o2; 755 h2 += o2;
757 p1 = (void *)h1; 756 p1 = (void *)h1;
758 p2 = (void *)h2; 757 p2 = (void *)h2;
759 while (c--) 758 while (c--)
760 *p1++ = *p2++; 759 *p1++ = *p2++;
761} 760}
762 761
763void 762void
764mbus_cp_2(void *v, bus_space_handle_t h1, bus_size_t o1, 763mbus_cp_2(void *v, bus_space_handle_t h1, bus_size_t o1,
765 bus_space_handle_t h2, bus_size_t o2, bus_size_t c) 764 bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
766{ 765{
767 volatile u_int16_t *p1, *p2; 766 volatile u_int16_t *p1, *p2;
768 767
769 h1 += o1; 768 h1 += o1;
770 h2 += o2; 769 h2 += o2;
771 p1 = (void *)h1; 770 p1 = (void *)h1;
772 p2 = (void *)h2; 771 p2 = (void *)h2;
773 while (c--) 772 while (c--)
774 *p1++ = *p2++; 773 *p1++ = *p2++;
775} 774}
776 775
777void 776void
778mbus_cp_4(void *v, bus_space_handle_t h1, bus_size_t o1, 777mbus_cp_4(void *v, bus_space_handle_t h1, bus_size_t o1,
779 bus_space_handle_t h2, bus_size_t o2, bus_size_t c) 778 bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
780{ 779{
781 volatile u_int32_t *p1, *p2; 780 volatile u_int32_t *p1, *p2;
782 781
783 h1 += o1; 782 h1 += o1;
784 h2 += o2; 783 h2 += o2;
785 p1 = (void *)h1; 784 p1 = (void *)h1;
786 p2 = (void *)h2; 785 p2 = (void *)h2;
787 while (c--) 786 while (c--)
788 *p1++ = *p2++; 787 *p1++ = *p2++;
789} 788}
790 789
791void 790void
792mbus_cp_8(void *v, bus_space_handle_t h1, bus_size_t o1, 791mbus_cp_8(void *v, bus_space_handle_t h1, bus_size_t o1,
793 bus_space_handle_t h2, bus_size_t o2, bus_size_t c) 792 bus_space_handle_t h2, bus_size_t o2, bus_size_t c)
794{ 793{
795 volatile u_int64_t *p1, *p2; 794 volatile u_int64_t *p1, *p2;
796 795
797 h1 += o1; 796 h1 += o1;
798 h2 += o2; 797 h2 += o2;
799 p1 = (void *)h1; 798 p1 = (void *)h1;
800 p2 = (void *)h2; 799 p2 = (void *)h2;
801 while (c--) 800 while (c--)
802 *p1++ = *p2++; 801 *p1++ = *p2++;
803} 802}
804 803
805 804
806const struct hppa_bus_space_tag hppa_bustag = { 805const struct hppa_bus_space_tag hppa_bustag = {
807 NULL, 806 NULL,
808 807
809 mbus_map, mbus_unmap, mbus_subregion, mbus_alloc, mbus_free, 808 mbus_map, mbus_unmap, mbus_subregion, mbus_alloc, mbus_free,
810 mbus_barrier, mbus_vaddr, 809 mbus_barrier, mbus_vaddr,
811 mbus_r1, mbus_r2, mbus_r4, mbus_r8, 810 mbus_r1, mbus_r2, mbus_r4, mbus_r8,
812 mbus_w1, mbus_w2, mbus_w4, mbus_w8, 811 mbus_w1, mbus_w2, mbus_w4, mbus_w8,
813 mbus_rm_1, mbus_rm_2, mbus_rm_4, mbus_rm_8, 812 mbus_rm_1, mbus_rm_2, mbus_rm_4, mbus_rm_8,
814 mbus_wm_1, mbus_wm_2, mbus_wm_4, mbus_wm_8, 813 mbus_wm_1, mbus_wm_2, mbus_wm_4, mbus_wm_8,
815 mbus_sm_1, mbus_sm_2, mbus_sm_4, mbus_sm_8, 814 mbus_sm_1, mbus_sm_2, mbus_sm_4, mbus_sm_8,
816 /* *_stream_* are the same as non-stream for native busses */ 815 /* *_stream_* are the same as non-stream for native busses */
817 mbus_rm_2, mbus_rm_4, mbus_rm_8, 816 mbus_rm_2, mbus_rm_4, mbus_rm_8,
818 mbus_wm_2, mbus_wm_4, mbus_wm_8, 817 mbus_wm_2, mbus_wm_4, mbus_wm_8,
819 mbus_rr_1, mbus_rr_2, mbus_rr_4, mbus_rr_8, 818 mbus_rr_1, mbus_rr_2, mbus_rr_4, mbus_rr_8,
820 mbus_wr_1, mbus_wr_2, mbus_wr_4, mbus_wr_8, 819 mbus_wr_1, mbus_wr_2, mbus_wr_4, mbus_wr_8,
821 /* *_stream_* are the same as non-stream for native busses */ 820 /* *_stream_* are the same as non-stream for native busses */
822 mbus_rr_2, mbus_rr_4, mbus_rr_8, 821 mbus_rr_2, mbus_rr_4, mbus_rr_8,
823 mbus_wr_2, mbus_wr_4, mbus_wr_8, 822 mbus_wr_2, mbus_wr_4, mbus_wr_8,
824 mbus_sr_1, mbus_sr_2, mbus_sr_4, mbus_sr_8, 823 mbus_sr_1, mbus_sr_2, mbus_sr_4, mbus_sr_8,
825 mbus_cp_1, mbus_cp_2, mbus_cp_4, mbus_cp_8 824 mbus_cp_1, mbus_cp_2, mbus_cp_4, mbus_cp_8
826}; 825};
827 826
828/* 827/*
829 * Common function for DMA map creation. May be called by bus-specific 828 * Common function for DMA map creation. May be called by bus-specific
830 * DMA map creation functions. 829 * DMA map creation functions.
831 */ 830 */
832int 831int
833mbus_dmamap_create(void *v, bus_size_t size, int nsegments, bus_size_t maxsegsz, 832mbus_dmamap_create(void *v, bus_size_t size, int nsegments, bus_size_t maxsegsz,
834 bus_size_t boundary, int flags, bus_dmamap_t *dmamp) 833 bus_size_t boundary, int flags, bus_dmamap_t *dmamp)
835{ 834{
836 struct hppa_bus_dmamap *map; 835 struct hppa_bus_dmamap *map;
837 size_t mapsize; 836 size_t mapsize;
838 837
839 /* 838 /*
840 * Allocate and initialize the DMA map. The end of the map 839 * Allocate and initialize the DMA map. The end of the map
841 * is a variable-sized array of segments, so we allocate enough 840 * is a variable-sized array of segments, so we allocate enough
842 * room for them in one shot. 841 * room for them in one shot.
843 * 842 *
844 * Note we don't preserve the WAITOK or NOWAIT flags. Preservation 843 * Note we don't preserve the WAITOK or NOWAIT flags. Preservation
845 * of ALLOCNOW notifies others that we've reserved these resources, 844 * of ALLOCNOW notifies others that we've reserved these resources,
846 * and they are not to be freed. 845 * and they are not to be freed.
847 * 846 *
848 * The bus_dmamap_t includes one bus_dma_segment_t, hence 847 * The bus_dmamap_t includes one bus_dma_segment_t, hence
849 * the (nsegments - 1). 848 * the (nsegments - 1).
850 */ 849 */
851 mapsize = sizeof(struct hppa_bus_dmamap) + 850 mapsize = sizeof(struct hppa_bus_dmamap) +
852 (sizeof(bus_dma_segment_t) * (nsegments - 1)); 851 (sizeof(bus_dma_segment_t) * (nsegments - 1));
853 map = malloc(mapsize, M_DMAMAP, 852 map = malloc(mapsize, M_DMAMAP,
854 (flags & BUS_DMA_NOWAIT) ? M_NOWAIT : M_WAITOK); 853 (flags & BUS_DMA_NOWAIT) ? M_NOWAIT : M_WAITOK);
855 if (!map) 854 if (!map)
856 return (ENOMEM); 855 return (ENOMEM);
857 856
858 memset(map, 0, mapsize); 857 memset(map, 0, mapsize);
859 map->_dm_size = size; 858 map->_dm_size = size;
860 map->_dm_segcnt = nsegments; 859 map->_dm_segcnt = nsegments;
861 map->_dm_maxsegsz = maxsegsz; 860 map->_dm_maxsegsz = maxsegsz;
862 map->_dm_boundary = boundary; 861 map->_dm_boundary = boundary;
863 map->_dm_flags = flags & ~(BUS_DMA_WAITOK|BUS_DMA_NOWAIT); 862 map->_dm_flags = flags & ~(BUS_DMA_WAITOK|BUS_DMA_NOWAIT);
864 map->dm_mapsize = 0; /* no valid mappings */ 863 map->dm_mapsize = 0; /* no valid mappings */
865 map->dm_nsegs = 0; 864 map->dm_nsegs = 0;
866 865
867 *dmamp = map; 866 *dmamp = map;
868 return (0); 867 return (0);
869} 868}
870 869
871/* 870/*
872 * Common function for DMA map destruction. May be called by bus-specific 871 * Common function for DMA map destruction. May be called by bus-specific
873 * DMA map destruction functions. 872 * DMA map destruction functions.
874 */ 873 */
875void 874void
876mbus_dmamap_destroy(void *v, bus_dmamap_t map) 875mbus_dmamap_destroy(void *v, bus_dmamap_t map)
877{ 876{
878 877
879 /* 878 /*
880 * If the handle contains a valid mapping, unload it. 879 * If the handle contains a valid mapping, unload it.
881 */ 880 */
882 if (map->dm_mapsize != 0) 881 if (map->dm_mapsize != 0)
883 mbus_dmamap_unload(v, map); 882 mbus_dmamap_unload(v, map);
884 883
885 free(map, M_DMAMAP); 884 free(map, M_DMAMAP);
886} 885}
887 886
888/* 887/*
889 * load DMA map with a linear buffer. 888 * load DMA map with a linear buffer.
890 */ 889 */
891int 890int
892mbus_dmamap_load(void *v, bus_dmamap_t map, void *buf, bus_size_t buflen, 891mbus_dmamap_load(void *v, bus_dmamap_t map, void *buf, bus_size_t buflen,
893 struct proc *p, int flags) 892 struct proc *p, int flags)
894{ 893{
895 vaddr_t lastaddr; 894 vaddr_t lastaddr;
896 int seg, error; 895 int seg, error;
897 struct vmspace *vm; 896 struct vmspace *vm;
898 897
899 /* 898 /*
900 * Make sure that on error condition we return "no valid mappings". 899 * Make sure that on error condition we return "no valid mappings".
901 */ 900 */
902 map->dm_mapsize = 0; 901 map->dm_mapsize = 0;
903 map->dm_nsegs = 0; 902 map->dm_nsegs = 0;
904 903
905 if (buflen > map->_dm_size) 904 if (buflen > map->_dm_size)
906 return (EINVAL); 905 return (EINVAL);
907 906
908 if (p != NULL) { 907 if (p != NULL) {
909 vm = p->p_vmspace; 908 vm = p->p_vmspace;
910 } else { 909 } else {
911 vm = vmspace_kernel(); 910 vm = vmspace_kernel();
912 } 911 }
913 912
914 seg = 0; 913 seg = 0;
915 error = _bus_dmamap_load_buffer(NULL, map, buf, buflen, vm, flags, 914 error = _bus_dmamap_load_buffer(NULL, map, buf, buflen, vm, flags,
916 &lastaddr, &seg, 1); 915 &lastaddr, &seg, 1);
917 if (error == 0) { 916 if (error == 0) {
918 map->dm_mapsize = buflen; 917 map->dm_mapsize = buflen;
919 map->dm_nsegs = seg + 1; 918 map->dm_nsegs = seg + 1;
920 } 919 }
921 return (error); 920 return (error);
922} 921}
923 922
924/* 923/*
925 * Like _bus_dmamap_load(), but for mbufs. 924 * Like _bus_dmamap_load(), but for mbufs.
926 */ 925 */
927int 926int
928mbus_dmamap_load_mbuf(void *v, bus_dmamap_t map, struct mbuf *m0, 927mbus_dmamap_load_mbuf(void *v, bus_dmamap_t map, struct mbuf *m0,
929 int flags) 928 int flags)
930{ 929{
931 vaddr_t lastaddr; 930 vaddr_t lastaddr;
932 int seg, error, first; 931 int seg, error, first;
933 struct mbuf *m; 932 struct mbuf *m;
934 933
935 /* 934 /*
936 * Make sure that on error condition we return "no valid mappings." 935 * Make sure that on error condition we return "no valid mappings."
937 */ 936 */
938 map->dm_mapsize = 0; 937 map->dm_mapsize = 0;
939 map->dm_nsegs = 0; 938 map->dm_nsegs = 0;
940 939
941#ifdef DIAGNOSTIC 940#ifdef DIAGNOSTIC
942 if ((m0->m_flags & M_PKTHDR) == 0) 941 if ((m0->m_flags & M_PKTHDR) == 0)
943 panic("_bus_dmamap_load_mbuf: no packet header"); 942 panic("_bus_dmamap_load_mbuf: no packet header");
944#endif /* DIAGNOSTIC */ 943#endif /* DIAGNOSTIC */
945 944
946 if (m0->m_pkthdr.len > map->_dm_size) 945 if (m0->m_pkthdr.len > map->_dm_size)
947 return (EINVAL); 946 return (EINVAL);
948 947
949 first = 1; 948 first = 1;
950 seg = 0; 949 seg = 0;
951 error = 0; 950 error = 0;
952 for (m = m0; m != NULL && error == 0; m = m->m_next) { 951 for (m = m0; m != NULL && error == 0; m = m->m_next) {
953 if (m->m_len == 0) 952 if (m->m_len == 0)
954 continue; 953 continue;
955 error = _bus_dmamap_load_buffer(NULL, map, m->m_data, m->m_len, 954 error = _bus_dmamap_load_buffer(NULL, map, m->m_data, m->m_len,
956 vmspace_kernel(), flags, &lastaddr, &seg, first); 955 vmspace_kernel(), flags, &lastaddr, &seg, first);
957 first = 0; 956 first = 0;
958 } 957 }
959 if (error == 0) { 958 if (error == 0) {
960 map->dm_mapsize = m0->m_pkthdr.len; 959 map->dm_mapsize = m0->m_pkthdr.len;
961 map->dm_nsegs = seg + 1; 960 map->dm_nsegs = seg + 1;
962 } 961 }
963 return (error); 962 return (error);
964} 963}
965 964
966/* 965/*
967 * Like _bus_dmamap_load(), but for uios. 966 * Like _bus_dmamap_load(), but for uios.
968 */ 967 */
969int 968int
970mbus_dmamap_load_uio(void *v, bus_dmamap_t map, struct uio *uio, 969mbus_dmamap_load_uio(void *v, bus_dmamap_t map, struct uio *uio,
971 int flags) 970 int flags)
972{ 971{
973 vaddr_t lastaddr; 972 vaddr_t lastaddr;
974 int seg, i, error, first; 973 int seg, i, error, first;
975 bus_size_t minlen, resid; 974 bus_size_t minlen, resid;
976 struct iovec *iov; 975 struct iovec *iov;
977 void *addr; 976 void *addr;
978 977
979 /* 978 /*
980 * Make sure that on error condition we return "no valid mappings." 979 * Make sure that on error condition we return "no valid mappings."
981 */ 980 */
982 map->dm_mapsize = 0; 981 map->dm_mapsize = 0;
983 map->dm_nsegs = 0; 982 map->dm_nsegs = 0;
984 983
985 resid = uio->uio_resid; 984 resid = uio->uio_resid;
986 iov = uio->uio_iov; 985 iov = uio->uio_iov;
987 986
988 first = 1; 987 first = 1;
989 seg = 0; 988 seg = 0;
990 error = 0; 989 error = 0;
991 for (i = 0; i < uio->uio_iovcnt && resid != 0 && error == 0; i++) { 990 for (i = 0; i < uio->uio_iovcnt && resid != 0 && error == 0; i++) {
992 /* 991 /*
993 * Now at the first iovec to load. Load each iovec 992 * Now at the first iovec to load. Load each iovec
994 * until we have exhausted the residual count. 993 * until we have exhausted the residual count.
995 */ 994 */
996 minlen = MIN(resid, iov[i].iov_len); 995 minlen = MIN(resid, iov[i].iov_len);
997 addr = (void *)iov[i].iov_base; 996 addr = (void *)iov[i].iov_base;
998 997
999 error = _bus_dmamap_load_buffer(NULL, map, addr, minlen, 998 error = _bus_dmamap_load_buffer(NULL, map, addr, minlen,
1000 uio->uio_vmspace, flags, &lastaddr, &seg, first); 999 uio->uio_vmspace, flags, &lastaddr, &seg, first);
1001 first = 0; 1000 first = 0;
1002 1001
1003 resid -= minlen; 1002 resid -= minlen;
1004 } 1003 }
1005 if (error == 0) { 1004 if (error == 0) {
1006 map->dm_mapsize = uio->uio_resid; 1005 map->dm_mapsize = uio->uio_resid;
1007 map->dm_nsegs = seg + 1; 1006 map->dm_nsegs = seg + 1;
1008 } 1007 }
1009 return (error); 1008 return (error);
1010} 1009}
1011 1010
1012/* 1011/*
1013 * Like bus_dmamap_load(), but for raw memory allocated with 1012 * Like bus_dmamap_load(), but for raw memory allocated with
1014 * bus_dmamem_alloc(). 1013 * bus_dmamem_alloc().
1015 */ 1014 */
1016int 1015int
1017mbus_dmamap_load_raw(void *v, bus_dmamap_t map, bus_dma_segment_t *segs, 1016mbus_dmamap_load_raw(void *v, bus_dmamap_t map, bus_dma_segment_t *segs,
1018 int nsegs, bus_size_t size, int flags) 1017 int nsegs, bus_size_t size, int flags)
1019{ 1018{
1020 struct pglist *mlist; 1019 struct pglist *mlist;
1021 struct vm_page *m; 1020 struct vm_page *m;
1022 paddr_t pa, pa_next; 1021 paddr_t pa, pa_next;
1023 bus_size_t mapsize; 1022 bus_size_t mapsize;
1024 bus_size_t pagesz = PAGE_SIZE; 1023 bus_size_t pagesz = PAGE_SIZE;
1025 int seg; 1024 int seg;
1026 1025
1027 /* 1026 /*
1028 * Make sure that on error condition we return "no valid mappings". 1027 * Make sure that on error condition we return "no valid mappings".
1029 */ 1028 */
1030 map->dm_nsegs = 0; 1029 map->dm_nsegs = 0;
1031 map->dm_mapsize = 0; 1030 map->dm_mapsize = 0;
1032 1031
1033 /* Load the allocated pages. */ 1032 /* Load the allocated pages. */
1034 mlist = segs[0]._ds_mlist; 1033 mlist = segs[0]._ds_mlist;
1035 pa_next = 0; 1034 pa_next = 0;
1036 seg = -1; 1035 seg = -1;
1037 mapsize = size; 1036 mapsize = size;
1038 for (m = TAILQ_FIRST(mlist); m != NULL; m = TAILQ_NEXT(m,pageq.queue)) { 1037 for (m = TAILQ_FIRST(mlist); m != NULL; m = TAILQ_NEXT(m,pageq.queue)) {
1039 1038
1040 if (size == 0) 1039 if (size == 0)
1041 panic("mbus_dmamem_load_raw: size botch"); 1040 panic("mbus_dmamem_load_raw: size botch");
1042 1041
1043 pa = VM_PAGE_TO_PHYS(m); 1042 pa = VM_PAGE_TO_PHYS(m);
1044 if (pa != pa_next) { 1043 if (pa != pa_next) {
1045 if (++seg >= map->_dm_segcnt) 1044 if (++seg >= map->_dm_segcnt)
1046 panic("mbus_dmamem_load_raw: nsegs botch"); 1045 panic("mbus_dmamem_load_raw: nsegs botch");
1047 map->dm_segs[seg].ds_addr = pa; 1046 map->dm_segs[seg].ds_addr = pa;
1048 map->dm_segs[seg].ds_len = 0; 1047 map->dm_segs[seg].ds_len = 0;
1049 } 1048 }
1050 pa_next = pa + PAGE_SIZE; 1049 pa_next = pa + PAGE_SIZE;
1051 if (size < pagesz) 1050 if (size < pagesz)
1052 pagesz = size; 1051 pagesz = size;
1053 map->dm_segs[seg].ds_len += pagesz; 1052 map->dm_segs[seg].ds_len += pagesz;
1054 size -= pagesz; 1053 size -= pagesz;
1055 } 1054 }
1056 1055
1057 /* Make the map truly valid. */ 1056 /* Make the map truly valid. */
1058 map->dm_nsegs = seg + 1; 1057 map->dm_nsegs = seg + 1;
1059 map->dm_mapsize = mapsize; 1058 map->dm_mapsize = mapsize;
1060 1059
1061 return (0); 1060 return (0);
1062} 1061}
1063 1062
1064/* 1063/*
1065 * unload a DMA map. 1064 * unload a DMA map.
1066 */ 1065 */
1067void 1066void
1068mbus_dmamap_unload(void *v, bus_dmamap_t map) 1067mbus_dmamap_unload(void *v, bus_dmamap_t map)
1069{ 1068{
1070 /* 1069 /*
1071 * If this map was loaded with mbus_dmamap_load, 1070 * If this map was loaded with mbus_dmamap_load,
1072 * we don't need to do anything. If this map was 1071 * we don't need to do anything. If this map was
1073 * loaded with mbus_dmamap_load_raw, we also don't 1072 * loaded with mbus_dmamap_load_raw, we also don't
1074 * need to do anything. 1073 * need to do anything.
1075 */ 1074 */
1076 1075
1077 /* Mark the mappings as invalid. */ 1076 /* Mark the mappings as invalid. */
1078 map->dm_mapsize = 0; 1077 map->dm_mapsize = 0;
1079 map->dm_nsegs = 0; 1078 map->dm_nsegs = 0;
1080} 1079}
1081 1080
1082void 1081void
1083mbus_dmamap_sync(void *v, bus_dmamap_t map, bus_addr_t offset, bus_size_t len, 1082mbus_dmamap_sync(void *v, bus_dmamap_t map, bus_addr_t offset, bus_size_t len,
1084 int ops) 1083 int ops)
1085{ 1084{
1086 int i; 1085 int i;
1087 /* 1086 /*
1088 * Mixing of PRE and POST operations is not allowed. 1087 * Mixing of PRE and POST operations is not allowed.
1089 */ 1088 */
1090 if ((ops & (BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE)) != 0 && 1089 if ((ops & (BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE)) != 0 &&
1091 (ops & (BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE)) != 0) 1090 (ops & (BUS_DMASYNC_POSTREAD|BUS_DMASYNC_POSTWRITE)) != 0)
1092 panic("mbus_dmamap_sync: mix PRE and POST"); 1091 panic("mbus_dmamap_sync: mix PRE and POST");
1093 1092
1094#ifdef DIAGNOSTIC 1093#ifdef DIAGNOSTIC
1095 if (offset >= map->dm_mapsize) 1094 if (offset >= map->dm_mapsize)
1096 panic("mbus_dmamap_sync: bad offset %lu (map size is %lu)", 1095 panic("mbus_dmamap_sync: bad offset %lu (map size is %lu)",
1097 offset, map->dm_mapsize); 1096 offset, map->dm_mapsize);
1098 if (len == 0 || (offset + len) > map->dm_mapsize) 1097 if (len == 0 || (offset + len) > map->dm_mapsize)
1099 panic("mbus_dmamap_sync: bad length"); 1098 panic("mbus_dmamap_sync: bad length");
1100#endif 1099#endif
1101 1100
1102 /* 1101 /*
1103 * For a virtually-indexed write-back cache, we need 1102 * For a virtually-indexed write-back cache, we need
1104 * to do the following things: 1103 * to do the following things:
1105 * 1104 *
1106 * PREREAD -- Invalidate the D-cache. We do this 1105 * PREREAD -- Invalidate the D-cache. We do this
1107 * here in case a write-back is required by the back-end. 1106 * here in case a write-back is required by the back-end.
1108 * 1107 *
1109 * PREWRITE -- Write-back the D-cache. Note that if 1108 * PREWRITE -- Write-back the D-cache. Note that if
1110 * we are doing a PREREAD|PREWRITE, we can collapse 1109 * we are doing a PREREAD|PREWRITE, we can collapse
1111 * the whole thing into a single Wb-Inv. 1110 * the whole thing into a single Wb-Inv.
1112 * 1111 *
1113 * POSTREAD -- Nothing. 1112 * POSTREAD -- Nothing.
1114 * 1113 *
1115 * POSTWRITE -- Nothing. 1114 * POSTWRITE -- Nothing.
1116 */ 1115 */
1117 1116
1118 ops &= (BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); 1117 ops &= (BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE);
1119 if (ops == 0) 1118 if (ops == 0)
1120 return; 1119 return;
1121 1120
1122 for (i = 0; len != 0 && i < map->dm_nsegs; i++) { 1121 for (i = 0; len != 0 && i < map->dm_nsegs; i++) {
1123 if (offset >= map->dm_segs[i].ds_len) 1122 if (offset >= map->dm_segs[i].ds_len)
1124 offset -= map->dm_segs[i].ds_len; 1123 offset -= map->dm_segs[i].ds_len;
1125 else { 1124 else {
1126 bus_size_t l = map->dm_segs[i].ds_len - offset; 1125 bus_size_t l = map->dm_segs[i].ds_len - offset;
1127 1126
1128 if (l > len) 1127 if (l > len)
1129 l = len; 1128 l = len;
1130 1129
1131 fdcache(HPPA_SID_KERNEL, map->dm_segs[i]._ds_va + 1130 fdcache(HPPA_SID_KERNEL, map->dm_segs[i]._ds_va +
1132 offset, l); 1131 offset, l);
1133 len -= l; 1132 len -= l;
1134 offset = 0; 1133 offset = 0;
1135 } 1134 }
1136 } 1135 }
1137 1136
1138 /* for either operation sync the shit away */ 1137 /* for either operation sync the shit away */
1139 __asm __volatile ("sync\n\tsyncdma\n\tsync\n\t" 1138 __asm __volatile ("sync\n\tsyncdma\n\tsync\n\t"
1140 "nop\n\tnop\n\tnop\n\tnop\n\tnop\n\tnop\n\tnop" ::: "memory"); 1139 "nop\n\tnop\n\tnop\n\tnop\n\tnop\n\tnop\n\tnop" ::: "memory");
1141} 1140}
1142 1141
1143/* 1142/*
1144 * Common function for DMA-safe memory allocation. May be called 1143 * Common function for DMA-safe memory allocation. May be called
1145 * by bus-specific DMA memory allocation functions. 1144 * by bus-specific DMA memory allocation functions.
1146 */ 1145 */
1147int 1146int
1148mbus_dmamem_alloc(void *v, bus_size_t size, bus_size_t alignment, 1147mbus_dmamem_alloc(void *v, bus_size_t size, bus_size_t alignment,
1149 bus_size_t boundary, bus_dma_segment_t *segs, int nsegs, int *rsegs, 1148 bus_size_t boundary, bus_dma_segment_t *segs, int nsegs, int *rsegs,
1150 int flags) 1149 int flags)
1151{ 1150{
1152 paddr_t low, high; 1151 paddr_t low, high;
1153 struct pglist *mlist; 1152 struct pglist *mlist;
1154 struct vm_page *m; 1153 struct vm_page *m;
1155 paddr_t pa, pa_next; 1154 paddr_t pa, pa_next;
1156 int seg; 1155 int seg;
1157 int error; 1156 int error;
1158 1157
1159 /* Always round the size. */ 1158 /* Always round the size. */
1160 size = round_page(size); 1159 size = round_page(size);
1161 1160
1162 /* Decide where we can allocate pages. */ 1161 /* Decide where we can allocate pages. */
1163 low = 0; 1162 low = 0;
1164 high = ((flags & BUS_DMA_24BIT) ? (1 << 24) : 0) - 1; 1163 high = ((flags & BUS_DMA_24BIT) ? (1 << 24) : 0) - 1;
1165 1164
1166 if ((mlist = malloc(sizeof(*mlist), M_DEVBUF, 1165 if ((mlist = malloc(sizeof(*mlist), M_DEVBUF,
1167 (flags & BUS_DMA_NOWAIT) ? M_NOWAIT : M_WAITOK)) == NULL) 1166 (flags & BUS_DMA_NOWAIT) ? M_NOWAIT : M_WAITOK)) == NULL)
1168 return (ENOMEM); 1167 return (ENOMEM);
1169 1168
1170 /* 1169 /*
1171 * Allocate physical pages from the VM system. 1170 * Allocate physical pages from the VM system.
1172 */ 1171 */
1173 TAILQ_INIT(mlist); 1172 TAILQ_INIT(mlist);
1174 error = uvm_pglistalloc(size, low, high, 0, 0, 1173 error = uvm_pglistalloc(size, low, high, 0, 0,
1175 mlist, nsegs, (flags & BUS_DMA_NOWAIT) == 0); 1174 mlist, nsegs, (flags & BUS_DMA_NOWAIT) == 0);
1176 1175
1177 /* 1176 /*
1178 * If the allocation failed, and this is a 24-bit 1177 * If the allocation failed, and this is a 24-bit
1179 * device, see if we have space left in the 24-bit 1178 * device, see if we have space left in the 24-bit
1180 * region. 1179 * region.
1181 */ 1180 */
1182 if (error == ENOMEM && (flags & BUS_DMA_24BIT) && dma24_ex != NULL) { 1181 if (error == ENOMEM && (flags & BUS_DMA_24BIT) && dma24_ex != NULL) {
1183 error = extent_alloc(dma24_ex, size, alignment, 0, 0, &pa); 1182 error = extent_alloc(dma24_ex, size, alignment, 0, 0, &pa);
1184 if (!error) { 1183 if (!error) {
1185 free(mlist, M_DEVBUF); 1184 free(mlist, M_DEVBUF);
1186 /* 1185 /*
1187 * A _ds_mlist value of NULL is the 1186 * A _ds_mlist value of NULL is the
1188 * signal to mbus_dmamem_map that no 1187 * signal to mbus_dmamem_map that no
1189 * real mapping needs to be done, and 1188 * real mapping needs to be done, and
1190 * it is the signal to mbus_dmamem_free 1189 * it is the signal to mbus_dmamem_free
1191 * that an extent_free is needed. 1190 * that an extent_free is needed.
1192 */ 1191 */
1193 *rsegs = 1; 1192 *rsegs = 1;
1194 segs[0].ds_addr = 0; 1193 segs[0].ds_addr = 0;
1195 segs[0].ds_len = size; 1194 segs[0].ds_len = size;
1196 segs[0]._ds_va = (vaddr_t)pa; 1195 segs[0]._ds_va = (vaddr_t)pa;
1197 segs[0]._ds_mlist = NULL; 1196 segs[0]._ds_mlist = NULL;
1198 return (0); 1197 return (0);
1199 } 1198 }
1200 } 1199 }
1201 1200
1202 /* If we don't have the pages. */ 1201 /* If we don't have the pages. */
1203 if (error) { 1202 if (error) {
1204 free(mlist, M_DEVBUF); 1203 free(mlist, M_DEVBUF);
1205 return (error); 1204 return (error);
1206 } 1205 }
1207 1206
1208 /* 1207 /*
1209 * Since, at least as of revision 1.17 of uvm_pglist.c, 1208 * Since, at least as of revision 1.17 of uvm_pglist.c,
1210 * uvm_pglistalloc ignores its nsegs argument, we need 1209 * uvm_pglistalloc ignores its nsegs argument, we need
1211 * to check that the pages returned conform to the 1210 * to check that the pages returned conform to the
1212 * caller's segment requirements. 1211 * caller's segment requirements.
1213 */ 1212 */
1214 pa_next = 0; 1213 pa_next = 0;
1215 seg = -1; 1214 seg = -1;
1216 for (m = TAILQ_FIRST(mlist); m != NULL; m = TAILQ_NEXT(m,pageq.queue)) { 1215 for (m = TAILQ_FIRST(mlist); m != NULL; m = TAILQ_NEXT(m,pageq.queue)) {
1217 pa = VM_PAGE_TO_PHYS(m); 1216 pa = VM_PAGE_TO_PHYS(m);
1218 if (pa != pa_next) { 1217 if (pa != pa_next) {
1219 if (++seg >= nsegs) { 1218 if (++seg >= nsegs) {
1220 uvm_pglistfree(mlist); 1219 uvm_pglistfree(mlist);
1221 free(mlist, M_DEVBUF); 1220 free(mlist, M_DEVBUF);
1222 return (ENOMEM); 1221 return (ENOMEM);
1223 } 1222 }
1224 segs[seg].ds_addr = 0; 1223 segs[seg].ds_addr = 0;
1225 segs[seg].ds_len = 0; 1224 segs[seg].ds_len = 0;
1226 segs[seg]._ds_va = 0; 1225 segs[seg]._ds_va = 0;
1227 } 1226 }
1228 pa_next = pa + PAGE_SIZE; 1227 pa_next = pa + PAGE_SIZE;
1229 } 1228 }
1230 *rsegs = seg + 1; 1229 *rsegs = seg + 1;
1231 1230
1232 /* 1231 /*
1233 * Simply keep a pointer around to the linked list, so 1232 * Simply keep a pointer around to the linked list, so
1234 * bus_dmamap_free() can return it. 1233 * bus_dmamap_free() can return it.
1235 * 1234 *
1236 * NOBODY SHOULD TOUCH THE pageq.queue FIELDS WHILE THESE PAGES 1235 * NOBODY SHOULD TOUCH THE pageq.queue FIELDS WHILE THESE PAGES
1237 * ARE IN OUR CUSTODY. 1236 * ARE IN OUR CUSTODY.
1238 */ 1237 */
1239 segs[0]._ds_mlist = mlist; 1238 segs[0]._ds_mlist = mlist;
1240 1239
1241 /* 1240 /*
1242 * We now have physical pages, but no kernel virtual addresses 1241 * We now have physical pages, but no kernel virtual addresses
1243 * yet. These may be allocated in bus_dmamap_map. Hence we 1242 * yet. These may be allocated in bus_dmamap_map. Hence we
1244 * save any alignment and boundary requirements in this DMA 1243 * save any alignment and boundary requirements in this DMA
1245 * segment. 1244 * segment.
1246 */ 1245 */
1247 return (0); 1246 return (0);
1248} 1247}
1249 1248
1250void 1249void
1251mbus_dmamem_free(void *v, bus_dma_segment_t *segs, int nsegs) 1250mbus_dmamem_free(void *v, bus_dma_segment_t *segs, int nsegs)
1252{ 1251{
1253 1252
1254 /* 1253 /*
1255 * Return the list of physical pages back to the VM system. 1254 * Return the list of physical pages back to the VM system.
1256 */ 1255 */
1257 if (segs[0]._ds_mlist != NULL) { 1256 if (segs[0]._ds_mlist != NULL) {
1258 uvm_pglistfree(segs[0]._ds_mlist); 1257 uvm_pglistfree(segs[0]._ds_mlist);
1259 free(segs[0]._ds_mlist, M_DEVBUF); 1258 free(segs[0]._ds_mlist, M_DEVBUF);
1260 } else { 1259 } else {
1261 extent_free(dma24_ex, segs[0]._ds_va, segs[0].ds_len, 1260 extent_free(dma24_ex, segs[0]._ds_va, segs[0].ds_len,
1262 EX_NOWAIT); 1261 EX_NOWAIT);
1263 } 1262 }
1264} 1263}
1265 1264
1266/* 1265/*
1267 * Common function for mapping DMA-safe memory. May be called by 1266 * Common function for mapping DMA-safe memory. May be called by
1268 * bus-specific DMA memory map functions. 1267 * bus-specific DMA memory map functions.
1269 */ 1268 */
1270int 1269int
1271mbus_dmamem_map(void *v, bus_dma_segment_t *segs, int nsegs, size_t size, 1270mbus_dmamem_map(void *v, bus_dma_segment_t *segs, int nsegs, size_t size,
1272 void **kvap, int flags) 1271 void **kvap, int flags)
1273{ 1272{
1274 struct vm_page *pg; 1273 struct vm_page *pg;
1275 struct pglist *pglist; 1274 struct pglist *pglist;
1276 vaddr_t va; 1275 vaddr_t va;
1277 paddr_t pa; 1276 paddr_t pa;
1278 const uvm_flag_t kmflags = 1277 const uvm_flag_t kmflags =
1279 (flags & BUS_DMA_NOWAIT) != 0 ? UVM_KMF_NOWAIT : 0; 1278 (flags & BUS_DMA_NOWAIT) != 0 ? UVM_KMF_NOWAIT : 0;
1280 1279
1281 size = round_page(size); 1280 size = round_page(size);
1282 1281
1283 /* 24-bit memory needs no mapping. */ 1282 /* 24-bit memory needs no mapping. */
1284 if (segs[0]._ds_mlist == NULL) { 1283 if (segs[0]._ds_mlist == NULL) {
1285 if (size > segs[0].ds_len) 1284 if (size > segs[0].ds_len)
1286 panic("mbus_dmamem_map: size botch"); 1285 panic("mbus_dmamem_map: size botch");
1287 *kvap = (void *)segs[0]._ds_va; 1286 *kvap = (void *)segs[0]._ds_va;
1288 return (0); 1287 return (0);
1289 } 1288 }
1290 1289
1291 /* Get a chunk of kernel virtual space. */ 1290 /* Get a chunk of kernel virtual space. */
1292 va = uvm_km_alloc(kernel_map, size, 0, UVM_KMF_VAONLY | kmflags); 1291 va = uvm_km_alloc(kernel_map, size, 0, UVM_KMF_VAONLY | kmflags);
1293 if (va == 0) 1292 if (va == 0)
1294 return (ENOMEM); 1293 return (ENOMEM);
1295 1294
1296 /* Stash that in the first segment. */ 1295 /* Stash that in the first segment. */
1297 segs[0]._ds_va = va; 1296 segs[0]._ds_va = va;
1298 *kvap = (void *)va; 1297 *kvap = (void *)va;
1299 1298
1300 /* Map the allocated pages into the chunk. */ 1299 /* Map the allocated pages into the chunk. */
1301 pglist = segs[0]._ds_mlist; 1300 pglist = segs[0]._ds_mlist;
1302 TAILQ_FOREACH(pg, pglist, pageq.queue) { 1301 TAILQ_FOREACH(pg, pglist, pageq.queue) {
1303 KASSERT(size != 0); 1302 KASSERT(size != 0);
1304 pa = VM_PAGE_TO_PHYS(pg); 1303 pa = VM_PAGE_TO_PHYS(pg);
1305 pmap_kenter_pa(va, pa, VM_PROT_READ | VM_PROT_WRITE | PMAP_NC); 1304 pmap_kenter_pa(va, pa, VM_PROT_READ | VM_PROT_WRITE | PMAP_NC);
1306 va += PAGE_SIZE; 1305 va += PAGE_SIZE;
1307 size -= PAGE_SIZE; 1306 size -= PAGE_SIZE;
1308 } 1307 }
1309 pmap_update(); 1308 pmap_update();
1310 return (0); 1309 return (0);
1311} 1310}
1312 1311
1313/* 1312/*
1314 * Common function for unmapping DMA-safe memory. May be called by 1313 * Common function for unmapping DMA-safe memory. May be called by
1315 * bus-specific DMA memory unmapping functions. 1314 * bus-specific DMA memory unmapping functions.
1316 */ 1315 */
1317void 1316void
1318mbus_dmamem_unmap(void *v, void *kva, size_t size) 1317mbus_dmamem_unmap(void *v, void *kva, size_t size)
1319{ 1318{
1320 1319
1321#ifdef DIAGNOSTIC 1320#ifdef DIAGNOSTIC
1322 if ((u_long)kva & PAGE_MASK) 1321 if ((u_long)kva & PAGE_MASK)
1323 panic("mbus_dmamem_unmap"); 1322 panic("mbus_dmamem_unmap");
1324#endif 1323#endif
1325 1324
1326 /* 1325 /*
1327 * XXX fredette - this is gross, but it is needed 1326 * XXX fredette - this is gross, but it is needed
1328 * to support the 24-bit DMA address stuff. 1327 * to support the 24-bit DMA address stuff.
1329 */ 1328 */
1330 if (dma24_ex != NULL && kva < (void *) (1 << 24)) 1329 if (dma24_ex != NULL && kva < (void *) (1 << 24))
1331 return; 1330 return;
1332 1331
1333 size = round_page(size); 1332 size = round_page(size);
1334 pmap_kremove((vaddr_t)kva, size); 1333 pmap_kremove((vaddr_t)kva, size);
1335 pmap_update(pmap_kernel()); 1334 pmap_update(pmap_kernel());
1336 uvm_km_free(kernel_map, (vaddr_t)kva, size, UVM_KMF_VAONLY); 1335 uvm_km_free(kernel_map, (vaddr_t)kva, size, UVM_KMF_VAONLY);
1337} 1336}
1338 1337
1339/* 1338/*
1340 * Common functin for mmap(2)'ing DMA-safe memory. May be called by 1339 * Common functin for mmap(2)'ing DMA-safe memory. May be called by
1341 * bus-specific DMA mmap(2)'ing functions. 1340 * bus-specific DMA mmap(2)'ing functions.
1342 */ 1341 */
1343paddr_t 1342paddr_t
1344mbus_dmamem_mmap(void *v, bus_dma_segment_t *segs, int nsegs, 1343mbus_dmamem_mmap(void *v, bus_dma_segment_t *segs, int nsegs,
1345 off_t off, int prot, int flags) 1344 off_t off, int prot, int flags)
1346{ 1345{
1347 int i; 1346 int i;
1348 1347
1349 for (i = 0; i < nsegs; i++) { 1348 for (i = 0; i < nsegs; i++) {
1350#ifdef DIAGNOSTIC 1349#ifdef DIAGNOSTIC
1351 if (off & PGOFSET) 1350 if (off & PGOFSET)
1352 panic("_bus_dmamem_mmap: offset unaligned"); 1351 panic("_bus_dmamem_mmap: offset unaligned");
1353 if (segs[i].ds_addr & PGOFSET) 1352 if (segs[i].ds_addr & PGOFSET)
1354 panic("_bus_dmamem_mmap: segment unaligned"); 1353 panic("_bus_dmamem_mmap: segment unaligned");
1355 if (segs[i].ds_len & PGOFSET) 1354 if (segs[i].ds_len & PGOFSET)
1356 panic("_bus_dmamem_mmap: segment size not multiple" 1355 panic("_bus_dmamem_mmap: segment size not multiple"
1357 " of page size"); 1356 " of page size");
1358#endif /* DIAGNOSTIC */ 1357#endif /* DIAGNOSTIC */
1359 if (off >= segs[i].ds_len) { 1358 if (off >= segs[i].ds_len) {
1360 off -= segs[i].ds_len; 1359 off -= segs[i].ds_len;
1361 continue; 1360 continue;
1362 } 1361 }
1363 1362
1364 return (btop((u_long)segs[i].ds_addr + off)); 1363 return (btop((u_long)segs[i].ds_addr + off));
1365 } 1364 }
1366 1365
1367 /* Page not found. */ 1366 /* Page not found. */
1368 return (-1); 1367 return (-1);
1369} 1368}
1370 1369
1371int 1370int
1372_bus_dmamap_load_buffer(bus_dma_tag_t t, bus_dmamap_t map, void *buf, 1371_bus_dmamap_load_buffer(bus_dma_tag_t t, bus_dmamap_t map, void *buf,
1373 bus_size_t buflen, struct vmspace *vm, int flags, paddr_t *lastaddrp, 1372 bus_size_t buflen, struct vmspace *vm, int flags, paddr_t *lastaddrp,
1374 int *segp, int first) 1373 int *segp, int first)
1375{ 1374{
1376 bus_size_t sgsize; 1375 bus_size_t sgsize;
1377 bus_addr_t curaddr, lastaddr, baddr, bmask; 1376 bus_addr_t curaddr, lastaddr, baddr, bmask;
1378 vaddr_t vaddr = (vaddr_t)buf; 1377 vaddr_t vaddr = (vaddr_t)buf;
1379 int seg; 1378 int seg;
1380 pmap_t pmap; 1379 pmap_t pmap;
1381 1380
1382 pmap = vm_map_pmap(&vm->vm_map); 1381 pmap = vm_map_pmap(&vm->vm_map);
1383 1382
1384 lastaddr = *lastaddrp; 1383 lastaddr = *lastaddrp;
1385 bmask = ~(map->_dm_boundary - 1); 1384 bmask = ~(map->_dm_boundary - 1);
1386 1385
1387 for (seg = *segp; buflen > 0; ) { 1386 for (seg = *segp; buflen > 0; ) {
1388 bool ok; 1387 bool ok;
1389 /* 1388 /*
1390 * Get the physical address for this segment. 1389 * Get the physical address for this segment.
1391 */ 1390 */
1392 ok = pmap_extract(pmap, vaddr, &curaddr); 1391 ok = pmap_extract(pmap, vaddr, &curaddr);
1393 KASSERT(ok == true); 1392 KASSERT(ok == true);
1394 1393
1395 /* 1394 /*
1396 * Compute the segment size, and adjust counts. 1395 * Compute the segment size, and adjust counts.
1397 */ 1396 */
1398 sgsize = PAGE_SIZE - ((u_long)vaddr & PGOFSET); 1397 sgsize = PAGE_SIZE - ((u_long)vaddr & PGOFSET);
1399 if (buflen < sgsize) 1398 if (buflen < sgsize)
1400 sgsize = buflen; 1399 sgsize = buflen;
1401 1400
1402 /* 1401 /*
1403 * Make sure we don't cross any boundaries. 1402 * Make sure we don't cross any boundaries.
1404 */ 1403 */
1405 if (map->_dm_boundary > 0) { 1404 if (map->_dm_boundary > 0) {
1406 baddr = (curaddr + map->_dm_boundary) & bmask; 1405 baddr = (curaddr + map->_dm_boundary) & bmask;
1407 if (sgsize > (baddr - curaddr)) 1406 if (sgsize > (baddr - curaddr))
1408 sgsize = (baddr - curaddr); 1407 sgsize = (baddr - curaddr);
1409 } 1408 }
1410 1409
1411 /* 1410 /*
1412 * Insert chunk into a segment, coalescing with 1411 * Insert chunk into a segment, coalescing with
1413 * previous segment if possible. 1412 * previous segment if possible.
1414 */ 1413 */
1415 if (first) { 1414 if (first) {
1416 map->dm_segs[seg].ds_addr = curaddr; 1415 map->dm_segs[seg].ds_addr = curaddr;
1417 map->dm_segs[seg].ds_len = sgsize; 1416 map->dm_segs[seg].ds_len = sgsize;
1418 map->dm_segs[seg]._ds_va = vaddr; 1417 map->dm_segs[seg]._ds_va = vaddr;
1419 first = 0; 1418 first = 0;
1420 } else { 1419 } else {
1421 if (curaddr == lastaddr && 1420 if (curaddr == lastaddr &&
1422 (map->dm_segs[seg].ds_len + sgsize) <= 1421 (map->dm_segs[seg].ds_len + sgsize) <=
1423 map->_dm_maxsegsz && 1422 map->_dm_maxsegsz &&
1424 (map->_dm_boundary == 0 || 1423 (map->_dm_boundary == 0 ||
1425 (map->dm_segs[seg].ds_addr & bmask) == 1424 (map->dm_segs[seg].ds_addr & bmask) ==
1426 (curaddr & bmask))) 1425 (curaddr & bmask)))
1427 map->dm_segs[seg].ds_len += sgsize; 1426 map->dm_segs[seg].ds_len += sgsize;
1428 else { 1427 else {
1429 if (++seg >= map->_dm_segcnt) 1428 if (++seg >= map->_dm_segcnt)
1430 break; 1429 break;
1431 map->dm_segs[seg].ds_addr = curaddr; 1430 map->dm_segs[seg].ds_addr = curaddr;
1432 map->dm_segs[seg].ds_len = sgsize; 1431 map->dm_segs[seg].ds_len = sgsize;
1433 map->dm_segs[seg]._ds_va = vaddr; 1432 map->dm_segs[seg]._ds_va = vaddr;
1434 } 1433 }
1435 } 1434 }
1436 1435
1437 lastaddr = curaddr + sgsize; 1436 lastaddr = curaddr + sgsize;
1438 vaddr += sgsize; 1437 vaddr += sgsize;
1439 buflen -= sgsize; 1438 buflen -= sgsize;
1440 } 1439 }
1441 1440
1442 *segp = seg; 1441 *segp = seg;
1443 *lastaddrp = lastaddr; 1442 *lastaddrp = lastaddr;
1444 1443
1445 /* 1444 /*
1446 * Did we fit? 1445 * Did we fit?
1447 */ 1446 */
1448 if (buflen != 0) 1447 if (buflen != 0)
1449 return (EFBIG); /* XXX better return value here? */ 1448 return (EFBIG); /* XXX better return value here? */
1450 return (0); 1449 return (0);
1451} 1450}
1452 1451
1453const struct hppa_bus_dma_tag hppa_dmatag = { 1452const struct hppa_bus_dma_tag hppa_dmatag = {
1454 NULL, 1453 NULL,
1455 mbus_dmamap_create, mbus_dmamap_destroy, 1454 mbus_dmamap_create, mbus_dmamap_destroy,
1456 mbus_dmamap_load, mbus_dmamap_load_mbuf, 1455 mbus_dmamap_load, mbus_dmamap_load_mbuf,
1457 mbus_dmamap_load_uio, mbus_dmamap_load_raw, 1456 mbus_dmamap_load_uio, mbus_dmamap_load_raw,
1458 mbus_dmamap_unload, mbus_dmamap_sync, 1457 mbus_dmamap_unload, mbus_dmamap_sync,
1459 1458
1460 mbus_dmamem_alloc, mbus_dmamem_free, mbus_dmamem_map, 1459 mbus_dmamem_alloc, mbus_dmamem_free, mbus_dmamem_map,
1461 mbus_dmamem_unmap, mbus_dmamem_mmap 1460 mbus_dmamem_unmap, mbus_dmamem_mmap
1462}; 1461};
1463 1462
1464int 1463int
1465mbmatch(device_t parent, cfdata_t cf, void *aux) 1464mbmatch(device_t parent, cfdata_t cf, void *aux)
1466{ 1465{
1467 1466
1468 /* there will be only one */ 1467 /* there will be only one */
1469 if (mb_attached) 1468 if (mb_attached)
1470 return 0; 1469 return 0;
1471 1470
1472 return 1; 1471 return 1;
1473} 1472}
1474 1473
1475static void 1474static void
1476mb_module_callback(device_t self, struct confargs *ca) 1475mb_module_callback(device_t self, struct confargs *ca)
1477{ 1476{
1478 if (ca->ca_type.iodc_type == HPPA_TYPE_NPROC || 1477 if (ca->ca_type.iodc_type == HPPA_TYPE_NPROC ||
1479 ca->ca_type.iodc_type == HPPA_TYPE_MEMORY) 1478 ca->ca_type.iodc_type == HPPA_TYPE_MEMORY)
1480 return; 1479 return;
1481 config_found_sm_loc(self, "gedoens", NULL, ca, mbprint, mbsubmatch); 1480 config_found_sm_loc(self, "gedoens", NULL, ca, mbprint, mbsubmatch);
1482} 1481}
1483 1482
1484static void 1483static void
1485mb_cpu_mem_callback(device_t self, struct confargs *ca) 1484mb_cpu_mem_callback(device_t self, struct confargs *ca)
1486{ 1485{
1487 if ((ca->ca_type.iodc_type == HPPA_TYPE_NPROC || 1486 if ((ca->ca_type.iodc_type == HPPA_TYPE_NPROC ||
1488 ca->ca_type.iodc_type == HPPA_TYPE_MEMORY)) 1487 ca->ca_type.iodc_type == HPPA_TYPE_MEMORY))
1489 config_found_sm_loc(self, "gedoens", NULL, ca, mbprint, 1488 config_found_sm_loc(self, "gedoens", NULL, ca, mbprint,
1490 mbsubmatch); 1489 mbsubmatch);
1491} 1490}
1492 1491
1493void 1492void
1494mbattach(device_t parent, device_t self, void *aux) 1493mbattach(device_t parent, device_t self, void *aux)
1495{ 1494{
1496 struct mainbus_softc *sc = device_private(self); 1495 struct mainbus_softc *sc = device_private(self);
1497 struct confargs nca; 1496 struct confargs nca;
1498 bus_space_handle_t ioh; 1497 bus_space_handle_t ioh;
1499 hppa_hpa_t hpabase; 1498 hppa_hpa_t hpabase;
1500 1499
1501 struct iomod_openbsd { 
1502/* SRS (Supervisor Register Set) */ 
1503 u_int io_eir; /* (WO) interrupt CPU; set bits in EIR CR */ 
1504 u_int io_eim; /* (WO) External Interrupt Message address */ 
1505 u_int io_dc_rw; /* write address of IODC to read IODC data */ 
1506 u_int io_ii_rw; /* read/clear external intrpt msg (bit-26) */ 
1507 u_int io_dma_link; /* pointer to "next quad" in DMA chain */ 
1508 u_int io_dma_command; /* (RO) chain command to exec on "next quad" */ 
1509 u_int io_dma_address; /* (RO) start of DMA */ 
1510 u_int io_dma_count; /* (RO) number of bytes remaining to xfer */ 
1511 u_int io_flex; /* (WO) HPA flex addr, LSB: bus master flag */ 
1512 } *fred; 
1513 
1514 
1515 sc->sc_dv = self; 1500 sc->sc_dv = self;
1516 1501
1517 mb_attached = 1; 1502 mb_attached = 1;
1518 1503
1519 /* fetch the "default" cpu hpa */ 1504 /* fetch the "default" cpu hpa */
1520 if (pdc_call((iodcio_t)pdc, 0, PDC_HPA, PDC_HPA_DFLT, &pdc_hpa) < 0) 1505 if (pdc_call((iodcio_t)pdc, 0, PDC_HPA, PDC_HPA_DFLT, &pdc_hpa) < 0)
1521 panic("mbattach: PDC_HPA failed"); 1506 panic("mbattach: PDC_HPA failed");
1522 1507
1523 /* 1508 /*
1524 * Map all of Fixed Physical, Local Broadcast, and 1509 * Map all of Fixed Physical, Local Broadcast, and
1525 * Global Broadcast space. These spaces are adjacent 1510 * Global Broadcast space. These spaces are adjacent
1526 * and in that order and run to the end of the address 1511 * and in that order and run to the end of the address
1527 * space. 1512 * space.
1528 */ 1513 */
1529 /* 1514 /*
1530 * XXX fredette - this may be a copout, or it may 1515 * XXX fredette - this may be a copout, or it may
1531 * be a great idea. I'm not sure which yet. 1516 * be a great idea. I'm not sure which yet.
1532 */ 1517 */
1533 if (bus_space_map(&hppa_bustag, pdc_hpa.hpa, 0 - pdc_hpa.hpa, 0, &ioh)) 1518 if (bus_space_map(&hppa_bustag, pdc_hpa.hpa, 0 - pdc_hpa.hpa, 0, &ioh))
1534 panic("mbattach: can't map mainbus IO space"); 1519 panic("mbattach: can't map mainbus IO space");
1535 1520
1536 /* 1521 /*
1537 * Local-Broadcast the HPA to all modules on the bus 1522 * Local-Broadcast the HPA to all modules on the bus
1538 */ 1523 */
1539#if 0 
1540 fred = (struct iomod_openbsd *)HPPA_LBCAST; 
1541 
1542 fred->io_flex = 
1543 (pdc_hpa.hpa & FLEX_MASK) | DMA_ENABLE; 
1544#else 
1545 fred = (struct iomod_openbsd *)HPPA_LBCAST; 
1546 printf("fred->io_flex %p\n", &fred->io_flex); 
1547 ((struct iomod *)(pdc_hpa.hpa & FLEX_MASK))[FPA_IOMOD].io_flex = 1524 ((struct iomod *)(pdc_hpa.hpa & FLEX_MASK))[FPA_IOMOD].io_flex =
1548 (void *)((pdc_hpa.hpa & FLEX_MASK) | DMA_ENABLE); 1525 (void *)((pdc_hpa.hpa & FLEX_MASK) | DMA_ENABLE);
1549#endif 
1550 
1551 
1552 1526
1553 sc->sc_hpa = pdc_hpa.hpa; 1527 sc->sc_hpa = pdc_hpa.hpa;
1554 aprint_normal(" [flex %lx]\n", pdc_hpa.hpa & FLEX_MASK); 1528 aprint_normal(" [flex %lx]\n", pdc_hpa.hpa & FLEX_MASK);
1555 1529
1556 /* PDC first */ 1530 /* PDC first */
1557 memset(&nca, 0, sizeof(nca)); 1531 memset(&nca, 0, sizeof(nca));
1558 nca.ca_name = "pdc"; 1532 nca.ca_name = "pdc";
1559 nca.ca_hpa = 0; 1533 nca.ca_hpa = 0;
1560 nca.ca_iot = &hppa_bustag; 1534 nca.ca_iot = &hppa_bustag;
1561 nca.ca_dmatag = &hppa_dmatag; 1535 nca.ca_dmatag = &hppa_dmatag;
1562 config_found(self, &nca, mbprint); 1536 config_found(self, &nca, mbprint);
1563 1537
1564#if NPOWER > 0 1538#if NPOWER > 0
1565 /* get some power */ 1539 /* get some power */
1566 memset(&nca, 0, sizeof(nca)); 1540 memset(&nca, 0, sizeof(nca));
1567 nca.ca_name = "power"; 1541 nca.ca_name = "power";
1568 nca.ca_irq = -1; 1542 nca.ca_irq = -1;
1569 nca.ca_iot = &hppa_bustag; 1543 nca.ca_iot = &hppa_bustag;
1570 config_found(self, &nca, mbprint); 1544 config_found(self, &nca, mbprint);
1571#endif 1545#endif
1572 1546
1573 switch (cpu_hvers) { 1547 switch (cpu_hvers) {
1574 case HPPA_BOARD_HP809: 1548 case HPPA_BOARD_HP809:
1575 case HPPA_BOARD_HP819: 1549 case HPPA_BOARD_HP819:
1576 case HPPA_BOARD_HP829: 1550 case HPPA_BOARD_HP829:
1577 case HPPA_BOARD_HP839: 1551 case HPPA_BOARD_HP839:
1578 case HPPA_BOARD_HP849: 1552 case HPPA_BOARD_HP849:
1579 case HPPA_BOARD_HP859: 1553 case HPPA_BOARD_HP859:
1580 case HPPA_BOARD_HP869: 1554 case HPPA_BOARD_HP869:
1581#if 0 1555#if 0
1582 case HPPA_BOARD_HP770_J200: 1556 case HPPA_BOARD_HP770_J200:
1583 case HPPA_BOARD_HP770_J210: 1557 case HPPA_BOARD_HP770_J210:
1584 case HPPA_BOARD_HP770_J210XC: 1558 case HPPA_BOARD_HP770_J210XC:
1585 case HPPA_BOARD_HP780_J282: 1559 case HPPA_BOARD_HP780_J282:
1586 case HPPA_BOARD_HP782_J2240: 1560 case HPPA_BOARD_HP782_J2240:
1587#endif 1561#endif
1588 case HPPA_BOARD_HP780_C160: 1562 case HPPA_BOARD_HP780_C160:
1589 case HPPA_BOARD_HP780_C180P: 1563 case HPPA_BOARD_HP780_C180P:
1590 case HPPA_BOARD_HP780_C180XP: 1564 case HPPA_BOARD_HP780_C180XP:
1591 case HPPA_BOARD_HP780_C200: 1565 case HPPA_BOARD_HP780_C200:
1592 case HPPA_BOARD_HP780_C230: 1566 case HPPA_BOARD_HP780_C230:
1593 case HPPA_BOARD_HP780_C240: 1567 case HPPA_BOARD_HP780_C240:
1594 case HPPA_BOARD_HP785_C360: 1568 case HPPA_BOARD_HP785_C360:
1595 1569
1596 case HPPA_BOARD_HP800D: 1570 case HPPA_BOARD_HP800D:
1597 case HPPA_BOARD_HP821: 1571 case HPPA_BOARD_HP821:
1598 hpabase = HPPA_FPA; 1572 hpabase = HPPA_FPA;
1599 break; 1573 break;
1600 default: 1574 default:
1601 hpabase = 0; 1575 hpabase = 0;
1602 break; 1576 break;
1603 } 1577 }
1604 1578
1605 /* Search and attach all CPUs and memory controllers. */ 1579 /* Search and attach all CPUs and memory controllers. */
1606 memset(&nca, 0, sizeof(nca)); 1580 memset(&nca, 0, sizeof(nca));
1607 nca.ca_name = "mainbus"; 1581 nca.ca_name = "mainbus";
1608 nca.ca_hpa = 0; 1582 nca.ca_hpa = 0;
1609 nca.ca_hpabase = hpabase; 1583 nca.ca_hpabase = hpabase;
1610 nca.ca_nmodules = MAXMODBUS; 1584 nca.ca_nmodules = MAXMODBUS;
1611 nca.ca_irq = HP700CF_IRQ_UNDEF; 1585 nca.ca_irq = HP700CF_IRQ_UNDEF;
1612 nca.ca_iot = &hppa_bustag; 1586 nca.ca_iot = &hppa_bustag;
1613 nca.ca_dmatag = &hppa_dmatag; 1587 nca.ca_dmatag = &hppa_dmatag;
1614 nca.ca_dp.dp_bc[0] = nca.ca_dp.dp_bc[1] = nca.ca_dp.dp_bc[2] = 1588 nca.ca_dp.dp_bc[0] = nca.ca_dp.dp_bc[1] = nca.ca_dp.dp_bc[2] =
1615 nca.ca_dp.dp_bc[3] = nca.ca_dp.dp_bc[4] = nca.ca_dp.dp_bc[5] = -1; 1589 nca.ca_dp.dp_bc[3] = nca.ca_dp.dp_bc[4] = nca.ca_dp.dp_bc[5] = -1;
1616 nca.ca_dp.dp_mod = -1; 1590 nca.ca_dp.dp_mod = -1;
1617 pdc_scanbus(self, &nca, mb_cpu_mem_callback); 1591 pdc_scanbus(self, &nca, mb_cpu_mem_callback);
1618 1592
1619 /* Search for IO hardware. */ 1593 /* Search for IO hardware. */
1620 memset(&nca, 0, sizeof(nca)); 1594 memset(&nca, 0, sizeof(nca));
1621 nca.ca_name = "mainbus"; 1595 nca.ca_name = "mainbus";
1622 nca.ca_hpa = 0; 1596 nca.ca_hpa = 0;
1623 nca.ca_hpabase = hpabase; 1597 nca.ca_hpabase = hpabase;
1624 nca.ca_nmodules = MAXMODBUS; 1598 nca.ca_nmodules = MAXMODBUS;
1625 nca.ca_irq = HP700CF_IRQ_UNDEF; 1599 nca.ca_irq = HP700CF_IRQ_UNDEF;
1626 nca.ca_iot = &hppa_bustag; 1600 nca.ca_iot = &hppa_bustag;
1627 nca.ca_dmatag = &hppa_dmatag; 1601 nca.ca_dmatag = &hppa_dmatag;
1628 nca.ca_dp.dp_bc[0] = nca.ca_dp.dp_bc[1] = nca.ca_dp.dp_bc[2] = 1602 nca.ca_dp.dp_bc[0] = nca.ca_dp.dp_bc[1] = nca.ca_dp.dp_bc[2] =
1629 nca.ca_dp.dp_bc[3] = nca.ca_dp.dp_bc[4] = nca.ca_dp.dp_bc[5] = -1; 1603 nca.ca_dp.dp_bc[3] = nca.ca_dp.dp_bc[4] = nca.ca_dp.dp_bc[5] = -1;
1630 nca.ca_dp.dp_mod = -1; 1604 nca.ca_dp.dp_mod = -1;
1631 pdc_scanbus(self, &nca, mb_module_callback); 1605 pdc_scanbus(self, &nca, mb_module_callback);
1632} 1606}
1633 1607
1634/* 1608/*
1635 * retrive CPU #N HPA value 1609 * retrive CPU #N HPA value
1636 */ 1610 */
1637hppa_hpa_t 1611hppa_hpa_t
1638cpu_gethpa(int n) 1612cpu_gethpa(int n)
1639{ 1613{
1640 struct mainbus_softc *sc; 1614 struct mainbus_softc *sc;
1641 1615
1642 sc = device_lookup_private(&mainbus_cd, 0); 1616 sc = device_lookup_private(&mainbus_cd, 0);
1643 1617
1644 return sc->sc_hpa; 1618 return sc->sc_hpa;
1645} 1619}
1646 1620
1647int 1621int
1648mbprint(void *aux, const char *pnp) 1622mbprint(void *aux, const char *pnp)
1649{ 1623{
1650 int n; 1624 int n;
1651 struct confargs *ca = aux; 1625 struct confargs *ca = aux;
1652 1626
1653 if (pnp) 1627 if (pnp)
1654 aprint_normal("\"%s\" at %s (type 0x%x, sv 0x%x)", ca->ca_name, 1628 aprint_normal("\"%s\" at %s (type 0x%x, sv 0x%x)", ca->ca_name,
1655 pnp, ca->ca_type.iodc_type, ca->ca_type.iodc_sv_model); 1629 pnp, ca->ca_type.iodc_type, ca->ca_type.iodc_sv_model);
1656 if (ca->ca_hpa) { 1630 if (ca->ca_hpa) {
1657 aprint_normal(" hpa 0x%lx path ", ca->ca_hpa); 1631 aprint_normal(" hpa 0x%lx path ", ca->ca_hpa);
1658 for (n = 0 ; n < 6 ; n++) { 1632 for (n = 0 ; n < 6 ; n++) {
1659 if ( ca->ca_dp.dp_bc[n] >= 0) 1633 if ( ca->ca_dp.dp_bc[n] >= 0)
1660 printf( "%d/", ca->ca_dp.dp_bc[n]); 1634 printf( "%d/", ca->ca_dp.dp_bc[n]);
1661 } 1635 }
1662 aprint_normal( "%d", ca->ca_dp.dp_mod); 1636 aprint_normal( "%d", ca->ca_dp.dp_mod);
1663 if (!pnp && ca->ca_irq >= 0) { 1637 if (!pnp && ca->ca_irq >= 0) {
1664 aprint_normal(" irq %d", ca->ca_irq); 1638 aprint_normal(" irq %d", ca->ca_irq);
1665 if (ca->ca_type.iodc_type != HPPA_TYPE_BHA) 1639 if (ca->ca_type.iodc_type != HPPA_TYPE_BHA)
1666 aprint_normal(" ipl %d", 1640 aprint_normal(" ipl %d",
1667 _hp700_intr_ipl_next()); 1641 _hp700_intr_ipl_next());
1668 } 1642 }
1669 } 1643 }
1670 1644
1671 return (UNCONF); 1645 return (UNCONF);
1672} 1646}
1673 1647
1674int 1648int
1675mbsubmatch(device_t parent, cfdata_t cf, const int *ldesc, void *aux) 1649mbsubmatch(device_t parent, cfdata_t cf, const int *ldesc, void *aux)
1676{ 1650{
1677 struct confargs *ca = aux; 1651 struct confargs *ca = aux;
1678 int ret; 1652 int ret;
1679 int saved_irq; 1653 int saved_irq;
1680 1654
1681 saved_irq = ca->ca_irq; 1655 saved_irq = ca->ca_irq;
1682 if (cf->hp700cf_irq != HP700CF_IRQ_UNDEF) 1656 if (cf->hp700cf_irq != HP700CF_IRQ_UNDEF)
1683 ca->ca_irq = cf->hp700cf_irq; 1657 ca->ca_irq = cf->hp700cf_irq;
1684 if (!(ret = config_match(parent, cf, aux))) 1658 if (!(ret = config_match(parent, cf, aux)))
1685 ca->ca_irq = saved_irq; 1659 ca->ca_irq = saved_irq;
1686 return ret; 1660 return ret;
1687} 1661}