From: Miquel Raynal <miquel.raynal@bootlin.com> To: Masahiro Yamada <yamada.masahiro@socionext.com> Cc: linux-mtd@lists.infradead.org, Boris Brezillon <bbrezillon@kernel.org>, Brian Norris <computersforpeace@gmail.com>, linux-kernel@vger.kernel.org, Marek Vasut <marek.vasut@gmail.com>, Richard Weinberger <richard@nod.at>, David Woodhouse <dwmw2@infradead.org> Subject: Re: [PATCH v3 2/9] mtd: rawnand: denali: refactor syndrome layout handling for raw access Date: Tue, 12 Mar 2019 11:28:11 +0100 [thread overview] Message-ID: <20190312112811.1af0bb00@xps13> (raw) In-Reply-To: <1552380290-19951-3-git-send-email-yamada.masahiro@socionext.com> Hi Masahiro, Masahiro Yamada <yamada.masahiro@socionext.com> wrote on Tue, 12 Mar 2019 17:44:43 +0900: > The Denali IP adopts the syndrome page layout (payload and ECC are > interleaved). The *_page_raw() and *_oob() callbacks are complicated > because they must hide the underlying layout used by the hardware, > and always return contiguous in-band and out-of-band data. > > Currently, similar code is duplicated to reorganize the data layout. > For example, denali_read_page_raw() and denali_write_page_raw() look > almost the same. > > The idea for refactoring is to split the code into two parts: > [1] conversion of page layout > [2] what to do at every ECC chunk boundary > > For [1], I wrote denali_raw_payload_op() and denali_raw_oob_op(). > They manipulate data for the Denali controller's specific page layout > of in-band, out-of-band, respectively. > > The difference between write and read is just the operation at > ECC chunk boundaries. For example, denali_read_oob() calls > nand_change_read_column_op(), whereas denali_write_oob() calls > nand_change_write_column_op(). So, I implemented [2] as a callback > passed into [1]. > > Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> > --- > [...] > static int denali_read_page_raw(struct nand_chip *chip, uint8_t *buf, > int oob_required, int page) > { > + struct denali_nand_info *denali = to_denali(chip); > struct mtd_info *mtd = nand_to_mtd(chip); > - struct denali_nand_info *denali = mtd_to_denali(mtd); > - int writesize = mtd->writesize; > - int oobsize = mtd->oobsize; > - int ecc_steps = chip->ecc.steps; > - int ecc_size = chip->ecc.size; > - int ecc_bytes = chip->ecc.bytes; > void *tmp_buf = denali->buf; > - int oob_skip = denali->oob_skip_bytes; > - size_t size = writesize + oobsize; > - int ret, i, pos, len; > + size_t size = mtd->writesize + mtd->oobsize; > + int ret; > + > + if (!buf) > + return -EINVAL; > > ret = denali_data_xfer(chip, tmp_buf, size, page, 1, 0); > if (ret) > return ret; > > - /* Arrange the buffer for syndrome payload/ecc layout */ > - if (buf) { > - for (i = 0; i < ecc_steps; i++) { > - pos = i * (ecc_size + ecc_bytes); > - len = ecc_size; > - > - if (pos >= writesize) > - pos += oob_skip; > - else if (pos + len > writesize) > - len = writesize - pos; > - > - memcpy(buf, tmp_buf + pos, len); > - buf += len; > - if (len < ecc_size) { > - len = ecc_size - len; > - memcpy(buf, tmp_buf + writesize + oob_skip, > - len); > - buf += len; > - } > - } > - } > + ret = denali_raw_payload_op(chip, buf, denali_memcpy_in, tmp_buf); Honestly, I still don't like passing denali_memcpy_in/out as parameter. Besides that, once you'll have added helpers to avoid abusing the ternary operator in 4/9, the rest looks fine by me. Thanks, Miquèl
WARNING: multiple messages have this Message-ID (diff)
From: Miquel Raynal <miquel.raynal@bootlin.com> To: Masahiro Yamada <yamada.masahiro@socionext.com> Cc: Boris Brezillon <bbrezillon@kernel.org>, Richard Weinberger <richard@nod.at>, linux-kernel@vger.kernel.org, Marek Vasut <marek.vasut@gmail.com>, linux-mtd@lists.infradead.org, Brian Norris <computersforpeace@gmail.com>, David Woodhouse <dwmw2@infradead.org> Subject: Re: [PATCH v3 2/9] mtd: rawnand: denali: refactor syndrome layout handling for raw access Date: Tue, 12 Mar 2019 11:28:11 +0100 [thread overview] Message-ID: <20190312112811.1af0bb00@xps13> (raw) In-Reply-To: <1552380290-19951-3-git-send-email-yamada.masahiro@socionext.com> Hi Masahiro, Masahiro Yamada <yamada.masahiro@socionext.com> wrote on Tue, 12 Mar 2019 17:44:43 +0900: > The Denali IP adopts the syndrome page layout (payload and ECC are > interleaved). The *_page_raw() and *_oob() callbacks are complicated > because they must hide the underlying layout used by the hardware, > and always return contiguous in-band and out-of-band data. > > Currently, similar code is duplicated to reorganize the data layout. > For example, denali_read_page_raw() and denali_write_page_raw() look > almost the same. > > The idea for refactoring is to split the code into two parts: > [1] conversion of page layout > [2] what to do at every ECC chunk boundary > > For [1], I wrote denali_raw_payload_op() and denali_raw_oob_op(). > They manipulate data for the Denali controller's specific page layout > of in-band, out-of-band, respectively. > > The difference between write and read is just the operation at > ECC chunk boundaries. For example, denali_read_oob() calls > nand_change_read_column_op(), whereas denali_write_oob() calls > nand_change_write_column_op(). So, I implemented [2] as a callback > passed into [1]. > > Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> > --- > [...] > static int denali_read_page_raw(struct nand_chip *chip, uint8_t *buf, > int oob_required, int page) > { > + struct denali_nand_info *denali = to_denali(chip); > struct mtd_info *mtd = nand_to_mtd(chip); > - struct denali_nand_info *denali = mtd_to_denali(mtd); > - int writesize = mtd->writesize; > - int oobsize = mtd->oobsize; > - int ecc_steps = chip->ecc.steps; > - int ecc_size = chip->ecc.size; > - int ecc_bytes = chip->ecc.bytes; > void *tmp_buf = denali->buf; > - int oob_skip = denali->oob_skip_bytes; > - size_t size = writesize + oobsize; > - int ret, i, pos, len; > + size_t size = mtd->writesize + mtd->oobsize; > + int ret; > + > + if (!buf) > + return -EINVAL; > > ret = denali_data_xfer(chip, tmp_buf, size, page, 1, 0); > if (ret) > return ret; > > - /* Arrange the buffer for syndrome payload/ecc layout */ > - if (buf) { > - for (i = 0; i < ecc_steps; i++) { > - pos = i * (ecc_size + ecc_bytes); > - len = ecc_size; > - > - if (pos >= writesize) > - pos += oob_skip; > - else if (pos + len > writesize) > - len = writesize - pos; > - > - memcpy(buf, tmp_buf + pos, len); > - buf += len; > - if (len < ecc_size) { > - len = ecc_size - len; > - memcpy(buf, tmp_buf + writesize + oob_skip, > - len); > - buf += len; > - } > - } > - } > + ret = denali_raw_payload_op(chip, buf, denali_memcpy_in, tmp_buf); Honestly, I still don't like passing denali_memcpy_in/out as parameter. Besides that, once you'll have added helpers to avoid abusing the ternary operator in 4/9, the rest looks fine by me. Thanks, Miquèl ______________________________________________________ Linux MTD discussion mailing list http://lists.infradead.org/mailman/listinfo/linux-mtd/
next prev parent reply other threads:[~2019-03-12 10:28 UTC|newest] Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-03-12 8:44 [PATCH v3 0/9] mtd: rawnand: denali: exec_op(), controller/chip separation, and cleanups Masahiro Yamada 2019-03-12 8:44 ` Masahiro Yamada 2019-03-12 8:44 ` [PATCH v3 1/9] mtd: rawnand: denali: use nand_chip pointer more for internal functions Masahiro Yamada 2019-03-12 8:44 ` Masahiro Yamada 2019-03-12 8:44 ` [PATCH v3 2/9] mtd: rawnand: denali: refactor syndrome layout handling for raw access Masahiro Yamada 2019-03-12 8:44 ` Masahiro Yamada 2019-03-12 10:28 ` Miquel Raynal [this message] 2019-03-12 10:28 ` Miquel Raynal 2019-03-12 10:51 ` Masahiro Yamada 2019-03-12 10:51 ` Masahiro Yamada 2019-03-12 10:54 ` Miquel Raynal 2019-03-12 10:54 ` Miquel Raynal 2019-03-12 11:07 ` Masahiro Yamada 2019-03-12 11:07 ` Masahiro Yamada 2019-03-12 13:13 ` Miquel Raynal 2019-03-12 13:13 ` Miquel Raynal 2019-03-14 8:24 ` Masahiro Yamada 2019-03-14 8:24 ` Masahiro Yamada 2019-03-15 8:34 ` Miquel Raynal 2019-03-15 8:34 ` Miquel Raynal 2019-03-29 7:02 ` Masahiro Yamada 2019-03-29 7:02 ` Masahiro Yamada 2019-03-12 8:44 ` [PATCH v3 3/9] mtd: rawnand: denali: remove unneeded casts in denali_{read,write}_pio Masahiro Yamada 2019-03-12 8:44 ` [PATCH v3 3/9] mtd: rawnand: denali: remove unneeded casts in denali_{read, write}_pio Masahiro Yamada 2019-03-12 8:44 ` [PATCH v3 4/9] mtd: rawnand: denali: switch over to ->exec_op() from legacy hooks Masahiro Yamada 2019-03-12 8:44 ` Masahiro Yamada 2019-03-12 9:02 ` Boris Brezillon 2019-03-12 9:02 ` Boris Brezillon 2019-03-12 9:47 ` Masahiro Yamada 2019-03-12 9:47 ` Masahiro Yamada 2019-03-12 8:44 ` [PATCH v3 5/9] mtd: rawnand: denali: use bool type instead of int where appropriate Masahiro Yamada 2019-03-12 8:44 ` Masahiro Yamada 2019-03-12 8:44 ` [PATCH v3 6/9] mtd: rawnand: denali_pci: rename goto labels Masahiro Yamada 2019-03-12 8:44 ` Masahiro Yamada 2019-03-12 8:44 ` [PATCH v3 7/9] mtd: rawnand: denali: decouple controller and NAND chips Masahiro Yamada 2019-03-12 8:44 ` Masahiro Yamada 2019-03-12 8:44 ` [PATCH v3 8/9] mtd: rawnand: denali: remove DENALI_NR_BANKS macro Masahiro Yamada 2019-03-12 8:44 ` Masahiro Yamada 2019-03-12 8:44 ` [PATCH v3 9/9] mtd: rawnand: denali: clean up coding style Masahiro Yamada 2019-03-12 8: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=20190312112811.1af0bb00@xps13 \ --to=miquel.raynal@bootlin.com \ --cc=bbrezillon@kernel.org \ --cc=computersforpeace@gmail.com \ --cc=dwmw2@infradead.org \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-mtd@lists.infradead.org \ --cc=marek.vasut@gmail.com \ --cc=richard@nod.at \ --cc=yamada.masahiro@socionext.com \ /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: linkBe 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.