All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andre Przywara <andre.przywara@arm.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v2 14/23] sunxi: H3: add DRAM controller single bit delay support
Date: Mon, 5 Dec 2016 11:28:33 +0000	[thread overview]
Message-ID: <39749994-375b-a6ee-d540-fa368128bf20@arm.com> (raw)
In-Reply-To: <CAGb2v67MgmsxQaFgOv0MqbMLnudvQh6hePsXObP5Z44i2X8exA@mail.gmail.com>

Hi,

On 05/12/16 07:58, Chen-Yu Tsai wrote:
> On Mon, Dec 5, 2016 at 2:26 PM, Simon Glass <sjg@chromium.org> wrote:
>> Hi Andre,
>>
>> On 4 December 2016 at 18:52, Andre Przywara <andre.przywara@arm.com> wrote:
>>> From: Jens Kuske <jenskuske@gmail.com>
>>>
>>> Instead of setting the delay for whole bytes allow setting
>>> it for each individual bit. Also add support for
>>> address/command lane delays.
>>>
>>> Signed-off-by: Jens Kuske <jenskuske@gmail.com>
>>> Signed-off-by: Andre Przywara <andre.przywara@arm.com>
>>> ---
>>>  arch/arm/mach-sunxi/dram_sun8i_h3.c | 54 ++++++++++++++++++-------------------
>>>  1 file changed, 27 insertions(+), 27 deletions(-)
>>
>> ACBDLR_WRITE_DELAY_SHIFT
>>
>>>
>>> diff --git a/arch/arm/mach-sunxi/dram_sun8i_h3.c b/arch/arm/mach-sunxi/dram_sun8i_h3.c
>>> index 3dd6803..1647d76 100644
>>> --- a/arch/arm/mach-sunxi/dram_sun8i_h3.c
>>> +++ b/arch/arm/mach-sunxi/dram_sun8i_h3.c
>>> @@ -16,12 +16,13 @@
>>>  #include <linux/kconfig.h>
>>>
>>>  struct dram_para {
>>> -       u32 read_delays;
>>> -       u32 write_delays;
>>>         u16 page_size;
>>>         u8 bus_width;
>>>         u8 dual_rank;
>>>         u8 row_bits;
>>> +       const u8 dx_read_delays[4][11];
>>
>> Can we have #defines for 4 and 11?
>>
>>> +       const u8 dx_write_delays[4][11];
>>> +       const u8 ac_delays[31];
>>>  };
>>>
>>>  static inline int ns_to_t(int nanoseconds)
>>> @@ -64,34 +65,25 @@ static void mctl_phy_init(u32 val)
>>>         mctl_await_completion(&mctl_ctl->pgsr[0], PGSR_INIT_DONE, 0x1);
>>>  }
>>>
>>> -static void mctl_dq_delay(u32 read, u32 write)
>>> +static void mctl_set_bit_delays(struct dram_para *para)
>>>  {
>>>         struct sunxi_mctl_ctl_reg * const mctl_ctl =
>>>                         (struct sunxi_mctl_ctl_reg *)SUNXI_DRAM_CTL0_BASE;
>>>         int i, j;
>>> -       u32 val;
>>> -
>>> -       for (i = 0; i < 4; i++) {
>>> -               val = DXBDLR_WRITE_DELAY((write >> (i * 4)) & 0xf) |
>>> -                     DXBDLR_READ_DELAY(((read >> (i * 4)) & 0xf) * 2);
>>> -
>>> -               for (j = DXBDLR_DQ(0); j <= DXBDLR_DM; j++)
>>> -                       writel(val, &mctl_ctl->dx[i].bdlr[j]);
>>> -       }
>>>
>>>         clrbits_le32(&mctl_ctl->pgcr[0], 1 << 26);
>>>
>>> -       for (i = 0; i < 4; i++) {
>>> -               val = DXBDLR_WRITE_DELAY((write >> (16 + i * 4)) & 0xf) |
>>> -                     DXBDLR_READ_DELAY((read >> (16 + i * 4)) & 0xf);
>>> +       for (i = 0; i < 4; i++)
>>> +               for (j = 0; j < 11; j++)
>>> +                       writel(DXBDLR_WRITE_DELAY(para->dx_write_delays[i][j]) |
>>> +                              DXBDLR_READ_DELAY(para->dx_read_delays[i][j]),
>>> +                              &mctl_ctl->dx[i].bdlr[j]);
>>>
>>> -               writel(val, &mctl_ctl->dx[i].bdlr[DXBDLR_DQS]);
>>> -               writel(val, &mctl_ctl->dx[i].bdlr[DXBDLR_DQSN]);
>>> -       }
>>> +       for (i = 0; i < 31; i++)
>>> +               writel(ACBDLR_WRITE_DELAY(para->ac_delays[i]),
>>> +                      &mctl_ctl->acbdlr[i]);
>>>
>>>         setbits_le32(&mctl_ctl->pgcr[0], 1 << 26);
>>> -
>>> -       udelay(1);
>>>  }
>>>
>>>  static void mctl_set_master_priority(void)
>>> @@ -372,11 +364,8 @@ static int mctl_channel_init(struct dram_para *para)
>>>         clrsetbits_le32(&mctl_ctl->dtcr, 0xf << 24,
>>>                         (para->dual_rank ? 0x3 : 0x1) << 24);
>>>
>>> -
>>> -       if (para->read_delays || para->write_delays) {
>>> -               mctl_dq_delay(para->read_delays, para->write_delays);
>>> -               udelay(50);
>>> -       }
>>> +       mctl_set_bit_delays(para);
>>> +       udelay(50);
>>>
>>>         mctl_zq_calibration(para);
>>>
>>> @@ -458,12 +447,23 @@ unsigned long sunxi_dram_init(void)
>>>                         (struct sunxi_mctl_ctl_reg *)SUNXI_DRAM_CTL0_BASE;
>>>
>>>         struct dram_para para = {
>>> -               .read_delays = 0x00007979,      /* dram_tpr12 */
>>> -               .write_delays = 0x6aaa0000,     /* dram_tpr11 */
>>>                 .dual_rank = 0,
>>>                 .bus_width = 32,
>>>                 .row_bits = 15,
>>>                 .page_size = 4096,
>>> +
>>> +               .dx_read_delays =  {{ 18, 18, 18, 18, 18, 18, 18, 18, 18,  0,  0 },
>>> +                                   { 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0 },
>>> +                                   { 18, 18, 18, 18, 18, 18, 18, 18, 18,  0,  0 },
>>> +                                   { 14, 14, 14, 14, 14, 14, 14, 14, 14,  0,  0 }},
>>> +               .dx_write_delays = {{  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10 },
>>> +                                   {  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10 },
>>> +                                   {  0,  0,  0,  0,  0,  0,  0,  0,  0, 10, 10 },
>>> +                                   {  0,  0,  0,  0,  0,  0,  0,  0,  0,  6,  6 }},
>>> +               .ac_delays = {  0,  0,  0,  0,  0,  0,  0,  0,
>>> +                               0,  0,  0,  0,  0,  0,  0,  0,
>>> +                               0,  0,  0,  0,  0,  0,  0,  0,
>>> +                               0,  0,  0,  0,  0,  0,  0      },
>>>         };
>>>
>>>         mctl_sys_init(&para);
>>> --
>>> 2.8.2
>>>
>>
>> I wonder if there is value in moving this to device tree with of-platdata?

While I kind of like the idea of using the DT for this, there are some
issues:

1) There is no binding so far for representing the DRAM data. Given the
lacking documentation for the DRAM controller it sounds very hard to
come up with a good binding anyway. Also we can't push this through the
Linux DT binding review, since this is of no interest to the kernel. And
I'd rather avoid making up some dodgy binding just for this.

There is work underway to improve the DRAM init code and make it more
robust and flexible. Ideally we can use some autodetection and
calibration feature the controller offers to get rid of arbitrary magic
numbers. But this is quite some work ahead and shouldn't block the much
sought after A64 SPL support for now.

2) If there is need, we can detect the SoC easily by reading the ID
register and differentiate at runtime. This is probably less code than
pulling in DT bits, also more robust.

> I think device tree support is unlikely to fit in SPL for sunxi.
> IIRC Andre already mentions the space constraints in his cover letter.

3) Yes, adding DT support for the SPL makes it rather big. I think it
breaks the 28K limit that the mksunxiboot tool currently has. This can
(and will) be fixed later, but just for this exercise I'd rather keep it
small, especially as we would use it only for the DRAM code and not for
the device drivers.

Actually I have a plan to make better use of DT, but not for the SPL. To
a good degree the SPL code mimics the on-SoC boot ROM operation
(accessing storage devices to load code), which has to work with every
board already and thus does not need a board specific DT.
I can elaborate on that if there is interest.

Cheers,
Andre.

  reply	other threads:[~2016-12-05 11:28 UTC|newest]

Thread overview: 95+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-12-05  1:52 [U-Boot] [PATCH v2 00/23] sunxi: Allwinner A64: SPL support Andre Przywara
2016-12-05  1:52 ` [U-Boot] [PATCH v2 01/23] sun6i: Restrict some register initialization to Allwinner A31 SoC Andre Przywara
2016-12-05  6:25   ` Simon Glass
2016-12-05  7:17   ` Maxime Ripard
2016-12-05  1:52 ` [U-Boot] [PATCH v2 02/23] armv8: prevent using THUMB Andre Przywara
2016-12-05  6:25   ` Simon Glass
2016-12-05  7:30   ` Maxime Ripard
2016-12-05 21:57   ` Tom Rini
2016-12-05  1:52 ` [U-Boot] [PATCH v2 03/23] armv8: add lowlevel_init.S Andre Przywara
2016-12-05  6:26   ` Simon Glass
2016-12-17  2:55     ` André Przywara
2016-12-17 22:46       ` Simon Glass
2016-12-05 21:56   ` Tom Rini
2016-12-06  8:04     ` André Przywara
2016-12-06 12:18       ` Tom Rini
2016-12-05  1:52 ` [U-Boot] [PATCH v2 04/23] SPL: tiny-printf: add "l" modifier Andre Przywara
2016-12-05  6:25   ` Simon Glass
2016-12-05  8:01   ` Siarhei Siamashka
2016-12-05  1:52 ` [U-Boot] [PATCH v2 05/23] move UL() macro from armv8/mmu.h into common.h Andre Przywara
2016-12-05  6:25   ` Simon Glass
2016-12-05  1:52 ` [U-Boot] [PATCH v2 06/23] SPL: make struct spl_image 64-bit safe Andre Przywara
2016-12-05  6:25   ` Simon Glass
2016-12-05 22:04   ` Tom Rini
2016-12-06 10:49   ` Maxime Ripard
2016-12-05  1:52 ` [U-Boot] [PATCH v2 07/23] armv8: add simple sdelay implementation Andre Przywara
2016-12-05  6:25   ` Simon Glass
2016-12-05  1:52 ` [U-Boot] [PATCH v2 08/23] armv8: move reset branch into boot hook Andre Przywara
2016-12-05  6:25   ` Simon Glass
2016-12-05 13:43     ` Andre Przywara
2016-12-08 22:21       ` Simon Glass
2016-12-05  1:52 ` [U-Boot] [PATCH v2 09/23] ARM: boot0 hook: remove macro, include whole header file Andre Przywara
2016-12-05  6:25   ` Simon Glass
2016-12-30 20:13   ` Steve Rae
2016-12-05  1:52 ` [U-Boot] [PATCH v2 10/23] sunxi: introduce extra config option for boot0 header Andre Przywara
2016-12-05  6:25   ` Simon Glass
2016-12-05 15:49     ` Andre Przywara
2016-12-06 10:52   ` Maxime Ripard
2016-12-05  1:52 ` [U-Boot] [PATCH v2 11/23] sunxi: A64: do an RMR switch if started in AArch32 mode Andre Przywara
2016-12-05  6:25   ` Simon Glass
2016-12-05 10:41     ` Andre Przywara
2016-12-06 10:56       ` Maxime Ripard
2016-12-05  1:52 ` [U-Boot] [PATCH v2 12/23] sunxi: provide default DRAM config for sun50i in Kconfig Andre Przywara
2016-12-05  6:25   ` Simon Glass
2016-12-06 10:56   ` Maxime Ripard
2016-12-06 11:21     ` Andre Przywara
2016-12-12 12:33       ` Maxime Ripard
2016-12-05  1:52 ` [U-Boot] [PATCH v2 13/23] sunxi: H3: add and rename some DRAM contoller registers Andre Przywara
2016-12-05  6:26   ` Simon Glass
2016-12-17  2:30     ` André Przywara
2016-12-06 10:58   ` Maxime Ripard
2016-12-05  1:52 ` [U-Boot] [PATCH v2 14/23] sunxi: H3: add DRAM controller single bit delay support Andre Przywara
2016-12-05  6:26   ` Simon Glass
2016-12-05  7:58     ` Chen-Yu Tsai
2016-12-05 11:28       ` Andre Przywara [this message]
2016-12-07  3:48         ` Simon Glass
2016-12-17  2:33           ` André Przywara
2016-12-06 11:02   ` Maxime Ripard
2016-12-05  1:52 ` [U-Boot] [PATCH v2 15/23] sunxi: A64: use H3 DRAM initialization code for A64 Andre Przywara
2016-12-05  6:26   ` Simon Glass
2016-12-16 17:30     ` Andre Przywara
2016-12-17 22:48       ` Simon Glass
2016-12-06 11:20   ` Maxime Ripard
2016-12-06 14:15     ` Andre Przywara
2016-12-12 12:29       ` Maxime Ripard
2016-12-12 16:06         ` Andre Przywara
2016-12-05  1:52 ` [U-Boot] [PATCH v2 16/23] sunxi: H3/A64: fix non-ODT setting Andre Przywara
2016-12-05  6:26   ` Simon Glass
2016-12-05  1:52 ` [U-Boot] [PATCH v2 17/23] sunxi: DRAM: fix H3 DRAM size display on aarch64 Andre Przywara
2016-12-05  6:26   ` Simon Glass
2016-12-05  1:52 ` [U-Boot] [PATCH v2 18/23] sunxi: A64: enable SPL Andre Przywara
2016-12-05  6:26   ` Simon Glass
2016-12-16 17:40     ` Andre Przywara
2016-12-17 22:48       ` Simon Glass
2016-12-05  1:52 ` [U-Boot] [PATCH v2 19/23] SPL: read and store arch property from U-Boot image Andre Przywara
2016-12-05 22:56   ` Tom Rini
2016-12-05  1:52 ` [U-Boot] [PATCH v2 20/23] Makefile: use "arm64" architecture for U-Boot image files Andre Przywara
2016-12-05 23:11   ` Tom Rini
2016-12-05  1:52 ` [U-Boot] [PATCH v2 21/23] ARM: SPL/FIT: differentiate between arm and arm64 arch properties Andre Przywara
2016-12-06  0:27   ` Tom Rini
2016-12-05  1:52 ` [U-Boot] [PATCH v2 22/23] sunxi: introduce RMR switch to enter payloads in 64-bit mode Andre Przywara
2016-12-05  6:26   ` Simon Glass
2016-12-05  1:52 ` [U-Boot] [PATCH v2 23/23] sunxi: A64: add 32-bit SPL support Andre Przywara
2016-12-05  6:26   ` Simon Glass
2016-12-17 14:44     ` André Przywara
2016-12-19  8:20       ` Maxime Ripard
2016-12-19 10:26         ` Andre Przywara
2016-12-06 11:28   ` Maxime Ripard
2016-12-06 12:22     ` Andre Przywara
2016-12-12 15:13       ` Maxime Ripard
2016-12-12 16:04         ` Andre Przywara
2016-12-12 16:18           ` Chen-Yu Tsai
2016-12-12 16:32             ` Andre Przywara
2016-12-16 14:52           ` Maxime Ripard
2016-12-16 15:39             ` Andre Przywara
2016-12-19  8:17               ` Maxime Ripard

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=39749994-375b-a6ee-d540-fa368128bf20@arm.com \
    --to=andre.przywara@arm.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.