1 /* $Id: pci.c,v 1.14 2004/11/15 09:18:19 ekohl Exp $
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: ntoskrnl/hal/x86/pci.c
6 * PURPOSE: Interfaces to the PCI bus
7 * PROGRAMMER: David Welch (welch@mcmail.com)
8 * Eric Kohl (ekohl@rz-online.de)
11 * 17/08/2000: Added preliminary pci bus scanner
12 * 13/06/2001: Implemented access to pci configuration space
16 * NOTES: Sections copied from the Linux pci support
19 /* INCLUDES *****************************************************************/
22 #include <ddk/ntddk.h>
27 #include <internal/debug.h>
30 /* MACROS ******************************************************************/
32 /* FIXME These are also defined in drivers/bus/pci/pcidef.h.
33 Maybe put PCI definitions in a central include file??? */
35 /* access type 1 macros */
36 #define CONFIG_CMD(bus, dev_fn, where) \
37 (0x80000000 | (((ULONG)(bus)) << 16) | (((dev_fn) & 0x1F) << 11) | (((dev_fn) & 0xE0) << 3) | ((where) & ~3))
39 /* access type 2 macros */
40 #define IOADDR(dev_fn, where) \
41 (0xC000 | (((dev_fn) & 0x1F) << 8) | (where))
42 #define FUNC(dev_fn) \
43 ((((dev_fn) & 0xE0) >> 4) | 0xf0)
45 #define PCI_BASE_ADDRESS_SPACE 0x01 /* 0 = memory, 1 = I/O */
46 #define PCI_BASE_ADDRESS_SPACE_IO 0x01
47 #define PCI_BASE_ADDRESS_SPACE_MEMORY 0x00
48 #define PCI_BASE_ADDRESS_MEM_TYPE_MASK 0x06
49 #define PCI_BASE_ADDRESS_MEM_TYPE_32 0x00 /* 32 bit address */
50 #define PCI_BASE_ADDRESS_MEM_TYPE_1M 0x02 /* Below 1M [obsolete] */
51 #define PCI_BASE_ADDRESS_MEM_TYPE_64 0x04 /* 64 bit address */
52 #define PCI_BASE_ADDRESS_MEM_PREFETCH 0x08 /* prefetchable? */
53 #define PCI_BASE_ADDRESS_MEM_MASK (~0x0fUL)
54 #define PCI_BASE_ADDRESS_IO_MASK (~0x03UL)
55 /* bit 1 is reserved if address_space = 1 */
58 /* GLOBALS ******************************************************************/
60 #define TAG_PCI TAG('P', 'C', 'I', 'H')
62 static ULONG BusConfigType
= 0; /* undetermined config type */
63 static KSPIN_LOCK PciLock
;
65 /* FUNCTIONS ****************************************************************/
68 ReadPciConfigUchar(UCHAR Bus
,
75 switch (BusConfigType
)
78 KeAcquireSpinLock(&PciLock
, &oldIrql
);
79 WRITE_PORT_ULONG((PULONG
)0xCF8, CONFIG_CMD(Bus
, Slot
, Offset
));
80 *Value
= READ_PORT_UCHAR((PUCHAR
)0xCFC + (Offset
& 3));
81 KeReleaseSpinLock(&PciLock
, oldIrql
);
82 return STATUS_SUCCESS
;
85 KeAcquireSpinLock(&PciLock
, &oldIrql
);
86 WRITE_PORT_UCHAR((PUCHAR
)0xCF8, (UCHAR
)FUNC(Slot
));
87 WRITE_PORT_UCHAR((PUCHAR
)0xCFA, Bus
);
88 *Value
= READ_PORT_UCHAR((PUCHAR
)(IOADDR(Slot
, Offset
)));
89 WRITE_PORT_UCHAR((PUCHAR
)0xCF8, 0);
90 KeReleaseSpinLock(&PciLock
, oldIrql
);
91 return STATUS_SUCCESS
;
93 return STATUS_UNSUCCESSFUL
;
98 ReadPciConfigUshort(UCHAR Bus
,
105 if ((Offset
& 1) != 0)
107 return STATUS_INVALID_PARAMETER
;
110 switch (BusConfigType
)
113 KeAcquireSpinLock(&PciLock
, &oldIrql
);
114 WRITE_PORT_ULONG((PULONG
)0xCF8, CONFIG_CMD(Bus
, Slot
, Offset
));
115 *Value
= READ_PORT_USHORT((PUSHORT
)0xCFC + (Offset
& 2));
116 KeReleaseSpinLock(&PciLock
, oldIrql
);
117 return STATUS_SUCCESS
;
120 KeAcquireSpinLock(&PciLock
, &oldIrql
);
121 WRITE_PORT_UCHAR((PUCHAR
)0xCF8, (UCHAR
)FUNC(Slot
));
122 WRITE_PORT_UCHAR((PUCHAR
)0xCFA, Bus
);
123 *Value
= READ_PORT_USHORT((PUSHORT
)(IOADDR(Slot
, Offset
)));
124 WRITE_PORT_UCHAR((PUCHAR
)0xCF8, 0);
125 KeReleaseSpinLock(&PciLock
, oldIrql
);
126 return STATUS_SUCCESS
;
128 return STATUS_UNSUCCESSFUL
;
133 ReadPciConfigUlong(UCHAR Bus
,
140 if ((Offset
& 3) != 0)
142 return STATUS_INVALID_PARAMETER
;
145 switch (BusConfigType
)
148 KeAcquireSpinLock(&PciLock
, &oldIrql
);
149 WRITE_PORT_ULONG((PULONG
)0xCF8, CONFIG_CMD(Bus
, Slot
, Offset
));
150 *Value
= READ_PORT_ULONG((PULONG
)0xCFC);
151 KeReleaseSpinLock(&PciLock
, oldIrql
);
152 return STATUS_SUCCESS
;
155 KeAcquireSpinLock(&PciLock
, &oldIrql
);
156 WRITE_PORT_UCHAR((PUCHAR
)0xCF8, (UCHAR
)FUNC(Slot
));
157 WRITE_PORT_UCHAR((PUCHAR
)0xCFA, Bus
);
158 *Value
= READ_PORT_ULONG((PULONG
)(IOADDR(Slot
, Offset
)));
159 WRITE_PORT_UCHAR((PUCHAR
)0xCF8, 0);
160 KeReleaseSpinLock(&PciLock
, oldIrql
);
161 return STATUS_SUCCESS
;
163 return STATUS_UNSUCCESSFUL
;
168 WritePciConfigUchar(UCHAR Bus
,
175 switch (BusConfigType
)
178 KeAcquireSpinLock(&PciLock
, &oldIrql
);
179 WRITE_PORT_ULONG((PULONG
)0xCF8, CONFIG_CMD(Bus
, Slot
, Offset
));
180 WRITE_PORT_UCHAR((PUCHAR
)0xCFC + (Offset
&3), Value
);
181 KeReleaseSpinLock(&PciLock
, oldIrql
);
182 return STATUS_SUCCESS
;
185 KeAcquireSpinLock(&PciLock
, &oldIrql
);
186 WRITE_PORT_UCHAR((PUCHAR
)0xCF8, (UCHAR
)FUNC(Slot
));
187 WRITE_PORT_UCHAR((PUCHAR
)0xCFA, Bus
);
188 WRITE_PORT_UCHAR((PUCHAR
)(IOADDR(Slot
,Offset
)), Value
);
189 WRITE_PORT_UCHAR((PUCHAR
)0xCF8, 0);
190 KeReleaseSpinLock(&PciLock
, oldIrql
);
191 return STATUS_SUCCESS
;
193 return STATUS_UNSUCCESSFUL
;
198 WritePciConfigUshort(UCHAR Bus
,
205 if ((Offset
& 1) != 0)
207 return STATUS_INVALID_PARAMETER
;
210 switch (BusConfigType
)
213 KeAcquireSpinLock(&PciLock
, &oldIrql
);
214 WRITE_PORT_ULONG((PULONG
)0xCF8, CONFIG_CMD(Bus
, Slot
, Offset
));
215 WRITE_PORT_USHORT((PUSHORT
)0xCFC + (Offset
& 2), Value
);
216 KeReleaseSpinLock(&PciLock
, oldIrql
);
217 return STATUS_SUCCESS
;
220 KeAcquireSpinLock(&PciLock
, &oldIrql
);
221 WRITE_PORT_UCHAR((PUCHAR
)0xCF8, (UCHAR
)FUNC(Slot
));
222 WRITE_PORT_UCHAR((PUCHAR
)0xCFA, Bus
);
223 WRITE_PORT_USHORT((PUSHORT
)(IOADDR(Slot
, Offset
)), Value
);
224 WRITE_PORT_UCHAR((PUCHAR
)0xCF8, 0);
225 KeReleaseSpinLock(&PciLock
, oldIrql
);
226 return STATUS_SUCCESS
;
228 return STATUS_UNSUCCESSFUL
;
233 WritePciConfigUlong(UCHAR Bus
,
240 if ((Offset
& 3) != 0)
242 return STATUS_INVALID_PARAMETER
;
245 switch (BusConfigType
)
248 KeAcquireSpinLock(&PciLock
, &oldIrql
);
249 WRITE_PORT_ULONG((PULONG
)0xCF8, CONFIG_CMD(Bus
, Slot
, Offset
));
250 WRITE_PORT_ULONG((PULONG
)0xCFC, Value
);
251 KeReleaseSpinLock(&PciLock
, oldIrql
);
252 return STATUS_SUCCESS
;
255 KeAcquireSpinLock(&PciLock
, &oldIrql
);
256 WRITE_PORT_UCHAR((PUCHAR
)0xCF8, (UCHAR
)FUNC(Slot
));
257 WRITE_PORT_UCHAR((PUCHAR
)0xCFA, Bus
);
258 WRITE_PORT_ULONG((PULONG
)(IOADDR(Slot
, Offset
)), Value
);
259 WRITE_PORT_UCHAR((PUCHAR
)0xCF8, 0);
260 KeReleaseSpinLock(&PciLock
, oldIrql
);
261 return STATUS_SUCCESS
;
263 return STATUS_UNSUCCESSFUL
;
268 HalpGetPciData(PBUS_HANDLER BusHandler
,
276 ULONG Address
= Offset
;
281 DPRINT("HalpGetPciData() called.\n");
282 DPRINT(" BusNumber %lu\n", BusNumber
);
283 DPRINT(" SlotNumber %lu\n", SlotNumber
);
284 DPRINT(" Offset 0x%lx\n", Offset
);
285 DPRINT(" Length 0x%lx\n", Length
);
287 if ((Length
== 0) || (BusConfigType
== 0))
290 ReadPciConfigUlong((UCHAR
)BusNumber
,
291 (UCHAR
)(SlotNumber
& 0x1F),
294 /* some broken boards return 0 if a slot is empty: */
295 if (Vendor
== 0xFFFFFFFF || Vendor
== 0)
297 if (BusNumber
== 0 && Offset
== 0 && Length
>= 2)
299 *(PUSHORT
)Buffer
= PCI_INVALID_VENDORID
;
305 /* 0E=PCI_HEADER_TYPE */
306 ReadPciConfigUchar((UCHAR
)BusNumber
,
307 (UCHAR
)(SlotNumber
& 0x1F),
310 if (((HeaderType
& PCI_MULTIFUNCTION
) == 0) && ((SlotNumber
& 0xE0) != 0))
312 if (Offset
== 0 && Length
>= 2)
314 *(PUSHORT
)Buffer
= PCI_INVALID_VENDORID
;
319 ReadPciConfigUlong((UCHAR
)BusNumber
,
323 /* some broken boards return 0 if a slot is empty: */
324 if (Vendor
== 0xFFFFFFFF || Vendor
== 0)
326 if (BusNumber
== 0 && Offset
== 0 && Length
>= 2)
328 *(PUSHORT
)Buffer
= PCI_INVALID_VENDORID
;
334 if ((Address
& 1) && (Len
>= 1))
336 ReadPciConfigUchar((UCHAR
)BusNumber
,
340 Ptr
= (char*)Ptr
+ 1;
345 if ((Address
& 2) && (Len
>= 2))
347 ReadPciConfigUshort((UCHAR
)BusNumber
,
351 Ptr
= (char*)Ptr
+ 2;
358 ReadPciConfigUlong((UCHAR
)BusNumber
,
362 Ptr
= (char*)Ptr
+ 4;
369 ReadPciConfigUshort((UCHAR
)BusNumber
,
373 Ptr
= (char*)Ptr
+ 2;
380 ReadPciConfigUchar((UCHAR
)BusNumber
,
384 Ptr
= (char*)Ptr
+ 1;
394 HalpSetPciData(PBUS_HANDLER BusHandler
,
402 ULONG Address
= Offset
;
407 DPRINT("HalpSetPciData() called.\n");
408 DPRINT(" BusNumber %lu\n", BusNumber
);
409 DPRINT(" SlotNumber %lu\n", SlotNumber
);
410 DPRINT(" Offset 0x%lx\n", Offset
);
411 DPRINT(" Length 0x%lx\n", Length
);
413 if ((Length
== 0) || (BusConfigType
== 0))
416 ReadPciConfigUlong((UCHAR
)BusNumber
,
417 (UCHAR
)(SlotNumber
& 0x1F),
420 /* some broken boards return 0 if a slot is empty: */
421 if (Vendor
== 0xFFFFFFFF || Vendor
== 0)
425 /* 0E=PCI_HEADER_TYPE */
426 ReadPciConfigUchar((UCHAR
)BusNumber
,
427 (UCHAR
)(SlotNumber
& 0x1F),
430 if (((HeaderType
& PCI_MULTIFUNCTION
) == 0) && ((SlotNumber
& 0xE0) != 0))
433 ReadPciConfigUlong((UCHAR
)BusNumber
,
437 /* some broken boards return 0 if a slot is empty: */
438 if (Vendor
== 0xFFFFFFFF || Vendor
== 0)
441 if ((Address
& 1) && (Len
>= 1))
443 WritePciConfigUchar((UCHAR
)BusNumber
,
447 Ptr
= (char*)Ptr
+ 1;
452 if ((Address
& 2) && (Len
>= 2))
454 WritePciConfigUshort((UCHAR
)BusNumber
,
458 Ptr
= (char*)Ptr
+ 2;
465 WritePciConfigUlong((UCHAR
)BusNumber
,
469 Ptr
= (char*)Ptr
+ 4;
476 WritePciConfigUshort((UCHAR
)BusNumber
,
480 Ptr
= (char*)Ptr
+ 2;
487 WritePciConfigUchar((UCHAR
)BusNumber
,
491 Ptr
= (char*)Ptr
+ 1;
501 GetBusConfigType(VOID
)
506 DPRINT("GetBusConfigType() called\n");
508 KeAcquireSpinLock(&PciLock
, &oldIrql
);
510 DPRINT("Checking configuration type 1:");
511 WRITE_PORT_UCHAR((PUCHAR
)0xCFB, 0x01);
512 Value
= READ_PORT_ULONG((PULONG
)0xCF8);
513 WRITE_PORT_ULONG((PULONG
)0xCF8, 0x80000000);
514 if (READ_PORT_ULONG((PULONG
)0xCF8) == 0x80000000)
516 WRITE_PORT_ULONG((PULONG
)0xCF8, Value
);
517 KeReleaseSpinLock(&PciLock
, oldIrql
);
518 DPRINT(" Success!\n");
521 WRITE_PORT_ULONG((PULONG
)0xCF8, Value
);
522 DPRINT(" Unsuccessful!\n");
524 DPRINT("Checking configuration type 2:");
525 WRITE_PORT_UCHAR((PUCHAR
)0xCFB, 0x00);
526 WRITE_PORT_UCHAR((PUCHAR
)0xCF8, 0x00);
527 WRITE_PORT_UCHAR((PUCHAR
)0xCFA, 0x00);
528 if (READ_PORT_UCHAR((PUCHAR
)0xCF8) == 0x00 &&
529 READ_PORT_UCHAR((PUCHAR
)0xCFB) == 0x00)
531 KeReleaseSpinLock(&PciLock
, oldIrql
);
532 DPRINT(" Success!\n");
535 KeReleaseSpinLock(&PciLock
, oldIrql
);
536 DPRINT(" Unsuccessful!\n");
538 DPRINT("No pci bus found!\n");
544 HalpGetPciInterruptVector(PVOID BusHandler
,
546 ULONG BusInterruptLevel
,
547 ULONG BusInterruptVector
,
551 ULONG Vector
= IRQ2VECTOR(BusInterruptVector
);
552 *Irql
= VECTOR2IRQL(Vector
);
553 *Affinity
= 0xFFFFFFFF;
557 static BOOLEAN STDCALL
558 HalpTranslatePciAddress(PBUS_HANDLER BusHandler
,
560 PHYSICAL_ADDRESS BusAddress
,
562 PPHYSICAL_ADDRESS TranslatedAddress
)
564 if (*AddressSpace
== 0)
569 else if (*AddressSpace
== 1)
580 TranslatedAddress
->QuadPart
= BusAddress
.QuadPart
;
586 * Find the extent of a PCI decode..
589 PciSize(ULONG Base
, ULONG Mask
)
591 ULONG Size
= Mask
& Base
; /* Find the significant bits */
592 Size
= Size
& ~(Size
- 1); /* Get the lowest of them to find the decode size */
596 static NTSTATUS STDCALL
597 HalpAssignPciSlotResources(IN PBUS_HANDLER BusHandler
,
599 IN PUNICODE_STRING RegistryPath
,
600 IN PUNICODE_STRING DriverClassName
,
601 IN PDRIVER_OBJECT DriverObject
,
602 IN PDEVICE_OBJECT DeviceObject
,
604 IN OUT PCM_RESOURCE_LIST
*AllocatedResources
)
607 PCI_COMMON_CONFIG PciConfig
;
610 ULONG Size
[PCI_TYPE0_ADDRESSES
];
611 NTSTATUS Status
= STATUS_SUCCESS
;
613 PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor
;
615 /* FIXME: Should handle 64-bit addresses */
617 DataSize
= HalpGetPciData(BusHandler
,
622 PCI_COMMON_HDR_LENGTH
);
623 if (PCI_COMMON_HDR_LENGTH
!= DataSize
)
625 return STATUS_UNSUCCESSFUL
;
628 /* Read the PCI configuration space for the device and store base address and
629 size information in temporary storage. Count the number of valid base addresses */
631 for (Address
= 0; Address
< PCI_TYPE0_ADDRESSES
; Address
++)
633 if (0xffffffff == PciConfig
.u
.type0
.BaseAddresses
[Address
])
635 PciConfig
.u
.type0
.BaseAddresses
[Address
] = 0;
637 if (0 != PciConfig
.u
.type0
.BaseAddresses
[Address
])
640 Offset
= offsetof(PCI_COMMON_CONFIG
, u
.type0
.BaseAddresses
[Address
]);
641 Status
= WritePciConfigUlong((UCHAR
)BusNumber
, (UCHAR
)SlotNumber
, Offset
, 0xffffffff);
642 if (! NT_SUCCESS(Status
))
644 WritePciConfigUlong((UCHAR
)BusNumber
, (UCHAR
)SlotNumber
, Offset
,
645 PciConfig
.u
.type0
.BaseAddresses
[Address
]);
648 Status
= ReadPciConfigUlong((UCHAR
)BusNumber
, (UCHAR
)SlotNumber
,
649 Offset
, Size
+ Address
);
650 if (! NT_SUCCESS(Status
))
652 WritePciConfigUlong((UCHAR
)BusNumber
, (UCHAR
)SlotNumber
, Offset
,
653 PciConfig
.u
.type0
.BaseAddresses
[Address
]);
656 Status
= WritePciConfigUlong((UCHAR
)BusNumber
, (UCHAR
)SlotNumber
, Offset
,
657 PciConfig
.u
.type0
.BaseAddresses
[Address
]);
658 if (! NT_SUCCESS(Status
))
665 if (0 != PciConfig
.u
.type0
.InterruptLine
)
670 /* Allocate output buffer and initialize */
671 *AllocatedResources
= ExAllocatePoolWithTag(PagedPool
,
672 sizeof(CM_RESOURCE_LIST
) +
673 (ResourceCount
- 1) * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR
),
675 if (NULL
== *AllocatedResources
)
677 return STATUS_NO_MEMORY
;
679 (*AllocatedResources
)->Count
= 1;
680 (*AllocatedResources
)->List
[0].InterfaceType
= PCIBus
;
681 (*AllocatedResources
)->List
[0].BusNumber
= BusNumber
;
682 (*AllocatedResources
)->List
[0].PartialResourceList
.Version
= 1;
683 (*AllocatedResources
)->List
[0].PartialResourceList
.Revision
= 1;
684 (*AllocatedResources
)->List
[0].PartialResourceList
.Count
= ResourceCount
;
685 Descriptor
= (*AllocatedResources
)->List
[0].PartialResourceList
.PartialDescriptors
;
687 /* Store configuration information */
688 for (Address
= 0; Address
< PCI_TYPE0_ADDRESSES
; Address
++)
690 if (0 != PciConfig
.u
.type0
.BaseAddresses
[Address
])
692 if (PCI_BASE_ADDRESS_SPACE_MEMORY
==
693 (PciConfig
.u
.type0
.BaseAddresses
[Address
] & PCI_BASE_ADDRESS_SPACE
))
695 Descriptor
->Type
= CmResourceTypeMemory
;
696 Descriptor
->ShareDisposition
= CmResourceShareDeviceExclusive
; /* FIXME I have no idea... */
697 Descriptor
->Flags
= CM_RESOURCE_MEMORY_READ_WRITE
; /* FIXME Just a guess */
698 Descriptor
->u
.Memory
.Start
.QuadPart
= (PciConfig
.u
.type0
.BaseAddresses
[Address
] & PCI_BASE_ADDRESS_MEM_MASK
);
699 Descriptor
->u
.Memory
.Length
= PciSize(Size
[Address
], PCI_BASE_ADDRESS_MEM_MASK
);
701 else if (PCI_BASE_ADDRESS_SPACE_IO
==
702 (PciConfig
.u
.type0
.BaseAddresses
[Address
] & PCI_BASE_ADDRESS_SPACE
))
704 Descriptor
->Type
= CmResourceTypePort
;
705 Descriptor
->ShareDisposition
= CmResourceShareDeviceExclusive
; /* FIXME I have no idea... */
706 Descriptor
->Flags
= CM_RESOURCE_PORT_IO
; /* FIXME Just a guess */
707 Descriptor
->u
.Port
.Start
.QuadPart
= PciConfig
.u
.type0
.BaseAddresses
[Address
] &= PCI_BASE_ADDRESS_IO_MASK
;
708 Descriptor
->u
.Port
.Length
= PciSize(Size
[Address
], PCI_BASE_ADDRESS_IO_MASK
& 0xffff);
713 return STATUS_UNSUCCESSFUL
;
719 if (0 != PciConfig
.u
.type0
.InterruptLine
)
721 Descriptor
->Type
= CmResourceTypeInterrupt
;
722 Descriptor
->ShareDisposition
= CmResourceShareShared
; /* FIXME Just a guess */
723 Descriptor
->Flags
= CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE
; /* FIXME Just a guess */
724 Descriptor
->u
.Interrupt
.Level
= PciConfig
.u
.type0
.InterruptLine
;
725 Descriptor
->u
.Interrupt
.Vector
= PciConfig
.u
.type0
.InterruptLine
;
726 Descriptor
->u
.Interrupt
.Affinity
= 0xFFFFFFFF;
731 ASSERT(Descriptor
== (*AllocatedResources
)->List
[0].PartialResourceList
.PartialDescriptors
+ ResourceCount
);
733 /* FIXME: Should store the resources in the registry resource map */
742 PBUS_HANDLER BusHandler
;
744 DPRINT("HalpInitPciBus() called.\n");
746 KeInitializeSpinLock (&PciLock
);
748 BusConfigType
= GetBusConfigType();
749 if (BusConfigType
== 0)
752 DPRINT("Bus configuration %lu used\n", BusConfigType
);
754 /* pci bus (bus 0) handler */
755 BusHandler
= HalpAllocateBusHandler(PCIBus
,
758 BusHandler
->GetBusData
= (pGetSetBusData
)HalpGetPciData
;
759 BusHandler
->SetBusData
= (pGetSetBusData
)HalpSetPciData
;
760 BusHandler
->GetInterruptVector
=
761 (pGetInterruptVector
)HalpGetPciInterruptVector
;
762 BusHandler
->TranslateBusAddress
=
763 (pTranslateBusAddress
)HalpTranslatePciAddress
;
764 // BusHandler->AdjustResourceList =
765 // (pGetSetBusData)HalpAdjustPciResourceList;
766 BusHandler
->AssignSlotResources
=
767 (pAssignSlotResources
)HalpAssignPciSlotResources
;
770 /* agp bus (bus 1) handler */
771 BusHandler
= HalpAllocateBusHandler(PCIBus
,
774 BusHandler
->GetBusData
= (pGetSetBusData
)HalpGetPciData
;
775 BusHandler
->SetBusData
= (pGetSetBusData
)HalpSetPciData
;
776 BusHandler
->GetInterruptVector
=
777 (pGetInterruptVector
)HalpGetPciInterruptVector
;
778 BusHandler
->TranslateBusAddress
=
779 (pTranslateBusAddress
)HalpTranslatePciAddress
;
780 // BusHandler->AdjustResourceList =
781 // (pGetSetBusData)HalpAdjustPciResourceList;
782 BusHandler
->AssignSlotResources
=
783 (pAssignSlotResources
)HalpAssignPciSlotResources
;
786 /* PCI bus (bus 2) handler */
787 BusHandler
= HalpAllocateBusHandler(PCIBus
,
790 BusHandler
->GetBusData
= (pGetSetBusData
)HalpGetPciData
;
791 BusHandler
->SetBusData
= (pGetSetBusData
)HalpSetPciData
;
792 BusHandler
->GetInterruptVector
=
793 (pGetInterruptVector
)HalpGetPciInterruptVector
;
794 BusHandler
->TranslateBusAddress
=
795 (pTranslateBusAddress
)HalpTranslatePciAddress
;
796 // BusHandler->AdjustResourceList =
797 // (pGetSetBusData)HalpAdjustPciResourceList;
798 BusHandler
->AssignSlotResources
=
799 (pAssignSlotResources
)HalpAssignPciSlotResources
;
801 DPRINT("HalpInitPciBus() finished.\n");