1*2eb5fc13SSimon Glass# -*- coding: utf-8 -*- 20d24de9dSSimon Glass# 30d24de9dSSimon Glass# Copyright (c) 2011 The Chromium OS Authors. 40d24de9dSSimon Glass# 51a459660SWolfgang Denk# SPDX-License-Identifier: GPL-2.0+ 60d24de9dSSimon Glass# 70d24de9dSSimon Glass 80d24de9dSSimon Glassimport os 90d24de9dSSimon Glassimport tempfile 100d24de9dSSimon Glassimport unittest 110d24de9dSSimon Glass 120d24de9dSSimon Glassimport checkpatch 130d24de9dSSimon Glassimport gitutil 140d24de9dSSimon Glassimport patchstream 150d24de9dSSimon Glassimport series 160d24de9dSSimon Glass 170d24de9dSSimon Glass 180d24de9dSSimon Glassclass TestPatch(unittest.TestCase): 190d24de9dSSimon Glass """Test this program 200d24de9dSSimon Glass 210d24de9dSSimon Glass TODO: Write tests for the rest of the functionality 220d24de9dSSimon Glass """ 230d24de9dSSimon Glass 240d24de9dSSimon Glass def testBasic(self): 250d24de9dSSimon Glass """Test basic filter operation""" 260d24de9dSSimon Glass data=''' 270d24de9dSSimon Glass 280d24de9dSSimon GlassFrom 656c9a8c31fa65859d924cd21da920d6ba537fad Mon Sep 17 00:00:00 2001 290d24de9dSSimon GlassFrom: Simon Glass <sjg@chromium.org> 300d24de9dSSimon GlassDate: Thu, 28 Apr 2011 09:58:51 -0700 310d24de9dSSimon GlassSubject: [PATCH (resend) 3/7] Tegra2: Add more clock support 320d24de9dSSimon Glass 330d24de9dSSimon GlassThis adds functions to enable/disable clocks and reset to on-chip peripherals. 340d24de9dSSimon Glass 35*2eb5fc13SSimon Glasscmd/pci.c:152:11: warning: format ‘%llx’ expects argument of type 36*2eb5fc13SSimon Glass ‘long long unsigned int’, but argument 3 has type 37*2eb5fc13SSimon Glass ‘u64 {aka long unsigned int}’ [-Wformat=] 38*2eb5fc13SSimon Glass 390d24de9dSSimon GlassBUG=chromium-os:13875 400d24de9dSSimon GlassTEST=build U-Boot for Seaboard, boot 410d24de9dSSimon Glass 420d24de9dSSimon GlassChange-Id: I80fe1d0c0b7dd10aa58ce5bb1d9290b6664d5413 430d24de9dSSimon Glass 440d24de9dSSimon GlassReview URL: http://codereview.chromium.org/6900006 450d24de9dSSimon Glass 460d24de9dSSimon GlassSigned-off-by: Simon Glass <sjg@chromium.org> 470d24de9dSSimon Glass--- 480d24de9dSSimon Glass arch/arm/cpu/armv7/tegra2/Makefile | 2 +- 490d24de9dSSimon Glass arch/arm/cpu/armv7/tegra2/ap20.c | 57 ++---- 500d24de9dSSimon Glass arch/arm/cpu/armv7/tegra2/clock.c | 163 +++++++++++++++++ 510d24de9dSSimon Glass''' 520d24de9dSSimon Glass expected=''' 530d24de9dSSimon Glass 540d24de9dSSimon GlassFrom 656c9a8c31fa65859d924cd21da920d6ba537fad Mon Sep 17 00:00:00 2001 550d24de9dSSimon GlassFrom: Simon Glass <sjg@chromium.org> 560d24de9dSSimon GlassDate: Thu, 28 Apr 2011 09:58:51 -0700 570d24de9dSSimon GlassSubject: [PATCH (resend) 3/7] Tegra2: Add more clock support 580d24de9dSSimon Glass 590d24de9dSSimon GlassThis adds functions to enable/disable clocks and reset to on-chip peripherals. 600d24de9dSSimon Glass 61*2eb5fc13SSimon Glasscmd/pci.c:152:11: warning: format ‘%llx’ expects argument of type 62*2eb5fc13SSimon Glass ‘long long unsigned int’, but argument 3 has type 63*2eb5fc13SSimon Glass ‘u64 {aka long unsigned int}’ [-Wformat=] 64*2eb5fc13SSimon Glass 650d24de9dSSimon GlassSigned-off-by: Simon Glass <sjg@chromium.org> 660d24de9dSSimon Glass--- 67e752edcbSSimon Glass 680d24de9dSSimon Glass arch/arm/cpu/armv7/tegra2/Makefile | 2 +- 690d24de9dSSimon Glass arch/arm/cpu/armv7/tegra2/ap20.c | 57 ++---- 700d24de9dSSimon Glass arch/arm/cpu/armv7/tegra2/clock.c | 163 +++++++++++++++++ 710d24de9dSSimon Glass''' 720d24de9dSSimon Glass out = '' 730d24de9dSSimon Glass inhandle, inname = tempfile.mkstemp() 740d24de9dSSimon Glass infd = os.fdopen(inhandle, 'w') 750d24de9dSSimon Glass infd.write(data) 760d24de9dSSimon Glass infd.close() 770d24de9dSSimon Glass 780d24de9dSSimon Glass exphandle, expname = tempfile.mkstemp() 790d24de9dSSimon Glass expfd = os.fdopen(exphandle, 'w') 800d24de9dSSimon Glass expfd.write(expected) 810d24de9dSSimon Glass expfd.close() 820d24de9dSSimon Glass 830d24de9dSSimon Glass patchstream.FixPatch(None, inname, series.Series(), None) 840d24de9dSSimon Glass rc = os.system('diff -u %s %s' % (inname, expname)) 850d24de9dSSimon Glass self.assertEqual(rc, 0) 860d24de9dSSimon Glass 870d24de9dSSimon Glass os.remove(inname) 880d24de9dSSimon Glass os.remove(expname) 890d24de9dSSimon Glass 900d24de9dSSimon Glass def GetData(self, data_type): 910d24de9dSSimon Glass data=''' 920d24de9dSSimon GlassFrom 4924887af52713cabea78420eff03badea8f0035 Mon Sep 17 00:00:00 2001 930d24de9dSSimon GlassFrom: Simon Glass <sjg@chromium.org> 940d24de9dSSimon GlassDate: Thu, 7 Apr 2011 10:14:41 -0700 950d24de9dSSimon GlassSubject: [PATCH 1/4] Add microsecond boot time measurement 960d24de9dSSimon Glass 970d24de9dSSimon GlassThis defines the basics of a new boot time measurement feature. This allows 980d24de9dSSimon Glasslogging of very accurate time measurements as the boot proceeds, by using 990d24de9dSSimon Glassan available microsecond counter. 1000d24de9dSSimon Glass 1010d24de9dSSimon Glass%s 1020d24de9dSSimon Glass--- 1030d24de9dSSimon Glass README | 11 ++++++++ 1040d24de9dSSimon Glass common/bootstage.c | 50 ++++++++++++++++++++++++++++++++++++ 1050d24de9dSSimon Glass include/bootstage.h | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1060d24de9dSSimon Glass include/common.h | 8 ++++++ 1070d24de9dSSimon Glass 5 files changed, 141 insertions(+), 0 deletions(-) 1080d24de9dSSimon Glass create mode 100644 common/bootstage.c 1090d24de9dSSimon Glass create mode 100644 include/bootstage.h 1100d24de9dSSimon Glass 1110d24de9dSSimon Glassdiff --git a/README b/README 1120d24de9dSSimon Glassindex 6f3748d..f9e4e65 100644 1130d24de9dSSimon Glass--- a/README 1140d24de9dSSimon Glass+++ b/README 1150d24de9dSSimon Glass@@ -2026,6 +2026,17 @@ The following options need to be configured: 1160d24de9dSSimon Glass example, some LED's) on your board. At the moment, 1170d24de9dSSimon Glass the following checkpoints are implemented: 1180d24de9dSSimon Glass 1190d24de9dSSimon Glass+- Time boot progress 1200d24de9dSSimon Glass+ CONFIG_BOOTSTAGE 1210d24de9dSSimon Glass+ 1220d24de9dSSimon Glass+ Define this option to enable microsecond boot stage timing 1230d24de9dSSimon Glass+ on supported platforms. For this to work your platform 1240d24de9dSSimon Glass+ needs to define a function timer_get_us() which returns the 1250d24de9dSSimon Glass+ number of microseconds since reset. This would normally 1260d24de9dSSimon Glass+ be done in your SOC or board timer.c file. 1270d24de9dSSimon Glass+ 1280d24de9dSSimon Glass+ You can add calls to bootstage_mark() to set time markers. 1290d24de9dSSimon Glass+ 1300d24de9dSSimon Glass - Standalone program support: 1310d24de9dSSimon Glass CONFIG_STANDALONE_LOAD_ADDR 1320d24de9dSSimon Glass 1330d24de9dSSimon Glassdiff --git a/common/bootstage.c b/common/bootstage.c 1340d24de9dSSimon Glassnew file mode 100644 1350d24de9dSSimon Glassindex 0000000..2234c87 1360d24de9dSSimon Glass--- /dev/null 1370d24de9dSSimon Glass+++ b/common/bootstage.c 1381a459660SWolfgang Denk@@ -0,0 +1,39 @@ 1390d24de9dSSimon Glass+/* 1400d24de9dSSimon Glass+ * Copyright (c) 2011, Google Inc. All rights reserved. 1410d24de9dSSimon Glass+ * 1421a459660SWolfgang Denk+ * SPDX-License-Identifier: GPL-2.0+ 1430d24de9dSSimon Glass+ */ 1440d24de9dSSimon Glass+ 1450d24de9dSSimon Glass+ 1460d24de9dSSimon Glass+/* 1470d24de9dSSimon Glass+ * This module records the progress of boot and arbitrary commands, and 1480d24de9dSSimon Glass+ * permits accurate timestamping of each. The records can optionally be 1490d24de9dSSimon Glass+ * passed to kernel in the ATAGs 1500d24de9dSSimon Glass+ */ 1510d24de9dSSimon Glass+ 1520d24de9dSSimon Glass+#include <common.h> 1530d24de9dSSimon Glass+ 1540d24de9dSSimon Glass+ 1550d24de9dSSimon Glass+struct bootstage_record { 1560d24de9dSSimon Glass+ uint32_t time_us; 1570d24de9dSSimon Glass+ const char *name; 1580d24de9dSSimon Glass+}; 1590d24de9dSSimon Glass+ 1600d24de9dSSimon Glass+static struct bootstage_record record[BOOTSTAGE_COUNT]; 1610d24de9dSSimon Glass+ 1620d24de9dSSimon Glass+uint32_t bootstage_mark(enum bootstage_id id, const char *name) 1630d24de9dSSimon Glass+{ 1640d24de9dSSimon Glass+ struct bootstage_record *rec = &record[id]; 1650d24de9dSSimon Glass+ 1660d24de9dSSimon Glass+ /* Only record the first event for each */ 1670d24de9dSSimon Glass+%sif (!rec->name) { 1680d24de9dSSimon Glass+ rec->time_us = (uint32_t)timer_get_us(); 1690d24de9dSSimon Glass+ rec->name = name; 1700d24de9dSSimon Glass+ } 171d29fe6e2SSimon Glass+ if (!rec->name && 172d29fe6e2SSimon Glass+ %ssomething_else) { 173d29fe6e2SSimon Glass+ rec->time_us = (uint32_t)timer_get_us(); 174d29fe6e2SSimon Glass+ rec->name = name; 175d29fe6e2SSimon Glass+ } 1760d24de9dSSimon Glass+%sreturn rec->time_us; 1770d24de9dSSimon Glass+} 1780d24de9dSSimon Glass-- 1790d24de9dSSimon Glass1.7.3.1 1800d24de9dSSimon Glass''' 1810d24de9dSSimon Glass signoff = 'Signed-off-by: Simon Glass <sjg@chromium.org>\n' 1820d24de9dSSimon Glass tab = ' ' 183d29fe6e2SSimon Glass indent = ' ' 1840d24de9dSSimon Glass if data_type == 'good': 1850d24de9dSSimon Glass pass 1860d24de9dSSimon Glass elif data_type == 'no-signoff': 1870d24de9dSSimon Glass signoff = '' 1880d24de9dSSimon Glass elif data_type == 'spaces': 1890d24de9dSSimon Glass tab = ' ' 190d29fe6e2SSimon Glass elif data_type == 'indent': 191d29fe6e2SSimon Glass indent = tab 1920d24de9dSSimon Glass else: 193a920a17bSPaul Burton print('not implemented') 194d29fe6e2SSimon Glass return data % (signoff, tab, indent, tab) 1950d24de9dSSimon Glass 1960d24de9dSSimon Glass def SetupData(self, data_type): 1970d24de9dSSimon Glass inhandle, inname = tempfile.mkstemp() 1980d24de9dSSimon Glass infd = os.fdopen(inhandle, 'w') 1990d24de9dSSimon Glass data = self.GetData(data_type) 2000d24de9dSSimon Glass infd.write(data) 2010d24de9dSSimon Glass infd.close() 2020d24de9dSSimon Glass return inname 2030d24de9dSSimon Glass 204d29fe6e2SSimon Glass def testGood(self): 2050d24de9dSSimon Glass """Test checkpatch operation""" 2060d24de9dSSimon Glass inf = self.SetupData('good') 207d29fe6e2SSimon Glass result = checkpatch.CheckPatch(inf) 208d29fe6e2SSimon Glass self.assertEqual(result.ok, True) 209d29fe6e2SSimon Glass self.assertEqual(result.problems, []) 210d29fe6e2SSimon Glass self.assertEqual(result.errors, 0) 211d29fe6e2SSimon Glass self.assertEqual(result.warnings, 0) 212d29fe6e2SSimon Glass self.assertEqual(result.checks, 0) 213e752edcbSSimon Glass self.assertEqual(result.lines, 56) 2140d24de9dSSimon Glass os.remove(inf) 2150d24de9dSSimon Glass 216d29fe6e2SSimon Glass def testNoSignoff(self): 2170d24de9dSSimon Glass inf = self.SetupData('no-signoff') 218d29fe6e2SSimon Glass result = checkpatch.CheckPatch(inf) 219d29fe6e2SSimon Glass self.assertEqual(result.ok, False) 220d29fe6e2SSimon Glass self.assertEqual(len(result.problems), 1) 221d29fe6e2SSimon Glass self.assertEqual(result.errors, 1) 222d29fe6e2SSimon Glass self.assertEqual(result.warnings, 0) 223d29fe6e2SSimon Glass self.assertEqual(result.checks, 0) 224e752edcbSSimon Glass self.assertEqual(result.lines, 56) 2250d24de9dSSimon Glass os.remove(inf) 2260d24de9dSSimon Glass 227d29fe6e2SSimon Glass def testSpaces(self): 2280d24de9dSSimon Glass inf = self.SetupData('spaces') 229d29fe6e2SSimon Glass result = checkpatch.CheckPatch(inf) 230d29fe6e2SSimon Glass self.assertEqual(result.ok, False) 231e752edcbSSimon Glass self.assertEqual(len(result.problems), 2) 232d29fe6e2SSimon Glass self.assertEqual(result.errors, 0) 233e752edcbSSimon Glass self.assertEqual(result.warnings, 2) 234d29fe6e2SSimon Glass self.assertEqual(result.checks, 0) 235e752edcbSSimon Glass self.assertEqual(result.lines, 56) 236d29fe6e2SSimon Glass os.remove(inf) 237d29fe6e2SSimon Glass 238d29fe6e2SSimon Glass def testIndent(self): 239d29fe6e2SSimon Glass inf = self.SetupData('indent') 240d29fe6e2SSimon Glass result = checkpatch.CheckPatch(inf) 241d29fe6e2SSimon Glass self.assertEqual(result.ok, False) 242d29fe6e2SSimon Glass self.assertEqual(len(result.problems), 1) 243d29fe6e2SSimon Glass self.assertEqual(result.errors, 0) 244d29fe6e2SSimon Glass self.assertEqual(result.warnings, 0) 245d29fe6e2SSimon Glass self.assertEqual(result.checks, 1) 246e752edcbSSimon Glass self.assertEqual(result.lines, 56) 2470d24de9dSSimon Glass os.remove(inf) 2480d24de9dSSimon Glass 2490d24de9dSSimon Glass 2500d24de9dSSimon Glassif __name__ == "__main__": 2510d24de9dSSimon Glass unittest.main() 2520d24de9dSSimon Glass gitutil.RunTests() 253