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>
13 struct device *dev = 0;
15 printk_debug("%s AX = %x\n", __func__, X86_AX);
18 case PCI_BIOS_PRESENT:
19 X86_AH = 0x00; /* no config space/special cycle support */
20 X86_AL = 0x01; /* config mechanism 1 */
21 X86_EDX = 'P' | 'C' << 8 | 'I' | ' ' << 24;
22 X86_EBX = 0x0210; /* Version 2.10 */
23 X86_ECX = 0xFF00; /* FixME: Max bus number */
24 X86_EFLAGS &= ~FB_CF; /* clear carry flag */
28 /* FixME: support SI != 0 */
29 dev = dev_find_device(X86_DX, X86_CX, dev);
31 X86_BH = dev->bus->secondary;
32 X86_BL = dev->path.u.pci.devfn;
34 X86_EFLAGS &= ~FB_CF; /* clear carry flag */
37 X86_AH = DEVICE_NOT_FOUND;
38 X86_EFLAGS |= FB_CF; /* set carry flag */
42 case FIND_PCI_CLASS_CODE:
43 /* FixME: support SI != 0 */
44 dev = dev_find_class(X86_ECX, dev);
46 X86_BH = dev->bus->secondary;
47 X86_BL = dev->path.u.pci.devfn;
49 X86_EFLAGS &= ~FB_CF; /* clear carry flag */
52 X86_AH = DEVICE_NOT_FOUND;
53 X86_EFLAGS |= FB_CF; /* set carry flag */
57 case READ_CONFIG_BYTE:
58 dev = dev_find_slot(X86_BH, X86_BL);
60 X86_CL = pci_read_config8(dev, X86_DI);
62 X86_EFLAGS &= ~FB_CF; /* clear carry flag */
65 X86_AH = DEVICE_NOT_FOUND;
66 X86_EFLAGS |= FB_CF; /* set carry flag */
70 case READ_CONFIG_WORD:
71 dev = dev_find_slot(X86_BH, X86_BL);
73 X86_CX = pci_read_config16(dev, X86_DI);
75 X86_EFLAGS &= ~FB_CF; /* clear carry flag */
78 X86_AH = DEVICE_NOT_FOUND;
79 X86_EFLAGS |= FB_CF; /* set carry flag */
83 case READ_CONFIG_DWORD:
84 dev = dev_find_slot(X86_BH, X86_BL);
86 X86_ECX = pci_read_config32(dev, X86_DI);
88 X86_EFLAGS &= ~FB_CF; /* clear carry flag */
91 X86_AH = DEVICE_NOT_FOUND;
92 X86_EFLAGS |= FB_CF; /* set carry flag */
96 case WRITE_CONFIG_BYTE:
97 dev = dev_find_slot(X86_BH, X86_BL);
99 pci_write_config8(dev, X86_DI, X86_CL);
101 X86_EFLAGS &= ~FB_CF; /* clear carry flag */
104 X86_AH = DEVICE_NOT_FOUND;
105 X86_EFLAGS |= FB_CF; /* set carry flag */
109 case WRITE_CONFIG_WORD:
110 dev = dev_find_slot(X86_BH, X86_BL);
112 pci_write_config16(dev, X86_DI, X86_CX);
114 X86_EFLAGS &= ~FB_CF; /* clear carry flag */
117 X86_AH = DEVICE_NOT_FOUND;
118 X86_EFLAGS |= FB_CF; /* set carry flag */
122 case WRITE_CONFIG_DWORD:
123 dev = dev_find_slot(X86_BH, X86_BL);
125 pci_write_config16(dev, X86_DI, X86_ECX);
127 X86_EFLAGS &= ~FB_CF; /* clear carry flag */
130 X86_AH = DEVICE_NOT_FOUND;
131 X86_EFLAGS |= FB_CF; /* set carry flag */
136 X86_AH = FUNC_NOT_SUPPORTED;