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