| From dfc6014e3b60713f375d0601d7549eed224c4615 Mon Sep 17 00:00:00 2001 |
| From: Sherry Sun <sherry.sun@nxp.com> |
| Date: Thu, 27 Feb 2020 16:34:12 +0800 |
| Subject: EDAC/synopsys: Do not print an error with back-to-back snprintf() calls |
| |
| From: Sherry Sun <sherry.sun@nxp.com> |
| |
| commit dfc6014e3b60713f375d0601d7549eed224c4615 upstream. |
| |
| handle_error() currently calls snprintf() a couple of times in |
| succession to output the message for a CE/UE, therefore overwriting each |
| part of the message which was formatted with the previous snprintf() |
| call. As a result, only the part of the message from the last snprintf() |
| call will be printed. |
| |
| The simplest and most effective way to fix this problem is to combine |
| the whole string into one which to supply to a single snprintf() call. |
| |
| [ bp: Massage. ] |
| |
| Fixes: b500b4a029d57 ("EDAC, synopsys: Add ECC support for ZynqMP DDR controller") |
| Signed-off-by: Sherry Sun <sherry.sun@nxp.com> |
| Signed-off-by: Borislav Petkov <bp@suse.de> |
| Reviewed-by: James Morse <james.morse@arm.com> |
| Cc: Manish Narani <manish.narani@xilinx.com> |
| Link: https://lkml.kernel.org/r/1582792452-32575-1-git-send-email-sherry.sun@nxp.com |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/edac/synopsys_edac.c | 22 +++++++--------------- |
| 1 file changed, 7 insertions(+), 15 deletions(-) |
| |
| --- a/drivers/edac/synopsys_edac.c |
| +++ b/drivers/edac/synopsys_edac.c |
| @@ -479,20 +479,14 @@ static void handle_error(struct mem_ctl_ |
| pinf = &p->ceinfo; |
| if (!priv->p_data->quirks) { |
| snprintf(priv->message, SYNPS_EDAC_MSG_SIZE, |
| - "DDR ECC error type:%s Row %d Bank %d Col %d ", |
| - "CE", pinf->row, pinf->bank, pinf->col); |
| - snprintf(priv->message, SYNPS_EDAC_MSG_SIZE, |
| - "Bit Position: %d Data: 0x%08x\n", |
| + "DDR ECC error type:%s Row %d Bank %d Col %d Bit Position: %d Data: 0x%08x", |
| + "CE", pinf->row, pinf->bank, pinf->col, |
| pinf->bitpos, pinf->data); |
| } else { |
| snprintf(priv->message, SYNPS_EDAC_MSG_SIZE, |
| - "DDR ECC error type:%s Row %d Bank %d Col %d ", |
| - "CE", pinf->row, pinf->bank, pinf->col); |
| - snprintf(priv->message, SYNPS_EDAC_MSG_SIZE, |
| - "BankGroup Number %d Block Number %d ", |
| - pinf->bankgrpnr, pinf->blknr); |
| - snprintf(priv->message, SYNPS_EDAC_MSG_SIZE, |
| - "Bit Position: %d Data: 0x%08x\n", |
| + "DDR ECC error type:%s Row %d Bank %d Col %d BankGroup Number %d Block Number %d Bit Position: %d Data: 0x%08x", |
| + "CE", pinf->row, pinf->bank, pinf->col, |
| + pinf->bankgrpnr, pinf->blknr, |
| pinf->bitpos, pinf->data); |
| } |
| |
| @@ -509,10 +503,8 @@ static void handle_error(struct mem_ctl_ |
| "UE", pinf->row, pinf->bank, pinf->col); |
| } else { |
| snprintf(priv->message, SYNPS_EDAC_MSG_SIZE, |
| - "DDR ECC error type :%s Row %d Bank %d Col %d ", |
| - "UE", pinf->row, pinf->bank, pinf->col); |
| - snprintf(priv->message, SYNPS_EDAC_MSG_SIZE, |
| - "BankGroup Number %d Block Number %d", |
| + "DDR ECC error type :%s Row %d Bank %d Col %d BankGroup Number %d Block Number %d", |
| + "UE", pinf->row, pinf->bank, pinf->col, |
| pinf->bankgrpnr, pinf->blknr); |
| } |
| |