From: Roger Quadros <rogerq@ti.com>
To: ohad@wizery.com, bjorn.andersson@linaro.org
Cc: tony@atomide.com, robh+dt@kernel.org, bcousson@baylibre.com,
ssantosh@kernel.org, s-anna@ti.com, nsekhar@ti.com,
t-kristo@ti.com, nsaulnier@ti.com, jreeder@ti.com,
m-karicheri2@ti.com, woods.technical@gmail.com,
linux-omap@vger.kernel.org, linux-remoteproc@vger.kernel.org,
linux-kernel@vger.kernel.org, devicetree@vger.kernel.org,
rogerq@ti.com
Subject: [PATCH 15/16] remoteproc/pru: add support for parsing pru interrupt mapping from DT
Date: Mon, 26 Nov 2018 09:52:48 +0200 [thread overview]
Message-ID: <1543218769-5507-16-git-send-email-rogerq@ti.com> (raw)
In-Reply-To: <1543218769-5507-1-git-send-email-rogerq@ti.com>
From: Tero Kristo <t-kristo@ti.com>
PRU interrupt mapping can now be parsed from devicetree also, from
ti,pru-interrupt-map property. This is an alternative configuration
method in addition to the legacy resource table config. If both are
provided, the config in DT takes precedence.
Signed-off-by: Tero Kristo <t-kristo@ti.com>
[s-anna@ti.com: various fixes and cleanups]
Signed-off-by: Suman Anna <s-anna@ti.com>
Signed-off-by: Roger Quadros <rogerq@ti.com>
---
drivers/remoteproc/pru_rproc.c | 109 +++++++++++++++++++++++++++++++++++++++--
1 file changed, 106 insertions(+), 3 deletions(-)
diff --git a/drivers/remoteproc/pru_rproc.c b/drivers/remoteproc/pru_rproc.c
index 84f006b..540cce3 100644
--- a/drivers/remoteproc/pru_rproc.c
+++ b/drivers/remoteproc/pru_rproc.c
@@ -63,6 +63,7 @@ enum pru_mem {
* @irq_ring: IRQ number to use for processing vring buffers
* @irq_kick: IRQ number to use to perform virtio kick
* @mem_regions: data for each of the PRU memory regions
+ * @intc_config: PRU INTC configuration data
* @dram0: PRUSS DRAM0 region
* @dram1: PRUSS DRAM1 region
* @shrdram: PRUSS SHARED RAM region
@@ -73,6 +74,7 @@ enum pru_mem {
* @shrdram_da: device address of shared Data RAM
* @fw_name: name of firmware image used during loading
* @gpmux_save: saved value for gpmux config
+ * @dt_irqs: number of irqs configured from DT
* @lock: mutex to protect client usage
* @dbg_single_step: debug state variable to set PRU into single step mode
* @dbg_continuous: debug state variable to restore PRU execution mode
@@ -87,6 +89,7 @@ struct pru_rproc {
int irq_vring;
int irq_kick;
struct pruss_mem_region mem_regions[PRU_MEM_MAX];
+ struct pruss_intc_config intc_config;
struct pruss_mem_region dram0;
struct pruss_mem_region dram1;
struct pruss_mem_region shrdram;
@@ -97,6 +100,7 @@ struct pru_rproc {
u32 shrdram_da;
const char *fw_name;
u8 gpmux_save;
+ int dt_irqs;
struct mutex lock; /* client access lock */
u32 dbg_single_step;
u32 dbg_continuous;
@@ -180,6 +184,87 @@ static struct rproc *__pru_rproc_get(struct device_node *np, int index)
return rproc;
}
+static int pru_get_intc_dt_config(struct device *dev, const char *propname,
+ int index,
+ struct pruss_intc_config *intc_config)
+{
+ struct device_node *np = dev->of_node;
+ struct property *prop;
+ int ret = 0, entries, i;
+ int dt_irqs = 0;
+ u32 *arr;
+ int max_system_events, max_pru_channels, max_pru_host_ints;
+
+ max_system_events = MAX_PRU_SYS_EVENTS;
+ max_pru_channels = MAX_PRU_CHANNELS;
+ max_pru_host_ints = MAX_PRU_CHANNELS;
+
+ prop = of_find_property(np, propname, NULL);
+ if (!prop)
+ return 0;
+
+ entries = of_property_count_u32_elems(np, propname);
+ if (entries <= 0 || entries % 4)
+ return -EINVAL;
+
+ arr = kmalloc_array(entries, sizeof(u32), GFP_KERNEL);
+ if (!arr)
+ return -ENOMEM;
+
+ ret = of_property_read_u32_array(np, propname, arr, entries);
+ if (ret)
+ return -EINVAL;
+
+ for (i = 0; i < ARRAY_SIZE(intc_config->sysev_to_ch); i++)
+ intc_config->sysev_to_ch[i] = -1;
+
+ for (i = 0; i < ARRAY_SIZE(intc_config->ch_to_host); i++)
+ intc_config->ch_to_host[i] = -1;
+
+ for (i = 0; i < entries; i += 4) {
+ if (arr[i] != index)
+ continue;
+
+ if (arr[i + 1] < 0 ||
+ arr[i + 1] >= max_system_events) {
+ dev_dbg(dev, "bad sys event %d\n", arr[i + 1]);
+ ret = -EINVAL;
+ goto err;
+ }
+
+ if (arr[i + 2] < 0 ||
+ arr[i + 2] >= max_pru_channels) {
+ dev_dbg(dev, "bad channel %d\n", arr[i + 2]);
+ ret = -EINVAL;
+ goto err;
+ }
+
+ if (arr[i + 3] < 0 ||
+ arr[i + 3] >= max_pru_host_ints) {
+ dev_dbg(dev, "bad irq %d\n", arr[i + 3]);
+ ret = -EINVAL;
+ goto err;
+ }
+
+ intc_config->sysev_to_ch[arr[i + 1]] = arr[i + 2];
+ dev_dbg(dev, "sysevt-to-ch[%d] -> %d\n", arr[i + 1],
+ arr[i + 2]);
+
+ intc_config->ch_to_host[arr[i + 2]] = arr[i + 3];
+ dev_dbg(dev, "chnl-to-host[%d] -> %d\n", arr[i + 2],
+ arr[i + 3]);
+
+ dt_irqs++;
+ }
+
+ kfree(arr);
+ return dt_irqs;
+
+err:
+ kfree(arr);
+ return ret;
+}
+
/**
* pru_rproc_get() - get the PRU rproc instance from a device node
* @np: the user/client device node
@@ -251,6 +336,15 @@ struct rproc *pru_rproc_get(struct device_node *np, int index)
}
}
+ ret = pru_get_intc_dt_config(dev, "ti,pru-interrupt-map",
+ index, &pru->intc_config);
+ if (ret < 0) {
+ dev_err(dev, "error getting DT interrupt map: %d\n", ret);
+ goto err;
+ }
+
+ pru->dt_irqs = ret;
+
return rproc;
err:
@@ -568,7 +662,13 @@ static int pru_rproc_start(struct rproc *rproc)
dev_dbg(dev, "starting PRU%d: entry-point = 0x%x\n",
pru->id, (rproc->bootaddr >> 2));
- /* TODO: INTC setup */
+ if (pru->dt_irqs) {
+ ret = pruss_intc_configure(pru->pruss, &pru->intc_config);
+ if (ret) {
+ dev_err(dev, "failed to configure intc %d\n", ret);
+ return ret;
+ }
+ }
if (!list_empty(&pru->rproc->rvdevs)) {
if (!pru->mbox && (pru->irq_vring <= 0 || pru->irq_kick <= 0)) {
@@ -596,7 +696,8 @@ static int pru_rproc_start(struct rproc *rproc)
return 0;
fail:
- /* TODO: INTC cleanup */
+ if (pru->dt_irqs)
+ pruss_intc_unconfigure(pru->pruss, &pru->intc_config);
return ret;
}
@@ -618,7 +719,9 @@ static int pru_rproc_stop(struct rproc *rproc)
!pru->mbox && pru->irq_vring > 0)
free_irq(pru->irq_vring, pru);
- /* TODO: INTC cleanup */
+ /* undo INTC config */
+ if (pru->dt_irqs)
+ pruss_intc_unconfigure(pru->pruss, &pru->intc_config);
return 0;
}
--
Texas Instruments Finland Oy, Porkkalankatu 22, 00180 Helsinki.
Y-tunnus/Business ID: 0615521-4. Kotipaikka/Domicile: Helsinki
next prev parent reply other threads:[~2018-11-26 7:52 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-11-26 7:52 [PATCH 00/16] remoteproc: Add support for TI PRU Roger Quadros
2018-11-26 7:52 ` [PATCH 01/16] remoteproc: Extend rproc_da_to_va() API with a flags parameter Roger Quadros
2018-11-26 21:29 ` David Lechner
2018-11-29 10:29 ` Roger Quadros
2018-11-29 16:12 ` David Lechner
2018-12-04 10:03 ` Roger Quadros
2019-02-14 3:35 ` Suman Anna
2018-11-26 7:52 ` [PATCH 02/16] remoteproc: Add a rproc_set_firmware() API Roger Quadros
2018-11-26 21:41 ` David Lechner
2018-11-29 8:51 ` Roger Quadros
2018-11-26 7:52 ` [PATCH 03/16] remoteproc: Add support to handle device specific resource types Roger Quadros
2018-11-26 7:52 ` [PATCH 04/16] remoteproc/pru: Add PRU remoteproc driver Roger Quadros
2018-11-26 22:32 ` David Lechner
2018-11-29 9:26 ` Roger Quadros
2018-11-30 21:39 ` Dimitar Dimitrov
2018-12-04 8:47 ` Roger Quadros
2018-12-14 9:53 ` Roger Quadros
2018-12-15 13:43 ` Dimitar Dimitrov
2018-11-26 7:52 ` [PATCH 05/16] remoteproc/pru: Add pru-specific debugfs support Roger Quadros
2018-11-26 22:37 ` David Lechner
2018-11-29 10:17 ` Roger Quadros
2018-12-18 15:51 ` Roger Quadros
2018-12-19 12:38 ` Mark Brown
2018-12-19 15:43 ` Roger Quadros
2018-12-19 15:48 ` David Lechner
2018-12-19 17:07 ` Mark Brown
2018-12-19 17:18 ` Tony Lindgren
2018-12-20 8:45 ` Roger Quadros
2018-11-26 7:52 ` [PATCH 06/16] dt-bindings: remoteproc: ti-pruss: Update bindings for supporting rpmsg Roger Quadros
2018-11-26 7:52 ` [PATCH 07/16] remoteproc/pru: Add support for virtio rpmsg stack Roger Quadros
2018-11-26 7:52 ` [PATCH 08/16] remoteproc/pru: Add pru_rproc_set_ctable() function Roger Quadros
2018-11-26 7:52 ` [PATCH 09/16] remoteproc/pru: add APIs to get and put the PRU cores Roger Quadros
2018-11-26 7:52 ` [PATCH 10/16] remoteproc/pru: add pru_rproc_get_id() API to retrieve the PRU id Roger Quadros
2018-11-26 7:52 ` [PATCH 11/16] soc: ti: pruss: add helper functions to set GPI mode, MII_RT_event and XFR Roger Quadros
2018-11-26 7:52 ` [PATCH 12/16] dt-bindings: remoteproc: ti-pruss: Document application node bindings Roger Quadros
2018-11-26 23:27 ` David Lechner
2018-11-29 10:07 ` Roger Quadros
2018-11-29 16:33 ` David Lechner
2018-11-30 11:42 ` Roger Quadros
2018-12-11 22:06 ` Rob Herring
2018-12-17 16:03 ` Roger Quadros
2018-11-26 7:52 ` [PATCH 13/16] remoteproc/pru: add support for configuring GPMUX based on client setup Roger Quadros
2018-11-26 7:52 ` [PATCH 14/16] remoteproc/pru: configure firmware " Roger Quadros
2018-11-26 7:52 ` Roger Quadros [this message]
2018-11-26 7:52 ` [PATCH 16/16] remoteproc/pru: Add support for INTC Interrupt map resource Roger Quadros
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1543218769-5507-16-git-send-email-rogerq@ti.com \
--to=rogerq@ti.com \
--cc=bcousson@baylibre.com \
--cc=bjorn.andersson@linaro.org \
--cc=devicetree@vger.kernel.org \
--cc=jreeder@ti.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-omap@vger.kernel.org \
--cc=linux-remoteproc@vger.kernel.org \
--cc=m-karicheri2@ti.com \
--cc=nsaulnier@ti.com \
--cc=nsekhar@ti.com \
--cc=ohad@wizery.com \
--cc=robh+dt@kernel.org \
--cc=s-anna@ti.com \
--cc=ssantosh@kernel.org \
--cc=t-kristo@ti.com \
--cc=tony@atomide.com \
--cc=woods.technical@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).