Lines Matching +full:am654 +full:- +full:secure +full:- +full:proxy
1 // SPDX-License-Identifier: GPL-2.0+
3 * Texas Instruments' K3 Secure proxy Driver
5 * Copyright (C) 2017-2018 Texas Instruments Incorporated - http://www.ti.com/
13 #include <linux/soc/ti/k3-sec-proxy.h>
15 #include <mailbox-uclass.h>
19 /* SEC PROXY RT THREAD STATUS */
27 /* SEC PROXY SCFG THREAD CTRL */
37 * struct k3_sec_proxy_desc - Description of secure proxy integration.
55 * struct k3_sec_proxy_thread - Description of a secure proxy Thread
58 * @scfg: Secure Config Region for Thread
71 * struct k3_sec_proxy_mbox - Description of a Secure Proxy Instance
75 * @target_data: Secure Proxy region for Target Data
76 * @scfg: Secure Proxy Region for Secure configuration.
77 * @rt: Secure proxy Region for Real Time Region.
99 * k3_sec_proxy_of_xlate() - Translation of phandle to channel
109 struct k3_sec_proxy_mbox *spm = dev_get_priv(chan->dev); in k3_sec_proxy_of_xlate()
114 if (args->args_count != 1) { in k3_sec_proxy_of_xlate()
115 debug("Invaild args_count: %d\n", args->args_count); in k3_sec_proxy_of_xlate()
116 return -EINVAL; in k3_sec_proxy_of_xlate()
118 ind = args->args[0]; in k3_sec_proxy_of_xlate()
120 for (i = 0; i < spm->desc->num_valid_threads; i++) in k3_sec_proxy_of_xlate()
121 if (spm->chans[i].id == ind) { in k3_sec_proxy_of_xlate()
122 chan->id = ind; in k3_sec_proxy_of_xlate()
123 chan->con_priv = &spm->chans[i]; in k3_sec_proxy_of_xlate()
127 dev_err(chan->dev, "%s: Invalid Thread ID %d\n", __func__, ind); in k3_sec_proxy_of_xlate()
128 return -ENOENT; in k3_sec_proxy_of_xlate()
132 * k3_sec_proxy_request() - Request for mailbox channel
143 * k3_sec_proxy_free() - Free the mailbox channel
154 * k3_sec_proxy_verify_thread() - Verify thread status before
156 * @spt: pointer to secure proxy thread description
165 if (sp_readl(spt->rt, RT_THREAD_STATUS) & in k3_sec_proxy_verify_thread()
168 __func__, spt->id); in k3_sec_proxy_verify_thread()
169 return -EINVAL; in k3_sec_proxy_verify_thread()
173 if ((sp_readl(spt->scfg, SCFG_THREAD_CTRL) in k3_sec_proxy_verify_thread()
177 __func__, spt->id); in k3_sec_proxy_verify_thread()
180 __func__, spt->id); in k3_sec_proxy_verify_thread()
181 return -EINVAL; in k3_sec_proxy_verify_thread()
185 if (!(sp_readl(spt->rt, RT_THREAD_STATUS) & in k3_sec_proxy_verify_thread()
187 return -ENODATA; in k3_sec_proxy_verify_thread()
193 * k3_sec_proxy_send() - Send data via mailbox channel
202 struct k3_sec_proxy_mbox *spm = dev_get_priv(chan->dev); in k3_sec_proxy_send()
203 struct k3_sec_proxy_thread *spt = chan->con_priv; in k3_sec_proxy_send()
213 __func__, spt->id, ret); in k3_sec_proxy_send()
218 if (msg->len > spm->desc->max_msg_size) { in k3_sec_proxy_send()
220 __func__, chan->id, msg->len, spm->desc->max_msg_size); in k3_sec_proxy_send()
221 return -EINVAL; in k3_sec_proxy_send()
225 data_reg = spt->data + spm->desc->data_start_offset; in k3_sec_proxy_send()
226 for (num_words = msg->len / sizeof(u32), word_data = (u32 *)msg->buf; in k3_sec_proxy_send()
228 num_words--, data_reg += sizeof(u32), word_data++) in k3_sec_proxy_send()
231 trail_bytes = msg->len % sizeof(u32); in k3_sec_proxy_send()
236 data_trail &= 0xFFFFFFFF >> (8 * (sizeof(u32) - trail_bytes)); in k3_sec_proxy_send()
245 if (data_reg <= (spt->data + spm->desc->data_end_offset)) in k3_sec_proxy_send()
246 sp_writel(spt->data, spm->desc->data_end_offset, 0); in k3_sec_proxy_send()
249 __func__, chan->id); in k3_sec_proxy_send()
255 * k3_sec_proxy_recv() - Receive data via mailbox channel
263 struct k3_sec_proxy_mbox *spm = dev_get_priv(chan->dev); in k3_sec_proxy_recv()
264 struct k3_sec_proxy_thread *spt = chan->con_priv; in k3_sec_proxy_recv()
276 msg->len = spm->desc->max_msg_size; in k3_sec_proxy_recv()
277 msg->buf = spt->rx_buf; in k3_sec_proxy_recv()
278 data_reg = spt->data + spm->desc->data_start_offset; in k3_sec_proxy_recv()
279 word_data = spt->rx_buf; in k3_sec_proxy_recv()
280 for (num_words = spm->desc->max_msg_size / sizeof(u32); in k3_sec_proxy_recv()
282 num_words--, data_reg += sizeof(u32), word_data++) in k3_sec_proxy_recv()
286 __func__, chan->id); in k3_sec_proxy_recv()
300 * k3_sec_proxy_of_to_priv() - generate private data from device tree
301 * @dev: corresponding k3 secure proxy device
309 const void *blob = gd->fdt_blob; in k3_sec_proxy_of_to_priv()
312 debug("'%s' no dt?\n", dev->name); in k3_sec_proxy_of_to_priv()
313 return -ENODEV; in k3_sec_proxy_of_to_priv()
316 spm->target_data = devfdt_get_addr_name(dev, "target_data"); in k3_sec_proxy_of_to_priv()
317 if (spm->target_data == FDT_ADDR_T_NONE) { in k3_sec_proxy_of_to_priv()
319 return -EINVAL; in k3_sec_proxy_of_to_priv()
322 spm->scfg = devfdt_get_addr_name(dev, "scfg"); in k3_sec_proxy_of_to_priv()
323 if (spm->rt == FDT_ADDR_T_NONE) { in k3_sec_proxy_of_to_priv()
324 dev_err(dev, "No reg property for Secure Cfg base\n"); in k3_sec_proxy_of_to_priv()
325 return -EINVAL; in k3_sec_proxy_of_to_priv()
328 spm->rt = devfdt_get_addr_name(dev, "rt"); in k3_sec_proxy_of_to_priv()
329 if (spm->rt == FDT_ADDR_T_NONE) { in k3_sec_proxy_of_to_priv()
331 return -EINVAL; in k3_sec_proxy_of_to_priv()
338 * k3_sec_proxy_thread_setup - Initialize the parameters for all valid threads
348 for (i = 0; i < spm->desc->num_valid_threads; i++) { in k3_sec_proxy_thread_setup()
349 spt = &spm->chans[i]; in k3_sec_proxy_thread_setup()
350 ind = spm->desc->valid_threads[i]; in k3_sec_proxy_thread_setup()
351 spt->id = ind; in k3_sec_proxy_thread_setup()
352 spt->data = (void *)SEC_PROXY_THREAD(spm->target_data, ind); in k3_sec_proxy_thread_setup()
353 spt->scfg = (void *)SEC_PROXY_THREAD(spm->scfg, ind); in k3_sec_proxy_thread_setup()
354 spt->rt = (void *)SEC_PROXY_THREAD(spm->rt, ind); in k3_sec_proxy_thread_setup()
355 spt->rx_buf = calloc(1, spm->desc->max_msg_size); in k3_sec_proxy_thread_setup()
356 if (!spt->rx_buf) in k3_sec_proxy_thread_setup()
357 return -ENOMEM; in k3_sec_proxy_thread_setup()
364 * k3_sec_proxy_probe() - Basic probe
380 spm->desc = (void *)dev_get_driver_data(dev); in k3_sec_proxy_probe()
381 spm->chans = calloc(spm->desc->num_valid_threads, in k3_sec_proxy_probe()
383 if (!spm->chans) in k3_sec_proxy_probe()
384 return -ENOMEM; in k3_sec_proxy_probe()
388 debug("%s: secure proxy thread setup failed\n", __func__); in k3_sec_proxy_probe()
401 free(spm->chans); in k3_sec_proxy_remove()
426 { .compatible = "ti,am654-secure-proxy", .data = (ulong)&am654_desc},
431 .name = "k3-secure-proxy",