|
Прерывания PCI. |
|
|
|
Sep 10 2010, 06:07
|

Lazy
     
Группа: Свой
Сообщений: 2 070
Регистрация: 21-06-04
Из: Ukraine
Пользователь №: 76

|
Цитата(Methane @ Sep 10 2010, 07:00)  Народ. Кто-то делал? Не могу понять. В двух проводах запутался. Из альтеровской корки идут два провода. Я устанавливаю первый в 1, получаю ACK по второму. Устанавливаю первый в 0, получаю ACK по второму. Система реагирует в обоих случаях одинакого. Вешается. После генерации прерывания. Что я еще не сделал? Что-то не понял... что за "провода"? Это Вы про INTA# и INTB#? Если 2 прерывания - то у Ваc девайс должен быть "multifunction". Это так?
--------------------
"Everything should be made as simple as possible, but not simpler." - Albert Einstein
|
|
|
|
|
Sep 10 2010, 08:44
|
Гуру
     
Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250

|
Цитата(Methane @ Sep 10 2010, 12:31)  Стабильно генерит 1 прерывание и клин. Чует мое сердце что еще что-то нужно сделать. PC должен же как-то сказать плате, что обработка прерывания уже началась. Это обычно делается в пользовательской части. Например, считывается регистр состояния, или данные, что автоматически приводит к сбросу запроса на прерывание. Ну или нужен бит запрета прерывания, который Вы будете устанавливать сразу по входу в обработчик. Общий алгоритм такой - вход в прерывание - выясняете Ваше - не Ваше, если нет - отдаете управление, если Ваше, то сбрасываете запрос как можно быстрей, делаете необходимые действия, выходите из обработчика.
--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
|
|
|
|
|
Sep 10 2010, 08:56
|

Гуру
     
Группа: Свой
Сообщений: 3 615
Регистрация: 12-01-09
Из: США, Главное разведовательное управление
Пользователь №: 43 230

|
Цитата(DS @ Sep 10 2010, 11:44)  Это обычно делается в пользовательской части. Например, считывается регистр состояния, или данные, что автоматически приводит к сбросу запроса на прерывание. Ну или нужен бит запрета прерывания, который Вы будете устанавливать сразу по входу в обработчик.
Общий алгоритм такой - вход в прерывание - выясняете Ваше - не Ваше, если нет - отдаете управление, если Ваше, то сбрасываете запрос как можно быстрей, делаете необходимые действия, выходите из обработчика. Алгоритм я знаю. Я не могу понять почему у меня железка виснет после первого прерывания. Причем MSI-x прерывания работают совершенно нормально. Хотя сейчас попробую вставить чтение из железки, может войдя в обработчик я обязан хоть что-то из железки прочитать. Хотя бред.
|
|
|
|
|
Sep 10 2010, 08:59
|
Гуру
     
Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250

|
Цитата(Methane @ Sep 10 2010, 12:56)  Алгоритм я знаю. Я не могу понять почему у меня железка виснет после первого прерывания. Причем MSI-x прерывания работают совершенно нормально. Хотя сейчас попробую вставить чтение из железки, может войдя в обработчик я обязан хоть что-то из железки прочитать. Хотя бред. А запрос - то сбрасывается ? Вы обязаны сбросить запрос по входу, а уж чтением или каким другим действием - не важно. Еще бывают зависоны, если нераспознано, что прерывание от чужого устройства, и вместо отдачи управления - попытка что-то делать, которая, естетственно, не сбрасывает и не может сбросить чужой запрос.
--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
|
|
|
|
|
Sep 10 2010, 09:15
|

Гуру
     
Группа: Свой
Сообщений: 3 615
Регистрация: 12-01-09
Из: США, Главное разведовательное управление
Пользователь №: 43 230

|
Цитата(DS @ Sep 10 2010, 11:59)  А запрос - то сбрасывается ? Вы обязаны сбросить запрос по входу, а уж чтением или каким другим действием - не важно. Еще бывают зависоны, если нераспознано, что прерывание от чужого устройства, и вместо отдачи управления - попытка что-то делать, которая, естетственно, не сбрасывает и не может сбросить чужой запрос. Я сразу сбрасываю запрос. Поднимаю INTA, дожидаюсь ACK и опускаю INTA. Или я должен опустить INTA из обработчика прерывания? Тоесть Deassert_INTA должен случиться уже из обработчика? В общем сейчас попробую.
|
|
|
|
|
Sep 10 2010, 13:31
|
Гуру
     
Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250

|
Цитата(Methane @ Sep 10 2010, 17:25)  Не пашет. По событию поднимаю INTA, в обработчике прерывания делаю запись по адресу, чем сбрасываю INTA. Осциллографом проверяли, что INTA падает ? Обработчик возвращает TRUE ? (если винда, конечно).
--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
|
|
|
|
|
Sep 10 2010, 13:36
|

Гуру
     
Группа: Свой
Сообщений: 3 615
Регистрация: 12-01-09
Из: США, Главное разведовательное управление
Пользователь №: 43 230

|
Цитата(DS @ Sep 10 2010, 16:31)  Осциллографом проверяли, что INTA падает ? У меня PCIe, INTA виртуальное. Проверял SignalTapом. Падает. Цитата Обработчик возвращает TRUE ? (если винда, конечно). У меня линух, обработчик, точно такой же как и для прерываний MSI, которые бегают. IRQ_HANDLED возвращаю.
|
|
|
|
|
Sep 10 2010, 13:48
|

Гуру
     
Группа: Свой
Сообщений: 3 615
Регистрация: 12-01-09
Из: США, Главное разведовательное управление
Пользователь №: 43 230

|
Только что проверил, у меня прерывание вызывается два раза. Первый раз вызвалось, а потом просто затыкается обмен с карточкой, и я уже не могу ничего туда записать судя по всему. Раньше один раз вызывалось. Цитата(DS @ Sep 10 2010, 16:41)  Нет клина прерывания (после выхода обработчик вызывается снова и так до бесконечности) ? Проверьте как-нибудь. Если этого нет, то проблема с самой шиной скорее всего. Без прерываний обмен работает ? Не похоже. Иначе бы у меня комп крашился из за переполнения стека или еще чего. У меня в обработчике стоит счетчик, который я могу посмотреть. Раньше он показывал 1, а теперь показывает два. Обмен работает. И запись и чтение и DMA из карточки в ОЗУ компа и обратно, и MSI-X прерывания работает. Клины у меня с поддержкой легаси прерываний. Но после легаси прерывания затыкается.
|
|
|
|
|
Sep 10 2010, 14:00
|
Гуру
     
Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250

|
Цитата(Methane @ Sep 10 2010, 17:48)  Только что проверил, у меня прерывание вызывается два раза. Первый раз вызвалось, а потом просто затыкается обмен с карточкой, и я уже не могу ничего туда записать судя по всему. Раньше один раз вызывалось. Не похоже. Иначе бы у меня комп крашился из за переполнения стека или еще чего. У меня в обработчике стоит счетчик, который я могу посмотреть. Раньше он показывал 1, а теперь показывает два. Обмен работает. И запись и чтение и DMA из карточки в ОЗУ компа и обратно, и MSI-X прерывания работает. Клины у меня с поддержкой легаси прерываний. Но после легаси прерывания затыкается. А в цепочке обработчиков ничего больше не сидит ? Так клинит обычно, когда "залипает" запрос прерывания. В остальных случаях он бы у Вас вывалился и больше не вернулся в обработчик - машина бы не повисла. При зацикливании в обработчике стек не переполняется - в обработчике прерывания запрещены, после выхода из обработчика стек восстанавливается, и обработчик вызывается снова с корректными параметрами. Помахать чем-нибудь из обработчика можете ?
--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
|
|
|
|
|
Sep 13 2010, 11:55
|

Гуру
     
Группа: Свой
Сообщений: 3 615
Регистрация: 12-01-09
Из: США, Главное разведовательное управление
Пользователь №: 43 230

|
Цитата(DS @ Sep 13 2010, 14:01)  Из обработчика прерывания можно каким нибудь проводом дергать ? Надо понять, встает шина или "залип" запрос на обработку прерывания. Иначе дальше не двинетесь. Нужно что-то поднять и опустить во время нахождения в обработчике, чтобы было видно зацикливание. Встает шина. Если после этого попробовать что-то прочитать из карточки, то в карточку не приходит запросов вообще, и как результат читаются одни FF. И сразу после чтения жесткий зависон всего. На сигнал-тап видно. Прошло одно прерывание, обработчик его сбросил. Пришло второе, и уже просто ни команда записи, ни команды чтения до автомата который обрабатывает входящие сообщения не доходят. Цитата(Oldring @ Sep 13 2010, 14:11)  А у Линукса что-ли нет ядерного отладчика? Быть не может. У меня явно не в отладчике проблема. У меня явно что-то не то по шине твориться. У меня совершенно нормально бегают MSI-X прерывания. У меня запись/чтение нормально работают. У меня только непонятно с легаси. По моему я что-то упустил. Хотя там всего два вывода. Я уже все варианты перепробовал.
|
|
|
|
|
Sep 13 2010, 12:20
|

Гуру
     
Группа: Свой
Сообщений: 3 615
Регистрация: 12-01-09
Из: США, Главное разведовательное управление
Пользователь №: 43 230

|
Цитата(Oldring @ Sep 13 2010, 15:01)  "жесткий зависон всего" - это как? Это ведь экспресс? Комп вообще ни на что не реагирует, пока карточку через jtag не остановиш. Цитата Карты в других слотах работают или тоже зависают? У меня один сплот для видеокарточки, в него мое и воткнуто.
|
|
|
|
|
Sep 13 2010, 12:27
|

Гуру
     
Группа: Свой
Сообщений: 3 041
Регистрация: 10-01-05
Из: Москва
Пользователь №: 1 874

|
Цитата(Methane @ Sep 13 2010, 16:20)  Комп вообще ни на что не реагирует, пока карточку через jtag не остановиш. А после остановки карточки оживает? А если просто карточку выдернуть? Похоже что карточка бомбардирует root complex какими-то запросами, и случается DOS. Что мне кажется странным. Наверное, такими запросами должны быть неснятые прерывания, которые процессор непрерывно обрабатывает. Как это может случиться под Линуксом - не скажу. Цитата(Methane @ Sep 13 2010, 16:20)  У меня один сплот для видеокарточки, в него мое и воткнуто. Мне кажется, эта проблема не стоит даже упоминания. Мамка с несколькими экспрессными слотами обойдется явно дешевле вашей зарплаты.
--------------------
Пишите в личку.
|
|
|
|
|
Sep 13 2010, 12:35
|

Гуру
     
Группа: Свой
Сообщений: 3 615
Регистрация: 12-01-09
Из: США, Главное разведовательное управление
Пользователь №: 43 230

|
Цитата(Oldring @ Sep 13 2010, 15:27)  А после остановки карточки оживает? А если просто карточку выдернуть? Похоже что карточка бомбардирует root complex какими-то запросами, и случается DOS. Что мне кажется странным. Наверное, такими запросами должны быть неснятые прерывания, которые процессор непрерывно обрабатывает. Как это может случиться под Линуксом - не скажу. Может быть. Сигнал что INTA случилось, имеет более высокий приоритет. НО! У меня всего две линии. Одну я могу либо вверх либо вниз. А другой - просто ACK. У меня нет других возможностей на INTА влиять. Цитата Мне кажется, эта проблема не стоит даже упоминания. Мамка с несколькими экспрессными слотами обойдется явно дешевле вашей зарплаты. Все не пашет. Ни клава ни мышка. И сама карточка не пашет после первого прерывания. Я явно что-то делаю не так.
|
|
|
|
|
Sep 15 2010, 07:08
|

Гуру
     
Группа: Свой
Сообщений: 3 615
Регистрация: 12-01-09
Из: США, Главное разведовательное управление
Пользователь №: 43 230

|
Цитата(Oldring @ Sep 15 2010, 09:29)  Ну так в случае DOS клава с мышкой работать и не должны - им не хватит времени. Да и обработка мышки скорее всего сделана не в самом обрабортчике мышиного прерывания. Цитата static irqreturn_t Avia_pci_interrupt (int irq, void *dev_id) {
RP1 *rp; rp = (RP1 *) dev_id;
rp->interrupts++; barrier(); mb(); rp->dmaRxMain.iomem->dma0.msi[0].dataA = 1; return IRQ_HANDLED; } Вот обработчик. В аттаче картинка. app_int_sts - INTA app_int_ack - ACK для INTA. vector_pending - кол-векторов которые требуют обработки, ..clear_req - шина по которой вектора сбрасываются. dma_tx_reg_addr - адресс внутри карточки, dataA - имеет адресс 0х10000 запись в этот регистр поднимает clear_req, и запрос на обработку прерывания сбрасывается, INTA опускается. Видно что одно прерывание проходит нормально, а когда происходит второе прерывание, обработчик в переывание входит, но сбросить запрос на прерывание уже не получается, потому что карточка стоит. Потом, как я понимаю, когда заканчиваются TAGи, зависает и комп. Если, через JTAG начать заливать новую прошивку в ПЛИС, комп уходит в мягкий ресет.
Эскизы прикрепленных изображений
|
|
|
|
|
May 26 2015, 06:28
|
Участник

Группа: Участник
Сообщений: 34
Регистрация: 25-04-05
Пользователь №: 4 466

|
Добрый день. У меня тоже возникли проблемы с прерываниями PCIe. Плата - кит от альтеры на C4. Операционка WinXP x32. MSI-X и MSI не использую. Проявляется проблема в том, что при загрузке винды происходит вызов OnInterrupt, который я прикручиваю в вызове IoConnectInterrupt. Плата точно не генерит это прерывание, т.к. все сигналы запросов зажаты в 0. В обработчике (OnInterrupt) я просто пишу в плату определенное число и вторым компом по SignalTap наблюдаю. Такой вот дебаг. Так вот, если обработчик вернет TRUE, то процентов на 95 комп перегрузится. Если вернет FALSE, то обработчик будет вновь и вновь вызываться. Это даст винде загрузиться, но потом она все равно зависнет или перегрузится.
С другой стороны, если включить комп с выключенной платой, а потом ее включить (подать питание) и найти поиском в диспетчере устройств, то она будет работать корректно. Если в ней раскоментарить генерацию прерываний, то они будут нормально генериться и обрабатываться драйвером.
Если обработчик вообще не прикручивать с помощью IoConnectInterrupt, то все будет хорошо.
Драйвер изначально был сделан для PCI устройства. Там такой проблемы не было.
Может стоит пользоваться IoConnectInterruptEx? Но я пока не планирую MSI... Подкиньте, пожалуйста, идеи.
Сообщение отредактировал otv116 - May 26 2015, 06:30
|
|
|
|
|
May 26 2015, 18:52
|
Участник

Группа: Участник
Сообщений: 34
Регистрация: 25-04-05
Пользователь №: 4 466

|
Спасибо.
soldat_shveyk,
я делал эксперимент с возвращением постоянно FALSE. При загрузке винды этот как раз и соответствует тому что вы пишете -приложения нет, прерывание не мое. Но винда постоянно вызывает обработчик, пока не зависнет.
krux,
буду пробовать MSI.
|
|
|
|
|
Jun 4 2015, 10:03
|
Участник

Группа: Участник
Сообщений: 34
Регистрация: 25-04-05
Пользователь №: 4 466

|
Перешел я на использование IOConnectInterruptEx, FULLY_SPECIFIED (в XP можно только эту версию использовать). В описании на альтеровскую корку написано, что по включению используются legacy (lane-based) и для использования MSI надо ручками менять биты в одном из конфиг регов. До этого я не дошел, так что фактически продолжаю использовать legacy. IOConnectInterruptEx ничего нового не дал. Все осталось как есть. Есть пару подробностей относительно срабатывания OnInterrupt при старте винды. Ранее я писал, что если я верну TRUE, то винда перегрузится. Это не совсем точно. В обработчике прерывания я лезу в плату и проверяю бит, что это мое прерывание. Так вот перезагрузку вызывает именно обращение к моей плате. Если в обработчике я просто буду делать DebugPrint и возвращать TRUE, то винда загрузится. Но обработчик прерывания будет постоянно вызываться и вызываться, точно так же, как и в случае, когда обработчик всегда возвращал FALSE. Я предполагаю, что перезагрузка происходит потому, что ServiceContext, передаваемый обработчику вовсе не содержит адреса на мой DeviceExtension, поля которого я использую при обращении к плате. Надо будет выкинуть в дебаг его значение. Выглядит, как будто это прерывание никак обрабатывается (не сбрасывается источник) и мне его постоянно присылают. Похожее наблюдается, если в девайсе установить прерывание и не чистить - хоть OnInterruptEx будет возвращать TRUE, обработчик прерывания будет постоянно вызываться, пока в девайсе оно не снимется. Я даже подумал, что может корка глючит. После загрузки винды дернул сигнал запроса прерывания вверх-вниз, но это ничего не поменяло. Вот такие новости.
Сообщение отредактировал otv116 - Jun 4 2015, 10:06
|
|
|
|
|
Jun 5 2015, 09:22
|
Участник

Группа: Участник
Сообщений: 34
Регистрация: 25-04-05
Пользователь №: 4 466

|
Идея про неправильный ServiceContext себя не подтвердила. Он приходит правильный. Я в ПЛИС завел счетчик, который инкрементирую каждый раз при вызове OnInterrupt. Смотрю за ним с другого компа через SignalTap. Так вот, в определенный момент OnInterrupt начинает непрерывно вызываться. Мой восьмибитный счетчик наматывает пару кругов, после чего комп виснет. Как будто есть еще какой то источник прерывания кроме моего контроллера в ПЛИС, и его то и надо очистить. Не исключаю, что в драйвере что-то кардинально не так. Уже подумываю откатиться назад на уровень примера toaster и заново потихоньку наращивать функционал.
|
|
|
|
|
Jun 7 2015, 19:00
|
Участник

Группа: Участник
Сообщений: 34
Регистрация: 25-04-05
Пользователь №: 4 466

|
С тостером та же фигня. Тупик, блин.
|
|
|
|
|
Jun 9 2015, 19:20
|
Участник

Группа: Участник
Сообщений: 34
Регистрация: 25-04-05
Пользователь №: 4 466

|
Решил поглядеть, что будет на Win8 x64. При загрузке винды тоже есть вызов OnInterrupt, не вызванный моей платой. Но он только один и после того, как я на него верну TRUE, больше не повторяется. Винда нормально грузится и после этого прерывания корректно работают.
|
|
|
|
|
Jun 11 2015, 19:29
|
Участник

Группа: Участник
Сообщений: 34
Регистрация: 25-04-05
Пользователь №: 4 466

|
Чтобы отмести возможные глюки моей платы, воткнул в комп с winXP преходник PCIe -> USB3. Поставил для него мой драйвер (в железо не лазит, а только DbgPrint в функции OnInterrupt). Картина та же - сразу после утановки все тихо, а после перезагрузки винды непрерывные вызовы OnInterrupt. Т.е. вроде как моя железяка ни при чем. Поставил переходнику родные дрова - все нормально работает. Значит и на мамку можно не грешить.
|
|
|
|
|
Jun 17 2015, 07:47
|
Участник

Группа: Участник
Сообщений: 34
Регистрация: 25-04-05
Пользователь №: 4 466

|
Разобрался я в чем дело. soldat_shveyk первым же своим ответом в сообщении 33 все верно описал. После перезагрузки винды начинали прилетать прерывания от сетевухи, на которые надо отвечать FALSE. Сбило меня с толку то, что если я все время отвечал FALSE, то винда все равно перегружалась через какое-то время. Оказалось, что это совсем не связано с моим драйвером. На видюхе сдох вентилятор, она перегревалась и все падало. После его ремонта поведение винды стало предсказуемым - примерно раз в секунду валится чужое прерывание и никому особо жить не мешает. Свое прерывание я определяю прочитав один из регистор моей платы. А вот если я все время возвращаю TRUE, то в случае прерывания от сетевухи она продолжает его генерить, отчего винда и перегружается. В общем, теперь все хорошо. Спасибо всем. Следующий шаг - DMA. Так что, до новых встреч  Но уже, видимо, не в этой теме.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|