bus.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. // This file is Copyright (c) 2023 Victor Suarez Rovere <suarezvictor@gmail.com>
  2. // SPDX-License-Identifier: AGPL-3.0-only
  3. #ifndef __BUS_H__
  4. #define __BUS_H__
  5. #ifdef BUSMASTER_CPU
  6. #define bus_bits() (8*sizeof(BUSMASTER_CPU(0)[0]))
  7. #ifdef __SIZEOF_INT128__
  8. #define busx_master(bus) BUSMASTER_CPU bus, uint128 bus_sel
  9. #else
  10. #if SDRAM_BUS_BITS > 64
  11. #error Bus width not supported
  12. #endif
  13. #define busx_master(bus) BUSMASTER_CPU bus, uint64 bus_sel
  14. #endif
  15. #define busaddr_t intptr_t
  16. #define busaddr_diff_t intptr_t
  17. #define busx_setup32(bus) bus = nullptr
  18. #define busx_acquire(bus)
  19. #define busx_release(bus)
  20. #define busx_reading(bus) false
  21. #define busx_writing(bus) false
  22. #define busx_write_done(bus) true
  23. #define busx_read_done(bus) true
  24. #define busx_write_start(bus, data) *bus = (*bus & ~bus##_sel) | (data & bus##_sel)
  25. #define busx_read_start(bus)
  26. #define busx_read_data(bus) *bus
  27. #define busx_stop(bus)
  28. #define busx_set_address(bus, a) bus = (busmaster_t)(a)
  29. #define busx_get_address(bus) (busaddr_t)(bus)
  30. #define busx_next_address(bus) (++bus)
  31. #define busx_inc_address(bus, a) (bus += (a)/sizeof(*bus))
  32. #define busx_set_mask(bus, mask) bus_sel = (\
  33. ((mask)&(1<<0)?(uint128(255)<<8*0):0) \
  34. | ((mask)&(1<<1)?(uint128(255)<<8*1):0) \
  35. | ((mask)&(1<<2)?(uint128(255)<<8*2):0) \
  36. | ((mask)&(1<<3)?(uint128(255)<<8*3):0) \
  37. | ((mask)&(1<<4)?(uint128(255)<<8*4):0) \
  38. | ((mask)&(1<<5)?(uint128(255)<<8*5):0) \
  39. | ((mask)&(1<<6)?(uint128(255)<<8*6):0) \
  40. | ((mask)&(1<<7)?(uint128(255)<<8*7):0) \
  41. | ((mask)&(1<<8)?(uint128(255)<<8*8):0) \
  42. | ((mask)&(1<<9)?(uint128(255)<<8*9):0) \
  43. | ((mask)&(1<<10)?(uint128(255)<<8*10):0) \
  44. | ((mask)&(1<<11)?(uint128(255)<<8*11):0) \
  45. | ((mask)&(1<<12)?(uint128(255)<<8*12):0) \
  46. | ((mask)&(1<<13)?(uint128(255)<<8*13):0) \
  47. | ((mask)&(1<<14)?(uint128(255)<<8*14):0) \
  48. | ((mask)&(1<<15)?(uint128(255)<<8*15):0))
  49. #define BUSMASTER_ARG busmaster_t(), -1
  50. #else
  51. #ifndef SDRAM_BUS_BITS
  52. #define __ASSEMBLER__ //this avoids function definitions in following header
  53. #include <generated/soc.h>
  54. #undef __ASSEMBLER__
  55. #endif
  56. #define bus_bits() SDRAM_BUS_BITS //FIXME: should be parametrizable
  57. #define busx_setup32(bus) { bus##_cyc = 0; bus##_stb = 0; bus##_sel = 65535; } //up to 16 bytes
  58. #define busx_acquire(bus) { bus##_cyc = 1; }
  59. #define busx_release(bus) { bus##_cyc = 0; bus##_stb = 0; }
  60. #define busx_reading(bus) (bus##_stb && !bus##_we)
  61. #define busx_writing(bus) (bus##_stb && bus##_we)
  62. #define busx_write_done(bus) (bus##_stb && bus##_ack && bus##_we)
  63. #define busx_read_done(bus) (bus##_stb && bus##_ack && !bus##_we)
  64. #define busx_write_start(bus, data) { bus##_dat_w = data; bus##_we = 1; bus##_stb = 1; bus##_cyc = 1; }
  65. #define busx_read_start(bus) { bus##_we = 0; bus##_stb = 1; bus##_cyc = 1; }
  66. #define busx_read_data(bus) bus##_dat_r
  67. #define busx_stop(bus) bus##_stb = 0
  68. #define busx_set_address(bus, a) bus##_adr = (a)
  69. #define busx_get_address(bus) bus##_adr
  70. #define busaddr_t uint32
  71. #define busaddr_diff_t int32
  72. #define busx_inc_address(bus, a) busx_set_address(bus, busx_get_address(bus) + (a))
  73. #define busx_next_address(bus) busx_inc_address(bus, bus_bytes())
  74. #define busx_set_mask(bus, mask) bus##_sel = mask
  75. typedef uintN(SDRAM_BUS_BITS) bus_data_t; //FIXME: should be parametrizable
  76. #define wb_busmater(bus) \
  77. uint1& bus##_cyc, \
  78. uint1& bus##_stb, \
  79. uint32& bus##_adr, \
  80. uint1& bus##_we, \
  81. uintN(SDRAM_BUS_BITS)& bus##_dat_w, \
  82. uint16& bus##_sel, \
  83. const uint1& bus##_ack, \
  84. const uint32& bus##_dat_r
  85. #define busx_master(bus) wb_busmater(bus)
  86. #endif //bus_master
  87. //assumes name is "bus"
  88. #define bus_setup32() busx_setup32(bus)
  89. #define bus_acquire() busx_acquire(bus)
  90. #define bus_release() busx_release(bus)
  91. #define bus_reading() busx_reading(bus)
  92. #define bus_writing() busx_writing(bus)
  93. #define bus_write_done() busx_write_done(bus)
  94. #define bus_read_done() busx_read_done(bus)
  95. #define bus_write_start(data) busx_write_start(bus, data)
  96. #define bus_read_start() busx_read_start(bus)
  97. #define bus_read_data() busx_read_data(bus)
  98. #define bus_stop() busx_stop(bus)
  99. #define bus_set_address(a) busx_set_address(bus, a)
  100. #define bus_get_address() busx_get_address(bus)
  101. #define bus_set_mask(mask) busx_set_mask(bus, mask)
  102. #define bus_master(bus) busx_master(bus)
  103. #define bus_next_address() busx_next_address(bus)
  104. #define bus_inc_address(a) busx_inc_address(bus, a)
  105. //helpers
  106. #define bus_bytes() (bus_bits()>>3)
  107. #define bus_write_pending() (bus_writing() && !bus_write_done())
  108. #define bus_read_pending() (bus_reading() && !bus_write_done())
  109. #define bus_ready() (!bus_write_pending() && !bus_read_pending())
  110. #endif