1/*	$NetBSD: obio_space.c,v 1.6 2003/07/15 00:25:05 lukem Exp $	*/
2
3/*-
4 * Copyright (c) 2001, 2002, 2003 Wasabi Systems, Inc.
5 * All rights reserved.
6 *
7 * Written by Jason R. Thorpe for Wasabi Systems, Inc.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 *    notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 *    notice, this list of conditions and the following disclaimer in the
16 *    documentation and/or other materials provided with the distribution.
17 * 3. All advertising materials mentioning features or use of this software
18 *    must display the following acknowledgement:
19 *	This product includes software developed for the NetBSD Project by
20 *	Wasabi Systems, Inc.
21 * 4. The name of Wasabi Systems, Inc. may not be used to endorse
22 *    or promote products derived from this software without specific prior
23 *    written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
27 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL WASABI SYSTEMS, INC
29 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35 * POSSIBILITY OF SUCH DAMAGE.
36 */
37
38/*
39 * bus_space functions for PXA devices
40 */
41
42#include <sys/cdefs.h>
43__FBSDID("$FreeBSD: stable/11/sys/arm/xscale/pxa/pxa_space.c 314506 2017-03-01 19:55:04Z ian $");
44
45#include <sys/param.h>
46#include <sys/systm.h>
47#include <sys/bus.h>
48#include <sys/kernel.h>
49#include <sys/malloc.h>
50
51#include <machine/bus.h>
52
53#include <arm/xscale/pxa/pxareg.h>
54#include <arm/xscale/pxa/pxavar.h>
55
56static MALLOC_DEFINE(M_PXATAG, "PXA bus_space tags", "Bus_space tags for PXA");
57
58/* Prototypes for all the bus_space structure functions */
59bs_protos(generic);
60bs_protos(pxa);
61
62/*
63 * The obio bus space tag.  This is constant for all instances, so
64 * we never have to explicitly "create" it.
65 */
66struct bus_space _base_tag = {
67	/* cookie */
68	.bs_privdata	= NULL,
69
70	/* mapping/unmapping */
71	.bs_map		= generic_bs_map,
72	.bs_unmap	= generic_bs_unmap,
73	.bs_subregion	= generic_bs_subregion,
74
75	/* allocation/deallocation */
76	.bs_alloc	= generic_bs_alloc,
77	.bs_free	= generic_bs_free,
78
79	/* barrier */
80	.bs_barrier	= generic_bs_barrier,
81
82	/* read (single) */
83	.bs_r_1		= pxa_bs_r_1,
84	.bs_r_2		= pxa_bs_r_2,
85	.bs_r_4		= pxa_bs_r_4,
86	.bs_r_8		= BS_UNIMPLEMENTED,
87
88	/* read multiple */
89	.bs_rm_1	= pxa_bs_rm_1,
90	.bs_rm_2	= pxa_bs_rm_2,
91	.bs_rm_4	= BS_UNIMPLEMENTED,
92	.bs_rm_8	= BS_UNIMPLEMENTED,
93
94	/* read region */
95	.bs_rr_1	= pxa_bs_rr_1,
96	.bs_rr_2	= BS_UNIMPLEMENTED,
97	.bs_rr_4	= BS_UNIMPLEMENTED,
98	.bs_rr_8	= BS_UNIMPLEMENTED,
99
100	/* write (single) */
101	.bs_w_1		= pxa_bs_w_1,
102	.bs_w_2		= pxa_bs_w_2,
103	.bs_w_4		= pxa_bs_w_4,
104	.bs_w_8		= BS_UNIMPLEMENTED,
105
106	/* write multiple */
107	.bs_wm_1	= pxa_bs_wm_1,
108	.bs_wm_2	= pxa_bs_wm_2,
109	.bs_wm_4	= BS_UNIMPLEMENTED,
110	.bs_wm_8	= BS_UNIMPLEMENTED,
111
112	/* write region */
113	.bs_wr_1	= BS_UNIMPLEMENTED,
114	.bs_wr_2	= BS_UNIMPLEMENTED,
115	.bs_wr_4	= BS_UNIMPLEMENTED,
116	.bs_wr_8	= BS_UNIMPLEMENTED,
117
118	/* set multiple */
119	.bs_sm_1	= BS_UNIMPLEMENTED,
120	.bs_sm_2	= BS_UNIMPLEMENTED,
121	.bs_sm_4	= BS_UNIMPLEMENTED,
122	.bs_sm_8	= BS_UNIMPLEMENTED,
123
124	/* set region */
125	.bs_sr_1	= BS_UNIMPLEMENTED,
126	.bs_sr_2	= BS_UNIMPLEMENTED,
127	.bs_sr_4	= BS_UNIMPLEMENTED,
128	.bs_sr_8	= BS_UNIMPLEMENTED,
129
130	/* copy */
131	.bs_c_1		= BS_UNIMPLEMENTED,
132	.bs_c_2		= BS_UNIMPLEMENTED,
133	.bs_c_4		= BS_UNIMPLEMENTED,
134	.bs_c_8		= BS_UNIMPLEMENTED,
135
136	/* read stream (single) */
137	.bs_r_1_s	= BS_UNIMPLEMENTED,
138	.bs_r_2_s	= BS_UNIMPLEMENTED,
139	.bs_r_4_s	= BS_UNIMPLEMENTED,
140	.bs_r_8_s	= BS_UNIMPLEMENTED,
141
142	/* read multiple stream */
143	.bs_rm_1_s	= BS_UNIMPLEMENTED,
144	.bs_rm_2_s	= BS_UNIMPLEMENTED,
145	.bs_rm_4_s	= BS_UNIMPLEMENTED,
146	.bs_rm_8_s	= BS_UNIMPLEMENTED,
147
148	/* read region stream */
149	.bs_rr_1_s	= BS_UNIMPLEMENTED,
150	.bs_rr_2_s	= BS_UNIMPLEMENTED,
151	.bs_rr_4_s	= BS_UNIMPLEMENTED,
152	.bs_rr_8_s	= BS_UNIMPLEMENTED,
153
154	/* write stream (single) */
155	.bs_w_1_s	= BS_UNIMPLEMENTED,
156	.bs_w_2_s	= BS_UNIMPLEMENTED,
157	.bs_w_4_s	= BS_UNIMPLEMENTED,
158	.bs_w_8_s	= BS_UNIMPLEMENTED,
159
160	/* write multiple stream */
161	.bs_wm_1_s	= BS_UNIMPLEMENTED,
162	.bs_wm_2_s	= BS_UNIMPLEMENTED,
163	.bs_wm_4_s	= BS_UNIMPLEMENTED,
164	.bs_wm_8_s	= BS_UNIMPLEMENTED,
165
166	/* write region stream */
167	.bs_wr_1_s	= BS_UNIMPLEMENTED,
168	.bs_wr_2_s	= BS_UNIMPLEMENTED,
169	.bs_wr_4_s	= BS_UNIMPLEMENTED,
170	.bs_wr_8_s	= BS_UNIMPLEMENTED,
171};
172
173static struct bus_space	_obio_tag;
174
175bus_space_tag_t		base_tag = &_base_tag;
176bus_space_tag_t		obio_tag = NULL;
177
178void
179pxa_obio_tag_init(void)
180{
181
182	bcopy(&_base_tag, &_obio_tag, sizeof(struct bus_space));
183	_obio_tag.bs_privdata = (void *)PXA2X0_PERIPH_OFFSET;
184	obio_tag = &_obio_tag;
185}
186
187bus_space_tag_t
188pxa_bus_tag_alloc(bus_addr_t offset)
189{
190	struct	bus_space *tag;
191
192	tag = (struct bus_space *)malloc(sizeof(struct bus_space), M_PXATAG,
193	    M_WAITOK);
194	if (tag == NULL) {
195		return (NULL);
196	}
197
198	bcopy(&_base_tag, tag, sizeof(struct bus_space));
199	tag->bs_privdata = (void *)offset;
200
201	return ((bus_space_tag_t)tag);
202}
203
204
205#define	READ_SINGLE(type, proto, base)					\
206	type								\
207	proto(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset)	\
208	{								\
209		bus_addr_t	tag_offset;				\
210		type		value;					\
211		tag_offset = (bus_addr_t)tag->bs_privdata;		\
212		value = base(NULL, bsh + tag_offset, offset);		\
213		return (value);						\
214	}
215
216READ_SINGLE(u_int8_t,  pxa_bs_r_1, generic_bs_r_1)
217READ_SINGLE(u_int16_t, pxa_bs_r_2, generic_bs_r_2)
218READ_SINGLE(u_int32_t, pxa_bs_r_4, generic_bs_r_4)
219
220#undef READ_SINGLE
221
222#define	WRITE_SINGLE(type, proto, base)					\
223	void								\
224	proto(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset,	\
225	    type value)							\
226	{								\
227		bus_addr_t	tag_offset;				\
228		tag_offset = (bus_addr_t)tag->bs_privdata;		\
229		base(NULL, bsh + tag_offset, offset, value);		\
230	}
231
232WRITE_SINGLE(u_int8_t,  pxa_bs_w_1, generic_bs_w_1)
233WRITE_SINGLE(u_int16_t, pxa_bs_w_2, generic_bs_w_2)
234WRITE_SINGLE(u_int32_t, pxa_bs_w_4, generic_bs_w_4)
235
236#undef WRITE_SINGLE
237
238#define	READ_MULTI(type, proto, base)					\
239	void								\
240	proto(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset,	\
241	    type *dest, bus_size_t count)				\
242	{								\
243		bus_addr_t	tag_offset;				\
244		tag_offset = (bus_addr_t)tag->bs_privdata;		\
245		base(NULL, bsh + tag_offset, offset, dest, count);	\
246	}
247
248READ_MULTI(u_int8_t,  pxa_bs_rm_1, generic_bs_rm_1)
249READ_MULTI(u_int16_t, pxa_bs_rm_2, generic_bs_rm_2)
250
251READ_MULTI(u_int8_t,  pxa_bs_rr_1, generic_bs_rr_1)
252
253#undef READ_MULTI
254
255#define	WRITE_MULTI(type, proto, base)					\
256	void								\
257	proto(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset,	\
258	    const type *src, bus_size_t count)				\
259	{								\
260		bus_addr_t	tag_offset;				\
261		tag_offset = (bus_addr_t)tag->bs_privdata;		\
262		base(NULL, bsh + tag_offset, offset, src, count);	\
263	}
264
265WRITE_MULTI(u_int8_t,  pxa_bs_wm_1, generic_bs_wm_1)
266WRITE_MULTI(u_int16_t, pxa_bs_wm_2, generic_bs_wm_2)
267
268#undef WRITE_MULTI
269