On Mon, Mar 04, 2024 at 02:52:19PM +0530, Manivannan Sadhasivam wrote: > "core_init_notifier" flag is set by the glue drivers requiring refclk from > the host to complete the DWC core initialization. Also, those drivers will > send a notification to the EPF drivers once the initialization is fully > completed using the pci_epc_init_notify() API. Only then, the EPF drivers > will start functioning. > > For the rest of the drivers generating refclk locally, EPF drivers will > start functioning post binding with them. EPF drivers rely on the > 'core_init_notifier' flag to differentiate between the drivers. > Unfortunately, this creates two different flows for the EPF drivers. > > So to avoid that, let's get rid of the "core_init_notifier" flag and follow > a single initialization flow for the EPF drivers. This is done by calling > the dw_pcie_ep_init_notify() from all glue drivers after the completion of > dw_pcie_ep_init_registers() API. This will allow all the glue drivers to > send the notification to the EPF drivers once the initialization is fully > completed. > > Only difference here is that, the drivers requiring refclk from host will > send the notification once refclk is received, while others will send it > during probe time itself. > > Reviewed-by: Frank Li <frank...@nxp.com> > Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasi...@linaro.org> > --- > diff --git a/drivers/pci/endpoint/functions/pci-epf-test.c > b/drivers/pci/endpoint/functions/pci-epf-test.c > index 18c80002d3bd..fc0282b0d626 100644 > --- a/drivers/pci/endpoint/functions/pci-epf-test.c > +++ b/drivers/pci/endpoint/functions/pci-epf-test.c > @@ -927,21 +928,12 @@ static int pci_epf_test_bind(struct pci_epf *epf) > if (ret) > return ret; >
Hello Mani, Since you asked for testing, I gave your series a spin (with a driver without .core_init_notifier). There seems to be a problem that pci_epc_write_header() is never called. Debugging this, it seems that .core_init in pci-epf-test is never called. If I add debug prints in pci_epc_init_notify(), I see that it does not notify a single EPF driver. It appears that the patch in $subject will call pci_epc_init_notify() at EPC driver .probe() time, and at that point in time, there are no EPF drivers registered. They get registered later, when doing the configfs write. I would say that it is the following change that breaks things: > - if (!core_init_notifier) { > - ret = pci_epf_test_core_init(epf); > - if (ret) > - return ret; > - } > - Since without this code, pci_epf_test_core_init() will no longer be called, as there is currently no one that calls epf->core_init() for a EPF driver after it has been bound. (For drivers that call dw_pcie_ep_init_notify() in .probe()) I guess one way to solve this would be for the EPC core to keep track of the current EPC "core state" (up/down). If the core is "up" at EPF .bind() time, notify the EPF driver directly after .bind()? Kind regards, Niklas