Автор: Unknown BIOS (не проверено) , 22 августа 2006
Попалась вот в руки экзотика на чипсете NEC
Производитель материнки Eagles
Описывать не буду, уже подробно описывали - она на форуме уже попадалась

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

и вот здесь поругали её BIOS
https://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Вт - такого больше не найти!

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

BBCode

  • HTML-теги не обрабатываются и показываются как обычный текст
  • You may use the following BBCode tags:
    • [align]
    • [b]
    • [code]
    • [color]
    • [font]
    • [hr]
    • [i]
    • [img]
    • [list]
    • [quote]
    • [s]
    • [size]
    • [spoiler]
    • [sub]
    • [sup]
    • [table]
    • [u]
    • [url]
  • Адреса веб-страниц и email-адреса преобразовываются в ссылки автоматически.

RRA

19 лет 5 месяцев назад

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

Базовый цикл:
[code:1]
.
.
.
.
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 Да - переход
.
.
.
.
.
[/code:1]


Вот сама обработка
Вроде ничего подозрительного.....
[code:1]
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 Выход
[/code:1]

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

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

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

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

icbook

19 лет 5 месяцев назад

Прошу прощения, но вызов ROMSCAN может и не произойти?
[code:1]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:[/code:1]

RRA

19 лет 5 месяцев назад

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
[code:1]
.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
[/code:1]
примечание - переменная [3C5C] по умолчанию = E0000000

GO_ROM
[code:1]
.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
[/code:1]
примечание - переменная [si], по умолчанию = 000C0000

icbook

19 лет 5 месяцев назад

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

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

Посмотрю в свободное время.

RRA

19 лет 5 месяцев назад

Закончил я писать программу и провел, так сказать, анализ.
Результаты меня привели в некоторое замешательство.
Начал еще раз перечитывать спецификацию 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