Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fc0569df authored by Arun KS's avatar Arun KS Committed by Vivek Kumar
Browse files

soc: qcom: boot_marker: Add provision to update marker



During recursive hibernation use case, if place_markers are used,
it results in duplication of entries. This patch adds provision to
update existing markers and if not present, create new entry. There
is a need to update bootloader boot stats during hibernation restore.
This is achieved by calling function update_bootloader_stats(). Make
this function local to boot_marker.c and use hibernation specific
markers to update boot stats. Also increase the BOOT_MARKER_MAX_LEN
to 50 chars to accommodate new entries.

Change-Id: I260be44519f013dbf626b92707f39de7d6ad7cdc
Signed-off-by: default avatarArun KS <arunks@codeaurora.org>
Signed-off-by: default avatarVivek Kumar <vivekuma@codeaurora.org>
parent c30cd30a
Loading
Loading
Loading
Loading
+48 −42
Original line number Original line Diff line number Diff line
@@ -30,7 +30,7 @@
#include <soc/qcom/boot_stats.h>
#include <soc/qcom/boot_stats.h>


#define MAX_STRING_LEN 256
#define MAX_STRING_LEN 256
#define BOOT_MARKER_MAX_LEN 40
#define BOOT_MARKER_MAX_LEN 50
#define MSM_ARCH_TIMER_FREQ     19200000
#define MSM_ARCH_TIMER_FREQ     19200000


struct boot_marker {
struct boot_marker {
@@ -40,10 +40,6 @@ struct boot_marker {
	spinlock_t slock;
	spinlock_t slock;
};
};


#ifdef CONFIG_HIBERNATION
static unsigned long long int kernel_start_at;
#endif /* CONFIG_HIBERNATION */

static struct dentry *dent_bkpi, *dent_bkpi_status, *dent_mpm_timer;
static struct dentry *dent_bkpi, *dent_bkpi_status, *dent_mpm_timer;
static struct boot_marker boot_marker_list;
static struct boot_marker boot_marker_list;


@@ -87,6 +83,39 @@ static void _create_boot_marker(const char *name,
	spin_unlock(&boot_marker_list.slock);
	spin_unlock(&boot_marker_list.slock);
}
}


static void _update_boot_marker(const char *name, const char *new_name,
				unsigned long long int timer_value)
{
	struct boot_marker *marker;
	struct boot_marker *temp_addr;

	spin_lock(&boot_marker_list.slock);
	list_for_each_entry_safe(marker, temp_addr, &boot_marker_list.list,
			list) {
		if (strnstr(marker->marker_name, name,
			strlen(marker->marker_name))) {
			if (new_name)
				strlcpy(marker->marker_name, new_name,
					sizeof(marker->marker_name));
			marker->timer_value = timer_value;
			spin_unlock(&boot_marker_list.slock);
			return;
		}

		if (!new_name)
			continue;

		if (strnstr(marker->marker_name, new_name,
			strlen(marker->marker_name))) {
			marker->timer_value = timer_value;
			spin_unlock(&boot_marker_list.slock);
			return;
		}
	}
	spin_unlock(&boot_marker_list.slock);
	_create_boot_marker(name, timer_value);
}

static void set_bootloader_stats(void)
static void set_bootloader_stats(void)
{
{
	_create_boot_marker("M - APPSBL Start - ",
	_create_boot_marker("M - APPSBL Start - ",
@@ -104,51 +133,28 @@ static void set_bootloader_stats(void)
}
}


#ifdef CONFIG_HIBERNATION
#ifdef CONFIG_HIBERNATION
void update_bootloader_stats(void)
static void update_bootloader_stats(void)
{
{
	u32 val = 0;
	_update_boot_marker("M - APPSBL Start - ", NULL,
	struct boot_marker *marker;
			readl_relaxed(&boot_stats->bootloader_start));
	static const char * const name[] = {"D - Hiber: Start image loading - ",
	_update_boot_marker("D - APPSBL Kernel Load Start - ",
		"D - Hiber: End image loading - ",
		"D - APPSBL Hibernation Image Load Start - ",
		"M - APPSBL End(Kernel Start) - "};
		readl_relaxed(&boot_stats->load_kernel_start));

	_update_boot_marker("D - APPSBL Kernel Load End - ",
	spin_lock(&boot_marker_list.slock);
		"D - APPSBL Hibernation Image Load End - ",
	list_for_each_entry(marker, &boot_marker_list.list, list) {
		readl_relaxed(&boot_stats->load_kernel_done));
		if (!strcmp("M - APPSBL Start - ", marker->marker_name)) {
	_update_boot_marker("M - APPSBL End - ", NULL,
			val = readl_relaxed(&boot_stats->bootloader_start);
		readl_relaxed(&boot_stats->bootloader_end));
			marker->timer_value = val;
		}
		if (!strcmp("D - APPSBL Kernel Load Start - ",
				marker->marker_name)) {
			strlcpy(marker->marker_name, name[0],
				sizeof(marker->marker_name));
			val = readl_relaxed(&boot_stats->load_kernel_start);
			marker->timer_value = val;
		}
		if (!strcmp("D - APPSBL Kernel Load End - ",
				marker->marker_name)) {
			strlcpy(marker->marker_name, name[1],
				sizeof(marker->marker_name));
			val = readl_relaxed(&boot_stats->load_kernel_done);
			marker->timer_value = val;
		}
		if (!strcmp("M - APPSBL End - ", marker->marker_name)) {
			strlcpy(marker->marker_name, name[2],
				sizeof(marker->marker_name));
			marker->timer_value = kernel_start_at;
		}
	}
	spin_unlock(&boot_marker_list.slock);
}
}
#endif /* CONFIG_HIBERNATION */
#endif /* CONFIG_HIBERNATION */


void place_marker(const char *name)
void place_marker(const char *name)
{
{
#ifdef CONFIG_HIBERNATION
#ifdef CONFIG_HIBERNATION
	if (!strcmp(name, "Kernel Start"))
	if (!strcmp(name, "M - Image Kernel Start"))
		kernel_start_at = msm_timer_get_sclk_ticks();
		update_bootloader_stats();
#endif /* CONFIG_HIBERNATION */
#endif /* CONFIG_HIBERNATION */
	_create_boot_marker((char *) name, msm_timer_get_sclk_ticks());
	_update_boot_marker((char *)name, NULL, msm_timer_get_sclk_ticks());
}
}
EXPORT_SYMBOL(place_marker);
EXPORT_SYMBOL(place_marker);


+0 −5
Original line number Original line Diff line number Diff line
@@ -45,11 +45,6 @@ static inline int boot_marker_enabled(void) { return 1; }
void place_marker(const char *name);
void place_marker(const char *name);
void destroy_marker(const char *name);
void destroy_marker(const char *name);
void measure_wake_up_time(void);
void measure_wake_up_time(void);
#ifdef CONFIG_HIBERNATION
void update_bootloader_stats(void);
#else
static inline void update_bootloader_stats(void) { return; }
#endif /* CONFIG_HIBERNATION */
#else
#else
static inline void place_marker(char *name) { };
static inline void place_marker(char *name) { };
static inline void destroy_marker(const char *name) { };
static inline void destroy_marker(const char *name) { };