아아.. 간신히 정체를 조금 알았다.
모든 문제는 DMA가 CPU를 거치지 않고 메모리를 읽고 쓰기 때문…
예를 들어 디바이스에서 메모리에 데이터를 쓴 경우, CPU가 그 주소에 대한
캐쉬를 가지고 있다면 CPU는 엉뚱한 데이터를 읽게 되는 것이다.
이를 해결하는 방법은 2가지.
하나는 CPU가 그 메모리 영역에 대해서는 캐쉬를 쓰지 않게 하는 것이고,
또 하나는 디바이스<->메모리 간의 데이터 이동이 일어나거나 일어난 후,
CPU의 캐쉬와 메모리를 동기화 시켜 주는 것이다.
전자에 쓰는 함수가 consistent_alloc()이고 후자에 쓰는 함수가 consistent_sync().
즉, consistent_alloc()과 consistent_free()가 없더라도, 원하는 바는 달성할 수 있지만… 좀더 복잡해 진다.
consistent_alloc()과 consistent_free()는 메모리 할당/해제시에 한번만 해주면 되지만,
consistent_sync()의 경우에는 디바이스에서 메모리를 읽기전이나,
디바이스에서 메모리에 쓴 후에 일일이 consistent_sync()를 호출해 줘야 된다.
흠… 결국…. dsplink소스를 다 뒤져서 해당 부분마다 consistent_sync()를 호출해 줘야 한단 말인데;;;