addr_trans.c 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. #include <platform/addr_trans.h>
  2. int virt_to_phys_addr(addr_trans_tbl_t *tbl, virt_addr_t_addtrans *virt, phys_addr_t_addtrans *phys)
  3. {
  4. unsigned int i;
  5. unsigned int num = tbl->num;
  6. unsigned long long base_addr = 0, boundary_addr = 0;
  7. addr_trans_info_t *info = tbl->info;
  8. if (!info) {
  9. phys->id = 0;
  10. phys->addr = virt->addr;
  11. return 0;
  12. }
  13. for (i = 0; i < num; i++, info++) {
  14. if (info->len) {
  15. boundary_addr += info->len;
  16. if (boundary_addr < base_addr)
  17. break; /* overflow */
  18. if ((base_addr <= virt->addr) && (virt->addr < boundary_addr)) {
  19. phys->id = info->id;
  20. phys->addr = virt->addr - base_addr;
  21. return 0;
  22. }
  23. base_addr += info->len;
  24. }
  25. }
  26. return -1;
  27. }
  28. int phys_to_virt_addr(addr_trans_tbl_t *tbl, phys_addr_t_addtrans *phys, virt_addr_t_addtrans *virt)
  29. {
  30. unsigned int i;
  31. unsigned int num = tbl->num;
  32. unsigned long long base_addr = 0;
  33. addr_trans_info_t *info = tbl->info;
  34. if (!info) {
  35. virt->addr = phys->addr;
  36. return 0;
  37. }
  38. for (i = 0; i < num; i++, info++) {
  39. if (info->id == phys->id && info->len && phys->addr <= info->len) {
  40. virt->addr = phys->addr + base_addr;
  41. return 0;
  42. }
  43. base_addr += info->len;
  44. }
  45. return -1;
  46. }