xref: /rk3399_rockchip-uboot/lib/addr_map.c (revision 78acc472d9719316f22e002a009a998d9ceec29d)
1*78acc472SPeter Tyser /*
2*78acc472SPeter Tyser  * Copyright 2008 Freescale Semiconductor, Inc.
3*78acc472SPeter Tyser  *
4*78acc472SPeter Tyser  * This program is free software; you can redistribute it and/or
5*78acc472SPeter Tyser  * modify it under the terms of the GNU General Public License
6*78acc472SPeter Tyser  * Version 2 as published by the Free Software Foundation.
7*78acc472SPeter Tyser  *
8*78acc472SPeter Tyser  * This program is distributed in the hope that it will be useful,
9*78acc472SPeter Tyser  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10*78acc472SPeter Tyser  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11*78acc472SPeter Tyser  * GNU General Public License for more details.
12*78acc472SPeter Tyser  *
13*78acc472SPeter Tyser  * You should have received a copy of the GNU General Public License
14*78acc472SPeter Tyser  * along with this program; if not, write to the Free Software
15*78acc472SPeter Tyser  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
16*78acc472SPeter Tyser  * MA 02111-1307 USA
17*78acc472SPeter Tyser  */
18*78acc472SPeter Tyser 
19*78acc472SPeter Tyser #include <common.h>
20*78acc472SPeter Tyser #include <addr_map.h>
21*78acc472SPeter Tyser 
22*78acc472SPeter Tyser static struct {
23*78acc472SPeter Tyser 	phys_addr_t paddr;
24*78acc472SPeter Tyser 	phys_size_t size;
25*78acc472SPeter Tyser 	unsigned long vaddr;
26*78acc472SPeter Tyser } address_map[CONFIG_SYS_NUM_ADDR_MAP];
27*78acc472SPeter Tyser 
28*78acc472SPeter Tyser phys_addr_t addrmap_virt_to_phys(void * vaddr)
29*78acc472SPeter Tyser {
30*78acc472SPeter Tyser 	int i;
31*78acc472SPeter Tyser 
32*78acc472SPeter Tyser 	for (i = 0; i < CONFIG_SYS_NUM_ADDR_MAP; i++) {
33*78acc472SPeter Tyser 		u64 base, upper, addr;
34*78acc472SPeter Tyser 
35*78acc472SPeter Tyser 		if (address_map[i].size == 0)
36*78acc472SPeter Tyser 			continue;
37*78acc472SPeter Tyser 
38*78acc472SPeter Tyser 		addr = (u64)((u32)vaddr);
39*78acc472SPeter Tyser 		base = (u64)(address_map[i].vaddr);
40*78acc472SPeter Tyser 		upper = (u64)(address_map[i].size) + base - 1;
41*78acc472SPeter Tyser 
42*78acc472SPeter Tyser 		if (addr >= base && addr <= upper) {
43*78acc472SPeter Tyser 			return addr - address_map[i].vaddr + address_map[i].paddr;
44*78acc472SPeter Tyser 		}
45*78acc472SPeter Tyser 	}
46*78acc472SPeter Tyser 
47*78acc472SPeter Tyser 	return (phys_addr_t)(~0);
48*78acc472SPeter Tyser }
49*78acc472SPeter Tyser 
50*78acc472SPeter Tyser unsigned long addrmap_phys_to_virt(phys_addr_t paddr)
51*78acc472SPeter Tyser {
52*78acc472SPeter Tyser 	int i;
53*78acc472SPeter Tyser 
54*78acc472SPeter Tyser 	for (i = 0; i < CONFIG_SYS_NUM_ADDR_MAP; i++) {
55*78acc472SPeter Tyser 		u64 base, upper, addr;
56*78acc472SPeter Tyser 
57*78acc472SPeter Tyser 		if (address_map[i].size == 0)
58*78acc472SPeter Tyser 			continue;
59*78acc472SPeter Tyser 
60*78acc472SPeter Tyser 		addr = (u64)paddr;
61*78acc472SPeter Tyser 		base = (u64)(address_map[i].paddr);
62*78acc472SPeter Tyser 		upper = (u64)(address_map[i].size) + base - 1;
63*78acc472SPeter Tyser 
64*78acc472SPeter Tyser 		if (addr >= base && addr <= upper) {
65*78acc472SPeter Tyser 			return paddr - address_map[i].paddr + address_map[i].vaddr;
66*78acc472SPeter Tyser 		}
67*78acc472SPeter Tyser 	}
68*78acc472SPeter Tyser 
69*78acc472SPeter Tyser 	return (unsigned long)(~0);
70*78acc472SPeter Tyser }
71*78acc472SPeter Tyser 
72*78acc472SPeter Tyser void addrmap_set_entry(unsigned long vaddr, phys_addr_t paddr,
73*78acc472SPeter Tyser 			phys_size_t size, int idx)
74*78acc472SPeter Tyser {
75*78acc472SPeter Tyser 	if (idx > CONFIG_SYS_NUM_ADDR_MAP)
76*78acc472SPeter Tyser 		return;
77*78acc472SPeter Tyser 
78*78acc472SPeter Tyser 	address_map[idx].vaddr = vaddr;
79*78acc472SPeter Tyser 	address_map[idx].paddr = paddr;
80*78acc472SPeter Tyser 	address_map[idx].size  = size;
81*78acc472SPeter Tyser }
82