msg_port.h 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. /* SPDX-License-Identifier: GPL-2.0+ */
  2. /*
  3. * Copyright (C) 2015, Bin Meng <bmeng.cn@gmail.com>
  4. */
  5. #ifndef _QUARK_MSG_PORT_H_
  6. #define _QUARK_MSG_PORT_H_
  7. /*
  8. * In the Quark SoC, some chipset commands are accomplished by utilizing
  9. * the internal message network within the host bridge (D0:F0). Accesses
  10. * to this network are accomplished by populating the message control
  11. * register (MCR), Message Control Register eXtension (MCRX) and the
  12. * message data register (MDR).
  13. */
  14. #define MSG_CTRL_REG 0xd0 /* Message Control Register */
  15. #define MSG_DATA_REG 0xd4 /* Message Data Register */
  16. #define MSG_CTRL_EXT_REG 0xd8 /* Message Control Register EXT */
  17. /* Normal Read/Write OpCodes */
  18. #define MSG_OP_READ 0x10
  19. #define MSG_OP_WRITE 0x11
  20. /* Alternative Read/Write OpCodes */
  21. #define MSG_OP_ALT_READ 0x06
  22. #define MSG_OP_ALT_WRITE 0x07
  23. /* IO Read/Write OpCodes */
  24. #define MSG_OP_IO_READ 0x02
  25. #define MSG_OP_IO_WRITE 0x03
  26. /* All byte enables */
  27. #define MSG_BYTE_ENABLE 0xf0
  28. #ifndef __ASSEMBLY__
  29. /**
  30. * msg_port_setup - set up the message port control register
  31. *
  32. * @op: message bus access opcode
  33. * @port: port number on the message bus
  34. * @reg: register number within a port
  35. */
  36. void msg_port_setup(int op, int port, int reg);
  37. /**
  38. * msg_port_read - read a message port register using normal opcode
  39. *
  40. * @port: port number on the message bus
  41. * @reg: register number within a port
  42. *
  43. * @return: message port register value
  44. */
  45. u32 msg_port_read(u8 port, u32 reg);
  46. /**
  47. * msg_port_write - write a message port register using normal opcode
  48. *
  49. * @port: port number on the message bus
  50. * @reg: register number within a port
  51. * @value: register value to write
  52. */
  53. void msg_port_write(u8 port, u32 reg, u32 value);
  54. /**
  55. * msg_port_alt_read - read a message port register using alternative opcode
  56. *
  57. * @port: port number on the message bus
  58. * @reg: register number within a port
  59. *
  60. * @return: message port register value
  61. */
  62. u32 msg_port_alt_read(u8 port, u32 reg);
  63. /**
  64. * msg_port_alt_write - write a message port register using alternative opcode
  65. *
  66. * @port: port number on the message bus
  67. * @reg: register number within a port
  68. * @value: register value to write
  69. */
  70. void msg_port_alt_write(u8 port, u32 reg, u32 value);
  71. /**
  72. * msg_port_io_read - read a message port register using I/O opcode
  73. *
  74. * @port: port number on the message bus
  75. * @reg: register number within a port
  76. *
  77. * @return: message port register value
  78. */
  79. u32 msg_port_io_read(u8 port, u32 reg);
  80. /**
  81. * msg_port_io_write - write a message port register using I/O opcode
  82. *
  83. * @port: port number on the message bus
  84. * @reg: register number within a port
  85. * @value: register value to write
  86. */
  87. void msg_port_io_write(u8 port, u32 reg, u32 value);
  88. /* clrbits, setbits, clrsetbits macros for message port access */
  89. #define msg_port_normal_read msg_port_read
  90. #define msg_port_normal_write msg_port_write
  91. #define msg_port_generic_clrsetbits(type, port, reg, clr, set) \
  92. msg_port_##type##_write(port, reg, \
  93. (msg_port_##type##_read(port, reg) \
  94. & ~(clr)) | (set))
  95. #define msg_port_clrbits(port, reg, clr) \
  96. msg_port_generic_clrsetbits(normal, port, reg, clr, 0)
  97. #define msg_port_setbits(port, reg, set) \
  98. msg_port_generic_clrsetbits(normal, port, reg, 0, set)
  99. #define msg_port_clrsetbits(port, reg, clr, set) \
  100. msg_port_generic_clrsetbits(normal, port, reg, clr, set)
  101. #define msg_port_alt_clrbits(port, reg, clr) \
  102. msg_port_generic_clrsetbits(alt, port, reg, clr, 0)
  103. #define msg_port_alt_setbits(port, reg, set) \
  104. msg_port_generic_clrsetbits(alt, port, reg, 0, set)
  105. #define msg_port_alt_clrsetbits(port, reg, clr, set) \
  106. msg_port_generic_clrsetbits(alt, port, reg, clr, set)
  107. #define msg_port_io_clrbits(port, reg, clr) \
  108. msg_port_generic_clrsetbits(io, port, reg, clr, 0)
  109. #define msg_port_io_setbits(port, reg, set) \
  110. msg_port_generic_clrsetbits(io, port, reg, 0, set)
  111. #define msg_port_io_clrsetbits(port, reg, clr, set) \
  112. msg_port_generic_clrsetbits(io, port, reg, clr, set)
  113. #endif /* __ASSEMBLY__ */
  114. #endif /* _QUARK_MSG_PORT_H_ */