Commit 036f351e authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux

Pull arm64 fixes from Will Deacon:
 "Not too much here, but we've addressed a couple of nasty issues in the
  dma-mapping code as well as adding the halfword and byte variants of
  load_acquire/store_release following on from the CSD locking bug that
  you fixed in the core.

   - fix perf devicetree warnings at probe time

   - fix memory leak in __dma_free()

   - ensure DMA buffers are always zeroed

   - show IRQ trigger in /proc/interrupts (for parity with ARM)

   - implement byte and halfword access for smp_{load_acquire,store_release}"

* tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux:
  arm64: perf: Fix the pmu node name in warning message
  arm64: perf: don't warn about missing interrupt-affinity property for PPIs
  arm64: add missing PAGE_ALIGN() to __dma_free()
  arm64: dma-mapping: always clear allocated buffers
  ARM64: Enable CONFIG_GENERIC_IRQ_SHOW_LEVEL
  arm64: add missing data types in smp_load_acquire/smp_store_release
parents 4a152c39 8291fd04
...@@ -31,6 +31,7 @@ config ARM64 ...@@ -31,6 +31,7 @@ config ARM64
select GENERIC_EARLY_IOREMAP select GENERIC_EARLY_IOREMAP
select GENERIC_IRQ_PROBE select GENERIC_IRQ_PROBE
select GENERIC_IRQ_SHOW select GENERIC_IRQ_SHOW
select GENERIC_IRQ_SHOW_LEVEL
select GENERIC_PCI_IOMAP select GENERIC_PCI_IOMAP
select GENERIC_SCHED_CLOCK select GENERIC_SCHED_CLOCK
select GENERIC_SMP_IDLE_THREAD select GENERIC_SMP_IDLE_THREAD
......
...@@ -65,6 +65,14 @@ do { \ ...@@ -65,6 +65,14 @@ do { \
do { \ do { \
compiletime_assert_atomic_type(*p); \ compiletime_assert_atomic_type(*p); \
switch (sizeof(*p)) { \ switch (sizeof(*p)) { \
case 1: \
asm volatile ("stlrb %w1, %0" \
: "=Q" (*p) : "r" (v) : "memory"); \
break; \
case 2: \
asm volatile ("stlrh %w1, %0" \
: "=Q" (*p) : "r" (v) : "memory"); \
break; \
case 4: \ case 4: \
asm volatile ("stlr %w1, %0" \ asm volatile ("stlr %w1, %0" \
: "=Q" (*p) : "r" (v) : "memory"); \ : "=Q" (*p) : "r" (v) : "memory"); \
...@@ -81,6 +89,14 @@ do { \ ...@@ -81,6 +89,14 @@ do { \
typeof(*p) ___p1; \ typeof(*p) ___p1; \
compiletime_assert_atomic_type(*p); \ compiletime_assert_atomic_type(*p); \
switch (sizeof(*p)) { \ switch (sizeof(*p)) { \
case 1: \
asm volatile ("ldarb %w0, %1" \
: "=r" (___p1) : "Q" (*p) : "memory"); \
break; \
case 2: \
asm volatile ("ldarh %w0, %1" \
: "=r" (___p1) : "Q" (*p) : "memory"); \
break; \
case 4: \ case 4: \
asm volatile ("ldar %w0, %1" \ asm volatile ("ldar %w0, %1" \
: "=r" (___p1) : "Q" (*p) : "memory"); \ : "=r" (___p1) : "Q" (*p) : "memory"); \
......
...@@ -1310,7 +1310,7 @@ static const struct of_device_id armpmu_of_device_ids[] = { ...@@ -1310,7 +1310,7 @@ static const struct of_device_id armpmu_of_device_ids[] = {
static int armpmu_device_probe(struct platform_device *pdev) static int armpmu_device_probe(struct platform_device *pdev)
{ {
int i, *irqs; int i, irq, *irqs;
if (!cpu_pmu) if (!cpu_pmu)
return -ENODEV; return -ENODEV;
...@@ -1319,6 +1319,11 @@ static int armpmu_device_probe(struct platform_device *pdev) ...@@ -1319,6 +1319,11 @@ static int armpmu_device_probe(struct platform_device *pdev)
if (!irqs) if (!irqs)
return -ENOMEM; return -ENOMEM;
/* Don't bother with PPIs; they're already affine */
irq = platform_get_irq(pdev, 0);
if (irq >= 0 && irq_is_percpu(irq))
return 0;
for (i = 0; i < pdev->num_resources; ++i) { for (i = 0; i < pdev->num_resources; ++i) {
struct device_node *dn; struct device_node *dn;
int cpu; int cpu;
...@@ -1327,7 +1332,7 @@ static int armpmu_device_probe(struct platform_device *pdev) ...@@ -1327,7 +1332,7 @@ static int armpmu_device_probe(struct platform_device *pdev)
i); i);
if (!dn) { if (!dn) {
pr_warn("Failed to parse %s/interrupt-affinity[%d]\n", pr_warn("Failed to parse %s/interrupt-affinity[%d]\n",
of_node_full_name(dn), i); of_node_full_name(pdev->dev.of_node), i);
break; break;
} }
......
...@@ -67,8 +67,7 @@ static void *__alloc_from_pool(size_t size, struct page **ret_page, gfp_t flags) ...@@ -67,8 +67,7 @@ static void *__alloc_from_pool(size_t size, struct page **ret_page, gfp_t flags)
*ret_page = phys_to_page(phys); *ret_page = phys_to_page(phys);
ptr = (void *)val; ptr = (void *)val;
if (flags & __GFP_ZERO) memset(ptr, 0, size);
memset(ptr, 0, size);
} }
return ptr; return ptr;
...@@ -105,7 +104,6 @@ static void *__dma_alloc_coherent(struct device *dev, size_t size, ...@@ -105,7 +104,6 @@ static void *__dma_alloc_coherent(struct device *dev, size_t size,
struct page *page; struct page *page;
void *addr; void *addr;
size = PAGE_ALIGN(size);
page = dma_alloc_from_contiguous(dev, size >> PAGE_SHIFT, page = dma_alloc_from_contiguous(dev, size >> PAGE_SHIFT,
get_order(size)); get_order(size));
if (!page) if (!page)
...@@ -113,8 +111,7 @@ static void *__dma_alloc_coherent(struct device *dev, size_t size, ...@@ -113,8 +111,7 @@ static void *__dma_alloc_coherent(struct device *dev, size_t size,
*dma_handle = phys_to_dma(dev, page_to_phys(page)); *dma_handle = phys_to_dma(dev, page_to_phys(page));
addr = page_address(page); addr = page_address(page);
if (flags & __GFP_ZERO) memset(addr, 0, size);
memset(addr, 0, size);
return addr; return addr;
} else { } else {
return swiotlb_alloc_coherent(dev, size, dma_handle, flags); return swiotlb_alloc_coherent(dev, size, dma_handle, flags);
...@@ -195,6 +192,8 @@ static void __dma_free(struct device *dev, size_t size, ...@@ -195,6 +192,8 @@ static void __dma_free(struct device *dev, size_t size,
{ {
void *swiotlb_addr = phys_to_virt(dma_to_phys(dev, dma_handle)); void *swiotlb_addr = phys_to_virt(dma_to_phys(dev, dma_handle));
size = PAGE_ALIGN(size);
if (!is_device_dma_coherent(dev)) { if (!is_device_dma_coherent(dev)) {
if (__free_from_pool(vaddr, size)) if (__free_from_pool(vaddr, size))
return; return;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment