On Thu, Jul 22, 2021 at 11:47:06AM -0700, Patel, Nirmal wrote: > On 7/20/2021 3:42 PM, Bjorn Helgaas wrote: > > On Tue, Jul 20, 2021 at 01:50:09PM -0700, Nirmal Patel wrote: > >> In order to properly re-initialize the VMD domain during repetitive driver > >> attachment or reboot tests, ensure that the VMD root ports are re-initialized > >> to a blank state that can be re-enumerated appropriately by the PCI core. > >> This is performed by re-initializing all of the bridge windows to ensure > >> that PCI core enumeration does not detect potentially invalid bridge windows > >> and misinterpret them as firmware-assigned windows, when they simply may be > >> invalid bridge window information from a previous boot. > >> +static void vmd_domain_reset_windows(struct vmd_dev *vmd) > >> +{ > >> + u8 hdr_type; > >> + char __iomem *addr; > >> + int dev_seq; > >> + u8 functions; > >> + u8 fn_seq; > >> + int max_devs = resource_size(&vmd->resources[0]) * 32; > >> + > >> + for (dev_seq = 0; dev_seq < max_devs; dev_seq++) { > >> + addr = VMD_DEVICE_BASE(vmd, dev_seq) + PCI_VENDOR_ID; > >> + if (readw(addr) != PCI_VENDOR_ID_INTEL) > >> + continue; > >> + > >> + addr = VMD_DEVICE_BASE(vmd, dev_seq) + PCI_HEADER_TYPE; > >> + hdr_type = readb(addr) & PCI_HEADER_TYPE_MASK; > >> + if (hdr_type != PCI_HEADER_TYPE_BRIDGE) > >> + continue; > >> + > >> + functions = !!(hdr_type & 0x80) ? 8 : 1; > >> + for (fn_seq = 0; fn_seq < functions; fn_seq++) > >> + { > > > > Looks quite parallel to vmd_domain_sbr(), except that here we iterate > > through functions as well. Why does vmd_domain_sbr() not need to > > iterate through functions? > > I am not sure if there is VMD hardware with non zero functions. I'm not sure either ;) Hopefully you can resolve this one way or the other. It would be good to either make them the same or add a comment about why they are different. Otherwise it just looks like a possible bug.