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