Я разработал функцию гибернации для контроллера DWC3 Synopsis, в которой я вижу концепцию буфера Scratchpad, которую я не могу понять.
См. Фрагмент кода ниже,
struct dwc3 {
/* Scratchpad buffers for hibernation support */
void *hiber_scratchpad[15];
struct dwc3_scratchpad_array *hiber_scratchpad_array;
dma_addr_t hiber_scratchpad_array_dma;
}
int dwc3_alloc_scratchpad_buffers(struct dwc3 *dwc)
{
dma_addr_t dma_adr;
int hiberbufs, i;
hiberbufs = DWC3_GHWPARAMS4_HIBER_SCRATCHBUFS(dwc->hwparams.hwparams4);
if (hiberbufs) {
/* Allocate scratchpad buffer address array */
dwc->scratchpad_array = dma_alloc_coherent(NULL,
sizeof(*dwc->scratchpad_array),
&dwc->scratchpad_array_dma, GFP_KERNEL);
if (!dwc->scratchpad_array)
goto err;
}
/* Allocate scratchpad buffers */
for (i = 0; i < hiberbufs; i++) {
dwc->scratchpad[i] = dma_alloc_coherent(NULL, 4096, &dma_adr,
GFP_KERNEL);
if (!dwc->scratchpad[i]) {
....
}
goto err_free;
}
dwc->scratchpad_array->dma_adr[i] = cpu_to_le64(dma_adr);
}
}
Чтобы сохранить состояние контроллера USB-устройства, мы используем dwc->scratchpad_array_dma
.
. Почему нам нужно дважды вызывать dma_alloc_coherent()
?
Где именно будет храниться состояние контроллера USB-устройства, чтобы я могпроверить из отладчика?