From edc7ad409171288fdd52be43e718824060ff795d Mon Sep 17 00:00:00 2001 From: Xiong Zhang Date: Wed, 2 Mar 2022 12:22:16 +0800 Subject: [PATCH] pcie: Fix bridge window's mmio alignment Bridge window's mmio alignment went wrong during our refactor, fix it in this commit. BUG=b:185084350 TEST=Check bridge window and pci device mmio setting in CrOS Change-Id: Ia1a01d1740f943ec7aa36812defe3aabffcfcbde Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/3498219 Reviewed-by: Daniel Verkamp Tested-by: kokoro Commit-Queue: Daniel Verkamp --- devices/src/pci/pcie/pci_bridge.rs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/devices/src/pci/pcie/pci_bridge.rs b/devices/src/pci/pcie/pci_bridge.rs index fa2c11c068..74ee8540a4 100644 --- a/devices/src/pci/pcie/pci_bridge.rs +++ b/devices/src/pci/pcie/pci_bridge.rs @@ -443,7 +443,7 @@ impl PciDevice for PciBridge { } // align window_size to 1MB if window_size & (BR_WINDOW_ALIGNMENT - 1) != 0 { - window_size = (window_size + BR_WINDOW_ALIGNMENT - 1) & BR_WINDOW_ALIGNMENT; + window_size = (window_size + BR_WINDOW_ALIGNMENT - 1) & (!(BR_WINDOW_ALIGNMENT - 1)); } // if window_base isn't set, allocate a new one if window_base == u64::MAX { @@ -467,7 +467,8 @@ impl PciDevice for PciBridge { } else { // align window_base to 1MB if window_base & (BR_WINDOW_ALIGNMENT - 1) != 0 { - window_base = (window_base + BR_WINDOW_ALIGNMENT - 1) & BR_WINDOW_ALIGNMENT; + window_base = + (window_base + BR_WINDOW_ALIGNMENT - 1) & (!(BR_WINDOW_ALIGNMENT - 1)); } } @@ -477,7 +478,8 @@ impl PciDevice for PciBridge { } // align pref_window_size to 1MB if pref_window_size & (BR_WINDOW_ALIGNMENT - 1) != 0 { - pref_window_size = (pref_window_size + BR_WINDOW_ALIGNMENT - 1) & BR_WINDOW_ALIGNMENT; + pref_window_size = + (pref_window_size + BR_WINDOW_ALIGNMENT - 1) & (!(BR_WINDOW_ALIGNMENT - 1)); } // if pref_window_base isn't set, allocate a new one if pref_window_base == u64::MAX { @@ -503,7 +505,8 @@ impl PciDevice for PciBridge { } else { // align pref_window_base to 1MB if pref_window_base & (BR_WINDOW_ALIGNMENT - 1) != 0 { - pref_window_base = (window_base + BR_WINDOW_ALIGNMENT - 1) & BR_WINDOW_ALIGNMENT; + pref_window_base = + (window_base + BR_WINDOW_ALIGNMENT - 1) & (!(BR_WINDOW_ALIGNMENT - 1)); } }