[PATCH] irqchip/gicv3-its: Add workaround for HIP09/HIP10/HIP10C erratum 162100803/162200807/162400807

Zhou Wang wangzhou1 at hisilicon.com
Fri Sep 26 00:22:59 PDT 2025


On 2025/9/15 22:46, Marc Zyngier wrote:
> On Mon, 15 Sep 2025 15:06:35 +0100,
> Zhou Wang <wangzhou1 at hisilicon.com> wrote:
>>
>> On 2025/9/15 20:23, Marc Zyngier wrote:
>>> On Wed, 10 Sep 2025 04:27:15 +0100,
>>> Zhou Wang <wangzhou1 at hisilicon.com> wrote:
>>>>
>>
>> [...]
>>
>>>>>
>>>>> You are telling the ITS that it is allowed to go and access
>>>>> unspecified data (16 bit worth of translations). That's not
>>>>> acceptable. If you *have* to do that, then override the size in the
>>>>> driver code to actually allocate the corresponding memory.
>>>>
>>>> Then we have to override the ITT memory to 2 ^ 16 * 8 for one device
>>>> :(
>>>
>>> But what's the alternative? Letting the ITS speculate in random
>>> memory, possibly under the control of userspace or a guest? I don't
>>> think that's acceptable.
>>
>> Seems that only a bad device who could send an interrupt which is not be
>> declared may bring a problem here.
>>
>> Not sure how dose userspace or a guest make a problem here?
> 
> Assign a device to a guest, let it generate an MSI with an event-id
> that's in the correct range, observe it accessing the memory.
> 
> All you need is to be in control of how the device generates MSIs.
> 
>>>>>> +#ifdef CONFIG_HISILICON_ERRATUM_162100803
>>>>>> +	{
>>>>>> +		.desc = "ITS: Hip09 erratum 162100803",
>>>>>> +		.iidr = 0x00051736,
>>>>>> +		.mask = 0xffffffff,
>>>>>> +		.init = its_enable_quirk_162100803,
>>>>>> +	},
>>>>>> +	{
>>>>>> +		.desc = "ITS: Hip10 erratum 162200807",
>>>>>> +		.iidr = 0x01051736,
>>>>>> +		.mask = 0xffffffff,
>>>>>> +		.init = its_enable_quirk_162100803,
>>>>>> +	},
>>>>>> +	{
>>>>>> +		.desc = "ITS: Hip10c erratum 162400807",
>>>>>> +		.iidr = 0x00061736,
>>>>>> +		.mask = 0xffffffff,
>>>>>> +		.init = its_enable_quirk_162100803,
>>>>>
>>>>> Can you try to merge these three entries and adjust the mask
>>>>> accordingly? mask=0xeffcffff should do the trick, assuming that you
>>>>> don't have any other hardware overlapping this.
>>>>
>>>> The iidrs are different, how to merge these entries?
>>>
>>> By using the mask:
>>>
>>> 	{
>>> 		.desc = "ITS: Hip10 erratum, will eat your vSGIs",
>>> 		.iidr = 0x01051736,
>>> 		.mask = 0xeffcffff,
>>> 		.init = its_enable_quirk_162100803,
>>> 	},
>>>
>>> will match all three platforms, assuming I got the mask correctly.
>>
>> iidrs are differet, so one iidr can not match all. e.g.
>> for iidr = 0x00061736, mask with 0xeffcffff will be 0x00041736, which
>> will not be 0x01051736.
> 
> Sorry, copy paste, and wrong mask. This works (I actually checked):
> 
> 	{
> 		.desc = "ITS: Hip10 erratum, will eat your vSGIs",
> 		.iidr = 0x00041736,
> 		.mask = 0xfefcffff,
> 		.init = its_enable_quirk_162100803,
> 	},

I get it, many thanks!

Best,
Zhou

> 
> 	M.
> 



More information about the linux-arm-kernel mailing list