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

Commit 6520510f authored by Nick Schutt's avatar Nick Schutt Committed by Keith Fallows
Browse files

t-base-301B: add device tree support for msm8916 crypto clocks



Change-Id: I87e2a3ed897bfe260334c9bf7659ba916ed7b764
Signed-off-by: default avatarNick Schutt <nickschutt@gmail.com>
Git-commit: f1870687188ae755474a6bfd2b9926433d1e92c8
Git-repo: https://code.google.com/p/tee-mobicore-driver.kernel/


[keithf@codeaurora.org: resolve trivial merge conflicts]
Acked-by: default avatarTony Hamilton <tonyh@qti.qualcomm.com>
Signed-off-by: default avatarKeith Fallows <keithf@codeaurora.org>
parent 5040ae5f
Loading
Loading
Loading
Loading
+68 −2
Original line number Original line Diff line number Diff line
@@ -41,6 +41,7 @@
#include <net/tcp_states.h>
#include <net/tcp_states.h>
#include <net/af_unix.h>
#include <net/af_unix.h>



#include "main.h"
#include "main.h"
#include "fastcall.h"
#include "fastcall.h"


@@ -52,6 +53,10 @@
#include "logging.h"
#include "logging.h"
#include "build_tag.h"
#include "build_tag.h"


#if defined(MC_CRYPTO_CLOCK_MANAGEMENT) && defined(MC_USE_DEVICE_TREE)
#include <linux/platform_device.h>
#endif

/* Define a MobiCore device structure for use with dev_debug() etc */
/* Define a MobiCore device structure for use with dev_debug() etc */
struct device_driver mcd_debug_name = {
struct device_driver mcd_debug_name = {
	.name = "MobiCore"
	.name = "MobiCore"
@@ -434,7 +439,8 @@ int mc_get_buffer(struct mc_instance *instance,
	MCDRV_DBG_VERBOSE(mcd, "size %ld -> order %d --> %ld (2^n pages)",
	MCDRV_DBG_VERBOSE(mcd, "size %ld -> order %d --> %ld (2^n pages)",
			  len, order, allocated_size);
			  len, order, allocated_size);


	addr = (void *)__get_free_pages(GFP_USER | __GFP_ZERO, order);
	addr = (void *)__get_free_pages(GFP_USER | __GFP_ZERO | __GFP_COMP,
					order);


	if (addr == NULL) {
	if (addr == NULL) {
		MCDRV_DBG_WARN(mcd, "get_free_pages failed");
		MCDRV_DBG_WARN(mcd, "get_free_pages failed");
@@ -1521,9 +1527,69 @@ bool mc_sleep_ready(void)
#endif
#endif
}
}


/* Linux Driver Module Macros */
#if defined(MC_CRYPTO_CLOCK_MANAGEMENT) && defined(MC_USE_DEVICE_TREE)
static int mcd_probe(struct platform_device *pdev)
{
	mcd->of_node = pdev->dev.of_node;
	mobicore_init();
	return 0;
}

static int mcd_remove(struct platform_device *pdev)
{
	return 0;
}

static int mcd_suspend(struct platform_device *pdev, pm_message_t state)
{
	return 0;
}

static int mcd_resume(struct platform_device *pdev)
{
	return 0;
}

static struct of_device_id mcd_match[] = {
	{
		.compatible = "qcom,qcrypto",
	},
	{}
};

static struct platform_driver mc_plat_driver = {
	.probe = mcd_probe,
	.remove = mcd_remove,
	.suspend = mcd_suspend,
	.resume = mcd_resume,
	.driver = {
		.name = "mcd",
		.owner = THIS_MODULE,
		.of_match_table = mcd_match,
	},
};

static int mobicore_register(void)
{
	return platform_driver_register(&mc_plat_driver);
}

static void mobicore_unregister(void)
{
	platform_driver_unregister(&mc_plat_driver);
	mobicore_exit();
}

module_init(mobicore_register);
module_exit(mobicore_unregister);

#else

module_init(mobicore_init);
module_init(mobicore_init);
module_exit(mobicore_exit);
module_exit(mobicore_exit);

#endif

MODULE_AUTHOR("Trustonic Limited");
MODULE_AUTHOR("Trustonic Limited");
MODULE_LICENSE("GPL v2");
MODULE_LICENSE("GPL v2");
MODULE_DESCRIPTION("MobiCore driver");
MODULE_DESCRIPTION("MobiCore driver");
+43 −41
Original line number Original line Diff line number Diff line
@@ -32,8 +32,8 @@
/*--------------- Implementation -------------- */
/*--------------- Implementation -------------- */
#include <soc/qcom/scm.h>
#include <soc/qcom/scm.h>


#if defined(CONFIG_ARCH_APQ8084) || defined(CONFIG_ARCH_MSM8916) || defined(CONFIG_ARCH_MSM8994)
#if defined(CONFIG_ARCH_APQ8084) || defined(CONFIG_ARCH_MSM8916) || \
//#ifdef CONFIG_ARM64
	defined(CONFIG_ARCH_MSM8994)


	#include <soc/qcom/qseecomi.h>
	#include <soc/qcom/qseecomi.h>
	#include <linux/slab.h>
	#include <linux/slab.h>
@@ -42,14 +42,16 @@
	#include <asm/cacheflush.h>
	#include <asm/cacheflush.h>
	#include <linux/errno.h>
	#include <linux/errno.h>


	#define SCM_MOBIOS_FNID(s, c) (((((s) & 0xFF) << 8) | ((c) & 0xFF)) | 0x33000000)
	#define SCM_MOBIOS_FNID(s, c) (((((s) & 0xFF) << 8) | ((c) & 0xFF)) \
		| 0x33000000)


	#define TZ_EXECUTIVE_EXT_ID_PARAM_ID \
	#define TZ_EXECUTIVE_EXT_ID_PARAM_ID \
		TZ_SYSCALL_CREATE_PARAM_ID_4( \
		TZ_SYSCALL_CREATE_PARAM_ID_4( \
			TZ_SYSCALL_PARAM_TYPE_BUF_RW, TZ_SYSCALL_PARAM_TYPE_VAL, \
			TZ_SYSCALL_PARAM_TYPE_BUF_RW, \
			TZ_SYSCALL_PARAM_TYPE_BUF_RW, TZ_SYSCALL_PARAM_TYPE_VAL)
			TZ_SYSCALL_PARAM_TYPE_VAL, \
			TZ_SYSCALL_PARAM_TYPE_BUF_RW, \
			TZ_SYSCALL_PARAM_TYPE_VAL)


//#endif
#endif
#endif


/* from following file */
/* from following file */
@@ -57,14 +59,11 @@
#define SCM_CMD_MOBICORE		1
#define SCM_CMD_MOBICORE		1




extern int scm_call(u32 svc_id, u32 cmd_id, const void *cmd_buf, size_t cmd_len,
		    void *resp_buf, size_t resp_len);

static inline int smc_fastcall(void *fc_generic, size_t size)
static inline int smc_fastcall(void *fc_generic, size_t size)
{
{
#if defined(CONFIG_ARCH_APQ8084) || defined(CONFIG_ARCH_MSM8916) || defined(CONFIG_ARCH_MSM8994)
#if defined(CONFIG_ARCH_APQ8084) || defined(CONFIG_ARCH_MSM8916) || \
    if (is_scm_armv8())
	defined(CONFIG_ARCH_MSM8994)
    {
	if (is_scm_armv8()) {
		struct scm_desc desc = {0};
		struct scm_desc desc = {0};
		int ret;
		int ret;
		void *scm_buf = NULL;
		void *scm_buf = NULL;
@@ -89,15 +88,14 @@ static inline int smc_fastcall(void *fc_generic, size_t size)
		memcpy(fc_generic, scm_buf, size);
		memcpy(fc_generic, scm_buf, size);
		kfree(scm_buf);
		kfree(scm_buf);
		return ret;
		return ret;
    }
	} else {
    else
    {
#endif
#endif


	return scm_call(SCM_SVC_MOBICORE, SCM_CMD_MOBICORE,
	return scm_call(SCM_SVC_MOBICORE, SCM_CMD_MOBICORE,
			fc_generic, size,
			fc_generic, size,
			fc_generic, size);
			fc_generic, size);
#if defined(CONFIG_ARCH_APQ8084) || defined(CONFIG_ARCH_MSM8916) || defined(CONFIG_ARCH_MSM8994)
#if defined(CONFIG_ARCH_APQ8084) || defined(CONFIG_ARCH_MSM8916) || \
	defined(CONFIG_ARCH_MSM8994)
	}
	}
#endif
#endif
}
}
@@ -117,4 +115,8 @@ static inline int smc_fastcall(void *fc_generic, size_t size)
#define MC_CRYPTO_CLOCK_MANAGEMENT
#define MC_CRYPTO_CLOCK_MANAGEMENT
#endif
#endif


#if defined(CONFIG_ARCH_MSM8916)
#define MC_USE_DEVICE_TREE
#endif

#endif /* _MC_PLATFORM_H_ */
#endif /* _MC_PLATFORM_H_ */
+49 −3
Original line number Original line Diff line number Diff line
@@ -41,8 +41,15 @@
	struct clk *mc_ce_iface_clk = NULL;
	struct clk *mc_ce_iface_clk = NULL;
	struct clk *mc_ce_core_clk = NULL;
	struct clk *mc_ce_core_clk = NULL;
	struct clk *mc_ce_bus_clk = NULL;
	struct clk *mc_ce_bus_clk = NULL;

#endif /* MC_CRYPTO_CLOCK_MANAGEMENT */
#endif /* MC_CRYPTO_CLOCK_MANAGEMENT */


#if defined(MC_CRYPTO_CLOCK_MANAGEMENT) && defined(MC_USE_DEVICE_TREE)
	#include <linux/of.h>
	#define QSEE_CE_CLK_100MHZ 100000000
	struct clk *mc_ce_core_src_clk = NULL;
#endif /* MC_CRYPTO_CLOCK_MANAGEMENT && MC_USE_DEVICE_TREE */

#ifdef MC_PM_RUNTIME
#ifdef MC_PM_RUNTIME


static struct mc_context *ctx;
static struct mc_context *ctx;
@@ -87,7 +94,7 @@ static int mc_suspend_notifier(struct notifier_block *nb,


#ifdef MC_MEM_TRACES
#ifdef MC_MEM_TRACES
	mobicore_log_read();
	mobicore_log_read();
#endif
#endif  /* MC_MEM_TRACES */


	switch (event) {
	switch (event) {
	case PM_SUSPEND_PREPARE:
	case PM_SUSPEND_PREPARE:
@@ -136,6 +143,7 @@ int mc_pm_initialize(struct mc_context *context)
	ret = register_pm_notifier(&mc_notif_block);
	ret = register_pm_notifier(&mc_notif_block);
	if (ret)
	if (ret)
		MCDRV_DBG_ERROR(mcd, "device pm register failed");
		MCDRV_DBG_ERROR(mcd, "device pm register failed");

	return ret;
	return ret;
}
}


@@ -161,6 +169,37 @@ int mc_pm_clock_initialize(void)
{
{
	int ret = 0;
	int ret = 0;


#ifdef MC_USE_DEVICE_TREE
	/* Get core clk src */
	mc_ce_core_src_clk = clk_get(mcd, "core_clk_src");
	if (IS_ERR(mc_ce_core_src_clk)) {
		ret = PTR_ERR(mc_ce_core_src_clk);
		MCDRV_DBG_ERROR(mcd,
				"cannot get core clock src with error: %d",
				ret);
		goto error;
	} else {
		int ce_opp_freq_hz = QSEE_CE_CLK_100MHZ;

		if (of_property_read_u32(mcd->of_node,
					 "qcom,ce-opp-freq",
					 &ce_opp_freq_hz)) {
			ce_opp_freq_hz = QSEE_CE_CLK_100MHZ;
			MCDRV_DBG_ERROR(mcd,
					"cannot get ce clock frequency. Using %d",
					ce_opp_freq_hz);
		}
		ret = clk_set_rate(mc_ce_core_src_clk, ce_opp_freq_hz);
		if (ret) {
			clk_put(mc_ce_core_src_clk);
			mc_ce_core_src_clk = NULL;
			MCDRV_DBG_ERROR(mcd, "cannot set core clock src rate");
			ret = -EIO;
			goto error;
		}
	}
#endif  /* MC_CRYPTO_CLOCK_MANAGEMENT && MC_USE_DEVICE_TREE */

	/* Get core clk */
	/* Get core clk */
	mc_ce_core_clk = clk_get(mcd, "core_clk");
	mc_ce_core_clk = clk_get(mcd, "core_clk");
	if (IS_ERR(mc_ce_core_clk)) {
	if (IS_ERR(mc_ce_core_clk)) {
@@ -185,6 +224,8 @@ int mc_pm_clock_initialize(void)
		MCDRV_DBG_ERROR(mcd, "cannot get AXI bus clock");
		MCDRV_DBG_ERROR(mcd, "cannot get AXI bus clock");
		goto error;
		goto error;
	}
	}

	MCDRV_DBG(mcd, "obtained crypto clocks");
	return ret;
	return ret;


error:
error:
@@ -197,14 +238,19 @@ error:


void mc_pm_clock_finalize(void)
void mc_pm_clock_finalize(void)
{
{
	if (mc_ce_bus_clk != NULL)
		clk_put(mc_ce_bus_clk);

	if (mc_ce_iface_clk != NULL)
	if (mc_ce_iface_clk != NULL)
		clk_put(mc_ce_iface_clk);
		clk_put(mc_ce_iface_clk);


	if (mc_ce_core_clk != NULL)
	if (mc_ce_core_clk != NULL)
		clk_put(mc_ce_core_clk);
		clk_put(mc_ce_core_clk);


	if (mc_ce_bus_clk != NULL)
#ifdef MC_USE_DEVICE_TREE
		clk_put(mc_ce_bus_clk);
	if (mc_ce_core_src_clk != NULL)
		clk_put(mc_ce_core_src_clk);
#endif  /* MC_CRYPTO_CLOCK_MANAGEMENT && MC_USE_DEVICE_TREE */
}
}


int mc_pm_clock_enable(void)
int mc_pm_clock_enable(void)