OSDev

для всех
Текущее время: 28 мар 2024, 14:25

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: ACPI и PCI меня удивляют
СообщениеДобавлено: 17 сен 2016, 17:47 

Зарегистрирован: 11 янв 2011, 22:17
Сообщения: 21
Доброго денечка.
Запустил тут acpica под своим ядром с целью сделать нормальный irq routing для ioapic. В общем-то таблицу получаю в виде дерева, где узами являются мосты pci. Насколько я понял, адресация в acpi организуется относительно родительского узла. Соответственно, чтобы узнать номер шины (для текущей подтаблицы роутинга) нужно из pci моста вычитать номер шины. И вроде это работает (по крайней мере на том железе, что у меня есть под рукой). Проблема возникает с VIrtualBox в режиме эмуляции ICH9, а конкретно нахожу в ACPI корневой pci мост (он же pci-to-host), считываю его адрес, но в конфигурационном пространстве его нет (читаются FF), причем все дочернее его устройства на шине видны (если предположить что для pci-to-host адрес шины всегда = 0). Собственно возникает вопрос, как с этим быть и что делать? Может его инить как-то надо? И есть еще 1 вопрос: на выходе я получаю для каждого устройства таблицу вида:
parent_brg addr pin irq
Чтобы связать устройство с нужным irq, достаточно ли просто прописать соответствующий pin и irq в соответствующие ячейки конфигурационного пространства или нужно еще какие-то методы acpi дергать?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ACPI и PCI меня удивляют
СообщениеДобавлено: 17 сен 2016, 18:43 
Аватара пользователя

Зарегистрирован: 16 май 2007, 23:46
Сообщения: 1126
Толи я уже устал, толи не пойму вопроса.
Сразу скажу что с acpica я не работал.
По идеи в нём должно быть всё что нужно и ничего лишнего дёргать не надо.

Цитата:
Чтобы связать устройство с нужным irq, достаточно ли просто прописать соответствующий pin и irq в соответствующие ячейки конфигурационного пространства или нужно еще какие-то методы acpi дергать?

Нет не достаточно. Это просто ячейки памяти, а не регистры или триеры. Они не приводят к непосредственным изменениям. Но косвенно вполне могут, старые драйвера любят читают эти значения чтобы узнать свой номер прерывания вместо вызова API OS. Новые драйвера думаю отучились от этого.

Цитата:
крайней мере на том железе, что у меня есть под рукой). Проблема возникает с VIrtualBox в режиме эмуляции ICH9, а конкретно нахожу в ACPI корневой pci мост (он же pci-to-host), считываю его адрес, но в конфигурационном пространстве его нет (читаются FF), причем все дочернее его устройства на шине видны (если предположить что для pci-to-host адрес шины всегда = 0).

Кратко истории. С появления PCIE в архитектуре вводится xAPIC. На мосте PCIE расположен свой xAPIC. Поэтому и потребовалась настройка мостов. До PCIE было ещё несколько разновидностей APIC которые программировались по своему. Но суть была в том что был один центральный IOAPIC и несколько LAPIC. Насколько помню в acpica IOAPIC привязан к корневому (нуливому) мосту.

Так что советую более детально изучить как работать с acpica.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ACPI и PCI меня удивляют
СообщениеДобавлено: 17 сен 2016, 19:00 

Зарегистрирован: 11 янв 2011, 22:17
Сообщения: 21
pavia писал(а):
Нет не достаточно. Это просто ячейки памяти, а не регистры или триеры. Они не приводят к непосредственным изменениям.

Ок, еще раз поищу подходящие методы в acpi. Сразу скажу, что на всем моем железе это приводит к нужному результату (правда не попробовал менять pin), однако, не буду утверждать, что это будет работать везде. Насколько я понял, также сейчас сделали разработчики Колибри. Понятно, что нельзя туда писать что попало от балды, для этого и есть табличка роутинга. Поэтому и спрашиваю. Ну и конфигурационное пространство PCI это не "просто ячейки памяти".
Цитата:
Кратко истории. С появления PCIE в архитектуре вводится xAPIC. На мосте PCIE расположен свой xAPIC. Поэтому и потребовалась настройка мостов. До PCIE было ещё несколько разновидностей APIC которые программировались по своему. Но суть была в том что был один центральный IOAPIC и несколько LAPIC. Насколько помню в acpica IOAPIC привязан к корневому (нуливому) мосту.

Ниче не понял. Где почитать тогда про такую настройку мостов? И еще раз замечу, что на всех моих реальных машинах с PCIE корневой мост присутствует как положено.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ACPI и PCI меня удивляют
СообщениеДобавлено: 18 сен 2016, 03:17 

Зарегистрирован: 11 янв 2011, 22:17
Сообщения: 21
Посмотрел даташит на ICH9, там действительно должен быть мост с тем же адресом, что выдает acpi в VirtualBox и к нему должен быть доступ. Каких-то особых требований к инициализации я не заметил. Странно все это.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ACPI и PCI меня удивляют
СообщениеДобавлено: 12 окт 2016, 00:38 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
shm писал(а):
Странно все это.

Похоже на ошибку VirtualBox-а. Пришлось сделать костыль для системы, заполнив некоторые поля в своих структурах вручную
Код:
   //В VirtualBox не читается главный мост, поэтому прописываем значения вручную
   if(d->deviceInfo->Flags & ACPI_PCI_ROOT_BRIDGE)
   {
      if(*(UINT*)AcpiGbl_FADT.Header.OemId == 'XOBV') //"VBOX" - VirtualBox
      {
         d->VendorId = 0x8086;
         d->DeviceId = 0x29E0;
         d->ClassId = 6;
         d->SubclassId = 0;
      }
   }

Я покопался в исходниках VirtualBox, и нашёл причину проблемы в файле DevPciIch9.cpp
Код:
    /*
     * Fill in PCI configs and add them to the bus.
     */
    /** @todo Disabled for now because this causes error messages with Linux guests.
     *         The guest loads the x38_edac device which tries to map a memory region
     *         using an address given at place 0x48 - 0x4f in the PCi config space.
     *         This fails. because we don't register such a region.
     */
#if 0
    /* Host bridge device */
    PCIDevSetVendorId(  &pBus->aPciDev, 0x8086); /* Intel */
    PCIDevSetDeviceId(  &pBus->aPciDev, 0x29e0); /* Desktop */
    PCIDevSetRevisionId(&pBus->aPciDev,   0x01); /* rev. 01 */
    PCIDevSetClassBase( &pBus->aPciDev,   0x06); /* bridge */
    PCIDevSetClassSub(  &pBus->aPciDev,   0x00); /* Host/PCI bridge */
    PCIDevSetClassProg( &pBus->aPciDev,   0x00); /* Host/PCI bridge */
    PCIDevSetHeaderType(&pBus->aPciDev,   0x00); /* bridge */
    PCIDevSetWord(&pBus->aPciDev,  VBOX_PCI_SEC_STATUS, 0x0280);  /* secondary status */

    pBus->aPciDev.pDevIns               = pDevIns;
    /* We register Host<->PCI controller on the bus */
    ich9pciRegisterInternal(pBus, 0, &pBus->aPciDev, "dram");
#endif


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: ACPI и PCI меня удивляют
СообщениеДобавлено: 22 июл 2017, 23:49 

Зарегистрирован: 11 янв 2011, 22:17
Сообщения: 21
Разобрался я с этим всем. Существует 2 способа получения номера шины: 1. вызвать функцию acpi "_BBN" для дескриптора шины или выполнить "_ADR" и вычитать прямо из PCI родительской шины. Один из этих вариантов должен работать. С установкой прерываний тоже разобрался, нужно вычитать pin из устройства и найти для него irq из всего того мусора, что возвращает acpi (для этого устройства). Я обновляю номер IRQ в конф. пространсве, но вроде как это делать для режима io apic необязательно (можно просто где-нибудь запомнить), скорее для удобства. У acpi еще есть таблица перенаправлений для isa irq, ее нужно обязательно учитывать, а распарсить можно даже без acpica.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB