Hello, On Wed, 9 Dec 2015 19:29:49 +0100 Jens Kuske <[email protected]> wrote:
> On 09/12/15 09:40, Siarhei Siamashka wrote: > > Thanks for the explanations. I finally got lima-memtester up and > > running on H3 hardware (not that it was difficult, but just the amount > > of unnecessary compatibility breaks in the H3 SDK kernel was a bit > > unexpected and really discouraging, they are really doing almost > > *everything* in a different way compared to A10/A20 SDK kernel just > > for the sake of making things different): > > > > > > https://github.com/ssvb/lima-memtester/releases/tag/20151207-orange-pi-pc-fel-test > > > > Currently U-Boot v2016.01-rc2 fails the lima-memtester check unless > > the DRAM clock speed is reduced to 456 MHz on my Orange Pi PC. But > > if I use the boot0 bootloader to boot the same kernel image > > (uImage-3.4-sun8i-h3-lima-memtester), then the test works fine. > > This means that there must be still something wrong with the H3 > > DRAM init code in U-Boot, or maybe some clocks are wrong > > > > I tried to compare boot0 and the SDK source again and actually > found another difference. Did you dump the DRAM controller registers to find this difference between U-Boot and boot0? > The read delays (except for dqs) are doubled in boot0 before > writing them to the registers. Looks like they suddenly needed > higher values than possible with 4 bit. The register seems to > take 6 bit wide values. Well, we can always change the layout of data in this struct and allocate 8 bits per each delay value instead of 4 bits: struct dram_para para = { .read_delays = 0x00007979, .write_delays = 0x6aaa0000, .dual_rank = 0, .bus_width = 32, .row_bits = 15, .page_size = 4096, }; Are they originally the 'tpr11' and 'tpr12' parameters from FEX? Maybe they belong in Kconfig, with a comment about how to do all the needed conversion from FEX (multiplication by 2)? BTW, do these delays serve a somewhat similar purpose as the 'tpr3' parameter in A10/A13/A20? Later we could adapt the a10-tpr3-scan script and make a h3 variant of it for bruteforce searching optimal values of these delays. With the lima-memtester test failures, we have already discovered in an experimental way that correctly configuring these delays apparently affects reliability :-) > After fixing that, lima-memtester doesn't fail at 672 MHz anymore > on my Orange Pi Plus. Before it failed at 552 and higher. > Patch below. Thanks. With this U-Boot patch, lima-memtester does not fail anymore at 672 MHz on my Orange Pi PC board too. That's a major improvement over what is in U-boot 2016.01-rc2. If you are going to submit this patch to U-Boot, you can have my Tested-by: Siarhei Siamashka <[email protected]> Still increasing the DRAM clock speed even by one 24 MHz step to 696 MHz makes it fail again. So there does not seem to be much safety headroom available. I have prepared an updated v3 tarball with your fix and added a table to the wiki page: http://linux-sunxi.org/Orange_Pi_PC#DRAM_clock_speed_limit Maybe other people could test their Orange Pi PC boards too in order to see if the results are generally similar, better or worse. Your Orange Pi Plus is a different board and may in theory have a slightly different DRAM tracks routing. > Maybe we could also replaced the setbits with writel, because I > don't see a good reason not to overwrite the registers, they are > all zero after reset and have 0x00003f3f mask. Or maybe "clrsetbits_le32"? The use of "setbits_le32" indeed looks a bit strange here. I'm fine with "writel" too. In fact I would be fine with any fix that can quickly resolve the problem. > Jens > > > > diff --git a/arch/arm/cpu/armv7/sunxi/dram_sun8i_h3.c > b/arch/arm/cpu/armv7/sunxi/dram_sun8i_h3.c > index b721d60..03bd013 100644 > --- a/arch/arm/cpu/armv7/sunxi/dram_sun8i_h3.c > +++ b/arch/arm/cpu/armv7/sunxi/dram_sun8i_h3.c > @@ -73,10 +73,10 @@ static void mctl_dq_delay(u32 read, u32 write) > > for (i = 0; i < 4; i++) { > val = DATX_IOCR_WRITE_DELAY((write >> (i * 4)) & 0xf) | > - DATX_IOCR_READ_DELAY((read >> (i * 4)) & 0xf); > + DATX_IOCR_READ_DELAY(((read >> (i * 4)) & 0xf) * 2); > > for (j = DATX_IOCR_DQ(0); j <= DATX_IOCR_DM; j++) > - setbits_le32(&mctl_ctl->datx[i].iocr[j], val); > + writel(val, &mctl_ctl->datx[i].iocr[j]); > } > > clrbits_le32(&mctl_ctl->pgcr[0], 1 << 26); > @@ -85,8 +85,8 @@ static void mctl_dq_delay(u32 read, u32 write) > val = DATX_IOCR_WRITE_DELAY((write >> (16 + i * 4)) & 0xf) | > DATX_IOCR_READ_DELAY((read >> (16 + i * 4)) & 0xf); > > - setbits_le32(&mctl_ctl->datx[i].iocr[DATX_IOCR_DQS], val); > - setbits_le32(&mctl_ctl->datx[i].iocr[DATX_IOCR_DQSN], val); > + writel(val, &mctl_ctl->datx[i].iocr[DATX_IOCR_DQS]); > + writel(val, &mctl_ctl->datx[i].iocr[DATX_IOCR_DQSN]); > } > > setbits_le32(&mctl_ctl->pgcr[0], 1 << 26); -- Best regards, Siarhei Siamashka -- You received this message because you are subscribed to the Google Groups "linux-sunxi" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
