1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright 2008 Freescale Semiconductor, Inc.
4 */
5
6#include <addr_map.h>
7#include <mapmem.h>
8
9struct addrmap address_map[CONFIG_SYS_NUM_ADDR_MAP];
10
11phys_addr_t addrmap_virt_to_phys(void * vaddr)
12{
13	int i;
14
15	for (i = 0; i < CONFIG_SYS_NUM_ADDR_MAP; i++) {
16		u64 base, upper, addr;
17
18		if (address_map[i].size == 0)
19			continue;
20
21		addr = map_to_sysmem(vaddr);
22		base = (u64)(address_map[i].vaddr);
23		upper = (u64)(address_map[i].size) + base - 1;
24
25		if (addr >= base && addr <= upper) {
26			return addr - address_map[i].vaddr + address_map[i].paddr;
27		}
28	}
29
30	return (phys_addr_t)(~0);
31}
32
33void *addrmap_phys_to_virt(phys_addr_t paddr)
34{
35	int i;
36
37	for (i = 0; i < CONFIG_SYS_NUM_ADDR_MAP; i++) {
38		phys_addr_t base, upper;
39
40		if (address_map[i].size == 0)
41			continue;
42
43		base = address_map[i].paddr;
44		upper = address_map[i].size + base - 1;
45
46		if (paddr >= base && paddr <= upper) {
47			phys_addr_t offset;
48
49			offset = address_map[i].paddr - address_map[i].vaddr;
50
51			return map_sysmem(paddr - offset, 0);
52		}
53	}
54
55	return (void *)(~0);
56}
57
58void addrmap_set_entry(unsigned long vaddr, phys_addr_t paddr,
59			phys_size_t size, int idx)
60{
61	if (idx >= CONFIG_SYS_NUM_ADDR_MAP)
62		return;
63
64	address_map[idx].vaddr = vaddr;
65	address_map[idx].paddr = paddr;
66	address_map[idx].size  = size;
67}
68