From patchwork Sat May 21 11:33:49 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dmitry Baryshkov X-Patchwork-Id: 96692 Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from ozlabs.org (localhost [IPv6:::1]) by ozlabs.org (Postfix) with ESMTP id CF96CB74D2 for ; Sat, 21 May 2011 21:34:10 +1000 (EST) Received: from mail-fx0-f51.google.com (mail-fx0-f51.google.com [209.85.161.51]) (using TLSv1 with cipher RC4-SHA (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority" (verified OK)) by ozlabs.org (Postfix) with ESMTPS id 232B2B71A6 for ; Sat, 21 May 2011 21:34:01 +1000 (EST) Received: by fxm5 with SMTP id 5so3529499fxm.38 for ; Sat, 21 May 2011 04:33:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:from:to:cc:subject:date:message-id:x-mailer :in-reply-to:references; bh=I7jc37hPY3YZDeBHofll56pDZxGZWau0jJsW8LJ4xL0=; b=r75vDUGpp/wXIzYNUg9+54cZUcu6wPtbqBJIf3avI/QYRcwqtbQdK6OQkwzzqQ0ya9 Tx22kG115sO2rx0PuLtSO5qQAJFoNBkoam+I0cc/589tnCbzTQrJzEp6o2R1Zw4uGliH oX7Cr8knA6TrANyjLzwiYQKs5X/LzL8noW7Io= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer:in-reply-to:references; b=PG1BjZ0LACwVo6kSaFXdLfiNteEI/fqF2Zw8FXKsbCDL46OIXlFT7yqSauX//Qz17n ZTAmj1KPzWnwVVRqnfB+ZUmS4sGy9sVlzzhWpYMZyT8ABnGb+EE/bN+THj+jxqrsh09a T/ddtHo191eScZgKOPfOJUSzvZJZMkdT0jH2A= Received: by 10.223.68.193 with SMTP id w1mr571429fai.42.1305977637033; Sat, 21 May 2011 04:33:57 -0700 (PDT) Received: from doriath.ww600.siemens.net (92-100-166-160.dynamic.avangarddsl.ru [92.100.166.160]) by mx.google.com with ESMTPS id c22sm1703966fat.14.2011.05.21.04.33.54 (version=SSLv3 cipher=OTHER); Sat, 21 May 2011 04:33:55 -0700 (PDT) From: Dmitry Eremin-Solenikov To: linuxppc-dev@lists.ozlabs.org Subject: [PATCH 2/2] cpc925_edac: support single-processor configurations Date: Sat, 21 May 2011 15:33:49 +0400 Message-Id: <1305977629-26648-1-git-send-email-dbaryshkov@gmail.com> X-Mailer: git-send-email 1.7.4.4 In-Reply-To: <1305973871-28244-2-git-send-email-dbaryshkov@gmail.com> References: <1305973871-28244-2-git-send-email-dbaryshkov@gmail.com> Cc: Harry Ciao , Paul Mackerras , Doug Thompson X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org Sender: linuxppc-dev-bounces+patchwork-incoming=ozlabs.org@lists.ozlabs.org If second CPU is not enabled, CPC925 EDAC driver will spill out warnings about errors on second Processor Interface. Support masking that out, by detecting at runtime which CPUs are present in device tree. Signed-off-by: Dmitry Eremin-Solenikov Cc: Harry Ciao Cc: Doug Thompson Signed-off-by: Dmitry Eremin-Solenikov --- Oops, please use this one instead, previous contained one extra debug line. drivers/edac/cpc925_edac.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 44 insertions(+), 0 deletions(-) diff --git a/drivers/edac/cpc925_edac.c b/drivers/edac/cpc925_edac.c index 837ad8f..5bbe766 100644 --- a/drivers/edac/cpc925_edac.c +++ b/drivers/edac/cpc925_edac.c @@ -90,6 +90,7 @@ enum apimask_bits { ECC_MASK_ENABLE = (APIMASK_ECC_UE_H | APIMASK_ECC_CE_H | APIMASK_ECC_UE_L | APIMASK_ECC_CE_L), }; +#define APIMASK_ADI(n) CPC925_BIT(((n)+1)) /************************************************************ * Processor Interface Exception Register (APIEXCP) @@ -581,16 +582,56 @@ static void cpc925_mc_check(struct mem_ctl_info *mci) } /******************** CPU err device********************************/ +static u32 cpc925_cpu_getmask(void) +{ + struct device_node *cpus; + struct device_node *cpunode; + static u32 mask = 0; + + if (mask != 0) + return mask; + + mask = APIMASK_ADI0 | APIMASK_ADI1; + + cpus = of_find_node_by_path("/cpus"); + if (cpus == NULL) { + cpc925_printk(KERN_DEBUG, "No /cpus node !\n"); + return 0; + } + + /* Get first CPU node */ + for (cpunode = NULL; + (cpunode = of_get_next_child(cpus, cpunode)) != NULL;) { + const u32 *reg = of_get_property(cpunode, "reg", NULL); + + if (!strcmp(cpunode->type, "cpu") && reg != NULL) + mask &= ~APIMASK_ADI(*reg); + } + + of_node_put(cpunode); + of_node_put(cpus); + + return mask; +} + /* Enable CPU Errors detection */ static void cpc925_cpu_init(struct cpc925_dev_info *dev_info) { u32 apimask; + u32 cpumask; apimask = __raw_readl(dev_info->vbase + REG_APIMASK_OFFSET); if ((apimask & CPU_MASK_ENABLE) == 0) { apimask |= CPU_MASK_ENABLE; __raw_writel(apimask, dev_info->vbase + REG_APIMASK_OFFSET); } + + cpumask = cpc925_cpu_getmask(); + if (apimask & cpumask) { + cpc925_printk(KERN_WARNING, "CPU(s) not present, " + "but enabled in APIMASK, disabling\n"); + apimask &= ~cpumask; + } } /* Disable CPU Errors detection */ @@ -622,6 +663,9 @@ static void cpc925_cpu_check(struct edac_device_ctl_info *edac_dev) if ((apiexcp & CPU_EXCP_DETECTED) == 0) return; + if ((apiexcp & ~cpc925_cpu_getmask()) == 0) + return; + apimask = __raw_readl(dev_info->vbase + REG_APIMASK_OFFSET); cpc925_printk(KERN_INFO, "Processor Interface Fault\n" "Processor Interface register dump:\n");