1*0d24de9dSSimon Glass# 2*0d24de9dSSimon Glass# Copyright (c) 2011 The Chromium OS Authors. 3*0d24de9dSSimon Glass# 4*0d24de9dSSimon Glass# See file CREDITS for list of people who contributed to this 5*0d24de9dSSimon Glass# project. 6*0d24de9dSSimon Glass# 7*0d24de9dSSimon Glass# This program is free software; you can redistribute it and/or 8*0d24de9dSSimon Glass# modify it under the terms of the GNU General Public License as 9*0d24de9dSSimon Glass# published by the Free Software Foundation; either version 2 of 10*0d24de9dSSimon Glass# the License, or (at your option) any later version. 11*0d24de9dSSimon Glass# 12*0d24de9dSSimon Glass# This program is distributed in the hope that it will be useful, 13*0d24de9dSSimon Glass# but WITHOUT ANY WARRANTY; without even the implied warranty of 14*0d24de9dSSimon Glass# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15*0d24de9dSSimon Glass# GNU General Public License for more details. 16*0d24de9dSSimon Glass# 17*0d24de9dSSimon Glass# You should have received a copy of the GNU General Public License 18*0d24de9dSSimon Glass# along with this program; if not, write to the Free Software 19*0d24de9dSSimon Glass# Foundation, Inc., 59 Temple Place, Suite 330, Boston, 20*0d24de9dSSimon Glass# MA 02111-1307 USA 21*0d24de9dSSimon Glass# 22*0d24de9dSSimon Glass 23*0d24de9dSSimon Glassimport os 24*0d24de9dSSimon Glassimport tempfile 25*0d24de9dSSimon Glassimport unittest 26*0d24de9dSSimon Glass 27*0d24de9dSSimon Glassimport checkpatch 28*0d24de9dSSimon Glassimport gitutil 29*0d24de9dSSimon Glassimport patchstream 30*0d24de9dSSimon Glassimport series 31*0d24de9dSSimon Glass 32*0d24de9dSSimon Glass 33*0d24de9dSSimon Glassclass TestPatch(unittest.TestCase): 34*0d24de9dSSimon Glass """Test this program 35*0d24de9dSSimon Glass 36*0d24de9dSSimon Glass TODO: Write tests for the rest of the functionality 37*0d24de9dSSimon Glass """ 38*0d24de9dSSimon Glass 39*0d24de9dSSimon Glass def testBasic(self): 40*0d24de9dSSimon Glass """Test basic filter operation""" 41*0d24de9dSSimon Glass data=''' 42*0d24de9dSSimon Glass 43*0d24de9dSSimon GlassFrom 656c9a8c31fa65859d924cd21da920d6ba537fad Mon Sep 17 00:00:00 2001 44*0d24de9dSSimon GlassFrom: Simon Glass <sjg@chromium.org> 45*0d24de9dSSimon GlassDate: Thu, 28 Apr 2011 09:58:51 -0700 46*0d24de9dSSimon GlassSubject: [PATCH (resend) 3/7] Tegra2: Add more clock support 47*0d24de9dSSimon Glass 48*0d24de9dSSimon GlassThis adds functions to enable/disable clocks and reset to on-chip peripherals. 49*0d24de9dSSimon Glass 50*0d24de9dSSimon GlassBUG=chromium-os:13875 51*0d24de9dSSimon GlassTEST=build U-Boot for Seaboard, boot 52*0d24de9dSSimon Glass 53*0d24de9dSSimon GlassChange-Id: I80fe1d0c0b7dd10aa58ce5bb1d9290b6664d5413 54*0d24de9dSSimon Glass 55*0d24de9dSSimon GlassReview URL: http://codereview.chromium.org/6900006 56*0d24de9dSSimon Glass 57*0d24de9dSSimon GlassSigned-off-by: Simon Glass <sjg@chromium.org> 58*0d24de9dSSimon Glass--- 59*0d24de9dSSimon Glass arch/arm/cpu/armv7/tegra2/Makefile | 2 +- 60*0d24de9dSSimon Glass arch/arm/cpu/armv7/tegra2/ap20.c | 57 ++---- 61*0d24de9dSSimon Glass arch/arm/cpu/armv7/tegra2/clock.c | 163 +++++++++++++++++ 62*0d24de9dSSimon Glass''' 63*0d24de9dSSimon Glass expected=''' 64*0d24de9dSSimon Glass 65*0d24de9dSSimon GlassFrom 656c9a8c31fa65859d924cd21da920d6ba537fad Mon Sep 17 00:00:00 2001 66*0d24de9dSSimon GlassFrom: Simon Glass <sjg@chromium.org> 67*0d24de9dSSimon GlassDate: Thu, 28 Apr 2011 09:58:51 -0700 68*0d24de9dSSimon GlassSubject: [PATCH (resend) 3/7] Tegra2: Add more clock support 69*0d24de9dSSimon Glass 70*0d24de9dSSimon GlassThis adds functions to enable/disable clocks and reset to on-chip peripherals. 71*0d24de9dSSimon Glass 72*0d24de9dSSimon GlassSigned-off-by: Simon Glass <sjg@chromium.org> 73*0d24de9dSSimon Glass--- 74*0d24de9dSSimon Glass arch/arm/cpu/armv7/tegra2/Makefile | 2 +- 75*0d24de9dSSimon Glass arch/arm/cpu/armv7/tegra2/ap20.c | 57 ++---- 76*0d24de9dSSimon Glass arch/arm/cpu/armv7/tegra2/clock.c | 163 +++++++++++++++++ 77*0d24de9dSSimon Glass''' 78*0d24de9dSSimon Glass out = '' 79*0d24de9dSSimon Glass inhandle, inname = tempfile.mkstemp() 80*0d24de9dSSimon Glass infd = os.fdopen(inhandle, 'w') 81*0d24de9dSSimon Glass infd.write(data) 82*0d24de9dSSimon Glass infd.close() 83*0d24de9dSSimon Glass 84*0d24de9dSSimon Glass exphandle, expname = tempfile.mkstemp() 85*0d24de9dSSimon Glass expfd = os.fdopen(exphandle, 'w') 86*0d24de9dSSimon Glass expfd.write(expected) 87*0d24de9dSSimon Glass expfd.close() 88*0d24de9dSSimon Glass 89*0d24de9dSSimon Glass patchstream.FixPatch(None, inname, series.Series(), None) 90*0d24de9dSSimon Glass rc = os.system('diff -u %s %s' % (inname, expname)) 91*0d24de9dSSimon Glass self.assertEqual(rc, 0) 92*0d24de9dSSimon Glass 93*0d24de9dSSimon Glass os.remove(inname) 94*0d24de9dSSimon Glass os.remove(expname) 95*0d24de9dSSimon Glass 96*0d24de9dSSimon Glass def GetData(self, data_type): 97*0d24de9dSSimon Glass data=''' 98*0d24de9dSSimon GlassFrom 4924887af52713cabea78420eff03badea8f0035 Mon Sep 17 00:00:00 2001 99*0d24de9dSSimon GlassFrom: Simon Glass <sjg@chromium.org> 100*0d24de9dSSimon GlassDate: Thu, 7 Apr 2011 10:14:41 -0700 101*0d24de9dSSimon GlassSubject: [PATCH 1/4] Add microsecond boot time measurement 102*0d24de9dSSimon Glass 103*0d24de9dSSimon GlassThis defines the basics of a new boot time measurement feature. This allows 104*0d24de9dSSimon Glasslogging of very accurate time measurements as the boot proceeds, by using 105*0d24de9dSSimon Glassan available microsecond counter. 106*0d24de9dSSimon Glass 107*0d24de9dSSimon Glass%s 108*0d24de9dSSimon Glass--- 109*0d24de9dSSimon Glass README | 11 ++++++++ 110*0d24de9dSSimon Glass common/bootstage.c | 50 ++++++++++++++++++++++++++++++++++++ 111*0d24de9dSSimon Glass include/bootstage.h | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++ 112*0d24de9dSSimon Glass include/common.h | 8 ++++++ 113*0d24de9dSSimon Glass 5 files changed, 141 insertions(+), 0 deletions(-) 114*0d24de9dSSimon Glass create mode 100644 common/bootstage.c 115*0d24de9dSSimon Glass create mode 100644 include/bootstage.h 116*0d24de9dSSimon Glass 117*0d24de9dSSimon Glassdiff --git a/README b/README 118*0d24de9dSSimon Glassindex 6f3748d..f9e4e65 100644 119*0d24de9dSSimon Glass--- a/README 120*0d24de9dSSimon Glass+++ b/README 121*0d24de9dSSimon Glass@@ -2026,6 +2026,17 @@ The following options need to be configured: 122*0d24de9dSSimon Glass example, some LED's) on your board. At the moment, 123*0d24de9dSSimon Glass the following checkpoints are implemented: 124*0d24de9dSSimon Glass 125*0d24de9dSSimon Glass+- Time boot progress 126*0d24de9dSSimon Glass+ CONFIG_BOOTSTAGE 127*0d24de9dSSimon Glass+ 128*0d24de9dSSimon Glass+ Define this option to enable microsecond boot stage timing 129*0d24de9dSSimon Glass+ on supported platforms. For this to work your platform 130*0d24de9dSSimon Glass+ needs to define a function timer_get_us() which returns the 131*0d24de9dSSimon Glass+ number of microseconds since reset. This would normally 132*0d24de9dSSimon Glass+ be done in your SOC or board timer.c file. 133*0d24de9dSSimon Glass+ 134*0d24de9dSSimon Glass+ You can add calls to bootstage_mark() to set time markers. 135*0d24de9dSSimon Glass+ 136*0d24de9dSSimon Glass - Standalone program support: 137*0d24de9dSSimon Glass CONFIG_STANDALONE_LOAD_ADDR 138*0d24de9dSSimon Glass 139*0d24de9dSSimon Glassdiff --git a/common/bootstage.c b/common/bootstage.c 140*0d24de9dSSimon Glassnew file mode 100644 141*0d24de9dSSimon Glassindex 0000000..2234c87 142*0d24de9dSSimon Glass--- /dev/null 143*0d24de9dSSimon Glass+++ b/common/bootstage.c 144*0d24de9dSSimon Glass@@ -0,0 +1,50 @@ 145*0d24de9dSSimon Glass+/* 146*0d24de9dSSimon Glass+ * Copyright (c) 2011, Google Inc. All rights reserved. 147*0d24de9dSSimon Glass+ * 148*0d24de9dSSimon Glass+ * See file CREDITS for list of people who contributed to this 149*0d24de9dSSimon Glass+ * project. 150*0d24de9dSSimon Glass+ * 151*0d24de9dSSimon Glass+ * This program is free software; you can redistribute it and/or 152*0d24de9dSSimon Glass+ * modify it under the terms of the GNU General Public License as 153*0d24de9dSSimon Glass+ * published by the Free Software Foundation; either version 2 of 154*0d24de9dSSimon Glass+ * the License, or (at your option) any later version. 155*0d24de9dSSimon Glass+ * 156*0d24de9dSSimon Glass+ * This program is distributed in the hope that it will be useful, 157*0d24de9dSSimon Glass+ * but WITHOUT ANY WARRANTY; without even the implied warranty of 158*0d24de9dSSimon Glass+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 159*0d24de9dSSimon Glass+ * GNU General Public License for more details. 160*0d24de9dSSimon Glass+ * 161*0d24de9dSSimon Glass+ * You should have received a copy of the GNU General Public License 162*0d24de9dSSimon Glass+ * along with this program; if not, write to the Free Software 163*0d24de9dSSimon Glass+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 164*0d24de9dSSimon Glass+ * MA 02111-1307 USA 165*0d24de9dSSimon Glass+ */ 166*0d24de9dSSimon Glass+ 167*0d24de9dSSimon Glass+ 168*0d24de9dSSimon Glass+/* 169*0d24de9dSSimon Glass+ * This module records the progress of boot and arbitrary commands, and 170*0d24de9dSSimon Glass+ * permits accurate timestamping of each. The records can optionally be 171*0d24de9dSSimon Glass+ * passed to kernel in the ATAGs 172*0d24de9dSSimon Glass+ */ 173*0d24de9dSSimon Glass+ 174*0d24de9dSSimon Glass+#include <common.h> 175*0d24de9dSSimon Glass+ 176*0d24de9dSSimon Glass+ 177*0d24de9dSSimon Glass+struct bootstage_record { 178*0d24de9dSSimon Glass+ uint32_t time_us; 179*0d24de9dSSimon Glass+ const char *name; 180*0d24de9dSSimon Glass+}; 181*0d24de9dSSimon Glass+ 182*0d24de9dSSimon Glass+static struct bootstage_record record[BOOTSTAGE_COUNT]; 183*0d24de9dSSimon Glass+ 184*0d24de9dSSimon Glass+uint32_t bootstage_mark(enum bootstage_id id, const char *name) 185*0d24de9dSSimon Glass+{ 186*0d24de9dSSimon Glass+ struct bootstage_record *rec = &record[id]; 187*0d24de9dSSimon Glass+ 188*0d24de9dSSimon Glass+ /* Only record the first event for each */ 189*0d24de9dSSimon Glass+%sif (!rec->name) { 190*0d24de9dSSimon Glass+ rec->time_us = (uint32_t)timer_get_us(); 191*0d24de9dSSimon Glass+ rec->name = name; 192*0d24de9dSSimon Glass+ } 193*0d24de9dSSimon Glass+%sreturn rec->time_us; 194*0d24de9dSSimon Glass+} 195*0d24de9dSSimon Glass-- 196*0d24de9dSSimon Glass1.7.3.1 197*0d24de9dSSimon Glass''' 198*0d24de9dSSimon Glass signoff = 'Signed-off-by: Simon Glass <sjg@chromium.org>\n' 199*0d24de9dSSimon Glass tab = ' ' 200*0d24de9dSSimon Glass if data_type == 'good': 201*0d24de9dSSimon Glass pass 202*0d24de9dSSimon Glass elif data_type == 'no-signoff': 203*0d24de9dSSimon Glass signoff = '' 204*0d24de9dSSimon Glass elif data_type == 'spaces': 205*0d24de9dSSimon Glass tab = ' ' 206*0d24de9dSSimon Glass else: 207*0d24de9dSSimon Glass print 'not implemented' 208*0d24de9dSSimon Glass return data % (signoff, tab, tab) 209*0d24de9dSSimon Glass 210*0d24de9dSSimon Glass def SetupData(self, data_type): 211*0d24de9dSSimon Glass inhandle, inname = tempfile.mkstemp() 212*0d24de9dSSimon Glass infd = os.fdopen(inhandle, 'w') 213*0d24de9dSSimon Glass data = self.GetData(data_type) 214*0d24de9dSSimon Glass infd.write(data) 215*0d24de9dSSimon Glass infd.close() 216*0d24de9dSSimon Glass return inname 217*0d24de9dSSimon Glass 218*0d24de9dSSimon Glass def testCheckpatch(self): 219*0d24de9dSSimon Glass """Test checkpatch operation""" 220*0d24de9dSSimon Glass inf = self.SetupData('good') 221*0d24de9dSSimon Glass result, problems, err, warn, lines, stdout = checkpatch.CheckPatch(inf) 222*0d24de9dSSimon Glass self.assertEqual(result, True) 223*0d24de9dSSimon Glass self.assertEqual(problems, []) 224*0d24de9dSSimon Glass self.assertEqual(err, 0) 225*0d24de9dSSimon Glass self.assertEqual(warn, 0) 226*0d24de9dSSimon Glass self.assertEqual(lines, 67) 227*0d24de9dSSimon Glass os.remove(inf) 228*0d24de9dSSimon Glass 229*0d24de9dSSimon Glass inf = self.SetupData('no-signoff') 230*0d24de9dSSimon Glass result, problems, err, warn, lines, stdout = checkpatch.CheckPatch(inf) 231*0d24de9dSSimon Glass self.assertEqual(result, False) 232*0d24de9dSSimon Glass self.assertEqual(len(problems), 1) 233*0d24de9dSSimon Glass self.assertEqual(err, 1) 234*0d24de9dSSimon Glass self.assertEqual(warn, 0) 235*0d24de9dSSimon Glass self.assertEqual(lines, 67) 236*0d24de9dSSimon Glass os.remove(inf) 237*0d24de9dSSimon Glass 238*0d24de9dSSimon Glass inf = self.SetupData('spaces') 239*0d24de9dSSimon Glass result, problems, err, warn, lines, stdout = checkpatch.CheckPatch(inf) 240*0d24de9dSSimon Glass self.assertEqual(result, False) 241*0d24de9dSSimon Glass self.assertEqual(len(problems), 2) 242*0d24de9dSSimon Glass self.assertEqual(err, 0) 243*0d24de9dSSimon Glass self.assertEqual(warn, 2) 244*0d24de9dSSimon Glass self.assertEqual(lines, 67) 245*0d24de9dSSimon Glass os.remove(inf) 246*0d24de9dSSimon Glass 247*0d24de9dSSimon Glass 248*0d24de9dSSimon Glassif __name__ == "__main__": 249*0d24de9dSSimon Glass unittest.main() 250*0d24de9dSSimon Glass gitutil.RunTests() 251