Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2014 art_zh 1
$Revision: 1598 $
2
 
3
SMBUS_PCIE_ADDR 	equ	0xF00A0000	; bdf0:20.0  = SB7xx SMBus PCI Config Registers
4
LPC_PCIE_ADDR		equ	0xF00A3000	; bdf0:20.3  = SB7xx LPC ISA bridge Config Registers
5
 
6
SB_SIO_INDEX	equ	0x2E
7
SB_PM_INDEX	equ	0xCD6
8
 
9
if PLATFORM>PLATFORM_RS780
10
include "bus/sb/hudson.inc"
11
else
12
include "bus/sb/sb710.inc"
13
end if
14
 
15
;---------------------------------------------------------------------
16
align 4
17
smbus_read_pciconfig:
18
; in:  dl = reg#  |  out: eax = data
19
	mov	ebx, SMBUS_PCIE_ADDR
20
	and	edx, 0x0FC
21
	mov	eax, dword [ebx+edx]
22
	ret
23
;------------------------------------------------
24
align 4
25
smbus_write_pciconfig:
26
; in: dl = reg#; eax = data
27
	mov	ebx, SMBUS_PCIE_ADDR
28
	and	edx, 0x0FC
29
	mov	dword [ebx+edx], eax
30
	ret
31
 
32
;--------------------------------------------------------------------
33
align 4
34
lpc_read_pciconfig:
35
; in:  dl = reg#  |  out: eax = data
36
	mov	ebx, LPC_PCIE_ADDR
37
	and	edx, 0x0FC
38
	mov	eax, dword [ebx+edx]
39
	ret
40
;------------------------------------------------
41
align 4
42
lpc_write_pciconfig:
43
; in: dl = reg#; eax = data
44
	mov	ebx, LPC_PCIE_ADDR
45
	and	edx, 0x0FC
46
	mov	dword [ebx+edx], eax
47
	ret
48
 
49
;--------------------------------------------------------------------
50
align 4
51
read_sio_cfg:
52
; in:  al = reg#  |  out: al =  data
53
	push	edx
54
	mov	dx,  SB_SIO_INDEX
55
	out	dx, al
56
	inc	dl
57
	in	al, dx
58
	pop	edx
59
	ret
60
 
61
;------------------------------------------------
62
align 4
63
write_pm_cfg:
64
; in:  al = reg#; ah = data
65
;------------------------------------------------
66
	push	edx
67
	mov	dx,  SB_PM_INDEX
68
	out	dx, al
69
	inc	dl
70
	xchg	al, ah
71
	out	dx, al
72
	xchg	al, ah
73
	pop	edx
74
	ret
75
;--------------------------------------------------------------------
76
align 4
77
read_pm_cfg:
78
; in:  al = reg#  |  out: al =  data
79
	push	edx
80
	mov	dx,  SB_PM_INDEX
81
	out	dx, al
82
	inc	dl
83
	in	al, dx
84
	pop	edx
85
	ret
86
 
87
;------------------------------------------------
88
align 4
89
write_sio_cfg:
90
; in:  al = reg#; ah = data
91
;------------------------------------------------
92
	push	edx
93
	mov	dx,  SB_SIO_INDEX
94
	out	dx, al
95
	inc	dl
96
	xchg	al, ah
97
	out	dx, al
98
	xchg	al, ah
99
	pop	edx
100
	ret
101
;------------------------------------------------
102
align 4
103
enter_sio_cfg_mode:
104
; the magic sequence to unlock the port
105
;------------------------------------------------
106
	mov	dx, SB_SIO_INDEX
107
	mov	eax, 0x55550187 ; low byte first
108
	out	dx, al
109
	shr	eax, 8
110
	out	dx, al
111
	shr	eax, 8
112
	out	dx, al
113
	shr	eax, 8
114
	out	dx, al
115
	ret
116
 
117
;-----------------------------------------------------------------------
118
; ATTENTION: the functions assume that RESET# signals use pins 84 and 34
119
; of IT8712F SuperIO chip. These signals may be (and will be!) different
120
; for every particular motherboard and SIO. Please refer to your m/board
121
; documentation to define the correct pins and GPIO lines!
122
;
123
;   Note this example DOES NOT PRETEND to be 100% correct implementation
124
;   of PCIe hotplug techniques !!
125
;-----------------------------------------------------------------------
126
align 4
127
init_pcie_slot_control:
128
;------------------------------------------------
129
	call	enter_sio_cfg_mode
130
	mov	ax, 0x0707	; LDN = 07
131
	call	write_sio_cfg
132
	mov	al, 0x25
133
	call	read_sio_cfg	; ah = reg25h (Multy-function pin selector)
134
	or	ah, 3		; set bits 0, 1 (GPIO)
135
	call	write_sio_cfg
136
	mov	al, 0x2A
137
	call	read_sio_cfg	; ah = reg2Ah (Extended fn pin selector)
138
	or	ah, 3		; set bits 0, 1 (GPIO)
139
	call	write_sio_cfg
140
	mov	al, 0xB8
141
	call	read_sio_cfg	; ah = regB8h (internal pull-up enable)
142
	or	ah, 3		; set bits 0, 1
143
	call	write_sio_cfg
144
	mov	al, 0xC0
145
	call	read_sio_cfg	; ah = regC0h (simple IO enable)
146
	or	ah, 3		; set bits 0, 1
147
	call	write_sio_cfg
148
	mov	ax, 0x0202	; Lock SIO config ports
149
	call	write_sio_cfg
150
	ret
151
 
152
align 4
153
reset_pcie_slot:
154
;------------------------------------------------
155
	call	enter_sio_cfg_mode
156
	mov	ax, 0x0707	; LDN = 07
157
	call	write_sio_cfg
158
	mov	al, 0xB0
159
	call	read_sio_cfg	; ah = regB0h (Pin polarity)
160
	and	ah, 0xFC	; invert bits 0, 1
161
	call	write_sio_cfg
162
	or	ah, 3		; restore bits 0, 1
163
	call	write_sio_cfg
164
	mov	ax, 0x0202	; Lock SIO config ports
165
	call	write_sio_cfg
166
	ret
167