diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2018-12-14 12:33:34 -0500 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-12-14 12:33:34 -0500 |
| commit | 4645453cefcebdff9db26f02cf325607357295c4 (patch) | |
| tree | 7e4ee861ce6d692e0115c66027d231817f7f247f | |
| parent | c19bf74fe4d979455b22a8e998615a3d46e24c92 (diff) | |
| parent | a225f1567405558fb5410e9b2b90805819df1c67 (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/Makefile | 2 | ||||
| -rw-r--r-- | arch/powerpc/boot/crt0.S | 4 | ||||
| -rw-r--r-- | arch/powerpc/include/asm/perf_event.h | 2 | ||||
| -rw-r--r-- | arch/powerpc/include/uapi/asm/Kbuild | 1 | ||||
| -rw-r--r-- | arch/powerpc/include/uapi/asm/bpf_perf_event.h | 9 | ||||
| -rw-r--r-- | arch/powerpc/kernel/legacy_serial.c | 6 | ||||
| -rw-r--r-- | arch/powerpc/kernel/msi.c | 7 | ||||
| -rw-r--r-- | arch/powerpc/kernel/ptrace.c | 7 | ||||
| -rw-r--r-- | arch/powerpc/mm/dump_linuxpagetables.c | 1 | ||||
| -rw-r--r-- | arch/powerpc/mm/init_64.c | 19 | ||||
| -rw-r--r-- | arch/powerpc/platforms/pseries/Kconfig | 3 | ||||
| -rw-r--r-- | arch/powerpc/platforms/pseries/papr_scm.c | 39 |
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 @@ | |||
| 15 | RELA = 7 | 15 | RELA = 7 |
| 16 | RELACOUNT = 0x6ffffff9 | 16 | RELACOUNT = 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) ®s->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 |
| 2 | include include/uapi/asm-generic/Kbuild.asm | 2 | include include/uapi/asm-generic/Kbuild.asm |
| 3 | 3 | ||
| 4 | generic-y += bpf_perf_event.h | ||
| 5 | generic-y += param.h | 4 | generic-y += param.h |
| 6 | generic-y += poll.h | 5 | generic-y += poll.h |
| 7 | generic-y += resource.h | 6 | generic-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 | |||
| 7 | typedef 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 | ||
| 142 | config PAPR_SCM | 142 | config 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 | ||
| 258 | static int papr_scm_probe(struct platform_device *pdev) | 261 | static 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 | ||
