ARC updates for 4.19-rc3
- For for atomic_fetch_#op [Will Deacon] - Enabling per device IOC [Eugeniy Paltsev] - Remove redundany gcc version checks [Masahiro Yamada] - Miscll platform config/DT updates [Alexey Brodkin] -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJbks/0AAoJEGnX8d3iisJeV4YP+wXcZwaxeviYoy+sdfNqUNz2 ET7gVkQNvl/LP/nEI/NCiHKirT5iyn/Ln629TOt9YNyWKyNnMJY3sTDYvHAsI0tB UEUDLW4E6QJnw7bcvfdtOdJfjyTzB6/FBhgPCcGdi5yg3ClN1U39aqW6eepTa5XX 6GenRoi+K8Mcve51R9+pOK+P54UYstADog7AjQssu2jHOzGsKwcc9C3NaqZjbDSl CFjQwRgfqsPYRqtPYNRkqyN6YO6oJRVxjEz/0dz7ncBK4nZRj0xdgj5yKApioBvX Vy9s/L03vAzaR044GiQph/xaNm0eXteYxGoASNSMVICi4p9smTq2Rqk2cHAJTL3g f1f/DD7EWFbchxsMfFk9dbjVhsCyr/IxQSeOOGbicWc1ItUKvkYjzimqpXH3Crdj de0Ja708paa3UKfIRr2UnbrXwbt9XkUR19zsH9HKHIFHRl7MOHJIr5E1JWY8h7FE AxlqXt2fIVQJxvTjwApphTIxix3thfaE1kJrUu1bENB9kL2CTkP2j04oHJMi71zb W08Aw8OahUd5O/Qxg2eT3+Cq7u+sjaNVEYVsRFcW38i+DvaIJv5/FSGIyFEt2yYG TC4Gg68kE5yNlOdO6b6+uDC/lsq0cZkRYaIM1+10yV4w3qZeSrbWV+VQbXInLqnP 6p0qFt6hyHQm7XP5meEF =pb89 -----END PGP SIGNATURE----- Merge tag 'arc-4.19-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc Pull ARC updates from Vineet Gupta: - Fix for atomic_fetch_#op [Will Deacon] - Enable per device IOC [Eugeniy Paltsev] - Remove redundant gcc version checks [Masahiro Yamada] - Miscll platform config/DT updates [Alexey Brodkin] * tag 'arc-4.19-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/vgupta/arc: ARC: don't check for HIGHMEM pages in arch_dma_alloc ARC: IOC: panic if both IOC and ZONE_HIGHMEM enabled ARC: dma [IOC] Enable per device io coherency ARC: dma [IOC]: mark DMA devices connected as dma-coherent ARC: atomics: unbork atomic_fetch_##op() arc: remove redundant GCC version checks ARC: sort Kconfig ARC: cleanup show_faulting_vma() ARC: [plat-axs*]: Enable SWAP ARC: [plat-axs*/plat-hsdk]: Allow U-Boot to pass MAC-address to the kernel ARC: configs: cleanup
This commit is contained in:
commit
2c34a0e041
|
@ -9,6 +9,7 @@
|
||||||
config ARC
|
config ARC
|
||||||
def_bool y
|
def_bool y
|
||||||
select ARC_TIMERS
|
select ARC_TIMERS
|
||||||
|
select ARCH_HAS_PTE_SPECIAL
|
||||||
select ARCH_HAS_SYNC_DMA_FOR_CPU
|
select ARCH_HAS_SYNC_DMA_FOR_CPU
|
||||||
select ARCH_HAS_SYNC_DMA_FOR_DEVICE
|
select ARCH_HAS_SYNC_DMA_FOR_DEVICE
|
||||||
select ARCH_HAS_SG_CHAIN
|
select ARCH_HAS_SG_CHAIN
|
||||||
|
@ -28,8 +29,12 @@ config ARC
|
||||||
select GENERIC_SMP_IDLE_THREAD
|
select GENERIC_SMP_IDLE_THREAD
|
||||||
select HAVE_ARCH_KGDB
|
select HAVE_ARCH_KGDB
|
||||||
select HAVE_ARCH_TRACEHOOK
|
select HAVE_ARCH_TRACEHOOK
|
||||||
|
select HAVE_DEBUG_STACKOVERFLOW
|
||||||
select HAVE_FUTEX_CMPXCHG if FUTEX
|
select HAVE_FUTEX_CMPXCHG if FUTEX
|
||||||
|
select HAVE_GENERIC_DMA_COHERENT
|
||||||
select HAVE_IOREMAP_PROT
|
select HAVE_IOREMAP_PROT
|
||||||
|
select HAVE_KERNEL_GZIP
|
||||||
|
select HAVE_KERNEL_LZMA
|
||||||
select HAVE_KPROBES
|
select HAVE_KPROBES
|
||||||
select HAVE_KRETPROBES
|
select HAVE_KRETPROBES
|
||||||
select HAVE_MEMBLOCK
|
select HAVE_MEMBLOCK
|
||||||
|
@ -44,11 +49,6 @@ config ARC
|
||||||
select OF_EARLY_FLATTREE
|
select OF_EARLY_FLATTREE
|
||||||
select OF_RESERVED_MEM
|
select OF_RESERVED_MEM
|
||||||
select PERF_USE_VMALLOC if ARC_CACHE_VIPT_ALIASING
|
select PERF_USE_VMALLOC if ARC_CACHE_VIPT_ALIASING
|
||||||
select HAVE_DEBUG_STACKOVERFLOW
|
|
||||||
select HAVE_GENERIC_DMA_COHERENT
|
|
||||||
select HAVE_KERNEL_GZIP
|
|
||||||
select HAVE_KERNEL_LZMA
|
|
||||||
select ARCH_HAS_PTE_SPECIAL
|
|
||||||
|
|
||||||
config ARCH_HAS_CACHE_LINE_SIZE
|
config ARCH_HAS_CACHE_LINE_SIZE
|
||||||
def_bool y
|
def_bool y
|
||||||
|
|
|
@ -43,10 +43,7 @@ ifdef CONFIG_ARC_CURR_IN_REG
|
||||||
LINUXINCLUDE += -include ${src}/arch/arc/include/asm/current.h
|
LINUXINCLUDE += -include ${src}/arch/arc/include/asm/current.h
|
||||||
endif
|
endif
|
||||||
|
|
||||||
upto_gcc44 := $(call cc-ifversion, -le, 0404, y)
|
cflags-y += -fsection-anchors
|
||||||
atleast_gcc44 := $(call cc-ifversion, -ge, 0404, y)
|
|
||||||
|
|
||||||
cflags-$(atleast_gcc44) += -fsection-anchors
|
|
||||||
|
|
||||||
cflags-$(CONFIG_ARC_HAS_LLSC) += -mlock
|
cflags-$(CONFIG_ARC_HAS_LLSC) += -mlock
|
||||||
cflags-$(CONFIG_ARC_HAS_SWAPE) += -mswape
|
cflags-$(CONFIG_ARC_HAS_SWAPE) += -mswape
|
||||||
|
@ -82,11 +79,6 @@ cflags-$(disable_small_data) += -mno-sdata -fcall-used-gp
|
||||||
cflags-$(CONFIG_CPU_BIG_ENDIAN) += -mbig-endian
|
cflags-$(CONFIG_CPU_BIG_ENDIAN) += -mbig-endian
|
||||||
ldflags-$(CONFIG_CPU_BIG_ENDIAN) += -EB
|
ldflags-$(CONFIG_CPU_BIG_ENDIAN) += -EB
|
||||||
|
|
||||||
# STAR 9000518362: (fixed with binutils shipping with gcc 4.8)
|
|
||||||
# arc-linux-uclibc-ld (buildroot) or arceb-elf32-ld (EZChip) don't accept
|
|
||||||
# --build-id w/o "-marclinux". Default arc-elf32-ld is OK
|
|
||||||
ldflags-$(upto_gcc44) += -marclinux
|
|
||||||
|
|
||||||
LIBGCC := $(shell $(CC) $(cflags-y) --print-libgcc-file-name)
|
LIBGCC := $(shell $(CC) $(cflags-y) --print-libgcc-file-name)
|
||||||
|
|
||||||
# Modules with short calls might break for calls into builtin-kernel
|
# Modules with short calls might break for calls into builtin-kernel
|
||||||
|
|
|
@ -93,6 +93,32 @@
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Mark DMA peripherals connected via IOC port as dma-coherent. We do
|
||||||
|
* it via overlay because peripherals defined in axs10x_mb.dtsi are
|
||||||
|
* used for both AXS101 and AXS103 boards and only AXS103 has IOC (so
|
||||||
|
* only AXS103 board has HW-coherent DMA peripherals)
|
||||||
|
* We don't need to mark pgu@17000 as dma-coherent because it uses
|
||||||
|
* external DMA buffer located outside of IOC aperture.
|
||||||
|
*/
|
||||||
|
axs10x_mb {
|
||||||
|
ethernet@0x18000 {
|
||||||
|
dma-coherent;
|
||||||
|
};
|
||||||
|
|
||||||
|
ehci@0x40000 {
|
||||||
|
dma-coherent;
|
||||||
|
};
|
||||||
|
|
||||||
|
ohci@0x60000 {
|
||||||
|
dma-coherent;
|
||||||
|
};
|
||||||
|
|
||||||
|
mmc@0x15000 {
|
||||||
|
dma-coherent;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The DW APB ICTL intc on MB is connected to CPU intc via a
|
* The DW APB ICTL intc on MB is connected to CPU intc via a
|
||||||
* DT "invisible" DW APB GPIO block, configured to simply pass thru
|
* DT "invisible" DW APB GPIO block, configured to simply pass thru
|
||||||
|
|
|
@ -100,6 +100,32 @@
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Mark DMA peripherals connected via IOC port as dma-coherent. We do
|
||||||
|
* it via overlay because peripherals defined in axs10x_mb.dtsi are
|
||||||
|
* used for both AXS101 and AXS103 boards and only AXS103 has IOC (so
|
||||||
|
* only AXS103 board has HW-coherent DMA peripherals)
|
||||||
|
* We don't need to mark pgu@17000 as dma-coherent because it uses
|
||||||
|
* external DMA buffer located outside of IOC aperture.
|
||||||
|
*/
|
||||||
|
axs10x_mb {
|
||||||
|
ethernet@0x18000 {
|
||||||
|
dma-coherent;
|
||||||
|
};
|
||||||
|
|
||||||
|
ehci@0x40000 {
|
||||||
|
dma-coherent;
|
||||||
|
};
|
||||||
|
|
||||||
|
ohci@0x60000 {
|
||||||
|
dma-coherent;
|
||||||
|
};
|
||||||
|
|
||||||
|
mmc@0x15000 {
|
||||||
|
dma-coherent;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This INTC is actually connected to DW APB GPIO
|
* This INTC is actually connected to DW APB GPIO
|
||||||
* which acts as a wire between MB INTC and CPU INTC.
|
* which acts as a wire between MB INTC and CPU INTC.
|
||||||
|
|
|
@ -9,6 +9,10 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
|
aliases {
|
||||||
|
ethernet = &gmac;
|
||||||
|
};
|
||||||
|
|
||||||
axs10x_mb {
|
axs10x_mb {
|
||||||
compatible = "simple-bus";
|
compatible = "simple-bus";
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
|
@ -68,7 +72,7 @@
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
ethernet@0x18000 {
|
gmac: ethernet@0x18000 {
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
compatible = "snps,dwmac";
|
compatible = "snps,dwmac";
|
||||||
reg = < 0x18000 0x2000 >;
|
reg = < 0x18000 0x2000 >;
|
||||||
|
@ -81,6 +85,7 @@
|
||||||
max-speed = <100>;
|
max-speed = <100>;
|
||||||
resets = <&creg_rst 5>;
|
resets = <&creg_rst 5>;
|
||||||
reset-names = "stmmaceth";
|
reset-names = "stmmaceth";
|
||||||
|
mac-address = [00 00 00 00 00 00]; /* Filled in by U-Boot */
|
||||||
};
|
};
|
||||||
|
|
||||||
ehci@0x40000 {
|
ehci@0x40000 {
|
||||||
|
|
|
@ -25,6 +25,10 @@
|
||||||
bootargs = "earlycon=uart8250,mmio32,0xf0005000,115200n8 console=ttyS0,115200n8 debug print-fatal-signals=1";
|
bootargs = "earlycon=uart8250,mmio32,0xf0005000,115200n8 console=ttyS0,115200n8 debug print-fatal-signals=1";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
aliases {
|
||||||
|
ethernet = &gmac;
|
||||||
|
};
|
||||||
|
|
||||||
cpus {
|
cpus {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
|
@ -163,7 +167,7 @@
|
||||||
#clock-cells = <0>;
|
#clock-cells = <0>;
|
||||||
};
|
};
|
||||||
|
|
||||||
ethernet@8000 {
|
gmac: ethernet@8000 {
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
compatible = "snps,dwmac";
|
compatible = "snps,dwmac";
|
||||||
reg = <0x8000 0x2000>;
|
reg = <0x8000 0x2000>;
|
||||||
|
@ -176,6 +180,8 @@
|
||||||
phy-handle = <&phy0>;
|
phy-handle = <&phy0>;
|
||||||
resets = <&cgu_rst HSDK_ETH_RESET>;
|
resets = <&cgu_rst HSDK_ETH_RESET>;
|
||||||
reset-names = "stmmaceth";
|
reset-names = "stmmaceth";
|
||||||
|
mac-address = [00 00 00 00 00 00]; /* Filled in by U-Boot */
|
||||||
|
dma-coherent;
|
||||||
|
|
||||||
mdio {
|
mdio {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
|
@ -194,12 +200,14 @@
|
||||||
compatible = "snps,hsdk-v1.0-ohci", "generic-ohci";
|
compatible = "snps,hsdk-v1.0-ohci", "generic-ohci";
|
||||||
reg = <0x60000 0x100>;
|
reg = <0x60000 0x100>;
|
||||||
interrupts = <15>;
|
interrupts = <15>;
|
||||||
|
dma-coherent;
|
||||||
};
|
};
|
||||||
|
|
||||||
ehci@40000 {
|
ehci@40000 {
|
||||||
compatible = "snps,hsdk-v1.0-ehci", "generic-ehci";
|
compatible = "snps,hsdk-v1.0-ehci", "generic-ehci";
|
||||||
reg = <0x40000 0x100>;
|
reg = <0x40000 0x100>;
|
||||||
interrupts = <15>;
|
interrupts = <15>;
|
||||||
|
dma-coherent;
|
||||||
};
|
};
|
||||||
|
|
||||||
mmc@a000 {
|
mmc@a000 {
|
||||||
|
@ -212,6 +220,7 @@
|
||||||
clock-names = "biu", "ciu";
|
clock-names = "biu", "ciu";
|
||||||
interrupts = <12>;
|
interrupts = <12>;
|
||||||
bus-width = <4>;
|
bus-width = <4>;
|
||||||
|
dma-coherent;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
CONFIG_DEFAULT_HOSTNAME="ARCLinux"
|
|
||||||
# CONFIG_SWAP is not set
|
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_POSIX_MQUEUE=y
|
CONFIG_POSIX_MQUEUE=y
|
||||||
# CONFIG_CROSS_MEMORY_ATTACH is not set
|
# CONFIG_CROSS_MEMORY_ATTACH is not set
|
||||||
|
@ -63,7 +61,6 @@ CONFIG_MOUSE_PS2_TOUCHKIT=y
|
||||||
CONFIG_MOUSE_SERIAL=y
|
CONFIG_MOUSE_SERIAL=y
|
||||||
CONFIG_MOUSE_SYNAPTICS_USB=y
|
CONFIG_MOUSE_SYNAPTICS_USB=y
|
||||||
# CONFIG_LEGACY_PTYS is not set
|
# CONFIG_LEGACY_PTYS is not set
|
||||||
# CONFIG_DEVKMEM is not set
|
|
||||||
CONFIG_SERIAL_8250=y
|
CONFIG_SERIAL_8250=y
|
||||||
CONFIG_SERIAL_8250_CONSOLE=y
|
CONFIG_SERIAL_8250_CONSOLE=y
|
||||||
CONFIG_SERIAL_8250_DW=y
|
CONFIG_SERIAL_8250_DW=y
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
CONFIG_DEFAULT_HOSTNAME="ARCLinux"
|
|
||||||
# CONFIG_SWAP is not set
|
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_POSIX_MQUEUE=y
|
CONFIG_POSIX_MQUEUE=y
|
||||||
# CONFIG_CROSS_MEMORY_ATTACH is not set
|
# CONFIG_CROSS_MEMORY_ATTACH is not set
|
||||||
|
@ -64,7 +62,6 @@ CONFIG_MOUSE_PS2_TOUCHKIT=y
|
||||||
CONFIG_MOUSE_SERIAL=y
|
CONFIG_MOUSE_SERIAL=y
|
||||||
CONFIG_MOUSE_SYNAPTICS_USB=y
|
CONFIG_MOUSE_SYNAPTICS_USB=y
|
||||||
# CONFIG_LEGACY_PTYS is not set
|
# CONFIG_LEGACY_PTYS is not set
|
||||||
# CONFIG_DEVKMEM is not set
|
|
||||||
CONFIG_SERIAL_8250=y
|
CONFIG_SERIAL_8250=y
|
||||||
CONFIG_SERIAL_8250_CONSOLE=y
|
CONFIG_SERIAL_8250_CONSOLE=y
|
||||||
CONFIG_SERIAL_8250_DW=y
|
CONFIG_SERIAL_8250_DW=y
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
CONFIG_DEFAULT_HOSTNAME="ARCLinux"
|
|
||||||
# CONFIG_SWAP is not set
|
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_POSIX_MQUEUE=y
|
CONFIG_POSIX_MQUEUE=y
|
||||||
# CONFIG_CROSS_MEMORY_ATTACH is not set
|
# CONFIG_CROSS_MEMORY_ATTACH is not set
|
||||||
|
@ -65,7 +63,6 @@ CONFIG_MOUSE_PS2_TOUCHKIT=y
|
||||||
CONFIG_MOUSE_SERIAL=y
|
CONFIG_MOUSE_SERIAL=y
|
||||||
CONFIG_MOUSE_SYNAPTICS_USB=y
|
CONFIG_MOUSE_SYNAPTICS_USB=y
|
||||||
# CONFIG_LEGACY_PTYS is not set
|
# CONFIG_LEGACY_PTYS is not set
|
||||||
# CONFIG_DEVKMEM is not set
|
|
||||||
CONFIG_SERIAL_8250=y
|
CONFIG_SERIAL_8250=y
|
||||||
CONFIG_SERIAL_8250_CONSOLE=y
|
CONFIG_SERIAL_8250_CONSOLE=y
|
||||||
CONFIG_SERIAL_8250_DW=y
|
CONFIG_SERIAL_8250_DW=y
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
CONFIG_DEFAULT_HOSTNAME="ARCLinux"
|
|
||||||
# CONFIG_SWAP is not set
|
# CONFIG_SWAP is not set
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_POSIX_MQUEUE=y
|
CONFIG_POSIX_MQUEUE=y
|
||||||
|
@ -57,7 +56,6 @@ CONFIG_MOUSE_PS2_TOUCHKIT=y
|
||||||
# CONFIG_SERIO_SERPORT is not set
|
# CONFIG_SERIO_SERPORT is not set
|
||||||
CONFIG_SERIO_ARC_PS2=y
|
CONFIG_SERIO_ARC_PS2=y
|
||||||
# CONFIG_LEGACY_PTYS is not set
|
# CONFIG_LEGACY_PTYS is not set
|
||||||
# CONFIG_DEVKMEM is not set
|
|
||||||
CONFIG_SERIAL_8250=y
|
CONFIG_SERIAL_8250=y
|
||||||
CONFIG_SERIAL_8250_CONSOLE=y
|
CONFIG_SERIAL_8250_CONSOLE=y
|
||||||
CONFIG_SERIAL_8250_NR_UARTS=1
|
CONFIG_SERIAL_8250_NR_UARTS=1
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
CONFIG_DEFAULT_HOSTNAME="ARCLinux"
|
|
||||||
# CONFIG_SWAP is not set
|
# CONFIG_SWAP is not set
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_POSIX_MQUEUE=y
|
CONFIG_POSIX_MQUEUE=y
|
||||||
|
@ -60,7 +59,6 @@ CONFIG_MOUSE_PS2_TOUCHKIT=y
|
||||||
# CONFIG_SERIO_SERPORT is not set
|
# CONFIG_SERIO_SERPORT is not set
|
||||||
CONFIG_SERIO_ARC_PS2=y
|
CONFIG_SERIO_ARC_PS2=y
|
||||||
# CONFIG_LEGACY_PTYS is not set
|
# CONFIG_LEGACY_PTYS is not set
|
||||||
# CONFIG_DEVKMEM is not set
|
|
||||||
CONFIG_SERIAL_8250=y
|
CONFIG_SERIAL_8250=y
|
||||||
CONFIG_SERIAL_8250_CONSOLE=y
|
CONFIG_SERIAL_8250_CONSOLE=y
|
||||||
CONFIG_SERIAL_8250_NR_UARTS=1
|
CONFIG_SERIAL_8250_NR_UARTS=1
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
CONFIG_DEFAULT_HOSTNAME="ARCLinux"
|
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
# CONFIG_CROSS_MEMORY_ATTACH is not set
|
# CONFIG_CROSS_MEMORY_ATTACH is not set
|
||||||
CONFIG_NO_HZ_IDLE=y
|
CONFIG_NO_HZ_IDLE=y
|
||||||
|
|
|
@ -59,7 +59,6 @@ CONFIG_NETCONSOLE=y
|
||||||
# CONFIG_INPUT_MOUSE is not set
|
# CONFIG_INPUT_MOUSE is not set
|
||||||
# CONFIG_SERIO is not set
|
# CONFIG_SERIO is not set
|
||||||
# CONFIG_LEGACY_PTYS is not set
|
# CONFIG_LEGACY_PTYS is not set
|
||||||
# CONFIG_DEVKMEM is not set
|
|
||||||
CONFIG_SERIAL_8250=y
|
CONFIG_SERIAL_8250=y
|
||||||
CONFIG_SERIAL_8250_CONSOLE=y
|
CONFIG_SERIAL_8250_CONSOLE=y
|
||||||
CONFIG_SERIAL_8250_NR_UARTS=1
|
CONFIG_SERIAL_8250_NR_UARTS=1
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
# CONFIG_LOCALVERSION_AUTO is not set
|
# CONFIG_LOCALVERSION_AUTO is not set
|
||||||
CONFIG_DEFAULT_HOSTNAME="ARCLinux"
|
|
||||||
# CONFIG_SWAP is not set
|
# CONFIG_SWAP is not set
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_POSIX_MQUEUE=y
|
CONFIG_POSIX_MQUEUE=y
|
||||||
|
@ -44,7 +43,6 @@ CONFIG_LXT_PHY=y
|
||||||
# CONFIG_INPUT_MOUSE is not set
|
# CONFIG_INPUT_MOUSE is not set
|
||||||
# CONFIG_SERIO is not set
|
# CONFIG_SERIO is not set
|
||||||
# CONFIG_LEGACY_PTYS is not set
|
# CONFIG_LEGACY_PTYS is not set
|
||||||
# CONFIG_DEVKMEM is not set
|
|
||||||
CONFIG_SERIAL_ARC=y
|
CONFIG_SERIAL_ARC=y
|
||||||
CONFIG_SERIAL_ARC_CONSOLE=y
|
CONFIG_SERIAL_ARC_CONSOLE=y
|
||||||
# CONFIG_HW_RANDOM is not set
|
# CONFIG_HW_RANDOM is not set
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
# CONFIG_LOCALVERSION_AUTO is not set
|
# CONFIG_LOCALVERSION_AUTO is not set
|
||||||
CONFIG_DEFAULT_HOSTNAME="ARCLinux"
|
|
||||||
# CONFIG_SWAP is not set
|
# CONFIG_SWAP is not set
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_POSIX_MQUEUE=y
|
CONFIG_POSIX_MQUEUE=y
|
||||||
|
@ -45,7 +44,6 @@ CONFIG_DEVTMPFS=y
|
||||||
# CONFIG_INPUT_MOUSE is not set
|
# CONFIG_INPUT_MOUSE is not set
|
||||||
# CONFIG_SERIO is not set
|
# CONFIG_SERIO is not set
|
||||||
# CONFIG_LEGACY_PTYS is not set
|
# CONFIG_LEGACY_PTYS is not set
|
||||||
# CONFIG_DEVKMEM is not set
|
|
||||||
CONFIG_SERIAL_ARC=y
|
CONFIG_SERIAL_ARC=y
|
||||||
CONFIG_SERIAL_ARC_CONSOLE=y
|
CONFIG_SERIAL_ARC_CONSOLE=y
|
||||||
# CONFIG_HW_RANDOM is not set
|
# CONFIG_HW_RANDOM is not set
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
# CONFIG_LOCALVERSION_AUTO is not set
|
# CONFIG_LOCALVERSION_AUTO is not set
|
||||||
CONFIG_DEFAULT_HOSTNAME="ARCLinux"
|
|
||||||
# CONFIG_SWAP is not set
|
# CONFIG_SWAP is not set
|
||||||
# CONFIG_CROSS_MEMORY_ATTACH is not set
|
# CONFIG_CROSS_MEMORY_ATTACH is not set
|
||||||
CONFIG_HIGH_RES_TIMERS=y
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
|
@ -44,7 +43,6 @@ CONFIG_DEVTMPFS=y
|
||||||
# CONFIG_INPUT_MOUSE is not set
|
# CONFIG_INPUT_MOUSE is not set
|
||||||
# CONFIG_SERIO is not set
|
# CONFIG_SERIO is not set
|
||||||
# CONFIG_LEGACY_PTYS is not set
|
# CONFIG_LEGACY_PTYS is not set
|
||||||
# CONFIG_DEVKMEM is not set
|
|
||||||
CONFIG_SERIAL_ARC=y
|
CONFIG_SERIAL_ARC=y
|
||||||
CONFIG_SERIAL_ARC_CONSOLE=y
|
CONFIG_SERIAL_ARC_CONSOLE=y
|
||||||
# CONFIG_HW_RANDOM is not set
|
# CONFIG_HW_RANDOM is not set
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
# CONFIG_LOCALVERSION_AUTO is not set
|
# CONFIG_LOCALVERSION_AUTO is not set
|
||||||
CONFIG_DEFAULT_HOSTNAME="ARCLinux"
|
|
||||||
# CONFIG_SWAP is not set
|
# CONFIG_SWAP is not set
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
# CONFIG_CROSS_MEMORY_ATTACH is not set
|
# CONFIG_CROSS_MEMORY_ATTACH is not set
|
||||||
|
@ -48,7 +47,6 @@ CONFIG_MOUSE_PS2_TOUCHKIT=y
|
||||||
# CONFIG_SERIO_SERPORT is not set
|
# CONFIG_SERIO_SERPORT is not set
|
||||||
CONFIG_SERIO_ARC_PS2=y
|
CONFIG_SERIO_ARC_PS2=y
|
||||||
# CONFIG_LEGACY_PTYS is not set
|
# CONFIG_LEGACY_PTYS is not set
|
||||||
# CONFIG_DEVKMEM is not set
|
|
||||||
CONFIG_SERIAL_8250=y
|
CONFIG_SERIAL_8250=y
|
||||||
CONFIG_SERIAL_8250_CONSOLE=y
|
CONFIG_SERIAL_8250_CONSOLE=y
|
||||||
CONFIG_SERIAL_8250_NR_UARTS=1
|
CONFIG_SERIAL_8250_NR_UARTS=1
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
# CONFIG_LOCALVERSION_AUTO is not set
|
# CONFIG_LOCALVERSION_AUTO is not set
|
||||||
CONFIG_DEFAULT_HOSTNAME="ARCLinux"
|
|
||||||
# CONFIG_SWAP is not set
|
# CONFIG_SWAP is not set
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
# CONFIG_CROSS_MEMORY_ATTACH is not set
|
# CONFIG_CROSS_MEMORY_ATTACH is not set
|
||||||
|
@ -47,7 +46,6 @@ CONFIG_MOUSE_PS2_TOUCHKIT=y
|
||||||
# CONFIG_SERIO_SERPORT is not set
|
# CONFIG_SERIO_SERPORT is not set
|
||||||
CONFIG_SERIO_ARC_PS2=y
|
CONFIG_SERIO_ARC_PS2=y
|
||||||
# CONFIG_LEGACY_PTYS is not set
|
# CONFIG_LEGACY_PTYS is not set
|
||||||
# CONFIG_DEVKMEM is not set
|
|
||||||
CONFIG_SERIAL_8250=y
|
CONFIG_SERIAL_8250=y
|
||||||
CONFIG_SERIAL_8250_CONSOLE=y
|
CONFIG_SERIAL_8250_CONSOLE=y
|
||||||
CONFIG_SERIAL_8250_NR_UARTS=1
|
CONFIG_SERIAL_8250_NR_UARTS=1
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
CONFIG_DEFAULT_HOSTNAME="ARCLinux"
|
|
||||||
# CONFIG_SWAP is not set
|
# CONFIG_SWAP is not set
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
# CONFIG_CROSS_MEMORY_ATTACH is not set
|
# CONFIG_CROSS_MEMORY_ATTACH is not set
|
||||||
|
@ -58,7 +57,6 @@ CONFIG_MOUSE_PS2_TOUCHKIT=y
|
||||||
# CONFIG_SERIO_SERPORT is not set
|
# CONFIG_SERIO_SERPORT is not set
|
||||||
CONFIG_SERIO_ARC_PS2=y
|
CONFIG_SERIO_ARC_PS2=y
|
||||||
# CONFIG_LEGACY_PTYS is not set
|
# CONFIG_LEGACY_PTYS is not set
|
||||||
# CONFIG_DEVKMEM is not set
|
|
||||||
CONFIG_SERIAL_8250=y
|
CONFIG_SERIAL_8250=y
|
||||||
CONFIG_SERIAL_8250_CONSOLE=y
|
CONFIG_SERIAL_8250_CONSOLE=y
|
||||||
CONFIG_SERIAL_8250_NR_UARTS=1
|
CONFIG_SERIAL_8250_NR_UARTS=1
|
||||||
|
|
|
@ -57,7 +57,6 @@ CONFIG_STMMAC_ETH=y
|
||||||
# CONFIG_SERIO is not set
|
# CONFIG_SERIO is not set
|
||||||
# CONFIG_VT is not set
|
# CONFIG_VT is not set
|
||||||
# CONFIG_LEGACY_PTYS is not set
|
# CONFIG_LEGACY_PTYS is not set
|
||||||
# CONFIG_DEVKMEM is not set
|
|
||||||
CONFIG_SERIAL_8250=y
|
CONFIG_SERIAL_8250=y
|
||||||
CONFIG_SERIAL_8250_CONSOLE=y
|
CONFIG_SERIAL_8250_CONSOLE=y
|
||||||
CONFIG_SERIAL_8250_NR_UARTS=1
|
CONFIG_SERIAL_8250_NR_UARTS=1
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
# CONFIG_LOCALVERSION_AUTO is not set
|
# CONFIG_LOCALVERSION_AUTO is not set
|
||||||
CONFIG_DEFAULT_HOSTNAME="ARCLinux"
|
|
||||||
# CONFIG_CROSS_MEMORY_ATTACH is not set
|
# CONFIG_CROSS_MEMORY_ATTACH is not set
|
||||||
CONFIG_HIGH_RES_TIMERS=y
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
CONFIG_IKCONFIG=y
|
CONFIG_IKCONFIG=y
|
||||||
|
@ -53,7 +52,6 @@ CONFIG_NATIONAL_PHY=y
|
||||||
CONFIG_MOUSE_PS2_TOUCHKIT=y
|
CONFIG_MOUSE_PS2_TOUCHKIT=y
|
||||||
CONFIG_SERIO_ARC_PS2=y
|
CONFIG_SERIO_ARC_PS2=y
|
||||||
# CONFIG_LEGACY_PTYS is not set
|
# CONFIG_LEGACY_PTYS is not set
|
||||||
# CONFIG_DEVKMEM is not set
|
|
||||||
CONFIG_SERIAL_8250=y
|
CONFIG_SERIAL_8250=y
|
||||||
CONFIG_SERIAL_8250_CONSOLE=y
|
CONFIG_SERIAL_8250_CONSOLE=y
|
||||||
CONFIG_SERIAL_8250_DW=y
|
CONFIG_SERIAL_8250_DW=y
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
# CONFIG_LOCALVERSION_AUTO is not set
|
# CONFIG_LOCALVERSION_AUTO is not set
|
||||||
CONFIG_DEFAULT_HOSTNAME="ARCLinux"
|
|
||||||
# CONFIG_CROSS_MEMORY_ATTACH is not set
|
# CONFIG_CROSS_MEMORY_ATTACH is not set
|
||||||
CONFIG_HIGH_RES_TIMERS=y
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
CONFIG_IKCONFIG=y
|
CONFIG_IKCONFIG=y
|
||||||
|
|
|
@ -84,7 +84,7 @@ static inline int atomic_fetch_##op(int i, atomic_t *v) \
|
||||||
"1: llock %[orig], [%[ctr]] \n" \
|
"1: llock %[orig], [%[ctr]] \n" \
|
||||||
" " #asm_op " %[val], %[orig], %[i] \n" \
|
" " #asm_op " %[val], %[orig], %[i] \n" \
|
||||||
" scond %[val], [%[ctr]] \n" \
|
" scond %[val], [%[ctr]] \n" \
|
||||||
" \n" \
|
" bnz 1b \n" \
|
||||||
: [val] "=&r" (val), \
|
: [val] "=&r" (val), \
|
||||||
[orig] "=&r" (orig) \
|
[orig] "=&r" (orig) \
|
||||||
: [ctr] "r" (&v->counter), \
|
: [ctr] "r" (&v->counter), \
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
|
// (C) 2018 Synopsys, Inc. (www.synopsys.com)
|
||||||
|
|
||||||
|
#ifndef ASM_ARC_DMA_MAPPING_H
|
||||||
|
#define ASM_ARC_DMA_MAPPING_H
|
||||||
|
|
||||||
|
#include <asm-generic/dma-mapping.h>
|
||||||
|
|
||||||
|
void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,
|
||||||
|
const struct iommu_ops *iommu, bool coherent);
|
||||||
|
#define arch_setup_dma_ops arch_setup_dma_ops
|
||||||
|
|
||||||
|
#endif
|
|
@ -83,9 +83,6 @@ done:
|
||||||
static void show_faulting_vma(unsigned long address, char *buf)
|
static void show_faulting_vma(unsigned long address, char *buf)
|
||||||
{
|
{
|
||||||
struct vm_area_struct *vma;
|
struct vm_area_struct *vma;
|
||||||
struct inode *inode;
|
|
||||||
unsigned long ino = 0;
|
|
||||||
dev_t dev = 0;
|
|
||||||
char *nm = buf;
|
char *nm = buf;
|
||||||
struct mm_struct *active_mm = current->active_mm;
|
struct mm_struct *active_mm = current->active_mm;
|
||||||
|
|
||||||
|
@ -99,12 +96,10 @@ static void show_faulting_vma(unsigned long address, char *buf)
|
||||||
* if the container VMA is not found
|
* if the container VMA is not found
|
||||||
*/
|
*/
|
||||||
if (vma && (vma->vm_start <= address)) {
|
if (vma && (vma->vm_start <= address)) {
|
||||||
struct file *file = vma->vm_file;
|
if (vma->vm_file) {
|
||||||
if (file) {
|
nm = file_path(vma->vm_file, buf, PAGE_SIZE - 1);
|
||||||
nm = file_path(file, buf, PAGE_SIZE - 1);
|
if (IS_ERR(nm))
|
||||||
inode = file_inode(vma->vm_file);
|
nm = "?";
|
||||||
dev = inode->i_sb->s_dev;
|
|
||||||
ino = inode->i_ino;
|
|
||||||
}
|
}
|
||||||
pr_info(" @off 0x%lx in [%s]\n"
|
pr_info(" @off 0x%lx in [%s]\n"
|
||||||
" VMA: 0x%08lx to 0x%08lx\n",
|
" VMA: 0x%08lx to 0x%08lx\n",
|
||||||
|
|
|
@ -65,7 +65,7 @@ char *arc_cache_mumbojumbo(int c, char *buf, int len)
|
||||||
|
|
||||||
n += scnprintf(buf + n, len - n, "Peripherals\t: %#lx%s%s\n",
|
n += scnprintf(buf + n, len - n, "Peripherals\t: %#lx%s%s\n",
|
||||||
perip_base,
|
perip_base,
|
||||||
IS_AVAIL3(ioc_exists, ioc_enable, ", IO-Coherency "));
|
IS_AVAIL3(ioc_exists, ioc_enable, ", IO-Coherency (per-device) "));
|
||||||
|
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
@ -896,15 +896,6 @@ static void __dma_cache_wback_slc(phys_addr_t start, unsigned long sz)
|
||||||
slc_op(start, sz, OP_FLUSH);
|
slc_op(start, sz, OP_FLUSH);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* DMA ops for systems with IOC
|
|
||||||
* IOC hardware snoops all DMA traffic keeping the caches consistent with
|
|
||||||
* memory - eliding need for any explicit cache maintenance of DMA buffers
|
|
||||||
*/
|
|
||||||
static void __dma_cache_wback_inv_ioc(phys_addr_t start, unsigned long sz) {}
|
|
||||||
static void __dma_cache_inv_ioc(phys_addr_t start, unsigned long sz) {}
|
|
||||||
static void __dma_cache_wback_ioc(phys_addr_t start, unsigned long sz) {}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Exported DMA API
|
* Exported DMA API
|
||||||
*/
|
*/
|
||||||
|
@ -1153,6 +1144,19 @@ noinline void __init arc_ioc_setup(void)
|
||||||
{
|
{
|
||||||
unsigned int ioc_base, mem_sz;
|
unsigned int ioc_base, mem_sz;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* As for today we don't support both IOC and ZONE_HIGHMEM enabled
|
||||||
|
* simultaneously. This happens because as of today IOC aperture covers
|
||||||
|
* only ZONE_NORMAL (low mem) and any dma transactions outside this
|
||||||
|
* region won't be HW coherent.
|
||||||
|
* If we want to use both IOC and ZONE_HIGHMEM we can use
|
||||||
|
* bounce_buffer to handle dma transactions to HIGHMEM.
|
||||||
|
* Also it is possible to modify dma_direct cache ops or increase IOC
|
||||||
|
* aperture size if we are planning to use HIGHMEM without PAE.
|
||||||
|
*/
|
||||||
|
if (IS_ENABLED(CONFIG_HIGHMEM))
|
||||||
|
panic("IOC and HIGHMEM can't be used simultaneously");
|
||||||
|
|
||||||
/* Flush + invalidate + disable L1 dcache */
|
/* Flush + invalidate + disable L1 dcache */
|
||||||
__dc_disable();
|
__dc_disable();
|
||||||
|
|
||||||
|
@ -1264,11 +1268,7 @@ void __init arc_cache_init_master(void)
|
||||||
if (is_isa_arcv2() && ioc_enable)
|
if (is_isa_arcv2() && ioc_enable)
|
||||||
arc_ioc_setup();
|
arc_ioc_setup();
|
||||||
|
|
||||||
if (is_isa_arcv2() && ioc_enable) {
|
if (is_isa_arcv2() && l2_line_sz && slc_enable) {
|
||||||
__dma_cache_wback_inv = __dma_cache_wback_inv_ioc;
|
|
||||||
__dma_cache_inv = __dma_cache_inv_ioc;
|
|
||||||
__dma_cache_wback = __dma_cache_wback_ioc;
|
|
||||||
} else if (is_isa_arcv2() && l2_line_sz && slc_enable) {
|
|
||||||
__dma_cache_wback_inv = __dma_cache_wback_inv_slc;
|
__dma_cache_wback_inv = __dma_cache_wback_inv_slc;
|
||||||
__dma_cache_inv = __dma_cache_inv_slc;
|
__dma_cache_inv = __dma_cache_inv_slc;
|
||||||
__dma_cache_wback = __dma_cache_wback_slc;
|
__dma_cache_wback = __dma_cache_wback_slc;
|
||||||
|
@ -1277,6 +1277,12 @@ void __init arc_cache_init_master(void)
|
||||||
__dma_cache_inv = __dma_cache_inv_l1;
|
__dma_cache_inv = __dma_cache_inv_l1;
|
||||||
__dma_cache_wback = __dma_cache_wback_l1;
|
__dma_cache_wback = __dma_cache_wback_l1;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
* In case of IOC (say IOC+SLC case), pointers above could still be set
|
||||||
|
* but end up not being relevant as the first function in chain is not
|
||||||
|
* called at all for @dma_direct_ops
|
||||||
|
* arch_sync_dma_for_cpu() -> dma_cache_*() -> __dma_cache_*()
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
|
|
||||||
void __ref arc_cache_init(void)
|
void __ref arc_cache_init(void)
|
||||||
|
|
|
@ -6,20 +6,17 @@
|
||||||
* published by the Free Software Foundation.
|
* published by the Free Software Foundation.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
|
||||||
* DMA Coherent API Notes
|
|
||||||
*
|
|
||||||
* I/O is inherently non-coherent on ARC. So a coherent DMA buffer is
|
|
||||||
* implemented by accessing it using a kernel virtual address, with
|
|
||||||
* Cache bit off in the TLB entry.
|
|
||||||
*
|
|
||||||
* The default DMA address == Phy address which is 0x8000_0000 based.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <linux/dma-noncoherent.h>
|
#include <linux/dma-noncoherent.h>
|
||||||
#include <asm/cache.h>
|
#include <asm/cache.h>
|
||||||
#include <asm/cacheflush.h>
|
#include <asm/cacheflush.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ARCH specific callbacks for generic noncoherent DMA ops (dma/noncoherent.c)
|
||||||
|
* - hardware IOC not available (or "dma-coherent" not set for device in DT)
|
||||||
|
* - But still handle both coherent and non-coherent requests from caller
|
||||||
|
*
|
||||||
|
* For DMA coherent hardware (IOC) generic code suffices
|
||||||
|
*/
|
||||||
void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle,
|
void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle,
|
||||||
gfp_t gfp, unsigned long attrs)
|
gfp_t gfp, unsigned long attrs)
|
||||||
{
|
{
|
||||||
|
@ -27,42 +24,29 @@ void *arch_dma_alloc(struct device *dev, size_t size, dma_addr_t *dma_handle,
|
||||||
struct page *page;
|
struct page *page;
|
||||||
phys_addr_t paddr;
|
phys_addr_t paddr;
|
||||||
void *kvaddr;
|
void *kvaddr;
|
||||||
int need_coh = 1, need_kvaddr = 0;
|
bool need_coh = !(attrs & DMA_ATTR_NON_CONSISTENT);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* __GFP_HIGHMEM flag is cleared by upper layer functions
|
||||||
|
* (in include/linux/dma-mapping.h) so we should never get a
|
||||||
|
* __GFP_HIGHMEM here.
|
||||||
|
*/
|
||||||
|
BUG_ON(gfp & __GFP_HIGHMEM);
|
||||||
|
|
||||||
page = alloc_pages(gfp, order);
|
page = alloc_pages(gfp, order);
|
||||||
if (!page)
|
if (!page)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
/*
|
|
||||||
* IOC relies on all data (even coherent DMA data) being in cache
|
|
||||||
* Thus allocate normal cached memory
|
|
||||||
*
|
|
||||||
* The gains with IOC are two pronged:
|
|
||||||
* -For streaming data, elides need for cache maintenance, saving
|
|
||||||
* cycles in flush code, and bus bandwidth as all the lines of a
|
|
||||||
* buffer need to be flushed out to memory
|
|
||||||
* -For coherent data, Read/Write to buffers terminate early in cache
|
|
||||||
* (vs. always going to memory - thus are faster)
|
|
||||||
*/
|
|
||||||
if ((is_isa_arcv2() && ioc_enable) ||
|
|
||||||
(attrs & DMA_ATTR_NON_CONSISTENT))
|
|
||||||
need_coh = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* - A coherent buffer needs MMU mapping to enforce non-cachability
|
|
||||||
* - A highmem page needs a virtual handle (hence MMU mapping)
|
|
||||||
* independent of cachability
|
|
||||||
*/
|
|
||||||
if (PageHighMem(page) || need_coh)
|
|
||||||
need_kvaddr = 1;
|
|
||||||
|
|
||||||
/* This is linear addr (0x8000_0000 based) */
|
/* This is linear addr (0x8000_0000 based) */
|
||||||
paddr = page_to_phys(page);
|
paddr = page_to_phys(page);
|
||||||
|
|
||||||
*dma_handle = paddr;
|
*dma_handle = paddr;
|
||||||
|
|
||||||
/* This is kernel Virtual address (0x7000_0000 based) */
|
/*
|
||||||
if (need_kvaddr) {
|
* A coherent buffer needs MMU mapping to enforce non-cachability.
|
||||||
|
* kvaddr is kernel Virtual address (0x7000_0000 based).
|
||||||
|
*/
|
||||||
|
if (need_coh) {
|
||||||
kvaddr = ioremap_nocache(paddr, size);
|
kvaddr = ioremap_nocache(paddr, size);
|
||||||
if (kvaddr == NULL) {
|
if (kvaddr == NULL) {
|
||||||
__free_pages(page, order);
|
__free_pages(page, order);
|
||||||
|
@ -93,12 +77,8 @@ void arch_dma_free(struct device *dev, size_t size, void *vaddr,
|
||||||
{
|
{
|
||||||
phys_addr_t paddr = dma_handle;
|
phys_addr_t paddr = dma_handle;
|
||||||
struct page *page = virt_to_page(paddr);
|
struct page *page = virt_to_page(paddr);
|
||||||
int is_non_coh = 1;
|
|
||||||
|
|
||||||
is_non_coh = (attrs & DMA_ATTR_NON_CONSISTENT) ||
|
if (!(attrs & DMA_ATTR_NON_CONSISTENT))
|
||||||
(is_isa_arcv2() && ioc_enable);
|
|
||||||
|
|
||||||
if (PageHighMem(page) || !is_non_coh)
|
|
||||||
iounmap((void __force __iomem *)vaddr);
|
iounmap((void __force __iomem *)vaddr);
|
||||||
|
|
||||||
__free_pages(page, get_order(size));
|
__free_pages(page, get_order(size));
|
||||||
|
@ -185,3 +165,23 @@ void arch_sync_dma_for_cpu(struct device *dev, phys_addr_t paddr,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Plug in coherent or noncoherent dma ops
|
||||||
|
*/
|
||||||
|
void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,
|
||||||
|
const struct iommu_ops *iommu, bool coherent)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* IOC hardware snoops all DMA traffic keeping the caches consistent
|
||||||
|
* with memory - eliding need for any explicit cache maintenance of
|
||||||
|
* DMA buffers - so we can use dma_direct cache ops.
|
||||||
|
*/
|
||||||
|
if (is_isa_arcv2() && ioc_enable && coherent) {
|
||||||
|
set_dma_ops(dev, &dma_direct_ops);
|
||||||
|
dev_info(dev, "use dma_direct_ops cache ops\n");
|
||||||
|
} else {
|
||||||
|
set_dma_ops(dev, &dma_noncoherent_ops);
|
||||||
|
dev_info(dev, "use dma_noncoherent_ops cache ops\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue