Commit 788a0249 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'arc-5.2-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc

Pull ARC fixes from Vineet Gupta:

 - Fix for userspace trying to access kernel vaddr space

 - HSDK platform DT updates

 - Cleanup some build warnings

* tag 'arc-5.2-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc:
  ARC: [plat-hsdk] Get rid of inappropriate PHY settings
  ARC: [plat-hsdk]: Add support of Vivante GPU
  ARC: [plat-hsdk]: enable creg-gpio controller
  ARC: [plat-hsdk]: Add missing FIFO size entry in GMAC node
  ARC: [plat-hsdk]: Add missing multicast filter bins number to GMAC node
  ARC: mm: SIGSEGV userspace trying to access kernel virtual memory
  ARC: fix build warnings
parents 66be4e66 46e04c25
...@@ -11,7 +11,6 @@ ...@@ -11,7 +11,6 @@
*/ */
/dts-v1/; /dts-v1/;
#include <dt-bindings/net/ti-dp83867.h>
#include <dt-bindings/reset/snps,hsdk-reset.h> #include <dt-bindings/reset/snps,hsdk-reset.h>
/ { / {
...@@ -167,6 +166,24 @@ mmcclk_biu: mmcclk-biu { ...@@ -167,6 +166,24 @@ mmcclk_biu: mmcclk-biu {
#clock-cells = <0>; #clock-cells = <0>;
}; };
gpu_core_clk: gpu-core-clk {
compatible = "fixed-clock";
clock-frequency = <400000000>;
#clock-cells = <0>;
};
gpu_dma_clk: gpu-dma-clk {
compatible = "fixed-clock";
clock-frequency = <400000000>;
#clock-cells = <0>;
};
gpu_cfg_clk: gpu-cfg-clk {
compatible = "fixed-clock";
clock-frequency = <200000000>;
#clock-cells = <0>;
};
dmac_core_clk: dmac-core-clk { dmac_core_clk: dmac-core-clk {
compatible = "fixed-clock"; compatible = "fixed-clock";
clock-frequency = <400000000>; clock-frequency = <400000000>;
...@@ -187,6 +204,7 @@ gmac: ethernet@8000 { ...@@ -187,6 +204,7 @@ gmac: ethernet@8000 {
interrupt-names = "macirq"; interrupt-names = "macirq";
phy-mode = "rgmii"; phy-mode = "rgmii";
snps,pbl = <32>; snps,pbl = <32>;
snps,multicast-filter-bins = <256>;
clocks = <&gmacclk>; clocks = <&gmacclk>;
clock-names = "stmmaceth"; clock-names = "stmmaceth";
phy-handle = <&phy0>; phy-handle = <&phy0>;
...@@ -195,15 +213,15 @@ gmac: ethernet@8000 { ...@@ -195,15 +213,15 @@ gmac: ethernet@8000 {
mac-address = [00 00 00 00 00 00]; /* Filled in by U-Boot */ mac-address = [00 00 00 00 00 00]; /* Filled in by U-Boot */
dma-coherent; dma-coherent;
tx-fifo-depth = <4096>;
rx-fifo-depth = <4096>;
mdio { mdio {
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
compatible = "snps,dwmac-mdio"; compatible = "snps,dwmac-mdio";
phy0: ethernet-phy@0 { phy0: ethernet-phy@0 {
reg = <0>; reg = <0>;
ti,rx-internal-delay = <DP83867_RGMIIDCTL_2_00_NS>;
ti,tx-internal-delay = <DP83867_RGMIIDCTL_2_00_NS>;
ti,fifo-depth = <DP83867_PHYCR_FIFO_DEPTH_4_B_NIB>;
}; };
}; };
}; };
...@@ -237,6 +255,14 @@ mmc@a000 { ...@@ -237,6 +255,14 @@ mmc@a000 {
dma-coherent; dma-coherent;
}; };
creg_gpio: gpio@14b0 {
compatible = "snps,creg-gpio-hsdk";
reg = <0x14b0 0x4>;
gpio-controller;
#gpio-cells = <2>;
ngpios = <2>;
};
gpio: gpio@3000 { gpio: gpio@3000 {
compatible = "snps,dw-apb-gpio"; compatible = "snps,dw-apb-gpio";
reg = <0x3000 0x20>; reg = <0x3000 0x20>;
...@@ -252,6 +278,17 @@ gpio_port_a: gpio-controller@0 { ...@@ -252,6 +278,17 @@ gpio_port_a: gpio-controller@0 {
}; };
}; };
gpu_3d: gpu@90000 {
compatible = "vivante,gc";
reg = <0x90000 0x4000>;
clocks = <&gpu_dma_clk>,
<&gpu_cfg_clk>,
<&gpu_core_clk>,
<&gpu_core_clk>;
clock-names = "bus", "reg", "core", "shader";
interrupts = <28>;
};
dmac: dmac@80000 { dmac: dmac@80000 {
compatible = "snps,axi-dma-1.01a"; compatible = "snps,axi-dma-1.01a";
reg = <0x80000 0x400>; reg = <0x80000 0x400>;
......
...@@ -49,10 +49,12 @@ CONFIG_SERIAL_OF_PLATFORM=y ...@@ -49,10 +49,12 @@ CONFIG_SERIAL_OF_PLATFORM=y
CONFIG_GPIOLIB=y CONFIG_GPIOLIB=y
CONFIG_GPIO_SYSFS=y CONFIG_GPIO_SYSFS=y
CONFIG_GPIO_DWAPB=y CONFIG_GPIO_DWAPB=y
CONFIG_GPIO_SNPS_CREG=y
# CONFIG_HWMON is not set # CONFIG_HWMON is not set
CONFIG_DRM=y CONFIG_DRM=y
# CONFIG_DRM_FBDEV_EMULATION is not set # CONFIG_DRM_FBDEV_EMULATION is not set
CONFIG_DRM_UDL=y CONFIG_DRM_UDL=y
CONFIG_DRM_ETNAVIV=y
CONFIG_FB=y CONFIG_FB=y
CONFIG_FRAMEBUFFER_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_USB_EHCI_HCD=y CONFIG_USB_EHCI_HCD=y
...@@ -64,7 +66,6 @@ CONFIG_MMC=y ...@@ -64,7 +66,6 @@ CONFIG_MMC=y
CONFIG_MMC_SDHCI=y CONFIG_MMC_SDHCI=y
CONFIG_MMC_SDHCI_PLTFM=y CONFIG_MMC_SDHCI_PLTFM=y
CONFIG_MMC_DW=y CONFIG_MMC_DW=y
# CONFIG_IOMMU_SUPPORT is not set
CONFIG_EXT3_FS=y CONFIG_EXT3_FS=y
CONFIG_VFAT_FS=y CONFIG_VFAT_FS=y
CONFIG_TMPFS=y CONFIG_TMPFS=y
......
...@@ -92,8 +92,11 @@ __cmpxchg(volatile void *ptr, unsigned long expected, unsigned long new) ...@@ -92,8 +92,11 @@ __cmpxchg(volatile void *ptr, unsigned long expected, unsigned long new)
#endif /* CONFIG_ARC_HAS_LLSC */ #endif /* CONFIG_ARC_HAS_LLSC */
#define cmpxchg(ptr, o, n) ((typeof(*(ptr)))__cmpxchg((ptr), \ #define cmpxchg(ptr, o, n) ({ \
(unsigned long)(o), (unsigned long)(n))) (typeof(*(ptr)))__cmpxchg((ptr), \
(unsigned long)(o), \
(unsigned long)(n)); \
})
/* /*
* atomic_cmpxchg is same as cmpxchg * atomic_cmpxchg is same as cmpxchg
...@@ -198,8 +201,11 @@ static inline unsigned long __xchg(unsigned long val, volatile void *ptr, ...@@ -198,8 +201,11 @@ static inline unsigned long __xchg(unsigned long val, volatile void *ptr,
return __xchg_bad_pointer(); return __xchg_bad_pointer();
} }
#define xchg(ptr, with) ((typeof(*(ptr)))__xchg((unsigned long)(with), (ptr), \ #define xchg(ptr, with) ({ \
sizeof(*(ptr)))) (typeof(*(ptr)))__xchg((unsigned long)(with), \
(ptr), \
sizeof(*(ptr))); \
})
#endif /* CONFIG_ARC_PLAT_EZNPS */ #endif /* CONFIG_ARC_PLAT_EZNPS */
......
...@@ -66,7 +66,7 @@ void do_page_fault(unsigned long address, struct pt_regs *regs) ...@@ -66,7 +66,7 @@ void do_page_fault(unsigned long address, struct pt_regs *regs)
struct vm_area_struct *vma = NULL; struct vm_area_struct *vma = NULL;
struct task_struct *tsk = current; struct task_struct *tsk = current;
struct mm_struct *mm = tsk->mm; struct mm_struct *mm = tsk->mm;
int si_code = 0; int si_code = SEGV_MAPERR;
int ret; int ret;
vm_fault_t fault; vm_fault_t fault;
int write = regs->ecr_cause & ECR_C_PROTV_STORE; /* ST/EX */ int write = regs->ecr_cause & ECR_C_PROTV_STORE; /* ST/EX */
...@@ -81,16 +81,14 @@ void do_page_fault(unsigned long address, struct pt_regs *regs) ...@@ -81,16 +81,14 @@ void do_page_fault(unsigned long address, struct pt_regs *regs)
* only copy the information from the master page table, * only copy the information from the master page table,
* nothing more. * nothing more.
*/ */
if (address >= VMALLOC_START) { if (address >= VMALLOC_START && !user_mode(regs)) {
ret = handle_kernel_vaddr_fault(address); ret = handle_kernel_vaddr_fault(address);
if (unlikely(ret)) if (unlikely(ret))
goto bad_area_nosemaphore; goto no_context;
else else
return; return;
} }
si_code = SEGV_MAPERR;
/* /*
* If we're in an interrupt or have no user * If we're in an interrupt or have no user
* context, we must not take the fault.. * context, we must not take the fault..
...@@ -198,7 +196,6 @@ void do_page_fault(unsigned long address, struct pt_regs *regs) ...@@ -198,7 +196,6 @@ void do_page_fault(unsigned long address, struct pt_regs *regs)
bad_area: bad_area:
up_read(&mm->mmap_sem); up_read(&mm->mmap_sem);
bad_area_nosemaphore:
/* User mode accesses just cause a SIGSEGV */ /* User mode accesses just cause a SIGSEGV */
if (user_mode(regs)) { if (user_mode(regs)) {
tsk->thread.fault_address = address; tsk->thread.fault_address = address;
......
...@@ -911,9 +911,11 @@ void do_tlb_overlap_fault(unsigned long cause, unsigned long address, ...@@ -911,9 +911,11 @@ void do_tlb_overlap_fault(unsigned long cause, unsigned long address,
struct pt_regs *regs) struct pt_regs *regs)
{ {
struct cpuinfo_arc_mmu *mmu = &cpuinfo_arc700[smp_processor_id()].mmu; struct cpuinfo_arc_mmu *mmu = &cpuinfo_arc700[smp_processor_id()].mmu;
unsigned int pd0[mmu->ways];
unsigned long flags; unsigned long flags;
int set; int set, n_ways = mmu->ways;
n_ways = min(n_ways, 4);
BUG_ON(mmu->ways > 4);
local_irq_save(flags); local_irq_save(flags);
...@@ -921,9 +923,10 @@ void do_tlb_overlap_fault(unsigned long cause, unsigned long address, ...@@ -921,9 +923,10 @@ void do_tlb_overlap_fault(unsigned long cause, unsigned long address,
for (set = 0; set < mmu->sets; set++) { for (set = 0; set < mmu->sets; set++) {
int is_valid, way; int is_valid, way;
unsigned int pd0[4];
/* read out all the ways of current set */ /* read out all the ways of current set */
for (way = 0, is_valid = 0; way < mmu->ways; way++) { for (way = 0, is_valid = 0; way < n_ways; way++) {
write_aux_reg(ARC_REG_TLBINDEX, write_aux_reg(ARC_REG_TLBINDEX,
SET_WAY_TO_IDX(mmu, set, way)); SET_WAY_TO_IDX(mmu, set, way));
write_aux_reg(ARC_REG_TLBCOMMAND, TLBRead); write_aux_reg(ARC_REG_TLBCOMMAND, TLBRead);
...@@ -937,14 +940,14 @@ void do_tlb_overlap_fault(unsigned long cause, unsigned long address, ...@@ -937,14 +940,14 @@ void do_tlb_overlap_fault(unsigned long cause, unsigned long address,
continue; continue;
/* Scan the set for duplicate ways: needs a nested loop */ /* Scan the set for duplicate ways: needs a nested loop */
for (way = 0; way < mmu->ways - 1; way++) { for (way = 0; way < n_ways - 1; way++) {
int n; int n;
if (!pd0[way]) if (!pd0[way])
continue; continue;
for (n = way + 1; n < mmu->ways; n++) { for (n = way + 1; n < n_ways; n++) {
if (pd0[way] != pd0[n]) if (pd0[way] != pd0[n])
continue; continue;
......
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