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

Internal structure and you change requests/suggestions
  • Только в SATA Native IDE.
  • 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, т.к. контроллер работает в режиме совместимости.
  • 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) Выложи сюда лог загрузки.
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • Работает.
    Attachments
    BOARDLOG.TXT (7.31 KiB)
    Downloaded 259 times
  • Ну, это издержки поддержки лишь одного контроллера в коде - буду дорабатывать.
    Кстати можно проверить и без п.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.
          }
       }
    }
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • В линуксе сразу патчат, ещё при сканировании

    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;
                    };
                }
    
  • В Линуксе делают все правильно, т.е. в BAR'ы даже не лезут, если канал (!!!) работает в режиме совместимости. Что касается прерываний, то в OSDev-вики логика более-менее правильная: если устройство говорит, что не нуждается в IRQ, но это PCI IDE-контроллер, работающий в режиме совместимости, то он использует IRQ14/15, о чем я и говорил выше.
  • Phantom-84
    А разве в legacy нельзя переписать номер irq ? Вроде ничего такого в документации нет.
  • Я знаю, что в режиме совместимости запись в BAR'ы может блокироваться. Увидел код и подумал, что с INTLN происходит тоже самое. Хотя в режиме совместимости значительно проще и надежнее вообще не лезть в INTLN.

    Даже если мы проверим и увидим, что запись в INTLN происходит успешно/безуспешно, то: 1) не факт, что подобное, какой бы результат мы не получили, происходит всегда и везде; 2) успешная запись какого-либо опред. номера будет лишь сбивать столку, потому что в режиме совместимости у каждого канала свой номер IRQ, причем вполне конкретный. Хотя если мы увидим, что BIOS записала в INTLN какой-то особый номер, то возможно мы имеем дело с "чудом", работающим с каналами в разных режимах, а переданный нам номер IRQ используется для канала, работающего в нативном режиме. В более простых случаях мы навряд ли сможем увидеть в INTLN номер IRQ, отличный от 14-го.
  • Вот и у меня подозрение, что код с osdev делает необоснованные выводы из возможности переписать номер линии. Регистр носит чисто справочный характер и доступен для записи всегда, независимо от режима работы. Ещё интересней то, что они его переписывают не сохраняя оригинальное значение, ССЗБ. Подобные примеры только сбивают людей с толку.
  • Mario_r4
    Так как сейчас в native работает ? DMA + IRQ, PIO + IRQ ?
  • Serge, в PCI Spec. вроде бы было написано, что если устройству не требуются прерывания, то оно может не реализовывать и INTLN, т.е. без доп. проверки или полной уверенности в своих действиях что-либо сохранять в INTLN нельзя.
    Last edited by Phantom-84 on Tue Jul 02, 2013 8:46 pm, edited 1 time in total.
  • Phantom-84
    Интересная информация.
    Это надо сперва проверить INT_PIN, и уже потом INTLN ?
  • У меня нет уверенности, что PCI IDE- в режиме совместимости не выкинет какой-нибудь фокус, поэтому да. Я немного подредактировал пред. пост, т.е. INT_PIN можно не проверять, если ты на 100% уверен, что устройство работает с прерываниями. В случае PCI IDE- в режиме совместимости, как только что сказал, у меня 100-проц. уверенности нет. Да еще этот код с вики...

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

    Users browsing this forum: No registered users and 6 guests