Skip to content

Commit 7b067ac

Browse files
paliLorenzo Pieralisi
authored andcommitted
PCI: pci-bridge-emul: Properly mark reserved PCIe bits in PCI config space
Some bits in PCI config space are reserved when device is PCIe. Properly define behavior of PCI registers for PCIe emulated bridge and ensure that it would not be possible change these reserved bits. Link: https://lore.kernel.org/r/[email protected] Fixes: 23a5fba ("PCI: Introduce PCI bridge emulated config space common logic") Signed-off-by: Pali Rohár <[email protected]> Signed-off-by: Lorenzo Pieralisi <[email protected]> Cc: [email protected]
1 parent 1c1a3b4 commit 7b067ac

File tree

1 file changed

+21
-0
lines changed

1 file changed

+21
-0
lines changed

drivers/pci/pci-bridge-emul.c

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,27 @@ int pci_bridge_emul_init(struct pci_bridge_emul *bridge,
295295
kfree(bridge->pci_regs_behavior);
296296
return -ENOMEM;
297297
}
298+
/* These bits are applicable only for PCI and reserved on PCIe */
299+
bridge->pci_regs_behavior[PCI_CACHE_LINE_SIZE / 4].ro &=
300+
~GENMASK(15, 8);
301+
bridge->pci_regs_behavior[PCI_COMMAND / 4].ro &=
302+
~((PCI_COMMAND_SPECIAL | PCI_COMMAND_INVALIDATE |
303+
PCI_COMMAND_VGA_PALETTE | PCI_COMMAND_WAIT |
304+
PCI_COMMAND_FAST_BACK) |
305+
(PCI_STATUS_66MHZ | PCI_STATUS_FAST_BACK |
306+
PCI_STATUS_DEVSEL_MASK) << 16);
307+
bridge->pci_regs_behavior[PCI_PRIMARY_BUS / 4].ro &=
308+
~GENMASK(31, 24);
309+
bridge->pci_regs_behavior[PCI_IO_BASE / 4].ro &=
310+
~((PCI_STATUS_66MHZ | PCI_STATUS_FAST_BACK |
311+
PCI_STATUS_DEVSEL_MASK) << 16);
312+
bridge->pci_regs_behavior[PCI_INTERRUPT_LINE / 4].rw &=
313+
~((PCI_BRIDGE_CTL_MASTER_ABORT |
314+
BIT(8) | BIT(9) | BIT(11)) << 16);
315+
bridge->pci_regs_behavior[PCI_INTERRUPT_LINE / 4].ro &=
316+
~((PCI_BRIDGE_CTL_FAST_BACK) << 16);
317+
bridge->pci_regs_behavior[PCI_INTERRUPT_LINE / 4].w1c &=
318+
~(BIT(10) << 16);
298319
}
299320

300321
if (flags & PCI_BRIDGE_EMUL_NO_PREFETCHABLE_BAR) {

0 commit comments

Comments
 (0)