OSDev http://osdev.su/ |
|
ACPI и PCI меня удивляют http://osdev.su/viewtopic.php?f=7&t=1154 |
Страница 1 из 1 |
Автор: | shm [ 17 сен 2016, 17:47 ] |
Заголовок сообщения: | ACPI и PCI меня удивляют |
Доброго денечка. Запустил тут 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 дергать? |
Автор: | pavia [ 17 сен 2016, 18:43 ] |
Заголовок сообщения: | Re: ACPI и PCI меня удивляют |
Толи я уже устал, толи не пойму вопроса. Сразу скажу что с 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. |
Автор: | shm [ 17 сен 2016, 19:00 ] |
Заголовок сообщения: | Re: ACPI и PCI меня удивляют |
pavia писал(а): Нет не достаточно. Это просто ячейки памяти, а не регистры или триеры. Они не приводят к непосредственным изменениям. Ок, еще раз поищу подходящие методы в acpi. Сразу скажу, что на всем моем железе это приводит к нужному результату (правда не попробовал менять pin), однако, не буду утверждать, что это будет работать везде. Насколько я понял, также сейчас сделали разработчики Колибри. Понятно, что нельзя туда писать что попало от балды, для этого и есть табличка роутинга. Поэтому и спрашиваю. Ну и конфигурационное пространство PCI это не "просто ячейки памяти". Цитата: Кратко истории. С появления PCIE в архитектуре вводится xAPIC. На мосте PCIE расположен свой xAPIC. Поэтому и потребовалась настройка мостов. До PCIE было ещё несколько разновидностей APIC которые программировались по своему. Но суть была в том что был один центральный IOAPIC и несколько LAPIC. Насколько помню в acpica IOAPIC привязан к корневому (нуливому) мосту. Ниче не понял. Где почитать тогда про такую настройку мостов? И еще раз замечу, что на всех моих реальных машинах с PCIE корневой мост присутствует как положено. |
Автор: | shm [ 18 сен 2016, 03:17 ] |
Заголовок сообщения: | Re: ACPI и PCI меня удивляют |
Посмотрел даташит на ICH9, там действительно должен быть мост с тем же адресом, что выдает acpi в VirtualBox и к нему должен быть доступ. Каких-то особых требований к инициализации я не заметил. Странно все это. |
Автор: | Himik [ 12 окт 2016, 00:38 ] |
Заголовок сообщения: | Re: ACPI и PCI меня удивляют |
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 |
Автор: | shm [ 22 июл 2017, 23:49 ] |
Заголовок сообщения: | Re: ACPI и PCI меня удивляют |
Разобрался я с этим всем. Существует 2 способа получения номера шины: 1. вызвать функцию acpi "_BBN" для дескриптора шины или выполнить "_ADR" и вычитать прямо из PCI родительской шины. Один из этих вариантов должен работать. С установкой прерываний тоже разобрался, нужно вычитать pin из устройства и найти для него irq из всего того мусора, что возвращает acpi (для этого устройства). Я обновляю номер IRQ в конф. пространсве, но вроде как это делать для режима io apic необязательно (можно просто где-нибудь запомнить), скорее для удобства. У acpi еще есть таблица перенаправлений для isa irq, ее нужно обязательно учитывать, а распарсить можно даже без acpica. |
Страница 1 из 1 | Часовой пояс: UTC + 3 часа |
Powered by phpBB® Forum Software © phpBB Group http://www.phpbb.com/ |