From patchwork Wed Nov 4 06:55:58 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Prabhakar Kushwaha X-Patchwork-Id: 539754 X-Patchwork-Delegate: yorksun@freescale.com Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from theia.denx.de (theia.denx.de [85.214.87.163]) by ozlabs.org (Postfix) with ESMTP id 3A91E140D9D for ; Wed, 4 Nov 2015 17:58:33 +1100 (AEDT) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 5950F4BAFC; Wed, 4 Nov 2015 07:57:55 +0100 (CET) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id wSxdcA1Ugo0X; Wed, 4 Nov 2015 07:57:55 +0100 (CET) Received: from theia.denx.de (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id 716934BA7E; Wed, 4 Nov 2015 07:57:43 +0100 (CET) Received: from localhost (localhost [127.0.0.1]) by theia.denx.de (Postfix) with ESMTP id B743C4BAAF for ; Wed, 4 Nov 2015 07:57:33 +0100 (CET) Received: from theia.denx.de ([127.0.0.1]) by localhost (theia.denx.de [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id NSJJZic8R6e5 for ; Wed, 4 Nov 2015 07:57:33 +0100 (CET) X-policyd-weight: NOT_IN_SBL_XBL_SPAMHAUS=-1.5 NOT_IN_SPAMCOP=-1.5 NOT_IN_BL_NJABL=-1.5 (only DNSBL check requested) Received: from na01-bn1-obe.outbound.protection.outlook.com (mail-bn1bbn0107.outbound.protection.outlook.com [157.56.111.107]) by theia.denx.de (Postfix) with ESMTPS id 3D0D34BA5A for ; Wed, 4 Nov 2015 07:57:23 +0100 (CET) Received: from BLUPR0301CA0013.namprd03.prod.outlook.com (10.162.113.151) by BY1PR03MB1466.namprd03.prod.outlook.com (10.162.210.12) with Microsoft SMTP Server (TLS) id 15.1.312.18; Wed, 4 Nov 2015 06:57:19 +0000 Received: from BN1AFFO11FD049.protection.gbl (2a01:111:f400:7c10::110) by BLUPR0301CA0013.outlook.office365.com (2a01:111:e400:5259::23) with Microsoft SMTP Server (TLS) id 15.1.312.18 via Frontend Transport; Wed, 4 Nov 2015 06:57:18 +0000 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=freescale.com; freescale.mail.onmicrosoft.com; dkim=none (message not signed) header.d=none; freescale.mail.onmicrosoft.com; dmarc=none action=none header.from=freescale.com; Received-SPF: Fail (protection.outlook.com: domain of freescale.com does not designate 192.88.168.50 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.168.50; helo=tx30smr01.am.freescale.net; Received: from tx30smr01.am.freescale.net (192.88.168.50) by BN1AFFO11FD049.mail.protection.outlook.com (10.58.53.64) with Microsoft SMTP Server (TLS) id 15.1.318.9 via Frontend Transport; Wed, 4 Nov 2015 06:57:18 +0000 Received: from b32579-VirtualBox.ap.freescale.net (B32579-02.ap.freescale.net [10.232.28.165]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id tA46u4rT010292; Tue, 3 Nov 2015 23:57:15 -0700 From: Prabhakar Kushwaha To: Date: Wed, 4 Nov 2015 12:25:58 +0530 Message-ID: <1446620162-21725-8-git-send-email-prabhakar@freescale.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1446620162-21725-1-git-send-email-prabhakar@freescale.com> References: <1446620162-21725-1-git-send-email-prabhakar@freescale.com> X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1; BN1AFFO11FD049; 1:aFHnkl5wR/vn5eaS6bJ/vNvr5fRF1ZKujm1A32NYCHT2YKHHQlJrZEt0Ola838h1NQxe43YzHd2LbYIhQkPM3k/EfLP+Asd1FEYTK4+9fNNZEg06mTDtWjEDwnMZIOnbQwyuPRh5MI4QWMlsEWlNSZ4XGVslv9LTQaVsO+Sbcd37T7kE0X0R4DSsfSMVRN37uoTNd8I3NZS2bIpZ62vIu0+l0TnypNM2rL4cBAWFiNxj+tslNgxOIkNew6s9nGSOmRR93ptI7dIvQ+H01pNHibbuNGlL8Bx5DKzVDOoH0P9dfFtqhFSsI5bLWTJmB42evW/FxKGXyRsCSYQp0trJJWa+fqCixYTl++dvIe+lX/ryidVx2+OfVVWn8XyN5uaLdgaSBGrbcapq7fADPZhEyQ== X-Forefront-Antispam-Report: CIP:192.88.168.50; CTRY:US; IPV:NLI; EFV:NLI; SFV:NSPM; SFS:(10019020)(6009001)(2980300002)(1109001)(1110001)(339900001)(199003)(189002)(107886002)(50986999)(6806005)(189998001)(105606002)(5001960100002)(110136002)(5007970100001)(106466001)(85426001)(575784001)(11100500001)(2351001)(229853001)(97736004)(104016004)(81156007)(36756003)(5008740100001)(2950100001)(50226001)(86362001)(5003940100001)(450100001)(77096005)(50466002)(48376002)(92566002)(87936001)(19580395003)(76176999)(33646002)(19580405001)(47776003)(4001430100002)(21314002); DIR:OUT; SFP:1102; SCL:1; SRVR:BY1PR03MB1466; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; A:1; MX:1; LANG:en; MIME-Version: 1.0 X-Microsoft-Exchange-Diagnostics: 1; BY1PR03MB1466; 2:vF/HYUSRrMWl6rVLFRqxuLLU4EJNjAgusofqNZoz/QY+jBYBry/zvVpEPpveOaZWdxuBos9uqnt8q6OAF1QcqomExUMelkSAqR+dMuhvt3FvI7de1JCsT3X3gM30/gbhrqOqh+xCV3WJp7cH5ePrSM6xQZtFtG+UKO34vKJ9VO4=; 3:yrYxSCKA9RP5aNK8uutJEW+JYzRfH3mSWmdFI8vqMY5TFubMEEMCREj6XAQoMtg6Hj6xLDEOABWndJegaFcFEBvBpvsVjZvhA2XHD4gLJbCPNqy45N7oK/4AJdXBeK6Xk+3puN8aBgjhGkvtaSLBEu0pzhKU5PRKu1BqcA16LidCGlQIfRaMkrVmC6TgeBTT9kmBSWb3zkrk3ZQl9uUC0yyNqccoCPA5RXR/bBynlyg=; 25:235OagVPZEApYkUzHs27SPJLsmc+DPRtm0w0xqm5H6qHRZLr4HaKKNQ2S2ws6umDKzPGuADdOeUXaIr1PLzdu1UJUH7WCh6vT3rBT4HamPAh0nt5SgWFtKQDfyy4ztVgy02BXiydpRVraaPGjNP2/5MECMsynThTQGJhgtBm+CqyCLgCIurg5mNdEGFNx3RmkOgponf5JQSPnw3W1mseekG/sX22qhSfdQaFbmuGWS4kbyso0IbY9egb9IZ/h1ce X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BY1PR03MB1466; X-Microsoft-Exchange-Diagnostics: 1; BY1PR03MB1466; 20:LMT7VyctdYrNivTayykbPxmQlxVLTZfpVHbcp/KIctV2aEQV92gSf3p2FSleUKs1BqvakvLMLzfPL6XXraAZwmV2+hAmjV2SEYipOjOZb6gp6a5pkS2bQGmitrxBRMeLPeMbloO0uFKMRTcS1DY0kwsdFGrtbNsbFspvWCHwD5kulOLRNahp32XynDAEo0fU0Fb1CaUDtlFBT+oDvptDFrTXZzfGdI0MMsygptX2cNaWBXrTDhKWT7F53JjjEMAT8/DIL1cIIN/NE/pWOABhoB7OosVk8VGzeRaGgxzGNFSh1NSjKpMOzRFRaPjBOV4tdslyr4x4T7eW6nf1cRfLQEKxODi8mDgqdpPSgk097uU=; 4:V56MsFTIDvNxNSpeqlDdPTYiSQ6vcPdfFtzlGOKPFVHGiwgdLCumnn6DArD5/Pa3eTDw2Jd8Tew8TfMOXoRJvzFNczawm028/EARMk5Dl/tmvvzEqoLrxtHot5QC/YvKChTaJm9bQKf+R7vlNN1SYTfgElq4mqeQu5Lshm4+w9FICgMtRl5kJ9toFCSqmbviBeUQyTC9SJS01CcARYW0Ks41eKJsdLZ3v7vX1fkbpWR6W5QvlW+TwDFwBOOk/bKJmWwN3lwgibz/Jt0b4ZleqC4F0idpeHm4U/K6Hdipq2OLlLRzw0yFoqEEQ1w02KMq3JKX2oSMYo0K6w0sj1I7aflTvJFJjk4OJttDoujL0mBk4nSbg8TIZpKTTmmOgn55 X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(101931422205132); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(520078)(8121501046)(5005006)(10201501046)(3002001); SRVR:BY1PR03MB1466; BCL:0; PCL:0; RULEID:; SRVR:BY1PR03MB1466; X-Forefront-PRVS: 0750463DC9 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BY1PR03MB1466; 23:w9bYgaFM8kvdy3QUCa4sYyZ+DOrRwbyA/UtFGM9PI?= =?us-ascii?Q?4/rUH8J1OgWm8vR9Nb30Es4OeDSHCxVIc/9JpNAdVfRuFf0QvT7Mn0X59L+y?= =?us-ascii?Q?yo9qhGIouvbbgXKhaNDDE17Gx8jJXuuAoMMB+fR9yvFepJX1aONB5UAlednX?= =?us-ascii?Q?YebR+zQ3cPhe99WpS6j1SzZH4JT6ux3Y9t4ansKLLrpqxnBI0Tt+hHI+w40I?= =?us-ascii?Q?bG/SV0Hp82fujYmZM5ao1cqiw0e48MRRz6TndOylp5uSe52jGWAlLHAzhrrK?= =?us-ascii?Q?tgKhFIb/h+K8v7+VszOG7KWTk7QDaQINfwqeYui1Zja0AGsrVIlVgNV3J4O9?= =?us-ascii?Q?Aq9Cd3cLBEzD+fGeZiSWh0W/S4VOVQcU5DOrEyImxzgjs7sqYSkPu4iUNyYi?= =?us-ascii?Q?9/7qOBNTGbIBJ7Wjjx9Pm7NGdA1YgXV3bzyIGbUcM9cUhCYdcYSsR+FBgNlW?= =?us-ascii?Q?m8ZnLdSNJ6G9iimaOhdNqRTkEwuYI2nvbeidyhS9Vja7fjEH6r2Z/RkLzUft?= =?us-ascii?Q?K2fMaC61wOLtyIic1hahB6qRAE426uHOq8n3tFSw0/Bm6goP/tJ+1aVraBoK?= =?us-ascii?Q?BH6ZanhTdW1LkVi2+X/W3oQP8grLob7GHt2XLaRGl6Q4HZ2sV7ABjA8ZTBE/?= =?us-ascii?Q?jJhHyMPeMTC3Mb6qSMF7BFfIcFDYO0kkd5X5aB9Q12q3LJhwCLUj4k729HaN?= =?us-ascii?Q?ZTvjKf+SCd106J2RhjHi3Pu4+QnsfmxYfpr5GwaO2dFTH4sofcqo0e7m4t0i?= =?us-ascii?Q?xT05b6YnGrlLd4CMJ3IGozQ5EW/YmBbcAUzKWDu4JKuID7A8lzzK6ytNFgkp?= =?us-ascii?Q?uvwu9f3MqjDOtZjKMeOJI85i6Vu+b4mADwD4i7DILjKg33/EDkDQ2kNmpYws?= =?us-ascii?Q?M13svIk5n1LTUgAgtWGSlVhS22xsthEfw8TgRQLkvUv0xRlVMaQvHZl+PNdL?= =?us-ascii?Q?6G76wI6T0kUIiQYZypC/zu4cZao8MUsfwILsOlmPr1NykAJt0tsiBQDZZbz2?= =?us-ascii?Q?gPhHUhs6eHV2R1CsqwRazY/EHIN9noewjk+8zTgCmsPT7DOkh9Q4U1I9tmYV?= =?us-ascii?Q?EFvFHJE61G7uUG4B0hoz2fHR8mMf0vUglmPhsb/sCpHcXNIHnsgw0uUb/Cur?= =?us-ascii?Q?oWJHgvsqLPLVtS8r3gHJRuT+Gjvsh3KcLxCNboldCeuhHhApL9V3w=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; BY1PR03MB1466; 5:fpku3TPZfA8lLYSJ9iWbxWJIJJsSE1O1h8XmZ0B3DatGAHxiXqv1GdrKMZ370zsX/XPa6wtzOdDcmOfDsnEH+Qnbcu3yQKdWCyGLnEBC00PZd/XscIWIVqYNqDs4rRXgLZ8T+pY+HHaF6/oxMFkaQA==; 24:QmAcevD7LrZa8ZHrvIp+O5+50csWOSv3hCfd9mUqcllguyvXeCMSJPL4fJbFc853E5epRx6/t2VzRlsSj24KBb/TQmhtB+A6mloWlOtay2g=; 20:d1xhSdzdTwMVBYjDCXvsEv6uyUnJcXjdy+qwUzKIYcL9VOmoZ+/Zj/W70S0mRcgJCuXQPbb8cf5bRLGuFIvRuA== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 04 Nov 2015 06:57:18.7767 (UTC) X-MS-Exchange-CrossTenant-Id: 710a03f5-10f6-4d38-9ff4-a80b81da590d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=710a03f5-10f6-4d38-9ff4-a80b81da590d; Ip=[192.88.168.50]; Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY1PR03MB1466 Cc: yorksun@freescale.com Subject: [U-Boot] [PATCH 07/10][v4] driver: net: fsl-mc: Add DPAA2 commands to manage MC X-BeenThere: u-boot@lists.denx.de X-Mailman-Version: 2.1.15 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" Management complex Firmware, DPL and DPC are depolyed during u-boot boot sequence. Add new DPAA2 commands to manage Management Complex (MC) i.e. start mc, aiop and apply DPL from u-boot command prompt. Signed-off-by: Prabhakar Kushwaha --- Changes for v2: Sending as it is Changes for v3: fix compilation for ls2085_emu target Changes for v4: Sending as it is arch/arm/cpu/armv8/fsl-layerscape/README.lsch3 | 30 ++ drivers/net/fsl-mc/mc.c | 382 ++++++++++++------------- include/configs/ls2085aqds.h | 12 - include/configs/ls2085ardb.h | 12 - include/fsl-mc/fsl_mc.h | 5 + include/fsl-mc/fsl_mc_private.h | 2 +- 6 files changed, 220 insertions(+), 223 deletions(-) diff --git a/arch/arm/cpu/armv8/fsl-layerscape/README.lsch3 b/arch/arm/cpu/armv8/fsl-layerscape/README.lsch3 index 03e18f6..d1f92c4 100644 --- a/arch/arm/cpu/armv8/fsl-layerscape/README.lsch3 +++ b/arch/arm/cpu/armv8/fsl-layerscape/README.lsch3 @@ -242,3 +242,33 @@ MMU Translation Tables | 0x81_0000_0000 | | 0x08_0080_0000 | ------------------ ------------------ ... ... + + +DPAA2 commands to manage Management complex +------------------------------------------- +Management complex Firmware, DPL and DPC are depolyed during u-boot boot +sequence. + +New DPAA2 commands has been added to manage Management Complex (MC) i.e. +start mc, aiop and apply DPL from command prompt. + +a) fsl_mc start mc [FW_addr] [DPC_addr] - Start Management Complex +b) fsl_mc apply DPL [DPL_addr] - Apply DPL file +c) fsl_mc start aiop [FW_addr] - Start AIOP + +u-boot etherenet support sequence :- +a) fsl_mc start mc [FW_addr] [DPC_addr] - Start Management Complex +b) DPMACs device will be available now for use + +Linux boot sequence :- +a) fsl_mc start mc [FW_addr] [DPC_addr] - Start Management Complex +b) fsl_mc apply DPL [DPL_addr] - Apply DPL file +c) No DPMACs availabe for use in u-boot +c) boot Linux + +AIOP boot sequence :- +a) fsl_mc start mc [FW_addr] [DPC_addr] - Start Management Complex +b) fsl_mc start aiop [FW_addr] - Start AIOP +c) fsl_mc apply DPL [DPL_addr] - Apply DPL file +d) No DPMACs availabe for use in u-boot +Please note actual AIOP start will happen during DPL parsing of Management complex diff --git a/drivers/net/fsl-mc/mc.c b/drivers/net/fsl-mc/mc.c index ea987d7..d2ca5c6 100644 --- a/drivers/net/fsl-mc/mc.c +++ b/drivers/net/fsl-mc/mc.c @@ -14,7 +14,9 @@ #include #include #include +#include #include +#include #define MC_RAM_BASE_ADDR_ALIGNMENT (512UL * 1024 * 1024) #define MC_RAM_BASE_ADDR_ALIGNMENT_MASK (~(MC_RAM_BASE_ADDR_ALIGNMENT - 1)) @@ -24,7 +26,11 @@ #define MC_BOOT_TIMEOUT_ENV_VAR "mcboottimeout" DECLARE_GLOBAL_DATA_PTR; -static int mc_boot_status; +static int mc_boot_status = -1; +static int mc_dpl_applied = -1; +#ifdef CONFIG_SYS_LS_MC_DRAM_AIOP_IMG_OFFSET +static int mc_aiop_applied = -1; +#endif struct fsl_mc_io *dflt_mc_io = NULL; uint16_t dflt_dprc_handle = 0; struct fsl_dpbp_obj *dflt_dpbp = NULL; @@ -93,7 +99,8 @@ static int mc_copy_image(const char *title, * Returns 0 on success and a negative errno on error. * task fail. **/ -int parse_mc_firmware_fit_image(const void **raw_image_addr, +int parse_mc_firmware_fit_image(u64 mc_fw_addr, + const void **raw_image_addr, size_t *raw_image_size) { int format; @@ -103,36 +110,31 @@ int parse_mc_firmware_fit_image(const void **raw_image_addr, size_t size; const char *uname = "firmware"; - /* Check if the image is in NOR flash */ -#ifdef CONFIG_SYS_LS_MC_FW_IN_NOR - fit_hdr = (void *)CONFIG_SYS_LS_MC_FW_ADDR; -#else -#error "No CONFIG_SYS_LS_MC_FW_IN_xxx defined" -#endif + fit_hdr = (void *)mc_fw_addr; /* Check if Image is in FIT format */ format = genimg_get_format(fit_hdr); if (format != IMAGE_FORMAT_FIT) { - printf("fsl-mc: ERROR: Bad firmware image (not a FIT image)\n"); + printf("fsl-mc: ERR: Bad firmware image (not a FIT image)\n"); return -EINVAL; } if (!fit_check_format(fit_hdr)) { - printf("fsl-mc: ERROR: Bad firmware image (bad FIT header)\n"); + printf("fsl-mc: ERR: Bad firmware image (bad FIT header)\n"); return -EINVAL; } node_offset = fit_image_get_node(fit_hdr, uname); if (node_offset < 0) { - printf("fsl-mc: ERROR: Bad firmware image (missing subimage)\n"); + printf("fsl-mc: ERR: Bad firmware image (missing subimage)\n"); return -ENOENT; } /* Verify MC firmware image */ if (!(fit_image_verify(fit_hdr, node_offset))) { - printf("fsl-mc: ERROR: Bad firmware image (bad CRC)\n"); + printf("fsl-mc: ERR: Bad firmware image (bad CRC)\n"); return -EINVAL; } @@ -218,7 +220,7 @@ static int mc_fixup_dpc(u64 dpc_addr) return 0; } -static int load_mc_dpc(u64 mc_ram_addr, size_t mc_ram_size) +static int load_mc_dpc(u64 mc_ram_addr, size_t mc_ram_size, u64 mc_dpc_addr) { u64 mc_dpc_offset; #ifndef CONFIG_SYS_LS_MC_DPC_IN_DDR @@ -245,11 +247,7 @@ static int load_mc_dpc(u64 mc_ram_addr, size_t mc_ram_size) /* * Get address and size of the DPC blob stored in flash: */ -#ifdef CONFIG_SYS_LS_MC_DPC_IN_NOR - dpc_fdt_hdr = (void *)CONFIG_SYS_LS_MC_DPC_ADDR; -#else -#error "No CONFIG_SYS_LS_MC_DPC_IN_xxx defined" -#endif + dpc_fdt_hdr = (void *)mc_dpc_addr; error = fdt_check_header(dpc_fdt_hdr); if (error != 0) { @@ -279,7 +277,7 @@ static int load_mc_dpc(u64 mc_ram_addr, size_t mc_ram_size) return 0; } -static int load_mc_dpl(u64 mc_ram_addr, size_t mc_ram_size) +static int load_mc_dpl(u64 mc_ram_addr, size_t mc_ram_size, u64 mc_dpl_addr) { u64 mc_dpl_offset; #ifndef CONFIG_SYS_LS_MC_DPL_IN_DDR @@ -306,11 +304,7 @@ static int load_mc_dpl(u64 mc_ram_addr, size_t mc_ram_size) /* * Get address and size of the DPL blob stored in flash: */ -#ifdef CONFIG_SYS_LS_MC_DPL_IN_NOR - dpl_fdt_hdr = (void *)CONFIG_SYS_LS_MC_DPL_ADDR; -#else -#error "No CONFIG_SYS_LS_MC_DPL_IN_xxx defined" -#endif + dpl_fdt_hdr = (void *)mc_dpl_addr; error = fdt_check_header(dpl_fdt_hdr); if (error != 0) { @@ -357,23 +351,33 @@ static unsigned long get_mc_boot_timeout_ms(void) return timeout_ms; } -#ifdef CONFIG_SYS_LS_MC_AIOP_IMG_IN_NOR -static int load_mc_aiop_img(u64 mc_ram_addr, size_t mc_ram_size) +#ifdef CONFIG_SYS_LS_MC_DRAM_AIOP_IMG_OFFSET +static int load_mc_aiop_img(u64 aiop_fw_addr) { + u64 mc_ram_addr = mc_get_dram_addr(); +#ifndef CONFIG_SYS_LS_MC_DPC_IN_DDR void *aiop_img; +#endif /* * Load the MC AIOP image in the MC private DRAM block: */ - aiop_img = (void *)CONFIG_SYS_LS_MC_AIOP_IMG_ADDR; +#ifdef CONFIG_SYS_LS_MC_DPC_IN_DDR + printf("MC AIOP is preloaded to %#llx\n", mc_ram_addr + + CONFIG_SYS_LS_MC_DRAM_AIOP_IMG_OFFSET); +#else + aiop_img = (void *)aiop_fw_addr; mc_copy_image("MC AIOP image", (u64)aiop_img, CONFIG_SYS_LS_MC_AIOP_IMG_MAX_LENGTH, mc_ram_addr + CONFIG_SYS_LS_MC_DRAM_AIOP_IMG_OFFSET); +#endif + mc_aiop_applied = 0; return 0; } #endif + static int wait_for_mc(bool booting_mc, u32 *final_reg_gsr) { u32 reg_gsr; @@ -420,12 +424,12 @@ static int wait_for_mc(bool booting_mc, u32 *final_reg_gsr) return 0; } -int mc_init(void) +int mc_init(u64 mc_fw_addr, u64 mc_dpc_addr) { int error = 0; int portal_id = 0; struct mc_ccsr_registers __iomem *mc_ccsr_regs = MC_CCSR_BASE_ADDR; - u64 mc_ram_addr; + u64 mc_ram_addr = mc_get_dram_addr(); u32 reg_gsr; u32 reg_mcfbalr; #ifndef CONFIG_SYS_LS_MC_FW_IN_DDR @@ -437,17 +441,6 @@ int mc_init(void) u8 mc_ram_num_256mb_blocks; size_t mc_ram_size = mc_get_dram_block_size(); - /* - * The MC private DRAM block was already carved at the end of DRAM - * by board_init_f() using CONFIG_SYS_MEM_TOP_HIDE: - */ - if (gd->bd->bi_dram[1].start) { - mc_ram_addr = - gd->bd->bi_dram[1].start + gd->bd->bi_dram[1].size; - } else { - mc_ram_addr = - gd->bd->bi_dram[0].start + gd->bd->bi_dram[0].size; - } error = calculate_mc_private_ram_params(mc_ram_addr, mc_ram_size, @@ -474,7 +467,8 @@ int mc_init(void) #ifdef CONFIG_SYS_LS_MC_FW_IN_DDR printf("MC firmware is preloaded to %#llx\n", mc_ram_addr); #else - error = parse_mc_firmware_fit_image(&raw_image_addr, &raw_image_size); + error = parse_mc_firmware_fit_image(mc_fw_addr, &raw_image_addr, + &raw_image_size); if (error != 0) goto out; /* @@ -485,20 +479,10 @@ int mc_init(void) #endif dump_ram_words("firmware", (void *)mc_ram_addr); - error = load_mc_dpc(mc_ram_addr, mc_ram_size); - if (error != 0) - goto out; - - error = load_mc_dpl(mc_ram_addr, mc_ram_size); + error = load_mc_dpc(mc_ram_addr, mc_ram_size, mc_dpc_addr); if (error != 0) goto out; -#ifdef CONFIG_SYS_LS_MC_AIOP_IMG_IN_NOR - error = load_mc_aiop_img(mc_ram_addr, mc_ram_size); - if (error != 0) - goto out; -#endif - debug("mc_ccsr_regs %p\n", mc_ccsr_regs); dump_mc_ccsr_regs(mc_ccsr_regs); @@ -571,20 +555,36 @@ int mc_init(void) mc_ver_info.major, mc_ver_info.minor, mc_ver_info.revision, reg_gsr & GSR_FS_MASK); +out: + if (error != 0) + mc_boot_status = error; + else + mc_boot_status = 0; + + return error; +} + +int mc_apply_dpl(u64 mc_dpl_addr) +{ + struct mc_ccsr_registers __iomem *mc_ccsr_regs = MC_CCSR_BASE_ADDR; + int error = 0; + u32 reg_gsr; + u64 mc_ram_addr = mc_get_dram_addr(); + size_t mc_ram_size = mc_get_dram_block_size(); + + error = load_mc_dpl(mc_ram_addr, mc_ram_size, mc_dpl_addr); + if (error != 0) + return error; + /* * Tell the MC to deploy the DPL: */ out_le32(&mc_ccsr_regs->reg_gsr, 0x0); printf("fsl-mc: Deploying data path layout ... "); error = wait_for_mc(false, ®_gsr); - if (error != 0) - goto out; -out: - if (error != 0) - mc_boot_status = error; - else - mc_boot_status = 0; + if (!error) + mc_dpl_applied = 0; return error; } @@ -594,6 +594,40 @@ int get_mc_boot_status(void) return mc_boot_status; } +#ifdef CONFIG_SYS_LS_MC_DRAM_AIOP_IMG_OFFSET +int get_aiop_apply_status(void) +{ + return mc_aiop_applied; +} +#endif + +int get_dpl_apply_status(void) +{ + return mc_dpl_applied; +} + +/** + * Return the MC address of private DRAM block. + */ +u64 mc_get_dram_addr(void) +{ + u64 mc_ram_addr; + + /* + * The MC private DRAM block was already carved at the end of DRAM + * by board_init_f() using CONFIG_SYS_MEM_TOP_HIDE: + */ + if (gd->bd->bi_dram[1].start) { + mc_ram_addr = + gd->bd->bi_dram[1].start + gd->bd->bi_dram[1].size; + } else { + mc_ram_addr = + gd->bd->bi_dram[0].start + gd->bd->bi_dram[0].size; + } + + return mc_ram_addr; +} + /** * Return the actual size of the MC private DRAM block. */ @@ -693,155 +727,107 @@ int dpbp_init(struct dprc_obj_desc obj_desc) return 0; } -int dprc_init_container_obj(struct dprc_obj_desc obj_desc, uint16_t dprc_handle) +int fsl_mc_ldpaa_init(bd_t *bis) { - int error = 0, state = 0; - struct dprc_endpoint dpni_endpoint, dpmac_endpoint; - if (!strcmp(obj_desc.type, "dpbp")) { - if (!dflt_dpbp) { - error = dpbp_init(obj_desc); - if (error < 0) - printf("dpbp_init failed\n"); - } - } else if (!strcmp(obj_desc.type, "dpio")) { - if (!dflt_dpio) { - error = dpio_init(obj_desc); - if (error < 0) - printf("dpio_init failed\n"); - } - } else if (!strcmp(obj_desc.type, "dpni")) { - strcpy(dpni_endpoint.type, obj_desc.type); - dpni_endpoint.id = obj_desc.id; - error = dprc_get_connection(dflt_mc_io, MC_CMD_NO_FLAGS, - dprc_handle, &dpni_endpoint, - &dpmac_endpoint, &state); - if (!strcmp(dpmac_endpoint.type, "dpmac")) - error = ldpaa_eth_init(obj_desc); - if (error < 0) - printf("ldpaa_eth_init failed\n"); - } - return error; + return 0; } -int dprc_scan_container_obj(uint16_t dprc_handle, char *obj_type, int i) +void fsl_mc_ldpaa_exit(bd_t *bis) { - int error = 0; - struct dprc_obj_desc obj_desc; - - memset((void *)&obj_desc, 0x00, sizeof(struct dprc_obj_desc)); - - error = dprc_get_obj(dflt_mc_io, MC_CMD_NO_FLAGS, dprc_handle, - i, &obj_desc); - if (error < 0) { - printf("dprc_get_obj(i=%d) failed: %d\n", - i, error); - return error; - } - - if (!strcmp(obj_desc.type, obj_type)) { - debug("Discovered object: type %s, id %d, req %s\n", - obj_desc.type, obj_desc.id, obj_type); - - error = dprc_init_container_obj(obj_desc, dprc_handle); - if (error < 0) { - printf("dprc_init_container_obj(i=%d) failed: %d\n", - i, error); - return error; - } - } - - return error; + return; } -int fsl_mc_ldpaa_init(bd_t *bis) +static int do_fsl_mc(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { - int i, error = 0; - int dprc_opened = 0, container_id; - int num_child_objects = 0; - - error = mc_init(); - if (error < 0) - goto error; - - error = dprc_get_container_id(dflt_mc_io, MC_CMD_NO_FLAGS, - &container_id); - if (error < 0) { - printf("dprc_get_container_id() failed: %d\n", error); - goto error; - } - - debug("fsl-mc: Container id=0x%x\n", container_id); - - error = dprc_open(dflt_mc_io, MC_CMD_NO_FLAGS, container_id, - &dflt_dprc_handle); - if (error < 0) { - printf("dprc_open() failed: %d\n", error); - goto error; - } - dprc_opened = true; - - error = dprc_get_obj_count(dflt_mc_io, - MC_CMD_NO_FLAGS, dflt_dprc_handle, - &num_child_objects); - if (error < 0) { - printf("dprc_get_obj_count() failed: %d\n", error); - goto error; - } - debug("Total child in container %d = %d\n", container_id, - num_child_objects); - - if (num_child_objects != 0) { - /* - * Discover objects currently in the DPRC container in the MC: - */ - for (i = 0; i < num_child_objects; i++) - error = dprc_scan_container_obj(dflt_dprc_handle, - "dpbp", i); - - for (i = 0; i < num_child_objects; i++) - error = dprc_scan_container_obj(dflt_dprc_handle, - "dpio", i); - - for (i = 0; i < num_child_objects; i++) - error = dprc_scan_container_obj(dflt_dprc_handle, - "dpni", i); - } -error: - if (dprc_opened) - dprc_close(dflt_mc_io, MC_CMD_NO_FLAGS, dflt_dprc_handle); - - return error; -} + int err = 0; + if (argc < 3) + goto usage; + + switch (argv[1][0]) { + case 's': { + char sub_cmd; + u64 mc_fw_addr, mc_dpc_addr, aiop_fw_addr; + + sub_cmd = argv[2][0]; + switch (sub_cmd) { + case 'm': + if (argc < 5) + goto usage; + + if (get_mc_boot_status() == 0) { + printf("fsl-mc: MC is already booted"); + printf("\n"); + return err; + } + mc_fw_addr = simple_strtoull(argv[3], NULL, 16); + mc_dpc_addr = simple_strtoull(argv[4], NULL, + 16); + err = mc_init(mc_fw_addr, mc_dpc_addr); + break; + +#ifdef CONFIG_SYS_LS_MC_DRAM_AIOP_IMG_OFFSET + case 'a': + if (argc < 4) + goto usage; + if (get_aiop_apply_status() == 0) { + printf("fsl-mc: AIOP FW is already"); + printf(" applied\n"); + return err; + } + + aiop_fw_addr = simple_strtoull(argv[3], NULL, + 16); + + err = load_mc_aiop_img(aiop_fw_addr); + if (!err) + printf("fsl-mc: AIOP FW applied\n"); + break; +#endif + default: + printf("Invalid option: %s\n", argv[2]); + goto usage; -void fsl_mc_ldpaa_exit(bd_t *bis) -{ - int err; - - if (get_mc_boot_status() == 0) { - err = dpio_disable(dflt_mc_io, MC_CMD_NO_FLAGS, - dflt_dpio_handle); - if (err < 0) { - printf("dpio_disable() failed: %d\n", err); - return; - } - err = dpio_reset(dflt_mc_io, MC_CMD_NO_FLAGS, - dflt_dpio_handle); - if (err < 0) { - printf("dpio_reset() failed: %d\n", err); - return; + break; + } } - err = dpio_close(dflt_mc_io, MC_CMD_NO_FLAGS, - dflt_dpio_handle); - if (err < 0) { - printf("dpio_close() failed: %d\n", err); - return; + break; + + case 'a': { + u64 mc_dpl_addr; + + if (argc < 4) + goto usage; + + if (get_dpl_apply_status() == 0) { + printf("fsl-mc: DPL already applied\n"); + return err; + } + + mc_dpl_addr = simple_strtoull(argv[3], NULL, + 16); + if (get_mc_boot_status() != 0) { + printf("fsl-mc: Deploying data path layout .."); + printf("ERROR (MC is not booted)\n"); + return -ENODEV; + } + err = mc_apply_dpl(mc_dpl_addr); + break; } - - free(dflt_dpio); - free(dflt_dpbp); + default: + printf("Invalid option: %s\n", argv[1]); + goto usage; + break; } - - if (dflt_mc_io) - free(dflt_mc_io); + return err; + usage: + return CMD_RET_USAGE; } + +U_BOOT_CMD( + fsl_mc, CONFIG_SYS_MAXARGS, 1, do_fsl_mc, + "DPAA2 command to manage Management Complex (MC)", + "start mc [FW_addr] [DPC_addr] - Start Management Complex\n" + "fsl_mc apply DPL [DPL_addr] - Apply DPL file\n" + "fsl_mc start aiop [FW_addr] - Start AIOP\n" +); diff --git a/include/configs/ls2085aqds.h b/include/configs/ls2085aqds.h index 406d0e6..99690ef 100644 --- a/include/configs/ls2085aqds.h +++ b/include/configs/ls2085aqds.h @@ -250,19 +250,7 @@ unsigned long get_board_ddr_clk(void); #define CONFIG_SYS_DEBUG_SERVER_FW_IN_NOR #define CONFIG_SYS_DEBUG_SERVER_FW_ADDR 0x580D00000ULL -/* MC firmware */ -#define CONFIG_SYS_LS_MC_FW_IN_NOR -#define CONFIG_SYS_LS_MC_FW_ADDR 0x580300000ULL - -#define CONFIG_SYS_LS_MC_DPL_IN_NOR -#define CONFIG_SYS_LS_MC_DPL_ADDR 0x580700000ULL - -#define CONFIG_SYS_LS_MC_DPC_IN_NOR -#define CONFIG_SYS_LS_MC_DPC_ADDR 0x580800000ULL - #define CONFIG_SYS_LS_MC_BOOT_TIMEOUT_MS 5000 -#define CONFIG_SYS_LS_MC_AIOP_IMG_IN_NOR -#define CONFIG_SYS_LS_MC_AIOP_IMG_ADDR 0x580900000ULL /* * I2C diff --git a/include/configs/ls2085ardb.h b/include/configs/ls2085ardb.h index f95d7b2..f36253d 100644 --- a/include/configs/ls2085ardb.h +++ b/include/configs/ls2085ardb.h @@ -223,19 +223,7 @@ unsigned long get_board_sys_clk(void); #define CONFIG_SYS_DEBUG_SERVER_FW_IN_NOR #define CONFIG_SYS_DEBUG_SERVER_FW_ADDR 0x580D00000ULL -/* MC firmware */ -#define CONFIG_SYS_LS_MC_FW_IN_NOR -#define CONFIG_SYS_LS_MC_FW_ADDR 0x580300000ULL - -#define CONFIG_SYS_LS_MC_DPL_IN_NOR -#define CONFIG_SYS_LS_MC_DPL_ADDR 0x580700000ULL - -#define CONFIG_SYS_LS_MC_DPC_IN_NOR -#define CONFIG_SYS_LS_MC_DPC_ADDR 0x580800000ULL - #define CONFIG_SYS_LS_MC_BOOT_TIMEOUT_MS 5000 -#define CONFIG_SYS_LS_MC_AIOP_IMG_IN_NOR -#define CONFIG_SYS_LS_MC_AIOP_IMG_ADDR 0x580900000ULL /* * I2C diff --git a/include/fsl-mc/fsl_mc.h b/include/fsl-mc/fsl_mc.h index 9517a4a..c8f168a 100644 --- a/include/fsl-mc/fsl_mc.h +++ b/include/fsl-mc/fsl_mc.h @@ -50,6 +50,11 @@ struct mc_ccsr_registers { }; int get_mc_boot_status(void); +int get_dpl_apply_status(void); +#ifdef CONFIG_SYS_LS_MC_DRAM_AIOP_IMG_OFFSET +int get_aiop_apply_status(void); +#endif +u64 mc_get_dram_addr(void); unsigned long mc_get_dram_block_size(void); int fsl_mc_ldpaa_init(bd_t *bis); void fsl_mc_ldpaa_exit(bd_t *bis); diff --git a/include/fsl-mc/fsl_mc_private.h b/include/fsl-mc/fsl_mc_private.h index 9f06978..9421362 100644 --- a/include/fsl-mc/fsl_mc_private.h +++ b/include/fsl-mc/fsl_mc_private.h @@ -45,6 +45,6 @@ struct fsl_dpio_obj { extern struct fsl_dpio_obj *dflt_dpio; -int mc_init(void); +int mc_init(u64 mc_fw_addr, u64 mc_dpc_addr); int ldpaa_eth_init(struct dprc_obj_desc obj_desc); #endif /* _FSL_MC_PRIVATE_H_ */