Hi Cristiano,

 

Thanks for the valuable feedback on the integration guide.

Looks like it needs some refinements. I’ll try to do that.

 

For you questions:

But in which file should I put this function? And where should I call this function??

Which file can I do this in? And how should I do this step? (void spm_handle_interrupt(void *p_pt, struct irq_load_info_t *p_ildi).

void TIM7_IRQHandler(void)

{

    spm_handle_interrupt(save_tfm_timer7_irq_info.p_pt, save_tfm_timer7_irq_info.p_ildi);

}

 

As examples, some of the platforms have the “tfm_interrupts.c” for your references, like platform/ext/target/arm/mps2/an521/tfm_interrupts.c.

 

Best Regards,

Kevin

 

From: TF-M <tf-m-bounces@lists.trustedfirmware.org> On Behalf Of Cristiano Rodrigues via TF-M
Sent: Friday, October 8, 2021 11:29 PM
To: tf-m@lists.trustedfirmware.org
Subject: [TF-M] Enable a peripheral interrupt to an App RoT

 

Hi everyone, 

 

I am developing an App RoT for STM32L552 and testing the recent integrated FLIH interrupt feature, but I am missing something in the step of "Initializing the Interrupts" and "Integrating the Interrupt Handling Function".

 

As is described in Secure Interrupt Integration Guide, to enable an interrupt it is needed:

  1. Binding the interrupt to a Secure Partition.
  2. Granting the Secure Partition access permissions to the device of the interrupt.
  3. Initializing the interrupt.
  4. Integrating the interrupt handling function

Step 1 and 2,  think that is "checked":

  •  by adding this code to the partition manifest file.

"mmio_regions": [

    {

      "name": "TFM_PERIPHERAL_TIMER7",

      "permission": "READ-WRITE"

    }

  ],

  "irqs": [

    {

      "source": "TFM_TIMER7_IRQ",

      "name": "TFM_TIMER7_IRQ",

      "handling": "FLIH",

    }

  • By defining the macro with platform peripheral structure in patform/ext/target/stm/common/stm32l5xx/boards/tfm_peripherals_def.h

 extern struct platform_data_t timer7

 #define TFM_PERIPHERAL_TIMER7 &timer7

  • By assign the peripheral  address in platform\ext\target\stm\common\stm32l5xx\secure\target_cfg.c

struct platform_data_t timer7 = {
 __TIMER7_BASE,
 __TIMER7_BASE + 0x3FF,
 -1,
 -1
 };

  • By adding the peripheral name to “partition_named_mmio_list[]” in the file patform/ext/target/stm/common/stm32l5xx/boards/mmio_defs.h

const uintptr_t partition_named_mmio_list[] = {

 (uintptr_t)TFM_PERIPHERAL_TIMER0,

 (uintptr_t)TFM_PERIPHERAL_STD_UART,

 (uintptr_t) TFM_PERIPHERAL_TIMER7,

};

  • And add to my partition code, the irq function, and the function to configure the timer

psa_flih_result_t tfm_timer7_irq_flih(void)

{

    ....

}

 

static void flih_test_case_1(psa_msg_t *msg) {
    psa_irq_enable(TFM_TIMER7_IRQ_SIGNAL);
    timer_start();
    .......

   timer_stop();
   psa_irq_disable(TFM_TIMER7_IRQ_SIGNAL);
    psa_reply(msg->handle, PSA_SUCCESS);
}

 

My problem, I think, is with the other two steps, 3 and 4. The TF-M documentation is not clear in these two steps. 

 

In step 3, as is said in the documentation it is needed: i) to configure the interrupt priority; ii) to ensure that the interrupt targets the Secure State. iii) and save the interrupt information. So I suppose it goes something like this:

 

struct irq_t {

    void                   *p_pt;

    struct irq_load_info_t *p_ildi;

} save_tfm_timer7_irq_info;

 

enum tfm_hal_status_t tfm_timer7_irq_init(void *p_pt, struct irq_load_info_t *p_ildi)

{

  //targetting the interrupt to S state

  NVIC_ClearTargetState(TIM7_IRQn);

  NVIC_SetPriority(TIM7_IRQn, 1);

  NVIC_EnableIRQ(TIM7_IRQn);

  //Saving the Interrupt Information

  save_tfm_timer7_irq_info.p_pt = p_pt;

  save_tfm_timer7_irq_info.p_ildi = p_ildi;

  return TFM_HAL_SUCCESS;

}

 

But in which file should I put this function? And where should I call this function??

 

And in step 4, I also do not understand how can I meet this requirement -> "Platforms should call this entry function in the interrupt handlers defined in Vector Table with the saved information for each interrupt."

Being  the function in question ->  void spm_handle_interrupt(void *p_pt, struct irq_load_info_t *p_ildi).

Which file can I do this in? And how should I do this step?

 

Cheers,

Cristiano Rodrigues