|  | /* | 
|  | * Copyright 2008 Freescale Semiconductor, Inc. | 
|  | * | 
|  | * This program is free software; you can redistribute it and/or | 
|  | * modify it under the terms of the GNU General Public License | 
|  | * Version 2 as published by the Free Software Foundation. | 
|  | * | 
|  | * This program is distributed in the hope that it will be useful, | 
|  | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|  | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|  | * GNU General Public License for more details. | 
|  | * | 
|  | * You should have received a copy of the GNU General Public License | 
|  | * along with this program; if not, write to the Free Software | 
|  | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, | 
|  | * MA 02111-1307 USA | 
|  | */ | 
|  |  | 
|  | #include <common.h> | 
|  | #include <addr_map.h> | 
|  |  | 
|  | static struct { | 
|  | phys_addr_t paddr; | 
|  | phys_size_t size; | 
|  | unsigned long vaddr; | 
|  | } 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; | 
|  | } |