From: Manivannan Sadhasivam <mani@kernel.org>
To: Md Sadre Alam <mdalam@codeaurora.org>
Cc: miquel.raynal@bootlin.com, linux-mtd@lists.infradead.org,
linux-kernel@vger.kernel.org, sricharan@codeaurora.org
Subject: Re: [PATCH 3/3] mtd: rawnand: qcom: Add support for page scope read
Date: Tue, 28 Sep 2021 21:42:19 +0530 [thread overview]
Message-ID: <20210928161219.GD12183@thinkpad> (raw)
In-Reply-To: <1631699851-12172-4-git-send-email-mdalam@codeaurora.org>
On Wed, Sep 15, 2021 at 03:27:31PM +0530, Md Sadre Alam wrote:
> QPIC V2.0 onwards QPIC controller support enhanced read mode
> like page scope read and multi page read.
>
Define page scope read.
> In QPIC V1, SW is needed to write EXEC_CMD register for each
> Code word and collect any Status related to that CW before
> issueing EXEC_CMD for next CW.
>
> Page scope command is truly a page mode command where SW is
> required to issue EXEC_CMD only once for a page. Controller
> HW takes care of Codeword specific details and automatically
> returns status associated with each CW to BAM pipe, dedicated
> for status deposition.
>
> With this command, SW now can issue one read command for a page
> and upon receiving completion interrupt, can process status,
> that have already been deposited in memory through status BAM pipe.
>
> Signed-off-by: Md Sadre Alam <mdalam@codeaurora.org>
> ---
> drivers/mtd/nand/raw/qcom_nandc.c | 77 ++++++++++++++++++++++++++++++++++++---
> 1 file changed, 71 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/mtd/nand/raw/qcom_nandc.c b/drivers/mtd/nand/raw/qcom_nandc.c
> index 07448c4..257dec7e 100644
> --- a/drivers/mtd/nand/raw/qcom_nandc.c
> +++ b/drivers/mtd/nand/raw/qcom_nandc.c
> @@ -157,6 +157,10 @@
> #define OP_FETCH_ID 0xb
> #define OP_RESET_DEVICE 0xd
>
> +/* Auto status val and mask */
> +#define AUTO_STS_VAL 0x000B000B
Use non-cap hex.
> +#define PAGE_SCOPE_READ BIT(23)
> +
> /* Default Value for NAND_DEV_CMD_VLD */
> #define NAND_DEV_CMD_VLD_VAL (READ_START_VLD | WRITE_START_VLD | \
> ERASE_START_VLD | SEQ_READ_START_VLD)
> @@ -336,6 +340,8 @@ struct nandc_regs {
>
> __le32 erased_cw_detect_cfg_clr;
> __le32 erased_cw_detect_cfg_set;
> +
> + __le32 auto_sts_en;
> };
>
> /*
> @@ -421,6 +427,9 @@ struct qcom_nand_controller {
>
> u32 cmd1, vld;
> const struct qcom_nandc_props *props;
> +
> + __le32 *status_buf;
> + int sts_buf_size;
Add kdoc for these two members.
> };
>
> /*
> @@ -487,6 +496,7 @@ struct qcom_nandc_props {
> bool is_bam;
> bool is_qpic;
> bool qpic_v2;
> + bool page_scope;
> u32 dev_cmd_reg_start;
> };
>
> @@ -656,6 +666,8 @@ static __le32 *offset_to_nandc_reg(struct nandc_regs *regs, int offset)
> return ®s->cfg1;
> case NAND_DEV0_ECC_CFG:
> return ®s->ecc_bch_cfg;
> + case NAND_AUTO_STATUS_EN:
> + return ®s->auto_sts_en;
> case NAND_READ_STATUS:
> return ®s->clrreadstatus;
> case NAND_DEV_CMD1:
> @@ -756,10 +768,13 @@ static void update_rw_regs(struct qcom_nand_host *host, int num_cw, bool read, i
> struct qcom_nand_controller *nandc = get_qcom_nand_controller(chip);
>
> if (read) {
> - if (host->use_ecc)
> + if (host->use_ecc) {
> cmd = OP_PAGE_READ_WITH_ECC | PAGE_ACC | LAST_PAGE;
> - else
> + if (nandc->props->qpic_v2 && nandc->props->page_scope)
Again, why you are checking for both conditions? Using "page_scope" is
sufficient enough.
> + cmd |= PAGE_SCOPE_READ;
> + } else {
> cmd = OP_PAGE_READ | PAGE_ACC | LAST_PAGE;
> + }
> } else {
> cmd = OP_PROGRAM_PAGE | PAGE_ACC | LAST_PAGE;
> }
[...]
> if (use_ecc) {
> - read_reg_dma(nandc, NAND_FLASH_STATUS, 2, 0);
> - read_reg_dma(nandc, NAND_ERASED_CW_DETECT_STATUS, 1,
> - NAND_BAM_NEXT_SGL);
> + if (nandc->props->qpic_v2 && nandc->props->page_scope) {
> + if (qcom_nandc_is_last_cw(ecc, cw))
> + write_reg_dma(nandc, NAND_EXEC_CMD, 1,
> + NAND_BAM_NEXT_SGL);
> + } else {
> + write_reg_dma(nandc, NAND_EXEC_CMD, 1, NAND_BAM_NEXT_SGL);
> + read_reg_dma(nandc, NAND_FLASH_STATUS, 2, 0);
> + read_reg_dma(nandc, NAND_ERASED_CW_DETECT_STATUS, 1,
> + NAND_BAM_NEXT_SGL);
> + }
You need to add a comment for this.
Thanks,
Mani
______________________________________________________
Linux MTD discussion mailing list
http://lists.infradead.org/mailman/listinfo/linux-mtd/
WARNING: multiple messages have this Message-ID (diff)
From: Manivannan Sadhasivam <mani@kernel.org>
To: Md Sadre Alam <mdalam@codeaurora.org>
Cc: miquel.raynal@bootlin.com, linux-mtd@lists.infradead.org,
linux-kernel@vger.kernel.org, sricharan@codeaurora.org
Subject: Re: [PATCH 3/3] mtd: rawnand: qcom: Add support for page scope read
Date: Tue, 28 Sep 2021 21:42:19 +0530 [thread overview]
Message-ID: <20210928161219.GD12183@thinkpad> (raw)
In-Reply-To: <1631699851-12172-4-git-send-email-mdalam@codeaurora.org>
On Wed, Sep 15, 2021 at 03:27:31PM +0530, Md Sadre Alam wrote:
> QPIC V2.0 onwards QPIC controller support enhanced read mode
> like page scope read and multi page read.
>
Define page scope read.
> In QPIC V1, SW is needed to write EXEC_CMD register for each
> Code word and collect any Status related to that CW before
> issueing EXEC_CMD for next CW.
>
> Page scope command is truly a page mode command where SW is
> required to issue EXEC_CMD only once for a page. Controller
> HW takes care of Codeword specific details and automatically
> returns status associated with each CW to BAM pipe, dedicated
> for status deposition.
>
> With this command, SW now can issue one read command for a page
> and upon receiving completion interrupt, can process status,
> that have already been deposited in memory through status BAM pipe.
>
> Signed-off-by: Md Sadre Alam <mdalam@codeaurora.org>
> ---
> drivers/mtd/nand/raw/qcom_nandc.c | 77 ++++++++++++++++++++++++++++++++++++---
> 1 file changed, 71 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/mtd/nand/raw/qcom_nandc.c b/drivers/mtd/nand/raw/qcom_nandc.c
> index 07448c4..257dec7e 100644
> --- a/drivers/mtd/nand/raw/qcom_nandc.c
> +++ b/drivers/mtd/nand/raw/qcom_nandc.c
> @@ -157,6 +157,10 @@
> #define OP_FETCH_ID 0xb
> #define OP_RESET_DEVICE 0xd
>
> +/* Auto status val and mask */
> +#define AUTO_STS_VAL 0x000B000B
Use non-cap hex.
> +#define PAGE_SCOPE_READ BIT(23)
> +
> /* Default Value for NAND_DEV_CMD_VLD */
> #define NAND_DEV_CMD_VLD_VAL (READ_START_VLD | WRITE_START_VLD | \
> ERASE_START_VLD | SEQ_READ_START_VLD)
> @@ -336,6 +340,8 @@ struct nandc_regs {
>
> __le32 erased_cw_detect_cfg_clr;
> __le32 erased_cw_detect_cfg_set;
> +
> + __le32 auto_sts_en;
> };
>
> /*
> @@ -421,6 +427,9 @@ struct qcom_nand_controller {
>
> u32 cmd1, vld;
> const struct qcom_nandc_props *props;
> +
> + __le32 *status_buf;
> + int sts_buf_size;
Add kdoc for these two members.
> };
>
> /*
> @@ -487,6 +496,7 @@ struct qcom_nandc_props {
> bool is_bam;
> bool is_qpic;
> bool qpic_v2;
> + bool page_scope;
> u32 dev_cmd_reg_start;
> };
>
> @@ -656,6 +666,8 @@ static __le32 *offset_to_nandc_reg(struct nandc_regs *regs, int offset)
> return ®s->cfg1;
> case NAND_DEV0_ECC_CFG:
> return ®s->ecc_bch_cfg;
> + case NAND_AUTO_STATUS_EN:
> + return ®s->auto_sts_en;
> case NAND_READ_STATUS:
> return ®s->clrreadstatus;
> case NAND_DEV_CMD1:
> @@ -756,10 +768,13 @@ static void update_rw_regs(struct qcom_nand_host *host, int num_cw, bool read, i
> struct qcom_nand_controller *nandc = get_qcom_nand_controller(chip);
>
> if (read) {
> - if (host->use_ecc)
> + if (host->use_ecc) {
> cmd = OP_PAGE_READ_WITH_ECC | PAGE_ACC | LAST_PAGE;
> - else
> + if (nandc->props->qpic_v2 && nandc->props->page_scope)
Again, why you are checking for both conditions? Using "page_scope" is
sufficient enough.
> + cmd |= PAGE_SCOPE_READ;
> + } else {
> cmd = OP_PAGE_READ | PAGE_ACC | LAST_PAGE;
> + }
> } else {
> cmd = OP_PROGRAM_PAGE | PAGE_ACC | LAST_PAGE;
> }
[...]
> if (use_ecc) {
> - read_reg_dma(nandc, NAND_FLASH_STATUS, 2, 0);
> - read_reg_dma(nandc, NAND_ERASED_CW_DETECT_STATUS, 1,
> - NAND_BAM_NEXT_SGL);
> + if (nandc->props->qpic_v2 && nandc->props->page_scope) {
> + if (qcom_nandc_is_last_cw(ecc, cw))
> + write_reg_dma(nandc, NAND_EXEC_CMD, 1,
> + NAND_BAM_NEXT_SGL);
> + } else {
> + write_reg_dma(nandc, NAND_EXEC_CMD, 1, NAND_BAM_NEXT_SGL);
> + read_reg_dma(nandc, NAND_FLASH_STATUS, 2, 0);
> + read_reg_dma(nandc, NAND_ERASED_CW_DETECT_STATUS, 1,
> + NAND_BAM_NEXT_SGL);
> + }
You need to add a comment for this.
Thanks,
Mani
next prev parent reply other threads:[~2021-09-28 16:13 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-09-15 9:57 [PATCH 0/3] Add support for page scope read Md Sadre Alam
2021-09-15 9:57 ` Md Sadre Alam
2021-09-15 9:57 ` [PATCH 1/3] mtd: rawnand: qcom: Add support for status pipe Md Sadre Alam
2021-09-15 9:57 ` Md Sadre Alam
2021-09-28 12:17 ` mdalam
2021-09-28 12:17 ` mdalam
2021-09-28 12:46 ` Miquel Raynal
2021-09-28 12:46 ` Miquel Raynal
2021-09-28 15:52 ` Manivannan Sadhasivam
2021-09-28 15:52 ` Manivannan Sadhasivam
2021-09-15 9:57 ` [PATCH 2/3] mtd: rawnand: qcom: Add sg list to handle status pipe request Md Sadre Alam
2021-09-15 9:57 ` Md Sadre Alam
2021-09-28 12:20 ` mdalam
2021-09-28 12:20 ` mdalam
2021-09-28 12:48 ` Miquel Raynal
2021-09-28 12:48 ` Miquel Raynal
2021-09-28 16:03 ` Manivannan Sadhasivam
2021-09-28 16:03 ` Manivannan Sadhasivam
2021-09-15 9:57 ` [PATCH 3/3] mtd: rawnand: qcom: Add support for page scope read Md Sadre Alam
2021-09-15 9:57 ` Md Sadre Alam
2021-09-28 12:21 ` mdalam
2021-09-28 12:21 ` mdalam
2021-09-28 12:54 ` Miquel Raynal
2021-09-28 12:54 ` Miquel Raynal
2021-09-28 16:12 ` Manivannan Sadhasivam [this message]
2021-09-28 16:12 ` Manivannan Sadhasivam
2021-09-28 15:17 ` [PATCH 0/3] " Manivannan Sadhasivam
2021-09-28 15:17 ` Manivannan Sadhasivam
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=20210928161219.GD12183@thinkpad \
--to=mani@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-mtd@lists.infradead.org \
--cc=mdalam@codeaurora.org \
--cc=miquel.raynal@bootlin.com \
--cc=sricharan@codeaurora.org \
/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.