summaryrefslogtreecommitdiffstats
path: root/sys/arm/include
diff options
context:
space:
mode:
authorian <ian@FreeBSD.org>2013-12-13 23:56:53 +0000
committerian <ian@FreeBSD.org>2013-12-13 23:56:53 +0000
commiteae48ec05ef90176b68b7b5c7ebf3e4c792448aa (patch)
tree95426e39c61df08e259d54ab1d73d5aefa98c198 /sys/arm/include
parent689fd5c39017daa19a00a6cce247ad10ba00c1e7 (diff)
downloadFreeBSD-src-eae48ec05ef90176b68b7b5c7ebf3e4c792448aa.zip
FreeBSD-src-eae48ec05ef90176b68b7b5c7ebf3e4c792448aa.tar.gz
MFC r257648, r257649, r257660:
Begin reducing code duplication in arm pmap.c and pmap-v6.c by factoring out common code related to mapping device memory into a new devmap.c file. Remove the growing duplication of code that used pmap_devmap_find_pa() and then did some math with the returned results to generate a virtual address, and likewise in reverse to get a physical address. Now there are a pair of functions, arm_devmap_vtop() and arm_devmap_ptov(), to do that. The bus_space_map() implementations are rewritten in terms of these. Move remaining code and data related to static device mapping into the new devmap.[ch] files. Emphasize the MD nature of these things by using the prefix arm_devmap_ on the function and type names (already a few of these things found their way into MI code, hopefully it will be harder to do by accident in the future).
Diffstat (limited to 'sys/arm/include')
-rw-r--r--sys/arm/include/devmap.h73
-rw-r--r--sys/arm/include/fdt.h6
-rw-r--r--sys/arm/include/machdep.h3
-rw-r--r--sys/arm/include/pmap.h19
4 files changed, 78 insertions, 23 deletions
diff --git a/sys/arm/include/devmap.h b/sys/arm/include/devmap.h
new file mode 100644
index 0000000..ee16b67
--- /dev/null
+++ b/sys/arm/include/devmap.h
@@ -0,0 +1,73 @@
+/*-
+ * Copyright (c) 2013 Ian Lepore <ian@freebsd.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#ifndef _MACHINE_DEVMAP_H_
+#define _MACHINE_DEVMAP_H_
+
+/*
+ * This structure is used by MD code to describe static mappings of devices
+ * which are established as part of bringing up the MMU early in the boot.
+ */
+struct arm_devmap_entry {
+ vm_offset_t pd_va; /* virtual address */
+ vm_paddr_t pd_pa; /* physical address */
+ vm_size_t pd_size; /* size of region */
+ vm_prot_t pd_prot; /* protection code */
+ int pd_cache; /* cache attributes */
+};
+
+/*
+ * Register a platform-local table to be bootstrapped by the generic
+ * initarm() in arm/machdep.c. This is used by newer code that allocates and
+ * fills in its own local table but does not have its own initarm() routine.
+ */
+void arm_devmap_register_table(const struct arm_devmap_entry * _table);
+
+/*
+ * Directly process a table; called from initarm() of older platforms that don't
+ * use the generic initarm() in arm/machdep.c. If the table pointer is NULL,
+ * this will use the table installed previously by arm_devmap_register_table().
+ */
+void arm_devmap_bootstrap(vm_offset_t _l1pt,
+ const struct arm_devmap_entry *_table);
+
+/*
+ * Routines to translate between virtual and physical addresses within a region
+ * that is static-mapped by the devmap code. If the given address range isn't
+ * static-mapped, then ptov returns NULL and vtop returns DEVMAP_PADDR_NOTFOUND.
+ * The latter implies that you can't vtop just the last byte of physical address
+ * space. This is not as limiting as it might sound, because even if a device
+ * occupies the end of the physical address space, you're only prevented from
+ * doing vtop for that single byte. If you vtop a size bigger than 1 it works.
+ */
+#define DEVMAP_PADDR_NOTFOUND ((vm_paddr_t)(-1))
+
+void * arm_devmap_ptov(vm_paddr_t _pa, vm_size_t _sz);
+vm_paddr_t arm_devmap_vtop(void * _va, vm_size_t _sz);
+
+#endif
diff --git a/sys/arm/include/fdt.h b/sys/arm/include/fdt.h
index bff86d8..0be9927 100644
--- a/sys/arm/include/fdt.h
+++ b/sys/arm/include/fdt.h
@@ -56,8 +56,10 @@ struct mem_region {
vm_size_t mr_size;
};
-int fdt_localbus_devmap(phandle_t, struct pmap_devmap *, int, int *);
-int fdt_pci_devmap(phandle_t, struct pmap_devmap *devmap, vm_offset_t,
+struct arm_devmap_entry;
+
+int fdt_localbus_devmap(phandle_t, struct arm_devmap_entry *, int, int *);
+int fdt_pci_devmap(phandle_t, struct arm_devmap_entry *devmap, vm_offset_t,
vm_offset_t);
#endif /* _MACHINE_FDT_H_ */
diff --git a/sys/arm/include/machdep.h b/sys/arm/include/machdep.h
index c48b0a3..08e9e21 100644
--- a/sys/arm/include/machdep.h
+++ b/sys/arm/include/machdep.h
@@ -43,9 +43,6 @@ int platform_devmap_init(void);
void board_set_serial(uint64_t);
void board_set_revision(uint32_t);
-/* Needs to be initialised by platform_devmap_init */
-extern const struct pmap_devmap *pmap_devmap_bootstrap_table;
-
/* Setup standard arrays */
void arm_dump_avail_init( vm_offset_t memsize, size_t max);
diff --git a/sys/arm/include/pmap.h b/sys/arm/include/pmap.h
index ef834aa..9dee28d 100644
--- a/sys/arm/include/pmap.h
+++ b/sys/arm/include/pmap.h
@@ -254,6 +254,7 @@ void pmap_bootstrap(vm_offset_t firstaddr, struct pv_addr *l1pt);
int pmap_change_attr(vm_offset_t, vm_size_t, int);
void pmap_kenter(vm_offset_t va, vm_paddr_t pa);
void pmap_kenter_nocache(vm_offset_t va, vm_paddr_t pa);
+void pmap_kenter_device(vm_offset_t va, vm_paddr_t pa);
void *pmap_kenter_temp(vm_paddr_t pa, int i);
void pmap_kenter_user(vm_offset_t va, vm_paddr_t pa);
vm_paddr_t pmap_kextract(vm_offset_t va);
@@ -687,24 +688,6 @@ void pmap_use_minicache(vm_offset_t, vm_size_t);
void vector_page_setprot(int);
-/*
- * This structure is used by machine-dependent code to describe
- * static mappings of devices, created at bootstrap time.
- */
-struct pmap_devmap {
- vm_offset_t pd_va; /* virtual address */
- vm_paddr_t pd_pa; /* physical address */
- vm_size_t pd_size; /* size of region */
- vm_prot_t pd_prot; /* protection code */
- int pd_cache; /* cache attributes */
-};
-
-const struct pmap_devmap *pmap_devmap_find_pa(vm_paddr_t, vm_size_t);
-const struct pmap_devmap *pmap_devmap_find_va(vm_offset_t, vm_size_t);
-
-void pmap_devmap_bootstrap(vm_offset_t, const struct pmap_devmap *);
-void pmap_devmap_register(const struct pmap_devmap *);
-
#define SECTION_CACHE 0x1
#define SECTION_PT 0x2
void pmap_kenter_section(vm_offset_t, vm_paddr_t, int flags);
OpenPOWER on IntegriCloud