dm.h 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  1. /*
  2. * Copyright (c) 2006-2021, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. *
  6. * Change Logs:
  7. * Date Author Notes
  8. * 2023-04-20 ErikChan the first version
  9. */
  10. #ifndef __CORE_DM_H__
  11. #define __CORE_DM_H__
  12. #include <rthw.h>
  13. #include <rtdef.h>
  14. #include <bitmap.h>
  15. #include <ioremap.h>
  16. #include <drivers/misc.h>
  17. #include <drivers/byteorder.h>
  18. #include <drivers/core/master_id.h>
  19. #ifndef RT_CPUS_NR
  20. #define RT_CPUS_NR 1
  21. #endif
  22. #ifndef RT_USING_SMP
  23. extern int rt_hw_cpu_id(void);
  24. #endif
  25. void rt_dm_secondary_cpu_init(void);
  26. /* ID Allocation */
  27. struct rt_dm_ida
  28. {
  29. rt_uint8_t master_id;
  30. #define RT_DM_IDA_NUM 256
  31. RT_BITMAP_DECLARE(map, RT_DM_IDA_NUM);
  32. struct rt_spinlock lock;
  33. };
  34. #define RT_DM_IDA_INIT(id) { .master_id = MASTER_ID_##id }
  35. #define rt_dm_ida_init(ida, id) \
  36. do { \
  37. (ida)->master_id = MASTER_ID_##id; \
  38. rt_spin_lock_init(&(ida)->lock); \
  39. } while (0)
  40. int rt_dm_ida_alloc(struct rt_dm_ida *ida);
  41. rt_bool_t rt_dm_ida_take(struct rt_dm_ida *ida, int id);
  42. void rt_dm_ida_free(struct rt_dm_ida *ida, int id);
  43. rt_device_t rt_dm_device_find(int master_id, int device_id);
  44. int rt_dm_dev_set_name_auto(rt_device_t dev, const char *prefix);
  45. int rt_dm_dev_get_name_id(rt_device_t dev);
  46. int rt_dm_dev_set_name(rt_device_t dev, const char *format, ...);
  47. const char *rt_dm_dev_get_name(rt_device_t dev);
  48. int rt_dm_dev_get_address_count(rt_device_t dev);
  49. rt_err_t rt_dm_dev_get_address(rt_device_t dev, int index,
  50. rt_uint64_t *out_address, rt_uint64_t *out_size);
  51. rt_err_t rt_dm_dev_get_address_by_name(rt_device_t dev, const char *name,
  52. rt_uint64_t *out_address, rt_uint64_t *out_size);
  53. int rt_dm_dev_get_address_array(rt_device_t dev, int nr, rt_uint64_t *out_regs);
  54. void *rt_dm_dev_iomap(rt_device_t dev, int index);
  55. void *rt_dm_dev_iomap_by_name(rt_device_t dev, const char *name);
  56. int rt_dm_dev_get_irq_count(rt_device_t dev);
  57. int rt_dm_dev_get_irq(rt_device_t dev, int index);
  58. int rt_dm_dev_get_irq_by_name(rt_device_t dev, const char *name);
  59. void rt_dm_dev_bind_fwdata(rt_device_t dev, void *fw_np, void *data);
  60. void rt_dm_dev_unbind_fwdata(rt_device_t dev, void *fw_np);
  61. int rt_dm_dev_prop_read_u8_array_index(rt_device_t dev, const char *propname,
  62. int index, int nr, rt_uint8_t *out_values);
  63. int rt_dm_dev_prop_read_u16_array_index(rt_device_t dev, const char *propname,
  64. int index, int nr, rt_uint16_t *out_values);
  65. int rt_dm_dev_prop_read_u32_array_index(rt_device_t dev, const char *propname,
  66. int index, int nr, rt_uint32_t *out_values);
  67. int rt_dm_dev_prop_read_u64_array_index(rt_device_t dev, const char *propname,
  68. int index, int nr, rt_uint64_t *out_values);
  69. int rt_dm_dev_prop_read_string_array_index(rt_device_t dev, const char *propname,
  70. int index, int nr, const char **out_strings);
  71. int rt_dm_dev_prop_count_of_size(rt_device_t dev, const char *propname, int size);
  72. int rt_dm_dev_prop_index_of_string(rt_device_t dev, const char *propname, const char *string);
  73. rt_bool_t rt_dm_dev_prop_read_bool(rt_device_t dev, const char *propname);
  74. rt_inline rt_err_t rt_dm_dev_prop_read_u8_index(rt_device_t dev, const char *propname,
  75. int index, rt_uint8_t *out_value)
  76. {
  77. int nr = rt_dm_dev_prop_read_u8_array_index(dev, propname, index, 1, out_value);
  78. return nr > 0 ? RT_EOK : (rt_err_t)nr;
  79. }
  80. rt_inline rt_err_t rt_dm_dev_prop_read_u16_index(rt_device_t dev, const char *propname,
  81. int index, rt_uint16_t *out_value)
  82. {
  83. int nr = rt_dm_dev_prop_read_u16_array_index(dev, propname, index, 1, out_value);
  84. return nr > 0 ? RT_EOK : (rt_err_t)nr;
  85. }
  86. rt_inline rt_err_t rt_dm_dev_prop_read_u32_index(rt_device_t dev, const char *propname,
  87. int index, rt_uint32_t *out_value)
  88. {
  89. int nr = rt_dm_dev_prop_read_u32_array_index(dev, propname, index, 1, out_value);
  90. return nr > 0 ? RT_EOK : (rt_err_t)nr;
  91. }
  92. rt_inline rt_err_t rt_dm_dev_prop_read_u64_index(rt_device_t dev, const char *propname,
  93. int index, rt_uint64_t *out_value)
  94. {
  95. int nr = rt_dm_dev_prop_read_u64_array_index(dev, propname, index, 1, out_value);
  96. return nr > 0 ? RT_EOK : (rt_err_t)nr;
  97. }
  98. rt_inline rt_err_t rt_dm_dev_prop_read_string_index(rt_device_t dev, const char *propname,
  99. int index, const char **out_string)
  100. {
  101. int nr = rt_dm_dev_prop_read_string_array_index(dev, propname, index, 1, out_string);
  102. return nr > 0 ? RT_EOK : (rt_err_t)nr;
  103. }
  104. rt_inline rt_err_t rt_dm_dev_prop_read_u8(rt_device_t dev, const char *propname,
  105. rt_uint8_t *out_value)
  106. {
  107. return rt_dm_dev_prop_read_u8_index(dev, propname, 0, out_value);
  108. }
  109. rt_inline rt_err_t rt_dm_dev_prop_read_u16(rt_device_t dev, const char *propname,
  110. rt_uint16_t *out_value)
  111. {
  112. return rt_dm_dev_prop_read_u16_index(dev, propname, 0, out_value);
  113. }
  114. rt_inline rt_err_t rt_dm_dev_prop_read_u32(rt_device_t dev, const char *propname,
  115. rt_uint32_t *out_value)
  116. {
  117. return rt_dm_dev_prop_read_u32_index(dev, propname, 0, out_value);
  118. }
  119. rt_inline rt_err_t rt_dm_dev_prop_read_s32(rt_device_t dev, const char *propname,
  120. rt_int32_t *out_value)
  121. {
  122. return rt_dm_dev_prop_read_u32_index(dev, propname, 0, (rt_uint32_t *)out_value);
  123. }
  124. rt_inline rt_err_t rt_dm_dev_prop_read_u64(rt_device_t dev, const char *propname,
  125. rt_uint64_t *out_value)
  126. {
  127. return rt_dm_dev_prop_read_u64_index(dev, propname, 0, out_value);
  128. }
  129. rt_inline rt_err_t rt_dm_dev_prop_read_string(rt_device_t dev, const char *propname,
  130. const char **out_string)
  131. {
  132. return rt_dm_dev_prop_read_string_index(dev, propname, 0, out_string);
  133. }
  134. rt_inline int rt_dm_dev_prop_count_of_u8(rt_device_t dev, const char *propname)
  135. {
  136. return rt_dm_dev_prop_count_of_size(dev, propname, sizeof(rt_uint8_t));
  137. }
  138. rt_inline int rt_dm_dev_prop_count_of_u16(rt_device_t dev, const char *propname)
  139. {
  140. return rt_dm_dev_prop_count_of_size(dev, propname, sizeof(rt_uint16_t));
  141. }
  142. rt_inline int rt_dm_dev_prop_count_of_u32(rt_device_t dev, const char *propname)
  143. {
  144. return rt_dm_dev_prop_count_of_size(dev, propname, sizeof(rt_uint32_t));
  145. }
  146. rt_inline int rt_dm_dev_prop_count_of_u64(rt_device_t dev, const char *propname)
  147. {
  148. return rt_dm_dev_prop_count_of_size(dev, propname, sizeof(rt_uint64_t));
  149. }
  150. #endif /* __RT_DM_H__ */