aboutsummaryrefslogtreecommitdiff
path: root/sys/arm64
diff options
context:
space:
mode:
authorAndrew Turner <andrew@FreeBSD.org>2018-05-24 15:32:49 +0000
committerAndrew Turner <andrew@FreeBSD.org>2018-05-24 15:32:49 +0000
commit9f1a80706c186cf2e34bc1f72efe9517b3dffccd (patch)
tree98b5da24ced1247809157d6b3bbe423326f60135 /sys/arm64
parentbb8f162363f94aaaa74f43a2f34fe435e54d1bf6 (diff)
downloadsrc-9f1a80706c186cf2e34bc1f72efe9517b3dffccd.tar.gz
src-9f1a80706c186cf2e34bc1f72efe9517b3dffccd.zip
Allow us to read the physmap data into our own array and use this to build
the DMAP region on arm64. We already have the needed information to build these tables, we just need to extract it. This significantly simplifies the code. Obtained from: ABT Systems Ltd Sponsored by: Turing Robotic Industries
Notes
Notes: svn path=/head/; revision=334162
Diffstat (limited to 'sys/arm64')
-rw-r--r--sys/arm64/arm64/machdep.c94
-rw-r--r--sys/arm64/arm64/pmap.c7
2 files changed, 9 insertions, 92 deletions
diff --git a/sys/arm64/arm64/machdep.c b/sys/arm64/arm64/machdep.c
index d50ef13ee23c..aa1a9d451e7e 100644
--- a/sys/arm64/arm64/machdep.c
+++ b/sys/arm64/arm64/machdep.c
@@ -106,10 +106,6 @@ static struct trapframe proc0_tf;
int early_boot = 1;
int cold = 1;
-#define PHYSMAP_SIZE (2 * (VM_PHYSSEG_MAX - 1))
-vm_paddr_t physmap[PHYSMAP_SIZE];
-u_int physmap_idx;
-
struct kva_md_info kmi;
int64_t dcache_line_size; /* The minimum D cache line size */
@@ -724,88 +720,8 @@ typedef struct {
uint64_t attr;
} EFI_MEMORY_DESCRIPTOR;
-static int
-add_physmap_entry(uint64_t base, uint64_t length, vm_paddr_t *physmap,
- u_int *physmap_idxp)
-{
- u_int i, insert_idx, _physmap_idx;
-
- _physmap_idx = *physmap_idxp;
-
- if (length == 0)
- return (1);
-
- /*
- * Find insertion point while checking for overlap. Start off by
- * assuming the new entry will be added to the end.
- */
- insert_idx = _physmap_idx;
- for (i = 0; i <= _physmap_idx; i += 2) {
- if (base < physmap[i + 1]) {
- if (base + length <= physmap[i]) {
- insert_idx = i;
- break;
- }
- if (boothowto & RB_VERBOSE)
- printf(
- "Overlapping memory regions, ignoring second region\n");
- return (1);
- }
- }
-
- /* See if we can prepend to the next entry. */
- if (insert_idx <= _physmap_idx &&
- base + length == physmap[insert_idx]) {
- physmap[insert_idx] = base;
- return (1);
- }
-
- /* See if we can append to the previous entry. */
- if (insert_idx > 0 && base == physmap[insert_idx - 1]) {
- physmap[insert_idx - 1] += length;
- return (1);
- }
-
- _physmap_idx += 2;
- *physmap_idxp = _physmap_idx;
- if (_physmap_idx == PHYSMAP_SIZE) {
- printf(
- "Too many segments in the physical address map, giving up\n");
- return (0);
- }
-
- /*
- * Move the last 'N' entries down to make room for the new
- * entry if needed.
- */
- for (i = _physmap_idx; i > insert_idx; i -= 2) {
- physmap[i] = physmap[i - 2];
- physmap[i + 1] = physmap[i - 1];
- }
-
- /* Insert the new entry. */
- physmap[insert_idx] = base;
- physmap[insert_idx + 1] = base + length;
- return (1);
-}
-
-#ifdef FDT
static void
-add_fdt_mem_regions(struct mem_region *mr, int mrcnt, vm_paddr_t *physmap,
- u_int *physmap_idxp)
-{
-
- for (int i = 0; i < mrcnt; i++) {
- if (!add_physmap_entry(mr[i].mr_start, mr[i].mr_size, physmap,
- physmap_idxp))
- break;
- }
-}
-#endif
-
-static void
-add_efi_map_entries(struct efi_map_header *efihdr, vm_paddr_t *physmap,
- u_int *physmap_idxp)
+add_efi_map_entries(struct efi_map_header *efihdr)
{
struct efi_md *map, *p;
const char *type;
@@ -897,9 +813,6 @@ add_efi_map_entries(struct efi_map_header *efihdr, vm_paddr_t *physmap,
arm_physmem_hardware_region(p->md_phys,
p->md_pages * PAGE_SIZE);
- if (!add_physmap_entry(p->md_phys, (p->md_pages * PAGE_SIZE),
- physmap, physmap_idxp))
- break;
}
}
@@ -1048,19 +961,16 @@ initarm(struct arm64_bootparams *abp)
lastaddr = MD_FETCH(kmdp, MODINFOMD_KERNEND, vm_offset_t);
/* Load the physical memory ranges */
- physmap_idx = 0;
efihdr = (struct efi_map_header *)preload_search_info(kmdp,
MODINFO_METADATA | MODINFOMD_EFI_MAP);
if (efihdr != NULL)
- add_efi_map_entries(efihdr, physmap, &physmap_idx);
+ add_efi_map_entries(efihdr);
#ifdef FDT
else {
/* Grab physical memory regions information from device tree. */
if (fdt_get_mem_regions(mem_regions, &mem_regions_sz,
NULL) != 0)
panic("Cannot get physical memory regions");
- add_fdt_mem_regions(mem_regions, mem_regions_sz, physmap,
- &physmap_idx);
arm_physmem_hardware_regions(mem_regions, mem_regions_sz);
}
if (fdt_get_reserved_mem(mem_regions, &mem_regions_sz) == 0)
diff --git a/sys/arm64/arm64/pmap.c b/sys/arm64/arm64/pmap.c
index 005049657943..038cd4448d08 100644
--- a/sys/arm64/arm64/pmap.c
+++ b/sys/arm64/arm64/pmap.c
@@ -259,6 +259,10 @@ CTASSERT((DMAP_MAX_ADDRESS & ~L0_OFFSET) == DMAP_MAX_ADDRESS);
#define DMAP_TABLES ((DMAP_MAX_ADDRESS - DMAP_MIN_ADDRESS) >> L0_SHIFT)
extern pt_entry_t pagetable_dmap[];
+#define PHYSMAP_SIZE (2 * (VM_PHYSSEG_MAX - 1))
+static vm_paddr_t physmap[PHYSMAP_SIZE];
+static u_int physmap_idx;
+
static SYSCTL_NODE(_vm, OID_AUTO, pmap, CTLFLAG_RD, 0, "VM/pmap parameters");
static int superpages_enabled = 1;
@@ -709,6 +713,9 @@ pmap_bootstrap(vm_offset_t l0pt, vm_offset_t l1pt, vm_paddr_t kernstart,
/* Assume the address we were loaded to is a valid physical address */
min_pa = max_pa = KERNBASE - kern_delta;
+ physmap_idx = arm_physmem_avail(physmap, nitems(physmap));
+ physmap_idx /= 2;
+
/*
* Find the minimum physical address. physmap is sorted,
* but may contain empty ranges.