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

Commit 8372f0f4 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "arm64: hibernate: Add Hibernation KPI marker"

parents 16d9cd61 cbf50049
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -304,6 +304,7 @@ int swsusp_arch_suspend(void)
		sleep_cpu = smp_processor_id();
		ret = swsusp_save();
	} else {
		place_marker("M - Image Kernel Start");
		/* Clean kernel core startup/idle code to PoC*/
		dcache_clean_range(__mmuoff_data_start, __mmuoff_data_end);
		dcache_clean_range(__idmap_text_start, __idmap_text_end);
+48 −42
Original line number Diff line number Diff line
@@ -30,7 +30,7 @@
#include <soc/qcom/boot_stats.h>

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

struct boot_marker {
@@ -40,10 +40,6 @@ struct boot_marker {
	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 boot_marker boot_marker_list;

@@ -87,6 +83,39 @@ static void _create_boot_marker(const char *name,
	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)
{
	_create_boot_marker("M - APPSBL Start - ",
@@ -104,51 +133,28 @@ static void set_bootloader_stats(void)
}

#ifdef CONFIG_HIBERNATION
void update_bootloader_stats(void)
static void update_bootloader_stats(void)
{
	u32 val = 0;
	struct boot_marker *marker;
	static const char * const name[] = {"D - Hiber: Start image loading - ",
		"D - Hiber: End image loading - ",
		"M - APPSBL End(Kernel Start) - "};

	spin_lock(&boot_marker_list.slock);
	list_for_each_entry(marker, &boot_marker_list.list, list) {
		if (!strcmp("M - APPSBL Start - ", marker->marker_name)) {
			val = readl_relaxed(&boot_stats->bootloader_start);
			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);
	_update_boot_marker("M - APPSBL Start - ", NULL,
			readl_relaxed(&boot_stats->bootloader_start));
	_update_boot_marker("D - APPSBL Kernel Load Start - ",
		"D - APPSBL Hibernation Image Load Start - ",
		readl_relaxed(&boot_stats->load_kernel_start));
	_update_boot_marker("D - APPSBL Kernel Load End - ",
		"D - APPSBL Hibernation Image Load End - ",
		readl_relaxed(&boot_stats->load_kernel_done));
	_update_boot_marker("M - APPSBL End - ", NULL,
		readl_relaxed(&boot_stats->bootloader_end));
}
#endif /* CONFIG_HIBERNATION */

void place_marker(const char *name)
{
#ifdef CONFIG_HIBERNATION
	if (!strcmp(name, "Kernel Start"))
		kernel_start_at = msm_timer_get_sclk_ticks();
	if (!strcmp(name, "M - Image Kernel Start"))
		update_bootloader_stats();
#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);

+0 −5
Original line number 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 destroy_marker(const char *name);
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
static inline void place_marker(char *name) { };
static inline void destroy_marker(const char *name) { };
+6 −4
Original line number Diff line number Diff line
@@ -335,6 +335,7 @@ static int create_image(int platform_mode)
 Platform_finish:
	platform_finish(platform_mode);

	place_marker("M - Hibernation: start device resume");
	dpm_resume_start(in_suspend ?
		(error ? PMSG_RECOVER : PMSG_THAW) : PMSG_RESTORE);

@@ -410,7 +411,7 @@ int hibernation_snapshot(int platform_mode)

	resume_console();
	dpm_complete(msg);

	place_marker("M - Hibernation: end device resume");
 Close:
	platform_end(platform_mode);
	return error;
@@ -750,7 +751,7 @@ int hibernate(void)
		in_suspend = 0;
		pm_restore_gfp_mask();
	} else {
		place_marker("PM: Image restored!");
		place_marker("M - PM: Image restored!");
		pm_pr_dbg("Image restored successfully.\n");
	}

@@ -765,6 +766,7 @@ int hibernate(void)
			error = load_image_and_restore();
	}
	thaw_processes();
	place_marker("M - Hibernation: processes thaw done");

	/* Don't bother checking whether freezer_test_done is true */
	freezer_test_done = false;
@@ -774,7 +776,7 @@ int hibernate(void)
	atomic_inc(&snapshot_device_available);
 Unlock:
	unlock_system_sleep();
	place_marker("PM: Hibernation Exit!");
	place_marker("M - PM: Hibernation Exit!");
	pr_info("hibernation exit\n");

	return error;
@@ -897,7 +899,7 @@ static int software_resume(void)
		goto Close_Finish;
	error = load_image_and_restore();
	thaw_processes();
	place_marker("PM: Thaw completed!");
	place_marker("M - PM: Thaw processes completed!");
 Finish:
	__pm_notifier_call_chain(PM_POST_RESTORE, nr_calls, NULL);
	pm_restore_console();