From mboxrd@z Thu Jan 1 00:00:00 1970 From: Zhou Wang Subject: Re: [RFC PATCH v1 1/3] PCI: designware: Add ARM64 support Date: Wed, 27 May 2015 21:24:40 +0800 Message-ID: <5565C598.7020809@hisilicon.com> References: <000001d096a9$27bf43f0$773dcbd0$@com> <5562F0C9.4090007@hisilicon.com> <000001d096f1$93dca4e0$bb95eea0$@com> <5563451B.4050609@st.com> <5563DF4F.4080601@hisilicon.com> <556428C9.9080202@st.com> Mime-Version: 1.0 Content-Type: text/plain; charset="windows-1252" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <556428C9.9080202@st.com> Sender: linux-pci-owner@vger.kernel.org To: Fabrice Gasnier Cc: Jingoo Han , zhudacai@hisilicon.com, devicetree@vger.kernel.org, 'Gabriele Paoloni' , 'Arnd Bergmann' , 'Richard Zhu' , linux-pci@vger.kernel.org, 'Pratyush Anand' , 'Liviu Dudau' , 'Zhichang Yuan' , 'Kishon Vijay Abraham I' , qiuzhenfa@hisilicon.com, 'Bjorn Helgaas' , 'Zhang Jukuo' , 'Liguozhu' , linux-arm-kernel@lists.infradead.org, 'Lucas Stach' List-Id: devicetree@vger.kernel.org On 2015/5/26 16:03, Fabrice Gasnier wrote: > Hi zhou, > > On 05/26/2015 04:49 AM, Zhou Wang wrote: >>> struct pcie_port { >>> >+#ifdef CONFIG_ARM >>> >+ /* >>> >+ * this is a temporary hack to let the driver work on >>> >+ * both arm32 and arm64. it can be removed after the >>> >+ * arm32 cleanup is complete and bios32.c has stopped >>> >+ * referencing host->pci_sys_data. >>> >+ */ >>> >+ struct pci_sys_data dummy; >>> >+#endif >>> > struct device *dev; >>> > >>> > >>> >This looks like necessary as bios32 is dereferencing sysdata: >>> >struct pci_sys_data *sysdata = dev->bus->sysdata; >>> > >>> >Best Regards, >>> >Fabrice >>> > >> Hi Fabrice, >> >> Firstly, many thanks for your test:) >> >> I am a little confused that pci_sys_data is still needed as we don't use the code >> in bios32. What was the problem you met? Could you share me more information? Then >> let's see how to solve the problem. > > This is not completely true: there is still code in bios32 that requires pci_sys_data. Right. > No matters pci_common_init_dev() is being called or not : > > You can see pcibios_msi_controller() has a weak definition (in drivers/pci/msi.c). > But bios32 defines it for arm. Then it's being used. But here in dw_pcie_host_init, I directly set bus->msi = &dw_pcie_msi_chip. So in drivers/pci/msi.c, we will get the msi controller by dev->bus->msi in pci_msi_controller. It will not run into pcibios_msi_controller(). Maybe there is still something I miss understood, if so, please let me know. Best Regards, Zhou > So, basically, pci_sys_data is still needed on arm. This is how above workaround proposed by Arnd takes care of it. > Without this, dereferencing the pointer as done in bios32, makes it hazardous and lead to crashes... > e.g. in pcibios_msi_controller(), pci_sys_data will point to "dev->bus->sysdata", aka "struct device *dev" above. > > Best Regards, > Fabrice >> >> Thanks again and Best Regards, >> Zhou >> > > > . >