public inbox for u-boot@lists.denx.de
 help / color / mirror / Atom feed
From: Scott Wood <scottwood@freescale.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [U-Boot, v8] nand/denali: Adding Denali NAND driver support
Date: Thu, 19 Jun 2014 20:39:20 -0500	[thread overview]
Message-ID: <20140620013920.GA6586@home.buserror.net> (raw)
In-Reply-To: <1402378939-2320-1-git-send-email-clsee@altera.com>

On Tue, Jun 10, 2014 at 12:42:19AM -0500, Chin Liang See wrote:
> To add the Denali NAND driver support into U-Boot. It required
> information such as register base address from configuration
> header file  within include/configs folder.

This is hard to parse.  What exactly is required from include/configs and
where is it documented?

I see that this driver exists in Linux...  Is this patch related to a
particular Linux SHA1?

> Signed-off-by: Chin Liang See <clsee@altera.com>
> Cc: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
> Cc: David Woodhouse <David.Woodhouse@intel.com>
> Cc: Brian Norris <computersforpeace@gmail.com>
> Cc: Scott Wood <scottwood@freescale.com>
> Cc: Masahiro Yamada <yamada.m@jp.panasonic.com>
> Signed-off-by: Masahiro Yamada <yamada.m@jp.panasonic.com>
> Reviewed-by: Masahiro Yamada <yamada.m@jp.panasonic.com>
> Tested-by: Masahiro Yamada <yamada.m@jp.panasonic.com>

Are these people on CC because they're involved in the U-Boot patch in
some way, or is this just copy-and-paste from a Linux patch?

> +/* Reset the flash controller */
> +static uint32_t denali_nand_reset(struct denali_nand_info *denali)
> +{
> +	uint32_t i;
> +
> +	for (i = 0; i < denali->max_banks; i++)
> +		writel(INTR_STATUS__RST_COMP | INTR_STATUS__TIME_OUT,
> +		       denali->flash_reg + INTR_STATUS(i));
> +
> +	for (i = 0; i < denali->max_banks; i++) {
> +		writel(1 << i, denali->flash_reg + DEVICE_RESET);
> +		while (!(readl(denali->flash_reg + INTR_STATUS(i)) &
> +			(INTR_STATUS__RST_COMP | INTR_STATUS__TIME_OUT)))
> +			if (readl(denali->flash_reg + INTR_STATUS(i)) &
> +				INTR_STATUS__TIME_OUT)
> +				debug(KERN_DEBUG "NAND Reset operation "
> +					"timed out on bank %d\n", i);
> +	}

WARNING: quoted string split across lines
#283: FILE: drivers/mtd/nand/denali.c:203:
+                               debug(KERN_DEBUG "NAND Reset operation "
+                                       "timed out on bank %d\n", i);

(likewise elsewhere)

This instance is not even from Linux -- and where does KERN_DEBUG come
from?  The Linux driver has never used it.

> +#if ONFI_BLOOM_TIME
> +	if ((en_hi * CLK_X) < (treh[mode] + 2))
> +		en_hi++;
> +#endif

When would this #if not be true?

> +	if ((en_lo + en_hi) * CLK_X < trc[mode])
> +		en_lo += DIV_ROUND_UP((trc[mode] - (en_lo + en_hi) * CLK_X),
> +				      CLK_X);
> +
> +	if ((en_lo + en_hi) < CLK_MULTI)
> +		en_lo += CLK_MULTI - en_lo - en_hi;
> +
> +	while (dv_window < 8) {
> +		data_invalid_rhoh = en_lo * CLK_X + trhoh[mode];
> +
> +		data_invalid_rloh = (en_lo + en_hi) * CLK_X + trloh[mode];
> +
> +		data_invalid =
> +		    data_invalid_rhoh <
> +		    data_invalid_rloh ? data_invalid_rhoh : data_invalid_rloh;
> +
> +		dv_window = data_invalid - trea[mode];
> +
> +		if (dv_window < 8)
> +			en_lo++;
> +	}
> +
> +	acc_clks = DIV_ROUND_UP(trea[mode], CLK_X);
> +
> +	while (((acc_clks * CLK_X) - trea[mode]) < 3)
> +		acc_clks++;
> +
> +	if ((data_invalid - acc_clks * CLK_X) < 2)
> +		debug(KERN_WARNING "%s, Line %d: Warning!\n",
> +		      __FILE__, __LINE__);
> +
> +	addr_2_data = DIV_ROUND_UP(tadl[mode], CLK_X);
> +	re_2_we = DIV_ROUND_UP(trhw[mode], CLK_X);
> +	re_2_re = DIV_ROUND_UP(trhz[mode], CLK_X);
> +	we_2_re = DIV_ROUND_UP(twhr[mode], CLK_X);
> +	cs_cnt = DIV_ROUND_UP((tcs[mode] - trp[mode]), CLK_X);
> +	if (!tclsrising)
> +		cs_cnt = DIV_ROUND_UP(tcs[mode], CLK_X);
> +	if (cs_cnt == 0)
> +		cs_cnt = 1;
> +
> +	if (tcea[mode]) {
> +		while (((cs_cnt * CLK_X) + trea[mode]) < tcea[mode])
> +			cs_cnt++;
> +	}
> +
> +#if MODE5_WORKAROUND
> +	if (mode == 5)
> +		acc_clks = 5;
> +#endif

Likewise, this is dead code.

If these are meant to be configurable, they need to be named as config
symbols, documented, and located in a config file rather than denali.h --
and ideally there should be at least one board that sets the option and
at least one that does not set it, so that both possibilities get build
coverage.

I see that the Linux driver has the same thing, so perhaps we can excuse
it if it's not actually meant to be altered by a user, but in that case
the driver ought to actually correspond to a specific SHA1 of the Linux
driver.

> +/* validation function to verify that the controlling software is making
> + * a valid request
> + */
> +static inline bool is_flash_bank_valid(int flash_bank)
> +{
> +	return (flash_bank >= 0 && flash_bank < 4);
> +}

ERROR: return is not a function, parentheses are not required
#589: FILE: drivers/mtd/nand/denali.c:509:
+       return (flash_bank >= 0 && flash_bank < 4);

> +/* setups the HW to perform the data DMA */
> +static void denali_setup_dma(struct denali_nand_info *denali, int op)
> +{
> +	uint32_t mode;
> +	const int page_count = 1;
> +	uint32_t addr = (uint32_t)denali->buf.dma_buf;
> +
> +	flush_dcache_range(addr, addr + sizeof(denali->buf.dma_buf));
> +
> +#ifdef CONFIG_NAND_DENALI_64BIT

Needs to be documented -- and depending on what it means,
should possibly be CONFIG_SYS_NAND_DENALI_64BIT.  The Linux driver seems
to only have the "else" variant.

> +static int write_page(struct mtd_info *mtd, struct nand_chip *chip,
> +			const uint8_t *buf, bool raw_xfer, int oob_required)
> +{
> +	struct denali_nand_info *denali = mtd_to_denali(mtd);
> +
> +	uint32_t irq_status = 0;
> +	uint32_t irq_mask = INTR_STATUS__DMA_CMD_COMP;
> +
> +	denali->status = 0;
> +
> +	/* copy buffer into DMA buffer */
> +	memcpy((void *)denali->buf.dma_buf, buf, mtd->writesize);

Why do you have this cast?

> +	/* need extra memcpoy for raw transfer */

memcpoy?

> +	/* check whether any ECC error */
> +	if (irq_status & INTR_STATUS__ECC_UNCOR_ERR) {
> +		/* is the ECC cause by erase page, check using read_page_raw */
> +		debug("  Uncorrected ECC detected\n");
> +		denali_read_page_raw(mtd, chip, buf, oob_required, denali->page);

WARNING: line over 80 characters
#1044: FILE: drivers/mtd/nand/denali.c:964:
+               denali_read_page_raw(mtd, chip, buf, oob_required, denali->page);


-Scott

  parent reply	other threads:[~2014-06-20  1:39 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-06-10  5:42 [U-Boot] [PATCH v8] nand/denali: Adding Denali NAND driver support Chin Liang See
2014-06-10 12:45 ` Masahiro Yamada
2014-06-19  1:42   ` Chin Liang See
2014-07-11 11:59     ` Masahiro Yamada
2014-08-05  8:39       ` Masahiro Yamada
2014-08-18  4:19         ` Masahiro Yamada
2014-08-18 10:05           ` Chin Liang See
2014-06-20  1:39 ` Scott Wood [this message]
2014-06-24 10:24   ` [U-Boot] [U-Boot, " Masahiro Yamada
2014-06-24 20:05     ` Scott Wood
     [not found]   ` <0016CF5815A1B142902817051AF62EB30E91F2@PG-ITEXCH01.altera.priv.altera.com>
2014-08-19  9:18     ` Chin Liang See
2014-08-20  1:44       ` Masahiro Yamada

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=20140620013920.GA6586@home.buserror.net \
    --to=scottwood@freescale.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox