From: Frank Rowand <frowand.list@gmail.com>
Cc: Stephen Boyd <sboyd@codeaurora.org>,
David Brown <davidb@codeaurora.org>,
Daniel Walker <dwalker@fifo99.com>,
Bryan Huntsman <bryanh@codeaurora.org>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Jiri Slaby <jslaby@suse.cz>,
"linux-arm-msm@vger.kernel.org" <linux-arm-msm@vger.kernel.org>,
linux-serial@vger.kernel.org,
Linux Kernel list <linux-kernel@vger.kernel.org>,
Jason Wessel <jason.wessel@windriver.com>,
kgdb-bugreport@lists.sourceforge.net
Subject: [test patch 4/4] debug hackery to trace msm_serial receive interrupts
Date: Mon, 04 Aug 2014 18:08:15 -0700 [thread overview]
Message-ID: <53E02E7F.90804@gmail.com> (raw)
In-Reply-To: <53E02C7C.4090206@gmail.com>
From: Frank Rowand <frank.rowand@sonymobile.com>
Not intended to be applied to mainline.
This is debug code that captures a trace of msm_serial reads by handle_rx_dm().
The trace is printed to the console when the sys_sync() system call is
invoked (that is, when the sync user space command is executed).
Not-signed-off-by-yet: Frank Rowand <frank.rowand@sonymobile.com>
---
arch/arm/boot/dts/qcom-msm8974.dtsi | 1
drivers/tty/serial/msm_serial.c | 110 ++++++++++++++++++++++++++++++++++++
fs/sync.c | 5 +
3 files changed, 116 insertions(+)
Index: b/drivers/tty/serial/msm_serial.c
===================================================================
--- a/drivers/tty/serial/msm_serial.c
+++ b/drivers/tty/serial/msm_serial.c
@@ -100,6 +100,80 @@ static void msm_enable_ms(struct uart_po
msm_write(port, msm_port->imr, UART_IMR);
}
+#define dbg_rx_c_MAX 95
+struct dbg_rx {
+ unsigned int rx_break;
+ unsigned int stale;
+ unsigned int count_exhausted;
+ unsigned int rx_total_snap;
+ unsigned int count;
+ unsigned int old_snap_state_1;
+ unsigned int old_snap_state_2;
+ unsigned int c_idx;
+ unsigned int c[dbg_rx_c_MAX + 1];
+};
+
+#define dbg_rx_MAX 4000
+static struct dbg_rx dbg_rx[dbg_rx_MAX + 1];
+static int dbg_rx_idx = -1;
+
+#define BUF_MAX 4095
+#define BUF_SIZE (BUF_MAX + 1)
+static unsigned char buf[BUF_SIZE];
+void print_dbg_rx(void)
+{
+ unsigned char c;
+ int k;
+ int j;
+ int i;
+ struct dbg_rx *d = &dbg_rx[0];
+ unsigned char *bufp;
+
+ pr_err(
+ " B S E\n"
+ " r t x old_\n"
+ " e a h snap_state\n"
+ " a l s ---------- tot\n"
+ " k t t 1 2 snap count c_idx --- data\n"
+ "---- - - - ---- ---- ---- ----- ----- --- --------\n");
+
+ for (k = 0; k <= dbg_rx_idx; k++, d++) {
+ bufp = &buf[0];
+ bufp += scnprintf(bufp, BUF_SIZE, "%4d %c %c %c %4d %4d %4d %5d %5d --- ",
+ k,
+ d->rx_break ? 'B' : ' ',
+ d->stale ? 'S' : 'H',
+ d->count_exhausted ? 'E' : ' ',
+ d->old_snap_state_1,
+ d->old_snap_state_2,
+ d->rx_total_snap,
+ d->count,
+ d->c_idx
+ );
+ for (j = 0; j < d->c_idx; j++) {
+ bufp += scnprintf(bufp,
+ BUF_SIZE - (bufp - &buf[0]),
+ "%08x ", d->c[j]);
+ }
+ for (j = 0; j < d->c_idx; j++) {
+ for (i = 3; i >= 0; i--) {
+ c = (d->c[j] >> (8 * i)) & 0xff;
+ bufp += scnprintf(bufp,
+ BUF_SIZE - (bufp - &buf[0]),
+ "%c",
+ ((c >= 0x20) && (c <= 0x7e)) ? c : '.');
+ }
+ bufp += scnprintf(bufp,
+ BUF_SIZE - (bufp - &buf[0]),
+ " ");
+ }
+ bufp += scnprintf(bufp,
+ BUF_SIZE - (bufp - &buf[0]),
+ "\n");
+ pr_err("%s", buf);
+ }
+}
+
static void handle_rx_dm(struct uart_port *port, unsigned int misr)
{
struct tty_port *tport = &port->state->port;
@@ -110,6 +184,13 @@ static void handle_rx_dm(struct uart_por
int res;
char *cp;
+ dbg_rx_idx++;
+ if (dbg_rx_idx > dbg_rx_MAX)
+ dbg_rx_idx = 0;
+ memset(&dbg_rx[dbg_rx_idx], 0, sizeof(dbg_rx[0]));
+ dbg_rx[dbg_rx_idx].old_snap_state_1 = msm_port->old_snap_state;
+ dbg_rx[dbg_rx_idx].stale = imr_rx_stale;
+
if ((msm_read(port, UART_SR) & UART_SR_OVERRUN)) {
port->icount.overrun++;
tty_insert_flip_char(tport, 0, TTY_OVERRUN);
@@ -117,8 +198,14 @@ static void handle_rx_dm(struct uart_por
}
if (imr_rx_stale) {
+#if 1
+ int rx_total_snap = msm_read(port, UARTDM_RX_TOTAL_SNAP);
+ dbg_rx[dbg_rx_idx].rx_total_snap = rx_total_snap;
+ count = rx_total_snap - msm_port->old_snap_state;
+#else
count = msm_read(port, UARTDM_RX_TOTAL_SNAP) -
msm_port->old_snap_state;
+#endif
msm_port->old_snap_state = 0;
} else {
count = msm_read(port, UART_RFWR);
@@ -126,6 +213,7 @@ static void handle_rx_dm(struct uart_por
count = 4 * count;
msm_port->old_snap_state += count;
}
+ dbg_rx[dbg_rx_idx].count = count;
/* TODO: Precise error reporting */
@@ -138,12 +226,15 @@ static void handle_rx_dm(struct uart_por
if ((sr & UART_SR_RX_READY) == 0) {
if (!imr_rx_stale)
msm_port->old_snap_state -= count;
+ dbg_rx[dbg_rx_idx].count_exhausted = 1;
break;
}
c = msm_read(port, UARTDM_RF);
+ dbg_rx[dbg_rx_idx].c[dbg_rx[dbg_rx_idx].c_idx++] = c;
if (sr & UART_SR_RX_BREAK) {
+ dbg_rx[dbg_rx_idx].rx_break = 1;
port->icount.brk++;
uart_handle_break(port);
if (msm_port->rx_sc_enabled)
@@ -193,6 +284,7 @@ static void handle_rx_dm(struct uart_por
msm_write(port, UART_CR_CMD_RESET_STALE_INT, UART_CR);
msm_write(port, 0xFFFFFF, UARTDM_DMRX);
msm_write(port, UART_CR_CMD_STALE_EVENT_ENABLE, UART_CR);
+ dbg_rx[dbg_rx_idx].old_snap_state_2 = msm_port->old_snap_state;
}
static void handle_rx(struct uart_port *port)
@@ -771,6 +863,9 @@ static int msm_poll_init(struct uart_por
struct msm_port *msm_port = UART_TO_MSM(port);
unsigned int watermark;
+ pr_err("enter msm_poll_init()\n");
+ pr_err("msm_port->is_uartdm %d\n", msm_port->is_uartdm);
+
/* Enable single character mode on RX FIFO */
if (msm_port->is_uartdm >= UARTDM_1P4) {
msm_write(port, UARTDM_DMEN_RX_SC_ENABLE, UARTDM_DMEN);
@@ -1273,6 +1368,21 @@ static int __init msm_console_setup(stru
printk(KERN_INFO "msm_serial: console setup on port #%d\n", port->line);
+#if 1
+{
+ /* zzz debug info */
+
+ unsigned int version;
+
+ version = msm_read(port, 0xd8);
+ pr_err("msm_serial: HW_VERSION %d.%d.%d\n",
+ (version >> 28) & 0xf,
+ (version >> 16) & 0xfff,
+ (version ) & 0xffff);
+
+}
+#endif
+
return uart_set_options(port, co, baud, parity, bits, flow);
}
Index: b/fs/sync.c
===================================================================
--- a/fs/sync.c
+++ b/fs/sync.c
@@ -99,10 +99,15 @@ static void fdatawait_one_bdev(struct bl
* just write metadata (such as inodes or bitmaps) to block device page cache
* and do not sync it on their own in ->sync_fs().
*/
+void print_dbg_rx(void);
+int zzz_print_dbg_rx = 1;
SYSCALL_DEFINE0(sync)
{
int nowait = 0, wait = 1;
+ if (zzz_print_dbg_rx)
+ print_dbg_rx();
+
wakeup_flusher_threads(0, WB_REASON_SYNC);
iterate_supers(sync_inodes_one_sb, NULL);
iterate_supers(sync_fs_one_sb, &nowait);
Index: b/arch/arm/boot/dts/qcom-msm8974.dtsi
===================================================================
--- a/arch/arm/boot/dts/qcom-msm8974.dtsi
+++ b/arch/arm/boot/dts/qcom-msm8974.dtsi
@@ -227,6 +227,7 @@
serial@f991e000 {
compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm";
+ /* compatible = "qcom,msm-uartdm-v1.3", "qcom,msm-uartdm"; */
reg = <0xf991e000 0x1000>;
interrupts = <0 108 0x0>;
clocks = <&gcc GCC_BLSP1_UART2_APPS_CLK>, <&gcc GCC_BLSP1_AHB_CLK>;
WARNING: multiple messages have this Message-ID (diff)
From: Frank Rowand <frowand.list@gmail.com>
To: unlisted-recipients:; (no To-header on input)
Cc: Stephen Boyd <sboyd@codeaurora.org>,
David Brown <davidb@codeaurora.org>,
Daniel Walker <dwalker@fifo99.com>,
Bryan Huntsman <bryanh@codeaurora.org>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Jiri Slaby <jslaby@suse.cz>,
"linux-arm-msm@vger.kernel.org" <linux-arm-msm@vger.kernel.org>,
linux-serial@vger.kernel.org,
Linux Kernel list <linux-kernel@vger.kernel.org>,
Jason Wessel <jason.wessel@windriver.com>,
kgdb-bugreport@lists.sourceforge.net
Subject: [test patch 4/4] debug hackery to trace msm_serial receive interrupts
Date: Mon, 04 Aug 2014 18:08:15 -0700 [thread overview]
Message-ID: <53E02E7F.90804@gmail.com> (raw)
In-Reply-To: <53E02C7C.4090206@gmail.com>
From: Frank Rowand <frank.rowand@sonymobile.com>
Not intended to be applied to mainline.
This is debug code that captures a trace of msm_serial reads by handle_rx_dm().
The trace is printed to the console when the sys_sync() system call is
invoked (that is, when the sync user space command is executed).
Not-signed-off-by-yet: Frank Rowand <frank.rowand@sonymobile.com>
---
arch/arm/boot/dts/qcom-msm8974.dtsi | 1
drivers/tty/serial/msm_serial.c | 110 ++++++++++++++++++++++++++++++++++++
fs/sync.c | 5 +
3 files changed, 116 insertions(+)
Index: b/drivers/tty/serial/msm_serial.c
===================================================================
--- a/drivers/tty/serial/msm_serial.c
+++ b/drivers/tty/serial/msm_serial.c
@@ -100,6 +100,80 @@ static void msm_enable_ms(struct uart_po
msm_write(port, msm_port->imr, UART_IMR);
}
+#define dbg_rx_c_MAX 95
+struct dbg_rx {
+ unsigned int rx_break;
+ unsigned int stale;
+ unsigned int count_exhausted;
+ unsigned int rx_total_snap;
+ unsigned int count;
+ unsigned int old_snap_state_1;
+ unsigned int old_snap_state_2;
+ unsigned int c_idx;
+ unsigned int c[dbg_rx_c_MAX + 1];
+};
+
+#define dbg_rx_MAX 4000
+static struct dbg_rx dbg_rx[dbg_rx_MAX + 1];
+static int dbg_rx_idx = -1;
+
+#define BUF_MAX 4095
+#define BUF_SIZE (BUF_MAX + 1)
+static unsigned char buf[BUF_SIZE];
+void print_dbg_rx(void)
+{
+ unsigned char c;
+ int k;
+ int j;
+ int i;
+ struct dbg_rx *d = &dbg_rx[0];
+ unsigned char *bufp;
+
+ pr_err(
+ " B S E\n"
+ " r t x old_\n"
+ " e a h snap_state\n"
+ " a l s ---------- tot\n"
+ " k t t 1 2 snap count c_idx --- data\n"
+ "---- - - - ---- ---- ---- ----- ----- --- --------\n");
+
+ for (k = 0; k <= dbg_rx_idx; k++, d++) {
+ bufp = &buf[0];
+ bufp += scnprintf(bufp, BUF_SIZE, "%4d %c %c %c %4d %4d %4d %5d %5d --- ",
+ k,
+ d->rx_break ? 'B' : ' ',
+ d->stale ? 'S' : 'H',
+ d->count_exhausted ? 'E' : ' ',
+ d->old_snap_state_1,
+ d->old_snap_state_2,
+ d->rx_total_snap,
+ d->count,
+ d->c_idx
+ );
+ for (j = 0; j < d->c_idx; j++) {
+ bufp += scnprintf(bufp,
+ BUF_SIZE - (bufp - &buf[0]),
+ "%08x ", d->c[j]);
+ }
+ for (j = 0; j < d->c_idx; j++) {
+ for (i = 3; i >= 0; i--) {
+ c = (d->c[j] >> (8 * i)) & 0xff;
+ bufp += scnprintf(bufp,
+ BUF_SIZE - (bufp - &buf[0]),
+ "%c",
+ ((c >= 0x20) && (c <= 0x7e)) ? c : '.');
+ }
+ bufp += scnprintf(bufp,
+ BUF_SIZE - (bufp - &buf[0]),
+ " ");
+ }
+ bufp += scnprintf(bufp,
+ BUF_SIZE - (bufp - &buf[0]),
+ "\n");
+ pr_err("%s", buf);
+ }
+}
+
static void handle_rx_dm(struct uart_port *port, unsigned int misr)
{
struct tty_port *tport = &port->state->port;
@@ -110,6 +184,13 @@ static void handle_rx_dm(struct uart_por
int res;
char *cp;
+ dbg_rx_idx++;
+ if (dbg_rx_idx > dbg_rx_MAX)
+ dbg_rx_idx = 0;
+ memset(&dbg_rx[dbg_rx_idx], 0, sizeof(dbg_rx[0]));
+ dbg_rx[dbg_rx_idx].old_snap_state_1 = msm_port->old_snap_state;
+ dbg_rx[dbg_rx_idx].stale = imr_rx_stale;
+
if ((msm_read(port, UART_SR) & UART_SR_OVERRUN)) {
port->icount.overrun++;
tty_insert_flip_char(tport, 0, TTY_OVERRUN);
@@ -117,8 +198,14 @@ static void handle_rx_dm(struct uart_por
}
if (imr_rx_stale) {
+#if 1
+ int rx_total_snap = msm_read(port, UARTDM_RX_TOTAL_SNAP);
+ dbg_rx[dbg_rx_idx].rx_total_snap = rx_total_snap;
+ count = rx_total_snap - msm_port->old_snap_state;
+#else
count = msm_read(port, UARTDM_RX_TOTAL_SNAP) -
msm_port->old_snap_state;
+#endif
msm_port->old_snap_state = 0;
} else {
count = msm_read(port, UART_RFWR);
@@ -126,6 +213,7 @@ static void handle_rx_dm(struct uart_por
count = 4 * count;
msm_port->old_snap_state += count;
}
+ dbg_rx[dbg_rx_idx].count = count;
/* TODO: Precise error reporting */
@@ -138,12 +226,15 @@ static void handle_rx_dm(struct uart_por
if ((sr & UART_SR_RX_READY) == 0) {
if (!imr_rx_stale)
msm_port->old_snap_state -= count;
+ dbg_rx[dbg_rx_idx].count_exhausted = 1;
break;
}
c = msm_read(port, UARTDM_RF);
+ dbg_rx[dbg_rx_idx].c[dbg_rx[dbg_rx_idx].c_idx++] = c;
if (sr & UART_SR_RX_BREAK) {
+ dbg_rx[dbg_rx_idx].rx_break = 1;
port->icount.brk++;
uart_handle_break(port);
if (msm_port->rx_sc_enabled)
@@ -193,6 +284,7 @@ static void handle_rx_dm(struct uart_por
msm_write(port, UART_CR_CMD_RESET_STALE_INT, UART_CR);
msm_write(port, 0xFFFFFF, UARTDM_DMRX);
msm_write(port, UART_CR_CMD_STALE_EVENT_ENABLE, UART_CR);
+ dbg_rx[dbg_rx_idx].old_snap_state_2 = msm_port->old_snap_state;
}
static void handle_rx(struct uart_port *port)
@@ -771,6 +863,9 @@ static int msm_poll_init(struct uart_por
struct msm_port *msm_port = UART_TO_MSM(port);
unsigned int watermark;
+ pr_err("enter msm_poll_init()\n");
+ pr_err("msm_port->is_uartdm %d\n", msm_port->is_uartdm);
+
/* Enable single character mode on RX FIFO */
if (msm_port->is_uartdm >= UARTDM_1P4) {
msm_write(port, UARTDM_DMEN_RX_SC_ENABLE, UARTDM_DMEN);
@@ -1273,6 +1368,21 @@ static int __init msm_console_setup(stru
printk(KERN_INFO "msm_serial: console setup on port #%d\n", port->line);
+#if 1
+{
+ /* zzz debug info */
+
+ unsigned int version;
+
+ version = msm_read(port, 0xd8);
+ pr_err("msm_serial: HW_VERSION %d.%d.%d\n",
+ (version >> 28) & 0xf,
+ (version >> 16) & 0xfff,
+ (version ) & 0xffff);
+
+}
+#endif
+
return uart_set_options(port, co, baud, parity, bits, flow);
}
Index: b/fs/sync.c
===================================================================
--- a/fs/sync.c
+++ b/fs/sync.c
@@ -99,10 +99,15 @@ static void fdatawait_one_bdev(struct bl
* just write metadata (such as inodes or bitmaps) to block device page cache
* and do not sync it on their own in ->sync_fs().
*/
+void print_dbg_rx(void);
+int zzz_print_dbg_rx = 1;
SYSCALL_DEFINE0(sync)
{
int nowait = 0, wait = 1;
+ if (zzz_print_dbg_rx)
+ print_dbg_rx();
+
wakeup_flusher_threads(0, WB_REASON_SYNC);
iterate_supers(sync_inodes_one_sb, NULL);
iterate_supers(sync_fs_one_sb, &nowait);
Index: b/arch/arm/boot/dts/qcom-msm8974.dtsi
===================================================================
--- a/arch/arm/boot/dts/qcom-msm8974.dtsi
+++ b/arch/arm/boot/dts/qcom-msm8974.dtsi
@@ -227,6 +227,7 @@
serial@f991e000 {
compatible = "qcom,msm-uartdm-v1.4", "qcom,msm-uartdm";
+ /* compatible = "qcom,msm-uartdm-v1.3", "qcom,msm-uartdm"; */
reg = <0xf991e000 0x1000>;
interrupts = <0 108 0x0>;
clocks = <&gcc GCC_BLSP1_UART2_APPS_CLK>, <&gcc GCC_BLSP1_AHB_CLK>;
next prev parent reply other threads:[~2014-08-05 1:08 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-08-05 0:59 [request for help] tty: serial: kgdb: fix msm_serial for kgdb Frank Rowand
2014-08-05 1:03 ` [test patch 1/4] " Frank Rowand
2014-08-05 1:04 ` [test patch 2/4] add poll_post_exception framework Frank Rowand
2014-08-05 1:06 ` [test patch 3/4] use poll_post_exception in msm_serial Frank Rowand
2014-08-05 1:06 ` Frank Rowand
2014-08-05 1:08 ` Frank Rowand [this message]
2014-08-05 1:08 ` [test patch 4/4] debug hackery to trace msm_serial receive interrupts Frank Rowand
2014-08-05 1:33 ` [request for help] tty: serial: kgdb: fix msm_serial for kgdb Stephen Boyd
2014-08-05 2:09 ` Frank Rowand
2014-08-05 19:22 ` Stephen Boyd
2014-08-05 23:53 ` Stephen Boyd
2014-08-06 0:55 ` Frank Rowand
2014-08-06 1:19 ` Stephen Boyd
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=53E02E7F.90804@gmail.com \
--to=frowand.list@gmail.com \
--cc=bryanh@codeaurora.org \
--cc=davidb@codeaurora.org \
--cc=dwalker@fifo99.com \
--cc=gregkh@linuxfoundation.org \
--cc=jason.wessel@windriver.com \
--cc=jslaby@suse.cz \
--cc=kgdb-bugreport@lists.sourceforge.net \
--cc=linux-arm-msm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-serial@vger.kernel.org \
--cc=sboyd@codeaurora.org \
/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: link
Be 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.