Экзотика NEC не хочет принимать видеокарту

Попалась вот в руки экзотика на чипсете NEC
Производитель материнки Eagles
Описывать не буду, уже подробно описывали - она на форуме уже попадалась

rom.by/phpBB2/viewtopic.php?p=13120

и вот здесь поругали её BIOS
rom.by/phpBB2/viewtopic.php?t=5123

Проблема в какой-то индивидуальной непереносимости к видеокарте Asus V3000 (Riva128) PCI

Если вставить ISA видеокарту то материнка стартует и грузится ОС
Если же поставить PCI то выдает ошибку видео (8 коротких пиков спикера)

Причем как мне кажется проблема конкретно с этой видеокартой, если порыть интрнет то у людей с другими PCI картами работает

Сначала думал что есть несовместимость версий PCI - на видео то она PCI 2.1 а на материнке хрен знает, но если загрузиться при вставленной ISA и PCI то операционка распознает её корректно и проблема остается лишь в конфликте 2х видеокарт

Тоесть получается контроллер PCI работает и видеокарта работает, но POST с ней проходить BIOS не желает

BIOS у материнки собственный, меню нестандартное, словами не передать
Все что по теме (настройки контроллера в том числе и Assign IRQ for PCI VGA) уже перепробовал

Вот теперь надо решить вопрос кто виноват
Либо BIOS материнки не находит видео
Либо BIOS видеокарты особенный и не хочет подгружаться

В любом случае проблему надо решить одну - чтобы до ОС увидела видеокарту PCI как единственную

Либо нужно исправлять несовместимость и заставить видео проходить POST
Либо заставить пройти POST с ошибкой, чтобы ОС при загрузке подцепила видеокарту (на другой материнке если из видео вытащить флешку то POST пройдет с ошиибкой и пойдет дальше, а когда очередь дойдет до ОС она уже сама её проинициализирует)

Сейчас при ошибке POST останавливается и дальще грузить систему не хочет, что при этом он пишет к сожалению не увидишь

Поменять видеокарту не могу - именна эта нужна
Поменять материнку тем более - её приемущества в том что она очень маленькая (21х16), и в полном обвесе (MB, P1-166, 32MB SDRAM, Video, HDD) требует только +5V при этом ничего не греется и потребляет при этом всего 6Вт - такого больше не найти!

Помогите советом плиз, очень уж хочется поднять, итак уже с того света её вытащил (битый ШИМ, раскачка, мосфеты, отломанная панелька) :)

----------------------------------------------------
Расковырял обработку устройств на шине

Базовый цикл:

.
.
.
.
    mov cx, [3BF6]       Загружаем количество слотов
    mov di, 3AC2         Загружаем адрес области конфигурации
Next_Dev:
    push cx              Сохраняем счетчик слотов
    call Add_Device      Обрабатываем слот
    pop cx               Восстанавливаем счетчик слотов
    add di, 004D         Переходим с следующему адресу
    loop Next_Dev        Продолжаем цикл            
    mov al, [3C6C]       Флаг "Видеоадаптер найден"
    cmp al, 01           Видеоадаптер найден ?
    je PCIVIDEO          Да - переход
.
.
.
.
.

Вот сама обработка


Вроде ничего подозрительного.....
Add_Device:                Обработка очередного устройства на шине

    lea bx, [di+09]        Загружаем адрес памяти конфигурации
    mov eax, 00000000      Смещение=0 - VendorID\DeviceID
    call PCI_Read          Читаем дв.слово
    mov [bx], ecx          Запоминаем в свою область памяти
    cmp ecx, FFFFFFFF      Слот не отвечает ?
    je EXIT                Да - выход,переходим с следующему
    mov eax, 00000008      Смещение=8 - RevisionID\DeviceClassCode
    call PCI_Read          Читаем дв.слово
    mov [bx+08], ecx       Запоминаем в свою область памяти
    and ecx, FFFFFF00      Накладываем маску - в ecx теперь DeviceClassCode
    cmp ecx, 01000000      Устройство - SCSI ?
    je SCSI                Да - обрабатываем как SCSI
    shr ecx, 10            Передвигаем ecx - теперь там только BaseClass
    cmp ch, 02             Базовый класс - Сетевой Адаптер ?
    je NET                 Да - обрабатываем как NET
    cmp ch, 03             Базовый класс - Видеоадаптер ?
    je VIDEO               Да - обрабатываем как VIDEO
    cmp ch, 04             Базовый класс - Мультимедиа ?
    je MMED                Да - обрабатываем как MMED
    jmp OTHER              Обрабатываем как Др.
.
.
.Обработка сети, скази, мултимедиа - пропускаем - неинтересно
.
.

VIDEO:
    mov al, [3C6C]         Флаг "Видеоадаптер Есть"
    cmp al, 01             Видео есть?
    jne NEW_VIDEO          Нет - обрабатываем
    jmp EXIT               Есть - хватит и одной, выход

NEW_VIDEO:
    mov eax, 00000010      Смещение=10 - Базовые Адресные Регистры
    lea bx, [di+09]        Заново загружаем указатель на нашу облать
    add bx, 0010           Также смещение = 10
BAR_CYCLE:
    mov ecx, FFFFFFFF      Все биты 1 для записи - проверяем БАР
    call PCI_Write         Записываем еденицы
    call PCI_Read          Читаем регистр
    mov [bx], ecx          Запоминаем содержимое
    cmp ecx, FFFFFFFF      Регистр не отвечает?
    je ROMPR               Да - переходим к обработке ROM
    or ecx, ecx            Регистр пуст?
    je ROMPR               Да - переходим к обработке ROM
    test cl, 01            БАР типа ПАМЯТЬ ?
    je MEMREG              Да - обрабатываем как память
    call GO_IOSpace        В противном случае - обрабатываем как ввод\вывод
    jmp NEXTBAR
MEMREG:
    call GO_MEMSpace       Обрабатываем как память
NEXTBAR:
    add bx, 0004           Переходим с следующему БАР
    add eax, 00000004      Переходим с следующему БАР
    cmp eax, 00000024      БАР кончились?
    jbe BAR_CYCLE          Нет - продолжаем

ROMPR: 
    mov eax, 00000030      Смещение=30 - Расширение ROM
    mov ecx, FFFFFFFF      Все биты 1 для записи - проверяем Расширение ROM
    call PCI_Write         Записывем еденицы
    call PCI_Read          Читаем регистр
    lea bx, [di+09]        Заново загружаем указатель на нашу область
    mov [bx+30], ecx       Запоминаем регистр ROM
    cmp ecx, FFFFFFFF      Регистр не отвечает?
    je INTPR               Да - переходим к обработке прерываний
    or ecx, ecx            Регистр пуст?
    je INTPR               Да - переходим к обработке прерываний
    mov si, 3C60           Загружаем в SI смещение ячейки (в прошивке = 000C0000)
    call GO_ROM            Обрабатываем как ROM

INTPR:
    mov ecx, 000000FF      В ecx - 00..11111111      
    mov eax, 0000003C      Смешение = 3С - IntLine\IntPin\MinGnt\MaxLat
    mov [bx+3C], ecx       Запоминаем 00..11111111 (Очищаем InterruptLine)
    call PCI_Write         Пишем это же в регистр
    mov al, [3C68]         Загружаем флаг "Запретить прерывания" (???????????)
    test al, 01            Флаг = 1 ?
    je EDIT_CR             Да - переходим к записи в ControlRegister
                           Нет - все таки обрабатываем прерываение
    mov eax, 0000003C      Смещение = 3C - IntLine\IntPin\MinGnt\MaxLat
    call PCI_Read          Читаем регистр
    mov [bx+3C], ecx       Запоминаем регистр
    or ch, ch              InterruptPin пуст ?
    je EDIT_CR             Да - переходим к записи в ControlRegister
    call GO_IRQ            Нет - обрабатываем прерывание

EDIT_CR:
    mov eax, 00000004      Смещение = 4 - ControlRegister \ StatusRegister
    mov ecx, 00000003      Уст. биты 000.....011 - Рарешить IO, Разрешить MEM, Запретить BusMaster
    call PCI_Write         Пишем в CR
    call 40BA              Вызываем COPYROM !!!
    mov eax, 00000030      Смещение = 30 - Расширение ROM
    mov ecx, 00000000      В ecx=0
    call PCI_Write         Записываем 0 в регистр ROM (Зачеи ?????)
    mov al, 01             В AL - 1
    mov byte ptr [3C6C], al Устанавливаем флаг "Видеоадаптер Есть"
    jmp EXIT               Выход - с следующему устройству

EXIT:
    ret                    Выход

Рассаматривал процедуры GO_IO, GO_MEM и GO_ROM - принцип ясен, непонятны детали
Кажется есть какой-то криминал

Кто может, прошу оказать помощи:
1) Как устройство в одном BAR заявляет и базовый адрес памяти и его размер? Целый час перечитывал абзац в спецификации - не понял:(
Понятно что записав все 111 мы можем по оставшимся 0 определить размер, но как определить нужный адрес памяти? (Пример - видео, адрес 000A0000)

2) COPYROM все-таки вызывается, поэтому всплывает прошлый вопрос - про порты E0, E1 и непривычный механизм копирования

Если кто знает - подскажите пожалуйста, нигде не найду инфу
Заранее благодарен

Аватар пользователя icbook

Прошу прощения, но вызов ROMSCAN может и не произойти?

Check_Point	2Ah		; POST 2A
	call	_DIM
	jz	_oops
Check_Point	2Bh		; POST 2B
	call	_dummy
	jz	_oops
Check_Point	2Ch		; POST 2C
	mov	bx,0c000h		; EGA/VGA ROM segment
_else_:
	call	ROMSCAN
	cmp	bx,0c800h
	jb	_else_
_oops:

icbook Спасибо что отозвались

icbook писал(-а):
Прошу прощения, вы вызов ROMSCAN может и не произойти?

Меня сейчас ROMSCAN как таковой пока не интересует
Проблема появляется ещё раньше - после посткода 13 идет обозначенный мною "Базовый цикл" по перечислению устройств на PCI шине
Вызывается Add_Device, натыкается на видеокарту, инициализирует ConfigSpace выдеокарты и, самое интересное, вызывается ROMCOPY которвй, как я понял, что то делает с чипсетом и появляется возможность стянуть из видеокарты ROM в основную память

Я вставлял повсюду отладочные куски
Вот как проходит код

1) Видеокарта находится - есть переход по проверке КлассаУстройства
2) Есть проход по секциям инициализации BAR,ROM,INT,MEM,IO (сами процедуры типа GO_XXXX я еще не дебагил)
3) Есть запись в ControlRegister и далее следующий за ним вызов COPYROM

Далее в COPYROM на первой же проверке


(эта та которая у меня
cmp word ptr [bx], AA55 Проверяем сигнатуру
jne SIG_ERR Неверная сигнатура - выход
)
вываливаемся - тоесть не находим сигнатуру

Вот принципиальная проблема "слепоты" биос - он не имеет доступ к Видео-ROM

Мне кажется что проблема в неправильной инициализации регисров BAR и регистра ROM видеокарты

Сейчас я выложу их код (GO_MEM и GO_ROM) но сам я его понять не могу - читал спецификацию PCI и в инглише и на русском и версии 2.0 и версии 2.2

НИКАК не могу понять механизм выделения памяти !
Записав все 11111 в регистр и считав его содержимое можно узнать размер требуемой памяти, но КАК определить адрес?? Пример - видеопамять 000A0000-000AFFFF всегда именно такая
Вот засада то!
Я уже заканчиваю свою мини прогу по полной расшифровке ConfigSpace включая полный анализ BAR
Только так на практике я смогу порнять механизм
А пока - увы:(

GO_MEM

.3ED8 6650                   push eax
.3EDA 6653                   push ebx
.3EDC 6651                   push ecx
.3EDE 6652                   push edx
.3EE0 80E1F0                 and cl, F0
.3EE3 66BB10000000           mov ebx, 00000010

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|.3EF1(U)
|
.3EE9 6685CB                 test ebx, ecx
.3EEC 7505                   jne 3EF3
.3EEE 66D1E3                 shl ebx, 01
.3EF1 EBF6                   jmp 3EE9



* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|.3EEC(C)
|
.3EF3 6681FB00010000         cmp ebx, 00000100
.3EFA 770C                   ja 3F08
.3EFC 66BB00010000           mov ebx, 00000100
.3F02 66B900FFFFFF           mov ecx, FFFFFF00

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|.3EFA(C)
|
.3F08 668B165C3C             mov edx, [3C5C]
.3F0D 6623D1                 and edx, ecx
.3F10 663B165C3C             cmp edx, [3C5C]
.3F15 7408                   je 3F1F
.3F17 6603D3                 add edx, ebx
.3F1A 6689165C3C             mov [3C5C], edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|.3F15(C)
|
.3F1F 66011E5C3C             add [3C5C], ebx
.3F24 8D5D09                 lea bx, [di+09]
.3F27 03D8                   add bx, ax
.3F29 668917                 mov [bx], edx
.3F2C 668BCA                 mov ecx, edx
.3F2F E829FF                 call PCI_Write
.3F32 665A                   pop edx
.3F34 6659                   pop ecx
.3F36 665B                   pop ebx
.3F38 6658                   pop eax
.3F3A C3                     ret

примечание - переменная [3C5C] по умолчанию = E0000000

GO_ROM

.3F86 6650                   push eax
.3F88 6653                   push ebx
.3F8A 6651                   push ecx
.3F8C 6652                   push edx
.3F8E 56                     push si
.3F8F 80E1F0                 and cl, F0
.3F92 66BB00080000           mov ebx, 00000800

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|.3FA0(U)
|
.3F98 6685CB                 test ebx, ecx
.3F9B 7505                   jne 3FA2
.3F9D 66D1E3                 shl ebx, 01
.3FA0 EBF6                   jmp 3F98



* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|.3F9B(C)
|
.3FA2 6681FB00000100         cmp ebx, 00010000
.3FA9 760C                   jbe 3FB7
.3FAB 66B90000FFFF           mov ecx, FFFF0000
.3FB1 66BB00000100           mov ebx, 00010000

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|.3FA9(C)
|
.3FB7 668B14                 mov edx, [si]
.3FBA 6623D1                 and edx, ecx
.3FBD 663B14                 cmp edx, [si]
.3FC0 7406                   je 3FC8
.3FC2 6603D3                 add edx, ebx
.3FC5 668914                 mov [si], edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|.3FC0(C)
|
.3FC8 66011C                 add [si], ebx
.3FCB 668BCA                 mov ecx, edx
.3FCE 80C901                 or cl, 01
.3FD1 8D5D09                 lea bx, [di+09]
.3FD4 03D8                   add bx, ax
.3FD6 66890F                 mov [bx], ecx
.3FD9 E87FFE                 call PCI_Write
.3FDC 5E                     pop si
.3FDD 665A                   pop edx
.3FDF 6659                   pop ecx
.3FE1 665B                   pop ebx
.3FE3 6658                   pop eax
.3FE5 C3                     ret

примечание - переменная [si], по умолчанию = 000C0000

Аватар пользователя icbook

Цитата:
1) Видеокарта находится - есть переход по проверке КлассаУстройства
2) Есть проход по секциям инициализации BAR,ROM,INT,MEM,IO ...
3) Есть запись в ControlRegister и далее следующий за ним вызов COPYROM

Далее в COPYROM на первой же проверке ... вываливаемся - тоесть не находим сигнатуру
Посмотрю в свободное время.

Закончил я писать программу и провел, так сказать, анализ.
Результаты меня привели в некоторое замешательство.
Начал еще раз перечитывать спецификацию PCI.

Перечитав Appendix D - Device Class Codes, я понял что никаких фиксированных адресов PCI плате выделяться не может.
По анализам BAR биос может только узнать размер области, необходимой устройству. При этом выбор адреса этой области лежит целиком на биос.
Как оказалось, просто некоторым устройствам стандартного типа (видео например) далжна выделяться область с определенным базовым адресом.
В спецификации прописано что если код класса - 030000, то как видеокарте, устройству полагается память A0000-BFFFF и I\O 3B0-3BB, 3C0-3DF.
Я этого не знал, и полагал что видеокарта должна сама заявлять об требуемых ей ресурсах в BAR. На самом деле в BAR только дополнительная памать.

Теперь о самой видеокарте asus.
Она использует только BAR0 и BAR1, требуя в каждом из них по 16Мб памяти.
Плюс используется BAR-eROM, требующий 4(!) мегабайта под ROM.

Биос платы NEC выделяет ей пространство E0000000-E0FFFFFF и E1000000-E1FFFFFF под память.
Какой адрес выделяется ROM я не знаю - после COPYROM он сброшен в 0.
Но посмотрев в код, можно посчитать, что выделяется пространство 000C0000 - 004C0000 что в принципе странно, хотя работать должно.

Теперь даже не знаю где может быть косяк..... ?

Добавлено спустя 10 минут 29 секунд:

Посмотрел, как выделяется на плате с чипсетом VIA - то же самое.
E2000000-E2FFFFFF
E3000000-E3FFFFFF
ROM=0

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Разрешённые HTML-теги: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <img>
  • You can use BBCode tags in the text. URLs will automatically be converted to links.

Подробнее о форматировании текста

Антибот - введите цифру.
Ленты новостей