blob: 4979e8bd3623dd55ae0ddebec6c6dc6c40f3e5f0 [file] [log] [blame]
/*
* Copyright (c) 2015 Samsung Electronics Co., Ltd.
* http://www.samsung.com/
*
* EXYNOS SMC
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
*/
#include <linux/sched.h>
#include <linux/spinlock.h>
#include <linux/smc.h>
#define CONFIG_EXYNOS_SMC_LOGGING
#ifdef CONFIG_EXYNOS_SMC_LOGGING
#define EXYNOS_SMC_LOG_SIZE 1024
struct exynos_smc_log_entry {
u64 cpu_clk;
u32 cmd;
u32 arg1;
u32 arg2;
u32 arg3;
};
static DEFINE_SPINLOCK(drm_smc_log_lock);
struct exynos_smc_log_entry drm_smc_log[EXYNOS_SMC_LOG_SIZE];
static unsigned int drm_smc_log_idx;
#endif
int exynos_smc(unsigned long cmd, unsigned long arg1, unsigned long arg2, unsigned long arg3)
{
#ifdef CONFIG_EXYNOS_SMC_LOGGING
unsigned long flags;
#endif
#ifdef CONFIG_EXYNOS_SMC_LOGGING
if ((uint32_t)cmd >= SMC_PROTECTION_SET && (uint32_t)cmd < MC_FC_SET_CFW_PROT) {
pr_debug("%s: cmd: 0x%x, arg1: 0x%x, arg2: 0x%x, arg3: 0x%x\n",
__func__, (u32)cmd, (u32)arg1, (u32)arg2, (u32)arg3);
spin_lock_irqsave(&drm_smc_log_lock, flags);
drm_smc_log[drm_smc_log_idx].cpu_clk = local_clock();
drm_smc_log[drm_smc_log_idx].cmd = (u32)cmd;
drm_smc_log[drm_smc_log_idx].arg1 = (u32)arg1;
drm_smc_log[drm_smc_log_idx].arg2 = (u32)arg2;
drm_smc_log[drm_smc_log_idx].arg3 = (u32)arg3;
drm_smc_log_idx++;
if (drm_smc_log_idx == EXYNOS_SMC_LOG_SIZE)
drm_smc_log_idx = 0;
spin_unlock_irqrestore(&drm_smc_log_lock, flags);
}
#endif
return __exynos_smc(cmd, arg1, arg2, arg3);
}