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 Diff line number Diff line
@@ -41,6 +41,7 @@
#include <net/tcp_states.h>
#include <net/af_unix.h>


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

@@ -52,6 +53,10 @@
#include "logging.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 */
struct device_driver mcd_debug_name = {
	.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)",
			  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) {
		MCDRV_DBG_WARN(mcd, "get_free_pages failed");
@@ -1521,9 +1527,69 @@ bool mc_sleep_ready(void)
#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_exit(mobicore_exit);

#endif

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

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

	#include <soc/qcom/qseecomi.h>
	#include <linux/slab.h>
@@ -42,14 +42,16 @@
	#include <asm/cacheflush.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 \
		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_VAL)
			TZ_SYSCALL_PARAM_TYPE_BUF_RW, \
			TZ_SYSCALL_PARAM_TYPE_VAL, \
			TZ_SYSCALL_PARAM_TYPE_BUF_RW, \
			TZ_SYSCALL_PARAM_TYPE_VAL)

//#endif
#endif

/* from following file */
@@ -57,14 +59,11 @@
#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)
{
#if defined(CONFIG_ARCH_APQ8084) || defined(CONFIG_ARCH_MSM8916) || defined(CONFIG_ARCH_MSM8994)
    if (is_scm_armv8())
    {
#if defined(CONFIG_ARCH_APQ8084) || defined(CONFIG_ARCH_MSM8916) || \
	defined(CONFIG_ARCH_MSM8994)
	if (is_scm_armv8()) {
		struct scm_desc desc = {0};
		int ret;
		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);
		kfree(scm_buf);
		return ret;
    }
    else
    {
	} else {
#endif

	return scm_call(SCM_SVC_MOBICORE, SCM_CMD_MOBICORE,
			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
}
@@ -117,4 +115,8 @@ static inline int smc_fastcall(void *fc_generic, size_t size)
#define MC_CRYPTO_CLOCK_MANAGEMENT
#endif

#if defined(CONFIG_ARCH_MSM8916)
#define MC_USE_DEVICE_TREE
#endif

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

#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

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

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

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

	return ret;
}

@@ -161,6 +169,37 @@ int mc_pm_clock_initialize(void)
{
	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 */
	mc_ce_core_clk = clk_get(mcd, "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");
		goto error;
	}

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

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

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

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

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

	if (mc_ce_bus_clk != NULL)
		clk_put(mc_ce_bus_clk);
#ifdef MC_USE_DEVICE_TREE
	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)