[PATCH v6 00/15] staging: mt7621-pci: avoid custom pci config read and writes
Sergio Paracuellos
sergio.paracuellos at gmail.com
Tue Jul 31 05:43:01 UTC 2018
On Tue, Jul 31, 2018 at 03:25:43PM +1000, NeilBrown wrote:
> On Tue, Jul 31 2018, Sergio Paracuellos wrote:
>
> > On Tue, Jul 31, 2018 at 08:55:52AM +1000, NeilBrown wrote:
> >> On Mon, Jul 30 2018, Sergio Paracuellos wrote:
> >>
> >> > This patch series include an attempt to avoid the use of custom
> >> > read and writes in driver code and use PCI subsystem common ones.
> >> >
> >> > In order to do this 'map_bus' callback is implemented and also
> >> > data structures for driver are included. The regs base address
> >> > is being readed from device tree and the driver gets clean a lot
> >> > of code.
> >> >
> >> > Also the driver get removes all legacy PCI code using now PCI_DRIVERS_GENERIC.
> >> >
> >> > Changes in v6:
> >> > - Reorder patches to be each patch correct in itself.
> >> > - PATCH 1 adds also Kconfig to do the step from legacy to generic code
> >> > - PATCH 1 remaps io space using devm_pci_remap_iospace for io resource in
> >> > a new function called 'mt7621_pci_parse_request_of_pci_ranges'.
> >> > - Other patches rebased and adapted with this changes.
> >>
> >> No noticeable difference.
> >> Still hangs after
> >> [ 8.630000] ahci 0000:01:00.0: enabling device (0000 -> 0002)
> >>
> >> the readl() at the start of ahci_enable_ahci() hangs, reading c4017004.
> >>
> >> I built on a merge of
> >> Merge: 527838d470e3 b9f13084580c
> >>
> >> linus' master + staging/staging-testing
> >>
> >> dmesg below.
> >
> > Thanks for this.
> >
> ....
> >> [ 8.430000] bootconsole [early0] disabled
> >> [ 8.430000] bootconsole [early0] disabled
> >> [ 8.450000] cacheinfo: Failed to find cpu0 device node
> >> [ 8.460000] cacheinfo: Unable to detect cache hierarchy for CPU 0
> >> [ 8.550000] loop: module loaded
> >> [ 8.560000] ahci 0000:01:00.0: enabling device (0000 -> 0002)
> >>
> >>
> >
> > So this last dmesg is the new one with last v6, right? Because I can see
>
> Right.
>
>
> > that at least now the assigned resources are pretty much the same of the ones in the dmesg of the
> > original code talking in terms of assigned BAR's and bridge windows. No weird BAR 9 anymore, which I think is
> > good. We can try to get back the hack which I removed at first and see what happend. The hack is
> > this function removed in PATCH 2:
> >
> > -void setup_cm_memory_region(struct resource *mem_resource)
> > -{
> > - resource_size_t mask;
> > - if (mips_cps_numiocu(0)) {
> > - /* FIXME: hardware doesn't accept mask values with 1s after
> > - * 0s (e.g. 0xffef), so it would be great to warn if that's
> > - * about to happen */
> > - mask = ~(mem_resource->end - mem_resource->start);
> > -
> > - write_gcr_reg1_base(mem_resource->start);
> > - write_gcr_reg1_mask(mask | CM_GCR_REGn_MASK_CMTGT_IOCU0);
> > - printk("PCI coherence region base: 0x%08llx, mask/settings: 0x%08llx\n",
> > - (unsigned long long)read_gcr_reg1_base(),
> > - (unsigned long long)read_gcr_reg1_mask());
> > - }
> > -}
> >
> > We can try to add it again and and call it from 'mt7621_pci_parse_request_of_pci_ranges'
> > in the label of the case of the case 'IORESOURCE_MEM' (as you can see this was intentionally
> > without code just to test this if this v6 fails):
> >
> > break;
> > case IORESOURCE_MEM:
> > + setup_cm_memory_region(res);
> > break;
>
> I added setup_cm_memory_region() back in and called it from
> mt7621_pci_parse_request_of_pci_ranges()
> as suggested.
> Now we don't hang at the same place, but crash shortly after.
>
> [ 8.750000] WARNING: CPU: 2 PID: 1 at ../drivers/ata/libahci.c:227 ahci_save_initial_config+0x3c/0x3e0
>
> This is at the end of ahci_enable_ahci(). the HOST_AHCI_EN bit never was
> set.
So it seems this hack is really needed. Does something changed in dmesg with this?
>
>
> >
> > If this also fails we can try to move the call to 'mt7621_pcie_parse_dt(pcie, &res);' after the
> > HW initialization code just before the list_splice_init(&res, &bridge->windows); line:
> >
> > - err = mt7621_pcie_parse_dt(pcie, &res);
> > - if (err) {
> > - dev_err(dev, "Parsing DT failed\n");
> > - return err;
> > - }
> > -
> > - /*
> > iomem_resource.start = 0;
> > iomem_resource.end = ~0;
> > ...
> >
> > write_config(0, 0, 0, 0x70c, val);
> > }
> >
> > + err = mt7621_pcie_parse_dt(pcie, &res);
> > + if (err) {
> > + dev_err(dev, "Parsing DT failed\n");
> > + return err;
> > + }
> > +
> > list_splice_init(&res, &bridge->windows);
>
> If I move the call to mt7621_pcie_parse_dt() anywhere after
> the call to set_phy_for_ssc() I get a crash at the start of
> set_pcie_phy() called from set_phy_for_ssc(), presumably because
> pcie->base isn't set.
>
> Keep trying, I'm sure we'll get there.
True, sorry. Maybe we can get out the mt7621_pci_parse_request_of_pci_ranges
call from mt7621_pcie_parse_dt and put it after the initialization code
just before the list_splice_init to try to reproduce the original code trace.
I never give up :). I only concern if I am not doing you to waste your time
with this tests. I really like to be able to test this by myself but this
board gets its price really increase buying it from Spain :-(.
>
> NeilBrown
Best regards,
Sergio Paracuellos
>
> >
> > (I don't have access now to the laptop with the code and cannot diff properly, sorry).
> >
> > Hopefully it boots now?
> >
> > Thanks in advance.
> >
> > Best regards,
> > Sergio Paracuellos
More information about the devel
mailing list