From patchwork Tue May 16 07:15:11 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Siva Durga Prasad Paladugu X-Patchwork-Id: 762805 X-Patchwork-Delegate: monstr@monstr.eu Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.denx.de (dione.denx.de [81.169.180.215]) by ozlabs.org (Postfix) with ESMTP id 3wRpdk0x2kz9s85 for ; Tue, 16 May 2017 17:16:10 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=xilinx.onmicrosoft.com header.i=@xilinx.onmicrosoft.com header.b="Yn4IhmGX"; dkim-atps=neutral Received: by lists.denx.de (Postfix, from userid 105) id B6BDFC22251; Tue, 16 May 2017 07:16:07 +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_DNSWL_NONE, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_PASS, T_DKIM_INVALID 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 06135C21CE2; Tue, 16 May 2017 07:16:03 +0000 (UTC) Received: by lists.denx.de (Postfix, from userid 105) id 9EE77C21CE2; Tue, 16 May 2017 07:16:01 +0000 (UTC) Received: from NAM01-SN1-obe.outbound.protection.outlook.com (mail-sn1nam01on0081.outbound.protection.outlook.com [104.47.32.81]) by lists.denx.de (Postfix) with ESMTPS id B8B48C21CA4 for ; Tue, 16 May 2017 07:16:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=xilinx.onmicrosoft.com; s=selector1-xilinx-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=mfPOO6PpbE4dVe4XbH+teVIer6/BoKcoY0CZ58y5TEk=; b=Yn4IhmGXJTlqoB2Y9SD3aEfOnSQqNTUBHZJtqJ28AYrCIghFlh1ZKwGCUNeYO9nD/91UZ1gfJICQHNoB/jaM+LXRjUk4MJCwUnjhOdsJ9E+RNGp3skiHBGoGC9SSQmJjHOsBoNNocrKJUhSiR9denpg8DSgxW4/MvY5j4cHBuq0= Received: from CY1PR0201CA0037.namprd02.prod.outlook.com (10.163.30.175) by CY1PR02MB1627.namprd02.prod.outlook.com (10.162.160.157) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1084.16; Tue, 16 May 2017 07:15:58 +0000 Received: from CY1NAM02FT013.eop-nam02.prod.protection.outlook.com (2a01:111:f400:7e45::203) by CY1PR0201CA0037.outlook.office365.com (2a01:111:e400:58b9::47) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1084.16 via Frontend Transport; Tue, 16 May 2017 07:15:58 +0000 Authentication-Results: spf=pass (sender IP is 149.199.60.100) smtp.mailfrom=xilinx.com; freescale.com; dkim=none (message not signed) header.d=none;freescale.com; dmarc=bestguesspass action=none header.from=xilinx.com; Received-SPF: Pass (protection.outlook.com: domain of xilinx.com designates 149.199.60.100 as permitted sender) receiver=protection.outlook.com; client-ip=149.199.60.100; helo=xsj-pvapsmtpgw02; Received: from xsj-pvapsmtpgw02 (149.199.60.100) by CY1NAM02FT013.mail.protection.outlook.com (10.152.75.162) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.1075.5 via Frontend Transport; Tue, 16 May 2017 07:15:57 +0000 Received: from unknown-38-66.xilinx.com ([149.199.38.66]:42993 helo=xsj-pvapsmtp01) by xsj-pvapsmtpgw02 with esmtp (Exim 4.63) (envelope-from ) id 1dAWi4-0007Hu-Qp; Tue, 16 May 2017 00:15:56 -0700 Received: from [127.0.0.1] (helo=localhost) by xsj-pvapsmtp01 with smtp (Exim 4.63) (envelope-from ) id 1dAWi4-0003D9-NZ; Tue, 16 May 2017 00:15:56 -0700 Received: from xsj-pvapsmtp01 (mailman.xilinx.com [149.199.38.66]) by xsj-smtp-dlp2.xlnx.xilinx.com (8.13.8/8.13.1) with ESMTP id v4G7FsYu022453; Tue, 16 May 2017 00:15:54 -0700 Received: from [172.23.37.99] (helo=xhdsivadur40.xilinx.com) by xsj-pvapsmtp01 with esmtp (Exim 4.63) (envelope-from ) id 1dAWi1-0003BF-PV; Tue, 16 May 2017 00:15:54 -0700 From: Siva Durga Prasad Paladugu To: Date: Tue, 16 May 2017 12:45:11 +0530 Message-ID: <1494918911-24067-2-git-send-email-sivadur@xilinx.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1494918911-24067-1-git-send-email-sivadur@xilinx.com> References: <1494918911-24067-1-git-send-email-sivadur@xilinx.com> X-RCIS-Action: ALLOW X-TM-AS-Product-Ver: IMSS-7.1.0.1224-8.1.0.1062-23072.005 X-TM-AS-User-Approved-Sender: Yes;Yes X-EOPAttributedMessage: 0 X-MS-Office365-Filtering-HT: Tenant X-Forefront-Antispam-Report: CIP:149.199.60.100; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(39410400002)(39400400002)(39450400003)(39840400002)(39860400002)(2980300002)(438002)(199003)(189002)(9170700003)(8666007)(8936002)(81166006)(8676002)(48376002)(38730400002)(63266004)(107886003)(106466001)(2351001)(110136004)(2950100002)(9786002)(356003)(6666003)(6916009)(54906002)(50466002)(36756003)(33646002)(189998001)(76176999)(5660300001)(50986999)(77096006)(50226002)(2906002)(478600001)(36386004)(4326008)(305945005)(107986001); DIR:OUT; SFP:1101; SCL:1; SRVR:CY1PR02MB1627; H:xsj-pvapsmtpgw02; FPR:; SPF:Pass; MLV:sfv; A:1; MX:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; CY1NAM02FT013; 1:jDMofjNqlnb758HDAPLyrAPznSpqpHKpfzWioaGGR+6fAjX24w865IpWbn7BeLC4k4k+3Xs73QHNTtHxWwP9G2BWgTsKB3c8O6DKjzqfpxnRhy2AKM+0CmuitNF4J89crpd6epAiLaWZQxsyoV6dNn+u3YOIUBAhsRaqKVhW765fipFs/JXsaqjHf5AXIquQpcuiBoPM+g2NwcsclxcQqpl2lORh3wC1YvxP85NJDrsqZP/RXbuaIVhi/QF9YvkA5P8sFXl19oEJ7L/LfVBvaTFvC8MpMAZ/whk0GKkzkhdmfZqBv6Wj6/EBWvUrtz1RWEb/nwM8QrqMHlByj/OksJKPnQVpgihF3R2RYMXS5WvKQ7068cvKlTIznhhW8ZO+Qat/QgV6t3G15UgkCkSz4aoSQAgMUMGZutklE970+jL0IadHYy12OPtk31u/lTbDhe8soB+OjuaSyQrs4GQxbaKMe89pONknTBjtflRLeNlKkFAAN5hR4FVsyTWNTFuW5z1uLJAn/svzU7KGPZh1nGy7ZUsclO2qvOe+WtAtVtzX6mIQ2DrNeaAQ8GVtRGhC+8tDdN1jklQj/qPizqweImJZ2ZnTwKCHVnSx3/a0Qz1jZsOlLQtRd2mroYEkCf5e MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 1dbc8c4b-7811-4ad8-15ac-08d49c2b6654 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(8251501002)(2017030254075)(201703131423075)(201703031133081); SRVR:CY1PR02MB1627; X-Microsoft-Exchange-Diagnostics: 1; CY1PR02MB1627; 3:FW76gUPX3XRK48Vfi7c8Rj6nQOJxVRGDsPB3Bz1pmuZ/i9W7DX4Cdz9+4S+aWGaZd0y7iXJ4K1/hfSYAf5nyrlE6F84iupo7etNklNuLKAPNwmTOI3zFDBHBL7IIWz6FRbJm0JtRU2fIssA385ghd6uf/boJjHAb79lST20WjcmU56ggXaQUPPonGpJLm6D3ANGljxwV09cIhoE7dQp/YsxuJGuhWfnuWBEEMnIKNk8OBAZRbtIdnoxNVoo8NSTUtxMCVsGPwIG13x1ltoSRE68lXyF3uNRrdoez/Gl8TnNSmLhy1W+zDzCirOzhwg+iEhjd7mBnug+NiZtolwqIzhooH33BJoCa6cRTwaoVGJIJlDmTNkbi8FC/mKEKdM1pSoUO7tGqPlngo0S9SPkvpnXY7OoJpBOyN1qGfm3s6LCscEYLamTdcxp91/efOowspMuANUd2Z9Wgl598xXHrwJ/is77ygoKjsy+UikWcZJBPAy1cga5nzG2HbLr9Tk0E X-Microsoft-Exchange-Diagnostics: 1; CY1PR02MB1627; 25:dhdLSI9mW56JfTTaOWWwy3c2AtYHgOxN3wfLLgCBPlD4ku99YCvcRMRqdn2vfhY8M3EB3fg0pF3YiaB1F3InTn/iTjN3ldUeFy6c5ebvfIjRAf+ZuU1gDSePGZ155qzt63qt92qmzPbGQr94jab45ExDq9J1CKkAvc9tMMOf/ruJAsF4ewasYEQk8LMWTEMYjSgoiopx8u/JF1VgsseBeO2TMLYb9J1j5EuSwVQh4hABaiBC9PPIm9TcC66L2d0TZjEsZT13RkIeNGEwQWttbJdeaOfOxI4Jwu5mf9cOpSzPkPrkvz8KJUM1438D6mlKEH+0NwMtSuOJ4sI2ygzXbQW7NtjiIOEezfvAJCArViJW8llLKwJtnAtpnlzzkYuGFUbxTEDevt7KlDHskNwL42YHgwsGT94I40UjkJySMuWmmaFQLeEClo+cdJ7vWJN+GZHDUO6yhGDO25U009ekxVa4mYelHb4b9LdxnMX0adc=; 31:3FCO4DH0B0kTtVrdPlNO8ueMT9iYO7ox/0wR5NPg9FrPR/yznUYXfJ+H+VhQH75l39pBtm9eKujW7JzUwHPtYnUAnA+oq7YnlT3dLZbPGXwhtE3ldDYajSi7a8SMAIgnTKeiliHK0B4bLmB2/sSdrMAIYPr2F08ujDEtJIn5DzkGhiVGBpIuJncAs5yg5HgmErk9c5KhZTPeM401khqWIQtERE+dljngzMbIysevYiyxBQWuNRdHhVqusTrbv+TJAm6cn5V51BYdbW2Wa6CpBw== X-Microsoft-Exchange-Diagnostics: 1; CY1PR02MB1627; 20:jhiuU/i/WLaVfPG+9Wnwfyknjfmxyqvi5XYO8kL0gXEWl1f+Q04xR71xReInQmFiQqhwAn+MeGonRtjCmXb6KSWN5ysf8+zKg5t8ZnREuqT6lsekqLKkYN3Rl+2xzWKebDoFZD/xupCvERHu4b5QlClobOTMEiavl9iy/hm2jEokUy79LvJUU2st62q0OChh05tHtqU2DHQQZ1/k8ELkiBx+eG/qse/Nc36fcrRlpU618Ae5gHgAiYCUBSbghS2j0kIWZFPk9TJVncxRprI5xPRlbA1QNKLZvFVMLKPEIrjLDYp1reljep8oopvArXmBmYBvEs4KfCjEgryNDTJWhiCDbRS7soRdh2tZ4fm0j/4JXn9tTZY1ozaveusErMuaucgH8YG4lJJzNyU2yloNB3QiQ1rVw3EtU02Or9eNEJhfJ+vQig5NmCpQ2BOV1OfyjCpWGZWion+GSELXLiIgA9v7SxTh9Yq6H+lYjZmxfUj9rhiiTrUopILrxn3nX7tn X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(192813158149592); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040450)(601004)(2401047)(8121501046)(13017025)(5005006)(13023025)(13018025)(13015025)(13024025)(10201501046)(3002001)(93006095)(93004095)(6055026)(6041248)(20161123555025)(20161123558100)(20161123564025)(20161123562025)(20161123560025)(201703131423075)(201702281528075)(201703061421075)(201703061406153)(6072148); SRVR:CY1PR02MB1627; BCL:0; PCL:0; RULEID:; SRVR:CY1PR02MB1627; X-Microsoft-Exchange-Diagnostics: 1; CY1PR02MB1627; 4:jwpx1fF5cAwLHRRnKcDW8ADwrCXUlQ5i7frNxsXrkT5bKs5SvVKR524D/HGZVxg9DC7ZA8f3oxWoQ+BXUIrLtdDDXHN+WxSR2axMad1yFSBWOk+mh/LWko7gasxx/fAfKj4fiekGwM5vR91CAW8k53rASvNrbt++YWo26hz9XeCKs1wwEo4bqylwAQN4nOCYwlWBTwWL1zPbcKGgKbUJ3ar+cx2FE91KV4SDcq459Y5eMXwxb6A++YZYpQYaxRdPSBt3ecSYth8Srv3dOz0jmpHgAYtrFzAlcvvBZXNGT2v37V3IYBLZltIzrbW0GCE7vXI6rogExiJ+qhHotgdFP3vByhtDXuGLY1I0KIp/gH3UhxD2tex2zY0GjnU0SuiW9F32Z2Go3MQxUgKJdmwynKtaxvCWPx4Qwe0lXBOfCJZ4KPQ2cdPpGS1vJzsrenfBHG3uh4SXTREITX9sY614poaeibaevtCpsa/tWr/f5VffLfDvnVHyUDYCJUgdi7sBiRy+G41BAGyufPzHIMiV4IyKLFCUYQXWVk3kS6laqH9IaxE/qLhexsc/8hkr1lpsMCiYElmpvEN0OpNVcsCmuo6vN/28YB6ABYkPYAQeuHNoQJswCQ/KWz8rLvR1+bfTY553UuDEzOt2rAroggfDJfv3RKj2go8+hH68NduXIw3gZ8ggJ9vdjhjxW6EVKx0rzKLOvOSmLkSlZJlgWqywa3FV1pknc7ekkTVzOt7HfxMHHsqNpPg+/RDHf4/7wcXaeBZiCsFDerYP9xxayvWY/AkHdOCO8p6DTTOrbqnD3YiR2JnztkgPmMnIIL+5zrG3n0UaLVjaS3mBp+3n23t3ua8JZKjm4EHiL4xCM+fRUsrg4lTs8UxMmqURMAK1eCyEbXtEAWdCnADzfiV/QrZWid7H11IKxp0/Y49jV9nyFFwsYRFJGxH5PJFg7S2A4muD X-Forefront-PRVS: 03094A4065 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; CY1PR02MB1627; 23:aBtV0iJRA5Vp1iY2qnManc9kreTamzoY6+rz5PpMj?= =?us-ascii?Q?nTqjpWbh/Ii9UyxuChDf/4l/Hh/Pt0EwgNM+6mRP8/2u3ZGuvfP5eHR6X/j9?= =?us-ascii?Q?5/czrAJjRaQCIe37Z610ll11wxbtWl4CuuytxH44gcEcJgSGzOQNzg65lNZY?= =?us-ascii?Q?PGnWjFFkZtyAUNxIVY2TRmurAf2qhfPDE6n81L5S7TORy4JekGaKSMH6i7lc?= =?us-ascii?Q?cR0LBcsFIlXXX2tGFbdAzefDZZDmuPgjdVmidoAgYOKO6thGT2Kx4r4Xx+YS?= =?us-ascii?Q?k4im8ebETyURD2SRM8kVqP9oRwGHXTjOmffeJy9FdTOZvlNrpn5YVf22zlKY?= =?us-ascii?Q?FoM1LGS1f1Ua3pIQxbtb/4rq8UYXm662AQxN+q8w4dczc/j4uBgRjZj/hutS?= =?us-ascii?Q?Ii/98zzkEsyA0xuhWKOmuFizO5gW0zZu5Qi3WslRwMjeniTCUB0pV0TEmL47?= =?us-ascii?Q?lmuxKBNn07ak3LHK1O1pf6fE7NeXl9jpzX5IN0mM4qj/G/BEYWjqPP9QXEAx?= =?us-ascii?Q?CEoZj5gEzDe9UnceQCSg6yJ37tkRmN8e9TgA3rTCVnC1/ryghb9KgYaQiKh8?= =?us-ascii?Q?472GkgCL3RqXePGBDnY49sR2KbbU25gaF+ETu7MCsguIeBsC4Iv/VG17KXlZ?= =?us-ascii?Q?JahoAanbO8gjjwRlMRCwfJ9owSqPGgPVgYNTyeS5ZpWpnf9FOvRgZf9FHNyx?= =?us-ascii?Q?hDvo7j+HqoNHjcfZHJxqKLsiE2j9N6Sq2Sz/BLfc+HwmzbP+phTBt9YppWAz?= =?us-ascii?Q?b0fyR6X5AXUcM0wx1sk6kQ4+SIfmCgZ5+6XaCFaGau4YYc683wSe8VkRqK7E?= =?us-ascii?Q?FM2A3+nyiaBwlJ99UVkpHa0z41RO8FZ7eH2WXWWHFGnBVIwuvNX3HxqfR0vQ?= =?us-ascii?Q?hdZ0L7lPS2BK0B67QDwlsKOkK4Bh1KU3fpOWDkyim3iyTdlK6u8vkdVKdvk8?= =?us-ascii?Q?ZF5Y+LC86hL1b/OmEO+5lnlrwtDYuo/yHM9xmhQnKVqiEGL2LAfld8//AQkW?= =?us-ascii?Q?JKLGwsCXBv42TBJZv2aKjXiweiHk3Iv0yUy1XIFdKf7B/vcAOzsSfYZaJKew?= =?us-ascii?Q?JM6rgSCqDmTz71Uz3d5OTZZhvmy?= X-Microsoft-Exchange-Diagnostics: 1; CY1PR02MB1627; 6:DxbkaTYKH8Ei9JkJDd492Ulh3b/0fdgnWB5dQRp7JIa9RBNNhFEeGmNRDr3k6LUbB3CMyVqu5qmFmCdmDD/FFHHieMuGGjjsYgUwW9IFnLyiwSNqq2mgYTAK6AoMf5XnHPyoWMYhMG4M8jvZWuqn+MjtYHtY8eKCLGuAOsJhMu8pq4MMq9PBN44luCd7tTrwU60yae2HIsdA8h/3HZ/FZxQ885W+cZFTWHbaQFbY3QC39laoHyXxhWrJQLJqhObfhQk9/1161V2GZ9uA6EKFzllY/eyYocHoSuyrly2X2DixgtBSRPv50G7qcf25QzGzLwM+5lcz+zfE3cu3iGyf/THIryOktAzmztEs/VCcJjQjTI3fcEHohupFBbg2d0SkeVXyq7AWKNTtdxpXoyEoWKLXiPHGftP5AEK1pr/I9CYepa/iLrk+2ghtq1RO0Exg7xtHrl7+PfJ2aFbc4HHA6pGZ15zM8LD6gzKmN5LY/T60B97KJc9zPitRAussDa9kTDu+gXSOkeFtY+UIb1k7GL7wmpdRXDjX8HgoONqMxiA=; 5:fx8Rx0W8lFPJwGnrX4HDZ2pwn/QeOIPbqvSTgN91t+uH0eNBYYqDGNrw1hmpWuYyEWLR10DMuj//bTWLRnzZ6k1iqV1sN/XpE5KR+jDaarPakr1JI8t0//tRsKcaWP6LPiYzfZQt8msQKz8CwwVMnw==; 24:CKGj8YxnaX85AIWwOveWNEuDf8ITvPunnooTf7/ZJ7ZgRS+LKwOyV6zGRc/kfiX2/+lZukIArmCr67vG29hiosDVuvn43dHY6vcIWsZ8g78= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; CY1PR02MB1627; 7:5sdUn1rxa2iMr06DNpYMjC+Ajymj/TSWSLmU8GCLlXQVHWINXSOEXHt5JyYfEuE+IY59oNaryJGjf8tLg5VaRK7oABuFxRAb1KTm55whjH8XFGEX9Bk6Sf6FHlz+jOeE/d9yCd/PRp0iN7B0MrNvyE7zAJkzSQ0uroCCeKtdHnoubtTlQ/utA2W4NfM+nsq9EIsIUL1ns/GHjAXp/b2iDeUJd2NSJ8IQbAy1jqz06xP8T9cfhdh8fXvXRTScNpgY6i0WgMVHgoUM1n/UhwD+rm5ny2mnSEd7rb1aJcyiZNyOkCroDeQXIBJrbuYea+YYoY6bQpk62yUgDoNqKOTGZw== X-OriginatorOrg: xilinx.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 May 2017 07:15:57.7583 (UTC) X-MS-Exchange-CrossTenant-Id: 657af505-d5df-48d0-8300-c31994686c5c X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=657af505-d5df-48d0-8300-c31994686c5c; Ip=[149.199.60.100]; Helo=[xsj-pvapsmtpgw02] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR02MB1627 Cc: scottwood@freescale.com, michals@xilinx.com, Siva Durga Prasad Paladugu Subject: [U-Boot] [PATCH 2/2] nand: arasan_nfc: Add support for ondie ecc 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" This patch adds support for ondie ecc. As of now this adds support for micron parts which supports ondie ecc. Didnt found any better way to detect ondie ecc support by a device except sorting out with manufacture and device id's. Signed-off-by: Siva Durga Prasad Paladugu --- drivers/mtd/nand/arasan_nfc.c | 166 +++++++++++++++++++++++++++++++++++------- 1 file changed, 139 insertions(+), 27 deletions(-) diff --git a/drivers/mtd/nand/arasan_nfc.c b/drivers/mtd/nand/arasan_nfc.c index 43a5707..14689d1 100644 --- a/drivers/mtd/nand/arasan_nfc.c +++ b/drivers/mtd/nand/arasan_nfc.c @@ -21,6 +21,7 @@ struct arasan_nand_info { void __iomem *nand_base; u32 page; + bool on_die_ecc_enabled; }; struct nand_regs { @@ -64,6 +65,7 @@ struct arasan_nand_command_format { }; #define ONDIE_ECC_FEATURE_ADDR 0x90 +#define ENABLE_ONDIE_ECC 0x08 #define ARASAN_PROG_RD_MASK 0x00000001 #define ARASAN_PROG_BLK_ERS_MASK 0x00000004 @@ -206,6 +208,52 @@ static const struct arasan_ecc_matrix ecc_matrix[] = { {16384, 1024, 24, 1, 4, 0x4220, 0x2A0} }; +static struct nand_ecclayout ondie_nand_oob_64 = { + .eccbytes = 32, + + .eccpos = { + 8, 9, 10, 11, 12, 13, 14, 15, + 24, 25, 26, 27, 28, 29, 30, 31, + 40, 41, 42, 43, 44, 45, 46, 47, + 56, 57, 58, 59, 60, 61, 62, 63 + }, + + .oobfree = { + { .offset = 4, .length = 4 }, + { .offset = 20, .length = 4 }, + { .offset = 36, .length = 4 }, + { .offset = 52, .length = 4 } + } +}; + +/* + * bbt decriptors for chips with on-die ECC and + * chips with 64-byte OOB + */ +static u8 bbt_pattern[] = {'B', 'b', 't', '0' }; +static u8 mirror_pattern[] = {'1', 't', 'b', 'B' }; + +static struct nand_bbt_descr bbt_main_descr = { + .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE | + NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP, + .offs = 4, + .len = 4, + .veroffs = 20, + .maxblocks = 4, + .pattern = bbt_pattern +}; + +static struct nand_bbt_descr bbt_mirror_descr = { + .options = NAND_BBT_LASTBLOCK | NAND_BBT_CREATE | NAND_BBT_WRITE | + NAND_BBT_2BIT | NAND_BBT_VERSION | NAND_BBT_PERCHIP, + .offs = 4, + .len = 4, + .veroffs = 20, + .maxblocks = 4, + .pattern = mirror_pattern +}; + + static u8 buf_data[READ_BUFF_SIZE]; static u32 buf_index; @@ -265,6 +313,7 @@ static u8 arasan_nand_get_addrcycle(struct mtd_info *mtd) static int arasan_nand_read_page(struct mtd_info *mtd, u8 *buf, u32 size) { struct nand_chip *chip = mtd_to_nand(mtd); + struct arasan_nand_info *nand = nand_get_controller_data(chip); u32 reg_val, i, pktsize, pktnum; u32 *bufptr = (u32 *)buf; u32 timeout; @@ -293,15 +342,17 @@ static int arasan_nand_read_page(struct mtd_info *mtd, u8 *buf, u32 size) pktsize; writel(reg_val, &arasan_nand_base->pkt_reg); - arasan_nand_enable_ecc(); - addr_cycles = arasan_nand_get_addrcycle(mtd); - if (addr_cycles == ARASAN_NAND_INVALID_ADDR_CYCL) - return ERR_ADDR_CYCLE; + if (!nand->on_die_ecc_enabled) { + arasan_nand_enable_ecc(); + addr_cycles = arasan_nand_get_addrcycle(mtd); + if (addr_cycles == ARASAN_NAND_INVALID_ADDR_CYCL) + return ERR_ADDR_CYCLE; - writel((NAND_CMD_RNDOUTSTART << ARASAN_NAND_CMD_CMD2_SHIFT) | - NAND_CMD_RNDOUT | (addr_cycles << - ARASAN_NAND_CMD_ADDR_CYCL_SHIFT), - &arasan_nand_base->ecc_sprcmd_reg); + writel((NAND_CMD_RNDOUTSTART << ARASAN_NAND_CMD_CMD2_SHIFT) | + NAND_CMD_RNDOUT | (addr_cycles << + ARASAN_NAND_CMD_ADDR_CYCL_SHIFT), + &arasan_nand_base->ecc_sprcmd_reg); + } writel(curr_cmd->pgm, &arasan_nand_base->pgm_reg); while (rdcount < pktnum) { @@ -363,17 +414,19 @@ static int arasan_nand_read_page(struct mtd_info *mtd, u8 *buf, u32 size) writel(reg_val | ARASAN_NAND_INT_STS_XFR_CMPLT_MASK, &arasan_nand_base->intsts_reg); - if (readl(&arasan_nand_base->intsts_reg) & - ARASAN_NAND_INT_STS_MUL_BIT_ERR_MASK) { - printf("arasan rd_page:sbiterror\n"); - return -1; - } + if (!nand->on_die_ecc_enabled) { + if (readl(&arasan_nand_base->intsts_reg) & + ARASAN_NAND_INT_STS_MUL_BIT_ERR_MASK) { + printf("arasan rd_page:sbiterror\n"); + return -1; + } - if (readl(&arasan_nand_base->intsts_reg) & - ARASAN_NAND_INT_STS_ERR_EN_MASK) { - mtd->ecc_stats.failed++; - printf("arasan rd_page:multibiterror\n"); - return -1; + if (readl(&arasan_nand_base->intsts_reg) & + ARASAN_NAND_INT_STS_ERR_EN_MASK) { + mtd->ecc_stats.failed++; + printf("arasan rd_page:multibiterror\n"); + return -1; + } } return 0; @@ -460,12 +513,14 @@ static int arasan_nand_write_page_hwecc(struct mtd_info *mtd, reg_val |= (pktnum << ARASAN_NAND_PKT_REG_PKT_CNT_SHFT) | pktsize; writel(reg_val, &arasan_nand_base->pkt_reg); - arasan_nand_enable_ecc(); - column_addr_cycles = (chip->onfi_params.addr_cycles & - ARASAN_NAND_COL_ADDR_CYCL_MASK) >> - ARASAN_NAND_COL_ADDR_CYCL_SHIFT; - writel((NAND_CMD_RNDIN | (column_addr_cycles << 28)), - &arasan_nand_base->ecc_sprcmd_reg); + if (!nand->on_die_ecc_enabled) { + arasan_nand_enable_ecc(); + column_addr_cycles = (chip->onfi_params.addr_cycles & + ARASAN_NAND_COL_ADDR_CYCL_MASK) >> + ARASAN_NAND_COL_ADDR_CYCL_SHIFT; + writel((NAND_CMD_RNDIN | (column_addr_cycles << 28)), + &arasan_nand_base->ecc_sprcmd_reg); + } writel(curr_cmd->pgm, &arasan_nand_base->pgm_reg); while (rdcount < pktnum) { @@ -1032,6 +1087,50 @@ static void arasan_nand_cmd_function(struct mtd_info *mtd, unsigned int command, printf("ERROR:%s:command:0x%x\n", __func__, curr_cmd->cmd1); } +static void arasan_check_ondie(struct mtd_info *mtd) +{ + struct nand_chip *nand_chip = mtd_to_nand(mtd); + struct arasan_nand_info *nand = nand_get_controller_data(nand_chip); + u8 maf_id, dev_id; + u8 get_feature[4]; + u8 set_feature[4] = {ENABLE_ONDIE_ECC, 0x00, 0x00, 0x00}; + u32 i; + + /* Send the command for reading device ID */ + nand_chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1); + nand_chip->cmdfunc(mtd, NAND_CMD_READID, 0, -1); + + /* Read manufacturer and device IDs */ + maf_id = nand_chip->read_byte(mtd); + dev_id = nand_chip->read_byte(mtd); + + if ((maf_id == NAND_MFR_MICRON) && + ((dev_id == 0xf1) || (dev_id == 0xa1) || (dev_id == 0xb1) || + (dev_id == 0xaa) || (dev_id == 0xba) || (dev_id == 0xda) || + (dev_id == 0xca) || (dev_id == 0xac) || (dev_id == 0xbc) || + (dev_id == 0xdc) || (dev_id == 0xcc) || (dev_id == 0xa3) || + (dev_id == 0xb3) || (dev_id == 0xd3) || (dev_id == 0xc3))) { + nand_chip->cmdfunc(mtd, NAND_CMD_SET_FEATURES, + ONDIE_ECC_FEATURE_ADDR, -1); + + nand_chip->write_buf(mtd, &set_feature[0], 4); + nand_chip->cmdfunc(mtd, NAND_CMD_GET_FEATURES, + ONDIE_ECC_FEATURE_ADDR, -1); + + for (i = 0; i < 4; i++) + get_feature[i] = nand_chip->read_byte(mtd); + + if (get_feature[0] & ENABLE_ONDIE_ECC) + nand->on_die_ecc_enabled = true; + else + printf("%s: Unable to enable OnDie ECC\n", __func__); + + /* Use the BBT pattern descriptors */ + nand_chip->bbt_td = &bbt_main_descr; + nand_chip->bbt_md = &bbt_mirror_descr; + } +} + static int arasan_nand_ecc_init(struct mtd_info *mtd) { int found = -1; @@ -1126,9 +1225,22 @@ static int arasan_nand_init(struct nand_chip *nand_chip, int devnum) nand_chip->ecc.read_oob = arasan_nand_read_oob; nand_chip->ecc.write_oob = arasan_nand_write_oob; - if (arasan_nand_ecc_init(mtd)) { - printf("%s: nand_ecc_init failed\n", __func__); - goto fail; + arasan_check_ondie(mtd); + + /* + * If on die supported, then give priority to on-die ecc and use + * it instead of controller ecc. + */ + if (nand->on_die_ecc_enabled) { + nand_chip->ecc.strength = 1; + nand_chip->ecc.size = mtd->writesize; + nand_chip->ecc.bytes = 0; + nand_chip->ecc.layout = &ondie_nand_oob_64; + } else { + if (arasan_nand_ecc_init(mtd)) { + printf("%s: nand_ecc_init failed\n", __func__); + goto fail; + } } if (nand_scan_tail(mtd)) {