summaryrefslogtreecommitdiffstats
path: root/MdeModulePkg
diff options
context:
space:
mode:
authorxueshengfeng <xueshengfeng@byosoft.com.cn>2021-09-24 14:30:45 +0800
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>2021-09-26 02:43:46 +0000
commit46b4606ba23498d3d0e66b53e498eb3d5d592586 (patch)
treec01285a999c8142da89ff89b147e9a386f89f59a /MdeModulePkg
parentd60915b7516c87ec49ad579a1cb8ff9226d85928 (diff)
downloadedk2-46b4606ba23498d3d0e66b53e498eb3d5d592586.tar.gz
edk2-46b4606ba23498d3d0e66b53e498eb3d5d592586.tar.bz2
edk2-46b4606ba23498d3d0e66b53e498eb3d5d592586.zip
MdeModulePkg/PciBusDxe: Improve the flow of testing support attributes
https://bugzilla.tianocore.org/show_bug.cgi?id=3635 Currently, in order to test the supported attributes, the PciTestSupportedAttribute() will set the command register to 0x27 (EFI_PCI_COMMAND_IO_SPACE, EFI_PCI_COMMAND_MEMORY_SPACE, EFI_PCI_COMMAND_BUS_MASTER, EFI_PCI_COMMAND_VGA_PALETTE_SNOOP) firstly, and then read back to check whether these attributes are set successfully in the device. This will cause the other enabled bits (other than EFI_PCI_COMMAND_IO_SPACE,EFI_PCI_COMMAND_MEMORY_SPACE, EFI_PCI_COMMAND_BUS_MASTER,EFI_PCI_COMMAND_VGA_PALETTE_SNOOP) be cleared for a short of time This patch fixes this issue by keeping the origina enabled bits when setting 0x27. Signed-off-by: xueshengfeng <xueshengfeng@byosoft.com.cn> Reviewed-by: Ray <ray.ni@intel.com>
Diffstat (limited to 'MdeModulePkg')
-rw-r--r--MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c b/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c
index db1b35f8ef..3a238d4e46 100644
--- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c
+++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c
@@ -933,6 +933,7 @@ PciTestSupportedAttribute (
)
{
EFI_TPL OldTpl;
+ UINT16 CommandValue;
//
// Preserve the original value
@@ -943,10 +944,12 @@ PciTestSupportedAttribute (
// Raise TPL to high level to disable timer interrupt while the BAR is probed
//
OldTpl = gBS->RaiseTPL (TPL_HIGH_LEVEL);
+ CommandValue = *Command | *OldCommand;
- PCI_SET_COMMAND_REGISTER (PciIoDevice, *Command);
- PCI_READ_COMMAND_REGISTER (PciIoDevice, Command);
+ PCI_SET_COMMAND_REGISTER (PciIoDevice, CommandValue);
+ PCI_READ_COMMAND_REGISTER (PciIoDevice, &CommandValue);
+ *Command = *Command & CommandValue;
//
// Write back the original value
//