From patchwork Mon Oct 9 09:11:39 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Calvin Johnson X-Patchwork-Id: 823210 X-Patchwork-Delegate: joe.hershberger@gmail.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=lists.denx.de (client-ip=81.169.180.215; helo=lists.denx.de; envelope-from=u-boot-bounces@lists.denx.de; receiver=) Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 3y9f124fPcz9tXv for ; Mon, 9 Oct 2017 22:59:18 +1100 (AEDT) Received: by lists.denx.de (Postfix, from userid 105) id 6D7E0C21D8D; Mon, 9 Oct 2017 11:59:17 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on lists.denx.de X-Spam-Level: X-Spam-Status: No, score=-0.0 required=5.0 tests=BAD_ENC_HEADER, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_PASS autolearn=unavailable autolearn_force=no version=3.4.0 Received: from lists.denx.de (localhost [IPv6:::1]) by lists.denx.de (Postfix) with ESMTP id 03CBEC21DA6; Mon, 9 Oct 2017 11:54:30 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 97982C21C58; Mon, 9 Oct 2017 09:09:52 +0000 (UTC) Received: from NAM01-BN3-obe.outbound.protection.outlook.com (mail-bn3nam01on0066.outbound.protection.outlook.com [104.47.33.66]) by lists.denx.de (Postfix) with ESMTPS id 43C05C21C34 for ; Mon, 9 Oct 2017 09:09:51 +0000 (UTC) Received: from MWHPR03CA0059.namprd03.prod.outlook.com (10.174.173.176) by BN3PR03MB2355.namprd03.prod.outlook.com (10.166.74.150) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.77.7; Mon, 9 Oct 2017 09:09:46 +0000 Received: from BY2FFO11FD016.protection.gbl (2a01:111:f400:7c0c::125) by MWHPR03CA0059.outlook.office365.com (2603:10b6:301:3b::48) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.77.7 via Frontend Transport; Mon, 9 Oct 2017 09:09:45 +0000 Authentication-Results: spf=fail (sender IP is 192.88.158.2) smtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed) header.d=none;nxp.com; dmarc=fail action=none header.from=nxp.com; Received-SPF: Fail (protection.outlook.com: domain of nxp.com does not designate 192.88.158.2 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.158.2; helo=az84smr01.freescale.net; Received: from az84smr01.freescale.net (192.88.158.2) by BY2FFO11FD016.mail.protection.outlook.com (10.1.14.148) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.20.77.10 via Frontend Transport; Mon, 9 Oct 2017 09:09:44 +0000 Received: from ab-OptiPlex-7010.ap.freescale.net (ab-OptiPlex-7010.ap.freescale.net [10.232.85.11]) by az84smr01.freescale.net (8.14.3/8.14.0) with ESMTP id v9999OuE030402; Mon, 9 Oct 2017 02:09:42 -0700 From: Calvin Johnson To: Date: Mon, 9 Oct 2017 14:41:39 +0530 Message-ID: <1507540304-19982-5-git-send-email-calvin.johnson@nxp.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1507540304-19982-1-git-send-email-calvin.johnson@nxp.com> References: <1507540304-19982-1-git-send-email-calvin.johnson@nxp.com> X-EOPAttributedMessage: 0 X-Matching-Connectors: 131520137850878149; (91ab9b29-cfa4-454e-5278-08d120cd25b8); () X-Forefront-Antispam-Report: CIP:192.88.158.2; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(336005)(39380400002)(376002)(346002)(39860400002)(2980300002)(1110001)(1109001)(339900001)(199003)(189002)(33646002)(106466001)(316002)(5660300001)(6666003)(54906003)(97736004)(5003940100001)(189998001)(16586007)(85426001)(77096006)(50226002)(53936002)(104016004)(68736007)(356003)(4326008)(105606002)(2950100002)(6916009)(8676002)(50986999)(8936002)(81166006)(2906002)(69596002)(76176999)(305945005)(86362001)(47776003)(8656003)(48376002)(50466002)(81156014)(2351001)(36756003)(498600001); DIR:OUT; SFP:1101; SCL:1; SRVR:BN3PR03MB2355; H:az84smr01.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; A:1; MX:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BY2FFO11FD016; 1:yWwhJW2rY+wl4I2puWaRgHoq7n4U+zEIgd6/qFW/u4PNELhXx+hxrqehDM0NWFjuuU7T0h4zZzAYpkLNvTVQ39ZCbWW+dnRYUOTa5gdeK1BUqCyBEWxELSuW1SaduUKD MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 12e06920-42a3-48d7-78c5-08d50ef57be0 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(2017052603199)(201703131430075)(201703131517081); SRVR:BN3PR03MB2355; X-Microsoft-Exchange-Diagnostics: 1; BN3PR03MB2355; 3:aMtiPkCXj25xJ+QtwFl511Ip2j95YdLWCARo7bx763v+YLoZ24gQ0QEvDGSXEbq9Py9I/JoAfBxLfIafW0zZKGUMJNFNn03SO3oi6JXQa7sJGLNaZPYT64yMpCadpSaiIIv0f/fQr5KJRElsw/cia2iDujq7ji4wtROfBMaoAv4CfsRBvhPIz1oUAxqZxSqtPhQSA3DFwR3aoSHE9d4Cu0UwQLnkJoncd2nxUo5ZDJRjGNzxzOlTaXqHr+D8KBNre14IJ3dwvk5m6oeER8wBrT24ev6LvbO6pzoiOCLWWyB3h3UI4QHW1FsRYYdze4wWvxSlQX2inqQKaZNbB5GJRw==; 25:X8EQIc/lS2fVmDLVjCPpE/o7t7Ci+HH30aYbkTzaVOTQatO3rx1lBplnJwAQ/BuF5UutJrhisB1hujem7AhWWFKz9PC3nIhvs8eXS0iYc62/WM6zQdt2qXODyJ2Ld1pyjFkZ7CtHsQDICmbfUdVhTdFK9urI4p7zsoMuS31derl52dhu8JTC6gFFObrWJ91pOj+HjYx+I2jGoUexvvG5BKKQT9/AslYhzdmNh+Ky2TPvZpJI08eCxXMTxw8K3EVYF6OrSc+umJzLLbrIgq86/hLfdxQodqEERi5AOIuRgwxf94xq1IX5enen+1FmFe9xvN01DvxnJmcbaEb54te45g==; 31:21nvnEM8Kc6Wtfsr33hlO13X19rnpb9K6yQEohAY7S+0/KUyDx5MC9pHvUpEG/ZhURUB4H6C15H1vZox7z59C8qpURaIORyPa1pW6ND6l3WViS2JtkS4pnhsgz+so8WgT92D4leNvH39eYYSuhlO/1+ecPDAhqYu3yT5FPIqzjFRH0f0PxbV0vTDKMV1ImTgkZHsVvVFNfjfJ0vL9ReKjNjnMCRKMbWo6KfAbeNF8QU= X-MS-TrafficTypeDiagnostic: BN3PR03MB2355: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197); X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(100000700101)(100105000095)(100000701101)(100105300095)(100000702101)(100105100095)(6095135)(2401047)(5005006)(8121501046)(100000703101)(100105400095)(10201501046)(3002001)(93006095)(93001095)(6055026)(6096035)(20161123561025)(20161123556025)(20161123565025)(20161123563025)(201703131430075)(201703131433075)(201703131448075)(201703161259150)(201703151042153)(20161123559100)(201708071742011)(100000704101)(100105200095)(100000705101)(100105500095); SRVR:BN3PR03MB2355; BCL:0; PCL:0; RULEID:(100000800101)(100110000095)(100000801101)(100110300095)(100000802101)(100110100095)(100000803101)(100110400095)(400006)(100000804101)(100110200095)(100000805101)(100110500095); SRVR:BN3PR03MB2355; X-Microsoft-Exchange-Diagnostics: 1; BN3PR03MB2355; 4:1XQygWUcLzdQKnMSEnQ1aqAz3eb3D4aXJRtLFHTw5gbEytqtRrblKBI6BbofpyavqGKFL0J7mJ6Sqc+DpNn4dk/YluaP6RUKlFKdIIShKYqjaztJmwci1mK3DNL5EHUXWvqxUz1v5VHUYwLwfZDvGwdvzW4EXVoNSHyjXk5V/nSC2s48sG4zwwC75V01rrDCWJSe9j9rN0KkWk9IaSD2kCiRCtc4oRWCMrFJ+54Rdp0BKfIElPXQaZcHAql9m/wlRynuAdWIih0QOP+N88/bIYGnkmyDgvn0itOKr54tKFs= X-Forefront-PRVS: 045584D28C X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BN3PR03MB2355; 23:Au1raEIy1QZmJYNUoeNAYsOju3g5P2LiDR9rTVR6O?= bz7ZHpg52tQdDiZ6xgRzr9RZI7aFjA6dcJh77Xy2ZKyfvtzUvYC6e+PnvjEx14PEchB2LDbqVHzOiHHza+ofuXT0j05JSeF56u3MDcHcNg1GMl3SSX2OiE9oBo2f95c3mQeb+OnawC8F4oiZMrW2ZNMB6qK0pKvStPoyYkXyd1co2YbdASWaqBWcpQlG2seVHQHimKt7MlQzEusdyW+psMLcapQWEzwSfxbOB8x0qoxUgTxeal5uJ/1oRkOos7B7OGcVoOvre/eukCbMM5JQGKOZAUTe57LgYUDF0SO+TKm2sPIKS5lJD8YqOqX5b5H89gPxNZ24DrfL4Vd3P8fdIlMor8vgglxFUXLOvw5s0Pkfld8RLaYFkftjWuoyEebqk8hOOJXUnOCc6yyzGrEGu9EU3TAub4FX+1SwOrZWc+1sJY6IHquoeKR4TSLLSxdeNbLzXF0O+XUrKXIgd535oCAYOhIJFLwv0+QadgovRcCjOOP0P7N3aSwwUVfTZg77dXp3Qf9y8a77m2zPMhfHn7Ln7FvuK5KVJtHnIvI/WUMqyROnUJjxMkbVMGG0zP1dtMHSAOSQau08hUvAEg/TL6WvcUrkfU+buA2fx2ixnNHoMd15DCOwo05ENWlz1YPWoQPH9EoIQORhwutHg9UqeOh3bcSWvz3fTiDdP/6WOSOjSh6xW5PQkqp9IX6xxb+jYXmW9a57ew1RHHkH5jLJobgstXZXljseFMzhiIALNv5QgQdYiEQ/NsOVP/dCgOYteY+Ozm0SnhNrSTWuDGM7omonHoKaYgSIosXvLvUX5eyhfsy40LilP9wuvb3qE47Sv4KF8Da+oZIxUPpTCcsKD+mPSk7FVopVa3MA/NQlW4NNCGnomT0dEMbbawWGQx31AFTskDVFmvbW80bjONh8OIzumOESKDyGcI7qB4VV0IwPgxp5efsOwV2o3OXESRKXDMu3lAiQbA2d4Q6dnqo4M3fL0i/IvapvSZAdXUjjmUFuSzwP/ivkOvygyvn+C4rX3WnYETcDgwYyw3FnhW4WHVf39jAa9fsw0nyHbrZZeWjOofE+use3mIyY8SLALt020w4yOuAJ7Sgfdj2jbe0ewF5Y6HloBgeyydSsdiT4laH9AyLx9B5VEMPh1XY5DBmpHg= X-Microsoft-Exchange-Diagnostics: 1; BN3PR03MB2355; 6:KIq7hNLaEK5lsswdIURktQaSjV/Mw+Uy8j/kGkcik3RhJootT4UL0AuTQ7hLLbpAt3zRvy/yl6ZnDoGn3iionWW33P1y/Os9+PRezOAZZO2aF+4zNFaAiJcD5Q8s9jRMPZFZsWJAWyNJi9m8GWEAO2BYZUFGb/gPMBjSBGWOOO1Zo2ldnZLMfg3ZL6bcqyY0G1+aZZ6wsscGdwOkzN6QCwv3wZOGdEyNz1ZIkPsNw3oydtDeNY6vYafopgmwlVhUlEAMxaVf0ObwkB/7SwCejICD+tClGZLG9RNV12vftW0JG3443xEzVxaf+plrSfzUVfvGxCd4Cyp3XTrWfRMf+g==; 5:8Kc6SnJ7g9V78162IluibyJP2kmoCYRNpgvDM6yLkL4xmY1SKPTjOdS3ng8KMLVR6k9Xv8ca9yuM/zaACkRXSwCNfc7dxm1D5SE3hDeh/KHTWPCuAOdF0TZHipNmoLGudwmKPZiQC7/rIMx1tsU0Xf3DzeK2nxhuNdMNI5GG1FU=; 24:beQflUo8ca3bS7S2jwXbmJB7rPNiSJoC1FyDyPl4CGBnok2fbi4cHxv/I9C7Fkg3tctgvbbe0PK6+0RnQQ7gfW7ak08tOzWvwQg9orc+hVk=; 7:lS/tjy8QffVFc2FRUZY9jLeQSvOdw6k4QPURlsKODu9G17jbgSah4uPqiFNKLiG5UYd/z9Sby/pEIn42MSKK7x7OEx7G+lyzXXMcoOjFzbInMlZuArqXjDZevp2hhccINIV21qUuWvViSg2YgTgVhWGUehtS6aJyGaSjnxLDu89seELS/iTKkc9ObcpeLM8b6+Um10qYiAzu8v9QXyzoVOCB6uzZfXwWg6UGJH3xhSA= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-MS-Exchange-CrossTenant-OriginalArrivalTime: 09 Oct 2017 09:09:44.9786 (UTC) X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e; Ip=[192.88.158.2]; Helo=[az84smr01.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BN3PR03MB2355 X-Mailman-Approved-At: Mon, 09 Oct 2017 11:54:25 +0000 Cc: joe.hershberger@ni.com, anji.jagarlmudi@nxp.com Subject: [U-Boot] [PATCH 4/9] board: freescale: ls1012a: enable network support on ls1012a platforms X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.18 Precedence: list List-Id: U-Boot discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: u-boot-bounces@lists.denx.de Sender: "U-Boot" Ethernet support on all three LS1012A platforms(FRDM, QDS and RDB) is enabled with this patch. eth.c files for all 3 platforms contain board ethernet initialization function and also function to reset phy. Signed-off-by: Calvin Johnson Signed-off-by: Anjaneyulu Jagarlmudi --- board/freescale/ls1012afrdm/Makefile | 1 + board/freescale/ls1012afrdm/eth.c | 86 +++++++++ board/freescale/ls1012afrdm/ls1012afrdm.c | 5 - board/freescale/ls1012aqds/Makefile | 1 + board/freescale/ls1012aqds/eth.c | 263 ++++++++++++++++++++++++++ board/freescale/ls1012aqds/ls1012aqds.c | 97 +++++++++- board/freescale/ls1012aqds/ls1012aqds_pfe.h | 48 +++++ board/freescale/ls1012aqds/ls1012aqds_qixis.h | 2 +- board/freescale/ls1012ardb/Makefile | 1 + board/freescale/ls1012ardb/eth.c | 70 +++++++ board/freescale/ls1012ardb/ls1012ardb.c | 4 - include/configs/ls1012ardb.h | 5 + 12 files changed, 568 insertions(+), 15 deletions(-) create mode 100644 board/freescale/ls1012afrdm/eth.c create mode 100644 board/freescale/ls1012aqds/eth.c create mode 100644 board/freescale/ls1012aqds/ls1012aqds_pfe.h create mode 100644 board/freescale/ls1012ardb/eth.c diff --git a/board/freescale/ls1012afrdm/Makefile b/board/freescale/ls1012afrdm/Makefile index dbfa2ce..1364f22 100644 --- a/board/freescale/ls1012afrdm/Makefile +++ b/board/freescale/ls1012afrdm/Makefile @@ -5,3 +5,4 @@ # obj-y += ls1012afrdm.o +obj-y += eth.o diff --git a/board/freescale/ls1012afrdm/eth.c b/board/freescale/ls1012afrdm/eth.c new file mode 100644 index 0000000..d9583ce --- /dev/null +++ b/board/freescale/ls1012afrdm/eth.c @@ -0,0 +1,86 @@ +/* + * Copyright 2015-2016 Freescale Semiconductor, Inc. + * Copyright 2017 NXP + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +#define DEFAULT_PFE_MDIO_NAME "PFE_MDIO" +#define DEFAULT_PFE_MDIO1_NAME "PFE_MDIO1" + +#define MASK_ETH_PHY_RST 0x00000100 + +void reset_phy(void) +{ + unsigned int val; + struct ccsr_gpio *pgpio = (void *)(GPIO1_BASE_ADDR); + + setbits_be32(&pgpio->gpdir, MASK_ETH_PHY_RST); + + val = in_be32(&pgpio->gpdat); + setbits_be32(&pgpio->gpdat, val & ~MASK_ETH_PHY_RST); + mdelay(10); + + val = in_be32(&pgpio->gpdat); + setbits_be32(&pgpio->gpdat, val | MASK_ETH_PHY_RST); + mdelay(50); +} + +int board_eth_init(bd_t *bis) +{ +#ifdef CONFIG_FSL_PFE + struct mii_dev *bus; + struct mdio_info mac1_mdio_info; + + reset_phy(); + + init_pfe_scfg_dcfg_regs(); + + mac1_mdio_info.reg_base = (void *)EMAC1_BASE_ADDR; + mac1_mdio_info.name = DEFAULT_PFE_MDIO_NAME; + + bus = ls1012a_mdio_init(&mac1_mdio_info); + if (!bus) { + printf("Failed to register mdio\n"); + return -1; + } + + /* We don't really need this MDIO bus, + * this is called just to initialize EMAC2 MDIO interface */ + mac1_mdio_info.reg_base = (void *)0x04220000; /*EMAC2_BASE_ADDR*/ + mac1_mdio_info.name = DEFAULT_PFE_MDIO1_NAME; + + bus = ls1012a_mdio_init(&mac1_mdio_info); + if (!bus) { + printf("Failed to register mdio\n"); + return -1; + } + + /* MAC1 */ + ls1012a_set_mdio(0, miiphy_get_dev_by_name(DEFAULT_PFE_MDIO_NAME)); + ls1012a_set_phy_address_mode(0, EMAC1_PHY_ADDR, + PHY_INTERFACE_MODE_SGMII); + + /* MAC2 */ + ls1012a_set_mdio(1, miiphy_get_dev_by_name(DEFAULT_PFE_MDIO_NAME)); + ls1012a_set_phy_address_mode(1, EMAC2_PHY_ADDR, + PHY_INTERFACE_MODE_SGMII); + + + return cpu_eth_init(bis); +#endif +} diff --git a/board/freescale/ls1012afrdm/ls1012afrdm.c b/board/freescale/ls1012afrdm/ls1012afrdm.c index 9afd1c4..0145886 100644 --- a/board/freescale/ls1012afrdm/ls1012afrdm.c +++ b/board/freescale/ls1012afrdm/ls1012afrdm.c @@ -57,11 +57,6 @@ int dram_init(void) return 0; } -int board_eth_init(bd_t *bis) -{ - return pci_eth_init(bis); -} - int board_early_init_f(void) { fsl_lsch2_early_init_f(); diff --git a/board/freescale/ls1012aqds/Makefile b/board/freescale/ls1012aqds/Makefile index 0b813f9..b18494a 100644 --- a/board/freescale/ls1012aqds/Makefile +++ b/board/freescale/ls1012aqds/Makefile @@ -5,3 +5,4 @@ # obj-y += ls1012aqds.o +obj-y += eth.o diff --git a/board/freescale/ls1012aqds/eth.c b/board/freescale/ls1012aqds/eth.c new file mode 100644 index 0000000..bf916f3 --- /dev/null +++ b/board/freescale/ls1012aqds/eth.c @@ -0,0 +1,263 @@ +/* + * Copyright 2015-2016 Freescale Semiconductor, Inc. + * Copyright 2017 NXP + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "../common/qixis.h" +#include +#include "ls1012aqds_qixis.h" +#include + +#define EMI_NONE 0xFF +#define EMI1_RGMII 1 +#define EMI1_SLOT1 2 +#define EMI1_SLOT2 3 + +#define DEFAULT_PFE_MDIO_NAME "PFE_MDIO" +#define DEFAULT_PFE_MDIO1_NAME "PFE_MDIO1" + +static const char * const mdio_names[] = { + "NULL", + "LS1012AQDS_MDIO_RGMII", + "LS1012AQDS_MDIO_SLOT1", + "LS1012AQDS_MDIO_SLOT2", + "NULL", +}; + +static const char *ls1012aqds_mdio_name_for_muxval(u8 muxval) +{ + return mdio_names[muxval]; +} + +struct ls1012aqds_mdio { + u8 muxval; + struct mii_dev *realbus; +}; + +static void ls1012aqds_mux_mdio(u8 muxval) +{ + u8 brdcfg4; + + if (muxval < 7) { + brdcfg4 = QIXIS_READ(brdcfg[4]); + brdcfg4 &= ~BRDCFG4_EMISEL_MASK; + brdcfg4 |= (muxval << BRDCFG4_EMISEL_SHIFT); + QIXIS_WRITE(brdcfg[4], brdcfg4); + } +} + +static int ls1012aqds_mdio_read(struct mii_dev *bus, int addr, int devad, + int regnum) +{ + struct ls1012aqds_mdio *priv = bus->priv; + + ls1012aqds_mux_mdio(priv->muxval); + + return priv->realbus->read(priv->realbus, addr, devad, regnum); +} + +static int ls1012aqds_mdio_write(struct mii_dev *bus, int addr, int devad, + int regnum, u16 value) +{ + struct ls1012aqds_mdio *priv = bus->priv; + + ls1012aqds_mux_mdio(priv->muxval); + + return priv->realbus->write(priv->realbus, addr, devad, regnum, value); +} + +static int ls1012aqds_mdio_reset(struct mii_dev *bus) +{ + struct ls1012aqds_mdio *priv = bus->priv; + + if (priv->realbus->reset) + return priv->realbus->reset(priv->realbus); + else + return -1; +} + +static int ls1012aqds_mdio_init(char *realbusname, u8 muxval) +{ + struct ls1012aqds_mdio *pmdio; + struct mii_dev *bus = mdio_alloc(); + + if (!bus) { + printf("Failed to allocate ls1012aqds MDIO bus\n"); + return -1; + } + + pmdio = malloc(sizeof(*pmdio)); + if (!pmdio) { + printf("Failed to allocate ls1012aqds private data\n"); + free(bus); + return -1; + } + + bus->read = ls1012aqds_mdio_read; + bus->write = ls1012aqds_mdio_write; + bus->reset = ls1012aqds_mdio_reset; + sprintf(bus->name, ls1012aqds_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); +} + +int board_eth_init(bd_t *bis) +{ +#ifdef CONFIG_FSL_PFE + struct mii_dev *bus; + static const char *mdio_name; + struct mdio_info mac1_mdio_info; + struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR; + u8 data8; + + int srds_s1 = in_be32(&gur->rcwsr[4]) & + FSL_CHASSIS2_RCWSR4_SRDS1_PRTCL_MASK; + srds_s1 >>= FSL_CHASSIS2_RCWSR4_SRDS1_PRTCL_SHIFT; + + init_pfe_scfg_dcfg_regs(); + + ls1012aqds_mux_mdio(2); + + mac1_mdio_info.reg_base = (void *)EMAC1_BASE_ADDR; + mac1_mdio_info.name = DEFAULT_PFE_MDIO_NAME; + + bus = ls1012a_mdio_init(&mac1_mdio_info); + if (!bus) { + printf("Failed to register mdio\n"); + return -1; + } + + mac1_mdio_info.reg_base = (void *)0x04220000; /*EMAC2_BASE_ADDR*/ + mac1_mdio_info.name = DEFAULT_PFE_MDIO1_NAME; + + bus = ls1012a_mdio_init(&mac1_mdio_info); + if (!bus) { + printf("Failed to register mdio\n"); + return -1; + } + + switch (srds_s1) { + case 0x3508: + printf("ls1012aqds:supported SerDes PRCTL= %d\n", srds_s1); +#ifdef RGMII_RESET_WA + /* Work around for FPGA registers initialization + * This is needed for RGMII to work */ + printf("Reset RGMII WA....\n"); + data8 = QIXIS_READ(rst_frc[0]); + data8 |= 0x2; + QIXIS_WRITE(rst_frc[0], data8); + data8 = QIXIS_READ(rst_frc[0]); + + data8 = QIXIS_READ(res8[6]); + data8 |= 0xff; + QIXIS_WRITE(res8[6], data8); + data8 = QIXIS_READ(res8[6]); +#endif + mdio_name = ls1012aqds_mdio_name_for_muxval(EMI1_RGMII); + if (ls1012aqds_mdio_init(DEFAULT_PFE_MDIO_NAME, EMI1_RGMII) < + 0) { + printf("Failed to register mdio for %s\n", mdio_name); + return -1; + } + + mdio_name = ls1012aqds_mdio_name_for_muxval(EMI1_SLOT1); + if (ls1012aqds_mdio_init(DEFAULT_PFE_MDIO_NAME, EMI1_SLOT1) < + 0) { + printf("Failed to register mdio for %s\n", + mdio_name); + return -1; + } + + /* MAC2*/ + mdio_name = ls1012aqds_mdio_name_for_muxval(EMI1_RGMII); + bus = miiphy_get_dev_by_name(mdio_name); + ls1012a_set_mdio(1, bus); + ls1012a_set_phy_address_mode(1, EMAC2_PHY_ADDR, + PHY_INTERFACE_MODE_RGMII); + + /* MAC1*/ + mdio_name = ls1012aqds_mdio_name_for_muxval(EMI1_SLOT1); + bus = miiphy_get_dev_by_name(mdio_name); + ls1012a_set_mdio(0, bus); + ls1012a_set_phy_address_mode(0, EMAC1_PHY_ADDR, + PHY_INTERFACE_MODE_SGMII); + break; + + case 0x2205: + printf("ls1012aqds:supported SerDes PRCTL= %d\n", srds_s1); + /* Work around for FPGA registers initialization + * This is needed for RGMII to work */ + printf("Reset SLOT1 SLOT2....\n"); + data8 = QIXIS_READ(rst_frc[2]); + data8 |= 0xc0; + QIXIS_WRITE(rst_frc[2], data8); + mdelay(100); + data8 = QIXIS_READ(rst_frc[2]); + data8 &= 0x3f; + QIXIS_WRITE(rst_frc[2], data8); + + mdio_name = ls1012aqds_mdio_name_for_muxval(EMI1_SLOT1); + if (ls1012aqds_mdio_init(DEFAULT_PFE_MDIO_NAME, EMI1_SLOT1) < + 0) { + printf("Failed to register mdio for %s\n", + mdio_name); + return -1; + } + + mdio_name = ls1012aqds_mdio_name_for_muxval(EMI1_SLOT2); + if (ls1012aqds_mdio_init(DEFAULT_PFE_MDIO_NAME, EMI1_SLOT2) < + 0) { + printf("Failed to register mdio for %s\n", mdio_name); + return -1; + } + /* MAC2*/ + mdio_name = ls1012aqds_mdio_name_for_muxval(EMI1_SLOT2); + bus = miiphy_get_dev_by_name(mdio_name); + ls1012a_set_mdio(1, bus); + ls1012a_set_phy_address_mode(1, SGMII_2500_PHY2_ADDR, + PHY_INTERFACE_MODE_SGMII_2500); + + data8 = QIXIS_READ(brdcfg[12]); + data8 |= 0x20; + QIXIS_WRITE(brdcfg[12], data8); + + /* MAC1*/ + mdio_name = ls1012aqds_mdio_name_for_muxval(EMI1_SLOT1); + bus = miiphy_get_dev_by_name(mdio_name); + ls1012a_set_mdio(0, bus); + ls1012a_set_phy_address_mode(0, SGMII_2500_PHY1_ADDR, + PHY_INTERFACE_MODE_SGMII_2500); + break; + + default: + printf("ls1012aqds:unsupported SerDes PRCTL= %d\n", srds_s1); + break; + } + cpu_eth_init(bis); +#endif + return pci_eth_init(bis); +} diff --git a/board/freescale/ls1012aqds/ls1012aqds.c b/board/freescale/ls1012aqds/ls1012aqds.c index 406194d..5669d1f 100644 --- a/board/freescale/ls1012aqds/ls1012aqds.c +++ b/board/freescale/ls1012aqds/ls1012aqds.c @@ -29,6 +29,8 @@ #include "../common/qixis.h" #include "ls1012aqds_qixis.h" +#include "ls1012aqds_pfe.h" + DECLARE_GLOBAL_DATA_PTR; int checkboard(void) @@ -128,11 +130,6 @@ int board_init(void) return 0; } -int board_eth_init(bd_t *bis) -{ - return pci_eth_init(bis); -} - int esdhc_status_fixup(void *blob, const char *compat) { char esdhc0_path[] = "/soc/esdhc@1560000"; @@ -161,12 +158,102 @@ int esdhc_status_fixup(void *blob, const char *compat) return 0; } +static int pfe_set_properties(void *set_blob, struct pfe_prop_val prop_val, + char *enet_path, char *mdio_path) +{ + do_fixup_by_path(set_blob, enet_path, "fsl,gemac-bus-id", + &prop_val.busid, PFE_PROP_LEN, 1); + do_fixup_by_path(set_blob, enet_path, "fsl,gemac-phy-id", + &prop_val.phyid, PFE_PROP_LEN, 1); + do_fixup_by_path(set_blob, enet_path, "fsl,mdio-mux-val", + &prop_val.mux_val, PFE_PROP_LEN, 1); + do_fixup_by_path(set_blob, enet_path, "phy-mode", + prop_val.phy_mode, strlen(prop_val.phy_mode) + 1, 1); + do_fixup_by_path(set_blob, mdio_path, "fsl,mdio-phy-mask", + &prop_val.phy_mask, PFE_PROP_LEN, 1); + return 0; +} + +static void fdt_fsl_fixup_of_pfe(void *blob) +{ + int i = 0; + struct pfe_prop_val prop_val; + void *l_blob = blob; + + struct ccsr_gur __iomem *gur = (void *)CONFIG_SYS_FSL_GUTS_ADDR; + unsigned int srds_s1 = in_be32(&gur->rcwsr[4]) & + FSL_CHASSIS2_RCWSR4_SRDS1_PRTCL_MASK; + srds_s1 >>= FSL_CHASSIS2_RCWSR4_SRDS1_PRTCL_SHIFT; + + for (i = 0; i < NUM_ETH_NODE; i++) { + switch (srds_s1) { + case SERDES_1_G_PROTOCOL: + if (i == 0) { + prop_val.busid = cpu_to_fdt32( + ETH_1_1G_BUS_ID); + prop_val.phyid = cpu_to_fdt32( + ETH_1_1G_PHY_ID); + prop_val.mux_val = cpu_to_fdt32( + ETH_1_1G_MDIO_MUX); + prop_val.phy_mask = cpu_to_fdt32( + ETH_1G_MDIO_PHY_MASK); + prop_val.phy_mode = "sgmii"; + pfe_set_properties(l_blob, prop_val, ETH_1_PATH, + ETH_1_MDIO); + } else { + prop_val.busid = cpu_to_fdt32( + ETH_2_1G_BUS_ID); + prop_val.phyid = cpu_to_fdt32( + ETH_2_1G_PHY_ID); + prop_val.mux_val = cpu_to_fdt32( + ETH_2_1G_MDIO_MUX); + prop_val.phy_mask = cpu_to_fdt32( + ETH_1G_MDIO_PHY_MASK); + prop_val.phy_mode = "rgmii"; + pfe_set_properties(l_blob, prop_val, ETH_2_PATH, + ETH_2_MDIO); + } + break; + case SERDES_2_5_G_PROTOCOL: + if (i == 0) { + prop_val.busid = cpu_to_fdt32( + ETH_1_2_5G_BUS_ID); + prop_val.phyid = cpu_to_fdt32( + ETH_1_2_5G_PHY_ID); + prop_val.mux_val = cpu_to_fdt32( + ETH_1_2_5G_MDIO_MUX); + prop_val.phy_mask = cpu_to_fdt32( + ETH_2_5G_MDIO_PHY_MASK); + prop_val.phy_mode = "sgmii-2500"; + pfe_set_properties(l_blob, prop_val, ETH_1_PATH, + ETH_1_MDIO); + } else { + prop_val.busid = cpu_to_fdt32( + ETH_2_2_5G_BUS_ID); + prop_val.phyid = cpu_to_fdt32( + ETH_2_2_5G_PHY_ID); + prop_val.mux_val = cpu_to_fdt32( + ETH_2_2_5G_MDIO_MUX); + prop_val.phy_mask = cpu_to_fdt32( + ETH_2_5G_MDIO_PHY_MASK); + prop_val.phy_mode = "sgmii-2500"; + pfe_set_properties(l_blob, prop_val, ETH_2_PATH, + ETH_2_MDIO); + } + break; + default: + printf("serdes:[%d]\n", srds_s1); + } + } +} + #ifdef CONFIG_OF_BOARD_SETUP int ft_board_setup(void *blob, bd_t *bd) { arch_fixup_fdt(blob); ft_cpu_setup(blob, bd); + fdt_fsl_fixup_of_pfe(blob); return 0; } diff --git a/board/freescale/ls1012aqds/ls1012aqds_pfe.h b/board/freescale/ls1012aqds/ls1012aqds_pfe.h new file mode 100644 index 0000000..c279ef3 --- /dev/null +++ b/board/freescale/ls1012aqds/ls1012aqds_pfe.h @@ -0,0 +1,48 @@ +/* + * Copyright 2017 NXP + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#define ETH_1_1G_BUS_ID 0x1 +#define ETH_1_1G_PHY_ID 0x1e +#define ETH_1_1G_MDIO_MUX 0x2 +#define ETH_1G_MDIO_PHY_MASK 0xBFFFFFFD +#define ETH_1_1G_PHY_MODE "sgmii" +#define ETH_2_1G_BUS_ID 0x1 +#define ETH_2_1G_PHY_ID 0x1 +#define ETH_2_1G_MDIO_MUX 0x1 +#define ETH_2_1G_PHY_MODE "rgmii" + +#define ETH_1_2_5G_BUS_ID 0x0 +#define ETH_1_2_5G_PHY_ID 0x1 +#define ETH_1_2_5G_MDIO_MUX 0x2 +#define ETH_2_5G_MDIO_PHY_MASK 0xFFFFFFF9 +#define ETH_2_5G_PHY_MODE "sgmii-2500" +#define ETH_2_2_5G_BUS_ID 0x1 +#define ETH_2_2_5G_PHY_ID 0x2 +#define ETH_2_2_5G_MDIO_MUX 0x3 + +#define SERDES_1_G_PROTOCOL 0x3508 +#define SERDES_2_5_G_PROTOCOL 0x2205 + +#define PFE_PROP_LEN 4 + +#define ETH_1_SOC_PATH "/soc/pfe@04000000/ethernet@0" +#define ETH_1_PATH "/pfe@04000000/ethernet@0" +#define ETH_2_SOC_PATH "/soc/pfe@04000000/ethernet@1" +#define ETH_2_PATH "/pfe@04000000/ethernet@1" + +#define ETH_1_MDIO_SOC_PATH "/soc/pfe@04000000/ethernet@0/mdio@0" +#define ETH_1_MDIO "/pfe@04000000/ethernet@0/mdio@0" +#define ETH_2_MDIO_SOC_PATH "/soc/pfe@04000000/ethernet@1/mdio@0" +#define ETH_2_MDIO "/pfe@04000000/ethernet@1/mdio@0" + +#define NUM_ETH_NODE 2 +struct pfe_prop_val { + int busid; + int phyid; + int mux_val; + int phy_mask; + char *phy_mode; +}; diff --git a/board/freescale/ls1012aqds/ls1012aqds_qixis.h b/board/freescale/ls1012aqds/ls1012aqds_qixis.h index 584f604..7a1ba3d 100644 --- a/board/freescale/ls1012aqds/ls1012aqds_qixis.h +++ b/board/freescale/ls1012aqds/ls1012aqds_qixis.h @@ -11,7 +11,7 @@ /* BRDCFG4[4:7] select EC1 and EC2 as a pair */ #define BRDCFG4_EMISEL_MASK 0xe0 -#define BRDCFG4_EMISEL_SHIFT 5 +#define BRDCFG4_EMISEL_SHIFT 6 /* SYSCLK */ #define QIXIS_SYSCLK_66 0x0 diff --git a/board/freescale/ls1012ardb/Makefile b/board/freescale/ls1012ardb/Makefile index 05fa9d9..bd80ce5 100644 --- a/board/freescale/ls1012ardb/Makefile +++ b/board/freescale/ls1012ardb/Makefile @@ -5,3 +5,4 @@ # obj-y += ls1012ardb.o +obj-y += eth.o diff --git a/board/freescale/ls1012ardb/eth.c b/board/freescale/ls1012ardb/eth.c new file mode 100644 index 0000000..286bc8a --- /dev/null +++ b/board/freescale/ls1012ardb/eth.c @@ -0,0 +1,70 @@ +/* + * Copyright 2015-2016 Freescale Semiconductor, Inc. + * Copyright 2017 NXP + * + * SPDX-License-Identifier:GPL-2.0+ + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#define DEFAULT_PFE_MDIO_NAME "PFE_MDIO" + + +void reset_phy(void) +{ + /* Through reset IO expander reset both RGMII and SGMII PHYs */ + i2c_reg_write(I2C_MUX_IO2_ADDR, 6, __PHY_MASK); + i2c_reg_write(I2C_MUX_IO2_ADDR, 2, __PHY_ETH2_MASK); + mdelay(10); + i2c_reg_write(I2C_MUX_IO2_ADDR, 2, __PHY_ETH1_MASK); + mdelay(10); + i2c_reg_write(I2C_MUX_IO2_ADDR, 2, 0xFF); + mdelay(50); +} + +int board_eth_init(bd_t *bis) +{ +#ifdef CONFIG_FSL_PFE + struct mii_dev *bus; + struct mdio_info mac1_mdio_info; + + reset_phy(); + + init_pfe_scfg_dcfg_regs(); + + mac1_mdio_info.reg_base = (void *)EMAC1_BASE_ADDR; + mac1_mdio_info.name = DEFAULT_PFE_MDIO_NAME; + + bus = ls1012a_mdio_init(&mac1_mdio_info); + if (!bus) { + printf("Failed to register mdio\n"); + return -1; + } + + /* MAC1 */ + ls1012a_set_mdio(0, miiphy_get_dev_by_name(DEFAULT_PFE_MDIO_NAME)); + ls1012a_set_phy_address_mode(0, EMAC1_PHY_ADDR, + PHY_INTERFACE_MODE_SGMII); + + /* MAC2 */ + ls1012a_set_mdio(1, miiphy_get_dev_by_name(DEFAULT_PFE_MDIO_NAME)); + ls1012a_set_phy_address_mode(1, EMAC2_PHY_ADDR, + PHY_INTERFACE_MODE_RGMII); + + cpu_eth_init(bis); +#endif + return pci_eth_init(bis); +} diff --git a/board/freescale/ls1012ardb/ls1012ardb.c b/board/freescale/ls1012ardb/ls1012ardb.c index c6c1c71..41283db 100644 --- a/board/freescale/ls1012ardb/ls1012ardb.c +++ b/board/freescale/ls1012ardb/ls1012ardb.c @@ -90,10 +90,6 @@ int dram_init(void) return 0; } -int board_eth_init(bd_t *bis) -{ - return pci_eth_init(bis); -} int board_early_init_f(void) { diff --git a/include/configs/ls1012ardb.h b/include/configs/ls1012ardb.h index 5fe3218..e47bb7c 100644 --- a/include/configs/ls1012ardb.h +++ b/include/configs/ls1012ardb.h @@ -42,6 +42,11 @@ #define __SW_REV_A 0xF8 #define __SW_REV_B 0xF0 +#define I2C_MUX_IO2_ADDR 0x25 +#define __PHY_MASK 0xF9 +#define __PHY_ETH2_MASK 0xFB +#define __PHY_ETH1_MASK 0xFD + /* MMC */ #ifdef CONFIG_MMC #define CONFIG_FSL_ESDHC