ofw_io.h 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. /*
  2. * Copyright (c) 2006-2022, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2022-08-25 GuEe-GUI first version
  9. */
  10. #ifndef __OFW_IO_H__
  11. #define __OFW_IO_H__
  12. #include <ioremap.h>
  13. #include <drivers/ofw.h>
  14. int rt_ofw_bus_addr_cells(struct rt_ofw_node *np);
  15. int rt_ofw_bus_size_cells(struct rt_ofw_node *np);
  16. int rt_ofw_io_addr_cells(struct rt_ofw_node *np);
  17. int rt_ofw_io_size_cells(struct rt_ofw_node *np);
  18. int rt_ofw_get_address_count(struct rt_ofw_node *np);
  19. rt_err_t rt_ofw_get_address(struct rt_ofw_node *np, int index, rt_uint64_t *out_address, rt_uint64_t *out_size);
  20. rt_err_t rt_ofw_get_address_by_name(struct rt_ofw_node *np, const char *name,
  21. rt_uint64_t *out_address, rt_uint64_t *out_size);
  22. int rt_ofw_get_address_array(struct rt_ofw_node *np, int nr, rt_uint64_t *out_regs);
  23. rt_uint64_t rt_ofw_translate_address(struct rt_ofw_node *np, const char *range_type, rt_uint64_t address);
  24. rt_uint64_t rt_ofw_reverse_address(struct rt_ofw_node *np, const char *range_type, rt_uint64_t address);
  25. rt_inline rt_uint64_t rt_ofw_translate_dma2cpu(struct rt_ofw_node *np, rt_uint64_t address)
  26. {
  27. rt_uint64_t bus_addr, cpu_addr;
  28. bus_addr = rt_ofw_reverse_address(np, "dma-ranges", address);
  29. cpu_addr = rt_ofw_translate_address(np, "ranges", bus_addr);
  30. return cpu_addr != ~0ULL ? cpu_addr : address;
  31. }
  32. rt_inline rt_uint64_t rt_ofw_translate_cpu2dma(struct rt_ofw_node *np, rt_uint64_t address)
  33. {
  34. rt_uint64_t bus_addr, dma_addr;
  35. bus_addr = rt_ofw_reverse_address(np, "ranges", address);
  36. dma_addr = rt_ofw_translate_address(np, "dma-ranges", bus_addr);
  37. return dma_addr != ~0ULL ? dma_addr : address;
  38. }
  39. void *rt_ofw_iomap(struct rt_ofw_node *np, int index);
  40. void *rt_ofw_iomap_by_name(struct rt_ofw_node *np, const char *name);
  41. #endif /* __OFW_IO_H__ */