Board.KolibriOS.org

Official KolibriOS board
It is currently Mon Sep 16, 2019 5:53 pm

All times are UTC+03:00




Post new topic  Reply to topic  [ 262 posts ]  Go to page Previous 1 2 3 4 518 Next
Author Message
PostPosted: Tue Jul 02, 2013 12:14 pm 
Offline
Kernel Developer

Joined: Sun Feb 10, 2013 12:37 pm
Posts: 2329
Serge
Т.е. в на твоей машине в обоих режимах работает?

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


Top
   
PostPosted: Tue Jul 02, 2013 12:27 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Только в SATA Native IDE.


Top
   
PostPosted: Tue Jul 02, 2013 12:40 pm 
Offline

Joined: Sun Feb 18, 2007 8:34 pm
Posts: 158
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, т.к. контроллер работает в режиме совместимости.


Top
   
PostPosted: Tue Jul 02, 2013 12:46 pm 
Offline
Kernel Developer

Joined: Sun Feb 10, 2013 12:37 pm
Posts: 2329
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) Выложи сюда лог загрузки.

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


Top
   
PostPosted: Tue Jul 02, 2013 1:10 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Работает.


Attachments:
BOARDLOG.TXT [7.31 KiB]
Downloaded 63 times
Top
   
PostPosted: Tue Jul 02, 2013 1:33 pm 
Offline
Kernel Developer

Joined: Sun Feb 10, 2013 12:37 pm
Posts: 2329
Ну, это издержки поддержки лишь одного контроллера в коде - буду дорабатывать.
Кстати можно проверить и без п.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.
      }
   }
}

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


Top
   
PostPosted: Tue Jul 02, 2013 1:51 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
В линуксе сразу патчат, ещё при сканировании
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;
                };
            }


Top
   
PostPosted: Tue Jul 02, 2013 3:41 pm 
Offline

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


Top
   
PostPosted: Tue Jul 02, 2013 3:56 pm 
Offline
Kernel Developer

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


Top
   
PostPosted: Tue Jul 02, 2013 7:34 pm 
Offline

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

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


Top
   
PostPosted: Tue Jul 02, 2013 8:15 pm 
Offline
Kernel Developer

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


Top
   
PostPosted: Tue Jul 02, 2013 8:23 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Mario_r4
Так как сейчас в native работает ? DMA + IRQ, PIO + IRQ ?


Top
   
PostPosted: Tue Jul 02, 2013 8:38 pm 
Offline

Joined: Sun Feb 18, 2007 8:34 pm
Posts: 158
Serge, в PCI Spec. вроде бы было написано, что если устройству не требуются прерывания, то оно может не реализовывать и INTLN, т.е. без доп. проверки или полной уверенности в своих действиях что-либо сохранять в INTLN нельзя.


Last edited by Phantom-84 on Tue Jul 02, 2013 8:46 pm, edited 1 time in total.

Top
   
PostPosted: Tue Jul 02, 2013 8:45 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
Phantom-84
Интересная информация.
Это надо сперва проверить INT_PIN, и уже потом INTLN ?


Top
   
PostPosted: Tue Jul 02, 2013 8:57 pm 
Offline

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

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


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 262 posts ]  Go to page Previous 1 2 3 4 518 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 3 guests


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited