1 /* $Id: pci.c,v 1.1 2004/12/03 20:10:43 gvg 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 *****************************************************************/
21 #include <ddk/ntddk.h>
26 #include <internal/debug.h>
29 /* MACROS ******************************************************************/
31 /* FIXME These are also defined in drivers/bus/pci/pcidef.h.
32 Maybe put PCI definitions in a central include file??? */
34 /* access type 1 macros */
35 #define CONFIG_CMD(bus, dev_fn, where) \
36 (0x80000000 | (((ULONG)(bus)) << 16) | (((dev_fn) & 0x1F) << 11) | (((dev_fn) & 0xE0) << 3) | ((where) & ~3))
38 /* access type 2 macros */
39 #define IOADDR(dev_fn, where) \
40 (0xC000 | (((dev_fn) & 0x1F) << 8) | (where))
41 #define FUNC(dev_fn) \
42 ((((dev_fn) & 0xE0) >> 4) | 0xf0)
44 #define PCI_BASE_ADDRESS_SPACE 0x01 /* 0 = memory, 1 = I/O */
45 #define PCI_BASE_ADDRESS_SPACE_IO 0x01
46 #define PCI_BASE_ADDRESS_SPACE_MEMORY 0x00
47 #define PCI_BASE_ADDRESS_MEM_TYPE_MASK 0x06
48 #define PCI_BASE_ADDRESS_MEM_TYPE_32 0x00 /* 32 bit address */
49 #define PCI_BASE_ADDRESS_MEM_TYPE_1M 0x02 /* Below 1M [obsolete] */
50 #define PCI_BASE_ADDRESS_MEM_TYPE_64 0x04 /* 64 bit address */
51 #define PCI_BASE_ADDRESS_MEM_PREFETCH 0x08 /* prefetchable? */
52 #define PCI_BASE_ADDRESS_MEM_MASK (~0x0fUL)
53 #define PCI_BASE_ADDRESS_IO_MASK (~0x03UL)
54 /* bit 1 is reserved if address_space = 1 */
57 /* GLOBALS ******************************************************************/
59 #define TAG_PCI TAG('P', 'C', 'I', 'H')
61 static ULONG BusConfigType
= 0; /* undetermined config type */
62 static KSPIN_LOCK PciLock
;
64 /* FUNCTIONS ****************************************************************/
67 ReadPciConfigUchar(UCHAR Bus
,
74 switch (BusConfigType
)
77 KeAcquireSpinLock(&PciLock
, &oldIrql
);
78 WRITE_PORT_ULONG((PULONG
)0xCF8, CONFIG_CMD(Bus
, Slot
, Offset
));
79 *Value
= READ_PORT_UCHAR((PUCHAR
)0xCFC + (Offset
& 3));
80 KeReleaseSpinLock(&PciLock
, oldIrql
);
81 return STATUS_SUCCESS
;
84 KeAcquireSpinLock(&PciLock
, &oldIrql
);
85 WRITE_PORT_UCHAR((PUCHAR
)0xCF8, (UCHAR
)FUNC(Slot
));
86 WRITE_PORT_UCHAR((PUCHAR
)0xCFA, Bus
);
87 *Value
= READ_PORT_UCHAR((PUCHAR
)(IOADDR(Slot
, Offset
)));
88 WRITE_PORT_UCHAR((PUCHAR
)0xCF8, 0);
89 KeReleaseSpinLock(&PciLock
, oldIrql
);
90 return STATUS_SUCCESS
;
92 return STATUS_UNSUCCESSFUL
;
97 ReadPciConfigUshort(UCHAR Bus
,
104 if ((Offset
& 1) != 0)
106 return STATUS_INVALID_PARAMETER
;
109 switch (BusConfigType
)
112 KeAcquireSpinLock(&PciLock
, &oldIrql
);
113 WRITE_PORT_ULONG((PULONG
)0xCF8, CONFIG_CMD(Bus
, Slot
, Offset
));
114 *Value
= READ_PORT_USHORT((PUSHORT
)0xCFC + (Offset
& 2));
115 KeReleaseSpinLock(&PciLock
, oldIrql
);
116 return STATUS_SUCCESS
;
119 KeAcquireSpinLock(&PciLock
, &oldIrql
);
120 WRITE_PORT_UCHAR((PUCHAR
)0xCF8, (UCHAR
)FUNC(Slot
));
121 WRITE_PORT_UCHAR((PUCHAR
)0xCFA, Bus
);
122 *Value
= READ_PORT_USHORT((PUSHORT
)(IOADDR(Slot
, Offset
)));
123 WRITE_PORT_UCHAR((PUCHAR
)0xCF8, 0);
124 KeReleaseSpinLock(&PciLock
, oldIrql
);
125 return STATUS_SUCCESS
;
127 return STATUS_UNSUCCESSFUL
;
132 ReadPciConfigUlong(UCHAR Bus
,
139 if ((Offset
& 3) != 0)
141 return STATUS_INVALID_PARAMETER
;
144 switch (BusConfigType
)
147 KeAcquireSpinLock(&PciLock
, &oldIrql
);
148 WRITE_PORT_ULONG((PULONG
)0xCF8, CONFIG_CMD(Bus
, Slot
, Offset
));
149 *Value
= READ_PORT_ULONG((PULONG
)0xCFC);
150 KeReleaseSpinLock(&PciLock
, oldIrql
);
151 return STATUS_SUCCESS
;
154 KeAcquireSpinLock(&PciLock
, &oldIrql
);
155 WRITE_PORT_UCHAR((PUCHAR
)0xCF8, (UCHAR
)FUNC(Slot
));
156 WRITE_PORT_UCHAR((PUCHAR
)0xCFA, Bus
);
157 *Value
= READ_PORT_ULONG((PULONG
)(IOADDR(Slot
, Offset
)));
158 WRITE_PORT_UCHAR((PUCHAR
)0xCF8, 0);
159 KeReleaseSpinLock(&PciLock
, oldIrql
);
160 return STATUS_SUCCESS
;
162 return STATUS_UNSUCCESSFUL
;
167 WritePciConfigUchar(UCHAR Bus
,
174 switch (BusConfigType
)
177 KeAcquireSpinLock(&PciLock
, &oldIrql
);
178 WRITE_PORT_ULONG((PULONG
)0xCF8, CONFIG_CMD(Bus
, Slot
, Offset
));
179 WRITE_PORT_UCHAR((PUCHAR
)0xCFC + (Offset
&3), Value
);
180 KeReleaseSpinLock(&PciLock
, oldIrql
);
181 return STATUS_SUCCESS
;
184 KeAcquireSpinLock(&PciLock
, &oldIrql
);
185 WRITE_PORT_UCHAR((PUCHAR
)0xCF8, (UCHAR
)FUNC(Slot
));
186 WRITE_PORT_UCHAR((PUCHAR
)0xCFA, Bus
);
187 WRITE_PORT_UCHAR((PUCHAR
)(IOADDR(Slot
,Offset
)), Value
);
188 WRITE_PORT_UCHAR((PUCHAR
)0xCF8, 0);
189 KeReleaseSpinLock(&PciLock
, oldIrql
);
190 return STATUS_SUCCESS
;
192 return STATUS_UNSUCCESSFUL
;
197 WritePciConfigUshort(UCHAR Bus
,
204 if ((Offset
& 1) != 0)
206 return STATUS_INVALID_PARAMETER
;
209 switch (BusConfigType
)
212 KeAcquireSpinLock(&PciLock
, &oldIrql
);
213 WRITE_PORT_ULONG((PULONG
)0xCF8, CONFIG_CMD(Bus
, Slot
, Offset
));
214 WRITE_PORT_USHORT((PUSHORT
)0xCFC + (Offset
& 2), Value
);
215 KeReleaseSpinLock(&PciLock
, oldIrql
);
216 return STATUS_SUCCESS
;
219 KeAcquireSpinLock(&PciLock
, &oldIrql
);
220 WRITE_PORT_UCHAR((PUCHAR
)0xCF8, (UCHAR
)FUNC(Slot
));
221 WRITE_PORT_UCHAR((PUCHAR
)0xCFA, Bus
);
222 WRITE_PORT_USHORT((PUSHORT
)(IOADDR(Slot
, Offset
)), Value
);
223 WRITE_PORT_UCHAR((PUCHAR
)0xCF8, 0);
224 KeReleaseSpinLock(&PciLock
, oldIrql
);
225 return STATUS_SUCCESS
;
227 return STATUS_UNSUCCESSFUL
;
232 WritePciConfigUlong(UCHAR Bus
,
239 if ((Offset
& 3) != 0)
241 return STATUS_INVALID_PARAMETER
;
244 switch (BusConfigType
)
247 KeAcquireSpinLock(&PciLock
, &oldIrql
);
248 WRITE_PORT_ULONG((PULONG
)0xCF8, CONFIG_CMD(Bus
, Slot
, Offset
));
249 WRITE_PORT_ULONG((PULONG
)0xCFC, Value
);
250 KeReleaseSpinLock(&PciLock
, oldIrql
);
251 return STATUS_SUCCESS
;
254 KeAcquireSpinLock(&PciLock
, &oldIrql
);
255 WRITE_PORT_UCHAR((PUCHAR
)0xCF8, (UCHAR
)FUNC(Slot
));
256 WRITE_PORT_UCHAR((PUCHAR
)0xCFA, Bus
);
257 WRITE_PORT_ULONG((PULONG
)(IOADDR(Slot
, Offset
)), Value
);
258 WRITE_PORT_UCHAR((PUCHAR
)0xCF8, 0);
259 KeReleaseSpinLock(&PciLock
, oldIrql
);
260 return STATUS_SUCCESS
;
262 return STATUS_UNSUCCESSFUL
;
267 HalpGetPciData(PBUS_HANDLER BusHandler
,
275 ULONG Address
= Offset
;
280 DPRINT("HalpGetPciData() called.\n");
281 DPRINT(" BusNumber %lu\n", BusNumber
);
282 DPRINT(" SlotNumber %lu\n", SlotNumber
);
283 DPRINT(" Offset 0x%lx\n", Offset
);
284 DPRINT(" Length 0x%lx\n", Length
);
286 if ((Length
== 0) || (BusConfigType
== 0))
289 ReadPciConfigUlong((UCHAR
)BusNumber
,
290 (UCHAR
)(SlotNumber
& 0x1F),
293 /* some broken boards return 0 if a slot is empty: */
294 if (Vendor
== 0xFFFFFFFF || Vendor
== 0)
296 if (BusNumber
== 0 && Offset
== 0 && Length
>= 2)
298 *(PUSHORT
)Buffer
= PCI_INVALID_VENDORID
;
304 /* 0E=PCI_HEADER_TYPE */
305 ReadPciConfigUchar((UCHAR
)BusNumber
,
306 (UCHAR
)(SlotNumber
& 0x1F),
309 if (((HeaderType
& PCI_MULTIFUNCTION
) == 0) && ((SlotNumber
& 0xE0) != 0))
311 if (Offset
== 0 && Length
>= 2)
313 *(PUSHORT
)Buffer
= PCI_INVALID_VENDORID
;
318 ReadPciConfigUlong((UCHAR
)BusNumber
,
322 /* some broken boards return 0 if a slot is empty: */
323 if (Vendor
== 0xFFFFFFFF || Vendor
== 0)
325 if (BusNumber
== 0 && Offset
== 0 && Length
>= 2)
327 *(PUSHORT
)Buffer
= PCI_INVALID_VENDORID
;
333 if ((Address
& 1) && (Len
>= 1))
335 ReadPciConfigUchar((UCHAR
)BusNumber
,
339 Ptr
= (char*)Ptr
+ 1;
344 if ((Address
& 2) && (Len
>= 2))
346 ReadPciConfigUshort((UCHAR
)BusNumber
,
350 Ptr
= (char*)Ptr
+ 2;
357 ReadPciConfigUlong((UCHAR
)BusNumber
,
361 Ptr
= (char*)Ptr
+ 4;
368 ReadPciConfigUshort((UCHAR
)BusNumber
,
372 Ptr
= (char*)Ptr
+ 2;
379 ReadPciConfigUchar((UCHAR
)BusNumber
,
383 Ptr
= (char*)Ptr
+ 1;
393 HalpSetPciData(PBUS_HANDLER BusHandler
,
401 ULONG Address
= Offset
;
406 DPRINT("HalpSetPciData() called.\n");
407 DPRINT(" BusNumber %lu\n", BusNumber
);
408 DPRINT(" SlotNumber %lu\n", SlotNumber
);
409 DPRINT(" Offset 0x%lx\n", Offset
);
410 DPRINT(" Length 0x%lx\n", Length
);
412 if ((Length
== 0) || (BusConfigType
== 0))
415 ReadPciConfigUlong((UCHAR
)BusNumber
,
416 (UCHAR
)(SlotNumber
& 0x1F),
419 /* some broken boards return 0 if a slot is empty: */
420 if (Vendor
== 0xFFFFFFFF || Vendor
== 0)
424 /* 0E=PCI_HEADER_TYPE */
425 ReadPciConfigUchar((UCHAR
)BusNumber
,
426 (UCHAR
)(SlotNumber
& 0x1F),
429 if (((HeaderType
& PCI_MULTIFUNCTION
) == 0) && ((SlotNumber
& 0xE0) != 0))
432 ReadPciConfigUlong((UCHAR
)BusNumber
,
436 /* some broken boards return 0 if a slot is empty: */
437 if (Vendor
== 0xFFFFFFFF || Vendor
== 0)
440 if ((Address
& 1) && (Len
>= 1))
442 WritePciConfigUchar((UCHAR
)BusNumber
,
446 Ptr
= (char*)Ptr
+ 1;
451 if ((Address
& 2) && (Len
>= 2))
453 WritePciConfigUshort((UCHAR
)BusNumber
,
457 Ptr
= (char*)Ptr
+ 2;
464 WritePciConfigUlong((UCHAR
)BusNumber
,
468 Ptr
= (char*)Ptr
+ 4;
475 WritePciConfigUshort((UCHAR
)BusNumber
,
479 Ptr
= (char*)Ptr
+ 2;
486 WritePciConfigUchar((UCHAR
)BusNumber
,
490 Ptr
= (char*)Ptr
+ 1;
500 GetBusConfigType(VOID
)
505 DPRINT("GetBusConfigType() called\n");
507 KeAcquireSpinLock(&PciLock
, &oldIrql
);
509 DPRINT("Checking configuration type 1:");
510 WRITE_PORT_UCHAR((PUCHAR
)0xCFB, 0x01);
511 Value
= READ_PORT_ULONG((PULONG
)0xCF8);
512 WRITE_PORT_ULONG((PULONG
)0xCF8, 0x80000000);
513 if (READ_PORT_ULONG((PULONG
)0xCF8) == 0x80000000)
515 WRITE_PORT_ULONG((PULONG
)0xCF8, Value
);
516 KeReleaseSpinLock(&PciLock
, oldIrql
);
517 DPRINT(" Success!\n");
520 WRITE_PORT_ULONG((PULONG
)0xCF8, Value
);
521 DPRINT(" Unsuccessful!\n");
523 DPRINT("Checking configuration type 2:");
524 WRITE_PORT_UCHAR((PUCHAR
)0xCFB, 0x00);
525 WRITE_PORT_UCHAR((PUCHAR
)0xCF8, 0x00);
526 WRITE_PORT_UCHAR((PUCHAR
)0xCFA, 0x00);
527 if (READ_PORT_UCHAR((PUCHAR
)0xCF8) == 0x00 &&
528 READ_PORT_UCHAR((PUCHAR
)0xCFB) == 0x00)
530 KeReleaseSpinLock(&PciLock
, oldIrql
);
531 DPRINT(" Success!\n");
534 KeReleaseSpinLock(&PciLock
, oldIrql
);
535 DPRINT(" Unsuccessful!\n");
537 DPRINT("No pci bus found!\n");
543 HalpGetPciInterruptVector(PVOID BusHandler
,
545 ULONG BusInterruptLevel
,
546 ULONG BusInterruptVector
,
550 ULONG Vector
= IRQ2VECTOR(BusInterruptVector
);
551 *Irql
= VECTOR2IRQL(Vector
);
552 *Affinity
= 0xFFFFFFFF;
556 static BOOLEAN STDCALL
557 HalpTranslatePciAddress(PBUS_HANDLER BusHandler
,
559 PHYSICAL_ADDRESS BusAddress
,
561 PPHYSICAL_ADDRESS TranslatedAddress
)
563 if (*AddressSpace
== 0)
568 else if (*AddressSpace
== 1)
579 TranslatedAddress
->QuadPart
= BusAddress
.QuadPart
;
585 * Find the extent of a PCI decode..
588 PciSize(ULONG Base
, ULONG Mask
)
590 ULONG Size
= Mask
& Base
; /* Find the significant bits */
591 Size
= Size
& ~(Size
- 1); /* Get the lowest of them to find the decode size */
595 static NTSTATUS STDCALL
596 HalpAssignPciSlotResources(IN PBUS_HANDLER BusHandler
,
598 IN PUNICODE_STRING RegistryPath
,
599 IN PUNICODE_STRING DriverClassName
,
600 IN PDRIVER_OBJECT DriverObject
,
601 IN PDEVICE_OBJECT DeviceObject
,
603 IN OUT PCM_RESOURCE_LIST
*AllocatedResources
)
606 PCI_COMMON_CONFIG PciConfig
;
609 ULONG Size
[PCI_TYPE0_ADDRESSES
];
610 NTSTATUS Status
= STATUS_SUCCESS
;
612 PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor
;
614 /* FIXME: Should handle 64-bit addresses */
616 DataSize
= HalpGetPciData(BusHandler
,
621 PCI_COMMON_HDR_LENGTH
);
622 if (PCI_COMMON_HDR_LENGTH
!= DataSize
)
624 return STATUS_UNSUCCESSFUL
;
627 /* Read the PCI configuration space for the device and store base address and
628 size information in temporary storage. Count the number of valid base addresses */
630 for (Address
= 0; Address
< PCI_TYPE0_ADDRESSES
; Address
++)
632 if (0xffffffff == PciConfig
.u
.type0
.BaseAddresses
[Address
])
634 PciConfig
.u
.type0
.BaseAddresses
[Address
] = 0;
636 if (0 != PciConfig
.u
.type0
.BaseAddresses
[Address
])
639 Offset
= offsetof(PCI_COMMON_CONFIG
, u
.type0
.BaseAddresses
[Address
]);
640 Status
= WritePciConfigUlong((UCHAR
)BusNumber
, (UCHAR
)SlotNumber
, Offset
, 0xffffffff);
641 if (! NT_SUCCESS(Status
))
643 WritePciConfigUlong((UCHAR
)BusNumber
, (UCHAR
)SlotNumber
, Offset
,
644 PciConfig
.u
.type0
.BaseAddresses
[Address
]);
647 Status
= ReadPciConfigUlong((UCHAR
)BusNumber
, (UCHAR
)SlotNumber
,
648 Offset
, Size
+ Address
);
649 if (! NT_SUCCESS(Status
))
651 WritePciConfigUlong((UCHAR
)BusNumber
, (UCHAR
)SlotNumber
, Offset
,
652 PciConfig
.u
.type0
.BaseAddresses
[Address
]);
655 Status
= WritePciConfigUlong((UCHAR
)BusNumber
, (UCHAR
)SlotNumber
, Offset
,
656 PciConfig
.u
.type0
.BaseAddresses
[Address
]);
657 if (! NT_SUCCESS(Status
))
664 if (0 != PciConfig
.u
.type0
.InterruptLine
)
669 /* Allocate output buffer and initialize */
670 *AllocatedResources
= ExAllocatePoolWithTag(PagedPool
,
671 sizeof(CM_RESOURCE_LIST
) +
672 (ResourceCount
- 1) * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR
),
674 if (NULL
== *AllocatedResources
)
676 return STATUS_NO_MEMORY
;
678 (*AllocatedResources
)->Count
= 1;
679 (*AllocatedResources
)->List
[0].InterfaceType
= PCIBus
;
680 (*AllocatedResources
)->List
[0].BusNumber
= BusNumber
;
681 (*AllocatedResources
)->List
[0].PartialResourceList
.Version
= 1;
682 (*AllocatedResources
)->List
[0].PartialResourceList
.Revision
= 1;
683 (*AllocatedResources
)->List
[0].PartialResourceList
.Count
= ResourceCount
;
684 Descriptor
= (*AllocatedResources
)->List
[0].PartialResourceList
.PartialDescriptors
;
686 /* Store configuration information */
687 for (Address
= 0; Address
< PCI_TYPE0_ADDRESSES
; Address
++)
689 if (0 != PciConfig
.u
.type0
.BaseAddresses
[Address
])
691 if (PCI_BASE_ADDRESS_SPACE_MEMORY
==
692 (PciConfig
.u
.type0
.BaseAddresses
[Address
] & PCI_BASE_ADDRESS_SPACE
))
694 Descriptor
->Type
= CmResourceTypeMemory
;
695 Descriptor
->ShareDisposition
= CmResourceShareDeviceExclusive
; /* FIXME I have no idea... */
696 Descriptor
->Flags
= CM_RESOURCE_MEMORY_READ_WRITE
; /* FIXME Just a guess */
697 Descriptor
->u
.Memory
.Start
.QuadPart
= (PciConfig
.u
.type0
.BaseAddresses
[Address
] & PCI_BASE_ADDRESS_MEM_MASK
);
698 Descriptor
->u
.Memory
.Length
= PciSize(Size
[Address
], PCI_BASE_ADDRESS_MEM_MASK
);
700 else if (PCI_BASE_ADDRESS_SPACE_IO
==
701 (PciConfig
.u
.type0
.BaseAddresses
[Address
] & PCI_BASE_ADDRESS_SPACE
))
703 Descriptor
->Type
= CmResourceTypePort
;
704 Descriptor
->ShareDisposition
= CmResourceShareDeviceExclusive
; /* FIXME I have no idea... */
705 Descriptor
->Flags
= CM_RESOURCE_PORT_IO
; /* FIXME Just a guess */
706 Descriptor
->u
.Port
.Start
.QuadPart
= PciConfig
.u
.type0
.BaseAddresses
[Address
] &= PCI_BASE_ADDRESS_IO_MASK
;
707 Descriptor
->u
.Port
.Length
= PciSize(Size
[Address
], PCI_BASE_ADDRESS_IO_MASK
& 0xffff);
712 return STATUS_UNSUCCESSFUL
;
718 if (0 != PciConfig
.u
.type0
.InterruptLine
)
720 Descriptor
->Type
= CmResourceTypeInterrupt
;
721 Descriptor
->ShareDisposition
= CmResourceShareShared
; /* FIXME Just a guess */
722 Descriptor
->Flags
= CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE
; /* FIXME Just a guess */
723 Descriptor
->u
.Interrupt
.Level
= PciConfig
.u
.type0
.InterruptLine
;
724 Descriptor
->u
.Interrupt
.Vector
= PciConfig
.u
.type0
.InterruptLine
;
725 Descriptor
->u
.Interrupt
.Affinity
= 0xFFFFFFFF;
730 ASSERT(Descriptor
== (*AllocatedResources
)->List
[0].PartialResourceList
.PartialDescriptors
+ ResourceCount
);
732 /* FIXME: Should store the resources in the registry resource map */
741 PBUS_HANDLER BusHandler
;
743 DPRINT("HalpInitPciBus() called.\n");
745 KeInitializeSpinLock (&PciLock
);
747 BusConfigType
= GetBusConfigType();
748 if (BusConfigType
== 0)
751 DPRINT("Bus configuration %lu used\n", BusConfigType
);
753 /* pci bus (bus 0) handler */
754 BusHandler
= HalpAllocateBusHandler(PCIBus
,
757 BusHandler
->GetBusData
= (pGetSetBusData
)HalpGetPciData
;
758 BusHandler
->SetBusData
= (pGetSetBusData
)HalpSetPciData
;
759 BusHandler
->GetInterruptVector
=
760 (pGetInterruptVector
)HalpGetPciInterruptVector
;
761 BusHandler
->TranslateBusAddress
=
762 (pTranslateBusAddress
)HalpTranslatePciAddress
;
763 // BusHandler->AdjustResourceList =
764 // (pGetSetBusData)HalpAdjustPciResourceList;
765 BusHandler
->AssignSlotResources
=
766 (pAssignSlotResources
)HalpAssignPciSlotResources
;
769 /* agp bus (bus 1) handler */
770 BusHandler
= HalpAllocateBusHandler(PCIBus
,
773 BusHandler
->GetBusData
= (pGetSetBusData
)HalpGetPciData
;
774 BusHandler
->SetBusData
= (pGetSetBusData
)HalpSetPciData
;
775 BusHandler
->GetInterruptVector
=
776 (pGetInterruptVector
)HalpGetPciInterruptVector
;
777 BusHandler
->TranslateBusAddress
=
778 (pTranslateBusAddress
)HalpTranslatePciAddress
;
779 // BusHandler->AdjustResourceList =
780 // (pGetSetBusData)HalpAdjustPciResourceList;
781 BusHandler
->AssignSlotResources
=
782 (pAssignSlotResources
)HalpAssignPciSlotResources
;
785 /* PCI bus (bus 2) handler */
786 BusHandler
= HalpAllocateBusHandler(PCIBus
,
789 BusHandler
->GetBusData
= (pGetSetBusData
)HalpGetPciData
;
790 BusHandler
->SetBusData
= (pGetSetBusData
)HalpSetPciData
;
791 BusHandler
->GetInterruptVector
=
792 (pGetInterruptVector
)HalpGetPciInterruptVector
;
793 BusHandler
->TranslateBusAddress
=
794 (pTranslateBusAddress
)HalpTranslatePciAddress
;
795 // BusHandler->AdjustResourceList =
796 // (pGetSetBusData)HalpAdjustPciResourceList;
797 BusHandler
->AssignSlotResources
=
798 (pAssignSlotResources
)HalpAssignPciSlotResources
;
800 DPRINT("HalpInitPciBus() finished.\n");