Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Вт ноя 20, 2018 2:55 pm

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 262 сообщения ]  На страницу Пред. 1 2 3 4 518 След.
Автор Сообщение
СообщениеДобавлено: Вт июл 02, 2013 12:14 pm 
Не в сети
Kernel Developer

Зарегистрирован: Вс фев 10, 2013 12:37 pm
Сообщения: 2329
Serge
Т.е. в на твоей машине в обоих режимах работает?

_________________
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!


Вернуться к началу
СообщениеДобавлено: Вт июл 02, 2013 12:27 pm 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3952
Только в SATA Native IDE.


Вернуться к началу
СообщениеДобавлено: Вт июл 02, 2013 12:40 pm 
Не в сети

Зарегистрирован: Вс фев 18, 2007 8:34 pm
Сообщения: 158
Mario_r4 писал(а):
yogev_ezra писал(а):
А если поменять одну строчку (IDE Operate Mode) с Legacy Mode на Native Mode, то через несколько секунд после загрузки зависает (лог снять не хватает времени). Но как раз именно с Native Mode работает Windows.

Вот что я нарыл...
"Legacy mode" в настройках скорее всего обозначает "Compatibility Mode". Лично я всегда это именно так и понимал. Что касается приведенной цитаты, то я нашел драфт с данным текстом, но там Legacy mode обозначает вообще и режим совместимости, и нативный режим (обратите внимание на нумерацию пунктов):
Цитата:
4.2.1 Legacy Mode
4.2.1.1 Compatibility Mode
4.2.1.2 PCI-Native Mode


Serge писал(а):
прерывания и в PIO работают. А необработанное прерывание вешает систему или контроллер.
+1.

Цитата:
Дефолтные обработчики стоят на irq 14 и 15. А в native может быть любой вектор. Если драйвер не ставит обработчик, конец будет немного предсказуем. У меня, кстати, так и не заработало. В одном режиме irg 11 в другом irq --.
irq -- видимо и означает IRQ14/15, т.к. контроллер работает в режиме совместимости.


Вернуться к началу
СообщениеДобавлено: Вт июл 02, 2013 12:46 pm 
Не в сети
Kernel Developer

Зарегистрирован: Вс фев 10, 2013 12:37 pm
Сообщения: 2329
Serge
Сделай, пожалуйста, следующее:
1) Закомментируй в bootcobe.inc
Спойлер: Показать
Код:
; c) class 1, subclass 1, programming interface 0x85
        mov     ax, 0xB103
        mov     ecx, 1*10000h + 1*100h + 0x85
        mov     [es:BOOT_IDE_PI_16], cx
        xor     si, si  ; device index = 0
        int     0x1A
        jnc     .found

2) Замени в bootcobe.inc
Спойлер: Показать
Код:
; d) class 1, subclass 1, programming interface 0x8A
; This is a Parallel IDE Controller which uses IRQs 14 and 15.
        mov     ax, 0xB103
        mov     ecx, 1*10000h + 1*100h + 0x8A
        mov     [es:BOOT_IDE_PI_16], cx
        xor     si, si  ; device index = 0
        int     0x1A
        jnc     .found_1 ; Parallel IDE Controller

переход .found_1 на .found (поскольку прерывание не назначено, то в DMA скорее всего контроллер 0x8A работать не будет, хотя можно проверить и без п.2)
3) Скомпилируй ядро и проверь в LEGACY режиме.
4) Выложи сюда лог загрузки.

_________________
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!


Вернуться к началу
СообщениеДобавлено: Вт июл 02, 2013 1:10 pm 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3952
Работает.


Вложения:
BOARDLOG.TXT [7.31 КБ]
50 скачиваний
Вернуться к началу
СообщениеДобавлено: Вт июл 02, 2013 1:33 pm 
Не в сети
Kernel Developer

Зарегистрирован: Вс фев 10, 2013 12:37 pm
Сообщения: 2329
Ну, это издержки поддержки лишь одного контроллера в коде - буду дорабатывать.
Кстати можно проверить и без п.2 в изменениях, поскольку:
Спойлер: Показать
Код:
K : BAR0 0001 
K : BAR1 0001
K : BAR2 0001
K : BAR3 0001
K : BAR4 0000
K : IDEContrProgrammingInterface 018A

То с большой вероятностью прерывания стандартные 14 и 15 используются, но в PCI это не отображено:
Цитата:
The device doesn't use IRQs, check if this is an Parallel IDE
...
This is a Parallel IDE Controller which uses IRQs 14 and 15

http://wiki.osdev.org/IDE
Спойлер: Показать
Detecting an IDE drive

Each IDE drive appears as a device on the PCI bus. If the class code is 0x01 (Mass Storage Controller) and the subclass code is 0x1, (IDE) this device is an IDE Device. The IDE device only uses five BARs out of the six
BAR0: Base address of primary channel (I/O space), if it is 0x0 or 0x1, the port is 0x1F0.
BAR1: Base address of primary channel control port (I/O space), if it is 0x0 or 0x1, the port is 0x3F4.
BAR2: Base address of secondary channel (I/O space), if it is 0x0 or 0x1, the port is 0x170.
BAR3: Base address of secondary channel control port, if it is 0x0 or 0x1, the port is 0x374.
BAR4: Bus Master IDE; refers to the base of I/O range consisting of 16 ports. Each 8 ports controls DMA on the primary and secondary channel respectively.

A parallel IDE drive will use IRQs 14 and 15; a serial IDE uses only one IRQ. To read this IRQ, we look through the device's PCI configuration space:
Код:
outl((1 << 31) | (bus << 16) | (device << 11) | (func << 8) | 8, 0xCF8); // Send the parameters.
if ((inl(0xCFC) >> 16) != 0xFFFF) { // If device exists (class isn't 0xFFFF)
   // Check if this device needs an IRQ assignment:
   outl((1 << 31) | (bus << 16) | (device << 11) | (func << 8) | 0x3C, 0xCF8); // Read the interrupt line field
   outb(0xFE, 0xCFC); // Change the IRQ field to 0xFE
   outl((1 << 31) | (bus << 16) | (device << 11) | (func << 8) | 0x3C, 0xCF8); // Read the interrupt line field
   if ((inl(0xCFC) & 0xFF) == 0xFE) {
      // This device needs an IRQ assignment.
   } else {
      // The device doesn't use IRQs, check if this is an Parallel IDE:
      if (class == 0x01 && subclass == 0x01 && (ProgIF == 0x8A || ProgIF == 0x80)) {
         // This is a Parallel IDE Controller which uses IRQs 14 and 15.
      }
   }
}

_________________
Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!


Вернуться к началу
СообщениеДобавлено: Вт июл 02, 2013 1:51 pm 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3952
В линуксе сразу патчат, ещё при сканировании
Код:
            /*
             *      Do the ugly legacy mode stuff here rather than broken chip
             *      quirk code. Legacy mode ATA controllers have fixed
             *      addresses. These are not always echoed in BAR0-3, and
             *      BAR0-3 in a few cases contain junk!
             */
            if (class == PCI_CLASS_STORAGE_IDE)
            {
                u8_t progif;

                progif = PciRead8(dev->busnr, dev->devfn,PCI_CLASS_PROG);
                if ((progif & 1) == 0)
                {
                    dev->resource[0].start = 0x1F0;
                    dev->resource[0].end = 0x1F7;
                    dev->resource[0].flags = LEGACY_IO_RESOURCE;
                    dev->resource[1].start = 0x3F6;
                    dev->resource[1].end = 0x3F6;
                    dev->resource[1].flags = LEGACY_IO_RESOURCE;
                }
                if ((progif & 4) == 0)
                {
                    dev->resource[2].start = 0x170;
                    dev->resource[2].end = 0x177;
                    dev->resource[2].flags = LEGACY_IO_RESOURCE;
                    dev->resource[3].start = 0x376;
                    dev->resource[3].end = 0x376;
                    dev->resource[3].flags = LEGACY_IO_RESOURCE;
                };
            }


Вернуться к началу
СообщениеДобавлено: Вт июл 02, 2013 3:41 pm 
Не в сети

Зарегистрирован: Вс фев 18, 2007 8:34 pm
Сообщения: 158
В Линуксе делают все правильно, т.е. в BAR'ы даже не лезут, если канал (!!!) работает в режиме совместимости. Что касается прерываний, то в OSDev-вики логика более-менее правильная: если устройство говорит, что не нуждается в IRQ, но это PCI IDE-контроллер, работающий в режиме совместимости, то он использует IRQ14/15, о чем я и говорил выше.


Вернуться к началу
СообщениеДобавлено: Вт июл 02, 2013 3:56 pm 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3952
Phantom-84
А разве в legacy нельзя переписать номер irq ? Вроде ничего такого в документации нет.


Вернуться к началу
СообщениеДобавлено: Вт июл 02, 2013 7:34 pm 
Не в сети

Зарегистрирован: Вс фев 18, 2007 8:34 pm
Сообщения: 158
Я знаю, что в режиме совместимости запись в BAR'ы может блокироваться. Увидел код и подумал, что с INTLN происходит тоже самое. Хотя в режиме совместимости значительно проще и надежнее вообще не лезть в INTLN.

Даже если мы проверим и увидим, что запись в INTLN происходит успешно/безуспешно, то: 1) не факт, что подобное, какой бы результат мы не получили, происходит всегда и везде; 2) успешная запись какого-либо опред. номера будет лишь сбивать столку, потому что в режиме совместимости у каждого канала свой номер IRQ, причем вполне конкретный. Хотя если мы увидим, что BIOS записала в INTLN какой-то особый номер, то возможно мы имеем дело с "чудом", работающим с каналами в разных режимах, а переданный нам номер IRQ используется для канала, работающего в нативном режиме. В более простых случаях мы навряд ли сможем увидеть в INTLN номер IRQ, отличный от 14-го.


Вернуться к началу
СообщениеДобавлено: Вт июл 02, 2013 8:15 pm 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3952
Вот и у меня подозрение, что код с osdev делает необоснованные выводы из возможности переписать номер линии. Регистр носит чисто справочный характер и доступен для записи всегда, независимо от режима работы. Ещё интересней то, что они его переписывают не сохраняя оригинальное значение, ССЗБ. Подобные примеры только сбивают людей с толку.


Вернуться к началу
СообщениеДобавлено: Вт июл 02, 2013 8:23 pm 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3952
Mario_r4
Так как сейчас в native работает ? DMA + IRQ, PIO + IRQ ?


Вернуться к началу
СообщениеДобавлено: Вт июл 02, 2013 8:38 pm 
Не в сети

Зарегистрирован: Вс фев 18, 2007 8:34 pm
Сообщения: 158
Serge, в PCI Spec. вроде бы было написано, что если устройству не требуются прерывания, то оно может не реализовывать и INTLN, т.е. без доп. проверки или полной уверенности в своих действиях что-либо сохранять в INTLN нельзя.


Последний раз редактировалось Phantom-84 Вт июл 02, 2013 8:46 pm, всего редактировалось 1 раз.

Вернуться к началу
СообщениеДобавлено: Вт июл 02, 2013 8:45 pm 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3952
Phantom-84
Интересная информация.
Это надо сперва проверить INT_PIN, и уже потом INTLN ?


Вернуться к началу
СообщениеДобавлено: Вт июл 02, 2013 8:57 pm 
Не в сети

Зарегистрирован: Вс фев 18, 2007 8:34 pm
Сообщения: 158
У меня нет уверенности, что PCI IDE- в режиме совместимости не выкинет какой-нибудь фокус, поэтому да. Я немного подредактировал пред. пост, т.е. INT_PIN можно не проверять, если ты на 100% уверен, что устройство работает с прерываниями. В случае PCI IDE- в режиме совместимости, как только что сказал, у меня 100-проц. уверенности нет. Да еще этот код с вики...

Все-таки нужно проверить, хотя бы как частный случай.


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 262 сообщения ]  На страницу Пред. 1 2 3 4 518 След.

Часовой пояс: UTC+03:00


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

Сейчас этот форум просматривают: Google [Bot] и 1 гость


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

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