From: Bjorn Andersson <bjorn.andersson@linaro.org>
To: Alexandre Bailon <abailon@baylibre.com>
Cc: ohad@wizery.com, mathieu.poirier@linaro.org, robh+dt@kernel.or,
matthias.bgg@gmail.com, linux-remoteproc@vger.kernel.org,
devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
linux-mediatek@lists.infradead.org, linux-kernel@vger.kernel.org,
stephane.leprovost@mediatek.com, khilman@baylibre.com
Subject: Re: [PATCH v4 4/7] remoteproc: mtk_apu: Add support of JTAG
Date: Mon, 14 Mar 2022 17:24:18 -0500 [thread overview]
Message-ID: <Yi/AkpIPO94E1qFg@builder.lan> (raw)
In-Reply-To: <20220304161514.994128-5-abailon@baylibre.com>
On Fri 04 Mar 10:15 CST 2022, Alexandre Bailon wrote:
> The DSP could be debugged using JTAG.
> The support of JTAG could enabled at build time and it could be enabled
> using debugfs.
>
> Signed-off-by: Alexandre Bailon <abailon@baylibre.com>
> ---
> drivers/remoteproc/Kconfig | 9 +++
> drivers/remoteproc/mtk_apu.c | 147 ++++++++++++++++++++++++++++++++++-
> 2 files changed, 155 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/remoteproc/Kconfig b/drivers/remoteproc/Kconfig
> index 959d24e9492c..28140cf04d8a 100644
> --- a/drivers/remoteproc/Kconfig
> +++ b/drivers/remoteproc/Kconfig
> @@ -74,6 +74,15 @@ config MTK_APU
>
> It's safe to say N here.
>
> +config MTK_APU_JTAG
> + bool "Enable support of JTAG"
> + depends on MTK_APU
> + help
> + Say y to enable support of JTAG.
> + By default, JTAG will remain disabled until it is enabled using
> + debugfs: remoteproc/remoteproc0/jtag. Write 1 to enable it and
> + 0 to disable it.
> +
> config OMAP_REMOTEPROC
> tristate "OMAP remoteproc support"
> depends on ARCH_OMAP4 || SOC_OMAP5 || SOC_DRA7XX
> diff --git a/drivers/remoteproc/mtk_apu.c b/drivers/remoteproc/mtk_apu.c
> index 867b4682b507..3905eb5b7174 100644
> --- a/drivers/remoteproc/mtk_apu.c
> +++ b/drivers/remoteproc/mtk_apu.c
> @@ -5,12 +5,14 @@
>
> #include <linux/bitops.h>
> #include <linux/clk.h>
> +#include <linux/debugfs.h>
> #include <linux/delay.h>
> #include <linux/interrupt.h>
> #include <linux/iommu.h>
> #include <linux/irq.h>
> #include <linux/module.h>
> #include <linux/of_reserved_mem.h>
> +#include <linux/pinctrl/consumer.h>
> #include <linux/platform_device.h>
> #include <linux/remoteproc.h>
> #include <linux/string.h>
> @@ -45,6 +47,11 @@
> #define CORE_DEFAULT1 (0x00000140)
> #define CORE_DEFAULT0_ARUSER_IDMA_USE_IOMMU (0x10 << 0)
> #define CORE_DEFAULT0_AWUSER_IDMA_USE_IOMMU (0x10 << 5)
> +#define CORE_DEFAULT2 (0x00000144)
> +#define CORE_DEFAULT2_DBG_EN BIT(3)
> +#define CORE_DEFAULT2_NIDEN BIT(2)
> +#define CORE_DEFAULT2_SPNIDEN BIT(1)
> +#define CORE_DEFAULT2_SPIDEN BIT(0)
> #define CORE_XTENSA_ALTRESETVEC (0x000001F8)
>
> #define VDEV_MEM_COUNT (3)
> @@ -59,6 +66,13 @@ struct mtk_apu_rproc {
> struct clk_bulk_data *clks;
> struct iommu_domain *domain;
> struct list_head mappings;
> +
> +#ifdef CONFIG_MTK_APU_JTAG
> + struct pinctrl *pinctrl;
> + struct pinctrl_state *pinctrl_jtag;
> + bool jtag_enabled;
> + struct mutex jtag_mutex;
> +#endif
> };
>
> static const char * const mt8183_clk_names[] = {
> @@ -355,6 +369,133 @@ static irqreturn_t mtk_apu_rproc_callback(int irq, void *data)
> return IRQ_WAKE_THREAD;
> }
>
> +#ifdef CONFIG_MTK_APU_JTAG
Is there a strong reason to keep this compiled out? It's not that much
code and it means that I have to build test both variations...
> +
> +static int apu_enable_jtag(struct mtk_apu_rproc *apu_rproc)
> +{
> + int ret = 0;
> +
> + mutex_lock(&apu_rproc->jtag_mutex);
What happens if you perform the below writel() when jtag is already
enabled? I.e. do you need this mutex or could you simply have
enable/disable just write the register?
> + if (apu_rproc->jtag_enabled)
> + goto err_mutex_unlock;
> +
> + writel(CORE_DEFAULT2_SPNIDEN | CORE_DEFAULT2_SPIDEN |
> + CORE_DEFAULT2_NIDEN | CORE_DEFAULT2_DBG_EN,
> + apu_rproc->base + CORE_DEFAULT2);
> +
> + apu_rproc->jtag_enabled = 1;
> +
> +err_mutex_unlock:
> + mutex_unlock(&apu_rproc->jtag_mutex);
> +
> + return ret;
> +}
> +
> +static int apu_disable_jtag(struct mtk_apu_rproc *apu_rproc)
> +{
> + int ret = 0;
> +
> + mutex_lock(&apu_rproc->jtag_mutex);
> + if (!apu_rproc->jtag_enabled)
> + goto err_mutex_unlock;
> +
> + writel(0, apu_rproc->base + CORE_DEFAULT2);
> +
> + apu_rproc->jtag_enabled = 0;
> +
> +err_mutex_unlock:
> + mutex_unlock(&apu_rproc->jtag_mutex);
> +
> + return ret;
> +}
> +
> +static ssize_t rproc_jtag_read(struct file *filp, char __user *userbuf,
> + size_t count, loff_t *ppos)
> +{
> + struct rproc *rproc = filp->private_data;
> + struct mtk_apu_rproc *apu_rproc = (struct mtk_apu_rproc *)rproc->priv;
> + char *buf = apu_rproc->jtag_enabled ? "enabled\n" : "disabled\n";
> +
> + return simple_read_from_buffer(userbuf, count, ppos, buf, strlen(buf));
Per my ask about write below, please make this read 'Y' or 'N'.
> +}
> +
> +static ssize_t rproc_jtag_write(struct file *filp, const char __user *user_buf,
> + size_t count, loff_t *ppos)
> +{
> + struct rproc *rproc = filp->private_data;
> + struct mtk_apu_rproc *apu_rproc = (struct mtk_apu_rproc *)rproc->priv;
> + char buf[10];
> + int ret;
> +
> + if (count < 1 || count > sizeof(buf))
> + return -EINVAL;
> +
> + ret = copy_from_user(buf, user_buf, count);
> + if (ret)
> + return -EFAULT;
> +
> + /* remove end of line */
> + if (buf[count - 1] == '\n')
> + buf[count - 1] = '\0';
> +
Please use kstrtobool_from_user().
> + if (!strncmp(buf, "enabled", count))
> + ret = apu_enable_jtag(apu_rproc);
> + else if (!strncmp(buf, "disabled", count))
> + ret = apu_disable_jtag(apu_rproc);
> + else
> + return -EINVAL;
> +
> + return ret ? ret : count;
> +}
> +
> +static const struct file_operations rproc_jtag_ops = {
> + .read = rproc_jtag_read,
> + .write = rproc_jtag_write,
> + .open = simple_open,
> +};
> +
> +static int apu_jtag_probe(struct mtk_apu_rproc *apu_rproc)
> +{
> + int ret;
> +
> + if (!apu_rproc->rproc->dbg_dir)
> + return -ENODEV;
> +
> + apu_rproc->pinctrl = devm_pinctrl_get(apu_rproc->dev);
> + if (IS_ERR(apu_rproc->pinctrl)) {
> + dev_warn(apu_rproc->dev, "Failed to find JTAG pinctrl\n");
I believe you failed to find the pinctrl instance for the remoteproc
driver, not for the JTAG.
> + return PTR_ERR(apu_rproc->pinctrl);
> + }
> +
> + apu_rproc->pinctrl_jtag = pinctrl_lookup_state(apu_rproc->pinctrl,
> + "jtag");
> + if (IS_ERR(apu_rproc->pinctrl_jtag))
> + return PTR_ERR(apu_rproc->pinctrl_jtag);
> +
> + ret = pinctrl_select_state(apu_rproc->pinctrl,
> + apu_rproc->pinctrl_jtag);
So if the kernel is compiled with MTK_APU_JTAG "jtag" is the new
"default" for this device?
Regards,
Bjorn
> + if (ret < 0)
> + return ret;
> +
> + mutex_init(&apu_rproc->jtag_mutex);
> +
> + debugfs_create_file("jtag", 0600, apu_rproc->rproc->dbg_dir,
> + apu_rproc->rproc, &rproc_jtag_ops);
> +
> + return 0;
> +}
> +#else
> +static int apu_jtag_probe(struct mtk_apu_rproc *apu_rproc)
> +{
> + return 0;
> +}
> +
> +static int apu_disable_jtag(struct mtk_apu_rproc *apu_rproc)
> +{
> + return 0;
> +}
> +#endif /* CONFIG_MTK_APU_JTAG */
> +
> static int mtk_apu_rproc_probe(struct platform_device *pdev)
> {
> struct device *dev = &pdev->dev;
> @@ -442,6 +583,10 @@ static int mtk_apu_rproc_probe(struct platform_device *pdev)
> goto free_rproc;
> }
>
> + ret = apu_jtag_probe(apu_rproc);
> + if (ret)
> + dev_warn(dev, "Failed to configure jtag\n");
If devm_pinctrl_get() failed you'll get two warnings, and if the user
haven't added a "jtag" pinctrl state this warning isn't very
descriptive. Consider omitting it and add appropriate error messages in
apu_jtag_probe().
Regards,
Bjorn
> +
> return 0;
>
> free_rproc:
> @@ -457,7 +602,7 @@ static int mtk_apu_rproc_remove(struct platform_device *pdev)
> struct device *dev = &pdev->dev;
>
> disable_irq(apu_rproc->irq);
> -
> + apu_disable_jtag(apu_rproc);
> rproc_del(rproc);
> of_reserved_mem_device_release(dev);
> rproc_free(rproc);
> --
> 2.34.1
>
_______________________________________________
Linux-mediatek mailing list
Linux-mediatek@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-mediatek
WARNING: multiple messages have this Message-ID (diff)
From: Bjorn Andersson <bjorn.andersson@linaro.org>
To: Alexandre Bailon <abailon@baylibre.com>
Cc: ohad@wizery.com, mathieu.poirier@linaro.org, robh+dt@kernel.or,
matthias.bgg@gmail.com, linux-remoteproc@vger.kernel.org,
devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
linux-mediatek@lists.infradead.org, linux-kernel@vger.kernel.org,
stephane.leprovost@mediatek.com, khilman@baylibre.com
Subject: Re: [PATCH v4 4/7] remoteproc: mtk_apu: Add support of JTAG
Date: Mon, 14 Mar 2022 17:24:18 -0500 [thread overview]
Message-ID: <Yi/AkpIPO94E1qFg@builder.lan> (raw)
In-Reply-To: <20220304161514.994128-5-abailon@baylibre.com>
On Fri 04 Mar 10:15 CST 2022, Alexandre Bailon wrote:
> The DSP could be debugged using JTAG.
> The support of JTAG could enabled at build time and it could be enabled
> using debugfs.
>
> Signed-off-by: Alexandre Bailon <abailon@baylibre.com>
> ---
> drivers/remoteproc/Kconfig | 9 +++
> drivers/remoteproc/mtk_apu.c | 147 ++++++++++++++++++++++++++++++++++-
> 2 files changed, 155 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/remoteproc/Kconfig b/drivers/remoteproc/Kconfig
> index 959d24e9492c..28140cf04d8a 100644
> --- a/drivers/remoteproc/Kconfig
> +++ b/drivers/remoteproc/Kconfig
> @@ -74,6 +74,15 @@ config MTK_APU
>
> It's safe to say N here.
>
> +config MTK_APU_JTAG
> + bool "Enable support of JTAG"
> + depends on MTK_APU
> + help
> + Say y to enable support of JTAG.
> + By default, JTAG will remain disabled until it is enabled using
> + debugfs: remoteproc/remoteproc0/jtag. Write 1 to enable it and
> + 0 to disable it.
> +
> config OMAP_REMOTEPROC
> tristate "OMAP remoteproc support"
> depends on ARCH_OMAP4 || SOC_OMAP5 || SOC_DRA7XX
> diff --git a/drivers/remoteproc/mtk_apu.c b/drivers/remoteproc/mtk_apu.c
> index 867b4682b507..3905eb5b7174 100644
> --- a/drivers/remoteproc/mtk_apu.c
> +++ b/drivers/remoteproc/mtk_apu.c
> @@ -5,12 +5,14 @@
>
> #include <linux/bitops.h>
> #include <linux/clk.h>
> +#include <linux/debugfs.h>
> #include <linux/delay.h>
> #include <linux/interrupt.h>
> #include <linux/iommu.h>
> #include <linux/irq.h>
> #include <linux/module.h>
> #include <linux/of_reserved_mem.h>
> +#include <linux/pinctrl/consumer.h>
> #include <linux/platform_device.h>
> #include <linux/remoteproc.h>
> #include <linux/string.h>
> @@ -45,6 +47,11 @@
> #define CORE_DEFAULT1 (0x00000140)
> #define CORE_DEFAULT0_ARUSER_IDMA_USE_IOMMU (0x10 << 0)
> #define CORE_DEFAULT0_AWUSER_IDMA_USE_IOMMU (0x10 << 5)
> +#define CORE_DEFAULT2 (0x00000144)
> +#define CORE_DEFAULT2_DBG_EN BIT(3)
> +#define CORE_DEFAULT2_NIDEN BIT(2)
> +#define CORE_DEFAULT2_SPNIDEN BIT(1)
> +#define CORE_DEFAULT2_SPIDEN BIT(0)
> #define CORE_XTENSA_ALTRESETVEC (0x000001F8)
>
> #define VDEV_MEM_COUNT (3)
> @@ -59,6 +66,13 @@ struct mtk_apu_rproc {
> struct clk_bulk_data *clks;
> struct iommu_domain *domain;
> struct list_head mappings;
> +
> +#ifdef CONFIG_MTK_APU_JTAG
> + struct pinctrl *pinctrl;
> + struct pinctrl_state *pinctrl_jtag;
> + bool jtag_enabled;
> + struct mutex jtag_mutex;
> +#endif
> };
>
> static const char * const mt8183_clk_names[] = {
> @@ -355,6 +369,133 @@ static irqreturn_t mtk_apu_rproc_callback(int irq, void *data)
> return IRQ_WAKE_THREAD;
> }
>
> +#ifdef CONFIG_MTK_APU_JTAG
Is there a strong reason to keep this compiled out? It's not that much
code and it means that I have to build test both variations...
> +
> +static int apu_enable_jtag(struct mtk_apu_rproc *apu_rproc)
> +{
> + int ret = 0;
> +
> + mutex_lock(&apu_rproc->jtag_mutex);
What happens if you perform the below writel() when jtag is already
enabled? I.e. do you need this mutex or could you simply have
enable/disable just write the register?
> + if (apu_rproc->jtag_enabled)
> + goto err_mutex_unlock;
> +
> + writel(CORE_DEFAULT2_SPNIDEN | CORE_DEFAULT2_SPIDEN |
> + CORE_DEFAULT2_NIDEN | CORE_DEFAULT2_DBG_EN,
> + apu_rproc->base + CORE_DEFAULT2);
> +
> + apu_rproc->jtag_enabled = 1;
> +
> +err_mutex_unlock:
> + mutex_unlock(&apu_rproc->jtag_mutex);
> +
> + return ret;
> +}
> +
> +static int apu_disable_jtag(struct mtk_apu_rproc *apu_rproc)
> +{
> + int ret = 0;
> +
> + mutex_lock(&apu_rproc->jtag_mutex);
> + if (!apu_rproc->jtag_enabled)
> + goto err_mutex_unlock;
> +
> + writel(0, apu_rproc->base + CORE_DEFAULT2);
> +
> + apu_rproc->jtag_enabled = 0;
> +
> +err_mutex_unlock:
> + mutex_unlock(&apu_rproc->jtag_mutex);
> +
> + return ret;
> +}
> +
> +static ssize_t rproc_jtag_read(struct file *filp, char __user *userbuf,
> + size_t count, loff_t *ppos)
> +{
> + struct rproc *rproc = filp->private_data;
> + struct mtk_apu_rproc *apu_rproc = (struct mtk_apu_rproc *)rproc->priv;
> + char *buf = apu_rproc->jtag_enabled ? "enabled\n" : "disabled\n";
> +
> + return simple_read_from_buffer(userbuf, count, ppos, buf, strlen(buf));
Per my ask about write below, please make this read 'Y' or 'N'.
> +}
> +
> +static ssize_t rproc_jtag_write(struct file *filp, const char __user *user_buf,
> + size_t count, loff_t *ppos)
> +{
> + struct rproc *rproc = filp->private_data;
> + struct mtk_apu_rproc *apu_rproc = (struct mtk_apu_rproc *)rproc->priv;
> + char buf[10];
> + int ret;
> +
> + if (count < 1 || count > sizeof(buf))
> + return -EINVAL;
> +
> + ret = copy_from_user(buf, user_buf, count);
> + if (ret)
> + return -EFAULT;
> +
> + /* remove end of line */
> + if (buf[count - 1] == '\n')
> + buf[count - 1] = '\0';
> +
Please use kstrtobool_from_user().
> + if (!strncmp(buf, "enabled", count))
> + ret = apu_enable_jtag(apu_rproc);
> + else if (!strncmp(buf, "disabled", count))
> + ret = apu_disable_jtag(apu_rproc);
> + else
> + return -EINVAL;
> +
> + return ret ? ret : count;
> +}
> +
> +static const struct file_operations rproc_jtag_ops = {
> + .read = rproc_jtag_read,
> + .write = rproc_jtag_write,
> + .open = simple_open,
> +};
> +
> +static int apu_jtag_probe(struct mtk_apu_rproc *apu_rproc)
> +{
> + int ret;
> +
> + if (!apu_rproc->rproc->dbg_dir)
> + return -ENODEV;
> +
> + apu_rproc->pinctrl = devm_pinctrl_get(apu_rproc->dev);
> + if (IS_ERR(apu_rproc->pinctrl)) {
> + dev_warn(apu_rproc->dev, "Failed to find JTAG pinctrl\n");
I believe you failed to find the pinctrl instance for the remoteproc
driver, not for the JTAG.
> + return PTR_ERR(apu_rproc->pinctrl);
> + }
> +
> + apu_rproc->pinctrl_jtag = pinctrl_lookup_state(apu_rproc->pinctrl,
> + "jtag");
> + if (IS_ERR(apu_rproc->pinctrl_jtag))
> + return PTR_ERR(apu_rproc->pinctrl_jtag);
> +
> + ret = pinctrl_select_state(apu_rproc->pinctrl,
> + apu_rproc->pinctrl_jtag);
So if the kernel is compiled with MTK_APU_JTAG "jtag" is the new
"default" for this device?
Regards,
Bjorn
> + if (ret < 0)
> + return ret;
> +
> + mutex_init(&apu_rproc->jtag_mutex);
> +
> + debugfs_create_file("jtag", 0600, apu_rproc->rproc->dbg_dir,
> + apu_rproc->rproc, &rproc_jtag_ops);
> +
> + return 0;
> +}
> +#else
> +static int apu_jtag_probe(struct mtk_apu_rproc *apu_rproc)
> +{
> + return 0;
> +}
> +
> +static int apu_disable_jtag(struct mtk_apu_rproc *apu_rproc)
> +{
> + return 0;
> +}
> +#endif /* CONFIG_MTK_APU_JTAG */
> +
> static int mtk_apu_rproc_probe(struct platform_device *pdev)
> {
> struct device *dev = &pdev->dev;
> @@ -442,6 +583,10 @@ static int mtk_apu_rproc_probe(struct platform_device *pdev)
> goto free_rproc;
> }
>
> + ret = apu_jtag_probe(apu_rproc);
> + if (ret)
> + dev_warn(dev, "Failed to configure jtag\n");
If devm_pinctrl_get() failed you'll get two warnings, and if the user
haven't added a "jtag" pinctrl state this warning isn't very
descriptive. Consider omitting it and add appropriate error messages in
apu_jtag_probe().
Regards,
Bjorn
> +
> return 0;
>
> free_rproc:
> @@ -457,7 +602,7 @@ static int mtk_apu_rproc_remove(struct platform_device *pdev)
> struct device *dev = &pdev->dev;
>
> disable_irq(apu_rproc->irq);
> -
> + apu_disable_jtag(apu_rproc);
> rproc_del(rproc);
> of_reserved_mem_device_release(dev);
> rproc_free(rproc);
> --
> 2.34.1
>
WARNING: multiple messages have this Message-ID (diff)
From: Bjorn Andersson <bjorn.andersson@linaro.org>
To: Alexandre Bailon <abailon@baylibre.com>
Cc: ohad@wizery.com, mathieu.poirier@linaro.org, robh+dt@kernel.or,
matthias.bgg@gmail.com, linux-remoteproc@vger.kernel.org,
devicetree@vger.kernel.org, linux-arm-kernel@lists.infradead.org,
linux-mediatek@lists.infradead.org, linux-kernel@vger.kernel.org,
stephane.leprovost@mediatek.com, khilman@baylibre.com
Subject: Re: [PATCH v4 4/7] remoteproc: mtk_apu: Add support of JTAG
Date: Mon, 14 Mar 2022 17:24:18 -0500 [thread overview]
Message-ID: <Yi/AkpIPO94E1qFg@builder.lan> (raw)
In-Reply-To: <20220304161514.994128-5-abailon@baylibre.com>
On Fri 04 Mar 10:15 CST 2022, Alexandre Bailon wrote:
> The DSP could be debugged using JTAG.
> The support of JTAG could enabled at build time and it could be enabled
> using debugfs.
>
> Signed-off-by: Alexandre Bailon <abailon@baylibre.com>
> ---
> drivers/remoteproc/Kconfig | 9 +++
> drivers/remoteproc/mtk_apu.c | 147 ++++++++++++++++++++++++++++++++++-
> 2 files changed, 155 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/remoteproc/Kconfig b/drivers/remoteproc/Kconfig
> index 959d24e9492c..28140cf04d8a 100644
> --- a/drivers/remoteproc/Kconfig
> +++ b/drivers/remoteproc/Kconfig
> @@ -74,6 +74,15 @@ config MTK_APU
>
> It's safe to say N here.
>
> +config MTK_APU_JTAG
> + bool "Enable support of JTAG"
> + depends on MTK_APU
> + help
> + Say y to enable support of JTAG.
> + By default, JTAG will remain disabled until it is enabled using
> + debugfs: remoteproc/remoteproc0/jtag. Write 1 to enable it and
> + 0 to disable it.
> +
> config OMAP_REMOTEPROC
> tristate "OMAP remoteproc support"
> depends on ARCH_OMAP4 || SOC_OMAP5 || SOC_DRA7XX
> diff --git a/drivers/remoteproc/mtk_apu.c b/drivers/remoteproc/mtk_apu.c
> index 867b4682b507..3905eb5b7174 100644
> --- a/drivers/remoteproc/mtk_apu.c
> +++ b/drivers/remoteproc/mtk_apu.c
> @@ -5,12 +5,14 @@
>
> #include <linux/bitops.h>
> #include <linux/clk.h>
> +#include <linux/debugfs.h>
> #include <linux/delay.h>
> #include <linux/interrupt.h>
> #include <linux/iommu.h>
> #include <linux/irq.h>
> #include <linux/module.h>
> #include <linux/of_reserved_mem.h>
> +#include <linux/pinctrl/consumer.h>
> #include <linux/platform_device.h>
> #include <linux/remoteproc.h>
> #include <linux/string.h>
> @@ -45,6 +47,11 @@
> #define CORE_DEFAULT1 (0x00000140)
> #define CORE_DEFAULT0_ARUSER_IDMA_USE_IOMMU (0x10 << 0)
> #define CORE_DEFAULT0_AWUSER_IDMA_USE_IOMMU (0x10 << 5)
> +#define CORE_DEFAULT2 (0x00000144)
> +#define CORE_DEFAULT2_DBG_EN BIT(3)
> +#define CORE_DEFAULT2_NIDEN BIT(2)
> +#define CORE_DEFAULT2_SPNIDEN BIT(1)
> +#define CORE_DEFAULT2_SPIDEN BIT(0)
> #define CORE_XTENSA_ALTRESETVEC (0x000001F8)
>
> #define VDEV_MEM_COUNT (3)
> @@ -59,6 +66,13 @@ struct mtk_apu_rproc {
> struct clk_bulk_data *clks;
> struct iommu_domain *domain;
> struct list_head mappings;
> +
> +#ifdef CONFIG_MTK_APU_JTAG
> + struct pinctrl *pinctrl;
> + struct pinctrl_state *pinctrl_jtag;
> + bool jtag_enabled;
> + struct mutex jtag_mutex;
> +#endif
> };
>
> static const char * const mt8183_clk_names[] = {
> @@ -355,6 +369,133 @@ static irqreturn_t mtk_apu_rproc_callback(int irq, void *data)
> return IRQ_WAKE_THREAD;
> }
>
> +#ifdef CONFIG_MTK_APU_JTAG
Is there a strong reason to keep this compiled out? It's not that much
code and it means that I have to build test both variations...
> +
> +static int apu_enable_jtag(struct mtk_apu_rproc *apu_rproc)
> +{
> + int ret = 0;
> +
> + mutex_lock(&apu_rproc->jtag_mutex);
What happens if you perform the below writel() when jtag is already
enabled? I.e. do you need this mutex or could you simply have
enable/disable just write the register?
> + if (apu_rproc->jtag_enabled)
> + goto err_mutex_unlock;
> +
> + writel(CORE_DEFAULT2_SPNIDEN | CORE_DEFAULT2_SPIDEN |
> + CORE_DEFAULT2_NIDEN | CORE_DEFAULT2_DBG_EN,
> + apu_rproc->base + CORE_DEFAULT2);
> +
> + apu_rproc->jtag_enabled = 1;
> +
> +err_mutex_unlock:
> + mutex_unlock(&apu_rproc->jtag_mutex);
> +
> + return ret;
> +}
> +
> +static int apu_disable_jtag(struct mtk_apu_rproc *apu_rproc)
> +{
> + int ret = 0;
> +
> + mutex_lock(&apu_rproc->jtag_mutex);
> + if (!apu_rproc->jtag_enabled)
> + goto err_mutex_unlock;
> +
> + writel(0, apu_rproc->base + CORE_DEFAULT2);
> +
> + apu_rproc->jtag_enabled = 0;
> +
> +err_mutex_unlock:
> + mutex_unlock(&apu_rproc->jtag_mutex);
> +
> + return ret;
> +}
> +
> +static ssize_t rproc_jtag_read(struct file *filp, char __user *userbuf,
> + size_t count, loff_t *ppos)
> +{
> + struct rproc *rproc = filp->private_data;
> + struct mtk_apu_rproc *apu_rproc = (struct mtk_apu_rproc *)rproc->priv;
> + char *buf = apu_rproc->jtag_enabled ? "enabled\n" : "disabled\n";
> +
> + return simple_read_from_buffer(userbuf, count, ppos, buf, strlen(buf));
Per my ask about write below, please make this read 'Y' or 'N'.
> +}
> +
> +static ssize_t rproc_jtag_write(struct file *filp, const char __user *user_buf,
> + size_t count, loff_t *ppos)
> +{
> + struct rproc *rproc = filp->private_data;
> + struct mtk_apu_rproc *apu_rproc = (struct mtk_apu_rproc *)rproc->priv;
> + char buf[10];
> + int ret;
> +
> + if (count < 1 || count > sizeof(buf))
> + return -EINVAL;
> +
> + ret = copy_from_user(buf, user_buf, count);
> + if (ret)
> + return -EFAULT;
> +
> + /* remove end of line */
> + if (buf[count - 1] == '\n')
> + buf[count - 1] = '\0';
> +
Please use kstrtobool_from_user().
> + if (!strncmp(buf, "enabled", count))
> + ret = apu_enable_jtag(apu_rproc);
> + else if (!strncmp(buf, "disabled", count))
> + ret = apu_disable_jtag(apu_rproc);
> + else
> + return -EINVAL;
> +
> + return ret ? ret : count;
> +}
> +
> +static const struct file_operations rproc_jtag_ops = {
> + .read = rproc_jtag_read,
> + .write = rproc_jtag_write,
> + .open = simple_open,
> +};
> +
> +static int apu_jtag_probe(struct mtk_apu_rproc *apu_rproc)
> +{
> + int ret;
> +
> + if (!apu_rproc->rproc->dbg_dir)
> + return -ENODEV;
> +
> + apu_rproc->pinctrl = devm_pinctrl_get(apu_rproc->dev);
> + if (IS_ERR(apu_rproc->pinctrl)) {
> + dev_warn(apu_rproc->dev, "Failed to find JTAG pinctrl\n");
I believe you failed to find the pinctrl instance for the remoteproc
driver, not for the JTAG.
> + return PTR_ERR(apu_rproc->pinctrl);
> + }
> +
> + apu_rproc->pinctrl_jtag = pinctrl_lookup_state(apu_rproc->pinctrl,
> + "jtag");
> + if (IS_ERR(apu_rproc->pinctrl_jtag))
> + return PTR_ERR(apu_rproc->pinctrl_jtag);
> +
> + ret = pinctrl_select_state(apu_rproc->pinctrl,
> + apu_rproc->pinctrl_jtag);
So if the kernel is compiled with MTK_APU_JTAG "jtag" is the new
"default" for this device?
Regards,
Bjorn
> + if (ret < 0)
> + return ret;
> +
> + mutex_init(&apu_rproc->jtag_mutex);
> +
> + debugfs_create_file("jtag", 0600, apu_rproc->rproc->dbg_dir,
> + apu_rproc->rproc, &rproc_jtag_ops);
> +
> + return 0;
> +}
> +#else
> +static int apu_jtag_probe(struct mtk_apu_rproc *apu_rproc)
> +{
> + return 0;
> +}
> +
> +static int apu_disable_jtag(struct mtk_apu_rproc *apu_rproc)
> +{
> + return 0;
> +}
> +#endif /* CONFIG_MTK_APU_JTAG */
> +
> static int mtk_apu_rproc_probe(struct platform_device *pdev)
> {
> struct device *dev = &pdev->dev;
> @@ -442,6 +583,10 @@ static int mtk_apu_rproc_probe(struct platform_device *pdev)
> goto free_rproc;
> }
>
> + ret = apu_jtag_probe(apu_rproc);
> + if (ret)
> + dev_warn(dev, "Failed to configure jtag\n");
If devm_pinctrl_get() failed you'll get two warnings, and if the user
haven't added a "jtag" pinctrl state this warning isn't very
descriptive. Consider omitting it and add appropriate error messages in
apu_jtag_probe().
Regards,
Bjorn
> +
> return 0;
>
> free_rproc:
> @@ -457,7 +602,7 @@ static int mtk_apu_rproc_remove(struct platform_device *pdev)
> struct device *dev = &pdev->dev;
>
> disable_irq(apu_rproc->irq);
> -
> + apu_disable_jtag(apu_rproc);
> rproc_del(rproc);
> of_reserved_mem_device_release(dev);
> rproc_free(rproc);
> --
> 2.34.1
>
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2022-03-14 22:24 UTC|newest]
Thread overview: 42+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-03-04 16:15 [PATCH v4 0/7] Add support of mt8183 APU Alexandre Bailon
2022-03-04 16:15 ` Alexandre Bailon
2022-03-04 16:15 ` Alexandre Bailon
2022-03-04 16:15 ` [PATCH v4 1/7] dt bindings: remoteproc: Add bindings for the MT8183 APU Alexandre Bailon
2022-03-04 16:15 ` Alexandre Bailon
2022-03-04 16:15 ` Alexandre Bailon
2022-03-07 23:13 ` Rob Herring
2022-03-07 23:13 ` Rob Herring
2022-03-07 23:13 ` Rob Herring
2022-03-04 16:15 ` [PATCH v4 2/7] dt-bindings: remoteproc: Add bindings for the MT8365 APU Alexandre Bailon
2022-03-04 16:15 ` Alexandre Bailon
2022-03-04 16:15 ` Alexandre Bailon
2022-03-07 23:15 ` Rob Herring
2022-03-07 23:15 ` Rob Herring
2022-03-07 23:15 ` Rob Herring
2022-03-04 16:15 ` [PATCH v4 3/7] remoteproc: Add a remoteproc driver for the MT8183's APU Alexandre Bailon
2022-03-04 16:15 ` Alexandre Bailon
2022-03-04 16:15 ` Alexandre Bailon
2022-03-14 22:02 ` Bjorn Andersson
2022-03-14 22:02 ` Bjorn Andersson
2022-03-14 22:02 ` Bjorn Andersson
2022-03-04 16:15 ` [PATCH v4 4/7] remoteproc: mtk_apu: Add support of JTAG Alexandre Bailon
2022-03-04 16:15 ` Alexandre Bailon
2022-03-04 16:15 ` Alexandre Bailon
2022-03-14 22:24 ` Bjorn Andersson [this message]
2022-03-14 22:24 ` Bjorn Andersson
2022-03-14 22:24 ` Bjorn Andersson
2022-03-04 16:15 ` [PATCH v4 5/7] remoteproc: mtk_apu: Use match_data Alexandre Bailon
2022-03-04 16:15 ` Alexandre Bailon
2022-03-04 16:15 ` Alexandre Bailon
2022-03-14 22:27 ` Bjorn Andersson
2022-03-14 22:27 ` Bjorn Andersson
2022-03-14 22:27 ` Bjorn Andersson
2022-03-04 16:15 ` [PATCH v4 6/7] remoteproc: mtk-apu: Add support of MT8365 Alexandre Bailon
2022-03-04 16:15 ` Alexandre Bailon
2022-03-04 16:15 ` Alexandre Bailon
2022-03-14 22:28 ` Bjorn Andersson
2022-03-14 22:28 ` Bjorn Andersson
2022-03-14 22:28 ` Bjorn Andersson
2022-03-04 16:15 ` [PATCH v4 7/7] ARM64: mt8183: Add support of APU to mt8183 Alexandre Bailon
2022-03-04 16:15 ` Alexandre Bailon
2022-03-04 16:15 ` Alexandre Bailon
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=Yi/AkpIPO94E1qFg@builder.lan \
--to=bjorn.andersson@linaro.org \
--cc=abailon@baylibre.com \
--cc=devicetree@vger.kernel.org \
--cc=khilman@baylibre.com \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mediatek@lists.infradead.org \
--cc=linux-remoteproc@vger.kernel.org \
--cc=mathieu.poirier@linaro.org \
--cc=matthias.bgg@gmail.com \
--cc=ohad@wizery.com \
--cc=robh+dt@kernel.or \
--cc=stephane.leprovost@mediatek.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.