[PATCH v3 1/4] misc: k3_esm: Add functionality to set and route error events within K3SoC

Christian Gmeiner christian.gmeiner at gmail.com
Mon Mar 21 13:46:38 CET 2022


Am Mi., 9. März 2022 um 21:43 Uhr schrieb Hari Nagalla <hnagalla at ti.com>:
>
> Add functionality to enable, set priority to the input events and to
> route to MCU ESM. On AM64x/AM62x devices, it is possible to route Main
> ESM0 error events to MCU ESM. When these error events are routed to MCU
> ESM high output, it can trigger the reset logic to reset the device,
> when CTRLMMR_MCU_RST_CTRL:MCU_ESM_ERROR_RESET_EN_Z is set to '0'.
>
> K3 based J7 devices (ex: J721e) also have ESM modules, and the changes
> to the driver does not impact those devices.
>
> Signed-off-by: Hari Nagalla <hnagalla at ti.com>

Reviewed-by: Christian Gmeiner <christian.gmeiner at gmail.com>

> ---
>  drivers/misc/k3_esm.c | 53 ++++++++++++++++++++++++++++++++++++++++---
>  1 file changed, 50 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/misc/k3_esm.c b/drivers/misc/k3_esm.c
> index cc2a23dd66..41faeb3d85 100644
> --- a/drivers/misc/k3_esm.c
> +++ b/drivers/misc/k3_esm.c
> @@ -16,17 +16,57 @@
>
>  #define ESM_SFT_RST                    0x0c
>  #define ESM_SFT_RST_KEY                        0x0f
> +#define ESM_EN                         0x08
> +#define ESM_EN_KEY                     0x0f
>
>  #define ESM_STS(i)                     (0x404 + (i) / 32 * 0x20)
> +#define ESM_STS_MASK(i)                        (1 << ((i) % 32))
>  #define ESM_PIN_EN_SET_OFFSET(i)       (0x414 + (i) / 32 * 0x20)
> -#define ESM_PIN_MASK(i)                        BIT((i) & 0x1f)
> +#define ESM_PIN_MASK(i)                        (1 << ((i) % 32))
> +#define ESM_INTR_EN_SET_OFFSET(i)      (0x408 + (i) / 32 * 0x20)
> +#define ESM_INTR_MASK(i)               (1 << ((i) % 32))
> +#define ESM_INTR_PRIO_SET_OFFSET(i)    (0x410 + (i) / 32 * 0x20)
> +#define ESM_INTR_PRIO_MASK(i)          (1 << ((i) % 32))
>
>  static void esm_pin_enable(void __iomem *base, int pin)
>  {
> +       u32 value;
> +
> +       value = readl(base + ESM_PIN_EN_SET_OFFSET(pin));
> +       value |= ESM_PIN_MASK(pin);
>         /* Enable event */
> -       writel(ESM_PIN_MASK(pin), base + ESM_PIN_EN_SET_OFFSET(pin));
> +       writel(value, base + ESM_PIN_EN_SET_OFFSET(pin));
> +}
> +
> +static void esm_intr_enable(void __iomem *base, int pin)
> +{
> +       u32 value;
> +
> +       value = readl(base + ESM_INTR_EN_SET_OFFSET(pin));
> +       value |= ESM_INTR_MASK(pin);
> +       /* Enable Interrupt event */
> +       writel(value, base + ESM_INTR_EN_SET_OFFSET(pin));
> +}
> +
> +static void esm_intr_prio_set(void __iomem *base, int pin)
> +{
> +       u32 value;
> +
> +       value = readl(base + ESM_INTR_PRIO_SET_OFFSET(pin));
> +       value |= ESM_INTR_PRIO_MASK(pin);
> +       /* Set to priority */
> +       writel(value, base + ESM_INTR_PRIO_SET_OFFSET(pin));
>  }
>
> +static void esm_clear_raw_status(void __iomem *base, int pin)
> +{
> +       u32 value;
> +
> +       value = readl(base + ESM_STS(pin));
> +       value |= ESM_STS_MASK(pin);
> +       /* Clear Event status */
> +       writel(value, base + ESM_STS(pin));
> +}
>  /**
>   * k3_esm_probe: configures ESM based on DT data
>   *
> @@ -67,8 +107,15 @@ static int k3_esm_probe(struct udevice *dev)
>         /* Clear any pending events */
>         writel(ESM_SFT_RST_KEY, base + ESM_SFT_RST);
>
> -       for (i = 0; i < num_pins; i++)
> +       for (i = 0; i < num_pins; i++) {
> +               esm_intr_prio_set(base, pins[i]);
> +               esm_clear_raw_status(base, pins[i]);
>                 esm_pin_enable(base, pins[i]);
> +               esm_intr_enable(base, pins[i]);
> +       }
> +
> +       /* Enable ESM */
> +       writel(ESM_EN_KEY, base + ESM_EN);
>
>  free_pins:
>         kfree(pins);
> --
> 2.17.1
>


-- 
greets
--
Christian Gmeiner, MSc

https://christian-gmeiner.info/privacypolicy


More information about the U-Boot mailing list