Интеловский чипсет. Регистр MCHBAR

Здравствуйте. В настоящее время разбираю чипсет 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)
А вот что потом делать с этим полученным адресом? Как его использовать, чтобы все же получить доступ к регистру? Вот на этом и остановился.
Даташит на чипсет можно взять здесь:
[url=http://download.intel.com/design/chipsets/datashts/30146705.pdf
]download.intel.com/design/chipsets/datashts/30146705.pdf[/url]


Правда это даташит на 915 чипсет, но в данном случае роли не играет (на 945 - ссылка битая).

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

Цитата:

1. Получить доступ к MCHBAR (enable-бит в 1 для b:0,d:0,f:0,o:44h)
2. Взять из него базовый адрес и добавить к нему смещение 114h (Timing Register)
А вот что потом делать с этим полученным адресом?

1. enable-bit - в 54h регистре (DEVEN по даташиту)
2. да (только прочитать примечание - биты 14-31 старшие, младшие - 0). И добавить. Вот тебе и адрес C0DRT1.
Что с ним делать? Ну, видимо, читать и писать согласно описанию C0DRT1, что там неясно?

А кому счас легко...

Спасибо за столь оперативный ответ.
По поводу:

Цитата:
1. Получить доступ к MCHBAR (enable-бит в 1 для b:0,d:0,f:0,o:44h)

Имел в виду вот что:
mov eax, 80000044
mov dx, 0CF8h
out dx, eax

Т.е. 31-й бит в 1, чтобы разрешить чтение-запись этого регистра (MCHBAR) через шину PCI.
DEVEN посмотрел, и если правильно понял, надо взвести 4 и 3 биты. Но если можно - распишите подробнее этот момент

(взаимосвязь (G)MCH и памяти).
Цитата:
да (только прочитать примечание - биты 14-31 старшие

Примечание прочитал, но не понял как тогда стыковать базовый адрес в MCHBAR и смещение 114h. Раньше думал, что надо сдвигать адресные биты MCHBAR вправо (точнее не в нем, а в аккумуляторе, куда эти данные считали) до такого состояния, чтобы 14 бит стал нулевым, после чего складывать с 114h. Если не так то как?
Цитата:
, младшие - 0)

Это значит что младшие остутствуют?
Цитата:
Что с ним делать? Ну, видимо, читать и писать согласно описанию C0DRT1, что там неясно?

Неясно вот что. Как я понял, общение через PCI происходит следующим образом:
1. Записали в порт 0CF8 адрес регистра с которым будем работать.
2. Через порт CFC читаем или пишем информацию в этот регистр.
Это справедливо для MCHBAR (в куске кода, приведенном выше), но вот что делать с тем адресом который получится в результате сложения? Не могу ведь я занести в порт CF0 новый адрес:
mov eax, 800000xxx

Т.к. под смещение отведено 8 бит, а в данном случае, 114h даже без прибавления перекрывает размерность отведенного смещения. Следовательно используется не такой метод. Вот какой способ (обращения к C0DRT1) применяется в данном случае мне и не понятно. Если не затруднит, приведите, пожалуйста, кусок кода.

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

	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 - маску считай сам, мне лень.

А кому счас легко...

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

Хотя там как-то мутно про маппинг MCHBAR написано. Возможно, я и неправ. Вопрос
"Вот какой способ (обращения к C0DRT1) применяется в данном случае мне и не понятно." в силе для гуру.
Возможно, все же

mov	edx, eax	; теперь в EDX просто адрес C0DRT1
in	eax, edx	; теперь в EAX содержимое C0DRT1

;
;  извращаем eax как хотим
;
out	edx, eax	; все, радуемся.

А кому счас легко...

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

Одновременно задаём базовый адрес и активируем MCHBAR регистры. Дальнейшее обращение идет от базового адреса.

-=Кто сказал что бесполезно биться головой об стену...=- (НП)
Пх’нглуи мглв’нафх Ктулху Р’льех вгах’нагл фхтагн
Хочешь сделать хорошо - сделай это сам

Цитата:
Возможно, все же

Вот и я о том же;) Но в любом случае большое спасибо за такие быстрые ответы.
И кроме этого еще смущает вот что:
and eax, 0FFFFC000h ; занулили младшие 14 бит на всякий случай

add eax, 114h

у регистров, отталкивающихся от MCHBAR, максимальная разрядность смещения - 12 бит, таким образом, при таком простом сложении в середине получившегоося адреса постоянно свободны два бита (т.е. = 0). Конечно допускаю, что это задел на будущее, но тогда логичнее было бы оставлять эти пустые биты с краю. Такой момент.

P.S. После первого твоего ответа все смотрел в даташит на 945 чипсет и думал - при чем здесь DEVEN? (дело в том, что в 945 бит MCHBAREN находится в самом MCHBAR). И только после второго ответа догадался заглянуть в даташит на 915:). Так что свои слова про:

Цитата:
Правда это даташит на 915 чипсет, но в данном случае роли не играет

Забираю назад. А данный вопрос в силе, неохота проверять информацию методом проб и ошибок.

Santa писал:

Цитата:
Одновременно задаём базовый адрес и активируем MCHBAR регистры. Дальнейшее обращение идет от базового адреса.

Можно поподробнее?

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

Так, быстрые ответы кончились. Что-то не работает вроде как... Завтра будут медленные... :)

А кому счас легко...

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

xname писал(-а):
Можно поподробнее?

Нельзя. Только только сел листинги смотреть, но там как-то в явном виде адреса MCHBAR Register не видны. Надеялся получить что-то типа FED14114h, а вижу только FED14041h, FED14BD4h и иже с ними.

ЗЫ Вы, xname, и сами можете в прошивке поглядеть - как там реализовано.. Ещё и здесь посмотрите..

-=Кто сказал что бесполезно биться головой об стену...=- (НП)
Пх’нглуи мглв’нафх Ктулху Р’льех вгах’нагл фхтагн
Хочешь сделать хорошо - сделай это сам

Цитата:
Так, быстрые ответы кончились. Что-то не работает вроде как... Завтра будут медленные...

:) Завтра - это тоже быстрее, чем я ожидал..
Цитата:
Надеялся получить что-то типа FED14114h, а вижу только FED14041h, FED14BD4h и иже с ними.

Думаю Вы меня переоцениваете:). Но если правильно понял - в первом адресе 114h не просто так стоит. Единственное отмечу, что в 945 чипсете 0-й бит в MCHBAR служебный (отведен под MCHBAREN) - так что если листинги не конкретно под 915, то после инициализации регистра он будет взведен.
А за ссылку спасибо, раньше не встречал.

Вот рабочая ссылка на даташит 945-го:
sunsite.rediris.es/pub/mirror/intel/chipsets/datashts/30750203.pdf

P.S. только что обновил рисунки в браузере и увидел, что комментарий


Цитата:
Одновременно задаём базовый адрес и активируем MCHBAR регистры. Дальнейшее обращение идет от базового адреса.

содержит фрагмент Иды:)

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

Содержание этого поля является приватным и не предназначено к показу.
  • Разрешённые 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.

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

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