小華的部落格: [我所知道的BIOS]->[DRAM Sizing](2) 7

搜尋此網誌

網頁

星期一, 10月 08, 2007

[我所知道的BIOS]->[DRAM Sizing](2) 7

DRAM Sizing 的程序與chipset design息息相關,不同家chipset其DRAM sizing sequence亦不同.在此只列出 rough sequence以供參考. (真正的 detailed sequence仍須以各家的 code為準)

[假設]:
A. memory controller integrated into NB
=> NB PCI config space有一部份與DRAM相關
B. This chipset support 4 DRAM sockets(max.)
=> 存在 4 registers,分別代表此 4-socket DRAMs' information
=> 存在 4 bits ,分別控制 4-socket's CS(chip select;enable DRAM用的)

[程序]
1. Configure registers by DRAM frequency:
=> 許多DRAM相關的 registers(Ex. tRFC,tRP,tRCD,tWTR,CAS,...etc)都必須根據DRAM operating frequency來設定. (DRAM frequency 可由 CPU freq and CPU/DRAM ratio求得)

2. Execute Initial sequence for DDR(or DDR2)
=> DRAM spec都有列 initial sequence;既定的流程.

3. Set MAX-supported Size of this chipset for 4 sockets !
=> 因為"不知道"插進來的DRAM到底多大,所以假設: 每一個 socket上都有插DRAM,且size 是->此 chipset所 support的最大 size(Ex. 2G)

4. Do the followings for Socket 0/1/2/3 sequentially (<-此時,一次 "只 enable 1 socket"來做事)

1) check DRAM exist or NOT
=> 藉由簡單的 write-then-read pattern來判定 socket上是否有 installed DRAM

2) decide DRAM "TYPE" if DRAM exist
=> 假如DRAM有在socket上,則進一步去取得其 "TYPE" information
以DDR2 SDRAM為例,此步驟即:求取該記憶體的 (Bank,Row,Column,Side) information
Ex. 2x12x9's DRAM 且 double side ,則記憶體大小為 128MB

* 找DRAM information 有分 MA table & by SPD.

3) write this information to corresponding register

5. Configure registers by DRAM loading
=> 步驟4做完後,所有 installed DRAM已經找到. 此時,需要對一些與 "loading" 相關的DRAM registers做調整(因為: 不同數目的DRAM需要有不同的 driving strength !)

6. Remaining tasks:
=> disable one-page mode
enable dynamic reset
enable refresh cycle ( <- DRAM is ok to use ^_^ )

[注意事項]
1. 至此 Top memory( "可使用的記憶體上限" 已經...決定了 ^_^)
2. 在此 stage,並沒有對 DRAM 做嚴密的測試. 測試階段在後面的 tasks
3. 一般若 register config錯誤,或是 DRAM frequency不對(起因於clockgen config 錯誤),都會 hang在這個 stage ! 若系統僥倖 passed this stage並進到DOS,則可以再用 memory test utility來 verify DRAM is stable or NOT !!!

[補充]
在此stage(Sizing)完成之前, DRAM is not ready to use. 故撰寫此code時得全靠 CPU GPR(general purpose register)來傳遞參數 or return address ! 因此,得時時注意是否 register content 被改變 ( 因為 GPRs不多...)

但是,若是 activate CAR(Cache as Ram),則在此stage就可以使用 push/pop,所撰寫的code將較為模組化及彈性,也不必擔心 register content會被破壞了...
Ex. AMD Kx sizing code便是很早便使用 cache 來當作RAM,因此可以寫出 module code for sizing !!!

1 則留言:

大頭凱 提到...

台灣會搞BIOS的工程師真是少見呀~
大大我有個問題想請教
針對於南北橋的週邊
在DOS 下可以用DEBUG來作控制嗎?

比如說在DOS下用DEBUG,向南橋對聲音IC or Clock generator,重下指令,這個
部份應該是BIOS也會去作的?
那麼USER端是否可以用Debug作這些事呢?