hw/char/exynos4210_uart: Convert to support tracing
Replace debug code with tracing to aid debugging. Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Guenter Roeck <linux@roeck-us.net> Message-id: 20200123052540.6132-5-linux@roeck-us.net Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
parent
dab15fbe2a
commit
6804d2301b
@ -31,45 +31,7 @@
|
|||||||
#include "hw/irq.h"
|
#include "hw/irq.h"
|
||||||
#include "hw/qdev-properties.h"
|
#include "hw/qdev-properties.h"
|
||||||
|
|
||||||
#undef DEBUG_UART
|
#include "trace.h"
|
||||||
#undef DEBUG_UART_EXTEND
|
|
||||||
#undef DEBUG_IRQ
|
|
||||||
#undef DEBUG_Rx_DATA
|
|
||||||
#undef DEBUG_Tx_DATA
|
|
||||||
|
|
||||||
#define DEBUG_UART 0
|
|
||||||
#define DEBUG_UART_EXTEND 0
|
|
||||||
#define DEBUG_IRQ 0
|
|
||||||
#define DEBUG_Rx_DATA 0
|
|
||||||
#define DEBUG_Tx_DATA 0
|
|
||||||
|
|
||||||
#if DEBUG_UART
|
|
||||||
#define PRINT_DEBUG(fmt, args...) \
|
|
||||||
do { \
|
|
||||||
fprintf(stderr, " [%s:%d] "fmt, __func__, __LINE__, ##args); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#if DEBUG_UART_EXTEND
|
|
||||||
#define PRINT_DEBUG_EXTEND(fmt, args...) \
|
|
||||||
do { \
|
|
||||||
fprintf(stderr, " [%s:%d] "fmt, __func__, __LINE__, ##args); \
|
|
||||||
} while (0)
|
|
||||||
#else
|
|
||||||
#define PRINT_DEBUG_EXTEND(fmt, args...) \
|
|
||||||
do {} while (0)
|
|
||||||
#endif /* EXTEND */
|
|
||||||
|
|
||||||
#else
|
|
||||||
#define PRINT_DEBUG(fmt, args...) \
|
|
||||||
do {} while (0)
|
|
||||||
#define PRINT_DEBUG_EXTEND(fmt, args...) \
|
|
||||||
do {} while (0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define PRINT_ERROR(fmt, args...) \
|
|
||||||
do { \
|
|
||||||
fprintf(stderr, " [%s:%d] "fmt, __func__, __LINE__, ##args); \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Offsets for UART registers relative to SFR base address
|
* Offsets for UART registers relative to SFR base address
|
||||||
@ -193,8 +155,7 @@ typedef struct Exynos4210UartState {
|
|||||||
} Exynos4210UartState;
|
} Exynos4210UartState;
|
||||||
|
|
||||||
|
|
||||||
#if DEBUG_UART
|
/* Used only for tracing */
|
||||||
/* Used only for debugging inside PRINT_DEBUG_... macros */
|
|
||||||
static const char *exynos4210_uart_regname(hwaddr offset)
|
static const char *exynos4210_uart_regname(hwaddr offset)
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -208,7 +169,6 @@ static const char *exynos4210_uart_regname(hwaddr offset)
|
|||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
static void fifo_store(Exynos4210UartFIFO *q, uint8_t ch)
|
static void fifo_store(Exynos4210UartFIFO *q, uint8_t ch)
|
||||||
@ -271,7 +231,7 @@ static uint32_t exynos4210_uart_Tx_FIFO_trigger_level(const Exynos4210UartState
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
level = 0;
|
level = 0;
|
||||||
PRINT_ERROR("Wrong UART channel number: %d\n", s->channel);
|
trace_exynos_uart_channel_error(s->channel);
|
||||||
}
|
}
|
||||||
|
|
||||||
return level;
|
return level;
|
||||||
@ -297,14 +257,10 @@ static void exynos4210_uart_update_irq(Exynos4210UartState *s)
|
|||||||
|
|
||||||
if (s->reg[I_(UINTP)]) {
|
if (s->reg[I_(UINTP)]) {
|
||||||
qemu_irq_raise(s->irq);
|
qemu_irq_raise(s->irq);
|
||||||
|
trace_exynos_uart_irq_raised(s->channel, s->reg[I_(UINTP)]);
|
||||||
#if DEBUG_IRQ
|
|
||||||
fprintf(stderr, "UART%d: IRQ has been raised: %08x\n",
|
|
||||||
s->channel, s->reg[I_(UINTP)]);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
qemu_irq_lower(s->irq);
|
qemu_irq_lower(s->irq);
|
||||||
|
trace_exynos_uart_irq_lowered(s->channel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -348,7 +304,7 @@ static void exynos4210_uart_update_parameters(Exynos4210UartState *s)
|
|||||||
|
|
||||||
qemu_chr_fe_ioctl(&s->chr, CHR_IOCTL_SERIAL_SET_PARAMS, &ssp);
|
qemu_chr_fe_ioctl(&s->chr, CHR_IOCTL_SERIAL_SET_PARAMS, &ssp);
|
||||||
|
|
||||||
PRINT_DEBUG("UART%d: speed: %d, parity: %c, data: %d, stop: %d\n",
|
trace_exynos_uart_update_params(
|
||||||
s->channel, speed, parity, data_bits, stop_bits);
|
s->channel, speed, parity, data_bits, stop_bits);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -358,8 +314,8 @@ static void exynos4210_uart_write(void *opaque, hwaddr offset,
|
|||||||
Exynos4210UartState *s = (Exynos4210UartState *)opaque;
|
Exynos4210UartState *s = (Exynos4210UartState *)opaque;
|
||||||
uint8_t ch;
|
uint8_t ch;
|
||||||
|
|
||||||
PRINT_DEBUG_EXTEND("UART%d: <0x%04x> %s <- 0x%08llx\n", s->channel,
|
trace_exynos_uart_write(s->channel, offset,
|
||||||
offset, exynos4210_uart_regname(offset), (long long unsigned int)val);
|
exynos4210_uart_regname(offset), val);
|
||||||
|
|
||||||
switch (offset) {
|
switch (offset) {
|
||||||
case ULCON:
|
case ULCON:
|
||||||
@ -373,12 +329,12 @@ static void exynos4210_uart_write(void *opaque, hwaddr offset,
|
|||||||
if (val & UFCON_Rx_FIFO_RESET) {
|
if (val & UFCON_Rx_FIFO_RESET) {
|
||||||
fifo_reset(&s->rx);
|
fifo_reset(&s->rx);
|
||||||
s->reg[I_(UFCON)] &= ~UFCON_Rx_FIFO_RESET;
|
s->reg[I_(UFCON)] &= ~UFCON_Rx_FIFO_RESET;
|
||||||
PRINT_DEBUG("UART%d: Rx FIFO Reset\n", s->channel);
|
trace_exynos_uart_rx_fifo_reset(s->channel);
|
||||||
}
|
}
|
||||||
if (val & UFCON_Tx_FIFO_RESET) {
|
if (val & UFCON_Tx_FIFO_RESET) {
|
||||||
fifo_reset(&s->tx);
|
fifo_reset(&s->tx);
|
||||||
s->reg[I_(UFCON)] &= ~UFCON_Tx_FIFO_RESET;
|
s->reg[I_(UFCON)] &= ~UFCON_Tx_FIFO_RESET;
|
||||||
PRINT_DEBUG("UART%d: Tx FIFO Reset\n", s->channel);
|
trace_exynos_uart_tx_fifo_reset(s->channel);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -390,9 +346,7 @@ static void exynos4210_uart_write(void *opaque, hwaddr offset,
|
|||||||
/* XXX this blocks entire thread. Rewrite to use
|
/* XXX this blocks entire thread. Rewrite to use
|
||||||
* qemu_chr_fe_write and background I/O callbacks */
|
* qemu_chr_fe_write and background I/O callbacks */
|
||||||
qemu_chr_fe_write_all(&s->chr, &ch, 1);
|
qemu_chr_fe_write_all(&s->chr, &ch, 1);
|
||||||
#if DEBUG_Tx_DATA
|
trace_exynos_uart_tx(s->channel, ch);
|
||||||
fprintf(stderr, "%c", ch);
|
|
||||||
#endif
|
|
||||||
s->reg[I_(UTRSTAT)] |= UTRSTAT_TRANSMITTER_EMPTY |
|
s->reg[I_(UTRSTAT)] |= UTRSTAT_TRANSMITTER_EMPTY |
|
||||||
UTRSTAT_Tx_BUFFER_EMPTY;
|
UTRSTAT_Tx_BUFFER_EMPTY;
|
||||||
s->reg[I_(UINTSP)] |= UINTSP_TXD;
|
s->reg[I_(UINTSP)] |= UINTSP_TXD;
|
||||||
@ -403,8 +357,7 @@ static void exynos4210_uart_write(void *opaque, hwaddr offset,
|
|||||||
case UINTP:
|
case UINTP:
|
||||||
s->reg[I_(UINTP)] &= ~val;
|
s->reg[I_(UINTP)] &= ~val;
|
||||||
s->reg[I_(UINTSP)] &= ~val;
|
s->reg[I_(UINTSP)] &= ~val;
|
||||||
PRINT_DEBUG("UART%d: UINTP [%04x] have been cleared: %08x\n",
|
trace_exynos_uart_intclr(s->channel, s->reg[I_(UINTP)]);
|
||||||
s->channel, offset, s->reg[I_(UINTP)]);
|
|
||||||
exynos4210_uart_update_irq(s);
|
exynos4210_uart_update_irq(s);
|
||||||
break;
|
break;
|
||||||
case UTRSTAT:
|
case UTRSTAT:
|
||||||
@ -412,7 +365,7 @@ static void exynos4210_uart_write(void *opaque, hwaddr offset,
|
|||||||
case UFSTAT:
|
case UFSTAT:
|
||||||
case UMSTAT:
|
case UMSTAT:
|
||||||
case URXH:
|
case URXH:
|
||||||
PRINT_DEBUG("UART%d: Trying to write into RO register: %s [%04x]\n",
|
trace_exynos_uart_ro_write(
|
||||||
s->channel, exynos4210_uart_regname(offset), offset);
|
s->channel, exynos4210_uart_regname(offset), offset);
|
||||||
break;
|
break;
|
||||||
case UINTSP:
|
case UINTSP:
|
||||||
@ -439,6 +392,8 @@ static uint64_t exynos4210_uart_read(void *opaque, hwaddr offset,
|
|||||||
case UERSTAT: /* Read Only */
|
case UERSTAT: /* Read Only */
|
||||||
res = s->reg[I_(UERSTAT)];
|
res = s->reg[I_(UERSTAT)];
|
||||||
s->reg[I_(UERSTAT)] = 0;
|
s->reg[I_(UERSTAT)] = 0;
|
||||||
|
trace_exynos_uart_read(s->channel, offset,
|
||||||
|
exynos4210_uart_regname(offset), res);
|
||||||
return res;
|
return res;
|
||||||
case UFSTAT: /* Read Only */
|
case UFSTAT: /* Read Only */
|
||||||
s->reg[I_(UFSTAT)] = fifo_elements_number(&s->rx) & 0xff;
|
s->reg[I_(UFSTAT)] = fifo_elements_number(&s->rx) & 0xff;
|
||||||
@ -446,20 +401,22 @@ static uint64_t exynos4210_uart_read(void *opaque, hwaddr offset,
|
|||||||
s->reg[I_(UFSTAT)] |= UFSTAT_Rx_FIFO_FULL;
|
s->reg[I_(UFSTAT)] |= UFSTAT_Rx_FIFO_FULL;
|
||||||
s->reg[I_(UFSTAT)] &= ~0xff;
|
s->reg[I_(UFSTAT)] &= ~0xff;
|
||||||
}
|
}
|
||||||
|
trace_exynos_uart_read(s->channel, offset,
|
||||||
|
exynos4210_uart_regname(offset),
|
||||||
|
s->reg[I_(UFSTAT)]);
|
||||||
return s->reg[I_(UFSTAT)];
|
return s->reg[I_(UFSTAT)];
|
||||||
case URXH:
|
case URXH:
|
||||||
if (s->reg[I_(UFCON)] & UFCON_FIFO_ENABLE) {
|
if (s->reg[I_(UFCON)] & UFCON_FIFO_ENABLE) {
|
||||||
if (fifo_elements_number(&s->rx)) {
|
if (fifo_elements_number(&s->rx)) {
|
||||||
res = fifo_retrieve(&s->rx);
|
res = fifo_retrieve(&s->rx);
|
||||||
#if DEBUG_Rx_DATA
|
trace_exynos_uart_rx(s->channel, res);
|
||||||
fprintf(stderr, "%c", res);
|
|
||||||
#endif
|
|
||||||
if (!fifo_elements_number(&s->rx)) {
|
if (!fifo_elements_number(&s->rx)) {
|
||||||
s->reg[I_(UTRSTAT)] &= ~UTRSTAT_Rx_BUFFER_DATA_READY;
|
s->reg[I_(UTRSTAT)] &= ~UTRSTAT_Rx_BUFFER_DATA_READY;
|
||||||
} else {
|
} else {
|
||||||
s->reg[I_(UTRSTAT)] |= UTRSTAT_Rx_BUFFER_DATA_READY;
|
s->reg[I_(UTRSTAT)] |= UTRSTAT_Rx_BUFFER_DATA_READY;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
trace_exynos_uart_rx_error(s->channel);
|
||||||
s->reg[I_(UINTSP)] |= UINTSP_ERROR;
|
s->reg[I_(UINTSP)] |= UINTSP_ERROR;
|
||||||
exynos4210_uart_update_irq(s);
|
exynos4210_uart_update_irq(s);
|
||||||
res = 0;
|
res = 0;
|
||||||
@ -468,15 +425,22 @@ static uint64_t exynos4210_uart_read(void *opaque, hwaddr offset,
|
|||||||
s->reg[I_(UTRSTAT)] &= ~UTRSTAT_Rx_BUFFER_DATA_READY;
|
s->reg[I_(UTRSTAT)] &= ~UTRSTAT_Rx_BUFFER_DATA_READY;
|
||||||
res = s->reg[I_(URXH)];
|
res = s->reg[I_(URXH)];
|
||||||
}
|
}
|
||||||
|
trace_exynos_uart_read(s->channel, offset,
|
||||||
|
exynos4210_uart_regname(offset), res);
|
||||||
return res;
|
return res;
|
||||||
case UTXH:
|
case UTXH:
|
||||||
PRINT_DEBUG("UART%d: Trying to read from WO register: %s [%04x]\n",
|
trace_exynos_uart_wo_read(s->channel, exynos4210_uart_regname(offset),
|
||||||
s->channel, exynos4210_uart_regname(offset), offset);
|
offset);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
trace_exynos_uart_read(s->channel, offset,
|
||||||
|
exynos4210_uart_regname(offset),
|
||||||
|
s->reg[I_(offset)]);
|
||||||
return s->reg[I_(offset)];
|
return s->reg[I_(offset)];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
trace_exynos_uart_read(s->channel, offset, exynos4210_uart_regname(offset),
|
||||||
|
0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -555,7 +519,7 @@ static void exynos4210_uart_reset(DeviceState *dev)
|
|||||||
fifo_reset(&s->rx);
|
fifo_reset(&s->rx);
|
||||||
fifo_reset(&s->tx);
|
fifo_reset(&s->tx);
|
||||||
|
|
||||||
PRINT_DEBUG("UART%d: Rx FIFO size: %d\n", s->channel, s->rx.size);
|
trace_exynos_uart_rxsize(s->channel, s->rx.size);
|
||||||
}
|
}
|
||||||
|
|
||||||
static const VMStateDescription vmstate_exynos4210_uart_fifo = {
|
static const VMStateDescription vmstate_exynos4210_uart_fifo = {
|
||||||
|
@ -77,3 +77,20 @@ cmsdk_apb_uart_set_params(int speed) "CMSDK APB UART: params set to %d 8N1"
|
|||||||
# nrf51_uart.c
|
# nrf51_uart.c
|
||||||
nrf51_uart_read(uint64_t addr, uint64_t r, unsigned int size) "addr 0x%" PRIx64 " value 0x%" PRIx64 " size %u"
|
nrf51_uart_read(uint64_t addr, uint64_t r, unsigned int size) "addr 0x%" PRIx64 " value 0x%" PRIx64 " size %u"
|
||||||
nrf51_uart_write(uint64_t addr, uint64_t value, unsigned int size) "addr 0x%" PRIx64 " value 0x%" PRIx64 " size %u"
|
nrf51_uart_write(uint64_t addr, uint64_t value, unsigned int size) "addr 0x%" PRIx64 " value 0x%" PRIx64 " size %u"
|
||||||
|
|
||||||
|
# exynos4210_uart.c
|
||||||
|
exynos_uart_irq_raised(uint32_t channel, uint32_t reg) "UART%d: IRQ raised: 0x%08"PRIx32
|
||||||
|
exynos_uart_irq_lowered(uint32_t channel) "UART%d: IRQ lowered"
|
||||||
|
exynos_uart_update_params(uint32_t channel, int speed, uint8_t parity, int data, int stop) "UART%d: speed: %d, parity: %c, data bits: %d, stop bits: %d"
|
||||||
|
exynos_uart_write(uint32_t channel, uint32_t offset, const char *name, uint64_t val) "UART%d: <0x%04x> %s <- 0x%" PRIx64
|
||||||
|
exynos_uart_read(uint32_t channel, uint32_t offset, const char *name, uint64_t val) "UART%d: <0x%04x> %s -> 0x%" PRIx64
|
||||||
|
exynos_uart_rx_fifo_reset(uint32_t channel) "UART%d: Rx FIFO Reset"
|
||||||
|
exynos_uart_tx_fifo_reset(uint32_t channel) "UART%d: Tx FIFO Reset"
|
||||||
|
exynos_uart_tx(uint32_t channel, uint8_t ch) "UART%d: Tx 0x%02"PRIx32
|
||||||
|
exynos_uart_intclr(uint32_t channel, uint32_t reg) "UART%d: interrupts cleared: 0x%08"PRIx32
|
||||||
|
exynos_uart_ro_write(uint32_t channel, const char *name, uint32_t reg) "UART%d: Trying to write into RO register: %s [0x%04"PRIx32"]"
|
||||||
|
exynos_uart_rx(uint32_t channel, uint8_t ch) "UART%d: Rx 0x%02"PRIx32
|
||||||
|
exynos_uart_rx_error(uint32_t channel) "UART%d: Rx error"
|
||||||
|
exynos_uart_wo_read(uint32_t channel, const char *name, uint32_t reg) "UART%d: Trying to read from WO register: %s [0x%04"PRIx32"]"
|
||||||
|
exynos_uart_rxsize(uint32_t channel, uint32_t size) "UART%d: Rx FIFO size: %d"
|
||||||
|
exynos_uart_channel_error(uint32_t channel) "Wrong UART channel number: %d"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user