1177888Sraj/*	$NetBSD: obio_space.c,v 1.6 2003/07/15 00:25:05 lukem Exp $	*/
2177888Sraj
3177888Sraj/*-
4177888Sraj * Copyright (c) 2001, 2002, 2003 Wasabi Systems, Inc.
5177888Sraj * All rights reserved.
6177888Sraj *
7177888Sraj * Written by Jason R. Thorpe for Wasabi Systems, Inc.
8177888Sraj *
9177888Sraj * Redistribution and use in source and binary forms, with or without
10177888Sraj * modification, are permitted provided that the following conditions
11177888Sraj * are met:
12177888Sraj * 1. Redistributions of source code must retain the above copyright
13177888Sraj *    notice, this list of conditions and the following disclaimer.
14177888Sraj * 2. Redistributions in binary form must reproduce the above copyright
15177888Sraj *    notice, this list of conditions and the following disclaimer in the
16177888Sraj *    documentation and/or other materials provided with the distribution.
17177888Sraj * 3. All advertising materials mentioning features or use of this software
18177888Sraj *    must display the following acknowledgement:
19177888Sraj *	This product includes software developed for the NetBSD Project by
20177888Sraj *	Wasabi Systems, Inc.
21177888Sraj * 4. The name of Wasabi Systems, Inc. may not be used to endorse
22177888Sraj *    or promote products derived from this software without specific prior
23177888Sraj *    written permission.
24177888Sraj *
25177888Sraj * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
26177888Sraj * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
27177888Sraj * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28177888Sraj * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL WASABI SYSTEMS, INC
29177888Sraj * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30177888Sraj * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31177888Sraj * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32177888Sraj * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33177888Sraj * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34177888Sraj * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35177888Sraj * POSSIBILITY OF SUCH DAMAGE.
36177888Sraj */
37177888Sraj
38177888Sraj#include <sys/cdefs.h>
39177888Sraj__FBSDID("$FreeBSD$");
40177888Sraj
41177888Sraj#include <sys/param.h>
42177888Sraj#include <sys/systm.h>
43177888Sraj#include <sys/bus.h>
44177888Sraj#include <sys/kernel.h>
45177888Sraj#include <sys/malloc.h>
46177888Sraj
47177888Sraj#include <vm/vm.h>
48177888Sraj#include <vm/pmap.h>
49177888Sraj#include <vm/vm_kern.h>
50177888Sraj#include <vm/vm_extern.h>
51177888Sraj
52177888Sraj#include <machine/bus.h>
53177888Sraj
54177888Sraj/* Prototypes for all the bus_space structure functions */
55177888Srajbs_protos(generic);
56177888Sraj
57177888Srajint
58177888Srajgeneric_bs_map(void *t, bus_addr_t bpa, bus_size_t size, int flags,
59177888Sraj    bus_space_handle_t *bshp)
60177888Sraj{
61177888Sraj	const struct pmap_devmap *pd;
62177888Sraj	vm_paddr_t startpa, endpa, pa, offset;
63177888Sraj	vm_offset_t va;
64177888Sraj	pt_entry_t *pte;
65177888Sraj
66177888Sraj	if ((pd = pmap_devmap_find_pa(bpa, size)) != NULL) {
67177888Sraj		/* Device was statically mapped. */
68177888Sraj		*bshp = pd->pd_va + (bpa - pd->pd_pa);
69177888Sraj		return (0);
70177888Sraj	}
71177888Sraj
72177888Sraj	endpa = round_page(bpa + size);
73177888Sraj	offset = bpa & PAGE_MASK;
74177888Sraj	startpa = trunc_page(bpa);
75177888Sraj
76177888Sraj	va = kmem_alloc(kernel_map, endpa - startpa);
77177888Sraj	if (va == 0)
78177888Sraj		return (ENOMEM);
79177888Sraj
80177888Sraj	*bshp = va + offset;
81177888Sraj
82177888Sraj	for (pa = startpa; pa < endpa; pa += PAGE_SIZE, va += PAGE_SIZE) {
83177888Sraj		pmap_kenter(va, pa);
84177888Sraj		pte = vtopte(va);
85177888Sraj		if (!(flags & BUS_SPACE_MAP_CACHEABLE)) {
86177888Sraj			*pte &= ~L2_S_CACHE_MASK;
87177888Sraj			PTE_SYNC(pte);
88177888Sraj		}
89177888Sraj	}
90177888Sraj
91177888Sraj	return (0);
92177888Sraj}
93177888Sraj
94177888Srajint
95177888Srajgeneric_bs_alloc(void *t, bus_addr_t rstart, bus_addr_t rend, bus_size_t size,
96177888Sraj    bus_size_t alignment, bus_size_t boundary, int flags, bus_addr_t *bpap,
97177888Sraj    bus_space_handle_t *bshp)
98177888Sraj{
99177888Sraj
100177888Sraj	panic("generic_bs_alloc(): not implemented");
101177888Sraj}
102177888Sraj
103177888Sraj
104177888Srajvoid
105177888Srajgeneric_bs_unmap(void *t, bus_space_handle_t h, bus_size_t size)
106177888Sraj{
107177888Sraj	vm_offset_t va, endva;
108177888Sraj
109177888Sraj	if (pmap_devmap_find_va((vm_offset_t)t, size) != NULL) {
110177888Sraj		/* Device was statically mapped; nothing to do. */
111177888Sraj		return;
112177888Sraj	}
113177888Sraj
114177888Sraj	endva = round_page((vm_offset_t)t + size);
115177888Sraj	va = trunc_page((vm_offset_t)t);
116177888Sraj
117177888Sraj	while (va < endva) {
118177888Sraj		pmap_kremove(va);
119177888Sraj		va += PAGE_SIZE;
120177888Sraj	}
121177888Sraj	kmem_free(kernel_map, va, endva - va);
122177888Sraj}
123177888Sraj
124177888Srajvoid
125177888Srajgeneric_bs_free(void *t, bus_space_handle_t bsh, bus_size_t size)
126177888Sraj{
127177888Sraj
128177888Sraj	panic("generic_bs_free(): not implemented");
129177888Sraj}
130177888Sraj
131177888Srajint
132177888Srajgeneric_bs_subregion(void *t, bus_space_handle_t bsh, bus_size_t offset,
133177888Sraj    bus_size_t size, bus_space_handle_t *nbshp)
134177888Sraj{
135177888Sraj
136177888Sraj	*nbshp = bsh + offset;
137177888Sraj	return (0);
138177888Sraj}
139177888Sraj
140177888Srajvoid
141177888Srajgeneric_bs_barrier(void *t, bus_space_handle_t bsh, bus_size_t offset,
142177888Sraj    bus_size_t len, int flags)
143177888Sraj{
144177888Sraj
145177888Sraj	/* Nothing to do. */
146177888Sraj}
147