addr_map.c 1.3 KB

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