LINUX.ORG.RU

[arm][ядро][DMA] Покритикуйте

 , ,


0

1

Что может быть плохого в таком коде:

struct my_struct
{
...
short* offset;
...
short data[SOME_LENGTH];
};

...
void some_irq_handler(int irq, void* data)
{
struct my_struct* ms;
dma_addr_t dma;
...
ms = kzalloc(sizeof(struct my_struct), GFP_ATOMIC);
if ( ms == NULL ) goto cleanup;
ms->offset = ms->data;
...
dma = dma_map_single(...., ms->offset, ..., ...);
....
}

Вся эта мура в немного более сложном виде у меня завязана на SSC + PDC (архитектура AT91). Так вот если есть строка ms->offset = ms->data то передатчик SSC via PDC начинает терять первое слово (грубо говоря первый кадр попросту пропадает) если делать не так (без этой строки) все ОК. В чем может быть ЛАЖА?

Ответ на: комментарий от anonymous

Прежде чем брызгать слюной иди почитай как контроллеры DMA работают и програмируются: если в него записано передать 10 слов, значит он должен передать 10 слов, а не 9 и всё ваше слюнообразование на тему кэша к количеству переданного не имеет ну ровным счетом никакого (только к содержимому переданных слов, а с этим как раз никаких проблем, проблеы только с количеством).

И хватит ныть на тему, что тебе не показали код от коммерческого проекта, и не покажут, хоть унойся. А если тебе мало информации, чтобы сообразить что к чему, ну уж извини не я тут гением мысли называюсь, а ты. Того кода что я предоставил достаточно для ответа на поставленный вопрос: «может сохранение указателя влиять на код или нет?» - ответ нет, онований для этого с точки зрения аппаратуры нет.

mskmsk1985
() автор топика
Ответ на: комментарий от mskmsk1985

> Того кода что я предоставил достаточно для ответа на поставленный вопрос: «может сохранение указателя влиять на код или нет?»

Гг. Для протокола: нет, не достаточно.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Ну ладно возможно, для протокола: вину признаю лишь частично. Из кода там не достает: в структуре пары полей - указатель на объект SSC устройства, и u32 флагов режима работы утсройства; Да собственно комманд программирования SSC и егоного PDC + код вставки/удаления модуля (что по моему вполне стандартно для сивольных устройств) и инициализации SSC + код открытия/закрытия устройства, который ничего не делает кроме пары printk и установки/снятия обработчика прерывания на irq линию устройства + код реализайии ioctl который лишь разрешает прерывания по событиям прихода данных или готовности приема в зависимости от того что хочет user-space приложение (отправить данные или их получить). В самом обработчике еще не приведены инструкции запрещения прерываний + код обработки получения данных (на уровне инструкций SSC + PDC). Что из этого Вам не хватает для ответа на поставленный вопрос?

mskmsk1985
() автор топика
Ответ на: комментарий от mskmsk1985

> Прежде чем брызгать слюной иди почитай как контроллеры DMA работают и програмируются: если в него записано передать 10 слов, значит он должен передать 10 слов, а не 9 и всё ваше слюнообразование на тему кэша к количеству переданного не имеет ну ровным счетом никакого (только к содержимому переданных слов, а с этим как раз никаких проблем, проблеы только с количеством).

Спасибо, что просветил, как работают DMA-контроллеры. Теперь я знаю, что контроллер в одном из устройств на SoC у меня «неправильный» (и не контроллер DMA вовсе) - он не может передать нужное количество слов, если адрес ему дать не на границе 4-е байта. Ай-ай-ай.

Того кода что я предоставил достаточно для ответа на поставленный вопрос: «может сохранение указателя влиять на код или нет?» - ответ нет, онований для этого с точки зрения аппаратуры нет.

Не распарсил. Где утверждение, где вопрос? Меньше борзости, больше дела. Тебе несколько людей просили поменьше амбиций и побольше конструктива. Основные ошибки, их root cause и способы исправления тебе перечислили. Отказываешься на них смотреть? Глупо

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.