ARC fixes for 4.9-rc5
- mmap handler for dma ops as generic handler no longer works for us [Alexey] - Fixes for EZChip platform [Noam] - Fix RTC clocksource driver build issue - ARC IRQ handling fixes [Yuriy] - Revert a recent makefile change which doesn't go well with oldish tools out in the wild -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJYJhV1AAoJEGnX8d3iisJeZZgP/2/nJVi4LTpXYqhpt04yNvCD Fxwt8KypWfpbd8KDiK+C0OJiFmCa2XAZwAamRBkgtgKreq9/Vq4MYEiQXcYlQkQb dCmU6T+RmSb15/7N3ZD1xhXB34ktGz1ffjcp8si0LIOkOj5cHQ3Ex4MH/SVQWuRh VypLOfTJlLS0DoEvo/S4Vk2fBH65dLAWoeBl63J6yAcEdflzkoTmH9QWVzGlHGmi mZ66/OeD4Rh7GDnrv5BQYLZJwUGQjoV3n4MhchrZ5uVt6UWs56ypi+ZVML/qYS5m YuCOY7O9ZJ94/XY/pMa7CqEPgNm4ZHN/7DQ32F9X5BemQxZY8/JvUjPsuP42iXol DfhtA55mNRk6yP0Ku5L2xg64mazyy9HqZnSh2pYpUMePSkcX/AXMrlOWSzFh250s qkXEpwQgccl4HMA6xarjeQxFZL34lh1N40p3s6PXT6UJwfWOgD2w8Z4qW1jdp7G2 VkblWUN5AVT2YcyBcKgMGG09sLgIXhV40NVO4fvOo4p6qBSYk/yL3YRBKppOt+aQ EVf6yaUKlpac6D9Ozy1pG5yfcx6wwaT0Iregjsld35WJ8Lvg9tLo0oLJrU0tlyCY tX6zbgcXXU2y0TPKN1jJQ2u14Pfscfd5DLo1M64COKAGIaPrWYUBxJ0sBhqolq66 gKJwyOWse63H4ZxkEFCP =hbBv -----END PGP SIGNATURE----- Merge tag 'arc-4.9-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc Pull ARC fixes from Vineet Gupta: - mmap handler for dma ops as generic handler no longer works for us [Alexey] - Fixes for EZChip platform [Noam] - Fix RTC clocksource driver build issue - ARC IRQ handling fixes [Yuriy] - Revert a recent makefile change which doesn't go well with oldish tools out in the wild * tag 'arc-4.9-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc: ARCv2: MCIP: Use IDU_M_DISTRI_DEST mode if there is only 1 destination core ARC: IRQ: Do not use hwirq as virq and vice versa ARC: [plat-eznps] set default baud for early console ARC: [plat-eznps] remove IPI clear from SMP operations Revert "ARC: build: retire old toggles" ARC: timer: rtc: implement read loop in "C" vs. inline asm ARC: change return value of userspace cmpxchg assist syscall arc: Implement arch-specific dma_map_ops.mmap ARC: [SMP] avoid overriding present cpumask ARC: Enable PERF_EVENTS in nSIM driven platforms
This commit is contained in:
commit
e6251f009b
@ -50,6 +50,9 @@ atleast_gcc44 := $(call cc-ifversion, -ge, 0404, y)
|
|||||||
|
|
||||||
cflags-$(atleast_gcc44) += -fsection-anchors
|
cflags-$(atleast_gcc44) += -fsection-anchors
|
||||||
|
|
||||||
|
cflags-$(CONFIG_ARC_HAS_LLSC) += -mlock
|
||||||
|
cflags-$(CONFIG_ARC_HAS_SWAPE) += -mswape
|
||||||
|
|
||||||
ifdef CONFIG_ISA_ARCV2
|
ifdef CONFIG_ISA_ARCV2
|
||||||
|
|
||||||
ifndef CONFIG_ARC_HAS_LL64
|
ifndef CONFIG_ARC_HAS_LL64
|
||||||
|
@ -71,7 +71,7 @@
|
|||||||
reg-io-width = <4>;
|
reg-io-width = <4>;
|
||||||
};
|
};
|
||||||
|
|
||||||
arcpmu0: pmu {
|
arcpct0: pct {
|
||||||
compatible = "snps,arc700-pct";
|
compatible = "snps,arc700-pct";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -69,7 +69,7 @@
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
arcpmu0: pmu {
|
arcpct0: pct {
|
||||||
compatible = "snps,arc700-pct";
|
compatible = "snps,arc700-pct";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -83,5 +83,9 @@
|
|||||||
reg = <0xf0003000 0x44>;
|
reg = <0xf0003000 0x44>;
|
||||||
interrupts = <7>;
|
interrupts = <7>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
arcpct0: pct {
|
||||||
|
compatible = "snps,arc700-pct";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -14,6 +14,7 @@ CONFIG_BLK_DEV_INITRD=y
|
|||||||
CONFIG_INITRAMFS_SOURCE="../arc_initramfs/"
|
CONFIG_INITRAMFS_SOURCE="../arc_initramfs/"
|
||||||
CONFIG_KALLSYMS_ALL=y
|
CONFIG_KALLSYMS_ALL=y
|
||||||
CONFIG_EMBEDDED=y
|
CONFIG_EMBEDDED=y
|
||||||
|
CONFIG_PERF_EVENTS=y
|
||||||
# CONFIG_SLUB_DEBUG is not set
|
# CONFIG_SLUB_DEBUG is not set
|
||||||
# CONFIG_COMPAT_BRK is not set
|
# CONFIG_COMPAT_BRK is not set
|
||||||
CONFIG_KPROBES=y
|
CONFIG_KPROBES=y
|
||||||
|
@ -14,6 +14,7 @@ CONFIG_BLK_DEV_INITRD=y
|
|||||||
CONFIG_INITRAMFS_SOURCE="../../arc_initramfs_hs/"
|
CONFIG_INITRAMFS_SOURCE="../../arc_initramfs_hs/"
|
||||||
CONFIG_KALLSYMS_ALL=y
|
CONFIG_KALLSYMS_ALL=y
|
||||||
CONFIG_EMBEDDED=y
|
CONFIG_EMBEDDED=y
|
||||||
|
CONFIG_PERF_EVENTS=y
|
||||||
# CONFIG_SLUB_DEBUG is not set
|
# CONFIG_SLUB_DEBUG is not set
|
||||||
# CONFIG_COMPAT_BRK is not set
|
# CONFIG_COMPAT_BRK is not set
|
||||||
CONFIG_KPROBES=y
|
CONFIG_KPROBES=y
|
||||||
|
@ -12,6 +12,7 @@ CONFIG_BLK_DEV_INITRD=y
|
|||||||
CONFIG_INITRAMFS_SOURCE="../arc_initramfs_hs/"
|
CONFIG_INITRAMFS_SOURCE="../arc_initramfs_hs/"
|
||||||
CONFIG_KALLSYMS_ALL=y
|
CONFIG_KALLSYMS_ALL=y
|
||||||
CONFIG_EMBEDDED=y
|
CONFIG_EMBEDDED=y
|
||||||
|
CONFIG_PERF_EVENTS=y
|
||||||
# CONFIG_SLUB_DEBUG is not set
|
# CONFIG_SLUB_DEBUG is not set
|
||||||
# CONFIG_COMPAT_BRK is not set
|
# CONFIG_COMPAT_BRK is not set
|
||||||
CONFIG_KPROBES=y
|
CONFIG_KPROBES=y
|
||||||
|
@ -14,6 +14,7 @@ CONFIG_BLK_DEV_INITRD=y
|
|||||||
CONFIG_INITRAMFS_SOURCE="../arc_initramfs/"
|
CONFIG_INITRAMFS_SOURCE="../arc_initramfs/"
|
||||||
CONFIG_KALLSYMS_ALL=y
|
CONFIG_KALLSYMS_ALL=y
|
||||||
CONFIG_EMBEDDED=y
|
CONFIG_EMBEDDED=y
|
||||||
|
CONFIG_PERF_EVENTS=y
|
||||||
# CONFIG_SLUB_DEBUG is not set
|
# CONFIG_SLUB_DEBUG is not set
|
||||||
# CONFIG_COMPAT_BRK is not set
|
# CONFIG_COMPAT_BRK is not set
|
||||||
CONFIG_KPROBES=y
|
CONFIG_KPROBES=y
|
||||||
|
@ -14,6 +14,7 @@ CONFIG_BLK_DEV_INITRD=y
|
|||||||
CONFIG_INITRAMFS_SOURCE="../arc_initramfs_hs/"
|
CONFIG_INITRAMFS_SOURCE="../arc_initramfs_hs/"
|
||||||
CONFIG_KALLSYMS_ALL=y
|
CONFIG_KALLSYMS_ALL=y
|
||||||
CONFIG_EMBEDDED=y
|
CONFIG_EMBEDDED=y
|
||||||
|
CONFIG_PERF_EVENTS=y
|
||||||
# CONFIG_SLUB_DEBUG is not set
|
# CONFIG_SLUB_DEBUG is not set
|
||||||
# CONFIG_COMPAT_BRK is not set
|
# CONFIG_COMPAT_BRK is not set
|
||||||
CONFIG_KPROBES=y
|
CONFIG_KPROBES=y
|
||||||
|
@ -10,6 +10,7 @@ CONFIG_IKCONFIG_PROC=y
|
|||||||
# CONFIG_PID_NS is not set
|
# CONFIG_PID_NS is not set
|
||||||
CONFIG_BLK_DEV_INITRD=y
|
CONFIG_BLK_DEV_INITRD=y
|
||||||
CONFIG_INITRAMFS_SOURCE="../arc_initramfs_hs/"
|
CONFIG_INITRAMFS_SOURCE="../arc_initramfs_hs/"
|
||||||
|
CONFIG_PERF_EVENTS=y
|
||||||
# CONFIG_COMPAT_BRK is not set
|
# CONFIG_COMPAT_BRK is not set
|
||||||
CONFIG_KPROBES=y
|
CONFIG_KPROBES=y
|
||||||
CONFIG_MODULES=y
|
CONFIG_MODULES=y
|
||||||
@ -34,7 +35,6 @@ CONFIG_INET=y
|
|||||||
# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
|
# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
|
||||||
# CONFIG_INET_XFRM_MODE_TUNNEL is not set
|
# CONFIG_INET_XFRM_MODE_TUNNEL is not set
|
||||||
# CONFIG_INET_XFRM_MODE_BEET is not set
|
# CONFIG_INET_XFRM_MODE_BEET is not set
|
||||||
# CONFIG_INET_LRO is not set
|
|
||||||
# CONFIG_IPV6 is not set
|
# CONFIG_IPV6 is not set
|
||||||
# CONFIG_WIRELESS is not set
|
# CONFIG_WIRELESS is not set
|
||||||
CONFIG_DEVTMPFS=y
|
CONFIG_DEVTMPFS=y
|
||||||
@ -72,7 +72,6 @@ CONFIG_SERIAL_OF_PLATFORM=y
|
|||||||
# CONFIG_HWMON is not set
|
# CONFIG_HWMON is not set
|
||||||
CONFIG_DRM=y
|
CONFIG_DRM=y
|
||||||
CONFIG_DRM_ARCPGU=y
|
CONFIG_DRM_ARCPGU=y
|
||||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
|
||||||
CONFIG_LOGO=y
|
CONFIG_LOGO=y
|
||||||
# CONFIG_HID is not set
|
# CONFIG_HID is not set
|
||||||
# CONFIG_USB_SUPPORT is not set
|
# CONFIG_USB_SUPPORT is not set
|
||||||
|
@ -43,12 +43,14 @@
|
|||||||
#define STATUS_AE_BIT 5 /* Exception active */
|
#define STATUS_AE_BIT 5 /* Exception active */
|
||||||
#define STATUS_DE_BIT 6 /* PC is in delay slot */
|
#define STATUS_DE_BIT 6 /* PC is in delay slot */
|
||||||
#define STATUS_U_BIT 7 /* User/Kernel mode */
|
#define STATUS_U_BIT 7 /* User/Kernel mode */
|
||||||
|
#define STATUS_Z_BIT 11
|
||||||
#define STATUS_L_BIT 12 /* Loop inhibit */
|
#define STATUS_L_BIT 12 /* Loop inhibit */
|
||||||
|
|
||||||
/* These masks correspond to the status word(STATUS_32) bits */
|
/* These masks correspond to the status word(STATUS_32) bits */
|
||||||
#define STATUS_AE_MASK (1<<STATUS_AE_BIT)
|
#define STATUS_AE_MASK (1<<STATUS_AE_BIT)
|
||||||
#define STATUS_DE_MASK (1<<STATUS_DE_BIT)
|
#define STATUS_DE_MASK (1<<STATUS_DE_BIT)
|
||||||
#define STATUS_U_MASK (1<<STATUS_U_BIT)
|
#define STATUS_U_MASK (1<<STATUS_U_BIT)
|
||||||
|
#define STATUS_Z_MASK (1<<STATUS_Z_BIT)
|
||||||
#define STATUS_L_MASK (1<<STATUS_L_BIT)
|
#define STATUS_L_MASK (1<<STATUS_L_BIT)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -37,9 +37,9 @@ extern const char *arc_platform_smp_cpuinfo(void);
|
|||||||
* API expected BY platform smp code (FROM arch smp code)
|
* API expected BY platform smp code (FROM arch smp code)
|
||||||
*
|
*
|
||||||
* smp_ipi_irq_setup:
|
* smp_ipi_irq_setup:
|
||||||
* Takes @cpu and @irq to which the arch-common ISR is hooked up
|
* Takes @cpu and @hwirq to which the arch-common ISR is hooked up
|
||||||
*/
|
*/
|
||||||
extern int smp_ipi_irq_setup(int cpu, int irq);
|
extern int smp_ipi_irq_setup(int cpu, irq_hw_number_t hwirq);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* struct plat_smp_ops - SMP callbacks provided by platform to ARC SMP
|
* struct plat_smp_ops - SMP callbacks provided by platform to ARC SMP
|
||||||
|
@ -31,6 +31,8 @@ static void __init arc_set_early_base_baud(unsigned long dt_root)
|
|||||||
arc_base_baud = 166666666; /* Fixed 166.6MHz clk (TB10x) */
|
arc_base_baud = 166666666; /* Fixed 166.6MHz clk (TB10x) */
|
||||||
else if (of_flat_dt_is_compatible(dt_root, "snps,arc-sdp"))
|
else if (of_flat_dt_is_compatible(dt_root, "snps,arc-sdp"))
|
||||||
arc_base_baud = 33333333; /* Fixed 33MHz clk (AXS10x) */
|
arc_base_baud = 33333333; /* Fixed 33MHz clk (AXS10x) */
|
||||||
|
else if (of_flat_dt_is_compatible(dt_root, "ezchip,arc-nps"))
|
||||||
|
arc_base_baud = 800000000; /* Fixed 800MHz clk (NPS) */
|
||||||
else
|
else
|
||||||
arc_base_baud = 50000000; /* Fixed default 50MHz */
|
arc_base_baud = 50000000; /* Fixed default 50MHz */
|
||||||
}
|
}
|
||||||
|
@ -181,6 +181,8 @@ idu_irq_set_affinity(struct irq_data *data, const struct cpumask *cpumask,
|
|||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
cpumask_t online;
|
cpumask_t online;
|
||||||
|
unsigned int destination_bits;
|
||||||
|
unsigned int distribution_mode;
|
||||||
|
|
||||||
/* errout if no online cpu per @cpumask */
|
/* errout if no online cpu per @cpumask */
|
||||||
if (!cpumask_and(&online, cpumask, cpu_online_mask))
|
if (!cpumask_and(&online, cpumask, cpu_online_mask))
|
||||||
@ -188,8 +190,15 @@ idu_irq_set_affinity(struct irq_data *data, const struct cpumask *cpumask,
|
|||||||
|
|
||||||
raw_spin_lock_irqsave(&mcip_lock, flags);
|
raw_spin_lock_irqsave(&mcip_lock, flags);
|
||||||
|
|
||||||
idu_set_dest(data->hwirq, cpumask_bits(&online)[0]);
|
destination_bits = cpumask_bits(&online)[0];
|
||||||
idu_set_mode(data->hwirq, IDU_M_TRIG_LEVEL, IDU_M_DISTRI_RR);
|
idu_set_dest(data->hwirq, destination_bits);
|
||||||
|
|
||||||
|
if (ffs(destination_bits) == fls(destination_bits))
|
||||||
|
distribution_mode = IDU_M_DISTRI_DEST;
|
||||||
|
else
|
||||||
|
distribution_mode = IDU_M_DISTRI_RR;
|
||||||
|
|
||||||
|
idu_set_mode(data->hwirq, IDU_M_TRIG_LEVEL, distribution_mode);
|
||||||
|
|
||||||
raw_spin_unlock_irqrestore(&mcip_lock, flags);
|
raw_spin_unlock_irqrestore(&mcip_lock, flags);
|
||||||
|
|
||||||
@ -207,16 +216,15 @@ static struct irq_chip idu_irq_chip = {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static int idu_first_irq;
|
static irq_hw_number_t idu_first_hwirq;
|
||||||
|
|
||||||
static void idu_cascade_isr(struct irq_desc *desc)
|
static void idu_cascade_isr(struct irq_desc *desc)
|
||||||
{
|
{
|
||||||
struct irq_domain *domain = irq_desc_get_handler_data(desc);
|
struct irq_domain *idu_domain = irq_desc_get_handler_data(desc);
|
||||||
unsigned int core_irq = irq_desc_get_irq(desc);
|
irq_hw_number_t core_hwirq = irqd_to_hwirq(irq_desc_get_irq_data(desc));
|
||||||
unsigned int idu_irq;
|
irq_hw_number_t idu_hwirq = core_hwirq - idu_first_hwirq;
|
||||||
|
|
||||||
idu_irq = core_irq - idu_first_irq;
|
generic_handle_irq(irq_find_mapping(idu_domain, idu_hwirq));
|
||||||
generic_handle_irq(irq_find_mapping(domain, idu_irq));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int idu_irq_map(struct irq_domain *d, unsigned int virq, irq_hw_number_t hwirq)
|
static int idu_irq_map(struct irq_domain *d, unsigned int virq, irq_hw_number_t hwirq)
|
||||||
@ -282,7 +290,7 @@ idu_of_init(struct device_node *intc, struct device_node *parent)
|
|||||||
struct irq_domain *domain;
|
struct irq_domain *domain;
|
||||||
/* Read IDU BCR to confirm nr_irqs */
|
/* Read IDU BCR to confirm nr_irqs */
|
||||||
int nr_irqs = of_irq_count(intc);
|
int nr_irqs = of_irq_count(intc);
|
||||||
int i, irq;
|
int i, virq;
|
||||||
struct mcip_bcr mp;
|
struct mcip_bcr mp;
|
||||||
|
|
||||||
READ_BCR(ARC_REG_MCIP_BCR, mp);
|
READ_BCR(ARC_REG_MCIP_BCR, mp);
|
||||||
@ -303,11 +311,11 @@ idu_of_init(struct device_node *intc, struct device_node *parent)
|
|||||||
* however we need it to get the parent virq and set IDU handler
|
* however we need it to get the parent virq and set IDU handler
|
||||||
* as first level isr
|
* as first level isr
|
||||||
*/
|
*/
|
||||||
irq = irq_of_parse_and_map(intc, i);
|
virq = irq_of_parse_and_map(intc, i);
|
||||||
if (!i)
|
if (!i)
|
||||||
idu_first_irq = irq;
|
idu_first_hwirq = irqd_to_hwirq(irq_get_irq_data(virq));
|
||||||
|
|
||||||
irq_set_chained_handler_and_data(irq, idu_cascade_isr, domain);
|
irq_set_chained_handler_and_data(virq, idu_cascade_isr, domain);
|
||||||
}
|
}
|
||||||
|
|
||||||
__mcip_cmd(CMD_IDU_ENABLE, 0);
|
__mcip_cmd(CMD_IDU_ENABLE, 0);
|
||||||
|
@ -43,8 +43,8 @@ SYSCALL_DEFINE0(arc_gettls)
|
|||||||
|
|
||||||
SYSCALL_DEFINE3(arc_usr_cmpxchg, int *, uaddr, int, expected, int, new)
|
SYSCALL_DEFINE3(arc_usr_cmpxchg, int *, uaddr, int, expected, int, new)
|
||||||
{
|
{
|
||||||
int uval;
|
struct pt_regs *regs = current_pt_regs();
|
||||||
int ret;
|
int uval = -EFAULT;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is only for old cores lacking LLOCK/SCOND, which by defintion
|
* This is only for old cores lacking LLOCK/SCOND, which by defintion
|
||||||
@ -54,24 +54,26 @@ SYSCALL_DEFINE3(arc_usr_cmpxchg, int *, uaddr, int, expected, int, new)
|
|||||||
*/
|
*/
|
||||||
WARN_ON_ONCE(IS_ENABLED(CONFIG_SMP));
|
WARN_ON_ONCE(IS_ENABLED(CONFIG_SMP));
|
||||||
|
|
||||||
|
/* Z indicates to userspace if operation succeded */
|
||||||
|
regs->status32 &= ~STATUS_Z_MASK;
|
||||||
|
|
||||||
if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int)))
|
if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
preempt_disable();
|
preempt_disable();
|
||||||
|
|
||||||
ret = __get_user(uval, uaddr);
|
if (__get_user(uval, uaddr))
|
||||||
if (ret)
|
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
if (uval != expected)
|
if (uval == expected) {
|
||||||
ret = -EAGAIN;
|
if (!__put_user(new, uaddr))
|
||||||
else
|
regs->status32 |= STATUS_Z_MASK;
|
||||||
ret = __put_user(new, uaddr);
|
}
|
||||||
|
|
||||||
done:
|
done:
|
||||||
preempt_enable();
|
preempt_enable();
|
||||||
|
|
||||||
return ret;
|
return uval;
|
||||||
}
|
}
|
||||||
|
|
||||||
void arch_cpu_idle(void)
|
void arch_cpu_idle(void)
|
||||||
|
@ -22,6 +22,7 @@
|
|||||||
#include <linux/atomic.h>
|
#include <linux/atomic.h>
|
||||||
#include <linux/cpumask.h>
|
#include <linux/cpumask.h>
|
||||||
#include <linux/reboot.h>
|
#include <linux/reboot.h>
|
||||||
|
#include <linux/irqdomain.h>
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/setup.h>
|
#include <asm/setup.h>
|
||||||
#include <asm/mach_desc.h>
|
#include <asm/mach_desc.h>
|
||||||
@ -67,11 +68,13 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Initialise the present map, which describes the set of CPUs
|
* if platform didn't set the present map already, do it now
|
||||||
* actually populated at the present time.
|
* boot cpu is set to present already by init/main.c
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < max_cpus; i++)
|
if (num_present_cpus() <= 1) {
|
||||||
set_cpu_present(i, true);
|
for (i = 0; i < max_cpus; i++)
|
||||||
|
set_cpu_present(i, true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init smp_cpus_done(unsigned int max_cpus)
|
void __init smp_cpus_done(unsigned int max_cpus)
|
||||||
@ -351,20 +354,24 @@ irqreturn_t do_IPI(int irq, void *dev_id)
|
|||||||
*/
|
*/
|
||||||
static DEFINE_PER_CPU(int, ipi_dev);
|
static DEFINE_PER_CPU(int, ipi_dev);
|
||||||
|
|
||||||
int smp_ipi_irq_setup(int cpu, int irq)
|
int smp_ipi_irq_setup(int cpu, irq_hw_number_t hwirq)
|
||||||
{
|
{
|
||||||
int *dev = per_cpu_ptr(&ipi_dev, cpu);
|
int *dev = per_cpu_ptr(&ipi_dev, cpu);
|
||||||
|
unsigned int virq = irq_find_mapping(NULL, hwirq);
|
||||||
|
|
||||||
|
if (!virq)
|
||||||
|
panic("Cannot find virq for root domain and hwirq=%lu", hwirq);
|
||||||
|
|
||||||
/* Boot cpu calls request, all call enable */
|
/* Boot cpu calls request, all call enable */
|
||||||
if (!cpu) {
|
if (!cpu) {
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
rc = request_percpu_irq(irq, do_IPI, "IPI Interrupt", dev);
|
rc = request_percpu_irq(virq, do_IPI, "IPI Interrupt", dev);
|
||||||
if (rc)
|
if (rc)
|
||||||
panic("Percpu IRQ request failed for %d\n", irq);
|
panic("Percpu IRQ request failed for %u\n", virq);
|
||||||
}
|
}
|
||||||
|
|
||||||
enable_percpu_irq(irq, 0);
|
enable_percpu_irq(virq, 0);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -152,14 +152,17 @@ static cycle_t arc_read_rtc(struct clocksource *cs)
|
|||||||
cycle_t full;
|
cycle_t full;
|
||||||
} stamp;
|
} stamp;
|
||||||
|
|
||||||
|
/*
|
||||||
__asm__ __volatile(
|
* hardware has an internal state machine which tracks readout of
|
||||||
"1: \n"
|
* low/high and updates the CTRL.status if
|
||||||
" lr %0, [AUX_RTC_LOW] \n"
|
* - interrupt/exception taken between the two reads
|
||||||
" lr %1, [AUX_RTC_HIGH] \n"
|
* - high increments after low has been read
|
||||||
" lr %2, [AUX_RTC_CTRL] \n"
|
*/
|
||||||
" bbit0.nt %2, 31, 1b \n"
|
do {
|
||||||
: "=r" (stamp.low), "=r" (stamp.high), "=r" (status));
|
stamp.low = read_aux_reg(AUX_RTC_LOW);
|
||||||
|
stamp.high = read_aux_reg(AUX_RTC_HIGH);
|
||||||
|
status = read_aux_reg(AUX_RTC_CTRL);
|
||||||
|
} while (!(status & _BITUL(31)));
|
||||||
|
|
||||||
return stamp.full;
|
return stamp.full;
|
||||||
}
|
}
|
||||||
|
@ -105,6 +105,31 @@ static void arc_dma_free(struct device *dev, size_t size, void *vaddr,
|
|||||||
__free_pages(page, get_order(size));
|
__free_pages(page, get_order(size));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int arc_dma_mmap(struct device *dev, struct vm_area_struct *vma,
|
||||||
|
void *cpu_addr, dma_addr_t dma_addr, size_t size,
|
||||||
|
unsigned long attrs)
|
||||||
|
{
|
||||||
|
unsigned long user_count = vma_pages(vma);
|
||||||
|
unsigned long count = PAGE_ALIGN(size) >> PAGE_SHIFT;
|
||||||
|
unsigned long pfn = __phys_to_pfn(plat_dma_to_phys(dev, dma_addr));
|
||||||
|
unsigned long off = vma->vm_pgoff;
|
||||||
|
int ret = -ENXIO;
|
||||||
|
|
||||||
|
vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
|
||||||
|
|
||||||
|
if (dma_mmap_from_coherent(dev, vma, cpu_addr, size, &ret))
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
if (off < count && user_count <= (count - off)) {
|
||||||
|
ret = remap_pfn_range(vma, vma->vm_start,
|
||||||
|
pfn + off,
|
||||||
|
user_count << PAGE_SHIFT,
|
||||||
|
vma->vm_page_prot);
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* streaming DMA Mapping API...
|
* streaming DMA Mapping API...
|
||||||
* CPU accesses page via normal paddr, thus needs to explicitly made
|
* CPU accesses page via normal paddr, thus needs to explicitly made
|
||||||
@ -193,6 +218,7 @@ static int arc_dma_supported(struct device *dev, u64 dma_mask)
|
|||||||
struct dma_map_ops arc_dma_ops = {
|
struct dma_map_ops arc_dma_ops = {
|
||||||
.alloc = arc_dma_alloc,
|
.alloc = arc_dma_alloc,
|
||||||
.free = arc_dma_free,
|
.free = arc_dma_free,
|
||||||
|
.mmap = arc_dma_mmap,
|
||||||
.map_page = arc_dma_map_page,
|
.map_page = arc_dma_map_page,
|
||||||
.map_sg = arc_dma_map_sg,
|
.map_sg = arc_dma_map_sg,
|
||||||
.sync_single_for_device = arc_dma_sync_single_for_device,
|
.sync_single_for_device = arc_dma_sync_single_for_device,
|
||||||
|
@ -140,16 +140,10 @@ static void eznps_init_per_cpu(int cpu)
|
|||||||
mtm_enable_core(cpu);
|
mtm_enable_core(cpu);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void eznps_ipi_clear(int irq)
|
|
||||||
{
|
|
||||||
write_aux_reg(CTOP_AUX_IACK, 1 << irq);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct plat_smp_ops plat_smp_ops = {
|
struct plat_smp_ops plat_smp_ops = {
|
||||||
.info = smp_cpuinfo_buf,
|
.info = smp_cpuinfo_buf,
|
||||||
.init_early_smp = eznps_init_cpumasks,
|
.init_early_smp = eznps_init_cpumasks,
|
||||||
.cpu_kick = eznps_smp_wakeup_cpu,
|
.cpu_kick = eznps_smp_wakeup_cpu,
|
||||||
.ipi_send = eznps_ipi_send,
|
.ipi_send = eznps_ipi_send,
|
||||||
.init_per_cpu = eznps_init_per_cpu,
|
.init_per_cpu = eznps_init_per_cpu,
|
||||||
.ipi_clear = eznps_ipi_clear,
|
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user