From patchwork Tue Jul 25 17:26:23 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Helge Deller X-Patchwork-Id: 9862553 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 72D2E601A1 for ; Tue, 25 Jul 2017 17:26:34 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 656C92237D for ; Tue, 25 Jul 2017 17:26:34 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 5A57427D0E; Tue, 25 Jul 2017 17:26:34 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.4 required=2.0 tests=BAYES_00,FREEMAIL_FROM, RCVD_IN_DNSWL_HI,RCVD_IN_SORBS_SPAM autolearn=ham version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id C84852237D for ; Tue, 25 Jul 2017 17:26:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751471AbdGYR0d (ORCPT ); Tue, 25 Jul 2017 13:26:33 -0400 Received: from mout.gmx.net ([212.227.15.19]:64858 "EHLO mout.gmx.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751328AbdGYR0c (ORCPT ); Tue, 25 Jul 2017 13:26:32 -0400 Received: from p100.box ([193.159.17.88]) by mail.gmx.com (mrgmx003 [212.227.17.190]) with ESMTPSA (Nemesis) id 0LjIBr-1e9eTG3UHH-00dSbV; Tue, 25 Jul 2017 19:26:25 +0200 Date: Tue, 25 Jul 2017 19:26:23 +0200 From: Helge Deller To: linux-parisc@vger.kernel.org, James Bottomley , John David Anglin Subject: [PATCH] parisc: Add function to return DIMM slot of physical address Message-ID: <20170725172623.GA11117@p100.box> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.5.23 (2014-03-12) X-Provags-ID: V03:K0:9VW7LWGRE8TqF2SF9ATcnGNEl6daKm1eqdtozQ/6/AxPupqmeQq wFWmawrA7uslTMn9Z7OYjdoy3/qbIDdGtWGchgFVw2iNHiRp10+0cMnAKNXhemZF2gFI0xS 3Qb9nSTgMI4deRKy0D8ba3K7Fnl/UTDy1QLwJdT9K/d7AaBMPzzZ+E1a1dkYZgnp7QOgUH4 +6zjY5GAF+31e6a1pX3Wg== X-UI-Out-Filterresults: notjunk:1; V01:K0:hO7yt1RaHko=:c9vE2f78ZwYmRWF9R19osB +GaJ5aA6kBzjPhEBiWDrVHRBEKj12HUAEY48fQlK4QSrwLTJQv8G4UWTFupICCJvjog9U7Y0u z36kGZSQTSwNZ9Lt7K4nvwYbV/so1mr0qNhYv1jl+PZ2EaAOvvSwpkJh4blWVE+bGSv5uBwuh bLLJGIkJ0VlbOEiEAphadm83oEd965SJvLDYK2K7lP0a5dJsKcvw6DvkRWckqkj/CHXqXeFwS akydFppIKd3MAj9OjRQhMjKMqIAzieKlwj9UCW57F5Y7oLuVOt/bBfoqFxz+2VHn+GFAM9cS2 TKKtq8TZjcIEt0ouKy7lWtfCH4o7uyvNny8ypFKhCodYc5WEcjVxvf9LjOS9P5Z+qzHh2SrIE uxScFulOyaVmahOpIJH9mfncFRqo1k9+O2Swml/5FvrIFdJ47KH7jIEsneD/hcKAFNG9OnzXB 4FLchqlAm9jDSw5SVITDDL0Fqob5fis9vVetUp0FePeApti5KuIawyaW4oxrJlWXa3t9HR5Kl 37pWrL9FYsFSJo46eEU4mB/fblUHzudvHPl6iWu0mmPw5fdxr/Mr5h+j+UN8HsDFgxQaAAZ/n pZnhDTxhJ80+ZjMfOM+0YZBftVxKJZLkw2jYbLf7b4fObK0YJA6J+wzWRfOK4rWX9+5dIWH5Z kNGHKej5oeUBEdRiHZCsViBBMOLPWHhF0Q7EyUgRI5WISq5v1A3kUSLQNxPEbplZ3OQmXbDNN AtTxeMyMmVO/SURoxBI4AxRiKNPmcFvV6s1ZY5FxNkeCL06YsJfw1shYLboxfIjVonXOKR+Ds dtLR3vtCjEWYPPjJ9fuOiNO6m8H1w== Sender: linux-parisc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-parisc@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Add a firmware wrapper function, which asks PDC firmware for the DIMM slot of a physical address. This is needed to show users which DIMM module needs replacement in case a broken DIMM was encountered. Signed-off-by: Helge Deller --- To unsubscribe from this list: send the line "unsubscribe linux-parisc" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html diff --git a/arch/parisc/include/asm/pdcpat.h b/arch/parisc/include/asm/pdcpat.h index 32e105f..e3c0586 100644 --- a/arch/parisc/include/asm/pdcpat.h +++ b/arch/parisc/include/asm/pdcpat.h @@ -150,7 +150,7 @@ #define PDC_PAT_MEM_SETGM 9L /* Set Good Memory value */ #define PDC_PAT_MEM_ADD_PAGE 10L /* ADDs a page to the cell */ #define PDC_PAT_MEM_ADDRESS 11L /* Get Physical Location From */ - /* Memory Address */ + /* Memory Address */ #define PDC_PAT_MEM_GET_TXT_SIZE 12L /* Get Formatted Text Size */ #define PDC_PAT_MEM_GET_PD_TXT 13L /* Get PD Formatted Text */ #define PDC_PAT_MEM_GET_CELL_TXT 14L /* Get Cell Formatted Text */ @@ -228,6 +228,17 @@ struct pdc_pat_mem_read_pd_retinfo { /* PDC_PAT_MEM/PDC_PAT_MEM_PD_READ */ unsigned long pdt_entries; }; +struct pdc_pat_mem_phys_mem_location { /* PDC_PAT_MEM/PDC_PAT_MEM_ADDRESS */ + u64 cabinet:8; + u64 ign1:8; + u64 ign2:8; + u64 cell_slot:8; + u64 ign3:8; + u64 dimm_slot:8; /* DIMM slot, e.g. 0x1A, 0x2B, show user hex value! */ + u64 ign4:8; + u64 source:4; /* for mem: always 0x07 */ + u64 source_detail:4; /* for mem: always 0x04 (SIMM or DIMM) */ +}; struct pdc_pat_pd_addr_map_entry { unsigned char entry_type; /* 1 = Memory Descriptor Entry Type */ @@ -319,6 +330,9 @@ extern int pdc_pat_mem_read_cell_pdt(struct pdc_pat_mem_read_pd_retinfo *pret, extern int pdc_pat_mem_read_pd_pdt(struct pdc_pat_mem_read_pd_retinfo *pret, unsigned long *pdt_entries_ptr, unsigned long count, unsigned long offset); +extern int pdc_pat_mem_get_dimm_phys_location( + struct pdc_pat_mem_phys_mem_location *pret, + unsigned long phys_addr); #endif /* __ASSEMBLY__ */ diff --git a/arch/parisc/kernel/firmware.c b/arch/parisc/kernel/firmware.c index 526ed90..f622a31 100644 --- a/arch/parisc/kernel/firmware.c +++ b/arch/parisc/kernel/firmware.c @@ -1498,6 +1498,31 @@ int pdc_pat_mem_read_pd_pdt(struct pdc_pat_mem_read_pd_retinfo *pret, return retval; } + +/** + * pdc_pat_mem_get_dimm_phys_location - Get physical DIMM slot via PAT firmware + * @pret: ptr to hold returned information + * @phys_addr: physical address to examine + * + */ +int pdc_pat_mem_get_dimm_phys_location( + struct pdc_pat_mem_phys_mem_location *pret, + unsigned long phys_addr) +{ + int retval; + unsigned long flags; + + spin_lock_irqsave(&pdc_lock, flags); + retval = mem_pdc_call(PDC_PAT_MEM, PDC_PAT_MEM_ADDRESS, + __pa(&pdc_result), phys_addr); + + if (retval == PDC_OK) + memcpy(pret, &pdc_result, sizeof(*pret)); + + spin_unlock_irqrestore(&pdc_lock, flags); + + return retval; +} #endif /* CONFIG_64BIT */