реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> Прерывания PCI.
Methane
сообщение Sep 10 2010, 13:48
Сообщение #16


Гуру
******

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



Только что проверил, у меня прерывание вызывается два раза. Первый раз вызвалось, а потом просто затыкается обмен с карточкой, и я уже не могу ничего туда записать судя по всему.
Раньше один раз вызывалось.

Цитата(DS @ Sep 10 2010, 16:41) *
Нет клина прерывания (после выхода обработчик вызывается снова и так до бесконечности) ? Проверьте как-нибудь. Если этого нет, то проблема с самой шиной скорее всего. Без прерываний обмен работает ?

Не похоже. Иначе бы у меня комп крашился из за переполнения стека или еще чего. У меня в обработчике стоит счетчик, который я могу посмотреть. Раньше он показывал 1, а теперь показывает два. Обмен работает. И запись и чтение и DMA из карточки в ОЗУ компа и обратно, и MSI-X прерывания работает. Клины у меня с поддержкой легаси прерываний. Но после легаси прерывания затыкается.
Go to the top of the page
 
+Quote Post
DS
сообщение Sep 10 2010, 14:00
Сообщение #17


Гуру
******

Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250



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


А в цепочке обработчиков ничего больше не сидит ?
Так клинит обычно, когда "залипает" запрос прерывания. В остальных случаях он бы у Вас вывалился и больше не вернулся в обработчик - машина бы не повисла. При зацикливании в обработчике стек не переполняется - в обработчике прерывания запрещены, после выхода из обработчика стек восстанавливается, и обработчик вызывается снова с корректными параметрами. Помахать чем-нибудь из обработчика можете ?


--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
Go to the top of the page
 
+Quote Post
Methane
сообщение Sep 10 2010, 14:56
Сообщение #18


Гуру
******

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



Цитата(DS @ Sep 10 2010, 17:00) *
А в цепочке обработчиков ничего больше не сидит ?
Так клинит обычно, когда "залипает" запрос прерывания. В остальных случаях он бы у Вас вывалился и больше не вернулся в обработчик - машина бы не повисла. При зацикливании в обработчике стек не переполняется - в обработчике прерывания запрещены, после выхода из обработчика стек восстанавливается, и обработчик вызывается снова с корректными параметрами. Помахать чем-нибудь из обработчика можете ?

Висит что-то. Но какая разница. У меня весь обмен по PCIe после этого пдает. Обычно так бывает если с PCIe какие-то не корректные данные приходят.
Go to the top of the page
 
+Quote Post
Methane
сообщение Sep 13 2010, 09:20
Сообщение #19


Гуру
******

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



Вот пример из примера Альтеры.
Код
  // LEGACY INT REQUEST
   assign app_int_sts = app_int_req;

   always @ (negedge rstn or posedge clk_in) begin
      if (rstn==1'b0) begin
          app_int_req      <= 1'b0;
          app_int_ack_reg  <= 1'b0;
          int_deassert     <= 1'b0;
      end
      else begin
          app_int_ack_reg <= app_int_ack;                                     // input boundary reg
          int_deassert    <= app_int_ack_reg ? ~int_deassert : int_deassert;  // track whether core is sending interrupt ASSERTION message or DEASSERTION message.

          if (app_int_ack_reg)                                                // deassert request when Interrupt ASSERTION is ack-ed
              app_int_req  <= 1'b0;
          else if ((~msi_enable & ~int_deassert) &
                    (((msi_sel_dmawr == 1'b1) &  (app_msi_req_dmawr == 1'b1)) |
                    ((msi_sel_dmawr == 1'b0) &  (app_msi_req_dmard == 1'b1)) ) ) begin  // assert if there is a request, and not waiting for the DEASSERTION ack for this request
                  app_int_req  <= 1'b1;
          end
          else
              app_int_req  <= app_int_req;
      end
   end


   // MSI & LEGACY ACKNOWLEDGE - sent to the internal interrupt requestor

   assign interrupt_ack_int = (app_msi_ack &  msi_enable) |                     // Ack from MSI
                              (app_int_ack_reg & ~int_deassert & ~msi_enable);   // INT ASSERT Message Ack from Legacy

deassert request when Interrupt ASSERTION is ack-ed Они сразу же опускают INTA, как только из корки приходит ACK. Но после этого корка тупо помирает и компьютер зависает. На контр-альт-дел не реагирует, но перезагружается, сразу как только я через JTAG начинаю новую прошивку лить в Альтеру. Если делать app_int_req <= 1'b0; уже из обработчика прерывания, когда уже вошли в обработчик, и сбросили вектор, то тоже не работает. Я уже все варианты перепробовал. sad.gif
Go to the top of the page
 
+Quote Post
DS
сообщение Sep 13 2010, 11:01
Сообщение #20


Гуру
******

Группа: СуперМодераторы
Сообщений: 3 096
Регистрация: 16-01-06
Из: Москва
Пользователь №: 13 250



Из обработчика прерывания можно каким нибудь проводом дергать ? Надо понять, встает шина или "залип" запрос на обработку прерывания. Иначе дальше не двинетесь. Нужно что-то поднять и опустить во время нахождения в обработчике, чтобы было видно зацикливание.


--------------------
Не бойтесь тюрьмы, не бойтесь сумы, не бойтесь мора и глада, а бойтесь единственно только того, кто скажет - "Я знаю как надо". А. Галич.
Go to the top of the page
 
+Quote Post
Oldring
сообщение Sep 13 2010, 11:11
Сообщение #21


Гуру
******

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



Цитата(DS @ Sep 13 2010, 15:01) *
Из обработчика прерывания можно каким нибудь проводом дергать ? Надо понять, встает шина или "залип" запрос на обработку прерывания. Иначе дальше не двинетесь. Нужно что-то поднять и опустить во время нахождения в обработчике, чтобы было видно зацикливание.



А у Линукса что-ли нет ядерного отладчика?
Быть не может.


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
Methane
сообщение Sep 13 2010, 11:55
Сообщение #22


Гуру
******

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



Цитата(DS @ Sep 13 2010, 14:01) *
Из обработчика прерывания можно каким нибудь проводом дергать ? Надо понять, встает шина или "залип" запрос на обработку прерывания. Иначе дальше не двинетесь. Нужно что-то поднять и опустить во время нахождения в обработчике, чтобы было видно зацикливание.

Встает шина. Если после этого попробовать что-то прочитать из карточки, то в карточку не приходит запросов вообще, и как результат читаются одни FF. И сразу после чтения жесткий зависон всего.

На сигнал-тап видно. Прошло одно прерывание, обработчик его сбросил. Пришло второе, и уже просто ни команда записи, ни команды чтения до автомата который обрабатывает входящие сообщения не доходят.

Цитата(Oldring @ Sep 13 2010, 14:11) *
А у Линукса что-ли нет ядерного отладчика?
Быть не может.

У меня явно не в отладчике проблема. У меня явно что-то не то по шине твориться. У меня совершенно нормально бегают MSI-X прерывания. У меня запись/чтение нормально работают. У меня только непонятно с легаси. По моему я что-то упустил. Хотя там всего два вывода. Я уже все варианты перепробовал.
Go to the top of the page
 
+Quote Post
Oldring
сообщение Sep 13 2010, 12:01
Сообщение #23


Гуру
******

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



Цитата(Methane @ Sep 13 2010, 15:55) *
Встает шина. Если после этого попробовать что-то прочитать из карточки, то в карточку не приходит запросов вообще, и как результат читаются одни FF. И сразу после чтения жесткий зависон всего.


"жесткий зависон всего" - это как? Это ведь экспресс?
Карты в других слотах работают или тоже зависают?


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
Methane
сообщение Sep 13 2010, 12:20
Сообщение #24


Гуру
******

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



Цитата(Oldring @ Sep 13 2010, 15:01) *
"жесткий зависон всего" - это как? Это ведь экспресс?

Комп вообще ни на что не реагирует, пока карточку через jtag не остановиш.
Цитата
Карты в других слотах работают или тоже зависают?

У меня один сплот для видеокарточки, в него мое и воткнуто.
Go to the top of the page
 
+Quote Post
Oldring
сообщение Sep 13 2010, 12:27
Сообщение #25


Гуру
******

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



Цитата(Methane @ Sep 13 2010, 16:20) *
Комп вообще ни на что не реагирует, пока карточку через jtag не остановиш.


А после остановки карточки оживает? А если просто карточку выдернуть?
Похоже что карточка бомбардирует root complex какими-то запросами, и случается DOS. Что мне кажется странным. Наверное, такими запросами должны быть неснятые прерывания, которые процессор непрерывно обрабатывает. Как это может случиться под Линуксом - не скажу.

Цитата(Methane @ Sep 13 2010, 16:20) *
У меня один сплот для видеокарточки, в него мое и воткнуто.


Мне кажется, эта проблема не стоит даже упоминания. Мамка с несколькими экспрессными слотами обойдется явно дешевле вашей зарплаты.


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
Methane
сообщение Sep 13 2010, 12:35
Сообщение #26


Гуру
******

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



Цитата(Oldring @ Sep 13 2010, 15:27) *
А после остановки карточки оживает? А если просто карточку выдернуть?
Похоже что карточка бомбардирует root complex какими-то запросами, и случается DOS. Что мне кажется странным. Наверное, такими запросами должны быть неснятые прерывания, которые процессор непрерывно обрабатывает. Как это может случиться под Линуксом - не скажу.

Может быть. Сигнал что INTA случилось, имеет более высокий приоритет. НО! У меня всего две линии. Одну я могу либо вверх либо вниз. А другой - просто ACK. У меня нет других возможностей на INTА влиять.

Цитата
Мне кажется, эта проблема не стоит даже упоминания. Мамка с несколькими экспрессными слотами обойдется явно дешевле вашей зарплаты.

Все не пашет. Ни клава ни мышка. И сама карточка не пашет после первого прерывания. Я явно что-то делаю не так.
Go to the top of the page
 
+Quote Post
Oldring
сообщение Sep 15 2010, 06:29
Сообщение #27


Гуру
******

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



Цитата(Methane @ Sep 13 2010, 16:35) *
Все не пашет. Ни клава ни мышка. И сама карточка не пашет после первого прерывания. Я явно что-то делаю не так.


Ну так в случае DOS клава с мышкой работать и не должны - им не хватит времени. Да и обработка мышки скорее всего сделана не в самом обрабортчике мышиного прерывания.


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
Methane
сообщение Sep 15 2010, 07:08
Сообщение #28


Гуру
******

Группа: Свой
Сообщений: 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 начать заливать новую прошивку в ПЛИС, комп уходит в мягкий ресет.
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Oldring
сообщение Sep 15 2010, 07:22
Сообщение #29


Гуру
******

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



Цитата(Methane @ Sep 15 2010, 11:08) *
Вот обработчик.


Спасибо. Вообще-то Верилог в Альтере с драйвером под Линукс - тройное "не моё" biggrin.gif

В экспрессе при обработке legacy, насколько я помню, карточка шлет отдельные пакеты на установку и сброс прерывания. При этом могут быть какие-то тонкости с упорядочением пакетов на шине. Иногда бывает нужно для правильного упорядочения поставить явный барьер - чтение из карточки после записи. Мне кажется, стоит для начала поэкспериментировать, проходит ли запись/чтение в карточку в первом прерывании после сброса сигнала прерывания. Ну и проверить тонкости правил упорядочения пакетов прерываний в стандарте.


--------------------
Пишите в личку.
Go to the top of the page
 
+Quote Post
Methane
сообщение Sep 15 2010, 07:43
Сообщение #30


Гуру
******

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



Цитата(Oldring @ Sep 15 2010, 10:22) *
Спасибо. Вообще-то Верилог в Альтере с драйвером под Линукс - тройное "не моё" biggrin.gif

В экспрессе при обработке legacy, насколько я помню, карточка шлет отдельные пакеты на установку и сброс прерывания. При этом могут быть какие-то тонкости с упорядочением пакетов на шине. Иногда бывает нужно для правильного упорядочения поставить явный барьер - чтение из карточки после записи. Мне кажется, стоит для начала поэкспериментировать, проходит ли запись/чтение в карточку в первом прерывании после сброса сигнала прерывания. Ну и проверить тонкости правил упорядочения пакетов прерываний в стандарте.

Поставил три чтения сразу после сброса INTA. Работает. Что-то происходит уже после.

ЗЫ, у меня и квартус под линух 64 бита. smile.gif
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 26th July 2025 - 01:52
Рейтинг@Mail.ru


Страница сгенерированна за 0.01508 секунд с 7
ELECTRONIX ©2004-2016