365eaca02baae98b4b72b8036ba4649811e6d40a
[coreboot.git] / src / devices / emulator / pcbios / pcibios.c
1 #include <console/console.h>
2 #include <device/device.h>
3 #include <device/pci.h>
4 #include <device/pci_ids.h>
5 #include <device/pci_ops.h>
6 #include <x86emu/x86emu.h>
7
8 #include "pcibios.h"
9
10 int pcibios_handler(void)
11 {
12         int  ret = 0;
13         struct device *dev = 0;
14
15         switch (X86_AX) {
16         case PCI_BIOS_PRESENT:
17                 X86_AH  = 0x00;         /* no config space/special cycle support */
18                 X86_AL  = 0x01;         /* config mechanism 1 */
19                 X86_EDX = 'P' | 'C' << 8 | 'I' << 16 | ' ' << 24;
20                 X86_EBX = 0x0210;       /* Version 2.10 */
21                 X86_ECX = 0xFF00;       /* FixME: Max bus number */
22                 X86_EFLAGS &= ~FB_CF;   /* clear carry flag */
23                 ret = 1;
24                 break;
25         case FIND_PCI_DEVICE:
26                 /* FixME: support SI != 0 */
27                 dev = dev_find_device(X86_DX, X86_CX, dev);
28                 if (dev != 0) {
29                         X86_BH = dev->bus->secondary;
30                         X86_BL = dev->path.pci.devfn;
31                         X86_AH = SUCCESSFUL;
32                         X86_EFLAGS &= ~FB_CF;   /* clear carry flag */
33                         ret = 1;
34                 } else {
35                         X86_AH = DEVICE_NOT_FOUND;
36                         X86_EFLAGS |= FB_CF;    /* set carry flag */
37                         ret = 0;
38                 }
39                 break;
40         case FIND_PCI_CLASS_CODE:
41                 /* FixME: support SI != 0 */
42                 dev = dev_find_class(X86_ECX, dev);
43                 if (dev != 0) {
44                         X86_BH = dev->bus->secondary;
45                         X86_BL = dev->path.pci.devfn;
46                         X86_AH = SUCCESSFUL;
47                         X86_EFLAGS &= ~FB_CF;   /* clear carry flag */
48                         ret = 1;
49                 } else {
50                         X86_AH = DEVICE_NOT_FOUND;
51                         X86_EFLAGS |= FB_CF;    /* set carry flag */
52                         ret = 0;
53                 }
54                 break;
55         case READ_CONFIG_BYTE:
56                 dev = dev_find_slot(X86_BH, X86_BL);
57                 if (dev != 0) {
58                         X86_CL = pci_read_config8(dev, X86_DI);
59                         X86_AH = SUCCESSFUL;
60                         X86_EFLAGS &= ~FB_CF;   /* clear carry flag */
61                         ret = 1;
62                 } else {
63                         X86_AH = DEVICE_NOT_FOUND;
64                         X86_EFLAGS |= FB_CF;    /* set carry flag */    
65                         ret = 0;
66                 }
67                 break;
68         case READ_CONFIG_WORD:
69                 dev = dev_find_slot(X86_BH, X86_BL);
70                 if (dev != 0) {
71                         X86_CX = pci_read_config16(dev, X86_DI);
72                         X86_AH = SUCCESSFUL;
73                         X86_EFLAGS &= ~FB_CF;   /* clear carry flag */
74                         ret = 1;
75                 } else {
76                         X86_AH = DEVICE_NOT_FOUND;
77                         X86_EFLAGS |= FB_CF;    /* set carry flag */    
78                         ret = 0;
79                 }
80                 break;
81         case READ_CONFIG_DWORD:
82                 dev = dev_find_slot(X86_BH, X86_BL);
83                 if (dev != 0) {
84                         X86_ECX = pci_read_config32(dev, X86_DI);
85                         X86_AH = SUCCESSFUL;
86                         X86_EFLAGS &= ~FB_CF;   /* clear carry flag */
87                         ret = 1;
88                 } else {
89                         X86_AH = DEVICE_NOT_FOUND;
90                         X86_EFLAGS |= FB_CF;    /* set carry flag */    
91                         ret = 0;
92                 }
93                 break;
94         case WRITE_CONFIG_BYTE:
95                 dev = dev_find_slot(X86_BH, X86_BL);
96                 if (dev != 0) {
97                         pci_write_config8(dev, X86_DI, X86_CL);
98                         X86_AH = SUCCESSFUL;
99                         X86_EFLAGS &= ~FB_CF;   /* clear carry flag */
100                         ret = 1;
101                 } else {
102                         X86_AH = DEVICE_NOT_FOUND;
103                         X86_EFLAGS |= FB_CF;    /* set carry flag */    
104                         ret = 0;
105                 }
106                 break;
107         case WRITE_CONFIG_WORD:
108                 dev = dev_find_slot(X86_BH, X86_BL);
109                 if (dev != 0) {
110                         pci_write_config16(dev, X86_DI, X86_CX);
111                         X86_AH = SUCCESSFUL;
112                         X86_EFLAGS &= ~FB_CF;   /* clear carry flag */
113                         ret = 1;
114                 } else {
115                         X86_AH = DEVICE_NOT_FOUND;
116                         X86_EFLAGS |= FB_CF;    /* set carry flag */    
117                         ret = 0;
118                 }
119                 break;
120         case WRITE_CONFIG_DWORD:
121                 dev = dev_find_slot(X86_BH, X86_BL);
122                 if (dev != 0) {
123                         pci_write_config16(dev, X86_DI, X86_ECX);
124                         X86_AH = SUCCESSFUL;
125                         X86_EFLAGS &= ~FB_CF;   /* clear carry flag */
126                         ret = 1;
127                 } else {
128                         X86_AH = DEVICE_NOT_FOUND;
129                         X86_EFLAGS |= FB_CF;    /* set carry flag */    
130                         ret = 0;
131                 }
132                 break;
133         default:
134                 X86_AH = FUNC_NOT_SUPPORTED;
135                 X86_EFLAGS |= FB_CF; 
136                 break;
137         }
138
139         return ret;
140 }