pxa_space.c revision 330897
183322Speter/*	$NetBSD: obio_space.c,v 1.6 2003/07/15 00:25:05 lukem Exp $	*/
283322Speter
383322Speter/*-
483322Speter * SPDX-License-Identifier: BSD-4-Clause
583322Speter *
683322Speter * Copyright (c) 2001, 2002, 2003 Wasabi Systems, Inc.
783322Speter * All rights reserved.
883322Speter *
983322Speter * Written by Jason R. Thorpe for Wasabi Systems, Inc.
1083322Speter *
1183322Speter * Redistribution and use in source and binary forms, with or without
1283322Speter * modification, are permitted provided that the following conditions
1383322Speter * are met:
1483322Speter * 1. Redistributions of source code must retain the above copyright
1583322Speter *    notice, this list of conditions and the following disclaimer.
1683322Speter * 2. Redistributions in binary form must reproduce the above copyright
1783322Speter *    notice, this list of conditions and the following disclaimer in the
1883322Speter *    documentation and/or other materials provided with the distribution.
1983322Speter * 3. All advertising materials mentioning features or use of this software
2083322Speter *    must display the following acknowledgement:
2183322Speter *	This product includes software developed for the NetBSD Project by
2283322Speter *	Wasabi Systems, Inc.
2383322Speter * 4. The name of Wasabi Systems, Inc. may not be used to endorse
2483322Speter *    or promote products derived from this software without specific prior
2583322Speter *    written permission.
2683322Speter *
2783322Speter * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
2883322Speter * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
2983322Speter * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
3083322Speter * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL WASABI SYSTEMS, INC
3183322Speter * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
3283322Speter * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
3383322Speter * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
3483322Speter * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
3583322Speter * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
3683322Speter * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
3783322Speter * POSSIBILITY OF SUCH DAMAGE.
38100272Speter */
39100272Speter
40100272Speter/*
41100272Speter * bus_space functions for PXA devices
42100272Speter */
4383322Speter
4483322Speter#include <sys/cdefs.h>
4583322Speter__FBSDID("$FreeBSD: stable/11/sys/arm/xscale/pxa/pxa_space.c 330897 2018-03-14 03:19:51Z eadler $");
4683322Speter
4783322Speter#include <sys/param.h>
4883322Speter#include <sys/systm.h>
4983322Speter#include <sys/bus.h>
5083322Speter#include <sys/kernel.h>
51134358Siedowse#include <sys/malloc.h>
52134358Siedowse
53134358Siedowse#include <machine/bus.h>
54134358Siedowse
55134358Siedowse#include <arm/xscale/pxa/pxareg.h>
56134358Siedowse#include <arm/xscale/pxa/pxavar.h>
57134358Siedowse
58134358Siedowsestatic MALLOC_DEFINE(M_PXATAG, "PXA bus_space tags", "Bus_space tags for PXA");
59134358Siedowse
60134358Siedowse/* Prototypes for all the bus_space structure functions */
61134358Siedowsebs_protos(generic);
62134358Siedowsebs_protos(pxa);
63134358Siedowse
64134358Siedowse/*
65134358Siedowse * The obio bus space tag.  This is constant for all instances, so
66134358Siedowse * we never have to explicitly "create" it.
67134358Siedowse */
68134358Siedowsestruct bus_space _base_tag = {
69134358Siedowse	/* cookie */
70134358Siedowse	.bs_privdata	= NULL,
71134358Siedowse
72134358Siedowse	/* mapping/unmapping */
73134358Siedowse	.bs_map		= generic_bs_map,
74134358Siedowse	.bs_unmap	= generic_bs_unmap,
75134358Siedowse	.bs_subregion	= generic_bs_subregion,
76134358Siedowse
77134358Siedowse	/* allocation/deallocation */
78134358Siedowse	.bs_alloc	= generic_bs_alloc,
79134358Siedowse	.bs_free	= generic_bs_free,
8087551Smikeh
8187551Smikeh	/* barrier */
8287551Smikeh	.bs_barrier	= generic_bs_barrier,
8387551Smikeh
84134358Siedowse	/* read (single) */
85134358Siedowse	.bs_r_1		= pxa_bs_r_1,
86134358Siedowse	.bs_r_2		= pxa_bs_r_2,
87134358Siedowse	.bs_r_4		= pxa_bs_r_4,
88134358Siedowse	.bs_r_8		= BS_UNIMPLEMENTED,
89134358Siedowse
90134358Siedowse	/* read multiple */
91134358Siedowse	.bs_rm_1	= pxa_bs_rm_1,
92134358Siedowse	.bs_rm_2	= pxa_bs_rm_2,
93134358Siedowse	.bs_rm_4	= BS_UNIMPLEMENTED,
94134358Siedowse	.bs_rm_8	= BS_UNIMPLEMENTED,
95153504Smarcel
96134358Siedowse	/* read region */
97134358Siedowse	.bs_rr_1	= pxa_bs_rr_1,
98134358Siedowse	.bs_rr_2	= BS_UNIMPLEMENTED,
99134358Siedowse	.bs_rr_4	= BS_UNIMPLEMENTED,
100134358Siedowse	.bs_rr_8	= BS_UNIMPLEMENTED,
101134358Siedowse
102134358Siedowse	/* write (single) */
103134358Siedowse	.bs_w_1		= pxa_bs_w_1,
104134358Siedowse	.bs_w_2		= pxa_bs_w_2,
105134358Siedowse	.bs_w_4		= pxa_bs_w_4,
106134358Siedowse	.bs_w_8		= BS_UNIMPLEMENTED,
107134358Siedowse
108134358Siedowse	/* write multiple */
109134358Siedowse	.bs_wm_1	= pxa_bs_wm_1,
110134358Siedowse	.bs_wm_2	= pxa_bs_wm_2,
111134358Siedowse	.bs_wm_4	= BS_UNIMPLEMENTED,
112134358Siedowse	.bs_wm_8	= BS_UNIMPLEMENTED,
113134358Siedowse
114134358Siedowse	/* write region */
11583322Speter	.bs_wr_1	= BS_UNIMPLEMENTED,
11683322Speter	.bs_wr_2	= BS_UNIMPLEMENTED,
11783322Speter	.bs_wr_4	= BS_UNIMPLEMENTED,
11883322Speter	.bs_wr_8	= BS_UNIMPLEMENTED,
11983322Speter
12083322Speter	/* set multiple */
12183322Speter	.bs_sm_1	= BS_UNIMPLEMENTED,
12283322Speter	.bs_sm_2	= BS_UNIMPLEMENTED,
12383322Speter	.bs_sm_4	= BS_UNIMPLEMENTED,
12483322Speter	.bs_sm_8	= BS_UNIMPLEMENTED,
12583322Speter
12683322Speter	/* set region */
12783322Speter	.bs_sr_1	= BS_UNIMPLEMENTED,
128134358Siedowse	.bs_sr_2	= BS_UNIMPLEMENTED,
12983322Speter	.bs_sr_4	= BS_UNIMPLEMENTED,
13083322Speter	.bs_sr_8	= BS_UNIMPLEMENTED,
13183322Speter
13283322Speter	/* copy */
13383322Speter	.bs_c_1		= BS_UNIMPLEMENTED,
13483322Speter	.bs_c_2		= BS_UNIMPLEMENTED,
13583322Speter	.bs_c_4		= BS_UNIMPLEMENTED,
13683322Speter	.bs_c_8		= BS_UNIMPLEMENTED,
13783322Speter
13883322Speter	/* read stream (single) */
13983322Speter	.bs_r_1_s	= BS_UNIMPLEMENTED,
14083322Speter	.bs_r_2_s	= BS_UNIMPLEMENTED,
14183322Speter	.bs_r_4_s	= BS_UNIMPLEMENTED,
14283322Speter	.bs_r_8_s	= BS_UNIMPLEMENTED,
143134358Siedowse
144134358Siedowse	/* read multiple stream */
145134358Siedowse	.bs_rm_1_s	= BS_UNIMPLEMENTED,
146134358Siedowse	.bs_rm_2_s	= BS_UNIMPLEMENTED,
147134358Siedowse	.bs_rm_4_s	= BS_UNIMPLEMENTED,
148134358Siedowse	.bs_rm_8_s	= BS_UNIMPLEMENTED,
149134358Siedowse
15083322Speter	/* read region stream */
15183322Speter	.bs_rr_1_s	= BS_UNIMPLEMENTED,
15283322Speter	.bs_rr_2_s	= BS_UNIMPLEMENTED,
15383322Speter	.bs_rr_4_s	= BS_UNIMPLEMENTED,
15483322Speter	.bs_rr_8_s	= BS_UNIMPLEMENTED,
15583322Speter
15683322Speter	/* write stream (single) */
15783322Speter	.bs_w_1_s	= BS_UNIMPLEMENTED,
15883322Speter	.bs_w_2_s	= BS_UNIMPLEMENTED,
15983322Speter	.bs_w_4_s	= BS_UNIMPLEMENTED,
16083322Speter	.bs_w_8_s	= BS_UNIMPLEMENTED,
16183322Speter
16283322Speter	/* write multiple stream */
16383322Speter	.bs_wm_1_s	= BS_UNIMPLEMENTED,
16483322Speter	.bs_wm_2_s	= BS_UNIMPLEMENTED,
16583322Speter	.bs_wm_4_s	= BS_UNIMPLEMENTED,
16683322Speter	.bs_wm_8_s	= BS_UNIMPLEMENTED,
16783322Speter
16883322Speter	/* write region stream */
169134358Siedowse	.bs_wr_1_s	= BS_UNIMPLEMENTED,
17083322Speter	.bs_wr_2_s	= BS_UNIMPLEMENTED,
17183322Speter	.bs_wr_4_s	= BS_UNIMPLEMENTED,
17283322Speter	.bs_wr_8_s	= BS_UNIMPLEMENTED,
17383322Speter};
17483322Speter
17583322Speterstatic struct bus_space	_obio_tag;
17683322Speter
17783322Speterbus_space_tag_t		base_tag = &_base_tag;
17883322Speterbus_space_tag_t		obio_tag = NULL;
17983322Speter
18083322Spetervoid
18183322Speterpxa_obio_tag_init(void)
18283322Speter{
18383322Speter
18483322Speter	bcopy(&_base_tag, &_obio_tag, sizeof(struct bus_space));
18583322Speter	_obio_tag.bs_privdata = (void *)PXA2X0_PERIPH_OFFSET;
18683322Speter	obio_tag = &_obio_tag;
18783322Speter}
18883322Speter
18983322Speterbus_space_tag_t
19083322Speterpxa_bus_tag_alloc(bus_addr_t offset)
19183322Speter{
19283322Speter	struct	bus_space *tag;
19383322Speter
19483322Speter	tag = (struct bus_space *)malloc(sizeof(struct bus_space), M_PXATAG,
19583322Speter	    M_WAITOK);
19683322Speter	if (tag == NULL) {
19783322Speter		return (NULL);
19883322Speter	}
19983322Speter
20083322Speter	bcopy(&_base_tag, tag, sizeof(struct bus_space));
20183322Speter	tag->bs_privdata = (void *)offset;
20283322Speter
20383322Speter	return ((bus_space_tag_t)tag);
20483322Speter}
20583322Speter
20683322Speter
20783322Speter#define	READ_SINGLE(type, proto, base)					\
20883322Speter	type								\
20983322Speter	proto(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset)	\
21083322Speter	{								\
21183322Speter		bus_addr_t	tag_offset;				\
21283322Speter		type		value;					\
213134358Siedowse		tag_offset = (bus_addr_t)tag->bs_privdata;		\
214134358Siedowse		value = base(NULL, bsh + tag_offset, offset);		\
215134358Siedowse		return (value);						\
216134358Siedowse	}
217134358Siedowse
218134358SiedowseREAD_SINGLE(u_int8_t,  pxa_bs_r_1, generic_bs_r_1)
219134358SiedowseREAD_SINGLE(u_int16_t, pxa_bs_r_2, generic_bs_r_2)
220134358SiedowseREAD_SINGLE(u_int32_t, pxa_bs_r_4, generic_bs_r_4)
221134358Siedowse
222134358Siedowse#undef READ_SINGLE
223134358Siedowse
224134358Siedowse#define	WRITE_SINGLE(type, proto, base)					\
225134358Siedowse	void								\
226134358Siedowse	proto(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset,	\
227134358Siedowse	    type value)							\
228134358Siedowse	{								\
229134358Siedowse		bus_addr_t	tag_offset;				\
230134358Siedowse		tag_offset = (bus_addr_t)tag->bs_privdata;		\
231134358Siedowse		base(NULL, bsh + tag_offset, offset, value);		\
232134358Siedowse	}
233134358Siedowse
234134358SiedowseWRITE_SINGLE(u_int8_t,  pxa_bs_w_1, generic_bs_w_1)
235134358SiedowseWRITE_SINGLE(u_int16_t, pxa_bs_w_2, generic_bs_w_2)
236134358SiedowseWRITE_SINGLE(u_int32_t, pxa_bs_w_4, generic_bs_w_4)
237134358Siedowse
238134358Siedowse#undef WRITE_SINGLE
239134358Siedowse
240134358Siedowse#define	READ_MULTI(type, proto, base)					\
241134358Siedowse	void								\
242134358Siedowse	proto(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset,	\
243134358Siedowse	    type *dest, bus_size_t count)				\
244134358Siedowse	{								\
245134358Siedowse		bus_addr_t	tag_offset;				\
246134358Siedowse		tag_offset = (bus_addr_t)tag->bs_privdata;		\
247134358Siedowse		base(NULL, bsh + tag_offset, offset, dest, count);	\
248134358Siedowse	}
249153504Smarcel
250134358SiedowseREAD_MULTI(u_int8_t,  pxa_bs_rm_1, generic_bs_rm_1)
251134358SiedowseREAD_MULTI(u_int16_t, pxa_bs_rm_2, generic_bs_rm_2)
252134358Siedowse
253134358SiedowseREAD_MULTI(u_int8_t,  pxa_bs_rr_1, generic_bs_rr_1)
254134358Siedowse
255134358Siedowse#undef READ_MULTI
256134358Siedowse
257134358Siedowse#define	WRITE_MULTI(type, proto, base)					\
258134358Siedowse	void								\
259134358Siedowse	proto(bus_space_tag_t tag, bus_space_handle_t bsh, bus_size_t offset,	\
260134358Siedowse	    const type *src, bus_size_t count)				\
261134358Siedowse	{								\
262134358Siedowse		bus_addr_t	tag_offset;				\
263134358Siedowse		tag_offset = (bus_addr_t)tag->bs_privdata;		\
26483322Speter		base(NULL, bsh + tag_offset, offset, src, count);	\
26583322Speter	}
26683322Speter
26794414SpeterWRITE_MULTI(u_int8_t,  pxa_bs_wm_1, generic_bs_wm_1)
26883322SpeterWRITE_MULTI(u_int16_t, pxa_bs_wm_2, generic_bs_wm_2)
26983322Speter
270109607Sjake#undef WRITE_MULTI
271109607Sjake