找回密码
 加入计匠网
搜索
热搜: BIOS ACPI CPU Windows
查看: 11310|回复: 2

Intel ICH9 Memory SPD读取

[复制链接]
发表于 2009-7-21 09:57:34 | 显示全部楼层 |阅读模式
根据bios代码写了个SPD读取,就是不出结果,每次调试输出host status register都是FF,代码基本和bios一样,机器也是ICH9的机器,代码如下:
* {; F% W  G1 ~8 d
% g  B- {% r+ i8 O# ~  .model small
$ a. C, i1 ~9 l1 t  .386
' _. `( D. b( u5 {, m$ ^3 A0 d* Q  CFG_ADDR EQU 0CF8h
; a5 U6 Z! W7 Q5 Y+ ~  c8 S  CFG_DATA EQU 0CFCh& g* A$ s7 J6 Q. R
  SMBUS_BUS EQU 0
8 F- S3 c0 {5 ^  SMBUS_DEVICE EQU 31
/ j+ g% i2 Q: k7 B4 P  j/ Q+ d  SMBUS_FUNC EQU 36 x0 v$ s1 F0 m+ @9 @
  
$ N' Z4 O+ `2 p6 L) h/ Q7 Z  .stack 100h
" x6 j6 `+ b. i/ l2 R4 b  .data# f9 C) g1 D0 `3 L* I
base dw ?  ;smbus I/O space* r- O0 B# j' D# r  Z
num  db 0  ;byte select4 r8 g) l, u# ]# o4 R  h# U
SmbStatus db ?
5 w+ H/ Z# g  X* T  R3 J1 k! J4 @& Y; \! o8 `) q4 Y
  .code
5 z" \: H, \& P2 h6 a0 s / {# ^/ r& G3 s  R' g
LF_CR MACRO
. w0 G) Q# g6 Z' T) S  pusha: \+ l6 F+ B, d
  mov     dl,0dh      ( h2 u1 b; k0 Z+ N5 V& v! B& U
mov     ah,2
* a' S' k0 @' [! Q; |  int     21h
, A3 Y' j' q2 c3 s2 @; h  mov     dl,0ah   ;next line   
5 X& D; z1 k3 N4 w) I( c7 k5 Z6 g  mov     ah,2
, u% N6 b. @4 K( d# C; r  int     21h1 ~7 ^+ r: I& n- w2 @# A0 B! G0 S
  popa  
# }! J" t- {  z) ?. \- |     ENDM/ A& }1 @* h( Z
4 j3 ~& w; U! v. n) |& S

* q7 Q& F3 q9 n0 Lmain proc far
1 T/ s/ {- b2 J$ P! s mov ax,@data
* m$ H$ X, b- d* B4 G9 | mov ds,ax
( V3 m& R3 g& F) ~, @$ c5 v
, ~0 S7 W: S* L9 l mov eax,8000FB20h ;Bus 0,Device 32,Function 3,20h
1 P4 V3 n, y5 s) b: a* F mov dx,CFG_ADDR
) r: K! J8 [) H7 F* } out dx,eax
3 f1 E7 G% Q5 B  j4 ?1 F9 f1 p mov dx,CFG_DATA( D+ e2 _( t6 O/ E
in eax,dx' [. ~7 |% K! y: Q' U2 N
  
1 Y6 ?+ ]9 ]$ C' w. Y shr ax,5     ;bit 15-5,the base address
" \3 h, {& T9 n and ax,0000011111111111b
( i& D) y. H" X) b5 v mov base,ax8 Z/ |0 p) V% h1 H+ L% e
  
; z' `4 J; a- F, Y5 R/ Y3 K+ U& R call ReadSpd
7 z3 p* f3 u7 U7 d% y& Jexit:/ y/ r2 h- Y+ d
mov ax,4c00h, p& l2 b; T* I3 ~9 R6 ]  P
int 21h
) h0 j: g: O4 y! W- [main endp
! K" A1 E) b4 B% S
; `, @! e& `' V  f9 {
3 T6 I$ I: ]4 H! v( w
0 c3 n/ L3 X5 c1 wReadSpd proc" j5 B. m! L; O; `* e; ?1 |8 y
pusha
+ I' j* ~, K9 S! bAgain:
( H, \+ n6 m8 ?5 B$ H( n mov ah,num0 u$ c4 v9 v" J! E
  and ah,00001111b
9 T9 g3 U; i' o. m% \* V .if(ah==15d) ;CR_LF2 y; C; n" p6 G8 B, V+ M+ f% J
  LF_CR
0 r" o( k  ^: k$ _+ e' e9 s2 O .endif
+ [# |5 G& o. r( ]; p
# q& a3 {& z2 J* ?: A .repeat
; X6 U) t3 h+ ~: F% e3 O0 s  mov dx,base   ;reset host,claim host in use
4 t- ~% r9 j; _; ^  add dx,07 s" w3 p; u- L0 }' E" a
  mov al,40h
2 l8 l4 D. g  _0 Q! ?: `8 |  out dx,al3 [1 G, r+ u+ i8 W0 T" s
  2 ~! F. d4 c; s5 d2 `7 w/ L  }* P$ _
  mov dx,base   
) v; e2 c7 {: E& {3 }: ~9 @  in al,dx
! \+ D# h& H- A+ W' A9 j# t. j  mov SmbStatus,al- S2 }5 Y/ p5 B7 w- |
  
2 o4 N% ]7 V1 g& z  mov dx,base   ;clear all status bits# q$ {. H# l9 @9 ], g
  mov al,1Eh   ;host status register0 K1 Z$ v( _( O  j) j3 M
  out dx,al
: c7 s- P* @" F/ J" O1 e  & h3 O- Q* d# D. D! {1 o0 b
  mov dx,base   ;set offset to read 3 {8 ?3 R  }5 {# W: J( N
  add dx,3    ;host command register
1 X) S* G9 o7 A, J  mov al,num
; A' W0 j  O. b  p4 u' B1 E9 U  out dx,al
9 d, K0 O) k4 |& i3 G* v2 g( u  - s( }: ?# `1 P! {
  mov dx,base   ;Transimit Slave Address register
# x3 q# A. U, p  add dx,4
! K" @* s7 q% e0 B4 g; n  mov al,0a1h
9 j" l* d: L+ o  out dx,al  k. T( Q5 V" E
  + N2 w1 Z0 R" I6 C
  mov dx,base   ;set "Read Word" protocol and start bit
  F5 e! E' ]" P; X7 P3 D7 k) P  add dx,2    ;Host Control register, g, }, U% f6 N2 f  e. F
  mov al,48h  
) A6 t3 h, S$ j2 d2 p# I: T  out dx,al
$ y% h* @/ I! h4 D" h 1 c  `$ p9 H4 o, G& {

: y  Q  _* d" H3 _: e8 u  ; @; m: S6 W# u1 g1 R  L
  mov dx,base9 l  W, a. R8 c4 H; u, `/ {
  in al,dx( Z" e' }  I3 r1 ]5 g5 b& \
  mov SmbStatus,al
: o. ^" T% b% {+ l  and al,1Eh
4 V# l, v4 @& W  k& L  .while (al==0) ;check repeatly until any of7 i  l' v) j+ P- c& K; m
    mov dx,base      ;FAIL,BERR,DERR,INTR( w% V) }; @- i8 a& S
    in al,dx
7 I* s: W- p0 ?+ u3 [% [0 h    mov SmbStatus,al, @2 v/ T& Q, u3 x. |$ _
    and al,1Eh 1 b7 m0 \) s: y; A
  .ENDW2 p3 O! ?& u& p- z& X. `# }
    |% O5 Y. y7 w1 A7 [: D: `
  mov al,SmbStatus   3 n" w$ m( m  j- |) C
  and al,1Ch
- t3 Z# X& I" f" ]: y$ |" H  _  .if (al!=0)    ;check for errors  
1 I; k" n( p- w  E# Y2 m* D" A   mov al,SmbStatus; i8 H2 W0 q0 X5 y; ~  P
   and al,08h   
2 l2 j  y2 k1 {. \   .continue .if (al!=0)  
6 \+ Q6 }; _" W( |" g2 W/ X5 J* D   jmp @F  
" v( }; I/ d$ g, x- S. O; L2 m( S3 p .else
8 s( j  L& ^# Y. {# C/ N  mov dx,base
; o) H9 p( S( H$ u# U+ M  add dx,5h$ ?7 j6 `- ^: k7 H3 C
  in al,dx  $ C/ W9 ]/ G9 ^( G8 B- k; z( g
  call binhex 6 \. B4 u0 E' Q1 U0 G
  .break3 ]0 Q2 L: }) K; k6 q5 d. t4 o) r$ x
.endif0 u% [5 U* w% H2 F: h
  8 n, p  h6 p# Z1 \* Q! P6 O
  .until (0)
; H3 n- z+ x/ p4 X2 `  
* q& a* r0 i7 f/ Y7 `. J! w- Z 6 W2 O+ B0 [/ E, c) s. S7 r1 k
6 z/ Y/ I) J8 g3 x( G# u
mov dl,20h ;output a space; M! N0 M/ }8 e$ E6 R. D1 Y% N
mov ah,2
% _' B5 v/ Z: S% W( ~/ G pusha
$ |' j, S& p$ r7 w int 21h) e( p; I+ Y' e; s* g% z
popa
$ r! b' Z- d" H% {6 H3 q inc num
2 Y$ `9 y! }# D, H+ P8 |; P( r9 |9 }& X3 L2 h0 {, n. d# \! l7 M
cmp num,80h ;get first spd 128 bytes 6 b' S' N+ J' L, E; O
jnz Again7 ~5 C0 Y# F% z! w2 J
/ F; F$ n; c, @5 K4 J+ o
@@:% R% {4 ]* ^! U1 w* i5 A( S8 o
popa
3 P* W: R. m1 c ret8 V, t% q) O4 n$ F: ?9 Q2 i
ReadSpd endp
% E' s7 o/ r2 w2 L! Z) M% J. I* ^3 k4 {. b3 p) C7 ?. _1 G& }! S. s

9 E: m+ t7 I: c; Z  H5 d7 a
" Q# Y4 N5 v* s' u2 Y! M( o! Xbinhex proc
% p$ x: [$ l( Q pusha 6 V* S( B2 R( W

  R& q  i7 X! \# K, ` mov ch,2 ;2 hexadecimal digits to be printed/ k, t- L; x. V1 p' b
loop3:8 r$ T# o! ]5 u, {& o1 Q3 h
mov cl,4 ;bits to be shifted
% m$ i; v: I* N5 e* f rol al,cl  w% g; J1 ~. A" ^1 }! }; c
mov bl,al
, D4 W' d; l  s8 j3 @$ ^ and bl,0fh ;mask the 4-bit Msb
, c7 X- V8 l: n. _9 O add bl,30h" d' J% T: a. e) y$ c' t, w
cmp bl,3ah% s, g* v( z' v  L
jl next1  ;number or alpha?% C+ T; a4 ~: c9 U4 c
add bl,7 " ^  }! T1 d9 a7 P
next1: ) `, ^( d( N7 s* i
mov ah,2  ;print one hexadecimal digit
# b! a' t7 Q+ c5 N7 f8 P mov dl,bl
& i- d6 `; i' A6 @ pusha
, G/ u1 w% P' ?; T int 21h7 Y# P1 s: k0 F2 R$ n( V
popa
# ^: d8 H/ K) U  ^: l# T dec ch8 o, ~0 Z2 H8 [9 P
jnz loop3
0 s4 |/ {6 n" E popa3 u' d' T1 O2 w% {: |6 _2 L
ret* s) M3 m" {* N5 z% {$ M- q3 G/ ~; L" L
binhex endp! \( H& j% t! x% c) p! G" {/ j; d
   end main
 楼主| 发表于 2009-7-21 12:30:37 | 显示全部楼层
问题已解决
回复

使用道具 举报

发表于 2009-7-21 13:40:23 | 显示全部楼层
我做过一个可以支持SIS968/962/961 VIA8235 Intel ICHx/ICH7/8/9 ATI SB400/600 NV CK804的SPD tool.  ICH9的读法应该是和ICH7/8一致的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入计匠网

本版积分规则

Archiver|手机版|小黑屋|计匠网

GMT+8, 2026-4-20 03:38 , Processed in 0.162796 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表