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>
25 #include <internal/debug.h>
29 /* VARIABLES ***************************************************************/
31 static ULONG (STDCALL
*GenericGetPciData
)(PBUS_HANDLER BusHandler
,
37 static ULONG (STDCALL
*GenericSetPciData
)(PBUS_HANDLER BusHandler
,
44 /* FUNCTIONS ***************************************************************/
47 HalpXboxGetPciData(PBUS_HANDLER BusHandler
,
54 DPRINT("HalpXboxGetPciData() called.\n");
55 DPRINT(" BusNumber %lu\n", BusNumber
);
56 DPRINT(" SlotNumber %lu\n", SlotNumber
);
57 DPRINT(" Offset 0x%lx\n", Offset
);
58 DPRINT(" Length 0x%lx\n", Length
);
60 if ((0 == BusNumber
&& 0 == (SlotNumber
& 0x1f) &&
61 (1 == ((SlotNumber
>> 5) & 0x07) || 2 == ((SlotNumber
>> 5) & 0x07))) ||
62 (1 == BusNumber
&& 0 != (SlotNumber
& 0x1f)))
64 DPRINT("Blacklisted PCI slot\n");
65 if (0 == Offset
&& 2 <= Length
)
67 *(PUSHORT
)Buffer
= PCI_INVALID_VENDORID
;
73 return GenericGetPciData(BusHandler
, BusNumber
, SlotNumber
, Buffer
, Offset
, Length
);
77 HalpXboxSetPciData(PBUS_HANDLER BusHandler
,
84 DPRINT("HalpXboxSetPciData() called.\n");
85 DPRINT(" BusNumber %lu\n", BusNumber
);
86 DPRINT(" SlotNumber %lu\n", SlotNumber
);
87 DPRINT(" Offset 0x%lx\n", Offset
);
88 DPRINT(" Length 0x%lx\n", Length
);
90 if ((0 == BusNumber
&& 0 == (SlotNumber
& 0x1f) &&
91 (1 == ((SlotNumber
>> 5) & 0x07) || 2 == ((SlotNumber
>> 5) & 0x07))) ||
92 (1 == BusNumber
&& 0 != (SlotNumber
& 0x1f)))
94 DPRINT1("Trying to set data on blacklisted PCI slot\n");
98 return GenericSetPciData(BusHandler
, BusNumber
, SlotNumber
, Buffer
, Offset
, Length
);
102 HalpXboxInitPciBus(ULONG BusNumber
, PBUS_HANDLER BusHandler
)
104 if (0 == BusNumber
|| 1 == BusNumber
)
106 GenericGetPciData
= BusHandler
->GetBusData
;
107 BusHandler
->GetBusData
= HalpXboxGetPciData
;
108 GenericSetPciData
= BusHandler
->SetBusData
;
109 BusHandler
->SetBusData
= HalpXboxSetPciData
;