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