stdlf
分类:
2011-07-04 22:35:30
上一篇所提到的是:BIOS entry point. 它是第一个被 CPU 所抓取并执行指令之处.每家BIOS都有其相应的 file,要牢记.在本文中,要提及: Jumpless ! 在此要先说明Jumpless的意义.它代表:"用 s/w方式来 config clockgen generator,使之产生正确的 频率s 来供应系统运作". 重要性在于:假如某个 frequency错了,则将导致 system abnormal or malfunction... 有哪些 frequencies由 clockgen 提供? - CPU clock (在此指的是 : host clock, Ex. FSB800 CPU 需被 supply 200MHz clock) - DRAM clock( depends on chipset design; Ex. DDR 533要被 supply 266MHz clock) 更正 : DRAM clock现在都是由NB产生 . 外部的最多是 buffer而已. 并非 clock generator. 原因是为了保持较良好的 host clock & DRAM clock的同步.补充:我举的例子是以前的chipset design. 现在我做过的 chipset 其 DRAM clock的确由北桥来推. 北桥中有一会 register定义: CPU-DRAM ratio.Ex. CPU clock = 100MHz. Ratio = 3:5,则可得 DRAM clock = 166MHz - AGP clock: 标准 is 66.6MHz (= 1/2 PCI clock) - PCI clock: 33.3MHz - SATA clock: 100MHz(see SATA spec,似乎还要更精确...) - Link clock: 即假如NB/SB中间有 link,亦由clockgen提供 - USB 1.1 clock: 12MHz 更正: USB 的 clock 是 48MHz 补充:我们 chipset的 design是: 由 clockgen提供 12MHz clock(或由 external crystal提供),被 PLL吃进去后,会产生 48MHz给 USB 1.1(你说的应该是这部分). 至于 USB 2.0,则是 supplied other freuencies ! - SIO clock...etc Clock Generator的架构 => ClockGen基本组成为 PLL(Phase Looked Loop) + Div. PLL 的输入为 14.318MHz, 利用 回授方式产生出 frequency F;之后 经过 Div 除频,便得到 desired frequency,见下列图示: 14.318MHz -> PLL -> F -> Div -> f Ex. F = 400MHz, 为 PLL振出来的;若 Div = 4,则 f = 100MHz ClockGen的 spec中,会列出许多 registers,好比是 Function 的 "contact window",透过这些 registers可以设定此clockgen ! 更正:其实PLL 不是单纯一个的 div. 锁相回路的参数是两的divider 组成 M(VCO divider)/N(REF divider)补充:观念上来说是 PLL所振出的频率经 div后可得到 desired frequency. 但在 clockgen中: 1. 有 2 bytes(即所谓的M,N)来决定 VCO 2. 有几个 bits来决定 div;一些主要的 frequency都有相对应的div 3. VCO / div = frequency How to access ClockGen =>现今存取 clockgen的方式,都是透过 SMBUS来达成. SMBUS 有分 1.1 and 2.0,不过大同小异. SMBUS是 2-wire protocol;由 SMBUS master(即内建在南桥内部的 SMBUS controller )来下 command 给 SMBUS device(Ex. Clockgen);Command中常用的有 Block Read/Write & Byte Read/Write 不同家 chipset 的 SMBUS controller implement方式不同,自然下command的方式亦不同;主要的步骤是: - pre-init( clear status or ...) - put slave address(要 access 的对象) - decide Read or Write - put command(Protocol type, Ex. Block or Byte access) - put offset(要存取 自 clockgen中的哪一个 Byte开始...) - put data if (Write device) - start transaction !!! (... processing ...) - get "Complete" status to check if transaction is done successfully (...wait for system reset...) * 当 start transaction后, SMBUS controller便会将 programmer所 prepare的信息将之转成 SMBUS command打给 device;完成后应该在 controller端有 status register可以检查,看看是否 transaction ok or failed,或是有其它 error conditions.透过这样的方法,programmer便可以 config clockgen使之产生正确的 frequencies. [2 Programming ways for clockgen] => 现今的 ClockGen有提供两种方式 for S/W config. 一为 table mode,一为linear mode. Table mode指的是: ClockGen spec 中会有一个 table,里面说明: 要产生 ? frequency 要填 ? 值.因此,这种方式只需program 1 byte to Clockgen就行了. 若是 linear mode,则是坊间所说的无段变频,即可以微调frequency. Ex. table mode只提供 100/133/166/200MHz,但 linear mode则可以提供类似 102.6/136.3/168.7..等的频率. 此时,要program的 byte数就很多了.....除此之外, linear mode也可以config 所谓的 spread spectrum(%),板厂测EMI时会用到 【Notes】 1. For NB platform power-on CPU frequency 由 2 pins来决定;DT platform会由 Jumper决定.不管如何,之后做Jumpless都可以 override掉原 clock settings 更正: 不是只有NB如此.不管DT 或server. CPU FSB 也是 pin(由于FSB频率比NB多.所以是 3 pins )来决定的.不是jumper. 即使要做超频设计会对这三pin做手脚, 也不会使用jumper 2. 有些 clockgen所提供的 SS 都是 center spread. 若需要 Down spread则可以由 center spread搭配 改变后的 frequency(类似直流准位)来达成给我正确的频率,其余免谈 ...^_^... ===================================================================== Q&A ===================================================================== >前辈我有几个问题要发问! >1. 你这边说的Table方式频率是指供应给CPU频率吗? Intel网站的CPU说明,他说是固定的不可调的? 所以这不是HW固定住(Latch)设定值了吗? >2. 可以解释一下Down Spread/Center Spread /...所代表的意思吗? 还有用途? >3. 我目前也在尝试Program ClcokGen(新手上路),很多专有名词还没搞懂,另外目前ClockGen不是可以 >输出不同频率吗? 为什么Table方式只需要Program 1 byte就好 ???还是说各家厂商设定方式不同,有些厂 >商只要利用1 Byte 就已经选择好所有的频率了(33MHZ/48MHz/DOT96MHZ/LCD27MHZ...)? [For #1] => 我所谓的 "Table"方式指的是: 为了方便设定,clockgen designer会专门提供一个byte register(8-bit);此 byte的某些 bit fields(Ex. bit[4:0])可以让programmer填一组值,例如 01001b. 此值 write 至 clockgen成功后, CPU/DRAM/AGP/PCI/...etc 都会是固定的频率. Ex. 100/133/66/33/...etc. 所以才说只填 1 byte only !此值一旦填至 clockgen, clockgen便依据该 byte(可参考 spec前几页,会有一张表说明: bit[4:0] <-> frequency combinations)来产生出 frequencies.不管用哪一种方式(table or linear mode),都会 supply CPU frequency !!!不过,此时的 CPU frequency is CPU的外频 ( CPU 总频率(core) = (外频)*(倍频 <-multiplier) )Ex. 外频 200MHz(Merom CPU, FSB 800),倍频 = 12 -> core freq = 2.4GHz 还有,BIOS可以调整 外频 & 倍频 ! 没问题 ! 不过,若遇到锁频的CPU(Ex. 量产版的CPU),倍频可能无法调整.但外频还是可以靠 config clockgen来达到 !!! For #2 => 假设要达到 100MHz 且 SS = 0.5% center spread.则: (...想象以前学的直流与交流的讯号...)100MHz 相当于 直流的部分,其值不随时间而变; 0.5% center spread好比弦波讯号(振幅是 100M * 0.005 * (1/2);所以,两者的合成便是: 以 100MHz为中心,其值随时间而变,振幅 is 100M * 0.005 * (1/2) 的讯号 !!!我 '猜' 要这样测试的原因是:所产生的 clock一定不会是 perfect的 100MHz,有可能因为组件或是外部干扰而被 "改变".为了模拟这样的情况,我们会将 clock的 spread spectrum enable,产生 "随时间而改变"的频率,来测试系统的稳定度...等Down spread 0.5% 指的是:距离 水平 100MHz, 最低的值是 100M-100M*0.005,最高值则是 100M本身( 等同于: 水平值 99.5 + center spread 0.5%, right ? ) For #3 => 前面提过,只设 1 byte 就可以产生所有频率是因为: clockgen公司已经把设定各频率的功能"浓缩"在一个 byte里面 ; programmer只要 config this byte 就可以了...* 关于 EMI 测试部分,有错请指正. ( ...我有用到 "猜" 字眼...^_^ ) [[EMI 测试的知识]] 由于 对clock信号来说. 锋(peak)值是能量最强的地方. 所以peak的能量就会不断累积, 发射出来. 因此在频谱上就会出现能量很强的频率. EMI 工程师的工作就是要想办法屏闭这些电磁波的干扰. 为什么需要 spread spectrum? 由于PLL 十分精准. 也就是说 100MHz的clock, 其 peak & peak之间的距离一致(波长固定). 所以能量十分惊人. 使用展频可以使 peak 的距离改变(由于频率不断的在一个范围内改变, 这个可以用示波器累积clock信号来看) 所以累积的能量会比较低. 这样EMI 可以比较好处理. 至于为什么会有要求BIOS一开始就把展频开着, 以确保板子的稳定? 很简单.不开展频clock很稳定.自然比较不会有问题. 展频一开. 由于频率是浮动的. 很多设计欠佳的板子就会不稳定. 及早发现才能及早修改. [[补充数据~~运作原理]] CPU本身有默认值的BSEL[2:0]值,这个值是与Clockgen所产生的BCLK是对应的,CPU本身Spec会有一个Table定义这个值,然后CPU透过BSEL[2:0](输出pin) 连接到Clockgen与NB(这两个都是输入pin),所以当Power on的时候,Clcokgen会依照CPU预设的BSEL[2:0]去产生BCLK给CPU,而FSB 频率也是经由CPU接到NB的BSEL[2:0] 来同步(一般都是1/4 CLK 提取一次数据,所以假设BCLK=200MHZ ,而Clockgen输出到NB的Host Clk=200MHz,一般都会同步,所以 FSB=Host clk*4 = 800MHZ)※ Clockgen 分别透过BCLK与HostClk pins输出频率给CPU与NB,然后CPU开始执行BIOS Code,当执行到Program Clockgen时,BIOS可以透过Clockgen内的缓存器的某个Byte 内的FSC/FSB/FSA 这3个bit 来改变BCLK输出频率(应该可看作override BSEL[2:0]设定),当CPU接收到新的BCLK频率后可能的反应有: 1. CPU本身不支持这个BCLK所以系统当机或是Shutdown 2. CPU 可工作在这个BCLK频率,依照这个频率对照Table,然后改变BSEL[2:0]的设定 另外CPU 是否能工作在266Mhz or 200Mhz or both,这部份依照每颗CPU不同而有所不同,有些CPU只能工作在266Mhz,所以当BLCK=200Mhz时,CPU就不会工作。 假设CPU可工作在266Mhz与200Mhz,则当BCLK从200MHZ-->266Mhz时,CPU一样可以工作。 还有CPU内部的调整ratio的MSR缓存器可分成测试版的CPU跟出货版CPU的不同: a)测试版CPU的Ratio可调,如何调要看Spec b)出货版CPU不可调,也就是锁倍频 --------------------------------------------------------------- 1. Clockgen 会送两组 differential-pair clocks给 CPU & NB. 目前这两组 clocks是相同的频率. 2. CPU有两 pins 称 BCLK[1:0]. Input.NB HostClk[1:0]. Input * bit[1:0] 是代表: differential-pair clock都会有 2 clocks,分别是 true clock and complementary clock 3. 开机时的 behavior 是: 1) CPU内部自己会产生一组 default BSEL[2:0] 给 Clockgen的 FSC/B/A (依据经验,这组 default 值 可以由 CPU MSR 得到 ; 也等于这颗CPU所能支持的最大外频,BCLK) 2) Clockgen据此 FSC/B/A会产生对应的频率,送给 CPU 的 pins BCLK[1:0] Ex. 266MHz 3) 之后,若有需要, BIOS可以透过 config FSC/B/A 或是 M/N programming(透过clockgen内部的缓存器)来 "override"掉原来的 clock setting以达到改变 BCLK的目的. ------------------------------------------------------------------ CPU 工作频率=外频 (BCLK)* 倍频(MSR调整) FSB 频宽= CPU Spec说由 BSEL[2:0] "同步决定",但是看Clockgen电路有分成,BCLK与HostClk(两者应该输出同样频率) 所以应该是北桥拿HostClk当参考,每1/4 Clk提取一次Data,所以应该是HostClk * 4 以前FSB频宽=FSB工作频率,所以有人把CPU工作频率计算方式看作 " FSB频率 * 倍频 ",但是由于FSB频宽目前已经不等于FSB 工作频率,且Clockgen 分别拉了两pins(BCLK与HostClk)给CPU以及北桥,所以计算CPU工作频率的方式才会变成目前的 "BCLK * 倍频"加注: 1. FSB1066指的是: bandwidth ! 不是频率. 一般不会说 FSB266,而会说 host clock = 266MHz ! 2. *4 应该是因为 ( clock的上下缘都可以触发 ) + ( differential-pair) 的关系 我先解释一下这三pin,就我印象中除了之前 NV chip + K7 和 SiS的chipset以外. CPU 的FS0, FS1, FS2会接到clockgen (FSA,B,C)和NB (BSEL0,1,2)的对应pin. CPU 是负责产生准位, clockgen & NB 会在自己的powerok ready的时候把资料latch进去. clockgen 除了利用这三pin来产生对应频率的CPU clock外, 另外也会根据这个频率来产生合适的PCI-E, PCI clock..., 而北桥则是利用来产生正确的 DRAM clock(host/dram ratio),对intel来说也有PCI-E的同步关系.至于超频跟这三pin 的关系, 我稍微解说一下.一般而言要超频的话, MB 必须把到NB & clockgen的路径断开, 由另外设计的线路来取代CPU的FS0,1,2.也就是说NB & clockgen 一开机必须收到一个由这个控制线路决定的FSB. 这样才能作所谓的 133-> 200 or 200 -> 266的大幅度超频.因为此时NB 和 clockgen 才会正确的分配. 别忘了NB, SB, PCI-E, PCI, DRAM是没有CPU这么强的超频力. 直接利用软件改变clockgen会造成很多不该变化的频率跟着变.Note:此超频线路, default是一个所有CPU都能开的安全值, 一但BIOS完成设定, 就会latch住数据此外还必须配合watchdog 来处理过度超频不能开机的问题. linear mode只用来处理小超频的部份 以前遇到的 clockgen 是 CPU & DRAM clocks 由同一个 PLL决定,其余 clocks由另一个PLL决定. 当时有写一个OS下的小程序,可以微调 CPU频率(以1MHz为单位). 不过,微调CPU的同时也会微调到DRAM clock(<-同一个PLL),只是微调值不同(depends on divider).现在遇到的 clockgen + chipset design 是: CPU由一PLL供给,而DRAM clock由北桥推.同样的,微调CPU clock一样牵动DRAM clock.至于其它 frequencies是否会跟着变, depends on Clockgen design;现在的clockgen几乎都有 2以上的PLLs;所以类似PCI/AGP/SATA clocks都会有专门的 PLL控制. 而CPU则由另一个PLL控制.有兴趣及时间的人可以试试看 M/N programming(小微调). 看着 (Ex. FSB800 CPU)由200MHz 操到 210MHz,也是一种快乐 ^_^ Q: 这边刚好有提到watchdog...想请问一下前辈这个东西在PC系统上是何时开始使用? 用途为何或是应用为何? 以前学校没看到过这个东西,不过我在嵌入式系统常看到一些应用,另外在南桥Spec有看到过,而BIOS端需要如何去应用以及设定它? 另外使用 watchdog 来处理过度超频不能开机是怎样的一个方式? 频率不对,CPU已经无法work,连BIOS code都不能执行了? 所以他是靠HW去处理吗? A:我曾用过关于watchdog timer 的经验是 => 在 config clockgen完后, 需要 system发 PCI reset ! 此时会需要 watchdog timer...因为, write clockgen完后,有可能系统当掉 !!! (<-frequency settings被改变了...)因此,我知道的作法是: 在 write clockgen之前,先 enable watchdog timer ! (当然,一定会指明要"多少时间后"才发 PCI reset ! ) 一 enable完,便匆匆去 write clockgen(当然,这段时间要够长,以免 write clockgen没完成,PCI reset就出来了 >_< ). 一旦 write clockgen完毕,code会写 "jmp $"...然后等 watchdog timer 时间到,然后PCI reset出来 reset system...你所说当机时的 watchdog timer,我没做过 ! 不过,watchdog timer 不一定是要在 SB内啊!(或是即使做在 SB内,也是"独立的"...)做成外部的电路就不怕 chipset hang时 timer会失效了...^_^ 一般我知道的 watchdog timer control 大概有: - enable/disable ( => 开始记时...) - time to bomb (=>多少时间后爆炸 ?) - event routing ( => 时间到要干嘛 ?) [[WatchDog]] watchdog是个硬件机制. watchdog 在嵌入式应用中主要就是用来做系统自动回复用的.通常用在机器处理很critical 的任务, 不能当机超过一定时间的事务. 一般的用法是, 系统的软件要固定时间去重设timer. 例如: watchdog timer 设定10秒以后会重置系统, 那么系统软件可以每5秒有一个task 去重设timer. 万一系统当机了. 由于软件无法重设timer. timer 数完了以后就会发出reset , 让系统重新恢复状态. 在MB 中superI/O 有watchdog, clockgen 也有支援watchdog. 以超频来说, 往往设定完clock generator的瞬间, 系统可能会当机. 这时有两种状况. 1. 因为clock 变化造成, 这种状况只要一个PCI reset. 系统就可以继续执行. 这时BIOS 可以借用 watchdog来发PCI reset. 只要在定clock之前先设好watchdog timer, 然后在一段时间后关掉watchdog timer. 这样就可以解决这个问题. 一种是 clock 增加太多造成chip 死当. 这种就需要依靠 clock gen 里面的watch dog来让clock 回复成default value(Note:要视clock gen的设计, 有些只是发reset而已). 另外一种我知道的应用是双 BIOS的主板. 利用watchdog来切换BIOS.张贴者: Harrison Hsieh 于 2:34 上午 5 意见: 匿名提到... 本身非BIOS相关,但在系统中也用了MS Debug去写一些basic tool或查看一些GPR..看了你的blog之后,真是受益良多! 自己也想和你分享一下有关FSB concept. 你的Blog提到下述: >加注: 2. *4 应该是因为 ( clock的上下缘都可以触发 ) + ( differential-pair) 的关系 就我了解FSB是Source synchronous timing, 所以最后是以data strobe 来抓数据的,流程应该是Clock gen. issue CPU CLK+/CLK- to CPU and HCLK+/HCLK- to North Bridge, then their internal Clock Distribution(PLL) will produce the new bus clock(200MHz*4=800MHz). The CPU/chip internal use bus clock to trigger the Data and Data Strobe.然后receiver用Strobe来latch data, Strobe 需加delay circuit to guarantee the Setup/Hold time. Delay一般会加在比DCLK 延迟half cycle处,所以看起来有一点像是Bus clock的falling edge来触发, 但事实上它是因Delay circuit所致. Summary: BCLK = System clock =200MHz DCLK = Bus clock = 200*4 = 800MHz It also called as "Quad Pumped" FSB是单边触发 也就是Only Rising or Falling edge, 上下缘都触发应该是DDR Pre-fetch 的concept, 而differential-pair 只是让Clock进入chip之后能有好的waveform, (CLK- CLK-) it will produce 2倍的 Amplitude, 观念就像为何DDR2 667之后就可能要求要Differential Strobe (DQS+/DOS- pair)是一样的.烦请指教!! 三月 16, 2009 9:09 下午 NICK 提到... 我试着去扫clockgen的值,但是我调整FSB的值好像会造成clockgen的值的改变,是我有什么地方疏忽了吗?另外我查了ICH的spec, clock generator似乎不是SMBus控制的,愈看愈不懂的感觉@@ 一月 11, 2010 2:57 上午 NICK 提到... 你好,我试着扫CLOCKGEN值,但是我改变FSB时,CLOCKGEN的值不会跟着改变(我确定程序是没有问题的,因为可以看到其它SLAVE的值);另外我查了ICH的SPEC,CLOCK GENERATOR似乎不是由SMBUS控制的,可以帮我解惑一下吗,谢谢。 一月 11, 2010 3:00 上午 Grant 提到... 我现在在开发一个平台 是AMD L325+AMD R780+AMD SB 710 (Clock 为 ICS9LPRS471C) 不管我插667/800Mhz DDR2 AMD CPU振出来的Dram Clock都只有300MHZ(是AMD CPU 限制) 我想超频 把AMD CPU振出来的Dram Clock 超频至333 该如何调整Clock的M/N 值?? 我不懂超频, 也不懂Clock Gen M/N值的调法 如果您懂Clock Gen 的M/N 公式 或设定方法, 请告诉我这笨笨的 软件 BIOS engineer 不懂硬件的Grant留 三月 11, 2010 1:21 下午 Grant 提到... 上面的问题补充 因为AMD CPU振出来的Dram clock只有300MHz(Limitation) 目前DDR2 667/800 Ram 不稳 AMI BIOS engineer建议 1. 降频跑533Mhz 2. 将CPU Dram超频至333/400Mhz. 但我不知道第二项如何Implement? 这次希望大家不吝回复 Grant 三月 11, 2010 1:52 下午