Здравствуйте. В настоящее время разбираю чипсет 945P. Конкретно регистр C0DRTx (Timing register). Разбираю для того, чтобы написать заплатку на биос - изменение таймингов памяти.
Смутил меня такой момент. Timing register располагается в i945 по смещению 114h. Но это его размещение относительно содержимого регистра MCHBAR, который в свою очередь находится по смещению 44h относительно bus:0,dev:0,func:0.
Не знаю, как добраться до него через регистр MCHBAR. В формате обращения к шине PCI под смещение выделено 8 младших бит, отсюда следует, что просто записать по смещению число 114h не удастся (размерность не та).
Пока действия вырисовываются примерно следующие:
1. Получить доступ к MCHBAR (enable-бит в 1 для b:0,d:0,f:0,o:44h)
2. Взять из него базовый адрес и добавить к нему смещение 114h (Timing Register)
А вот что потом делать с этим полученным адресом? Как его использовать, чтобы все же получить доступ к регистру? Вот на этом и остановился.
Даташит на чипсет можно взять здесь:
http://download.intel.com/design/chipsets/datashts/30146705.pdf
Правда это даташит на 915 чипсет, но в данном случае роли не играет (на 945 - ссылка битая).
1. enable-bit - в 54h регистре (DEVEN по даташиту)
2. да (только прочитать примечание - биты 14-31 старшие, младшие - 0). И добавить. Вот тебе и адрес C0DRT1.
Что с ним делать? Ну, видимо, читать и писать согласно описанию C0DRT1, что там неясно?
По поводу:
Имел в виду вот что:
mov eax, [b]8[/b]0000044 mov dx, 0CF8h out dx, eaxТ.е. 31-й бит в 1, чтобы разрешить чтение-запись этого регистра (MCHBAR) через шину PCI.
DEVEN посмотрел, и если правильно понял, надо взвести 4 и 3 биты. Но если можно - распишите подробнее этот момент
(взаимосвязь (G)MCH и памяти).
Примечание прочитал, но не понял как тогда стыковать базовый адрес в MCHBAR и смещение 114h. Раньше думал, что надо сдвигать адресные биты MCHBAR вправо (точнее не в нем, а в аккумуляторе, куда эти данные считали) до такого состояния, чтобы 14 бит стал нулевым, после чего складывать с 114h. Если не так то как?
Это значит что младшие остутствуют?
Неясно вот что. Как я понял, общение через PCI происходит следующим образом:
1. Записали в порт 0CF8 адрес регистра с которым будем работать.
2. Через порт CFC читаем или пишем информацию в этот регистр.
Это справедливо для MCHBAR (в куске кода, приведенном выше), но вот что делать с тем адресом который получится в результате сложения? Не могу ведь я занести в порт CF0 новый адрес:
mov eax, 800000[b]xxx[/b]Т.к. под смещение отведено 8 бит, а в данном случае, 114h даже без прибавления перекрывает размерность отведенного смещения. Следовательно используется не такой метод. Вот какой способ (обращения к C0DRT1) применяется в данном случае мне и не понятно. Если не затруднит, приведите, пожалуйста, кусок кода.
mov eax, 80000054h mov dx, 0CF8h out dx, eax ; загнали адрес регистра DEVEN mov dx, 0CFCh in dx, eax ; получили содержимое регистра DEVEN test eax, bit 28 ; проверили стоит ли MCHBAREN jnz @@OK1 or eax, bit 28 ; если нет - поставили push eax mov eax, 80000054h ; mov dx, 0CF8h ; возможно, второй раз загонять адрес и не надо out dx, eax ; pop eax ; mov dx, 0CFCh out dx, eax @@OK1: mov eax, 80000044h mov dx, 0CF8h out dx, eax pop eax mov dx, 0CFCh in dx, eax ; в EAX - содержимое MCHBAR and eax, 0FFFFC000h ; занулили младшие 14 бит на всякий случай add eax, 114h mov ebx, eax ; теперь в EBX просто адрес C0DRT1 mov eax, [ebx] ; теперь в EAX содержимое C0DRT1 ; ; извращаем eax как хотим ; mov [ebx], eax ; все, радуемся.По-моему, так. (с) Винни-Пух
P.S. bit 28 - маску считай сам, мне лень.
"Вот какой способ (обращения к C0DRT1) применяется в данном случае мне и не понятно." в силе для гуру.
Возможно, все же
mov edx, eax ; теперь в EDX просто адрес C0DRT1 in eax, edx ; теперь в EAX содержимое C0DRT1 ; ; извращаем eax как хотим ; out edx, eax ; все, радуемся.Одновременно задаём базовый адрес и активируем MCHBAR регистры. Дальнейшее обращение идет от базового адреса.
Вот и я о том же ;) Но в любом случае большое спасибо за такие быстрые ответы.
И кроме этого еще смущает вот что:
and eax, 0FFFFC000h ; занулили младшие 14 бит на всякий случай add eax, 114hу регистров, отталкивающихся от MCHBAR, максимальная разрядность смещения - 12 бит, таким образом, при таком простом сложении в середине получившегоося адреса постоянно свободны два бита (т.е. = 0). Конечно допускаю, что это задел на будущее, но тогда логичнее было бы оставлять эти пустые биты с краю. Такой момент.
P.S. После первого твоего ответа все смотрел в даташит на 945 чипсет и думал - при чем здесь DEVEN? (дело в том, что в 945 бит MCHBAREN находится в самом MCHBAR). И только после второго ответа догадался заглянуть в даташит на 915 :). Так что свои слова про:
Забираю назад. А данный вопрос в силе, неохота проверять информацию методом проб и ошибок.
Можно поподробнее?
Нельзя. Только только сел листинги смотреть, но там как-то в явном виде адреса MCHBAR Register не видны. Надеялся получить что-то типа FED14114h, а вижу только FED14041h, FED14BD4h и иже с ними.
ЗЫ Вы, xname, и сами можете в прошивке поглядеть - как там реализовано.. Ещё и здесь посмотрите..
:) Завтра - это тоже быстрее, чем я ожидал..
Думаю Вы меня переоцениваете :). Но если правильно понял - в первом адресе 114h не просто так стоит. Единственное отмечу, что в 945 чипсете 0-й бит в MCHBAR служебный (отведен под MCHBAREN) - так что если листинги не конкретно под 915, то после инициализации регистра он будет взведен.
А за ссылку спасибо, раньше не встречал.
Вот рабочая ссылка на даташит 945-го:
http://sunsite.rediris.es/pub/mirror/intel/chipsets/datashts/30750203.pdf
P.S. только что обновил рисунки в браузере и увидел, что комментарий
содержит фрагмент Иды :)