addr_map.c 1.4 KB

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