It has to be zeroed before committing it to device.
We do that by allocating it with M_ZERO, but there was no memory barrier or cache flush to ensure its sees it zeroed.
This fixes MSIX on LS1028A SoC.
Details
Details
Diff Detail
Diff Detail
- Repository
- rG FreeBSD src repository
- Lint
Lint Not Applicable - Unit
Tests Not Applicable
Event Timeline
Comment Actions
Good question. I checked and Linux does this flush unconditionally.
With that being said our driver worked on cache-coherent devices without it.
Updated the revision to do the flush on non cache-coherent devices only
sys/arm64/arm64/gicv3_its.c | ||
---|---|---|
1203 | I think we want a dsb(ishst); in the else case to ensure any previous writes to itt are complete. We might get it via the spinlock below, but shouldn't rely on it. |
sys/arm64/arm64/gicv3_its.c | ||
---|---|---|
1203 | I though about it and I don't think it is necessary here. |