mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-06 22:58:29 +00:00
ARC fixes for 4.18-rc6
- Fix CONFIG_SWAP [Alexey] - Robistify cmpxchg emulation for systems w/o atomics [Alexey / PeterZ] - Allow mprotext(PROT_EXEC) for stack mappings [Vineet] - HSDK platform enable PCIe, APG GPIO [Gustavo] - miscll other fixes, config updates etc -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJbUimaAAoJEGnX8d3iisJeBRIP/23CVvREA/TzEd+F5s+5aI3E ZnC87eyibuzYmZdLNq65V7WVhjjpP+ijSEss4xoTgMjdrsFylVZTxdwZcSKjhZp1 kvNKmpxYOWfrvYAqKeMEL/LhzDxQB7Q3sHMulYMAHQBz1vN4lZndMwzlwS/dHXMM bm8b4Z3IhxVfQM2IbfTXa2NapEFx5U1K06sF35a5wTJ9acu4Jp4nr/iREmwplPy9 eKjN6UUv7RpRpLdF/bzi3rLZ6rQtuu+SP6e11t5YO+Yrdq6Qg/M0hiGvnxhHDljP lDYed4k1+daq0Cogg8nOX06vAi7JYy+YGgYAVjXAMHNibwF+Cqk/KKZoS4M6C4co 3QulXi9hbrcGszUXvbJKbwQztmFa1wuLt3wLsZKJJ+E/B78t1TpXlXuQSZbtjVrv r5CRAi/q1EeeRP3d3IsKYL9LEQkpksCv3fAhNmbNwKy0TmXEhyerO55umMnJ0Pc+ fd86QIu+91aNL8LH6IesuFFFccrS65vIFu2neNQcV0q2neSVoFKQrYrQ/g14nVw/ ycXOjVKJsTTosKFJhWFDOptUTRiySa0k6VEy92jGtSb/TQRfWLNoTGNVkU20oNrn a4ckeUnYyaG+63Y0YW3yCUkMHBVtx4i0PPYv8BZt4CXB8dYaPKiRTKQE5uundgkO e09YDZW8qPB9Y/T5WK88 =qvRf -----END PGP SIGNATURE----- Merge tag 'arc-4.18-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc Pull ARC fixes from Vineet Gupta: "ARC is back after radio silence in 4.17: - Fix CONFIG_SWAP [Alexey] - Robustify cmpxchg emulation for systems w/o atomics [Alexey / PeterZ] - Allow mprotext(PROT_EXEC) for stack mappings [Vineet] - HSDK platform enable PCIe, APG GPIO [Gustavo] - miscll other fixes, config updates etc" * tag 'arc-4.18-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc: ARCv2: [plat-hsdk]: Save accl reg pair by default ARC: mm: allow mprotect to make stack mappings executable ARC: Fix CONFIG_SWAP ARC: [arcompact] entry.S: minor code movement ARC: configs: Remove CONFIG_INITRAMFS_SOURCE from defconfigs ARC: configs: remove no longer needed CONFIG_DEVPTS_MULTIPLE_INSTANCES ARC: Improve cmpxchg syscall implementation ARC: [plat-hsdk]: Configure APB GPIO controller on ARC HSDK platform ARC: [plat-hsdk] Add PCIe support ARC: Enable machine_desc->init_per_cpu for !CONFIG_SMP ARC: Explicitly add -mmedium-calls to CFLAGS
This commit is contained in:
commit
2a0ea7df1f
24 changed files with 112 additions and 47 deletions
|
@ -413,7 +413,7 @@ config ARC_HAS_DIV_REM
|
||||||
|
|
||||||
config ARC_HAS_ACCL_REGS
|
config ARC_HAS_ACCL_REGS
|
||||||
bool "Reg Pair ACCL:ACCH (FPU and/or MPY > 6)"
|
bool "Reg Pair ACCL:ACCH (FPU and/or MPY > 6)"
|
||||||
default n
|
default y
|
||||||
help
|
help
|
||||||
Depending on the configuration, CPU can contain accumulator reg-pair
|
Depending on the configuration, CPU can contain accumulator reg-pair
|
||||||
(also referred to as r58:r59). These can also be used by gcc as GPR so
|
(also referred to as r58:r59). These can also be used by gcc as GPR so
|
||||||
|
|
|
@ -16,7 +16,7 @@ endif
|
||||||
|
|
||||||
KBUILD_DEFCONFIG := nsim_700_defconfig
|
KBUILD_DEFCONFIG := nsim_700_defconfig
|
||||||
|
|
||||||
cflags-y += -fno-common -pipe -fno-builtin -D__linux__
|
cflags-y += -fno-common -pipe -fno-builtin -mmedium-calls -D__linux__
|
||||||
cflags-$(CONFIG_ISA_ARCOMPACT) += -mA7
|
cflags-$(CONFIG_ISA_ARCOMPACT) += -mA7
|
||||||
cflags-$(CONFIG_ISA_ARCV2) += -mcpu=archs
|
cflags-$(CONFIG_ISA_ARCV2) += -mcpu=archs
|
||||||
|
|
||||||
|
@ -140,16 +140,3 @@ dtbs: scripts
|
||||||
|
|
||||||
archclean:
|
archclean:
|
||||||
$(Q)$(MAKE) $(clean)=$(boot)
|
$(Q)$(MAKE) $(clean)=$(boot)
|
||||||
|
|
||||||
# Hacks to enable final link due to absence of link-time branch relexation
|
|
||||||
# and gcc choosing optimal(shorter) branches at -O3
|
|
||||||
#
|
|
||||||
# vineetg Feb 2010: -mlong-calls switched off for overall kernel build
|
|
||||||
# However lib/decompress_inflate.o (.init.text) calls
|
|
||||||
# zlib_inflate_workspacesize (.text) causing relocation errors.
|
|
||||||
# Thus forcing all exten calls in this file to be long calls
|
|
||||||
export CFLAGS_decompress_inflate.o = -mmedium-calls
|
|
||||||
export CFLAGS_initramfs.o = -mmedium-calls
|
|
||||||
ifdef CONFIG_SMP
|
|
||||||
export CFLAGS_core.o = -mmedium-calls
|
|
||||||
endif
|
|
||||||
|
|
|
@ -11,7 +11,6 @@ CONFIG_NAMESPACES=y
|
||||||
# CONFIG_UTS_NS is not set
|
# CONFIG_UTS_NS is not set
|
||||||
# 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/"
|
|
||||||
CONFIG_EMBEDDED=y
|
CONFIG_EMBEDDED=y
|
||||||
CONFIG_PERF_EVENTS=y
|
CONFIG_PERF_EVENTS=y
|
||||||
# CONFIG_VM_EVENT_COUNTERS is not set
|
# CONFIG_VM_EVENT_COUNTERS is not set
|
||||||
|
|
|
@ -11,7 +11,6 @@ CONFIG_NAMESPACES=y
|
||||||
# CONFIG_UTS_NS is not set
|
# CONFIG_UTS_NS is not set
|
||||||
# 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_EMBEDDED=y
|
CONFIG_EMBEDDED=y
|
||||||
CONFIG_PERF_EVENTS=y
|
CONFIG_PERF_EVENTS=y
|
||||||
# CONFIG_VM_EVENT_COUNTERS is not set
|
# CONFIG_VM_EVENT_COUNTERS is not set
|
||||||
|
|
|
@ -11,7 +11,6 @@ CONFIG_NAMESPACES=y
|
||||||
# CONFIG_UTS_NS is not set
|
# CONFIG_UTS_NS is not set
|
||||||
# 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_EMBEDDED=y
|
CONFIG_EMBEDDED=y
|
||||||
CONFIG_PERF_EVENTS=y
|
CONFIG_PERF_EVENTS=y
|
||||||
# CONFIG_VM_EVENT_COUNTERS is not set
|
# CONFIG_VM_EVENT_COUNTERS is not set
|
||||||
|
|
|
@ -11,7 +11,6 @@ CONFIG_NAMESPACES=y
|
||||||
# CONFIG_UTS_NS is not set
|
# CONFIG_UTS_NS is not set
|
||||||
# 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_EXPERT=y
|
CONFIG_EXPERT=y
|
||||||
CONFIG_PERF_EVENTS=y
|
CONFIG_PERF_EVENTS=y
|
||||||
# CONFIG_COMPAT_BRK is not set
|
# CONFIG_COMPAT_BRK is not set
|
||||||
|
|
|
@ -11,7 +11,6 @@ CONFIG_NAMESPACES=y
|
||||||
# CONFIG_UTS_NS is not set
|
# CONFIG_UTS_NS is not set
|
||||||
# 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_EMBEDDED=y
|
CONFIG_EMBEDDED=y
|
||||||
CONFIG_PERF_EVENTS=y
|
CONFIG_PERF_EVENTS=y
|
||||||
# CONFIG_VM_EVENT_COUNTERS is not set
|
# CONFIG_VM_EVENT_COUNTERS is not set
|
||||||
|
|
|
@ -9,7 +9,6 @@ CONFIG_NAMESPACES=y
|
||||||
# CONFIG_UTS_NS is not set
|
# CONFIG_UTS_NS is not set
|
||||||
# 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_EMBEDDED=y
|
CONFIG_EMBEDDED=y
|
||||||
CONFIG_PERF_EVENTS=y
|
CONFIG_PERF_EVENTS=y
|
||||||
# CONFIG_VM_EVENT_COUNTERS is not set
|
# CONFIG_VM_EVENT_COUNTERS is not set
|
||||||
|
|
|
@ -11,7 +11,6 @@ CONFIG_NAMESPACES=y
|
||||||
# CONFIG_UTS_NS is not set
|
# CONFIG_UTS_NS is not set
|
||||||
# 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/"
|
|
||||||
CONFIG_KALLSYMS_ALL=y
|
CONFIG_KALLSYMS_ALL=y
|
||||||
CONFIG_EMBEDDED=y
|
CONFIG_EMBEDDED=y
|
||||||
CONFIG_PERF_EVENTS=y
|
CONFIG_PERF_EVENTS=y
|
||||||
|
|
|
@ -11,7 +11,6 @@ CONFIG_NAMESPACES=y
|
||||||
# CONFIG_UTS_NS is not set
|
# CONFIG_UTS_NS is not set
|
||||||
# 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_KALLSYMS_ALL=y
|
CONFIG_KALLSYMS_ALL=y
|
||||||
CONFIG_EMBEDDED=y
|
CONFIG_EMBEDDED=y
|
||||||
CONFIG_PERF_EVENTS=y
|
CONFIG_PERF_EVENTS=y
|
||||||
|
|
|
@ -9,7 +9,6 @@ CONFIG_NAMESPACES=y
|
||||||
# CONFIG_UTS_NS is not set
|
# CONFIG_UTS_NS is not set
|
||||||
# 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_KALLSYMS_ALL=y
|
CONFIG_KALLSYMS_ALL=y
|
||||||
CONFIG_EMBEDDED=y
|
CONFIG_EMBEDDED=y
|
||||||
CONFIG_PERF_EVENTS=y
|
CONFIG_PERF_EVENTS=y
|
||||||
|
|
|
@ -11,7 +11,6 @@ CONFIG_NAMESPACES=y
|
||||||
# CONFIG_UTS_NS is not set
|
# CONFIG_UTS_NS is not set
|
||||||
# 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/"
|
|
||||||
CONFIG_KALLSYMS_ALL=y
|
CONFIG_KALLSYMS_ALL=y
|
||||||
CONFIG_EMBEDDED=y
|
CONFIG_EMBEDDED=y
|
||||||
CONFIG_PERF_EVENTS=y
|
CONFIG_PERF_EVENTS=y
|
||||||
|
|
|
@ -11,7 +11,6 @@ CONFIG_NAMESPACES=y
|
||||||
# CONFIG_UTS_NS is not set
|
# CONFIG_UTS_NS is not set
|
||||||
# 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_KALLSYMS_ALL=y
|
CONFIG_KALLSYMS_ALL=y
|
||||||
CONFIG_EMBEDDED=y
|
CONFIG_EMBEDDED=y
|
||||||
CONFIG_PERF_EVENTS=y
|
CONFIG_PERF_EVENTS=y
|
||||||
|
|
|
@ -9,7 +9,6 @@ CONFIG_IKCONFIG_PROC=y
|
||||||
# CONFIG_UTS_NS is not set
|
# CONFIG_UTS_NS is not set
|
||||||
# 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_PERF_EVENTS=y
|
CONFIG_PERF_EVENTS=y
|
||||||
# CONFIG_COMPAT_BRK is not set
|
# CONFIG_COMPAT_BRK is not set
|
||||||
CONFIG_KPROBES=y
|
CONFIG_KPROBES=y
|
||||||
|
|
|
@ -56,7 +56,6 @@ CONFIG_STMMAC_ETH=y
|
||||||
# CONFIG_INPUT is not set
|
# CONFIG_INPUT is not set
|
||||||
# CONFIG_SERIO is not set
|
# CONFIG_SERIO is not set
|
||||||
# CONFIG_VT is not set
|
# CONFIG_VT is not set
|
||||||
CONFIG_DEVPTS_MULTIPLE_INSTANCES=y
|
|
||||||
# CONFIG_LEGACY_PTYS is not set
|
# CONFIG_LEGACY_PTYS is not set
|
||||||
# CONFIG_DEVKMEM is not set
|
# CONFIG_DEVKMEM is not set
|
||||||
CONFIG_SERIAL_8250=y
|
CONFIG_SERIAL_8250=y
|
||||||
|
|
|
@ -234,6 +234,9 @@
|
||||||
POP gp
|
POP gp
|
||||||
RESTORE_R12_TO_R0
|
RESTORE_R12_TO_R0
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARC_CURR_IN_REG
|
||||||
|
ld r25, [sp, 12]
|
||||||
|
#endif
|
||||||
ld sp, [sp] /* restore original sp */
|
ld sp, [sp] /* restore original sp */
|
||||||
/* orig_r0, ECR, user_r25 skipped automatically */
|
/* orig_r0, ECR, user_r25 skipped automatically */
|
||||||
.endm
|
.endm
|
||||||
|
@ -315,6 +318,9 @@
|
||||||
POP gp
|
POP gp
|
||||||
RESTORE_R12_TO_R0
|
RESTORE_R12_TO_R0
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARC_CURR_IN_REG
|
||||||
|
ld r25, [sp, 12]
|
||||||
|
#endif
|
||||||
ld sp, [sp] /* restore original sp */
|
ld sp, [sp] /* restore original sp */
|
||||||
/* orig_r0, ECR, user_r25 skipped automatically */
|
/* orig_r0, ECR, user_r25 skipped automatically */
|
||||||
.endm
|
.endm
|
||||||
|
|
|
@ -86,9 +86,6 @@
|
||||||
POP r1
|
POP r1
|
||||||
POP r0
|
POP r0
|
||||||
|
|
||||||
#ifdef CONFIG_ARC_CURR_IN_REG
|
|
||||||
ld r25, [sp, 12]
|
|
||||||
#endif
|
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
/*--------------------------------------------------------------
|
/*--------------------------------------------------------------
|
||||||
|
|
|
@ -34,9 +34,7 @@ struct machine_desc {
|
||||||
const char *name;
|
const char *name;
|
||||||
const char **dt_compat;
|
const char **dt_compat;
|
||||||
void (*init_early)(void);
|
void (*init_early)(void);
|
||||||
#ifdef CONFIG_SMP
|
|
||||||
void (*init_per_cpu)(unsigned int);
|
void (*init_per_cpu)(unsigned int);
|
||||||
#endif
|
|
||||||
void (*init_machine)(void);
|
void (*init_machine)(void);
|
||||||
void (*init_late)(void);
|
void (*init_late)(void);
|
||||||
|
|
||||||
|
|
|
@ -105,7 +105,7 @@ typedef pte_t * pgtable_t;
|
||||||
#define virt_addr_valid(kaddr) pfn_valid(virt_to_pfn(kaddr))
|
#define virt_addr_valid(kaddr) pfn_valid(virt_to_pfn(kaddr))
|
||||||
|
|
||||||
/* Default Permissions for stack/heaps pages (Non Executable) */
|
/* Default Permissions for stack/heaps pages (Non Executable) */
|
||||||
#define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE)
|
#define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC)
|
||||||
|
|
||||||
#define WANT_PAGE_VIRTUAL 1
|
#define WANT_PAGE_VIRTUAL 1
|
||||||
|
|
||||||
|
|
|
@ -377,7 +377,7 @@ void update_mmu_cache(struct vm_area_struct *vma, unsigned long address,
|
||||||
|
|
||||||
/* Decode a PTE containing swap "identifier "into constituents */
|
/* Decode a PTE containing swap "identifier "into constituents */
|
||||||
#define __swp_type(pte_lookalike) (((pte_lookalike).val) & 0x1f)
|
#define __swp_type(pte_lookalike) (((pte_lookalike).val) & 0x1f)
|
||||||
#define __swp_offset(pte_lookalike) ((pte_lookalike).val << 13)
|
#define __swp_offset(pte_lookalike) ((pte_lookalike).val >> 13)
|
||||||
|
|
||||||
/* NOPs, to keep generic kernel happy */
|
/* NOPs, to keep generic kernel happy */
|
||||||
#define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) })
|
#define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) })
|
||||||
|
|
|
@ -31,10 +31,10 @@ void __init init_IRQ(void)
|
||||||
/* a SMP H/w block could do IPI IRQ request here */
|
/* a SMP H/w block could do IPI IRQ request here */
|
||||||
if (plat_smp_ops.init_per_cpu)
|
if (plat_smp_ops.init_per_cpu)
|
||||||
plat_smp_ops.init_per_cpu(smp_processor_id());
|
plat_smp_ops.init_per_cpu(smp_processor_id());
|
||||||
|
#endif
|
||||||
|
|
||||||
if (machine_desc->init_per_cpu)
|
if (machine_desc->init_per_cpu)
|
||||||
machine_desc->init_per_cpu(smp_processor_id());
|
machine_desc->init_per_cpu(smp_processor_id());
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -47,7 +47,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)
|
||||||
{
|
{
|
||||||
struct pt_regs *regs = current_pt_regs();
|
struct pt_regs *regs = current_pt_regs();
|
||||||
int uval = -EFAULT;
|
u32 uval;
|
||||||
|
int ret;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is only for old cores lacking LLOCK/SCOND, which by defintion
|
* This is only for old cores lacking LLOCK/SCOND, which by defintion
|
||||||
|
@ -60,23 +61,47 @@ SYSCALL_DEFINE3(arc_usr_cmpxchg, int *, uaddr, int, expected, int, new)
|
||||||
/* Z indicates to userspace if operation succeded */
|
/* Z indicates to userspace if operation succeded */
|
||||||
regs->status32 &= ~STATUS_Z_MASK;
|
regs->status32 &= ~STATUS_Z_MASK;
|
||||||
|
|
||||||
if (!access_ok(VERIFY_WRITE, uaddr, sizeof(int)))
|
ret = access_ok(VERIFY_WRITE, uaddr, sizeof(*uaddr));
|
||||||
return -EFAULT;
|
if (!ret)
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
again:
|
||||||
preempt_disable();
|
preempt_disable();
|
||||||
|
|
||||||
if (__get_user(uval, uaddr))
|
ret = __get_user(uval, uaddr);
|
||||||
goto done;
|
if (ret)
|
||||||
|
goto fault;
|
||||||
|
|
||||||
if (uval == expected) {
|
if (uval != expected)
|
||||||
if (!__put_user(new, uaddr))
|
goto out;
|
||||||
regs->status32 |= STATUS_Z_MASK;
|
|
||||||
}
|
|
||||||
|
|
||||||
done:
|
ret = __put_user(new, uaddr);
|
||||||
|
if (ret)
|
||||||
|
goto fault;
|
||||||
|
|
||||||
|
regs->status32 |= STATUS_Z_MASK;
|
||||||
|
|
||||||
|
out:
|
||||||
|
preempt_enable();
|
||||||
|
return uval;
|
||||||
|
|
||||||
|
fault:
|
||||||
preempt_enable();
|
preempt_enable();
|
||||||
|
|
||||||
return uval;
|
if (unlikely(ret != -EFAULT))
|
||||||
|
goto fail;
|
||||||
|
|
||||||
|
down_read(¤t->mm->mmap_sem);
|
||||||
|
ret = fixup_user_fault(current, current->mm, (unsigned long) uaddr,
|
||||||
|
FAULT_FLAG_WRITE, NULL);
|
||||||
|
up_read(¤t->mm->mmap_sem);
|
||||||
|
|
||||||
|
if (likely(!ret))
|
||||||
|
goto again;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
force_sig(SIGSEGV, current);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_ISA_ARCV2
|
#ifdef CONFIG_ISA_ARCV2
|
||||||
|
|
|
@ -7,5 +7,8 @@
|
||||||
|
|
||||||
menuconfig ARC_SOC_HSDK
|
menuconfig ARC_SOC_HSDK
|
||||||
bool "ARC HS Development Kit SOC"
|
bool "ARC HS Development Kit SOC"
|
||||||
|
depends on ISA_ARCV2
|
||||||
|
select ARC_HAS_ACCL_REGS
|
||||||
select CLK_HSDK
|
select CLK_HSDK
|
||||||
select RESET_HSDK
|
select RESET_HSDK
|
||||||
|
select MIGHT_HAVE_PCI
|
||||||
|
|
|
@ -42,6 +42,66 @@ static void __init hsdk_init_per_cpu(unsigned int cpu)
|
||||||
#define SDIO_UHS_REG_EXT (SDIO_BASE + 0x108)
|
#define SDIO_UHS_REG_EXT (SDIO_BASE + 0x108)
|
||||||
#define SDIO_UHS_REG_EXT_DIV_2 (2 << 30)
|
#define SDIO_UHS_REG_EXT_DIV_2 (2 << 30)
|
||||||
|
|
||||||
|
#define HSDK_GPIO_INTC (ARC_PERIPHERAL_BASE + 0x3000)
|
||||||
|
|
||||||
|
static void __init hsdk_enable_gpio_intc_wire(void)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Peripherals on CPU Card are wired to cpu intc via intermediate
|
||||||
|
* DW APB GPIO blocks (mainly for debouncing)
|
||||||
|
*
|
||||||
|
* ---------------------
|
||||||
|
* | snps,archs-intc |
|
||||||
|
* ---------------------
|
||||||
|
* |
|
||||||
|
* ----------------------
|
||||||
|
* | snps,archs-idu-intc |
|
||||||
|
* ----------------------
|
||||||
|
* | | | | |
|
||||||
|
* | [eth] [USB] [... other peripherals]
|
||||||
|
* |
|
||||||
|
* -------------------
|
||||||
|
* | snps,dw-apb-intc |
|
||||||
|
* -------------------
|
||||||
|
* | | | |
|
||||||
|
* [Bt] [HAPS] [... other peripherals]
|
||||||
|
*
|
||||||
|
* Current implementation of "irq-dw-apb-ictl" driver doesn't work well
|
||||||
|
* with stacked INTCs. In particular problem happens if its master INTC
|
||||||
|
* not yet instantiated. See discussion here -
|
||||||
|
* https://lkml.org/lkml/2015/3/4/755
|
||||||
|
*
|
||||||
|
* So setup the first gpio block as a passive pass thru and hide it from
|
||||||
|
* DT hardware topology - connect intc directly to cpu intc
|
||||||
|
* The GPIO "wire" needs to be init nevertheless (here)
|
||||||
|
*
|
||||||
|
* One side adv is that peripheral interrupt handling avoids one nested
|
||||||
|
* intc ISR hop
|
||||||
|
*
|
||||||
|
* According to HSDK User's Manual [1], "Table 2 Interrupt Mapping"
|
||||||
|
* we have the following GPIO input lines used as sources of interrupt:
|
||||||
|
* - GPIO[0] - Bluetooth interrupt of RS9113 module
|
||||||
|
* - GPIO[2] - HAPS interrupt (on HapsTrak 3 connector)
|
||||||
|
* - GPIO[3] - Audio codec (MAX9880A) interrupt
|
||||||
|
* - GPIO[8-23] - Available on Arduino and PMOD_x headers
|
||||||
|
* For now there's no use of Arduino and PMOD_x headers in Linux
|
||||||
|
* use-case so we only enable lines 0, 2 and 3.
|
||||||
|
*
|
||||||
|
* [1] https://github.com/foss-for-synopsys-dwc-arc-processors/ARC-Development-Systems-Forum/wiki/docs/ARC_HSDK_User_Guide.pdf
|
||||||
|
*/
|
||||||
|
#define GPIO_INTEN (HSDK_GPIO_INTC + 0x30)
|
||||||
|
#define GPIO_INTMASK (HSDK_GPIO_INTC + 0x34)
|
||||||
|
#define GPIO_INTTYPE_LEVEL (HSDK_GPIO_INTC + 0x38)
|
||||||
|
#define GPIO_INT_POLARITY (HSDK_GPIO_INTC + 0x3c)
|
||||||
|
#define GPIO_INT_CONNECTED_MASK 0x0d
|
||||||
|
|
||||||
|
iowrite32(0xffffffff, (void __iomem *) GPIO_INTMASK);
|
||||||
|
iowrite32(~GPIO_INT_CONNECTED_MASK, (void __iomem *) GPIO_INTMASK);
|
||||||
|
iowrite32(0x00000000, (void __iomem *) GPIO_INTTYPE_LEVEL);
|
||||||
|
iowrite32(0xffffffff, (void __iomem *) GPIO_INT_POLARITY);
|
||||||
|
iowrite32(GPIO_INT_CONNECTED_MASK, (void __iomem *) GPIO_INTEN);
|
||||||
|
}
|
||||||
|
|
||||||
static void __init hsdk_init_early(void)
|
static void __init hsdk_init_early(void)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
@ -62,6 +122,8 @@ static void __init hsdk_init_early(void)
|
||||||
* minimum possible div-by-2.
|
* minimum possible div-by-2.
|
||||||
*/
|
*/
|
||||||
iowrite32(SDIO_UHS_REG_EXT_DIV_2, (void __iomem *) SDIO_UHS_REG_EXT);
|
iowrite32(SDIO_UHS_REG_EXT_DIV_2, (void __iomem *) SDIO_UHS_REG_EXT);
|
||||||
|
|
||||||
|
hsdk_enable_gpio_intc_wire();
|
||||||
}
|
}
|
||||||
|
|
||||||
static const char *hsdk_compat[] __initconst = {
|
static const char *hsdk_compat[] __initconst = {
|
||||||
|
|
Loading…
Add table
Reference in a new issue