hw/block/nand: Factor nand_load_iolen() method out

Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Message-Id: <20240409135944.24997-2-philmd@linaro.org>
This commit is contained in:
Philippe Mathieu-Daudé 2024-04-08 10:10:11 +02:00
parent aa88f99c87
commit 7a86544f28

View File

@ -243,9 +243,28 @@ static inline void nand_pushio_byte(NANDFlashState *s, uint8_t value)
} }
} }
/*
* nand_load_block: Load block containing (s->addr + @offset).
* Returns length of data available at @offset in this block.
*/
static unsigned nand_load_block(NANDFlashState *s, unsigned offset)
{
unsigned iolen;
s->blk_load(s, s->addr, offset);
iolen = (1 << s->page_shift);
if (s->gnd) {
iolen += 1 << s->oob_shift;
}
assert(offset <= iolen);
iolen -= offset;
return iolen;
}
static void nand_command(NANDFlashState *s) static void nand_command(NANDFlashState *s)
{ {
unsigned int offset;
switch (s->cmd) { switch (s->cmd) {
case NAND_CMD_READ0: case NAND_CMD_READ0:
s->iolen = 0; s->iolen = 0;
@ -271,12 +290,7 @@ static void nand_command(NANDFlashState *s)
case NAND_CMD_NOSERIALREAD2: case NAND_CMD_NOSERIALREAD2:
if (!(nand_flash_ids[s->chip_id].options & NAND_SAMSUNG_LP)) if (!(nand_flash_ids[s->chip_id].options & NAND_SAMSUNG_LP))
break; break;
offset = s->addr & ((1 << s->addr_shift) - 1); s->iolen = nand_load_block(s, s->addr & ((1 << s->addr_shift) - 1));
s->blk_load(s, s->addr, offset);
if (s->gnd)
s->iolen = (1 << s->page_shift) - offset;
else
s->iolen = (1 << s->page_shift) + (1 << s->oob_shift) - offset;
break; break;
case NAND_CMD_RESET: case NAND_CMD_RESET:
@ -597,12 +611,7 @@ uint32_t nand_getio(DeviceState *dev)
if (!s->iolen && s->cmd == NAND_CMD_READ0) { if (!s->iolen && s->cmd == NAND_CMD_READ0) {
offset = (int) (s->addr & ((1 << s->addr_shift) - 1)) + s->offset; offset = (int) (s->addr & ((1 << s->addr_shift) - 1)) + s->offset;
s->offset = 0; s->offset = 0;
s->iolen = nand_load_block(s, offset);
s->blk_load(s, s->addr, offset);
if (s->gnd)
s->iolen = (1 << s->page_shift) - offset;
else
s->iolen = (1 << s->page_shift) + (1 << s->oob_shift) - offset;
} }
if (s->ce || s->iolen <= 0) { if (s->ce || s->iolen <= 0) {