3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: hal/halx86/xbox/pci_xbox.c
6 * PURPOSE: Xbox specific handling of PCI cards
7 * PROGRAMMER: Ge van Geldorp (gvg@reactos.com)
11 * Trying to get PCI config data from devices 0:0:1 and 0:0:2 will completely
12 * hang the Xbox. Also, the device number doesn't seem to be decoded for the
13 * video card, so it appears to be present on 1:0:0 - 1:31:0.
14 * We hack around these problems by indicating "device not present" for devices
15 * 0:0:1, 0:0:2, 1:1:0, 1:2:0, 1:3:0, ...., 1:31:0
18 /* INCLUDES *****************************************************************/
20 #include <ddk/ntddk.h>
26 #include <internal/debug.h>
28 /* VARIABLES ***************************************************************/
30 static ULONG (STDCALL
*GenericGetPciData
)(PBUS_HANDLER BusHandler
,
36 static ULONG (STDCALL
*GenericSetPciData
)(PBUS_HANDLER BusHandler
,
43 /* FUNCTIONS ***************************************************************/
46 HalpXboxGetPciData(PBUS_HANDLER BusHandler
,
53 DPRINT("HalpXboxGetPciData() called.\n");
54 DPRINT(" BusNumber %lu\n", BusNumber
);
55 DPRINT(" SlotNumber %lu\n", SlotNumber
);
56 DPRINT(" Offset 0x%lx\n", Offset
);
57 DPRINT(" Length 0x%lx\n", Length
);
59 if ((0 == BusNumber
&& 0 == (SlotNumber
& 0x1f) &&
60 (1 == ((SlotNumber
>> 5) & 0x07) || 2 == ((SlotNumber
>> 5) & 0x07))) ||
61 (1 == BusNumber
&& 0 != (SlotNumber
& 0x1f)))
63 DPRINT("Blacklisted PCI slot\n");
64 if (0 == Offset
&& 2 <= Length
)
66 *(PUSHORT
)Buffer
= PCI_INVALID_VENDORID
;
72 return GenericGetPciData(BusHandler
, BusNumber
, SlotNumber
, Buffer
, Offset
, Length
);
76 HalpXboxSetPciData(PBUS_HANDLER BusHandler
,
83 DPRINT("HalpXboxSetPciData() called.\n");
84 DPRINT(" BusNumber %lu\n", BusNumber
);
85 DPRINT(" SlotNumber %lu\n", SlotNumber
);
86 DPRINT(" Offset 0x%lx\n", Offset
);
87 DPRINT(" Length 0x%lx\n", Length
);
89 if ((0 == BusNumber
&& 0 == (SlotNumber
& 0x1f) &&
90 (1 == ((SlotNumber
>> 5) & 0x07) || 2 == ((SlotNumber
>> 5) & 0x07))) ||
91 (1 == BusNumber
&& 0 != (SlotNumber
& 0x1f)))
93 DPRINT1("Trying to set data on blacklisted PCI slot\n");
97 return GenericSetPciData(BusHandler
, BusNumber
, SlotNumber
, Buffer
, Offset
, Length
);
101 HalpXboxInitPciBus(ULONG BusNumber
, PBUS_HANDLER BusHandler
)
103 if (0 == BusNumber
|| 1 == BusNumber
)
105 GenericGetPciData
= BusHandler
->GetBusData
;
106 BusHandler
->GetBusData
= HalpXboxGetPciData
;
107 GenericSetPciData
= BusHandler
->SetBusData
;
108 BusHandler
->SetBusData
= HalpXboxSetPciData
;