Hello, On 2/17/20 4:47 PM, Cédric Le Goater wrote: > Hello all, > > On 2/6/20 7:32 PM, Guenter Roeck wrote: >> While at it, add some trace messages to help debug problems >> seen when running the latest Linux kernel. > > Through which tree do you think it is best to merge this patchset ? > block or arm ?
It would be nice to have these 4 patches for 5.0. All are reviewed and tested. Thanks, C. >> Signed-off-by: Guenter Roeck <[email protected]> >> --- >> v2: Print pointer to Flash data structure as flash ID with each trace >> message to support systems with more than one instantiated flash. >> >> hw/block/m25p80.c | 48 ++++++++++++++++++++----------------------- >> hw/block/trace-events | 16 +++++++++++++++ >> 2 files changed, 38 insertions(+), 26 deletions(-) >> >> diff --git a/hw/block/m25p80.c b/hw/block/m25p80.c >> index 61f2fb8f8f..5ff8d270c4 100644 >> --- a/hw/block/m25p80.c >> +++ b/hw/block/m25p80.c >> @@ -32,17 +32,7 @@ >> #include "qemu/module.h" >> #include "qemu/error-report.h" >> #include "qapi/error.h" >> - >> -#ifndef M25P80_ERR_DEBUG >> -#define M25P80_ERR_DEBUG 0 >> -#endif >> - >> -#define DB_PRINT_L(level, ...) do { \ >> - if (M25P80_ERR_DEBUG > (level)) { \ >> - fprintf(stderr, ": %s: ", __func__); \ >> - fprintf(stderr, ## __VA_ARGS__); \ >> - } \ >> -} while (0) >> +#include "trace.h" >> >> /* Fields for FlashPartInfo->flags */ >> >> @@ -574,7 +564,8 @@ static void flash_erase(Flash *s, int offset, FlashCMD >> cmd) >> abort(); >> } >> >> - DB_PRINT_L(0, "offset = %#x, len = %d\n", offset, len); >> + trace_m25p80_flash_erase(s, offset, len); >> + >> if ((s->pi->flags & capa_to_assert) != capa_to_assert) { >> qemu_log_mask(LOG_GUEST_ERROR, "M25P80: %d erase size not supported >> by" >> " device\n", len); >> @@ -607,8 +598,7 @@ void flash_write8(Flash *s, uint32_t addr, uint8_t data) >> } >> >> if ((prev ^ data) & data) { >> - DB_PRINT_L(1, "programming zero to one! addr=%" PRIx32 " %" PRIx8 >> - " -> %" PRIx8 "\n", addr, prev, data); >> + trace_m25p80_programming_zero_to_one(s, addr, prev, data); >> } >> >> if (s->pi->flags & EEPROM) { >> @@ -662,6 +652,9 @@ static void complete_collecting_data(Flash *s) >> >> s->state = STATE_IDLE; >> >> + trace_m25p80_complete_collecting(s, s->cmd_in_progress, n, s->ear, >> + s->cur_addr); >> + >> switch (s->cmd_in_progress) { >> case DPP: >> case QPP: >> @@ -825,7 +818,7 @@ static void reset_memory(Flash *s) >> break; >> } >> >> - DB_PRINT_L(0, "Reset done.\n"); >> + trace_m25p80_reset_done(s); >> } >> >> static void decode_fast_read_cmd(Flash *s) >> @@ -941,9 +934,10 @@ static void decode_qio_read_cmd(Flash *s) >> >> static void decode_new_cmd(Flash *s, uint32_t value) >> { >> - s->cmd_in_progress = value; >> int i; >> - DB_PRINT_L(0, "decoded new command:%x\n", value); >> + >> + s->cmd_in_progress = value; >> + trace_m25p80_command_decoded(s, value); >> >> if (value != RESET_MEMORY) { >> s->reset_enable = false; >> @@ -1042,7 +1036,7 @@ static void decode_new_cmd(Flash *s, uint32_t value) >> break; >> >> case JEDEC_READ: >> - DB_PRINT_L(0, "populated jedec code\n"); >> + trace_m25p80_populated_jedec(s); >> for (i = 0; i < s->pi->id_len; i++) { >> s->data[i] = s->pi->id[i]; >> } >> @@ -1063,7 +1057,7 @@ static void decode_new_cmd(Flash *s, uint32_t value) >> case BULK_ERASE_60: >> case BULK_ERASE: >> if (s->write_enable) { >> - DB_PRINT_L(0, "chip erase\n"); >> + trace_m25p80_chip_erase(s); >> flash_erase(s, 0, BULK_ERASE); >> } else { >> qemu_log_mask(LOG_GUEST_ERROR, "M25P80: chip erase with write " >> @@ -1184,7 +1178,7 @@ static int m25p80_cs(SSISlave *ss, bool select) >> s->data_read_loop = false; >> } >> >> - DB_PRINT_L(0, "%sselect\n", select ? "de" : ""); >> + trace_m25p80_select(s, select ? "de" : ""); >> >> return 0; >> } >> @@ -1194,19 +1188,20 @@ static uint32_t m25p80_transfer8(SSISlave *ss, >> uint32_t tx) >> Flash *s = M25P80(ss); >> uint32_t r = 0; >> >> + trace_m25p80_transfer(s, s->state, s->len, s->needed_bytes, s->pos, >> + s->cur_addr, (uint8_t)tx); >> + >> switch (s->state) { >> >> case STATE_PAGE_PROGRAM: >> - DB_PRINT_L(1, "page program cur_addr=%#" PRIx32 " data=%" PRIx8 >> "\n", >> - s->cur_addr, (uint8_t)tx); >> + trace_m25p80_page_program(s, s->cur_addr, (uint8_t)tx); >> flash_write8(s, s->cur_addr, (uint8_t)tx); >> s->cur_addr = (s->cur_addr + 1) & (s->size - 1); >> break; >> >> case STATE_READ: >> r = s->storage[s->cur_addr]; >> - DB_PRINT_L(1, "READ 0x%" PRIx32 "=%" PRIx8 "\n", s->cur_addr, >> - (uint8_t)r); >> + trace_m25p80_read_byte(s, s->cur_addr, (uint8_t)r); >> s->cur_addr = (s->cur_addr + 1) & (s->size - 1); >> break; >> >> @@ -1244,6 +1239,7 @@ static uint32_t m25p80_transfer8(SSISlave *ss, >> uint32_t tx) >> } >> >> r = s->data[s->pos]; >> + trace_m25p80_read_data(s, s->pos, (uint8_t)r); >> s->pos++; >> if (s->pos == s->len) { >> s->pos = 0; >> @@ -1281,7 +1277,7 @@ static void m25p80_realize(SSISlave *ss, Error **errp) >> return; >> } >> >> - DB_PRINT_L(0, "Binding to IF_MTD drive\n"); >> + trace_m25p80_binding(s); >> s->storage = blk_blockalign(s->blk, s->size); >> >> if (blk_pread(s->blk, 0, s->storage, s->size) != s->size) { >> @@ -1289,7 +1285,7 @@ static void m25p80_realize(SSISlave *ss, Error **errp) >> return; >> } >> } else { >> - DB_PRINT_L(0, "No BDRV - binding to RAM\n"); >> + trace_m25p80_binding_no_bdrv(s); >> s->storage = blk_blockalign(NULL, s->size); >> memset(s->storage, 0xFF, s->size); >> } >> diff --git a/hw/block/trace-events b/hw/block/trace-events >> index c03e80c2c9..f78939fa9d 100644 >> --- a/hw/block/trace-events >> +++ b/hw/block/trace-events >> @@ -134,3 +134,19 @@ xen_block_blockdev_add(char *str) "%s" >> xen_block_blockdev_del(const char *node_name) "%s" >> xen_block_device_create(unsigned int number) "%u" >> xen_block_device_destroy(unsigned int number) "%u" >> + >> +# m25p80.c >> +m25p80_flash_erase(void *s, int offset, uint32_t len) "[%p] offset = >> 0x%"PRIx32", len = %u" >> +m25p80_programming_zero_to_one(void *s, uint32_t addr, uint8_t prev, >> uint8_t data) "[%p] programming zero to one! addr=0x%"PRIx32" 0x%"PRIx8" -> >> 0x%"PRIx8 >> +m25p80_reset_done(void *s) "[%p] Reset done." >> +m25p80_command_decoded(void *s, uint32_t cmd) "[%p] new command:0x%"PRIx32 >> +m25p80_complete_collecting(void *s, uint32_t cmd, int n, uint8_t ear, >> uint32_t cur_addr) "[%p] decode cmd: 0x%"PRIx32" len %d ear 0x%"PRIx8" addr >> 0x%"PRIx32 >> +m25p80_populated_jedec(void *s) "[%p] populated jedec code" >> +m25p80_chip_erase(void *s) "[%p] chip erase" >> +m25p80_select(void *s, const char *what) "[%p] %sselect" >> +m25p80_page_program(void *s, uint32_t addr, uint8_t tx) "[%p] page program >> cur_addr=0x%"PRIx32" data=0x%"PRIx8 >> +m25p80_transfer(void *s, uint8_t state, uint32_t len, uint8_t needed, >> uint32_t pos, uint32_t cur_addr, uint8_t t) "[%p] Transfer state 0x%"PRIx8" >> len 0x%"PRIx32" needed 0x%"PRIx8" pos 0x%"PRIx32" addr 0x%"PRIx32" tx >> 0x%"PRIx8 >> +m25p80_read_byte(void *s, uint32_t addr, uint8_t v) "[%p] Read byte >> 0x%"PRIx32"=0x%"PRIx8 >> +m25p80_read_data(void *s, uint32_t pos, uint8_t v) "[%p] Read data >> 0x%"PRIx32"=0x%"PRIx8 >> +m25p80_binding(void *s) "[%p] Binding to IF_MTD drive" >> +m25p80_binding_no_bdrv(void *s) "[%p] No BDRV - binding to RAM" >> >
