On Wed, Aug 28, 2019 at 5:35 AM Chuan Hua, LeiDilip will change to 100us delay and run the test. I also need to run some tests for old boards(XRX350/550/PRX300) to confirm this has no impact on function.
<chuanhua.lei@xxxxxxxxxxxxxxx> wrote:
[...]
OK. I don't know how other PCI controller drivers manage this. if thespec doesn't guide this part. It is a board or SoC specific setting.+Cc KishonPartially, you are right. However, we should not add some dependencymy interpretation is that it totally depends on the board design orThere are different purpose. rst_interval is purely for asserted reset+static int intel_pcie_ep_rst_init(struct intel_pcie_port *lpp)why is there lpp->rst_interval when you hardcode 100ms here?
+{
+ struct device *dev = lpp->pci->dev;
+ int ret = 0;
+
+ lpp->reset_gpio = devm_gpiod_get(dev, "reset", GPIOD_OUT_LOW);
+ if (IS_ERR(lpp->reset_gpio)) {
+ ret = PTR_ERR(lpp->reset_gpio);
+ if (ret != -EPROBE_DEFER)
+ dev_err(dev, "failed to request PCIe GPIO: %d\n", ret);
+ return ret;
+ }
+ /* Make initial reset last for 100ms */
+ msleep(100);
pulse.
Here 100ms is to make sure the initial state keeps at least 100ms, then we
can reset.
the bootloader setup.
here from
bootloader and board. rst_interval is just to make sure the pulse (low
active or high active)
lasts the specified the time.
he recently added support for a GPIO reset line to the
pcie-cadence-host.c [0] and I believe he's also maintaining
pci-keystone.c which are both using a 100uS delay (instead of 100ms).
I don't know the PCIe spec so maybe Kishon can comment on the values
that should be used according to the spec.
if there's then a reason why values other than the ones from the spec
are needed then there should be a comment explaining why different
values are needed (what problem does it solve).
100us also should work. spec only requirs reset duration should last
100ms. The idea is that before reset assert and deassert, make sure the
default deassert status keeps some time. We take this value from
hardware suggestion long time back. We can reduce this value to 100us,
but we need to test on the board.
PCI maintainers are happy with this then I am as well
maybe it's worth changing the comment to indicate that this delay was
suggested by the hardware team (so it's clear that this is not coming
from the PCI spec)
[...]Thanks for your information. We should adapt this in next version.
OK. as far as I understand you need to call dw_pcie_host_deinit fromGood. If this is the case, bind/unbind eventually goes to probe/remove,pcie-designware-host.c will gain .remove() support in Linux 5.4I doubt if other RC driver will support bind/unbind. We do have thisOK, but this does not seem Intel/Lantiq specific at allbind/unbind case we use this. For extreme cases, we use unbind and bind+static void __intel_pcie_remove(struct intel_pcie_port *lpp)I expect logic like this to be part of the PCI subsystem in Linux.
+{
+ pcie_rc_cfg_wr_mask(lpp, PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER,
+ 0, PCI_COMMAND);
why is this needed?
[...]
to reset
PCI instead of rebooting.
why isn't this managed by either pcie-designware-host.c or the generic
PCI/PCIe subsystem in Linux?
requirement due to power management from WiFi devices.
I don't understand how .remove() and then .probe() again is different
from .unbind() followed by a .bind()
so we can remove this.
the .remove() callback (which is missing in this version)
(I'm using drivers/pci/controller/dwc/pcie-tegra194.c as an example,
this driver is in linux-next and thus will appear in Linux 5.4)
Martin