From: Lucas Stach <l.stach@pengutronix.de>
To: Martin Kaiser <martin@kaiser.cx>
Cc: Alexandre Belloni <alexandre.belloni@free-electrons.com>,
Shawn Guo <shawnguo@kernel.org>,
Sascha Hauer <kernel@pengutronix.de>,
Juergen Borleis <jbe@pengutronix.de>,
Fabio Estevam <fabio.estevam@nxp.com>,
linux-kernel@vger.kernel.org, rtc-linux@googlegroups.com
Subject: Re: [PATCH v2] rtc: imxdi: use the security violation interrupt
Date: Tue, 20 Dec 2016 10:23:41 +0100 [thread overview]
Message-ID: <1482225821.2293.43.camel@pengutronix.de> (raw)
In-Reply-To: <1482187289-19272-1-git-send-email-martin@kaiser.cx>
Am Montag, den 19.12.2016, 23:41 +0100 schrieb Martin Kaiser:
> The DryIce chipset has a dedicated security violation interrupt that is
> triggered for security violations (if configured to do so). According
> to the publicly available imx258 reference manual, irq 56 is used for
> this interrupt.
>
> Install a handler for the security violation interrupt if an irq for
> this is provided by platform data / device tree. Move the code for
> handling security violations from the "normal" interrupt handler into
> the security violation interrupt handler.
>
> Signed-off-by: Martin Kaiser <martin@kaiser.cx>
> ---
> v2:
> - make sec_irq optional to avoid breaking the Device Tree ABI
> - removed the Device Tree bindings, I'll prepare a separate patch for them
Please submit the binding as a separate patch in the same series.
Otherwise you are building de-facto DT bindings by changing the driver.
>
> drivers/rtc/rtc-imxdi.c | 68 ++++++++++++++++++++++++++++++++++-------------
> 1 file changed, 50 insertions(+), 18 deletions(-)
>
> diff --git a/drivers/rtc/rtc-imxdi.c b/drivers/rtc/rtc-imxdi.c
> index 67b56b8..ec6077a0 100644
> --- a/drivers/rtc/rtc-imxdi.c
> +++ b/drivers/rtc/rtc-imxdi.c
> @@ -109,6 +109,7 @@
> * @rtc: pointer to rtc struct
> * @ioaddr: IO registers pointer
> * @irq: dryice normal interrupt
> + * @sec_irq: dryice security violation interrupt
This isn't used outside the probe routine, so doesn't need to be saved
in the driver data.
> * @clk: input reference clock
> * @dsr: copy of the DSR register
> * @irq_lock: interrupt enable register (DIER) lock
> @@ -121,6 +122,7 @@ struct imxdi_dev {
> struct rtc_device *rtc;
> void __iomem *ioaddr;
> int irq;
> + int sec_irq;
> struct clk *clk;
> u32 dsr;
> spinlock_t irq_lock;
> @@ -688,24 +690,6 @@ static irqreturn_t dryice_norm_irq(int irq, void *dev_id)
> dier = readl(imxdi->ioaddr + DIER);
> dsr = readl(imxdi->ioaddr + DSR);
>
> - /* handle the security violation event */
> - if (dier & DIER_SVIE) {
> - if (dsr & DSR_SVF) {
> - /*
> - * Disable the interrupt when this kind of event has
> - * happened.
> - * There cannot be more than one event of this type,
> - * because it needs a complex state change
> - * including a main power cycle to get again out of
> - * this state.
> - */
> - di_int_disable(imxdi, DIER_SVIE);
> - /* report the violation */
> - di_report_tamper_info(imxdi, dsr);
> - rc = IRQ_HANDLED;
> - }
> - }
> -
> /* handle write complete and write error cases */
> if (dier & DIER_WCIE) {
> /*If the write wait queue is empty then there is no pending
> @@ -743,6 +727,40 @@ static irqreturn_t dryice_norm_irq(int irq, void *dev_id)
> }
>
> /*
> + * dryice security violation interrupt handler
> + */
> +static irqreturn_t dryice_sec_irq(int irq, void *dev_id)
> +{
> + struct imxdi_dev *imxdi = dev_id;
> + u32 dsr, dier;
> + irqreturn_t rc = IRQ_NONE;
> +
> + dier = readl(imxdi->ioaddr + DIER);
> + dsr = readl(imxdi->ioaddr + DSR);
> +
> + /* handle the security violation event */
> + if (dier & DIER_SVIE) {
> + if (dsr & DSR_SVF) {
> + /*
> + * Disable the interrupt when this kind of event has
> + * happened.
> + * There cannot be more than one event of this type,
> + * because it needs a complex state change
> + * including a main power cycle to get again out of
> + * this state.
> + */
> + di_int_disable(imxdi, DIER_SVIE);
> + /* report the violation */
> + di_report_tamper_info(imxdi, dsr);
> + rc = IRQ_HANDLED;
> + }
> + }
> +
> + return rc;
> +}
This separate handler isn't needed. It is reading the same IRQ status
register, so you can just leave the code as is and request the sec-irq
with the same "dryice_norm_irq" handler.
> +
> +
> +/*
> * post the alarm event from user context so it can sleep
> * on the write completion.
> */
> @@ -783,6 +801,13 @@ static int __init dryice_rtc_probe(struct platform_device *pdev)
> imxdi->irq = platform_get_irq(pdev, 0);
> if (imxdi->irq < 0)
> return imxdi->irq;
Insert blank line for better legibility.
> + /* the 2nd irq is the security violation irq
> + make this optional, don't break the device tree ABI */
> + rc = platform_get_irq(pdev, 1);
> + if (rc > 0)
> + imxdi->sec_irq = rc;
> + else
> + imxdi->sec_irq = IRQ_NOTCONNECTED;
>
> init_waitqueue_head(&imxdi->write_wait);
>
> @@ -815,6 +840,13 @@ static int __init dryice_rtc_probe(struct platform_device *pdev)
> goto err;
> }
>
> + rc = devm_request_irq(&pdev->dev, imxdi->sec_irq, dryice_sec_irq,
> + IRQF_SHARED, pdev->name, imxdi);
> + if (rc) {
> + dev_warn(&pdev->dev, "security violation interrupt not available.\n");
> + /* this is not an error, see above */
> + }
> +
Please just fold this into the "if (rc > 0)" path above.
> platform_set_drvdata(pdev, imxdi);
> imxdi->rtc = devm_rtc_device_register(&pdev->dev, pdev->name,
> &dryice_rtc_ops, THIS_MODULE);
Regards,
Lucas
next prev parent reply other threads:[~2016-12-20 9:23 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-11-19 13:03 [PATCH 1/2] rtc: imxdi: (trivial) fix a typo Martin Kaiser
2016-11-19 13:03 ` [PATCH 2/2] rtc: imxdi: use the security violation interrupt Martin Kaiser
2016-12-07 15:47 ` Alexandre Belloni
2016-12-07 15:48 ` [PATCH 1/2] rtc: imxdi: (trivial) fix a typo Alexandre Belloni
2016-12-19 22:41 ` [PATCH v2] rtc: imxdi: use the security violation interrupt Martin Kaiser
2016-12-20 9:23 ` Lucas Stach [this message]
2016-12-21 23:06 ` Martin Kaiser
2016-12-21 22:56 ` [PATCH 1/2 v3] " Martin Kaiser
2016-12-21 23:01 ` [PATCH 2/2 v2] ARM: i.MX25: add the optional security violation irq Martin Kaiser
2016-12-30 2:44 ` Shawn Guo
2017-01-03 18:49 ` [PATCH 1/3 v4] rtc: imxdi: use the security violation interrupt Martin Kaiser
2017-01-10 23:46 ` Alexandre Belloni
2017-01-03 18:50 ` [PATCH 2/3] ARM: dts: imx25.dtsi: DryIce " Martin Kaiser
2017-01-10 1:53 ` Shawn Guo
2017-01-03 18:51 ` [PATCH 3/3] Documentation: dt: rtc-imxdi: " Martin Kaiser
2017-01-10 23:47 ` Alexandre Belloni
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=1482225821.2293.43.camel@pengutronix.de \
--to=l.stach@pengutronix.de \
--cc=alexandre.belloni@free-electrons.com \
--cc=fabio.estevam@nxp.com \
--cc=jbe@pengutronix.de \
--cc=kernel@pengutronix.de \
--cc=linux-kernel@vger.kernel.org \
--cc=martin@kaiser.cx \
--cc=rtc-linux@googlegroups.com \
--cc=shawnguo@kernel.org \
/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).