mdio-xgene.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. // SPDX-License-Identifier: GPL-2.0+
  2. /* Applied Micro X-Gene SoC MDIO Driver
  3. *
  4. * Copyright (c) 2016, Applied Micro Circuits Corporation
  5. * Author: Iyappan Subramanian <isubramanian@apm.com>
  6. */
  7. #ifndef __MDIO_XGENE_H__
  8. #define __MDIO_XGENE_H__
  9. #define BLOCK_XG_MDIO_CSR_OFFSET 0x5000
  10. #define BLOCK_DIAG_CSR_OFFSET 0xd000
  11. #define XGENET_CONFIG_REG_ADDR 0x20
  12. #define MAC_ADDR_REG_OFFSET 0x00
  13. #define MAC_COMMAND_REG_OFFSET 0x04
  14. #define MAC_WRITE_REG_OFFSET 0x08
  15. #define MAC_READ_REG_OFFSET 0x0c
  16. #define MAC_COMMAND_DONE_REG_OFFSET 0x10
  17. #define CLKEN_OFFSET 0x08
  18. #define SRST_OFFSET 0x00
  19. #define MENET_CFG_MEM_RAM_SHUTDOWN_ADDR 0x70
  20. #define MENET_BLOCK_MEM_RDY_ADDR 0x74
  21. #define MAC_CONFIG_1_ADDR 0x00
  22. #define MII_MGMT_COMMAND_ADDR 0x24
  23. #define MII_MGMT_ADDRESS_ADDR 0x28
  24. #define MII_MGMT_CONTROL_ADDR 0x2c
  25. #define MII_MGMT_STATUS_ADDR 0x30
  26. #define MII_MGMT_INDICATORS_ADDR 0x34
  27. #define SOFT_RESET BIT(31)
  28. #define MII_MGMT_CONFIG_ADDR 0x20
  29. #define MII_MGMT_COMMAND_ADDR 0x24
  30. #define MII_MGMT_ADDRESS_ADDR 0x28
  31. #define MII_MGMT_CONTROL_ADDR 0x2c
  32. #define MII_MGMT_STATUS_ADDR 0x30
  33. #define MII_MGMT_INDICATORS_ADDR 0x34
  34. #define MIIM_COMMAND_ADDR 0x20
  35. #define MIIM_FIELD_ADDR 0x24
  36. #define MIIM_CONFIGURATION_ADDR 0x28
  37. #define MIIM_LINKFAILVECTOR_ADDR 0x2c
  38. #define MIIM_INDICATOR_ADDR 0x30
  39. #define MIIMRD_FIELD_ADDR 0x34
  40. #define MDIO_CSR_OFFSET 0x5000
  41. #define REG_ADDR_POS 0
  42. #define REG_ADDR_LEN 5
  43. #define PHY_ADDR_POS 8
  44. #define PHY_ADDR_LEN 5
  45. #define HSTMIIMWRDAT_POS 0
  46. #define HSTMIIMWRDAT_LEN 16
  47. #define HSTPHYADX_POS 23
  48. #define HSTPHYADX_LEN 5
  49. #define HSTREGADX_POS 18
  50. #define HSTREGADX_LEN 5
  51. #define HSTLDCMD BIT(3)
  52. #define HSTMIIMCMD_POS 0
  53. #define HSTMIIMCMD_LEN 3
  54. #define BUSY_MASK BIT(0)
  55. #define READ_CYCLE_MASK BIT(0)
  56. enum xgene_enet_cmd {
  57. XGENE_ENET_WR_CMD = BIT(31),
  58. XGENE_ENET_RD_CMD = BIT(30)
  59. };
  60. enum {
  61. MIIM_CMD_IDLE,
  62. MIIM_CMD_LEGACY_WRITE,
  63. MIIM_CMD_LEGACY_READ,
  64. };
  65. enum xgene_mdio_id {
  66. XGENE_MDIO_RGMII = 1,
  67. XGENE_MDIO_XFI
  68. };
  69. struct xgene_mdio_pdata {
  70. struct clk *clk;
  71. struct device *dev;
  72. void __iomem *mac_csr_addr;
  73. void __iomem *diag_csr_addr;
  74. void __iomem *mdio_csr_addr;
  75. struct mii_bus *mdio_bus;
  76. int mdio_id;
  77. spinlock_t mac_lock; /* mac lock */
  78. };
  79. /* Set the specified value into a bit-field defined by its starting position
  80. * and length within a single u64.
  81. */
  82. static inline u64 xgene_enet_set_field_value(int pos, int len, u64 val)
  83. {
  84. return (val & ((1ULL << len) - 1)) << pos;
  85. }
  86. #define SET_VAL(field, val) \
  87. xgene_enet_set_field_value(field ## _POS, field ## _LEN, val)
  88. #define SET_BIT(field) \
  89. xgene_enet_set_field_value(field ## _POS, 1, 1)
  90. /* Get the value from a bit-field defined by its starting position
  91. * and length within the specified u64.
  92. */
  93. static inline u64 xgene_enet_get_field_value(int pos, int len, u64 src)
  94. {
  95. return (src >> pos) & ((1ULL << len) - 1);
  96. }
  97. #define GET_VAL(field, src) \
  98. xgene_enet_get_field_value(field ## _POS, field ## _LEN, src)
  99. #define GET_BIT(field, src) \
  100. xgene_enet_get_field_value(field ## _POS, 1, src)
  101. u32 xgene_mdio_rd_mac(struct xgene_mdio_pdata *pdata, u32 rd_addr);
  102. void xgene_mdio_wr_mac(struct xgene_mdio_pdata *pdata, u32 wr_addr, u32 data);
  103. int xgene_mdio_rgmii_read(struct mii_bus *bus, int phy_id, int reg);
  104. int xgene_mdio_rgmii_write(struct mii_bus *bus, int phy_id, int reg, u16 data);
  105. struct phy_device *xgene_enet_phy_register(struct mii_bus *bus, int phy_addr);
  106. #endif /* __MDIO_XGENE_H__ */