-
Notifications
You must be signed in to change notification settings - Fork 1
/
pcilib.c
138 lines (124 loc) · 2.54 KB
/
pcilib.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#include <dos.h>
#include "pci.h"
#ifdef __WATCOMC__
#define asm _asm
#define RETURNING_AX_PREFIX \
int result;
#define RETURNING_AX_ASM_SUFFIX \
mov [result],ax
#define RETURNING_AX_C_SUFFIX \
return result;
#else
#define RETURNING_AX_PREFIX
#define RETURNING_AX_ASM_SUFFIX
#define RETURNING_AX_C_SUFFIX \
return _AX;
#endif
int dev_by_id(unsigned int vendor, unsigned int device, int index, dev_addr *addr)
{
union REGS r;
r.x.ax = 0xB102;
r.x.dx = vendor;
r.x.cx = device;
r.x.si = index;
int86(0x1A, &r, &r);
if (r.x.cflag)
return -1;
*addr = r.x.bx;
return 0;
}
int dev_by_class(unsigned long classcode, int index, dev_addr *dev)
{
RETURNING_AX_PREFIX
asm {
mov ax,0B103h
db 66h
mov cx,[WORD PTR classcode]
mov si,[index]
int 1Ah
sbb ax,ax
mov si, dev
mov [si],bx
RETURNING_AX_ASM_SUFFIX
}
RETURNING_AX_C_SUFFIX
}
int pci_read_byte(dev_addr dev, unsigned int reg, unsigned char* data)
{
union REGS r;
r.x.ax = 0xB108;
r.x.bx = dev;
r.x.di = reg;
int86(0x1A, &r, &r);
if (r.x.cflag)
return -1;
*data = r.h.cl;
return 0;
}
int pci_read_word(dev_addr dev, unsigned int reg, unsigned* data)
{
union REGS r;
r.x.ax = 0xB109;
r.x.bx = dev;
r.x.di = reg;
int86(0x1A, &r, &r);
if (r.x.cflag)
return -1;
*data = r.x.cx;
return 0;
}
int pci_read_dword(dev_addr dev, unsigned int reg, unsigned long* data)
{
RETURNING_AX_PREFIX
asm {
mov ax,0B10Ah
mov bx,[dev]
mov di,[reg]
int 1Ah
sbb ax,ax
mov si, [data]
db 66h
mov [si], cx
RETURNING_AX_ASM_SUFFIX
}
RETURNING_AX_C_SUFFIX
}
int pci_write_byte(dev_addr dev, unsigned int reg, unsigned char data)
{
union REGS r;
r.x.ax = 0xB10B;
r.x.bx = dev;
r.h.cl = data;
r.x.di = reg;
int86(0x1A, &r, &r);
if (r.x.cflag)
return -1;
return 0;
}
int pci_write_word(dev_addr dev, unsigned int reg, unsigned data)
{
union REGS r;
r.x.ax = 0xB10c;
r.x.bx = dev;
r.x.cx = data;
r.x.di = reg;
int86(0x1A, &r, &r);
if (r.x.cflag)
return -1;
return 0;
}
int pci_write_dword(dev_addr dev, unsigned int reg, unsigned long data)
{
RETURNING_AX_PREFIX
asm {
mov ax,0B10Dh
mov bx,[dev]
db 66h
mov cx,[word ptr data]
mov di,[reg]
int 1Ah
sbb ax,ax
RETURNING_AX_ASM_SUFFIX
}
RETURNING_AX_C_SUFFIX
}