fix(gic600): workaround for Part 1 of GIC600 erratum 2384374

GIC600 erratum 2384374 is a Category B erratum. Part 1 is fixed
in this patch, and the Part 1 failure mode is described as
'If the packet to be sent is a SET packet, then a higher priority SET
may not be sent when it should be until an unblocking event occurs.'

This is handled by calling gicv3_apply_errata_wa_2384374() in the
ehf_deactivate_priority() path, so that when EHF restores the priority
to the original priority, the interrupt packet buffered
in the GIC can be sent.

gicv3_apply_errata_wa_2384374() is the workaround for
the Part 2 of erratum 2384374 which flush packets from the GIC buffer
and is being used in this patch.

SDEN can be found here:
https://developer.arm.com/documentation/sden892601/latest/

Signed-off-by: Arvind Ram Prakash <arvind.ramprakash@arm.com>
Change-Id: I4bb6dcf86c94125cbc574e0dc5119abe43e84731
This commit is contained in:
Arvind Ram Prakash 2024-02-05 16:19:37 -06:00
parent 0cda4adae7
commit 24a4a0a5ec
6 changed files with 70 additions and 9 deletions

View file

@ -282,9 +282,28 @@ may be signalled to the PE. The API should return the current priority value
that it's overwriting.
In case of Arm standard platforms using GIC, the implementation of the API
inserts to order memory updates before updating mask, then writes to the GIC
*Priority Mask Register*, and make sure memory updates are visible before
potential trigger due to mask update.
inserts barriers to order memory updates before updating mask,
then writes to the GIC *Priority Mask Register*, and make sure memory updates
are visible before potential trigger due to mask update.
Function: unsigned int plat_ic_deactivate_priority(unsigned int id); [optional]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
::
Argument : unsigned int
Return : int
This API performs the operations of plat_ic_set_priority_mask along with
calling the errata workaround gicv3_apply_errata_wa_2384374(). This is
performed when priority mask is restored to it's older value. This API returns
the current priority value that it's overwriting.
In case of Arm standard platforms using GIC, the implementation of the API
inserts barriers to order memory updates before updating mask, then writes
to the GIC *Priority Mask Register*, and make sure memory updates
are visible before potential trigger due to mask update, and
applies 2384374 GIC errata workaround to process pending interrupt packets.
.. _plat_ic_get_interrupt_id: