Board.KolibriOS.org
http://board.kolibrios.org/

SATA в режиме IDE - полная поддержка
http://board.kolibrios.org/viewtopic.php?f=1&t=2343
Page 3 of 18

Author:  Mario_r4 [ Tue Jul 02, 2013 12:14 pm ]
Post subject:  Re: SATA в режиме IDE - полная поддержка

Serge
Т.е. в на твоей машине в обоих режимах работает?

Author:  Serge [ Tue Jul 02, 2013 12:27 pm ]
Post subject:  Re: SATA в режиме IDE - полная поддержка

Только в SATA Native IDE.

Author:  Phantom-84 [ Tue Jul 02, 2013 12:40 pm ]
Post subject:  Re: SATA в режиме IDE - полная поддержка

Mario_r4 wrote:
yogev_ezra wrote:
А если поменять одну строчку (IDE Operate Mode) с Legacy Mode на Native Mode, то через несколько секунд после загрузки зависает (лог снять не хватает времени). Но как раз именно с Native Mode работает Windows.

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


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

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

Author:  Mario_r4 [ Tue Jul 02, 2013 12:46 pm ]
Post subject:  Re: SATA в режиме IDE - полная поддержка

Serge
Сделай, пожалуйста, следующее:
1) Закомментируй в bootcobe.inc
Spoiler: Show
Code:
; 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: Show
Code:
; 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) Выложи сюда лог загрузки.

Author:  Serge [ Tue Jul 02, 2013 1:10 pm ]
Post subject:  Re: SATA в режиме IDE - полная поддержка

Работает.

Attachments:
BOARDLOG.TXT [7.31 KiB]
Downloaded 99 times

Author:  Mario_r4 [ Tue Jul 02, 2013 1:33 pm ]
Post subject:  Re: SATA в режиме IDE - полная поддержка

Ну, это издержки поддержки лишь одного контроллера в коде - буду дорабатывать.
Кстати можно проверить и без п.2 в изменениях, поскольку:
Spoiler: Show
Code:
K : BAR0 0001 
K : BAR1 0001
K : BAR2 0001
K : BAR3 0001
K : BAR4 0000
K : IDEContrProgrammingInterface 018A

То с большой вероятностью прерывания стандартные 14 и 15 используются, но в PCI это не отображено:
Quote:
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: Show
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:
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.
      }
   }
}

Author:  Serge [ Tue Jul 02, 2013 1:51 pm ]
Post subject:  Re: SATA в режиме IDE - полная поддержка

В линуксе сразу патчат, ещё при сканировании
Code:
            /*
             *      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;
                };
            }

Author:  Phantom-84 [ Tue Jul 02, 2013 3:41 pm ]
Post subject:  Re: SATA в режиме IDE - полная поддержка

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

Author:  Serge [ Tue Jul 02, 2013 3:56 pm ]
Post subject:  Re: SATA в режиме IDE - полная поддержка

Phantom-84
А разве в legacy нельзя переписать номер irq ? Вроде ничего такого в документации нет.

Author:  Phantom-84 [ Tue Jul 02, 2013 7:34 pm ]
Post subject:  Re: SATA в режиме IDE - полная поддержка

Я знаю, что в режиме совместимости запись в BAR'ы может блокироваться. Увидел код и подумал, что с INTLN происходит тоже самое. Хотя в режиме совместимости значительно проще и надежнее вообще не лезть в INTLN.

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

Author:  Serge [ Tue Jul 02, 2013 8:15 pm ]
Post subject:  Re: SATA в режиме IDE - полная поддержка

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

Author:  Serge [ Tue Jul 02, 2013 8:23 pm ]
Post subject:  Re: SATA в режиме IDE - полная поддержка

Mario_r4
Так как сейчас в native работает ? DMA + IRQ, PIO + IRQ ?

Author:  Phantom-84 [ Tue Jul 02, 2013 8:38 pm ]
Post subject:  Re: SATA в режиме IDE - полная поддержка

Serge, в PCI Spec. вроде бы было написано, что если устройству не требуются прерывания, то оно может не реализовывать и INTLN, т.е. без доп. проверки или полной уверенности в своих действиях что-либо сохранять в INTLN нельзя.

Author:  Serge [ Tue Jul 02, 2013 8:45 pm ]
Post subject:  Re: SATA в режиме IDE - полная поддержка

Phantom-84
Интересная информация.
Это надо сперва проверить INT_PIN, и уже потом INTLN ?

Author:  Phantom-84 [ Tue Jul 02, 2013 8:57 pm ]
Post subject:  Re: SATA в режиме IDE - полная поддержка

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

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

Page 3 of 18 All times are UTC+03:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/