addr_map.c 1.4 KB

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