mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 02:50:49 +09:00
Merge 6.1.97 into android14-6.1-lts
Changes in 6.1.97 usb: typec: ucsi: Never send a lone connector change ack usb: typec: ucsi: Ack also failed Get Error commands ACPI: x86: utils: Add Picasso to the list for forcing StorageD3Enable ACPI: x86: Force StorageD3Enable on more products Input: ili210x - fix ili251x_read_touch_data() return value pinctrl: fix deadlock in create_pinctrl() when handling -EPROBE_DEFER pinctrl: rockchip: fix pinmux bits for RK3328 GPIO2-B pins pinctrl: rockchip: fix pinmux bits for RK3328 GPIO3-B pins pinctrl: rockchip: use dedicated pinctrl type for RK3328 pinctrl: rockchip: fix pinmux reset in rockchip_pmx_set MIPS: pci: lantiq: restore reset gpio polarity dt-bindings: i2c: Drop unneeded quotes dt-bindings: i2c: atmel,at91sam: correct path to i2c-controller schema netfilter: nf_tables: use timestamp to check for set element timeout ASoC: rockchip: i2s-tdm: Fix trcm mode by setting clock on right mclk s390/pci: Add missing virt_to_phys() for directed DIBV ASoC: amd: acp: remove i2s configuration check in acp_i2s_probe() ASoC: fsl-asoc-card: set priv->pdev before using it net: dsa: microchip: fix initial port flush problem mlxsw: spectrum_buffers: Fix memory corruptions on Spectrum-4 systems bpf: Fix overrunning reservations in ringbuf ibmvnic: Free any outstanding tx skbs during scrq reset net: phy: micrel: add Microchip KSZ 9477 to the device table net: dsa: microchip: use collision based back pressure mode xdp: Remove WARN() from __xdp_reg_mem_model() Fix race for duplicate reqsk on identical SYN net: dsa: microchip: fix wrong register write when masking interrupt sparc: fix old compat_sys_select() sparc: fix compat recv/recvfrom syscalls parisc: use correct compat recv/recvfrom syscalls powerpc: restore some missing spu syscalls tcp: fix tcp_rcv_fastopen_synack() to enter TCP_CA_Loss for failed TFO netfilter: nf_tables: fully validate NFT_DATA_VALUE on store to data registers bpf: Take return from set_memory_ro() into account with bpf_prog_lock_ro() drm/panel: ilitek-ili9881c: Fix warning with GPIO controllers that sleep vduse: validate block features only with block devices vduse: Temporarily fail if control queue feature requested x86/fpu: Fix AMD X86_BUG_FXSAVE_LEAK fixup mtd: partitions: redboot: Added conversion of operands to a larger type wifi: ieee80211: check for NULL in ieee80211_mle_size_ok() bpf: Add a check for struct bpf_fib_lookup size bpf: Mark bpf prog stack with kmsan_unposion_memory in interpreter mode RDMA/restrack: Fix potential invalid address access net/iucv: Avoid explicit cpumask var allocation on stack net/dpaa2: Avoid explicit cpumask var allocation on stack crypto: ecdh - explicitly zeroize private_key ALSA: emux: improve patch ioctl data validation media: dvbdev: Initialize sbuf soc: ti: wkup_m3_ipc: Send NULL dummy message instead of pointer message drm/radeon/radeon_display: Decrease the size of allocated memory nvme: fixup comment for nvme RDMA Provider Type drm/panel: simple: Add missing display timing flags for KOE TX26D202VM0BWA gpio: davinci: Validate the obtained number of IRQs drm/amd/amdgpu: Fix style errors in amdgpu_drv.c & amdgpu_device.c drm/amdgpu: Fix pci state save during mode-1 reset riscv: stacktrace: convert arch_stack_walk() to noinstr gpiolib: cdev: Disallow reconfiguration without direction (uAPI v1) randomize_kstack: Remove non-functional per-arch entropy filtering ima: Fix use-after-free on a dentry's dname.name x86: stop playing stack games in profile_pc() parisc: use generic sys_fanotify_mark implementation Revert "MIPS: pci: lantiq: restore reset gpio polarity" pinctrl: qcom: spmi-gpio: drop broken pm8008 support ocfs2: fix DIO failure due to insufficient transaction credits nfs: drop the incorrect assertion in nfs_swap_rw() mmc: sdhci-brcmstb: check R1_STATUS for erase/trim/discard mmc: sdhci-pci: Convert PCIBIOS_* return codes to errnos mmc: sdhci: Do not invert write-protect twice mmc: sdhci: Do not lock spinlock around mmc_gpio_get_ro() iio: xilinx-ams: Don't include ams_ctrl_channels in scan_mask counter: ti-eqep: enable clock at probe i2c: testunit: don't erase registers after STOP i2c: testunit: discard write requests while old command is running iio: adc: ad7266: Fix variable checking bug iio: accel: fxls8962af: select IIO_BUFFER & IIO_KFIFO_BUF iio: chemical: bme680: Fix pressure value output iio: chemical: bme680: Fix calibration data variable iio: chemical: bme680: Fix overflows in compensate() functions iio: chemical: bme680: Fix sensor data read operation net: usb: ax88179_178a: improve link status logs usb: gadget: printer: SS+ support usb: gadget: printer: fix races against disable usb: musb: da8xx: fix a resource leak in probe() usb: atm: cxacru: fix endpoint checking in cxacru_bind() usb: dwc3: core: remove lock of otg mode during gadget suspend/resume to avoid deadlock usb: gadget: aspeed_udc: fix device address configuration usb: ucsi: stm32: fix command completion handling serial: 8250_omap: Implementation of Errata i2310 serial: imx: set receiver level before starting uart ALSA: hda/realtek: fix mute/micmute LEDs don't work for EliteBook 645/665 G11. tty: mcf: MCF54418 has 10 UARTS net: can: j1939: Initialize unused data in j1939_send_one() net: can: j1939: recover socket queue on CAN bus error during BAM transmission net: can: j1939: enhanced error handling for tightly received RTS messages in xtp_rx_rts_session_new cpufreq: intel_pstate: Use HWP to initialize ITMT if CPPC is missing cpu/hotplug: Fix dynstate assignment in __cpuhp_setup_state_cpuslocked() irqchip/loongson-liointc: Set different ISRs for different cores kbuild: Install dtb files as 0644 in Makefile.dtbinst sh: rework sync_file_range ABI btrfs: zoned: fix initial free space detection csky, hexagon: fix broken sys_sync_file_range hexagon: fix fadvise64_64 calling conventions drm/nouveau/dispnv04: fix null pointer dereference in nv17_tv_get_ld_modes drm/amdgpu: avoid using null object of framebuffer drm/i915/gt: Fix potential UAF by revoke of fence registers drm/nouveau/dispnv04: fix null pointer dereference in nv17_tv_get_hd_modes drm/amdgpu/atomfirmware: fix parsing of vram_info batman-adv: Don't accept TT entries for out-of-spec VIDs can: mcp251xfd: fix infinite loop when xmit fails ata: ahci: Clean up sysfs file on error ata: libata-core: Fix double free on error ftruncate: pass a signed offset syscalls: fix compat_sys_io_pgetevents_time64 usage syscalls: fix sys_fanotify_mark prototype pwm: stm32: Refuse too small period requests Revert "cpufreq: amd-pstate: Fix the inconsistency in max frequency units" mm/page_alloc: Separate THP PCP into movable and non-movable categories gfs2: Fix slab-use-after-free in gfs2_qd_dealloc efi: memmap: Move manipulation routines into x86 arch tree efi: xen: Set EFI_PARAVIRT for Xen dom0 boot on all architectures efi/x86: Free EFI memory map only when installing a new one. arm64: dts: rockchip: Fix SD NAND and eMMC init on rk3308-rock-pi-s arm64: dts: rockchip: Rename LED related pinctrl nodes on rk3308-rock-pi-s ARM: dts: rockchip: rk3066a: add #sound-dai-cells to hdmi node arm64: dts: rockchip: fix PMIC interrupt pin on ROCK Pi E arm64: dts: rockchip: Add sound-dai-cells for RK3368 serial: imx: only set receiver level if it is zero serial: 8250_omap: Fix Errata i2310 with RX FIFO level check tracing/net_sched: NULL pointer dereference in perf_trace_qdisc_reset() Linux 6.1.97 Change-Id: I8ae3429d5ddec709f2ef8e96895fa111ee31d004 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -2,8 +2,8 @@
|
||||
# Copyright 2019 BayLibre, SAS
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: "http://devicetree.org/schemas/i2c/amlogic,meson6-i2c.yaml#"
|
||||
$schema: "http://devicetree.org/meta-schemas/core.yaml#"
|
||||
$id: http://devicetree.org/schemas/i2c/amlogic,meson6-i2c.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Amlogic Meson I2C Controller
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: "http://devicetree.org/schemas/i2c/apple,i2c.yaml#"
|
||||
$schema: "http://devicetree.org/meta-schemas/core.yaml#"
|
||||
$id: http://devicetree.org/schemas/i2c/apple,i2c.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Apple/PASemi I2C controller
|
||||
|
||||
|
||||
@@ -75,7 +75,7 @@ required:
|
||||
- clocks
|
||||
|
||||
allOf:
|
||||
- $ref: "i2c-controller.yaml"
|
||||
- $ref: /schemas/i2c/i2c-controller.yaml#
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: "http://devicetree.org/schemas/i2c/cdns,i2c-r1p10.yaml#"
|
||||
$schema: "http://devicetree.org/meta-schemas/core.yaml#"
|
||||
$id: http://devicetree.org/schemas/i2c/cdns,i2c-r1p10.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Cadence I2C controller
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@ properties:
|
||||
|
||||
i2c-parent:
|
||||
description: phandle of the I2C bus that this multiplexer's master-side port is connected to
|
||||
$ref: "/schemas/types.yaml#/definitions/phandle"
|
||||
$ref: /schemas/types.yaml#/definitions/phandle
|
||||
|
||||
mux-gpios:
|
||||
description: list of GPIOs used to control the muxer
|
||||
@@ -55,7 +55,7 @@ properties:
|
||||
idle-state:
|
||||
description: Value to set the muxer to when idle. When no value is given, it defaults to the
|
||||
last value used.
|
||||
$ref: "/schemas/types.yaml#/definitions/uint32"
|
||||
$ref: /schemas/types.yaml#/definitions/uint32
|
||||
|
||||
allOf:
|
||||
- $ref: i2c-mux.yaml
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: "http://devicetree.org/schemas/i2c/qcom,i2c-geni-qcom.yaml#"
|
||||
$schema: "http://devicetree.org/meta-schemas/core.yaml#"
|
||||
$id: http://devicetree.org/schemas/i2c/qcom,i2c-geni-qcom.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Qualcomm Geni based QUP I2C Controller
|
||||
|
||||
|
||||
@@ -90,7 +90,7 @@ properties:
|
||||
st,syscfg-fmp:
|
||||
description: Use to set Fast Mode Plus bit within SYSCFG when Fast Mode
|
||||
Plus speed is selected by slave.
|
||||
$ref: "/schemas/types.yaml#/definitions/phandle-array"
|
||||
$ref: /schemas/types.yaml#/definitions/phandle-array
|
||||
items:
|
||||
- items:
|
||||
- description: phandle to syscfg
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: "http://devicetree.org/schemas/i2c/xlnx,xps-iic-2.00.a.yaml#"
|
||||
$schema: "http://devicetree.org/meta-schemas/core.yaml#"
|
||||
$id: http://devicetree.org/schemas/i2c/xlnx,xps-iic-2.00.a.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Xilinx IIC controller
|
||||
|
||||
|
||||
2
Makefile
2
Makefile
@@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 6
|
||||
PATCHLEVEL = 1
|
||||
SUBLEVEL = 96
|
||||
SUBLEVEL = 97
|
||||
EXTRAVERSION =
|
||||
NAME = Curry Ramen
|
||||
|
||||
|
||||
@@ -123,6 +123,7 @@
|
||||
pinctrl-0 = <&hdmii2c_xfer>, <&hdmi_hpd>;
|
||||
power-domains = <&power RK3066_PD_VIO>;
|
||||
rockchip,grf = <&grf>;
|
||||
#sound-dai-cells = <0>;
|
||||
status = "disabled";
|
||||
|
||||
ports {
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
#include <dt-bindings/leds/common.h>
|
||||
#include "rk3308.dtsi"
|
||||
|
||||
/ {
|
||||
@@ -24,17 +26,21 @@
|
||||
leds {
|
||||
compatible = "gpio-leds";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&green_led_gio>, <&heartbeat_led_gpio>;
|
||||
pinctrl-0 = <&green_led>, <&heartbeat_led>;
|
||||
|
||||
green-led {
|
||||
color = <LED_COLOR_ID_GREEN>;
|
||||
default-state = "on";
|
||||
function = LED_FUNCTION_POWER;
|
||||
gpios = <&gpio0 RK_PA6 GPIO_ACTIVE_HIGH>;
|
||||
label = "rockpis:green:power";
|
||||
linux,default-trigger = "default-on";
|
||||
};
|
||||
|
||||
blue-led {
|
||||
color = <LED_COLOR_ID_BLUE>;
|
||||
default-state = "on";
|
||||
function = LED_FUNCTION_HEARTBEAT;
|
||||
gpios = <&gpio0 RK_PA5 GPIO_ACTIVE_HIGH>;
|
||||
label = "rockpis:blue:user";
|
||||
linux,default-trigger = "heartbeat";
|
||||
@@ -127,10 +133,12 @@
|
||||
};
|
||||
|
||||
&emmc {
|
||||
bus-width = <4>;
|
||||
cap-mmc-highspeed;
|
||||
mmc-hs200-1_8v;
|
||||
cap-sd-highspeed;
|
||||
no-sdio;
|
||||
non-removable;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&emmc_bus8 &emmc_clk &emmc_cmd>;
|
||||
vmmc-supply = <&vcc_io>;
|
||||
status = "okay";
|
||||
};
|
||||
@@ -153,11 +161,11 @@
|
||||
pinctrl-0 = <&rtc_32k>;
|
||||
|
||||
leds {
|
||||
green_led_gio: green-led-gpio {
|
||||
green_led: green-led {
|
||||
rockchip,pins = <0 RK_PA6 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
|
||||
heartbeat_led_gpio: heartbeat-led-gpio {
|
||||
heartbeat_led: heartbeat-led {
|
||||
rockchip,pins = <0 RK_PA5 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -186,8 +186,8 @@
|
||||
rk805: pmic@18 {
|
||||
compatible = "rockchip,rk805";
|
||||
reg = <0x18>;
|
||||
interrupt-parent = <&gpio2>;
|
||||
interrupts = <6 IRQ_TYPE_LEVEL_LOW>;
|
||||
interrupt-parent = <&gpio0>;
|
||||
interrupts = <2 IRQ_TYPE_LEVEL_LOW>;
|
||||
#clock-cells = <1>;
|
||||
clock-output-names = "xin32k", "rk805-clkout2";
|
||||
gpio-controller;
|
||||
|
||||
@@ -790,6 +790,7 @@
|
||||
dma-names = "tx";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&spdif_tx>;
|
||||
#sound-dai-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@@ -801,6 +802,7 @@
|
||||
clocks = <&cru SCLK_I2S_2CH>, <&cru HCLK_I2S_2CH>;
|
||||
dmas = <&dmac_bus 6>, <&dmac_bus 7>;
|
||||
dma-names = "tx", "rx";
|
||||
#sound-dai-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@@ -814,6 +816,7 @@
|
||||
dma-names = "tx", "rx";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&i2s_8ch_bus>;
|
||||
#sound-dai-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
||||
@@ -840,7 +840,7 @@ __SYSCALL(__NR_pselect6_time64, compat_sys_pselect6_time64)
|
||||
#define __NR_ppoll_time64 414
|
||||
__SYSCALL(__NR_ppoll_time64, compat_sys_ppoll_time64)
|
||||
#define __NR_io_pgetevents_time64 416
|
||||
__SYSCALL(__NR_io_pgetevents_time64, sys_io_pgetevents)
|
||||
__SYSCALL(__NR_io_pgetevents_time64, compat_sys_io_pgetevents_time64)
|
||||
#define __NR_recvmmsg_time64 417
|
||||
__SYSCALL(__NR_recvmmsg_time64, compat_sys_recvmmsg_time64)
|
||||
#define __NR_mq_timedsend_time64 418
|
||||
|
||||
@@ -57,17 +57,15 @@ static void invoke_syscall(struct pt_regs *regs, unsigned int scno,
|
||||
syscall_set_return_value(current, regs, 0, ret);
|
||||
|
||||
/*
|
||||
* Ultimately, this value will get limited by KSTACK_OFFSET_MAX(),
|
||||
* but not enough for arm64 stack utilization comfort. To keep
|
||||
* reasonable stack head room, reduce the maximum offset to 9 bits.
|
||||
* This value will get limited by KSTACK_OFFSET_MAX(), which is 10
|
||||
* bits. The actual entropy will be further reduced by the compiler
|
||||
* when applying stack alignment constraints: the AAPCS mandates a
|
||||
* 16-byte aligned SP at function boundaries, which will remove the
|
||||
* 4 low bits from any entropy chosen here.
|
||||
*
|
||||
* The actual entropy will be further reduced by the compiler when
|
||||
* applying stack alignment constraints: the AAPCS mandates a
|
||||
* 16-byte (i.e. 4-bit) aligned SP at function boundaries.
|
||||
*
|
||||
* The resulting 5 bits of entropy is seen in SP[8:4].
|
||||
* The resulting 6 bits of entropy is seen in SP[9:4].
|
||||
*/
|
||||
choose_random_kstack_offset(get_random_u16() & 0x1FF);
|
||||
choose_random_kstack_offset(get_random_u16());
|
||||
}
|
||||
|
||||
static inline bool has_syscall_work(unsigned long flags)
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
#define __ARCH_WANT_SYS_CLONE3
|
||||
#define __ARCH_WANT_SET_GET_RLIMIT
|
||||
#define __ARCH_WANT_TIME32_SYSCALLS
|
||||
#define __ARCH_WANT_SYNC_FILE_RANGE2
|
||||
#include <asm-generic/unistd.h>
|
||||
|
||||
#define __NR_set_thread_area (__NR_arch_specific_syscall + 0)
|
||||
|
||||
6
arch/hexagon/include/asm/syscalls.h
Normal file
6
arch/hexagon/include/asm/syscalls.h
Normal file
@@ -0,0 +1,6 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
|
||||
#include <asm-generic/syscalls.h>
|
||||
|
||||
asmlinkage long sys_hexagon_fadvise64_64(int fd, int advice,
|
||||
u32 a2, u32 a3, u32 a4, u32 a5);
|
||||
@@ -36,5 +36,6 @@
|
||||
#define __ARCH_WANT_SYS_VFORK
|
||||
#define __ARCH_WANT_SYS_FORK
|
||||
#define __ARCH_WANT_TIME32_SYSCALLS
|
||||
#define __ARCH_WANT_SYNC_FILE_RANGE2
|
||||
|
||||
#include <asm-generic/unistd.h>
|
||||
|
||||
@@ -14,6 +14,13 @@
|
||||
#undef __SYSCALL
|
||||
#define __SYSCALL(nr, call) [nr] = (call),
|
||||
|
||||
SYSCALL_DEFINE6(hexagon_fadvise64_64, int, fd, int, advice,
|
||||
SC_ARG64(offset), SC_ARG64(len))
|
||||
{
|
||||
return ksys_fadvise64_64(fd, SC_VAL64(loff_t, offset), SC_VAL64(loff_t, len), advice);
|
||||
}
|
||||
#define sys_fadvise64_64 sys_hexagon_fadvise64_64
|
||||
|
||||
void *sys_call_table[__NR_syscalls] = {
|
||||
#include <asm/unistd.h>
|
||||
};
|
||||
|
||||
@@ -354,7 +354,7 @@
|
||||
412 n32 utimensat_time64 sys_utimensat
|
||||
413 n32 pselect6_time64 compat_sys_pselect6_time64
|
||||
414 n32 ppoll_time64 compat_sys_ppoll_time64
|
||||
416 n32 io_pgetevents_time64 sys_io_pgetevents
|
||||
416 n32 io_pgetevents_time64 compat_sys_io_pgetevents_time64
|
||||
417 n32 recvmmsg_time64 compat_sys_recvmmsg_time64
|
||||
418 n32 mq_timedsend_time64 sys_mq_timedsend
|
||||
419 n32 mq_timedreceive_time64 sys_mq_timedreceive
|
||||
|
||||
@@ -403,7 +403,7 @@
|
||||
412 o32 utimensat_time64 sys_utimensat sys_utimensat
|
||||
413 o32 pselect6_time64 sys_pselect6 compat_sys_pselect6_time64
|
||||
414 o32 ppoll_time64 sys_ppoll compat_sys_ppoll_time64
|
||||
416 o32 io_pgetevents_time64 sys_io_pgetevents sys_io_pgetevents
|
||||
416 o32 io_pgetevents_time64 sys_io_pgetevents compat_sys_io_pgetevents_time64
|
||||
417 o32 recvmmsg_time64 sys_recvmmsg compat_sys_recvmmsg_time64
|
||||
418 o32 mq_timedsend_time64 sys_mq_timedsend sys_mq_timedsend
|
||||
419 o32 mq_timedreceive_time64 sys_mq_timedreceive sys_mq_timedreceive
|
||||
|
||||
@@ -14,6 +14,7 @@ config PARISC
|
||||
select ARCH_HAS_UBSAN_SANITIZE_ALL
|
||||
select ARCH_HAS_PTE_SPECIAL
|
||||
select ARCH_NO_SG_CHAIN
|
||||
select ARCH_SPLIT_ARG64 if !64BIT
|
||||
select ARCH_SUPPORTS_HUGETLBFS if PA20
|
||||
select ARCH_SUPPORTS_MEMORY_FAILURE
|
||||
select ARCH_STACKWALK
|
||||
|
||||
@@ -23,12 +23,3 @@ asmlinkage long sys32_unimplemented(int r26, int r25, int r24, int r23,
|
||||
current->comm, current->pid, r20);
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
asmlinkage long sys32_fanotify_mark(compat_int_t fanotify_fd, compat_uint_t flags,
|
||||
compat_uint_t mask0, compat_uint_t mask1, compat_int_t dfd,
|
||||
const char __user * pathname)
|
||||
{
|
||||
return sys_fanotify_mark(fanotify_fd, flags,
|
||||
((__u64)mask1 << 32) | mask0,
|
||||
dfd, pathname);
|
||||
}
|
||||
|
||||
@@ -108,7 +108,7 @@
|
||||
95 common fchown sys_fchown
|
||||
96 common getpriority sys_getpriority
|
||||
97 common setpriority sys_setpriority
|
||||
98 common recv sys_recv
|
||||
98 common recv sys_recv compat_sys_recv
|
||||
99 common statfs sys_statfs compat_sys_statfs
|
||||
100 common fstatfs sys_fstatfs compat_sys_fstatfs
|
||||
101 common stat64 sys_stat64
|
||||
@@ -135,7 +135,7 @@
|
||||
120 common clone sys_clone_wrapper
|
||||
121 common setdomainname sys_setdomainname
|
||||
122 common sendfile sys_sendfile compat_sys_sendfile
|
||||
123 common recvfrom sys_recvfrom
|
||||
123 common recvfrom sys_recvfrom compat_sys_recvfrom
|
||||
124 32 adjtimex sys_adjtimex_time32
|
||||
124 64 adjtimex sys_adjtimex
|
||||
125 common mprotect sys_mprotect
|
||||
@@ -364,7 +364,7 @@
|
||||
320 common accept4 sys_accept4
|
||||
321 common prlimit64 sys_prlimit64
|
||||
322 common fanotify_init sys_fanotify_init
|
||||
323 common fanotify_mark sys_fanotify_mark sys32_fanotify_mark
|
||||
323 common fanotify_mark sys_fanotify_mark compat_sys_fanotify_mark
|
||||
324 32 clock_adjtime sys_clock_adjtime32
|
||||
324 64 clock_adjtime sys_clock_adjtime
|
||||
325 common name_to_handle_at sys_name_to_handle_at
|
||||
|
||||
@@ -230,8 +230,10 @@
|
||||
178 nospu rt_sigsuspend sys_rt_sigsuspend compat_sys_rt_sigsuspend
|
||||
179 32 pread64 sys_ppc_pread64 compat_sys_ppc_pread64
|
||||
179 64 pread64 sys_pread64
|
||||
179 spu pread64 sys_pread64
|
||||
180 32 pwrite64 sys_ppc_pwrite64 compat_sys_ppc_pwrite64
|
||||
180 64 pwrite64 sys_pwrite64
|
||||
180 spu pwrite64 sys_pwrite64
|
||||
181 common chown sys_chown
|
||||
182 common getcwd sys_getcwd
|
||||
183 common capget sys_capget
|
||||
@@ -246,6 +248,7 @@
|
||||
190 common ugetrlimit sys_getrlimit compat_sys_getrlimit
|
||||
191 32 readahead sys_ppc_readahead compat_sys_ppc_readahead
|
||||
191 64 readahead sys_readahead
|
||||
191 spu readahead sys_readahead
|
||||
192 32 mmap2 sys_mmap2 compat_sys_mmap2
|
||||
193 32 truncate64 sys_ppc_truncate64 compat_sys_ppc_truncate64
|
||||
194 32 ftruncate64 sys_ppc_ftruncate64 compat_sys_ppc_ftruncate64
|
||||
@@ -293,6 +296,7 @@
|
||||
232 nospu set_tid_address sys_set_tid_address
|
||||
233 32 fadvise64 sys_ppc32_fadvise64 compat_sys_ppc32_fadvise64
|
||||
233 64 fadvise64 sys_fadvise64
|
||||
233 spu fadvise64 sys_fadvise64
|
||||
234 nospu exit_group sys_exit_group
|
||||
235 nospu lookup_dcookie sys_lookup_dcookie compat_sys_lookup_dcookie
|
||||
236 common epoll_create sys_epoll_create
|
||||
@@ -502,7 +506,7 @@
|
||||
412 32 utimensat_time64 sys_utimensat sys_utimensat
|
||||
413 32 pselect6_time64 sys_pselect6 compat_sys_pselect6_time64
|
||||
414 32 ppoll_time64 sys_ppoll compat_sys_ppoll_time64
|
||||
416 32 io_pgetevents_time64 sys_io_pgetevents sys_io_pgetevents
|
||||
416 32 io_pgetevents_time64 sys_io_pgetevents compat_sys_io_pgetevents_time64
|
||||
417 32 recvmmsg_time64 sys_recvmmsg compat_sys_recvmmsg_time64
|
||||
418 32 mq_timedsend_time64 sys_mq_timedsend sys_mq_timedsend
|
||||
419 32 mq_timedreceive_time64 sys_mq_timedreceive sys_mq_timedreceive
|
||||
|
||||
@@ -156,7 +156,7 @@ unsigned long __get_wchan(struct task_struct *task)
|
||||
return pc;
|
||||
}
|
||||
|
||||
noinline void arch_stack_walk(stack_trace_consume_fn consume_entry, void *cookie,
|
||||
noinline noinstr void arch_stack_walk(stack_trace_consume_fn consume_entry, void *cookie,
|
||||
struct task_struct *task, struct pt_regs *regs)
|
||||
{
|
||||
walk_stackframe(task, regs, consume_entry, cookie);
|
||||
|
||||
@@ -55,7 +55,7 @@ static __always_inline void arch_exit_to_user_mode(void)
|
||||
static inline void arch_exit_to_user_mode_prepare(struct pt_regs *regs,
|
||||
unsigned long ti_work)
|
||||
{
|
||||
choose_random_kstack_offset(get_tod_clock_fast() & 0xff);
|
||||
choose_random_kstack_offset(get_tod_clock_fast());
|
||||
}
|
||||
|
||||
#define arch_exit_to_user_mode_prepare arch_exit_to_user_mode_prepare
|
||||
|
||||
@@ -418,7 +418,7 @@
|
||||
412 32 utimensat_time64 - sys_utimensat
|
||||
413 32 pselect6_time64 - compat_sys_pselect6_time64
|
||||
414 32 ppoll_time64 - compat_sys_ppoll_time64
|
||||
416 32 io_pgetevents_time64 - sys_io_pgetevents
|
||||
416 32 io_pgetevents_time64 - compat_sys_io_pgetevents_time64
|
||||
417 32 recvmmsg_time64 - compat_sys_recvmmsg_time64
|
||||
418 32 mq_timedsend_time64 - sys_mq_timedsend
|
||||
419 32 mq_timedreceive_time64 - sys_mq_timedreceive
|
||||
|
||||
@@ -410,7 +410,7 @@ static void __init cpu_enable_directed_irq(void *unused)
|
||||
union zpci_sic_iib iib = {{0}};
|
||||
union zpci_sic_iib ziib = {{0}};
|
||||
|
||||
iib.cdiib.dibv_addr = (u64) zpci_ibv[smp_processor_id()]->vector;
|
||||
iib.cdiib.dibv_addr = virt_to_phys(zpci_ibv[smp_processor_id()]->vector);
|
||||
|
||||
zpci_set_irq_ctrl(SIC_IRQ_MODE_SET_CPU, 0, &iib);
|
||||
zpci_set_irq_ctrl(SIC_IRQ_MODE_D_SINGLE, PCI_ISC, &ziib);
|
||||
|
||||
@@ -59,3 +59,14 @@ asmlinkage int sys_fadvise64_64_wrapper(int fd, u32 offset0, u32 offset1,
|
||||
(u64)len0 << 32 | len1, advice);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
* swap the arguments the way that libc wants them instead of
|
||||
* moving flags ahead of the 64-bit nbytes argument
|
||||
*/
|
||||
SYSCALL_DEFINE6(sh_sync_file_range6, int, fd, SC_ARG64(offset),
|
||||
SC_ARG64(nbytes), unsigned int, flags)
|
||||
{
|
||||
return ksys_sync_file_range(fd, SC_VAL64(loff_t, offset),
|
||||
SC_VAL64(loff_t, nbytes), flags);
|
||||
}
|
||||
|
||||
@@ -321,7 +321,7 @@
|
||||
311 common set_robust_list sys_set_robust_list
|
||||
312 common get_robust_list sys_get_robust_list
|
||||
313 common splice sys_splice
|
||||
314 common sync_file_range sys_sync_file_range
|
||||
314 common sync_file_range sys_sh_sync_file_range6
|
||||
315 common tee sys_tee
|
||||
316 common vmsplice sys_vmsplice
|
||||
317 common move_pages sys_move_pages
|
||||
@@ -395,6 +395,7 @@
|
||||
385 common pkey_alloc sys_pkey_alloc
|
||||
386 common pkey_free sys_pkey_free
|
||||
387 common rseq sys_rseq
|
||||
388 common sync_file_range2 sys_sync_file_range2
|
||||
# room for arch specific syscalls
|
||||
393 common semget sys_semget
|
||||
394 common semctl sys_semctl
|
||||
|
||||
@@ -18,224 +18,3 @@ sys32_mmap2:
|
||||
sethi %hi(sys_mmap), %g1
|
||||
jmpl %g1 + %lo(sys_mmap), %g0
|
||||
sllx %o5, 12, %o5
|
||||
|
||||
.align 32
|
||||
.globl sys32_socketcall
|
||||
sys32_socketcall: /* %o0=call, %o1=args */
|
||||
cmp %o0, 1
|
||||
bl,pn %xcc, do_einval
|
||||
cmp %o0, 18
|
||||
bg,pn %xcc, do_einval
|
||||
sub %o0, 1, %o0
|
||||
sllx %o0, 5, %o0
|
||||
sethi %hi(__socketcall_table_begin), %g2
|
||||
or %g2, %lo(__socketcall_table_begin), %g2
|
||||
jmpl %g2 + %o0, %g0
|
||||
nop
|
||||
do_einval:
|
||||
retl
|
||||
mov -EINVAL, %o0
|
||||
|
||||
.align 32
|
||||
__socketcall_table_begin:
|
||||
|
||||
/* Each entry is exactly 32 bytes. */
|
||||
do_sys_socket: /* sys_socket(int, int, int) */
|
||||
1: ldswa [%o1 + 0x0] %asi, %o0
|
||||
sethi %hi(sys_socket), %g1
|
||||
2: ldswa [%o1 + 0x8] %asi, %o2
|
||||
jmpl %g1 + %lo(sys_socket), %g0
|
||||
3: ldswa [%o1 + 0x4] %asi, %o1
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
do_sys_bind: /* sys_bind(int fd, struct sockaddr *, int) */
|
||||
4: ldswa [%o1 + 0x0] %asi, %o0
|
||||
sethi %hi(sys_bind), %g1
|
||||
5: ldswa [%o1 + 0x8] %asi, %o2
|
||||
jmpl %g1 + %lo(sys_bind), %g0
|
||||
6: lduwa [%o1 + 0x4] %asi, %o1
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
do_sys_connect: /* sys_connect(int, struct sockaddr *, int) */
|
||||
7: ldswa [%o1 + 0x0] %asi, %o0
|
||||
sethi %hi(sys_connect), %g1
|
||||
8: ldswa [%o1 + 0x8] %asi, %o2
|
||||
jmpl %g1 + %lo(sys_connect), %g0
|
||||
9: lduwa [%o1 + 0x4] %asi, %o1
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
do_sys_listen: /* sys_listen(int, int) */
|
||||
10: ldswa [%o1 + 0x0] %asi, %o0
|
||||
sethi %hi(sys_listen), %g1
|
||||
jmpl %g1 + %lo(sys_listen), %g0
|
||||
11: ldswa [%o1 + 0x4] %asi, %o1
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
do_sys_accept: /* sys_accept(int, struct sockaddr *, int *) */
|
||||
12: ldswa [%o1 + 0x0] %asi, %o0
|
||||
sethi %hi(sys_accept), %g1
|
||||
13: lduwa [%o1 + 0x8] %asi, %o2
|
||||
jmpl %g1 + %lo(sys_accept), %g0
|
||||
14: lduwa [%o1 + 0x4] %asi, %o1
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
do_sys_getsockname: /* sys_getsockname(int, struct sockaddr *, int *) */
|
||||
15: ldswa [%o1 + 0x0] %asi, %o0
|
||||
sethi %hi(sys_getsockname), %g1
|
||||
16: lduwa [%o1 + 0x8] %asi, %o2
|
||||
jmpl %g1 + %lo(sys_getsockname), %g0
|
||||
17: lduwa [%o1 + 0x4] %asi, %o1
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
do_sys_getpeername: /* sys_getpeername(int, struct sockaddr *, int *) */
|
||||
18: ldswa [%o1 + 0x0] %asi, %o0
|
||||
sethi %hi(sys_getpeername), %g1
|
||||
19: lduwa [%o1 + 0x8] %asi, %o2
|
||||
jmpl %g1 + %lo(sys_getpeername), %g0
|
||||
20: lduwa [%o1 + 0x4] %asi, %o1
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
do_sys_socketpair: /* sys_socketpair(int, int, int, int *) */
|
||||
21: ldswa [%o1 + 0x0] %asi, %o0
|
||||
sethi %hi(sys_socketpair), %g1
|
||||
22: ldswa [%o1 + 0x8] %asi, %o2
|
||||
23: lduwa [%o1 + 0xc] %asi, %o3
|
||||
jmpl %g1 + %lo(sys_socketpair), %g0
|
||||
24: ldswa [%o1 + 0x4] %asi, %o1
|
||||
nop
|
||||
nop
|
||||
do_sys_send: /* sys_send(int, void *, size_t, unsigned int) */
|
||||
25: ldswa [%o1 + 0x0] %asi, %o0
|
||||
sethi %hi(sys_send), %g1
|
||||
26: lduwa [%o1 + 0x8] %asi, %o2
|
||||
27: lduwa [%o1 + 0xc] %asi, %o3
|
||||
jmpl %g1 + %lo(sys_send), %g0
|
||||
28: lduwa [%o1 + 0x4] %asi, %o1
|
||||
nop
|
||||
nop
|
||||
do_sys_recv: /* sys_recv(int, void *, size_t, unsigned int) */
|
||||
29: ldswa [%o1 + 0x0] %asi, %o0
|
||||
sethi %hi(sys_recv), %g1
|
||||
30: lduwa [%o1 + 0x8] %asi, %o2
|
||||
31: lduwa [%o1 + 0xc] %asi, %o3
|
||||
jmpl %g1 + %lo(sys_recv), %g0
|
||||
32: lduwa [%o1 + 0x4] %asi, %o1
|
||||
nop
|
||||
nop
|
||||
do_sys_sendto: /* sys_sendto(int, u32, compat_size_t, unsigned int, u32, int) */
|
||||
33: ldswa [%o1 + 0x0] %asi, %o0
|
||||
sethi %hi(sys_sendto), %g1
|
||||
34: lduwa [%o1 + 0x8] %asi, %o2
|
||||
35: lduwa [%o1 + 0xc] %asi, %o3
|
||||
36: lduwa [%o1 + 0x10] %asi, %o4
|
||||
37: ldswa [%o1 + 0x14] %asi, %o5
|
||||
jmpl %g1 + %lo(sys_sendto), %g0
|
||||
38: lduwa [%o1 + 0x4] %asi, %o1
|
||||
do_sys_recvfrom: /* sys_recvfrom(int, u32, compat_size_t, unsigned int, u32, u32) */
|
||||
39: ldswa [%o1 + 0x0] %asi, %o0
|
||||
sethi %hi(sys_recvfrom), %g1
|
||||
40: lduwa [%o1 + 0x8] %asi, %o2
|
||||
41: lduwa [%o1 + 0xc] %asi, %o3
|
||||
42: lduwa [%o1 + 0x10] %asi, %o4
|
||||
43: lduwa [%o1 + 0x14] %asi, %o5
|
||||
jmpl %g1 + %lo(sys_recvfrom), %g0
|
||||
44: lduwa [%o1 + 0x4] %asi, %o1
|
||||
do_sys_shutdown: /* sys_shutdown(int, int) */
|
||||
45: ldswa [%o1 + 0x0] %asi, %o0
|
||||
sethi %hi(sys_shutdown), %g1
|
||||
jmpl %g1 + %lo(sys_shutdown), %g0
|
||||
46: ldswa [%o1 + 0x4] %asi, %o1
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
do_sys_setsockopt: /* sys_setsockopt(int, int, int, char *, int) */
|
||||
47: ldswa [%o1 + 0x0] %asi, %o0
|
||||
sethi %hi(sys_setsockopt), %g1
|
||||
48: ldswa [%o1 + 0x8] %asi, %o2
|
||||
49: lduwa [%o1 + 0xc] %asi, %o3
|
||||
50: ldswa [%o1 + 0x10] %asi, %o4
|
||||
jmpl %g1 + %lo(sys_setsockopt), %g0
|
||||
51: ldswa [%o1 + 0x4] %asi, %o1
|
||||
nop
|
||||
do_sys_getsockopt: /* sys_getsockopt(int, int, int, u32, u32) */
|
||||
52: ldswa [%o1 + 0x0] %asi, %o0
|
||||
sethi %hi(sys_getsockopt), %g1
|
||||
53: ldswa [%o1 + 0x8] %asi, %o2
|
||||
54: lduwa [%o1 + 0xc] %asi, %o3
|
||||
55: lduwa [%o1 + 0x10] %asi, %o4
|
||||
jmpl %g1 + %lo(sys_getsockopt), %g0
|
||||
56: ldswa [%o1 + 0x4] %asi, %o1
|
||||
nop
|
||||
do_sys_sendmsg: /* compat_sys_sendmsg(int, struct compat_msghdr *, unsigned int) */
|
||||
57: ldswa [%o1 + 0x0] %asi, %o0
|
||||
sethi %hi(compat_sys_sendmsg), %g1
|
||||
58: lduwa [%o1 + 0x8] %asi, %o2
|
||||
jmpl %g1 + %lo(compat_sys_sendmsg), %g0
|
||||
59: lduwa [%o1 + 0x4] %asi, %o1
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
do_sys_recvmsg: /* compat_sys_recvmsg(int, struct compat_msghdr *, unsigned int) */
|
||||
60: ldswa [%o1 + 0x0] %asi, %o0
|
||||
sethi %hi(compat_sys_recvmsg), %g1
|
||||
61: lduwa [%o1 + 0x8] %asi, %o2
|
||||
jmpl %g1 + %lo(compat_sys_recvmsg), %g0
|
||||
62: lduwa [%o1 + 0x4] %asi, %o1
|
||||
nop
|
||||
nop
|
||||
nop
|
||||
do_sys_accept4: /* sys_accept4(int, struct sockaddr *, int *, int) */
|
||||
63: ldswa [%o1 + 0x0] %asi, %o0
|
||||
sethi %hi(sys_accept4), %g1
|
||||
64: lduwa [%o1 + 0x8] %asi, %o2
|
||||
65: ldswa [%o1 + 0xc] %asi, %o3
|
||||
jmpl %g1 + %lo(sys_accept4), %g0
|
||||
66: lduwa [%o1 + 0x4] %asi, %o1
|
||||
nop
|
||||
nop
|
||||
|
||||
.section __ex_table,"a"
|
||||
.align 4
|
||||
.word 1b, __retl_efault, 2b, __retl_efault
|
||||
.word 3b, __retl_efault, 4b, __retl_efault
|
||||
.word 5b, __retl_efault, 6b, __retl_efault
|
||||
.word 7b, __retl_efault, 8b, __retl_efault
|
||||
.word 9b, __retl_efault, 10b, __retl_efault
|
||||
.word 11b, __retl_efault, 12b, __retl_efault
|
||||
.word 13b, __retl_efault, 14b, __retl_efault
|
||||
.word 15b, __retl_efault, 16b, __retl_efault
|
||||
.word 17b, __retl_efault, 18b, __retl_efault
|
||||
.word 19b, __retl_efault, 20b, __retl_efault
|
||||
.word 21b, __retl_efault, 22b, __retl_efault
|
||||
.word 23b, __retl_efault, 24b, __retl_efault
|
||||
.word 25b, __retl_efault, 26b, __retl_efault
|
||||
.word 27b, __retl_efault, 28b, __retl_efault
|
||||
.word 29b, __retl_efault, 30b, __retl_efault
|
||||
.word 31b, __retl_efault, 32b, __retl_efault
|
||||
.word 33b, __retl_efault, 34b, __retl_efault
|
||||
.word 35b, __retl_efault, 36b, __retl_efault
|
||||
.word 37b, __retl_efault, 38b, __retl_efault
|
||||
.word 39b, __retl_efault, 40b, __retl_efault
|
||||
.word 41b, __retl_efault, 42b, __retl_efault
|
||||
.word 43b, __retl_efault, 44b, __retl_efault
|
||||
.word 45b, __retl_efault, 46b, __retl_efault
|
||||
.word 47b, __retl_efault, 48b, __retl_efault
|
||||
.word 49b, __retl_efault, 50b, __retl_efault
|
||||
.word 51b, __retl_efault, 52b, __retl_efault
|
||||
.word 53b, __retl_efault, 54b, __retl_efault
|
||||
.word 55b, __retl_efault, 56b, __retl_efault
|
||||
.word 57b, __retl_efault, 58b, __retl_efault
|
||||
.word 59b, __retl_efault, 60b, __retl_efault
|
||||
.word 61b, __retl_efault, 62b, __retl_efault
|
||||
.word 63b, __retl_efault, 64b, __retl_efault
|
||||
.word 65b, __retl_efault, 66b, __retl_efault
|
||||
.previous
|
||||
|
||||
@@ -117,7 +117,7 @@
|
||||
90 common dup2 sys_dup2
|
||||
91 32 setfsuid32 sys_setfsuid
|
||||
92 common fcntl sys_fcntl compat_sys_fcntl
|
||||
93 common select sys_select
|
||||
93 common select sys_select compat_sys_select
|
||||
94 32 setfsgid32 sys_setfsgid
|
||||
95 common fsync sys_fsync
|
||||
96 common setpriority sys_setpriority
|
||||
@@ -155,7 +155,7 @@
|
||||
123 32 fchown sys_fchown16
|
||||
123 64 fchown sys_fchown
|
||||
124 common fchmod sys_fchmod
|
||||
125 common recvfrom sys_recvfrom
|
||||
125 common recvfrom sys_recvfrom compat_sys_recvfrom
|
||||
126 32 setreuid sys_setreuid16
|
||||
126 64 setreuid sys_setreuid
|
||||
127 32 setregid sys_setregid16
|
||||
@@ -247,7 +247,7 @@
|
||||
204 32 readdir sys_old_readdir compat_sys_old_readdir
|
||||
204 64 readdir sys_nis_syscall
|
||||
205 common readahead sys_readahead compat_sys_readahead
|
||||
206 common socketcall sys_socketcall sys32_socketcall
|
||||
206 common socketcall sys_socketcall compat_sys_socketcall
|
||||
207 common syslog sys_syslog
|
||||
208 common lookup_dcookie sys_lookup_dcookie compat_sys_lookup_dcookie
|
||||
209 common fadvise64 sys_fadvise64 compat_sys_fadvise64
|
||||
@@ -461,7 +461,7 @@
|
||||
412 32 utimensat_time64 sys_utimensat sys_utimensat
|
||||
413 32 pselect6_time64 sys_pselect6 compat_sys_pselect6_time64
|
||||
414 32 ppoll_time64 sys_ppoll compat_sys_ppoll_time64
|
||||
416 32 io_pgetevents_time64 sys_io_pgetevents sys_io_pgetevents
|
||||
416 32 io_pgetevents_time64 sys_io_pgetevents compat_sys_io_pgetevents_time64
|
||||
417 32 recvmmsg_time64 sys_recvmmsg compat_sys_recvmmsg_time64
|
||||
418 32 mq_timedsend_time64 sys_mq_timedsend sys_mq_timedsend
|
||||
419 32 mq_timedreceive_time64 sys_mq_timedreceive sys_mq_timedreceive
|
||||
|
||||
@@ -420,7 +420,7 @@
|
||||
412 i386 utimensat_time64 sys_utimensat
|
||||
413 i386 pselect6_time64 sys_pselect6 compat_sys_pselect6_time64
|
||||
414 i386 ppoll_time64 sys_ppoll compat_sys_ppoll_time64
|
||||
416 i386 io_pgetevents_time64 sys_io_pgetevents
|
||||
416 i386 io_pgetevents_time64 sys_io_pgetevents compat_sys_io_pgetevents_time64
|
||||
417 i386 recvmmsg_time64 sys_recvmmsg compat_sys_recvmmsg_time64
|
||||
418 i386 mq_timedsend_time64 sys_mq_timedsend
|
||||
419 i386 mq_timedreceive_time64 sys_mq_timedreceive
|
||||
|
||||
@@ -416,6 +416,17 @@ static inline void efi_fake_memmap_early(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
extern int __init efi_memmap_alloc(unsigned int num_entries,
|
||||
struct efi_memory_map_data *data);
|
||||
extern void __efi_memmap_free(u64 phys, unsigned long size,
|
||||
unsigned long flags);
|
||||
|
||||
extern int __init efi_memmap_install(struct efi_memory_map_data *data);
|
||||
extern int __init efi_memmap_split_count(efi_memory_desc_t *md,
|
||||
struct range *range);
|
||||
extern void __init efi_memmap_insert(struct efi_memory_map *old_memmap,
|
||||
void *buf, struct efi_mem_range *mem);
|
||||
|
||||
#define arch_ima_efi_boot_mode \
|
||||
({ extern struct boot_params boot_params; boot_params.secure_boot; })
|
||||
|
||||
|
||||
@@ -73,19 +73,16 @@ static inline void arch_exit_to_user_mode_prepare(struct pt_regs *regs,
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Ultimately, this value will get limited by KSTACK_OFFSET_MAX(),
|
||||
* but not enough for x86 stack utilization comfort. To keep
|
||||
* reasonable stack head room, reduce the maximum offset to 8 bits.
|
||||
*
|
||||
* The actual entropy will be further reduced by the compiler when
|
||||
* applying stack alignment constraints (see cc_stack_align4/8 in
|
||||
* This value will get limited by KSTACK_OFFSET_MAX(), which is 10
|
||||
* bits. The actual entropy will be further reduced by the compiler
|
||||
* when applying stack alignment constraints (see cc_stack_align4/8 in
|
||||
* arch/x86/Makefile), which will remove the 3 (x86_64) or 2 (ia32)
|
||||
* low bits from any entropy chosen here.
|
||||
*
|
||||
* Therefore, final stack offset entropy will be 5 (x86_64) or
|
||||
* 6 (ia32) bits.
|
||||
* Therefore, final stack offset entropy will be 7 (x86_64) or
|
||||
* 8 (ia32) bits.
|
||||
*/
|
||||
choose_random_kstack_offset(rdtsc() & 0xFF);
|
||||
choose_random_kstack_offset(rdtsc());
|
||||
}
|
||||
#define arch_exit_to_user_mode_prepare arch_exit_to_user_mode_prepare
|
||||
|
||||
|
||||
@@ -145,8 +145,8 @@ void restore_fpregs_from_fpstate(struct fpstate *fpstate, u64 mask)
|
||||
asm volatile(
|
||||
"fnclex\n\t"
|
||||
"emms\n\t"
|
||||
"fildl %P[addr]" /* set F?P to defined value */
|
||||
: : [addr] "m" (fpstate));
|
||||
"fildl %[addr]" /* set F?P to defined value */
|
||||
: : [addr] "m" (*fpstate));
|
||||
}
|
||||
|
||||
if (use_xsave()) {
|
||||
|
||||
@@ -27,25 +27,7 @@
|
||||
|
||||
unsigned long profile_pc(struct pt_regs *regs)
|
||||
{
|
||||
unsigned long pc = instruction_pointer(regs);
|
||||
|
||||
if (!user_mode(regs) && in_lock_functions(pc)) {
|
||||
#ifdef CONFIG_FRAME_POINTER
|
||||
return *(unsigned long *)(regs->bp + sizeof(long));
|
||||
#else
|
||||
unsigned long *sp = (unsigned long *)regs->sp;
|
||||
/*
|
||||
* Return address is either directly at stack pointer
|
||||
* or above a saved flags. Eflags has bits 22-31 zero,
|
||||
* kernel addresses don't.
|
||||
*/
|
||||
if (sp[0] >> 22)
|
||||
return sp[0];
|
||||
if (sp[1] >> 22)
|
||||
return sp[1];
|
||||
#endif
|
||||
}
|
||||
return pc;
|
||||
return instruction_pointer(regs);
|
||||
}
|
||||
EXPORT_SYMBOL(profile_pc);
|
||||
|
||||
|
||||
@@ -2,5 +2,6 @@
|
||||
KASAN_SANITIZE := n
|
||||
GCOV_PROFILE := n
|
||||
|
||||
obj-$(CONFIG_EFI) += quirks.o efi.o efi_$(BITS).o efi_stub_$(BITS).o
|
||||
obj-$(CONFIG_EFI) += memmap.o quirks.o efi.o efi_$(BITS).o \
|
||||
efi_stub_$(BITS).o
|
||||
obj-$(CONFIG_EFI_MIXED) += efi_thunk_$(BITS).o
|
||||
|
||||
@@ -214,9 +214,11 @@ int __init efi_memblock_x86_reserve_range(void)
|
||||
data.desc_size = e->efi_memdesc_size;
|
||||
data.desc_version = e->efi_memdesc_version;
|
||||
|
||||
rv = efi_memmap_init_early(&data);
|
||||
if (rv)
|
||||
return rv;
|
||||
if (!efi_enabled(EFI_PARAVIRT)) {
|
||||
rv = efi_memmap_init_early(&data);
|
||||
if (rv)
|
||||
return rv;
|
||||
}
|
||||
|
||||
if (add_efi_memmap || do_efi_soft_reserve())
|
||||
do_add_efi_memmap();
|
||||
|
||||
249
arch/x86/platform/efi/memmap.c
Normal file
249
arch/x86/platform/efi/memmap.c
Normal file
@@ -0,0 +1,249 @@
|
||||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Common EFI memory map functions.
|
||||
*/
|
||||
|
||||
#define pr_fmt(fmt) "efi: " fmt
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/efi.h>
|
||||
#include <linux/io.h>
|
||||
#include <asm/early_ioremap.h>
|
||||
#include <asm/efi.h>
|
||||
#include <linux/memblock.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
static phys_addr_t __init __efi_memmap_alloc_early(unsigned long size)
|
||||
{
|
||||
return memblock_phys_alloc(size, SMP_CACHE_BYTES);
|
||||
}
|
||||
|
||||
static phys_addr_t __init __efi_memmap_alloc_late(unsigned long size)
|
||||
{
|
||||
unsigned int order = get_order(size);
|
||||
struct page *p = alloc_pages(GFP_KERNEL, order);
|
||||
|
||||
if (!p)
|
||||
return 0;
|
||||
|
||||
return PFN_PHYS(page_to_pfn(p));
|
||||
}
|
||||
|
||||
void __init __efi_memmap_free(u64 phys, unsigned long size, unsigned long flags)
|
||||
{
|
||||
if (flags & EFI_MEMMAP_MEMBLOCK) {
|
||||
if (slab_is_available())
|
||||
memblock_free_late(phys, size);
|
||||
else
|
||||
memblock_phys_free(phys, size);
|
||||
} else if (flags & EFI_MEMMAP_SLAB) {
|
||||
struct page *p = pfn_to_page(PHYS_PFN(phys));
|
||||
unsigned int order = get_order(size);
|
||||
|
||||
free_pages((unsigned long) page_address(p), order);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* efi_memmap_alloc - Allocate memory for the EFI memory map
|
||||
* @num_entries: Number of entries in the allocated map.
|
||||
* @data: efi memmap installation parameters
|
||||
*
|
||||
* Depending on whether mm_init() has already been invoked or not,
|
||||
* either memblock or "normal" page allocation is used.
|
||||
*
|
||||
* Returns zero on success, a negative error code on failure.
|
||||
*/
|
||||
int __init efi_memmap_alloc(unsigned int num_entries,
|
||||
struct efi_memory_map_data *data)
|
||||
{
|
||||
/* Expect allocation parameters are zero initialized */
|
||||
WARN_ON(data->phys_map || data->size);
|
||||
|
||||
data->size = num_entries * efi.memmap.desc_size;
|
||||
data->desc_version = efi.memmap.desc_version;
|
||||
data->desc_size = efi.memmap.desc_size;
|
||||
data->flags &= ~(EFI_MEMMAP_SLAB | EFI_MEMMAP_MEMBLOCK);
|
||||
data->flags |= efi.memmap.flags & EFI_MEMMAP_LATE;
|
||||
|
||||
if (slab_is_available()) {
|
||||
data->flags |= EFI_MEMMAP_SLAB;
|
||||
data->phys_map = __efi_memmap_alloc_late(data->size);
|
||||
} else {
|
||||
data->flags |= EFI_MEMMAP_MEMBLOCK;
|
||||
data->phys_map = __efi_memmap_alloc_early(data->size);
|
||||
}
|
||||
|
||||
if (!data->phys_map)
|
||||
return -ENOMEM;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* efi_memmap_install - Install a new EFI memory map in efi.memmap
|
||||
* @ctx: map allocation parameters (address, size, flags)
|
||||
*
|
||||
* Unlike efi_memmap_init_*(), this function does not allow the caller
|
||||
* to switch from early to late mappings. It simply uses the existing
|
||||
* mapping function and installs the new memmap.
|
||||
*
|
||||
* Returns zero on success, a negative error code on failure.
|
||||
*/
|
||||
int __init efi_memmap_install(struct efi_memory_map_data *data)
|
||||
{
|
||||
unsigned long size = efi.memmap.desc_size * efi.memmap.nr_map;
|
||||
unsigned long flags = efi.memmap.flags;
|
||||
u64 phys = efi.memmap.phys_map;
|
||||
int ret;
|
||||
|
||||
efi_memmap_unmap();
|
||||
|
||||
if (efi_enabled(EFI_PARAVIRT))
|
||||
return 0;
|
||||
|
||||
ret = __efi_memmap_init(data);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
__efi_memmap_free(phys, size, flags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* efi_memmap_split_count - Count number of additional EFI memmap entries
|
||||
* @md: EFI memory descriptor to split
|
||||
* @range: Address range (start, end) to split around
|
||||
*
|
||||
* Returns the number of additional EFI memmap entries required to
|
||||
* accommodate @range.
|
||||
*/
|
||||
int __init efi_memmap_split_count(efi_memory_desc_t *md, struct range *range)
|
||||
{
|
||||
u64 m_start, m_end;
|
||||
u64 start, end;
|
||||
int count = 0;
|
||||
|
||||
start = md->phys_addr;
|
||||
end = start + (md->num_pages << EFI_PAGE_SHIFT) - 1;
|
||||
|
||||
/* modifying range */
|
||||
m_start = range->start;
|
||||
m_end = range->end;
|
||||
|
||||
if (m_start <= start) {
|
||||
/* split into 2 parts */
|
||||
if (start < m_end && m_end < end)
|
||||
count++;
|
||||
}
|
||||
|
||||
if (start < m_start && m_start < end) {
|
||||
/* split into 3 parts */
|
||||
if (m_end < end)
|
||||
count += 2;
|
||||
/* split into 2 parts */
|
||||
if (end <= m_end)
|
||||
count++;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
/**
|
||||
* efi_memmap_insert - Insert a memory region in an EFI memmap
|
||||
* @old_memmap: The existing EFI memory map structure
|
||||
* @buf: Address of buffer to store new map
|
||||
* @mem: Memory map entry to insert
|
||||
*
|
||||
* It is suggested that you call efi_memmap_split_count() first
|
||||
* to see how large @buf needs to be.
|
||||
*/
|
||||
void __init efi_memmap_insert(struct efi_memory_map *old_memmap, void *buf,
|
||||
struct efi_mem_range *mem)
|
||||
{
|
||||
u64 m_start, m_end, m_attr;
|
||||
efi_memory_desc_t *md;
|
||||
u64 start, end;
|
||||
void *old, *new;
|
||||
|
||||
/* modifying range */
|
||||
m_start = mem->range.start;
|
||||
m_end = mem->range.end;
|
||||
m_attr = mem->attribute;
|
||||
|
||||
/*
|
||||
* The EFI memory map deals with regions in EFI_PAGE_SIZE
|
||||
* units. Ensure that the region described by 'mem' is aligned
|
||||
* correctly.
|
||||
*/
|
||||
if (!IS_ALIGNED(m_start, EFI_PAGE_SIZE) ||
|
||||
!IS_ALIGNED(m_end + 1, EFI_PAGE_SIZE)) {
|
||||
WARN_ON(1);
|
||||
return;
|
||||
}
|
||||
|
||||
for (old = old_memmap->map, new = buf;
|
||||
old < old_memmap->map_end;
|
||||
old += old_memmap->desc_size, new += old_memmap->desc_size) {
|
||||
|
||||
/* copy original EFI memory descriptor */
|
||||
memcpy(new, old, old_memmap->desc_size);
|
||||
md = new;
|
||||
start = md->phys_addr;
|
||||
end = md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT) - 1;
|
||||
|
||||
if (m_start <= start && end <= m_end)
|
||||
md->attribute |= m_attr;
|
||||
|
||||
if (m_start <= start &&
|
||||
(start < m_end && m_end < end)) {
|
||||
/* first part */
|
||||
md->attribute |= m_attr;
|
||||
md->num_pages = (m_end - md->phys_addr + 1) >>
|
||||
EFI_PAGE_SHIFT;
|
||||
/* latter part */
|
||||
new += old_memmap->desc_size;
|
||||
memcpy(new, old, old_memmap->desc_size);
|
||||
md = new;
|
||||
md->phys_addr = m_end + 1;
|
||||
md->num_pages = (end - md->phys_addr + 1) >>
|
||||
EFI_PAGE_SHIFT;
|
||||
}
|
||||
|
||||
if ((start < m_start && m_start < end) && m_end < end) {
|
||||
/* first part */
|
||||
md->num_pages = (m_start - md->phys_addr) >>
|
||||
EFI_PAGE_SHIFT;
|
||||
/* middle part */
|
||||
new += old_memmap->desc_size;
|
||||
memcpy(new, old, old_memmap->desc_size);
|
||||
md = new;
|
||||
md->attribute |= m_attr;
|
||||
md->phys_addr = m_start;
|
||||
md->num_pages = (m_end - m_start + 1) >>
|
||||
EFI_PAGE_SHIFT;
|
||||
/* last part */
|
||||
new += old_memmap->desc_size;
|
||||
memcpy(new, old, old_memmap->desc_size);
|
||||
md = new;
|
||||
md->phys_addr = m_end + 1;
|
||||
md->num_pages = (end - m_end) >>
|
||||
EFI_PAGE_SHIFT;
|
||||
}
|
||||
|
||||
if ((start < m_start && m_start < end) &&
|
||||
(end <= m_end)) {
|
||||
/* first part */
|
||||
md->num_pages = (m_start - md->phys_addr) >>
|
||||
EFI_PAGE_SHIFT;
|
||||
/* latter part */
|
||||
new += old_memmap->desc_size;
|
||||
memcpy(new, old, old_memmap->desc_size);
|
||||
md = new;
|
||||
md->phys_addr = m_start;
|
||||
md->num_pages = (end - md->phys_addr + 1) >>
|
||||
EFI_PAGE_SHIFT;
|
||||
md->attribute |= m_attr;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -33,6 +33,8 @@ static int ecdh_set_secret(struct crypto_kpp *tfm, const void *buf,
|
||||
params.key_size > sizeof(u64) * ctx->ndigits)
|
||||
return -EINVAL;
|
||||
|
||||
memset(ctx->private_key, 0, sizeof(ctx->private_key));
|
||||
|
||||
if (!params.key || !params.key_size)
|
||||
return ecc_gen_privkey(ctx->curve_id, ctx->ndigits,
|
||||
ctx->private_key);
|
||||
|
||||
@@ -188,16 +188,16 @@ bool acpi_device_override_status(struct acpi_device *adev, unsigned long long *s
|
||||
}
|
||||
|
||||
/*
|
||||
* AMD systems from Renoir and Lucienne *require* that the NVME controller
|
||||
* AMD systems from Renoir onwards *require* that the NVME controller
|
||||
* is put into D3 over a Modern Standby / suspend-to-idle cycle.
|
||||
*
|
||||
* This is "typically" accomplished using the `StorageD3Enable`
|
||||
* property in the _DSD that is checked via the `acpi_storage_d3` function
|
||||
* but this property was introduced after many of these systems launched
|
||||
* and most OEM systems don't have it in their BIOS.
|
||||
* but some OEM systems still don't have it in their BIOS.
|
||||
*
|
||||
* The Microsoft documentation for StorageD3Enable mentioned that Windows has
|
||||
* a hardcoded allowlist for D3 support, which was used for these platforms.
|
||||
* a hardcoded allowlist for D3 support as well as a registry key to override
|
||||
* the BIOS, which has been used for these cases.
|
||||
*
|
||||
* This allows quirking on Linux in a similar fashion.
|
||||
*
|
||||
@@ -210,18 +210,15 @@ bool acpi_device_override_status(struct acpi_device *adev, unsigned long long *s
|
||||
* https://bugzilla.kernel.org/show_bug.cgi?id=216773
|
||||
* https://bugzilla.kernel.org/show_bug.cgi?id=217003
|
||||
* 2) On at least one HP system StorageD3Enable is missing on the second NVME
|
||||
disk in the system.
|
||||
* disk in the system.
|
||||
* 3) On at least one HP Rembrandt system StorageD3Enable is missing on the only
|
||||
* NVME device.
|
||||
*/
|
||||
static const struct x86_cpu_id storage_d3_cpu_ids[] = {
|
||||
X86_MATCH_VENDOR_FAM_MODEL(AMD, 23, 96, NULL), /* Renoir */
|
||||
X86_MATCH_VENDOR_FAM_MODEL(AMD, 23, 104, NULL), /* Lucienne */
|
||||
X86_MATCH_VENDOR_FAM_MODEL(AMD, 25, 80, NULL), /* Cezanne */
|
||||
{}
|
||||
};
|
||||
|
||||
bool force_storage_d3(void)
|
||||
{
|
||||
return x86_match_cpu(storage_d3_cpu_ids);
|
||||
if (!cpu_feature_enabled(X86_FEATURE_ZEN))
|
||||
return false;
|
||||
return acpi_gbl_FADT.flags & ACPI_FADT_LOW_POWER_S0;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -1891,8 +1891,10 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
n_ports = max(ahci_nr_ports(hpriv->cap), fls(hpriv->port_map));
|
||||
|
||||
host = ata_host_alloc_pinfo(&pdev->dev, ppi, n_ports);
|
||||
if (!host)
|
||||
return -ENOMEM;
|
||||
if (!host) {
|
||||
rc = -ENOMEM;
|
||||
goto err_rm_sysfs_file;
|
||||
}
|
||||
host->private_data = hpriv;
|
||||
|
||||
if (ahci_init_msi(pdev, n_ports, hpriv) < 0) {
|
||||
@@ -1945,11 +1947,11 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
/* initialize adapter */
|
||||
rc = ahci_configure_dma_masks(pdev, hpriv);
|
||||
if (rc)
|
||||
return rc;
|
||||
goto err_rm_sysfs_file;
|
||||
|
||||
rc = ahci_pci_reset_controller(host);
|
||||
if (rc)
|
||||
return rc;
|
||||
goto err_rm_sysfs_file;
|
||||
|
||||
ahci_pci_init_controller(host);
|
||||
ahci_pci_print_info(host);
|
||||
@@ -1958,10 +1960,15 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
|
||||
rc = ahci_host_activate(host, &ahci_sht);
|
||||
if (rc)
|
||||
return rc;
|
||||
goto err_rm_sysfs_file;
|
||||
|
||||
pm_runtime_put_noidle(&pdev->dev);
|
||||
return 0;
|
||||
|
||||
err_rm_sysfs_file:
|
||||
sysfs_remove_file_from_group(&pdev->dev.kobj,
|
||||
&dev_attr_remapped_nvme.attr, NULL);
|
||||
return rc;
|
||||
}
|
||||
|
||||
static void ahci_shutdown_one(struct pci_dev *pdev)
|
||||
|
||||
@@ -5523,8 +5523,10 @@ struct ata_host *ata_host_alloc(struct device *dev, int max_ports)
|
||||
if (!host)
|
||||
return NULL;
|
||||
|
||||
if (!devres_open_group(dev, NULL, GFP_KERNEL))
|
||||
goto err_free;
|
||||
if (!devres_open_group(dev, NULL, GFP_KERNEL)) {
|
||||
kfree(host);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
dr = devres_alloc(ata_devres_release, 0, GFP_KERNEL);
|
||||
if (!dr)
|
||||
@@ -5556,8 +5558,6 @@ struct ata_host *ata_host_alloc(struct device *dev, int max_ports)
|
||||
|
||||
err_out:
|
||||
devres_release_group(dev, NULL);
|
||||
err_free:
|
||||
kfree(host);
|
||||
return NULL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_host_alloc);
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/counter.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mod_devicetable.h>
|
||||
@@ -376,6 +377,7 @@ static int ti_eqep_probe(struct platform_device *pdev)
|
||||
struct counter_device *counter;
|
||||
struct ti_eqep_cnt *priv;
|
||||
void __iomem *base;
|
||||
struct clk *clk;
|
||||
int err;
|
||||
|
||||
counter = devm_counter_alloc(dev, sizeof(*priv));
|
||||
@@ -415,6 +417,10 @@ static int ti_eqep_probe(struct platform_device *pdev)
|
||||
pm_runtime_enable(dev);
|
||||
pm_runtime_get_sync(dev);
|
||||
|
||||
clk = devm_clk_get_enabled(dev, NULL);
|
||||
if (IS_ERR(clk))
|
||||
return dev_err_probe(dev, PTR_ERR(clk), "failed to enable clock\n");
|
||||
|
||||
err = counter_add(counter);
|
||||
if (err < 0) {
|
||||
pm_runtime_put_sync(dev);
|
||||
|
||||
@@ -424,7 +424,7 @@ static int amd_pstate_set_boost(struct cpufreq_policy *policy, int state)
|
||||
if (state)
|
||||
policy->cpuinfo.max_freq = cpudata->max_freq;
|
||||
else
|
||||
policy->cpuinfo.max_freq = cpudata->nominal_freq * 1000;
|
||||
policy->cpuinfo.max_freq = cpudata->nominal_freq;
|
||||
|
||||
policy->max = policy->cpuinfo.max_freq;
|
||||
|
||||
|
||||
@@ -348,15 +348,14 @@ static void intel_pstate_set_itmt_prio(int cpu)
|
||||
int ret;
|
||||
|
||||
ret = cppc_get_perf_caps(cpu, &cppc_perf);
|
||||
if (ret)
|
||||
return;
|
||||
|
||||
/*
|
||||
* On some systems with overclocking enabled, CPPC.highest_perf is hardcoded to 0xff.
|
||||
* In this case we can't use CPPC.highest_perf to enable ITMT.
|
||||
* In this case we can look at MSR_HWP_CAPABILITIES bits [8:0] to decide.
|
||||
* If CPPC is not available, fall back to MSR_HWP_CAPABILITIES bits [8:0].
|
||||
*
|
||||
* Also, on some systems with overclocking enabled, CPPC.highest_perf is
|
||||
* hardcoded to 0xff, so CPPC.highest_perf cannot be used to enable ITMT.
|
||||
* Fall back to MSR_HWP_CAPABILITIES then too.
|
||||
*/
|
||||
if (cppc_perf.highest_perf == CPPC_MAX_PERF)
|
||||
if (ret || cppc_perf.highest_perf == CPPC_MAX_PERF)
|
||||
cppc_perf.highest_perf = HWP_HIGHEST_PERF(READ_ONCE(all_cpu_data[cpu]->hwp_cap_cached));
|
||||
|
||||
/*
|
||||
|
||||
@@ -30,11 +30,13 @@ static __initconst const char name[][22] = {
|
||||
|
||||
static __initconst const struct {
|
||||
const char path[17];
|
||||
u8 paravirt;
|
||||
const char params[PARAMCOUNT][26];
|
||||
} dt_params[] = {
|
||||
{
|
||||
#ifdef CONFIG_XEN // <-------17------>
|
||||
.path = "/hypervisor/uefi",
|
||||
.paravirt = 1,
|
||||
.params = {
|
||||
[SYSTAB] = "xen,uefi-system-table",
|
||||
[MMBASE] = "xen,uefi-mmap-start",
|
||||
@@ -121,6 +123,8 @@ u64 __init efi_get_fdt_params(struct efi_memory_map_data *mm)
|
||||
pr_err("Can't find property '%s' in DT!\n", pname);
|
||||
return 0;
|
||||
}
|
||||
if (dt_params[i].paravirt)
|
||||
set_bit(EFI_PARAVIRT, &efi.flags);
|
||||
return systab;
|
||||
}
|
||||
notfound:
|
||||
|
||||
@@ -9,82 +9,11 @@
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/efi.h>
|
||||
#include <linux/io.h>
|
||||
#include <asm/early_ioremap.h>
|
||||
#include <linux/memblock.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
static phys_addr_t __init __efi_memmap_alloc_early(unsigned long size)
|
||||
{
|
||||
return memblock_phys_alloc(size, SMP_CACHE_BYTES);
|
||||
}
|
||||
|
||||
static phys_addr_t __init __efi_memmap_alloc_late(unsigned long size)
|
||||
{
|
||||
unsigned int order = get_order(size);
|
||||
struct page *p = alloc_pages(GFP_KERNEL, order);
|
||||
|
||||
if (!p)
|
||||
return 0;
|
||||
|
||||
return PFN_PHYS(page_to_pfn(p));
|
||||
}
|
||||
|
||||
void __init __efi_memmap_free(u64 phys, unsigned long size, unsigned long flags)
|
||||
{
|
||||
if (flags & EFI_MEMMAP_MEMBLOCK) {
|
||||
if (slab_is_available())
|
||||
memblock_free_late(phys, size);
|
||||
else
|
||||
memblock_phys_free(phys, size);
|
||||
} else if (flags & EFI_MEMMAP_SLAB) {
|
||||
struct page *p = pfn_to_page(PHYS_PFN(phys));
|
||||
unsigned int order = get_order(size);
|
||||
|
||||
free_pages((unsigned long) page_address(p), order);
|
||||
}
|
||||
}
|
||||
|
||||
static void __init efi_memmap_free(void)
|
||||
{
|
||||
__efi_memmap_free(efi.memmap.phys_map,
|
||||
efi.memmap.desc_size * efi.memmap.nr_map,
|
||||
efi.memmap.flags);
|
||||
}
|
||||
|
||||
/**
|
||||
* efi_memmap_alloc - Allocate memory for the EFI memory map
|
||||
* @num_entries: Number of entries in the allocated map.
|
||||
* @data: efi memmap installation parameters
|
||||
*
|
||||
* Depending on whether mm_init() has already been invoked or not,
|
||||
* either memblock or "normal" page allocation is used.
|
||||
*
|
||||
* Returns zero on success, a negative error code on failure.
|
||||
*/
|
||||
int __init efi_memmap_alloc(unsigned int num_entries,
|
||||
struct efi_memory_map_data *data)
|
||||
{
|
||||
/* Expect allocation parameters are zero initialized */
|
||||
WARN_ON(data->phys_map || data->size);
|
||||
|
||||
data->size = num_entries * efi.memmap.desc_size;
|
||||
data->desc_version = efi.memmap.desc_version;
|
||||
data->desc_size = efi.memmap.desc_size;
|
||||
data->flags &= ~(EFI_MEMMAP_SLAB | EFI_MEMMAP_MEMBLOCK);
|
||||
data->flags |= efi.memmap.flags & EFI_MEMMAP_LATE;
|
||||
|
||||
if (slab_is_available()) {
|
||||
data->flags |= EFI_MEMMAP_SLAB;
|
||||
data->phys_map = __efi_memmap_alloc_late(data->size);
|
||||
} else {
|
||||
data->flags |= EFI_MEMMAP_MEMBLOCK;
|
||||
data->phys_map = __efi_memmap_alloc_early(data->size);
|
||||
}
|
||||
|
||||
if (!data->phys_map)
|
||||
return -ENOMEM;
|
||||
return 0;
|
||||
}
|
||||
#include <asm/early_ioremap.h>
|
||||
#include <asm/efi.h>
|
||||
|
||||
/**
|
||||
* __efi_memmap_init - Common code for mapping the EFI memory map
|
||||
@@ -101,14 +30,11 @@ int __init efi_memmap_alloc(unsigned int num_entries,
|
||||
*
|
||||
* Returns zero on success, a negative error code on failure.
|
||||
*/
|
||||
static int __init __efi_memmap_init(struct efi_memory_map_data *data)
|
||||
int __init __efi_memmap_init(struct efi_memory_map_data *data)
|
||||
{
|
||||
struct efi_memory_map map;
|
||||
phys_addr_t phys_map;
|
||||
|
||||
if (efi_enabled(EFI_PARAVIRT))
|
||||
return 0;
|
||||
|
||||
phys_map = data->phys_map;
|
||||
|
||||
if (data->flags & EFI_MEMMAP_LATE)
|
||||
@@ -121,9 +47,6 @@ static int __init __efi_memmap_init(struct efi_memory_map_data *data)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/* NOP if data->flags & (EFI_MEMMAP_MEMBLOCK | EFI_MEMMAP_SLAB) == 0 */
|
||||
efi_memmap_free();
|
||||
|
||||
map.phys_map = data->phys_map;
|
||||
map.nr_map = data->size / data->desc_size;
|
||||
map.map_end = map.map + data->size;
|
||||
@@ -220,158 +143,3 @@ int __init efi_memmap_init_late(phys_addr_t addr, unsigned long size)
|
||||
|
||||
return __efi_memmap_init(&data);
|
||||
}
|
||||
|
||||
/**
|
||||
* efi_memmap_install - Install a new EFI memory map in efi.memmap
|
||||
* @ctx: map allocation parameters (address, size, flags)
|
||||
*
|
||||
* Unlike efi_memmap_init_*(), this function does not allow the caller
|
||||
* to switch from early to late mappings. It simply uses the existing
|
||||
* mapping function and installs the new memmap.
|
||||
*
|
||||
* Returns zero on success, a negative error code on failure.
|
||||
*/
|
||||
int __init efi_memmap_install(struct efi_memory_map_data *data)
|
||||
{
|
||||
efi_memmap_unmap();
|
||||
|
||||
return __efi_memmap_init(data);
|
||||
}
|
||||
|
||||
/**
|
||||
* efi_memmap_split_count - Count number of additional EFI memmap entries
|
||||
* @md: EFI memory descriptor to split
|
||||
* @range: Address range (start, end) to split around
|
||||
*
|
||||
* Returns the number of additional EFI memmap entries required to
|
||||
* accommodate @range.
|
||||
*/
|
||||
int __init efi_memmap_split_count(efi_memory_desc_t *md, struct range *range)
|
||||
{
|
||||
u64 m_start, m_end;
|
||||
u64 start, end;
|
||||
int count = 0;
|
||||
|
||||
start = md->phys_addr;
|
||||
end = start + (md->num_pages << EFI_PAGE_SHIFT) - 1;
|
||||
|
||||
/* modifying range */
|
||||
m_start = range->start;
|
||||
m_end = range->end;
|
||||
|
||||
if (m_start <= start) {
|
||||
/* split into 2 parts */
|
||||
if (start < m_end && m_end < end)
|
||||
count++;
|
||||
}
|
||||
|
||||
if (start < m_start && m_start < end) {
|
||||
/* split into 3 parts */
|
||||
if (m_end < end)
|
||||
count += 2;
|
||||
/* split into 2 parts */
|
||||
if (end <= m_end)
|
||||
count++;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
/**
|
||||
* efi_memmap_insert - Insert a memory region in an EFI memmap
|
||||
* @old_memmap: The existing EFI memory map structure
|
||||
* @buf: Address of buffer to store new map
|
||||
* @mem: Memory map entry to insert
|
||||
*
|
||||
* It is suggested that you call efi_memmap_split_count() first
|
||||
* to see how large @buf needs to be.
|
||||
*/
|
||||
void __init efi_memmap_insert(struct efi_memory_map *old_memmap, void *buf,
|
||||
struct efi_mem_range *mem)
|
||||
{
|
||||
u64 m_start, m_end, m_attr;
|
||||
efi_memory_desc_t *md;
|
||||
u64 start, end;
|
||||
void *old, *new;
|
||||
|
||||
/* modifying range */
|
||||
m_start = mem->range.start;
|
||||
m_end = mem->range.end;
|
||||
m_attr = mem->attribute;
|
||||
|
||||
/*
|
||||
* The EFI memory map deals with regions in EFI_PAGE_SIZE
|
||||
* units. Ensure that the region described by 'mem' is aligned
|
||||
* correctly.
|
||||
*/
|
||||
if (!IS_ALIGNED(m_start, EFI_PAGE_SIZE) ||
|
||||
!IS_ALIGNED(m_end + 1, EFI_PAGE_SIZE)) {
|
||||
WARN_ON(1);
|
||||
return;
|
||||
}
|
||||
|
||||
for (old = old_memmap->map, new = buf;
|
||||
old < old_memmap->map_end;
|
||||
old += old_memmap->desc_size, new += old_memmap->desc_size) {
|
||||
|
||||
/* copy original EFI memory descriptor */
|
||||
memcpy(new, old, old_memmap->desc_size);
|
||||
md = new;
|
||||
start = md->phys_addr;
|
||||
end = md->phys_addr + (md->num_pages << EFI_PAGE_SHIFT) - 1;
|
||||
|
||||
if (m_start <= start && end <= m_end)
|
||||
md->attribute |= m_attr;
|
||||
|
||||
if (m_start <= start &&
|
||||
(start < m_end && m_end < end)) {
|
||||
/* first part */
|
||||
md->attribute |= m_attr;
|
||||
md->num_pages = (m_end - md->phys_addr + 1) >>
|
||||
EFI_PAGE_SHIFT;
|
||||
/* latter part */
|
||||
new += old_memmap->desc_size;
|
||||
memcpy(new, old, old_memmap->desc_size);
|
||||
md = new;
|
||||
md->phys_addr = m_end + 1;
|
||||
md->num_pages = (end - md->phys_addr + 1) >>
|
||||
EFI_PAGE_SHIFT;
|
||||
}
|
||||
|
||||
if ((start < m_start && m_start < end) && m_end < end) {
|
||||
/* first part */
|
||||
md->num_pages = (m_start - md->phys_addr) >>
|
||||
EFI_PAGE_SHIFT;
|
||||
/* middle part */
|
||||
new += old_memmap->desc_size;
|
||||
memcpy(new, old, old_memmap->desc_size);
|
||||
md = new;
|
||||
md->attribute |= m_attr;
|
||||
md->phys_addr = m_start;
|
||||
md->num_pages = (m_end - m_start + 1) >>
|
||||
EFI_PAGE_SHIFT;
|
||||
/* last part */
|
||||
new += old_memmap->desc_size;
|
||||
memcpy(new, old, old_memmap->desc_size);
|
||||
md = new;
|
||||
md->phys_addr = m_end + 1;
|
||||
md->num_pages = (end - m_end) >>
|
||||
EFI_PAGE_SHIFT;
|
||||
}
|
||||
|
||||
if ((start < m_start && m_start < end) &&
|
||||
(end <= m_end)) {
|
||||
/* first part */
|
||||
md->num_pages = (m_start - md->phys_addr) >>
|
||||
EFI_PAGE_SHIFT;
|
||||
/* latter part */
|
||||
new += old_memmap->desc_size;
|
||||
memcpy(new, old, old_memmap->desc_size);
|
||||
md = new;
|
||||
md->phys_addr = m_start;
|
||||
md->num_pages = (end - md->phys_addr + 1) >>
|
||||
EFI_PAGE_SHIFT;
|
||||
md->attribute |= m_attr;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -230,6 +230,11 @@ static int davinci_gpio_probe(struct platform_device *pdev)
|
||||
else
|
||||
nirq = DIV_ROUND_UP(ngpio, 16);
|
||||
|
||||
if (nirq > MAX_INT_PER_BANK) {
|
||||
dev_err(dev, "Too many IRQs!\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
chips = devm_kzalloc(dev, sizeof(*chips), GFP_KERNEL);
|
||||
if (!chips)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -132,6 +132,10 @@ struct linehandle_state {
|
||||
GPIOHANDLE_REQUEST_OPEN_DRAIN | \
|
||||
GPIOHANDLE_REQUEST_OPEN_SOURCE)
|
||||
|
||||
#define GPIOHANDLE_REQUEST_DIRECTION_FLAGS \
|
||||
(GPIOHANDLE_REQUEST_INPUT | \
|
||||
GPIOHANDLE_REQUEST_OUTPUT)
|
||||
|
||||
static int linehandle_validate_flags(u32 flags)
|
||||
{
|
||||
/* Return an error if an unknown flag is set */
|
||||
@@ -212,21 +216,21 @@ static long linehandle_set_config(struct linehandle_state *lh,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Lines must be reconfigured explicitly as input or output. */
|
||||
if (!(lflags & GPIOHANDLE_REQUEST_DIRECTION_FLAGS))
|
||||
return -EINVAL;
|
||||
|
||||
for (i = 0; i < lh->num_descs; i++) {
|
||||
desc = lh->descs[i];
|
||||
linehandle_flags_to_desc_flags(gcnf.flags, &desc->flags);
|
||||
linehandle_flags_to_desc_flags(lflags, &desc->flags);
|
||||
|
||||
/*
|
||||
* Lines have to be requested explicitly for input
|
||||
* or output, else the line will be treated "as is".
|
||||
*/
|
||||
if (lflags & GPIOHANDLE_REQUEST_OUTPUT) {
|
||||
int val = !!gcnf.default_values[i];
|
||||
|
||||
ret = gpiod_direction_output(desc, val);
|
||||
if (ret)
|
||||
return ret;
|
||||
} else if (lflags & GPIOHANDLE_REQUEST_INPUT) {
|
||||
} else {
|
||||
ret = gpiod_direction_input(desc);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -387,7 +387,7 @@ amdgpu_atomfirmware_get_vram_info(struct amdgpu_device *adev,
|
||||
mem_channel_number = vram_info->v30.channel_num;
|
||||
mem_channel_width = vram_info->v30.channel_width;
|
||||
if (vram_width)
|
||||
*vram_width = mem_channel_number * (1 << mem_channel_width);
|
||||
*vram_width = mem_channel_number * 16;
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
|
||||
@@ -980,7 +980,7 @@ void amdgpu_device_program_register_sequence(struct amdgpu_device *adev,
|
||||
if (array_size % 3)
|
||||
return;
|
||||
|
||||
for (i = 0; i < array_size; i +=3) {
|
||||
for (i = 0; i < array_size; i += 3) {
|
||||
reg = registers[i + 0];
|
||||
and_mask = registers[i + 1];
|
||||
or_mask = registers[i + 2];
|
||||
@@ -1552,7 +1552,7 @@ static int amdgpu_device_check_arguments(struct amdgpu_device *adev)
|
||||
dev_warn(adev->dev, "sched jobs (%d) must be at least 4\n",
|
||||
amdgpu_sched_jobs);
|
||||
amdgpu_sched_jobs = 4;
|
||||
} else if (!is_power_of_2(amdgpu_sched_jobs)){
|
||||
} else if (!is_power_of_2(amdgpu_sched_jobs)) {
|
||||
dev_warn(adev->dev, "sched jobs (%d) must be a power of 2\n",
|
||||
amdgpu_sched_jobs);
|
||||
amdgpu_sched_jobs = roundup_pow_of_two(amdgpu_sched_jobs);
|
||||
@@ -2747,8 +2747,9 @@ static int amdgpu_device_ip_late_init(struct amdgpu_device *adev)
|
||||
DRM_ERROR("enable mgpu fan boost failed (%d).\n", r);
|
||||
|
||||
/* For passthrough configuration on arcturus and aldebaran, enable special handling SBR */
|
||||
if (amdgpu_passthrough(adev) && ((adev->asic_type == CHIP_ARCTURUS && adev->gmc.xgmi.num_physical_nodes > 1)||
|
||||
adev->asic_type == CHIP_ALDEBARAN ))
|
||||
if (amdgpu_passthrough(adev) &&
|
||||
((adev->asic_type == CHIP_ARCTURUS && adev->gmc.xgmi.num_physical_nodes > 1) ||
|
||||
adev->asic_type == CHIP_ALDEBARAN))
|
||||
amdgpu_dpm_handle_passthrough_sbr(adev, true);
|
||||
|
||||
if (adev->gmc.xgmi.num_physical_nodes > 1) {
|
||||
@@ -3077,7 +3078,7 @@ static int amdgpu_device_ip_suspend_phase2(struct amdgpu_device *adev)
|
||||
}
|
||||
adev->ip_blocks[i].status.hw = false;
|
||||
/* handle putting the SMC in the appropriate state */
|
||||
if(!amdgpu_sriov_vf(adev)){
|
||||
if (!amdgpu_sriov_vf(adev)) {
|
||||
if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_SMC) {
|
||||
r = amdgpu_dpm_set_mp1_state(adev, adev->mp1_state);
|
||||
if (r) {
|
||||
@@ -4048,7 +4049,7 @@ void amdgpu_device_fini_hw(struct amdgpu_device *adev)
|
||||
|
||||
/* disable all interrupts */
|
||||
amdgpu_irq_disable_all(adev);
|
||||
if (adev->mode_info.mode_config_initialized){
|
||||
if (adev->mode_info.mode_config_initialized) {
|
||||
if (!drm_drv_uses_atomic_modeset(adev_to_drm(adev)))
|
||||
drm_helper_force_disable_all(adev_to_drm(adev));
|
||||
else
|
||||
@@ -4755,42 +4756,45 @@ disabled:
|
||||
|
||||
int amdgpu_device_mode1_reset(struct amdgpu_device *adev)
|
||||
{
|
||||
u32 i;
|
||||
int ret = 0;
|
||||
u32 i;
|
||||
int ret = 0;
|
||||
|
||||
amdgpu_atombios_scratch_regs_engine_hung(adev, true);
|
||||
amdgpu_atombios_scratch_regs_engine_hung(adev, true);
|
||||
|
||||
dev_info(adev->dev, "GPU mode1 reset\n");
|
||||
dev_info(adev->dev, "GPU mode1 reset\n");
|
||||
|
||||
/* disable BM */
|
||||
pci_clear_master(adev->pdev);
|
||||
/* Cache the state before bus master disable. The saved config space
|
||||
* values are used in other cases like restore after mode-2 reset.
|
||||
*/
|
||||
amdgpu_device_cache_pci_state(adev->pdev);
|
||||
|
||||
amdgpu_device_cache_pci_state(adev->pdev);
|
||||
/* disable BM */
|
||||
pci_clear_master(adev->pdev);
|
||||
|
||||
if (amdgpu_dpm_is_mode1_reset_supported(adev)) {
|
||||
dev_info(adev->dev, "GPU smu mode1 reset\n");
|
||||
ret = amdgpu_dpm_mode1_reset(adev);
|
||||
} else {
|
||||
dev_info(adev->dev, "GPU psp mode1 reset\n");
|
||||
ret = psp_gpu_reset(adev);
|
||||
}
|
||||
if (amdgpu_dpm_is_mode1_reset_supported(adev)) {
|
||||
dev_info(adev->dev, "GPU smu mode1 reset\n");
|
||||
ret = amdgpu_dpm_mode1_reset(adev);
|
||||
} else {
|
||||
dev_info(adev->dev, "GPU psp mode1 reset\n");
|
||||
ret = psp_gpu_reset(adev);
|
||||
}
|
||||
|
||||
if (ret)
|
||||
dev_err(adev->dev, "GPU mode1 reset failed\n");
|
||||
if (ret)
|
||||
dev_err(adev->dev, "GPU mode1 reset failed\n");
|
||||
|
||||
amdgpu_device_load_pci_state(adev->pdev);
|
||||
amdgpu_device_load_pci_state(adev->pdev);
|
||||
|
||||
/* wait for asic to come out of reset */
|
||||
for (i = 0; i < adev->usec_timeout; i++) {
|
||||
u32 memsize = adev->nbio.funcs->get_memsize(adev);
|
||||
/* wait for asic to come out of reset */
|
||||
for (i = 0; i < adev->usec_timeout; i++) {
|
||||
u32 memsize = adev->nbio.funcs->get_memsize(adev);
|
||||
|
||||
if (memsize != 0xffffffff)
|
||||
break;
|
||||
udelay(1);
|
||||
}
|
||||
if (memsize != 0xffffffff)
|
||||
break;
|
||||
udelay(1);
|
||||
}
|
||||
|
||||
amdgpu_atombios_scratch_regs_engine_hung(adev, false);
|
||||
return ret;
|
||||
amdgpu_atombios_scratch_regs_engine_hung(adev, false);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int amdgpu_device_pre_asic_reset(struct amdgpu_device *adev,
|
||||
|
||||
@@ -1662,7 +1662,7 @@ static const u16 amdgpu_unsupported_pciidlist[] = {
|
||||
};
|
||||
|
||||
static const struct pci_device_id pciidlist[] = {
|
||||
#ifdef CONFIG_DRM_AMDGPU_SI
|
||||
#ifdef CONFIG_DRM_AMDGPU_SI
|
||||
{0x1002, 0x6780, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
|
||||
{0x1002, 0x6784, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
|
||||
{0x1002, 0x6788, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
#include <drm/drm_atomic_helper.h>
|
||||
#include <drm/drm_simple_kms_helper.h>
|
||||
#include <drm/drm_gem_framebuffer_helper.h>
|
||||
#include <drm/drm_vblank.h>
|
||||
|
||||
#include "amdgpu.h"
|
||||
@@ -313,7 +314,13 @@ static int amdgpu_vkms_prepare_fb(struct drm_plane *plane,
|
||||
return 0;
|
||||
}
|
||||
afb = to_amdgpu_framebuffer(new_state->fb);
|
||||
obj = new_state->fb->obj[0];
|
||||
|
||||
obj = drm_gem_fb_get_obj(new_state->fb, 0);
|
||||
if (!obj) {
|
||||
DRM_ERROR("Failed to get obj from framebuffer\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
rbo = gem_to_amdgpu_bo(obj);
|
||||
adev = amdgpu_ttm_adev(rbo->tbo.bdev);
|
||||
|
||||
@@ -367,12 +374,19 @@ static void amdgpu_vkms_cleanup_fb(struct drm_plane *plane,
|
||||
struct drm_plane_state *old_state)
|
||||
{
|
||||
struct amdgpu_bo *rbo;
|
||||
struct drm_gem_object *obj;
|
||||
int r;
|
||||
|
||||
if (!old_state->fb)
|
||||
return;
|
||||
|
||||
rbo = gem_to_amdgpu_bo(old_state->fb->obj[0]);
|
||||
obj = drm_gem_fb_get_obj(old_state->fb, 0);
|
||||
if (!obj) {
|
||||
DRM_ERROR("Failed to get obj from framebuffer\n");
|
||||
return;
|
||||
}
|
||||
|
||||
rbo = gem_to_amdgpu_bo(obj);
|
||||
r = amdgpu_bo_reserve(rbo, false);
|
||||
if (unlikely(r)) {
|
||||
DRM_ERROR("failed to reserve rbo before unpin\n");
|
||||
|
||||
@@ -296,6 +296,7 @@ void i915_vma_revoke_fence(struct i915_vma *vma)
|
||||
return;
|
||||
|
||||
GEM_BUG_ON(fence->vma != vma);
|
||||
i915_active_wait(&fence->active);
|
||||
GEM_BUG_ON(!i915_active_is_idle(&fence->active));
|
||||
GEM_BUG_ON(atomic_read(&fence->pin_count));
|
||||
|
||||
|
||||
@@ -208,6 +208,8 @@ static int nv17_tv_get_ld_modes(struct drm_encoder *encoder,
|
||||
struct drm_display_mode *mode;
|
||||
|
||||
mode = drm_mode_duplicate(encoder->dev, tv_mode);
|
||||
if (!mode)
|
||||
continue;
|
||||
|
||||
mode->clock = tv_norm->tv_enc_mode.vrefresh *
|
||||
mode->htotal / 1000 *
|
||||
@@ -257,6 +259,8 @@ static int nv17_tv_get_hd_modes(struct drm_encoder *encoder,
|
||||
if (modes[i].hdisplay == output_mode->hdisplay &&
|
||||
modes[i].vdisplay == output_mode->vdisplay) {
|
||||
mode = drm_mode_duplicate(encoder->dev, output_mode);
|
||||
if (!mode)
|
||||
continue;
|
||||
mode->type |= DRM_MODE_TYPE_PREFERRED;
|
||||
|
||||
} else {
|
||||
@@ -264,6 +268,8 @@ static int nv17_tv_get_hd_modes(struct drm_encoder *encoder,
|
||||
modes[i].vdisplay, 60, false,
|
||||
(output_mode->flags &
|
||||
DRM_MODE_FLAG_INTERLACE), false);
|
||||
if (!mode)
|
||||
continue;
|
||||
}
|
||||
|
||||
/* CVT modes are sometimes unsuitable... */
|
||||
|
||||
@@ -716,10 +716,10 @@ static int ili9881c_prepare(struct drm_panel *panel)
|
||||
msleep(5);
|
||||
|
||||
/* And reset it */
|
||||
gpiod_set_value(ctx->reset, 1);
|
||||
gpiod_set_value_cansleep(ctx->reset, 1);
|
||||
msleep(20);
|
||||
|
||||
gpiod_set_value(ctx->reset, 0);
|
||||
gpiod_set_value_cansleep(ctx->reset, 0);
|
||||
msleep(20);
|
||||
|
||||
for (i = 0; i < ctx->desc->init_length; i++) {
|
||||
@@ -774,7 +774,7 @@ static int ili9881c_unprepare(struct drm_panel *panel)
|
||||
|
||||
mipi_dsi_dcs_enter_sleep_mode(ctx->dsi);
|
||||
regulator_disable(ctx->power);
|
||||
gpiod_set_value(ctx->reset, 1);
|
||||
gpiod_set_value_cansleep(ctx->reset, 1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2371,6 +2371,7 @@ static const struct display_timing koe_tx26d202vm0bwa_timing = {
|
||||
.vfront_porch = { 3, 5, 10 },
|
||||
.vback_porch = { 2, 5, 10 },
|
||||
.vsync_len = { 5, 5, 5 },
|
||||
.flags = DISPLAY_FLAGS_DE_HIGH,
|
||||
};
|
||||
|
||||
static const struct panel_desc koe_tx26d202vm0bwa = {
|
||||
|
||||
@@ -131,7 +131,6 @@ extern int radeon_cik_support;
|
||||
/* RADEON_IB_POOL_SIZE must be a power of 2 */
|
||||
#define RADEON_IB_POOL_SIZE 16
|
||||
#define RADEON_DEBUGFS_MAX_COMPONENTS 32
|
||||
#define RADEONFB_CONN_LIMIT 4
|
||||
#define RADEON_BIOS_NUM_SCRATCH 8
|
||||
|
||||
/* internal ring indices */
|
||||
|
||||
@@ -683,7 +683,7 @@ static void radeon_crtc_init(struct drm_device *dev, int index)
|
||||
struct radeon_device *rdev = dev->dev_private;
|
||||
struct radeon_crtc *radeon_crtc;
|
||||
|
||||
radeon_crtc = kzalloc(sizeof(struct radeon_crtc) + (RADEONFB_CONN_LIMIT * sizeof(struct drm_connector *)), GFP_KERNEL);
|
||||
radeon_crtc = kzalloc(sizeof(*radeon_crtc), GFP_KERNEL);
|
||||
if (radeon_crtc == NULL)
|
||||
return;
|
||||
|
||||
@@ -709,12 +709,6 @@ static void radeon_crtc_init(struct drm_device *dev, int index)
|
||||
dev->mode_config.cursor_width = radeon_crtc->max_cursor_width;
|
||||
dev->mode_config.cursor_height = radeon_crtc->max_cursor_height;
|
||||
|
||||
#if 0
|
||||
radeon_crtc->mode_set.crtc = &radeon_crtc->base;
|
||||
radeon_crtc->mode_set.connectors = (struct drm_connector **)(radeon_crtc + 1);
|
||||
radeon_crtc->mode_set.num_connectors = 0;
|
||||
#endif
|
||||
|
||||
if (rdev->is_atom_bios && (ASIC_IS_AVIVO(rdev) || radeon_r4xx_atom))
|
||||
radeon_atombios_init_crtc(dev, radeon_crtc);
|
||||
else
|
||||
|
||||
@@ -118,9 +118,12 @@ static int i2c_slave_testunit_slave_cb(struct i2c_client *client,
|
||||
queue_delayed_work(system_long_wq, &tu->worker,
|
||||
msecs_to_jiffies(10 * tu->regs[TU_REG_DELAY]));
|
||||
}
|
||||
fallthrough;
|
||||
break;
|
||||
|
||||
case I2C_SLAVE_WRITE_REQUESTED:
|
||||
if (test_bit(TU_FLAG_IN_PROCESS, &tu->flags))
|
||||
return -EBUSY;
|
||||
|
||||
memset(tu->regs, 0, TU_NUM_REGS);
|
||||
tu->reg_idx = 0;
|
||||
break;
|
||||
|
||||
@@ -325,6 +325,8 @@ config DMARD10
|
||||
config FXLS8962AF
|
||||
tristate
|
||||
depends on I2C || !I2C # cannot be built-in for modular I2C
|
||||
select IIO_BUFFER
|
||||
select IIO_KFIFO_BUF
|
||||
|
||||
config FXLS8962AF_I2C
|
||||
tristate "NXP FXLS8962AF/FXLS8964AF Accelerometer I2C Driver"
|
||||
|
||||
@@ -157,6 +157,8 @@ static int ad7266_read_raw(struct iio_dev *indio_dev,
|
||||
ret = ad7266_read_single(st, val, chan->address);
|
||||
iio_device_release_direct_mode(indio_dev);
|
||||
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
*val = (*val >> 2) & 0xfff;
|
||||
if (chan->scan_type.sign == 's')
|
||||
*val = sign_extend32(*val,
|
||||
|
||||
@@ -414,8 +414,12 @@ static void ams_enable_channel_sequence(struct iio_dev *indio_dev)
|
||||
|
||||
/* Run calibration of PS & PL as part of the sequence */
|
||||
scan_mask = BIT(0) | BIT(AMS_PS_SEQ_MAX);
|
||||
for (i = 0; i < indio_dev->num_channels; i++)
|
||||
scan_mask |= BIT_ULL(indio_dev->channels[i].scan_index);
|
||||
for (i = 0; i < indio_dev->num_channels; i++) {
|
||||
const struct iio_chan_spec *chan = &indio_dev->channels[i];
|
||||
|
||||
if (chan->scan_index < AMS_CTRL_SEQ_BASE)
|
||||
scan_mask |= BIT_ULL(chan->scan_index);
|
||||
}
|
||||
|
||||
if (ams->ps_base) {
|
||||
/* put sysmon in a soft reset to change the sequence */
|
||||
|
||||
@@ -54,7 +54,9 @@
|
||||
#define BME680_NB_CONV_MASK GENMASK(3, 0)
|
||||
|
||||
#define BME680_REG_MEAS_STAT_0 0x1D
|
||||
#define BME680_NEW_DATA_BIT BIT(7)
|
||||
#define BME680_GAS_MEAS_BIT BIT(6)
|
||||
#define BME680_MEAS_BIT BIT(5)
|
||||
|
||||
/* Calibration Parameters */
|
||||
#define BME680_T2_LSB_REG 0x8A
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
*/
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/bitfield.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/log2.h>
|
||||
@@ -38,7 +39,7 @@ struct bme680_calib {
|
||||
s8 par_h3;
|
||||
s8 par_h4;
|
||||
s8 par_h5;
|
||||
s8 par_h6;
|
||||
u8 par_h6;
|
||||
s8 par_h7;
|
||||
s8 par_gh1;
|
||||
s16 par_gh2;
|
||||
@@ -342,10 +343,10 @@ static s16 bme680_compensate_temp(struct bme680_data *data,
|
||||
if (!calib->par_t2)
|
||||
bme680_read_calib(data, calib);
|
||||
|
||||
var1 = (adc_temp >> 3) - (calib->par_t1 << 1);
|
||||
var1 = (adc_temp >> 3) - ((s32)calib->par_t1 << 1);
|
||||
var2 = (var1 * calib->par_t2) >> 11;
|
||||
var3 = ((var1 >> 1) * (var1 >> 1)) >> 12;
|
||||
var3 = (var3 * (calib->par_t3 << 4)) >> 14;
|
||||
var3 = (var3 * ((s32)calib->par_t3 << 4)) >> 14;
|
||||
data->t_fine = var2 + var3;
|
||||
calc_temp = (data->t_fine * 5 + 128) >> 8;
|
||||
|
||||
@@ -368,9 +369,9 @@ static u32 bme680_compensate_press(struct bme680_data *data,
|
||||
var1 = (data->t_fine >> 1) - 64000;
|
||||
var2 = ((((var1 >> 2) * (var1 >> 2)) >> 11) * calib->par_p6) >> 2;
|
||||
var2 = var2 + (var1 * calib->par_p5 << 1);
|
||||
var2 = (var2 >> 2) + (calib->par_p4 << 16);
|
||||
var2 = (var2 >> 2) + ((s32)calib->par_p4 << 16);
|
||||
var1 = (((((var1 >> 2) * (var1 >> 2)) >> 13) *
|
||||
(calib->par_p3 << 5)) >> 3) +
|
||||
((s32)calib->par_p3 << 5)) >> 3) +
|
||||
((calib->par_p2 * var1) >> 1);
|
||||
var1 = var1 >> 18;
|
||||
var1 = ((32768 + var1) * calib->par_p1) >> 15;
|
||||
@@ -388,7 +389,7 @@ static u32 bme680_compensate_press(struct bme680_data *data,
|
||||
var3 = ((press_comp >> 8) * (press_comp >> 8) *
|
||||
(press_comp >> 8) * calib->par_p10) >> 17;
|
||||
|
||||
press_comp += (var1 + var2 + var3 + (calib->par_p7 << 7)) >> 4;
|
||||
press_comp += (var1 + var2 + var3 + ((s32)calib->par_p7 << 7)) >> 4;
|
||||
|
||||
return press_comp;
|
||||
}
|
||||
@@ -414,7 +415,7 @@ static u32 bme680_compensate_humid(struct bme680_data *data,
|
||||
(((temp_scaled * ((temp_scaled * calib->par_h5) / 100))
|
||||
>> 6) / 100) + (1 << 14))) >> 10;
|
||||
var3 = var1 * var2;
|
||||
var4 = calib->par_h6 << 7;
|
||||
var4 = (s32)calib->par_h6 << 7;
|
||||
var4 = (var4 + ((temp_scaled * calib->par_h7) / 100)) >> 4;
|
||||
var5 = ((var3 >> 14) * (var3 >> 14)) >> 10;
|
||||
var6 = (var4 * var5) >> 1;
|
||||
@@ -532,6 +533,43 @@ static u8 bme680_oversampling_to_reg(u8 val)
|
||||
return ilog2(val) + 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Taken from Bosch BME680 API:
|
||||
* https://github.com/boschsensortec/BME68x_SensorAPI/blob/v4.4.8/bme68x.c#L490
|
||||
*/
|
||||
static int bme680_wait_for_eoc(struct bme680_data *data)
|
||||
{
|
||||
struct device *dev = regmap_get_device(data->regmap);
|
||||
unsigned int check;
|
||||
int ret;
|
||||
/*
|
||||
* (Sum of oversampling ratios * time per oversampling) +
|
||||
* TPH measurement + gas measurement + wait transition from forced mode
|
||||
* + heater duration
|
||||
*/
|
||||
int wait_eoc_us = ((data->oversampling_temp + data->oversampling_press +
|
||||
data->oversampling_humid) * 1936) + (477 * 4) +
|
||||
(477 * 5) + 1000 + (data->heater_dur * 1000);
|
||||
|
||||
usleep_range(wait_eoc_us, wait_eoc_us + 100);
|
||||
|
||||
ret = regmap_read(data->regmap, BME680_REG_MEAS_STAT_0, &check);
|
||||
if (ret) {
|
||||
dev_err(dev, "failed to read measurement status register.\n");
|
||||
return ret;
|
||||
}
|
||||
if (check & BME680_MEAS_BIT) {
|
||||
dev_err(dev, "Device measurement cycle incomplete.\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
if (!(check & BME680_NEW_DATA_BIT)) {
|
||||
dev_err(dev, "No new data available from the device.\n");
|
||||
return -ENODATA;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int bme680_chip_config(struct bme680_data *data)
|
||||
{
|
||||
struct device *dev = regmap_get_device(data->regmap);
|
||||
@@ -622,6 +660,10 @@ static int bme680_read_temp(struct bme680_data *data, int *val)
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = bme680_wait_for_eoc(data);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = regmap_bulk_read(data->regmap, BME680_REG_TEMP_MSB,
|
||||
&tmp, 3);
|
||||
if (ret < 0) {
|
||||
@@ -678,7 +720,7 @@ static int bme680_read_press(struct bme680_data *data,
|
||||
}
|
||||
|
||||
*val = bme680_compensate_press(data, adc_press);
|
||||
*val2 = 100;
|
||||
*val2 = 1000;
|
||||
return IIO_VAL_FRACTIONAL;
|
||||
}
|
||||
|
||||
@@ -738,6 +780,10 @@ static int bme680_read_gas(struct bme680_data *data,
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = bme680_wait_for_eoc(data);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = regmap_read(data->regmap, BME680_REG_MEAS_STAT_0, &check);
|
||||
if (check & BME680_GAS_MEAS_BIT) {
|
||||
dev_err(dev, "gas measurement incomplete\n");
|
||||
|
||||
@@ -37,22 +37,6 @@ int rdma_restrack_init(struct ib_device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const char *type2str(enum rdma_restrack_type type)
|
||||
{
|
||||
static const char * const names[RDMA_RESTRACK_MAX] = {
|
||||
[RDMA_RESTRACK_PD] = "PD",
|
||||
[RDMA_RESTRACK_CQ] = "CQ",
|
||||
[RDMA_RESTRACK_QP] = "QP",
|
||||
[RDMA_RESTRACK_CM_ID] = "CM_ID",
|
||||
[RDMA_RESTRACK_MR] = "MR",
|
||||
[RDMA_RESTRACK_CTX] = "CTX",
|
||||
[RDMA_RESTRACK_COUNTER] = "COUNTER",
|
||||
[RDMA_RESTRACK_SRQ] = "SRQ",
|
||||
};
|
||||
|
||||
return names[type];
|
||||
};
|
||||
|
||||
/**
|
||||
* rdma_restrack_clean() - clean resource tracking
|
||||
* @dev: IB device
|
||||
@@ -60,47 +44,14 @@ static const char *type2str(enum rdma_restrack_type type)
|
||||
void rdma_restrack_clean(struct ib_device *dev)
|
||||
{
|
||||
struct rdma_restrack_root *rt = dev->res;
|
||||
struct rdma_restrack_entry *e;
|
||||
char buf[TASK_COMM_LEN];
|
||||
bool found = false;
|
||||
const char *owner;
|
||||
int i;
|
||||
|
||||
for (i = 0 ; i < RDMA_RESTRACK_MAX; i++) {
|
||||
struct xarray *xa = &dev->res[i].xa;
|
||||
|
||||
if (!xa_empty(xa)) {
|
||||
unsigned long index;
|
||||
|
||||
if (!found) {
|
||||
pr_err("restrack: %s", CUT_HERE);
|
||||
dev_err(&dev->dev, "BUG: RESTRACK detected leak of resources\n");
|
||||
}
|
||||
xa_for_each(xa, index, e) {
|
||||
if (rdma_is_kernel_res(e)) {
|
||||
owner = e->kern_name;
|
||||
} else {
|
||||
/*
|
||||
* There is no need to call get_task_struct here,
|
||||
* because we can be here only if there are more
|
||||
* get_task_struct() call than put_task_struct().
|
||||
*/
|
||||
get_task_comm(buf, e->task);
|
||||
owner = buf;
|
||||
}
|
||||
|
||||
pr_err("restrack: %s %s object allocated by %s is not freed\n",
|
||||
rdma_is_kernel_res(e) ? "Kernel" :
|
||||
"User",
|
||||
type2str(e->type), owner);
|
||||
}
|
||||
found = true;
|
||||
}
|
||||
WARN_ON(!xa_empty(xa));
|
||||
xa_destroy(xa);
|
||||
}
|
||||
if (found)
|
||||
pr_err("restrack: %s", CUT_HERE);
|
||||
|
||||
kfree(rt);
|
||||
}
|
||||
|
||||
|
||||
@@ -261,8 +261,8 @@ static int ili251x_read_touch_data(struct i2c_client *client, u8 *data)
|
||||
if (!error && data[0] == 2) {
|
||||
error = i2c_master_recv(client, data + ILI251X_DATA_SIZE1,
|
||||
ILI251X_DATA_SIZE2);
|
||||
if (error >= 0 && error != ILI251X_DATA_SIZE2)
|
||||
error = -EIO;
|
||||
if (error >= 0)
|
||||
error = error == ILI251X_DATA_SIZE2 ? 0 : -EIO;
|
||||
}
|
||||
|
||||
return error;
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
|
||||
#define LIOINTC_INTC_CHIP_START 0x20
|
||||
|
||||
#define LIOINTC_REG_INTC_STATUS (LIOINTC_INTC_CHIP_START + 0x20)
|
||||
#define LIOINTC_REG_INTC_STATUS(core) (LIOINTC_INTC_CHIP_START + 0x20 + (core) * 8)
|
||||
#define LIOINTC_REG_INTC_EN_STATUS (LIOINTC_INTC_CHIP_START + 0x04)
|
||||
#define LIOINTC_REG_INTC_ENABLE (LIOINTC_INTC_CHIP_START + 0x08)
|
||||
#define LIOINTC_REG_INTC_DISABLE (LIOINTC_INTC_CHIP_START + 0x0c)
|
||||
@@ -196,7 +196,7 @@ static int liointc_init(phys_addr_t addr, unsigned long size, int revision,
|
||||
goto out_free_priv;
|
||||
|
||||
for (i = 0; i < LIOINTC_NUM_CORES; i++)
|
||||
priv->core_isr[i] = base + LIOINTC_REG_INTC_STATUS;
|
||||
priv->core_isr[i] = base + LIOINTC_REG_INTC_STATUS(i);
|
||||
|
||||
for (i = 0; i < LIOINTC_NUM_PARENT; i++)
|
||||
priv->handler[i].parent_int_map = parent_int_map[i];
|
||||
|
||||
@@ -964,7 +964,7 @@ int dvb_usercopy(struct file *file,
|
||||
int (*func)(struct file *file,
|
||||
unsigned int cmd, void *arg))
|
||||
{
|
||||
char sbuf[128];
|
||||
char sbuf[128] = {};
|
||||
void *mbuf = NULL;
|
||||
void *parg = NULL;
|
||||
int err = -EINVAL;
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#define BRCMSTB_MATCH_FLAGS_NO_64BIT BIT(0)
|
||||
#define BRCMSTB_MATCH_FLAGS_BROKEN_TIMEOUT BIT(1)
|
||||
#define BRCMSTB_MATCH_FLAGS_HAS_CLOCK_GATE BIT(2)
|
||||
#define BRCMSTB_MATCH_FLAGS_USE_CARD_BUSY BIT(4)
|
||||
|
||||
#define BRCMSTB_PRIV_FLAGS_HAS_CQE BIT(0)
|
||||
#define BRCMSTB_PRIV_FLAGS_GATE_CLOCK BIT(1)
|
||||
@@ -335,6 +336,9 @@ static int sdhci_brcmstb_probe(struct platform_device *pdev)
|
||||
if (match_priv->flags & BRCMSTB_MATCH_FLAGS_BROKEN_TIMEOUT)
|
||||
host->quirks |= SDHCI_QUIRK_BROKEN_TIMEOUT_VAL;
|
||||
|
||||
if (!(match_priv->flags & BRCMSTB_MATCH_FLAGS_USE_CARD_BUSY))
|
||||
host->mmc_host_ops.card_busy = NULL;
|
||||
|
||||
/* Change the base clock frequency if the DT property exists */
|
||||
if (device_property_read_u32(&pdev->dev, "clock-frequency",
|
||||
&priv->base_freq_hz) != 0)
|
||||
|
||||
@@ -1330,7 +1330,7 @@ static int jmicron_pmos(struct sdhci_pci_chip *chip, int on)
|
||||
|
||||
ret = pci_read_config_byte(chip->pdev, 0xAE, &scratch);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto fail;
|
||||
|
||||
/*
|
||||
* Turn PMOS on [bit 0], set over current detection to 2.4 V
|
||||
@@ -1341,7 +1341,10 @@ static int jmicron_pmos(struct sdhci_pci_chip *chip, int on)
|
||||
else
|
||||
scratch &= ~0x47;
|
||||
|
||||
return pci_write_config_byte(chip->pdev, 0xAE, scratch);
|
||||
ret = pci_write_config_byte(chip->pdev, 0xAE, scratch);
|
||||
|
||||
fail:
|
||||
return pcibios_err_to_errno(ret);
|
||||
}
|
||||
|
||||
static int jmicron_probe(struct sdhci_pci_chip *chip)
|
||||
@@ -2201,7 +2204,7 @@ static int sdhci_pci_probe(struct pci_dev *pdev,
|
||||
|
||||
ret = pci_read_config_byte(pdev, PCI_SLOT_INFO, &slots);
|
||||
if (ret)
|
||||
return ret;
|
||||
return pcibios_err_to_errno(ret);
|
||||
|
||||
slots = PCI_SLOT_INFO_SLOTS(slots) + 1;
|
||||
dev_dbg(&pdev->dev, "found %d slot(s)\n", slots);
|
||||
@@ -2210,7 +2213,7 @@ static int sdhci_pci_probe(struct pci_dev *pdev,
|
||||
|
||||
ret = pci_read_config_byte(pdev, PCI_SLOT_INFO, &first_bar);
|
||||
if (ret)
|
||||
return ret;
|
||||
return pcibios_err_to_errno(ret);
|
||||
|
||||
first_bar &= PCI_SLOT_INFO_FIRST_BAR_MASK;
|
||||
|
||||
|
||||
@@ -2539,26 +2539,29 @@ EXPORT_SYMBOL_GPL(sdhci_get_cd_nogpio);
|
||||
|
||||
static int sdhci_check_ro(struct sdhci_host *host)
|
||||
{
|
||||
unsigned long flags;
|
||||
bool allow_invert = false;
|
||||
int is_readonly;
|
||||
|
||||
spin_lock_irqsave(&host->lock, flags);
|
||||
|
||||
if (host->flags & SDHCI_DEVICE_DEAD)
|
||||
if (host->flags & SDHCI_DEVICE_DEAD) {
|
||||
is_readonly = 0;
|
||||
else if (host->ops->get_ro)
|
||||
} else if (host->ops->get_ro) {
|
||||
is_readonly = host->ops->get_ro(host);
|
||||
else if (mmc_can_gpio_ro(host->mmc))
|
||||
} else if (mmc_can_gpio_ro(host->mmc)) {
|
||||
is_readonly = mmc_gpio_get_ro(host->mmc);
|
||||
else
|
||||
/* Do not invert twice */
|
||||
allow_invert = !(host->mmc->caps2 & MMC_CAP2_RO_ACTIVE_HIGH);
|
||||
} else {
|
||||
is_readonly = !(sdhci_readl(host, SDHCI_PRESENT_STATE)
|
||||
& SDHCI_WRITE_PROTECT);
|
||||
allow_invert = true;
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&host->lock, flags);
|
||||
if (is_readonly >= 0 &&
|
||||
allow_invert &&
|
||||
(host->quirks & SDHCI_QUIRK_INVERTED_WRITE_PROTECT))
|
||||
is_readonly = !is_readonly;
|
||||
|
||||
/* This quirk needs to be replaced by a callback-function later */
|
||||
return host->quirks & SDHCI_QUIRK_INVERTED_WRITE_PROTECT ?
|
||||
!is_readonly : is_readonly;
|
||||
return is_readonly;
|
||||
}
|
||||
|
||||
#define SAMPLE_COUNT 5
|
||||
|
||||
@@ -102,7 +102,7 @@ nogood:
|
||||
offset -= master->erasesize;
|
||||
}
|
||||
} else {
|
||||
offset = directory * master->erasesize;
|
||||
offset = (unsigned long) directory * master->erasesize;
|
||||
while (mtd_block_isbad(master, offset)) {
|
||||
offset += master->erasesize;
|
||||
if (offset == master->size)
|
||||
|
||||
@@ -1618,11 +1618,20 @@ static int mcp251xfd_open(struct net_device *ndev)
|
||||
clear_bit(MCP251XFD_FLAGS_DOWN, priv->flags);
|
||||
can_rx_offload_enable(&priv->offload);
|
||||
|
||||
priv->wq = alloc_ordered_workqueue("%s-mcp251xfd_wq",
|
||||
WQ_FREEZABLE | WQ_MEM_RECLAIM,
|
||||
dev_name(&spi->dev));
|
||||
if (!priv->wq) {
|
||||
err = -ENOMEM;
|
||||
goto out_can_rx_offload_disable;
|
||||
}
|
||||
INIT_WORK(&priv->tx_work, mcp251xfd_tx_obj_write_sync);
|
||||
|
||||
err = request_threaded_irq(spi->irq, NULL, mcp251xfd_irq,
|
||||
IRQF_SHARED | IRQF_ONESHOT,
|
||||
dev_name(&spi->dev), priv);
|
||||
if (err)
|
||||
goto out_can_rx_offload_disable;
|
||||
goto out_destroy_workqueue;
|
||||
|
||||
err = mcp251xfd_chip_interrupts_enable(priv);
|
||||
if (err)
|
||||
@@ -1634,6 +1643,8 @@ static int mcp251xfd_open(struct net_device *ndev)
|
||||
|
||||
out_free_irq:
|
||||
free_irq(spi->irq, priv);
|
||||
out_destroy_workqueue:
|
||||
destroy_workqueue(priv->wq);
|
||||
out_can_rx_offload_disable:
|
||||
can_rx_offload_disable(&priv->offload);
|
||||
set_bit(MCP251XFD_FLAGS_DOWN, priv->flags);
|
||||
@@ -1661,6 +1672,7 @@ static int mcp251xfd_stop(struct net_device *ndev)
|
||||
hrtimer_cancel(&priv->tx_irq_timer);
|
||||
mcp251xfd_chip_interrupts_disable(priv);
|
||||
free_irq(ndev->irq, priv);
|
||||
destroy_workqueue(priv->wq);
|
||||
can_rx_offload_disable(&priv->offload);
|
||||
mcp251xfd_timestamp_stop(priv);
|
||||
mcp251xfd_chip_stop(priv, CAN_STATE_STOPPED);
|
||||
|
||||
@@ -131,6 +131,39 @@ mcp251xfd_tx_obj_from_skb(const struct mcp251xfd_priv *priv,
|
||||
tx_obj->xfer[0].len = len;
|
||||
}
|
||||
|
||||
static void mcp251xfd_tx_failure_drop(const struct mcp251xfd_priv *priv,
|
||||
struct mcp251xfd_tx_ring *tx_ring,
|
||||
int err)
|
||||
{
|
||||
struct net_device *ndev = priv->ndev;
|
||||
struct net_device_stats *stats = &ndev->stats;
|
||||
unsigned int frame_len = 0;
|
||||
u8 tx_head;
|
||||
|
||||
tx_ring->head--;
|
||||
stats->tx_dropped++;
|
||||
tx_head = mcp251xfd_get_tx_head(tx_ring);
|
||||
can_free_echo_skb(ndev, tx_head, &frame_len);
|
||||
netdev_completed_queue(ndev, 1, frame_len);
|
||||
netif_wake_queue(ndev);
|
||||
|
||||
if (net_ratelimit())
|
||||
netdev_err(priv->ndev, "ERROR in %s: %d\n", __func__, err);
|
||||
}
|
||||
|
||||
void mcp251xfd_tx_obj_write_sync(struct work_struct *work)
|
||||
{
|
||||
struct mcp251xfd_priv *priv = container_of(work, struct mcp251xfd_priv,
|
||||
tx_work);
|
||||
struct mcp251xfd_tx_obj *tx_obj = priv->tx_work_obj;
|
||||
struct mcp251xfd_tx_ring *tx_ring = priv->tx;
|
||||
int err;
|
||||
|
||||
err = spi_sync(priv->spi, &tx_obj->msg);
|
||||
if (err)
|
||||
mcp251xfd_tx_failure_drop(priv, tx_ring, err);
|
||||
}
|
||||
|
||||
static int mcp251xfd_tx_obj_write(const struct mcp251xfd_priv *priv,
|
||||
struct mcp251xfd_tx_obj *tx_obj)
|
||||
{
|
||||
@@ -162,6 +195,11 @@ static bool mcp251xfd_tx_busy(const struct mcp251xfd_priv *priv,
|
||||
return false;
|
||||
}
|
||||
|
||||
static bool mcp251xfd_work_busy(struct work_struct *work)
|
||||
{
|
||||
return work_busy(work);
|
||||
}
|
||||
|
||||
netdev_tx_t mcp251xfd_start_xmit(struct sk_buff *skb,
|
||||
struct net_device *ndev)
|
||||
{
|
||||
@@ -175,7 +213,8 @@ netdev_tx_t mcp251xfd_start_xmit(struct sk_buff *skb,
|
||||
if (can_dev_dropped_skb(ndev, skb))
|
||||
return NETDEV_TX_OK;
|
||||
|
||||
if (mcp251xfd_tx_busy(priv, tx_ring))
|
||||
if (mcp251xfd_tx_busy(priv, tx_ring) ||
|
||||
mcp251xfd_work_busy(&priv->tx_work))
|
||||
return NETDEV_TX_BUSY;
|
||||
|
||||
tx_obj = mcp251xfd_get_tx_obj_next(tx_ring);
|
||||
@@ -193,13 +232,13 @@ netdev_tx_t mcp251xfd_start_xmit(struct sk_buff *skb,
|
||||
netdev_sent_queue(priv->ndev, frame_len);
|
||||
|
||||
err = mcp251xfd_tx_obj_write(priv, tx_obj);
|
||||
if (err)
|
||||
goto out_err;
|
||||
|
||||
return NETDEV_TX_OK;
|
||||
|
||||
out_err:
|
||||
netdev_err(priv->ndev, "ERROR in %s: %d\n", __func__, err);
|
||||
if (err == -EBUSY) {
|
||||
netif_stop_queue(ndev);
|
||||
priv->tx_work_obj = tx_obj;
|
||||
queue_work(priv->wq, &priv->tx_work);
|
||||
} else if (err) {
|
||||
mcp251xfd_tx_failure_drop(priv, tx_ring, err);
|
||||
}
|
||||
|
||||
return NETDEV_TX_OK;
|
||||
}
|
||||
|
||||
@@ -628,6 +628,10 @@ struct mcp251xfd_priv {
|
||||
struct mcp251xfd_rx_ring *rx[MCP251XFD_FIFO_RX_NUM];
|
||||
struct mcp251xfd_tx_ring tx[MCP251XFD_FIFO_TX_NUM];
|
||||
|
||||
struct workqueue_struct *wq;
|
||||
struct work_struct tx_work;
|
||||
struct mcp251xfd_tx_obj *tx_work_obj;
|
||||
|
||||
DECLARE_BITMAP(flags, __MCP251XFD_FLAGS_SIZE__);
|
||||
|
||||
u8 rx_ring_num;
|
||||
@@ -934,6 +938,7 @@ void mcp251xfd_skb_set_timestamp(const struct mcp251xfd_priv *priv,
|
||||
void mcp251xfd_timestamp_init(struct mcp251xfd_priv *priv);
|
||||
void mcp251xfd_timestamp_stop(struct mcp251xfd_priv *priv);
|
||||
|
||||
void mcp251xfd_tx_obj_write_sync(struct work_struct *work);
|
||||
netdev_tx_t mcp251xfd_start_xmit(struct sk_buff *skb,
|
||||
struct net_device *ndev);
|
||||
|
||||
|
||||
@@ -183,10 +183,8 @@ int ksz9477_reset_switch(struct ksz_device *dev)
|
||||
SPI_AUTO_EDGE_DETECTION, 0);
|
||||
|
||||
/* default configuration */
|
||||
ksz_read8(dev, REG_SW_LUE_CTRL_1, &data8);
|
||||
data8 = SW_AGING_ENABLE | SW_LINK_AUTO_AGING |
|
||||
SW_SRC_ADDR_FILTER | SW_FLUSH_STP_TABLE | SW_FLUSH_MSTP_TABLE;
|
||||
ksz_write8(dev, REG_SW_LUE_CTRL_1, data8);
|
||||
ksz_write8(dev, REG_SW_LUE_CTRL_1,
|
||||
SW_AGING_ENABLE | SW_LINK_AUTO_AGING | SW_SRC_ADDR_FILTER);
|
||||
|
||||
/* disable interrupts */
|
||||
ksz_write32(dev, REG_SW_INT_MASK__4, SWITCH_INT_MASK);
|
||||
@@ -1152,6 +1150,10 @@ int ksz9477_setup(struct dsa_switch *ds)
|
||||
/* Enable REG_SW_MTU__2 reg by setting SW_JUMBO_PACKET */
|
||||
ksz_cfg(dev, REG_SW_MAC_CTRL_1, SW_JUMBO_PACKET, true);
|
||||
|
||||
/* Use collision based back pressure mode. */
|
||||
ksz_cfg(dev, REG_SW_MAC_CTRL_1, SW_BACK_PRESSURE,
|
||||
SW_BACK_PRESSURE_COLLISION);
|
||||
|
||||
/* Now we can configure default MTU value */
|
||||
ret = regmap_update_bits(dev->regmap[1], REG_SW_MTU__2, REG_SW_MTU_MASK,
|
||||
VLAN_ETH_FRAME_LEN + ETH_FCS_LEN);
|
||||
|
||||
@@ -267,6 +267,7 @@
|
||||
#define REG_SW_MAC_CTRL_1 0x0331
|
||||
|
||||
#define SW_BACK_PRESSURE BIT(5)
|
||||
#define SW_BACK_PRESSURE_COLLISION 0
|
||||
#define FAIR_FLOW_CTRL BIT(4)
|
||||
#define NO_EXC_COLLISION_DROP BIT(3)
|
||||
#define SW_JUMBO_PACKET BIT(2)
|
||||
|
||||
@@ -1790,7 +1790,7 @@ static void ksz_irq_bus_sync_unlock(struct irq_data *d)
|
||||
struct ksz_device *dev = kirq->dev;
|
||||
int ret;
|
||||
|
||||
ret = ksz_write32(dev, kirq->reg_mask, kirq->masked);
|
||||
ret = ksz_write8(dev, kirq->reg_mask, kirq->masked);
|
||||
if (ret)
|
||||
dev_err(dev->dev, "failed to change IRQ mask\n");
|
||||
|
||||
|
||||
@@ -2754,11 +2754,14 @@ static int dpaa2_eth_xdp_xmit(struct net_device *net_dev, int n,
|
||||
static int update_xps(struct dpaa2_eth_priv *priv)
|
||||
{
|
||||
struct net_device *net_dev = priv->net_dev;
|
||||
struct cpumask xps_mask;
|
||||
struct dpaa2_eth_fq *fq;
|
||||
int i, num_queues, netdev_queues;
|
||||
struct dpaa2_eth_fq *fq;
|
||||
cpumask_var_t xps_mask;
|
||||
int err = 0;
|
||||
|
||||
if (!alloc_cpumask_var(&xps_mask, GFP_KERNEL))
|
||||
return -ENOMEM;
|
||||
|
||||
num_queues = dpaa2_eth_queue_count(priv);
|
||||
netdev_queues = (net_dev->num_tc ? : 1) * num_queues;
|
||||
|
||||
@@ -2768,16 +2771,17 @@ static int update_xps(struct dpaa2_eth_priv *priv)
|
||||
for (i = 0; i < netdev_queues; i++) {
|
||||
fq = &priv->fq[i % num_queues];
|
||||
|
||||
cpumask_clear(&xps_mask);
|
||||
cpumask_set_cpu(fq->target_cpu, &xps_mask);
|
||||
cpumask_clear(xps_mask);
|
||||
cpumask_set_cpu(fq->target_cpu, xps_mask);
|
||||
|
||||
err = netif_set_xps_queue(net_dev, &xps_mask, i);
|
||||
err = netif_set_xps_queue(net_dev, xps_mask, i);
|
||||
if (err) {
|
||||
netdev_warn_once(net_dev, "Error setting XPS queue\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
free_cpumask_var(xps_mask);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
@@ -3859,6 +3859,12 @@ static void release_sub_crqs(struct ibmvnic_adapter *adapter, bool do_h_free)
|
||||
adapter->num_active_tx_scrqs = 0;
|
||||
}
|
||||
|
||||
/* Clean any remaining outstanding SKBs
|
||||
* we freed the irq so we won't be hearing
|
||||
* from them
|
||||
*/
|
||||
clean_tx_pools(adapter);
|
||||
|
||||
if (adapter->rx_scrq) {
|
||||
for (i = 0; i < adapter->num_active_rx_scrqs; i++) {
|
||||
if (!adapter->rx_scrq[i])
|
||||
|
||||
@@ -1607,8 +1607,8 @@ static void mlxsw_sp_sb_sr_occ_query_cb(struct mlxsw_core *mlxsw_core,
|
||||
int mlxsw_sp_sb_occ_snapshot(struct mlxsw_core *mlxsw_core,
|
||||
unsigned int sb_index)
|
||||
{
|
||||
u16 local_port, local_port_1, first_local_port, last_local_port;
|
||||
struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core);
|
||||
u16 local_port, local_port_1, last_local_port;
|
||||
struct mlxsw_sp_sb_sr_occ_query_cb_ctx cb_ctx;
|
||||
u8 masked_count, current_page = 0;
|
||||
unsigned long cb_priv = 0;
|
||||
@@ -1628,6 +1628,7 @@ next_batch:
|
||||
masked_count = 0;
|
||||
mlxsw_reg_sbsr_pack(sbsr_pl, false);
|
||||
mlxsw_reg_sbsr_port_page_set(sbsr_pl, current_page);
|
||||
first_local_port = current_page * MLXSW_REG_SBSR_NUM_PORTS_IN_PAGE;
|
||||
last_local_port = current_page * MLXSW_REG_SBSR_NUM_PORTS_IN_PAGE +
|
||||
MLXSW_REG_SBSR_NUM_PORTS_IN_PAGE - 1;
|
||||
|
||||
@@ -1645,9 +1646,12 @@ next_batch:
|
||||
if (local_port != MLXSW_PORT_CPU_PORT) {
|
||||
/* Ingress quotas are not supported for the CPU port */
|
||||
mlxsw_reg_sbsr_ingress_port_mask_set(sbsr_pl,
|
||||
local_port, 1);
|
||||
local_port - first_local_port,
|
||||
1);
|
||||
}
|
||||
mlxsw_reg_sbsr_egress_port_mask_set(sbsr_pl, local_port, 1);
|
||||
mlxsw_reg_sbsr_egress_port_mask_set(sbsr_pl,
|
||||
local_port - first_local_port,
|
||||
1);
|
||||
for (i = 0; i < mlxsw_sp->sb_vals->pool_count; i++) {
|
||||
err = mlxsw_sp_sb_pm_occ_query(mlxsw_sp, local_port, i,
|
||||
&bulk_list);
|
||||
@@ -1684,7 +1688,7 @@ int mlxsw_sp_sb_occ_max_clear(struct mlxsw_core *mlxsw_core,
|
||||
unsigned int sb_index)
|
||||
{
|
||||
struct mlxsw_sp *mlxsw_sp = mlxsw_core_driver_priv(mlxsw_core);
|
||||
u16 local_port, last_local_port;
|
||||
u16 local_port, first_local_port, last_local_port;
|
||||
LIST_HEAD(bulk_list);
|
||||
unsigned int masked_count;
|
||||
u8 current_page = 0;
|
||||
@@ -1702,6 +1706,7 @@ next_batch:
|
||||
masked_count = 0;
|
||||
mlxsw_reg_sbsr_pack(sbsr_pl, true);
|
||||
mlxsw_reg_sbsr_port_page_set(sbsr_pl, current_page);
|
||||
first_local_port = current_page * MLXSW_REG_SBSR_NUM_PORTS_IN_PAGE;
|
||||
last_local_port = current_page * MLXSW_REG_SBSR_NUM_PORTS_IN_PAGE +
|
||||
MLXSW_REG_SBSR_NUM_PORTS_IN_PAGE - 1;
|
||||
|
||||
@@ -1719,9 +1724,12 @@ next_batch:
|
||||
if (local_port != MLXSW_PORT_CPU_PORT) {
|
||||
/* Ingress quotas are not supported for the CPU port */
|
||||
mlxsw_reg_sbsr_ingress_port_mask_set(sbsr_pl,
|
||||
local_port, 1);
|
||||
local_port - first_local_port,
|
||||
1);
|
||||
}
|
||||
mlxsw_reg_sbsr_egress_port_mask_set(sbsr_pl, local_port, 1);
|
||||
mlxsw_reg_sbsr_egress_port_mask_set(sbsr_pl,
|
||||
local_port - first_local_port,
|
||||
1);
|
||||
for (i = 0; i < mlxsw_sp->sb_vals->pool_count; i++) {
|
||||
err = mlxsw_sp_sb_pm_occ_clear(mlxsw_sp, local_port, i,
|
||||
&bulk_list);
|
||||
|
||||
@@ -3405,6 +3405,7 @@ static struct mdio_device_id __maybe_unused micrel_tbl[] = {
|
||||
{ PHY_ID_KSZ8081, MICREL_PHY_ID_MASK },
|
||||
{ PHY_ID_KSZ8873MLL, MICREL_PHY_ID_MASK },
|
||||
{ PHY_ID_KSZ886X, MICREL_PHY_ID_MASK },
|
||||
{ PHY_ID_KSZ9477, MICREL_PHY_ID_MASK },
|
||||
{ PHY_ID_LAN8814, MICREL_PHY_ID_MASK },
|
||||
{ PHY_ID_LAN8804, MICREL_PHY_ID_MASK },
|
||||
{ }
|
||||
|
||||
@@ -326,7 +326,8 @@ static void ax88179_status(struct usbnet *dev, struct urb *urb)
|
||||
|
||||
if (netif_carrier_ok(dev->net) != link) {
|
||||
usbnet_link_change(dev, link, 1);
|
||||
netdev_info(dev->net, "ax88179 - Link status is: %d\n", link);
|
||||
if (!link)
|
||||
netdev_info(dev->net, "ax88179 - Link status is: 0\n");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1540,6 +1541,7 @@ static int ax88179_link_reset(struct usbnet *dev)
|
||||
GMII_PHY_PHYSR, 2, &tmp16);
|
||||
|
||||
if (!(tmp16 & GMII_PHY_PHYSR_LINK)) {
|
||||
netdev_info(dev->net, "ax88179 - Link status is: 0\n");
|
||||
return 0;
|
||||
} else if (GMII_PHY_PHYSR_GIGA == (tmp16 & GMII_PHY_PHYSR_SMASK)) {
|
||||
mode |= AX_MEDIUM_GIGAMODE | AX_MEDIUM_EN_125MHZ;
|
||||
@@ -1577,6 +1579,8 @@ static int ax88179_link_reset(struct usbnet *dev)
|
||||
|
||||
netif_carrier_on(dev->net);
|
||||
|
||||
netdev_info(dev->net, "ax88179 - Link status is: 1\n");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -1092,8 +1092,8 @@ static struct pinctrl *create_pinctrl(struct device *dev,
|
||||
* an -EPROBE_DEFER later, as that is the worst case.
|
||||
*/
|
||||
if (ret == -EPROBE_DEFER) {
|
||||
pinctrl_free(p, false);
|
||||
mutex_unlock(&pinctrl_maps_mutex);
|
||||
pinctrl_free(p, false);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -635,23 +635,68 @@ static struct rockchip_mux_recalced_data rk3308_mux_recalced_data[] = {
|
||||
|
||||
static struct rockchip_mux_recalced_data rk3328_mux_recalced_data[] = {
|
||||
{
|
||||
.num = 2,
|
||||
.pin = 12,
|
||||
.reg = 0x24,
|
||||
.bit = 8,
|
||||
.mask = 0x3
|
||||
}, {
|
||||
/* gpio2_b7_sel */
|
||||
.num = 2,
|
||||
.pin = 15,
|
||||
.reg = 0x28,
|
||||
.bit = 0,
|
||||
.mask = 0x7
|
||||
}, {
|
||||
/* gpio2_c7_sel */
|
||||
.num = 2,
|
||||
.pin = 23,
|
||||
.reg = 0x30,
|
||||
.bit = 14,
|
||||
.mask = 0x3
|
||||
}, {
|
||||
/* gpio3_b1_sel */
|
||||
.num = 3,
|
||||
.pin = 9,
|
||||
.reg = 0x44,
|
||||
.bit = 2,
|
||||
.mask = 0x3
|
||||
}, {
|
||||
/* gpio3_b2_sel */
|
||||
.num = 3,
|
||||
.pin = 10,
|
||||
.reg = 0x44,
|
||||
.bit = 4,
|
||||
.mask = 0x3
|
||||
}, {
|
||||
/* gpio3_b3_sel */
|
||||
.num = 3,
|
||||
.pin = 11,
|
||||
.reg = 0x44,
|
||||
.bit = 6,
|
||||
.mask = 0x3
|
||||
}, {
|
||||
/* gpio3_b4_sel */
|
||||
.num = 3,
|
||||
.pin = 12,
|
||||
.reg = 0x44,
|
||||
.bit = 8,
|
||||
.mask = 0x3
|
||||
}, {
|
||||
/* gpio3_b5_sel */
|
||||
.num = 3,
|
||||
.pin = 13,
|
||||
.reg = 0x44,
|
||||
.bit = 10,
|
||||
.mask = 0x3
|
||||
}, {
|
||||
/* gpio3_b6_sel */
|
||||
.num = 3,
|
||||
.pin = 14,
|
||||
.reg = 0x44,
|
||||
.bit = 12,
|
||||
.mask = 0x3
|
||||
}, {
|
||||
/* gpio3_b7_sel */
|
||||
.num = 3,
|
||||
.pin = 15,
|
||||
.reg = 0x44,
|
||||
.bit = 14,
|
||||
.mask = 0x3
|
||||
},
|
||||
};
|
||||
|
||||
@@ -2434,6 +2479,7 @@ static int rockchip_get_pull(struct rockchip_pin_bank *bank, int pin_num)
|
||||
case RK3188:
|
||||
case RK3288:
|
||||
case RK3308:
|
||||
case RK3328:
|
||||
case RK3368:
|
||||
case RK3399:
|
||||
case RK3568:
|
||||
@@ -2492,6 +2538,7 @@ static int rockchip_set_pull(struct rockchip_pin_bank *bank,
|
||||
case RK3188:
|
||||
case RK3288:
|
||||
case RK3308:
|
||||
case RK3328:
|
||||
case RK3368:
|
||||
case RK3399:
|
||||
case RK3568:
|
||||
@@ -2705,8 +2752,10 @@ static int rockchip_pmx_set(struct pinctrl_dev *pctldev, unsigned selector,
|
||||
|
||||
if (ret) {
|
||||
/* revert the already done pin settings */
|
||||
for (cnt--; cnt >= 0; cnt--)
|
||||
for (cnt--; cnt >= 0; cnt--) {
|
||||
bank = pin_to_bank(info, pins[cnt]);
|
||||
rockchip_set_mux(bank, pins[cnt] - bank->pin_base, 0);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -2754,6 +2803,7 @@ static bool rockchip_pinconf_pull_valid(struct rockchip_pin_ctrl *ctrl,
|
||||
case RK3188:
|
||||
case RK3288:
|
||||
case RK3308:
|
||||
case RK3328:
|
||||
case RK3368:
|
||||
case RK3399:
|
||||
case RK3568:
|
||||
@@ -3766,7 +3816,7 @@ static struct rockchip_pin_bank rk3328_pin_banks[] = {
|
||||
PIN_BANK_IOMUX_FLAGS(0, 32, "gpio0", 0, 0, 0, 0),
|
||||
PIN_BANK_IOMUX_FLAGS(1, 32, "gpio1", 0, 0, 0, 0),
|
||||
PIN_BANK_IOMUX_FLAGS(2, 32, "gpio2", 0,
|
||||
IOMUX_WIDTH_3BIT,
|
||||
0,
|
||||
IOMUX_WIDTH_3BIT,
|
||||
0),
|
||||
PIN_BANK_IOMUX_FLAGS(3, 32, "gpio3",
|
||||
@@ -3780,7 +3830,7 @@ static struct rockchip_pin_ctrl rk3328_pin_ctrl = {
|
||||
.pin_banks = rk3328_pin_banks,
|
||||
.nr_banks = ARRAY_SIZE(rk3328_pin_banks),
|
||||
.label = "RK3328-GPIO",
|
||||
.type = RK3288,
|
||||
.type = RK3328,
|
||||
.grf_mux_offset = 0x0,
|
||||
.iomux_recalced = rk3328_mux_recalced_data,
|
||||
.niomux_recalced = ARRAY_SIZE(rk3328_mux_recalced_data),
|
||||
|
||||
@@ -193,6 +193,7 @@ enum rockchip_pinctrl_type {
|
||||
RK3188,
|
||||
RK3288,
|
||||
RK3308,
|
||||
RK3328,
|
||||
RK3368,
|
||||
RK3399,
|
||||
RK3568,
|
||||
|
||||
@@ -1204,7 +1204,6 @@ static const struct of_device_id pmic_gpio_of_match[] = {
|
||||
{ .compatible = "qcom,pm7250b-gpio", .data = (void *) 12 },
|
||||
{ .compatible = "qcom,pm7325-gpio", .data = (void *) 10 },
|
||||
{ .compatible = "qcom,pm8005-gpio", .data = (void *) 4 },
|
||||
{ .compatible = "qcom,pm8008-gpio", .data = (void *) 2 },
|
||||
{ .compatible = "qcom,pm8019-gpio", .data = (void *) 6 },
|
||||
/* pm8150 has 10 GPIOs with holes on 2, 5, 7 and 8 */
|
||||
{ .compatible = "qcom,pm8150-gpio", .data = (void *) 10 },
|
||||
|
||||
@@ -340,6 +340,9 @@ static int stm32_pwm_config(struct stm32_pwm *priv, int ch,
|
||||
|
||||
prd = div;
|
||||
|
||||
if (!prd)
|
||||
return -EINVAL;
|
||||
|
||||
if (prescaler > MAX_TIM_PSC)
|
||||
return -EINVAL;
|
||||
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
#include <linux/irq.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/omap-mailbox.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/remoteproc.h>
|
||||
#include <linux/suspend.h>
|
||||
@@ -314,7 +313,6 @@ static irqreturn_t wkup_m3_txev_handler(int irq, void *ipc_data)
|
||||
static int wkup_m3_ping(struct wkup_m3_ipc *m3_ipc)
|
||||
{
|
||||
struct device *dev = m3_ipc->dev;
|
||||
mbox_msg_t dummy_msg = 0;
|
||||
int ret;
|
||||
|
||||
if (!m3_ipc->mbox) {
|
||||
@@ -330,7 +328,7 @@ static int wkup_m3_ping(struct wkup_m3_ipc *m3_ipc)
|
||||
* the RX callback to avoid multiple interrupts being received
|
||||
* by the CM3.
|
||||
*/
|
||||
ret = mbox_send_message(m3_ipc->mbox, &dummy_msg);
|
||||
ret = mbox_send_message(m3_ipc->mbox, NULL);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "%s: mbox_send_message() failed: %d\n",
|
||||
__func__, ret);
|
||||
@@ -352,7 +350,6 @@ static int wkup_m3_ping(struct wkup_m3_ipc *m3_ipc)
|
||||
static int wkup_m3_ping_noirq(struct wkup_m3_ipc *m3_ipc)
|
||||
{
|
||||
struct device *dev = m3_ipc->dev;
|
||||
mbox_msg_t dummy_msg = 0;
|
||||
int ret;
|
||||
|
||||
if (!m3_ipc->mbox) {
|
||||
@@ -361,7 +358,7 @@ static int wkup_m3_ping_noirq(struct wkup_m3_ipc *m3_ipc)
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
ret = mbox_send_message(m3_ipc->mbox, &dummy_msg);
|
||||
ret = mbox_send_message(m3_ipc->mbox, NULL);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "%s: mbox_send_message() failed: %d\n",
|
||||
__func__, ret);
|
||||
|
||||
@@ -159,6 +159,10 @@ static u32 uart_read(struct omap8250_priv *priv, u32 reg)
|
||||
return readl(priv->membase + (reg << OMAP_UART_REGSHIFT));
|
||||
}
|
||||
|
||||
/* Timeout low and High */
|
||||
#define UART_OMAP_TO_L 0x26
|
||||
#define UART_OMAP_TO_H 0x27
|
||||
|
||||
/*
|
||||
* Called on runtime PM resume path from omap8250_restore_regs(), and
|
||||
* omap8250_set_mctrl().
|
||||
@@ -628,13 +632,25 @@ static irqreturn_t omap8250_irq(int irq, void *dev_id)
|
||||
|
||||
/*
|
||||
* On K3 SoCs, it is observed that RX TIMEOUT is signalled after
|
||||
* FIFO has been drained, in which case a dummy read of RX FIFO
|
||||
* is required to clear RX TIMEOUT condition.
|
||||
* FIFO has been drained or erroneously.
|
||||
* So apply solution of Errata i2310 as mentioned in
|
||||
* https://www.ti.com/lit/pdf/sprz536
|
||||
*/
|
||||
if (priv->habit & UART_RX_TIMEOUT_QUIRK &&
|
||||
(iir & UART_IIR_RX_TIMEOUT) == UART_IIR_RX_TIMEOUT &&
|
||||
serial_port_in(port, UART_OMAP_RX_LVL) == 0) {
|
||||
serial_port_in(port, UART_RX);
|
||||
unsigned char efr2, timeout_h, timeout_l;
|
||||
|
||||
efr2 = serial_in(up, UART_OMAP_EFR2);
|
||||
timeout_h = serial_in(up, UART_OMAP_TO_H);
|
||||
timeout_l = serial_in(up, UART_OMAP_TO_L);
|
||||
serial_out(up, UART_OMAP_TO_H, 0xFF);
|
||||
serial_out(up, UART_OMAP_TO_L, 0xFF);
|
||||
serial_out(up, UART_OMAP_EFR2, UART_OMAP_EFR2_TIMEOUT_BEHAVE);
|
||||
serial_in(up, UART_IIR);
|
||||
serial_out(up, UART_OMAP_EFR2, efr2);
|
||||
serial_out(up, UART_OMAP_TO_H, timeout_h);
|
||||
serial_out(up, UART_OMAP_TO_L, timeout_l);
|
||||
}
|
||||
|
||||
/* Stop processing interrupts on input overrun */
|
||||
|
||||
@@ -120,6 +120,7 @@
|
||||
#define UCR4_OREN (1<<1) /* Receiver overrun interrupt enable */
|
||||
#define UCR4_DREN (1<<0) /* Recv data ready interrupt enable */
|
||||
#define UFCR_RXTL_SHF 0 /* Receiver trigger level shift */
|
||||
#define UFCR_RXTL_MASK 0x3F /* Receiver trigger 6 bits wide */
|
||||
#define UFCR_DCEDTE (1<<6) /* DCE/DTE mode select */
|
||||
#define UFCR_RFDIV (7<<7) /* Reference freq divider mask */
|
||||
#define UFCR_RFDIV_REG(x) (((x) < 7 ? 6 - (x) : 6) << 7)
|
||||
@@ -1959,7 +1960,7 @@ static int imx_uart_rs485_config(struct uart_port *port, struct ktermios *termio
|
||||
struct serial_rs485 *rs485conf)
|
||||
{
|
||||
struct imx_port *sport = (struct imx_port *)port;
|
||||
u32 ucr2;
|
||||
u32 ucr2, ufcr;
|
||||
|
||||
if (rs485conf->flags & SER_RS485_ENABLED) {
|
||||
/* Enable receiver if low-active RTS signal is requested */
|
||||
@@ -1978,8 +1979,13 @@ static int imx_uart_rs485_config(struct uart_port *port, struct ktermios *termio
|
||||
|
||||
/* Make sure Rx is enabled in case Tx is active with Rx disabled */
|
||||
if (!(rs485conf->flags & SER_RS485_ENABLED) ||
|
||||
rs485conf->flags & SER_RS485_RX_DURING_TX)
|
||||
rs485conf->flags & SER_RS485_RX_DURING_TX) {
|
||||
/* If the receiver trigger is 0, set it to a default value */
|
||||
ufcr = imx_uart_readl(sport, UFCR);
|
||||
if ((ufcr & UFCR_RXTL_MASK) == 0)
|
||||
imx_uart_setup_ufcr(sport, TXTL_DEFAULT, RXTL_DEFAULT);
|
||||
imx_uart_start_rx(port);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -480,7 +480,7 @@ static const struct uart_ops mcf_uart_ops = {
|
||||
.verify_port = mcf_verify_port,
|
||||
};
|
||||
|
||||
static struct mcf_uart mcf_ports[4];
|
||||
static struct mcf_uart mcf_ports[10];
|
||||
|
||||
#define MCF_MAXPORTS ARRAY_SIZE(mcf_ports)
|
||||
|
||||
|
||||
@@ -1131,6 +1131,7 @@ static int cxacru_bind(struct usbatm_data *usbatm_instance,
|
||||
struct cxacru_data *instance;
|
||||
struct usb_device *usb_dev = interface_to_usbdev(intf);
|
||||
struct usb_host_endpoint *cmd_ep = usb_dev->ep_in[CXACRU_EP_CMD];
|
||||
struct usb_endpoint_descriptor *in, *out;
|
||||
int ret;
|
||||
|
||||
/* instance init */
|
||||
@@ -1177,6 +1178,19 @@ static int cxacru_bind(struct usbatm_data *usbatm_instance,
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (usb_endpoint_xfer_int(&cmd_ep->desc))
|
||||
ret = usb_find_common_endpoints(intf->cur_altsetting,
|
||||
NULL, NULL, &in, &out);
|
||||
else
|
||||
ret = usb_find_common_endpoints(intf->cur_altsetting,
|
||||
&in, &out, NULL, NULL);
|
||||
|
||||
if (ret) {
|
||||
usb_err(usbatm_instance, "cxacru_bind: interface has incorrect endpoints\n");
|
||||
ret = -ENODEV;
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if ((cmd_ep->desc.bmAttributes & USB_ENDPOINT_XFERTYPE_MASK)
|
||||
== USB_ENDPOINT_XFER_INT) {
|
||||
usb_fill_int_urb(instance->rcv_urb,
|
||||
|
||||
@@ -2029,7 +2029,6 @@ assert_reset:
|
||||
|
||||
static int dwc3_suspend_common(struct dwc3 *dwc, pm_message_t msg)
|
||||
{
|
||||
unsigned long flags;
|
||||
u32 reg;
|
||||
|
||||
switch (dwc->current_dr_role) {
|
||||
@@ -2067,9 +2066,7 @@ static int dwc3_suspend_common(struct dwc3 *dwc, pm_message_t msg)
|
||||
break;
|
||||
|
||||
if (dwc->current_otg_role == DWC3_OTG_ROLE_DEVICE) {
|
||||
spin_lock_irqsave(&dwc->lock, flags);
|
||||
dwc3_gadget_suspend(dwc);
|
||||
spin_unlock_irqrestore(&dwc->lock, flags);
|
||||
synchronize_irq(dwc->irq_gadget);
|
||||
}
|
||||
|
||||
@@ -2086,7 +2083,6 @@ static int dwc3_suspend_common(struct dwc3 *dwc, pm_message_t msg)
|
||||
|
||||
static int dwc3_resume_common(struct dwc3 *dwc, pm_message_t msg)
|
||||
{
|
||||
unsigned long flags;
|
||||
int ret;
|
||||
u32 reg;
|
||||
|
||||
@@ -2135,9 +2131,7 @@ static int dwc3_resume_common(struct dwc3 *dwc, pm_message_t msg)
|
||||
if (dwc->current_otg_role == DWC3_OTG_ROLE_HOST) {
|
||||
dwc3_otg_host_init(dwc);
|
||||
} else if (dwc->current_otg_role == DWC3_OTG_ROLE_DEVICE) {
|
||||
spin_lock_irqsave(&dwc->lock, flags);
|
||||
dwc3_gadget_resume(dwc);
|
||||
spin_unlock_irqrestore(&dwc->lock, flags);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
@@ -210,6 +210,7 @@ static inline struct usb_endpoint_descriptor *ep_desc(struct usb_gadget *gadget,
|
||||
struct usb_endpoint_descriptor *ss)
|
||||
{
|
||||
switch (gadget->speed) {
|
||||
case USB_SPEED_SUPER_PLUS:
|
||||
case USB_SPEED_SUPER:
|
||||
return ss;
|
||||
case USB_SPEED_HIGH:
|
||||
@@ -447,11 +448,8 @@ printer_read(struct file *fd, char __user *buf, size_t len, loff_t *ptr)
|
||||
mutex_lock(&dev->lock_printer_io);
|
||||
spin_lock_irqsave(&dev->lock, flags);
|
||||
|
||||
if (dev->interface < 0) {
|
||||
spin_unlock_irqrestore(&dev->lock, flags);
|
||||
mutex_unlock(&dev->lock_printer_io);
|
||||
return -ENODEV;
|
||||
}
|
||||
if (dev->interface < 0)
|
||||
goto out_disabled;
|
||||
|
||||
/* We will use this flag later to check if a printer reset happened
|
||||
* after we turn interrupts back on.
|
||||
@@ -459,6 +457,9 @@ printer_read(struct file *fd, char __user *buf, size_t len, loff_t *ptr)
|
||||
dev->reset_printer = 0;
|
||||
|
||||
setup_rx_reqs(dev);
|
||||
/* this dropped the lock - need to retest */
|
||||
if (dev->interface < 0)
|
||||
goto out_disabled;
|
||||
|
||||
bytes_copied = 0;
|
||||
current_rx_req = dev->current_rx_req;
|
||||
@@ -492,6 +493,8 @@ printer_read(struct file *fd, char __user *buf, size_t len, loff_t *ptr)
|
||||
wait_event_interruptible(dev->rx_wait,
|
||||
(likely(!list_empty(&dev->rx_buffers))));
|
||||
spin_lock_irqsave(&dev->lock, flags);
|
||||
if (dev->interface < 0)
|
||||
goto out_disabled;
|
||||
}
|
||||
|
||||
/* We have data to return then copy it to the caller's buffer.*/
|
||||
@@ -535,6 +538,9 @@ printer_read(struct file *fd, char __user *buf, size_t len, loff_t *ptr)
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
if (dev->interface < 0)
|
||||
goto out_disabled;
|
||||
|
||||
/* If we not returning all the data left in this RX request
|
||||
* buffer then adjust the amount of data left in the buffer.
|
||||
* Othewise if we are done with this RX request buffer then
|
||||
@@ -564,6 +570,11 @@ printer_read(struct file *fd, char __user *buf, size_t len, loff_t *ptr)
|
||||
return bytes_copied;
|
||||
else
|
||||
return -EAGAIN;
|
||||
|
||||
out_disabled:
|
||||
spin_unlock_irqrestore(&dev->lock, flags);
|
||||
mutex_unlock(&dev->lock_printer_io);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
@@ -584,11 +595,8 @@ printer_write(struct file *fd, const char __user *buf, size_t len, loff_t *ptr)
|
||||
mutex_lock(&dev->lock_printer_io);
|
||||
spin_lock_irqsave(&dev->lock, flags);
|
||||
|
||||
if (dev->interface < 0) {
|
||||
spin_unlock_irqrestore(&dev->lock, flags);
|
||||
mutex_unlock(&dev->lock_printer_io);
|
||||
return -ENODEV;
|
||||
}
|
||||
if (dev->interface < 0)
|
||||
goto out_disabled;
|
||||
|
||||
/* Check if a printer reset happens while we have interrupts on */
|
||||
dev->reset_printer = 0;
|
||||
@@ -611,6 +619,8 @@ printer_write(struct file *fd, const char __user *buf, size_t len, loff_t *ptr)
|
||||
wait_event_interruptible(dev->tx_wait,
|
||||
(likely(!list_empty(&dev->tx_reqs))));
|
||||
spin_lock_irqsave(&dev->lock, flags);
|
||||
if (dev->interface < 0)
|
||||
goto out_disabled;
|
||||
}
|
||||
|
||||
while (likely(!list_empty(&dev->tx_reqs)) && len) {
|
||||
@@ -660,6 +670,9 @@ printer_write(struct file *fd, const char __user *buf, size_t len, loff_t *ptr)
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
||||
if (dev->interface < 0)
|
||||
goto out_disabled;
|
||||
|
||||
list_add(&req->list, &dev->tx_reqs_active);
|
||||
|
||||
/* here, we unlock, and only unlock, to avoid deadlock. */
|
||||
@@ -672,6 +685,8 @@ printer_write(struct file *fd, const char __user *buf, size_t len, loff_t *ptr)
|
||||
mutex_unlock(&dev->lock_printer_io);
|
||||
return -EAGAIN;
|
||||
}
|
||||
if (dev->interface < 0)
|
||||
goto out_disabled;
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&dev->lock, flags);
|
||||
@@ -683,6 +698,11 @@ printer_write(struct file *fd, const char __user *buf, size_t len, loff_t *ptr)
|
||||
return bytes_copied;
|
||||
else
|
||||
return -EAGAIN;
|
||||
|
||||
out_disabled:
|
||||
spin_unlock_irqrestore(&dev->lock, flags);
|
||||
mutex_unlock(&dev->lock_printer_io);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
static int
|
||||
|
||||
@@ -66,8 +66,8 @@
|
||||
#define USB_UPSTREAM_EN BIT(0)
|
||||
|
||||
/* Main config reg */
|
||||
#define UDC_CFG_SET_ADDR(x) ((x) & 0x3f)
|
||||
#define UDC_CFG_ADDR_MASK (0x3f)
|
||||
#define UDC_CFG_SET_ADDR(x) ((x) & UDC_CFG_ADDR_MASK)
|
||||
#define UDC_CFG_ADDR_MASK GENMASK(6, 0)
|
||||
|
||||
/* Interrupt ctrl & status reg */
|
||||
#define UDC_IRQ_EP_POOL_NAK BIT(17)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user