Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

app: boards: imx95_evk: set host and edma buffer alignment to 32 #9676

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

LaurentiuM1234
Copy link
Contributor

SOF performs cache invalidation operations on the DAI and HOST DMA buffers to make sure that the firmware doesn't read/write stale data in the areas shared with the DMAC and Linux. Currently, these buffers use an 8-byte alignment.

The Cortex-M7 data cache line size is 32-byte. Given this and the fact that the buffers have an 8-byte alignment what could end up happening is invalidating useful data by mistake.

In the case of imx95 what seems to happen is the allocated heap chunk headers get corrupted leading to one of the following assertions failing:
1) CHECK(b->next != 0) (from free_list_remove_bidx())
2) CHECK(chunk_size(h, c) >= sz) (from alloc_chunk())

This implies that free chunks end up in the wrong buckets.

The fix for this is to just align the DAI/HOST buffers to 32 bytes.

Note that we didn't actually catch the moment the chunk headers get corrupted. Instead, the conclusion was reached based on the following facts:

1) Disabling the data cache seems to fix the issue.
2) Aligning the buffers to 32-byte boundary seems to
fix the issue.
3) Removing the invalidation operations on the DAI/HOST
buffers seems to fix the issue.

SOF performs cache invalidation operations on the DAI and
HOST DMA buffers to make sure that the firmware doesn't
read/write stale data in the areas shared with the DMAC and Linux.
Currently, these buffers use an 8-byte alignment.

The Cortex-M7 data cache line size is 32-byte. Given this and
the fact that the buffers have an 8-byte alignment what could
end up happening is invalidating useful data by mistake.

In the case of imx95 what seems to happen is the allocated heap
chunk headers get corrupted leading to one of the following
assertions failing:
	1) CHECK(b->next != 0) (from free_list_remove_bidx())
	2) CHECK(chunk_size(h, c) >= sz) (from alloc_chunk())

This implies that free chunks end up in the wrong buckets.

The fix for this is to just align the DAI/HOST buffers to
32 bytes.

Note that we didn't actually catch the moment the chunk headers
get corrupted. Instead, the conclusion was reached based on the
following facts:

	1) Disabling the data cache seems to fix the issue.
	2) Aligning the buffers to 32-byte boundary seems to
	fix the issue.
	3) Removing the invalidation operations on the DAI/HOST
	buffers seems to fix the issue.

Signed-off-by: Laurentiu Mihalcea <[email protected]>
@lgirdwood
Copy link
Member

@wszypelt this is unrelated to Intel HW so good to merge ?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants