addr_map.c 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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. #include <mapmem.h>
  8. struct addrmap address_map[CONFIG_SYS_NUM_ADDR_MAP];
  9. phys_addr_t addrmap_virt_to_phys(void * vaddr)
  10. {
  11. int i;
  12. for (i = 0; i < CONFIG_SYS_NUM_ADDR_MAP; i++) {
  13. u64 base, upper, addr;
  14. if (address_map[i].size == 0)
  15. continue;
  16. addr = map_to_sysmem(vaddr);
  17. base = (u64)(address_map[i].vaddr);
  18. upper = (u64)(address_map[i].size) + base - 1;
  19. if (addr >= base && addr <= upper) {
  20. return addr - address_map[i].vaddr + address_map[i].paddr;
  21. }
  22. }
  23. return (phys_addr_t)(~0);
  24. }
  25. void *addrmap_phys_to_virt(phys_addr_t paddr)
  26. {
  27. int i;
  28. for (i = 0; i < CONFIG_SYS_NUM_ADDR_MAP; i++) {
  29. phys_addr_t base, upper;
  30. if (address_map[i].size == 0)
  31. continue;
  32. base = address_map[i].paddr;
  33. upper = address_map[i].size + base - 1;
  34. if (paddr >= base && paddr <= upper) {
  35. phys_addr_t offset;
  36. offset = address_map[i].paddr - address_map[i].vaddr;
  37. return map_sysmem(paddr - offset, 0);
  38. }
  39. }
  40. return (void *)(~0);
  41. }
  42. void addrmap_set_entry(unsigned long vaddr, phys_addr_t paddr,
  43. phys_size_t size, int idx)
  44. {
  45. if (idx > CONFIG_SYS_NUM_ADDR_MAP)
  46. return;
  47. address_map[idx].vaddr = vaddr;
  48. address_map[idx].paddr = paddr;
  49. address_map[idx].size = size;
  50. }