Page 2 of 2
Re: Обработка IRQ
Posted: Wed Aug 17, 2011 2:06 pm
by art_zh
Serge wrote:Зашёл на сайт Intel поискать pdf-ы. Что они сделали с документацией ? Просто нет приличных слов.
Я давно плюнул на эту помойку и сверяюсь только AMD-доками. Но они могут быть кое в чем несовместимыми с Intel.
И еще есть книжка по архитектуре PCI Express - там все железо очень понятно описано.
MSI с точки зрения
шины - это самая обычная операция записи 16 бит по известному некэшируемому адресу.
С точки зрения
устройства - это уже
не совсем обычная запись, потому что само устройство может только инициировать "запрос номер такой-то", а про адрес и данные оно ничего не знает. Куда и что записывать, и разрешать ли эту запись вообще - это определяет драйвер.
С точки зрения
драйвера - тут прорва работы.
Если не вдаваться в детали - то надо для начала назначить устройству некий диапазон векторов, узнать адрес MMIO-блока регистров MSI-запросов LAPIC, записать туда все вектора и открыть нужные маски, а потом пробежать по MSI-цепочке в конфигспейсе устройства (Capability=5) и записать туда данные мессиджа и MMIO-адреса LAPIC для каждого вектора.
MSI я свои железяки научил генерить (мессиджи пишутся в программный буфер, вроде аппаратно-генерируемых семафоров), но с LAPIC никогда не работал.
Re: Обработка IRQ
Posted: Wed Aug 17, 2011 3:43 pm
by Serge
С msi я разобрался. Особых проблем не видно, если не только не опасаться нехватки векторов прерываний. Никакие данные msi в обработчик передать не может, как и обычное прерывание. На драйвер нагрузка тоже не велика, большую часть операций должно делать ядро. Например драйвер вызывает attach_msi_irq(bdf, cfg_addr, user_data) и ядро само выбирает свободный вектор и программирует железо.
Мне понравилась реализация irq в R600+. Аналог командного процессора но наоборот. Устройство пишет в кольцевой буфер 128 бит в следующем формате
Code: Select all
/* r600 IV Ring
* Each IV ring entry is 128 bits:
* [7:0] - interrupt source id
* [31:8] - reserved
* [59:32] - interrupt source data
* [127:60] - reserved
*
* The basic interrupt vector entries
* are decoded as follows:
* src_id src_data description
* 1 0 D1 Vblank
* 1 1 D1 Vline
* 5 0 D2 Vblank
* 5 1 D2 Vline
* 19 0 FP Hot plug detection A
* 19 1 FP Hot plug detection B
* 19 2 DAC A auto-detection
* 19 3 DAC B auto-detection
* 21 4 HDMI block A
* 21 5 HDMI block B
* 176 - CP_INT RB
* 177 - CP_INT IB1
* 178 - CP_INT IB2
* 181 - EOP Interrupt
* 233 - GUI Idle
Сдаётся мне что между src_id=1 src_id=233 занято намного больше значений.
Re: Обработка IRQ
Posted: Sun Aug 21, 2011 3:42 pm
by Serge
Удалил функции 41,42,44,45. Ф. 43 кандидат на удаление в ближайшее время. Смысла в ней уже давно нет, потому что есть прямой доступ к портам, защищённый битовой картой доступа. Если кто-то использует ф.43 замените её обычными командами in/out.
Re: Обработка IRQ
Posted: Sun Aug 21, 2011 7:37 pm
by Mario
А есть уверенность, что какая-нибудь из сетевых программ не использует эти функции?
Re: Обработка IRQ
Posted: Sun Aug 21, 2011 9:01 pm
by Serge
А зачем им ? Только ppp работает с COM портом. Дайлап ещё актуален ?
Re: Обработка IRQ
Posted: Sun Aug 21, 2011 9:19 pm
by Mario
Не знаю, но не мешало бы проверить исходники на SVN, чтобы потом "грабли" не кричать.
Re: Обработка IRQ
Posted: Sun Aug 21, 2011 10:49 pm
by Serge
А всё равно пришлось бы убирать. Так с прерываниями не работают.
Re: Обработка IRQ
Posted: Wed Aug 24, 2011 2:08 pm
by Serge
Залил расшареные обработчики на SVN. Весь код собран в core/irq.inc. Дальше буду частями заливать APIC.
Re: Обработка IRQ
Posted: Wed Aug 24, 2011 2:33 pm
by mike.dld
core/irq.inc, FTFY. Не нужно травмировать людей.
Re: Обработка IRQ
Posted: Wed Aug 24, 2011 2:35 pm
by Serge
Уже исправил. И не только irq.inc.
Re: Обработка IRQ
Posted: Wed Aug 24, 2011 4:37 pm
by Mario
Ох уж эти сишники.