1*4882a593Smuzhiyun# -*- coding: utf-8 -*- 2*4882a593Smuzhiyun# 3*4882a593Smuzhiyun# Copyright (c) 2011 The Chromium OS Authors. 4*4882a593Smuzhiyun# 5*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0+ 6*4882a593Smuzhiyun# 7*4882a593Smuzhiyun 8*4882a593Smuzhiyunimport os 9*4882a593Smuzhiyunimport tempfile 10*4882a593Smuzhiyunimport unittest 11*4882a593Smuzhiyun 12*4882a593Smuzhiyunimport checkpatch 13*4882a593Smuzhiyunimport gitutil 14*4882a593Smuzhiyunimport patchstream 15*4882a593Smuzhiyunimport series 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun 18*4882a593Smuzhiyunclass TestPatch(unittest.TestCase): 19*4882a593Smuzhiyun """Test this program 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun TODO: Write tests for the rest of the functionality 22*4882a593Smuzhiyun """ 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun def testBasic(self): 25*4882a593Smuzhiyun """Test basic filter operation""" 26*4882a593Smuzhiyun data=''' 27*4882a593Smuzhiyun 28*4882a593SmuzhiyunFrom 656c9a8c31fa65859d924cd21da920d6ba537fad Mon Sep 17 00:00:00 2001 29*4882a593SmuzhiyunFrom: Simon Glass <sjg@chromium.org> 30*4882a593SmuzhiyunDate: Thu, 28 Apr 2011 09:58:51 -0700 31*4882a593SmuzhiyunSubject: [PATCH (resend) 3/7] Tegra2: Add more clock support 32*4882a593Smuzhiyun 33*4882a593SmuzhiyunThis adds functions to enable/disable clocks and reset to on-chip peripherals. 34*4882a593Smuzhiyun 35*4882a593Smuzhiyuncmd/pci.c:152:11: warning: format ‘%llx’ expects argument of type 36*4882a593Smuzhiyun ‘long long unsigned int’, but argument 3 has type 37*4882a593Smuzhiyun ‘u64 {aka long unsigned int}’ [-Wformat=] 38*4882a593Smuzhiyun 39*4882a593SmuzhiyunBUG=chromium-os:13875 40*4882a593SmuzhiyunTEST=build U-Boot for Seaboard, boot 41*4882a593Smuzhiyun 42*4882a593SmuzhiyunChange-Id: I80fe1d0c0b7dd10aa58ce5bb1d9290b6664d5413 43*4882a593Smuzhiyun 44*4882a593SmuzhiyunReview URL: http://codereview.chromium.org/6900006 45*4882a593Smuzhiyun 46*4882a593SmuzhiyunSigned-off-by: Simon Glass <sjg@chromium.org> 47*4882a593Smuzhiyun--- 48*4882a593Smuzhiyun arch/arm/cpu/armv7/tegra2/Makefile | 2 +- 49*4882a593Smuzhiyun arch/arm/cpu/armv7/tegra2/ap20.c | 57 ++---- 50*4882a593Smuzhiyun arch/arm/cpu/armv7/tegra2/clock.c | 163 +++++++++++++++++ 51*4882a593Smuzhiyun''' 52*4882a593Smuzhiyun expected=''' 53*4882a593Smuzhiyun 54*4882a593SmuzhiyunFrom 656c9a8c31fa65859d924cd21da920d6ba537fad Mon Sep 17 00:00:00 2001 55*4882a593SmuzhiyunFrom: Simon Glass <sjg@chromium.org> 56*4882a593SmuzhiyunDate: Thu, 28 Apr 2011 09:58:51 -0700 57*4882a593SmuzhiyunSubject: [PATCH (resend) 3/7] Tegra2: Add more clock support 58*4882a593Smuzhiyun 59*4882a593SmuzhiyunThis adds functions to enable/disable clocks and reset to on-chip peripherals. 60*4882a593Smuzhiyun 61*4882a593Smuzhiyuncmd/pci.c:152:11: warning: format ‘%llx’ expects argument of type 62*4882a593Smuzhiyun ‘long long unsigned int’, but argument 3 has type 63*4882a593Smuzhiyun ‘u64 {aka long unsigned int}’ [-Wformat=] 64*4882a593Smuzhiyun 65*4882a593SmuzhiyunSigned-off-by: Simon Glass <sjg@chromium.org> 66*4882a593Smuzhiyun--- 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun arch/arm/cpu/armv7/tegra2/Makefile | 2 +- 69*4882a593Smuzhiyun arch/arm/cpu/armv7/tegra2/ap20.c | 57 ++---- 70*4882a593Smuzhiyun arch/arm/cpu/armv7/tegra2/clock.c | 163 +++++++++++++++++ 71*4882a593Smuzhiyun''' 72*4882a593Smuzhiyun out = '' 73*4882a593Smuzhiyun inhandle, inname = tempfile.mkstemp() 74*4882a593Smuzhiyun infd = os.fdopen(inhandle, 'w') 75*4882a593Smuzhiyun infd.write(data) 76*4882a593Smuzhiyun infd.close() 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun exphandle, expname = tempfile.mkstemp() 79*4882a593Smuzhiyun expfd = os.fdopen(exphandle, 'w') 80*4882a593Smuzhiyun expfd.write(expected) 81*4882a593Smuzhiyun expfd.close() 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun patchstream.FixPatch(None, inname, series.Series(), None) 84*4882a593Smuzhiyun rc = os.system('diff -u %s %s' % (inname, expname)) 85*4882a593Smuzhiyun self.assertEqual(rc, 0) 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun os.remove(inname) 88*4882a593Smuzhiyun os.remove(expname) 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun def GetData(self, data_type): 91*4882a593Smuzhiyun data='''From 4924887af52713cabea78420eff03badea8f0035 Mon Sep 17 00:00:00 2001 92*4882a593SmuzhiyunFrom: Simon Glass <sjg@chromium.org> 93*4882a593SmuzhiyunDate: Thu, 7 Apr 2011 10:14:41 -0700 94*4882a593SmuzhiyunSubject: [PATCH 1/4] Add microsecond boot time measurement 95*4882a593Smuzhiyun 96*4882a593SmuzhiyunThis defines the basics of a new boot time measurement feature. This allows 97*4882a593Smuzhiyunlogging of very accurate time measurements as the boot proceeds, by using 98*4882a593Smuzhiyunan available microsecond counter. 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun%s 101*4882a593Smuzhiyun--- 102*4882a593Smuzhiyun README | 11 ++++++++ 103*4882a593Smuzhiyun MAINTAINERS | 3 ++ 104*4882a593Smuzhiyun common/bootstage.c | 50 ++++++++++++++++++++++++++++++++++++ 105*4882a593Smuzhiyun include/bootstage.h | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++ 106*4882a593Smuzhiyun include/common.h | 8 ++++++ 107*4882a593Smuzhiyun 5 files changed, 141 insertions(+), 0 deletions(-) 108*4882a593Smuzhiyun create mode 100644 common/bootstage.c 109*4882a593Smuzhiyun create mode 100644 include/bootstage.h 110*4882a593Smuzhiyun 111*4882a593Smuzhiyundiff --git a/README b/README 112*4882a593Smuzhiyunindex 6f3748d..f9e4e65 100644 113*4882a593Smuzhiyun--- a/README 114*4882a593Smuzhiyun+++ b/README 115*4882a593Smuzhiyun@@ -2026,6 +2026,17 @@ The following options need to be configured: 116*4882a593Smuzhiyun example, some LED's) on your board. At the moment, 117*4882a593Smuzhiyun the following checkpoints are implemented: 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun+- Time boot progress 120*4882a593Smuzhiyun+ CONFIG_BOOTSTAGE 121*4882a593Smuzhiyun+ 122*4882a593Smuzhiyun+ Define this option to enable microsecond boot stage timing 123*4882a593Smuzhiyun+ on supported platforms. For this to work your platform 124*4882a593Smuzhiyun+ needs to define a function timer_get_us() which returns the 125*4882a593Smuzhiyun+ number of microseconds since reset. This would normally 126*4882a593Smuzhiyun+ be done in your SOC or board timer.c file. 127*4882a593Smuzhiyun+ 128*4882a593Smuzhiyun+ You can add calls to bootstage_mark() to set time markers. 129*4882a593Smuzhiyun+ 130*4882a593Smuzhiyun - Standalone program support: 131*4882a593Smuzhiyun CONFIG_STANDALONE_LOAD_ADDR 132*4882a593Smuzhiyun 133*4882a593Smuzhiyundiff --git a/MAINTAINERS b/MAINTAINERS 134*4882a593Smuzhiyunindex b167b028ec..beb7dc634f 100644 135*4882a593Smuzhiyun--- a/MAINTAINERS 136*4882a593Smuzhiyun+++ b/MAINTAINERS 137*4882a593Smuzhiyun@@ -474,3 +474,8 @@ S: Maintained 138*4882a593Smuzhiyun T: git git://git.denx.de/u-boot.git 139*4882a593Smuzhiyun F: * 140*4882a593Smuzhiyun F: */ 141*4882a593Smuzhiyun+ 142*4882a593Smuzhiyun+BOOTSTAGE 143*4882a593Smuzhiyun+M: Simon Glass <sjg@chromium.org> 144*4882a593Smuzhiyun+L: u-boot@lists.denx.de 145*4882a593Smuzhiyun+F: common/bootstage.c 146*4882a593Smuzhiyundiff --git a/common/bootstage.c b/common/bootstage.c 147*4882a593Smuzhiyunnew file mode 100644 148*4882a593Smuzhiyunindex 0000000..2234c87 149*4882a593Smuzhiyun--- /dev/null 150*4882a593Smuzhiyun+++ b/common/bootstage.c 151*4882a593Smuzhiyun@@ -0,0 +1,37 @@ 152*4882a593Smuzhiyun+/* 153*4882a593Smuzhiyun+ * Copyright (c) 2011, Google Inc. All rights reserved. 154*4882a593Smuzhiyun+ * 155*4882a593Smuzhiyun+ * SPDX-License-Identifier: GPL-2.0+ 156*4882a593Smuzhiyun+ */ 157*4882a593Smuzhiyun+ 158*4882a593Smuzhiyun+/* 159*4882a593Smuzhiyun+ * This module records the progress of boot and arbitrary commands, and 160*4882a593Smuzhiyun+ * permits accurate timestamping of each. The records can optionally be 161*4882a593Smuzhiyun+ * passed to kernel in the ATAGs 162*4882a593Smuzhiyun+ */ 163*4882a593Smuzhiyun+ 164*4882a593Smuzhiyun+#include <common.h> 165*4882a593Smuzhiyun+ 166*4882a593Smuzhiyun+struct bootstage_record { 167*4882a593Smuzhiyun+ u32 time_us; 168*4882a593Smuzhiyun+ const char *name; 169*4882a593Smuzhiyun+}; 170*4882a593Smuzhiyun+ 171*4882a593Smuzhiyun+static struct bootstage_record record[BOOTSTAGE_COUNT]; 172*4882a593Smuzhiyun+ 173*4882a593Smuzhiyun+u32 bootstage_mark(enum bootstage_id id, const char *name) 174*4882a593Smuzhiyun+{ 175*4882a593Smuzhiyun+ struct bootstage_record *rec = &record[id]; 176*4882a593Smuzhiyun+ 177*4882a593Smuzhiyun+ /* Only record the first event for each */ 178*4882a593Smuzhiyun+%sif (!rec->name) { 179*4882a593Smuzhiyun+ rec->time_us = (u32)timer_get_us(); 180*4882a593Smuzhiyun+ rec->name = name; 181*4882a593Smuzhiyun+ } 182*4882a593Smuzhiyun+ if (!rec->name && 183*4882a593Smuzhiyun+ %ssomething_else) { 184*4882a593Smuzhiyun+ rec->time_us = (u32)timer_get_us(); 185*4882a593Smuzhiyun+ rec->name = name; 186*4882a593Smuzhiyun+ } 187*4882a593Smuzhiyun+%sreturn rec->time_us; 188*4882a593Smuzhiyun+} 189*4882a593Smuzhiyun-- 190*4882a593Smuzhiyun1.7.3.1 191*4882a593Smuzhiyun''' 192*4882a593Smuzhiyun signoff = 'Signed-off-by: Simon Glass <sjg@chromium.org>\n' 193*4882a593Smuzhiyun tab = ' ' 194*4882a593Smuzhiyun indent = ' ' 195*4882a593Smuzhiyun if data_type == 'good': 196*4882a593Smuzhiyun pass 197*4882a593Smuzhiyun elif data_type == 'no-signoff': 198*4882a593Smuzhiyun signoff = '' 199*4882a593Smuzhiyun elif data_type == 'spaces': 200*4882a593Smuzhiyun tab = ' ' 201*4882a593Smuzhiyun elif data_type == 'indent': 202*4882a593Smuzhiyun indent = tab 203*4882a593Smuzhiyun else: 204*4882a593Smuzhiyun print('not implemented') 205*4882a593Smuzhiyun return data % (signoff, tab, indent, tab) 206*4882a593Smuzhiyun 207*4882a593Smuzhiyun def SetupData(self, data_type): 208*4882a593Smuzhiyun inhandle, inname = tempfile.mkstemp() 209*4882a593Smuzhiyun infd = os.fdopen(inhandle, 'w') 210*4882a593Smuzhiyun data = self.GetData(data_type) 211*4882a593Smuzhiyun infd.write(data) 212*4882a593Smuzhiyun infd.close() 213*4882a593Smuzhiyun return inname 214*4882a593Smuzhiyun 215*4882a593Smuzhiyun def testGood(self): 216*4882a593Smuzhiyun """Test checkpatch operation""" 217*4882a593Smuzhiyun inf = self.SetupData('good') 218*4882a593Smuzhiyun result = checkpatch.CheckPatch(inf) 219*4882a593Smuzhiyun self.assertEqual(result.ok, True) 220*4882a593Smuzhiyun self.assertEqual(result.problems, []) 221*4882a593Smuzhiyun self.assertEqual(result.errors, 0) 222*4882a593Smuzhiyun self.assertEqual(result.warnings, 0) 223*4882a593Smuzhiyun self.assertEqual(result.checks, 0) 224*4882a593Smuzhiyun self.assertEqual(result.lines, 62) 225*4882a593Smuzhiyun os.remove(inf) 226*4882a593Smuzhiyun 227*4882a593Smuzhiyun def testNoSignoff(self): 228*4882a593Smuzhiyun inf = self.SetupData('no-signoff') 229*4882a593Smuzhiyun result = checkpatch.CheckPatch(inf) 230*4882a593Smuzhiyun self.assertEqual(result.ok, False) 231*4882a593Smuzhiyun self.assertEqual(len(result.problems), 1) 232*4882a593Smuzhiyun self.assertEqual(result.errors, 1) 233*4882a593Smuzhiyun self.assertEqual(result.warnings, 0) 234*4882a593Smuzhiyun self.assertEqual(result.checks, 0) 235*4882a593Smuzhiyun self.assertEqual(result.lines, 62) 236*4882a593Smuzhiyun os.remove(inf) 237*4882a593Smuzhiyun 238*4882a593Smuzhiyun def testSpaces(self): 239*4882a593Smuzhiyun inf = self.SetupData('spaces') 240*4882a593Smuzhiyun result = checkpatch.CheckPatch(inf) 241*4882a593Smuzhiyun self.assertEqual(result.ok, False) 242*4882a593Smuzhiyun self.assertEqual(len(result.problems), 3) 243*4882a593Smuzhiyun self.assertEqual(result.errors, 0) 244*4882a593Smuzhiyun self.assertEqual(result.warnings, 3) 245*4882a593Smuzhiyun self.assertEqual(result.checks, 0) 246*4882a593Smuzhiyun self.assertEqual(result.lines, 62) 247*4882a593Smuzhiyun os.remove(inf) 248*4882a593Smuzhiyun 249*4882a593Smuzhiyun def testIndent(self): 250*4882a593Smuzhiyun inf = self.SetupData('indent') 251*4882a593Smuzhiyun result = checkpatch.CheckPatch(inf) 252*4882a593Smuzhiyun self.assertEqual(result.ok, False) 253*4882a593Smuzhiyun self.assertEqual(len(result.problems), 1) 254*4882a593Smuzhiyun self.assertEqual(result.errors, 0) 255*4882a593Smuzhiyun self.assertEqual(result.warnings, 0) 256*4882a593Smuzhiyun self.assertEqual(result.checks, 1) 257*4882a593Smuzhiyun self.assertEqual(result.lines, 62) 258*4882a593Smuzhiyun os.remove(inf) 259*4882a593Smuzhiyun 260*4882a593Smuzhiyun 261*4882a593Smuzhiyunif __name__ == "__main__": 262*4882a593Smuzhiyun unittest.main() 263*4882a593Smuzhiyun gitutil.RunTests() 264