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:
parent
aa88f99c87
commit
7a86544f28
@ -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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user