From patchwork Thu Oct 14 02:04:44 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: shaohui xie X-Patchwork-Id: 67776 X-Patchwork-Delegate: galak@kernel.crashing.org Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from bilbo.ozlabs.org (localhost [127.0.0.1]) by ozlabs.org (Postfix) with ESMTP id 3EEB6100B7D for ; Thu, 14 Oct 2010 13:33:41 +1100 (EST) Received: from TX2EHSOBE008.bigfish.com (tx2ehsobe004.messaging.microsoft.com [65.55.88.14]) (using TLSv1 with cipher AES128-SHA (128/128 bits)) (Client CN "mail.global.frontbridge.com", Issuer "Cybertrust SureServer Standard Validation CA" (verified OK)) by ozlabs.org (Postfix) with ESMTPS id A9706B70E6 for ; Thu, 14 Oct 2010 13:33:34 +1100 (EST) Received: from mail43-tx2-R.bigfish.com (10.9.14.247) by TX2EHSOBE008.bigfish.com (10.9.40.28) with Microsoft SMTP Server id 14.1.225.8; Thu, 14 Oct 2010 02:33:18 +0000 Received: from mail43-tx2 (localhost.localdomain [127.0.0.1]) by mail43-tx2-R.bigfish.com (Postfix) with ESMTP id E847A93834D for ; Thu, 14 Oct 2010 02:33:17 +0000 (UTC) X-SpamScore: 0 X-BigFish: VS0(zzbb2cK853kzz1202hzz8275bhz2dh2a8h63h) X-Spam-TCS-SCL: 2:0 X-FB-SS: 0, Received: from mail43-tx2 (localhost.localdomain [127.0.0.1]) by mail43-tx2 (MessageSwitch) id 1287023539383799_9116; Thu, 14 Oct 2010 02:32:19 +0000 (UTC) Received: from TX2EHSMHS023.bigfish.com (unknown [10.9.14.247]) by mail43-tx2.bigfish.com (Postfix) with ESMTP id 5B8A6DA0054 for ; Thu, 14 Oct 2010 02:32:19 +0000 (UTC) Received: from az33egw01.freescale.net (192.88.158.102) by TX2EHSMHS023.bigfish.com (10.9.99.123) with Microsoft SMTP Server (TLS) id 14.0.482.44; Thu, 14 Oct 2010 02:32:17 +0000 Received: from de01smr02.am.mot.com (de01smr02.freescale.net [10.208.0.151]) by az33egw01.freescale.net (8.14.3/8.14.3) with ESMTP id o9E2WGNW003912 for ; Wed, 13 Oct 2010 19:32:17 -0700 (MST) Received: from zmy16exm20.fsl.freescale.net (zmy16exm20.ap.freescale.net [10.211.3.23]) by de01smr02.am.mot.com (8.13.1/8.13.0) with ESMTP id o9E2mSXV000728 for ; Wed, 13 Oct 2010 21:48:29 -0500 (CDT) Received: from localhost.localdomain ([10.193.20.106]) by zmy16exm20.fsl.freescale.net with Microsoft SMTPSVC(6.0.3790.4675); Thu, 14 Oct 2010 10:32:22 +0800 From: Shaohui Xie To: Subject: [PATCH 3/3] rapidio, powerpc/85xx: Error interrupt handler for sRIO. Date: Thu, 14 Oct 2010 10:04:44 +0800 Message-ID: <1287021884-22146-1-git-send-email-b21989@freescale.com> X-Mailer: git-send-email 1.6.4 X-OriginalArrivalTime: 14 Oct 2010 02:32:22.0988 (UTC) FILETIME=[0837C0C0:01CB6B48] MIME-Version: 1.0 X-Reverse-DNS: az33egw01.freescale.net Cc: alexandre.bounine@idt.com, b21989@freescale.com X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org The sRIO controller reports errors to the core with one signal, it uses register EPWISR to provides the core quick access to where the error occurred. The EPWISR indicates that there are 4 interrupts sources, port1, port2, message unit and port write receive, but the sRIO driver does not support port2 for now, still the handler takes care of port2. Currently the handler only clear error status without any recovery. Signed-off-by: Shaohui Xie --- arch/powerpc/sysdev/fsl_rio.c | 81 ++++++++++++++++++++++++++++++++++++++--- 1 files changed, 76 insertions(+), 5 deletions(-) diff --git a/arch/powerpc/sysdev/fsl_rio.c b/arch/powerpc/sysdev/fsl_rio.c index dfff3b7..be7cc98 100644 --- a/arch/powerpc/sysdev/fsl_rio.c +++ b/arch/powerpc/sysdev/fsl_rio.c @@ -10,7 +10,7 @@ * - Added Port-Write message handling * - Added Machine Check exception handling * - * Copyright (C) 2007, 2008 Freescale Semiconductor, Inc. + * Copyright (C) 2007, 2008, 2010 Freescale Semiconductor, Inc. * Zhang Wei * * Copyright 2005 MontaVista Software, Inc. @@ -47,10 +47,36 @@ #define IRQ_RIO_RX(m) (((struct rio_priv *)(m->priv))->rxirq) #define IRQ_RIO_PW(m) (((struct rio_priv *)(m->priv))->pwirq) +/* EPWISR Error match value */ +#define EPWISR_ERR_PINT1 0x80000000 +#define EPWISR_ERR_PINT2 0x40000000 +#define EPWISR_ERR_MU 0x2 +#define EPWISR_ERR_PW 0x1 + +#define IPWMR_CLEAR_QUEUE 0x00000002 +#define IPWSR_CLEAR 0x98 +#define OMSR_CLEAR 0x1cb3 +#define IMSR_CLEAR 0x491 +#define IDSR_CLEAR 0x91 +#define ODSR_CLEAR 0x1c00 +#define LTLEECSR_ENABLE_ALL 0xFFC000FC +#define ESCSR_CLEAR 0x07120204 + +#define RIO_EDCSR 0x0640 +#define PORT2_RIO_EDCSR 0x0680 +#define RIO_IECSR 0x10130 +#define PORT2_RIO_IECSR 0x101B0 +#define RIO_IM0SR 0x13064 +#define RIO_IM1SR 0x13164 +#define RIO_OM0SR 0x13004 +#define RIO_OM1SR 0x13104 + +#define RIO_EPWISR_OFFSET 0x10010 #define RIO_ATMU_REGS_OFFSET 0x10c00 #define RIO_P_MSG_REGS_OFFSET 0x11000 #define RIO_S_MSG_REGS_OFFSET 0x13000 #define RIO_ESCSR 0x158 +#define PORT2_RIO_ESCSR 0x178 #define RIO_CCSR 0x15c #define RIO_LTLEDCSR 0x0608 #define RIO_LTLEDCSR_IER 0x80000000 @@ -1007,6 +1033,38 @@ fsl_rio_dbell_handler(int irq, void *dev_instance) return IRQ_HANDLED; } +void port_error_handler(struct rio_mport *port, int offset) +{ + /*XXX: Error recovery is not implemented, we just clear errors */ + out_be32((u32 *)(rio_regs_win + RIO_LTLEDCSR), 0); + + if (offset == 0) { + out_be32((u32 *)(rio_regs_win + RIO_EDCSR), 0); + out_be32((u32 *)(rio_regs_win + RIO_IECSR), 0); + out_be32((u32 *)(rio_regs_win + RIO_ESCSR), ESCSR_CLEAR); + } else { + out_be32((u32 *)(rio_regs_win + PORT2_RIO_EDCSR), 0); + out_be32((u32 *)(rio_regs_win + PORT2_RIO_IECSR), 0); + out_be32((u32 *)(rio_regs_win + PORT2_RIO_ESCSR), ESCSR_CLEAR); + } +} + +void msg_unit_error_handler(struct rio_mport *port) +{ + struct rio_priv *priv = port->priv; + + /*XXX: Error recovery is not implemented, we just clear errors */ + out_be32((u32 *)(rio_regs_win + RIO_IM0SR), IMSR_CLEAR); + out_be32((u32 *)(rio_regs_win + RIO_IM1SR), IMSR_CLEAR); + out_be32((u32 *)(rio_regs_win + RIO_OM0SR), OMSR_CLEAR); + out_be32((u32 *)(rio_regs_win + RIO_OM1SR), OMSR_CLEAR); + + out_be32(&priv->msg_regs->odsr, ODSR_CLEAR); + out_be32(&priv->msg_regs->dsr, IDSR_CLEAR); + + out_be32(&priv->msg_regs->pwsr, IPWSR_CLEAR); +} + /** * fsl_rio_doorbell_init - MPC85xx doorbell interface init * @mport: Master port implementing the inbound doorbell unit @@ -1086,13 +1144,24 @@ fsl_rio_port_write_handler(int irq, void *dev_instance) ipwsr = in_be32(&priv->msg_regs->pwsr); epwisr = in_be32(priv->regs_win + RIO_EPWISR); - if (epwisr & 0x80000000) { + if (epwisr & EPWISR_ERR_PINT1) { tmp = in_be32(priv->regs_win + RIO_LTLEDCSR); pr_info("RIO_LTLEDCSR = 0x%x\n", tmp); out_be32(priv->regs_win + RIO_LTLEDCSR, 0); + port_error_handler(port, 0); + } + + if (epwisr & EPWISR_ERR_PINT2) { + pr_info("RIO: port2 error\n"); + port_error_handler(port, 1); + } + + if (epwisr & EPWISR_ERR_MU) { + pr_info("RIO: message unit error\n"); + msg_unit_error_handler(port); } - if (!(epwisr & 0x00000001)) + if (!(epwisr & EPWISR_ERR_PW)) return IRQ_HANDLED; #ifdef DEBUG_PW @@ -1253,12 +1322,14 @@ static int fsl_rio_port_write_init(struct rio_mport *mport) /* Hook up port-write handler */ - rc = request_irq(IRQ_RIO_PW(mport), fsl_rio_port_write_handler, 0, - "port-write", (void *)mport); + rc = request_irq(IRQ_RIO_PW(mport), fsl_rio_port_write_handler, + IRQF_SHARED, "port-write", (void *)mport); if (rc < 0) { pr_err("MPC85xx RIO: unable to request inbound doorbell irq"); goto err_out; } + /* Enable Error Interrupt */ + out_be32((u32 *)(rio_regs_win + RIO_LTLEECSR), LTLEECSR_ENABLE_ALL); INIT_WORK(&priv->pw_work, fsl_pw_dpc); spin_lock_init(&priv->pw_fifo_lock);