aboutsummaryrefslogtreecommitdiffstats
path: root/roms/u-boot/lib/addr_map.c
diff options
context:
space:
mode:
Diffstat (limited to 'roms/u-boot/lib/addr_map.c')
-rw-r--r--roms/u-boot/lib/addr_map.c67
1 files changed, 67 insertions, 0 deletions
diff --git a/roms/u-boot/lib/addr_map.c b/roms/u-boot/lib/addr_map.c
new file mode 100644
index 000000000..fb2ef4000
--- /dev/null
+++ b/roms/u-boot/lib/addr_map.c
@@ -0,0 +1,67 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Copyright 2008 Freescale Semiconductor, Inc.
+ */
+
+#include <common.h>
+#include <addr_map.h>
+
+struct addrmap address_map[CONFIG_SYS_NUM_ADDR_MAP];
+
+phys_addr_t addrmap_virt_to_phys(void * vaddr)
+{
+ int i;
+
+ for (i = 0; i < CONFIG_SYS_NUM_ADDR_MAP; i++) {
+ u64 base, upper, addr;
+
+ if (address_map[i].size == 0)
+ continue;
+
+ addr = (u64)((u32)vaddr);
+ base = (u64)(address_map[i].vaddr);
+ upper = (u64)(address_map[i].size) + base - 1;
+
+ if (addr >= base && addr <= upper) {
+ return addr - address_map[i].vaddr + address_map[i].paddr;
+ }
+ }
+
+ return (phys_addr_t)(~0);
+}
+
+void *addrmap_phys_to_virt(phys_addr_t paddr)
+{
+ int i;
+
+ for (i = 0; i < CONFIG_SYS_NUM_ADDR_MAP; i++) {
+ phys_addr_t base, upper;
+
+ if (address_map[i].size == 0)
+ continue;
+
+ base = address_map[i].paddr;
+ upper = address_map[i].size + base - 1;
+
+ if (paddr >= base && paddr <= upper) {
+ phys_addr_t offset;
+
+ offset = address_map[i].paddr - address_map[i].vaddr;
+
+ return (void *)(unsigned long)(paddr - offset);
+ }
+ }
+
+ return (void *)(~0);
+}
+
+void addrmap_set_entry(unsigned long vaddr, phys_addr_t paddr,
+ phys_size_t size, int idx)
+{
+ if (idx > CONFIG_SYS_NUM_ADDR_MAP)
+ return;
+
+ address_map[idx].vaddr = vaddr;
+ address_map[idx].paddr = paddr;
+ address_map[idx].size = size;
+}