2 * Qualcomm Peripheral Image Loader
4 * Copyright (C) 2014 Sony Mobile Communications AB
5 * Copyright (c) 2012-2013, The Linux Foundation. All rights reserved.
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * version 2 as published by the Free Software Foundation.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
17 #include <linux/kernel.h>
18 #include <linux/module.h>
19 #include <linux/platform_device.h>
20 #include <linux/dma-mapping.h>
21 #include <linux/firmware.h>
22 #include <linux/remoteproc.h>
23 #include <linux/interrupt.h>
24 #include <linux/memblock.h>
25 #include <linux/gpio/consumer.h>
27 #include <linux/elf.h>
28 #include <linux/clk.h>
29 #include <linux/slab.h>
30 #include <linux/regulator/consumer.h>
31 #include <linux/soc/qcom/smem.h>
33 #include "remoteproc_internal.h"
35 #include "../../arch/arm/mach-qcom/scm.h"
37 extern int scm_is_call_available(u32 svc_id, u32 cmd_id);
39 #define PAS_INIT_IMAGE_CMD 1
40 #define PAS_MEM_SETUP_CMD 2
41 #define PAS_AUTH_AND_RESET_CMD 5
42 #define PAS_SHUTDOWN_CMD 6
43 #define PAS_IS_SUPPORTED_CMD 7
57 struct gpio_desc *stop_gpio;
60 struct regulator *pll;
62 unsigned proxy_clk_count;
63 struct clk *scm_core_clk;
64 struct clk *scm_iface_clk;
65 struct clk *scm_bus_clk;
67 struct clk **proxy_clks;
69 struct completion start_done;
70 struct completion stop_done;
72 struct qcom_smem_item crash_reason;
75 static int pas_supported(int id)
81 ret = scm_is_call_available(SCM_SVC_PIL, PAS_IS_SUPPORTED_CMD);
85 ret = scm_call(SCM_SVC_PIL, PAS_IS_SUPPORTED_CMD,
86 &periph, sizeof(periph),
87 &ret_val, sizeof(ret_val));
89 return ret ? : ret_val;
92 static int pas_init_image(int id, const char *metadata, size_t size)
94 dma_addr_t mdata_phys;
98 struct pas_init_image_req {
103 mdata_buf = dma_alloc_coherent(NULL, size, &mdata_phys, GFP_KERNEL);
105 pr_err("Allocation for metadata failed.\n");
109 memcpy(mdata_buf, metadata, size);
110 outer_flush_range(request.image_addr, request.image_addr + size);
113 request.image_addr = mdata_phys;
115 ret = scm_call(SCM_SVC_PIL, PAS_INIT_IMAGE_CMD,
116 &request, sizeof(request),
117 &scm_ret, sizeof(scm_ret));
119 dma_free_coherent(NULL, size, mdata_buf, mdata_phys);
121 return ret ? : scm_ret;
124 static int pas_mem_setup(int id, phys_addr_t start_addr, phys_addr_t size)
128 struct pas_init_image_req {
135 request.start_addr = start_addr;
138 ret = scm_call(SCM_SVC_PIL, PAS_MEM_SETUP_CMD,
139 &request, sizeof(request),
140 &scm_ret, sizeof(scm_ret));
142 return ret ? : scm_ret;
145 static int pas_auth_and_reset(int id)
151 ret = scm_call(SCM_SVC_PIL, PAS_AUTH_AND_RESET_CMD,
153 &scm_ret, sizeof(scm_ret));
155 return ret ? : scm_ret;
158 static int pas_shutdown(int id)
164 ret = scm_call(SCM_SVC_PIL, PAS_SHUTDOWN_CMD,
166 &scm_ret, sizeof(scm_ret));
168 return ret ? : scm_ret;
171 static int qproc_scm_clk_enable(struct qproc *qproc)
175 ret = clk_prepare_enable(qproc->scm_core_clk);
178 ret = clk_prepare_enable(qproc->scm_iface_clk);
181 ret = clk_prepare_enable(qproc->scm_bus_clk);
188 clk_disable_unprepare(qproc->scm_iface_clk);
190 clk_disable_unprepare(qproc->scm_core_clk);
195 static void qproc_scm_clk_disable(struct qproc *qproc)
197 clk_disable_unprepare(qproc->scm_core_clk);
198 clk_disable_unprepare(qproc->scm_iface_clk);
199 clk_disable_unprepare(qproc->scm_bus_clk);
203 * struct pil_mdt - Representation of <name>.mdt file in memory
205 * @phdr: ELF32 program headers
208 struct elf32_hdr hdr;
209 struct elf32_phdr phdr[];
212 #define segment_is_hash(flag) (((flag) & (0x7 << 24)) == (0x2 << 24))
214 static int segment_is_loadable(const struct elf32_phdr *p)
216 return (p->p_type == PT_LOAD) &&
217 !segment_is_hash(p->p_flags) &&
221 static bool segment_is_relocatable(const struct elf32_phdr *p)
223 return !!(p->p_flags & BIT(27));
227 * rproc_mdt_sanity_check() - sanity check mdt firmware header
228 * @rproc: the remote processor handle
229 * @fw: the mdt header firmware image
231 static int qproc_sanity_check(struct rproc *rproc,
232 const struct firmware *fw)
234 struct elf32_hdr *ehdr;
238 dev_err(&rproc->dev, "failed to load %s\n", rproc->name);
242 if (fw->size < sizeof(struct elf32_hdr)) {
243 dev_err(&rproc->dev, "image is too small\n");
247 mdt = (struct mdt_hdr *)fw->data;
250 if (memcmp(ehdr->e_ident, ELFMAG, SELFMAG)) {
251 dev_err(&rproc->dev, "image is corrupted (bad magic)\n");
255 if (ehdr->e_phnum == 0) {
256 dev_err(&rproc->dev, "no loadable segments\n");
260 if (sizeof(struct elf32_phdr) * ehdr->e_phnum +
261 sizeof(struct elf32_hdr) > fw->size) {
262 dev_err(&rproc->dev, "firmware size is too small\n");
269 static struct resource_table * qproc_find_rsc_table(struct rproc *rproc,
270 const struct firmware *fw,
273 static struct resource_table table = { .ver = 1, };
275 *tablesz = sizeof(table);
279 static int qproc_load_segment(struct rproc *rproc, const char *fw_name, const struct elf32_phdr *phdr)
281 const struct firmware *fw;
285 ptr = ioremap(phdr->p_paddr, phdr->p_memsz);
287 dev_err(&rproc->dev, "failed to ioremap segment area (0x%x+0x%x)\n", phdr->p_paddr, phdr->p_memsz);
291 if (phdr->p_filesz) {
292 ret = request_firmware(&fw, fw_name, &rproc->dev);
294 dev_err(&rproc->dev, "failed to load %s\n", fw_name);
298 memcpy(ptr, fw->data, fw->size);
300 release_firmware(fw);
303 if (phdr->p_memsz > phdr->p_filesz)
304 memset(ptr + phdr->p_filesz, 0, phdr->p_memsz - phdr->p_filesz);
311 static int qproc_load(struct rproc *rproc, const struct firmware *fw)
313 const struct elf32_phdr *phdr;
314 const struct elf32_hdr *ehdr;
315 const struct mdt_hdr *mdt;
316 phys_addr_t min_addr = (phys_addr_t)ULLONG_MAX;
317 phys_addr_t max_addr = 0;
318 struct qproc *qproc = rproc->priv;
323 ret = qproc_scm_clk_enable(qproc);
327 mdt = (struct mdt_hdr *)fw->data;
330 for (i = 0; i < ehdr->e_phnum; i++) {
331 phdr = &mdt->phdr[i];
333 if (!segment_is_loadable(phdr))
336 if (segment_is_relocatable(phdr)) {
337 dev_err(&rproc->dev, "relocation unsupported\n");
341 if (phdr->p_paddr < min_addr)
342 min_addr = phdr->p_paddr;
344 if (phdr->p_paddr + phdr->p_memsz > max_addr)
345 max_addr = ALIGN(phdr->p_paddr + phdr->p_memsz, SZ_4K);
348 ret = pas_init_image(qproc->pas_id, fw->data, fw->size);
350 dev_err(qproc->dev, "Invalid firmware metadata\n");
354 dev_dbg(qproc->dev, "pas_mem_setup(0x%x, 0x%x)\n", min_addr, max_addr - min_addr);
356 ret = pas_mem_setup(qproc->pas_id, min_addr, max_addr - min_addr);
358 dev_err(qproc->dev, "unable to setup memory for image\n");
362 fw_name = kzalloc(strlen(qproc->name) + 5, GFP_KERNEL);
366 for (i = 0; i < ehdr->e_phnum; i++) {
367 phdr = &mdt->phdr[i];
369 if (!segment_is_loadable(phdr))
372 sprintf(fw_name, "%s.b%02d", qproc->name, i);
373 ret = qproc_load_segment(rproc, fw_name, phdr);
380 qproc_scm_clk_disable(qproc);
385 const struct rproc_fw_ops qproc_fw_ops = {
386 .find_rsc_table = qproc_find_rsc_table,
388 .sanity_check = qproc_sanity_check,
391 static int qproc_start(struct rproc *rproc)
393 struct qproc *qproc = (struct qproc *)rproc->priv;
396 ret = regulator_enable(qproc->pll);
398 dev_err(qproc->dev, "failed to enable pll supply\n");
402 ret = qproc_scm_clk_enable(qproc);
404 goto disable_regulator;
406 ret = pas_auth_and_reset(qproc->pas_id);
409 "failed to authenticate image and release reset\n");
413 ret = wait_for_completion_timeout(&qproc->start_done, msecs_to_jiffies(10000));
415 dev_err(qproc->dev, "start timed out\n");
417 pas_shutdown(qproc->pas_id);
424 qproc_scm_clk_disable(qproc);
427 regulator_disable(qproc->pll);
432 static int qproc_stop(struct rproc *rproc)
434 struct qproc *qproc = (struct qproc *)rproc->priv;
437 gpiod_set_value(qproc->stop_gpio, 1);
439 ret = wait_for_completion_timeout(&qproc->stop_done, msecs_to_jiffies(1000));
441 dev_err(qproc->dev, "timed out on wait\n");
445 gpiod_set_value(qproc->stop_gpio, 0);
447 ret = pas_shutdown(qproc->pas_id);
449 dev_err(qproc->dev, "failed to shutdown: %d\n", ret);
453 static const struct rproc_ops qproc_ops = {
454 .start = qproc_start,
458 static irqreturn_t qproc_wdog_interrupt(int irq, void *dev)
460 struct qproc *qproc = dev;
462 rproc_report_crash(qproc->rproc, RPROC_WATCHDOG);
466 static irqreturn_t qproc_fatal_interrupt(int irq, void *dev)
468 struct qproc *qproc = dev;
473 ret = qcom_smem_get(&qproc->crash_reason, (void**)&msg, &len);
474 if (!ret && len > 0 && msg[0])
475 dev_err(qproc->dev, "fatal error received: %s\n", msg);
477 rproc_report_crash(qproc->rproc, RPROC_FATAL_ERROR);
482 qcom_smem_put(qproc->smem, msg);
489 static irqreturn_t qproc_ready_interrupt(int irq, void *dev)
491 struct qproc *qproc = dev;
493 complete(&qproc->start_done);
498 static irqreturn_t qproc_handover_interrupt(int irq, void *dev)
500 struct qproc *qproc = dev;
502 qproc_scm_clk_disable(qproc);
503 regulator_disable(qproc->pll);
507 static irqreturn_t qproc_stop_ack_interrupt(int irq, void *dev)
509 struct qproc *qproc = dev;
511 complete(&qproc->stop_done);
515 static ssize_t qproc_boot_store(struct device *dev,
516 struct device_attribute *attr,
517 const char *buf, size_t size)
519 struct qproc *qproc = dev_get_drvdata(dev);
522 ret = rproc_boot(qproc->rproc);
526 static ssize_t qproc_shutdown_store(struct device *dev,
527 struct device_attribute *attr,
528 const char *buf, size_t size)
530 struct qproc *qproc = dev_get_drvdata(dev);
532 rproc_shutdown(qproc->rproc);
536 static const struct device_attribute qproc_attrs[] = {
537 __ATTR(boot, S_IWUSR, 0, qproc_boot_store),
538 __ATTR(shutdown, S_IWUSR, 0, qproc_shutdown_store),
541 static int qproc_init_pas(struct qproc *qproc)
547 ret = of_property_read_u32(qproc->dev->of_node, key, &qproc->pas_id);
549 dev_err(qproc->dev, "Missing or incorrect %s\n", key);
553 if (!pas_supported(qproc->pas_id)) {
554 dev_err(qproc->dev, "PAS is not available for %d\n", qproc->pas_id);
561 static int qproc_init_clocks(struct qproc *qproc)
566 qproc->scm_core_clk = devm_clk_get(qproc->dev, "scm_core_clk");
567 if (IS_ERR(qproc->scm_core_clk)) {
568 if (PTR_ERR(qproc->scm_core_clk) != -EPROBE_DEFER)
569 dev_err(qproc->dev, "failed to acquire scm_core_clk\n");
570 return PTR_ERR(qproc->scm_core_clk);
573 qproc->scm_iface_clk = devm_clk_get(qproc->dev, "scm_iface_clk");
574 if (IS_ERR(qproc->scm_iface_clk)) {
575 if (PTR_ERR(qproc->scm_iface_clk) != -EPROBE_DEFER)
576 dev_err(qproc->dev, "failed to acquire scm_iface_clk\n");
577 return PTR_ERR(qproc->scm_iface_clk);
580 qproc->scm_bus_clk = devm_clk_get(qproc->dev, "scm_bus_clk");
581 if (IS_ERR(qproc->scm_bus_clk)) {
582 if (PTR_ERR(qproc->scm_bus_clk) != -EPROBE_DEFER)
583 dev_err(qproc->dev, "failed to acquire scm_bus_clk\n");
584 return PTR_ERR(qproc->scm_bus_clk);
587 rate = clk_round_rate(qproc->scm_core_clk, 50000000);
588 ret = clk_set_rate(qproc->scm_core_clk, rate);
590 dev_err(qproc->dev, "failed to set rate of scm_core_clk\n");
597 static int qproc_init_regulators(struct qproc *qproc)
603 qproc->pll = devm_regulator_get(qproc->dev, "qcom,pll");
604 if (IS_ERR(qproc->pll)) {
605 if (PTR_ERR(qproc->pll) != -EPROBE_DEFER)
606 dev_err(qproc->dev, "failed to aquire regulator\n");
607 return PTR_ERR(qproc->pll);
610 ret = of_property_read_u32(qproc->dev->of_node, "qcom,pll-uV", &uV);
612 dev_warn(qproc->dev, "failed to read qcom,pll_uV, skipping\n");
614 regulator_set_voltage(qproc->pll, uV, uV);
616 ret = of_property_read_u32(qproc->dev->of_node, "qcom,pll-uA", &uA);
618 dev_warn(qproc->dev, "failed to read qcom,pll_uA, skipping\n");
620 regulator_set_optimum_mode(qproc->pll, uA);
625 static int qproc_request_irq(struct qproc *qproc, struct platform_device *pdev, const char *name, irq_handler_t thread_fn)
629 ret = platform_get_irq_byname(pdev, name);
631 dev_err(&pdev->dev, "no %s IRQ defined\n", name);
635 ret = devm_request_threaded_irq(&pdev->dev, ret,
637 IRQF_TRIGGER_RISING | IRQF_ONESHOT,
640 dev_err(&pdev->dev, "request %s IRQ failed\n", name);
644 static int qproc_probe(struct platform_device *pdev)
654 key = "qcom,firmware-name";
655 ret = of_property_read_string(pdev->dev.of_node, key, &name);
657 dev_err(&pdev->dev, "missing or incorrect %s\n", key);
661 fw_name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "%s.mdt", name);
665 rproc = rproc_alloc(&pdev->dev, pdev->name, &qproc_ops,
666 fw_name, sizeof(*qproc));
670 rproc->fw_ops = &qproc_fw_ops;
672 qproc = (struct qproc *)rproc->priv;
673 qproc->dev = &pdev->dev;
674 qproc->rproc = rproc;
676 platform_set_drvdata(pdev, qproc);
678 init_completion(&qproc->start_done);
679 init_completion(&qproc->stop_done);
681 ret = of_parse_qcom_smem_item(pdev->dev.of_node,
682 "qcom,crash-reason", 0,
683 &qproc->crash_reason);
685 if (ret != -EPROBE_DEFER)
686 dev_err(&pdev->dev, "failed to acquire smem handle\n");
690 ret = qproc_init_pas(qproc);
694 ret = qproc_init_clocks(qproc);
698 ret = qproc_init_regulators(qproc);
702 ret = qproc_request_irq(qproc, pdev, "wdog", qproc_wdog_interrupt);
705 qproc->wdog_irq = ret;
707 ret = qproc_request_irq(qproc, pdev, "fatal", qproc_fatal_interrupt);
710 qproc->fatal_irq = ret;
712 ret = qproc_request_irq(qproc, pdev, "ready", qproc_ready_interrupt);
715 qproc->ready_irq = ret;
717 ret = qproc_request_irq(qproc, pdev, "handover", qproc_handover_interrupt);
720 qproc->handover_irq = ret;
722 ret = qproc_request_irq(qproc, pdev, "stop-ack", qproc_stop_ack_interrupt);
725 qproc->stop_ack_irq = ret;
727 qproc->stop_gpio = devm_gpiod_get(&pdev->dev, "qcom,stop", GPIOD_OUT_LOW);
728 if (IS_ERR(qproc->stop_gpio)) {
729 dev_err(&pdev->dev, "failed to acquire stop gpio\n");
730 return PTR_ERR(qproc->stop_gpio);
733 for (i = 0; i < ARRAY_SIZE(qproc_attrs); i++) {
734 ret = device_create_file(&pdev->dev, &qproc_attrs[i]);
736 dev_err(&pdev->dev, "unable to create sysfs file\n");
737 goto remove_device_files;
741 ret = rproc_add(rproc);
743 goto remove_device_files;
748 for (i--; i >= 0; i--)
749 device_remove_file(&pdev->dev, &qproc_attrs[i]);
757 static int qproc_remove(struct platform_device *pdev)
759 struct qproc *qproc = platform_get_drvdata(pdev);
762 for (i = 0; i < ARRAY_SIZE(qproc_attrs); i++)
763 device_remove_file(&pdev->dev, &qproc_attrs[i]);
765 rproc_put(qproc->rproc);
770 static const struct of_device_id qproc_of_match[] = {
771 { .compatible = "qcom,tz-pil", },
775 static struct platform_driver qproc_driver = {
776 .probe = qproc_probe,
777 .remove = qproc_remove,
779 .name = "qcom-tz-pil",
780 .owner = THIS_MODULE,
781 .of_match_table = qproc_of_match,
785 module_platform_driver(qproc_driver);