From patchwork Tue Nov 20 14:33:49 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lee Jones X-Patchwork-Id: 13008 Return-Path: X-Original-To: patchwork@peony.canonical.com Delivered-To: patchwork@peony.canonical.com Received: from fiordland.canonical.com (fiordland.canonical.com [91.189.94.145]) by peony.canonical.com (Postfix) with ESMTP id 0EED223FC2 for ; Tue, 20 Nov 2012 14:34:14 +0000 (UTC) Received: from mail-ia0-f180.google.com (mail-ia0-f180.google.com [209.85.210.180]) by fiordland.canonical.com (Postfix) with ESMTP id B1522A185BC for ; Tue, 20 Nov 2012 14:34:13 +0000 (UTC) Received: by mail-ia0-f180.google.com with SMTP id t4so1740455iag.11 for ; Tue, 20 Nov 2012 06:34:13 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-forwarded-to:x-forwarded-for:delivered-to:received-spf:from:to:cc :subject:date:message-id:x-mailer:in-reply-to:references :x-gm-message-state; bh=uVWKqFs7KukiQ+i0wvbPsIRAGNUd342VOD+e6TL1bDA=; b=cvxfZJ3V4Tj8bitsv3JykFetQ6bIEAmR4AczCLI24rilrvaXI2tcBQbAWBNYd+A7xq rGSNvmfv25Ee4+wHJU+G+WukRTFYsKa4up6ck7c7Vyxn+OflcK84v8VbQ7t3RzbdB3cP e9buGlPykRg1YMiac9in8nMfoXH/vrYoj4nSJURHXOj5c8GVuj9a8tY/SRJEtGyME1ok aKRXhBKt5D5WF8o+N96WokUxHGeGNcglfmlHYQUukeYR2MTUqPi4qCxak7Ux7Qm+PSQw krfVZoVZIZAgS0kznGJ/NCag9kVkkq1IJlQOvTZ98kl4EhlmFMMvAzgjQVSF6Z1HFx0U SrUQ== Received: by 10.50.186.199 with SMTP id fm7mr9988847igc.62.1353422053441; Tue, 20 Nov 2012 06:34:13 -0800 (PST) X-Forwarded-To: linaro-patchwork@canonical.com X-Forwarded-For: patch@linaro.org linaro-patchwork@canonical.com Delivered-To: patches@linaro.org Received: by 10.50.67.148 with SMTP id n20csp326837igt; Tue, 20 Nov 2012 06:34:12 -0800 (PST) Received: by 10.180.93.40 with SMTP id cr8mr11315596wib.15.1353422051625; Tue, 20 Nov 2012 06:34:11 -0800 (PST) Received: from mail-wg0-f54.google.com (mail-wg0-f54.google.com [74.125.82.54]) by mx.google.com with ESMTPS id f30si868043weo.26.2012.11.20.06.34.11 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 20 Nov 2012 06:34:11 -0800 (PST) Received-SPF: neutral (google.com: 74.125.82.54 is neither permitted nor denied by best guess record for domain of lee.jones@linaro.org) client-ip=74.125.82.54; Authentication-Results: mx.google.com; spf=neutral (google.com: 74.125.82.54 is neither permitted nor denied by best guess record for domain of lee.jones@linaro.org) smtp.mail=lee.jones@linaro.org Received: by mail-wg0-f54.google.com with SMTP id dr12so1651113wgb.35 for ; Tue, 20 Nov 2012 06:34:11 -0800 (PST) Received: by 10.180.72.232 with SMTP id g8mr14842032wiv.0.1353422051022; Tue, 20 Nov 2012 06:34:11 -0800 (PST) Received: from localhost.localdomain (cpc1-aztw13-0-0-cust473.18-1.cable.virginmedia.com. [77.102.241.218]) by mx.google.com with ESMTPS id bn7sm20254052wib.8.2012.11.20.06.34.09 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 20 Nov 2012 06:34:10 -0800 (PST) From: Lee Jones To: u-boot@lists.denx.de Cc: Lee Jones Subject: [PATCH 3/8] boottime: Add core boottime measurement support Date: Tue, 20 Nov 2012 14:33:49 +0000 Message-Id: <1353422034-28107-4-git-send-email-lee.jones@linaro.org> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1353422034-28107-1-git-send-email-lee.jones@linaro.org> References: <1353422034-28107-1-git-send-email-lee.jones@linaro.org> X-Gm-Message-State: ALoCoQm+t1nrva3yxOGK5Pmn/BF45X5/qRFJCiGyrJtSfqPL1D5nNr07fpO+BQBQOnAzY5UhuEzk Boottime is a tool which can be used for full system booting time measurement. Bootloader boot time is passed to the kernel component though ATAGS. The kernel-side driver then uses this information to provide full system boot time diagnostics though debugfs. Based heavily on the original driver by Jonas Aaberg. Signed-off-by: Lee Jones --- common/Makefile | 1 + common/boottime.c | 146 ++++++++++++++++++++++++++++++++++++++++++++++++++++ include/boottime.h | 86 +++++++++++++++++++++++++++++++ 3 files changed, 233 insertions(+) create mode 100644 common/boottime.c create mode 100644 include/boottime.h diff --git a/common/Makefile b/common/Makefile index 9e43322..546acbf 100644 --- a/common/Makefile +++ b/common/Makefile @@ -192,6 +192,7 @@ COBJS-$(CONFIG_MODEM_SUPPORT) += modem.o COBJS-$(CONFIG_UPDATE_TFTP) += update.o COBJS-$(CONFIG_USB_KEYBOARD) += usb_kbd.o COBJS-$(CONFIG_CMD_DFU) += cmd_dfu.o +COBJS-$(CONFIG_BOOTTIME) += boottime.o endif ifdef CONFIG_SPL_BUILD diff --git a/common/boottime.c b/common/boottime.c new file mode 100644 index 0000000..87be467 --- /dev/null +++ b/common/boottime.c @@ -0,0 +1,146 @@ +/* + * Copyright (C) ST-Ericsson SA 2009-2010 + * Jonas Aaberg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include +#include +#include + +#ifdef CONFIG_BOOTTIME + +static struct tag_boottime boottime = { + .idle = 0, + .total = 0, +}; + +void boottime_tag(char *name) +{ + if (boottime.num == BOOTTIME_MAX) { + printf("boottime: out of entries!\n"); + return; + } + + strncpy((char *)boottime.entry[boottime.num].name, + name, + BOOTTIME_MAX_NAME_LEN); + boottime.entry[boottime.num].name[BOOTTIME_MAX_NAME_LEN - 1] = '\0'; + boottime.entry[boottime.num].time = get_timer_us(); + + boottime.num++; +} + +struct boottime_entry *boottime_get_entry(unsigned int i) +{ + if (i >= boottime.num) + return NULL; + else + return &boottime.entry[i]; +} + +void boottime_idle_add(unsigned long time) +{ + boottime.idle += time; +} + +unsigned long boottime_idle_done(void) +{ + return get_timer_us(); +} + +unsigned long boottime_idle_get(void) +{ + return boottime.idle; +} + +static int do_boottime(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) +{ + unsigned int i; + struct boottime_entry *entry; + + for (i = 0; i < BOOTTIME_MAX; i++) { + entry = boottime_get_entry(i); + if (entry == NULL) + break; + printf("%s: started at %lu ms\n", entry->name, + (unsigned long)entry->time / 1000); + } + printf("idle: %d%% (%d ms)\n", + 100 * (int)boottime_idle_get() / (int)get_timer_us(), + (int)boottime_idle_get() / 1000); + return 0; +} + +static int do_boottime_tag (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) +{ + + if (argc < 2) { + cmd_usage(cmdtp); + return 1; + } + boottime_tag(argv[1]); + + return 0; +} + +U_BOOT_CMD( + boottime, 1, 1, do_boottime, + "print boottime info", + "" + " - print boottime tags\n" +); + +U_BOOT_CMD( + boottime_tag, 2, 1, do_boottime_tag, + "boottime tag 'name'", + "" + " - Add a boottime tag at the current time\n" +); + +#else +/* + * Dummy functions when boottime is not enabled. + */ +static int do_boottime_tag (cmd_tbl_t *cmdtp, int flag, int argc, char *argv[]) +{ + return 0; +} + +void boottime_tag(char *name) +{ + +} + +void boottime_idle_add(unsigned long time) +{ + +} + +U_BOOT_CMD( + boottime_tag, 2, 1, do_boottime_tag, + "boottime tag 'name'", + "" + " - NOT ENABLED: Add CONFIG_BOOTIME to your boards configuration" + " file to enable boottime.\n" +); + +#endif + + + diff --git a/include/boottime.h b/include/boottime.h new file mode 100644 index 0000000..58ea314 --- /dev/null +++ b/include/boottime.h @@ -0,0 +1,86 @@ +/* + * Copyright (C) ST-Ericsson SA 2009-2010 + * Jonas Aaberg + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#ifndef BOOTTIME_H +#define BOOTTIME_H + +#define BOOTTIME_MAX_NAME_LEN 64 + +struct boottime_entry { + u32 time; /* in us */ + u8 name[BOOTTIME_MAX_NAME_LEN]; +}; + +#ifdef CONFIG_BOOTTIME + +/** + * boottime_tag() + * Add a sample point with a name now. Shall be called before function "name" + * is executed. + * @name: Sample point name. + */ +void boottime_tag(char *name); + +/** + * boottime_get_entry() + * + * Loads a boottime measure point information. + * @i: boottime measurement point entry. + * + * Returns a boottime entry. NULL, if not existing. + */ +struct boottime_entry *boottime_get_entry(unsigned int i); + +/** + * boottime_idle_get() + * + * Returns the amount of time in us that has been spent idling. + */ +unsigned long boottime_idle_get(void); + +/** + * boottime_idle_done() + * + * Returns the total time since start in us. + */ +unsigned long boottime_idle_done(void); + +/** + * boottime_idle_add() + * + * This function shall be added to all delay() functions. + * The delay time input to delay() shall be provided to this + * function as well. It is used to calculate average load + * during boot. + * @time: time in us. + */ +void boottime_idle_add(unsigned long time); + +#else /* CONFIG_BOOTTIME */ + +static inline void boottime_tag(char *name) { return; } +static inline struct boottime_entry *boottime_get_entry(unsigned int i) { return NULL; } +static inline unsigned long boottime_idle_get(void) { return 0; } +static inline unsigned long boottime_idle_done(void) { return 0; } +static inline void boottime_idle_add(unsigned long time) { return; } + +#endif /* CONFIG_BOOTTIME */ + +#endif /* BOOTTIME_H */