Subversion Repositories Kolibri OS

Rev

Rev 1481 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1472 hidnplayr 1
; PCI Bus defines
2
	PCI_HEADER_TYPE 		equ	0x0e  ;8 bit
3
	PCI_BASE_ADDRESS_0		equ	0x10  ;32 bit
4
	PCI_BASE_ADDRESS_5		equ	0x24  ;32 bits
5
	PCI_BASE_ADDRESS_SPACE_IO	equ	0x01
6
	PCI_VENDOR_ID			equ	0x00  ;16 bit
7
	PCI_BASE_ADDRESS_IO_MASK	equ	0xFFFFFFFC
8
 
9
 
10
; PCI programming
11
	PCI_REG_COMMAND 	equ 0x4 ; command register
12
	PCI_REG_STATUS		equ 0x6 ; status register
13
	PCI_REG_LATENCY 	equ 0xd ; latency timer register
14
	PCI_REG_CAP_PTR 	equ 0x34 ; capabilities pointer
15
	PCI_REG_CAPABILITY_ID	equ 0x0 ; capapility ID in pm register block
16
	PCI_REG_PM_STATUS	equ 0x4 ; power management status register
17
	PCI_REG_PM_CTRL 	equ 0x4 ; power management control register
18
	PCI_BIT_PIO		equ 0 ; bit0: io space control
19
	PCI_BIT_MMIO		equ 1 ; bit1: memory space control
20
	PCI_BIT_MASTER		equ 2 ; bit2: device acts as a PCI master
21
 
22
 
23
	PAGESIZE		equ	4096
24
 
25
 
26
 
27
	LAST_IO = 0
28
 
29
macro set_io addr {
30
 
31
	if	addr = 0
32
 
33
	mov	edx, [device.io_addr]
34
 
35
	else if addr = LAST_IO
36
 
37
	else
38
 
39
	add	edx, addr - LAST_IO
40
 
41
	end if
42
 
43
	LAST_IO = addr
44
}
45
 
46
 
47
 
48
macro allocate_and_clear dest, size, err {
49
 
50
; We need to allocate at least 8 pages, if we want a continuous memory in ram
51
    if (size < 8*4096) & (size > 4096)
52
	stdcall KernelAlloc, 8*4096
53
    else
54
	stdcall KernelAlloc, size
55
    end if
56
	test	eax, eax
57
	jz	err
58
	mov	dest, eax		; Save the address to it into the device struct
59
	mov	edi, eax		; look at last part of code!
60
 
61
; Release the unused pages (if any)
62
    if (size < 8*4096) & (size > 4096)
63
	add	eax, (size/4096+1)*4096
64
	mov	ecx, 8-(size/4096+1)
65
	call	ReleasePages
66
    end if
67
 
68
; Clear the allocated buffer
69
	;mov     edi, eax
70
	mov	ecx, size/4		; divide by 4 because of DWORD
71
	xor	eax, eax
72
	rep	stosd
73
 
74
}
75
 
76
 
77
 
78
macro find_io bus, dev, io {
79
 
80
 
81
	local	.check, .inc, .got
82
 
83
 
84
	xor	eax, eax
85
	mov	esi, PCI_BASE_ADDRESS_0
86
	movzx	ecx, bus
87
	movzx	edx, dev
88
  .check:
89
	stdcall PciRead16, ecx ,edx ,esi
90
 
91
	mov	io , eax
92
	and	eax, PCI_BASE_ADDRESS_IO_MASK
93
	test	eax, eax
94
	jz	.inc
95
 
96
	mov	eax, io
97
	and	eax, PCI_BASE_ADDRESS_SPACE_IO
98
	test	eax, eax
99
	jz	.inc
100
 
101
	mov	eax, io
102
	and	eax, PCI_BASE_ADDRESS_IO_MASK
103
	mov	io , eax
104
	jmp	.got
105
 
106
  .inc:
107
	add	esi, 4
108
	cmp	esi, PCI_BASE_ADDRESS_5
109
	jbe	.check
110
 
111
  .got:
112
 
113
}
114
 
1492 hidnplayr 115
macro find_irq bus, dev, irq {
1472 hidnplayr 116
 
1492 hidnplayr 117
	push	eax edx ecx
118
	movzx	ecx, bus
119
	movzx	edx, dev
120
	stdcall PciRead8, ecx ,edx ,0x3c				; 0x3c is the offset where irq can be found
121
	mov	irq, al
122
	pop	ecx edx eax
1472 hidnplayr 123
 
1492 hidnplayr 124
}
125
 
126
 
127
 
1472 hidnplayr 128
macro make_bus_master bus, dev {
129
 
130
	movzx	ecx, bus
131
	movzx	edx, dev
1492 hidnplayr 132
	stdcall PciRead32, ecx ,edx, PCI_REG_COMMAND
1472 hidnplayr 133
 
134
	or	al, (1 shl PCI_BIT_MASTER) or (1 shl PCI_BIT_PIO)
135
	and	al, not (1 shl PCI_BIT_MMIO)
136
	stdcall PciWrite32, ecx, edx, PCI_REG_COMMAND, eax
137
 
138
}
139
 
140
 
141
 
142
struc IOCTL {
143
      .handle		dd ?
144
      .io_code		dd ?
145
      .input		dd ?
146
      .inp_size 	dd ?
147
      .output		dd ?
148
      .out_size 	dd ?
149
}
150
 
151
virtual at edx
152
  IOCTL IOCTL
153
end virtual
154
 
155
 
156
 
157
 
158
if used null_op
159
 
160
align 4
161
null_op:
162
	or	eax, -1
163
	ret
164
 
165
end if
166
 
167
 
168
macro virt_to_dma { ; input is eax
169
 
170
	push	ax
171
	and	word[esp], PAGESIZE - 1
172
	call	GetPgAddr
173
	or	ax, word[esp]
174
	inc	esp
175
	inc	esp
176
 
1492 hidnplayr 177
}
178
 
179
 
180
;struc ETH_DEVICE {
181
macro ETH_DEVICE {
182
; pointers to procedures
183
      .unload		dd ?
184
      .reset		dd ?
185
      .transmit 	dd ?
186
      .set_MAC		dd ?
187
      .get_MAC		dd ?
188
      .set_mode 	dd ?
189
      .get_mode 	dd ?
190
; status
191
      .bytes_tx 	dq ?
192
      .bytes_rx 	dq ?
193
      .packets_tx	dd ?
194
      .packets_rx	dd ?
195
      .mode		dd ?
196
      .name		dd ?
197
      .mac		dp ?
198
}
199