Skip to content

Commit 7c12aa0

Browse files
tlendackydavem330
authored andcommitted
amd-xgbe: Move the PHY support into amd-xgbe
The AMD XGBE device is intended to work with a specific integrated PHY and that PHY is not meant to be a standalone PHY for use by other devices. As such this patch removes the phylib driver and implements the PHY support in the amd-xgbe driver (the majority of the logic from the phylib driver is moved into the amd-xgbe driver). Update the driver version to 1.0.1. Signed-off-by: Tom Lendacky <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 7d9ca34 commit 7c12aa0

File tree

14 files changed

+1828
-2274
lines changed

14 files changed

+1828
-2274
lines changed

Documentation/devicetree/bindings/net/amd-xgbe-phy.txt

Lines changed: 0 additions & 48 deletions
This file was deleted.

Documentation/devicetree/bindings/net/amd-xgbe.txt

Lines changed: 48 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
* AMD 10GbE driver (amd-xgbe)
22

3-
Required properties:
3+
Required properties (ethernet device):
44
- compatible: Should be "amd,xgbe-seattle-v1a"
55
- reg: Address and length of the register sets for the device
66
- MAC registers
@@ -22,14 +22,43 @@ Required properties:
2222
- phy-handle: See ethernet.txt file in the same directory
2323
- phy-mode: See ethernet.txt file in the same directory
2424

25-
Optional properties:
25+
Optional properties (ethernet device):
2626
- mac-address: mac address to be assigned to the device. Can be overridden
2727
by UEFI.
2828
- dma-coherent: Present if dma operations are coherent
2929
- amd,per-channel-interrupt: Indicates that Rx and Tx complete will generate
3030
a unique interrupt for each DMA channel - this requires an additional
3131
interrupt be configured for each DMA channel
3232

33+
Required properties (phy device):
34+
- compatible: Should be "amd,xgbe-phy-seattle-v1a"
35+
- reg: Address and length of the register sets for the device
36+
- SerDes Rx/Tx registers
37+
- SerDes integration registers (1/2)
38+
- SerDes integration registers (2/2)
39+
- interrupt-parent: Should be the phandle for the interrupt controller
40+
that services interrupts for this device
41+
- interrupts: Should contain the amd-xgbe-phy interrupt.
42+
43+
Optional properties (phy device):
44+
- amd,speed-set: Speed capabilities of the device
45+
0 - 1GbE and 10GbE (default)
46+
1 - 2.5GbE and 10GbE
47+
48+
The following optional properties are represented by an array with each
49+
value corresponding to a particular speed. The first array value represents
50+
the setting for the 1GbE speed, the second value for the 2.5GbE speed and
51+
the third value for the 10GbE speed. All three values are required if the
52+
property is used.
53+
- amd,serdes-blwc: Baseline wandering correction enablement
54+
0 - Off
55+
1 - On
56+
- amd,serdes-cdr-rate: CDR rate speed selection
57+
- amd,serdes-pq-skew: PQ (data sampling) skew
58+
- amd,serdes-tx-amp: TX amplitude boost
59+
- amd,serdes-dfe-tap-config: DFE taps available to run
60+
- amd,serdes-dfe-tap-enable: DFE taps to enable
61+
3362
Example:
3463
xgbe@e0700000 {
3564
compatible = "amd,xgbe-seattle-v1a";
@@ -41,7 +70,23 @@ Example:
4170
amd,per-channel-interrupt;
4271
clocks = <&xgbe_dma_clk>, <&xgbe_ptp_clk>;
4372
clock-names = "dma_clk", "ptp_clk";
44-
phy-handle = <&phy>;
73+
phy-handle = <&xgbe_phy>;
4574
phy-mode = "xgmii";
4675
mac-address = [ 02 a1 a2 a3 a4 a5 ];
4776
};
77+
78+
xgbe_phy@e1240800 {
79+
compatible = "amd,xgbe-phy-seattle-v1a";
80+
reg = <0 0xe1240800 0 0x00400>,
81+
<0 0xe1250000 0 0x00060>,
82+
<0 0xe1250080 0 0x00004>;
83+
interrupt-parent = <&gic>;
84+
interrupts = <0 323 4>;
85+
amd,speed-set = <0>;
86+
amd,serdes-blwc = <1>, <1>, <0>;
87+
amd,serdes-cdr-rate = <2>, <2>, <7>;
88+
amd,serdes-pq-skew = <10>, <10>, <30>;
89+
amd,serdes-tx-amp = <15>, <15>, <10>;
90+
amd,serdes-dfe-tap-config = <3>, <3>, <1>;
91+
amd,serdes-dfe-tap-enable = <0>, <0>, <127>;
92+
};

MAINTAINERS

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -652,7 +652,6 @@ M: Tom Lendacky <[email protected]>
652652
653653
S: Supported
654654
F: drivers/net/ethernet/amd/xgbe/
655-
F: drivers/net/phy/amd-xgbe-phy.c
656655

657656
AMS (Apple Motion Sensor) DRIVER
658657
M: Michael Hanselmann <[email protected]>

drivers/net/ethernet/amd/Kconfig

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -179,10 +179,8 @@ config SUNLANCE
179179

180180
config AMD_XGBE
181181
tristate "AMD 10GbE Ethernet driver"
182-
depends on (OF_NET || ACPI) && HAS_IOMEM && HAS_DMA
182+
depends on ((OF_NET && OF_ADDRESS) || ACPI) && HAS_IOMEM && HAS_DMA
183183
depends on ARM64 || COMPILE_TEST
184-
select PHYLIB
185-
select AMD_XGBE_PHY
186184
select BITREVERSE
187185
select CRC32
188186
select PTP_1588_CLOCK

drivers/net/ethernet/amd/xgbe/xgbe-common.h

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -857,6 +857,48 @@
857857
*/
858858
#define PCS_MMD_SELECT 0xff
859859

860+
/* SerDes integration register offsets */
861+
#define SIR0_KR_RT_1 0x002c
862+
#define SIR0_STATUS 0x0040
863+
#define SIR1_SPEED 0x0000
864+
865+
/* SerDes integration register entry bit positions and sizes */
866+
#define SIR0_KR_RT_1_RESET_INDEX 11
867+
#define SIR0_KR_RT_1_RESET_WIDTH 1
868+
#define SIR0_STATUS_RX_READY_INDEX 0
869+
#define SIR0_STATUS_RX_READY_WIDTH 1
870+
#define SIR0_STATUS_TX_READY_INDEX 8
871+
#define SIR0_STATUS_TX_READY_WIDTH 1
872+
#define SIR1_SPEED_CDR_RATE_INDEX 12
873+
#define SIR1_SPEED_CDR_RATE_WIDTH 4
874+
#define SIR1_SPEED_DATARATE_INDEX 4
875+
#define SIR1_SPEED_DATARATE_WIDTH 2
876+
#define SIR1_SPEED_PLLSEL_INDEX 3
877+
#define SIR1_SPEED_PLLSEL_WIDTH 1
878+
#define SIR1_SPEED_RATECHANGE_INDEX 6
879+
#define SIR1_SPEED_RATECHANGE_WIDTH 1
880+
#define SIR1_SPEED_TXAMP_INDEX 8
881+
#define SIR1_SPEED_TXAMP_WIDTH 4
882+
#define SIR1_SPEED_WORDMODE_INDEX 0
883+
#define SIR1_SPEED_WORDMODE_WIDTH 3
884+
885+
/* SerDes RxTx register offsets */
886+
#define RXTX_REG6 0x0018
887+
#define RXTX_REG20 0x0050
888+
#define RXTX_REG22 0x0058
889+
#define RXTX_REG114 0x01c8
890+
#define RXTX_REG129 0x0204
891+
892+
/* SerDes RxTx register entry bit positions and sizes */
893+
#define RXTX_REG6_RESETB_RXD_INDEX 8
894+
#define RXTX_REG6_RESETB_RXD_WIDTH 1
895+
#define RXTX_REG20_BLWC_ENA_INDEX 2
896+
#define RXTX_REG20_BLWC_ENA_WIDTH 1
897+
#define RXTX_REG114_PQ_REG_INDEX 9
898+
#define RXTX_REG114_PQ_REG_WIDTH 7
899+
#define RXTX_REG129_RXDFE_CONFIG_INDEX 14
900+
#define RXTX_REG129_RXDFE_CONFIG_WIDTH 2
901+
860902
/* Descriptor/Packet entry bit positions and sizes */
861903
#define RX_PACKET_ERRORS_CRC_INDEX 2
862904
#define RX_PACKET_ERRORS_CRC_WIDTH 1
@@ -973,10 +1015,47 @@
9731015
#define TX_NORMAL_DESC2_VLAN_INSERT 0x2
9741016

9751017
/* MDIO undefined or vendor specific registers */
1018+
#ifndef MDIO_PMA_10GBR_PMD_CTRL
1019+
#define MDIO_PMA_10GBR_PMD_CTRL 0x0096
1020+
#endif
1021+
1022+
#ifndef MDIO_PMA_10GBR_FECCTRL
1023+
#define MDIO_PMA_10GBR_FECCTRL 0x00ab
1024+
#endif
1025+
1026+
#ifndef MDIO_AN_XNP
1027+
#define MDIO_AN_XNP 0x0016
1028+
#endif
1029+
1030+
#ifndef MDIO_AN_LPX
1031+
#define MDIO_AN_LPX 0x0019
1032+
#endif
1033+
9761034
#ifndef MDIO_AN_COMP_STAT
9771035
#define MDIO_AN_COMP_STAT 0x0030
9781036
#endif
9791037

1038+
#ifndef MDIO_AN_INTMASK
1039+
#define MDIO_AN_INTMASK 0x8001
1040+
#endif
1041+
1042+
#ifndef MDIO_AN_INT
1043+
#define MDIO_AN_INT 0x8002
1044+
#endif
1045+
1046+
#ifndef MDIO_CTRL1_SPEED1G
1047+
#define MDIO_CTRL1_SPEED1G (MDIO_CTRL1_SPEED10G & ~BMCR_SPEED100)
1048+
#endif
1049+
1050+
/* MDIO mask values */
1051+
#define XGBE_XNP_MCF_NULL_MESSAGE 0x001
1052+
#define XGBE_XNP_ACK_PROCESSED BIT(12)
1053+
#define XGBE_XNP_MP_FORMATTED BIT(13)
1054+
#define XGBE_XNP_NP_EXCHANGE BIT(15)
1055+
1056+
#define XGBE_KR_TRAINING_START BIT(0)
1057+
#define XGBE_KR_TRAINING_ENABLE BIT(1)
1058+
9801059
/* Bit setting and getting macros
9811060
* The get macro will extract the current bit field value from within
9821061
* the variable
@@ -1118,6 +1197,82 @@ do { \
11181197
#define XPCS_IOREAD(_pdata, _off) \
11191198
ioread32((_pdata)->xpcs_regs + (_off))
11201199

1200+
/* Macros for building, reading or writing register values or bits
1201+
* within the register values of SerDes integration registers.
1202+
*/
1203+
#define XSIR_GET_BITS(_var, _prefix, _field) \
1204+
GET_BITS((_var), \
1205+
_prefix##_##_field##_INDEX, \
1206+
_prefix##_##_field##_WIDTH)
1207+
1208+
#define XSIR_SET_BITS(_var, _prefix, _field, _val) \
1209+
SET_BITS((_var), \
1210+
_prefix##_##_field##_INDEX, \
1211+
_prefix##_##_field##_WIDTH, (_val))
1212+
1213+
#define XSIR0_IOREAD(_pdata, _reg) \
1214+
ioread16((_pdata)->sir0_regs + _reg)
1215+
1216+
#define XSIR0_IOREAD_BITS(_pdata, _reg, _field) \
1217+
GET_BITS(XSIR0_IOREAD((_pdata), _reg), \
1218+
_reg##_##_field##_INDEX, \
1219+
_reg##_##_field##_WIDTH)
1220+
1221+
#define XSIR0_IOWRITE(_pdata, _reg, _val) \
1222+
iowrite16((_val), (_pdata)->sir0_regs + _reg)
1223+
1224+
#define XSIR0_IOWRITE_BITS(_pdata, _reg, _field, _val) \
1225+
do { \
1226+
u16 reg_val = XSIR0_IOREAD((_pdata), _reg); \
1227+
SET_BITS(reg_val, \
1228+
_reg##_##_field##_INDEX, \
1229+
_reg##_##_field##_WIDTH, (_val)); \
1230+
XSIR0_IOWRITE((_pdata), _reg, reg_val); \
1231+
} while (0)
1232+
1233+
#define XSIR1_IOREAD(_pdata, _reg) \
1234+
ioread16((_pdata)->sir1_regs + _reg)
1235+
1236+
#define XSIR1_IOREAD_BITS(_pdata, _reg, _field) \
1237+
GET_BITS(XSIR1_IOREAD((_pdata), _reg), \
1238+
_reg##_##_field##_INDEX, \
1239+
_reg##_##_field##_WIDTH)
1240+
1241+
#define XSIR1_IOWRITE(_pdata, _reg, _val) \
1242+
iowrite16((_val), (_pdata)->sir1_regs + _reg)
1243+
1244+
#define XSIR1_IOWRITE_BITS(_pdata, _reg, _field, _val) \
1245+
do { \
1246+
u16 reg_val = XSIR1_IOREAD((_pdata), _reg); \
1247+
SET_BITS(reg_val, \
1248+
_reg##_##_field##_INDEX, \
1249+
_reg##_##_field##_WIDTH, (_val)); \
1250+
XSIR1_IOWRITE((_pdata), _reg, reg_val); \
1251+
} while (0)
1252+
1253+
/* Macros for building, reading or writing register values or bits
1254+
* within the register values of SerDes RxTx registers.
1255+
*/
1256+
#define XRXTX_IOREAD(_pdata, _reg) \
1257+
ioread16((_pdata)->rxtx_regs + _reg)
1258+
1259+
#define XRXTX_IOREAD_BITS(_pdata, _reg, _field) \
1260+
GET_BITS(XRXTX_IOREAD((_pdata), _reg), \
1261+
_reg##_##_field##_INDEX, \
1262+
_reg##_##_field##_WIDTH)
1263+
1264+
#define XRXTX_IOWRITE(_pdata, _reg, _val) \
1265+
iowrite16((_val), (_pdata)->rxtx_regs + _reg)
1266+
1267+
#define XRXTX_IOWRITE_BITS(_pdata, _reg, _field, _val) \
1268+
do { \
1269+
u16 reg_val = XRXTX_IOREAD((_pdata), _reg); \
1270+
SET_BITS(reg_val, \
1271+
_reg##_##_field##_INDEX, \
1272+
_reg##_##_field##_WIDTH, (_val)); \
1273+
XRXTX_IOWRITE((_pdata), _reg, reg_val); \
1274+
} while (0)
1275+
11211276
/* Macros for building, reading or writing register values or bits
11221277
* using MDIO. Different from above because of the use of standardized
11231278
* Linux include values. No shifting is performed with the bit

drivers/net/ethernet/amd/xgbe/xgbe-dev.c

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -910,23 +910,6 @@ static void xgbe_write_mmd_regs(struct xgbe_prv_data *pdata, int prtad,
910910
else
911911
mmd_address = (pdata->mdio_mmd << 16) | (mmd_reg & 0xffff);
912912

913-
/* If the PCS is changing modes, match the MAC speed to it */
914-
if (((mmd_address >> 16) == MDIO_MMD_PCS) &&
915-
((mmd_address & 0xffff) == MDIO_CTRL2)) {
916-
struct phy_device *phydev = pdata->phydev;
917-
918-
if (mmd_data & MDIO_PCS_CTRL2_TYPE) {
919-
/* KX mode */
920-
if (phydev->supported & SUPPORTED_1000baseKX_Full)
921-
xgbe_set_gmii_speed(pdata);
922-
else
923-
xgbe_set_gmii_2500_speed(pdata);
924-
} else {
925-
/* KR mode */
926-
xgbe_set_xgmii_speed(pdata);
927-
}
928-
}
929-
930913
/* The PCS registers are accessed using mmio. The underlying APB3
931914
* management interface uses indirect addressing to access the MMD
932915
* register sets. This requires accessing of the PCS register in two

0 commit comments

Comments
 (0)