Merge android-4.9.163 (429c144) into msm-4.9
* tmp-429c144:
Linux 4.9.163
x86: Add TSX Force Abort CPUID/MSR
perf/x86/intel: Generalize dynamic constraint creation
perf/x86/intel: Make cpuc allocations consistent
ARM: dts: exynos: Do not ignore real-world fuse values for thermal zone 0 on Exynos5420
ARM: 8781/1: Fix Thumb-2 syscall return for binutils 2.29+
drm: disable uncached DMA optimization for ARM and arm64
ARM: dts: exynos: Add minimal clkout parameters to Exynos3250 PMU
ARM: dts: exynos: Fix pinctrl definition for eMMC RTSN line on Odroid X2/U3
futex,rt_mutex: Restructure rt_mutex_finish_proxy_lock()
scsi: aacraid: Fix missing break in switch statement
iscsi_ibft: Fix missing break in switch statement
Input: elan_i2c - add id for touchpad found in Lenovo s21e-20
Input: wacom_serial4 - add support for Wacom ArtPad II tablet
fs: ratelimit __find_get_block_slow() failure message.
MIPS: Remove function size check in get_frame_info()
perf symbols: Filter out hidden symbols from labels
s390/qeth: fix use-after-free in error path
netfilter: nf_nat: skip nat clash resolution for same-origin entries
selftests: netfilter: add simple masq/redirect test cases
selftests: netfilter: fix config fragment CONFIG_NF_TABLES_INET
dmaengine: dmatest: Abort test in case of mapping error
vsock/virtio: reset connected sockets on device removal
vsock/virtio: fix kernel panic after device hot-unplug
dmaengine: at_xdmac: Fix wrongfull report of a channel as in use
drm/sun4i: tcon: Prepare and enable TCON channel 0 clock at init
irqchip/mmp: Only touch the PJ4 IRQ & FIQ bits on enable/disable
usb: phy: fix link errors
arm64: dts: add msm8996 compatible to gicv3
ARM: pxa: ssp: unneeded to free devm_ allocated data
soc: fsl: qbman: avoid race in clearing QMan interrupt
autofs: fix error return in autofs_fill_super()
autofs: drop dentry reference only when it is never used
fs/drop_caches.c: avoid softlockups in drop_pagecache_sb()
mm, memory_hotplug: test_pages_in_a_zone do not pass the end of zone
mm, memory_hotplug: is_mem_section_removable do not pass the end of a zone
x86_64: increase stack size for KASAN_EXTRA
x86/kexec: Don't setup EFI info if EFI runtime is not enabled
arm64: kprobe: Always blacklist the KVM world-switch code
cifs: fix computation for MAX_SMB2_HDR_SIZE
platform/x86: Fix unmet dependency warning for SAMSUNG_Q10
scsi: libfc: free skb when receiving invalid flogi resp
qed: Fix VF probe failure while FLR
nfs: Fix NULL pointer dereference of dev_name
gpio: vf610: Mask all GPIO interrupts
net: stmmac: dwmac-rk: fix error handling in rk_gmac_powerup()
net: hns: Fix wrong read accesses via Clause 45 MDIO protocol
net: hns: Fix for missing of_node_put() after of_parse_phandle()
net: altera_tse: fix msgdma_tx_completion on non-zero fill_level case
xtensa: SMP: limit number of possible CPUs by NR_CPUS
xtensa: SMP: mark each possible CPU as present
xtensa: smp_lx200_defconfig: fix vectors clash
xtensa: SMP: fix secondary CPU initialization
xtensa: SMP: fix ccount_timer_shutdown
iommu/amd: Fix IOMMU page flush when detach device from a domain
ipvs: Fix signed integer overflow when setsockopt timeout
iommu/amd: Unmap all mapped pages in error path of map_sg
iommu/amd: Call free_iova_fast with pfn in map_sg
IB/{hfi1, qib}: Fix WC.byte_len calculation for UD_SEND_WITH_IMM
perf tools: Handle TOPOLOGY headers with no CPU
perf core: Fix perf_proc_update_handler() bug
vti4: Fix a ipip packet processing bug in 'IPCOMP' virtual tunnel
media: uvcvideo: Fix 'type' check leading to overflow
exec: Fix mem leak in kernel_read_file
hugetlbfs: fix races and page leaks during migration
MIPS: irq: Allocate accurate order pages for irq stack
applicom: Fix potential Spectre v1 vulnerabilities
x86/CPU/AMD: Set the CPB bit unconditionally on F17h
net: phy: Micrel KSZ8061: link failure after cable connect
tun: remove unnecessary memory barrier
tun: fix blocking read
net: avoid use IPCB in cipso_v4_error
net: Add __icmp_send helper.
xen-netback: fix occasional leak of grant ref mappings under memory pressure
xen-netback: don't populate the hash cache on XenBus disconnect
net: sit: fix memory leak in sit_init_net()
net: nfc: Fix NULL dereference on nfc_llcp_build_tlv fails
net: netem: fix skb length BUG_ON in __skb_to_sgvec
netlabel: fix out-of-bounds memory accesses
net: dsa: mv88e6xxx: Fix u64 statistics
hv_netvsc: Fix IP header checksum for coalesced packets
bnxt_en: Drop oversize TX packets to prevent errors.
team: Free BPF filter when unregistering netdev
sky2: Disable MSI on Dell Inspiron 1545 and Gateway P-79
net-sysfs: Fix mem leak in netdev_register_kobject
ip6mr: Do not call __IP6_INC_STATS() from preemptible context
staging: android: ion: fix sys heap pool's gfp_flags
staging: wilc1000: fix to set correct value for 'vif_num'
staging: comedi: ni_660x: fix missing break in switch statement
isdn: isdn_tty: fix build warning of strncpy
ncpfs: fix build warning of strncpy
cpufreq: Use struct kobj_attribute instead of struct global_attr
USB: serial: ftdi_sio: add ID for Hjelmslund Electronics USB485
USB: serial: cp210x: add ID for Ingenico 3070
USB: serial: option: add Telit ME910 ECM composition
ANDROID: cuttlefish: enable CONFIG_INET_UDP_DIAG=y
ANDROID: cpufreq: times: don't copy invalid freqs from freq table
ANDROID: cuttlefish: enable CONFIG_USB_RTL8152=y
ANDROID: cpufreq: times: record fast switch frequency transitions
ANDROID: cuttlefish_defconfig: Add support for AC97 audio
Revert "ANDROID: arm: process: Add display of memory around registers when displaying regs."
Revert "arm: fix show_data fallout from KERN_CONT changes"
ANDROID: cfi: Remove unused variable in ptr_to_check_fn
ANDROID: cuttlefish: enable CONFIG_NETFILTER_XT_TARGET_CT=y
ANDROID: overlayfs: override_creds=off option bypass creator_cred
Linux 4.9.162
x86/uaccess: Don't leak the AC flag into __put_user() value evaluation
mm: enforce min addr even if capable() in expand_downwards()
mmc: spi: Fix card detection during probe
powerpc: Always initialize input array when calling epapr_hypercall()
KVM: nSVM: clear events pending from svm_complete_interrupts() when exiting to L1
svm: Fix AVIC incomplete IPI emulation
cfg80211: extend range deviation for DMG
mac80211: Add attribute aligned(2) to struct 'action'
mac80211: don't initiate TDLS connection if station is not associated to AP
ibmveth: Do not process frames after calling napi_reschedule
net: usb: asix: ax88772_bind return error when hw_reset fail
net: altera_tse: fix connect_local_phy error path
scsi: csiostor: fix NULL pointer dereference in csio_vport_set_state()
direct-io: allow direct writes to empty inodes
serial: fsl_lpuart: fix maximum acceptable baud rate with over-sampling
locking/rwsem: Fix (possible) missed wakeup
mac80211: fix miscounting of ttl-dropped frames
drivers: thermal: int340x_thermal: Fix sysfs race condition
ARC: fix __ffs return value to avoid build warnings
ASoC: imx-audmux: change snprintf to scnprintf for possible overflow
ASoC: dapm: change snprintf to scnprintf for possible overflow
usb: gadget: Potential NULL dereference on allocation error
usb: dwc3: gadget: Fix the uninitialized link_state when udc starts
usb: dwc3: gadget: synchronize_irq dwc irq in suspend
thermal: int340x_thermal: Fix a NULL vs IS_ERR() check
ALSA: compress: prevent potential divide by zero bugs
ASoC: Intel: Haswell/Broadwell: fix setting for .dynamic field
drm/msm: Unblock writer if reader closes file
scsi: libsas: Fix rphy phy_identifier for PHYs with end devices attached
Revert "loop: Fold __loop_release into loop_release"
Revert "loop: Get rid of loop_index_mutex"
Revert "loop: Fix double mutex_unlock(&loop_ctl_mutex) in loop_control_ioctl()"
FROMGIT: binder: create node flag to request sender's security context
ANDROID: revert "sysfs_net_ipv4: Add sysfs-based knobs for controlling TCP window size"
Makefile: Fix 4.9.161 merge
Linux 4.9.161
kbuild: consolidate Clang compiler flags
sched/sysctl: Fix attributes of some extern declarations
phy: tegra: remove redundant self assignment of 'map'
pinctrl: max77620: Use define directive for max77620_pinconf_param values
netfilter: nf_tables: fix flush after rule deletion in the same batch
Revert "bridge: do not add port to router list when receives query with source 0.0.0.0"
mm/zsmalloc.c: fix -Wunneeded-internal-declaration warning
mm/zsmalloc.c: change stat type parameter to int
irqchip/gic-v3: Convert arm64 GIC accessors to {read,write}_sysreg_s
kbuild: add -no-integrated-as Clang option unconditionally
kbuild: set no-integrated-as before incl. arch Makefile
kbuild: clang: disable unused variable warnings only when constant
kbuild: clang: remove crufty HOSTCFLAGS
kbuild: clang: fix build failures with sparse check
kbuild: move cc-option and cc-disable-warning after incl. arch Makefile
drm/i915: Fix enum pipe vs. enum transcoder for the PCH transcoder
drm/i915: Consistently use enum pipe for PCH transcoders
x86/boot: Disable the address-of-packed-member compiler warning
tracing: Use cpumask_available() to check if cpumask variable may be used
netpoll: Fix device name check in netpoll_setup()
clocksource: Use GENMASK_ULL in definition of CLOCKSOURCE_MASK
hpet: Make cmd parameter of hpet_ioctl_common() unsigned
ARC: define ARCH_SLAB_MINALIGN = 8
ARC: U-boot: check arguments paranoidly
ARCv2: Enable unaligned access in early ASM code
parisc: Fix ptrace syscall number modification
net/mlx4_en: Force CHECKSUM_NONE for short ethernet frames
sctp: call gso_reset_checksum when computing checksum in sctp_gso_segment
sit: check if IPv6 enabled before calling ip6_err_gen_icmpv6_unreach()
team: avoid complex list operations in team_nl_cmd_options_set()
net/packet: fix 4gb buffer limit due to overflow check
batman-adv: fix uninit-value in batadv_interface_tx()
KEYS: always initialize keyring_index_key::desc_len
KEYS: user: Align the payload buffer
RDMA/srp: Rework SCSI device reset handling
net: ethernet: stmmac: change dma descriptors to __le32
isdn: avm: Fix string plus integer warning from Clang
net/mlx5e: Fix wrong (zero) TX drop counter indication for representor
mlxsw: spectrum_switchdev: Do not treat static FDB entries as sticky
leds: lp5523: fix a missing check of return value of lp55xx_read
atm: he: fix sign-extension overflow on large shift
isdn: i4l: isdn_tty: Fix some concurrency double-free bugs
net: stmmac: Fix PCI module removal leak
MIPS: jazz: fix 64bit build
scsi: isci: initialize shost fully before calling scsi_add_host()
scsi: qla4xxx: check return code of qla4xxx_copy_from_fwddb_param
MIPS: ath79: Enable OF serial ports in the default config
net: hns: Fix use after free identified by SLUB debug
qed: Fix qed_ll2_post_rx_buffer_notify_fw() by adding a write memory barrier
mfd: mc13xxx: Fix a missing check of a register-read failure
mfd: wm5110: Add missing ASRC rate register
mfd: qcom_rpm: write fw_version to CTRL_REG
mfd: ab8500-core: Return zero in get_register_interruptible()
mfd: mt6397: Do not call irq_domain_remove if PMIC unsupported
mfd: db8500-prcmu: Fix some section annotations
mfd: twl-core: Fix section annotations on {,un}protect_pm_master
mfd: ti_am335x_tscadc: Use PLATFORM_DEVID_AUTO while registering mfd cells
KEYS: allow reaching the keys quotas exactly
proc, oom: do not report alien mms when setting oom_score_adj
numa: change get_mempolicy() to use nr_node_ids instead of MAX_NUMNODES
ceph: avoid repeatedly adding inode to mdsc->snap_flush_list
libceph: handle an empty authorize reply
mac80211: Free mpath object when rhashtable insertion fails
ANDROID: cpufreq: times: optimize proc files
Conflicts:
Makefile
arch/arm/kernel/process.c
drivers/gpu/drm/msm/msm_rd.c
drivers/staging/android/ion/ion_system_heap.c
include/linux/sched/sysctl.h
sound/core/compress_offload.c
Change-Id: I1673f8e76b4863f8cebc8ead8bf24f659ce6ce44
Signed-off-by: jianzhou <jianzhou@codeaurora.org>
This commit is contained in:
@@ -82,6 +82,29 @@ Only the lists of names from directories are merged. Other content
|
||||
such as metadata and extended attributes are reported for the upper
|
||||
directory only. These attributes of the lower directory are hidden.
|
||||
|
||||
credentials
|
||||
-----------
|
||||
|
||||
By default, all access to the upper, lower and work directories is the
|
||||
recorded mounter's MAC and DAC credentials. The incoming accesses are
|
||||
checked against the caller's credentials.
|
||||
|
||||
In the case where caller MAC or DAC credentials do not overlap, a
|
||||
use case available in older versions of the driver, the
|
||||
override_creds mount flag can be turned off and help when the use
|
||||
pattern has caller with legitimate credentials where the mounter
|
||||
does not. Several unintended side effects will occur though. The
|
||||
caller without certain key capabilities or lower privilege will not
|
||||
always be able to delete files or directories, create nodes, or
|
||||
search some restricted directories. The ability to search and read
|
||||
a directory entry is spotty as a result of the cache mechanism not
|
||||
retesting the credentials because of the assumption, a privileged
|
||||
caller can fill cache, then a lower privilege can read the directory
|
||||
cache. The uneven security model where cache, upperdir and workdir
|
||||
are opened at privilege, but accessed without creating a form of
|
||||
privilege escalation, should only be used with strict understanding
|
||||
of the side effects and of the security policies.
|
||||
|
||||
whiteouts and opaque directories
|
||||
--------------------------------
|
||||
|
||||
|
||||
43
Makefile
Normal file → Executable file
43
Makefile
Normal file → Executable file
@@ -1,6 +1,6 @@
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 9
|
||||
SUBLEVEL = 160
|
||||
SUBLEVEL = 163
|
||||
EXTRAVERSION =
|
||||
NAME = Roaring Lionus
|
||||
|
||||
@@ -306,11 +306,6 @@ HOSTCXX = g++
|
||||
HOSTCFLAGS := -Wall -Wmissing-prototypes -Wstrict-prototypes -O2 -fomit-frame-pointer -std=gnu89
|
||||
HOSTCXXFLAGS = -O2
|
||||
|
||||
ifeq ($(shell $(HOSTCC) -v 2>&1 | grep -c "clang version"), 1)
|
||||
HOSTCFLAGS += -Wno-unused-value -Wno-unused-parameter \
|
||||
-Wno-missing-field-initializers -fno-delete-null-pointer-checks
|
||||
endif
|
||||
|
||||
# Decide whether to build built-in, modular, or both.
|
||||
# Normally, just do built-in.
|
||||
|
||||
@@ -517,19 +512,17 @@ endif
|
||||
ifeq ($(cc-name),clang)
|
||||
ifneq ($(CROSS_COMPILE),)
|
||||
CLANG_TRIPLE ?= $(CROSS_COMPILE)
|
||||
CLANG_TARGET := --target=$(notdir $(CLANG_TRIPLE:%-=%))
|
||||
ifeq ($(shell $(srctree)/scripts/clang-android.sh $(CC) $(CLANG_TARGET)), y)
|
||||
CLANG_FLAGS := --target=$(notdir $(CLANG_TRIPLE:%-=%))
|
||||
ifeq ($(shell $(srctree)/scripts/clang-android.sh $(CC) $(CLANG_FLAGS)), y)
|
||||
$(error "Clang with Android --target detected. Did you specify CLANG_TRIPLE?")
|
||||
endif
|
||||
GCC_TOOLCHAIN_DIR := $(dir $(shell which $(LD)))
|
||||
CLANG_PREFIX := --prefix=$(GCC_TOOLCHAIN_DIR)
|
||||
CLANG_FLAGS += --prefix=$(GCC_TOOLCHAIN_DIR)
|
||||
GCC_TOOLCHAIN := $(realpath $(GCC_TOOLCHAIN_DIR)/..)
|
||||
endif
|
||||
ifneq ($(GCC_TOOLCHAIN),)
|
||||
CLANG_GCC_TC := --gcc-toolchain=$(GCC_TOOLCHAIN)
|
||||
CLANG_FLAGS += --gcc-toolchain=$(GCC_TOOLCHAIN)
|
||||
endif
|
||||
KBUILD_CFLAGS += $(CLANG_TARGET) $(CLANG_GCC_TC) $(CLANG_PREFIX)
|
||||
KBUILD_AFLAGS += $(CLANG_TARGET) $(CLANG_GCC_TC) $(CLANG_PREFIX)
|
||||
KBUILD_CPPFLAGS += $(call cc-option,-Qunused-arguments,)
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning, unused-variable)
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning, format-invalid-specifier)
|
||||
@@ -546,8 +539,9 @@ KBUILD_CFLAGS += $(call cc-disable-warning, tautological-compare)
|
||||
# See modpost pattern 2
|
||||
KBUILD_CFLAGS += $(call cc-option, -mno-global-merge,)
|
||||
KBUILD_CFLAGS += $(call cc-option, -fcatch-undefined-behavior)
|
||||
KBUILD_CFLAGS += $(call cc-option, -no-integrated-as)
|
||||
KBUILD_AFLAGS += $(call cc-option, -no-integrated-as)
|
||||
CLANG_FLAGS += -no-integrated-as
|
||||
KBUILD_CFLAGS += $(CLANG_FLAGS)
|
||||
KBUILD_AFLAGS += $(CLANG_FLAGS)
|
||||
else
|
||||
|
||||
# These warnings generated too much noise in a regular build.
|
||||
@@ -813,6 +807,27 @@ ifdef CONFIG_CC_STACKPROTECTOR
|
||||
endif
|
||||
KBUILD_CFLAGS += $(stackp-flag)
|
||||
|
||||
ifeq ($(cc-name),clang)
|
||||
KBUILD_CPPFLAGS += $(call cc-option,-Qunused-arguments,)
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning, format-invalid-specifier)
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning, gnu)
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning, address-of-packed-member)
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning, duplicate-decl-specifier)
|
||||
# Quiet clang warning: comparison of unsigned expression < 0 is always false
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning, tautological-compare)
|
||||
# CLANG uses a _MergedGlobals as optimization, but this breaks modpost, as the
|
||||
# source of a reference will be _MergedGlobals and not on of the whitelisted names.
|
||||
# See modpost pattern 2
|
||||
KBUILD_CFLAGS += $(call cc-option, -mno-global-merge,)
|
||||
KBUILD_CFLAGS += $(call cc-option, -fcatch-undefined-behavior)
|
||||
else
|
||||
|
||||
# These warnings generated too much noise in a regular build.
|
||||
# Use make W=1 to enable them (see scripts/Makefile.extrawarn)
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning, unused-but-set-variable)
|
||||
endif
|
||||
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning, unused-const-variable)
|
||||
ifdef CONFIG_FRAME_POINTER
|
||||
KBUILD_CFLAGS += -fno-omit-frame-pointer -fno-optimize-sibling-calls
|
||||
else
|
||||
|
||||
@@ -340,7 +340,7 @@ static inline __attribute__ ((const)) int __fls(unsigned long x)
|
||||
/*
|
||||
* __ffs: Similar to ffs, but zero based (0-31)
|
||||
*/
|
||||
static inline __attribute__ ((const)) int __ffs(unsigned long word)
|
||||
static inline __attribute__ ((const)) unsigned long __ffs(unsigned long word)
|
||||
{
|
||||
if (!word)
|
||||
return word;
|
||||
@@ -400,9 +400,9 @@ static inline __attribute__ ((const)) int ffs(unsigned long x)
|
||||
/*
|
||||
* __ffs: Similar to ffs, but zero based (0-31)
|
||||
*/
|
||||
static inline __attribute__ ((const)) int __ffs(unsigned long x)
|
||||
static inline __attribute__ ((const)) unsigned long __ffs(unsigned long x)
|
||||
{
|
||||
int n;
|
||||
unsigned long n;
|
||||
|
||||
asm volatile(
|
||||
" ffs.f %0, %1 \n" /* 0:31; 31(Z) if src 0 */
|
||||
|
||||
@@ -49,6 +49,17 @@
|
||||
|
||||
#define ARCH_DMA_MINALIGN L1_CACHE_BYTES
|
||||
|
||||
/*
|
||||
* Make sure slab-allocated buffers are 64-bit aligned when atomic64_t uses
|
||||
* ARCv2 64-bit atomics (LLOCKD/SCONDD). This guarantess runtime 64-bit
|
||||
* alignment for any atomic64_t embedded in buffer.
|
||||
* Default ARCH_SLAB_MINALIGN is __alignof__(long long) which has a relaxed
|
||||
* value of 4 (and not 8) in ARC ABI.
|
||||
*/
|
||||
#if defined(CONFIG_ARC_HAS_LL64) && defined(CONFIG_ARC_HAS_LLSC)
|
||||
#define ARCH_SLAB_MINALIGN 8
|
||||
#endif
|
||||
|
||||
extern void arc_cache_init(void);
|
||||
extern char *arc_cache_mumbojumbo(int cpu_id, char *buf, int len);
|
||||
extern void read_decode_cache_bcr(void);
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
#include <asm/entry.h>
|
||||
#include <asm/arcregs.h>
|
||||
#include <asm/cache.h>
|
||||
#include <asm/irqflags.h>
|
||||
|
||||
.macro CPU_EARLY_SETUP
|
||||
|
||||
@@ -47,6 +48,15 @@
|
||||
sr r5, [ARC_REG_DC_CTRL]
|
||||
|
||||
1:
|
||||
|
||||
#ifdef CONFIG_ISA_ARCV2
|
||||
; Unaligned access is disabled at reset, so re-enable early as
|
||||
; gcc 7.3.1 (ARC GNU 2018.03) onwards generates unaligned access
|
||||
; by default
|
||||
lr r5, [status32]
|
||||
bset r5, r5, STATUS_AD_BIT
|
||||
kflag r5
|
||||
#endif
|
||||
.endm
|
||||
|
||||
.section .init.text, "ax",@progbits
|
||||
@@ -93,9 +103,9 @@ ENTRY(stext)
|
||||
#ifdef CONFIG_ARC_UBOOT_SUPPORT
|
||||
; Uboot - kernel ABI
|
||||
; r0 = [0] No uboot interaction, [1] cmdline in r2, [2] DTB in r2
|
||||
; r1 = magic number (board identity, unused as of now
|
||||
; r1 = magic number (always zero as of now)
|
||||
; r2 = pointer to uboot provided cmdline or external DTB in mem
|
||||
; These are handled later in setup_arch()
|
||||
; These are handled later in handle_uboot_args()
|
||||
st r0, [@uboot_tag]
|
||||
st r2, [@uboot_arg]
|
||||
#endif
|
||||
|
||||
@@ -381,43 +381,80 @@ void setup_processor(void)
|
||||
arc_chk_core_config();
|
||||
}
|
||||
|
||||
static inline int is_kernel(unsigned long addr)
|
||||
static inline bool uboot_arg_invalid(unsigned long addr)
|
||||
{
|
||||
if (addr >= (unsigned long)_stext && addr <= (unsigned long)_end)
|
||||
return 1;
|
||||
return 0;
|
||||
/*
|
||||
* Check that it is a untranslated address (although MMU is not enabled
|
||||
* yet, it being a high address ensures this is not by fluke)
|
||||
*/
|
||||
if (addr < PAGE_OFFSET)
|
||||
return true;
|
||||
|
||||
/* Check that address doesn't clobber resident kernel image */
|
||||
return addr >= (unsigned long)_stext && addr <= (unsigned long)_end;
|
||||
}
|
||||
|
||||
#define IGNORE_ARGS "Ignore U-boot args: "
|
||||
|
||||
/* uboot_tag values for U-boot - kernel ABI revision 0; see head.S */
|
||||
#define UBOOT_TAG_NONE 0
|
||||
#define UBOOT_TAG_CMDLINE 1
|
||||
#define UBOOT_TAG_DTB 2
|
||||
|
||||
void __init handle_uboot_args(void)
|
||||
{
|
||||
bool use_embedded_dtb = true;
|
||||
bool append_cmdline = false;
|
||||
|
||||
#ifdef CONFIG_ARC_UBOOT_SUPPORT
|
||||
/* check that we know this tag */
|
||||
if (uboot_tag != UBOOT_TAG_NONE &&
|
||||
uboot_tag != UBOOT_TAG_CMDLINE &&
|
||||
uboot_tag != UBOOT_TAG_DTB) {
|
||||
pr_warn(IGNORE_ARGS "invalid uboot tag: '%08x'\n", uboot_tag);
|
||||
goto ignore_uboot_args;
|
||||
}
|
||||
|
||||
if (uboot_tag != UBOOT_TAG_NONE &&
|
||||
uboot_arg_invalid((unsigned long)uboot_arg)) {
|
||||
pr_warn(IGNORE_ARGS "invalid uboot arg: '%px'\n", uboot_arg);
|
||||
goto ignore_uboot_args;
|
||||
}
|
||||
|
||||
/* see if U-boot passed an external Device Tree blob */
|
||||
if (uboot_tag == UBOOT_TAG_DTB) {
|
||||
machine_desc = setup_machine_fdt((void *)uboot_arg);
|
||||
|
||||
/* external Device Tree blob is invalid - use embedded one */
|
||||
use_embedded_dtb = !machine_desc;
|
||||
}
|
||||
|
||||
if (uboot_tag == UBOOT_TAG_CMDLINE)
|
||||
append_cmdline = true;
|
||||
|
||||
ignore_uboot_args:
|
||||
#endif
|
||||
|
||||
if (use_embedded_dtb) {
|
||||
machine_desc = setup_machine_fdt(__dtb_start);
|
||||
if (!machine_desc)
|
||||
panic("Embedded DT invalid\n");
|
||||
}
|
||||
|
||||
/*
|
||||
* NOTE: @boot_command_line is populated by setup_machine_fdt() so this
|
||||
* append processing can only happen after.
|
||||
*/
|
||||
if (append_cmdline) {
|
||||
/* Ensure a whitespace between the 2 cmdlines */
|
||||
strlcat(boot_command_line, " ", COMMAND_LINE_SIZE);
|
||||
strlcat(boot_command_line, uboot_arg, COMMAND_LINE_SIZE);
|
||||
}
|
||||
}
|
||||
|
||||
void __init setup_arch(char **cmdline_p)
|
||||
{
|
||||
#ifdef CONFIG_ARC_UBOOT_SUPPORT
|
||||
/* make sure that uboot passed pointer to cmdline/dtb is valid */
|
||||
if (uboot_tag && is_kernel((unsigned long)uboot_arg))
|
||||
panic("Invalid uboot arg\n");
|
||||
|
||||
/* See if u-boot passed an external Device Tree blob */
|
||||
machine_desc = setup_machine_fdt(uboot_arg); /* uboot_tag == 2 */
|
||||
if (!machine_desc)
|
||||
#endif
|
||||
{
|
||||
/* No, so try the embedded one */
|
||||
machine_desc = setup_machine_fdt(__dtb_start);
|
||||
if (!machine_desc)
|
||||
panic("Embedded DT invalid\n");
|
||||
|
||||
/*
|
||||
* If we are here, it is established that @uboot_arg didn't
|
||||
* point to DT blob. Instead if u-boot says it is cmdline,
|
||||
* append to embedded DT cmdline.
|
||||
* setup_machine_fdt() would have populated @boot_command_line
|
||||
*/
|
||||
if (uboot_tag == 1) {
|
||||
/* Ensure a whitespace between the 2 cmdlines */
|
||||
strlcat(boot_command_line, " ", COMMAND_LINE_SIZE);
|
||||
strlcat(boot_command_line, uboot_arg,
|
||||
COMMAND_LINE_SIZE);
|
||||
}
|
||||
}
|
||||
handle_uboot_args();
|
||||
|
||||
/* Save unparsed command line copy for /proc/cmdline */
|
||||
*cmdline_p = boot_command_line;
|
||||
|
||||
@@ -170,6 +170,9 @@
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <3>;
|
||||
interrupt-parent = <&gic>;
|
||||
clock-names = "clkout8";
|
||||
clocks = <&cmu CLK_FIN_PLL>;
|
||||
#clock-cells = <1>;
|
||||
};
|
||||
|
||||
mipi_phy: video-phy {
|
||||
|
||||
@@ -70,7 +70,7 @@
|
||||
};
|
||||
|
||||
emmc_pwrseq: pwrseq {
|
||||
pinctrl-0 = <&sd1_cd>;
|
||||
pinctrl-0 = <&emmc_rstn>;
|
||||
pinctrl-names = "default";
|
||||
compatible = "mmc-pwrseq-emmc";
|
||||
reset-gpios = <&gpk1 2 GPIO_ACTIVE_LOW>;
|
||||
@@ -161,12 +161,6 @@
|
||||
cpu0-supply = <&buck2_reg>;
|
||||
};
|
||||
|
||||
/* RSTN signal for eMMC */
|
||||
&sd1_cd {
|
||||
samsung,pin-pud = <EXYNOS_PIN_PULL_NONE>;
|
||||
samsung,pin-drv = <EXYNOS4_PIN_DRV_LV1>;
|
||||
};
|
||||
|
||||
&pinctrl_1 {
|
||||
gpio_power_key: power_key {
|
||||
samsung,pins = "gpx1-3";
|
||||
@@ -184,6 +178,11 @@
|
||||
samsung,pins = "gpx3-7";
|
||||
samsung,pin-pud = <EXYNOS_PIN_PULL_DOWN>;
|
||||
};
|
||||
|
||||
emmc_rstn: emmc-rstn {
|
||||
samsung,pins = "gpk1-2";
|
||||
samsung,pin-pud = <EXYNOS_PIN_PULL_NONE>;
|
||||
};
|
||||
};
|
||||
|
||||
&ehci {
|
||||
|
||||
25
arch/arm/boot/dts/exynos5420-tmu-sensor-conf.dtsi
Normal file
25
arch/arm/boot/dts/exynos5420-tmu-sensor-conf.dtsi
Normal file
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
* Device tree sources for Exynos5420 TMU sensor configuration
|
||||
*
|
||||
* Copyright (c) 2014 Lukasz Majewski <l.majewski@samsung.com>
|
||||
* Copyright (c) 2017 Krzysztof Kozlowski <krzk@kernel.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <dt-bindings/thermal/thermal_exynos.h>
|
||||
|
||||
#thermal-sensor-cells = <0>;
|
||||
samsung,tmu_gain = <8>;
|
||||
samsung,tmu_reference_voltage = <16>;
|
||||
samsung,tmu_noise_cancel_mode = <4>;
|
||||
samsung,tmu_efuse_value = <55>;
|
||||
samsung,tmu_min_efuse_value = <0>;
|
||||
samsung,tmu_max_efuse_value = <100>;
|
||||
samsung,tmu_first_point_trim = <25>;
|
||||
samsung,tmu_second_point_trim = <85>;
|
||||
samsung,tmu_default_temp_offset = <50>;
|
||||
samsung,tmu_cal_type = <TYPE_ONE_POINT_TRIMMING>;
|
||||
@@ -694,7 +694,7 @@
|
||||
interrupts = <0 65 0>;
|
||||
clocks = <&clock CLK_TMU>;
|
||||
clock-names = "tmu_apbif";
|
||||
#include "exynos4412-tmu-sensor-conf.dtsi"
|
||||
#include "exynos5420-tmu-sensor-conf.dtsi"
|
||||
};
|
||||
|
||||
tmu_cpu1: tmu@10064000 {
|
||||
@@ -703,7 +703,7 @@
|
||||
interrupts = <0 183 0>;
|
||||
clocks = <&clock CLK_TMU>;
|
||||
clock-names = "tmu_apbif";
|
||||
#include "exynos4412-tmu-sensor-conf.dtsi"
|
||||
#include "exynos5420-tmu-sensor-conf.dtsi"
|
||||
};
|
||||
|
||||
tmu_cpu2: tmu@10068000 {
|
||||
@@ -712,7 +712,7 @@
|
||||
interrupts = <0 184 0>;
|
||||
clocks = <&clock CLK_TMU>, <&clock CLK_TMU>;
|
||||
clock-names = "tmu_apbif", "tmu_triminfo_apbif";
|
||||
#include "exynos4412-tmu-sensor-conf.dtsi"
|
||||
#include "exynos5420-tmu-sensor-conf.dtsi"
|
||||
};
|
||||
|
||||
tmu_cpu3: tmu@1006c000 {
|
||||
@@ -721,7 +721,7 @@
|
||||
interrupts = <0 185 0>;
|
||||
clocks = <&clock CLK_TMU>, <&clock CLK_TMU_GPU>;
|
||||
clock-names = "tmu_apbif", "tmu_triminfo_apbif";
|
||||
#include "exynos4412-tmu-sensor-conf.dtsi"
|
||||
#include "exynos5420-tmu-sensor-conf.dtsi"
|
||||
};
|
||||
|
||||
tmu_gpu: tmu@100a0000 {
|
||||
@@ -730,7 +730,7 @@
|
||||
interrupts = <0 215 0>;
|
||||
clocks = <&clock CLK_TMU_GPU>, <&clock CLK_TMU>;
|
||||
clock-names = "tmu_apbif", "tmu_triminfo_apbif";
|
||||
#include "exynos4412-tmu-sensor-conf.dtsi"
|
||||
#include "exynos5420-tmu-sensor-conf.dtsi"
|
||||
};
|
||||
|
||||
sysmmu_g2dr: sysmmu@0x10A60000 {
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
* features make this path too inefficient.
|
||||
*/
|
||||
ret_fast_syscall:
|
||||
__ret_fast_syscall:
|
||||
UNWIND(.fnstart )
|
||||
UNWIND(.cantunwind )
|
||||
disable_irq_notrace @ disable interrupts
|
||||
@@ -61,6 +62,7 @@ fast_work_pending:
|
||||
* r0 first to avoid needing to save registers around each C function call.
|
||||
*/
|
||||
ret_fast_syscall:
|
||||
__ret_fast_syscall:
|
||||
UNWIND(.fnstart )
|
||||
UNWIND(.cantunwind )
|
||||
str r0, [sp, #S_R0 + S_OFF]! @ save returned r0
|
||||
@@ -233,7 +235,7 @@ local_restart:
|
||||
tst r10, #_TIF_SYSCALL_WORK @ are we tracing syscalls?
|
||||
bne __sys_trace
|
||||
|
||||
invoke_syscall tbl, scno, r10, ret_fast_syscall
|
||||
invoke_syscall tbl, scno, r10, __ret_fast_syscall
|
||||
|
||||
add r1, sp, #S_OFF
|
||||
2: cmp scno, #(__ARM_NR_BASE - __NR_SYSCALL_BASE)
|
||||
|
||||
0
arch/arm/kernel/process.c
Normal file → Executable file
0
arch/arm/kernel/process.c
Normal file → Executable file
@@ -237,8 +237,6 @@ static int pxa_ssp_remove(struct platform_device *pdev)
|
||||
if (ssp == NULL)
|
||||
return -ENODEV;
|
||||
|
||||
iounmap(ssp->mmio_base);
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
release_mem_region(res->start, resource_size(res));
|
||||
|
||||
@@ -248,7 +246,6 @@ static int pxa_ssp_remove(struct platform_device *pdev)
|
||||
list_del(&ssp->node);
|
||||
mutex_unlock(&ssp_lock);
|
||||
|
||||
kfree(ssp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -219,7 +219,7 @@
|
||||
compatible = "simple-bus";
|
||||
|
||||
intc: interrupt-controller@9bc0000 {
|
||||
compatible = "arm,gic-v3";
|
||||
compatible = "qcom,msm8996-gic-v3", "arm,gic-v3";
|
||||
#interrupt-cells = <3>;
|
||||
interrupt-controller;
|
||||
#redistributor-regions = <1>;
|
||||
|
||||
@@ -123,6 +123,7 @@ CONFIG_NF_CT_NETLINK=y
|
||||
CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y
|
||||
CONFIG_NETFILTER_XT_TARGET_CONNMARK=y
|
||||
CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=y
|
||||
CONFIG_NETFILTER_XT_TARGET_CT=y
|
||||
CONFIG_NETFILTER_XT_TARGET_IDLETIMER=y
|
||||
CONFIG_NETFILTER_XT_TARGET_MARK=y
|
||||
CONFIG_NETFILTER_XT_TARGET_NFLOG=y
|
||||
@@ -228,6 +229,7 @@ CONFIG_PPP_DEFLATE=y
|
||||
CONFIG_PPP_MPPE=y
|
||||
CONFIG_PPTP=y
|
||||
CONFIG_PPPOL2TP=y
|
||||
CONFIG_USB_RTL8152=y
|
||||
CONFIG_USB_USBNET=y
|
||||
# CONFIG_USB_NET_AX8817X is not set
|
||||
# CONFIG_USB_NET_AX88179_178A is not set
|
||||
@@ -301,6 +303,12 @@ CONFIG_DRM=y
|
||||
CONFIG_DRM_VIRTIO_GPU=y
|
||||
CONFIG_SOUND=y
|
||||
CONFIG_SND=y
|
||||
CONFIG_SND_HRTIMER=y
|
||||
# CONFIG_SND_SUPPORT_OLD_API is not set
|
||||
# CONFIG_SND_VERBOSE_PROCFS is not set
|
||||
# CONFIG_SND_DRIVERS is not set
|
||||
CONFIG_SND_INTEL8X0=y
|
||||
# CONFIG_SND_USB is not set
|
||||
CONFIG_HIDRAW=y
|
||||
CONFIG_UHID=y
|
||||
CONFIG_HID_A4TECH=y
|
||||
|
||||
@@ -81,24 +81,8 @@
|
||||
#include <linux/stringify.h>
|
||||
#include <asm/barrier.h>
|
||||
|
||||
#define read_gicreg(r) \
|
||||
({ \
|
||||
u64 reg; \
|
||||
asm volatile(DEFINE_MRS_S \
|
||||
"mrs_s %0, " __stringify(r) "\n" \
|
||||
UNDEFINE_MRS_S \
|
||||
: "=r" (reg)); \
|
||||
reg; \
|
||||
})
|
||||
|
||||
#define write_gicreg(v,r) \
|
||||
do { \
|
||||
u64 __val = (v); \
|
||||
asm volatile(DEFINE_MSR_S \
|
||||
"msr_s " __stringify(r) ", %0\n" \
|
||||
UNDEFINE_MSR_S \
|
||||
: : "r" (__val)); \
|
||||
} while (0)
|
||||
#define read_gicreg read_sysreg_s
|
||||
#define write_gicreg write_sysreg_s
|
||||
|
||||
/*
|
||||
* Low-level accessors
|
||||
@@ -109,19 +93,13 @@
|
||||
|
||||
static inline void gic_write_eoir(u32 irq)
|
||||
{
|
||||
asm volatile(DEFINE_MSR_S
|
||||
"msr_s " __stringify(ICC_EOIR1_EL1) ", %0\n"
|
||||
UNDEFINE_MSR_S
|
||||
: : "r" ((u64)irq));
|
||||
write_sysreg_s(irq, ICC_EOIR1_EL1);
|
||||
isb();
|
||||
}
|
||||
|
||||
static inline void gic_write_dir(u32 irq)
|
||||
{
|
||||
asm volatile(DEFINE_MSR_S
|
||||
"msr_s " __stringify(ICC_DIR_EL1) ", %0\n"
|
||||
UNDEFINE_MSR_S
|
||||
: : "r" ((u64)irq));
|
||||
write_sysreg_s(irq, ICC_DIR_EL1);
|
||||
isb();
|
||||
}
|
||||
|
||||
@@ -129,10 +107,7 @@ static inline u64 gic_read_iar_common(void)
|
||||
{
|
||||
u64 irqstat;
|
||||
|
||||
asm volatile(DEFINE_MRS_S
|
||||
"mrs_s %0, " __stringify(ICC_IAR1_EL1) "\n"
|
||||
UNDEFINE_MRS_S
|
||||
: "=r" (irqstat));
|
||||
irqstat = read_sysreg_s(ICC_IAR1_EL1);
|
||||
dsb(sy);
|
||||
return irqstat;
|
||||
}
|
||||
@@ -150,12 +125,12 @@ static inline u64 gic_read_iar_cavium_thunderx(void)
|
||||
|
||||
asm volatile(
|
||||
"nop;nop;nop;nop\n\t"
|
||||
"nop;nop;nop;nop\n\t"
|
||||
DEFINE_MRS_S
|
||||
"mrs_s %0, " __stringify(ICC_IAR1_EL1) "\n\t"
|
||||
UNDEFINE_MRS_S
|
||||
"nop;nop;nop;nop"
|
||||
: "=r" (irqstat));
|
||||
"nop;nop;nop;nop");
|
||||
|
||||
irqstat = read_sysreg_s(ICC_IAR1_EL1);
|
||||
|
||||
asm volatile(
|
||||
"nop;nop;nop;nop");
|
||||
mb();
|
||||
|
||||
return irqstat;
|
||||
@@ -163,68 +138,40 @@ static inline u64 gic_read_iar_cavium_thunderx(void)
|
||||
|
||||
static inline void gic_write_pmr(u32 val)
|
||||
{
|
||||
asm volatile(DEFINE_MSR_S
|
||||
"msr_s " __stringify(ICC_PMR_EL1) ", %0\n"
|
||||
UNDEFINE_MSR_S
|
||||
: : "r" ((u64)val));
|
||||
/* As per the architecture specification */
|
||||
mb();
|
||||
write_sysreg_s(val, ICC_PMR_EL1);
|
||||
}
|
||||
|
||||
static inline void gic_write_ctlr(u32 val)
|
||||
{
|
||||
asm volatile(DEFINE_MSR_S
|
||||
"msr_s " __stringify(ICC_CTLR_EL1) ", %0\n"
|
||||
UNDEFINE_MSR_S
|
||||
: : "r" ((u64)val));
|
||||
write_sysreg_s(val, ICC_CTLR_EL1);
|
||||
isb();
|
||||
}
|
||||
|
||||
static inline void gic_write_grpen1(u32 val)
|
||||
{
|
||||
asm volatile(DEFINE_MSR_S
|
||||
"msr_s " __stringify(ICC_GRPEN1_EL1) ", %0\n"
|
||||
UNDEFINE_MSR_S
|
||||
: : "r" ((u64)val));
|
||||
write_sysreg_s(val, ICC_GRPEN1_EL1);
|
||||
isb();
|
||||
}
|
||||
|
||||
static inline void gic_write_sgi1r(u64 val)
|
||||
{
|
||||
asm volatile(DEFINE_MSR_S
|
||||
"msr_s " __stringify(ICC_SGI1R_EL1) ", %0\n"
|
||||
UNDEFINE_MSR_S
|
||||
: : "r" (val));
|
||||
/* As per the architecture specification */
|
||||
mb();
|
||||
write_sysreg_s(val, ICC_SGI1R_EL1);
|
||||
}
|
||||
|
||||
static inline u32 gic_read_sre(void)
|
||||
{
|
||||
u64 val;
|
||||
|
||||
asm volatile(DEFINE_MRS_S
|
||||
"mrs_s %0, " __stringify(ICC_SRE_EL1) "\n"
|
||||
UNDEFINE_MRS_S
|
||||
: "=r" (val));
|
||||
return val;
|
||||
return read_sysreg_s(ICC_SRE_EL1);
|
||||
}
|
||||
|
||||
static inline void gic_write_sre(u32 val)
|
||||
{
|
||||
asm volatile(DEFINE_MSR_S
|
||||
"msr_s " __stringify(ICC_SRE_EL1) ", %0\n"
|
||||
UNDEFINE_MSR_S
|
||||
: : "r" ((u64)val));
|
||||
write_sysreg_s(val, ICC_SRE_EL1);
|
||||
isb();
|
||||
}
|
||||
|
||||
static inline void gic_write_bpr1(u32 val)
|
||||
{
|
||||
asm volatile(DEFINE_MSR_S
|
||||
"msr_s " __stringify(ICC_BPR1_EL1) ", %x0\n"
|
||||
UNDEFINE_MSR_S
|
||||
: : "rZ" (val));
|
||||
write_sysreg_s(val, ICC_BPR1_EL1);
|
||||
}
|
||||
|
||||
#define gic_read_typer(c) readq_relaxed_no_log(c)
|
||||
|
||||
@@ -546,13 +546,13 @@ bool arch_within_kprobe_blacklist(unsigned long addr)
|
||||
addr < (unsigned long)__entry_text_end) ||
|
||||
(addr >= (unsigned long)__idmap_text_start &&
|
||||
addr < (unsigned long)__idmap_text_end) ||
|
||||
(addr >= (unsigned long)__hyp_text_start &&
|
||||
addr < (unsigned long)__hyp_text_end) ||
|
||||
!!search_exception_tables(addr))
|
||||
return true;
|
||||
|
||||
if (!is_kernel_in_hyp_mode()) {
|
||||
if ((addr >= (unsigned long)__hyp_text_start &&
|
||||
addr < (unsigned long)__hyp_text_end) ||
|
||||
(addr >= (unsigned long)__hyp_idmap_text_start &&
|
||||
if ((addr >= (unsigned long)__hyp_idmap_text_start &&
|
||||
addr < (unsigned long)__hyp_idmap_text_end))
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -74,6 +74,7 @@ CONFIG_SERIAL_8250_CONSOLE=y
|
||||
# CONFIG_SERIAL_8250_PCI is not set
|
||||
CONFIG_SERIAL_8250_NR_UARTS=1
|
||||
CONFIG_SERIAL_8250_RUNTIME_UARTS=1
|
||||
CONFIG_SERIAL_OF_PLATFORM=y
|
||||
CONFIG_SERIAL_AR933X=y
|
||||
CONFIG_SERIAL_AR933X_CONSOLE=y
|
||||
# CONFIG_HW_RANDOM is not set
|
||||
|
||||
@@ -71,14 +71,15 @@ static int __init vdma_init(void)
|
||||
get_order(VDMA_PGTBL_SIZE));
|
||||
BUG_ON(!pgtbl);
|
||||
dma_cache_wback_inv((unsigned long)pgtbl, VDMA_PGTBL_SIZE);
|
||||
pgtbl = (VDMA_PGTBL_ENTRY *)KSEG1ADDR(pgtbl);
|
||||
pgtbl = (VDMA_PGTBL_ENTRY *)CKSEG1ADDR((unsigned long)pgtbl);
|
||||
|
||||
/*
|
||||
* Clear the R4030 translation table
|
||||
*/
|
||||
vdma_pgtbl_init();
|
||||
|
||||
r4030_write_reg32(JAZZ_R4030_TRSTBL_BASE, CPHYSADDR(pgtbl));
|
||||
r4030_write_reg32(JAZZ_R4030_TRSTBL_BASE,
|
||||
CPHYSADDR((unsigned long)pgtbl));
|
||||
r4030_write_reg32(JAZZ_R4030_TRSTBL_LIM, VDMA_PGTBL_SIZE);
|
||||
r4030_write_reg32(JAZZ_R4030_TRSTBL_INV, 0);
|
||||
|
||||
|
||||
@@ -52,6 +52,7 @@ asmlinkage void spurious_interrupt(void)
|
||||
void __init init_IRQ(void)
|
||||
{
|
||||
int i;
|
||||
unsigned int order = get_order(IRQ_STACK_SIZE);
|
||||
|
||||
for (i = 0; i < NR_IRQS; i++)
|
||||
irq_set_noprobe(i);
|
||||
@@ -62,8 +63,7 @@ void __init init_IRQ(void)
|
||||
arch_init_irq();
|
||||
|
||||
for_each_possible_cpu(i) {
|
||||
int irq_pages = IRQ_STACK_SIZE / PAGE_SIZE;
|
||||
void *s = (void *)__get_free_pages(GFP_KERNEL, irq_pages);
|
||||
void *s = (void *)__get_free_pages(GFP_KERNEL, order);
|
||||
|
||||
irq_stack[i] = s;
|
||||
pr_debug("CPU%d IRQ stack at 0x%p - 0x%p\n", i,
|
||||
|
||||
@@ -344,7 +344,7 @@ static inline int is_sp_move_ins(union mips_instruction *ip)
|
||||
static int get_frame_info(struct mips_frame_info *info)
|
||||
{
|
||||
bool is_mmips = IS_ENABLED(CONFIG_CPU_MICROMIPS);
|
||||
union mips_instruction insn, *ip, *ip_end;
|
||||
union mips_instruction insn, *ip;
|
||||
const unsigned int max_insns = 128;
|
||||
unsigned int last_insn_size = 0;
|
||||
unsigned int i;
|
||||
@@ -356,10 +356,9 @@ static int get_frame_info(struct mips_frame_info *info)
|
||||
if (!ip)
|
||||
goto err;
|
||||
|
||||
ip_end = (void *)ip + info->func_size;
|
||||
|
||||
for (i = 0; i < max_insns && ip < ip_end; i++) {
|
||||
for (i = 0; i < max_insns; i++) {
|
||||
ip = (void *)ip + last_insn_size;
|
||||
|
||||
if (is_mmips && mm_insn_16bit(ip->halfword[0])) {
|
||||
insn.halfword[0] = 0;
|
||||
insn.halfword[1] = ip->halfword[0];
|
||||
|
||||
@@ -311,15 +311,29 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
|
||||
|
||||
long do_syscall_trace_enter(struct pt_regs *regs)
|
||||
{
|
||||
if (test_thread_flag(TIF_SYSCALL_TRACE) &&
|
||||
tracehook_report_syscall_entry(regs)) {
|
||||
if (test_thread_flag(TIF_SYSCALL_TRACE)) {
|
||||
int rc = tracehook_report_syscall_entry(regs);
|
||||
|
||||
/*
|
||||
* Tracing decided this syscall should not happen or the
|
||||
* debugger stored an invalid system call number. Skip
|
||||
* the system call and the system call restart handling.
|
||||
* As tracesys_next does not set %r28 to -ENOSYS
|
||||
* when %r20 is set to -1, initialize it here.
|
||||
*/
|
||||
regs->gr[20] = -1UL;
|
||||
goto out;
|
||||
regs->gr[28] = -ENOSYS;
|
||||
|
||||
if (rc) {
|
||||
/*
|
||||
* A nonzero return code from
|
||||
* tracehook_report_syscall_entry() tells us
|
||||
* to prevent the syscall execution. Skip
|
||||
* the syscall call and the syscall restart handling.
|
||||
*
|
||||
* Note that the tracer may also just change
|
||||
* regs->gr[20] to an invalid syscall number,
|
||||
* that is handled by tracesys_next.
|
||||
*/
|
||||
regs->gr[20] = -1UL;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
/* Do the secure computing check after ptrace. */
|
||||
@@ -343,7 +357,6 @@ long do_syscall_trace_enter(struct pt_regs *regs)
|
||||
regs->gr[24] & 0xffffffff,
|
||||
regs->gr[23] & 0xffffffff);
|
||||
|
||||
out:
|
||||
/*
|
||||
* Sign extend the syscall number to 64bit since it may have been
|
||||
* modified by a compat ptrace call
|
||||
|
||||
@@ -508,7 +508,7 @@ static unsigned long epapr_hypercall(unsigned long *in,
|
||||
|
||||
static inline long epapr_hypercall0_1(unsigned int nr, unsigned long *r2)
|
||||
{
|
||||
unsigned long in[8];
|
||||
unsigned long in[8] = {0};
|
||||
unsigned long out[8];
|
||||
unsigned long r;
|
||||
|
||||
@@ -520,7 +520,7 @@ static inline long epapr_hypercall0_1(unsigned int nr, unsigned long *r2)
|
||||
|
||||
static inline long epapr_hypercall0(unsigned int nr)
|
||||
{
|
||||
unsigned long in[8];
|
||||
unsigned long in[8] = {0};
|
||||
unsigned long out[8];
|
||||
|
||||
return epapr_hypercall(in, out, nr);
|
||||
@@ -528,7 +528,7 @@ static inline long epapr_hypercall0(unsigned int nr)
|
||||
|
||||
static inline long epapr_hypercall1(unsigned int nr, unsigned long p1)
|
||||
{
|
||||
unsigned long in[8];
|
||||
unsigned long in[8] = {0};
|
||||
unsigned long out[8];
|
||||
|
||||
in[0] = p1;
|
||||
@@ -538,7 +538,7 @@ static inline long epapr_hypercall1(unsigned int nr, unsigned long p1)
|
||||
static inline long epapr_hypercall2(unsigned int nr, unsigned long p1,
|
||||
unsigned long p2)
|
||||
{
|
||||
unsigned long in[8];
|
||||
unsigned long in[8] = {0};
|
||||
unsigned long out[8];
|
||||
|
||||
in[0] = p1;
|
||||
@@ -549,7 +549,7 @@ static inline long epapr_hypercall2(unsigned int nr, unsigned long p1,
|
||||
static inline long epapr_hypercall3(unsigned int nr, unsigned long p1,
|
||||
unsigned long p2, unsigned long p3)
|
||||
{
|
||||
unsigned long in[8];
|
||||
unsigned long in[8] = {0};
|
||||
unsigned long out[8];
|
||||
|
||||
in[0] = p1;
|
||||
@@ -562,7 +562,7 @@ static inline long epapr_hypercall4(unsigned int nr, unsigned long p1,
|
||||
unsigned long p2, unsigned long p3,
|
||||
unsigned long p4)
|
||||
{
|
||||
unsigned long in[8];
|
||||
unsigned long in[8] = {0};
|
||||
unsigned long out[8];
|
||||
|
||||
in[0] = p1;
|
||||
|
||||
@@ -34,6 +34,7 @@ KBUILD_CFLAGS += $(cflags-y)
|
||||
KBUILD_CFLAGS += -mno-mmx -mno-sse
|
||||
KBUILD_CFLAGS += $(call cc-option,-ffreestanding)
|
||||
KBUILD_CFLAGS += $(call cc-option,-fno-stack-protector)
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning, address-of-packed-member)
|
||||
|
||||
KBUILD_AFLAGS := $(KBUILD_CFLAGS) -D__ASSEMBLY__
|
||||
GCOV_PROFILE := n
|
||||
|
||||
@@ -99,6 +99,7 @@ CONFIG_SYN_COOKIES=y
|
||||
CONFIG_NET_IPVTI=y
|
||||
CONFIG_INET_ESP=y
|
||||
# CONFIG_INET_XFRM_MODE_BEET is not set
|
||||
CONFIG_INET_UDP_DIAG=y
|
||||
CONFIG_INET_DIAG_DESTROY=y
|
||||
CONFIG_TCP_CONG_ADVANCED=y
|
||||
# CONFIG_TCP_CONG_BIC is not set
|
||||
@@ -134,6 +135,7 @@ CONFIG_NF_CT_NETLINK=y
|
||||
CONFIG_NETFILTER_XT_TARGET_CLASSIFY=y
|
||||
CONFIG_NETFILTER_XT_TARGET_CONNMARK=y
|
||||
CONFIG_NETFILTER_XT_TARGET_CONNSECMARK=y
|
||||
CONFIG_NETFILTER_XT_TARGET_CT=y
|
||||
CONFIG_NETFILTER_XT_TARGET_IDLETIMER=y
|
||||
CONFIG_NETFILTER_XT_TARGET_MARK=y
|
||||
CONFIG_NETFILTER_XT_TARGET_NFLOG=y
|
||||
@@ -244,6 +246,7 @@ CONFIG_PPP_DEFLATE=y
|
||||
CONFIG_PPP_MPPE=y
|
||||
CONFIG_PPPOLAC=y
|
||||
CONFIG_PPPOPNS=y
|
||||
CONFIG_USB_RTL8152=y
|
||||
CONFIG_USB_USBNET=y
|
||||
# CONFIG_USB_NET_AX8817X is not set
|
||||
# CONFIG_USB_NET_AX88179_178A is not set
|
||||
@@ -326,6 +329,12 @@ CONFIG_DRM_VIRTIO_GPU=y
|
||||
CONFIG_FB=y
|
||||
CONFIG_SOUND=y
|
||||
CONFIG_SND=y
|
||||
CONFIG_SND_HRTIMER=y
|
||||
# CONFIG_SND_SUPPORT_OLD_API is not set
|
||||
# CONFIG_SND_VERBOSE_PROCFS is not set
|
||||
# CONFIG_SND_DRIVERS is not set
|
||||
CONFIG_SND_INTEL8X0=y
|
||||
# CONFIG_SND_USB is not set
|
||||
CONFIG_HIDRAW=y
|
||||
CONFIG_UHID=y
|
||||
CONFIG_HID_A4TECH=y
|
||||
|
||||
@@ -1942,7 +1942,7 @@ static int x86_pmu_commit_txn(struct pmu *pmu)
|
||||
*/
|
||||
static void free_fake_cpuc(struct cpu_hw_events *cpuc)
|
||||
{
|
||||
kfree(cpuc->shared_regs);
|
||||
intel_cpuc_finish(cpuc);
|
||||
kfree(cpuc);
|
||||
}
|
||||
|
||||
@@ -1954,14 +1954,11 @@ static struct cpu_hw_events *allocate_fake_cpuc(void)
|
||||
cpuc = kzalloc(sizeof(*cpuc), GFP_KERNEL);
|
||||
if (!cpuc)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
/* only needed, if we have extra_regs */
|
||||
if (x86_pmu.extra_regs) {
|
||||
cpuc->shared_regs = allocate_shared_regs(cpu);
|
||||
if (!cpuc->shared_regs)
|
||||
goto error;
|
||||
}
|
||||
cpuc->is_fake = 1;
|
||||
|
||||
if (intel_cpuc_prepare(cpuc, cpu))
|
||||
goto error;
|
||||
|
||||
return cpuc;
|
||||
error:
|
||||
free_fake_cpuc(cpuc);
|
||||
|
||||
@@ -2492,6 +2492,35 @@ intel_stop_scheduling(struct cpu_hw_events *cpuc)
|
||||
raw_spin_unlock(&excl_cntrs->lock);
|
||||
}
|
||||
|
||||
static struct event_constraint *
|
||||
dyn_constraint(struct cpu_hw_events *cpuc, struct event_constraint *c, int idx)
|
||||
{
|
||||
WARN_ON_ONCE(!cpuc->constraint_list);
|
||||
|
||||
if (!(c->flags & PERF_X86_EVENT_DYNAMIC)) {
|
||||
struct event_constraint *cx;
|
||||
|
||||
/*
|
||||
* grab pre-allocated constraint entry
|
||||
*/
|
||||
cx = &cpuc->constraint_list[idx];
|
||||
|
||||
/*
|
||||
* initialize dynamic constraint
|
||||
* with static constraint
|
||||
*/
|
||||
*cx = *c;
|
||||
|
||||
/*
|
||||
* mark constraint as dynamic
|
||||
*/
|
||||
cx->flags |= PERF_X86_EVENT_DYNAMIC;
|
||||
c = cx;
|
||||
}
|
||||
|
||||
return c;
|
||||
}
|
||||
|
||||
static struct event_constraint *
|
||||
intel_get_excl_constraints(struct cpu_hw_events *cpuc, struct perf_event *event,
|
||||
int idx, struct event_constraint *c)
|
||||
@@ -2522,27 +2551,7 @@ intel_get_excl_constraints(struct cpu_hw_events *cpuc, struct perf_event *event,
|
||||
* only needed when constraint has not yet
|
||||
* been cloned (marked dynamic)
|
||||
*/
|
||||
if (!(c->flags & PERF_X86_EVENT_DYNAMIC)) {
|
||||
struct event_constraint *cx;
|
||||
|
||||
/*
|
||||
* grab pre-allocated constraint entry
|
||||
*/
|
||||
cx = &cpuc->constraint_list[idx];
|
||||
|
||||
/*
|
||||
* initialize dynamic constraint
|
||||
* with static constraint
|
||||
*/
|
||||
*cx = *c;
|
||||
|
||||
/*
|
||||
* mark constraint as dynamic, so we
|
||||
* can free it later on
|
||||
*/
|
||||
cx->flags |= PERF_X86_EVENT_DYNAMIC;
|
||||
c = cx;
|
||||
}
|
||||
c = dyn_constraint(cpuc, c, idx);
|
||||
|
||||
/*
|
||||
* From here on, the constraint is dynamic.
|
||||
@@ -3093,7 +3102,7 @@ ssize_t intel_event_sysfs_show(char *page, u64 config)
|
||||
return x86_event_sysfs_show(page, config, event);
|
||||
}
|
||||
|
||||
struct intel_shared_regs *allocate_shared_regs(int cpu)
|
||||
static struct intel_shared_regs *allocate_shared_regs(int cpu)
|
||||
{
|
||||
struct intel_shared_regs *regs;
|
||||
int i;
|
||||
@@ -3125,10 +3134,9 @@ static struct intel_excl_cntrs *allocate_excl_cntrs(int cpu)
|
||||
return c;
|
||||
}
|
||||
|
||||
static int intel_pmu_cpu_prepare(int cpu)
|
||||
{
|
||||
struct cpu_hw_events *cpuc = &per_cpu(cpu_hw_events, cpu);
|
||||
|
||||
int intel_cpuc_prepare(struct cpu_hw_events *cpuc, int cpu)
|
||||
{
|
||||
if (x86_pmu.extra_regs || x86_pmu.lbr_sel_map) {
|
||||
cpuc->shared_regs = allocate_shared_regs(cpu);
|
||||
if (!cpuc->shared_regs)
|
||||
@@ -3138,7 +3146,7 @@ static int intel_pmu_cpu_prepare(int cpu)
|
||||
if (x86_pmu.flags & PMU_FL_EXCL_CNTRS) {
|
||||
size_t sz = X86_PMC_IDX_MAX * sizeof(struct event_constraint);
|
||||
|
||||
cpuc->constraint_list = kzalloc(sz, GFP_KERNEL);
|
||||
cpuc->constraint_list = kzalloc_node(sz, GFP_KERNEL, cpu_to_node(cpu));
|
||||
if (!cpuc->constraint_list)
|
||||
goto err_shared_regs;
|
||||
|
||||
@@ -3163,6 +3171,11 @@ err:
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
static int intel_pmu_cpu_prepare(int cpu)
|
||||
{
|
||||
return intel_cpuc_prepare(&per_cpu(cpu_hw_events, cpu), cpu);
|
||||
}
|
||||
|
||||
static void intel_pmu_cpu_starting(int cpu)
|
||||
{
|
||||
struct cpu_hw_events *cpuc = &per_cpu(cpu_hw_events, cpu);
|
||||
@@ -3218,9 +3231,8 @@ static void intel_pmu_cpu_starting(int cpu)
|
||||
}
|
||||
}
|
||||
|
||||
static void free_excl_cntrs(int cpu)
|
||||
static void free_excl_cntrs(struct cpu_hw_events *cpuc)
|
||||
{
|
||||
struct cpu_hw_events *cpuc = &per_cpu(cpu_hw_events, cpu);
|
||||
struct intel_excl_cntrs *c;
|
||||
|
||||
c = cpuc->excl_cntrs;
|
||||
@@ -3238,9 +3250,8 @@ static void intel_pmu_cpu_dying(int cpu)
|
||||
fini_debug_store_on_cpu(cpu);
|
||||
}
|
||||
|
||||
static void intel_pmu_cpu_dead(int cpu)
|
||||
void intel_cpuc_finish(struct cpu_hw_events *cpuc)
|
||||
{
|
||||
struct cpu_hw_events *cpuc = &per_cpu(cpu_hw_events, cpu);
|
||||
struct intel_shared_regs *pc;
|
||||
|
||||
pc = cpuc->shared_regs;
|
||||
@@ -3250,7 +3261,12 @@ static void intel_pmu_cpu_dead(int cpu)
|
||||
cpuc->shared_regs = NULL;
|
||||
}
|
||||
|
||||
free_excl_cntrs(cpu);
|
||||
free_excl_cntrs(cpuc);
|
||||
}
|
||||
|
||||
static void intel_pmu_cpu_dead(int cpu)
|
||||
{
|
||||
intel_cpuc_finish(&per_cpu(cpu_hw_events, cpu));
|
||||
}
|
||||
|
||||
static void intel_pmu_sched_task(struct perf_event_context *ctx,
|
||||
@@ -4132,7 +4148,7 @@ static __init int fixup_ht_bug(void)
|
||||
get_online_cpus();
|
||||
|
||||
for_each_online_cpu(c) {
|
||||
free_excl_cntrs(c);
|
||||
free_excl_cntrs(&per_cpu(cpu_hw_events, c));
|
||||
}
|
||||
|
||||
put_online_cpus();
|
||||
|
||||
@@ -865,7 +865,8 @@ struct event_constraint *
|
||||
x86_get_event_constraints(struct cpu_hw_events *cpuc, int idx,
|
||||
struct perf_event *event);
|
||||
|
||||
struct intel_shared_regs *allocate_shared_regs(int cpu);
|
||||
extern int intel_cpuc_prepare(struct cpu_hw_events *cpuc, int cpu);
|
||||
extern void intel_cpuc_finish(struct cpu_hw_events *cpuc);
|
||||
|
||||
int intel_pmu_init(void);
|
||||
|
||||
@@ -995,9 +996,13 @@ static inline int intel_pmu_init(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline struct intel_shared_regs *allocate_shared_regs(int cpu)
|
||||
static inline int intel_cpuc_prepare(struct cpu_hw_event *cpuc, int cpu)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void intel_cpuc_finish(struct cpu_hw_event *cpuc)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline int is_ht_workaround_enabled(void)
|
||||
|
||||
@@ -314,6 +314,7 @@
|
||||
/* Intel-defined CPU features, CPUID level 0x00000007:0 (EDX), word 18 */
|
||||
#define X86_FEATURE_AVX512_4VNNIW (18*32+ 2) /* AVX-512 Neural Network Instructions */
|
||||
#define X86_FEATURE_AVX512_4FMAPS (18*32+ 3) /* AVX-512 Multiply Accumulation Single precision */
|
||||
#define X86_FEATURE_TSX_FORCE_ABORT (18*32+13) /* "" TSX_FORCE_ABORT */
|
||||
#define X86_FEATURE_PCONFIG (18*32+18) /* Intel PCONFIG */
|
||||
#define X86_FEATURE_SPEC_CTRL (18*32+26) /* "" Speculation Control (IBRS + IBPB) */
|
||||
#define X86_FEATURE_INTEL_STIBP (18*32+27) /* "" Single Thread Indirect Branch Predictors */
|
||||
|
||||
@@ -575,6 +575,12 @@
|
||||
|
||||
#define MSR_IA32_TSC_DEADLINE 0x000006E0
|
||||
|
||||
|
||||
#define MSR_TSX_FORCE_ABORT 0x0000010F
|
||||
|
||||
#define MSR_TFA_RTM_FORCE_ABORT_BIT 0
|
||||
#define MSR_TFA_RTM_FORCE_ABORT BIT_ULL(MSR_TFA_RTM_FORCE_ABORT_BIT)
|
||||
|
||||
/* P4/Xeon+ specific */
|
||||
#define MSR_IA32_MCG_EAX 0x00000180
|
||||
#define MSR_IA32_MCG_EBX 0x00000181
|
||||
|
||||
@@ -6,7 +6,11 @@
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_KASAN
|
||||
#ifdef CONFIG_KASAN_EXTRA
|
||||
#define KASAN_STACK_ORDER 2
|
||||
#else
|
||||
#define KASAN_STACK_ORDER 1
|
||||
#endif
|
||||
#else
|
||||
#define KASAN_STACK_ORDER 0
|
||||
#endif
|
||||
|
||||
@@ -298,8 +298,7 @@ do { \
|
||||
__put_user_asm(x, ptr, retval, "l", "k", "ir", errret); \
|
||||
break; \
|
||||
case 8: \
|
||||
__put_user_asm_u64((__typeof__(*ptr))(x), ptr, retval, \
|
||||
errret); \
|
||||
__put_user_asm_u64(x, ptr, retval, errret); \
|
||||
break; \
|
||||
default: \
|
||||
__put_user_bad(); \
|
||||
@@ -433,8 +432,10 @@ do { \
|
||||
#define __put_user_nocheck(x, ptr, size) \
|
||||
({ \
|
||||
int __pu_err; \
|
||||
__typeof__(*(ptr)) __pu_val; \
|
||||
__pu_val = x; \
|
||||
__uaccess_begin(); \
|
||||
__put_user_size((x), (ptr), (size), __pu_err, -EFAULT); \
|
||||
__put_user_size(__pu_val, (ptr), (size), __pu_err, -EFAULT);\
|
||||
__uaccess_end(); \
|
||||
__builtin_expect(__pu_err, 0); \
|
||||
})
|
||||
|
||||
@@ -765,11 +765,9 @@ static void init_amd_bd(struct cpuinfo_x86 *c)
|
||||
static void init_amd_zn(struct cpuinfo_x86 *c)
|
||||
{
|
||||
set_cpu_cap(c, X86_FEATURE_ZEN);
|
||||
/*
|
||||
* Fix erratum 1076: CPB feature bit not being set in CPUID. It affects
|
||||
* all up to and including B1.
|
||||
*/
|
||||
if (c->x86_model <= 1 && c->x86_stepping <= 1)
|
||||
|
||||
/* Fix erratum 1076: CPB feature bit not being set in CPUID. */
|
||||
if (!cpu_has(c, X86_FEATURE_CPB))
|
||||
set_cpu_cap(c, X86_FEATURE_CPB);
|
||||
}
|
||||
|
||||
|
||||
@@ -167,6 +167,9 @@ setup_efi_state(struct boot_params *params, unsigned long params_load_addr,
|
||||
struct efi_info *current_ei = &boot_params.efi_info;
|
||||
struct efi_info *ei = ¶ms->efi_info;
|
||||
|
||||
if (!efi_enabled(EFI_RUNTIME_SERVICES))
|
||||
return 0;
|
||||
|
||||
if (!current_ei->efi_memmap_size)
|
||||
return 0;
|
||||
|
||||
|
||||
@@ -2862,6 +2862,14 @@ static int nested_svm_vmexit(struct vcpu_svm *svm)
|
||||
kvm_mmu_reset_context(&svm->vcpu);
|
||||
kvm_mmu_load(&svm->vcpu);
|
||||
|
||||
/*
|
||||
* Drop what we picked up for L2 via svm_complete_interrupts() so it
|
||||
* doesn't end up in L1.
|
||||
*/
|
||||
svm->vcpu.arch.nmi_injected = false;
|
||||
kvm_clear_exception_queue(&svm->vcpu);
|
||||
kvm_clear_interrupt_queue(&svm->vcpu);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -3932,25 +3940,14 @@ static int avic_incomplete_ipi_interception(struct vcpu_svm *svm)
|
||||
kvm_lapic_reg_write(apic, APIC_ICR, icrl);
|
||||
break;
|
||||
case AVIC_IPI_FAILURE_TARGET_NOT_RUNNING: {
|
||||
int i;
|
||||
struct kvm_vcpu *vcpu;
|
||||
struct kvm *kvm = svm->vcpu.kvm;
|
||||
struct kvm_lapic *apic = svm->vcpu.arch.apic;
|
||||
|
||||
/*
|
||||
* At this point, we expect that the AVIC HW has already
|
||||
* set the appropriate IRR bits on the valid target
|
||||
* vcpus. So, we just need to kick the appropriate vcpu.
|
||||
* Update ICR high and low, then emulate sending IPI,
|
||||
* which is handled when writing APIC_ICR.
|
||||
*/
|
||||
kvm_for_each_vcpu(i, vcpu, kvm) {
|
||||
bool m = kvm_apic_match_dest(vcpu, apic,
|
||||
icrl & KVM_APIC_SHORT_MASK,
|
||||
GET_APIC_DEST_FIELD(icrh),
|
||||
icrl & KVM_APIC_DEST_MASK);
|
||||
|
||||
if (m && !avic_vcpu_is_running(vcpu))
|
||||
kvm_vcpu_wake_up(vcpu);
|
||||
}
|
||||
kvm_lapic_reg_write(apic, APIC_ICR2, icrh);
|
||||
kvm_lapic_reg_write(apic, APIC_ICR, icrl);
|
||||
break;
|
||||
}
|
||||
case AVIC_IPI_FAILURE_INVALID_TARGET:
|
||||
|
||||
@@ -34,6 +34,7 @@ CONFIG_SMP=y
|
||||
CONFIG_HOTPLUG_CPU=y
|
||||
# CONFIG_INITIALIZE_XTENSA_MMU_INSIDE_VMLINUX is not set
|
||||
# CONFIG_PCI is not set
|
||||
CONFIG_VECTORS_OFFSET=0x00002000
|
||||
CONFIG_XTENSA_PLATFORM_XTFPGA=y
|
||||
CONFIG_CMDLINE_BOOL=y
|
||||
CONFIG_CMDLINE="earlycon=uart8250,mmio32native,0xfd050020,115200n8 console=ttyS0,115200n8 ip=dhcp root=/dev/nfs rw debug memmap=96M@0"
|
||||
|
||||
@@ -281,12 +281,13 @@ should_never_return:
|
||||
|
||||
movi a2, cpu_start_ccount
|
||||
1:
|
||||
memw
|
||||
l32i a3, a2, 0
|
||||
beqi a3, 0, 1b
|
||||
movi a3, 0
|
||||
s32i a3, a2, 0
|
||||
memw
|
||||
1:
|
||||
memw
|
||||
l32i a3, a2, 0
|
||||
beqi a3, 0, 1b
|
||||
wsr a3, ccount
|
||||
@@ -323,11 +324,13 @@ ENTRY(cpu_restart)
|
||||
rsr a0, prid
|
||||
neg a2, a0
|
||||
movi a3, cpu_start_id
|
||||
memw
|
||||
s32i a2, a3, 0
|
||||
#if XCHAL_DCACHE_IS_WRITEBACK
|
||||
dhwbi a3, 0
|
||||
#endif
|
||||
1:
|
||||
memw
|
||||
l32i a2, a3, 0
|
||||
dhi a3, 0
|
||||
bne a2, a0, 1b
|
||||
|
||||
@@ -80,7 +80,7 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
|
||||
{
|
||||
unsigned i;
|
||||
|
||||
for (i = 0; i < max_cpus; ++i)
|
||||
for_each_possible_cpu(i)
|
||||
set_cpu_present(i, true);
|
||||
}
|
||||
|
||||
@@ -93,6 +93,11 @@ void __init smp_init_cpus(void)
|
||||
pr_info("%s: Core Count = %d\n", __func__, ncpus);
|
||||
pr_info("%s: Core Id = %d\n", __func__, core_id);
|
||||
|
||||
if (ncpus > NR_CPUS) {
|
||||
ncpus = NR_CPUS;
|
||||
pr_info("%s: limiting core count by %d\n", __func__, ncpus);
|
||||
}
|
||||
|
||||
for (i = 0; i < ncpus; ++i)
|
||||
set_cpu_possible(i, true);
|
||||
}
|
||||
@@ -192,9 +197,11 @@ static int boot_secondary(unsigned int cpu, struct task_struct *ts)
|
||||
int i;
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
cpu_start_id = cpu;
|
||||
system_flush_invalidate_dcache_range(
|
||||
(unsigned long)&cpu_start_id, sizeof(cpu_start_id));
|
||||
WRITE_ONCE(cpu_start_id, cpu);
|
||||
/* Pairs with the third memw in the cpu_restart */
|
||||
mb();
|
||||
system_flush_invalidate_dcache_range((unsigned long)&cpu_start_id,
|
||||
sizeof(cpu_start_id));
|
||||
#endif
|
||||
smp_call_function_single(0, mx_cpu_start, (void *)cpu, 1);
|
||||
|
||||
@@ -203,18 +210,21 @@ static int boot_secondary(unsigned int cpu, struct task_struct *ts)
|
||||
ccount = get_ccount();
|
||||
while (!ccount);
|
||||
|
||||
cpu_start_ccount = ccount;
|
||||
WRITE_ONCE(cpu_start_ccount, ccount);
|
||||
|
||||
while (time_before(jiffies, timeout)) {
|
||||
do {
|
||||
/*
|
||||
* Pairs with the first two memws in the
|
||||
* .Lboot_secondary.
|
||||
*/
|
||||
mb();
|
||||
if (!cpu_start_ccount)
|
||||
break;
|
||||
}
|
||||
ccount = READ_ONCE(cpu_start_ccount);
|
||||
} while (ccount && time_before(jiffies, timeout));
|
||||
|
||||
if (cpu_start_ccount) {
|
||||
if (ccount) {
|
||||
smp_call_function_single(0, mx_cpu_stop,
|
||||
(void *)cpu, 1);
|
||||
cpu_start_ccount = 0;
|
||||
(void *)cpu, 1);
|
||||
WRITE_ONCE(cpu_start_ccount, 0);
|
||||
return -EIO;
|
||||
}
|
||||
}
|
||||
@@ -234,6 +244,7 @@ int __cpu_up(unsigned int cpu, struct task_struct *idle)
|
||||
pr_debug("%s: Calling wakeup_secondary(cpu:%d, idle:%p, sp: %08lx)\n",
|
||||
__func__, cpu, idle, start_info.stack);
|
||||
|
||||
init_completion(&cpu_running);
|
||||
ret = boot_secondary(cpu, idle);
|
||||
if (ret == 0) {
|
||||
wait_for_completion_timeout(&cpu_running,
|
||||
@@ -295,8 +306,10 @@ void __cpu_die(unsigned int cpu)
|
||||
unsigned long timeout = jiffies + msecs_to_jiffies(1000);
|
||||
while (time_before(jiffies, timeout)) {
|
||||
system_invalidate_dcache_range((unsigned long)&cpu_start_id,
|
||||
sizeof(cpu_start_id));
|
||||
if (cpu_start_id == -cpu) {
|
||||
sizeof(cpu_start_id));
|
||||
/* Pairs with the second memw in the cpu_restart */
|
||||
mb();
|
||||
if (READ_ONCE(cpu_start_id) == -cpu) {
|
||||
platform_cpu_kill(cpu);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -89,7 +89,7 @@ static int ccount_timer_shutdown(struct clock_event_device *evt)
|
||||
container_of(evt, struct ccount_timer, evt);
|
||||
|
||||
if (timer->irq_enabled) {
|
||||
disable_irq(evt->irq);
|
||||
disable_irq_nosync(evt->irq);
|
||||
timer->irq_enabled = 0;
|
||||
}
|
||||
return 0;
|
||||
|
||||
@@ -359,6 +359,7 @@ struct binder_error {
|
||||
* @min_priority: minimum scheduling priority
|
||||
* (invariant after initialized)
|
||||
* @inherit_rt: inherit RT scheduling policy from caller
|
||||
* @txn_security_ctx: require sender's security context
|
||||
* (invariant after initialized)
|
||||
* @async_todo: list of async work items
|
||||
* (protected by @proc->inner_lock)
|
||||
@@ -398,6 +399,7 @@ struct binder_node {
|
||||
u8 sched_policy:2;
|
||||
u8 inherit_rt:1;
|
||||
u8 accept_fds:1;
|
||||
u8 txn_security_ctx:1;
|
||||
u8 min_priority;
|
||||
};
|
||||
bool has_async_transaction;
|
||||
@@ -655,6 +657,7 @@ struct binder_transaction {
|
||||
struct binder_priority saved_priority;
|
||||
bool set_priority_called;
|
||||
kuid_t sender_euid;
|
||||
binder_uintptr_t security_ctx;
|
||||
/**
|
||||
* @lock: protects @from, @to_proc, and @to_thread
|
||||
*
|
||||
@@ -1364,6 +1367,7 @@ static struct binder_node *binder_init_node_ilocked(
|
||||
node->min_priority = to_kernel_prio(node->sched_policy, priority);
|
||||
node->accept_fds = !!(flags & FLAT_BINDER_FLAG_ACCEPTS_FDS);
|
||||
node->inherit_rt = !!(flags & FLAT_BINDER_FLAG_INHERIT_RT);
|
||||
node->txn_security_ctx = !!(flags & FLAT_BINDER_FLAG_TXN_SECURITY_CTX);
|
||||
spin_lock_init(&node->lock);
|
||||
INIT_LIST_HEAD(&node->work.entry);
|
||||
INIT_LIST_HEAD(&node->async_todo);
|
||||
@@ -2902,6 +2906,8 @@ static void binder_transaction(struct binder_proc *proc,
|
||||
binder_size_t last_fixup_min_off = 0;
|
||||
struct binder_context *context = proc->context;
|
||||
int t_debug_id = atomic_inc_return(&binder_last_id);
|
||||
char *secctx = NULL;
|
||||
u32 secctx_sz = 0;
|
||||
|
||||
e = binder_transaction_log_add(&binder_transaction_log);
|
||||
e->debug_id = t_debug_id;
|
||||
@@ -3125,6 +3131,20 @@ static void binder_transaction(struct binder_proc *proc,
|
||||
t->priority = target_proc->default_priority;
|
||||
}
|
||||
|
||||
if (target_node && target_node->txn_security_ctx) {
|
||||
u32 secid;
|
||||
|
||||
security_task_getsecid(proc->tsk, &secid);
|
||||
ret = security_secid_to_secctx(secid, &secctx, &secctx_sz);
|
||||
if (ret) {
|
||||
return_error = BR_FAILED_REPLY;
|
||||
return_error_param = ret;
|
||||
return_error_line = __LINE__;
|
||||
goto err_get_secctx_failed;
|
||||
}
|
||||
extra_buffers_size += ALIGN(secctx_sz, sizeof(u64));
|
||||
}
|
||||
|
||||
trace_binder_transaction(reply, t, target_node);
|
||||
|
||||
t->buffer = binder_alloc_new_buf(&target_proc->alloc, tr->data_size,
|
||||
@@ -3141,6 +3161,19 @@ static void binder_transaction(struct binder_proc *proc,
|
||||
t->buffer = NULL;
|
||||
goto err_binder_alloc_buf_failed;
|
||||
}
|
||||
if (secctx) {
|
||||
size_t buf_offset = ALIGN(tr->data_size, sizeof(void *)) +
|
||||
ALIGN(tr->offsets_size, sizeof(void *)) +
|
||||
ALIGN(extra_buffers_size, sizeof(void *)) -
|
||||
ALIGN(secctx_sz, sizeof(u64));
|
||||
char *kptr = t->buffer->data + buf_offset;
|
||||
|
||||
t->security_ctx = (uintptr_t)kptr +
|
||||
binder_alloc_get_user_buffer_offset(&target_proc->alloc);
|
||||
memcpy(kptr, secctx, secctx_sz);
|
||||
security_release_secctx(secctx, secctx_sz);
|
||||
secctx = NULL;
|
||||
}
|
||||
t->buffer->debug_id = t->debug_id;
|
||||
t->buffer->transaction = t;
|
||||
t->buffer->target_node = target_node;
|
||||
@@ -3411,6 +3444,9 @@ err_copy_data_failed:
|
||||
t->buffer->transaction = NULL;
|
||||
binder_alloc_free_buf(&target_proc->alloc, t->buffer);
|
||||
err_binder_alloc_buf_failed:
|
||||
if (secctx)
|
||||
security_release_secctx(secctx, secctx_sz);
|
||||
err_get_secctx_failed:
|
||||
kfree(tcomplete);
|
||||
binder_stats_deleted(BINDER_STAT_TRANSACTION_COMPLETE);
|
||||
err_alloc_tcomplete_failed:
|
||||
@@ -4057,11 +4093,13 @@ retry:
|
||||
|
||||
while (1) {
|
||||
uint32_t cmd;
|
||||
struct binder_transaction_data tr;
|
||||
struct binder_transaction_data_secctx tr;
|
||||
struct binder_transaction_data *trd = &tr.transaction_data;
|
||||
struct binder_work *w = NULL;
|
||||
struct list_head *list = NULL;
|
||||
struct binder_transaction *t = NULL;
|
||||
struct binder_thread *t_from;
|
||||
size_t trsize = sizeof(*trd);
|
||||
|
||||
binder_inner_proc_lock(proc);
|
||||
if (!binder_worklist_empty_ilocked(&thread->todo))
|
||||
@@ -4257,41 +4295,47 @@ retry:
|
||||
struct binder_node *target_node = t->buffer->target_node;
|
||||
struct binder_priority node_prio;
|
||||
|
||||
tr.target.ptr = target_node->ptr;
|
||||
tr.cookie = target_node->cookie;
|
||||
trd->target.ptr = target_node->ptr;
|
||||
trd->cookie = target_node->cookie;
|
||||
node_prio.sched_policy = target_node->sched_policy;
|
||||
node_prio.prio = target_node->min_priority;
|
||||
binder_transaction_priority(current, t, node_prio,
|
||||
target_node->inherit_rt);
|
||||
cmd = BR_TRANSACTION;
|
||||
} else {
|
||||
tr.target.ptr = 0;
|
||||
tr.cookie = 0;
|
||||
trd->target.ptr = 0;
|
||||
trd->cookie = 0;
|
||||
cmd = BR_REPLY;
|
||||
}
|
||||
tr.code = t->code;
|
||||
tr.flags = t->flags;
|
||||
tr.sender_euid = from_kuid(current_user_ns(), t->sender_euid);
|
||||
trd->code = t->code;
|
||||
trd->flags = t->flags;
|
||||
trd->sender_euid = from_kuid(current_user_ns(), t->sender_euid);
|
||||
|
||||
t_from = binder_get_txn_from(t);
|
||||
if (t_from) {
|
||||
struct task_struct *sender = t_from->proc->tsk;
|
||||
|
||||
tr.sender_pid = task_tgid_nr_ns(sender,
|
||||
task_active_pid_ns(current));
|
||||
trd->sender_pid =
|
||||
task_tgid_nr_ns(sender,
|
||||
task_active_pid_ns(current));
|
||||
} else {
|
||||
tr.sender_pid = 0;
|
||||
trd->sender_pid = 0;
|
||||
}
|
||||
|
||||
tr.data_size = t->buffer->data_size;
|
||||
tr.offsets_size = t->buffer->offsets_size;
|
||||
tr.data.ptr.buffer = (binder_uintptr_t)
|
||||
trd->data_size = t->buffer->data_size;
|
||||
trd->offsets_size = t->buffer->offsets_size;
|
||||
trd->data.ptr.buffer = (binder_uintptr_t)
|
||||
((uintptr_t)t->buffer->data +
|
||||
binder_alloc_get_user_buffer_offset(&proc->alloc));
|
||||
tr.data.ptr.offsets = tr.data.ptr.buffer +
|
||||
trd->data.ptr.offsets = trd->data.ptr.buffer +
|
||||
ALIGN(t->buffer->data_size,
|
||||
sizeof(void *));
|
||||
|
||||
tr.secctx = t->security_ctx;
|
||||
if (t->security_ctx) {
|
||||
cmd = BR_TRANSACTION_SEC_CTX;
|
||||
trsize = sizeof(tr);
|
||||
}
|
||||
if (put_user(cmd, (uint32_t __user *)ptr)) {
|
||||
if (t_from)
|
||||
binder_thread_dec_tmpref(t_from);
|
||||
@@ -4302,7 +4346,7 @@ retry:
|
||||
return -EFAULT;
|
||||
}
|
||||
ptr += sizeof(uint32_t);
|
||||
if (copy_to_user(ptr, &tr, sizeof(tr))) {
|
||||
if (copy_to_user(ptr, &tr, trsize)) {
|
||||
if (t_from)
|
||||
binder_thread_dec_tmpref(t_from);
|
||||
|
||||
@@ -4311,7 +4355,7 @@ retry:
|
||||
|
||||
return -EFAULT;
|
||||
}
|
||||
ptr += sizeof(tr);
|
||||
ptr += trsize;
|
||||
|
||||
trace_binder_transaction_received(t);
|
||||
binder_stat_br(proc, thread, cmd);
|
||||
@@ -4319,16 +4363,18 @@ retry:
|
||||
"%d:%d %s %d %d:%d, cmd %d size %zd-%zd ptr %016llx-%016llx\n",
|
||||
proc->pid, thread->pid,
|
||||
(cmd == BR_TRANSACTION) ? "BR_TRANSACTION" :
|
||||
"BR_REPLY",
|
||||
(cmd == BR_TRANSACTION_SEC_CTX) ?
|
||||
"BR_TRANSACTION_SEC_CTX" : "BR_REPLY",
|
||||
t->debug_id, t_from ? t_from->proc->pid : 0,
|
||||
t_from ? t_from->pid : 0, cmd,
|
||||
t->buffer->data_size, t->buffer->offsets_size,
|
||||
(u64)tr.data.ptr.buffer, (u64)tr.data.ptr.offsets);
|
||||
(u64)trd->data.ptr.buffer,
|
||||
(u64)trd->data.ptr.offsets);
|
||||
|
||||
if (t_from)
|
||||
binder_thread_dec_tmpref(t_from);
|
||||
t->buffer->allow_user_free = 1;
|
||||
if (cmd == BR_TRANSACTION && !(t->flags & TF_ONE_WAY)) {
|
||||
if (cmd != BR_REPLY && !(t->flags & TF_ONE_WAY)) {
|
||||
binder_inner_proc_lock(thread->proc);
|
||||
t->to_parent = thread->transaction_stack;
|
||||
t->to_thread = thread;
|
||||
@@ -4673,7 +4719,8 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int binder_ioctl_set_ctx_mgr(struct file *filp)
|
||||
static int binder_ioctl_set_ctx_mgr(struct file *filp,
|
||||
struct flat_binder_object *fbo)
|
||||
{
|
||||
int ret = 0;
|
||||
struct binder_proc *proc = filp->private_data;
|
||||
@@ -4702,7 +4749,7 @@ static int binder_ioctl_set_ctx_mgr(struct file *filp)
|
||||
} else {
|
||||
context->binder_context_mgr_uid = curr_euid;
|
||||
}
|
||||
new_node = binder_new_node(proc, NULL);
|
||||
new_node = binder_new_node(proc, fbo);
|
||||
if (!new_node) {
|
||||
ret = -ENOMEM;
|
||||
goto out;
|
||||
@@ -4824,8 +4871,20 @@ static long binder_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
|
||||
binder_inner_proc_unlock(proc);
|
||||
break;
|
||||
}
|
||||
case BINDER_SET_CONTEXT_MGR_EXT: {
|
||||
struct flat_binder_object fbo;
|
||||
|
||||
if (copy_from_user(&fbo, ubuf, sizeof(fbo))) {
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
ret = binder_ioctl_set_ctx_mgr(filp, &fbo);
|
||||
if (ret)
|
||||
goto err;
|
||||
break;
|
||||
}
|
||||
case BINDER_SET_CONTEXT_MGR:
|
||||
ret = binder_ioctl_set_ctx_mgr(filp);
|
||||
ret = binder_ioctl_set_ctx_mgr(filp, NULL);
|
||||
if (ret)
|
||||
goto err;
|
||||
break;
|
||||
|
||||
@@ -717,7 +717,7 @@ static int he_init_cs_block_rcm(struct he_dev *he_dev)
|
||||
instead of '/ 512', use '>> 9' to prevent a call
|
||||
to divdu3 on x86 platforms
|
||||
*/
|
||||
rate_cps = (unsigned long long) (1 << exp) * (man + 512) >> 9;
|
||||
rate_cps = (unsigned long long) (1UL << exp) * (man + 512) >> 9;
|
||||
|
||||
if (rate_cps < 10)
|
||||
rate_cps = 10; /* 2.2.1 minimum payload rate is 10 cps */
|
||||
|
||||
@@ -81,6 +81,7 @@
|
||||
#include <asm/uaccess.h>
|
||||
|
||||
static DEFINE_IDR(loop_index_idr);
|
||||
static DEFINE_MUTEX(loop_index_mutex);
|
||||
static DEFINE_MUTEX(loop_ctl_mutex);
|
||||
|
||||
static int max_part;
|
||||
@@ -1616,11 +1617,9 @@ static int lo_compat_ioctl(struct block_device *bdev, fmode_t mode,
|
||||
static int lo_open(struct block_device *bdev, fmode_t mode)
|
||||
{
|
||||
struct loop_device *lo;
|
||||
int err;
|
||||
int err = 0;
|
||||
|
||||
err = mutex_lock_killable(&loop_ctl_mutex);
|
||||
if (err)
|
||||
return err;
|
||||
mutex_lock(&loop_index_mutex);
|
||||
lo = bdev->bd_disk->private_data;
|
||||
if (!lo) {
|
||||
err = -ENXIO;
|
||||
@@ -1629,20 +1628,18 @@ static int lo_open(struct block_device *bdev, fmode_t mode)
|
||||
|
||||
atomic_inc(&lo->lo_refcnt);
|
||||
out:
|
||||
mutex_unlock(&loop_ctl_mutex);
|
||||
mutex_unlock(&loop_index_mutex);
|
||||
return err;
|
||||
}
|
||||
|
||||
static void lo_release(struct gendisk *disk, fmode_t mode)
|
||||
static void __lo_release(struct loop_device *lo)
|
||||
{
|
||||
struct loop_device *lo;
|
||||
int err;
|
||||
|
||||
mutex_lock(&loop_ctl_mutex);
|
||||
lo = disk->private_data;
|
||||
if (atomic_dec_return(&lo->lo_refcnt))
|
||||
goto out_unlock;
|
||||
return;
|
||||
|
||||
mutex_lock(&loop_ctl_mutex);
|
||||
if (lo->lo_flags & LO_FLAGS_AUTOCLEAR) {
|
||||
/*
|
||||
* In autoclear mode, stop the loop thread
|
||||
@@ -1659,10 +1656,16 @@ static void lo_release(struct gendisk *disk, fmode_t mode)
|
||||
loop_flush(lo);
|
||||
}
|
||||
|
||||
out_unlock:
|
||||
mutex_unlock(&loop_ctl_mutex);
|
||||
}
|
||||
|
||||
static void lo_release(struct gendisk *disk, fmode_t mode)
|
||||
{
|
||||
mutex_lock(&loop_index_mutex);
|
||||
__lo_release(disk->private_data);
|
||||
mutex_unlock(&loop_index_mutex);
|
||||
}
|
||||
|
||||
static const struct block_device_operations lo_fops = {
|
||||
.owner = THIS_MODULE,
|
||||
.open = lo_open,
|
||||
@@ -1947,7 +1950,7 @@ static struct kobject *loop_probe(dev_t dev, int *part, void *data)
|
||||
struct kobject *kobj;
|
||||
int err;
|
||||
|
||||
mutex_lock(&loop_ctl_mutex);
|
||||
mutex_lock(&loop_index_mutex);
|
||||
err = loop_lookup(&lo, MINOR(dev) >> part_shift);
|
||||
if (err < 0)
|
||||
err = loop_add(&lo, MINOR(dev) >> part_shift);
|
||||
@@ -1955,7 +1958,7 @@ static struct kobject *loop_probe(dev_t dev, int *part, void *data)
|
||||
kobj = NULL;
|
||||
else
|
||||
kobj = get_disk(lo->lo_disk);
|
||||
mutex_unlock(&loop_ctl_mutex);
|
||||
mutex_unlock(&loop_index_mutex);
|
||||
|
||||
*part = 0;
|
||||
return kobj;
|
||||
@@ -1965,13 +1968,9 @@ static long loop_control_ioctl(struct file *file, unsigned int cmd,
|
||||
unsigned long parm)
|
||||
{
|
||||
struct loop_device *lo;
|
||||
int ret;
|
||||
int ret = -ENOSYS;
|
||||
|
||||
ret = mutex_lock_killable(&loop_ctl_mutex);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = -ENOSYS;
|
||||
mutex_lock(&loop_index_mutex);
|
||||
switch (cmd) {
|
||||
case LOOP_CTL_ADD:
|
||||
ret = loop_lookup(&lo, parm);
|
||||
@@ -1985,15 +1984,19 @@ static long loop_control_ioctl(struct file *file, unsigned int cmd,
|
||||
ret = loop_lookup(&lo, parm);
|
||||
if (ret < 0)
|
||||
break;
|
||||
mutex_lock(&loop_ctl_mutex);
|
||||
if (lo->lo_state != Lo_unbound) {
|
||||
ret = -EBUSY;
|
||||
mutex_unlock(&loop_ctl_mutex);
|
||||
break;
|
||||
}
|
||||
if (atomic_read(&lo->lo_refcnt) > 0) {
|
||||
ret = -EBUSY;
|
||||
mutex_unlock(&loop_ctl_mutex);
|
||||
break;
|
||||
}
|
||||
lo->lo_disk->private_data = NULL;
|
||||
mutex_unlock(&loop_ctl_mutex);
|
||||
idr_remove(&loop_index_idr, lo->lo_number);
|
||||
loop_remove(lo);
|
||||
break;
|
||||
@@ -2003,7 +2006,7 @@ static long loop_control_ioctl(struct file *file, unsigned int cmd,
|
||||
break;
|
||||
ret = loop_add(&lo, -1);
|
||||
}
|
||||
mutex_unlock(&loop_ctl_mutex);
|
||||
mutex_unlock(&loop_index_mutex);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -2086,10 +2089,10 @@ static int __init loop_init(void)
|
||||
THIS_MODULE, loop_probe, NULL, NULL);
|
||||
|
||||
/* pre-create number of devices given by config or max_loop */
|
||||
mutex_lock(&loop_ctl_mutex);
|
||||
mutex_lock(&loop_index_mutex);
|
||||
for (i = 0; i < nr; i++)
|
||||
loop_add(&lo, i);
|
||||
mutex_unlock(&loop_ctl_mutex);
|
||||
mutex_unlock(&loop_index_mutex);
|
||||
|
||||
printk(KERN_INFO "loop: module loaded\n");
|
||||
return 0;
|
||||
|
||||
@@ -32,6 +32,7 @@
|
||||
#include <linux/wait.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/nospec.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/uaccess.h>
|
||||
@@ -386,7 +387,11 @@ static ssize_t ac_write(struct file *file, const char __user *buf, size_t count,
|
||||
TicCard = st_loc.tic_des_from_pc; /* tic number to send */
|
||||
IndexCard = NumCard - 1;
|
||||
|
||||
if((NumCard < 1) || (NumCard > MAX_BOARD) || !apbs[IndexCard].RamIO)
|
||||
if (IndexCard >= MAX_BOARD)
|
||||
return -EINVAL;
|
||||
IndexCard = array_index_nospec(IndexCard, MAX_BOARD);
|
||||
|
||||
if (!apbs[IndexCard].RamIO)
|
||||
return -EINVAL;
|
||||
|
||||
#ifdef DEBUG
|
||||
@@ -697,6 +702,7 @@ static long ac_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
unsigned char IndexCard;
|
||||
void __iomem *pmem;
|
||||
int ret = 0;
|
||||
static int warncount = 10;
|
||||
volatile unsigned char byte_reset_it;
|
||||
struct st_ram_io *adgl;
|
||||
void __user *argp = (void __user *)arg;
|
||||
@@ -711,16 +717,12 @@ static long ac_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
mutex_lock(&ac_mutex);
|
||||
IndexCard = adgl->num_card-1;
|
||||
|
||||
if(cmd != 6 && ((IndexCard >= MAX_BOARD) || !apbs[IndexCard].RamIO)) {
|
||||
static int warncount = 10;
|
||||
if (warncount) {
|
||||
printk( KERN_WARNING "APPLICOM driver IOCTL, bad board number %d\n",(int)IndexCard+1);
|
||||
warncount--;
|
||||
}
|
||||
kfree(adgl);
|
||||
mutex_unlock(&ac_mutex);
|
||||
return -EINVAL;
|
||||
}
|
||||
if (cmd != 6 && IndexCard >= MAX_BOARD)
|
||||
goto err;
|
||||
IndexCard = array_index_nospec(IndexCard, MAX_BOARD);
|
||||
|
||||
if (cmd != 6 && !apbs[IndexCard].RamIO)
|
||||
goto err;
|
||||
|
||||
switch (cmd) {
|
||||
|
||||
@@ -838,5 +840,16 @@ static long ac_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
|
||||
kfree(adgl);
|
||||
mutex_unlock(&ac_mutex);
|
||||
return 0;
|
||||
|
||||
err:
|
||||
if (warncount) {
|
||||
pr_warn("APPLICOM driver IOCTL, bad board number %d\n",
|
||||
(int)IndexCard + 1);
|
||||
warncount--;
|
||||
}
|
||||
kfree(adgl);
|
||||
mutex_unlock(&ac_mutex);
|
||||
return -EINVAL;
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -574,7 +574,7 @@ static inline unsigned long hpet_time_div(struct hpets *hpets,
|
||||
}
|
||||
|
||||
static int
|
||||
hpet_ioctl_common(struct hpet_dev *devp, int cmd, unsigned long arg,
|
||||
hpet_ioctl_common(struct hpet_dev *devp, unsigned int cmd, unsigned long arg,
|
||||
struct hpet_info *info)
|
||||
{
|
||||
struct hpet_timer __iomem *timer;
|
||||
|
||||
@@ -445,7 +445,7 @@ static void __cpufreq_notify_transition(struct cpufreq_policy *policy,
|
||||
(unsigned long)freqs->new, (unsigned long)freqs->cpu);
|
||||
trace_cpu_frequency(freqs->new, freqs->cpu);
|
||||
cpufreq_stats_record_transition(policy, freqs->new);
|
||||
cpufreq_times_record_transition(freqs);
|
||||
cpufreq_times_record_transition(policy, freqs->new);
|
||||
srcu_notifier_call_chain(&cpufreq_transition_notifier_list,
|
||||
CPUFREQ_POSTCHANGE, freqs);
|
||||
if (likely(policy) && likely(policy->cpu == freqs->cpu))
|
||||
@@ -644,13 +644,13 @@ EXPORT_SYMBOL_GPL(cpufreq_driver_resolve_freq);
|
||||
* SYSFS INTERFACE *
|
||||
*********************************************************************/
|
||||
static ssize_t show_boost(struct kobject *kobj,
|
||||
struct attribute *attr, char *buf)
|
||||
struct kobj_attribute *attr, char *buf)
|
||||
{
|
||||
return sprintf(buf, "%d\n", cpufreq_driver->boost_enabled);
|
||||
}
|
||||
|
||||
static ssize_t store_boost(struct kobject *kobj, struct attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
static ssize_t store_boost(struct kobject *kobj, struct kobj_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
int ret, enable;
|
||||
|
||||
@@ -1957,9 +1957,14 @@ EXPORT_SYMBOL(cpufreq_unregister_notifier);
|
||||
unsigned int cpufreq_driver_fast_switch(struct cpufreq_policy *policy,
|
||||
unsigned int target_freq)
|
||||
{
|
||||
int ret;
|
||||
target_freq = clamp_val(target_freq, policy->min, policy->max);
|
||||
|
||||
return cpufreq_driver->fast_switch(policy, target_freq);
|
||||
ret = cpufreq_driver->fast_switch(policy, target_freq);
|
||||
if (ret)
|
||||
cpufreq_times_record_transition(policy, ret);
|
||||
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(cpufreq_driver_fast_switch);
|
||||
|
||||
|
||||
8
drivers/cpufreq/cpufreq_interactive.c
Normal file → Executable file
8
drivers/cpufreq/cpufreq_interactive.c
Normal file → Executable file
@@ -1429,7 +1429,7 @@ static ssize_t store_use_migration_notif(
|
||||
*/
|
||||
#define show_gov_pol_sys(file_name) \
|
||||
static ssize_t show_##file_name##_gov_sys \
|
||||
(struct kobject *kobj, struct attribute *attr, char *buf) \
|
||||
(struct kobject *kobj, struct kobj_attribute *attr, char *buf) \
|
||||
{ \
|
||||
return show_##file_name(common_tunables, buf); \
|
||||
} \
|
||||
@@ -1442,7 +1442,7 @@ static ssize_t show_##file_name##_gov_pol \
|
||||
|
||||
#define store_gov_pol_sys(file_name) \
|
||||
static ssize_t store_##file_name##_gov_sys \
|
||||
(struct kobject *kobj, struct attribute *attr, const char *buf, \
|
||||
(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, \
|
||||
size_t count) \
|
||||
{ \
|
||||
return store_##file_name(common_tunables, buf, count); \
|
||||
@@ -1478,7 +1478,7 @@ show_store_gov_pol_sys(fast_ramp_down);
|
||||
show_store_gov_pol_sys(enable_prediction);
|
||||
|
||||
#define gov_sys_attr_rw(_name) \
|
||||
static struct global_attr _name##_gov_sys = \
|
||||
static struct kobj_attribute _name##_gov_sys = \
|
||||
__ATTR(_name, 0644, show_##_name##_gov_sys, store_##_name##_gov_sys)
|
||||
|
||||
#define gov_pol_attr_rw(_name) \
|
||||
@@ -1507,7 +1507,7 @@ gov_sys_pol_attr_rw(ignore_hispeed_on_notif);
|
||||
gov_sys_pol_attr_rw(fast_ramp_down);
|
||||
gov_sys_pol_attr_rw(enable_prediction);
|
||||
|
||||
static struct global_attr boostpulse_gov_sys =
|
||||
static struct kobj_attribute boostpulse_gov_sys =
|
||||
__ATTR(boostpulse, 0200, NULL, store_boostpulse_gov_sys);
|
||||
|
||||
static struct freq_attr boostpulse_gov_pol =
|
||||
|
||||
@@ -139,27 +139,10 @@ static struct uid_entry *find_or_register_uid_locked(uid_t uid)
|
||||
return uid_entry;
|
||||
}
|
||||
|
||||
static bool freq_index_invalid(unsigned int index)
|
||||
{
|
||||
unsigned int cpu;
|
||||
struct cpu_freqs *freqs;
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
freqs = all_freqs[cpu];
|
||||
if (!freqs || index < freqs->offset ||
|
||||
freqs->offset + freqs->max_state <= index)
|
||||
continue;
|
||||
return freqs->freq_table[index - freqs->offset] ==
|
||||
CPUFREQ_ENTRY_INVALID;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static int single_uid_time_in_state_show(struct seq_file *m, void *ptr)
|
||||
{
|
||||
struct uid_entry *uid_entry;
|
||||
unsigned int i;
|
||||
u64 time;
|
||||
uid_t uid = from_kuid_munged(current_user_ns(), *(kuid_t *)m->private);
|
||||
|
||||
if (uid == overflowuid)
|
||||
@@ -174,9 +157,7 @@ static int single_uid_time_in_state_show(struct seq_file *m, void *ptr)
|
||||
}
|
||||
|
||||
for (i = 0; i < uid_entry->max_state; ++i) {
|
||||
if (freq_index_invalid(i))
|
||||
continue;
|
||||
time = cputime_to_clock_t(uid_entry->time_in_state[i]);
|
||||
u64 time = cputime_to_clock_t(uid_entry->time_in_state[i]);
|
||||
seq_write(m, &time, sizeof(time));
|
||||
}
|
||||
|
||||
@@ -195,10 +176,12 @@ static void *uid_seq_start(struct seq_file *seq, loff_t *pos)
|
||||
|
||||
static void *uid_seq_next(struct seq_file *seq, void *v, loff_t *pos)
|
||||
{
|
||||
(*pos)++;
|
||||
do {
|
||||
(*pos)++;
|
||||
|
||||
if (*pos >= HASH_SIZE(uid_hash_table))
|
||||
return NULL;
|
||||
if (*pos >= HASH_SIZE(uid_hash_table))
|
||||
return NULL;
|
||||
} while (hlist_empty(&uid_hash_table[*pos]));
|
||||
|
||||
return &uid_hash_table[*pos];
|
||||
}
|
||||
@@ -219,10 +202,8 @@ static int uid_time_in_state_seq_show(struct seq_file *m, void *v)
|
||||
continue;
|
||||
last_freqs = freqs;
|
||||
for (i = 0; i < freqs->max_state; i++) {
|
||||
if (freqs->freq_table[i] ==
|
||||
CPUFREQ_ENTRY_INVALID)
|
||||
continue;
|
||||
seq_printf(m, " %d", freqs->freq_table[i]);
|
||||
seq_put_decimal_ull(m, " ",
|
||||
freqs->freq_table[i]);
|
||||
}
|
||||
}
|
||||
seq_putc(m, '\n');
|
||||
@@ -231,13 +212,14 @@ static int uid_time_in_state_seq_show(struct seq_file *m, void *v)
|
||||
rcu_read_lock();
|
||||
|
||||
hlist_for_each_entry_rcu(uid_entry, (struct hlist_head *)v, hash) {
|
||||
if (uid_entry->max_state)
|
||||
seq_printf(m, "%d:", uid_entry->uid);
|
||||
if (uid_entry->max_state) {
|
||||
seq_put_decimal_ull(m, "", uid_entry->uid);
|
||||
seq_putc(m, ':');
|
||||
}
|
||||
for (i = 0; i < uid_entry->max_state; ++i) {
|
||||
if (freq_index_invalid(i))
|
||||
continue;
|
||||
seq_printf(m, " %lu", (unsigned long)cputime_to_clock_t(
|
||||
uid_entry->time_in_state[i]));
|
||||
u64 time =
|
||||
cputime_to_clock_t(uid_entry->time_in_state[i]);
|
||||
seq_put_decimal_ull(m, " ", time);
|
||||
}
|
||||
if (uid_entry->max_state)
|
||||
seq_putc(m, '\n');
|
||||
@@ -403,8 +385,6 @@ int proc_time_in_state_show(struct seq_file *m, struct pid_namespace *ns,
|
||||
|
||||
seq_printf(m, "cpu%u\n", cpu);
|
||||
for (i = 0; i < freqs->max_state; i++) {
|
||||
if (freqs->freq_table[i] == CPUFREQ_ENTRY_INVALID)
|
||||
continue;
|
||||
cputime = 0;
|
||||
if (freqs->offset + i < p->max_state &&
|
||||
p->time_in_state)
|
||||
@@ -484,9 +464,19 @@ void cpufreq_acct_update_power(struct task_struct *p, cputime_t cputime)
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
static int cpufreq_times_get_index(struct cpu_freqs *freqs, unsigned int freq)
|
||||
{
|
||||
int index;
|
||||
for (index = 0; index < freqs->max_state; ++index) {
|
||||
if (freqs->freq_table[index] == freq)
|
||||
return index;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
void cpufreq_times_create_policy(struct cpufreq_policy *policy)
|
||||
{
|
||||
int cpu, index;
|
||||
int cpu, index = 0;
|
||||
unsigned int count = 0;
|
||||
struct cpufreq_frequency_table *pos, *table;
|
||||
struct cpu_freqs *freqs;
|
||||
@@ -499,7 +489,7 @@ void cpufreq_times_create_policy(struct cpufreq_policy *policy)
|
||||
if (!table)
|
||||
return;
|
||||
|
||||
cpufreq_for_each_entry(pos, table)
|
||||
cpufreq_for_each_valid_entry(pos, table)
|
||||
count++;
|
||||
|
||||
tmp = kzalloc(sizeof(*freqs) + sizeof(freqs->freq_table[0]) * count,
|
||||
@@ -510,13 +500,13 @@ void cpufreq_times_create_policy(struct cpufreq_policy *policy)
|
||||
freqs = tmp;
|
||||
freqs->max_state = count;
|
||||
|
||||
index = cpufreq_frequency_table_get_index(policy, policy->cur);
|
||||
cpufreq_for_each_valid_entry(pos, table)
|
||||
freqs->freq_table[index++] = pos->frequency;
|
||||
|
||||
index = cpufreq_times_get_index(freqs, policy->cur);
|
||||
if (index >= 0)
|
||||
WRITE_ONCE(freqs->last_index, index);
|
||||
|
||||
cpufreq_for_each_entry(pos, table)
|
||||
freqs->freq_table[pos - table] = pos->frequency;
|
||||
|
||||
freqs->offset = next_offset;
|
||||
WRITE_ONCE(next_offset, freqs->offset + count);
|
||||
for_each_cpu(cpu, policy->related_cpus)
|
||||
@@ -552,24 +542,17 @@ void cpufreq_task_times_remove_uids(uid_t uid_start, uid_t uid_end)
|
||||
spin_unlock_irqrestore(&uid_lock, flags);
|
||||
}
|
||||
|
||||
void cpufreq_times_record_transition(struct cpufreq_freqs *freq)
|
||||
void cpufreq_times_record_transition(struct cpufreq_policy *policy,
|
||||
unsigned int new_freq)
|
||||
{
|
||||
int index;
|
||||
struct cpu_freqs *freqs = all_freqs[freq->cpu];
|
||||
struct cpufreq_policy *policy;
|
||||
|
||||
struct cpu_freqs *freqs = all_freqs[policy->cpu];
|
||||
if (!freqs)
|
||||
return;
|
||||
|
||||
policy = cpufreq_cpu_get(freq->cpu);
|
||||
if (!policy)
|
||||
return;
|
||||
|
||||
index = cpufreq_frequency_table_get_index(policy, freq->new);
|
||||
index = cpufreq_times_get_index(freqs, new_freq);
|
||||
if (index >= 0)
|
||||
WRITE_ONCE(freqs->last_index, index);
|
||||
|
||||
cpufreq_cpu_put(policy);
|
||||
}
|
||||
|
||||
static const struct seq_operations uid_time_in_state_seq_ops = {
|
||||
|
||||
@@ -659,13 +659,13 @@ static void __init intel_pstate_debug_expose_params(void)
|
||||
/************************** sysfs begin ************************/
|
||||
#define show_one(file_name, object) \
|
||||
static ssize_t show_##file_name \
|
||||
(struct kobject *kobj, struct attribute *attr, char *buf) \
|
||||
(struct kobject *kobj, struct kobj_attribute *attr, char *buf) \
|
||||
{ \
|
||||
return sprintf(buf, "%u\n", limits->object); \
|
||||
}
|
||||
|
||||
static ssize_t show_turbo_pct(struct kobject *kobj,
|
||||
struct attribute *attr, char *buf)
|
||||
struct kobj_attribute *attr, char *buf)
|
||||
{
|
||||
struct cpudata *cpu;
|
||||
int total, no_turbo, turbo_pct;
|
||||
@@ -681,7 +681,7 @@ static ssize_t show_turbo_pct(struct kobject *kobj,
|
||||
}
|
||||
|
||||
static ssize_t show_num_pstates(struct kobject *kobj,
|
||||
struct attribute *attr, char *buf)
|
||||
struct kobj_attribute *attr, char *buf)
|
||||
{
|
||||
struct cpudata *cpu;
|
||||
int total;
|
||||
@@ -692,7 +692,7 @@ static ssize_t show_num_pstates(struct kobject *kobj,
|
||||
}
|
||||
|
||||
static ssize_t show_no_turbo(struct kobject *kobj,
|
||||
struct attribute *attr, char *buf)
|
||||
struct kobj_attribute *attr, char *buf)
|
||||
{
|
||||
ssize_t ret;
|
||||
|
||||
@@ -705,7 +705,7 @@ static ssize_t show_no_turbo(struct kobject *kobj,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ssize_t store_no_turbo(struct kobject *a, struct attribute *b,
|
||||
static ssize_t store_no_turbo(struct kobject *a, struct kobj_attribute *b,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
unsigned int input;
|
||||
@@ -729,7 +729,7 @@ static ssize_t store_no_turbo(struct kobject *a, struct attribute *b,
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t store_max_perf_pct(struct kobject *a, struct attribute *b,
|
||||
static ssize_t store_max_perf_pct(struct kobject *a, struct kobj_attribute *b,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
unsigned int input;
|
||||
@@ -753,7 +753,7 @@ static ssize_t store_max_perf_pct(struct kobject *a, struct attribute *b,
|
||||
return count;
|
||||
}
|
||||
|
||||
static ssize_t store_min_perf_pct(struct kobject *a, struct attribute *b,
|
||||
static ssize_t store_min_perf_pct(struct kobject *a, struct kobj_attribute *b,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
unsigned int input;
|
||||
|
||||
@@ -203,6 +203,7 @@ struct at_xdmac_chan {
|
||||
u32 save_cim;
|
||||
u32 save_cnda;
|
||||
u32 save_cndc;
|
||||
u32 irq_status;
|
||||
unsigned long status;
|
||||
struct tasklet_struct tasklet;
|
||||
struct dma_slave_config sconfig;
|
||||
@@ -1582,8 +1583,8 @@ static void at_xdmac_tasklet(unsigned long data)
|
||||
struct at_xdmac_desc *desc;
|
||||
u32 error_mask;
|
||||
|
||||
dev_dbg(chan2dev(&atchan->chan), "%s: status=0x%08lx\n",
|
||||
__func__, atchan->status);
|
||||
dev_dbg(chan2dev(&atchan->chan), "%s: status=0x%08x\n",
|
||||
__func__, atchan->irq_status);
|
||||
|
||||
error_mask = AT_XDMAC_CIS_RBEIS
|
||||
| AT_XDMAC_CIS_WBEIS
|
||||
@@ -1591,15 +1592,15 @@ static void at_xdmac_tasklet(unsigned long data)
|
||||
|
||||
if (at_xdmac_chan_is_cyclic(atchan)) {
|
||||
at_xdmac_handle_cyclic(atchan);
|
||||
} else if ((atchan->status & AT_XDMAC_CIS_LIS)
|
||||
|| (atchan->status & error_mask)) {
|
||||
} else if ((atchan->irq_status & AT_XDMAC_CIS_LIS)
|
||||
|| (atchan->irq_status & error_mask)) {
|
||||
struct dma_async_tx_descriptor *txd;
|
||||
|
||||
if (atchan->status & AT_XDMAC_CIS_RBEIS)
|
||||
if (atchan->irq_status & AT_XDMAC_CIS_RBEIS)
|
||||
dev_err(chan2dev(&atchan->chan), "read bus error!!!");
|
||||
if (atchan->status & AT_XDMAC_CIS_WBEIS)
|
||||
if (atchan->irq_status & AT_XDMAC_CIS_WBEIS)
|
||||
dev_err(chan2dev(&atchan->chan), "write bus error!!!");
|
||||
if (atchan->status & AT_XDMAC_CIS_ROIS)
|
||||
if (atchan->irq_status & AT_XDMAC_CIS_ROIS)
|
||||
dev_err(chan2dev(&atchan->chan), "request overflow error!!!");
|
||||
|
||||
spin_lock_bh(&atchan->lock);
|
||||
@@ -1654,7 +1655,7 @@ static irqreturn_t at_xdmac_interrupt(int irq, void *dev_id)
|
||||
atchan = &atxdmac->chan[i];
|
||||
chan_imr = at_xdmac_chan_read(atchan, AT_XDMAC_CIM);
|
||||
chan_status = at_xdmac_chan_read(atchan, AT_XDMAC_CIS);
|
||||
atchan->status = chan_status & chan_imr;
|
||||
atchan->irq_status = chan_status & chan_imr;
|
||||
dev_vdbg(atxdmac->dma.dev,
|
||||
"%s: chan%d: imr=0x%x, status=0x%x\n",
|
||||
__func__, i, chan_imr, chan_status);
|
||||
@@ -1668,7 +1669,7 @@ static irqreturn_t at_xdmac_interrupt(int irq, void *dev_id)
|
||||
at_xdmac_chan_read(atchan, AT_XDMAC_CDA),
|
||||
at_xdmac_chan_read(atchan, AT_XDMAC_CUBC));
|
||||
|
||||
if (atchan->status & (AT_XDMAC_CIS_RBEIS | AT_XDMAC_CIS_WBEIS))
|
||||
if (atchan->irq_status & (AT_XDMAC_CIS_RBEIS | AT_XDMAC_CIS_WBEIS))
|
||||
at_xdmac_write(atxdmac, AT_XDMAC_GD, atchan->mask);
|
||||
|
||||
tasklet_schedule(&atchan->tasklet);
|
||||
|
||||
@@ -583,11 +583,9 @@ static int dmatest_func(void *data)
|
||||
srcs[i] = um->addr[i] + src_off;
|
||||
ret = dma_mapping_error(dev->dev, um->addr[i]);
|
||||
if (ret) {
|
||||
dmaengine_unmap_put(um);
|
||||
result("src mapping error", total_tests,
|
||||
src_off, dst_off, len, ret);
|
||||
failed_tests++;
|
||||
continue;
|
||||
goto error_unmap_continue;
|
||||
}
|
||||
um->to_cnt++;
|
||||
}
|
||||
@@ -602,11 +600,9 @@ static int dmatest_func(void *data)
|
||||
DMA_BIDIRECTIONAL);
|
||||
ret = dma_mapping_error(dev->dev, dsts[i]);
|
||||
if (ret) {
|
||||
dmaengine_unmap_put(um);
|
||||
result("dst mapping error", total_tests,
|
||||
src_off, dst_off, len, ret);
|
||||
failed_tests++;
|
||||
continue;
|
||||
goto error_unmap_continue;
|
||||
}
|
||||
um->bidi_cnt++;
|
||||
}
|
||||
@@ -643,12 +639,10 @@ static int dmatest_func(void *data)
|
||||
}
|
||||
|
||||
if (!tx) {
|
||||
dmaengine_unmap_put(um);
|
||||
result("prep error", total_tests, src_off,
|
||||
dst_off, len, ret);
|
||||
msleep(100);
|
||||
failed_tests++;
|
||||
continue;
|
||||
goto error_unmap_continue;
|
||||
}
|
||||
|
||||
done->done = false;
|
||||
@@ -657,12 +651,10 @@ static int dmatest_func(void *data)
|
||||
cookie = tx->tx_submit(tx);
|
||||
|
||||
if (dma_submit_error(cookie)) {
|
||||
dmaengine_unmap_put(um);
|
||||
result("submit error", total_tests, src_off,
|
||||
dst_off, len, ret);
|
||||
msleep(100);
|
||||
failed_tests++;
|
||||
continue;
|
||||
goto error_unmap_continue;
|
||||
}
|
||||
dma_async_issue_pending(chan);
|
||||
|
||||
@@ -675,16 +667,14 @@ static int dmatest_func(void *data)
|
||||
dmaengine_unmap_put(um);
|
||||
result("test timed out", total_tests, src_off, dst_off,
|
||||
len, 0);
|
||||
failed_tests++;
|
||||
continue;
|
||||
goto error_unmap_continue;
|
||||
} else if (status != DMA_COMPLETE) {
|
||||
dmaengine_unmap_put(um);
|
||||
result(status == DMA_ERROR ?
|
||||
"completion error status" :
|
||||
"completion busy status", total_tests, src_off,
|
||||
dst_off, len, ret);
|
||||
failed_tests++;
|
||||
continue;
|
||||
goto error_unmap_continue;
|
||||
}
|
||||
|
||||
dmaengine_unmap_put(um);
|
||||
@@ -727,6 +717,12 @@ static int dmatest_func(void *data)
|
||||
verbose_result("test passed", total_tests, src_off,
|
||||
dst_off, len, 0);
|
||||
}
|
||||
|
||||
continue;
|
||||
|
||||
error_unmap_continue:
|
||||
dmaengine_unmap_put(um);
|
||||
failed_tests++;
|
||||
}
|
||||
ktime = ktime_sub(ktime_get(), ktime);
|
||||
ktime = ktime_sub(ktime, comparetime);
|
||||
|
||||
@@ -542,6 +542,7 @@ static umode_t __init ibft_check_tgt_for(void *data, int type)
|
||||
case ISCSI_BOOT_TGT_NIC_ASSOC:
|
||||
case ISCSI_BOOT_TGT_CHAP_TYPE:
|
||||
rc = S_IRUGO;
|
||||
break;
|
||||
case ISCSI_BOOT_TGT_NAME:
|
||||
if (tgt->tgt_name_len)
|
||||
rc = S_IRUGO;
|
||||
|
||||
@@ -221,6 +221,7 @@ static int vf610_gpio_probe(struct platform_device *pdev)
|
||||
struct vf610_gpio_port *port;
|
||||
struct resource *iores;
|
||||
struct gpio_chip *gc;
|
||||
int i;
|
||||
int ret;
|
||||
|
||||
port = devm_kzalloc(&pdev->dev, sizeof(*port), GFP_KERNEL);
|
||||
@@ -259,6 +260,10 @@ static int vf610_gpio_probe(struct platform_device *pdev)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/* Mask all GPIO interrupts */
|
||||
for (i = 0; i < gc->ngpio; i++)
|
||||
vf610_gpio_writel(0, port->base + PORT_PCR(i));
|
||||
|
||||
/* Clear the interrupt status register for all GPIO's */
|
||||
vf610_gpio_writel(~0, port->base + PORT_ISFR);
|
||||
|
||||
|
||||
@@ -1985,10 +1985,10 @@ static void ibx_irq_handler(struct drm_i915_private *dev_priv, u32 pch_iir)
|
||||
DRM_DEBUG_DRIVER("PCH transcoder CRC error interrupt\n");
|
||||
|
||||
if (pch_iir & SDE_TRANSA_FIFO_UNDER)
|
||||
intel_pch_fifo_underrun_irq_handler(dev_priv, TRANSCODER_A);
|
||||
intel_pch_fifo_underrun_irq_handler(dev_priv, PIPE_A);
|
||||
|
||||
if (pch_iir & SDE_TRANSB_FIFO_UNDER)
|
||||
intel_pch_fifo_underrun_irq_handler(dev_priv, TRANSCODER_B);
|
||||
intel_pch_fifo_underrun_irq_handler(dev_priv, PIPE_B);
|
||||
}
|
||||
|
||||
static void ivb_err_int_handler(struct drm_i915_private *dev_priv)
|
||||
@@ -2022,13 +2022,13 @@ static void cpt_serr_int_handler(struct drm_i915_private *dev_priv)
|
||||
DRM_ERROR("PCH poison interrupt\n");
|
||||
|
||||
if (serr_int & SERR_INT_TRANS_A_FIFO_UNDERRUN)
|
||||
intel_pch_fifo_underrun_irq_handler(dev_priv, TRANSCODER_A);
|
||||
intel_pch_fifo_underrun_irq_handler(dev_priv, PIPE_A);
|
||||
|
||||
if (serr_int & SERR_INT_TRANS_B_FIFO_UNDERRUN)
|
||||
intel_pch_fifo_underrun_irq_handler(dev_priv, TRANSCODER_B);
|
||||
intel_pch_fifo_underrun_irq_handler(dev_priv, PIPE_B);
|
||||
|
||||
if (serr_int & SERR_INT_TRANS_C_FIFO_UNDERRUN)
|
||||
intel_pch_fifo_underrun_irq_handler(dev_priv, TRANSCODER_C);
|
||||
intel_pch_fifo_underrun_irq_handler(dev_priv, PIPE_C);
|
||||
|
||||
I915_WRITE(SERR_INT, serr_int);
|
||||
}
|
||||
|
||||
@@ -1849,7 +1849,7 @@ static void lpt_enable_pch_transcoder(struct drm_i915_private *dev_priv,
|
||||
|
||||
/* FDI must be feeding us bits for PCH ports */
|
||||
assert_fdi_tx_enabled(dev_priv, (enum pipe) cpu_transcoder);
|
||||
assert_fdi_rx_enabled(dev_priv, TRANSCODER_A);
|
||||
assert_fdi_rx_enabled(dev_priv, PIPE_A);
|
||||
|
||||
/* Workaround: set timing override bit. */
|
||||
val = I915_READ(TRANS_CHICKEN2(PIPE_A));
|
||||
@@ -1950,7 +1950,7 @@ static void intel_enable_pipe(struct intel_crtc *crtc)
|
||||
assert_sprites_disabled(dev_priv, pipe);
|
||||
|
||||
if (HAS_PCH_LPT(dev_priv))
|
||||
pch_transcoder = TRANSCODER_A;
|
||||
pch_transcoder = PIPE_A;
|
||||
else
|
||||
pch_transcoder = pipe;
|
||||
|
||||
@@ -4636,7 +4636,7 @@ static void lpt_pch_enable(struct drm_crtc *crtc)
|
||||
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
|
||||
enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
|
||||
|
||||
assert_pch_transcoder_disabled(dev_priv, TRANSCODER_A);
|
||||
assert_pch_transcoder_disabled(dev_priv, PIPE_A);
|
||||
|
||||
lpt_program_iclkip(crtc);
|
||||
|
||||
@@ -5410,7 +5410,7 @@ static void haswell_crtc_enable(struct intel_crtc_state *pipe_config,
|
||||
return;
|
||||
|
||||
if (intel_crtc->config->has_pch_encoder)
|
||||
intel_set_pch_fifo_underrun_reporting(dev_priv, TRANSCODER_A,
|
||||
intel_set_pch_fifo_underrun_reporting(dev_priv, PIPE_A,
|
||||
false);
|
||||
|
||||
intel_encoders_pre_pll_enable(crtc, pipe_config, old_state);
|
||||
@@ -5498,7 +5498,7 @@ static void haswell_crtc_enable(struct intel_crtc_state *pipe_config,
|
||||
intel_wait_for_vblank(dev, pipe);
|
||||
intel_wait_for_vblank(dev, pipe);
|
||||
intel_set_cpu_fifo_underrun_reporting(dev_priv, pipe, true);
|
||||
intel_set_pch_fifo_underrun_reporting(dev_priv, TRANSCODER_A,
|
||||
intel_set_pch_fifo_underrun_reporting(dev_priv, PIPE_A,
|
||||
true);
|
||||
}
|
||||
|
||||
@@ -5597,7 +5597,7 @@ static void haswell_crtc_disable(struct intel_crtc_state *old_crtc_state,
|
||||
enum transcoder cpu_transcoder = intel_crtc->config->cpu_transcoder;
|
||||
|
||||
if (intel_crtc->config->has_pch_encoder)
|
||||
intel_set_pch_fifo_underrun_reporting(dev_priv, TRANSCODER_A,
|
||||
intel_set_pch_fifo_underrun_reporting(dev_priv, PIPE_A,
|
||||
false);
|
||||
|
||||
intel_encoders_disable(crtc, old_crtc_state, old_state);
|
||||
@@ -5626,7 +5626,7 @@ static void haswell_crtc_disable(struct intel_crtc_state *old_crtc_state,
|
||||
intel_encoders_post_disable(crtc, old_crtc_state, old_state);
|
||||
|
||||
if (old_crtc_state->has_pch_encoder)
|
||||
intel_set_pch_fifo_underrun_reporting(dev_priv, TRANSCODER_A,
|
||||
intel_set_pch_fifo_underrun_reporting(dev_priv, PIPE_A,
|
||||
true);
|
||||
}
|
||||
|
||||
|
||||
@@ -1095,12 +1095,12 @@ static inline unsigned int intel_num_planes(struct intel_crtc *crtc)
|
||||
bool intel_set_cpu_fifo_underrun_reporting(struct drm_i915_private *dev_priv,
|
||||
enum pipe pipe, bool enable);
|
||||
bool intel_set_pch_fifo_underrun_reporting(struct drm_i915_private *dev_priv,
|
||||
enum transcoder pch_transcoder,
|
||||
enum pipe pch_transcoder,
|
||||
bool enable);
|
||||
void intel_cpu_fifo_underrun_irq_handler(struct drm_i915_private *dev_priv,
|
||||
enum pipe pipe);
|
||||
void intel_pch_fifo_underrun_irq_handler(struct drm_i915_private *dev_priv,
|
||||
enum transcoder pch_transcoder);
|
||||
enum pipe pch_transcoder);
|
||||
void intel_check_cpu_fifo_underruns(struct drm_i915_private *dev_priv);
|
||||
void intel_check_pch_fifo_underruns(struct drm_i915_private *dev_priv);
|
||||
|
||||
|
||||
@@ -185,11 +185,11 @@ static void broadwell_set_fifo_underrun_reporting(struct drm_device *dev,
|
||||
}
|
||||
|
||||
static void ibx_set_fifo_underrun_reporting(struct drm_device *dev,
|
||||
enum transcoder pch_transcoder,
|
||||
enum pipe pch_transcoder,
|
||||
bool enable)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = to_i915(dev);
|
||||
uint32_t bit = (pch_transcoder == TRANSCODER_A) ?
|
||||
uint32_t bit = (pch_transcoder == PIPE_A) ?
|
||||
SDE_TRANSA_FIFO_UNDER : SDE_TRANSB_FIFO_UNDER;
|
||||
|
||||
if (enable)
|
||||
@@ -201,7 +201,7 @@ static void ibx_set_fifo_underrun_reporting(struct drm_device *dev,
|
||||
static void cpt_check_pch_fifo_underruns(struct intel_crtc *crtc)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
|
||||
enum transcoder pch_transcoder = (enum transcoder) crtc->pipe;
|
||||
enum pipe pch_transcoder = crtc->pipe;
|
||||
uint32_t serr_int = I915_READ(SERR_INT);
|
||||
|
||||
assert_spin_locked(&dev_priv->irq_lock);
|
||||
@@ -212,12 +212,12 @@ static void cpt_check_pch_fifo_underruns(struct intel_crtc *crtc)
|
||||
I915_WRITE(SERR_INT, SERR_INT_TRANS_FIFO_UNDERRUN(pch_transcoder));
|
||||
POSTING_READ(SERR_INT);
|
||||
|
||||
DRM_ERROR("pch fifo underrun on pch transcoder %s\n",
|
||||
transcoder_name(pch_transcoder));
|
||||
DRM_ERROR("pch fifo underrun on pch transcoder %c\n",
|
||||
pipe_name(pch_transcoder));
|
||||
}
|
||||
|
||||
static void cpt_set_fifo_underrun_reporting(struct drm_device *dev,
|
||||
enum transcoder pch_transcoder,
|
||||
enum pipe pch_transcoder,
|
||||
bool enable, bool old)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = to_i915(dev);
|
||||
@@ -235,8 +235,8 @@ static void cpt_set_fifo_underrun_reporting(struct drm_device *dev,
|
||||
|
||||
if (old && I915_READ(SERR_INT) &
|
||||
SERR_INT_TRANS_FIFO_UNDERRUN(pch_transcoder)) {
|
||||
DRM_ERROR("uncleared pch fifo underrun on pch transcoder %s\n",
|
||||
transcoder_name(pch_transcoder));
|
||||
DRM_ERROR("uncleared pch fifo underrun on pch transcoder %c\n",
|
||||
pipe_name(pch_transcoder));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -311,7 +311,7 @@ bool intel_set_cpu_fifo_underrun_reporting(struct drm_i915_private *dev_priv,
|
||||
* Returns the previous state of underrun reporting.
|
||||
*/
|
||||
bool intel_set_pch_fifo_underrun_reporting(struct drm_i915_private *dev_priv,
|
||||
enum transcoder pch_transcoder,
|
||||
enum pipe pch_transcoder,
|
||||
bool enable)
|
||||
{
|
||||
struct drm_crtc *crtc = dev_priv->pipe_to_crtc_mapping[pch_transcoder];
|
||||
@@ -384,12 +384,12 @@ void intel_cpu_fifo_underrun_irq_handler(struct drm_i915_private *dev_priv,
|
||||
* interrupt to avoid an irq storm.
|
||||
*/
|
||||
void intel_pch_fifo_underrun_irq_handler(struct drm_i915_private *dev_priv,
|
||||
enum transcoder pch_transcoder)
|
||||
enum pipe pch_transcoder)
|
||||
{
|
||||
if (intel_set_pch_fifo_underrun_reporting(dev_priv, pch_transcoder,
|
||||
false))
|
||||
DRM_ERROR("PCH transcoder %s FIFO underrun\n",
|
||||
transcoder_name(pch_transcoder));
|
||||
DRM_ERROR("PCH transcoder %c FIFO underrun\n",
|
||||
pipe_name(pch_transcoder));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
7
drivers/gpu/drm/msm/msm_rd.c
Normal file → Executable file
7
drivers/gpu/drm/msm/msm_rd.c
Normal file → Executable file
@@ -116,7 +116,9 @@ static void rd_write(struct msm_rd_state *rd, const void *buf, int sz)
|
||||
char *fptr = &fifo->buf[fifo->head];
|
||||
int n;
|
||||
|
||||
wait_event(rd->fifo_event, circ_space(&rd->fifo) > 0);
|
||||
wait_event(rd->fifo_event, circ_space(&rd->fifo) > 0 || !rd->open);
|
||||
if (!rd->open)
|
||||
return;
|
||||
|
||||
n = min(sz, circ_space_to_end(&rd->fifo));
|
||||
memcpy(fptr, ptr, n);
|
||||
@@ -233,7 +235,10 @@ static int rd_release(struct inode *inode, struct file *file)
|
||||
return -EINVAL;
|
||||
|
||||
rd = inode->i_private;
|
||||
|
||||
rd->open = false;
|
||||
wake_up_all(&rd->fifo_event);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -327,6 +327,7 @@ static int sun4i_tcon_init_clocks(struct device *dev,
|
||||
dev_err(dev, "Couldn't get the TCON channel 0 clock\n");
|
||||
return PTR_ERR(tcon->sclk0);
|
||||
}
|
||||
clk_prepare_enable(tcon->sclk0);
|
||||
|
||||
if (tcon->quirks->has_channel_1) {
|
||||
tcon->sclk1 = devm_clk_get(dev, "tcon-ch1");
|
||||
@@ -341,6 +342,7 @@ static int sun4i_tcon_init_clocks(struct device *dev,
|
||||
|
||||
static void sun4i_tcon_free_clocks(struct sun4i_tcon *tcon)
|
||||
{
|
||||
clk_disable_unprepare(tcon->sclk0);
|
||||
clk_disable_unprepare(tcon->clk);
|
||||
}
|
||||
|
||||
|
||||
@@ -772,7 +772,6 @@ void hfi1_ud_rcv(struct hfi1_packet *packet)
|
||||
opcode == IB_OPCODE_UD_SEND_ONLY_WITH_IMMEDIATE) {
|
||||
wc.ex.imm_data = ohdr->u.ud.imm_data;
|
||||
wc.wc_flags = IB_WC_WITH_IMM;
|
||||
tlen -= sizeof(u32);
|
||||
} else if (opcode == IB_OPCODE_UD_SEND_ONLY) {
|
||||
wc.ex.imm_data = 0;
|
||||
wc.wc_flags = 0;
|
||||
|
||||
@@ -525,7 +525,6 @@ void qib_ud_rcv(struct qib_ibport *ibp, struct ib_header *hdr,
|
||||
opcode == IB_OPCODE_UD_SEND_ONLY_WITH_IMMEDIATE) {
|
||||
wc.ex.imm_data = ohdr->u.ud.imm_data;
|
||||
wc.wc_flags = IB_WC_WITH_IMM;
|
||||
tlen -= sizeof(u32);
|
||||
} else if (opcode == IB_OPCODE_UD_SEND_ONLY) {
|
||||
wc.ex.imm_data = 0;
|
||||
wc.wc_flags = 0;
|
||||
|
||||
@@ -2639,7 +2639,6 @@ static int srp_reset_device(struct scsi_cmnd *scmnd)
|
||||
{
|
||||
struct srp_target_port *target = host_to_target(scmnd->device->host);
|
||||
struct srp_rdma_ch *ch;
|
||||
int i, j;
|
||||
u8 status;
|
||||
|
||||
shost_printk(KERN_ERR, target->scsi_host, "SRP reset_device called\n");
|
||||
@@ -2651,15 +2650,6 @@ static int srp_reset_device(struct scsi_cmnd *scmnd)
|
||||
if (status)
|
||||
return FAILED;
|
||||
|
||||
for (i = 0; i < target->ch_count; i++) {
|
||||
ch = &target->ch[i];
|
||||
for (j = 0; j < target->req_ring_size; ++j) {
|
||||
struct srp_request *req = &ch->req_ring[j];
|
||||
|
||||
srp_finish_req(ch, req, scmnd->device, DID_RESET << 16);
|
||||
}
|
||||
}
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
@@ -1241,6 +1241,7 @@ static const struct acpi_device_id elan_acpi_id[] = {
|
||||
{ "ELAN0000", 0 },
|
||||
{ "ELAN0100", 0 },
|
||||
{ "ELAN0600", 0 },
|
||||
{ "ELAN0601", 0 },
|
||||
{ "ELAN0602", 0 },
|
||||
{ "ELAN0605", 0 },
|
||||
{ "ELAN0608", 0 },
|
||||
|
||||
@@ -187,6 +187,7 @@ enum {
|
||||
MODEL_DIGITIZER_II = 0x5544, /* UD */
|
||||
MODEL_GRAPHIRE = 0x4554, /* ET */
|
||||
MODEL_PENPARTNER = 0x4354, /* CT */
|
||||
MODEL_ARTPAD_II = 0x4B54, /* KT */
|
||||
};
|
||||
|
||||
static void wacom_handle_model_response(struct wacom *wacom)
|
||||
@@ -245,6 +246,7 @@ static void wacom_handle_model_response(struct wacom *wacom)
|
||||
wacom->flags = F_HAS_STYLUS2 | F_HAS_SCROLLWHEEL;
|
||||
break;
|
||||
|
||||
case MODEL_ARTPAD_II:
|
||||
case MODEL_DIGITIZER_II:
|
||||
wacom->dev->name = "Wacom Digitizer II";
|
||||
wacom->dev->id.version = MODEL_DIGITIZER_II;
|
||||
|
||||
@@ -1896,6 +1896,7 @@ static void do_attach(struct iommu_dev_data *dev_data,
|
||||
|
||||
static void do_detach(struct iommu_dev_data *dev_data)
|
||||
{
|
||||
struct protection_domain *domain = dev_data->domain;
|
||||
struct amd_iommu *iommu;
|
||||
u16 alias;
|
||||
|
||||
@@ -1911,10 +1912,6 @@ static void do_detach(struct iommu_dev_data *dev_data)
|
||||
iommu = amd_iommu_rlookup_table[dev_data->devid];
|
||||
alias = dev_data->alias;
|
||||
|
||||
/* decrease reference counters */
|
||||
dev_data->domain->dev_iommu[iommu->index] -= 1;
|
||||
dev_data->domain->dev_cnt -= 1;
|
||||
|
||||
/* Update data structures */
|
||||
dev_data->domain = NULL;
|
||||
list_del(&dev_data->list);
|
||||
@@ -1924,6 +1921,16 @@ static void do_detach(struct iommu_dev_data *dev_data)
|
||||
|
||||
/* Flush the DTE entry */
|
||||
device_flush_dte(dev_data);
|
||||
|
||||
/* Flush IOTLB */
|
||||
domain_flush_tlb_pde(domain);
|
||||
|
||||
/* Wait for the flushes to finish */
|
||||
domain_flush_complete(domain);
|
||||
|
||||
/* decrease reference counters - needs to happen after the flushes */
|
||||
domain->dev_iommu[iommu->index] -= 1;
|
||||
domain->dev_cnt -= 1;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -2611,13 +2618,13 @@ out_unmap:
|
||||
bus_addr = address + s->dma_address + (j << PAGE_SHIFT);
|
||||
iommu_unmap_page(domain, bus_addr, PAGE_SIZE);
|
||||
|
||||
if (--mapped_pages)
|
||||
if (--mapped_pages == 0)
|
||||
goto out_free_iova;
|
||||
}
|
||||
}
|
||||
|
||||
out_free_iova:
|
||||
free_iova_fast(&dma_dom->iovad, address, npages);
|
||||
free_iova_fast(&dma_dom->iovad, address >> PAGE_SHIFT, npages);
|
||||
|
||||
out_err:
|
||||
return 0;
|
||||
|
||||
@@ -34,6 +34,9 @@
|
||||
#define SEL_INT_PENDING (1 << 6)
|
||||
#define SEL_INT_NUM_MASK 0x3f
|
||||
|
||||
#define MMP2_ICU_INT_ROUTE_PJ4_IRQ (1 << 5)
|
||||
#define MMP2_ICU_INT_ROUTE_PJ4_FIQ (1 << 6)
|
||||
|
||||
struct icu_chip_data {
|
||||
int nr_irqs;
|
||||
unsigned int virq_base;
|
||||
@@ -190,7 +193,8 @@ static struct mmp_intc_conf mmp_conf = {
|
||||
static struct mmp_intc_conf mmp2_conf = {
|
||||
.conf_enable = 0x20,
|
||||
.conf_disable = 0x0,
|
||||
.conf_mask = 0x7f,
|
||||
.conf_mask = MMP2_ICU_INT_ROUTE_PJ4_IRQ |
|
||||
MMP2_ICU_INT_ROUTE_PJ4_FIQ,
|
||||
};
|
||||
|
||||
static void __exception_irq_entry mmp_handle_irq(struct pt_regs *regs)
|
||||
|
||||
@@ -423,7 +423,7 @@ void b1_parse_version(avmctrl_info *cinfo)
|
||||
int i, j;
|
||||
|
||||
for (j = 0; j < AVM_MAXVERSION; j++)
|
||||
cinfo->version[j] = "\0\0" + 1;
|
||||
cinfo->version[j] = "";
|
||||
for (i = 0, j = 0;
|
||||
j < AVM_MAXVERSION && i < cinfo->versionlen;
|
||||
j++, i += cinfo->versionbuf[i] + 1)
|
||||
|
||||
@@ -786,7 +786,7 @@ isdn_tty_suspend(char *id, modem_info *info, atemu *m)
|
||||
cmd.parm.cmsg.para[3] = 4; /* 16 bit 0x0004 Suspend */
|
||||
cmd.parm.cmsg.para[4] = 0;
|
||||
cmd.parm.cmsg.para[5] = l;
|
||||
strncpy(&cmd.parm.cmsg.para[6], id, l);
|
||||
strscpy(&cmd.parm.cmsg.para[6], id, l);
|
||||
cmd.command = CAPI_PUT_MESSAGE;
|
||||
cmd.driver = info->isdn_driver;
|
||||
cmd.arg = info->isdn_channel;
|
||||
@@ -1455,15 +1455,19 @@ isdn_tty_set_termios(struct tty_struct *tty, struct ktermios *old_termios)
|
||||
{
|
||||
modem_info *info = (modem_info *) tty->driver_data;
|
||||
|
||||
mutex_lock(&modem_info_mutex);
|
||||
if (!old_termios)
|
||||
isdn_tty_change_speed(info);
|
||||
else {
|
||||
if (tty->termios.c_cflag == old_termios->c_cflag &&
|
||||
tty->termios.c_ispeed == old_termios->c_ispeed &&
|
||||
tty->termios.c_ospeed == old_termios->c_ospeed)
|
||||
tty->termios.c_ospeed == old_termios->c_ospeed) {
|
||||
mutex_unlock(&modem_info_mutex);
|
||||
return;
|
||||
}
|
||||
isdn_tty_change_speed(info);
|
||||
}
|
||||
mutex_unlock(&modem_info_mutex);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -318,7 +318,9 @@ static int lp5523_init_program_engine(struct lp55xx_chip *chip)
|
||||
|
||||
/* Let the programs run for couple of ms and check the engine status */
|
||||
usleep_range(3000, 6000);
|
||||
lp55xx_read(chip, LP5523_REG_STATUS, &status);
|
||||
ret = lp55xx_read(chip, LP5523_REG_STATUS, &status);
|
||||
if (ret)
|
||||
return ret;
|
||||
status &= LP5523_ENG_STATUS_MASK;
|
||||
|
||||
if (status != LP5523_ENG_STATUS_MASK) {
|
||||
|
||||
@@ -1019,11 +1019,19 @@ static int uvc_parse_standard_control(struct uvc_device *dev,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Make sure the terminal type MSB is not null, otherwise it
|
||||
* could be confused with a unit.
|
||||
/*
|
||||
* Reject invalid terminal types that would cause issues:
|
||||
*
|
||||
* - The high byte must be non-zero, otherwise it would be
|
||||
* confused with a unit.
|
||||
*
|
||||
* - Bit 15 must be 0, as we use it internally as a terminal
|
||||
* direction flag.
|
||||
*
|
||||
* Other unknown types are accepted.
|
||||
*/
|
||||
type = get_unaligned_le16(&buffer[4]);
|
||||
if ((type & 0xff00) == 0) {
|
||||
if ((type & 0x7f00) == 0 || (type & 0x8000) != 0) {
|
||||
uvc_trace(UVC_TRACE_DESCR, "device %d videocontrol "
|
||||
"interface %d INPUT_TERMINAL %d has invalid "
|
||||
"type 0x%04x, skipping\n", udev->devnum,
|
||||
|
||||
@@ -257,7 +257,7 @@ static int get_register_interruptible(struct ab8500 *ab8500, u8 bank,
|
||||
mutex_unlock(&ab8500->lock);
|
||||
dev_vdbg(ab8500->dev, "rd: addr %#x => data %#x\n", addr, ret);
|
||||
|
||||
return ret;
|
||||
return (ret < 0) ? ret : 0;
|
||||
}
|
||||
|
||||
static int ab8500_get_register(struct device *dev, u8 bank,
|
||||
|
||||
@@ -2588,7 +2588,7 @@ static struct irq_chip prcmu_irq_chip = {
|
||||
.irq_unmask = prcmu_irq_unmask,
|
||||
};
|
||||
|
||||
static __init char *fw_project_name(u32 project)
|
||||
static char *fw_project_name(u32 project)
|
||||
{
|
||||
switch (project) {
|
||||
case PRCMU_FW_PROJECT_U8500:
|
||||
@@ -2736,7 +2736,7 @@ void __init db8500_prcmu_early_init(u32 phy_base, u32 size)
|
||||
INIT_WORK(&mb0_transfer.mask_work, prcmu_mask_work);
|
||||
}
|
||||
|
||||
static void __init init_prcm_registers(void)
|
||||
static void init_prcm_registers(void)
|
||||
{
|
||||
u32 val;
|
||||
|
||||
|
||||
@@ -274,7 +274,9 @@ int mc13xxx_adc_do_conversion(struct mc13xxx *mc13xxx, unsigned int mode,
|
||||
|
||||
mc13xxx->adcflags |= MC13XXX_ADC_WORKING;
|
||||
|
||||
mc13xxx_reg_read(mc13xxx, MC13XXX_ADC0, &old_adc0);
|
||||
ret = mc13xxx_reg_read(mc13xxx, MC13XXX_ADC0, &old_adc0);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
adc0 = MC13XXX_ADC0_ADINC1 | MC13XXX_ADC0_ADINC2;
|
||||
adc1 = MC13XXX_ADC1_ADEN | MC13XXX_ADC1_ADTRIGIGN | MC13XXX_ADC1_ASC;
|
||||
|
||||
@@ -306,8 +306,7 @@ static int mt6397_probe(struct platform_device *pdev)
|
||||
|
||||
default:
|
||||
dev_err(&pdev->dev, "unsupported chip: %d\n", id);
|
||||
ret = -ENODEV;
|
||||
break;
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
if (ret) {
|
||||
|
||||
@@ -638,6 +638,10 @@ static int qcom_rpm_probe(struct platform_device *pdev)
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
writel(fw_version[0], RPM_CTRL_REG(rpm, 0));
|
||||
writel(fw_version[1], RPM_CTRL_REG(rpm, 1));
|
||||
writel(fw_version[2], RPM_CTRL_REG(rpm, 2));
|
||||
|
||||
dev_info(&pdev->dev, "RPM firmware %u.%u.%u\n", fw_version[0],
|
||||
fw_version[1],
|
||||
fw_version[2]);
|
||||
|
||||
@@ -264,8 +264,9 @@ static int ti_tscadc_probe(struct platform_device *pdev)
|
||||
cell->pdata_size = sizeof(tscadc);
|
||||
}
|
||||
|
||||
err = mfd_add_devices(&pdev->dev, pdev->id, tscadc->cells,
|
||||
tscadc->used_cells, NULL, 0, NULL);
|
||||
err = mfd_add_devices(&pdev->dev, PLATFORM_DEVID_AUTO,
|
||||
tscadc->cells, tscadc->used_cells, NULL,
|
||||
0, NULL);
|
||||
if (err < 0)
|
||||
goto err_disable_clk;
|
||||
|
||||
|
||||
@@ -979,7 +979,7 @@ add_children(struct twl4030_platform_data *pdata, unsigned irq_base,
|
||||
* letting it generate the right frequencies for USB, MADC, and
|
||||
* other purposes.
|
||||
*/
|
||||
static inline int __init protect_pm_master(void)
|
||||
static inline int protect_pm_master(void)
|
||||
{
|
||||
int e = 0;
|
||||
|
||||
@@ -988,7 +988,7 @@ static inline int __init protect_pm_master(void)
|
||||
return e;
|
||||
}
|
||||
|
||||
static inline int __init unprotect_pm_master(void)
|
||||
static inline int unprotect_pm_master(void)
|
||||
{
|
||||
int e = 0;
|
||||
|
||||
|
||||
@@ -1618,6 +1618,7 @@ static const struct reg_default wm5110_reg_default[] = {
|
||||
{ 0x00000ECD, 0x0000 }, /* R3789 - HPLPF4_2 */
|
||||
{ 0x00000EE0, 0x0000 }, /* R3808 - ASRC_ENABLE */
|
||||
{ 0x00000EE2, 0x0000 }, /* R3810 - ASRC_RATE1 */
|
||||
{ 0x00000EE3, 0x4000 }, /* R3811 - ASRC_RATE2 */
|
||||
{ 0x00000EF0, 0x0000 }, /* R3824 - ISRC 1 CTRL 1 */
|
||||
{ 0x00000EF1, 0x0000 }, /* R3825 - ISRC 1 CTRL 2 */
|
||||
{ 0x00000EF2, 0x0000 }, /* R3826 - ISRC 1 CTRL 3 */
|
||||
@@ -2869,6 +2870,7 @@ static bool wm5110_readable_register(struct device *dev, unsigned int reg)
|
||||
case ARIZONA_ASRC_ENABLE:
|
||||
case ARIZONA_ASRC_STATUS:
|
||||
case ARIZONA_ASRC_RATE1:
|
||||
case ARIZONA_ASRC_RATE2:
|
||||
case ARIZONA_ISRC_1_CTRL_1:
|
||||
case ARIZONA_ISRC_1_CTRL_2:
|
||||
case ARIZONA_ISRC_1_CTRL_3:
|
||||
|
||||
@@ -1450,6 +1450,7 @@ static int mmc_spi_probe(struct spi_device *spi)
|
||||
mmc->caps &= ~MMC_CAP_NEEDS_POLL;
|
||||
mmc_gpiod_request_cd_irq(mmc);
|
||||
}
|
||||
mmc_detect_change(mmc, 0);
|
||||
|
||||
if (host->pdata && host->pdata->flags & MMC_SPI_USE_RO_GPIO) {
|
||||
has_ro = true;
|
||||
|
||||
@@ -798,7 +798,7 @@ static uint64_t _mv88e6xxx_get_ethtool_stat(struct mv88e6xxx_chip *chip,
|
||||
if (s->sizeof_stat == 8)
|
||||
_mv88e6xxx_stats_read(chip, s->reg + 1, &high);
|
||||
}
|
||||
value = (((u64)high) << 16) | low;
|
||||
value = (((u64)high) << 32) | low;
|
||||
return value;
|
||||
}
|
||||
|
||||
|
||||
@@ -145,7 +145,8 @@ u32 msgdma_tx_completions(struct altera_tse_private *priv)
|
||||
& 0xffff;
|
||||
|
||||
if (inuse) { /* Tx FIFO is not empty */
|
||||
ready = priv->tx_prod - priv->tx_cons - inuse - 1;
|
||||
ready = max_t(int,
|
||||
priv->tx_prod - priv->tx_cons - inuse - 1, 0);
|
||||
} else {
|
||||
/* Check for buffered last packet */
|
||||
status = csrrd32(priv->tx_dma_csr, msgdma_csroffs(status));
|
||||
|
||||
@@ -692,8 +692,10 @@ static struct phy_device *connect_local_phy(struct net_device *dev)
|
||||
|
||||
phydev = phy_connect(dev, phy_id_fmt, &altera_tse_adjust_link,
|
||||
priv->phy_iface);
|
||||
if (IS_ERR(phydev))
|
||||
if (IS_ERR(phydev)) {
|
||||
netdev_err(dev, "Could not attach to PHY\n");
|
||||
phydev = NULL;
|
||||
}
|
||||
|
||||
} else {
|
||||
int ret;
|
||||
|
||||
@@ -428,6 +428,12 @@ normal_tx:
|
||||
}
|
||||
|
||||
length >>= 9;
|
||||
if (unlikely(length >= ARRAY_SIZE(bnxt_lhint_arr))) {
|
||||
dev_warn_ratelimited(&pdev->dev, "Dropped oversize %d bytes TX packet.\n",
|
||||
skb->len);
|
||||
i = 0;
|
||||
goto tx_dma_error;
|
||||
}
|
||||
flags |= bnxt_lhint_arr[length];
|
||||
txbd->tx_bd_len_flags_type = cpu_to_le32(flags);
|
||||
|
||||
|
||||
@@ -149,12 +149,10 @@ static void hns_ae_put_handle(struct hnae_handle *handle)
|
||||
struct hnae_vf_cb *vf_cb = hns_ae_get_vf_cb(handle);
|
||||
int i;
|
||||
|
||||
vf_cb->mac_cb = NULL;
|
||||
|
||||
kfree(vf_cb);
|
||||
|
||||
for (i = 0; i < handle->q_num; i++)
|
||||
hns_ae_get_ring_pair(handle->qs[i])->used_by_vf = 0;
|
||||
|
||||
kfree(vf_cb);
|
||||
}
|
||||
|
||||
static void hns_ae_ring_enable_all(struct hnae_handle *handle, int val)
|
||||
|
||||
@@ -2078,6 +2078,8 @@ static int hns_nic_dev_probe(struct platform_device *pdev)
|
||||
out_notify_fail:
|
||||
(void)cancel_work_sync(&priv->service_task);
|
||||
out_read_prop_fail:
|
||||
/* safe for ACPI FW */
|
||||
of_node_put(to_of_node(priv->fwnode));
|
||||
free_netdev(ndev);
|
||||
return ret;
|
||||
}
|
||||
@@ -2107,6 +2109,9 @@ static int hns_nic_dev_remove(struct platform_device *pdev)
|
||||
set_bit(NIC_STATE_REMOVING, &priv->state);
|
||||
(void)cancel_work_sync(&priv->service_task);
|
||||
|
||||
/* safe for ACPI FW */
|
||||
of_node_put(to_of_node(priv->fwnode));
|
||||
|
||||
free_netdev(ndev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -329,7 +329,7 @@ static int hns_mdio_read(struct mii_bus *bus, int phy_id, int regnum)
|
||||
}
|
||||
|
||||
hns_mdio_cmd_write(mdio_dev, is_c45,
|
||||
MDIO_C45_WRITE_ADDR, phy_id, devad);
|
||||
MDIO_C45_READ, phy_id, devad);
|
||||
}
|
||||
|
||||
/* Step 5: waitting for MDIO_COMMAND_REG 's mdio_start==0,*/
|
||||
|
||||
@@ -1240,7 +1240,6 @@ static int ibmveth_poll(struct napi_struct *napi, int budget)
|
||||
struct iphdr *iph;
|
||||
u16 mss = 0;
|
||||
|
||||
restart_poll:
|
||||
while (frames_processed < budget) {
|
||||
if (!ibmveth_rxq_pending_buffer(adapter))
|
||||
break;
|
||||
@@ -1338,7 +1337,6 @@ restart_poll:
|
||||
napi_reschedule(napi)) {
|
||||
lpar_rc = h_vio_signal(adapter->vdev->unit_address,
|
||||
VIO_IRQ_DISABLE);
|
||||
goto restart_poll;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -46,6 +46,7 @@
|
||||
#include <linux/mii.h>
|
||||
#include <linux/of_device.h>
|
||||
#include <linux/of_net.h>
|
||||
#include <linux/dmi.h>
|
||||
|
||||
#include <asm/irq.h>
|
||||
|
||||
@@ -93,7 +94,7 @@ static int copybreak __read_mostly = 128;
|
||||
module_param(copybreak, int, 0);
|
||||
MODULE_PARM_DESC(copybreak, "Receive copy threshold");
|
||||
|
||||
static int disable_msi = 0;
|
||||
static int disable_msi = -1;
|
||||
module_param(disable_msi, int, 0);
|
||||
MODULE_PARM_DESC(disable_msi, "Disable Message Signaled Interrupt (MSI)");
|
||||
|
||||
@@ -4923,6 +4924,24 @@ static const char *sky2_name(u8 chipid, char *buf, int sz)
|
||||
return buf;
|
||||
}
|
||||
|
||||
static const struct dmi_system_id msi_blacklist[] = {
|
||||
{
|
||||
.ident = "Dell Inspiron 1545",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Inspiron 1545"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.ident = "Gateway P-79",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Gateway"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "P-79"),
|
||||
},
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
static int sky2_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
{
|
||||
struct net_device *dev, *dev1;
|
||||
@@ -5034,6 +5053,9 @@ static int sky2_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
goto err_out_free_pci;
|
||||
}
|
||||
|
||||
if (disable_msi == -1)
|
||||
disable_msi = !!dmi_check_system(msi_blacklist);
|
||||
|
||||
if (!disable_msi && pci_enable_msi(pdev) == 0) {
|
||||
err = sky2_test_msi(hw);
|
||||
if (err) {
|
||||
|
||||
@@ -777,13 +777,27 @@ static int get_fixed_ipv6_csum(__wsum hw_checksum, struct sk_buff *skb,
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
#define short_frame(size) ((size) <= ETH_ZLEN + ETH_FCS_LEN)
|
||||
|
||||
static int check_csum(struct mlx4_cqe *cqe, struct sk_buff *skb, void *va,
|
||||
netdev_features_t dev_features)
|
||||
{
|
||||
__wsum hw_checksum = 0;
|
||||
void *hdr;
|
||||
|
||||
void *hdr = (u8 *)va + sizeof(struct ethhdr);
|
||||
/* CQE csum doesn't cover padding octets in short ethernet
|
||||
* frames. And the pad field is appended prior to calculating
|
||||
* and appending the FCS field.
|
||||
*
|
||||
* Detecting these padded frames requires to verify and parse
|
||||
* IP headers, so we simply force all those small frames to skip
|
||||
* checksum complete.
|
||||
*/
|
||||
if (short_frame(skb->len))
|
||||
return -EINVAL;
|
||||
|
||||
hdr = (u8 *)va + sizeof(struct ethhdr);
|
||||
hw_checksum = csum_unfold((__force __sum16)cqe->checksum);
|
||||
|
||||
if (cqe->vlan_my_qpn & cpu_to_be32(MLX4_CQE_CVLAN_PRESENT_MASK) &&
|
||||
@@ -945,6 +959,11 @@ xdp_drop:
|
||||
}
|
||||
|
||||
if (likely(dev->features & NETIF_F_RXCSUM)) {
|
||||
/* TODO: For IP non TCP/UDP packets when csum complete is
|
||||
* not an option (not supported or any other reason) we can
|
||||
* actually check cqe IPOK status bit and report
|
||||
* CHECKSUM_UNNECESSARY rather than CHECKSUM_NONE
|
||||
*/
|
||||
if (cqe->status & cpu_to_be16(MLX4_CQE_STATUS_TCP |
|
||||
MLX4_CQE_STATUS_UDP)) {
|
||||
if ((cqe->status & cpu_to_be16(MLX4_CQE_STATUS_IPOK)) &&
|
||||
|
||||
@@ -91,6 +91,7 @@ static void mlx5e_update_sw_rep_counters(struct mlx5e_priv *priv)
|
||||
|
||||
s->tx_packets += sq_stats->packets;
|
||||
s->tx_bytes += sq_stats->bytes;
|
||||
s->tx_queue_dropped += sq_stats->dropped;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -794,7 +794,7 @@ static int mlxsw_sp_port_vlans_add(struct mlxsw_sp_port *mlxsw_sp_port,
|
||||
static enum mlxsw_reg_sfd_rec_policy mlxsw_sp_sfd_rec_policy(bool dynamic)
|
||||
{
|
||||
return dynamic ? MLXSW_REG_SFD_REC_POLICY_DYNAMIC_ENTRY_INGRESS :
|
||||
MLXSW_REG_SFD_REC_POLICY_STATIC_ENTRY;
|
||||
MLXSW_REG_SFD_REC_POLICY_DYNAMIC_ENTRY_MLAG;
|
||||
}
|
||||
|
||||
static enum mlxsw_reg_sfd_op mlxsw_sp_sfd_op(bool adding)
|
||||
@@ -806,7 +806,7 @@ static enum mlxsw_reg_sfd_op mlxsw_sp_sfd_op(bool adding)
|
||||
static int __mlxsw_sp_port_fdb_uc_op(struct mlxsw_sp *mlxsw_sp, u8 local_port,
|
||||
const char *mac, u16 fid, bool adding,
|
||||
enum mlxsw_reg_sfd_rec_action action,
|
||||
bool dynamic)
|
||||
enum mlxsw_reg_sfd_rec_policy policy)
|
||||
{
|
||||
char *sfd_pl;
|
||||
u8 num_rec;
|
||||
@@ -817,8 +817,7 @@ static int __mlxsw_sp_port_fdb_uc_op(struct mlxsw_sp *mlxsw_sp, u8 local_port,
|
||||
return -ENOMEM;
|
||||
|
||||
mlxsw_reg_sfd_pack(sfd_pl, mlxsw_sp_sfd_op(adding), 0);
|
||||
mlxsw_reg_sfd_uc_pack(sfd_pl, 0, mlxsw_sp_sfd_rec_policy(dynamic),
|
||||
mac, fid, action, local_port);
|
||||
mlxsw_reg_sfd_uc_pack(sfd_pl, 0, policy, mac, fid, action, local_port);
|
||||
num_rec = mlxsw_reg_sfd_num_rec_get(sfd_pl);
|
||||
err = mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(sfd), sfd_pl);
|
||||
if (err)
|
||||
@@ -837,7 +836,8 @@ static int mlxsw_sp_port_fdb_uc_op(struct mlxsw_sp *mlxsw_sp, u8 local_port,
|
||||
bool dynamic)
|
||||
{
|
||||
return __mlxsw_sp_port_fdb_uc_op(mlxsw_sp, local_port, mac, fid, adding,
|
||||
MLXSW_REG_SFD_REC_ACTION_NOP, dynamic);
|
||||
MLXSW_REG_SFD_REC_ACTION_NOP,
|
||||
mlxsw_sp_sfd_rec_policy(dynamic));
|
||||
}
|
||||
|
||||
int mlxsw_sp_rif_fdb_op(struct mlxsw_sp *mlxsw_sp, const char *mac, u16 fid,
|
||||
@@ -845,7 +845,7 @@ int mlxsw_sp_rif_fdb_op(struct mlxsw_sp *mlxsw_sp, const char *mac, u16 fid,
|
||||
{
|
||||
return __mlxsw_sp_port_fdb_uc_op(mlxsw_sp, 0, mac, fid, adding,
|
||||
MLXSW_REG_SFD_REC_ACTION_FORWARD_IP_ROUTER,
|
||||
false);
|
||||
MLXSW_REG_SFD_REC_POLICY_STATIC_ENTRY);
|
||||
}
|
||||
|
||||
static int mlxsw_sp_port_fdb_uc_lag_op(struct mlxsw_sp *mlxsw_sp, u16 lag_id,
|
||||
|
||||
@@ -1013,6 +1013,10 @@ static void qed_ll2_post_rx_buffer_notify_fw(struct qed_hwfn *p_hwfn,
|
||||
cq_prod = qed_chain_get_prod_idx(&p_rx->rcq_chain);
|
||||
rx_prod.bd_prod = cpu_to_le16(bd_prod);
|
||||
rx_prod.cqe_prod = cpu_to_le16(cq_prod);
|
||||
|
||||
/* Make sure chain element is updated before ringing the doorbell */
|
||||
dma_wmb();
|
||||
|
||||
DIRECT_REG_WR(p_rx->set_prod_addr, *((u32 *)&rx_prod));
|
||||
}
|
||||
|
||||
|
||||
@@ -158,6 +158,7 @@ static int qed_vf_pf_acquire(struct qed_hwfn *p_hwfn)
|
||||
struct pfvf_acquire_resp_tlv *resp = &p_iov->pf2vf_reply->acquire_resp;
|
||||
struct pf_vf_pfdev_info *pfdev_info = &resp->pfdev_info;
|
||||
struct vf_pf_resc_request *p_resc;
|
||||
u8 retry_cnt = VF_ACQUIRE_THRESH;
|
||||
bool resources_acquired = false;
|
||||
struct vfpf_acquire_tlv *req;
|
||||
int rc = 0, attempts = 0;
|
||||
@@ -203,6 +204,15 @@ static int qed_vf_pf_acquire(struct qed_hwfn *p_hwfn)
|
||||
|
||||
/* send acquire request */
|
||||
rc = qed_send_msg2pf(p_hwfn, &resp->hdr.status, sizeof(*resp));
|
||||
|
||||
/* Re-try acquire in case of vf-pf hw channel timeout */
|
||||
if (retry_cnt && rc == -EBUSY) {
|
||||
DP_VERBOSE(p_hwfn, QED_MSG_IOV,
|
||||
"VF retrying to acquire due to VPC timeout\n");
|
||||
retry_cnt--;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (rc)
|
||||
goto exit;
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ static int stmmac_jumbo_frm(void *p, struct sk_buff *skb, int csum)
|
||||
unsigned int entry = priv->cur_tx;
|
||||
struct dma_desc *desc = priv->dma_tx + entry;
|
||||
unsigned int nopaged_len = skb_headlen(skb);
|
||||
unsigned int bmax;
|
||||
unsigned int bmax, des2;
|
||||
unsigned int i = 1, len;
|
||||
|
||||
if (priv->plat->enh_desc)
|
||||
@@ -44,11 +44,12 @@ static int stmmac_jumbo_frm(void *p, struct sk_buff *skb, int csum)
|
||||
|
||||
len = nopaged_len - bmax;
|
||||
|
||||
desc->des2 = dma_map_single(priv->device, skb->data,
|
||||
bmax, DMA_TO_DEVICE);
|
||||
if (dma_mapping_error(priv->device, desc->des2))
|
||||
des2 = dma_map_single(priv->device, skb->data,
|
||||
bmax, DMA_TO_DEVICE);
|
||||
desc->des2 = cpu_to_le32(des2);
|
||||
if (dma_mapping_error(priv->device, des2))
|
||||
return -1;
|
||||
priv->tx_skbuff_dma[entry].buf = desc->des2;
|
||||
priv->tx_skbuff_dma[entry].buf = des2;
|
||||
priv->tx_skbuff_dma[entry].len = bmax;
|
||||
/* do not close the descriptor and do not set own bit */
|
||||
priv->hw->desc->prepare_tx_desc(desc, 1, bmax, csum, STMMAC_CHAIN_MODE,
|
||||
@@ -60,12 +61,13 @@ static int stmmac_jumbo_frm(void *p, struct sk_buff *skb, int csum)
|
||||
desc = priv->dma_tx + entry;
|
||||
|
||||
if (len > bmax) {
|
||||
desc->des2 = dma_map_single(priv->device,
|
||||
(skb->data + bmax * i),
|
||||
bmax, DMA_TO_DEVICE);
|
||||
if (dma_mapping_error(priv->device, desc->des2))
|
||||
des2 = dma_map_single(priv->device,
|
||||
(skb->data + bmax * i),
|
||||
bmax, DMA_TO_DEVICE);
|
||||
desc->des2 = cpu_to_le32(des2);
|
||||
if (dma_mapping_error(priv->device, des2))
|
||||
return -1;
|
||||
priv->tx_skbuff_dma[entry].buf = desc->des2;
|
||||
priv->tx_skbuff_dma[entry].buf = des2;
|
||||
priv->tx_skbuff_dma[entry].len = bmax;
|
||||
priv->hw->desc->prepare_tx_desc(desc, 0, bmax, csum,
|
||||
STMMAC_CHAIN_MODE, 1,
|
||||
@@ -73,12 +75,13 @@ static int stmmac_jumbo_frm(void *p, struct sk_buff *skb, int csum)
|
||||
len -= bmax;
|
||||
i++;
|
||||
} else {
|
||||
desc->des2 = dma_map_single(priv->device,
|
||||
(skb->data + bmax * i), len,
|
||||
DMA_TO_DEVICE);
|
||||
if (dma_mapping_error(priv->device, desc->des2))
|
||||
des2 = dma_map_single(priv->device,
|
||||
(skb->data + bmax * i), len,
|
||||
DMA_TO_DEVICE);
|
||||
desc->des2 = cpu_to_le32(des2);
|
||||
if (dma_mapping_error(priv->device, des2))
|
||||
return -1;
|
||||
priv->tx_skbuff_dma[entry].buf = desc->des2;
|
||||
priv->tx_skbuff_dma[entry].buf = des2;
|
||||
priv->tx_skbuff_dma[entry].len = len;
|
||||
/* last descriptor can be set now */
|
||||
priv->hw->desc->prepare_tx_desc(desc, 0, len, csum,
|
||||
@@ -119,19 +122,19 @@ static void stmmac_init_dma_chain(void *des, dma_addr_t phy_addr,
|
||||
struct dma_extended_desc *p = (struct dma_extended_desc *)des;
|
||||
for (i = 0; i < (size - 1); i++) {
|
||||
dma_phy += sizeof(struct dma_extended_desc);
|
||||
p->basic.des3 = (unsigned int)dma_phy;
|
||||
p->basic.des3 = cpu_to_le32((unsigned int)dma_phy);
|
||||
p++;
|
||||
}
|
||||
p->basic.des3 = (unsigned int)phy_addr;
|
||||
p->basic.des3 = cpu_to_le32((unsigned int)phy_addr);
|
||||
|
||||
} else {
|
||||
struct dma_desc *p = (struct dma_desc *)des;
|
||||
for (i = 0; i < (size - 1); i++) {
|
||||
dma_phy += sizeof(struct dma_desc);
|
||||
p->des3 = (unsigned int)dma_phy;
|
||||
p->des3 = cpu_to_le32((unsigned int)dma_phy);
|
||||
p++;
|
||||
}
|
||||
p->des3 = (unsigned int)phy_addr;
|
||||
p->des3 = cpu_to_le32((unsigned int)phy_addr);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -144,10 +147,10 @@ static void stmmac_refill_desc3(void *priv_ptr, struct dma_desc *p)
|
||||
* 1588-2002 time stamping is enabled, hence reinitialize it
|
||||
* to keep explicit chaining in the descriptor.
|
||||
*/
|
||||
p->des3 = (unsigned int)(priv->dma_rx_phy +
|
||||
(((priv->dirty_rx) + 1) %
|
||||
DMA_RX_SIZE) *
|
||||
sizeof(struct dma_desc));
|
||||
p->des3 = cpu_to_le32((unsigned int)(priv->dma_rx_phy +
|
||||
(((priv->dirty_rx) + 1) %
|
||||
DMA_RX_SIZE) *
|
||||
sizeof(struct dma_desc)));
|
||||
}
|
||||
|
||||
static void stmmac_clean_desc3(void *priv_ptr, struct dma_desc *p)
|
||||
@@ -161,9 +164,9 @@ static void stmmac_clean_desc3(void *priv_ptr, struct dma_desc *p)
|
||||
* 1588-2002 time stamping is enabled, hence reinitialize it
|
||||
* to keep explicit chaining in the descriptor.
|
||||
*/
|
||||
p->des3 = (unsigned int)((priv->dma_tx_phy +
|
||||
((priv->dirty_tx + 1) % DMA_TX_SIZE))
|
||||
* sizeof(struct dma_desc));
|
||||
p->des3 = cpu_to_le32((unsigned int)((priv->dma_tx_phy +
|
||||
((priv->dirty_tx + 1) % DMA_TX_SIZE))
|
||||
* sizeof(struct dma_desc)));
|
||||
}
|
||||
|
||||
const struct stmmac_mode_ops chain_mode_ops = {
|
||||
|
||||
@@ -87,7 +87,7 @@
|
||||
#define TDES0_ERROR_SUMMARY BIT(15)
|
||||
#define TDES0_IP_HEADER_ERROR BIT(16)
|
||||
#define TDES0_TIME_STAMP_STATUS BIT(17)
|
||||
#define TDES0_OWN BIT(31)
|
||||
#define TDES0_OWN ((u32)BIT(31)) /* silence sparse */
|
||||
/* TDES1 */
|
||||
#define TDES1_BUFFER1_SIZE_MASK GENMASK(10, 0)
|
||||
#define TDES1_BUFFER2_SIZE_MASK GENMASK(21, 11)
|
||||
@@ -130,7 +130,7 @@
|
||||
#define ETDES0_FIRST_SEGMENT BIT(28)
|
||||
#define ETDES0_LAST_SEGMENT BIT(29)
|
||||
#define ETDES0_INTERRUPT BIT(30)
|
||||
#define ETDES0_OWN BIT(31)
|
||||
#define ETDES0_OWN ((u32)BIT(31)) /* silence sparse */
|
||||
/* TDES1 */
|
||||
#define ETDES1_BUFFER1_SIZE_MASK GENMASK(12, 0)
|
||||
#define ETDES1_BUFFER2_SIZE_MASK GENMASK(28, 16)
|
||||
@@ -170,19 +170,19 @@
|
||||
|
||||
/* Basic descriptor structure for normal and alternate descriptors */
|
||||
struct dma_desc {
|
||||
unsigned int des0;
|
||||
unsigned int des1;
|
||||
unsigned int des2;
|
||||
unsigned int des3;
|
||||
__le32 des0;
|
||||
__le32 des1;
|
||||
__le32 des2;
|
||||
__le32 des3;
|
||||
};
|
||||
|
||||
/* Extended descriptor structure (e.g. >= databook 3.50a) */
|
||||
struct dma_extended_desc {
|
||||
struct dma_desc basic; /* Basic descriptors */
|
||||
unsigned int des4; /* Extended Status */
|
||||
unsigned int des5; /* Reserved */
|
||||
unsigned int des6; /* Tx/Rx Timestamp Low */
|
||||
unsigned int des7; /* Tx/Rx Timestamp High */
|
||||
__le32 des4; /* Extended Status */
|
||||
__le32 des5; /* Reserved */
|
||||
__le32 des6; /* Tx/Rx Timestamp Low */
|
||||
__le32 des7; /* Tx/Rx Timestamp High */
|
||||
};
|
||||
|
||||
/* Transmit checksum insertion control */
|
||||
|
||||
@@ -35,47 +35,50 @@
|
||||
/* Enhanced descriptors */
|
||||
static inline void ehn_desc_rx_set_on_ring(struct dma_desc *p, int end)
|
||||
{
|
||||
p->des1 |= ((BUF_SIZE_8KiB - 1) << ERDES1_BUFFER2_SIZE_SHIFT)
|
||||
& ERDES1_BUFFER2_SIZE_MASK;
|
||||
p->des1 |= cpu_to_le32(((BUF_SIZE_8KiB - 1)
|
||||
<< ERDES1_BUFFER2_SIZE_SHIFT)
|
||||
& ERDES1_BUFFER2_SIZE_MASK);
|
||||
|
||||
if (end)
|
||||
p->des1 |= ERDES1_END_RING;
|
||||
p->des1 |= cpu_to_le32(ERDES1_END_RING);
|
||||
}
|
||||
|
||||
static inline void enh_desc_end_tx_desc_on_ring(struct dma_desc *p, int end)
|
||||
{
|
||||
if (end)
|
||||
p->des0 |= ETDES0_END_RING;
|
||||
p->des0 |= cpu_to_le32(ETDES0_END_RING);
|
||||
else
|
||||
p->des0 &= ~ETDES0_END_RING;
|
||||
p->des0 &= cpu_to_le32(~ETDES0_END_RING);
|
||||
}
|
||||
|
||||
static inline void enh_set_tx_desc_len_on_ring(struct dma_desc *p, int len)
|
||||
{
|
||||
if (unlikely(len > BUF_SIZE_4KiB)) {
|
||||
p->des1 |= (((len - BUF_SIZE_4KiB) << ETDES1_BUFFER2_SIZE_SHIFT)
|
||||
p->des1 |= cpu_to_le32((((len - BUF_SIZE_4KiB)
|
||||
<< ETDES1_BUFFER2_SIZE_SHIFT)
|
||||
& ETDES1_BUFFER2_SIZE_MASK) | (BUF_SIZE_4KiB
|
||||
& ETDES1_BUFFER1_SIZE_MASK);
|
||||
& ETDES1_BUFFER1_SIZE_MASK));
|
||||
} else
|
||||
p->des1 |= (len & ETDES1_BUFFER1_SIZE_MASK);
|
||||
p->des1 |= cpu_to_le32((len & ETDES1_BUFFER1_SIZE_MASK));
|
||||
}
|
||||
|
||||
/* Normal descriptors */
|
||||
static inline void ndesc_rx_set_on_ring(struct dma_desc *p, int end)
|
||||
{
|
||||
p->des1 |= ((BUF_SIZE_2KiB - 1) << RDES1_BUFFER2_SIZE_SHIFT)
|
||||
& RDES1_BUFFER2_SIZE_MASK;
|
||||
p->des1 |= cpu_to_le32(((BUF_SIZE_2KiB - 1)
|
||||
<< RDES1_BUFFER2_SIZE_SHIFT)
|
||||
& RDES1_BUFFER2_SIZE_MASK);
|
||||
|
||||
if (end)
|
||||
p->des1 |= RDES1_END_RING;
|
||||
p->des1 |= cpu_to_le32(RDES1_END_RING);
|
||||
}
|
||||
|
||||
static inline void ndesc_end_tx_desc_on_ring(struct dma_desc *p, int end)
|
||||
{
|
||||
if (end)
|
||||
p->des1 |= TDES1_END_RING;
|
||||
p->des1 |= cpu_to_le32(TDES1_END_RING);
|
||||
else
|
||||
p->des1 &= ~TDES1_END_RING;
|
||||
p->des1 &= cpu_to_le32(~TDES1_END_RING);
|
||||
}
|
||||
|
||||
static inline void norm_set_tx_desc_len_on_ring(struct dma_desc *p, int len)
|
||||
@@ -83,10 +86,11 @@ static inline void norm_set_tx_desc_len_on_ring(struct dma_desc *p, int len)
|
||||
if (unlikely(len > BUF_SIZE_2KiB)) {
|
||||
unsigned int buffer1 = (BUF_SIZE_2KiB - 1)
|
||||
& TDES1_BUFFER1_SIZE_MASK;
|
||||
p->des1 |= ((((len - buffer1) << TDES1_BUFFER2_SIZE_SHIFT)
|
||||
& TDES1_BUFFER2_SIZE_MASK) | buffer1);
|
||||
p->des1 |= cpu_to_le32((((len - buffer1)
|
||||
<< TDES1_BUFFER2_SIZE_SHIFT)
|
||||
& TDES1_BUFFER2_SIZE_MASK) | buffer1);
|
||||
} else
|
||||
p->des1 |= (len & TDES1_BUFFER1_SIZE_MASK);
|
||||
p->des1 |= cpu_to_le32((len & TDES1_BUFFER1_SIZE_MASK));
|
||||
}
|
||||
|
||||
/* Specific functions used for Chain mode */
|
||||
@@ -94,32 +98,32 @@ static inline void norm_set_tx_desc_len_on_ring(struct dma_desc *p, int len)
|
||||
/* Enhanced descriptors */
|
||||
static inline void ehn_desc_rx_set_on_chain(struct dma_desc *p)
|
||||
{
|
||||
p->des1 |= ERDES1_SECOND_ADDRESS_CHAINED;
|
||||
p->des1 |= cpu_to_le32(ERDES1_SECOND_ADDRESS_CHAINED);
|
||||
}
|
||||
|
||||
static inline void enh_desc_end_tx_desc_on_chain(struct dma_desc *p)
|
||||
{
|
||||
p->des0 |= ETDES0_SECOND_ADDRESS_CHAINED;
|
||||
p->des0 |= cpu_to_le32(ETDES0_SECOND_ADDRESS_CHAINED);
|
||||
}
|
||||
|
||||
static inline void enh_set_tx_desc_len_on_chain(struct dma_desc *p, int len)
|
||||
{
|
||||
p->des1 |= (len & ETDES1_BUFFER1_SIZE_MASK);
|
||||
p->des1 |= cpu_to_le32(len & ETDES1_BUFFER1_SIZE_MASK);
|
||||
}
|
||||
|
||||
/* Normal descriptors */
|
||||
static inline void ndesc_rx_set_on_chain(struct dma_desc *p, int end)
|
||||
{
|
||||
p->des1 |= RDES1_SECOND_ADDRESS_CHAINED;
|
||||
p->des1 |= cpu_to_le32(RDES1_SECOND_ADDRESS_CHAINED);
|
||||
}
|
||||
|
||||
static inline void ndesc_tx_set_on_chain(struct dma_desc *p)
|
||||
{
|
||||
p->des1 |= TDES1_SECOND_ADDRESS_CHAINED;
|
||||
p->des1 |= cpu_to_le32(TDES1_SECOND_ADDRESS_CHAINED);
|
||||
}
|
||||
|
||||
static inline void norm_set_tx_desc_len_on_chain(struct dma_desc *p, int len)
|
||||
{
|
||||
p->des1 |= len & TDES1_BUFFER1_SIZE_MASK;
|
||||
p->des1 |= cpu_to_le32(len & TDES1_BUFFER1_SIZE_MASK);
|
||||
}
|
||||
#endif /* __DESC_COM_H__ */
|
||||
|
||||
@@ -877,8 +877,10 @@ static int rk_gmac_powerup(struct rk_priv_data *bsp_priv)
|
||||
}
|
||||
|
||||
ret = phy_power_on(bsp_priv, true);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
gmac_clk_enable(bsp_priv, false);
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = gmac_clk_enable(bsp_priv, true);
|
||||
if (ret)
|
||||
|
||||
@@ -23,7 +23,7 @@ static int dwmac4_wrback_get_tx_status(void *data, struct stmmac_extra_stats *x,
|
||||
unsigned int tdes3;
|
||||
int ret = tx_done;
|
||||
|
||||
tdes3 = p->des3;
|
||||
tdes3 = le32_to_cpu(p->des3);
|
||||
|
||||
/* Get tx owner first */
|
||||
if (unlikely(tdes3 & TDES3_OWN))
|
||||
@@ -77,9 +77,9 @@ static int dwmac4_wrback_get_rx_status(void *data, struct stmmac_extra_stats *x,
|
||||
struct dma_desc *p)
|
||||
{
|
||||
struct net_device_stats *stats = (struct net_device_stats *)data;
|
||||
unsigned int rdes1 = p->des1;
|
||||
unsigned int rdes2 = p->des2;
|
||||
unsigned int rdes3 = p->des3;
|
||||
unsigned int rdes1 = le32_to_cpu(p->des1);
|
||||
unsigned int rdes2 = le32_to_cpu(p->des2);
|
||||
unsigned int rdes3 = le32_to_cpu(p->des3);
|
||||
int message_type;
|
||||
int ret = good_frame;
|
||||
|
||||
@@ -176,47 +176,48 @@ static int dwmac4_wrback_get_rx_status(void *data, struct stmmac_extra_stats *x,
|
||||
|
||||
static int dwmac4_rd_get_tx_len(struct dma_desc *p)
|
||||
{
|
||||
return (p->des2 & TDES2_BUFFER1_SIZE_MASK);
|
||||
return (le32_to_cpu(p->des2) & TDES2_BUFFER1_SIZE_MASK);
|
||||
}
|
||||
|
||||
static int dwmac4_get_tx_owner(struct dma_desc *p)
|
||||
{
|
||||
return (p->des3 & TDES3_OWN) >> TDES3_OWN_SHIFT;
|
||||
return (le32_to_cpu(p->des3) & TDES3_OWN) >> TDES3_OWN_SHIFT;
|
||||
}
|
||||
|
||||
static void dwmac4_set_tx_owner(struct dma_desc *p)
|
||||
{
|
||||
p->des3 |= TDES3_OWN;
|
||||
p->des3 |= cpu_to_le32(TDES3_OWN);
|
||||
}
|
||||
|
||||
static void dwmac4_set_rx_owner(struct dma_desc *p)
|
||||
{
|
||||
p->des3 |= RDES3_OWN;
|
||||
p->des3 |= cpu_to_le32(RDES3_OWN);
|
||||
}
|
||||
|
||||
static int dwmac4_get_tx_ls(struct dma_desc *p)
|
||||
{
|
||||
return (p->des3 & TDES3_LAST_DESCRIPTOR) >> TDES3_LAST_DESCRIPTOR_SHIFT;
|
||||
return (le32_to_cpu(p->des3) & TDES3_LAST_DESCRIPTOR)
|
||||
>> TDES3_LAST_DESCRIPTOR_SHIFT;
|
||||
}
|
||||
|
||||
static int dwmac4_wrback_get_rx_frame_len(struct dma_desc *p, int rx_coe)
|
||||
{
|
||||
return (p->des3 & RDES3_PACKET_SIZE_MASK);
|
||||
return (le32_to_cpu(p->des3) & RDES3_PACKET_SIZE_MASK);
|
||||
}
|
||||
|
||||
static void dwmac4_rd_enable_tx_timestamp(struct dma_desc *p)
|
||||
{
|
||||
p->des2 |= TDES2_TIMESTAMP_ENABLE;
|
||||
p->des2 |= cpu_to_le32(TDES2_TIMESTAMP_ENABLE);
|
||||
}
|
||||
|
||||
static int dwmac4_wrback_get_tx_timestamp_status(struct dma_desc *p)
|
||||
{
|
||||
/* Context type from W/B descriptor must be zero */
|
||||
if (p->des3 & TDES3_CONTEXT_TYPE)
|
||||
if (le32_to_cpu(p->des3) & TDES3_CONTEXT_TYPE)
|
||||
return -EINVAL;
|
||||
|
||||
/* Tx Timestamp Status is 1 so des0 and des1'll have valid values */
|
||||
if (p->des3 & TDES3_TIMESTAMP_STATUS)
|
||||
if (le32_to_cpu(p->des3) & TDES3_TIMESTAMP_STATUS)
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
@@ -227,9 +228,9 @@ static inline u64 dwmac4_get_timestamp(void *desc, u32 ats)
|
||||
struct dma_desc *p = (struct dma_desc *)desc;
|
||||
u64 ns;
|
||||
|
||||
ns = p->des0;
|
||||
ns = le32_to_cpu(p->des0);
|
||||
/* convert high/sec time stamp value to nanosecond */
|
||||
ns += p->des1 * 1000000000ULL;
|
||||
ns += le32_to_cpu(p->des1) * 1000000000ULL;
|
||||
|
||||
return ns;
|
||||
}
|
||||
@@ -267,7 +268,7 @@ static int dwmac4_wrback_get_rx_timestamp_status(void *desc, u32 ats)
|
||||
|
||||
/* Get the status from normal w/b descriptor */
|
||||
if (likely(p->des3 & TDES3_RS1V)) {
|
||||
if (likely(p->des1 & RDES1_TIMESTAMP_AVAILABLE)) {
|
||||
if (likely(le32_to_cpu(p->des1) & RDES1_TIMESTAMP_AVAILABLE)) {
|
||||
int i = 0;
|
||||
|
||||
/* Check if timestamp is OK from context descriptor */
|
||||
@@ -290,10 +291,10 @@ exit:
|
||||
static void dwmac4_rd_init_rx_desc(struct dma_desc *p, int disable_rx_ic,
|
||||
int mode, int end)
|
||||
{
|
||||
p->des3 = RDES3_OWN | RDES3_BUFFER1_VALID_ADDR;
|
||||
p->des3 = cpu_to_le32(RDES3_OWN | RDES3_BUFFER1_VALID_ADDR);
|
||||
|
||||
if (!disable_rx_ic)
|
||||
p->des3 |= RDES3_INT_ON_COMPLETION_EN;
|
||||
p->des3 |= cpu_to_le32(RDES3_INT_ON_COMPLETION_EN);
|
||||
}
|
||||
|
||||
static void dwmac4_rd_init_tx_desc(struct dma_desc *p, int mode, int end)
|
||||
@@ -308,9 +309,9 @@ static void dwmac4_rd_prepare_tx_desc(struct dma_desc *p, int is_fs, int len,
|
||||
bool csum_flag, int mode, bool tx_own,
|
||||
bool ls)
|
||||
{
|
||||
unsigned int tdes3 = p->des3;
|
||||
unsigned int tdes3 = le32_to_cpu(p->des3);
|
||||
|
||||
p->des2 |= (len & TDES2_BUFFER1_SIZE_MASK);
|
||||
p->des2 |= cpu_to_le32(len & TDES2_BUFFER1_SIZE_MASK);
|
||||
|
||||
if (is_fs)
|
||||
tdes3 |= TDES3_FIRST_DESCRIPTOR;
|
||||
@@ -338,7 +339,7 @@ static void dwmac4_rd_prepare_tx_desc(struct dma_desc *p, int is_fs, int len,
|
||||
*/
|
||||
wmb();
|
||||
|
||||
p->des3 = tdes3;
|
||||
p->des3 = cpu_to_le32(tdes3);
|
||||
}
|
||||
|
||||
static void dwmac4_rd_prepare_tso_tx_desc(struct dma_desc *p, int is_fs,
|
||||
@@ -346,14 +347,14 @@ static void dwmac4_rd_prepare_tso_tx_desc(struct dma_desc *p, int is_fs,
|
||||
bool ls, unsigned int tcphdrlen,
|
||||
unsigned int tcppayloadlen)
|
||||
{
|
||||
unsigned int tdes3 = p->des3;
|
||||
unsigned int tdes3 = le32_to_cpu(p->des3);
|
||||
|
||||
if (len1)
|
||||
p->des2 |= (len1 & TDES2_BUFFER1_SIZE_MASK);
|
||||
p->des2 |= cpu_to_le32((len1 & TDES2_BUFFER1_SIZE_MASK));
|
||||
|
||||
if (len2)
|
||||
p->des2 |= (len2 << TDES2_BUFFER2_SIZE_MASK_SHIFT)
|
||||
& TDES2_BUFFER2_SIZE_MASK;
|
||||
p->des2 |= cpu_to_le32((len2 << TDES2_BUFFER2_SIZE_MASK_SHIFT)
|
||||
& TDES2_BUFFER2_SIZE_MASK);
|
||||
|
||||
if (is_fs) {
|
||||
tdes3 |= TDES3_FIRST_DESCRIPTOR |
|
||||
@@ -381,7 +382,7 @@ static void dwmac4_rd_prepare_tso_tx_desc(struct dma_desc *p, int is_fs,
|
||||
*/
|
||||
wmb();
|
||||
|
||||
p->des3 = tdes3;
|
||||
p->des3 = cpu_to_le32(tdes3);
|
||||
}
|
||||
|
||||
static void dwmac4_release_tx_desc(struct dma_desc *p, int mode)
|
||||
@@ -392,7 +393,7 @@ static void dwmac4_release_tx_desc(struct dma_desc *p, int mode)
|
||||
|
||||
static void dwmac4_rd_set_tx_ic(struct dma_desc *p)
|
||||
{
|
||||
p->des2 |= TDES2_INTERRUPT_ON_COMPLETION;
|
||||
p->des2 |= cpu_to_le32(TDES2_INTERRUPT_ON_COMPLETION);
|
||||
}
|
||||
|
||||
static void dwmac4_display_ring(void *head, unsigned int size, bool rx)
|
||||
@@ -405,7 +406,8 @@ static void dwmac4_display_ring(void *head, unsigned int size, bool rx)
|
||||
for (i = 0; i < size; i++) {
|
||||
pr_info("%d [0x%x]: 0x%x 0x%x 0x%x 0x%x\n",
|
||||
i, (unsigned int)virt_to_phys(p),
|
||||
p->des0, p->des1, p->des2, p->des3);
|
||||
le32_to_cpu(p->des0), le32_to_cpu(p->des1),
|
||||
le32_to_cpu(p->des2), le32_to_cpu(p->des3));
|
||||
p++;
|
||||
}
|
||||
}
|
||||
@@ -414,8 +416,8 @@ static void dwmac4_set_mss_ctxt(struct dma_desc *p, unsigned int mss)
|
||||
{
|
||||
p->des0 = 0;
|
||||
p->des1 = 0;
|
||||
p->des2 = mss;
|
||||
p->des3 = TDES3_CONTEXT_TYPE | TDES3_CTXT_TCMSSV;
|
||||
p->des2 = cpu_to_le32(mss);
|
||||
p->des3 = cpu_to_le32(TDES3_CONTEXT_TYPE | TDES3_CTXT_TCMSSV);
|
||||
}
|
||||
|
||||
const struct stmmac_desc_ops dwmac4_desc_ops = {
|
||||
|
||||
@@ -30,7 +30,7 @@ static int enh_desc_get_tx_status(void *data, struct stmmac_extra_stats *x,
|
||||
struct dma_desc *p, void __iomem *ioaddr)
|
||||
{
|
||||
struct net_device_stats *stats = (struct net_device_stats *)data;
|
||||
unsigned int tdes0 = p->des0;
|
||||
unsigned int tdes0 = le32_to_cpu(p->des0);
|
||||
int ret = tx_done;
|
||||
|
||||
/* Get tx owner first */
|
||||
@@ -95,7 +95,7 @@ static int enh_desc_get_tx_status(void *data, struct stmmac_extra_stats *x,
|
||||
|
||||
static int enh_desc_get_tx_len(struct dma_desc *p)
|
||||
{
|
||||
return (p->des1 & ETDES1_BUFFER1_SIZE_MASK);
|
||||
return (le32_to_cpu(p->des1) & ETDES1_BUFFER1_SIZE_MASK);
|
||||
}
|
||||
|
||||
static int enh_desc_coe_rdes0(int ipc_err, int type, int payload_err)
|
||||
@@ -134,8 +134,8 @@ static int enh_desc_coe_rdes0(int ipc_err, int type, int payload_err)
|
||||
static void enh_desc_get_ext_status(void *data, struct stmmac_extra_stats *x,
|
||||
struct dma_extended_desc *p)
|
||||
{
|
||||
unsigned int rdes0 = p->basic.des0;
|
||||
unsigned int rdes4 = p->des4;
|
||||
unsigned int rdes0 = le32_to_cpu(p->basic.des0);
|
||||
unsigned int rdes4 = le32_to_cpu(p->des4);
|
||||
|
||||
if (unlikely(rdes0 & ERDES0_RX_MAC_ADDR)) {
|
||||
int message_type = (rdes4 & ERDES4_MSG_TYPE_MASK) >> 8;
|
||||
@@ -199,7 +199,7 @@ static int enh_desc_get_rx_status(void *data, struct stmmac_extra_stats *x,
|
||||
struct dma_desc *p)
|
||||
{
|
||||
struct net_device_stats *stats = (struct net_device_stats *)data;
|
||||
unsigned int rdes0 = p->des0;
|
||||
unsigned int rdes0 = le32_to_cpu(p->des0);
|
||||
int ret = good_frame;
|
||||
|
||||
if (unlikely(rdes0 & RDES0_OWN))
|
||||
@@ -265,8 +265,8 @@ static int enh_desc_get_rx_status(void *data, struct stmmac_extra_stats *x,
|
||||
static void enh_desc_init_rx_desc(struct dma_desc *p, int disable_rx_ic,
|
||||
int mode, int end)
|
||||
{
|
||||
p->des0 |= RDES0_OWN;
|
||||
p->des1 |= ((BUF_SIZE_8KiB - 1) & ERDES1_BUFFER1_SIZE_MASK);
|
||||
p->des0 |= cpu_to_le32(RDES0_OWN);
|
||||
p->des1 |= cpu_to_le32((BUF_SIZE_8KiB - 1) & ERDES1_BUFFER1_SIZE_MASK);
|
||||
|
||||
if (mode == STMMAC_CHAIN_MODE)
|
||||
ehn_desc_rx_set_on_chain(p);
|
||||
@@ -274,12 +274,12 @@ static void enh_desc_init_rx_desc(struct dma_desc *p, int disable_rx_ic,
|
||||
ehn_desc_rx_set_on_ring(p, end);
|
||||
|
||||
if (disable_rx_ic)
|
||||
p->des1 |= ERDES1_DISABLE_IC;
|
||||
p->des1 |= cpu_to_le32(ERDES1_DISABLE_IC);
|
||||
}
|
||||
|
||||
static void enh_desc_init_tx_desc(struct dma_desc *p, int mode, int end)
|
||||
{
|
||||
p->des0 &= ~ETDES0_OWN;
|
||||
p->des0 &= cpu_to_le32(~ETDES0_OWN);
|
||||
if (mode == STMMAC_CHAIN_MODE)
|
||||
enh_desc_end_tx_desc_on_chain(p);
|
||||
else
|
||||
@@ -288,27 +288,27 @@ static void enh_desc_init_tx_desc(struct dma_desc *p, int mode, int end)
|
||||
|
||||
static int enh_desc_get_tx_owner(struct dma_desc *p)
|
||||
{
|
||||
return (p->des0 & ETDES0_OWN) >> 31;
|
||||
return (le32_to_cpu(p->des0) & ETDES0_OWN) >> 31;
|
||||
}
|
||||
|
||||
static void enh_desc_set_tx_owner(struct dma_desc *p)
|
||||
{
|
||||
p->des0 |= ETDES0_OWN;
|
||||
p->des0 |= cpu_to_le32(ETDES0_OWN);
|
||||
}
|
||||
|
||||
static void enh_desc_set_rx_owner(struct dma_desc *p)
|
||||
{
|
||||
p->des0 |= RDES0_OWN;
|
||||
p->des0 |= cpu_to_le32(RDES0_OWN);
|
||||
}
|
||||
|
||||
static int enh_desc_get_tx_ls(struct dma_desc *p)
|
||||
{
|
||||
return (p->des0 & ETDES0_LAST_SEGMENT) >> 29;
|
||||
return (le32_to_cpu(p->des0) & ETDES0_LAST_SEGMENT) >> 29;
|
||||
}
|
||||
|
||||
static void enh_desc_release_tx_desc(struct dma_desc *p, int mode)
|
||||
{
|
||||
int ter = (p->des0 & ETDES0_END_RING) >> 21;
|
||||
int ter = (le32_to_cpu(p->des0) & ETDES0_END_RING) >> 21;
|
||||
|
||||
memset(p, 0, offsetof(struct dma_desc, des2));
|
||||
if (mode == STMMAC_CHAIN_MODE)
|
||||
@@ -321,7 +321,7 @@ static void enh_desc_prepare_tx_desc(struct dma_desc *p, int is_fs, int len,
|
||||
bool csum_flag, int mode, bool tx_own,
|
||||
bool ls)
|
||||
{
|
||||
unsigned int tdes0 = p->des0;
|
||||
unsigned int tdes0 = le32_to_cpu(p->des0);
|
||||
|
||||
if (mode == STMMAC_CHAIN_MODE)
|
||||
enh_set_tx_desc_len_on_chain(p, len);
|
||||
@@ -352,12 +352,12 @@ static void enh_desc_prepare_tx_desc(struct dma_desc *p, int is_fs, int len,
|
||||
*/
|
||||
wmb();
|
||||
|
||||
p->des0 = tdes0;
|
||||
p->des0 = cpu_to_le32(tdes0);
|
||||
}
|
||||
|
||||
static void enh_desc_set_tx_ic(struct dma_desc *p)
|
||||
{
|
||||
p->des0 |= ETDES0_INTERRUPT;
|
||||
p->des0 |= cpu_to_le32(ETDES0_INTERRUPT);
|
||||
}
|
||||
|
||||
static int enh_desc_get_rx_frame_len(struct dma_desc *p, int rx_coe_type)
|
||||
@@ -372,18 +372,18 @@ static int enh_desc_get_rx_frame_len(struct dma_desc *p, int rx_coe_type)
|
||||
if (rx_coe_type == STMMAC_RX_COE_TYPE1)
|
||||
csum = 2;
|
||||
|
||||
return (((p->des0 & RDES0_FRAME_LEN_MASK) >> RDES0_FRAME_LEN_SHIFT) -
|
||||
csum);
|
||||
return (((le32_to_cpu(p->des0) & RDES0_FRAME_LEN_MASK)
|
||||
>> RDES0_FRAME_LEN_SHIFT) - csum);
|
||||
}
|
||||
|
||||
static void enh_desc_enable_tx_timestamp(struct dma_desc *p)
|
||||
{
|
||||
p->des0 |= ETDES0_TIME_STAMP_ENABLE;
|
||||
p->des0 |= cpu_to_le32(ETDES0_TIME_STAMP_ENABLE);
|
||||
}
|
||||
|
||||
static int enh_desc_get_tx_timestamp_status(struct dma_desc *p)
|
||||
{
|
||||
return (p->des0 & ETDES0_TIME_STAMP_STATUS) >> 17;
|
||||
return (le32_to_cpu(p->des0) & ETDES0_TIME_STAMP_STATUS) >> 17;
|
||||
}
|
||||
|
||||
static u64 enh_desc_get_timestamp(void *desc, u32 ats)
|
||||
@@ -392,13 +392,13 @@ static u64 enh_desc_get_timestamp(void *desc, u32 ats)
|
||||
|
||||
if (ats) {
|
||||
struct dma_extended_desc *p = (struct dma_extended_desc *)desc;
|
||||
ns = p->des6;
|
||||
ns = le32_to_cpu(p->des6);
|
||||
/* convert high/sec time stamp value to nanosecond */
|
||||
ns += p->des7 * 1000000000ULL;
|
||||
ns += le32_to_cpu(p->des7) * 1000000000ULL;
|
||||
} else {
|
||||
struct dma_desc *p = (struct dma_desc *)desc;
|
||||
ns = p->des2;
|
||||
ns += p->des3 * 1000000000ULL;
|
||||
ns = le32_to_cpu(p->des2);
|
||||
ns += le32_to_cpu(p->des3) * 1000000000ULL;
|
||||
}
|
||||
|
||||
return ns;
|
||||
@@ -408,10 +408,11 @@ static int enh_desc_get_rx_timestamp_status(void *desc, u32 ats)
|
||||
{
|
||||
if (ats) {
|
||||
struct dma_extended_desc *p = (struct dma_extended_desc *)desc;
|
||||
return (p->basic.des0 & RDES0_IPC_CSUM_ERROR) >> 7;
|
||||
return (le32_to_cpu(p->basic.des0) & RDES0_IPC_CSUM_ERROR) >> 7;
|
||||
} else {
|
||||
struct dma_desc *p = (struct dma_desc *)desc;
|
||||
if ((p->des2 == 0xffffffff) && (p->des3 == 0xffffffff))
|
||||
if ((le32_to_cpu(p->des2) == 0xffffffff) &&
|
||||
(le32_to_cpu(p->des3) == 0xffffffff))
|
||||
/* timestamp is corrupted, hence don't store it */
|
||||
return 0;
|
||||
else
|
||||
|
||||
@@ -30,8 +30,8 @@ static int ndesc_get_tx_status(void *data, struct stmmac_extra_stats *x,
|
||||
struct dma_desc *p, void __iomem *ioaddr)
|
||||
{
|
||||
struct net_device_stats *stats = (struct net_device_stats *)data;
|
||||
unsigned int tdes0 = p->des0;
|
||||
unsigned int tdes1 = p->des1;
|
||||
unsigned int tdes0 = le32_to_cpu(p->des0);
|
||||
unsigned int tdes1 = le32_to_cpu(p->des1);
|
||||
int ret = tx_done;
|
||||
|
||||
/* Get tx owner first */
|
||||
@@ -77,7 +77,7 @@ static int ndesc_get_tx_status(void *data, struct stmmac_extra_stats *x,
|
||||
|
||||
static int ndesc_get_tx_len(struct dma_desc *p)
|
||||
{
|
||||
return (p->des1 & RDES1_BUFFER1_SIZE_MASK);
|
||||
return (le32_to_cpu(p->des1) & RDES1_BUFFER1_SIZE_MASK);
|
||||
}
|
||||
|
||||
/* This function verifies if each incoming frame has some errors
|
||||
@@ -88,7 +88,7 @@ static int ndesc_get_rx_status(void *data, struct stmmac_extra_stats *x,
|
||||
struct dma_desc *p)
|
||||
{
|
||||
int ret = good_frame;
|
||||
unsigned int rdes0 = p->des0;
|
||||
unsigned int rdes0 = le32_to_cpu(p->des0);
|
||||
struct net_device_stats *stats = (struct net_device_stats *)data;
|
||||
|
||||
if (unlikely(rdes0 & RDES0_OWN))
|
||||
@@ -141,8 +141,8 @@ static int ndesc_get_rx_status(void *data, struct stmmac_extra_stats *x,
|
||||
static void ndesc_init_rx_desc(struct dma_desc *p, int disable_rx_ic, int mode,
|
||||
int end)
|
||||
{
|
||||
p->des0 |= RDES0_OWN;
|
||||
p->des1 |= (BUF_SIZE_2KiB - 1) & RDES1_BUFFER1_SIZE_MASK;
|
||||
p->des0 |= cpu_to_le32(RDES0_OWN);
|
||||
p->des1 |= cpu_to_le32((BUF_SIZE_2KiB - 1) & RDES1_BUFFER1_SIZE_MASK);
|
||||
|
||||
if (mode == STMMAC_CHAIN_MODE)
|
||||
ndesc_rx_set_on_chain(p, end);
|
||||
@@ -150,12 +150,12 @@ static void ndesc_init_rx_desc(struct dma_desc *p, int disable_rx_ic, int mode,
|
||||
ndesc_rx_set_on_ring(p, end);
|
||||
|
||||
if (disable_rx_ic)
|
||||
p->des1 |= RDES1_DISABLE_IC;
|
||||
p->des1 |= cpu_to_le32(RDES1_DISABLE_IC);
|
||||
}
|
||||
|
||||
static void ndesc_init_tx_desc(struct dma_desc *p, int mode, int end)
|
||||
{
|
||||
p->des0 &= ~TDES0_OWN;
|
||||
p->des0 &= cpu_to_le32(~TDES0_OWN);
|
||||
if (mode == STMMAC_CHAIN_MODE)
|
||||
ndesc_tx_set_on_chain(p);
|
||||
else
|
||||
@@ -164,27 +164,27 @@ static void ndesc_init_tx_desc(struct dma_desc *p, int mode, int end)
|
||||
|
||||
static int ndesc_get_tx_owner(struct dma_desc *p)
|
||||
{
|
||||
return (p->des0 & TDES0_OWN) >> 31;
|
||||
return (le32_to_cpu(p->des0) & TDES0_OWN) >> 31;
|
||||
}
|
||||
|
||||
static void ndesc_set_tx_owner(struct dma_desc *p)
|
||||
{
|
||||
p->des0 |= TDES0_OWN;
|
||||
p->des0 |= cpu_to_le32(TDES0_OWN);
|
||||
}
|
||||
|
||||
static void ndesc_set_rx_owner(struct dma_desc *p)
|
||||
{
|
||||
p->des0 |= RDES0_OWN;
|
||||
p->des0 |= cpu_to_le32(RDES0_OWN);
|
||||
}
|
||||
|
||||
static int ndesc_get_tx_ls(struct dma_desc *p)
|
||||
{
|
||||
return (p->des1 & TDES1_LAST_SEGMENT) >> 30;
|
||||
return (le32_to_cpu(p->des1) & TDES1_LAST_SEGMENT) >> 30;
|
||||
}
|
||||
|
||||
static void ndesc_release_tx_desc(struct dma_desc *p, int mode)
|
||||
{
|
||||
int ter = (p->des1 & TDES1_END_RING) >> 25;
|
||||
int ter = (le32_to_cpu(p->des1) & TDES1_END_RING) >> 25;
|
||||
|
||||
memset(p, 0, offsetof(struct dma_desc, des2));
|
||||
if (mode == STMMAC_CHAIN_MODE)
|
||||
@@ -197,7 +197,7 @@ static void ndesc_prepare_tx_desc(struct dma_desc *p, int is_fs, int len,
|
||||
bool csum_flag, int mode, bool tx_own,
|
||||
bool ls)
|
||||
{
|
||||
unsigned int tdes1 = p->des1;
|
||||
unsigned int tdes1 = le32_to_cpu(p->des1);
|
||||
|
||||
if (is_fs)
|
||||
tdes1 |= TDES1_FIRST_SEGMENT;
|
||||
@@ -212,7 +212,7 @@ static void ndesc_prepare_tx_desc(struct dma_desc *p, int is_fs, int len,
|
||||
if (ls)
|
||||
tdes1 |= TDES1_LAST_SEGMENT;
|
||||
|
||||
p->des1 = tdes1;
|
||||
p->des1 = cpu_to_le32(tdes1);
|
||||
|
||||
if (mode == STMMAC_CHAIN_MODE)
|
||||
norm_set_tx_desc_len_on_chain(p, len);
|
||||
@@ -220,12 +220,12 @@ static void ndesc_prepare_tx_desc(struct dma_desc *p, int is_fs, int len,
|
||||
norm_set_tx_desc_len_on_ring(p, len);
|
||||
|
||||
if (tx_own)
|
||||
p->des0 |= TDES0_OWN;
|
||||
p->des0 |= cpu_to_le32(TDES0_OWN);
|
||||
}
|
||||
|
||||
static void ndesc_set_tx_ic(struct dma_desc *p)
|
||||
{
|
||||
p->des1 |= TDES1_INTERRUPT;
|
||||
p->des1 |= cpu_to_le32(TDES1_INTERRUPT);
|
||||
}
|
||||
|
||||
static int ndesc_get_rx_frame_len(struct dma_desc *p, int rx_coe_type)
|
||||
@@ -241,19 +241,20 @@ static int ndesc_get_rx_frame_len(struct dma_desc *p, int rx_coe_type)
|
||||
if (rx_coe_type == STMMAC_RX_COE_TYPE1)
|
||||
csum = 2;
|
||||
|
||||
return (((p->des0 & RDES0_FRAME_LEN_MASK) >> RDES0_FRAME_LEN_SHIFT) -
|
||||
return (((le32_to_cpu(p->des0) & RDES0_FRAME_LEN_MASK)
|
||||
>> RDES0_FRAME_LEN_SHIFT) -
|
||||
csum);
|
||||
|
||||
}
|
||||
|
||||
static void ndesc_enable_tx_timestamp(struct dma_desc *p)
|
||||
{
|
||||
p->des1 |= TDES1_TIME_STAMP_ENABLE;
|
||||
p->des1 |= cpu_to_le32(TDES1_TIME_STAMP_ENABLE);
|
||||
}
|
||||
|
||||
static int ndesc_get_tx_timestamp_status(struct dma_desc *p)
|
||||
{
|
||||
return (p->des0 & TDES0_TIME_STAMP_STATUS) >> 17;
|
||||
return (le32_to_cpu(p->des0) & TDES0_TIME_STAMP_STATUS) >> 17;
|
||||
}
|
||||
|
||||
static u64 ndesc_get_timestamp(void *desc, u32 ats)
|
||||
@@ -261,9 +262,9 @@ static u64 ndesc_get_timestamp(void *desc, u32 ats)
|
||||
struct dma_desc *p = (struct dma_desc *)desc;
|
||||
u64 ns;
|
||||
|
||||
ns = p->des2;
|
||||
ns = le32_to_cpu(p->des2);
|
||||
/* convert high/sec time stamp value to nanosecond */
|
||||
ns += p->des3 * 1000000000ULL;
|
||||
ns += le32_to_cpu(p->des3) * 1000000000ULL;
|
||||
|
||||
return ns;
|
||||
}
|
||||
@@ -272,7 +273,8 @@ static int ndesc_get_rx_timestamp_status(void *desc, u32 ats)
|
||||
{
|
||||
struct dma_desc *p = (struct dma_desc *)desc;
|
||||
|
||||
if ((p->des2 == 0xffffffff) && (p->des3 == 0xffffffff))
|
||||
if ((le32_to_cpu(p->des2) == 0xffffffff) &&
|
||||
(le32_to_cpu(p->des3) == 0xffffffff))
|
||||
/* timestamp is corrupted, hence don't store it */
|
||||
return 0;
|
||||
else
|
||||
|
||||
@@ -34,7 +34,7 @@ static int stmmac_jumbo_frm(void *p, struct sk_buff *skb, int csum)
|
||||
unsigned int entry = priv->cur_tx;
|
||||
struct dma_desc *desc;
|
||||
unsigned int nopaged_len = skb_headlen(skb);
|
||||
unsigned int bmax, len;
|
||||
unsigned int bmax, len, des2;
|
||||
|
||||
if (priv->extend_desc)
|
||||
desc = (struct dma_desc *)(priv->dma_etx + entry);
|
||||
@@ -50,16 +50,17 @@ static int stmmac_jumbo_frm(void *p, struct sk_buff *skb, int csum)
|
||||
|
||||
if (nopaged_len > BUF_SIZE_8KiB) {
|
||||
|
||||
desc->des2 = dma_map_single(priv->device, skb->data,
|
||||
bmax, DMA_TO_DEVICE);
|
||||
if (dma_mapping_error(priv->device, desc->des2))
|
||||
des2 = dma_map_single(priv->device, skb->data, bmax,
|
||||
DMA_TO_DEVICE);
|
||||
desc->des2 = cpu_to_le32(des2);
|
||||
if (dma_mapping_error(priv->device, des2))
|
||||
return -1;
|
||||
|
||||
priv->tx_skbuff_dma[entry].buf = desc->des2;
|
||||
priv->tx_skbuff_dma[entry].buf = des2;
|
||||
priv->tx_skbuff_dma[entry].len = bmax;
|
||||
priv->tx_skbuff_dma[entry].is_jumbo = true;
|
||||
|
||||
desc->des3 = desc->des2 + BUF_SIZE_4KiB;
|
||||
desc->des3 = cpu_to_le32(des2 + BUF_SIZE_4KiB);
|
||||
priv->hw->desc->prepare_tx_desc(desc, 1, bmax, csum,
|
||||
STMMAC_RING_MODE, 0, false);
|
||||
priv->tx_skbuff[entry] = NULL;
|
||||
@@ -70,26 +71,28 @@ static int stmmac_jumbo_frm(void *p, struct sk_buff *skb, int csum)
|
||||
else
|
||||
desc = priv->dma_tx + entry;
|
||||
|
||||
desc->des2 = dma_map_single(priv->device, skb->data + bmax,
|
||||
len, DMA_TO_DEVICE);
|
||||
if (dma_mapping_error(priv->device, desc->des2))
|
||||
des2 = dma_map_single(priv->device, skb->data + bmax, len,
|
||||
DMA_TO_DEVICE);
|
||||
desc->des2 = cpu_to_le32(des2);
|
||||
if (dma_mapping_error(priv->device, des2))
|
||||
return -1;
|
||||
priv->tx_skbuff_dma[entry].buf = desc->des2;
|
||||
priv->tx_skbuff_dma[entry].buf = des2;
|
||||
priv->tx_skbuff_dma[entry].len = len;
|
||||
priv->tx_skbuff_dma[entry].is_jumbo = true;
|
||||
|
||||
desc->des3 = desc->des2 + BUF_SIZE_4KiB;
|
||||
desc->des3 = cpu_to_le32(des2 + BUF_SIZE_4KiB);
|
||||
priv->hw->desc->prepare_tx_desc(desc, 0, len, csum,
|
||||
STMMAC_RING_MODE, 1, true);
|
||||
} else {
|
||||
desc->des2 = dma_map_single(priv->device, skb->data,
|
||||
nopaged_len, DMA_TO_DEVICE);
|
||||
if (dma_mapping_error(priv->device, desc->des2))
|
||||
des2 = dma_map_single(priv->device, skb->data,
|
||||
nopaged_len, DMA_TO_DEVICE);
|
||||
desc->des2 = cpu_to_le32(des2);
|
||||
if (dma_mapping_error(priv->device, des2))
|
||||
return -1;
|
||||
priv->tx_skbuff_dma[entry].buf = desc->des2;
|
||||
priv->tx_skbuff_dma[entry].buf = des2;
|
||||
priv->tx_skbuff_dma[entry].len = nopaged_len;
|
||||
priv->tx_skbuff_dma[entry].is_jumbo = true;
|
||||
desc->des3 = desc->des2 + BUF_SIZE_4KiB;
|
||||
desc->des3 = cpu_to_le32(des2 + BUF_SIZE_4KiB);
|
||||
priv->hw->desc->prepare_tx_desc(desc, 1, nopaged_len, csum,
|
||||
STMMAC_RING_MODE, 0, true);
|
||||
}
|
||||
@@ -115,13 +118,13 @@ static void stmmac_refill_desc3(void *priv_ptr, struct dma_desc *p)
|
||||
|
||||
/* Fill DES3 in case of RING mode */
|
||||
if (priv->dma_buf_sz >= BUF_SIZE_8KiB)
|
||||
p->des3 = p->des2 + BUF_SIZE_8KiB;
|
||||
p->des3 = cpu_to_le32(le32_to_cpu(p->des2) + BUF_SIZE_8KiB);
|
||||
}
|
||||
|
||||
/* In ring mode we need to fill the desc3 because it is used as buffer */
|
||||
static void stmmac_init_desc3(struct dma_desc *p)
|
||||
{
|
||||
p->des3 = p->des2 + BUF_SIZE_8KiB;
|
||||
p->des3 = cpu_to_le32(le32_to_cpu(p->des2) + BUF_SIZE_8KiB);
|
||||
}
|
||||
|
||||
static void stmmac_clean_desc3(void *priv_ptr, struct dma_desc *p)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user