commit
9c7a0a600b
@ -0,0 +1,99 @@ |
||||
/*
|
||||
* Copyright 2016 Freescale Semiconductor, Inc. |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
|
||||
#include <common.h> |
||||
#include <asm/arch/fsl_serdes.h> |
||||
#include <asm/arch/immap_lsch2.h> |
||||
|
||||
struct serdes_config { |
||||
u32 protocol; |
||||
u8 lanes[SRDS_MAX_LANES]; |
||||
}; |
||||
|
||||
static struct serdes_config serdes1_cfg_tbl[] = { |
||||
/* SerDes 1 */ |
||||
{0x3333, {SGMII_FM1_DTSEC9, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC5, |
||||
SGMII_FM1_DTSEC6} }, |
||||
{0x1133, {XFI_FM1_MAC9, XFI_FM1_MAC10, SGMII_FM1_DTSEC5, |
||||
SGMII_FM1_DTSEC6} }, |
||||
{0x1333, {XFI_FM1_MAC9, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC5, |
||||
SGMII_FM1_DTSEC6} }, |
||||
{0x2333, {SGMII_2500_FM1_DTSEC9, SGMII_FM1_DTSEC10, SGMII_FM1_DTSEC5, |
||||
SGMII_FM1_DTSEC6} }, |
||||
{0x2233, {SGMII_2500_FM1_DTSEC9, SGMII_2500_FM1_DTSEC10, |
||||
SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6} }, |
||||
{0x1040, {XFI_FM1_MAC9, NONE, QSGMII_FM1_A, NONE} }, |
||||
{0x2040, {SGMII_2500_FM1_DTSEC9, NONE, QSGMII_FM1_A, NONE} }, |
||||
{0x1163, {XFI_FM1_MAC9, XFI_FM1_MAC10, PCIE1, SGMII_FM1_DTSEC6} }, |
||||
{0x2263, {SGMII_2500_FM1_DTSEC9, SGMII_2500_FM1_DTSEC10, PCIE1, |
||||
SGMII_FM1_DTSEC6} }, |
||||
{0x3363, {SGMII_FM1_DTSEC5, SGMII_FM1_DTSEC6, PCIE1, |
||||
SGMII_FM1_DTSEC6} }, |
||||
{0x2223, {SGMII_2500_FM1_DTSEC9, SGMII_2500_FM1_DTSEC10, |
||||
SGMII_2500_FM1_DTSEC5, SGMII_FM1_DTSEC6} }, |
||||
{} |
||||
}; |
||||
|
||||
static struct serdes_config serdes2_cfg_tbl[] = { |
||||
/* SerDes 2 */ |
||||
{0x8888, {PCIE1, PCIE1, PCIE1, PCIE1} }, |
||||
{0x5559, {PCIE1, PCIE2, PCIE3, SATA1} }, |
||||
{0x5577, {PCIE1, PCIE2, PCIE3, PCIE3} }, |
||||
{0x5506, {PCIE1, PCIE2, NONE, PCIE3} }, |
||||
{0x0506, {NONE, PCIE2, NONE, PCIE3} }, |
||||
{0x0559, {NONE, PCIE2, PCIE3, SATA1} }, |
||||
{0x5A59, {PCIE1, SGMII_FM1_DTSEC2, PCIE3, SATA1} }, |
||||
{0x5A06, {PCIE1, SGMII_FM1_DTSEC2, NONE, PCIE3} }, |
||||
{} |
||||
}; |
||||
|
||||
static struct serdes_config *serdes_cfg_tbl[] = { |
||||
serdes1_cfg_tbl, |
||||
serdes2_cfg_tbl, |
||||
}; |
||||
|
||||
enum srds_prtcl serdes_get_prtcl(int serdes, int cfg, int lane) |
||||
{ |
||||
struct serdes_config *ptr; |
||||
|
||||
if (serdes >= ARRAY_SIZE(serdes_cfg_tbl)) |
||||
return 0; |
||||
|
||||
ptr = serdes_cfg_tbl[serdes]; |
||||
while (ptr->protocol) { |
||||
if (ptr->protocol == cfg) |
||||
return ptr->lanes[lane]; |
||||
ptr++; |
||||
} |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
int is_serdes_prtcl_valid(int serdes, u32 prtcl) |
||||
{ |
||||
int i; |
||||
struct serdes_config *ptr; |
||||
|
||||
if (serdes >= ARRAY_SIZE(serdes_cfg_tbl)) |
||||
return 0; |
||||
|
||||
ptr = serdes_cfg_tbl[serdes]; |
||||
while (ptr->protocol) { |
||||
if (ptr->protocol == prtcl) |
||||
break; |
||||
ptr++; |
||||
} |
||||
|
||||
if (!ptr->protocol) |
||||
return 0; |
||||
|
||||
for (i = 0; i < SRDS_MAX_LANES; i++) { |
||||
if (ptr->lanes[i] != NONE) |
||||
return 1; |
||||
} |
||||
|
||||
return 0; |
||||
} |
@ -0,0 +1,33 @@ |
||||
/* |
||||
* Copyright 2016 NXP Semiconductor. |
||||
* Author: Wang Dongsheng <dongsheng.wang@freescale.com>
|
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
|
||||
#include <config.h> |
||||
#include <linux/linkage.h> |
||||
|
||||
#include <asm/armv7.h> |
||||
#include <asm/psci.h> |
||||
|
||||
.pushsection ._secure.text, "ax" |
||||
|
||||
.arch_extension sec
|
||||
|
||||
.align 5
|
||||
|
||||
.globl psci_system_off
|
||||
psci_system_off: |
||||
@ Get QIXIS base address
|
||||
movw r1, #(QIXIS_BASE & 0xffff) |
||||
movt r1, #(QIXIS_BASE >> 16) |
||||
|
||||
ldrb r2, [r1, #QIXIS_PWR_CTL] |
||||
orr r2, r2, #QIXIS_PWR_CTL_POWEROFF |
||||
strb r2, [r1, #QIXIS_PWR_CTL] |
||||
|
||||
1: wfi |
||||
b 1b |
||||
|
||||
.popsection |
@ -0,0 +1,25 @@ |
||||
/* |
||||
* Copyright 2016 NXP Semiconductor. |
||||
* Author: Wang Dongsheng <dongsheng.wang@freescale.com>
|
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
|
||||
#include <config.h> |
||||
#include <linux/linkage.h> |
||||
|
||||
#include <asm/armv7.h> |
||||
#include <asm/psci.h> |
||||
|
||||
.pushsection ._secure.text, "ax" |
||||
|
||||
.arch_extension sec
|
||||
|
||||
.align 5
|
||||
|
||||
.globl psci_system_off
|
||||
psci_system_off: |
||||
1: wfi |
||||
b 1b |
||||
|
||||
.popsection |
@ -0,0 +1,31 @@ |
||||
CONFIG_ARM=y |
||||
CONFIG_TARGET_LS1021ATWR=y |
||||
CONFIG_SPL=y |
||||
CONFIG_OF_BOARD_SETUP=y |
||||
CONFIG_OF_STDOUT_VIA_ALIAS=y |
||||
CONFIG_SYS_EXTRA_OPTIONS="RAMBOOT_PBL,SPL_FSL_PBL,SD_BOOT,SECURE_BOOT" |
||||
CONFIG_BOOTDELAY=0 |
||||
CONFIG_HUSH_PARSER=y |
||||
CONFIG_CMD_BOOTZ=y |
||||
CONFIG_CMD_GREPENV=y |
||||
CONFIG_CMD_MEMTEST=y |
||||
CONFIG_CMD_MEMINFO=y |
||||
CONFIG_CMD_MMC=y |
||||
CONFIG_CMD_I2C=y |
||||
CONFIG_CMD_USB=y |
||||
CONFIG_CMD_DHCP=y |
||||
CONFIG_CMD_MII=y |
||||
CONFIG_CMD_PING=y |
||||
CONFIG_CMD_EXT2=y |
||||
CONFIG_CMD_FAT=y |
||||
CONFIG_NETDEVICES=y |
||||
CONFIG_E1000=y |
||||
CONFIG_SYS_NS16550=y |
||||
CONFIG_USB=y |
||||
CONFIG_USB_XHCI_HCD=y |
||||
CONFIG_USB_XHCI_DWC3=y |
||||
CONFIG_OF_LIBFDT=y |
||||
CONFIG_FIT=y |
||||
CONFIG_FIT_VERBOSE=y |
||||
CONFIG_RSA=y |
||||
CONFIG_DM=y |
@ -0,0 +1,123 @@ |
||||
/*
|
||||
* Copyright 2016 Freescale Semiconductor, Inc. |
||||
* |
||||
* SPDX-License-Identifier: GPL-2.0+ |
||||
*/ |
||||
#include <common.h> |
||||
#include <phy.h> |
||||
#include <fm_eth.h> |
||||
#include <asm/io.h> |
||||
#include <asm/arch/fsl_serdes.h> |
||||
|
||||
#define FSL_CHASSIS2_RCWSR13_EC1 0xe0000000 /* bits 416..418 */ |
||||
#define FSL_CHASSIS2_RCWSR13_EC1_DTSEC3_RGMII 0x00000000 |
||||
#define FSL_CHASSIS2_RCWSR13_EC1_GPIO 0x20000000 |
||||
#define FSL_CHASSIS2_RCWSR13_EC1_FTM 0xa0000000 |
||||
#define FSL_CHASSIS2_RCWSR13_EC2 0x1c000000 /* bits 419..421 */ |
||||
#define FSL_CHASSIS2_RCWSR13_EC2_DTSEC4_RGMII 0x00000000 |
||||
#define FSL_CHASSIS2_RCWSR13_EC2_GPIO 0x04000000 |
||||
#define FSL_CHASSIS2_RCWSR13_EC2_1588 0x08000000 |
||||
#define FSL_CHASSIS2_RCWSR13_EC2_FTM 0x14000000 |
||||
|
||||
u32 port_to_devdisr[] = { |
||||
[FM1_DTSEC1] = FSL_CHASSIS2_DEVDISR2_DTSEC1_1, |
||||
[FM1_DTSEC2] = FSL_CHASSIS2_DEVDISR2_DTSEC1_2, |
||||
[FM1_DTSEC3] = FSL_CHASSIS2_DEVDISR2_DTSEC1_3, |
||||
[FM1_DTSEC4] = FSL_CHASSIS2_DEVDISR2_DTSEC1_4, |
||||
[FM1_DTSEC5] = FSL_CHASSIS2_DEVDISR2_DTSEC1_5, |
||||
[FM1_DTSEC6] = FSL_CHASSIS2_DEVDISR2_DTSEC1_6, |
||||
[FM1_DTSEC9] = FSL_CHASSIS2_DEVDISR2_DTSEC1_9, |
||||
[FM1_DTSEC10] = FSL_CHASSIS2_DEVDISR2_DTSEC1_10, |
||||
[FM1_10GEC1] = FSL_CHASSIS2_DEVDISR2_10GEC1_1, |
||||
[FM1_10GEC2] = FSL_CHASSIS2_DEVDISR2_10GEC1_2, |
||||
[FM1_10GEC3] = FSL_CHASSIS2_DEVDISR2_10GEC1_3, |
||||
[FM1_10GEC4] = FSL_CHASSIS2_DEVDISR2_10GEC1_4, |
||||
}; |
||||
|
||||
static int is_device_disabled(enum fm_port port) |
||||
{ |
||||
struct ccsr_gur *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR); |
||||
u32 devdisr2 = in_be32(&gur->devdisr2); |
||||
|
||||
return port_to_devdisr[port] & devdisr2; |
||||
} |
||||
|
||||
void fman_disable_port(enum fm_port port) |
||||
{ |
||||
struct ccsr_gur *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR); |
||||
|
||||
setbits_be32(&gur->devdisr2, port_to_devdisr[port]); |
||||
} |
||||
|
||||
phy_interface_t fman_port_enet_if(enum fm_port port) |
||||
{ |
||||
struct ccsr_gur *gur = (void *)(CONFIG_SYS_FSL_GUTS_ADDR); |
||||
u32 rcwsr13 = in_be32(&gur->rcwsr[13]); |
||||
|
||||
if (is_device_disabled(port)) |
||||
return PHY_INTERFACE_MODE_NONE; |
||||
|
||||
if ((port == FM1_10GEC1) && (is_serdes_configured(XFI_FM1_MAC9))) |
||||
return PHY_INTERFACE_MODE_XGMII; |
||||
|
||||
if ((port == FM1_DTSEC9) && (is_serdes_configured(XFI_FM1_MAC9))) |
||||
return PHY_INTERFACE_MODE_NONE; |
||||
|
||||
if ((port == FM1_10GEC2) && (is_serdes_configured(XFI_FM1_MAC10))) |
||||
return PHY_INTERFACE_MODE_XGMII; |
||||
|
||||
if ((port == FM1_DTSEC10) && (is_serdes_configured(XFI_FM1_MAC10))) |
||||
return PHY_INTERFACE_MODE_NONE; |
||||
|
||||
if (port == FM1_DTSEC3) |
||||
if ((rcwsr13 & FSL_CHASSIS2_RCWSR13_EC1) == |
||||
FSL_CHASSIS2_RCWSR13_EC1_DTSEC3_RGMII) |
||||
return PHY_INTERFACE_MODE_RGMII; |
||||
|
||||
if (port == FM1_DTSEC4) |
||||
if ((rcwsr13 & FSL_CHASSIS2_RCWSR13_EC2) == |
||||
FSL_CHASSIS2_RCWSR13_EC2_DTSEC4_RGMII) |
||||
return PHY_INTERFACE_MODE_RGMII; |
||||
|
||||
/* handle SGMII, only MAC 2/5/6/9/10 available */ |
||||
switch (port) { |
||||
case FM1_DTSEC2: |
||||
case FM1_DTSEC5: |
||||
case FM1_DTSEC6: |
||||
case FM1_DTSEC9: |
||||
case FM1_DTSEC10: |
||||
if (is_serdes_configured(SGMII_FM1_DTSEC2 + port - FM1_DTSEC2)) |
||||
return PHY_INTERFACE_MODE_SGMII; |
||||
break; |
||||
default: |
||||
break; |
||||
} |
||||
|
||||
/* handle 2.5G SGMII, only MAC 5/9/10 available */ |
||||
switch (port) { |
||||
case FM1_DTSEC5: |
||||
case FM1_DTSEC9: |
||||
case FM1_DTSEC10: |
||||
if (is_serdes_configured(SGMII_2500_FM1_DTSEC5 + |
||||
port - FM1_DTSEC5)) |
||||
return PHY_INTERFACE_MODE_SGMII_2500; |
||||
break; |
||||
default: |
||||
break; |
||||
} |
||||
|
||||
/* handle QSGMII, only MAC 1/5/6/10 available */ |
||||
switch (port) { |
||||
case FM1_DTSEC1: |
||||
case FM1_DTSEC5: |
||||
case FM1_DTSEC6: |
||||
case FM1_DTSEC10: |
||||
if (is_serdes_configured(QSGMII_FM1_A)) |
||||
return PHY_INTERFACE_MODE_QSGMII; |
||||
break; |
||||
default: |
||||
break; |
||||
} |
||||
|
||||
return PHY_INTERFACE_MODE_NONE; |
||||
} |
Loading…
Reference in new issue