From patchwork Mon Jul 31 13:27:18 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Helge Deller X-Patchwork-Id: 9871841 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 06E7260365 for ; Mon, 31 Jul 2017 13:27:31 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id F41E3285CF for ; Mon, 31 Jul 2017 13:27:30 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id E703F285D2; Mon, 31 Jul 2017 13:27:30 +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.9 required=2.0 tests=BAYES_00,FREEMAIL_FROM, RCVD_IN_DNSWL_HI 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 673FE285CF for ; Mon, 31 Jul 2017 13:27:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1750977AbdGaN13 (ORCPT ); Mon, 31 Jul 2017 09:27:29 -0400 Received: from mout.gmx.net ([212.227.17.20]:61222 "EHLO mout.gmx.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750923AbdGaN12 (ORCPT ); Mon, 31 Jul 2017 09:27:28 -0400 Received: from ls3530.fritz.box ([193.159.19.154]) by mail.gmx.com (mrgmx101 [212.227.17.168]) with ESMTPSA (Nemesis) id 0MJXEd-1dZ9v80toJ-0036qO; Mon, 31 Jul 2017 15:27:21 +0200 Date: Mon, 31 Jul 2017 15:27:18 +0200 From: Helge Deller To: linux-parisc@vger.kernel.org, James Bottomley , John David Anglin Subject: [PATCH] parisc: Implement PDT for PAT machines which return cell info Message-ID: <20170731132718.GA15086@ls3530.fritz.box> MIME-Version: 1.0 Content-Disposition: inline User-Agent: Mutt/1.8.3 (2017-05-23) X-Provags-ID: V03:K0:/+joqB1q2b7EQBSeqFtiEijSVETQ0QLHbV1G+exO+0SzauRe9KZ haND1lBrpfbcc2foq8Ob3mhQYcAsjqswiQGO22qZ9ETHZDwMzvOsvvaDOKgO4tWYDte6nP5 JK/35qOCzlKsKrh5bCLN3Up4c4PEdEqedM0MnfFvzHLQq/7MiqqTUAQm/GS++83OHRJR7mF KBbMzKhb/rHtsSaDfGKcA== X-UI-Out-Filterresults: notjunk:1; V01:K0:MyxWgTXIBo0=:zOjqDmd1O0gKjmis+SEEaS 46OBsTYFjSBPyGOX8Gp1233KIaHcQubteFdWuKbbLkDkLTO5pZZGAp13oYHyMKAnZMYpFduHv G1RoUKHWR4thdtf4UBolR+vSImiKFlJRBDIXb4yYawuZGWL7+v/zia1uZzYtcaucC5khRHAUg 57nH0+Yr0rOeBVeoZZzkaFlUoWGQRRp7gz3TxznwOqcRpDEl1CFD7ggOHmElqiMxjJubMuD3U Nwb58tVRkkgYicbbpUnGUJu0VzhLcL1Mco/OE3+nqCz5HUlCXpetlsqpszrNzgSohZx0m78Cz Qlj76ziA42ubhh6SiMRxbkmpwlbKKfHF8dptZtnoaL9d38BDhAwW0vpBF4bnjfJmMU1ODCp3m OSVTNMazO4H6kz5yvGsJMDUQQ6cnfV6tQC04v9xz3dtpHOddE9dcu9KsMSY78He7evhlgyq2W 9yled7ka+eYX+PzUoet98KIZaAaX9wGp33AlmWUxTZ1nIUQCsfLuiBV4a+ymP3U0i36fLPDh5 +O8fJOQS/wuxAIvy8KtDgKp1NvWtlF8+xJ3YntXXxqYbhSi0VNt86LppFGOTYjdU2PYiGlTzf +oRmNMVxsNcXr51BSOi+39lnYJQ6p9OBDs1rOzM6Rj4Zz4JyFarDupJWwK0iQeCLf4qTJ489s FoayxVdk9nIR8W5sgpxd/MHXMK39SOj+gsZwbcaN/MMhn2fnVHwmFOCAbDfdxkmUrm0TvWXRR uZKLghHGLAq2C8kS11PrZpgoIqK43N5zZcOos6ndGjcfBw0iazKuuojgRrdFobkrzLewmzGDN nrPNuFK/BQsQm/BKofOdLImUe9a+A== 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 Machines like rp5470 return their Page Deallocation Table (PDT) info per cell via the PDC_PAT_MEM_PD_INFO PDC call. 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 e3c0586..a468a17 100644 --- a/arch/parisc/include/asm/pdcpat.h +++ b/arch/parisc/include/asm/pdcpat.h @@ -223,6 +223,18 @@ struct pdc_pat_mem_retinfo { /* PDC_PAT_MEM/PDC_PAT_MEM_PD_INFO (return info) */ unsigned long clear_time; /* last PDT clear time (since Jan 1970) */ }; +struct pdc_pat_mem_cell_pdt_retinfo { /* PDC_PAT_MEM/PDC_PAT_MEM_CELL_INFO */ + u64 reserved:32; + u64 cs:1; /* clear status: cleared since the last call? */ + u64 current_pdt_entries:15; + u64 ic:1; /* interleaving had to be changed ? */ + u64 max_pdt_entries:15; + unsigned long good_mem; + unsigned long first_dbe_loc; /* first location of double bit error */ + unsigned long clear_time; /* last PDT clear time (since Jan 1970) */ +}; + + struct pdc_pat_mem_read_pd_retinfo { /* PDC_PAT_MEM/PDC_PAT_MEM_PD_READ */ unsigned long actual_count_bytes; unsigned long pdt_entries; @@ -325,6 +337,8 @@ extern int pdc_pat_io_pci_cfg_read(unsigned long pci_addr, int pci_size, u32 *va extern int pdc_pat_io_pci_cfg_write(unsigned long pci_addr, int pci_size, u32 val); extern int pdc_pat_mem_pdt_info(struct pdc_pat_mem_retinfo *rinfo); +extern int pdc_pat_mem_pdt_cell_info(struct pdc_pat_mem_cell_pdt_retinfo *rinfo, + unsigned long cell); extern int pdc_pat_mem_read_cell_pdt(struct pdc_pat_mem_read_pd_retinfo *pret, unsigned long *pdt_entries_ptr, unsigned long max_entries); extern int pdc_pat_mem_read_pd_pdt(struct pdc_pat_mem_read_pd_retinfo *pret, diff --git a/arch/parisc/kernel/firmware.c b/arch/parisc/kernel/firmware.c index f622a31..a28e42b 100644 --- a/arch/parisc/kernel/firmware.c +++ b/arch/parisc/kernel/firmware.c @@ -1440,6 +1440,29 @@ int pdc_pat_mem_pdt_info(struct pdc_pat_mem_retinfo *rinfo) } /** + * pdc_pat_mem_pdt_cell_info - Retrieve information about page deallocation + * table of a cell + * @rinfo: memory pdt information + * @cell: cell number + * + */ +int pdc_pat_mem_pdt_cell_info(struct pdc_pat_mem_cell_pdt_retinfo *rinfo, + unsigned long cell) +{ + int retval; + unsigned long flags; + + spin_lock_irqsave(&pdc_lock, flags); + retval = mem_pdc_call(PDC_PAT_MEM, PDC_PAT_MEM_CELL_INFO, + __pa(&pdc_result), cell); + if (retval == PDC_OK) + memcpy(rinfo, &pdc_result, sizeof(*rinfo)); + spin_unlock_irqrestore(&pdc_lock, flags); + + return retval; +} + +/** * pdc_pat_mem_read_cell_pdt - Read PDT entries from (old) PAT firmware * @pret: array of PDT entries * @pdt_entries_ptr: ptr to hold number of PDT entries diff --git a/arch/parisc/kernel/pdt.c b/arch/parisc/kernel/pdt.c index d02874e..95e7497 100644 --- a/arch/parisc/kernel/pdt.c +++ b/arch/parisc/kernel/pdt.c @@ -59,7 +59,7 @@ void arch_report_meminfo(struct seq_file *m) */ void __init pdc_pdt_init(void) { - int ret, i; + int ret = PDC_BAD_PROC, i; unsigned long entries; struct pdc_mem_read_pdt pdt_read_ret; @@ -67,14 +67,31 @@ void __init pdc_pdt_init(void) struct pdc_pat_mem_retinfo pat_rinfo; pdt_type = PDT_PAT_NEW; + /* newer machines like C8000 report info for all cells */ ret = pdc_pat_mem_pdt_info(&pat_rinfo); pdt_status.pdt_size = pat_rinfo.max_pdt_entries; pdt_status.pdt_entries = pat_rinfo.current_pdt_entries; pdt_status.pdt_status = 0; pdt_status.first_dbe_loc = pat_rinfo.first_dbe_loc; pdt_status.good_mem = pat_rinfo.good_mem; - } else { + } + + if (is_pdc_pat() && ret != PDC_OK) { + struct pdc_pat_mem_cell_pdt_retinfo cell_rinfo; + + pdt_type = PDT_PAT_OLD; + /* older machines like rp5470 report cell info only */ + ret = pdc_pat_mem_pdt_cell_info(&cell_rinfo, parisc_cell_num); + pdt_status.pdt_size = cell_rinfo.max_pdt_entries; + pdt_status.pdt_entries = cell_rinfo.current_pdt_entries; + pdt_status.pdt_status = 0; + pdt_status.first_dbe_loc = cell_rinfo.first_dbe_loc; + pdt_status.good_mem = cell_rinfo.good_mem; + } + + if (ret != PDC_OK) { pdt_type = PDT_PDC; + /* non-PAT machines provide the standard PDC call */ ret = pdc_mem_pdt_info(&pdt_status); }