ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

bus.h
Go to the documentation of this file.
00001 #pragma once
00002 
00003 #define PCI_ADDRESS_MEMORY_SPACE            0x00000000
00004 
00005 //
00006 // Helper Macros
00007 //
00008 #define PASTE2(x,y)                                                     x ## y
00009 #define POINTER_TO_(x)                                                  PASTE2(P,x)
00010 #define READ_FROM(x)                                                    PASTE2(READ_PORT_, x)
00011 #define WRITE_TO(x)                                                     PASTE2(WRITE_PORT_, x)
00012 
00013 //
00014 // Declares a PCI Register Read/Write Routine
00015 //
00016 #define TYPE_DEFINE(x, y)                                               \
00017     ULONG                                                               \
00018     NTAPI                                                               \
00019     x(                                                                  \
00020         IN PPCIPBUSDATA BusData,                                        \
00021         IN y PciCfg,                                                    \
00022         IN PUCHAR Buffer,                                               \
00023         IN ULONG Offset                                                 \
00024     )
00025 #define TYPE1_DEFINE(x) TYPE_DEFINE(x, PPCI_TYPE1_CFG_BITS);
00026 #define TYPE2_DEFINE(x) TYPE_DEFINE(x, PPCI_TYPE2_ADDRESS_BITS);
00027 
00028 //
00029 // Defines a PCI Register Read/Write Type 1 Routine Prologue and Epilogue
00030 //
00031 #define TYPE1_START(x, y)                                               \
00032     TYPE_DEFINE(x, PPCI_TYPE1_CFG_BITS)                                 \
00033 {                                                                       \
00034     ULONG i = Offset % sizeof(ULONG);                                   \
00035     PciCfg->u.bits.RegisterNumber = Offset / sizeof(ULONG);             \
00036     WRITE_PORT_ULONG(BusData->Config.Type1.Address, PciCfg->u.AsULONG);
00037 #define TYPE1_END(y)                                                    \
00038     return sizeof(y); }
00039 #define TYPE2_END       TYPE1_END
00040 
00041 //
00042 // PCI Register Read Type 1 Routine
00043 //
00044 #define TYPE1_READ(x, y)                                                \
00045     TYPE1_START(x, y)                                                   \
00046     *((POINTER_TO_(y))Buffer) =                                         \
00047     READ_FROM(y)((POINTER_TO_(y))(ULONG_PTR)(BusData->Config.Type1.Data + i));     \
00048     TYPE1_END(y)
00049 
00050 //
00051 // PCI Register Write Type 1 Routine
00052 //
00053 #define TYPE1_WRITE(x, y)                                               \
00054     TYPE1_START(x, y)                                                   \
00055     WRITE_TO(y)((POINTER_TO_(y))(ULONG_PTR)(BusData->Config.Type1.Data + i),       \
00056                 *((POINTER_TO_(y))Buffer));                             \
00057     TYPE1_END(y)
00058 
00059 //
00060 // Defines a PCI Register Read/Write Type 2 Routine Prologue and Epilogue
00061 //
00062 #define TYPE2_START(x, y)                                               \
00063     TYPE_DEFINE(x, PPCI_TYPE2_ADDRESS_BITS)                             \
00064 {                                                                       \
00065     PciCfg->u.bits.RegisterNumber = (USHORT)Offset;
00066 
00067 //
00068 // PCI Register Read Type 2 Routine
00069 //
00070 #define TYPE2_READ(x, y)                                                \
00071     TYPE2_START(x, y)                                                   \
00072     *((POINTER_TO_(y))Buffer) =                                         \
00073         READ_FROM(y)((POINTER_TO_(y))(ULONG_PTR)PciCfg->u.AsUSHORT);        \
00074     TYPE2_END(y)
00075 
00076 //
00077 // PCI Register Write Type 2 Routine
00078 //
00079 #define TYPE2_WRITE(x, y)                                               \
00080     TYPE2_START(x, y)                                                   \
00081     WRITE_TO(y)((POINTER_TO_(y))(ULONG_PTR)PciCfg->u.AsUSHORT,              \
00082                 *((POINTER_TO_(y))Buffer));                             \
00083     TYPE2_END(y)
00084 
00085 typedef NTSTATUS
00086 (NTAPI *PciIrqRange)(
00087     IN PBUS_HANDLER BusHandler,
00088     IN PBUS_HANDLER RootHandler,
00089     IN PCI_SLOT_NUMBER PciSlot,
00090     OUT PSUPPORTED_RANGE *Interrupt
00091 );
00092 
00093 typedef struct _PCIPBUSDATA
00094 {
00095     PCIBUSDATA CommonData;
00096     union
00097     {
00098         struct
00099         {
00100             PULONG Address;
00101             ULONG Data;
00102         } Type1;
00103         struct
00104         {
00105             PUCHAR CSE;
00106             PUCHAR Forward;
00107             ULONG Base;
00108         } Type2;
00109     } Config;
00110     ULONG MaxDevice;
00111     PciIrqRange GetIrqRange;
00112     BOOLEAN BridgeConfigRead;
00113     UCHAR ParentBus;
00114     UCHAR Subtractive;
00115     UCHAR reserved[1];
00116     UCHAR SwizzleIn[4];
00117     RTL_BITMAP DeviceConfigured;
00118     ULONG ConfiguredBits[PCI_MAX_DEVICES * PCI_MAX_FUNCTION / 32];
00119 } PCIPBUSDATA, *PPCIPBUSDATA;
00120 
00121 typedef ULONG
00122 (NTAPI *FncConfigIO)(
00123     IN PPCIPBUSDATA BusData,
00124     IN PVOID State,
00125     IN PUCHAR Buffer,
00126     IN ULONG Offset
00127 );
00128 
00129 typedef VOID
00130 (NTAPI *FncSync)(
00131     IN PBUS_HANDLER BusHandler,
00132     IN PCI_SLOT_NUMBER Slot,
00133     IN PKIRQL Irql,
00134     IN PVOID State
00135 );
00136 
00137 typedef VOID
00138 (NTAPI *FncReleaseSync)(
00139     IN PBUS_HANDLER BusHandler,
00140     IN KIRQL Irql
00141 );
00142 
00143 typedef struct _PCI_CONFIG_HANDLER
00144 {
00145     FncSync Synchronize;
00146     FncReleaseSync ReleaseSynchronzation;
00147     FncConfigIO ConfigRead[3];
00148     FncConfigIO ConfigWrite[3];
00149 } PCI_CONFIG_HANDLER, *PPCI_CONFIG_HANDLER;
00150 
00151 typedef struct _PCI_REGISTRY_INFO_INTERNAL
00152 {
00153     UCHAR MajorRevision;
00154     UCHAR MinorRevision;
00155     UCHAR NoBuses; // Number Of Buses
00156     UCHAR HardwareMechanism;
00157     ULONG ElementCount;
00158     PCI_CARD_DESCRIPTOR CardList[ANYSIZE_ARRAY];
00159 } PCI_REGISTRY_INFO_INTERNAL, *PPCI_REGISTRY_INFO_INTERNAL;
00160 
00161 //
00162 // PCI Type 1 Ports
00163 //
00164 #define PCI_TYPE1_ADDRESS_PORT      (PULONG)0xCF8
00165 #define PCI_TYPE1_DATA_PORT         0xCFC
00166 
00167 //
00168 // PCI Type 2 Ports
00169 //
00170 #define PCI_TYPE2_CSE_PORT          (PUCHAR)0xCF8
00171 #define PCI_TYPE2_FORWARD_PORT      (PUCHAR)0xCFA
00172 #define PCI_TYPE2_ADDRESS_BASE      0xC
00173 
00174 //
00175 // PCI Type 1 Configuration Register
00176 //
00177 typedef struct _PCI_TYPE1_CFG_BITS
00178 {
00179     union
00180     {
00181         struct
00182         {
00183             ULONG Reserved1:2;
00184             ULONG RegisterNumber:6;
00185             ULONG FunctionNumber:3;
00186             ULONG DeviceNumber:5;
00187             ULONG BusNumber:8;
00188             ULONG Reserved2:7;
00189             ULONG Enable:1;
00190         } bits;
00191 
00192         ULONG AsULONG;
00193     } u;
00194 } PCI_TYPE1_CFG_BITS, *PPCI_TYPE1_CFG_BITS;
00195 
00196 //
00197 // PCI Type 2 CSE Register
00198 //
00199 typedef struct _PCI_TYPE2_CSE_BITS
00200 {
00201     union
00202     {
00203         struct
00204         {
00205             UCHAR Enable:1;
00206             UCHAR FunctionNumber:3;
00207             UCHAR Key:4;
00208         } bits;
00209 
00210         UCHAR AsUCHAR;
00211     } u;
00212 } PCI_TYPE2_CSE_BITS, PPCI_TYPE2_CSE_BITS;
00213 
00214 //
00215 // PCI Type 2 Address Register
00216 //
00217 typedef struct _PCI_TYPE2_ADDRESS_BITS
00218 {
00219     union
00220     {
00221         struct
00222         {
00223             USHORT RegisterNumber:8;
00224             USHORT Agent:4;
00225             USHORT AddressBase:4;
00226         } bits;
00227 
00228         USHORT AsUSHORT;
00229     } u;
00230 } PCI_TYPE2_ADDRESS_BITS, *PPCI_TYPE2_ADDRESS_BITS;
00231 
00232 typedef struct _PCI_TYPE0_CFG_CYCLE_BITS
00233 {
00234     union
00235     {
00236         struct
00237         {
00238             ULONG Reserved1:2;
00239             ULONG RegisterNumber:6;
00240             ULONG FunctionNumber:3;
00241             ULONG Reserved2:21;
00242         } bits;
00243         ULONG AsULONG;
00244     } u;
00245 } PCI_TYPE0_CFG_CYCLE_BITS, *PPCI_TYPE0_CFG_CYCLE_BITS;
00246 
00247 typedef struct _PCI_TYPE1_CFG_CYCLE_BITS
00248 {
00249     union
00250     {
00251         struct
00252         {
00253             ULONG Reserved1:2;
00254             ULONG RegisterNumber:6;
00255             ULONG FunctionNumber:3;
00256             ULONG DeviceNumber:5;
00257             ULONG BusNumber:8;
00258             ULONG Reserved2:8;
00259         } bits;
00260         ULONG AsULONG;
00261     } u;
00262 } PCI_TYPE1_CFG_CYCLE_BITS, *PPCI_TYPE1_CFG_CYCLE_BITS;
00263 
00264 typedef struct _ARRAY
00265 {
00266     ULONG ArraySize;
00267     PVOID Element[ANYSIZE_ARRAY];
00268 } ARRAY, *PARRAY;
00269 
00270 typedef struct _HAL_BUS_HANDLER
00271 {
00272     LIST_ENTRY AllHandlers;
00273     ULONG ReferenceCount;
00274     BUS_HANDLER Handler;
00275 } HAL_BUS_HANDLER, *PHAL_BUS_HANDLER;
00276 
00277 /* FUNCTIONS *****************************************************************/
00278 
00279 /* SHARED (Fake PCI-BUS HANDLER) */
00280 
00281 extern PCI_CONFIG_HANDLER PCIConfigHandler;
00282 extern PCI_CONFIG_HANDLER PCIConfigHandlerType1;
00283 extern PCI_CONFIG_HANDLER PCIConfigHandlerType2;
00284 
00285 PPCI_REGISTRY_INFO_INTERNAL
00286 NTAPI
00287 HalpQueryPciRegistryInfo(
00288     VOID
00289 );
00290 
00291 VOID
00292 NTAPI
00293 HalpPCISynchronizeType1(
00294     IN PBUS_HANDLER BusHandler,
00295     IN PCI_SLOT_NUMBER Slot,
00296     IN PKIRQL Irql,
00297     IN PPCI_TYPE1_CFG_BITS PciCfg
00298 );
00299 
00300 VOID
00301 NTAPI
00302 HalpPCIReleaseSynchronzationType1(
00303     IN PBUS_HANDLER BusHandler,
00304     IN KIRQL Irql
00305 );
00306 
00307 VOID
00308 NTAPI
00309 HalpPCISynchronizeType2(
00310     IN PBUS_HANDLER BusHandler,
00311     IN PCI_SLOT_NUMBER Slot,
00312     IN PKIRQL Irql,
00313     IN PPCI_TYPE2_ADDRESS_BITS PciCfg
00314 );
00315 
00316 VOID
00317 NTAPI
00318 HalpPCIReleaseSynchronizationType2(
00319     IN PBUS_HANDLER BusHandler,
00320     IN KIRQL Irql
00321 );
00322 
00323 TYPE1_DEFINE(HalpPCIReadUcharType1);
00324 TYPE1_DEFINE(HalpPCIReadUshortType1);
00325 TYPE1_DEFINE(HalpPCIReadUlongType1);
00326 TYPE2_DEFINE(HalpPCIReadUcharType2);
00327 TYPE2_DEFINE(HalpPCIReadUshortType2);
00328 TYPE2_DEFINE(HalpPCIReadUlongType2);
00329 TYPE1_DEFINE(HalpPCIWriteUcharType1);
00330 TYPE1_DEFINE(HalpPCIWriteUshortType1);
00331 TYPE1_DEFINE(HalpPCIWriteUlongType1);
00332 TYPE2_DEFINE(HalpPCIWriteUcharType2);
00333 TYPE2_DEFINE(HalpPCIWriteUshortType2);
00334 TYPE2_DEFINE(HalpPCIWriteUlongType2);
00335 
00336 BOOLEAN
00337 NTAPI
00338 HalpValidPCISlot(
00339     IN PBUS_HANDLER BusHandler,
00340     IN PCI_SLOT_NUMBER Slot
00341 );
00342 
00343 VOID
00344 NTAPI
00345 HalpReadPCIConfig(
00346     IN PBUS_HANDLER BusHandler,
00347     IN PCI_SLOT_NUMBER Slot,
00348     IN PVOID Buffer,
00349     IN ULONG Offset,
00350     IN ULONG Length
00351 );
00352 
00353 VOID
00354 NTAPI
00355 HalpWritePCIConfig(
00356     IN PBUS_HANDLER BusHandler,
00357     IN PCI_SLOT_NUMBER Slot,
00358     IN PVOID Buffer,
00359     IN ULONG Offset,
00360     IN ULONG Length
00361 );
00362 
00363 ULONG
00364 NTAPI
00365 HalpGetPCIData(
00366     IN PBUS_HANDLER BusHandler,
00367     IN PBUS_HANDLER RootBusHandler,
00368     IN PCI_SLOT_NUMBER SlotNumber,
00369     IN PVOID Buffer,
00370     IN ULONG Offset,
00371     IN ULONG Length
00372 );
00373 
00374 ULONG
00375 NTAPI
00376 HalpSetPCIData(
00377     IN PBUS_HANDLER BusHandler,
00378     IN PBUS_HANDLER RootBusHandler,
00379     IN PCI_SLOT_NUMBER SlotNumber,
00380     IN PVOID Buffer,
00381     IN ULONG Offset,
00382     IN ULONG Length
00383 );
00384 
00385 NTSTATUS
00386 NTAPI
00387 HalpAssignPCISlotResources(
00388     IN PBUS_HANDLER BusHandler,
00389     IN PBUS_HANDLER RootHandler,
00390     IN PUNICODE_STRING RegistryPath,
00391     IN PUNICODE_STRING DriverClassName OPTIONAL,
00392     IN PDRIVER_OBJECT DriverObject,
00393     IN PDEVICE_OBJECT DeviceObject OPTIONAL,
00394     IN ULONG Slot,
00395     IN OUT PCM_RESOURCE_LIST *pAllocatedResources
00396 );
00397 
00398 /* NON-LEGACY */
00399 
00400 ULONG
00401 NTAPI
00402 HalpGetSystemInterruptVector_Acpi(
00403     ULONG BusNumber,
00404     ULONG BusInterruptLevel,
00405     ULONG BusInterruptVector,
00406     PKIRQL Irql,
00407     PKAFFINITY Affinity
00408 );
00409 
00410 ULONG
00411 NTAPI
00412 HalpGetCmosData(
00413     IN ULONG BusNumber,
00414     IN ULONG SlotNumber,
00415     IN PVOID Buffer,
00416     IN ULONG Length
00417 );
00418 
00419 ULONG
00420 NTAPI
00421 HalpSetCmosData(
00422     IN ULONG BusNumber,
00423     IN ULONG SlotNumber,
00424     IN PVOID Buffer,
00425     IN ULONG Length
00426 );
00427 
00428 VOID
00429 NTAPI
00430 HalpInitializePciBus(
00431     VOID
00432 );
00433 
00434 VOID
00435 NTAPI
00436 HalpInitializePciStubs(
00437     VOID
00438 );
00439 
00440 BOOLEAN
00441 NTAPI
00442 HalpTranslateBusAddress(
00443     IN INTERFACE_TYPE InterfaceType,
00444     IN ULONG BusNumber,
00445     IN PHYSICAL_ADDRESS BusAddress,
00446     IN OUT PULONG AddressSpace,
00447     OUT PPHYSICAL_ADDRESS TranslatedAddress
00448 );
00449 
00450 NTSTATUS
00451 NTAPI
00452 HalpAssignSlotResources(
00453     IN PUNICODE_STRING RegistryPath,
00454     IN PUNICODE_STRING DriverClassName,
00455     IN PDRIVER_OBJECT DriverObject,
00456     IN PDEVICE_OBJECT DeviceObject,
00457     IN INTERFACE_TYPE BusType,
00458     IN ULONG BusNumber,
00459     IN ULONG SlotNumber,
00460     IN OUT PCM_RESOURCE_LIST *AllocatedResources
00461 );
00462 
00463 BOOLEAN
00464 NTAPI
00465 HalpFindBusAddressTranslation(
00466     IN PHYSICAL_ADDRESS BusAddress,
00467     IN OUT PULONG AddressSpace,
00468     OUT PPHYSICAL_ADDRESS TranslatedAddress,
00469     IN OUT PULONG_PTR Context,
00470     IN BOOLEAN NextBus
00471 );
00472 
00473 VOID
00474 NTAPI
00475 HalpRegisterPciDebuggingDeviceInfo(
00476     VOID
00477 );
00478 
00479 /* LEGACY */
00480 
00481 BOOLEAN
00482 NTAPI
00483 HaliTranslateBusAddress(
00484     IN INTERFACE_TYPE InterfaceType,
00485     IN ULONG BusNumber,
00486     IN PHYSICAL_ADDRESS BusAddress,
00487     IN OUT PULONG AddressSpace,
00488     OUT PPHYSICAL_ADDRESS TranslatedAddress
00489 );
00490 
00491 BOOLEAN
00492 NTAPI
00493 HaliFindBusAddressTranslation(
00494     IN PHYSICAL_ADDRESS BusAddress,
00495     IN OUT PULONG AddressSpace,
00496     OUT PPHYSICAL_ADDRESS TranslatedAddress,
00497     IN OUT PULONG_PTR Context,
00498     IN BOOLEAN NextBus
00499 );
00500 
00501 NTSTATUS
00502 NTAPI
00503 HalpAdjustPCIResourceList(IN PBUS_HANDLER BusHandler,
00504                           IN PBUS_HANDLER RootHandler,
00505                           IN OUT PIO_RESOURCE_REQUIREMENTS_LIST *pResourceList);
00506                           
00507 ULONG
00508 NTAPI
00509 HalpGetPCIIntOnISABus(IN PBUS_HANDLER BusHandler,
00510                       IN PBUS_HANDLER RootHandler,
00511                       IN ULONG BusInterruptLevel,
00512                       IN ULONG BusInterruptVector,
00513                       OUT PKIRQL Irql,
00514                       OUT PKAFFINITY Affinity);
00515 VOID
00516 NTAPI
00517 HalpPCIPin2ISALine(IN PBUS_HANDLER BusHandler,
00518                    IN PBUS_HANDLER RootHandler,
00519                    IN PCI_SLOT_NUMBER SlotNumber,
00520                    IN PPCI_COMMON_CONFIG PciData);
00521         
00522 VOID
00523 NTAPI
00524 HalpPCIISALine2Pin(IN PBUS_HANDLER BusHandler,
00525                    IN PBUS_HANDLER RootHandler,
00526                    IN PCI_SLOT_NUMBER SlotNumber,
00527                    IN PPCI_COMMON_CONFIG PciNewData,
00528                    IN PPCI_COMMON_CONFIG PciOldData);
00529 
00530 NTSTATUS
00531 NTAPI
00532 HalpGetISAFixedPCIIrq(IN PBUS_HANDLER BusHandler,
00533                       IN PBUS_HANDLER RootHandler,
00534                       IN PCI_SLOT_NUMBER PciSlot,
00535                       OUT PSUPPORTED_RANGE *Range);
00536                       
00537 VOID
00538 NTAPI
00539 HalpInitBusHandler(
00540     VOID
00541 );
00542 
00543 PBUS_HANDLER
00544 NTAPI
00545 HalpContextToBusHandler(
00546     IN ULONG_PTR ContextValue
00547 );
00548 
00549 PBUS_HANDLER
00550 FASTCALL
00551 HaliReferenceHandlerForConfigSpace(
00552     IN BUS_DATA_TYPE ConfigType,
00553     IN ULONG BusNumber
00554 );
00555 
00556 ULONG
00557 NTAPI
00558 HalpNoBusData(
00559     IN PBUS_HANDLER BusHandler,
00560     IN PBUS_HANDLER RootHandler,
00561     IN ULONG SlotNumber,
00562     IN PVOID Buffer,
00563     IN ULONG Offset,
00564     IN ULONG Length
00565 );
00566 
00567 ULONG
00568 NTAPI
00569 HalpcGetCmosData(
00570     IN PBUS_HANDLER BusHandler,
00571     IN PBUS_HANDLER RootHandler,
00572     IN ULONG SlotNumber,
00573     IN PVOID Buffer,
00574     IN ULONG Offset,
00575     IN ULONG Length
00576 );
00577 
00578 ULONG
00579 NTAPI
00580 HalpcSetCmosData(
00581     IN PBUS_HANDLER BusHandler,
00582     IN PBUS_HANDLER RootHandler,
00583     IN ULONG SlotNumber,
00584     IN PVOID Buffer,
00585     IN ULONG Offset,
00586     IN ULONG Length
00587 );
00588 
00589 BOOLEAN
00590 NTAPI
00591 HalpTranslateSystemBusAddress(
00592     IN PBUS_HANDLER BusHandler,
00593     IN PBUS_HANDLER RootHandler, 
00594     IN PHYSICAL_ADDRESS BusAddress,
00595     IN OUT PULONG AddressSpace,
00596     OUT PPHYSICAL_ADDRESS TranslatedAddress
00597 );
00598 
00599 BOOLEAN
00600 NTAPI
00601 HalpTranslateIsaBusAddress(
00602     IN PBUS_HANDLER BusHandler,
00603     IN PBUS_HANDLER RootHandler, 
00604     IN PHYSICAL_ADDRESS BusAddress,
00605     IN OUT PULONG AddressSpace,
00606     OUT PPHYSICAL_ADDRESS TranslatedAddress
00607 );
00608 
00609 ULONG
00610 NTAPI
00611 HalpGetSystemInterruptVector(
00612     IN PBUS_HANDLER BusHandler,
00613     IN PBUS_HANDLER RootHandler,
00614     IN ULONG BusInterruptLevel,
00615     IN ULONG BusInterruptVector,
00616     OUT PKIRQL Irql,
00617     OUT PKAFFINITY Affinity
00618 );
00619                      
00620 extern ULONG HalpBusType;
00621 extern BOOLEAN HalpPCIConfigInitialized;
00622 extern BUS_HANDLER HalpFakePciBusHandler;
00623 extern ULONG HalpMinPciBus, HalpMaxPciBus;
00624 extern LIST_ENTRY HalpAllBusHandlers;
00625 
00626 /* EOF */

Generated on Sat May 26 2012 04:27:17 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.