mdio-xgene.h 3.6 KB

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