svn commit: r209318 - in head/sys/mips/rmi: . dev/xlr

Jayachandran C. jchandra at FreeBSD.org
Fri Jun 18 21:40:33 UTC 2010


Author: jchandra
Date: Fri Jun 18 21:40:32 2010
New Revision: 209318
URL: http://svn.freebsd.org/changeset/base/209318

Log:
  Add support for newer XLS chips/boards in the GMAC driver.
  Improved processor id code in board.h, remove unnecessary macros.
  
  Approved by:	rrs(mentor)

Modified:
  head/sys/mips/rmi/board.c
  head/sys/mips/rmi/board.h
  head/sys/mips/rmi/dev/xlr/rge.c

Modified: head/sys/mips/rmi/board.c
==============================================================================
--- head/sys/mips/rmi/board.c	Fri Jun 18 21:37:27 2010	(r209317)
+++ head/sys/mips/rmi/board.c	Fri Jun 18 21:40:32 2010	(r209318)
@@ -100,6 +100,7 @@ xlr_board_info_setup()
 		xlr_board_info.is_xls = 1;
 		xlr_board_info.nr_cpus = 8;
 		xlr_board_info.usb = 1;
+		/* Board version 8 has NAND flash */
 		xlr_board_info.cfi =
 		    (xlr_boot1_info.board_major_version != RMI_XLR_BOARD_ARIZONA_VIII);
 		xlr_board_info.pci_irq = 0;
@@ -114,7 +115,9 @@ xlr_board_info_setup()
 		xlr_board_info.gmac_block[0].credit_config = &xls_cc_table_gmac0;
 		xlr_board_info.gmac_block[0].station_txbase = MSGRNG_STNID_GMACTX0;
 		xlr_board_info.gmac_block[0].station_rfr = MSGRNG_STNID_GMACRFR_0;
-		if (xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_VI)
+		if (xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_VI ||
+		    xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_XI ||
+		    xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_XII)
 			xlr_board_info.gmac_block[0].mode = XLR_PORT0_RGMII;
 		else
 			xlr_board_info.gmac_block[0].mode = XLR_SGMII;
@@ -125,12 +128,12 @@ xlr_board_info_setup()
 		/* network block 1 */
 		xlr_board_info.gmac_block[1].type = XLR_GMAC;
 		xlr_board_info.gmac_block[1].enabled = 0xf;
-		if (xlr_is_xls4xx()) {
+		if (xlr_is_xls4xx_lite()) {
 			xlr_reg_t *mmio = xlr_io_mmio(XLR_IO_GPIO_OFFSET);
 			uint32_t tmp;
 
-			/* some ports are not enabled on 4xx, figure this out
-			   from the GPIO fuse bank */
+			/* some ports are not enabled on the condor 4xx, figure this
+			   out from the GPIO fuse bank */
 			tmp = xlr_read_reg(mmio, 35);
 			if (tmp & (1<<28))
 				xlr_board_info.gmac_block[1].enabled &= ~0x8;

Modified: head/sys/mips/rmi/board.h
==============================================================================
--- head/sys/mips/rmi/board.h	Fri Jun 18 21:37:27 2010	(r209317)
+++ head/sys/mips/rmi/board.h	Fri Jun 18 21:40:32 2010	(r209318)
@@ -26,10 +26,16 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- * RMI_BSD */
+ * RMI_BSD
+ * $FreeBSD$
+ */
 #ifndef _RMI_BOARD_H_
 #define _RMI_BOARD_H_
 
+/*
+ * Engineering boards have a major/minor number in their EEPROM to 
+ * identify their configuration
+ */
 #define RMI_XLR_BOARD_ARIZONA_I        1
 #define RMI_XLR_BOARD_ARIZONA_II       2
 #define RMI_XLR_BOARD_ARIZONA_III      3
@@ -38,95 +44,34 @@
 #define RMI_XLR_BOARD_ARIZONA_VI       6
 #define RMI_XLR_BOARD_ARIZONA_VII      7
 #define RMI_XLR_BOARD_ARIZONA_VIII     8
+#define RMI_XLR_BOARD_ARIZONA_XI      11
+#define RMI_XLR_BOARD_ARIZONA_XII     12
 
-#define RMI_CHIP_XLR308_A0 0x0c0600
-#define RMI_CHIP_XLR508_A0 0x0c0700
-#define RMI_CHIP_XLR516_A0 0x0c0800
-#define RMI_CHIP_XLR532_A0 0x0c0900
-#define RMI_CHIP_XLR716_A0 0x0c0a00
-#define RMI_CHIP_XLR732_A0 0x0c0b00
-
-#define RMI_CHIP_XLR308_A1 0x0c0601
-#define RMI_CHIP_XLR508_A1 0x0c0701
-#define RMI_CHIP_XLR516_A1 0x0c0801
-#define RMI_CHIP_XLR532_A1 0x0c0901
-#define RMI_CHIP_XLR716_A1 0x0c0a01
-#define RMI_CHIP_XLR732_A1 0x0c0b01
-
-#define RMI_CHIP_XLR308_B0 0x0c0602
-#define RMI_CHIP_XLR508_B0 0x0c0702
-#define RMI_CHIP_XLR516_B0 0x0c0802
-#define RMI_CHIP_XLR532_B0 0x0c0902
-#define RMI_CHIP_XLR716_B0 0x0c0a02
-#define RMI_CHIP_XLR732_B0 0x0c0b02
-
-#define RMI_CHIP_XLR308_B1 0x0c0603
-#define RMI_CHIP_XLR508_B1 0x0c0703
-#define RMI_CHIP_XLR516_B1 0x0c0803
-#define RMI_CHIP_XLR532_B1 0x0c0903
-#define RMI_CHIP_XLR716_B1 0x0c0a03
-#define RMI_CHIP_XLR732_B1 0x0c0b03
-
-#define RMI_CHIP_XLR308_B2 0x0c0604
-#define RMI_CHIP_XLR508_B2 0x0c0704
-#define RMI_CHIP_XLR516_B2 0x0c0804
-#define RMI_CHIP_XLR532_B2 0x0c0904
-#define RMI_CHIP_XLR716_B2 0x0c0a04
-#define RMI_CHIP_XLR732_B2 0x0c0b04
-
-#define RMI_CHIP_XLR308_C0 0x0c0705
-#define RMI_CHIP_XLR508_C0 0x0c0b05
-#define RMI_CHIP_XLR516_C0 0x0c0a05
-#define RMI_CHIP_XLR532_C0 0x0c0805
-#define RMI_CHIP_XLR716_C0 0x0c0205
-#define RMI_CHIP_XLR732_C0 0x0c0005
-
-#define RMI_CHIP_XLR308_C1 0x0c0706
-#define RMI_CHIP_XLR508_C1 0x0c0b06
-#define RMI_CHIP_XLR516_C1 0x0c0a06
-#define RMI_CHIP_XLR532_C1 0x0c0806
-#define RMI_CHIP_XLR716_C1 0x0c0206
-#define RMI_CHIP_XLR732_C1 0x0c0006
-
-#define RMI_CHIP_XLR308_C2 0x0c0707
-#define RMI_CHIP_XLR508_C2 0x0c0b07
-#define RMI_CHIP_XLR516_C2 0x0c0a07
-#define RMI_CHIP_XLR532_C2 0x0c0807
-#define RMI_CHIP_XLR716_C2 0x0c0207
-#define RMI_CHIP_XLR732_C2 0x0c0007
-
-#define RMI_CHIP_XLR308_C3 0x0c0708
-#define RMI_CHIP_XLR508_C3 0x0c0b08
-#define RMI_CHIP_XLR516_C3 0x0c0a08
-#define RMI_CHIP_XLR532_C3 0x0c0808
-#define RMI_CHIP_XLR716_C3 0x0c0208
-#define RMI_CHIP_XLR732_C3 0x0c0008
-
-#define RMI_CHIP_XLR308_C4 0x0c0709
-#define RMI_CHIP_XLR508_C4 0x0c0b09
-#define RMI_CHIP_XLR516_C4 0x0c0a09
-#define RMI_CHIP_XLR532_C4 0x0c0809
-#define RMI_CHIP_XLR716_C4 0x0c0209
-#define RMI_CHIP_XLR732_C4 0x0c0009
-
-#define RMI_CHIP_XLS608_A0 0x0c8000
-#define RMI_CHIP_XLS408_A0 0x0c8800
-#define RMI_CHIP_XLS404_A0 0x0c8c00
-#define RMI_CHIP_XLS208_A0 0x0c8e00
-#define RMI_CHIP_XLS204_A0 0x0c8f00
-
-#define RMI_CHIP_XLS608_A1 0x0c8001
-#define RMI_CHIP_XLS408_A1 0x0c8801
-#define RMI_CHIP_XLS404_A1 0x0c8c01
-#define RMI_CHIP_XLS208_A1 0x0c8e01
-#define RMI_CHIP_XLS204_A1 0x0c8f01
-
-static __inline__ unsigned int
-xlr_revision(void)
-{
-	return mips_rd_prid() & 0xff00ff;
-}
-
+/*
+ * RMI Chips - Values in Processor ID field
+ */
+#define	RMI_CHIP_XLR732		0x00
+#define	RMI_CHIP_XLR716		0x02
+#define	RMI_CHIP_XLR308		0x06
+#define	RMI_CHIP_XLR532		0x09
+
+#define RMI_CHIP_XLS616_B0      0x40
+#define RMI_CHIP_XLS608_B0      0x4a
+#define RMI_CHIP_XLS608         0x80  /* Internal */
+#define RMI_CHIP_XLS416_B0      0x44
+#define RMI_CHIP_XLS412_B0      0x4c
+#define RMI_CHIP_XLS408_B0      0x4e
+#define RMI_CHIP_XLS408         0x88  /* Lite "Condor" */
+#define RMI_CHIP_XLS404_B0      0x4f
+#define RMI_CHIP_XLS404         0x8c  /* Lite "Condor" */
+#define RMI_CHIP_XLS208         0x8e
+#define RMI_CHIP_XLS204         0x8f
+#define RMI_CHIP_XLS108         0xce
+#define RMI_CHIP_XLS104         0xcf
+
+/* 
+ * The XLS product line has chip versions 0x4x and 0x8x
+ */
 static __inline__ unsigned int
 xlr_is_xls(void)
 {
@@ -135,122 +80,60 @@ xlr_is_xls(void)
 	return (prid & 0xf000) == 0x8000 || (prid & 0xf000) == 0x4000;
 }
 
-static __inline__ int
-xlr_revision_a0(void)
-{
-	return xlr_revision() == 0x0c0000;
-}
-
-static __inline__ int
-xlr_revision_b0(void)
-{
-	return xlr_revision() == 0x0c0002;
-}
-
-static __inline__ int
-xlr_revision_b1(void)
-{
-	return xlr_revision() == 0x0c0003;
-}
-
-static __inline__ int
-xlr_board_atx_i(void)
-{
-	return xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_I;
-}
-
-static __inline__ int
-xlr_board_atx_ii(void)
-{
-	return xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_II;
-}
-
-static __inline__ int
-xlr_board_atx_ii_b(void)
-{
-	return (xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_II)
-	&& (xlr_boot1_info.board_minor_version == 1);
-}
-
-static __inline__ int
-xlr_board_atx_iii(void)
-{
-	return xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_III;
-}
-
-static __inline__ int
-xlr_board_atx_iv(void)
-{
-	return (xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_IV)
-	&& (xlr_boot1_info.board_minor_version == 0);
-}
-static __inline__ int
-xlr_board_atx_iv_b(void)
-{
-	return (xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_IV)
-	&& (xlr_boot1_info.board_minor_version == 1);
-}
-static __inline__ int
-xlr_board_atx_v(void)
-{
-	return xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_V;
-}
-static __inline__ int
-xlr_board_atx_vi(void)
-{
-	return xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_VI;
-}
-
-static __inline__ int
-xlr_board_atx_iii_256(void)
-{
-	return (xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_III)
-	&& (xlr_boot1_info.board_minor_version == 0);
-}
-
-static __inline__ int
-xlr_board_atx_iii_512(void)
+/*
+ * The last byte of the processor id field is revision
+ */
+static __inline__ unsigned int
+xlr_revision(void)
 {
-	return (xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_III)
-	&& (xlr_boot1_info.board_minor_version == 1);
+	return mips_rd_prid() & 0xff;
 }
 
-static __inline__ int
-xlr_board_atx_v_512(void)
+/*
+ * The 15:8 byte of the PR Id register is the Processor ID
+ */
+static __inline__ unsigned int
+xlr_processor_id(void)
 {
-	return (xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_V)
-	&& (xlr_boot1_info.board_minor_version == 1);
+	return ((mips_rd_prid() & 0xff00) >> 8);
 }
 
+/*
+ * RMI Engineering boards which are PCI cards
+ * These should come up in PCI device mode (not yet)
+ */
 static __inline__ int
 xlr_board_pci(void)
 {
-	return (xlr_board_atx_iii_256() || xlr_board_atx_iii_512()
-	    || xlr_board_atx_v_512());
+	return ((xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_III) ||
+		(xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_V));
 }
+
 static __inline__ int
 xlr_is_xls2xx(void)
 {
-	uint32_t chipid = mips_rd_prid() & 0xffffff00U;
+	uint32_t chipid = xlr_processor_id();
 
-	return chipid == 0x0c8e00 || chipid == 0x0c8f00;
+	return (chipid == 0x8e || chipid == 0x8f);
 }
 
 static __inline__ int
-xlr_is_xls4xx(void)
+xlr_is_xls4xx_lite(void)
 {
-	uint32_t chipid = mips_rd_prid() & 0xffffff00U;
+	uint32_t chipid = xlr_processor_id();
 
-	return chipid == 0x0c8800 || chipid == 0x0c8c00;
+	return (chipid == 0x88 || chipid == 0x8c);
 }
 
 /* all our knowledge of chip and board that cannot be detected run-time goes here */
 enum gmac_block_types {
 	XLR_GMAC, XLR_XGMAC, XLR_SPI4
 };
+
 enum gmac_block_modes {
 	XLR_RGMII, XLR_SGMII, XLR_PORT0_RGMII
 };
+
 struct xlr_board_info {
 	int is_xls;
 	int nr_cpus;
@@ -273,7 +156,7 @@ struct xlr_board_info {
 		int baseirq;	/* first irq for this block, the rest are in
 				 * sequence */
 		int baseinst;	/* the first rge unit for this block */
-	}                gmac_block[3];
+	}  gmac_block[3];
 };
 
 extern struct xlr_board_info xlr_board_info;

Modified: head/sys/mips/rmi/dev/xlr/rge.c
==============================================================================
--- head/sys/mips/rmi/dev/xlr/rge.c	Fri Jun 18 21:37:27 2010	(r209317)
+++ head/sys/mips/rmi/dev/xlr/rge.c	Fri Jun 18 21:40:32 2010	(r209318)
@@ -899,7 +899,6 @@ static void
 serdes_regs_init(struct driver_data *priv)
 {
 	xlr_reg_t *mmio_gpio = (xlr_reg_t *) (xlr_io_base + XLR_IO_GPIO_OFFSET);
-	int i;
 
 	/* Initialize SERDES CONTROL Registers */
 	rge_mii_write_internal(priv->serdes_mmio, 26, 0, 0x6DB0);
@@ -915,14 +914,27 @@ serdes_regs_init(struct driver_data *pri
 	rge_mii_write_internal(priv->serdes_mmio, 26, 10, 0x0000);
 
 	/*
-	 * For loop delay and GPIO programming crud from Linux driver,
+	 * GPIO setting which affect the serdes - needs figuring out
 	 */
-	for (i = 0; i < 10000000; i++) {
-	}
-	mmio_gpio[0x20] = 0x7e6802;
-	mmio_gpio[0x10] = 0x7104;
-	for (i = 0; i < 100000000; i++) {
+	DELAY(100);
+	xlr_write_reg(mmio_gpio, 0x20, 0x7e6802);
+	xlr_write_reg(mmio_gpio, 0x10, 0x7104);
+	DELAY(100);
+	
+	/* 
+	 * This kludge is needed to setup serdes (?) clock correctly on some
+	 * XLS boards
+	 */
+	if ((xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_XI ||
+	    xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_XII) &&
+	    xlr_boot1_info.board_minor_version == 4) {
+		/* use 125 Mhz instead of 156.25Mhz ref clock */
+		DELAY(100);
+		xlr_write_reg(mmio_gpio, 0x10, 0x7103);
+		xlr_write_reg(mmio_gpio, 0x21, 0x7103);
+		DELAY(100);
 	}
+
 	return;
 }
 
@@ -1085,7 +1097,7 @@ rmi_xlr_gmac_config_speed(struct driver_
 	if (priv->speed == xlr_mac_speed_10) {
 		if (priv->mode != XLR_RGMII)
 			xlr_write_reg(mmio, R_INTERFACE_CONTROL, SGMII_SPEED_10);
-		xlr_write_reg(mmio, R_MAC_CONFIG_2, 0x7137);
+		xlr_write_reg(mmio, R_MAC_CONFIG_2, 0x7117);
 		xlr_write_reg(mmio, R_CORECONTROL, 0x02);
 		printf("%s: [10Mbps]\n", device_get_nameunit(sc->rge_dev));
 		sc->rge_mii.mii_media.ifm_media = IFM_ETHER | IFM_AUTO | IFM_10_T | IFM_FDX;
@@ -1094,7 +1106,7 @@ rmi_xlr_gmac_config_speed(struct driver_
 	} else if (priv->speed == xlr_mac_speed_100) {
 		if (priv->mode != XLR_RGMII)
 			xlr_write_reg(mmio, R_INTERFACE_CONTROL, SGMII_SPEED_100);
-		xlr_write_reg(mmio, R_MAC_CONFIG_2, 0x7137);
+		xlr_write_reg(mmio, R_MAC_CONFIG_2, 0x7117);
 		xlr_write_reg(mmio, R_CORECONTROL, 0x01);
 		printf("%s: [100Mbps]\n", device_get_nameunit(sc->rge_dev));
 		sc->rge_mii.mii_media.ifm_media = IFM_ETHER | IFM_AUTO | IFM_100_TX | IFM_FDX;
@@ -1105,7 +1117,7 @@ rmi_xlr_gmac_config_speed(struct driver_
 			if (priv->mode != XLR_RGMII)
 				xlr_write_reg(mmio, R_INTERFACE_CONTROL, SGMII_SPEED_100);
 			printf("PHY reported unknown MAC speed, defaulting to 100Mbps\n");
-			xlr_write_reg(mmio, R_MAC_CONFIG_2, 0x7137);
+			xlr_write_reg(mmio, R_MAC_CONFIG_2, 0x7117);
 			xlr_write_reg(mmio, R_CORECONTROL, 0x01);
 			sc->rge_mii.mii_media.ifm_media = IFM_ETHER | IFM_AUTO | IFM_100_TX | IFM_FDX;
 			sc->rge_mii.mii_media.ifm_cur->ifm_media = IFM_ETHER | IFM_AUTO | IFM_100_TX | IFM_FDX;
@@ -1113,7 +1125,7 @@ rmi_xlr_gmac_config_speed(struct driver_
 		} else {
 			if (priv->mode != XLR_RGMII)
 				xlr_write_reg(mmio, R_INTERFACE_CONTROL, SGMII_SPEED_1000);
-			xlr_write_reg(mmio, R_MAC_CONFIG_2, 0x7237);
+			xlr_write_reg(mmio, R_MAC_CONFIG_2, 0x7217);
 			xlr_write_reg(mmio, R_CORECONTROL, 0x00);
 			printf("%s: [1000Mbps]\n", device_get_nameunit(sc->rge_dev));
 			sc->rge_mii.mii_media.ifm_media = IFM_ETHER | IFM_AUTO | IFM_1000_T | IFM_FDX;
@@ -1788,7 +1800,9 @@ rge_attach(device_t dev)
 		priv->instance = priv->id - xlr_board_info.gmacports;
 		priv->mmio = (xlr_reg_t *) (xlr_io_base + gmac_conf->baseaddr);
 	}
-	if (xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_VI) {
+	if (xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_VI ||
+	    (xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_XI &&
+	     priv->instance >=4)) {
 		dbg_msg("Arizona board - offset 4 \n");
 		priv->mii_mmio = (xlr_reg_t *) (xlr_io_base + XLR_IO_GMAC_4_OFFSET);
 	} else
@@ -1812,7 +1826,9 @@ rge_attach(device_t dev)
 
 	priv->mode = gmac_conf->mode;
 	if (xlr_board_info.is_xls == 0) {
-		if (xlr_board_atx_ii() && !xlr_board_atx_ii_b())
+		/* TODO - check II and IIB boards */
+		if (xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_II &&
+		    xlr_boot1_info.board_minor_version != 1)
 			priv->phy_addr = priv->instance - 2;
 		else
 			priv->phy_addr = priv->instance;
@@ -1824,7 +1840,12 @@ rge_attach(device_t dev)
 			priv->phy_addr = 0;
 		} else {
 			priv->mode = XLR_SGMII;
-			priv->phy_addr = priv->instance + 16;
+			/* Board 11 has SGMII daughter cards with the XLS chips, in this case
+			   the phy number is 0-3 for both GMAC blocks */
+			if (xlr_boot1_info.board_major_version == RMI_XLR_BOARD_ARIZONA_XI)
+				priv->phy_addr = priv->instance % 4 + 16;
+			else
+				priv->phy_addr = priv->instance + 16;
 		}
 	}
 
@@ -2088,8 +2109,8 @@ rge_intr(void *arg)
 	/* clear all interrupts and hope to make progress */
 	xlr_write_reg(mmio, R_INTREG, 0xffffffff);
 
-	/* on A0 and B0, xgmac interrupts are routed only to xgs_1 irq */
-	if ((xlr_revision_b0()) && (priv->type == XLR_XGMAC)) {
+	/* (not yet) on A0 and B0, xgmac interrupts are routed only to xgs_1 irq */
+	if ((xlr_revision() < 2) && (priv->type == XLR_XGMAC)) {
 		struct rge_softc *xgs0_dev = dev_mac[dev_mac_xgs0];
 		struct driver_data *xgs0_priv = &xgs0_dev->priv;
 		xlr_reg_t *xgs0_mmio = xgs0_priv->mmio;


More information about the svn-src-all mailing list