aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2018-12-14 12:33:34 -0500
committerLinus Torvalds <torvalds@linux-foundation.org>2018-12-14 12:33:34 -0500
commit4645453cefcebdff9db26f02cf325607357295c4 (patch)
tree7e4ee861ce6d692e0115c66027d231817f7f247f
parentc19bf74fe4d979455b22a8e998615a3d46e24c92 (diff)
parenta225f1567405558fb5410e9b2b90805819df1c67 (diff)
Merge tag 'powerpc-4.20-4' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux
Pull powerpc fixes from Michael Ellerman: "One notable fix for our change to split pt_regs between user/kernel, we forgot to update BPF to use the user-visible type which was an ABI break for BPF programs. A slightly ugly but minimal fix to do_syscall_trace_enter() so that we use tracehook_report_syscall_entry() properly. We'll rework the code in next to avoid the empty if body. Seven commits fixing bugs in the new papr_scm (Storage Class Memory) driver. The driver was finally able to be tested on the other hypervisor which exposed several bugs. The fixes are all fairly minimal at least. Fix a crash in our MSI code if an MSI-capable device is plugged into a non-MSI capable PHB, only seen on older hardware (MPC8378). Fix our legacy serial code to look for "stdout-path" since the device trees were updated to use that instead of "linux,stdout-path". A change to the COFF zImage code to fix booting old powermacs. A couple of minor build fixes. Thanks to: Benjamin Herrenschmidt, Daniel Axtens, Dmitry V. Levin, Elvira Khabirova, Oliver O'Halloran, Paul Mackerras, Radu Rendec, Rob Herring, Sandipan Das" * tag 'powerpc-4.20-4' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux: powerpc/ptrace: replace ptrace_report_syscall() with a tracehook call powerpc/mm: Fallback to RAM if the altmap is unusable powerpc/papr_scm: Use ibm,unit-guid as the iset cookie powerpc/papr_scm: Fix DIMM device registration race powerpc/papr_scm: Remove endian conversions powerpc/papr_scm: Update DT properties powerpc/papr_scm: Fix resource end address powerpc/papr_scm: Use depend instead of select powerpc/bpf: Fix broken uapi for BPF_PROG_TYPE_PERF_EVENT powerpc/boot: Fix build failures with -j 1 powerpc: Look for "stdout-path" when setting up legacy consoles powerpc/msi: Fix NULL pointer access in teardown code powerpc/mm: Fix linux page tables build with some configs powerpc: Fix COFF zImage booting on old powermacs
-rw-r--r--arch/powerpc/boot/Makefile2
-rw-r--r--arch/powerpc/boot/crt0.S4
-rw-r--r--arch/powerpc/include/asm/perf_event.h2
-rw-r--r--arch/powerpc/include/uapi/asm/Kbuild1
-rw-r--r--arch/powerpc/include/uapi/asm/bpf_perf_event.h9
-rw-r--r--arch/powerpc/kernel/legacy_serial.c6
-rw-r--r--arch/powerpc/kernel/msi.c7
-rw-r--r--arch/powerpc/kernel/ptrace.c7
-rw-r--r--arch/powerpc/mm/dump_linuxpagetables.c1
-rw-r--r--arch/powerpc/mm/init_64.c19
-rw-r--r--arch/powerpc/platforms/pseries/Kconfig3
-rw-r--r--arch/powerpc/platforms/pseries/papr_scm.c39
12 files changed, 80 insertions, 20 deletions
diff --git a/arch/powerpc/boot/Makefile b/arch/powerpc/boot/Makefile
index 39354365f54a..ed9883169190 100644
--- a/arch/powerpc/boot/Makefile
+++ b/arch/powerpc/boot/Makefile
@@ -197,7 +197,7 @@ $(obj)/empty.c:
197$(obj)/zImage.coff.lds $(obj)/zImage.ps3.lds : $(obj)/%: $(srctree)/$(src)/%.S 197$(obj)/zImage.coff.lds $(obj)/zImage.ps3.lds : $(obj)/%: $(srctree)/$(src)/%.S
198 $(Q)cp $< $@ 198 $(Q)cp $< $@
199 199
200$(obj)/serial.c: $(obj)/autoconf.h 200$(srctree)/$(src)/serial.c: $(obj)/autoconf.h
201 201
202$(obj)/autoconf.h: $(obj)/%: $(objtree)/include/generated/% 202$(obj)/autoconf.h: $(obj)/%: $(objtree)/include/generated/%
203 $(Q)cp $< $@ 203 $(Q)cp $< $@
diff --git a/arch/powerpc/boot/crt0.S b/arch/powerpc/boot/crt0.S
index 32dfe6d083f3..9b9d17437373 100644
--- a/arch/powerpc/boot/crt0.S
+++ b/arch/powerpc/boot/crt0.S
@@ -15,7 +15,7 @@
15RELA = 7 15RELA = 7
16RELACOUNT = 0x6ffffff9 16RELACOUNT = 0x6ffffff9
17 17
18 .text 18 .data
19 /* A procedure descriptor used when booting this as a COFF file. 19 /* A procedure descriptor used when booting this as a COFF file.
20 * When making COFF, this comes first in the link and we're 20 * When making COFF, this comes first in the link and we're
21 * linked at 0x500000. 21 * linked at 0x500000.
@@ -23,6 +23,8 @@ RELACOUNT = 0x6ffffff9
23 .globl _zimage_start_opd 23 .globl _zimage_start_opd
24_zimage_start_opd: 24_zimage_start_opd:
25 .long 0x500000, 0, 0, 0 25 .long 0x500000, 0, 0, 0
26 .text
27 b _zimage_start
26 28
27#ifdef __powerpc64__ 29#ifdef __powerpc64__
28.balign 8 30.balign 8
diff --git a/arch/powerpc/include/asm/perf_event.h b/arch/powerpc/include/asm/perf_event.h
index 8bf1b6351716..16a49819da9a 100644
--- a/arch/powerpc/include/asm/perf_event.h
+++ b/arch/powerpc/include/asm/perf_event.h
@@ -26,6 +26,8 @@
26#include <asm/ptrace.h> 26#include <asm/ptrace.h>
27#include <asm/reg.h> 27#include <asm/reg.h>
28 28
29#define perf_arch_bpf_user_pt_regs(regs) &regs->user_regs
30
29/* 31/*
30 * Overload regs->result to specify whether we should use the MSR (result 32 * Overload regs->result to specify whether we should use the MSR (result
31 * is zero) or the SIAR (result is non zero). 33 * is zero) or the SIAR (result is non zero).
diff --git a/arch/powerpc/include/uapi/asm/Kbuild b/arch/powerpc/include/uapi/asm/Kbuild
index a658091a19f9..3712152206f3 100644
--- a/arch/powerpc/include/uapi/asm/Kbuild
+++ b/arch/powerpc/include/uapi/asm/Kbuild
@@ -1,7 +1,6 @@
1# UAPI Header export list 1# UAPI Header export list
2include include/uapi/asm-generic/Kbuild.asm 2include include/uapi/asm-generic/Kbuild.asm
3 3
4generic-y += bpf_perf_event.h
5generic-y += param.h 4generic-y += param.h
6generic-y += poll.h 5generic-y += poll.h
7generic-y += resource.h 6generic-y += resource.h
diff --git a/arch/powerpc/include/uapi/asm/bpf_perf_event.h b/arch/powerpc/include/uapi/asm/bpf_perf_event.h
new file mode 100644
index 000000000000..b551b741653d
--- /dev/null
+++ b/arch/powerpc/include/uapi/asm/bpf_perf_event.h
@@ -0,0 +1,9 @@
1/* SPDX-License-Identifier: GPL-2.0 */
2#ifndef _UAPI__ASM_BPF_PERF_EVENT_H__
3#define _UAPI__ASM_BPF_PERF_EVENT_H__
4
5#include <asm/ptrace.h>
6
7typedef struct user_pt_regs bpf_user_pt_regs_t;
8
9#endif /* _UAPI__ASM_BPF_PERF_EVENT_H__ */
diff --git a/arch/powerpc/kernel/legacy_serial.c b/arch/powerpc/kernel/legacy_serial.c
index 33b34a58fc62..5b9dce17f0c9 100644
--- a/arch/powerpc/kernel/legacy_serial.c
+++ b/arch/powerpc/kernel/legacy_serial.c
@@ -372,6 +372,8 @@ void __init find_legacy_serial_ports(void)
372 372
373 /* Now find out if one of these is out firmware console */ 373 /* Now find out if one of these is out firmware console */
374 path = of_get_property(of_chosen, "linux,stdout-path", NULL); 374 path = of_get_property(of_chosen, "linux,stdout-path", NULL);
375 if (path == NULL)
376 path = of_get_property(of_chosen, "stdout-path", NULL);
375 if (path != NULL) { 377 if (path != NULL) {
376 stdout = of_find_node_by_path(path); 378 stdout = of_find_node_by_path(path);
377 if (stdout) 379 if (stdout)
@@ -595,8 +597,10 @@ static int __init check_legacy_serial_console(void)
595 /* We are getting a weird phandle from OF ... */ 597 /* We are getting a weird phandle from OF ... */
596 /* ... So use the full path instead */ 598 /* ... So use the full path instead */
597 name = of_get_property(of_chosen, "linux,stdout-path", NULL); 599 name = of_get_property(of_chosen, "linux,stdout-path", NULL);
600 if (name == NULL)
601 name = of_get_property(of_chosen, "stdout-path", NULL);
598 if (name == NULL) { 602 if (name == NULL) {
599 DBG(" no linux,stdout-path !\n"); 603 DBG(" no stdout-path !\n");
600 return -ENODEV; 604 return -ENODEV;
601 } 605 }
602 prom_stdout = of_find_node_by_path(name); 606 prom_stdout = of_find_node_by_path(name);
diff --git a/arch/powerpc/kernel/msi.c b/arch/powerpc/kernel/msi.c
index dab616a33b8d..f2197654be07 100644
--- a/arch/powerpc/kernel/msi.c
+++ b/arch/powerpc/kernel/msi.c
@@ -34,5 +34,10 @@ void arch_teardown_msi_irqs(struct pci_dev *dev)
34{ 34{
35 struct pci_controller *phb = pci_bus_to_host(dev->bus); 35 struct pci_controller *phb = pci_bus_to_host(dev->bus);
36 36
37 phb->controller_ops.teardown_msi_irqs(dev); 37 /*
38 * We can be called even when arch_setup_msi_irqs() returns -ENOSYS,
39 * so check the pointer again.
40 */
41 if (phb->controller_ops.teardown_msi_irqs)
42 phb->controller_ops.teardown_msi_irqs(dev);
38} 43}
diff --git a/arch/powerpc/kernel/ptrace.c b/arch/powerpc/kernel/ptrace.c
index afb819f4ca68..714c3480c52d 100644
--- a/arch/powerpc/kernel/ptrace.c
+++ b/arch/powerpc/kernel/ptrace.c
@@ -3266,12 +3266,17 @@ long do_syscall_trace_enter(struct pt_regs *regs)
3266 user_exit(); 3266 user_exit();
3267 3267
3268 if (test_thread_flag(TIF_SYSCALL_EMU)) { 3268 if (test_thread_flag(TIF_SYSCALL_EMU)) {
3269 ptrace_report_syscall(regs);
3270 /* 3269 /*
3270 * A nonzero return code from tracehook_report_syscall_entry()
3271 * tells us to prevent the syscall execution, but we are not
3272 * going to execute it anyway.
3273 *
3271 * Returning -1 will skip the syscall execution. We want to 3274 * Returning -1 will skip the syscall execution. We want to
3272 * avoid clobbering any register also, thus, not 'gotoing' 3275 * avoid clobbering any register also, thus, not 'gotoing'
3273 * skip label. 3276 * skip label.
3274 */ 3277 */
3278 if (tracehook_report_syscall_entry(regs))
3279 ;
3275 return -1; 3280 return -1;
3276 } 3281 }
3277 3282
diff --git a/arch/powerpc/mm/dump_linuxpagetables.c b/arch/powerpc/mm/dump_linuxpagetables.c
index 2b74f8adf4d0..6aa41669ac1a 100644
--- a/arch/powerpc/mm/dump_linuxpagetables.c
+++ b/arch/powerpc/mm/dump_linuxpagetables.c
@@ -19,6 +19,7 @@
19#include <linux/hugetlb.h> 19#include <linux/hugetlb.h>
20#include <linux/io.h> 20#include <linux/io.h>
21#include <linux/mm.h> 21#include <linux/mm.h>
22#include <linux/highmem.h>
22#include <linux/sched.h> 23#include <linux/sched.h>
23#include <linux/seq_file.h> 24#include <linux/seq_file.h>
24#include <asm/fixmap.h> 25#include <asm/fixmap.h>
diff --git a/arch/powerpc/mm/init_64.c b/arch/powerpc/mm/init_64.c
index 7a9886f98b0c..a5091c034747 100644
--- a/arch/powerpc/mm/init_64.c
+++ b/arch/powerpc/mm/init_64.c
@@ -188,15 +188,20 @@ int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node,
188 pr_debug("vmemmap_populate %lx..%lx, node %d\n", start, end, node); 188 pr_debug("vmemmap_populate %lx..%lx, node %d\n", start, end, node);
189 189
190 for (; start < end; start += page_size) { 190 for (; start < end; start += page_size) {
191 void *p; 191 void *p = NULL;
192 int rc; 192 int rc;
193 193
194 if (vmemmap_populated(start, page_size)) 194 if (vmemmap_populated(start, page_size))
195 continue; 195 continue;
196 196
197 /*
198 * Allocate from the altmap first if we have one. This may
199 * fail due to alignment issues when using 16MB hugepages, so
200 * fall back to system memory if the altmap allocation fail.
201 */
197 if (altmap) 202 if (altmap)
198 p = altmap_alloc_block_buf(page_size, altmap); 203 p = altmap_alloc_block_buf(page_size, altmap);
199 else 204 if (!p)
200 p = vmemmap_alloc_block_buf(page_size, node); 205 p = vmemmap_alloc_block_buf(page_size, node);
201 if (!p) 206 if (!p)
202 return -ENOMEM; 207 return -ENOMEM;
@@ -255,8 +260,15 @@ void __ref vmemmap_free(unsigned long start, unsigned long end,
255{ 260{
256 unsigned long page_size = 1 << mmu_psize_defs[mmu_vmemmap_psize].shift; 261 unsigned long page_size = 1 << mmu_psize_defs[mmu_vmemmap_psize].shift;
257 unsigned long page_order = get_order(page_size); 262 unsigned long page_order = get_order(page_size);
263 unsigned long alt_start = ~0, alt_end = ~0;
264 unsigned long base_pfn;
258 265
259 start = _ALIGN_DOWN(start, page_size); 266 start = _ALIGN_DOWN(start, page_size);
267 if (altmap) {
268 alt_start = altmap->base_pfn;
269 alt_end = altmap->base_pfn + altmap->reserve +
270 altmap->free + altmap->alloc + altmap->align;
271 }
260 272
261 pr_debug("vmemmap_free %lx...%lx\n", start, end); 273 pr_debug("vmemmap_free %lx...%lx\n", start, end);
262 274
@@ -280,8 +292,9 @@ void __ref vmemmap_free(unsigned long start, unsigned long end,
280 page = pfn_to_page(addr >> PAGE_SHIFT); 292 page = pfn_to_page(addr >> PAGE_SHIFT);
281 section_base = pfn_to_page(vmemmap_section_start(start)); 293 section_base = pfn_to_page(vmemmap_section_start(start));
282 nr_pages = 1 << page_order; 294 nr_pages = 1 << page_order;
295 base_pfn = PHYS_PFN(addr);
283 296
284 if (altmap) { 297 if (base_pfn >= alt_start && base_pfn < alt_end) {
285 vmem_altmap_free(altmap, nr_pages); 298 vmem_altmap_free(altmap, nr_pages);
286 } else if (PageReserved(page)) { 299 } else if (PageReserved(page)) {
287 /* allocated from bootmem */ 300 /* allocated from bootmem */
diff --git a/arch/powerpc/platforms/pseries/Kconfig b/arch/powerpc/platforms/pseries/Kconfig
index 2e4bd32154b5..472b784f01eb 100644
--- a/arch/powerpc/platforms/pseries/Kconfig
+++ b/arch/powerpc/platforms/pseries/Kconfig
@@ -140,8 +140,7 @@ config IBMEBUS
140 Bus device driver for GX bus based adapters. 140 Bus device driver for GX bus based adapters.
141 141
142config PAPR_SCM 142config PAPR_SCM
143 depends on PPC_PSERIES && MEMORY_HOTPLUG 143 depends on PPC_PSERIES && MEMORY_HOTPLUG && LIBNVDIMM
144 select LIBNVDIMM
145 tristate "Support for the PAPR Storage Class Memory interface" 144 tristate "Support for the PAPR Storage Class Memory interface"
146 help 145 help
147 Enable access to hypervisor provided storage class memory. 146 Enable access to hypervisor provided storage class memory.
diff --git a/arch/powerpc/platforms/pseries/papr_scm.c b/arch/powerpc/platforms/pseries/papr_scm.c
index ee9372b65ca5..7d6457ab5d34 100644
--- a/arch/powerpc/platforms/pseries/papr_scm.c
+++ b/arch/powerpc/platforms/pseries/papr_scm.c
@@ -55,7 +55,7 @@ static int drc_pmem_bind(struct papr_scm_priv *p)
55 do { 55 do {
56 rc = plpar_hcall(H_SCM_BIND_MEM, ret, p->drc_index, 0, 56 rc = plpar_hcall(H_SCM_BIND_MEM, ret, p->drc_index, 0,
57 p->blocks, BIND_ANY_ADDR, token); 57 p->blocks, BIND_ANY_ADDR, token);
58 token = be64_to_cpu(ret[0]); 58 token = ret[0];
59 cond_resched(); 59 cond_resched();
60 } while (rc == H_BUSY); 60 } while (rc == H_BUSY);
61 61
@@ -64,7 +64,7 @@ static int drc_pmem_bind(struct papr_scm_priv *p)
64 return -ENXIO; 64 return -ENXIO;
65 } 65 }
66 66
67 p->bound_addr = be64_to_cpu(ret[1]); 67 p->bound_addr = ret[1];
68 68
69 dev_dbg(&p->pdev->dev, "bound drc %x to %pR\n", p->drc_index, &p->res); 69 dev_dbg(&p->pdev->dev, "bound drc %x to %pR\n", p->drc_index, &p->res);
70 70
@@ -82,7 +82,7 @@ static int drc_pmem_unbind(struct papr_scm_priv *p)
82 do { 82 do {
83 rc = plpar_hcall(H_SCM_UNBIND_MEM, ret, p->drc_index, 83 rc = plpar_hcall(H_SCM_UNBIND_MEM, ret, p->drc_index,
84 p->bound_addr, p->blocks, token); 84 p->bound_addr, p->blocks, token);
85 token = be64_to_cpu(ret); 85 token = ret[0];
86 cond_resched(); 86 cond_resched();
87 } while (rc == H_BUSY); 87 } while (rc == H_BUSY);
88 88
@@ -223,6 +223,9 @@ static int papr_scm_nvdimm_init(struct papr_scm_priv *p)
223 goto err; 223 goto err;
224 } 224 }
225 225
226 if (nvdimm_bus_check_dimm_count(p->bus, 1))
227 goto err;
228
226 /* now add the region */ 229 /* now add the region */
227 230
228 memset(&mapping, 0, sizeof(mapping)); 231 memset(&mapping, 0, sizeof(mapping));
@@ -257,9 +260,12 @@ err: nvdimm_bus_unregister(p->bus);
257 260
258static int papr_scm_probe(struct platform_device *pdev) 261static int papr_scm_probe(struct platform_device *pdev)
259{ 262{
260 uint32_t drc_index, metadata_size, unit_cap[2];
261 struct device_node *dn = pdev->dev.of_node; 263 struct device_node *dn = pdev->dev.of_node;
264 u32 drc_index, metadata_size;
265 u64 blocks, block_size;
262 struct papr_scm_priv *p; 266 struct papr_scm_priv *p;
267 const char *uuid_str;
268 u64 uuid[2];
263 int rc; 269 int rc;
264 270
265 /* check we have all the required DT properties */ 271 /* check we have all the required DT properties */
@@ -268,8 +274,18 @@ static int papr_scm_probe(struct platform_device *pdev)
268 return -ENODEV; 274 return -ENODEV;
269 } 275 }
270 276
271 if (of_property_read_u32_array(dn, "ibm,unit-capacity", unit_cap, 2)) { 277 if (of_property_read_u64(dn, "ibm,block-size", &block_size)) {
272 dev_err(&pdev->dev, "%pOF: missing unit-capacity!\n", dn); 278 dev_err(&pdev->dev, "%pOF: missing block-size!\n", dn);
279 return -ENODEV;
280 }
281
282 if (of_property_read_u64(dn, "ibm,number-of-blocks", &blocks)) {
283 dev_err(&pdev->dev, "%pOF: missing number-of-blocks!\n", dn);
284 return -ENODEV;
285 }
286
287 if (of_property_read_string(dn, "ibm,unit-guid", &uuid_str)) {
288 dev_err(&pdev->dev, "%pOF: missing unit-guid!\n", dn);
273 return -ENODEV; 289 return -ENODEV;
274 } 290 }
275 291
@@ -282,8 +298,13 @@ static int papr_scm_probe(struct platform_device *pdev)
282 298
283 p->dn = dn; 299 p->dn = dn;
284 p->drc_index = drc_index; 300 p->drc_index = drc_index;
285 p->block_size = unit_cap[0]; 301 p->block_size = block_size;
286 p->blocks = unit_cap[1]; 302 p->blocks = blocks;
303
304 /* We just need to ensure that set cookies are unique across */
305 uuid_parse(uuid_str, (uuid_t *) uuid);
306 p->nd_set.cookie1 = uuid[0];
307 p->nd_set.cookie2 = uuid[1];
287 308
288 /* might be zero */ 309 /* might be zero */
289 p->metadata_size = metadata_size; 310 p->metadata_size = metadata_size;
@@ -296,7 +317,7 @@ static int papr_scm_probe(struct platform_device *pdev)
296 317
297 /* setup the resource for the newly bound range */ 318 /* setup the resource for the newly bound range */
298 p->res.start = p->bound_addr; 319 p->res.start = p->bound_addr;
299 p->res.end = p->bound_addr + p->blocks * p->block_size; 320 p->res.end = p->bound_addr + p->blocks * p->block_size - 1;
300 p->res.name = pdev->name; 321 p->res.name = pdev->name;
301 p->res.flags = IORESOURCE_MEM; 322 p->res.flags = IORESOURCE_MEM;
302 323