pci_swiz_bus_mem_chipdep.c revision 1.1
1/*	$OpenBSD: pci_swiz_bus_mem_chipdep.c,v 1.1 2001/02/06 19:26:39 art Exp $	*/
2/*	$NetBSD: pcs_bus_mem_common.c,v 1.15 1996/12/02 22:19:36 cgd Exp $	*/
3
4/*
5 * Copyright (c) 1995, 1996 Carnegie-Mellon University.
6 * All rights reserved.
7 *
8 * Author: Chris G. Demetriou
9 *
10 * Permission to use, copy, modify and distribute this software and
11 * its documentation is hereby granted, provided that both the copyright
12 * notice and this permission notice appear in all copies of the
13 * software, derivative works or modified versions, and any portions
14 * thereof, and that both notices appear in supporting documentation.
15 *
16 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
17 * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND
18 * FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
19 *
20 * Carnegie Mellon requests users of this software to return to
21 *
22 *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
23 *  School of Computer Science
24 *  Carnegie Mellon University
25 *  Pittsburgh PA 15213-3890
26 *
27 * any improvements or extensions that they make and grant Carnegie the
28 * rights to redistribute these changes.
29 */
30
31/*
32 * Common PCI Chipset "bus I/O" functions, for chipsets which have to
33 * deal with only a single PCI interface chip in a machine.
34 *
35 * uses:
36 *	CHIP		name of the 'chip' it's being compiled for.
37 *	CHIP_D_MEM_BASE	Dense Mem space base to use.
38 *	CHIP_S_MEM_BASE	Sparse Mem space base to use.
39 */
40
41#include <sys/extent.h>
42
43#define	__C(A,B)	__CONCAT(A,B)
44#define	__S(S)		__STRING(S)
45
46/* mapping/unmapping */
47int		__C(CHIP,_mem_map) __P((void *, bus_addr_t, bus_size_t, int,
48		    bus_space_handle_t *));
49void		__C(CHIP,_mem_unmap) __P((void *, bus_space_handle_t,
50		    bus_size_t));
51int		__C(CHIP,_mem_subregion) __P((void *, bus_space_handle_t,
52		    bus_size_t, bus_size_t, bus_space_handle_t *));
53
54/* allocation/deallocation */
55int		__C(CHIP,_mem_alloc) __P((void *, bus_addr_t, bus_addr_t,
56		    bus_size_t, bus_size_t, bus_addr_t, int, bus_addr_t *,
57                    bus_space_handle_t *));
58void		__C(CHIP,_mem_free) __P((void *, bus_space_handle_t,
59		    bus_size_t));
60
61/* barrier */
62inline void	__C(CHIP,_mem_barrier) __P((void *, bus_space_handle_t,
63		    bus_size_t, bus_size_t, int));
64
65/* read (single) */
66inline u_int8_t	__C(CHIP,_mem_read_1) __P((void *, bus_space_handle_t,
67		    bus_size_t));
68inline u_int16_t __C(CHIP,_mem_read_2) __P((void *, bus_space_handle_t,
69		    bus_size_t));
70inline u_int32_t __C(CHIP,_mem_read_4) __P((void *, bus_space_handle_t,
71		    bus_size_t));
72inline u_int64_t __C(CHIP,_mem_read_8) __P((void *, bus_space_handle_t,
73		    bus_size_t));
74
75/* read multiple */
76void		__C(CHIP,_mem_read_multi_1) __P((void *, bus_space_handle_t,
77		    bus_size_t, u_int8_t *, bus_size_t));
78void		__C(CHIP,_mem_read_multi_2) __P((void *, bus_space_handle_t,
79		    bus_size_t, u_int16_t *, bus_size_t));
80void		__C(CHIP,_mem_read_multi_4) __P((void *, bus_space_handle_t,
81		    bus_size_t, u_int32_t *, bus_size_t));
82void		__C(CHIP,_mem_read_multi_8) __P((void *, bus_space_handle_t,
83		    bus_size_t, u_int64_t *, bus_size_t));
84
85/* read region */
86void		__C(CHIP,_mem_read_region_1) __P((void *, bus_space_handle_t,
87		    bus_size_t, u_int8_t *, bus_size_t));
88void		__C(CHIP,_mem_read_region_2) __P((void *, bus_space_handle_t,
89		    bus_size_t, u_int16_t *, bus_size_t));
90void		__C(CHIP,_mem_read_region_4) __P((void *, bus_space_handle_t,
91		    bus_size_t, u_int32_t *, bus_size_t));
92void		__C(CHIP,_mem_read_region_8) __P((void *, bus_space_handle_t,
93		    bus_size_t, u_int64_t *, bus_size_t));
94
95/* write (single) */
96inline void	__C(CHIP,_mem_write_1) __P((void *, bus_space_handle_t,
97		    bus_size_t, u_int8_t));
98inline void	__C(CHIP,_mem_write_2) __P((void *, bus_space_handle_t,
99		    bus_size_t, u_int16_t));
100inline void	__C(CHIP,_mem_write_4) __P((void *, bus_space_handle_t,
101		    bus_size_t, u_int32_t));
102inline void	__C(CHIP,_mem_write_8) __P((void *, bus_space_handle_t,
103		    bus_size_t, u_int64_t));
104
105/* write multiple */
106void		__C(CHIP,_mem_write_multi_1) __P((void *, bus_space_handle_t,
107		    bus_size_t, const u_int8_t *, bus_size_t));
108void		__C(CHIP,_mem_write_multi_2) __P((void *, bus_space_handle_t,
109		    bus_size_t, const u_int16_t *, bus_size_t));
110void		__C(CHIP,_mem_write_multi_4) __P((void *, bus_space_handle_t,
111		    bus_size_t, const u_int32_t *, bus_size_t));
112void		__C(CHIP,_mem_write_multi_8) __P((void *, bus_space_handle_t,
113		    bus_size_t, const u_int64_t *, bus_size_t));
114
115/* write region */
116void		__C(CHIP,_mem_write_region_1) __P((void *, bus_space_handle_t,
117		    bus_size_t, const u_int8_t *, bus_size_t));
118void		__C(CHIP,_mem_write_region_2) __P((void *, bus_space_handle_t,
119		    bus_size_t, const u_int16_t *, bus_size_t));
120void		__C(CHIP,_mem_write_region_4) __P((void *, bus_space_handle_t,
121		    bus_size_t, const u_int32_t *, bus_size_t));
122void		__C(CHIP,_mem_write_region_8) __P((void *, bus_space_handle_t,
123		    bus_size_t, const u_int64_t *, bus_size_t));
124
125/* set multiple */
126void		__C(CHIP,_mem_set_multi_1) __P((void *, bus_space_handle_t,
127		    bus_size_t, u_int8_t, bus_size_t));
128void		__C(CHIP,_mem_set_multi_2) __P((void *, bus_space_handle_t,
129		    bus_size_t, u_int16_t, bus_size_t));
130void		__C(CHIP,_mem_set_multi_4) __P((void *, bus_space_handle_t,
131		    bus_size_t, u_int32_t, bus_size_t));
132void		__C(CHIP,_mem_set_multi_8) __P((void *, bus_space_handle_t,
133		    bus_size_t, u_int64_t, bus_size_t));
134
135/* set region */
136void		__C(CHIP,_mem_set_region_1) __P((void *, bus_space_handle_t,
137		    bus_size_t, u_int8_t, bus_size_t));
138void		__C(CHIP,_mem_set_region_2) __P((void *, bus_space_handle_t,
139		    bus_size_t, u_int16_t, bus_size_t));
140void		__C(CHIP,_mem_set_region_4) __P((void *, bus_space_handle_t,
141		    bus_size_t, u_int32_t, bus_size_t));
142void		__C(CHIP,_mem_set_region_8) __P((void *, bus_space_handle_t,
143		    bus_size_t, u_int64_t, bus_size_t));
144
145/* copy */
146void		__C(CHIP,_mem_copy_1) __P((void *, bus_space_handle_t,
147		    bus_size_t, bus_space_handle_t, bus_size_t, bus_size_t));
148void		__C(CHIP,_mem_copy_2) __P((void *, bus_space_handle_t,
149		    bus_size_t, bus_space_handle_t, bus_size_t, bus_size_t));
150void		__C(CHIP,_mem_copy_4) __P((void *, bus_space_handle_t,
151		    bus_size_t, bus_space_handle_t, bus_size_t, bus_size_t));
152void		__C(CHIP,_mem_copy_8) __P((void *, bus_space_handle_t,
153		    bus_size_t, bus_space_handle_t, bus_size_t, bus_size_t));
154
155/* read multiple raw */
156void		__C(CHIP,_mem_read_raw_multi_2) __P((void *,
157		    bus_space_handle_t, bus_size_t, u_int8_t *, bus_size_t));
158void		__C(CHIP,_mem_read_raw_multi_4) __P((void *,
159		    bus_space_handle_t, bus_size_t, u_int8_t *, bus_size_t));
160void		__C(CHIP,_mem_read_raw_multi_8) __P((void *,
161		    bus_space_handle_t, bus_size_t, u_int8_t *, bus_size_t));
162
163/* write multiple raw */
164void		__C(CHIP,_mem_write_raw_multi_2) __P((void *,
165		    bus_space_handle_t, bus_size_t, const u_int8_t *,
166		    bus_size_t));
167void		__C(CHIP,_mem_write_raw_multi_4) __P((void *,
168		    bus_space_handle_t, bus_size_t, const u_int8_t *,
169		    bus_size_t));
170void		__C(CHIP,_mem_write_raw_multi_8) __P((void *,
171		    bus_space_handle_t, bus_size_t, const u_int8_t *,
172		    bus_size_t));
173
174static long
175    __C(CHIP,_dmem_ex_storage)[EXTENT_FIXED_STORAGE_SIZE(8) / sizeof(long)];
176static long
177    __C(CHIP,_smem_ex_storage)[EXTENT_FIXED_STORAGE_SIZE(8) / sizeof(long)];
178
179static struct alpha_bus_space __C(CHIP,_mem_space) = {
180	/* cookie */
181	NULL,
182
183	/* mapping/unmapping */
184	__C(CHIP,_mem_map),
185	__C(CHIP,_mem_unmap),
186	__C(CHIP,_mem_subregion),
187
188	/* allocation/deallocation */
189	__C(CHIP,_mem_alloc),
190	__C(CHIP,_mem_free),
191
192	/* barrier */
193	__C(CHIP,_mem_barrier),
194
195	/* read (single) */
196	__C(CHIP,_mem_read_1),
197	__C(CHIP,_mem_read_2),
198	__C(CHIP,_mem_read_4),
199	__C(CHIP,_mem_read_8),
200
201	/* read multiple */
202	__C(CHIP,_mem_read_multi_1),
203	__C(CHIP,_mem_read_multi_2),
204	__C(CHIP,_mem_read_multi_4),
205	__C(CHIP,_mem_read_multi_8),
206
207	/* read region */
208	__C(CHIP,_mem_read_region_1),
209	__C(CHIP,_mem_read_region_2),
210	__C(CHIP,_mem_read_region_4),
211	__C(CHIP,_mem_read_region_8),
212
213	/* write (single) */
214	__C(CHIP,_mem_write_1),
215	__C(CHIP,_mem_write_2),
216	__C(CHIP,_mem_write_4),
217	__C(CHIP,_mem_write_8),
218
219	/* write multiple */
220	__C(CHIP,_mem_write_multi_1),
221	__C(CHIP,_mem_write_multi_2),
222	__C(CHIP,_mem_write_multi_4),
223	__C(CHIP,_mem_write_multi_8),
224
225	/* write region */
226	__C(CHIP,_mem_write_region_1),
227	__C(CHIP,_mem_write_region_2),
228	__C(CHIP,_mem_write_region_4),
229	__C(CHIP,_mem_write_region_8),
230
231	/* set multiple */
232	__C(CHIP,_mem_set_multi_1),
233	__C(CHIP,_mem_set_multi_2),
234	__C(CHIP,_mem_set_multi_4),
235	__C(CHIP,_mem_set_multi_8),
236
237	/* set region */
238	__C(CHIP,_mem_set_region_1),
239	__C(CHIP,_mem_set_region_2),
240	__C(CHIP,_mem_set_region_4),
241	__C(CHIP,_mem_set_region_8),
242
243	/* copy */
244	__C(CHIP,_mem_copy_1),
245	__C(CHIP,_mem_copy_2),
246	__C(CHIP,_mem_copy_4),
247	__C(CHIP,_mem_copy_8),
248
249	/* read multiple raw */
250	__C(CHIP,_mem_read_raw_multi_2),
251	__C(CHIP,_mem_read_raw_multi_4),
252	__C(CHIP,_mem_read_raw_multi_8),
253
254	/* write multiple raw*/
255	__C(CHIP,_mem_write_raw_multi_2),
256	__C(CHIP,_mem_write_raw_multi_4),
257	__C(CHIP,_mem_write_raw_multi_8),
258};
259
260bus_space_tag_t
261__C(CHIP,_bus_mem_init)(v)
262	void *v;
263{
264        bus_space_tag_t t = &__C(CHIP,_mem_space);
265	struct extent *dex, *sex;
266
267	t->abs_cookie = v;
268
269	/* XXX WE WANT EXTENT_NOCOALESCE, BUT WE CAN'T USE IT. XXX */
270	dex = extent_create(__S(__C(CHIP,_bus_dmem)), 0x0UL,
271	    0xffffffffffffffffUL, M_DEVBUF,
272	    (caddr_t)__C(CHIP,_dmem_ex_storage),
273	    sizeof(__C(CHIP,_dmem_ex_storage)), EX_NOWAIT);
274	extent_alloc_region(dex, 0, 0xffffffffffffffffUL, EX_NOWAIT);
275
276#ifdef CHIP_D_MEM_W1_BUS_START
277#ifdef EXTENT_DEBUG
278	printf("dmem: freeing from 0x%lx to 0x%lx\n",
279	    CHIP_D_MEM_W1_BUS_START(v), CHIP_D_MEM_W1_BUS_END(v));
280#endif
281	extent_free(dex, CHIP_D_MEM_W1_BUS_START(v),
282	    CHIP_D_MEM_W1_BUS_END(v) - CHIP_D_MEM_W1_BUS_START(v) + 1,
283	    EX_NOWAIT);
284#endif
285
286#ifdef EXTENT_DEBUG
287        extent_print(dex);
288#endif
289        CHIP_D_MEM_EXTENT(v) = dex;
290
291	/* XXX WE WANT EXTENT_NOCOALESCE, BUT WE CAN'T USE IT. XXX */
292	sex = extent_create(__S(__C(CHIP,_bus_smem)), 0x0UL,
293	    0xffffffffffffffffUL, M_DEVBUF,
294	    (caddr_t)__C(CHIP,_smem_ex_storage),
295	    sizeof(__C(CHIP,_smem_ex_storage)), EX_NOWAIT);
296	extent_alloc_region(sex, 0, 0xffffffffffffffffUL, EX_NOWAIT);
297
298#ifdef CHIP_S_MEM_W1_BUS_START
299#ifdef EXTENT_DEBUG
300	printf("smem: freeing from 0x%lx to 0x%lx\n",
301	    CHIP_S_MEM_W1_BUS_START(v), CHIP_S_MEM_W1_BUS_END(v));
302#endif
303	extent_free(sex, CHIP_S_MEM_W1_BUS_START(v),
304	    CHIP_S_MEM_W1_BUS_END(v) - CHIP_S_MEM_W1_BUS_START(v) + 1,
305	    EX_NOWAIT);
306#endif
307#ifdef CHIP_S_MEM_W2_BUS_START
308	if (CHIP_S_MEM_W2_BUS_START(v) != CHIP_S_MEM_W1_BUS_START(v)) {
309#ifdef EXTENT_DEBUG
310		printf("smem: freeing from 0x%lx to 0x%lx\n",
311		    CHIP_S_MEM_W2_BUS_START(v), CHIP_S_MEM_W2_BUS_END(v));
312#endif
313		extent_free(sex, CHIP_S_MEM_W2_BUS_START(v),
314		    CHIP_S_MEM_W2_BUS_END(v) - CHIP_S_MEM_W2_BUS_START(v) + 1,
315		    EX_NOWAIT);
316	} else {
317#ifdef EXTENT_DEBUG
318		printf("smem: window 2 (0x%lx to 0x%lx) overlaps window 1\n",
319		    CHIP_S_MEM_W2_BUS_START(v), CHIP_S_MEM_W2_BUS_END(v));
320#endif
321	}
322#endif
323#ifdef CHIP_S_MEM_W3_BUS_START
324	if (CHIP_S_MEM_W3_BUS_START(v) != CHIP_S_MEM_W1_BUS_START(v) &&
325	    CHIP_S_MEM_W3_BUS_START(v) != CHIP_S_MEM_W2_BUS_START(v)) {
326#ifdef EXTENT_DEBUG
327		printf("smem: freeing from 0x%lx to 0x%lx\n",
328		    CHIP_S_MEM_W3_BUS_START(v), CHIP_S_MEM_W3_BUS_END(v));
329#endif
330		extent_free(sex, CHIP_S_MEM_W3_BUS_START(v),
331		    CHIP_S_MEM_W3_BUS_END(v) - CHIP_S_MEM_W3_BUS_START(v) + 1,
332		    EX_NOWAIT);
333	} else {
334#ifdef EXTENT_DEBUG
335		printf("smem: window 2 (0x%lx to 0x%lx) overlaps window 1\n",
336		    CHIP_S_MEM_W2_BUS_START(v), CHIP_S_MEM_W2_BUS_END(v));
337#endif
338	}
339#endif
340
341#ifdef EXTENT_DEBUG
342        extent_print(sex);
343#endif
344        CHIP_S_MEM_EXTENT(v) = sex;
345
346	return (t);
347}
348
349static int	__C(CHIP,_xlate_addr_to_dense_handle) __P((void *,
350		    bus_addr_t, bus_space_handle_t *));
351static int	__C(CHIP,_xlate_dense_handle_to_addr) __P((void *,
352		    bus_space_handle_t, bus_addr_t *));
353static int	__C(CHIP,_xlate_addr_to_sparse_handle) __P((void *,
354		    bus_addr_t, bus_space_handle_t *));
355static int	__C(CHIP,_xlate_sparse_handle_to_addr) __P((void *,
356		    bus_space_handle_t, bus_addr_t *));
357
358static int
359__C(CHIP,_xlate_addr_to_dense_handle)(v, memaddr, memhp)
360	void *v;
361	bus_addr_t memaddr;
362	bus_space_handle_t *memhp;
363{
364#ifdef CHIP_D_MEM_W1_BUS_START
365	if (memaddr >= CHIP_D_MEM_W1_BUS_START(v) &&
366	    memaddr <= CHIP_D_MEM_W1_BUS_END(v)) {
367		*memhp = ALPHA_PHYS_TO_K0SEG(CHIP_D_MEM_W1_SYS_START(v)) +
368		    (memaddr - CHIP_D_MEM_W1_BUS_START(v));
369		return (1);
370	} else
371#endif
372		return (0);
373}
374
375static int
376__C(CHIP,_xlate_dense_handle_to_addr)(v, memh, memaddrp)
377	void *v;
378	bus_space_handle_t memh;
379	bus_addr_t *memaddrp;
380{
381
382	memh = ALPHA_K0SEG_TO_PHYS(memh);
383
384#ifdef CHIP_D_MEM_W1_BUS_START
385	if (memh >= CHIP_D_MEM_W1_SYS_START(v) &&
386	    memh <= CHIP_D_MEM_W1_SYS_END(v)) {
387		*memaddrp = CHIP_D_MEM_W1_BUS_START(v) +
388		    (memh - CHIP_D_MEM_W1_SYS_START(v));
389		return (1);
390	} else
391#endif
392		return (0);
393}
394
395static int
396__C(CHIP,_xlate_addr_to_sparse_handle)(v, memaddr, memhp)
397	void *v;
398	bus_addr_t memaddr;
399	bus_space_handle_t *memhp;
400{
401
402#ifdef CHIP_S_MEM_W1_BUS_START
403	if (memaddr >= CHIP_S_MEM_W1_BUS_START(v) &&
404	    memaddr <= CHIP_S_MEM_W1_BUS_END(v)) {
405		*memhp =
406		    (ALPHA_PHYS_TO_K0SEG(CHIP_S_MEM_W1_SYS_START(v)) >> 5) +
407		    (memaddr - CHIP_S_MEM_W1_BUS_START(v));
408		return (1);
409	} else
410#endif
411#ifdef CHIP_S_MEM_W2_BUS_START
412	if (memaddr >= CHIP_S_MEM_W2_BUS_START(v) &&
413	    memaddr <= CHIP_S_MEM_W2_BUS_END(v)) {
414		*memhp =
415		    (ALPHA_PHYS_TO_K0SEG(CHIP_S_MEM_W2_SYS_START(v)) >> 5) +
416		    (memaddr - CHIP_S_MEM_W2_BUS_START(v));
417		return (1);
418	} else
419#endif
420#ifdef CHIP_S_MEM_W3_BUS_START
421	if (memaddr >= CHIP_S_MEM_W3_BUS_START(v) &&
422	    memaddr <= CHIP_S_MEM_W3_BUS_END(v)) {
423		*memhp =
424		    (ALPHA_PHYS_TO_K0SEG(CHIP_S_MEM_W3_SYS_START(v)) >> 5) +
425		    (memaddr - CHIP_S_MEM_W3_BUS_START(v));
426		return (1);
427	} else
428#endif
429		return (0);
430}
431
432static int
433__C(CHIP,_xlate_sparse_handle_to_addr)(v, memh, memaddrp)
434	void *v;
435	bus_space_handle_t memh;
436	bus_addr_t *memaddrp;
437{
438
439	memh = ALPHA_K0SEG_TO_PHYS(memh << 5) >> 5;
440
441#ifdef CHIP_S_MEM_W1_BUS_START
442	if ((memh << 5) >= CHIP_S_MEM_W1_SYS_START(v) &&
443	    (memh << 5) <= CHIP_S_MEM_W1_SYS_END(v)) {
444		*memaddrp = CHIP_S_MEM_W1_BUS_START(v) +
445		    (memh - (CHIP_S_MEM_W1_SYS_START(v) >> 5));
446		return (1);
447	} else
448#endif
449#ifdef CHIP_S_MEM_W2_BUS_START
450	if ((memh << 5) >= CHIP_S_MEM_W2_SYS_START(v) &&
451	    (memh << 5) <= CHIP_S_MEM_W2_SYS_END(v)) {
452		*memaddrp = CHIP_S_MEM_W2_BUS_START(v) +
453		    (memh - (CHIP_S_MEM_W2_SYS_START(v) >> 5));
454		return (1);
455	} else
456#endif
457#ifdef CHIP_S_MEM_W3_BUS_START
458	if ((memh << 5) >= CHIP_S_MEM_W3_SYS_START(v) &&
459	    (memh << 5) <= CHIP_S_MEM_W3_SYS_END(v)) {
460		*memaddrp = CHIP_S_MEM_W3_BUS_START(v) +
461		    (memh - (CHIP_S_MEM_W3_SYS_START(v) >> 5));
462		return (1);
463	} else
464#endif
465		return (0);
466}
467
468int
469__C(CHIP,_mem_map)(v, memaddr, memsize, cacheable, memhp)
470	void *v;
471	bus_addr_t memaddr;
472	bus_size_t memsize;
473	int cacheable;
474	bus_space_handle_t *memhp;
475{
476	bus_space_handle_t dh = 0, sh = 0;	/* XXX -Wuninitialized */
477	int didd, dids, errord, errors, mustd, musts;
478
479	mustd = 1;
480	musts = (cacheable == 0);
481
482#ifdef EXTENT_DEBUG
483	printf("mem: allocating 0x%lx to 0x%lx\n", memaddr,
484	    memaddr + memsize - 1);
485	printf("mem: %s dense, %s sparse\n", mustd ? "need" : "want",
486	    musts ? "need" : "want");
487#endif
488	errord = extent_alloc_region(CHIP_D_MEM_EXTENT(v), memaddr, memsize,
489	    EX_NOWAIT | (CHIP_EX_MALLOC_SAFE(v) ? EX_MALLOCOK : 0));
490	didd = (errord == 0);
491	errors = extent_alloc_region(CHIP_S_MEM_EXTENT(v), memaddr, memsize,
492	    EX_NOWAIT | (CHIP_EX_MALLOC_SAFE(v) ? EX_MALLOCOK : 0));
493	dids = (errors == 0);
494
495#ifdef EXTENT_DEBUG
496	if (!didd)
497		printf("mem: failed to get dense (%d)\n", errord);
498	if (!dids)
499		printf("mem: failed to get sparse (%d)\n", errors);
500#endif
501
502	if ((mustd && !didd) || (musts && !dids))
503		goto bad;
504
505	if (didd && !__C(CHIP,_xlate_addr_to_dense_handle)(v, memaddr, &dh)) {
506		printf("\n");
507#ifdef CHIP_D_MEM_W1_BUS_START
508		printf("%s: window[1]=0x%lx-0x%lx\n", __S(__C(CHIP,_mem_map)),
509		    CHIP_D_MEM_W1_BUS_START(v), CHIP_D_MEM_W1_BUS_END(v));
510#endif
511		panic("%s: don't know how to map %lx cacheable",
512		    __S(__C(CHIP,_mem_map)), memaddr);
513	}
514
515	if (dids && !__C(CHIP,_xlate_addr_to_sparse_handle)(v, memaddr, &sh)) {
516		printf("\n");
517#ifdef CHIP_S_MEM_W1_BUS_START
518		printf("%s: window[1]=0x%lx-0x%lx\n", __S(__C(CHIP,_mem_map)),
519		    CHIP_S_MEM_W1_BUS_START(v), CHIP_S_MEM_W1_BUS_END(v));
520#endif
521#ifdef CHIP_S_MEM_W2_BUS_START
522		printf("%s: window[2]=0x%lx-0x%lx\n", __S(__C(CHIP,_mem_map)),
523		    CHIP_S_MEM_W2_BUS_START(v), CHIP_S_MEM_W2_BUS_END(v));
524#endif
525#ifdef CHIP_S_MEM_W3_BUS_START
526		printf("%s: window[3]=0x%lx-0x%lx\n", __S(__C(CHIP,_mem_map)),
527		    CHIP_S_MEM_W3_BUS_START(v), CHIP_S_MEM_W3_BUS_END(v));
528#endif
529		panic("%s: don't know how to map %lx non-cacheable",
530		    __S(__C(CHIP,_mem_map)), memaddr);
531	}
532
533	if (cacheable)
534		*memhp = dh;
535	else
536		*memhp = sh;
537	return (0);
538
539bad:
540#ifdef EXTENT_DEBUG
541	printf("mem: failed\n");
542#endif
543	if (didd) {
544#ifdef EXTENT_DEBUG
545	printf("mem: freeing dense\n");
546#endif
547		if (extent_free(CHIP_D_MEM_EXTENT(v), memaddr, memsize,
548		    EX_NOWAIT | (CHIP_EX_MALLOC_SAFE(v) ? EX_MALLOCOK : 0)) != 0) {
549			printf("%s: WARNING: couldn't free dense 0x%lx-0x%lx\n",
550			    __S(__C(CHIP,_mem_map)), memaddr,
551			    memaddr + memsize - 1);
552		}
553	}
554	if (dids) {
555#ifdef EXTENT_DEBUG
556	printf("mem: freeing sparse\n");
557#endif
558		if (extent_free(CHIP_S_MEM_EXTENT(v), memaddr, memsize,
559		    EX_NOWAIT | (CHIP_EX_MALLOC_SAFE(v) ? EX_MALLOCOK : 0)) != 0) {
560			printf("%s: WARNING: couldn't free sparse 0x%lx-0x%lx\n",
561			    __S(__C(CHIP,_mem_map)), memaddr,
562			    memaddr + memsize - 1);
563		}
564	}
565
566#ifdef EXTENT_DEBUG
567	extent_print(CHIP_D_MEM_EXTENT(v));
568	extent_print(CHIP_S_MEM_EXTENT(v));
569#endif
570
571	/*
572	 * return dense error if we needed it but couldn't get it, else
573	 * sparse error.  The error _has_ to be one of the two...
574	 */
575	return (mustd && !didd ? errord : (musts && !dids ? errors : EINVAL));
576}
577
578void
579__C(CHIP,_mem_unmap)(v, memh, memsize)
580	void *v;
581	bus_space_handle_t memh;
582	bus_size_t memsize;
583{
584	bus_addr_t memaddr;
585	bus_space_handle_t temph;
586	int sparse, haves, haved;
587
588#ifdef EXTENT_DEBUG
589	printf("mem: freeing handle 0x%lx for 0x%lx\n", memh, memsize);
590#endif
591
592	/*
593	 * Find out what space we're in.
594	 */
595	sparse = ((memh >> 63) == 0);
596
597	/*
598	 * Find out what address we're in in that space.
599	 */
600	haves = haved = 0;
601	if (sparse)
602		haves = __C(CHIP,_xlate_sparse_handle_to_addr)(v, memh,
603		    &memaddr);
604	else
605		haved = __C(CHIP,_xlate_dense_handle_to_addr)(v, memh,
606		    &memaddr);
607
608	if (!haves && !haved)
609		panic("%s: couldn't get addr from %s handle 0x%lx",
610		    __S(__C(CHIP,_mem_unmap)), sparse ? "sparse" : "dense",
611		    memh);
612
613	/*
614	 * Find out were/if that address lives in the other space.
615	 */
616	if (sparse)
617		haved = __C(CHIP,_xlate_addr_to_dense_handle)(v, memaddr,
618		    &temph);
619	else
620		haves = __C(CHIP,_xlate_addr_to_sparse_handle)(v, memaddr,
621		    &temph);
622
623	/*
624	 * Free any ranges we have.
625	 */
626#ifdef EXTENT_DEBUG
627	printf("mem: it's at 0x%lx (%sdense, %ssparse)\n", memaddr,
628	    haved ? "" : "not ", haves ? "" : "not ");
629#endif
630	if (haved && extent_free(CHIP_D_MEM_EXTENT(v), memaddr, memsize,
631	    EX_NOWAIT | (CHIP_EX_MALLOC_SAFE(v) ? EX_MALLOCOK : 0)) != 0) {
632		printf("%s: WARNING: couldn't free dense 0x%lx-0x%lx\n",
633		    __S(__C(CHIP,_mem_map)), memaddr,
634		    memaddr + memsize - 1);
635	}
636	if (haves && extent_free(CHIP_S_MEM_EXTENT(v), memaddr, memsize,
637	    EX_NOWAIT | (CHIP_EX_MALLOC_SAFE(v) ? EX_MALLOCOK : 0)) != 0) {
638		printf("%s: WARNING: couldn't free sparse 0x%lx-0x%lx\n",
639		    __S(__C(CHIP,_mem_map)), memaddr,
640		    memaddr + memsize - 1);
641	}
642}
643
644int
645__C(CHIP,_mem_subregion)(v, memh, offset, size, nmemh)
646	void *v;
647	bus_space_handle_t memh, *nmemh;
648	bus_size_t offset, size;
649{
650
651	*nmemh = memh + offset;
652	return (0);
653}
654
655int
656__C(CHIP,_mem_alloc)(v, rstart, rend, size, align, boundary, cacheable,
657    addrp, bshp)
658	void *v;
659	bus_addr_t rstart, rend, *addrp;
660	bus_size_t size, align, boundary;
661	int cacheable;
662	bus_space_handle_t *bshp;
663{
664
665	/* XXX XXX XXX XXX XXX XXX */
666	panic("%s not implemented", __S(__C(CHIP,_mem_alloc)));
667}
668
669void
670__C(CHIP,_mem_free)(v, bsh, size)
671	void *v;
672	bus_space_handle_t bsh;
673	bus_size_t size;
674{
675
676	/* XXX XXX XXX XXX XXX XXX */
677	panic("%s not implemented", __S(__C(CHIP,_mem_free)));
678}
679
680inline void
681__C(CHIP,_mem_barrier)(v, h, o, l, f)
682	void *v;
683	bus_space_handle_t h;
684	bus_size_t o, l;
685	int f;
686{
687
688	if ((f & BUS_BARRIER_READ) != 0)
689		alpha_mb();
690	else if ((f & BUS_BARRIER_WRITE) != 0)
691		alpha_wmb();
692}
693
694inline u_int8_t
695__C(CHIP,_mem_read_1)(v, memh, off)
696	void *v;
697	bus_space_handle_t memh;
698	bus_size_t off;
699{
700	register bus_space_handle_t tmpmemh;
701	register u_int32_t *port, val;
702	register u_int8_t rval;
703	register int offset;
704
705	alpha_mb();
706
707	if ((memh >> 63) != 0)
708		return (*(u_int8_t *)(memh + off));
709
710	tmpmemh = memh + off;
711	offset = tmpmemh & 3;
712	port = (u_int32_t *)((tmpmemh << 5) | (0 << 3));
713	val = *port;
714	rval = ((val) >> (8 * offset)) & 0xff;
715
716	return rval;
717}
718
719inline u_int16_t
720__C(CHIP,_mem_read_2)(v, memh, off)
721	void *v;
722	bus_space_handle_t memh;
723	bus_size_t off;
724{
725	register bus_space_handle_t tmpmemh;
726	register u_int32_t *port, val;
727	register u_int16_t rval;
728	register int offset;
729
730	alpha_mb();
731
732	if ((memh >> 63) != 0)
733		return (*(u_int16_t *)(memh + off));
734
735	tmpmemh = memh + off;
736	offset = tmpmemh & 3;
737	port = (u_int32_t *)((tmpmemh << 5) | (1 << 3));
738	val = *port;
739	rval = ((val) >> (8 * offset)) & 0xffff;
740
741	return rval;
742}
743
744inline u_int32_t
745__C(CHIP,_mem_read_4)(v, memh, off)
746	void *v;
747	bus_space_handle_t memh;
748	bus_size_t off;
749{
750	register bus_space_handle_t tmpmemh;
751	register u_int32_t *port, val;
752	register u_int32_t rval;
753	register int offset;
754
755	alpha_mb();
756
757	if ((memh >> 63) != 0)
758		return (*(u_int32_t *)(memh + off));
759
760	tmpmemh = memh + off;
761	offset = tmpmemh & 3;
762	port = (u_int32_t *)((tmpmemh << 5) | (3 << 3));
763	val = *port;
764#if 0
765	rval = ((val) >> (8 * offset)) & 0xffffffff;
766#else
767	rval = val;
768#endif
769
770	return rval;
771}
772
773inline u_int64_t
774__C(CHIP,_mem_read_8)(v, memh, off)
775	void *v;
776	bus_space_handle_t memh;
777	bus_size_t off;
778{
779
780	alpha_mb();
781
782        if ((memh >> 63) != 0)
783                return (*(u_int64_t *)(memh + off));
784
785	/* XXX XXX XXX */
786	panic("%s not implemented", __S(__C(CHIP,_mem_read_8)));
787}
788
789#define CHIP_mem_read_multi_N(BYTES,TYPE)				\
790void									\
791__C(__C(CHIP,_mem_read_multi_),BYTES)(v, h, o, a, c)			\
792	void *v;							\
793	bus_space_handle_t h;						\
794	bus_size_t o, c;						\
795	TYPE *a;							\
796{									\
797									\
798	while (c-- > 0) {						\
799		__C(CHIP,_mem_barrier)(v, h, o, sizeof *a,		\
800		    BUS_BARRIER_READ);					\
801		*a++ = __C(__C(CHIP,_mem_read_),BYTES)(v, h, o);	\
802	}								\
803}
804CHIP_mem_read_multi_N(1,u_int8_t)
805CHIP_mem_read_multi_N(2,u_int16_t)
806CHIP_mem_read_multi_N(4,u_int32_t)
807CHIP_mem_read_multi_N(8,u_int64_t)
808
809#define CHIP_mem_read_region_N(BYTES,TYPE)				\
810void									\
811__C(__C(CHIP,_mem_read_region_),BYTES)(v, h, o, a, c)			\
812	void *v;							\
813	bus_space_handle_t h;						\
814	bus_size_t o, c;						\
815	TYPE *a;							\
816{									\
817									\
818	while (c-- > 0) {						\
819		*a++ = __C(__C(CHIP,_mem_read_),BYTES)(v, h, o);	\
820		o += sizeof *a;						\
821	}								\
822}
823CHIP_mem_read_region_N(1,u_int8_t)
824CHIP_mem_read_region_N(2,u_int16_t)
825CHIP_mem_read_region_N(4,u_int32_t)
826CHIP_mem_read_region_N(8,u_int64_t)
827
828inline void
829__C(CHIP,_mem_write_1)(v, memh, off, val)
830	void *v;
831	bus_space_handle_t memh;
832	bus_size_t off;
833	u_int8_t val;
834{
835	register bus_space_handle_t tmpmemh;
836	register u_int32_t *port, nval;
837	register int offset;
838
839	if ((memh >> 63) != 0)
840		(*(u_int8_t *)(memh + off)) = val;
841	else {
842		tmpmemh = memh + off;
843		offset = tmpmemh & 3;
844		nval = val << (8 * offset);
845		port = (u_int32_t *)((tmpmemh << 5) | (0 << 3));
846		*port = nval;
847	}
848        alpha_mb();
849}
850
851inline void
852__C(CHIP,_mem_write_2)(v, memh, off, val)
853	void *v;
854	bus_space_handle_t memh;
855	bus_size_t off;
856	u_int16_t val;
857{
858	register bus_space_handle_t tmpmemh;
859	register u_int32_t *port, nval;
860	register int offset;
861
862	if ((memh >> 63) != 0)
863		(*(u_int16_t *)(memh + off)) = val;
864	else {
865		tmpmemh = memh + off;
866		offset = tmpmemh & 3;
867	        nval = val << (8 * offset);
868	        port = (u_int32_t *)((tmpmemh << 5) | (1 << 3));
869	        *port = nval;
870	}
871        alpha_mb();
872}
873
874inline void
875__C(CHIP,_mem_write_4)(v, memh, off, val)
876	void *v;
877	bus_space_handle_t memh;
878	bus_size_t off;
879	u_int32_t val;
880{
881	register bus_space_handle_t tmpmemh;
882	register u_int32_t *port, nval;
883	register int offset;
884
885	if ((memh >> 63) != 0)
886		(*(u_int32_t *)(memh + off)) = val;
887	else {
888		tmpmemh = memh + off;
889		offset = tmpmemh & 3;
890	        nval = val /*<< (8 * offset)*/;
891	        port = (u_int32_t *)((tmpmemh << 5) | (3 << 3));
892	        *port = nval;
893	}
894        alpha_mb();
895}
896
897inline void
898__C(CHIP,_mem_write_8)(v, memh, off, val)
899	void *v;
900	bus_space_handle_t memh;
901	bus_size_t off;
902	u_int64_t val;
903{
904
905	if ((memh >> 63) != 0)
906		(*(u_int64_t *)(memh + off)) = val;
907	else {
908		/* XXX XXX XXX */
909		panic("%s not implemented",
910		    __S(__C(CHIP,_mem_write_8)));
911	}
912	alpha_mb();
913}
914
915#define CHIP_mem_write_multi_N(BYTES,TYPE)				\
916void									\
917__C(__C(CHIP,_mem_write_multi_),BYTES)(v, h, o, a, c)			\
918	void *v;							\
919	bus_space_handle_t h;						\
920	bus_size_t o, c;						\
921	const TYPE *a;							\
922{									\
923									\
924	while (c-- > 0) {						\
925		__C(__C(CHIP,_mem_write_),BYTES)(v, h, o, *a++);	\
926		__C(CHIP,_mem_barrier)(v, h, o, sizeof *a,		\
927		    BUS_BARRIER_WRITE);					\
928	}								\
929}
930CHIP_mem_write_multi_N(1,u_int8_t)
931CHIP_mem_write_multi_N(2,u_int16_t)
932CHIP_mem_write_multi_N(4,u_int32_t)
933CHIP_mem_write_multi_N(8,u_int64_t)
934
935#define CHIP_mem_write_region_N(BYTES,TYPE)				\
936void									\
937__C(__C(CHIP,_mem_write_region_),BYTES)(v, h, o, a, c)			\
938	void *v;							\
939	bus_space_handle_t h;						\
940	bus_size_t o, c;						\
941	const TYPE *a;							\
942{									\
943									\
944	while (c-- > 0) {						\
945		__C(__C(CHIP,_mem_write_),BYTES)(v, h, o, *a++);	\
946		o += sizeof *a;						\
947	}								\
948}
949CHIP_mem_write_region_N(1,u_int8_t)
950CHIP_mem_write_region_N(2,u_int16_t)
951CHIP_mem_write_region_N(4,u_int32_t)
952CHIP_mem_write_region_N(8,u_int64_t)
953
954#define CHIP_mem_set_multi_N(BYTES,TYPE)				\
955void									\
956__C(__C(CHIP,_mem_set_multi_),BYTES)(v, h, o, val, c)			\
957	void *v;							\
958	bus_space_handle_t h;						\
959	bus_size_t o, c;						\
960	TYPE val;							\
961{									\
962									\
963	while (c-- > 0) {						\
964		__C(__C(CHIP,_mem_write_),BYTES)(v, h, o, val);		\
965		__C(CHIP,_mem_barrier)(v, h, o, sizeof val,		\
966		    BUS_BARRIER_WRITE);					\
967	}								\
968}
969CHIP_mem_set_multi_N(1,u_int8_t)
970CHIP_mem_set_multi_N(2,u_int16_t)
971CHIP_mem_set_multi_N(4,u_int32_t)
972CHIP_mem_set_multi_N(8,u_int64_t)
973
974#define CHIP_mem_set_region_N(BYTES,TYPE)				\
975void									\
976__C(__C(CHIP,_mem_set_region_),BYTES)(v, h, o, val, c)			\
977	void *v;							\
978	bus_space_handle_t h;						\
979	bus_size_t o, c;						\
980	TYPE val;							\
981{									\
982									\
983	while (c-- > 0) {						\
984		__C(__C(CHIP,_mem_write_),BYTES)(v, h, o, val);		\
985		o += sizeof val;					\
986	}								\
987}
988CHIP_mem_set_region_N(1,u_int8_t)
989CHIP_mem_set_region_N(2,u_int16_t)
990CHIP_mem_set_region_N(4,u_int32_t)
991CHIP_mem_set_region_N(8,u_int64_t)
992
993#define	CHIP_mem_copy_N(BYTES)						\
994void									\
995__C(__C(CHIP,_mem_copy_),BYTES)(v, h1, o1, h2, o2, c)			\
996	void *v;							\
997	bus_space_handle_t h1, h2;					\
998	bus_size_t o1, o2, c;						\
999{									\
1000	bus_size_t i, o;						\
1001									\
1002	if ((h1 >> 63) != 0 && (h2 >> 63) != 0) {			\
1003		bcopy((void *)(h1 + o1), (void *)(h2 + o2), c * BYTES);	\
1004		return;							\
1005	}								\
1006									\
1007	/* Circumvent a common case of overlapping problems */		\
1008	if (h1 == h2 && o2 > o1)					\
1009		for (i = 0, o = (c - 1) * BYTES; i < c; i++, o -= BYTES)\
1010			__C(__C(CHIP,_mem_write_),BYTES)(v, h2, o2 + o,	\
1011			    __C(__C(CHIP,_mem_read_),BYTES)(v, h1, o1 + o));\
1012	else								\
1013		for (i = 0, o = 0; i < c; i++, o += BYTES)		\
1014			__C(__C(CHIP,_mem_write_),BYTES)(v, h2, o2 + o,	\
1015			    __C(__C(CHIP,_mem_read_),BYTES)(v, h1, o1 + o));\
1016}
1017CHIP_mem_copy_N(1)
1018CHIP_mem_copy_N(2)
1019CHIP_mem_copy_N(4)
1020CHIP_mem_copy_N(8)
1021
1022#define CHIP_mem_read_raw_multi_N(BYTES,TYPE)				\
1023void									\
1024__C(__C(CHIP,_mem_read_raw_multi_),BYTES)(v, h, o, a, c)			\
1025	void *v;							\
1026	bus_space_handle_t h;						\
1027	bus_size_t o, c;						\
1028	u_int8_t *a;							\
1029{									\
1030	TYPE temp;							\
1031	int i;								\
1032									\
1033	while (c > 0) {							\
1034		__C(CHIP,_mem_barrier)(v, h, o, BYTES, BUS_BARRIER_READ); \
1035		temp = __C(__C(CHIP,_mem_read_),BYTES)(v, h, o);	\
1036		i = MIN(c, BYTES);					\
1037		c -= i;							\
1038		while (i--) {						\
1039			*a++ = temp & 0xff;				\
1040			temp >>= 8;					\
1041		}							\
1042	}								\
1043}
1044CHIP_mem_read_raw_multi_N(2,u_int16_t)
1045CHIP_mem_read_raw_multi_N(4,u_int32_t)
1046CHIP_mem_read_raw_multi_N(8,u_int64_t)
1047
1048#define CHIP_mem_write_raw_multi_N(BYTES,TYPE)				\
1049void									\
1050__C(__C(CHIP,_mem_write_raw_multi_),BYTES)(v, h, o, a, c)		\
1051	void *v;							\
1052	bus_space_handle_t h;						\
1053	bus_size_t o, c;						\
1054	const u_int8_t *a;						\
1055{									\
1056	TYPE temp;							\
1057	int i;								\
1058									\
1059	while (c > 0) {							\
1060		temp = 0;						\
1061		for (i = BYTES - 1; i >= 0; i--) {			\
1062			temp <<= 8;					\
1063			if (i < c)					\
1064				temp |= *(a + i);			\
1065		}							\
1066		__C(__C(CHIP,_mem_write_),BYTES)(v, h, o, temp);	\
1067		__C(CHIP,_mem_barrier)(v, h, o, BYTES, BUS_BARRIER_WRITE); \
1068		i = MIN(c, BYTES);					\
1069		c -= i;							\
1070		a += i;							\
1071	}								\
1072}
1073CHIP_mem_write_raw_multi_N(2,u_int16_t)
1074CHIP_mem_write_raw_multi_N(4,u_int32_t)
1075CHIP_mem_write_raw_multi_N(8,u_int64_t)
1076