27 Base = PciData->u.type1.IOBase;
30 Is32Bit = (
Base & 0xF) == 1;
31 IoBase = (
Base & 0xF0) << 8;
37 IoBase |= PciData->u.type1.IOBaseUpper16 << 16;
38 ASSERT(PciData->u.type1.IOLimit & 0x1);
54 Limit = PciData->u.type1.IOLimit;
57 Is32Bit = (
Limit & 0xF) == 1;
58 IoLimit = (
Limit & 0xF0) << 8;
64 IoLimit |= PciData->u.type1.IOLimitUpper16 << 16;
65 ASSERT(PciData->u.type1.IOBase & 0x1);
69 return IoLimit | 0xFFF;
79 return (PciData->u.type1.MemoryBase << 16);
89 return (PciData->u.type1.MemoryLimit << 16) | 0xFFFFF;
102 PrefetchBase = PciData->u.type1.PrefetchBase;
105 Is64Bit = (PrefetchBase & 0xF) == 1;
107 Base.LowPart = ((PrefetchBase & 0xFFF0) << 16);
113 Base.HighPart = PciData->u.type1.PrefetchBaseUpper32;
130 PrefetchLimit = PciData->u.type1.PrefetchLimit;
133 Is64Bit = (PrefetchLimit & 0xF) == 1;
135 Limit.LowPart = (PrefetchLimit << 16) | 0xFFFFF;
141 Limit.HighPart = PciData->u.type1.PrefetchLimitUpper32;
191 (Current->ProgIf != 1) &&
192 ((PciData->u.type1.IOLimit & 0xF0) == 0xF0))
195 DPRINT(
"PCIX - Subtractive decode does not seem to be enabled\n");
214 DPRINT1(
"PCIX - Putting bridge in positive decode because of PDEC\n");
220 DPRINT1(
"PCIX - Subtractive decode on 0x%x\n", Current->u.type1.SecondaryBus);
256 BarArray = Current->u.type1.BaseAddresses;
257 for (
i = 0;
i < 6;
i++)
264 CmDescriptor->
Type = IoDescriptor->
Type;
279 Bar = Current->u.type1.ROMBaseAddress;
284 DPRINT1(
"PCIX - ROM BAR Base: %lx\n",
Base.LowPart);
310 Base.HighPart = BarArray[
i + 1];
332 DPRINT1(
"PCIX - Bridge I/O Base and Limit: %lx %lx\n",
336 if (!(
Base.LowPart) && (Current->u.type1.IOLimit))
349 DPRINT1(
"PCIX - Bridge MEM Base and Limit: %lx %lx\n",
361 DPRINT1(
"PCIX - Bridge Prefetch MEM Base and Limit: %I64x %I64x\n",
Base,
Limit);
375 if (!(
Base.QuadPart) && !(HaveIoLimit))
390 DPRINT1(
"PCIX - Bridge prefetch limit %I64x has junk in its upper half\n",
413 IoDescriptor->
u.
Memory.Alignment = 0x80000000;
417 IoDescriptor->
u.
Memory.Alignment =
428 PdoExtension->Dependent.type1.PrimaryBus = Current->u.type1.PrimaryBus;
429 PdoExtension->Dependent.type1.SecondaryBus = Current->u.type1.SecondaryBus;
430 PdoExtension->Dependent.type1.SubordinateBus = Current->u.type1.SubordinateBus;
436 DPRINT1(
"PCIX - Subtractive decode bridge\n");
440 DPRINT1(
"PCIX - VGA Bridge\n");
453 DPRINT1(
"PCIX - VGA Bridge\n");
464 DPRINT1(
"PCIX - ISA Bridge\n");
484 DPRINT1(
"PCIX - apply config save hack to ICH subtractive decode\n");
486 PdoExtension->ParentFdoExtension->PreservedConfig = SavedConfig;
508 BarArray =
Working->u.type1.BaseAddresses;
547 (&
Limit[
i])->
u.Port.MinimumAddress.QuadPart = 0;
561 (&
Limit[
i])->
u.Port.Alignment = 0x1000;
562 (&
Limit[
i])->u.Port.MinimumAddress.QuadPart = 0;
563 (&
Limit[
i])->
u.Port.MaximumAddress = MemoryLimit;
564 (&
Limit[
i])->
u.Port.Length = 0;
575 (&
Limit[
i])->
u.Memory.Alignment = 0x100000;
576 (&
Limit[
i])->u.Memory.MinimumAddress.QuadPart = 0;
577 (&
Limit[
i])->
u.Memory.MaximumAddress = MemoryLimit;
578 (&
Limit[
i])->
u.Memory.Length = 0;
580 else if (
Working->u.type1.PrefetchLimit)
588 (&
Limit[
i])->
u.Memory.Alignment = 0x100000;
589 (&
Limit[
i])->u.Memory.MinimumAddress.QuadPart = 0;
590 (&
Limit[
i])->
u.Memory.MaximumAddress = MemoryLimit;
591 (&
Limit[
i])->
u.Memory.Length = 0;
630 PciData->u.type1.PrimaryBus = Current->u.type1.PrimaryBus;
631 PciData->u.type1.SecondaryBus = Current->u.type1.SecondaryBus;
632 PciData->u.type1.SubordinateBus = Current->u.type1.SubordinateBus;
633 PciData->u.type1.SecondaryLatency = Current->u.type1.SecondaryLatency;
636 PciData->u.type1.IOBaseUpper16 = 0xFFFE;
637 PciData->u.type1.IOLimitUpper16 = 0xFFFF;
640 Context->SecondaryStatus = Current->u.type1.SecondaryStatus;
643 Current->u.type1.SecondaryStatus = 0;
644 PciData->u.type1.SecondaryStatus = 0;
652 Context->Current->u.type1.SecondaryStatus =
Context->SecondaryStatus;
669 IoDescriptor->u.DevicePrivate.Data[0] = 3;
670 IoDescriptor->u.DevicePrivate.Data[1] = 3;
675 IoDescriptor[1].u.Port.Length = 0x20000;
676 IoDescriptor[1].u.Port.Alignment = 1;
677 IoDescriptor[1].u.Port.MinimumAddress.QuadPart = 0xA0000;
678 IoDescriptor[1].u.Port.MaximumAddress.QuadPart = 0xBFFFF;
684 IoDescriptor[2].u.Port.Length = 12;
685 IoDescriptor[2].u.Port.Alignment = 1;
686 IoDescriptor[2].u.Port.MinimumAddress.QuadPart = 0x3B0;
687 IoDescriptor[2].u.Port.MaximumAddress.QuadPart = 0x3BB;
693 IoDescriptor[3].u.Port.Length = 32;
694 IoDescriptor[3].u.Port.Alignment = 1;
695 IoDescriptor[3].u.Port.MinimumAddress.QuadPart = 0x3C0;
696 IoDescriptor[3].u.Port.MaximumAddress.QuadPart = 0x3DF;
708 PciData->u.type1.BridgeControl &= ~PCI_ASSERT_BRIDGE_RESET;
759 PciData->u.type1.IOBase = (
UCHAR)((
First >> 8) & 0xF0);
760 PciData->u.type1.IOLimit = (
UCHAR)((Last >> 8) & 0xF0);
761 PciData->u.type1.IOBaseUpper16 = (
USHORT)(
First >> 16);
762 PciData->u.type1.IOLimitUpper16 = (
USHORT)(Last >> 16);
767 PciData->u.type1.MemoryBase = (
USHORT)((
First >> 16) & 0xFFF0);
768 PciData->u.type1.MemoryLimit = (
USHORT)((Last >> 16) & 0xFFF0);
773 PciData->u.type1.PrefetchBase = (
USHORT)((
First >> 16) & 0xFFF0);
774 PciData->u.type1.PrefetchLimit = (
USHORT)((Last >> 16) & 0xFFF0);
775 PciData->u.type1.PrefetchBaseUpper32 = (
ULONG)(
First >> 32);
776 PciData->u.type1.PrefetchLimitUpper32 = (
ULONG)(Last >> 32);
804 PciData->u.type1.IOBase = SavedHeader->u.type1.IOBase;
805 PciData->u.type1.IOLimit = SavedHeader->u.type1.IOLimit;
806 PciData->u.type1.IOBaseUpper16 = SavedHeader->u.type1.IOBaseUpper16;
807 PciData->u.type1.IOLimitUpper16 = SavedHeader->u.type1.IOLimitUpper16;
814 PciData->u.type1.MemoryBase = SavedHeader->u.type1.MemoryBase;
815 PciData->u.type1.MemoryLimit = SavedHeader->u.type1.MemoryLimit;
822 PciData->u.type1.PrefetchBase = SavedHeader->u.type1.PrefetchBase;
823 PciData->u.type1.PrefetchLimit = SavedHeader->u.type1.PrefetchLimit;
824 PciData->u.type1.PrefetchBaseUpper32 = SavedHeader->u.type1.PrefetchBaseUpper32;
825 PciData->u.type1.PrefetchLimitUpper32 = SavedHeader->u.type1.PrefetchLimitUpper32;
847 PciData->u.type1.MemoryBase = 0xFFFF;
848 PciData->u.type1.PrefetchBase = 0xFFFF;
849 PciData->u.type1.IOBase = 0xFF;
850 PciData->u.type1.IOLimit = 0;
851 PciData->u.type1.MemoryLimit = 0;
852 PciData->u.type1.PrefetchLimit = 0;
853 PciData->u.type1.PrefetchBaseUpper32 = 0;
854 PciData->u.type1.PrefetchLimitUpper32 = 0;
855 PciData->u.type1.IOBaseUpper16 = 0;
856 PciData->u.type1.IOLimitUpper16 = 0;
860 if ((
PdoExtension->Dependent.type1.SubtractiveDecode) &&
868 SavedConfig =
PdoExtension->ParentFdoExtension->PreservedConfig;
879 BarArray = PciData->u.type1.BaseAddresses;
880 for (
i = 0;
i < 6;
i++)
886 CmDescriptor = &PciResources->
Current[
i];
900 BarArray[
i] = (
Bar & ~BarMask) | (
Address.LowPart & BarMask);
918 Bar = PciData->u.type1.ROMBaseAddress &
926 PciData->u.type1.ROMBaseAddress =
Bar;
932 PciData->u.type1.PrimaryBus =
PdoExtension->Dependent.type1.PrimaryBus;
933 PciData->u.type1.SecondaryBus =
PdoExtension->Dependent.type1.SecondaryBus;
934 PciData->u.type1.SubordinateBus =
PdoExtension->Dependent.type1.SubordinateBus;
ULONGLONG NTAPI RtlCmDecodeMemIoResource(_In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor, _Out_opt_ PULONGLONG Start)
_In_ D3DDDI_VIDEO_PRESENT_TARGET_ID _In_ ULONG _In_ ULONG Flags
#define NT_SUCCESS(StatCode)
BOOLEAN NTAPI PciIsSlotPresentInParentMethod(IN PPCI_PDO_EXTENSION PdoExtension, IN ULONG Method)
NTSTATUS NTAPI PciGetBiosConfig(IN PPCI_PDO_EXTENSION DeviceExtension, OUT PPCI_COMMON_HEADER PciData)
#define TAG_PCI_PRESERVED
BOOLEAN NTAPI PciCreateIoDescriptorFromBarLimit(_Out_ PIO_RESOURCE_DESCRIPTOR ResourceDescriptor, _In_ ULONG Bar, _In_ ULONG NextBar, _In_ BOOLEAN Rom)
Builds the requirement of a BAR from the value it reads back after all ones were written to it.
#define ExAllocatePoolWithTag(hernya, size, tag)
union Alignment_ Alignment
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
#define CM_RESOURCE_PORT_POSITIVE_DECODE
#define CM_RESOURCE_MEMORY_PREFETCHABLE
#define CM_RESOURCE_PORT_WINDOW_DECODE
#define CM_RESOURCE_MEMORY_READ_WRITE
#define CM_RESOURCE_MEMORY_LARGE_48_MAXLEN
#define CM_RESOURCE_PORT_10_BIT_DECODE
#define UNREFERENCED_PARAMETER(P)
_In_ ULONG _In_ ULONG _In_ ULONG Length
VOID NTAPI PPBridge_SaveCurrentSettings(IN PPCI_CONFIGURATOR_CONTEXT Context)
PHYSICAL_ADDRESS NTAPI PciBridgePrefetchMemoryBase(IN PPCI_COMMON_HEADER PciData)
VOID NTAPI PPBridge_GetAdditionalResourceDescriptors(IN PPCI_CONFIGURATOR_CONTEXT Context, IN PPCI_COMMON_HEADER PciData, IN PIO_RESOURCE_DESCRIPTOR IoDescriptor)
BOOLEAN NTAPI PciBridgeIsSubtractiveDecode(IN PPCI_CONFIGURATOR_CONTEXT Context)
ULONG NTAPI PciBridgeMemoryWorstCaseAlignment(IN ULONG Length)
static VOID NTAPI PciBridgeRestoreOpenWindows(_Inout_ PPCI_COMMON_HEADER PciData, _In_ PPCI_COMMON_HEADER SavedHeader)
Copies back the windows that were open in a bridge header saved before enumeration.
PHYSICAL_ADDRESS NTAPI PciBridgePrefetchMemoryLimit(IN PPCI_COMMON_HEADER PciData)
VOID NTAPI PPBridge_RestoreCurrent(IN PPCI_CONFIGURATOR_CONTEXT Context)
VOID NTAPI PPBridge_MassageHeaderForLimitsDetermination(IN PPCI_CONFIGURATOR_CONTEXT Context)
BOOLEAN NTAPI PciBridgeIsPositiveDecode(IN PPCI_PDO_EXTENSION PdoExtension)
static VOID NTAPI PciBridgeOpenWindow(_Inout_ PPCI_COMMON_HEADER PciData, _In_ ULONG Index, _In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR Window)
Opens one forwarding window of a bridge over the range assigned to it.
VOID NTAPI PPBridge_SaveLimits(IN PPCI_CONFIGURATOR_CONTEXT Context)
ULONG NTAPI PciBridgeIoBase(IN PPCI_COMMON_HEADER PciData)
ULONG NTAPI PciBridgeMemoryLimit(IN PPCI_COMMON_HEADER PciData)
VOID NTAPI PPBridge_ResetDevice(IN PPCI_PDO_EXTENSION PdoExtension, IN PPCI_COMMON_HEADER PciData)
ULONG NTAPI PciBridgeIoLimit(IN PPCI_COMMON_HEADER PciData)
NTSTATUS NTAPI PPBridge_ChangeResourceSettings(_In_ PPCI_PDO_EXTENSION PdoExtension, _Inout_ PPCI_COMMON_HEADER PciData)
ULONG NTAPI PciBridgeMemoryBase(IN PPCI_COMMON_HEADER PciData)
#define RtlFillMemory(Dest, Length, Fill)
#define CmResourceTypeNull
#define CmResourceTypeMemory
#define CmResourceTypeDevicePrivate
#define CmResourceTypePort
#define PCI_ENABLE_BRIDGE_VGA
#define PCI_HACK_SUBTRACTIVE_DECODE
#define PCI_ENABLE_BRIDGE_ISA
#define PCI_HACK_BROKEN_SUBTRACTIVE_DECODE
union _CM_PARTIAL_RESOURCE_DESCRIPTOR::@494 u
struct _CM_PARTIAL_RESOURCE_DESCRIPTOR::@494::@499 Memory
struct _CM_PARTIAL_RESOURCE_DESCRIPTOR::@494::@495 Generic
struct _IO_RESOURCE_DESCRIPTOR::@2498::@2503 Generic
union _IO_RESOURCE_DESCRIPTOR::@2498 u
struct _IO_RESOURCE_DESCRIPTOR::@2498::@2500 Memory
IO_RESOURCE_DESCRIPTOR Limit[7]
CM_PARTIAL_RESOURCE_DESCRIPTOR Current[7]
#define FIELD_OFFSET(t, f)
#define RtlCopyMemory(Destination, Source, Length)
struct _LARGE_INTEGER::@2753 u
_In_ WDFCOLLECTION _In_ ULONG Index
#define CmResourceTypeMemoryLarge
#define PCI_ADDRESS_IO_ADDRESS_MASK
#define PCI_ENABLE_IO_SPACE
#define PCI_SUBCLASS_BR_PCI_TO_PCI
#define PCI_ADDRESS_IO_SPACE
#define PCI_CONFIGURATION_TYPE(PciData)
#define PCI_ENABLE_MEMORY_SPACE
#define PCI_TYPE1_ADDRESSES
#define PCI_ADDRESS_ROM_ADDRESS_MASK
#define PCI_ADDRESS_MEMORY_ADDRESS_MASK
#define PCI_COMMON_HDR_LENGTH
#define PCI_CLASS_BRIDGE_DEV
#define PCI_ROMADDRESS_ENABLED
#define PCI_ADDRESS_MEMORY_TYPE_MASK
_In_ LONG _In_ LONG Limit
NTSYSAPI NTSTATUS NTAPI RtlCmEncodeMemIoResource(_In_ PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor, _In_ UCHAR Type, _In_ ULONGLONG Length, _In_ ULONGLONG Start)