GK SDK 源码库: XMIPCLinuxV100R005C00SPC030 (kernel/tools/open_source excluded)
This commit is contained in:
@@ -0,0 +1,61 @@
|
||||
if TARGET_LS1088AQDS
|
||||
|
||||
config SYS_BOARD
|
||||
default "ls1088a"
|
||||
|
||||
config SYS_VENDOR
|
||||
default "freescale"
|
||||
|
||||
config SYS_SOC
|
||||
default "fsl-layerscape"
|
||||
|
||||
config SYS_CONFIG_NAME
|
||||
default "ls1088aqds"
|
||||
|
||||
if FSL_LS_PPA
|
||||
config SYS_LS_PPA_FW_ADDR
|
||||
hex "PPA Firmware Addr"
|
||||
default 0x20400000 if SYS_LS_PPA_FW_IN_XIP
|
||||
default 0x400000 if SYS_LS_PPA_FW_IN_MMC || SYS_LS_PPA_FW_IN_NAND
|
||||
|
||||
if CHAIN_OF_TRUST
|
||||
config SYS_LS_PPA_ESBC_ADDR
|
||||
hex "PPA Firmware HDR Addr"
|
||||
default 0x20680000 if SYS_LS_PPA_FW_IN_XIP
|
||||
default 0x680000 if SYS_LS_PPA_FW_IN_MMC || SYS_LS_PPA_FW_IN_NAND
|
||||
endif
|
||||
endif
|
||||
|
||||
source "board/freescale/common/Kconfig"
|
||||
endif
|
||||
|
||||
if TARGET_LS1088ARDB
|
||||
|
||||
config SYS_BOARD
|
||||
default "ls1088a"
|
||||
|
||||
config SYS_VENDOR
|
||||
default "freescale"
|
||||
|
||||
config SYS_SOC
|
||||
default "fsl-layerscape"
|
||||
|
||||
config SYS_CONFIG_NAME
|
||||
default "ls1088ardb"
|
||||
|
||||
if FSL_LS_PPA
|
||||
config SYS_LS_PPA_FW_ADDR
|
||||
hex "PPA Firmware Addr"
|
||||
default 0x20400000 if SYS_LS_PPA_FW_IN_XIP
|
||||
default 0x400000 if SYS_LS_PPA_FW_IN_MMC || SYS_LS_PPA_FW_IN_NAND
|
||||
|
||||
if CHAIN_OF_TRUST
|
||||
config SYS_LS_PPA_ESBC_ADDR
|
||||
hex "PPA Firmware HDR Addr"
|
||||
default 0x20680000 if SYS_LS_PPA_FW_IN_XIP
|
||||
default 0x680000 if SYS_LS_PPA_FW_IN_MMC || SYS_LS_PPA_FW_IN_NAND
|
||||
endif
|
||||
endif
|
||||
|
||||
source "board/freescale/common/Kconfig"
|
||||
endif
|
||||
@@ -0,0 +1,41 @@
|
||||
LS1088ARDB BOARD
|
||||
M: Prabhakar Kushwaha <prabhakar.kushwaha@nxp.com>
|
||||
M: Ashish Kumar <Ashish.Kumar@nxp.com>
|
||||
M: Rajesh Bhagat <rajesh.bhagat@nxp.com>
|
||||
S: Maintained
|
||||
F: board/freescale/ls1088a/
|
||||
F: include/configs/ls1088ardb.h
|
||||
F: configs/ls1088ardb_qspi_defconfig
|
||||
F: configs/ls1088ardb_sdcard_qspi_defconfig
|
||||
F: configs/ls1088ardb_tfa_defconfig
|
||||
F: configs/ls1088ardb_tfa_SECURE_BOOT_defconfig
|
||||
|
||||
LS1088AQDS BOARD
|
||||
M: Prabhakar Kushwaha <prabhakar.kushwaha@nxp.com>
|
||||
M: Ashish Kumar <Ashish.Kumar@nxp.com>
|
||||
M: Rajesh Bhagat <rajesh.bhagat@nxp.com>
|
||||
S: Maintained
|
||||
F: board/freescale/ls1088a/
|
||||
F: include/configs/ls1088aqds.h
|
||||
F: configs/ls1088aqds_qspi_defconfig
|
||||
F: configs/ls1088aqds_sdcard_qspi_defconfig
|
||||
F: configs/ls1088aqds_defconfig
|
||||
F: configs/ls1088aqds_sdcard_ifc_defconfig
|
||||
F: configs/ls1088aqds_tfa_defconfig
|
||||
|
||||
LS1088AQDS_QSPI_SECURE_BOOT BOARD
|
||||
M: Udit Agarwal <udit.agarwal@nxp.com>
|
||||
M: Vinitha Pillai-B57223 <vinitha.pillai@nxp.com>
|
||||
S: Maintained
|
||||
F: configs/ls1088aqds_qspi_SECURE_BOOT_defconfig
|
||||
|
||||
LS1088ARDB_QSPI_SECURE_BOOT BOARD
|
||||
M: Udit Agarwal <udit.agarwal@nxp.com>
|
||||
M: Vinitha Pillai-B57223 <vinitha.pillai@nxp.com>
|
||||
S: Maintained
|
||||
F: configs/ls1088ardb_qspi_SECURE_BOOT_defconfig
|
||||
|
||||
LS1088ARDB_SD_SECURE_BOOT BOARD
|
||||
M: Sumit Garg <sumit.garg@nxp.com>
|
||||
S: Maintained
|
||||
F: configs/ls1088ardb_sdcard_qspi_SECURE_BOOT_defconfig
|
||||
@@ -0,0 +1,10 @@
|
||||
# SPDX-License-Identifier: GPL-2.0+
|
||||
#
|
||||
# Copyright 2017 NXP
|
||||
|
||||
obj-y += ls1088a.o
|
||||
obj-y += ddr.o
|
||||
ifndef CONFIG_SPL_BUILD
|
||||
obj-$(CONFIG_TARGET_LS1088ARDB) += eth_ls1088ardb.o
|
||||
obj-$(CONFIG_TARGET_LS1088AQDS) += eth_ls1088aqds.o
|
||||
endif
|
||||
@@ -0,0 +1,145 @@
|
||||
Overview
|
||||
--------
|
||||
The LS1088A Reference Design (RDB) is a high-performance computing,
|
||||
evaluation, and development platform that supports ARM SoC LS1088A and its
|
||||
derivatives.
|
||||
|
||||
|
||||
LS1088A SoC Overview
|
||||
--------------------------------------
|
||||
Please refer arch/arm/cpu/armv8/fsl-layerscape/doc/README.soc
|
||||
|
||||
RDB Default Switch Settings (1: ON; 0: OFF)
|
||||
-------------------------------------------
|
||||
|
||||
For QSPI Boot
|
||||
SW1 0011 0001
|
||||
SW2 x100 0000
|
||||
SW3 1111 0010
|
||||
SW4 1001 0011
|
||||
SW5 1111 0000
|
||||
|
||||
For SD Boot
|
||||
SW1 0010 0000
|
||||
SW2 0100 0000
|
||||
SW3 1111 0010
|
||||
SW4 1001 0011
|
||||
SW5 1111 0000
|
||||
|
||||
For eMMC Boot
|
||||
SW1 0010 0000
|
||||
SW2 1100 0000
|
||||
SW3 1111 0010
|
||||
SW4 1001 0011
|
||||
SW5 1111 0000
|
||||
|
||||
Alternately you can use this command to switch from QSPI to SD
|
||||
|
||||
=> i2c mw 66 0x60 0x20; i2c mw 66 10 10;i2c mw 66 10 21
|
||||
|
||||
LS1088ARDB board Overview
|
||||
-------------------------
|
||||
- SERDES Connections, 16 lanes supporting:
|
||||
- PCI Express - 3.0
|
||||
- SATA 3.0
|
||||
- XFI
|
||||
- QSGMII
|
||||
- DDR Controller
|
||||
- One ports of 72-bits (8-bits ECC, 64-bits DATA) DDR4. Each port supports four
|
||||
chip-selects on one DIMM connector. Support is up to 2133MT/s, Although MAX default
|
||||
with FSL refernce software is 2100MT/s
|
||||
- 2 QSPI-NOR Spansion(S25FS512SDSMFI011) flash of size 64MB
|
||||
- IFC/Local Bus
|
||||
- One 2 GB NAND flash with ECC support, not as boot source
|
||||
- CPLD of size 2K
|
||||
- USB 3.0
|
||||
- Two high speed USB 3.0 ports
|
||||
- First USB 3.0 port configured as Host with Type-A connector
|
||||
- Second USB 3.0 port configured as OTG with micro-AB connector
|
||||
- SDHC/eMMC
|
||||
- SDHC slot and onboard eMMC are muxed together
|
||||
- 4 I2C controllers
|
||||
- Two SATA onboard connectors
|
||||
- 2 UART
|
||||
- JTAG support
|
||||
- QSPI emulator support
|
||||
- TDM riser support
|
||||
|
||||
QDS Default Switch Settings (1: ON; 0: OFF)
|
||||
-------------------------------------------
|
||||
|
||||
For 16b IFC-NOR
|
||||
SW1 0001 0010
|
||||
SW2 x110 1111
|
||||
|
||||
For QSPI Boot
|
||||
SW1 0011 0001
|
||||
SW2 0110 1111
|
||||
|
||||
For SD Boot
|
||||
SW1 0010 0000
|
||||
SW2 0110 1111
|
||||
|
||||
For eMMC Boot
|
||||
SW1 0010 0000
|
||||
SW2 1110 1111
|
||||
|
||||
For I2C (ext. addr.)
|
||||
SW1 0010 0100
|
||||
SW2 1110 1111
|
||||
|
||||
SW3 to SW12 are identical for all boot source
|
||||
|
||||
SW3 0010 0100
|
||||
SW4 0010 0000
|
||||
SW5 1110 0111
|
||||
SW6 1110 1000
|
||||
SW7 0001 1101
|
||||
SW8 0000 1101
|
||||
SW9 1100 1010
|
||||
SW10 1110 1000
|
||||
SW11 1111 0100
|
||||
SW12 1111 1111
|
||||
|
||||
LS1088AQDS board Overview
|
||||
-------------------------
|
||||
- SERDES Connections, 16 lanes supporting:
|
||||
- PCI Express - 3.0
|
||||
- SATA 3.0
|
||||
- 2 XFI
|
||||
- QSGMII, SGMII with help for Riser card
|
||||
- 2 RGMII
|
||||
- 5 slot for Riser card or PCIe NIC
|
||||
- DDR Controller
|
||||
- One ports of 72-bits (8-bits ECC, 64-bits DATA) DDR4. Each port supports four
|
||||
chip-selects on one DIMM connector. Support is up to 2133MT/s, Although MAX default
|
||||
with FSL refernce software is 2100MT/s
|
||||
- 2 QSPI-NOR Spansion(S25FS512SDSMFI011) flash of size 64MB
|
||||
- IFC/Local Bus
|
||||
- One 2 GB NAND flash with ECC support, not as boot source
|
||||
- CPLD of size 2K
|
||||
- USB 3.0
|
||||
- Two high speed USB 3.0 ports
|
||||
- First USB 3.0 port configured as Host with Type-A connector
|
||||
- Second USB 3.0 port configured as OTG with micro-AB connector
|
||||
- SDHC/eMMC
|
||||
- SDHC/eMMC slot via adaptor
|
||||
- 4 I2C controllers
|
||||
- Two SATA onboard connectors
|
||||
- 2 UART
|
||||
- JTAG support
|
||||
- DSPI
|
||||
- PROMJET support
|
||||
- QSPI emulator support
|
||||
- TDM riser support
|
||||
|
||||
QSPI flash memory map valid for both QDS and RDB
|
||||
Image Flash Offset
|
||||
RCW+PBI 0x00000000
|
||||
Boot firmware (U-Boot) 0x00100000
|
||||
Boot firmware Environment 0x00300000
|
||||
PPA firmware 0x00400000
|
||||
DPAA2 MC 0x00A00000
|
||||
DPAA2 DPL 0x00D00000
|
||||
DPAA2 DPC 0x00E00000
|
||||
Kernel.itb 0x01000000
|
||||
@@ -0,0 +1,136 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* Copyright 2017 NXP
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <fsl_ddr_sdram.h>
|
||||
#include <fsl_ddr_dimm_params.h>
|
||||
#include <asm/arch/soc.h>
|
||||
#include <asm/arch/clock.h>
|
||||
#include "ddr.h"
|
||||
|
||||
DECLARE_GLOBAL_DATA_PTR;
|
||||
|
||||
#if defined(CONFIG_VID) && (!defined(CONFIG_SPL) || defined(CONFIG_SPL_BUILD))
|
||||
static void fsl_ddr_setup_0v9_volt(memctl_options_t *popts)
|
||||
{
|
||||
int vdd;
|
||||
|
||||
vdd = get_core_volt_from_fuse();
|
||||
/* Nothing to do for silicons doesn't support VID */
|
||||
if (vdd < 0)
|
||||
return;
|
||||
|
||||
if (vdd == 900) {
|
||||
popts->ddr_cdr1 |= DDR_CDR1_V0PT9_EN;
|
||||
debug("VID: configure DDR to support 900 mV\n");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
void fsl_ddr_board_options(memctl_options_t *popts,
|
||||
dimm_params_t *pdimm,
|
||||
unsigned int ctrl_num)
|
||||
{
|
||||
const struct board_specific_parameters *pbsp, *pbsp_highest = NULL;
|
||||
ulong ddr_freq;
|
||||
|
||||
if (ctrl_num > 1) {
|
||||
printf("Not supported controller number %d\n", ctrl_num);
|
||||
return;
|
||||
}
|
||||
if (!pdimm->n_ranks)
|
||||
return;
|
||||
|
||||
/*
|
||||
* we use identical timing for all slots. If needed, change the code
|
||||
* to pbsp = rdimms[ctrl_num] or pbsp = udimms[ctrl_num];
|
||||
*/
|
||||
pbsp = udimms[0];
|
||||
|
||||
/* Get clk_adjust, wrlvl_start, wrlvl_ctl, according to the board ddr
|
||||
* freqency and n_banks specified in board_specific_parameters table.
|
||||
*/
|
||||
ddr_freq = get_ddr_freq(0) / 1000000;
|
||||
while (pbsp->datarate_mhz_high) {
|
||||
if (pbsp->n_ranks == pdimm->n_ranks) {
|
||||
if (ddr_freq <= pbsp->datarate_mhz_high) {
|
||||
popts->clk_adjust = pbsp->clk_adjust;
|
||||
popts->wrlvl_start = pbsp->wrlvl_start;
|
||||
popts->wrlvl_ctl_2 = pbsp->wrlvl_ctl_2;
|
||||
popts->wrlvl_ctl_3 = pbsp->wrlvl_ctl_3;
|
||||
goto found;
|
||||
}
|
||||
pbsp_highest = pbsp;
|
||||
}
|
||||
pbsp++;
|
||||
}
|
||||
|
||||
if (pbsp_highest) {
|
||||
printf("Error: board specific timing not found for %lu MT/s\n",
|
||||
ddr_freq);
|
||||
printf("Trying to use the highest speed (%u) parameters\n",
|
||||
pbsp_highest->datarate_mhz_high);
|
||||
popts->clk_adjust = pbsp_highest->clk_adjust;
|
||||
popts->wrlvl_start = pbsp_highest->wrlvl_start;
|
||||
popts->wrlvl_ctl_2 = pbsp->wrlvl_ctl_2;
|
||||
popts->wrlvl_ctl_3 = pbsp->wrlvl_ctl_3;
|
||||
} else {
|
||||
panic("DIMM is not supported by this board");
|
||||
}
|
||||
found:
|
||||
debug("Found timing match: n_ranks %d, data rate %d, rank_gb %d\n"
|
||||
"\tclk_adjust %d, wrlvl_start %d, wrlvl_ctrl_2 0x%x, wrlvl_ctrl_3 0x%x\n",
|
||||
pbsp->n_ranks, pbsp->datarate_mhz_high, pbsp->rank_gb,
|
||||
pbsp->clk_adjust, pbsp->wrlvl_start, pbsp->wrlvl_ctl_2,
|
||||
pbsp->wrlvl_ctl_3);
|
||||
|
||||
|
||||
|
||||
popts->half_strength_driver_enable = 0;
|
||||
/*
|
||||
* Write leveling override
|
||||
*/
|
||||
popts->wrlvl_override = 1;
|
||||
popts->wrlvl_sample = 0xf;
|
||||
|
||||
|
||||
/* Enable ZQ calibration */
|
||||
popts->zq_en = 1;
|
||||
|
||||
/* Enable DDR hashing */
|
||||
popts->addr_hash = 1;
|
||||
|
||||
popts->ddr_cdr1 = DDR_CDR1_DHC_EN | DDR_CDR1_ODT(DDR_CDR_ODT_60ohm);
|
||||
#if defined(CONFIG_VID) && (!defined(CONFIG_SPL) || defined(CONFIG_SPL_BUILD))
|
||||
fsl_ddr_setup_0v9_volt(popts);
|
||||
#endif
|
||||
|
||||
popts->ddr_cdr2 = DDR_CDR2_ODT(DDR_CDR_ODT_60ohm) |
|
||||
DDR_CDR2_VREF_TRAIN_EN | DDR_CDR2_VREF_RANGE_2;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_TFABOOT
|
||||
int fsl_initdram(void)
|
||||
{
|
||||
gd->ram_size = tfa_get_dram_size();
|
||||
|
||||
if (!gd->ram_size)
|
||||
gd->ram_size = fsl_ddr_sdram_size();
|
||||
|
||||
return 0;
|
||||
}
|
||||
#else
|
||||
int fsl_initdram(void)
|
||||
{
|
||||
puts("Initializing DDR....using SPD\n");
|
||||
|
||||
#if defined(CONFIG_SPL) && !defined(CONFIG_SPL_BUILD)
|
||||
gd->ram_size = fsl_ddr_sdram_size();
|
||||
#else
|
||||
gd->ram_size = fsl_ddr_sdram();
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
#endif /* CONFIG_TFABOOT */
|
||||
@@ -0,0 +1,48 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright 2017 NXP
|
||||
*/
|
||||
|
||||
#ifndef __LS1088A_DDR_H__
|
||||
#define __LS1088A_DDR_H__
|
||||
struct board_specific_parameters {
|
||||
u32 n_ranks;
|
||||
u32 datarate_mhz_high;
|
||||
u32 rank_gb;
|
||||
u32 clk_adjust;
|
||||
u32 wrlvl_start;
|
||||
u32 wrlvl_ctl_2;
|
||||
u32 wrlvl_ctl_3;
|
||||
};
|
||||
|
||||
/*
|
||||
* These tables contain all valid speeds we want to override with board
|
||||
* specific parameters. datarate_mhz_high values need to be in ascending order
|
||||
* for each n_ranks group.
|
||||
*/
|
||||
|
||||
static const struct board_specific_parameters udimm0[] = {
|
||||
/*
|
||||
* memory controller 0
|
||||
* num| hi| rank| clk| wrlvl | wrlvl | wrlvl
|
||||
* ranks| mhz| GB |adjst| start | ctl2 | ctl3
|
||||
*/
|
||||
#if defined(CONFIG_TARGET_LS1088ARDB)
|
||||
|
||||
{2, 1666, 0, 8, 8, 0x090A0B0E, 0x0F10110D,},
|
||||
{2, 1900, 0, 8, 9, 0x0A0B0C10, 0x1112140E,},
|
||||
{2, 2300, 0, 8, 9, 0x0A0C0E11, 0x1214160F,},
|
||||
{}
|
||||
#elif defined(CONFIG_TARGET_LS1088AQDS)
|
||||
{2, 1666, 0, 8, 8, 0x0A0A0C0E, 0x0F10110C,},
|
||||
{2, 1900, 0, 8, 9, 0x0A0B0C10, 0x1112140E,},
|
||||
{2, 2300, 0, 4, 9, 0x0A0C0D11, 0x1214150E,},
|
||||
{}
|
||||
|
||||
#endif
|
||||
};
|
||||
|
||||
static const struct board_specific_parameters *udimms[] = {
|
||||
udimm0,
|
||||
};
|
||||
#endif
|
||||
@@ -0,0 +1,743 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* Copyright 2017 NXP
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <command.h>
|
||||
#include <env.h>
|
||||
#include <netdev.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/arch/fsl_serdes.h>
|
||||
#include <hwconfig.h>
|
||||
#include <fsl_mdio.h>
|
||||
#include <malloc.h>
|
||||
#include <phy.h>
|
||||
#include <fm_eth.h>
|
||||
#include <i2c.h>
|
||||
#include <miiphy.h>
|
||||
#include <fsl-mc/fsl_mc.h>
|
||||
#include <fsl-mc/ldpaa_wriop.h>
|
||||
|
||||
#include "../common/qixis.h"
|
||||
|
||||
#include "ls1088a_qixis.h"
|
||||
|
||||
#ifdef CONFIG_FSL_MC_ENET
|
||||
|
||||
#define SFP_TX 0
|
||||
|
||||
/* - In LS1088A A there are only 16 SERDES lanes, spread across 2 SERDES banks.
|
||||
* Bank 1 -> Lanes A, B, C, D,
|
||||
* Bank 2 -> Lanes A,B, C, D,
|
||||
*/
|
||||
|
||||
/* Mapping of 8 SERDES lanes to LS1088A QDS board slots. A value of '0' here
|
||||
* means that the mapping must be determined dynamically, or that the lane
|
||||
* maps to something other than a board slot.
|
||||
*/
|
||||
|
||||
static u8 lane_to_slot_fsm1[] = {
|
||||
0, 0, 0, 0, 0, 0, 0, 0
|
||||
};
|
||||
|
||||
/* On the Vitesse VSC8234XHG SGMII riser card there are 4 SGMII PHYs
|
||||
* housed.
|
||||
*/
|
||||
|
||||
static int xqsgii_riser_phy_addr[] = {
|
||||
XQSGMII_CARD_PHY1_PORT0_ADDR,
|
||||
XQSGMII_CARD_PHY2_PORT0_ADDR,
|
||||
XQSGMII_CARD_PHY3_PORT0_ADDR,
|
||||
XQSGMII_CARD_PHY4_PORT0_ADDR,
|
||||
XQSGMII_CARD_PHY3_PORT2_ADDR,
|
||||
XQSGMII_CARD_PHY1_PORT2_ADDR,
|
||||
XQSGMII_CARD_PHY4_PORT2_ADDR,
|
||||
XQSGMII_CARD_PHY2_PORT2_ADDR,
|
||||
};
|
||||
|
||||
static int sgmii_riser_phy_addr[] = {
|
||||
SGMII_CARD_PORT1_PHY_ADDR,
|
||||
SGMII_CARD_PORT2_PHY_ADDR,
|
||||
SGMII_CARD_PORT3_PHY_ADDR,
|
||||
SGMII_CARD_PORT4_PHY_ADDR,
|
||||
};
|
||||
|
||||
/* Slot2 does not have EMI connections */
|
||||
#define EMI_NONE 0xFF
|
||||
#define EMI1_RGMII1 0
|
||||
#define EMI1_RGMII2 1
|
||||
#define EMI1_SLOT1 2
|
||||
|
||||
static const char * const mdio_names[] = {
|
||||
"LS1088A_QDS_MDIO0",
|
||||
"LS1088A_QDS_MDIO1",
|
||||
"LS1088A_QDS_MDIO2",
|
||||
DEFAULT_WRIOP_MDIO2_NAME,
|
||||
};
|
||||
|
||||
struct ls1088a_qds_mdio {
|
||||
u8 muxval;
|
||||
struct mii_dev *realbus;
|
||||
};
|
||||
|
||||
struct reg_pair {
|
||||
uint addr;
|
||||
u8 *val;
|
||||
};
|
||||
|
||||
static void sgmii_configure_repeater(int dpmac)
|
||||
{
|
||||
struct mii_dev *bus;
|
||||
uint8_t a = 0xf;
|
||||
int i, j, k, ret;
|
||||
unsigned short value;
|
||||
const char *dev = "LS1088A_QDS_MDIO2";
|
||||
int i2c_addr[] = {0x58, 0x59, 0x5a, 0x5b};
|
||||
int i2c_phy_addr = 0;
|
||||
int phy_addr = 0;
|
||||
|
||||
uint8_t ch_a_eq[] = {0x1, 0x2, 0x3, 0x7};
|
||||
uint8_t ch_a_ctl2[] = {0x81, 0x82, 0x83, 0x84};
|
||||
uint8_t ch_b_eq[] = {0x1, 0x2, 0x3, 0x7};
|
||||
uint8_t ch_b_ctl2[] = {0x81, 0x82, 0x83, 0x84};
|
||||
|
||||
u8 reg_val[6] = {0x18, 0x38, 0x4, 0x14, 0xb5, 0x20};
|
||||
struct reg_pair reg_pair[10] = {
|
||||
{6, ®_val[0]}, {4, ®_val[1]},
|
||||
{8, ®_val[2]}, {0xf, NULL},
|
||||
{0x11, NULL}, {0x16, NULL},
|
||||
{0x18, NULL}, {0x23, ®_val[3]},
|
||||
{0x2d, ®_val[4]}, {4, ®_val[5]},
|
||||
};
|
||||
#ifdef CONFIG_DM_I2C
|
||||
struct udevice *udev;
|
||||
#endif
|
||||
|
||||
/* Set I2c to Slot 1 */
|
||||
#ifndef CONFIG_DM_I2C
|
||||
ret = i2c_write(0x77, 0, 0, &a, 1);
|
||||
#else
|
||||
ret = i2c_get_chip_for_busnum(0, 0x77, 1, &udev);
|
||||
if (!ret)
|
||||
ret = dm_i2c_write(udev, 0, &a, 1);
|
||||
#endif
|
||||
if (ret)
|
||||
goto error;
|
||||
|
||||
switch (dpmac) {
|
||||
case 1:
|
||||
i2c_phy_addr = i2c_addr[1];
|
||||
phy_addr = 4;
|
||||
break;
|
||||
case 2:
|
||||
i2c_phy_addr = i2c_addr[0];
|
||||
phy_addr = 0;
|
||||
break;
|
||||
case 3:
|
||||
i2c_phy_addr = i2c_addr[3];
|
||||
phy_addr = 0xc;
|
||||
break;
|
||||
case 7:
|
||||
i2c_phy_addr = i2c_addr[2];
|
||||
phy_addr = 8;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Check the PHY status */
|
||||
ret = miiphy_set_current_dev(dev);
|
||||
if (ret > 0)
|
||||
goto error;
|
||||
|
||||
bus = mdio_get_current_dev();
|
||||
debug("Reading from bus %s\n", bus->name);
|
||||
|
||||
ret = miiphy_write(dev, phy_addr, 0x1f, 3);
|
||||
if (ret > 0)
|
||||
goto error;
|
||||
|
||||
mdelay(10);
|
||||
ret = miiphy_read(dev, phy_addr, 0x11, &value);
|
||||
if (ret > 0)
|
||||
goto error;
|
||||
|
||||
mdelay(10);
|
||||
|
||||
if ((value & 0xfff) == 0x401) {
|
||||
miiphy_write(dev, phy_addr, 0x1f, 0);
|
||||
printf("DPMAC %d:PHY is ..... Configured\n", dpmac);
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DM_I2C
|
||||
i2c_get_chip_for_busnum(0, i2c_phy_addr, 1, &udev);
|
||||
#endif
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
for (j = 0; j < 4; j++) {
|
||||
reg_pair[3].val = &ch_a_eq[i];
|
||||
reg_pair[4].val = &ch_a_ctl2[j];
|
||||
reg_pair[5].val = &ch_b_eq[i];
|
||||
reg_pair[6].val = &ch_b_ctl2[j];
|
||||
for (k = 0; k < 10; k++) {
|
||||
#ifndef CONFIG_DM_I2C
|
||||
ret = i2c_write(i2c_phy_addr,
|
||||
reg_pair[k].addr,
|
||||
1, reg_pair[k].val, 1);
|
||||
#else
|
||||
ret = i2c_get_chip_for_busnum(0,
|
||||
i2c_phy_addr,
|
||||
1, &udev);
|
||||
if (!ret)
|
||||
ret = dm_i2c_write(udev,
|
||||
reg_pair[k].addr,
|
||||
reg_pair[k].val, 1);
|
||||
#endif
|
||||
if (ret)
|
||||
goto error;
|
||||
}
|
||||
|
||||
mdelay(100);
|
||||
ret = miiphy_read(dev, phy_addr, 0x11, &value);
|
||||
if (ret > 0)
|
||||
goto error;
|
||||
|
||||
mdelay(100);
|
||||
ret = miiphy_read(dev, phy_addr, 0x11, &value);
|
||||
if (ret > 0)
|
||||
goto error;
|
||||
|
||||
if ((value & 0xfff) == 0x401) {
|
||||
printf("DPMAC %d :PHY is configured ",
|
||||
dpmac);
|
||||
printf("after setting repeater 0x%x\n",
|
||||
value);
|
||||
i = 5;
|
||||
j = 5;
|
||||
} else {
|
||||
printf("DPMAC %d :PHY is failed to ",
|
||||
dpmac);
|
||||
printf("configure the repeater 0x%x\n", value);
|
||||
}
|
||||
}
|
||||
}
|
||||
miiphy_write(dev, phy_addr, 0x1f, 0);
|
||||
error:
|
||||
if (ret)
|
||||
printf("DPMAC %d ..... FAILED to configure PHY\n", dpmac);
|
||||
return;
|
||||
}
|
||||
|
||||
static void qsgmii_configure_repeater(int dpmac)
|
||||
{
|
||||
uint8_t a = 0xf;
|
||||
int i, j, k;
|
||||
int i2c_phy_addr = 0;
|
||||
int phy_addr = 0;
|
||||
int i2c_addr[] = {0x58, 0x59, 0x5a, 0x5b};
|
||||
|
||||
uint8_t ch_a_eq[] = {0x1, 0x2, 0x3, 0x7};
|
||||
uint8_t ch_a_ctl2[] = {0x81, 0x82, 0x83, 0x84};
|
||||
uint8_t ch_b_eq[] = {0x1, 0x2, 0x3, 0x7};
|
||||
uint8_t ch_b_ctl2[] = {0x81, 0x82, 0x83, 0x84};
|
||||
|
||||
u8 reg_val[6] = {0x18, 0x38, 0x4, 0x14, 0xb5, 0x20};
|
||||
struct reg_pair reg_pair[10] = {
|
||||
{6, ®_val[0]}, {4, ®_val[1]},
|
||||
{8, ®_val[2]}, {0xf, NULL},
|
||||
{0x11, NULL}, {0x16, NULL},
|
||||
{0x18, NULL}, {0x23, ®_val[3]},
|
||||
{0x2d, ®_val[4]}, {4, ®_val[5]},
|
||||
};
|
||||
|
||||
const char *dev = mdio_names[EMI1_SLOT1];
|
||||
int ret = 0;
|
||||
unsigned short value;
|
||||
#ifdef CONFIG_DM_I2C
|
||||
struct udevice *udev;
|
||||
#endif
|
||||
|
||||
/* Set I2c to Slot 1 */
|
||||
#ifndef CONFIG_DM_I2C
|
||||
ret = i2c_write(0x77, 0, 0, &a, 1);
|
||||
#else
|
||||
ret = i2c_get_chip_for_busnum(0, 0x77, 1, &udev);
|
||||
if (!ret)
|
||||
ret = dm_i2c_write(udev, 0, &a, 1);
|
||||
#endif
|
||||
if (ret)
|
||||
goto error;
|
||||
|
||||
switch (dpmac) {
|
||||
case 7:
|
||||
case 8:
|
||||
case 9:
|
||||
case 10:
|
||||
i2c_phy_addr = i2c_addr[2];
|
||||
phy_addr = 8;
|
||||
break;
|
||||
|
||||
case 3:
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
i2c_phy_addr = i2c_addr[3];
|
||||
phy_addr = 0xc;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Check the PHY status */
|
||||
ret = miiphy_set_current_dev(dev);
|
||||
ret = miiphy_write(dev, phy_addr, 0x1f, 3);
|
||||
mdelay(10);
|
||||
ret = miiphy_read(dev, phy_addr, 0x11, &value);
|
||||
mdelay(10);
|
||||
ret = miiphy_read(dev, phy_addr, 0x11, &value);
|
||||
mdelay(10);
|
||||
if ((value & 0xf) == 0xf) {
|
||||
miiphy_write(dev, phy_addr, 0x1f, 0);
|
||||
printf("DPMAC %d :PHY is ..... Configured\n", dpmac);
|
||||
return;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DM_I2C
|
||||
i2c_get_chip_for_busnum(0, i2c_phy_addr, 1, &udev);
|
||||
#endif
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
for (j = 0; j < 4; j++) {
|
||||
reg_pair[3].val = &ch_a_eq[i];
|
||||
reg_pair[4].val = &ch_a_ctl2[j];
|
||||
reg_pair[5].val = &ch_b_eq[i];
|
||||
reg_pair[6].val = &ch_b_ctl2[j];
|
||||
|
||||
for (k = 0; k < 10; k++) {
|
||||
#ifndef CONFIG_DM_I2C
|
||||
ret = i2c_write(i2c_phy_addr,
|
||||
reg_pair[k].addr,
|
||||
1, reg_pair[k].val, 1);
|
||||
#else
|
||||
ret = i2c_get_chip_for_busnum(0,
|
||||
i2c_addr[dpmac],
|
||||
1, &udev);
|
||||
if (!ret)
|
||||
ret = dm_i2c_write(udev,
|
||||
reg_pair[k].addr,
|
||||
reg_pair[k].val, 1);
|
||||
#endif
|
||||
if (ret)
|
||||
goto error;
|
||||
}
|
||||
|
||||
ret = miiphy_read(dev, phy_addr, 0x11, &value);
|
||||
if (ret > 0)
|
||||
goto error;
|
||||
mdelay(1);
|
||||
ret = miiphy_read(dev, phy_addr, 0x11, &value);
|
||||
if (ret > 0)
|
||||
goto error;
|
||||
mdelay(10);
|
||||
if ((value & 0xf) == 0xf) {
|
||||
miiphy_write(dev, phy_addr, 0x1f, 0);
|
||||
printf("DPMAC %d :PHY is ..... Configured\n",
|
||||
dpmac);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
error:
|
||||
printf("DPMAC %d :PHY ..... FAILED to configure PHY\n", dpmac);
|
||||
return;
|
||||
}
|
||||
|
||||
static const char *ls1088a_qds_mdio_name_for_muxval(u8 muxval)
|
||||
{
|
||||
return mdio_names[muxval];
|
||||
}
|
||||
|
||||
struct mii_dev *mii_dev_for_muxval(u8 muxval)
|
||||
{
|
||||
struct mii_dev *bus;
|
||||
const char *name = ls1088a_qds_mdio_name_for_muxval(muxval);
|
||||
|
||||
if (!name) {
|
||||
printf("No bus for muxval %x\n", muxval);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
bus = miiphy_get_dev_by_name(name);
|
||||
|
||||
if (!bus) {
|
||||
printf("No bus by name %s\n", name);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return bus;
|
||||
}
|
||||
|
||||
static void ls1088a_qds_enable_SFP_TX(u8 muxval)
|
||||
{
|
||||
u8 brdcfg9;
|
||||
|
||||
brdcfg9 = QIXIS_READ(brdcfg[9]);
|
||||
brdcfg9 &= ~BRDCFG9_SFPTX_MASK;
|
||||
brdcfg9 |= (muxval << BRDCFG9_SFPTX_SHIFT);
|
||||
QIXIS_WRITE(brdcfg[9], brdcfg9);
|
||||
}
|
||||
|
||||
static void ls1088a_qds_mux_mdio(u8 muxval)
|
||||
{
|
||||
u8 brdcfg4;
|
||||
|
||||
if (muxval <= 5) {
|
||||
brdcfg4 = QIXIS_READ(brdcfg[4]);
|
||||
brdcfg4 &= ~BRDCFG4_EMISEL_MASK;
|
||||
brdcfg4 |= (muxval << BRDCFG4_EMISEL_SHIFT);
|
||||
QIXIS_WRITE(brdcfg[4], brdcfg4);
|
||||
}
|
||||
}
|
||||
|
||||
static int ls1088a_qds_mdio_read(struct mii_dev *bus, int addr,
|
||||
int devad, int regnum)
|
||||
{
|
||||
struct ls1088a_qds_mdio *priv = bus->priv;
|
||||
|
||||
ls1088a_qds_mux_mdio(priv->muxval);
|
||||
|
||||
return priv->realbus->read(priv->realbus, addr, devad, regnum);
|
||||
}
|
||||
|
||||
static int ls1088a_qds_mdio_write(struct mii_dev *bus, int addr, int devad,
|
||||
int regnum, u16 value)
|
||||
{
|
||||
struct ls1088a_qds_mdio *priv = bus->priv;
|
||||
|
||||
ls1088a_qds_mux_mdio(priv->muxval);
|
||||
|
||||
return priv->realbus->write(priv->realbus, addr, devad, regnum, value);
|
||||
}
|
||||
|
||||
static int ls1088a_qds_mdio_reset(struct mii_dev *bus)
|
||||
{
|
||||
struct ls1088a_qds_mdio *priv = bus->priv;
|
||||
|
||||
return priv->realbus->reset(priv->realbus);
|
||||
}
|
||||
|
||||
static int ls1088a_qds_mdio_init(char *realbusname, u8 muxval)
|
||||
{
|
||||
struct ls1088a_qds_mdio *pmdio;
|
||||
struct mii_dev *bus = mdio_alloc();
|
||||
|
||||
if (!bus) {
|
||||
printf("Failed to allocate ls1088a_qds MDIO bus\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
pmdio = malloc(sizeof(*pmdio));
|
||||
if (!pmdio) {
|
||||
printf("Failed to allocate ls1088a_qds private data\n");
|
||||
free(bus);
|
||||
return -1;
|
||||
}
|
||||
|
||||
bus->read = ls1088a_qds_mdio_read;
|
||||
bus->write = ls1088a_qds_mdio_write;
|
||||
bus->reset = ls1088a_qds_mdio_reset;
|
||||
sprintf(bus->name, ls1088a_qds_mdio_name_for_muxval(muxval));
|
||||
|
||||
pmdio->realbus = miiphy_get_dev_by_name(realbusname);
|
||||
|
||||
if (!pmdio->realbus) {
|
||||
printf("No bus with name %s\n", realbusname);
|
||||
free(bus);
|
||||
free(pmdio);
|
||||
return -1;
|
||||
}
|
||||
|
||||
pmdio->muxval = muxval;
|
||||
bus->priv = pmdio;
|
||||
|
||||
return mdio_register(bus);
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize the dpmac_info array.
|
||||
*
|
||||
*/
|
||||
static void initialize_dpmac_to_slot(void)
|
||||
{
|
||||
struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
|
||||
u32 serdes1_prtcl, cfg;
|
||||
|
||||
cfg = in_le32(&gur->rcwsr[FSL_CHASSIS3_SRDS1_REGSR - 1]) &
|
||||
FSL_CHASSIS3_SRDS1_PRTCL_MASK;
|
||||
cfg >>= FSL_CHASSIS3_SRDS1_PRTCL_SHIFT;
|
||||
serdes1_prtcl = serdes_get_number(FSL_SRDS_1, cfg);
|
||||
|
||||
switch (serdes1_prtcl) {
|
||||
case 0x12:
|
||||
printf("qds: WRIOP: Supported SerDes1 Protocol 0x%02x\n",
|
||||
serdes1_prtcl);
|
||||
lane_to_slot_fsm1[0] = EMI1_SLOT1 - 1;
|
||||
lane_to_slot_fsm1[1] = EMI1_SLOT1 - 1;
|
||||
lane_to_slot_fsm1[2] = EMI1_SLOT1 - 1;
|
||||
lane_to_slot_fsm1[3] = EMI1_SLOT1 - 1;
|
||||
break;
|
||||
case 0x15:
|
||||
case 0x1D:
|
||||
printf("qds: WRIOP: Supported SerDes1 Protocol 0x%02x\n",
|
||||
serdes1_prtcl);
|
||||
lane_to_slot_fsm1[0] = EMI1_SLOT1 - 1;
|
||||
lane_to_slot_fsm1[1] = EMI1_SLOT1 - 1;
|
||||
lane_to_slot_fsm1[2] = EMI_NONE;
|
||||
lane_to_slot_fsm1[3] = EMI_NONE;
|
||||
break;
|
||||
case 0x1E:
|
||||
printf("qds: WRIOP: Supported SerDes1 Protocol 0x%02x\n",
|
||||
serdes1_prtcl);
|
||||
lane_to_slot_fsm1[0] = EMI1_SLOT1 - 1;
|
||||
lane_to_slot_fsm1[1] = EMI1_SLOT1 - 1;
|
||||
lane_to_slot_fsm1[2] = EMI1_SLOT1 - 1;
|
||||
lane_to_slot_fsm1[3] = EMI_NONE;
|
||||
break;
|
||||
case 0x3A:
|
||||
printf("qds: WRIOP: Supported SerDes1 Protocol 0x%02x\n",
|
||||
serdes1_prtcl);
|
||||
lane_to_slot_fsm1[0] = EMI1_SLOT1 - 1;
|
||||
lane_to_slot_fsm1[1] = EMI_NONE;
|
||||
lane_to_slot_fsm1[2] = EMI1_SLOT1 - 1;
|
||||
lane_to_slot_fsm1[3] = EMI1_SLOT1 - 1;
|
||||
break;
|
||||
|
||||
default:
|
||||
printf("%s qds: WRIOP: Unsupported SerDes1 Protocol 0x%02x\n",
|
||||
__func__, serdes1_prtcl);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void ls1088a_handle_phy_interface_sgmii(int dpmac_id)
|
||||
{
|
||||
struct mii_dev *bus;
|
||||
struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
|
||||
u32 serdes1_prtcl, cfg;
|
||||
|
||||
cfg = in_le32(&gur->rcwsr[FSL_CHASSIS3_SRDS1_REGSR - 1]) &
|
||||
FSL_CHASSIS3_SRDS1_PRTCL_MASK;
|
||||
cfg >>= FSL_CHASSIS3_SRDS1_PRTCL_SHIFT;
|
||||
serdes1_prtcl = serdes_get_number(FSL_SRDS_1, cfg);
|
||||
|
||||
int *riser_phy_addr;
|
||||
char *env_hwconfig = env_get("hwconfig");
|
||||
|
||||
if (hwconfig_f("xqsgmii", env_hwconfig))
|
||||
riser_phy_addr = &xqsgii_riser_phy_addr[0];
|
||||
else
|
||||
riser_phy_addr = &sgmii_riser_phy_addr[0];
|
||||
|
||||
switch (serdes1_prtcl) {
|
||||
case 0x12:
|
||||
case 0x15:
|
||||
case 0x1E:
|
||||
case 0x3A:
|
||||
switch (dpmac_id) {
|
||||
case 1:
|
||||
wriop_set_phy_address(dpmac_id, 0, riser_phy_addr[1]);
|
||||
break;
|
||||
case 2:
|
||||
wriop_set_phy_address(dpmac_id, 0, riser_phy_addr[0]);
|
||||
break;
|
||||
case 3:
|
||||
wriop_set_phy_address(dpmac_id, 0, riser_phy_addr[3]);
|
||||
break;
|
||||
case 7:
|
||||
wriop_set_phy_address(dpmac_id, 0, riser_phy_addr[2]);
|
||||
break;
|
||||
default:
|
||||
printf("WRIOP: Wrong DPMAC%d set to SGMII", dpmac_id);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
printf("%s qds: WRIOP: Unsupported SerDes1 Protocol 0x%02x\n",
|
||||
__func__, serdes1_prtcl);
|
||||
return;
|
||||
}
|
||||
dpmac_info[dpmac_id].board_mux = EMI1_SLOT1;
|
||||
bus = mii_dev_for_muxval(EMI1_SLOT1);
|
||||
wriop_set_mdio(dpmac_id, bus);
|
||||
}
|
||||
|
||||
void ls1088a_handle_phy_interface_qsgmii(int dpmac_id)
|
||||
{
|
||||
struct mii_dev *bus;
|
||||
struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
|
||||
u32 serdes1_prtcl, cfg;
|
||||
|
||||
cfg = in_le32(&gur->rcwsr[FSL_CHASSIS3_SRDS1_REGSR - 1]) &
|
||||
FSL_CHASSIS3_SRDS1_PRTCL_MASK;
|
||||
cfg >>= FSL_CHASSIS3_SRDS1_PRTCL_SHIFT;
|
||||
serdes1_prtcl = serdes_get_number(FSL_SRDS_1, cfg);
|
||||
|
||||
switch (serdes1_prtcl) {
|
||||
case 0x1D:
|
||||
case 0x1E:
|
||||
switch (dpmac_id) {
|
||||
case 3:
|
||||
case 4:
|
||||
case 5:
|
||||
case 6:
|
||||
wriop_set_phy_address(dpmac_id, 0, dpmac_id + 9);
|
||||
break;
|
||||
case 7:
|
||||
case 8:
|
||||
case 9:
|
||||
case 10:
|
||||
wriop_set_phy_address(dpmac_id, 0, dpmac_id + 1);
|
||||
break;
|
||||
}
|
||||
|
||||
dpmac_info[dpmac_id].board_mux = EMI1_SLOT1;
|
||||
bus = mii_dev_for_muxval(EMI1_SLOT1);
|
||||
wriop_set_mdio(dpmac_id, bus);
|
||||
break;
|
||||
default:
|
||||
printf("qds: WRIOP: Unsupported SerDes Protocol 0x%02x\n",
|
||||
serdes1_prtcl);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void ls1088a_handle_phy_interface_xsgmii(int i)
|
||||
{
|
||||
struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
|
||||
u32 serdes1_prtcl, cfg;
|
||||
|
||||
cfg = in_le32(&gur->rcwsr[FSL_CHASSIS3_SRDS1_REGSR - 1]) &
|
||||
FSL_CHASSIS3_SRDS1_PRTCL_MASK;
|
||||
cfg >>= FSL_CHASSIS3_SRDS1_PRTCL_SHIFT;
|
||||
serdes1_prtcl = serdes_get_number(FSL_SRDS_1, cfg);
|
||||
|
||||
switch (serdes1_prtcl) {
|
||||
case 0x15:
|
||||
case 0x1D:
|
||||
case 0x1E:
|
||||
wriop_set_phy_address(i, 0, i + 26);
|
||||
ls1088a_qds_enable_SFP_TX(SFP_TX);
|
||||
break;
|
||||
default:
|
||||
printf("qds: WRIOP: Unsupported SerDes Protocol 0x%02x\n",
|
||||
serdes1_prtcl);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void ls1088a_handle_phy_interface_rgmii(int dpmac_id)
|
||||
{
|
||||
struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR;
|
||||
u32 serdes1_prtcl, cfg;
|
||||
struct mii_dev *bus;
|
||||
|
||||
cfg = in_le32(&gur->rcwsr[FSL_CHASSIS3_SRDS1_REGSR - 1]) &
|
||||
FSL_CHASSIS3_SRDS1_PRTCL_MASK;
|
||||
cfg >>= FSL_CHASSIS3_SRDS1_PRTCL_SHIFT;
|
||||
serdes1_prtcl = serdes_get_number(FSL_SRDS_1, cfg);
|
||||
|
||||
switch (dpmac_id) {
|
||||
case 4:
|
||||
wriop_set_phy_address(dpmac_id, 0, RGMII_PHY1_ADDR);
|
||||
dpmac_info[dpmac_id].board_mux = EMI1_RGMII1;
|
||||
bus = mii_dev_for_muxval(EMI1_RGMII1);
|
||||
wriop_set_mdio(dpmac_id, bus);
|
||||
break;
|
||||
case 5:
|
||||
wriop_set_phy_address(dpmac_id, 0, RGMII_PHY2_ADDR);
|
||||
dpmac_info[dpmac_id].board_mux = EMI1_RGMII2;
|
||||
bus = mii_dev_for_muxval(EMI1_RGMII2);
|
||||
wriop_set_mdio(dpmac_id, bus);
|
||||
break;
|
||||
default:
|
||||
printf("qds: WRIOP: Unsupported RGMII SerDes Protocol 0x%02x\n",
|
||||
serdes1_prtcl);
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
int board_eth_init(bd_t *bis)
|
||||
{
|
||||
int error = 0, i;
|
||||
#ifdef CONFIG_FSL_MC_ENET
|
||||
struct memac_mdio_info *memac_mdio0_info;
|
||||
char *env_hwconfig = env_get("hwconfig");
|
||||
|
||||
initialize_dpmac_to_slot();
|
||||
|
||||
memac_mdio0_info = (struct memac_mdio_info *)malloc(
|
||||
sizeof(struct memac_mdio_info));
|
||||
memac_mdio0_info->regs =
|
||||
(struct memac_mdio_controller *)
|
||||
CONFIG_SYS_FSL_WRIOP1_MDIO1;
|
||||
memac_mdio0_info->name = DEFAULT_WRIOP_MDIO1_NAME;
|
||||
|
||||
/* Register the real MDIO1 bus */
|
||||
fm_memac_mdio_init(bis, memac_mdio0_info);
|
||||
/* Register the muxing front-ends to the MDIO buses */
|
||||
ls1088a_qds_mdio_init(DEFAULT_WRIOP_MDIO1_NAME, EMI1_RGMII1);
|
||||
ls1088a_qds_mdio_init(DEFAULT_WRIOP_MDIO1_NAME, EMI1_RGMII2);
|
||||
ls1088a_qds_mdio_init(DEFAULT_WRIOP_MDIO1_NAME, EMI1_SLOT1);
|
||||
|
||||
for (i = WRIOP1_DPMAC1; i < NUM_WRIOP_PORTS; i++) {
|
||||
switch (wriop_get_enet_if(i)) {
|
||||
case PHY_INTERFACE_MODE_RGMII:
|
||||
case PHY_INTERFACE_MODE_RGMII_ID:
|
||||
ls1088a_handle_phy_interface_rgmii(i);
|
||||
break;
|
||||
case PHY_INTERFACE_MODE_QSGMII:
|
||||
ls1088a_handle_phy_interface_qsgmii(i);
|
||||
break;
|
||||
case PHY_INTERFACE_MODE_SGMII:
|
||||
ls1088a_handle_phy_interface_sgmii(i);
|
||||
break;
|
||||
case PHY_INTERFACE_MODE_XGMII:
|
||||
ls1088a_handle_phy_interface_xsgmii(i);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
if (i == 16)
|
||||
i = NUM_WRIOP_PORTS;
|
||||
}
|
||||
}
|
||||
|
||||
error = cpu_eth_init(bis);
|
||||
|
||||
if (hwconfig_f("xqsgmii", env_hwconfig)) {
|
||||
for (i = WRIOP1_DPMAC1; i < NUM_WRIOP_PORTS; i++) {
|
||||
switch (wriop_get_enet_if(i)) {
|
||||
case PHY_INTERFACE_MODE_QSGMII:
|
||||
qsgmii_configure_repeater(i);
|
||||
break;
|
||||
case PHY_INTERFACE_MODE_SGMII:
|
||||
sgmii_configure_repeater(i);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (i == 16)
|
||||
i = NUM_WRIOP_PORTS;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
error = pci_eth_init(bis);
|
||||
return error;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_RESET_PHY_R)
|
||||
void reset_phy(void)
|
||||
{
|
||||
mc_env_boot();
|
||||
}
|
||||
#endif /* CONFIG_RESET_PHY_R */
|
||||
@@ -0,0 +1,103 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* Copyright 2017 NXP
|
||||
*/
|
||||
|
||||
#include <common.h>
|
||||
#include <command.h>
|
||||
#include <netdev.h>
|
||||
#include <malloc.h>
|
||||
#include <fsl_mdio.h>
|
||||
#include <miiphy.h>
|
||||
#include <phy.h>
|
||||
#include <fm_eth.h>
|
||||
#include <asm/io.h>
|
||||
#include <exports.h>
|
||||
#include <asm/arch/fsl_serdes.h>
|
||||
#include <fsl-mc/fsl_mc.h>
|
||||
#include <fsl-mc/ldpaa_wriop.h>
|
||||
|
||||
int board_eth_init(bd_t *bis)
|
||||
{
|
||||
#if defined(CONFIG_FSL_MC_ENET)
|
||||
int i, interface;
|
||||
struct memac_mdio_info mdio_info;
|
||||
struct mii_dev *dev;
|
||||
struct ccsr_gur *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR);
|
||||
struct memac_mdio_controller *reg;
|
||||
u32 srds_s1, cfg;
|
||||
|
||||
cfg = in_le32(&gur->rcwsr[FSL_CHASSIS3_SRDS1_REGSR - 1]) &
|
||||
FSL_CHASSIS3_SRDS1_PRTCL_MASK;
|
||||
cfg >>= FSL_CHASSIS3_SRDS1_PRTCL_SHIFT;
|
||||
|
||||
srds_s1 = serdes_get_number(FSL_SRDS_1, cfg);
|
||||
|
||||
reg = (struct memac_mdio_controller *)CONFIG_SYS_FSL_WRIOP1_MDIO1;
|
||||
mdio_info.regs = reg;
|
||||
mdio_info.name = DEFAULT_WRIOP_MDIO1_NAME;
|
||||
|
||||
/* Register the EMI 1 */
|
||||
fm_memac_mdio_init(bis, &mdio_info);
|
||||
|
||||
reg = (struct memac_mdio_controller *)CONFIG_SYS_FSL_WRIOP1_MDIO2;
|
||||
mdio_info.regs = reg;
|
||||
mdio_info.name = DEFAULT_WRIOP_MDIO2_NAME;
|
||||
|
||||
/* Register the EMI 2 */
|
||||
fm_memac_mdio_init(bis, &mdio_info);
|
||||
|
||||
switch (srds_s1) {
|
||||
case 0x1D:
|
||||
/*
|
||||
* XFI does not need a PHY to work, but to avoid U-boot use
|
||||
* default PHY address which is zero to a MAC when it found
|
||||
* a MAC has no PHY address, we give a PHY address to XFI
|
||||
* MAC error.
|
||||
*/
|
||||
wriop_set_phy_address(WRIOP1_DPMAC1, 0, 0x0a);
|
||||
wriop_set_phy_address(WRIOP1_DPMAC2, 0, AQ_PHY_ADDR1);
|
||||
wriop_set_phy_address(WRIOP1_DPMAC3, 0, QSGMII1_PORT1_PHY_ADDR);
|
||||
wriop_set_phy_address(WRIOP1_DPMAC4, 0, QSGMII1_PORT2_PHY_ADDR);
|
||||
wriop_set_phy_address(WRIOP1_DPMAC5, 0, QSGMII1_PORT3_PHY_ADDR);
|
||||
wriop_set_phy_address(WRIOP1_DPMAC6, 0, QSGMII1_PORT4_PHY_ADDR);
|
||||
wriop_set_phy_address(WRIOP1_DPMAC7, 0, QSGMII2_PORT1_PHY_ADDR);
|
||||
wriop_set_phy_address(WRIOP1_DPMAC8, 0, QSGMII2_PORT2_PHY_ADDR);
|
||||
wriop_set_phy_address(WRIOP1_DPMAC9, 0, QSGMII2_PORT3_PHY_ADDR);
|
||||
wriop_set_phy_address(WRIOP1_DPMAC10, 0,
|
||||
QSGMII2_PORT4_PHY_ADDR);
|
||||
|
||||
break;
|
||||
default:
|
||||
printf("SerDes1 protocol 0x%x is not supported on LS1088ARDB\n",
|
||||
srds_s1);
|
||||
break;
|
||||
}
|
||||
|
||||
for (i = WRIOP1_DPMAC3; i <= WRIOP1_DPMAC10; i++) {
|
||||
interface = wriop_get_enet_if(i);
|
||||
switch (interface) {
|
||||
case PHY_INTERFACE_MODE_QSGMII:
|
||||
dev = miiphy_get_dev_by_name(DEFAULT_WRIOP_MDIO1_NAME);
|
||||
wriop_set_mdio(i, dev);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
dev = miiphy_get_dev_by_name(DEFAULT_WRIOP_MDIO2_NAME);
|
||||
wriop_set_mdio(WRIOP1_DPMAC2, dev);
|
||||
|
||||
cpu_eth_init(bis);
|
||||
#endif /* CONFIG_FMAN_ENET */
|
||||
|
||||
return pci_eth_init(bis);
|
||||
}
|
||||
|
||||
#if defined(CONFIG_RESET_PHY_R)
|
||||
void reset_phy(void)
|
||||
{
|
||||
mc_env_boot();
|
||||
}
|
||||
#endif /* CONFIG_RESET_PHY_R */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,55 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||
/*
|
||||
* Copyright 2017 NXP
|
||||
*/
|
||||
|
||||
#ifndef __LS1088AQDS_QIXIS_H__
|
||||
#define __LS1088AQDS_QIXIS_H__
|
||||
|
||||
/* Definitions of QIXIS Registers for LS1088AQDS */
|
||||
|
||||
/* SYSCLK */
|
||||
#define QIXIS_SYSCLK_66 0x0
|
||||
#define QIXIS_SYSCLK_83 0x1
|
||||
#define QIXIS_SYSCLK_100 0x2
|
||||
#define QIXIS_SYSCLK_125 0x3
|
||||
#define QIXIS_SYSCLK_133 0x4
|
||||
#define QIXIS_SYSCLK_150 0x5
|
||||
#define QIXIS_SYSCLK_160 0x6
|
||||
#define QIXIS_SYSCLK_166 0x7
|
||||
|
||||
/* DDRCLK */
|
||||
#define QIXIS_DDRCLK_66 0x0
|
||||
#define QIXIS_DDRCLK_100 0x1
|
||||
#define QIXIS_DDRCLK_125 0x2
|
||||
#define QIXIS_DDRCLK_133 0x3
|
||||
|
||||
/* BRDCFG2 - SD clock*/
|
||||
#define QIXIS_SDCLK1_100 0x0
|
||||
#define QIXIS_SDCLK1_125 0x1
|
||||
#define QIXIS_SDCLK1_165 0x2
|
||||
#define QIXIS_SDCLK1_100_SP 0x3
|
||||
|
||||
#define BRDCFG4_EMISEL_MASK 0xE0
|
||||
#define BRDCFG4_EMISEL_SHIFT 5
|
||||
#define BRDCFG9_SFPTX_MASK 0x10
|
||||
#define BRDCFG9_SFPTX_SHIFT 4
|
||||
|
||||
/* Definitions of QIXIS Registers for LS1088ARDB */
|
||||
|
||||
/* BRDCFG5 */
|
||||
#define BRDCFG5_SPISDHC_MASK 0x0C
|
||||
#define BRDCFG5_FORCE_SD 0x08
|
||||
|
||||
/* Definitions of QIXIS Registers for LS1088AQDS */
|
||||
|
||||
/* BRDCFG4 */
|
||||
#define BRDCFG4_USBOSC_MASK 0x01
|
||||
#define BRDCFG4_SPI 0x01
|
||||
|
||||
/* BRDCFG5 */
|
||||
#define BRDCFG5_SPR_MASK 0x0f
|
||||
#define BRDCFG5_SPI_ON_BOARD 0x0a
|
||||
#define BRDCFG5_SPI_OFF_BOARD 0x0f
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user