phy_patch.h 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. /*
  2. * SPDX-License-Identifier: GPL-2.0-only
  3. *
  4. * Copyright (c) 2023 Realtek Semiconductor Corp. All rights reserved.
  5. */
  6. #ifndef __HAL_PHY_PATCH_H__
  7. #define __HAL_PHY_PATCH_H__
  8. /*
  9. * Include Files
  10. */
  11. #if defined(RTK_PHYDRV_IN_LINUX)
  12. #include "rtk_phylib_def.h"
  13. #else
  14. #include <common/rt_type.h>
  15. #include <common/rt_autoconf.h>
  16. #endif
  17. /*
  18. * Symbol Definition
  19. */
  20. #define PHYPATCH_PHYCTRL_IN_HALCTRL 0 /* 3.6.x: 1 ,4.0.x: 1, 4.1.x+: 0 */
  21. #define PHYPATCH_FMAILY_IN_HWP 0 /* 3.6.x: 1 ,4.0.x: 0, 4.1.x+: 0 */
  22. #define PHY_PATCH_MODE_BCAST_DEFAULT PHY_PATCH_MODE_BCAST /* 3.6.x: PHY_PATCH_MODE_BCAST_BUS ,4.0.x+: PHY_PATCH_MODE_BCAST */
  23. #define PHY_PATCH_MODE_NORMAL 0
  24. #define PHY_PATCH_MODE_CMP 1
  25. #define PHY_PATCH_MODE_BCAST 2
  26. #define PHY_PATCH_MODE_BCAST_BUS 3
  27. #define RTK_PATCH_CMP_W 0 /* write */
  28. #define RTK_PATCH_CMP_WC 1 /* compare */
  29. #define RTK_PATCH_CMP_SWC 2 /* sram compare */
  30. #define RTK_PATCH_CMP_WS 3 /* skip */
  31. #define RTK_PATCH_OP_SECTION_SIZE 50
  32. #define RTK_PATCH_OP_TO_CMP(_op, _cmp) (_op + (RTK_PATCH_OP_SECTION_SIZE * _cmp))
  33. /* 0~49 normal op */
  34. #define RTK_PATCH_OP_PHY 0
  35. #define RTK_PATCH_OP_PHYOCP 1
  36. #define RTK_PATCH_OP_TOP 2
  37. #define RTK_PATCH_OP_TOPOCP 3
  38. #define RTK_PATCH_OP_PSDS0 4
  39. #define RTK_PATCH_OP_PSDS1 5
  40. #define RTK_PATCH_OP_MSDS 6
  41. #define RTK_PATCH_OP_MAC 7
  42. /* 50~99 normal op for compare */
  43. #define RTK_PATCH_OP_CMP_PHY RTK_PATCH_OP_TO_CMP(RTK_PATCH_OP_PHY , RTK_PATCH_CMP_WC)
  44. #define RTK_PATCH_OP_CMP_PHYOCP RTK_PATCH_OP_TO_CMP(RTK_PATCH_OP_PHYOCP , RTK_PATCH_CMP_WC)
  45. #define RTK_PATCH_OP_CMP_TOP RTK_PATCH_OP_TO_CMP(RTK_PATCH_OP_TOP , RTK_PATCH_CMP_WC)
  46. #define RTK_PATCH_OP_CMP_TOPOCP RTK_PATCH_OP_TO_CMP(RTK_PATCH_OP_TOPOCP , RTK_PATCH_CMP_WC)
  47. #define RTK_PATCH_OP_CMP_PSDS0 RTK_PATCH_OP_TO_CMP(RTK_PATCH_OP_PSDS0 , RTK_PATCH_CMP_WC)
  48. #define RTK_PATCH_OP_CMP_PSDS1 RTK_PATCH_OP_TO_CMP(RTK_PATCH_OP_PSDS1 , RTK_PATCH_CMP_WC)
  49. #define RTK_PATCH_OP_CMP_MSDS RTK_PATCH_OP_TO_CMP(RTK_PATCH_OP_MSDS , RTK_PATCH_CMP_WC)
  50. #define RTK_PATCH_OP_CMP_MAC RTK_PATCH_OP_TO_CMP(RTK_PATCH_OP_MAC , RTK_PATCH_CMP_WC)
  51. /* 100~149 normal op for sram compare */
  52. #define RTK_PATCH_OP_CMP_SRAM_PHY RTK_PATCH_OP_TO_CMP(RTK_PATCH_OP_PHY , RTK_PATCH_CMP_SWC)
  53. #define RTK_PATCH_OP_CMP_SRAM_PHYOCP RTK_PATCH_OP_TO_CMP(RTK_PATCH_OP_PHYOCP , RTK_PATCH_CMP_SWC)
  54. #define RTK_PATCH_OP_CMP_SRAM_TOP RTK_PATCH_OP_TO_CMP(RTK_PATCH_OP_TOP , RTK_PATCH_CMP_SWC)
  55. #define RTK_PATCH_OP_CMP_SRAM_TOPOCP RTK_PATCH_OP_TO_CMP(RTK_PATCH_OP_TOPOCP , RTK_PATCH_CMP_SWC)
  56. #define RTK_PATCH_OP_CMP_SRAM_PSDS0 RTK_PATCH_OP_TO_CMP(RTK_PATCH_OP_PSDS0 , RTK_PATCH_CMP_SWC)
  57. #define RTK_PATCH_OP_CMP_SRAM_PSDS1 RTK_PATCH_OP_TO_CMP(RTK_PATCH_OP_PSDS1 , RTK_PATCH_CMP_SWC)
  58. #define RTK_PATCH_OP_CMP_SRAM_MSDS RTK_PATCH_OP_TO_CMP(RTK_PATCH_OP_MSDS , RTK_PATCH_CMP_SWC)
  59. #define RTK_PATCH_OP_CMP_SRAM_MAC RTK_PATCH_OP_TO_CMP(RTK_PATCH_OP_MAC , RTK_PATCH_CMP_SWC)
  60. /* 200~255 control op */
  61. #define RTK_PATCH_OP_DELAY_MS 200
  62. #define RTK_PATCH_OP_SKIP 255
  63. /*
  64. patch type PHY_PATCH_TYPE_NONE => empty
  65. patch type: PHY_PATCH_TYPE_TOP ~ (PHY_PATCH_TYPE_END-1) => data array
  66. patch type: PHY_PATCH_TYPE_END ~ (PHY_PATCH_TYPE_END + RTK_PATCH_TYPE_FLOW_MAX) => flow
  67. */
  68. #define RTK_PATCH_TYPE_IS_DATA(_patch_type) (_patch_type > PHY_PATCH_TYPE_NONE && _patch_type < PHY_PATCH_TYPE_END)
  69. #define RTK_PATCH_TYPE_IS_FLOW(_patch_type) (_patch_type >= PHY_PATCH_TYPE_END && _patch_type <= (PHY_PATCH_TYPE_END + RTK_PATCH_TYPE_FLOWID_MAX))
  70. /*
  71. * Macro Definition
  72. */
  73. #if PHYPATCH_PHYCTRL_IN_HALCTRL
  74. #define PHYPATCH_DB_GET(_unit, _port, _pPatchDb) \
  75. do {\
  76. hal_control_t *pHalCtrl = NULL;\
  77. if ((pHalCtrl = hal_ctrlInfo_get(_unit)) == NULL)\
  78. return RT_ERR_FAILED;\
  79. _pPatchDb = (pHalCtrl->pPhy_ctrl[_port]->pPhy_patchDb);\
  80. } while(0)
  81. #else
  82. #if defined(RTK_PHYDRV_IN_LINUX)
  83. #else
  84. #include <hal/phy/phydef.h>
  85. #include <hal/phy/phy_probe.h>
  86. #endif
  87. #define PHYPATCH_DB_GET(_unit, _port, _pPatchDb) \
  88. do {\
  89. rt_phyctrl_t *pPhyCtrl = NULL;\
  90. if ((pPhyCtrl = phy_phyctrl_get(_unit, _port)) == NULL)\
  91. return RT_ERR_FAILED;\
  92. _pPatchDb = (pPhyCtrl->pPhy_patchDb);\
  93. } while(0)
  94. #endif
  95. #if PHYPATCH_FMAILY_IN_HWP
  96. #define PHYPATCH_IS_RTKSDS(_unit) (HWP_9300_FAMILY_ID(_unit) || HWP_9310_FAMILY_ID(_unit))
  97. #else
  98. #define PHYPATCH_IS_RTKSDS(_unit) (RTK_9300_FAMILY_ID(_unit) || RTK_9310_FAMILY_ID(_unit) || RTK_9311B_FAMILY_ID(_unit) || RTK_9330_FAMILY_ID(_unit))
  99. #endif
  100. #define PHYPATCH_TABLE_ASSIGN(_pPatchDb, _table, _idx, _patch_type, _para) \
  101. do {\
  102. if (RTK_PATCH_TYPE_IS_DATA(_patch_type)) {\
  103. _pPatchDb->_table[_idx].patch_type = _patch_type;\
  104. _pPatchDb->_table[_idx].patch.data.conf = _para;\
  105. _pPatchDb->_table[_idx].patch.data.size = sizeof(_para);\
  106. }\
  107. else if (RTK_PATCH_TYPE_IS_FLOW(_patch_type)) {\
  108. _pPatchDb->_table[_idx].patch_type = _patch_type;\
  109. _pPatchDb->_table[_idx].patch.flow_id = _patch_type;\
  110. }\
  111. else {\
  112. _pPatchDb->_table[_idx].patch_type = PHY_PATCH_TYPE_NONE;\
  113. }\
  114. } while(0)
  115. #define PHYPATCH_SEQ_TABLE_ASSIGN(_pPatchDb, _idx, _patch_type, _para) PHYPATCH_TABLE_ASSIGN(_pPatchDb, seq_table, _idx, _patch_type, _para)
  116. #define PHYPATCH_CMP_TABLE_ASSIGN(_pPatchDb, _idx, _patch_type, _para) PHYPATCH_TABLE_ASSIGN(_pPatchDb, cmp_table, _idx, _patch_type, _para)
  117. #define PHYPATCH_COMPARE(_mmdpage, _reg, _msb, _lsb, _exp, _real, _mask) \
  118. do {\
  119. uint32 _rData = REG32_FIELD_GET(_real, _lsb, _mask);\
  120. if (_exp != _rData) {\
  121. osal_printf("PATCH CHECK: %u(0x%X).%u(0x%X)[%u:%u] = 0x%X (!= 0x%X)\n", _mmdpage, _mmdpage, _reg, _reg, _msb, _lsb, _rData, _exp);\
  122. return RT_ERR_CHECK_FAILED;\
  123. }\
  124. } while (0)
  125. /*
  126. * Function Declaration
  127. */
  128. extern uint8 phy_patch_op_translate(uint8 patch_mode, uint8 patch_op, uint8 compare_op);
  129. extern int32 phy_patch_op(rt_phy_patch_db_t *pPhy_patchDb, uint32 unit, rtk_port_t port, uint8 portOffset,
  130. uint8 patch_op, uint16 portmask, uint16 pagemmd, uint16 addr, uint8 msb, uint8 lsb, uint16 data,
  131. uint8 patch_mode);
  132. /* Function Name:
  133. * phy_patch
  134. * Description:
  135. * apply initial patch data to PHY
  136. * Input:
  137. * unit - unit id
  138. * port - port id
  139. * portOffset - the index offset of port based the base port in the PHY chip
  140. * Output:
  141. * None
  142. * Return:
  143. * RT_ERR_OK
  144. * RT_ERR_FAILED
  145. * RT_ERR_CHECK_FAILED
  146. * RT_ERR_NOT_SUPPORTED
  147. * Note:
  148. * None
  149. */
  150. extern int32 phy_patch(uint32 unit, rtk_port_t port, uint8 portOffset, uint8 patch_mode);
  151. #endif /* __HAL_PHY_PATCH_H__ */