Re: [U-Boot] [PATCH 1/3] phy: Add phy driver support for xilinx PCS/PMA core
On 26.4.2016 00:36, Joe Hershberger wrote: > On Mon, Feb 15, 2016 at 3:54 AM, Michal Simek wrote: >> From: Siva Durga Prasad Paladugu >> >> Add phy driver support for xilinx PCS/PMA core >> >> Signed-off-by: Siva Durga Prasad Paladugu >> Signed-off-by: Kedareswara rao Appana >> Signed-off-by: Michal Simek >> --- >> >> drivers/net/phy/Makefile | 1 + >> drivers/net/phy/phy.c| 3 + >> drivers/net/phy/xilinx_phy.c | 144 >> +++ >> include/phy.h| 1 + >> 4 files changed, 149 insertions(+) >> create mode 100644 drivers/net/phy/xilinx_phy.c >> >> diff --git a/drivers/net/phy/Makefile b/drivers/net/phy/Makefile >> index 9e4d4927e676..1e299b97b961 100644 >> --- a/drivers/net/phy/Makefile >> +++ b/drivers/net/phy/Makefile >> @@ -25,4 +25,5 @@ obj-$(CONFIG_PHY_REALTEK) += realtek.o >> obj-$(CONFIG_PHY_SMSC) += smsc.o >> obj-$(CONFIG_PHY_TERANETICS) += teranetics.o >> obj-$(CONFIG_PHY_TI) += ti.o >> +obj-$(CONFIG_PHY_XILINX) += xilinx_phy.o >> obj-$(CONFIG_PHY_VITESSE) += vitesse.o >> diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c >> index 17866a244b3a..23c82bb36e93 100644 >> --- a/drivers/net/phy/phy.c >> +++ b/drivers/net/phy/phy.c >> @@ -503,6 +503,9 @@ int phy_init(void) >> #ifdef CONFIG_PHY_VITESSE >> phy_vitesse_init(); >> #endif >> +#ifdef CONFIG_PHY_XILINX >> + phy_xilinx_init(); >> +#endif >> >> return 0; >> } >> diff --git a/drivers/net/phy/xilinx_phy.c b/drivers/net/phy/xilinx_phy.c >> new file mode 100644 >> index ..f3eaf2e97ced >> --- /dev/null >> +++ b/drivers/net/phy/xilinx_phy.c >> @@ -0,0 +1,144 @@ >> +/* >> + * Xilinx PCS/PMA Core phy driver >> + * >> + * Copyright (C) 2015 - 2016 Xilinx, Inc. >> + * >> + * SPDX-License-Identifier:GPL-2.0+ >> + */ >> + >> +#include >> +#include >> +#include >> +#include >> + >> +DECLARE_GLOBAL_DATA_PTR; >> + >> +#define MII_PHY_STATUS_SPD_MASK0x0C00 >> +#define MII_PHY_STATUS_FULLDUPLEX 0x1000 >> +#define MII_PHY_STATUS_10000x0800 >> +#define MII_PHY_STATUS_100 0x0400 > > Use the BIT() macro where appropriate. > >> +#define XPCSPMA_PHY_CTRL_ISOLATE_DISABLE 0xFBFF >> + >> +/* Mask used for ID comparisons */ >> +#define XILINX_PHY_ID_MASK 0xfff0 >> + >> +/* Known PHY IDs */ >> +#define XILINX_PHY_ID 0x01740c00 >> + >> +/* struct phy_device dev_flags definitions */ >> +#define XAE_PHY_TYPE_MII 0 >> +#define XAE_PHY_TYPE_GMII 1 >> +#define XAE_PHY_TYPE_RGMII_1_3 2 >> +#define XAE_PHY_TYPE_RGMII_2_0 3 >> +#define XAE_PHY_TYPE_SGMII 4 >> +#define XAE_PHY_TYPE_1000BASE_X5 >> + >> +static int xilinxphy_startup(struct phy_device *phydev) >> +{ >> + int err; >> + int status = 0; >> + >> + debug("%s\n", __func__); >> + /* Update the link, but return if there >> +* was an error >> +*/ >> + err = genphy_update_link(phydev); >> + if (err) >> + return err; >> + >> + if (AUTONEG_ENABLE == phydev->autoneg) { >> + status = phy_read(phydev, MDIO_DEVAD_NONE, MII_LPA); >> + status = status & MII_PHY_STATUS_SPD_MASK; >> + >> + if (status & MII_PHY_STATUS_FULLDUPLEX) >> + phydev->duplex = DUPLEX_FULL; >> + else >> + phydev->duplex = DUPLEX_HALF; >> + >> + switch (status) { >> + case MII_PHY_STATUS_1000: >> + phydev->speed = SPEED_1000; >> + break; >> + >> + case MII_PHY_STATUS_100: >> + phydev->speed = SPEED_100; >> + break; >> + >> + default: >> + phydev->speed = SPEED_10; >> + break; >> + } >> + } else { >> + int bmcr = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR); >> + >> + if (bmcr < 0) >> + return bmcr; >> + >> + if (bmcr & BMCR_FULLDPLX) >> + phydev->duplex = DUPLEX_FULL; >> + else >> + phydev->duplex = DUPLEX_HALF; >> + >> + if (bmcr & BMCR_SPEED1000) >> + phydev->speed = SPEED_1000; >> + else if (bmcr & BMCR_SPEED100) >> + phydev->speed = SPEED_100; >> + else >> + phydev->speed = SPEED_10; >> + } >> + >> + /* >> +* For 1000BASE-X Phy Mode the speed/duplex will always be >> +* 1000Mbps/fullduplex >> +*/ >> + if (phydev->flags == XAE_PHY_TYPE_1000BASE_X) { >> + phydev->duplex = DUPLEX_FULL; >> + phydev->speed = SPEED_1000; >> + } >> + >> + return 0; >> +} >> + >> +static int xilinxphy_of_init(struct phy_device *phyde
Re: [U-Boot] [PATCH 1/3] phy: Add phy driver support for xilinx PCS/PMA core
On 25/04/16 15:36, Joe Hershberger wrote: > On Mon, Feb 15, 2016 at 3:54 AM, Michal Simek wrote: >> From: Siva Durga Prasad Paladugu >> >> Add phy driver support for xilinx PCS/PMA core >> >> Signed-off-by: Siva Durga Prasad Paladugu >> Signed-off-by: Kedareswara rao Appana >> Signed-off-by: Michal Simek >> --- [snip] >> +static int xilinxphy_of_init(struct phy_device *phydev) >> +{ >> + struct udevice *dev = (struct udevice *)&phydev->dev; >> + u32 phytype; >> + >> + debug("%s\n", __func__); >> + phytype = fdtdec_get_int(gd->fdt_blob, dev->of_offset, "phy-type", >> -1); > > Is there a bindings document that can be included to describe this? If that is meant to be the PHY type (MII, RGMII etc.) the standard property name is either 'phy-mode' or 'phy-connection-type', the latter being the one described in ePAPR, while the former has been widely adopted by Linux nowadays (and other OSes possibly). My 2 cents since I don't typically review u-boot changes. -- Florian ___ U-Boot mailing list U-Boot@lists.denx.de http://lists.denx.de/mailman/listinfo/u-boot
Re: [U-Boot] [PATCH 1/3] phy: Add phy driver support for xilinx PCS/PMA core
On Mon, Feb 15, 2016 at 3:54 AM, Michal Simek wrote: > From: Siva Durga Prasad Paladugu > > Add phy driver support for xilinx PCS/PMA core > > Signed-off-by: Siva Durga Prasad Paladugu > Signed-off-by: Kedareswara rao Appana > Signed-off-by: Michal Simek > --- > > drivers/net/phy/Makefile | 1 + > drivers/net/phy/phy.c| 3 + > drivers/net/phy/xilinx_phy.c | 144 > +++ > include/phy.h| 1 + > 4 files changed, 149 insertions(+) > create mode 100644 drivers/net/phy/xilinx_phy.c > > diff --git a/drivers/net/phy/Makefile b/drivers/net/phy/Makefile > index 9e4d4927e676..1e299b97b961 100644 > --- a/drivers/net/phy/Makefile > +++ b/drivers/net/phy/Makefile > @@ -25,4 +25,5 @@ obj-$(CONFIG_PHY_REALTEK) += realtek.o > obj-$(CONFIG_PHY_SMSC) += smsc.o > obj-$(CONFIG_PHY_TERANETICS) += teranetics.o > obj-$(CONFIG_PHY_TI) += ti.o > +obj-$(CONFIG_PHY_XILINX) += xilinx_phy.o > obj-$(CONFIG_PHY_VITESSE) += vitesse.o > diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c > index 17866a244b3a..23c82bb36e93 100644 > --- a/drivers/net/phy/phy.c > +++ b/drivers/net/phy/phy.c > @@ -503,6 +503,9 @@ int phy_init(void) > #ifdef CONFIG_PHY_VITESSE > phy_vitesse_init(); > #endif > +#ifdef CONFIG_PHY_XILINX > + phy_xilinx_init(); > +#endif > > return 0; > } > diff --git a/drivers/net/phy/xilinx_phy.c b/drivers/net/phy/xilinx_phy.c > new file mode 100644 > index ..f3eaf2e97ced > --- /dev/null > +++ b/drivers/net/phy/xilinx_phy.c > @@ -0,0 +1,144 @@ > +/* > + * Xilinx PCS/PMA Core phy driver > + * > + * Copyright (C) 2015 - 2016 Xilinx, Inc. > + * > + * SPDX-License-Identifier:GPL-2.0+ > + */ > + > +#include > +#include > +#include > +#include > + > +DECLARE_GLOBAL_DATA_PTR; > + > +#define MII_PHY_STATUS_SPD_MASK0x0C00 > +#define MII_PHY_STATUS_FULLDUPLEX 0x1000 > +#define MII_PHY_STATUS_10000x0800 > +#define MII_PHY_STATUS_100 0x0400 Use the BIT() macro where appropriate. > +#define XPCSPMA_PHY_CTRL_ISOLATE_DISABLE 0xFBFF > + > +/* Mask used for ID comparisons */ > +#define XILINX_PHY_ID_MASK 0xfff0 > + > +/* Known PHY IDs */ > +#define XILINX_PHY_ID 0x01740c00 > + > +/* struct phy_device dev_flags definitions */ > +#define XAE_PHY_TYPE_MII 0 > +#define XAE_PHY_TYPE_GMII 1 > +#define XAE_PHY_TYPE_RGMII_1_3 2 > +#define XAE_PHY_TYPE_RGMII_2_0 3 > +#define XAE_PHY_TYPE_SGMII 4 > +#define XAE_PHY_TYPE_1000BASE_X5 > + > +static int xilinxphy_startup(struct phy_device *phydev) > +{ > + int err; > + int status = 0; > + > + debug("%s\n", __func__); > + /* Update the link, but return if there > +* was an error > +*/ > + err = genphy_update_link(phydev); > + if (err) > + return err; > + > + if (AUTONEG_ENABLE == phydev->autoneg) { > + status = phy_read(phydev, MDIO_DEVAD_NONE, MII_LPA); > + status = status & MII_PHY_STATUS_SPD_MASK; > + > + if (status & MII_PHY_STATUS_FULLDUPLEX) > + phydev->duplex = DUPLEX_FULL; > + else > + phydev->duplex = DUPLEX_HALF; > + > + switch (status) { > + case MII_PHY_STATUS_1000: > + phydev->speed = SPEED_1000; > + break; > + > + case MII_PHY_STATUS_100: > + phydev->speed = SPEED_100; > + break; > + > + default: > + phydev->speed = SPEED_10; > + break; > + } > + } else { > + int bmcr = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR); > + > + if (bmcr < 0) > + return bmcr; > + > + if (bmcr & BMCR_FULLDPLX) > + phydev->duplex = DUPLEX_FULL; > + else > + phydev->duplex = DUPLEX_HALF; > + > + if (bmcr & BMCR_SPEED1000) > + phydev->speed = SPEED_1000; > + else if (bmcr & BMCR_SPEED100) > + phydev->speed = SPEED_100; > + else > + phydev->speed = SPEED_10; > + } > + > + /* > +* For 1000BASE-X Phy Mode the speed/duplex will always be > +* 1000Mbps/fullduplex > +*/ > + if (phydev->flags == XAE_PHY_TYPE_1000BASE_X) { > + phydev->duplex = DUPLEX_FULL; > + phydev->speed = SPEED_1000; > + } > + > + return 0; > +} > + > +static int xilinxphy_of_init(struct phy_device *phydev) > +{ > + struct udevice *dev = (struct udevice *)&phydev->dev; > + u32 phytype; > + > + debug("%s\n", __func__); > + phytype = fdtdec_get_int(gd->fdt_blob, dev->of_offset, "
[U-Boot] [PATCH 1/3] phy: Add phy driver support for xilinx PCS/PMA core
From: Siva Durga Prasad Paladugu Add phy driver support for xilinx PCS/PMA core Signed-off-by: Siva Durga Prasad Paladugu Signed-off-by: Kedareswara rao Appana Signed-off-by: Michal Simek --- drivers/net/phy/Makefile | 1 + drivers/net/phy/phy.c| 3 + drivers/net/phy/xilinx_phy.c | 144 +++ include/phy.h| 1 + 4 files changed, 149 insertions(+) create mode 100644 drivers/net/phy/xilinx_phy.c diff --git a/drivers/net/phy/Makefile b/drivers/net/phy/Makefile index 9e4d4927e676..1e299b97b961 100644 --- a/drivers/net/phy/Makefile +++ b/drivers/net/phy/Makefile @@ -25,4 +25,5 @@ obj-$(CONFIG_PHY_REALTEK) += realtek.o obj-$(CONFIG_PHY_SMSC) += smsc.o obj-$(CONFIG_PHY_TERANETICS) += teranetics.o obj-$(CONFIG_PHY_TI) += ti.o +obj-$(CONFIG_PHY_XILINX) += xilinx_phy.o obj-$(CONFIG_PHY_VITESSE) += vitesse.o diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index 17866a244b3a..23c82bb36e93 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c @@ -503,6 +503,9 @@ int phy_init(void) #ifdef CONFIG_PHY_VITESSE phy_vitesse_init(); #endif +#ifdef CONFIG_PHY_XILINX + phy_xilinx_init(); +#endif return 0; } diff --git a/drivers/net/phy/xilinx_phy.c b/drivers/net/phy/xilinx_phy.c new file mode 100644 index ..f3eaf2e97ced --- /dev/null +++ b/drivers/net/phy/xilinx_phy.c @@ -0,0 +1,144 @@ +/* + * Xilinx PCS/PMA Core phy driver + * + * Copyright (C) 2015 - 2016 Xilinx, Inc. + * + * SPDX-License-Identifier:GPL-2.0+ + */ + +#include +#include +#include +#include + +DECLARE_GLOBAL_DATA_PTR; + +#define MII_PHY_STATUS_SPD_MASK0x0C00 +#define MII_PHY_STATUS_FULLDUPLEX 0x1000 +#define MII_PHY_STATUS_10000x0800 +#define MII_PHY_STATUS_100 0x0400 +#define XPCSPMA_PHY_CTRL_ISOLATE_DISABLE 0xFBFF + +/* Mask used for ID comparisons */ +#define XILINX_PHY_ID_MASK 0xfff0 + +/* Known PHY IDs */ +#define XILINX_PHY_ID 0x01740c00 + +/* struct phy_device dev_flags definitions */ +#define XAE_PHY_TYPE_MII 0 +#define XAE_PHY_TYPE_GMII 1 +#define XAE_PHY_TYPE_RGMII_1_3 2 +#define XAE_PHY_TYPE_RGMII_2_0 3 +#define XAE_PHY_TYPE_SGMII 4 +#define XAE_PHY_TYPE_1000BASE_X5 + +static int xilinxphy_startup(struct phy_device *phydev) +{ + int err; + int status = 0; + + debug("%s\n", __func__); + /* Update the link, but return if there +* was an error +*/ + err = genphy_update_link(phydev); + if (err) + return err; + + if (AUTONEG_ENABLE == phydev->autoneg) { + status = phy_read(phydev, MDIO_DEVAD_NONE, MII_LPA); + status = status & MII_PHY_STATUS_SPD_MASK; + + if (status & MII_PHY_STATUS_FULLDUPLEX) + phydev->duplex = DUPLEX_FULL; + else + phydev->duplex = DUPLEX_HALF; + + switch (status) { + case MII_PHY_STATUS_1000: + phydev->speed = SPEED_1000; + break; + + case MII_PHY_STATUS_100: + phydev->speed = SPEED_100; + break; + + default: + phydev->speed = SPEED_10; + break; + } + } else { + int bmcr = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR); + + if (bmcr < 0) + return bmcr; + + if (bmcr & BMCR_FULLDPLX) + phydev->duplex = DUPLEX_FULL; + else + phydev->duplex = DUPLEX_HALF; + + if (bmcr & BMCR_SPEED1000) + phydev->speed = SPEED_1000; + else if (bmcr & BMCR_SPEED100) + phydev->speed = SPEED_100; + else + phydev->speed = SPEED_10; + } + + /* +* For 1000BASE-X Phy Mode the speed/duplex will always be +* 1000Mbps/fullduplex +*/ + if (phydev->flags == XAE_PHY_TYPE_1000BASE_X) { + phydev->duplex = DUPLEX_FULL; + phydev->speed = SPEED_1000; + } + + return 0; +} + +static int xilinxphy_of_init(struct phy_device *phydev) +{ + struct udevice *dev = (struct udevice *)&phydev->dev; + u32 phytype; + + debug("%s\n", __func__); + phytype = fdtdec_get_int(gd->fdt_blob, dev->of_offset, "phy-type", -1); + if (phytype == XAE_PHY_TYPE_1000BASE_X) + phydev->flags |= XAE_PHY_TYPE_1000BASE_X; + + return 0; +} + +static int xilinxphy_config(struct phy_device *phydev) +{ + int temp; + + debug("%s\n", __func__); + xilinxphy_of_init(phydev); + temp = phy_read(phydev, MDIO_DEVAD_NONE, MII_BMCR); + temp &= XPCSPMA_PHY_CTRL_ISOLATE_DISAB