Page 3 of 18

Re: SATA в режиме IDE - полная поддержка

Posted: Tue Jul 02, 2013 12:14 pm
by Mario_r4
Serge
Т.е. в на твоей машине в обоих режимах работает?

Re: SATA в режиме IDE - полная поддержка

Posted: Tue Jul 02, 2013 12:27 pm
by Serge
Только в SATA Native IDE.

Re: SATA в режиме IDE - полная поддержка

Posted: Tue Jul 02, 2013 12:40 pm
by Phantom-84
Mario_r4 wrote:
yogev_ezra wrote:А если поменять одну строчку (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 wrote:прерывания и в PIO работают. А необработанное прерывание вешает систему или контроллер.
+1.
Дефолтные обработчики стоят на irq 14 и 15. А в native может быть любой вектор. Если драйвер не ставит обработчик, конец будет немного предсказуем. У меня, кстати, так и не заработало. В одном режиме irg 11 в другом irq --.
irq -- видимо и означает IRQ14/15, т.к. контроллер работает в режиме совместимости.

Re: SATA в режиме IDE - полная поддержка

Posted: Tue Jul 02, 2013 12:46 pm
by Mario_r4
Serge
Сделай, пожалуйста, следующее:
1) Закомментируй в bootcobe.inc
Spoiler:

Code: Select all

; 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
Spoiler:

Code: Select all

; 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) Выложи сюда лог загрузки.

Re: SATA в режиме IDE - полная поддержка

Posted: Tue Jul 02, 2013 1:10 pm
by Serge
Работает.

Re: SATA в режиме IDE - полная поддержка

Posted: Tue Jul 02, 2013 1:33 pm
by Mario_r4
Ну, это издержки поддержки лишь одного контроллера в коде - буду дорабатывать.
Кстати можно проверить и без п.2 в изменениях, поскольку:
Spoiler:

Code: Select all

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
Spoiler: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:

Code: Select all

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.
      }
   }
}

Re: SATA в режиме IDE - полная поддержка

Posted: Tue Jul 02, 2013 1:51 pm
by Serge
В линуксе сразу патчат, ещё при сканировании

Code: Select all

            /*
             *      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;
                };
            }

Re: SATA в режиме IDE - полная поддержка

Posted: Tue Jul 02, 2013 3:41 pm
by Phantom-84
В Линуксе делают все правильно, т.е. в BAR'ы даже не лезут, если канал (!!!) работает в режиме совместимости. Что касается прерываний, то в OSDev-вики логика более-менее правильная: если устройство говорит, что не нуждается в IRQ, но это PCI IDE-контроллер, работающий в режиме совместимости, то он использует IRQ14/15, о чем я и говорил выше.

Re: SATA в режиме IDE - полная поддержка

Posted: Tue Jul 02, 2013 3:56 pm
by Serge
Phantom-84
А разве в legacy нельзя переписать номер irq ? Вроде ничего такого в документации нет.

Re: SATA в режиме IDE - полная поддержка

Posted: Tue Jul 02, 2013 7:34 pm
by Phantom-84
Я знаю, что в режиме совместимости запись в BAR'ы может блокироваться. Увидел код и подумал, что с INTLN происходит тоже самое. Хотя в режиме совместимости значительно проще и надежнее вообще не лезть в INTLN.

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

Re: SATA в режиме IDE - полная поддержка

Posted: Tue Jul 02, 2013 8:15 pm
by Serge
Вот и у меня подозрение, что код с osdev делает необоснованные выводы из возможности переписать номер линии. Регистр носит чисто справочный характер и доступен для записи всегда, независимо от режима работы. Ещё интересней то, что они его переписывают не сохраняя оригинальное значение, ССЗБ. Подобные примеры только сбивают людей с толку.

Re: SATA в режиме IDE - полная поддержка

Posted: Tue Jul 02, 2013 8:23 pm
by Serge
Mario_r4
Так как сейчас в native работает ? DMA + IRQ, PIO + IRQ ?

Re: SATA в режиме IDE - полная поддержка

Posted: Tue Jul 02, 2013 8:38 pm
by Phantom-84
Serge, в PCI Spec. вроде бы было написано, что если устройству не требуются прерывания, то оно может не реализовывать и INTLN, т.е. без доп. проверки или полной уверенности в своих действиях что-либо сохранять в INTLN нельзя.

Re: SATA в режиме IDE - полная поддержка

Posted: Tue Jul 02, 2013 8:45 pm
by Serge
Phantom-84
Интересная информация.
Это надо сперва проверить INT_PIN, и уже потом INTLN ?

Re: SATA в режиме IDE - полная поддержка

Posted: Tue Jul 02, 2013 8:57 pm
by Phantom-84
У меня нет уверенности, что PCI IDE- в режиме совместимости не выкинет какой-нибудь фокус, поэтому да. Я немного подредактировал пред. пост, т.е. INT_PIN можно не проверять, если ты на 100% уверен, что устройство работает с прерываниями. В случае PCI IDE- в режиме совместимости, как только что сказал, у меня 100-проц. уверенности нет. Да еще этот код с вики...

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