📄 config.c
字号:
}
DeviceFlags = AgpGetDeviceFlags(AgpGlobalHackTable,
PciConfig->VendorID,
PciConfig->DeviceID,
SubVendorID,
SubSystemID,
PciConfig->RevisionID);
DeviceFlags |= AgpGetDeviceFlags(AgpDeviceHackTable,
PciConfig->VendorID,
PciConfig->DeviceID,
SubVendorID,
SubSystemID,
PciConfig->RevisionID);
if (DeviceFlags & AGP_FLAG_NO_1X_RATE) {
Capability->AGPStatus.Rate &= ~PCI_AGP_RATE_1X;
AGPLOG(AGP_WARNING,
("AGP HAMMER CAPS: NO_1X_RATE Vendor %x, Device %x.\n",
PciConfig->VendorID,
PciConfig->DeviceID));
}
if (DeviceFlags & AGP_FLAG_NO_2X_RATE) {
Capability->AGPStatus.Rate &= ~PCI_AGP_RATE_2X;
AGPLOG(AGP_WARNING,
("AGP HAMMER CAPS: NO_2X_RATE Vendor %x, Device %x.\n",
PciConfig->VendorID,
PciConfig->DeviceID));
}
if (DeviceFlags & AGP_FLAG_NO_4X_RATE) {
Capability->AGPStatus.Rate &= ~PCI_AGP_RATE_4X;
AGPLOG(AGP_WARNING,
("AGP HAMMER CAPS: NO_4X_RATE Vendor %x, Device %x.\n",
PciConfig->VendorID,
PciConfig->DeviceID));
}
if (DeviceFlags & AGP_FLAG_NO_8X_RATE) {
Capability->AGPStatus.Rate &= ~8;
AGPLOG(AGP_WARNING,
("AGP HAMMER CAPS: NO_8X_RATE Vendor %x, Device %x.\n",
PciConfig->VendorID,
PciConfig->DeviceID));
}
if (DeviceFlags & AGP_FLAG_NO_SBA_ENABLE) {
Capability->AGPStatus.SideBandAddressing = 0;
AGPLOG(AGP_WARNING,
("AGP HAMMER CAPS: NO_SBA_ENABLE Vendor %x, Device %x.\n",
PciConfig->VendorID,
PciConfig->DeviceID));
}
if (DeviceFlags & AGP_FLAG_REVERSE_INITIALIZATION) {
AGPLOG(AGP_WARNING,
("AGP GLOBAL HACK: REVERSE_INITIALIZATION Vendor %x, "
"Device %x.\n",
PciConfig->VendorID,
PciConfig->DeviceID));
}
//
// Test if this device requires any platform specific AGP tweaks
//
if (DoSpecial && (DeviceFlags > AGP_FLAG_SPECIAL_TARGET) ||
(DeviceFlags & AGP_FLAG_REVERSE_INITIALIZATION)) {
AgpSpecialTarget(GET_AGP_CONTEXT_FROM_MASTER((PMASTER_EXTENSION)Context), ((DeviceFlags & ~AGP_FLAG_SPECIAL_TARGET) | (DeviceFlags & AGP_FLAG_REVERSE_INITIALIZATION)));
}
AGPLOG(AGP_NOISE,
("AGP CAPABILITY: version %d.%d\n",Capability->Major, Capability->Minor));
AGPLOG(AGP_NOISE,
("\tSTATUS - Rate: %x SBA: %x RQ: %02x\n",
Capability->AGPStatus.Rate,
Capability->AGPStatus.SideBandAddressing,
Capability->AGPStatus.RequestQueueDepthMaximum));
AGPLOG(AGP_NOISE,
("\tCOMMAND - Rate: %x SBA: %x RQ: %02x AGPEnable: %x\n",
Capability->AGPCommand.Rate,
Capability->AGPCommand.SBAEnable,
Capability->AGPCommand.RequestQueueDepth,
Capability->AGPCommand.AGPEnable));
return(STATUS_SUCCESS);
}
NTSTATUS
AgpLibGetTargetCapability(
IN PVOID AgpExtension,
OUT PPCI_AGP_CAPABILITY Capability
)
/*++
Routine Description:
Retrieves the AGP capability for the AGP target (AGP bridge)
Arguments:
AgpExtension - Supplies the AGP extension
Capability - Returns the AGP capability
Return Value:
NTSTATUS
--*/
{
PTARGET_EXTENSION Extension;
GET_TARGET_EXTENSION(Extension, AgpExtension);
return(AgpLibGetAgpCapability(ApGetSetDeviceBusData,
Extension,
FALSE,
Capability));
}
NTSTATUS
AgpLibGetMasterCapability(
IN PVOID AgpExtension,
OUT PPCI_AGP_CAPABILITY Capability
)
/*++
Routine Description:
Retrieves the AGP capability for the AGP master (graphics card)
Arguments:
AgpExtension - Supplies the AGP extension
Capability - Returns the AGP capability
Return Value:
NTSTATUS
--*/
{
PMASTER_EXTENSION Extension;
GET_MASTER_EXTENSION(Extension, AgpExtension);
return(AgpLibGetAgpCapability(ApGetSetDeviceBusData,
Extension,
TRUE,
Capability));
}
NTSTATUS
AgpLibGetPciDeviceCapability(
IN ULONG BusId,
IN ULONG SlotId,
OUT PPCI_AGP_CAPABILITY Capability
)
/*++
Routine Description:
Retrieves the AGP capability for the specified PCI slot.
Caller is responsible for figuring out what the correct
Bus/Slot ID is. These are just passed right to HalGetBusData.
Arguments:
BusId - supplies the bus id
SlotId - Supplies the slot id
Capability - Returns the AGP capability
Return Value:
NTSTATUS
--*/
{
BUS_SLOT_ID BusSlotId;
BusSlotId.BusId = BusId;
BusSlotId.SlotId = SlotId;
return(AgpLibGetAgpCapability(ApGetSetBusData,
&BusSlotId,
FALSE,
Capability));
}
NTSTATUS
AgpLibSetAgpCapability(
IN PAGP_GETSET_CONFIG_SPACE pConfigFn,
IN PVOID Context,
OUT PPCI_AGP_CAPABILITY Capability
)
/*++
Routine Description:
This routine finds and retrieves the AGP capabilities in the
PCI config space of the AGP master (graphics card).
Arguments:
pConfigFn - Supplies the function to call for accessing config space
on the appropriate device.
Context - Supplies the context to pass to pConfigFn
Capabilities - Returns the current AGP Capabilities
Return Value:
NTSTATUS
--*/
{
NTSTATUS Status;
UCHAR CapabilityOffset;
Status = ApFindAgpCapability(pConfigFn,
Context,
Capability,
&CapabilityOffset,
NULL);
if (!NT_SUCCESS(Status)) {
return(Status);
}
//
// Now that we know the offset, write the supplied command register
//
Status = (pConfigFn)(Context,
FALSE,
&Capability->AGPCommand,
CapabilityOffset + FIELD_OFFSET(PCI_AGP_CAPABILITY, AGPCommand),
sizeof(Capability->AGPCommand));
if (!NT_SUCCESS(Status)) {
AGPLOG(AGP_CRITICAL,
("AgpLibSetAgpCapability - Set AGP command at offset %x for Context %08lx failed %08lx\n",
CapabilityOffset,
Context,
Status));
return(Status);
}
return(STATUS_SUCCESS);
}
NTSTATUS
AgpLibSetTargetCapability(
IN PVOID AgpExtension,
OUT PPCI_AGP_CAPABILITY Capability
)
/*++
Routine Description:
Sets the AGP capability for the AGP target (AGP bridge)
Arguments:
AgpExtension - Supplies the AGP extension
Capability - Returns the AGP capability
Return Value:
NTSTATUS
--*/
{
PTARGET_EXTENSION Extension;
GET_TARGET_EXTENSION(Extension, AgpExtension);
return(AgpLibSetAgpCapability(ApGetSetDeviceBusData,
Extension,
Capability));
}
NTSTATUS
AgpLibSetMasterCapability(
IN PVOID AgpExtension,
OUT PPCI_AGP_CAPABILITY Capability
)
/*++
Routine Description:
Sets the AGP capability for the AGP master (graphics card)
Arguments:
AgpExtension - Supplies the AGP extension
Capability - Returns the AGP capability
Return Value:
NTSTATUS
--*/
{
PMASTER_EXTENSION Extension;
GET_MASTER_EXTENSION(Extension, AgpExtension);
return(AgpLibSetAgpCapability(ApGetSetDeviceBusData,
Extension,
Capability));
}
NTSTATUS
AgpLibSetPciDeviceCapability(
IN ULONG BusId,
IN ULONG SlotId,
OUT PPCI_AGP_CAPABILITY Capability
)
/*++
Routine Description:
Sets the AGP capability for the specified PCI slot.
Caller is responsible for figuring out what the correct
Bus/Slot ID is. These are just passed right to HalSetBusData.
Arguments:
BusId - supplies the bus id
SlotId - Supplies the slot id
Capability - Returns the AGP capability
Return Value:
NTSTATUS
--*/
{
BUS_SLOT_ID BusSlotId;
BusSlotId.BusId = BusId;
BusSlotId.SlotId = SlotId;
return(AgpLibSetAgpCapability(ApGetSetBusData,
&BusSlotId,
Capability));
}
NTSTATUS
AgpLibGetMasterDeviceId(
IN PVOID AgpExtension,
OUT PULONG DeviceId
)
/*++
Routine Description:
This function returns the PCI DeviceId/Vendo58rId of the master AGP
device
Arguments:
DeviceId - Identifies PCI manufaturer and device of master
Return Value:
STATUS_SUCCESS or an appropriate error status
--*/
{
PCI_COMMON_HEADER Header;
PPCI_COMMON_CONFIG PciConfig = (PPCI_COMMON_CONFIG)&Header;
NTSTATUS Status;
PMASTER_EXTENSION Master = NULL;
PTARGET_EXTENSION Target = NULL;
//
// Try to make this as idiot proof as possible for the case
// where this is called from SetAperture on a system without
// an AGP adapter, so we don't AV if some context hasn't been
// initialized, or is missing...
//
Target = CONTAINING_RECORD(AgpExtension,
TARGET_EXTENSION,
AgpContext);
if (Target) {
if (Target->CommonExtension.Signature == TARGET_SIG) {
if (Target->ChildDevice) {
if (Target->ChildDevice->CommonExtension.Signature ==
MASTER_SIG) {
Master = Target->ChildDevice;
}
}
}
}
if (Master) {
//
// Read the PCI common header to get the capabilities pointer
//
Status = (ApGetSetDeviceBusData)((PCOMMON_EXTENSION)Master,
TRUE,
PciConfig,
0,
sizeof(PCI_COMMON_HEADER));
if (!NT_SUCCESS(Status)) {
AGPLOG(AGP_CRITICAL,
("AgpLibGetMasterDeviceId - read PCI Config space for Context %08lx failed %08lx\n",
Master,
Status));
return Status;
}
*DeviceId = *(PULONG)PciConfig;
} else {
*DeviceId = (ULONG)-1;
}
return STATUS_SUCCESS;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -