Merge 5.10.36 into android12-5.10
Changes in 5.10.36
bus: mhi: core: Fix check for syserr at power_up
bus: mhi: core: Clear configuration from channel context during reset
bus: mhi: core: Sanity check values from remote device before use
nitro_enclaves: Fix stale file descriptors on failed usercopy
dyndbg: fix parsing file query without a line-range suffix
s390/disassembler: increase ebpf disasm buffer size
s390/zcrypt: fix zcard and zqueue hot-unplug memleak
vhost-vdpa: fix vm_flags for virtqueue doorbell mapping
tpm: acpi: Check eventlog signature before using it
ACPI: custom_method: fix potential use-after-free issue
ACPI: custom_method: fix a possible memory leak
ftrace: Handle commands when closing set_ftrace_filter file
ARM: 9056/1: decompressor: fix BSS size calculation for LLVM ld.lld
arm64: dts: marvell: armada-37xx: add syscon compatible to NB clk node
arm64: dts: mt8173: fix property typo of 'phys' in dsi node
ecryptfs: fix kernel panic with null dev_name
fs/epoll: restore waking from ep_done_scan()
mtd: spi-nor: core: Fix an issue of releasing resources during read/write
Revert "mtd: spi-nor: macronix: Add support for mx25l51245g"
mtd: spinand: core: add missing MODULE_DEVICE_TABLE()
mtd: rawnand: atmel: Update ecc_stats.corrected counter
mtd: physmap: physmap-bt1-rom: Fix unintentional stack access
erofs: add unsupported inode i_format check
spi: stm32-qspi: fix pm_runtime usage_count counter
spi: spi-ti-qspi: Free DMA resources
scsi: qla2xxx: Fix crash in qla2xxx_mqueuecommand()
scsi: mpt3sas: Block PCI config access from userspace during reset
mmc: uniphier-sd: Fix an error handling path in uniphier_sd_probe()
mmc: uniphier-sd: Fix a resource leak in the remove function
mmc: sdhci: Check for reset prior to DMA address unmap
mmc: sdhci-pci: Fix initialization of some SD cards for Intel BYT-based controllers
mmc: sdhci-tegra: Add required callbacks to set/clear CQE_EN bit
mmc: block: Update ext_csd.cache_ctrl if it was written
mmc: block: Issue a cache flush only when it's enabled
mmc: core: Do a power cycle when the CMD11 fails
mmc: core: Set read only for SD cards with permanent write protect bit
mmc: core: Fix hanging on I/O during system suspend for removable cards
irqchip/gic-v3: Do not enable irqs when handling spurious interrups
cifs: Return correct error code from smb2_get_enc_key
cifs: fix out-of-bound memory access when calling smb3_notify() at mount point
cifs: detect dead connections only when echoes are enabled.
smb2: fix use-after-free in smb2_ioctl_query_info()
btrfs: handle remount to no compress during compression
x86/build: Disable HIGHMEM64G selection for M486SX
btrfs: fix metadata extent leak after failure to create subvolume
intel_th: pci: Add Rocket Lake CPU support
btrfs: fix race between transaction aborts and fsyncs leading to use-after-free
posix-timers: Preserve return value in clock_adjtime32()
fbdev: zero-fill colormap in fbcmap.c
cpuidle: tegra: Fix C7 idling state on Tegra114
bus: ti-sysc: Probe for l4_wkup and l4_cfg interconnect devices first
staging: wimax/i2400m: fix byte-order issue
spi: ath79: always call chipselect function
spi: ath79: remove spi-master setup and cleanup assignment
bus: mhi: core: Destroy SBL devices when moving to mission mode
crypto: api - check for ERR pointers in crypto_destroy_tfm()
crypto: qat - fix unmap invalid dma address
usb: gadget: uvc: add bInterval checking for HS mode
usb: webcam: Invalid size of Processing Unit Descriptor
x86/sev: Do not require Hypervisor CPUID bit for SEV guests
crypto: hisilicon/sec - fixes a printing error
genirq/matrix: Prevent allocation counter corruption
usb: gadget: f_uac2: validate input parameters
usb: gadget: f_uac1: validate input parameters
usb: dwc3: gadget: Ignore EP queue requests during bus reset
usb: xhci: Fix port minor revision
kselftest/arm64: mte: Fix compilation with native compiler
ARM: tegra: acer-a500: Rename avdd to vdda of touchscreen node
PCI: PM: Do not read power state in pci_enable_device_flags()
kselftest/arm64: mte: Fix MTE feature detection
ARM: dts: BCM5301X: fix "reg" formatting in /memory node
ARM: dts: ux500: Fix up TVK R3 sensors
x86/build: Propagate $(CLANG_FLAGS) to $(REALMODE_FLAGS)
x86/boot: Add $(CLANG_FLAGS) to compressed KBUILD_CFLAGS
efi/libstub: Add $(CLANG_FLAGS) to x86 flags
soc/tegra: pmc: Fix completion of power-gate toggling
arm64: dts: imx8mq-librem5-r3: Mark buck3 as always on
tee: optee: do not check memref size on return from Secure World
soundwire: cadence: only prepare attached devices on clock stop
perf/arm_pmu_platform: Use dev_err_probe() for IRQ errors
perf/arm_pmu_platform: Fix error handling
random: initialize ChaCha20 constants with correct endianness
usb: xhci-mtk: support quirk to disable usb2 lpm
fpga: dfl: pci: add DID for D5005 PAC cards
xhci: check port array allocation was successful before dereferencing it
xhci: check control context is valid before dereferencing it.
xhci: fix potential array out of bounds with several interrupters
bus: mhi: core: Clear context for stopped channels from remove()
ARM: dts: at91: change the key code of the gpio key
tools/power/x86/intel-speed-select: Increase string size
platform/x86: ISST: Account for increased timeout in some cases
spi: dln2: Fix reference leak to master
spi: omap-100k: Fix reference leak to master
spi: qup: fix PM reference leak in spi_qup_remove()
usb: gadget: tegra-xudc: Fix possible use-after-free in tegra_xudc_remove()
usb: musb: fix PM reference leak in musb_irq_work()
usb: core: hub: Fix PM reference leak in usb_port_resume()
usb: dwc3: gadget: Check for disabled LPM quirk
tty: n_gsm: check error while registering tty devices
intel_th: Consistency and off-by-one fix
phy: phy-twl4030-usb: Fix possible use-after-free in twl4030_usb_remove()
crypto: sun8i-ss - Fix PM reference leak when pm_runtime_get_sync() fails
crypto: sun8i-ce - Fix PM reference leak in sun8i_ce_probe()
crypto: stm32/hash - Fix PM reference leak on stm32-hash.c
crypto: stm32/cryp - Fix PM reference leak on stm32-cryp.c
crypto: sa2ul - Fix PM reference leak in sa_ul_probe()
crypto: omap-aes - Fix PM reference leak on omap-aes.c
platform/x86: intel_pmc_core: Don't use global pmcdev in quirks
spi: sync up initial chipselect state
btrfs: do proper error handling in create_reloc_root
btrfs: do proper error handling in btrfs_update_reloc_root
btrfs: convert logic BUG_ON()'s in replace_path to ASSERT()'s
drm: Added orientation quirk for OneGX1 Pro
drm/qxl: do not run release if qxl failed to init
drm/qxl: release shadow on shutdown
drm/ast: Fix invalid usage of AST_MAX_HWC_WIDTH in cursor atomic_check
drm/amd/display: changing sr exit latency
drm/ast: fix memory leak when unload the driver
drm/amd/display: Check for DSC support instead of ASIC revision
drm/amd/display: Don't optimize bandwidth before disabling planes
drm/amdgpu/display: buffer INTERRUPT_LOW_IRQ_CONTEXT interrupt work
drm/amd/display/dc/dce/dce_aux: Remove duplicate line causing 'field overwritten' issue
scsi: lpfc: Fix incorrect dbde assignment when building target abts wqe
scsi: lpfc: Fix pt2pt connection does not recover after LOGO
drm/amdgpu: Fix some unload driver issues
sched/pelt: Fix task util_est update filtering
kvfree_rcu: Use same set of GFP flags as does single-argument
scsi: target: pscsi: Fix warning in pscsi_complete_cmd()
media: ite-cir: check for receive overflow
media: drivers: media: pci: sta2x11: fix Kconfig dependency on GPIOLIB
media: imx: capture: Return -EPIPE from __capture_legacy_try_fmt()
atomisp: don't let it go past pipes array
power: supply: bq27xxx: fix power_avg for newer ICs
extcon: arizona: Fix some issues when HPDET IRQ fires after the jack has been unplugged
extcon: arizona: Fix various races on driver unbind
media: media/saa7164: fix saa7164_encoder_register() memory leak bugs
media: gspca/sq905.c: fix uninitialized variable
power: supply: Use IRQF_ONESHOT
backlight: qcom-wled: Use sink_addr for sync toggle
backlight: qcom-wled: Fix FSC update issue for WLED5
drm/amdgpu: mask the xgmi number of hops reported from psp to kfd
drm/amdkfd: Fix UBSAN shift-out-of-bounds warning
drm/amdgpu : Fix asic reset regression issue introduce by 8f211fe8ac7c4f
drm/amd/pm: fix workload mismatch on vega10
drm/amd/display: Fix UBSAN warning for not a valid value for type '_Bool'
drm/amd/display: DCHUB underflow counter increasing in some scenarios
drm/amd/display: fix dml prefetch validation
scsi: qla2xxx: Always check the return value of qla24xx_get_isp_stats()
drm/vkms: fix misuse of WARN_ON
scsi: qla2xxx: Fix use after free in bsg
mmc: sdhci-esdhc-imx: validate pinctrl before use it
mmc: sdhci-pci: Add PCI IDs for Intel LKF
mmc: sdhci-brcmstb: Remove CQE quirk
ata: ahci: Disable SXS for Hisilicon Kunpeng920
drm/komeda: Fix bit check to import to value of proper type
nvmet: return proper error code from discovery ctrl
selftests/resctrl: Enable gcc checks to detect buffer overflows
selftests/resctrl: Fix compilation issues for global variables
selftests/resctrl: Fix compilation issues for other global variables
selftests/resctrl: Clean up resctrl features check
selftests/resctrl: Fix missing options "-n" and "-p"
selftests/resctrl: Use resctrl/info for feature detection
selftests/resctrl: Fix incorrect parsing of iMC counters
selftests/resctrl: Fix checking for < 0 for unsigned values
power: supply: cpcap-charger: Add usleep to cpcap charger to avoid usb plug bounce
scsi: smartpqi: Use host-wide tag space
scsi: smartpqi: Correct request leakage during reset operations
scsi: smartpqi: Add new PCI IDs
scsi: scsi_dh_alua: Remove check for ASC 24h in alua_rtpg()
media: em28xx: fix memory leak
media: vivid: update EDID
drm/msm/dp: Fix incorrect NULL check kbot warnings in DP driver
clk: socfpga: arria10: Fix memory leak of socfpga_clk on error return
power: supply: generic-adc-battery: fix possible use-after-free in gab_remove()
power: supply: s3c_adc_battery: fix possible use-after-free in s3c_adc_bat_remove()
media: tc358743: fix possible use-after-free in tc358743_remove()
media: adv7604: fix possible use-after-free in adv76xx_remove()
media: i2c: adv7511-v4l2: fix possible use-after-free in adv7511_remove()
media: i2c: tda1997: Fix possible use-after-free in tda1997x_remove()
media: i2c: adv7842: fix possible use-after-free in adv7842_remove()
media: platform: sti: Fix runtime PM imbalance in regs_show
media: sun8i-di: Fix runtime PM imbalance in deinterlace_start_streaming
media: dvb-usb: fix memory leak in dvb_usb_adapter_init
media: gscpa/stv06xx: fix memory leak
sched/fair: Ignore percpu threads for imbalance pulls
drm/msm/mdp5: Configure PP_SYNC_HEIGHT to double the vtotal
drm/msm/mdp5: Do not multiply vclk line count by 100
drm/amdgpu/ttm: Fix memory leak userptr pages
drm/radeon/ttm: Fix memory leak userptr pages
drm/amd/display: Fix debugfs link_settings entry
drm/amd/display: Fix UBSAN: shift-out-of-bounds warning
drm/amdkfd: Fix cat debugfs hang_hws file causes system crash bug
amdgpu: avoid incorrect %hu format string
drm/amd/display: Try YCbCr420 color when YCbCr444 fails
drm/amdgpu: fix NULL pointer dereference
scsi: lpfc: Fix crash when a REG_RPI mailbox fails triggering a LOGO response
scsi: lpfc: Fix error handling for mailboxes completed in MBX_POLL mode
scsi: lpfc: Remove unsupported mbox PORT_CAPABILITIES logic
mfd: intel-m10-bmc: Fix the register access range
mfd: da9063: Support SMBus and I2C mode
mfd: arizona: Fix rumtime PM imbalance on error
scsi: libfc: Fix a format specifier
perf: Rework perf_event_exit_event()
sched,fair: Alternative sched_slice()
block/rnbd-clt: Fix missing a memory free when unloading the module
s390/archrandom: add parameter check for s390_arch_random_generate
sched,psi: Handle potential task count underflow bugs more gracefully
power: supply: cpcap-battery: fix invalid usage of list cursor
ALSA: emu8000: Fix a use after free in snd_emu8000_create_mixer
ALSA: hda/conexant: Re-order CX5066 quirk table entries
ALSA: sb: Fix two use after free in snd_sb_qsound_build
ALSA: usb-audio: Explicitly set up the clock selector
ALSA: usb-audio: Add dB range mapping for Sennheiser Communications Headset PC 8
ALSA: hda/realtek: fix mute/micmute LEDs for HP ProBook 445 G7
ALSA: hda/realtek: GA503 use same quirks as GA401
ALSA: hda/realtek: fix mic boost on Intel NUC 8
ALSA: hda/realtek - Headset Mic issue on HP platform
ALSA: hda/realtek: fix static noise on ALC285 Lenovo laptops
ALSA: hda/realtek: Add quirk for Intel Clevo PCx0Dx
tools/power/turbostat: Fix turbostat for AMD Zen CPUs
btrfs: fix race when picking most recent mod log operation for an old root
arm64/vdso: Discard .note.gnu.property sections in vDSO
Makefile: Move -Wno-unused-but-set-variable out of GCC only block
fs: fix reporting supported extra file attributes for statx()
virtiofs: fix memory leak in virtio_fs_probe()
kcsan, debugfs: Move debugfs file creation out of early init
ubifs: Only check replay with inode type to judge if inode linked
f2fs: fix error handling in f2fs_end_enable_verity()
f2fs: fix to avoid out-of-bounds memory access
mlxsw: spectrum_mr: Update egress RIF list before route's action
openvswitch: fix stack OOB read while fragmenting IPv4 packets
ACPI: GTDT: Don't corrupt interrupt mappings on watchdow probe failure
NFS: fs_context: validate UDP retrans to prevent shift out-of-bounds
NFS: Don't discard pNFS layout segments that are marked for return
NFSv4: Don't discard segments marked for return in _pnfs_return_layout()
Input: ili210x - add missing negation for touch indication on ili210x
jffs2: Fix kasan slab-out-of-bounds problem
jffs2: Hook up splice_write callback
powerpc/powernv: Enable HAIL (HV AIL) for ISA v3.1 processors
powerpc/eeh: Fix EEH handling for hugepages in ioremap space.
powerpc/kexec_file: Use current CPU info while setting up FDT
powerpc/32: Fix boot failure with CONFIG_STACKPROTECTOR
powerpc: fix EDEADLOCK redefinition error in uapi/asm/errno.h
intel_th: pci: Add Alder Lake-M support
tpm: efi: Use local variable for calculating final log size
tpm: vtpm_proxy: Avoid reading host log when using a virtual device
crypto: arm/curve25519 - Move '.fpu' after '.arch'
crypto: rng - fix crypto_rng_reset() refcounting when !CRYPTO_STATS
md/raid1: properly indicate failure when ending a failed write request
dm raid: fix inconclusive reshape layout on fast raid4/5/6 table reload sequences
fuse: fix write deadlock
exfat: fix erroneous discard when clear cluster bit
sfc: farch: fix TX queue lookup in TX flush done handling
sfc: farch: fix TX queue lookup in TX event handling
security: commoncap: fix -Wstringop-overread warning
Fix misc new gcc warnings
jffs2: check the validity of dstlen in jffs2_zlib_compress()
smb3: when mounting with multichannel include it in requested capabilities
smb3: do not attempt multichannel to server which does not support it
Revert 337f13046f
("futex: Allow FUTEX_CLOCK_REALTIME with FUTEX_WAIT op")
futex: Do not apply time namespace adjustment on FUTEX_LOCK_PI
x86/cpu: Initialize MSR_TSC_AUX if RDTSCP *or* RDPID is supported
kbuild: update config_data.gz only when the content of .config is changed
ext4: annotate data race in start_this_handle()
ext4: annotate data race in jbd2_journal_dirty_metadata()
ext4: fix check to prevent false positive report of incorrect used inodes
ext4: do not set SB_ACTIVE in ext4_orphan_cleanup()
ext4: fix error code in ext4_commit_super
ext4: fix ext4_error_err save negative errno into superblock
ext4: fix error return code in ext4_fc_perform_commit()
ext4: allow the dax flag to be set and cleared on inline directories
ext4: Fix occasional generic/418 failure
media: dvbdev: Fix memory leak in dvb_media_device_free()
media: dvb-usb: Fix use-after-free access
media: dvb-usb: Fix memory leak at error in dvb_usb_device_init()
media: staging/intel-ipu3: Fix memory leak in imu_fmt
media: staging/intel-ipu3: Fix set_fmt error handling
media: staging/intel-ipu3: Fix race condition during set_fmt
media: v4l2-ctrls: fix reference to freed memory
media: venus: hfi_parser: Don't initialize parser on v1
usb: gadget: dummy_hcd: fix gpf in gadget_setup
usb: gadget: Fix double free of device descriptor pointers
usb: gadget/function/f_fs string table fix for multiple languages
usb: dwc3: gadget: Remove FS bInterval_m1 limitation
usb: dwc3: gadget: Fix START_TRANSFER link state check
usb: dwc3: core: Do core softreset when switch mode
usb: dwc2: Fix session request interrupt handler
tty: fix memory leak in vc_deallocate
rsi: Use resume_noirq for SDIO
tools/power turbostat: Fix offset overflow issue in index converting
tracing: Map all PIDs to command lines
tracing: Restructure trace_clock_global() to never block
dm persistent data: packed struct should have an aligned() attribute too
dm space map common: fix division bug in sm_ll_find_free_block()
dm integrity: fix missing goto in bitmap_flush_interval error handling
dm rq: fix double free of blk_mq_tag_set in dev remove after table load fails
lib/vsprintf.c: remove leftover 'f' and 'F' cases from bstr_printf()
thermal/drivers/cpufreq_cooling: Fix slab OOB issue
thermal/core/fair share: Lock the thermal zone while looping over instances
Linux 5.10.36
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Change-Id: I7b8075de5edd8de69205205cddb9a3273d7d0810
This commit is contained in:
commit
a1ac3f3093
10
Makefile
10
Makefile
@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 10
|
||||
SUBLEVEL = 35
|
||||
SUBLEVEL = 36
|
||||
EXTRAVERSION =
|
||||
NAME = Dare mighty things
|
||||
|
||||
@ -792,16 +792,16 @@ KBUILD_CFLAGS += -Wno-gnu
|
||||
KBUILD_CFLAGS += -mno-global-merge
|
||||
else
|
||||
|
||||
# These warnings generated too much noise in a regular build.
|
||||
# Use make W=1 to enable them (see scripts/Makefile.extrawarn)
|
||||
KBUILD_CFLAGS += -Wno-unused-but-set-variable
|
||||
|
||||
# Warn about unmarked fall-throughs in switch statement.
|
||||
# Disabled for clang while comment to attribute conversion happens and
|
||||
# https://github.com/ClangBuiltLinux/linux/issues/636 is discussed.
|
||||
KBUILD_CFLAGS += $(call cc-option,-Wimplicit-fallthrough,)
|
||||
endif
|
||||
|
||||
# These warnings generated too much noise in a regular build.
|
||||
# Use make W=1 to enable them (see scripts/Makefile.extrawarn)
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning, unused-but-set-variable)
|
||||
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning, unused-const-variable)
|
||||
ifdef CONFIG_FRAME_POINTER
|
||||
KBUILD_CFLAGS += -fno-omit-frame-pointer -fno-optimize-sibling-calls
|
||||
|
@ -114,8 +114,8 @@ asflags-y := -DZIMAGE
|
||||
|
||||
# Supply kernel BSS size to the decompressor via a linker symbol.
|
||||
KBSS_SZ = $(shell echo $$(($$($(NM) $(obj)/../../../../vmlinux | \
|
||||
sed -n -e 's/^\([^ ]*\) [AB] __bss_start$$/-0x\1/p' \
|
||||
-e 's/^\([^ ]*\) [AB] __bss_stop$$/+0x\1/p') )) )
|
||||
sed -n -e 's/^\([^ ]*\) [ABD] __bss_start$$/-0x\1/p' \
|
||||
-e 's/^\([^ ]*\) [ABD] __bss_stop$$/+0x\1/p') )) )
|
||||
LDFLAGS_vmlinux = --defsym _kernel_bss_size=$(KBSS_SZ)
|
||||
# Supply ZRELADDR to the decompressor via a linker symbol.
|
||||
ifneq ($(CONFIG_AUTO_ZRELADDR),y)
|
||||
|
@ -8,6 +8,7 @@
|
||||
*/
|
||||
/dts-v1/;
|
||||
#include "sam9x60.dtsi"
|
||||
#include <dt-bindings/input/input.h>
|
||||
|
||||
/ {
|
||||
model = "Microchip SAM9X60-EK";
|
||||
@ -84,7 +85,7 @@ gpio_keys {
|
||||
sw1 {
|
||||
label = "SW1";
|
||||
gpios = <&pioD 18 GPIO_ACTIVE_LOW>;
|
||||
linux,code=<0x104>;
|
||||
linux,code=<KEY_PROG1>;
|
||||
wakeup-source;
|
||||
};
|
||||
};
|
||||
|
@ -11,6 +11,7 @@
|
||||
#include "at91-sama5d27_som1.dtsi"
|
||||
#include <dt-bindings/mfd/atmel-flexcom.h>
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
#include <dt-bindings/input/input.h>
|
||||
|
||||
/ {
|
||||
model = "Atmel SAMA5D27 SOM1 EK";
|
||||
@ -467,7 +468,7 @@ gpio_keys {
|
||||
pb4 {
|
||||
label = "USER";
|
||||
gpios = <&pioA PIN_PA29 GPIO_ACTIVE_LOW>;
|
||||
linux,code = <0x104>;
|
||||
linux,code = <KEY_PROG1>;
|
||||
wakeup-source;
|
||||
};
|
||||
};
|
||||
|
@ -8,6 +8,7 @@
|
||||
*/
|
||||
/dts-v1/;
|
||||
#include "at91-sama5d27_wlsom1.dtsi"
|
||||
#include <dt-bindings/input/input.h>
|
||||
|
||||
/ {
|
||||
model = "Microchip SAMA5D27 WLSOM1 EK";
|
||||
@ -35,7 +36,7 @@ gpio_keys {
|
||||
sw4 {
|
||||
label = "USER BUTTON";
|
||||
gpios = <&pioA PIN_PB2 GPIO_ACTIVE_LOW>;
|
||||
linux,code = <0x104>;
|
||||
linux,code = <KEY_PROG1>;
|
||||
wakeup-source;
|
||||
};
|
||||
};
|
||||
|
@ -12,6 +12,7 @@
|
||||
#include "sama5d2.dtsi"
|
||||
#include "sama5d2-pinfunc.h"
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
#include <dt-bindings/input/input.h>
|
||||
#include <dt-bindings/mfd/atmel-flexcom.h>
|
||||
|
||||
/ {
|
||||
@ -51,7 +52,7 @@ gpio_keys {
|
||||
sw4 {
|
||||
label = "USER_PB1";
|
||||
gpios = <&pioA PIN_PD0 GPIO_ACTIVE_LOW>;
|
||||
linux,code = <0x104>;
|
||||
linux,code = <KEY_PROG1>;
|
||||
wakeup-source;
|
||||
};
|
||||
};
|
||||
|
@ -11,6 +11,7 @@
|
||||
#include "sama5d2-pinfunc.h"
|
||||
#include <dt-bindings/mfd/atmel-flexcom.h>
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
#include <dt-bindings/input/input.h>
|
||||
#include <dt-bindings/pinctrl/at91.h>
|
||||
|
||||
/ {
|
||||
@ -403,7 +404,7 @@ gpio_keys {
|
||||
bp1 {
|
||||
label = "PB_USER";
|
||||
gpios = <&pioA PIN_PA10 GPIO_ACTIVE_LOW>;
|
||||
linux,code = <0x104>;
|
||||
linux,code = <KEY_PROG1>;
|
||||
wakeup-source;
|
||||
};
|
||||
};
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include "sama5d2-pinfunc.h"
|
||||
#include <dt-bindings/mfd/atmel-flexcom.h>
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
#include <dt-bindings/input/input.h>
|
||||
#include <dt-bindings/regulator/active-semi,8945a-regulator.h>
|
||||
|
||||
/ {
|
||||
@ -713,7 +714,7 @@ gpio_keys {
|
||||
bp1 {
|
||||
label = "PB_USER";
|
||||
gpios = <&pioA PIN_PB9 GPIO_ACTIVE_LOW>;
|
||||
linux,code = <0x104>;
|
||||
linux,code = <KEY_PROG1>;
|
||||
wakeup-source;
|
||||
};
|
||||
};
|
||||
|
@ -7,6 +7,7 @@
|
||||
*/
|
||||
/dts-v1/;
|
||||
#include "sama5d36.dtsi"
|
||||
#include <dt-bindings/input/input.h>
|
||||
|
||||
/ {
|
||||
model = "SAMA5D3 Xplained";
|
||||
@ -354,7 +355,7 @@ gpio_keys {
|
||||
bp3 {
|
||||
label = "PB_USER";
|
||||
gpios = <&pioE 29 GPIO_ACTIVE_LOW>;
|
||||
linux,code = <0x104>;
|
||||
linux,code = <KEY_PROG1>;
|
||||
wakeup-source;
|
||||
};
|
||||
};
|
||||
|
@ -7,6 +7,7 @@
|
||||
*/
|
||||
/dts-v1/;
|
||||
#include "at91sam9260.dtsi"
|
||||
#include <dt-bindings/input/input.h>
|
||||
|
||||
/ {
|
||||
model = "Atmel at91sam9260ek";
|
||||
@ -156,7 +157,7 @@ btn3 {
|
||||
btn4 {
|
||||
label = "Button 4";
|
||||
gpios = <&pioA 31 GPIO_ACTIVE_LOW>;
|
||||
linux,code = <0x104>;
|
||||
linux,code = <KEY_PROG1>;
|
||||
wakeup-source;
|
||||
};
|
||||
};
|
||||
|
@ -5,6 +5,7 @@
|
||||
* Copyright (C) 2012 Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
|
||||
*/
|
||||
#include "at91sam9g20.dtsi"
|
||||
#include <dt-bindings/input/input.h>
|
||||
|
||||
/ {
|
||||
|
||||
@ -234,7 +235,7 @@ btn3 {
|
||||
btn4 {
|
||||
label = "Button 4";
|
||||
gpios = <&pioA 31 GPIO_ACTIVE_LOW>;
|
||||
linux,code = <0x104>;
|
||||
linux,code = <KEY_PROG1>;
|
||||
wakeup-source;
|
||||
};
|
||||
};
|
||||
|
@ -21,8 +21,8 @@ chosen {
|
||||
|
||||
memory@0 {
|
||||
device_type = "memory";
|
||||
reg = <0x00000000 0x08000000
|
||||
0x88000000 0x08000000>;
|
||||
reg = <0x00000000 0x08000000>,
|
||||
<0x88000000 0x08000000>;
|
||||
};
|
||||
|
||||
leds {
|
||||
|
@ -21,8 +21,8 @@ chosen {
|
||||
|
||||
memory@0 {
|
||||
device_type = "memory";
|
||||
reg = <0x00000000 0x08000000
|
||||
0x88000000 0x08000000>;
|
||||
reg = <0x00000000 0x08000000>,
|
||||
<0x88000000 0x08000000>;
|
||||
};
|
||||
|
||||
leds {
|
||||
|
@ -21,8 +21,8 @@ chosen {
|
||||
|
||||
memory@0 {
|
||||
device_type = "memory";
|
||||
reg = <0x00000000 0x08000000
|
||||
0x88000000 0x18000000>;
|
||||
reg = <0x00000000 0x08000000>,
|
||||
<0x88000000 0x18000000>;
|
||||
};
|
||||
|
||||
spi {
|
||||
|
@ -22,8 +22,8 @@ chosen {
|
||||
|
||||
memory {
|
||||
device_type = "memory";
|
||||
reg = <0x00000000 0x08000000
|
||||
0x88000000 0x08000000>;
|
||||
reg = <0x00000000 0x08000000>,
|
||||
<0x88000000 0x08000000>;
|
||||
};
|
||||
|
||||
leds {
|
||||
|
@ -21,8 +21,8 @@ chosen {
|
||||
|
||||
memory@0 {
|
||||
device_type = "memory";
|
||||
reg = <0x00000000 0x08000000
|
||||
0x88000000 0x08000000>;
|
||||
reg = <0x00000000 0x08000000>,
|
||||
<0x88000000 0x08000000>;
|
||||
};
|
||||
|
||||
leds {
|
||||
|
@ -21,8 +21,8 @@ chosen {
|
||||
|
||||
memory@0 {
|
||||
device_type = "memory";
|
||||
reg = <0x00000000 0x08000000
|
||||
0x88000000 0x08000000>;
|
||||
reg = <0x00000000 0x08000000>,
|
||||
<0x88000000 0x08000000>;
|
||||
};
|
||||
|
||||
leds {
|
||||
|
@ -21,8 +21,8 @@ chosen {
|
||||
|
||||
memory@0 {
|
||||
device_type = "memory";
|
||||
reg = <0x00000000 0x08000000
|
||||
0x88000000 0x08000000>;
|
||||
reg = <0x00000000 0x08000000>,
|
||||
<0x88000000 0x08000000>;
|
||||
};
|
||||
|
||||
leds {
|
||||
|
@ -21,8 +21,8 @@ chosen {
|
||||
|
||||
memory@0 {
|
||||
device_type = "memory";
|
||||
reg = <0x00000000 0x08000000
|
||||
0x88000000 0x08000000>;
|
||||
reg = <0x00000000 0x08000000>,
|
||||
<0x88000000 0x08000000>;
|
||||
};
|
||||
|
||||
spi {
|
||||
|
@ -21,8 +21,8 @@ chosen {
|
||||
|
||||
memory@0 {
|
||||
device_type = "memory";
|
||||
reg = <0x00000000 0x08000000
|
||||
0x88000000 0x08000000>;
|
||||
reg = <0x00000000 0x08000000>,
|
||||
<0x88000000 0x08000000>;
|
||||
};
|
||||
|
||||
spi {
|
||||
|
@ -21,8 +21,8 @@ chosen {
|
||||
|
||||
memory {
|
||||
device_type = "memory";
|
||||
reg = <0x00000000 0x08000000
|
||||
0x88000000 0x08000000>;
|
||||
reg = <0x00000000 0x08000000>,
|
||||
<0x88000000 0x08000000>;
|
||||
};
|
||||
|
||||
leds {
|
||||
|
@ -21,8 +21,8 @@ chosen {
|
||||
|
||||
memory {
|
||||
device_type = "memory";
|
||||
reg = <0x00000000 0x08000000
|
||||
0x88000000 0x18000000>;
|
||||
reg = <0x00000000 0x08000000>,
|
||||
<0x88000000 0x18000000>;
|
||||
};
|
||||
|
||||
leds {
|
||||
|
@ -18,8 +18,8 @@ chosen {
|
||||
|
||||
memory {
|
||||
device_type = "memory";
|
||||
reg = <0x00000000 0x08000000
|
||||
0x88000000 0x08000000>;
|
||||
reg = <0x00000000 0x08000000>,
|
||||
<0x88000000 0x08000000>;
|
||||
};
|
||||
|
||||
gpio-keys {
|
||||
|
@ -21,8 +21,8 @@ chosen {
|
||||
|
||||
memory {
|
||||
device_type = "memory";
|
||||
reg = <0x00000000 0x08000000
|
||||
0x88000000 0x08000000>;
|
||||
reg = <0x00000000 0x08000000>,
|
||||
<0x88000000 0x08000000>;
|
||||
};
|
||||
|
||||
leds {
|
||||
|
@ -32,8 +32,8 @@ chosen {
|
||||
|
||||
memory {
|
||||
device_type = "memory";
|
||||
reg = <0x00000000 0x08000000
|
||||
0x88000000 0x08000000>;
|
||||
reg = <0x00000000 0x08000000>,
|
||||
<0x88000000 0x08000000>;
|
||||
};
|
||||
|
||||
leds {
|
||||
|
@ -21,8 +21,8 @@ chosen {
|
||||
|
||||
memory@0 {
|
||||
device_type = "memory";
|
||||
reg = <0x00000000 0x08000000
|
||||
0x88000000 0x08000000>;
|
||||
reg = <0x00000000 0x08000000>,
|
||||
<0x88000000 0x08000000>;
|
||||
};
|
||||
|
||||
nand: nand@18028000 {
|
||||
|
@ -18,8 +18,8 @@ chosen {
|
||||
|
||||
memory@0 {
|
||||
device_type = "memory";
|
||||
reg = <0x00000000 0x08000000
|
||||
0x88000000 0x08000000>;
|
||||
reg = <0x00000000 0x08000000>,
|
||||
<0x88000000 0x08000000>;
|
||||
};
|
||||
|
||||
gpio-keys {
|
||||
|
@ -18,8 +18,8 @@ chosen {
|
||||
|
||||
memory@0 {
|
||||
device_type = "memory";
|
||||
reg = <0x00000000 0x08000000
|
||||
0x88000000 0x18000000>;
|
||||
reg = <0x00000000 0x08000000>,
|
||||
<0x88000000 0x18000000>;
|
||||
};
|
||||
|
||||
leds {
|
||||
|
@ -18,8 +18,8 @@ chosen {
|
||||
|
||||
memory@0 {
|
||||
device_type = "memory";
|
||||
reg = <0x00000000 0x08000000
|
||||
0x88000000 0x18000000>;
|
||||
reg = <0x00000000 0x08000000>,
|
||||
<0x88000000 0x18000000>;
|
||||
};
|
||||
|
||||
leds {
|
||||
|
@ -18,8 +18,8 @@ chosen {
|
||||
|
||||
memory {
|
||||
device_type = "memory";
|
||||
reg = <0x00000000 0x08000000
|
||||
0x88000000 0x18000000>;
|
||||
reg = <0x00000000 0x08000000>,
|
||||
<0x88000000 0x18000000>;
|
||||
};
|
||||
|
||||
leds {
|
||||
|
@ -18,8 +18,8 @@ chosen {
|
||||
|
||||
memory@0 {
|
||||
device_type = "memory";
|
||||
reg = <0x00000000 0x08000000
|
||||
0x88000000 0x08000000>;
|
||||
reg = <0x00000000 0x08000000>,
|
||||
<0x88000000 0x08000000>;
|
||||
};
|
||||
|
||||
leds {
|
||||
|
@ -18,8 +18,8 @@ chosen {
|
||||
|
||||
memory@0 {
|
||||
device_type = "memory";
|
||||
reg = <0x00000000 0x08000000
|
||||
0x88000000 0x18000000>;
|
||||
reg = <0x00000000 0x08000000>,
|
||||
<0x88000000 0x18000000>;
|
||||
};
|
||||
|
||||
leds {
|
||||
|
@ -18,8 +18,8 @@ chosen {
|
||||
|
||||
memory@0 {
|
||||
device_type = "memory";
|
||||
reg = <0x00000000 0x08000000
|
||||
0x88000000 0x18000000>;
|
||||
reg = <0x00000000 0x08000000>,
|
||||
<0x88000000 0x18000000>;
|
||||
};
|
||||
|
||||
leds {
|
||||
|
@ -15,8 +15,8 @@ / {
|
||||
|
||||
memory@0 {
|
||||
device_type = "memory";
|
||||
reg = <0x00000000 0x08000000
|
||||
0x88000000 0x18000000>;
|
||||
reg = <0x00000000 0x08000000>,
|
||||
<0x88000000 0x18000000>;
|
||||
};
|
||||
|
||||
gpio-keys {
|
||||
|
@ -8,37 +8,43 @@
|
||||
/ {
|
||||
soc {
|
||||
i2c@80128000 {
|
||||
/* Marked:
|
||||
* 129
|
||||
* M35
|
||||
* L3GD20
|
||||
*/
|
||||
l3gd20@6a {
|
||||
/* Gyroscope */
|
||||
compatible = "st,l3gd20";
|
||||
status = "disabled";
|
||||
accelerometer@19 {
|
||||
compatible = "st,lsm303dlhc-accel";
|
||||
st,drdy-int-pin = <1>;
|
||||
drive-open-drain;
|
||||
reg = <0x6a>; // 0x6a or 0x6b
|
||||
reg = <0x19>;
|
||||
vdd-supply = <&ab8500_ldo_aux1_reg>;
|
||||
vddio-supply = <&db8500_vsmps2_reg>;
|
||||
interrupt-parent = <&gpio2>;
|
||||
interrupts = <18 IRQ_TYPE_EDGE_RISING>,
|
||||
<19 IRQ_TYPE_EDGE_RISING>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&accel_tvk_mode>;
|
||||
};
|
||||
magnetometer@1e {
|
||||
compatible = "st,lsm303dlm-magn";
|
||||
st,drdy-int-pin = <1>;
|
||||
reg = <0x1e>;
|
||||
vdd-supply = <&ab8500_ldo_aux1_reg>;
|
||||
vddio-supply = <&db8500_vsmps2_reg>;
|
||||
// This interrupt is not properly working with the driver
|
||||
// interrupt-parent = <&gpio1>;
|
||||
// interrupts = <0 IRQ_TYPE_EDGE_RISING>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&magn_tvk_mode>;
|
||||
};
|
||||
gyroscope@68 {
|
||||
/* Gyroscope */
|
||||
compatible = "st,l3g4200d-gyro";
|
||||
reg = <0x68>;
|
||||
vdd-supply = <&ab8500_ldo_aux1_reg>;
|
||||
vddio-supply = <&db8500_vsmps2_reg>;
|
||||
};
|
||||
/*
|
||||
* Marked:
|
||||
* 2122
|
||||
* C3H
|
||||
* DQEEE
|
||||
* LIS3DH?
|
||||
*/
|
||||
lis3dh@18 {
|
||||
/* Accelerometer */
|
||||
compatible = "st,lis3dh-accel";
|
||||
st,drdy-int-pin = <1>;
|
||||
reg = <0x18>;
|
||||
pressure@5c {
|
||||
/* Barometer/pressure sensor */
|
||||
compatible = "st,lps001wp-press";
|
||||
reg = <0x5c>;
|
||||
vdd-supply = <&ab8500_ldo_aux1_reg>;
|
||||
vddio-supply = <&db8500_vsmps2_reg>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&accel_tvk_mode>;
|
||||
};
|
||||
};
|
||||
|
||||
@ -54,5 +60,26 @@ panel {
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
pinctrl {
|
||||
accelerometer {
|
||||
accel_tvk_mode: accel_tvk {
|
||||
/* Accelerometer interrupt lines 1 & 2 */
|
||||
tvk_cfg {
|
||||
pins = "GPIO82_C1", "GPIO83_D3";
|
||||
ste,config = <&gpio_in_pd>;
|
||||
};
|
||||
};
|
||||
};
|
||||
magnetometer {
|
||||
magn_tvk_mode: magn_tvk {
|
||||
/* GPIO 32 used for DRDY, pull this down */
|
||||
tvk_cfg {
|
||||
pins = "GPIO32_V2";
|
||||
ste,config = <&gpio_in_pd>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -448,7 +448,7 @@ touchscreen@4c {
|
||||
|
||||
reset-gpios = <&gpio TEGRA_GPIO(Q, 7) GPIO_ACTIVE_HIGH>;
|
||||
|
||||
avdd-supply = <&vdd_3v3_sys>;
|
||||
vdda-supply = <&vdd_3v3_sys>;
|
||||
vdd-supply = <&vdd_3v3_sys>;
|
||||
};
|
||||
|
||||
|
@ -10,8 +10,8 @@
|
||||
#include <linux/linkage.h>
|
||||
|
||||
.text
|
||||
.fpu neon
|
||||
.arch armv7-a
|
||||
.fpu neon
|
||||
.align 4
|
||||
|
||||
ENTRY(curve25519_neon)
|
||||
|
@ -22,6 +22,10 @@ &bq25895 {
|
||||
ti,termination-current = <144000>; /* uA */
|
||||
};
|
||||
|
||||
&buck3_reg {
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
&proximity {
|
||||
proximity-near-level = <25>;
|
||||
};
|
||||
|
@ -156,7 +156,8 @@ uart1: serial@12200 {
|
||||
};
|
||||
|
||||
nb_periph_clk: nb-periph-clk@13000 {
|
||||
compatible = "marvell,armada-3700-periph-clock-nb";
|
||||
compatible = "marvell,armada-3700-periph-clock-nb",
|
||||
"syscon";
|
||||
reg = <0x13000 0x100>;
|
||||
clocks = <&tbg 0>, <&tbg 1>, <&tbg 2>,
|
||||
<&tbg 3>, <&xtalclk>;
|
||||
|
@ -1169,7 +1169,7 @@ dsi1: dsi@1401c000 {
|
||||
<&mmsys CLK_MM_DSI1_DIGITAL>,
|
||||
<&mipi_tx1>;
|
||||
clock-names = "engine", "digital", "hs";
|
||||
phy = <&mipi_tx1>;
|
||||
phys = <&mipi_tx1>;
|
||||
phy-names = "dphy";
|
||||
status = "disabled";
|
||||
};
|
||||
|
@ -31,6 +31,13 @@ SECTIONS
|
||||
.gnu.version_d : { *(.gnu.version_d) }
|
||||
.gnu.version_r : { *(.gnu.version_r) }
|
||||
|
||||
/*
|
||||
* Discard .note.gnu.property sections which are unused and have
|
||||
* different alignment requirement from vDSO note sections.
|
||||
*/
|
||||
/DISCARD/ : {
|
||||
*(.note.GNU-stack .note.gnu.property)
|
||||
}
|
||||
.note : { *(.note.*) } :text :note
|
||||
|
||||
. = ALIGN(16);
|
||||
@ -51,7 +58,6 @@ SECTIONS
|
||||
PROVIDE(end = .);
|
||||
|
||||
/DISCARD/ : {
|
||||
*(.note.GNU-stack)
|
||||
*(.data .data.* .gnu.linkonce.d.* .sdata*)
|
||||
*(.bss .sbss .dynbss .dynsbss)
|
||||
}
|
||||
|
@ -444,6 +444,7 @@
|
||||
#define LPCR_VRMA_LP1 ASM_CONST(0x0000800000000000)
|
||||
#define LPCR_RMLS 0x1C000000 /* Implementation dependent RMO limit sel */
|
||||
#define LPCR_RMLS_SH 26
|
||||
#define LPCR_HAIL ASM_CONST(0x0000000004000000) /* HV AIL (ISAv3.1) */
|
||||
#define LPCR_ILE ASM_CONST(0x0000000002000000) /* !HV irqs set MSR:LE */
|
||||
#define LPCR_AIL ASM_CONST(0x0000000001800000) /* Alternate interrupt location */
|
||||
#define LPCR_AIL_0 ASM_CONST(0x0000000000000000) /* MMU off exception offset 0x0 */
|
||||
|
@ -2,6 +2,7 @@
|
||||
#ifndef _ASM_POWERPC_ERRNO_H
|
||||
#define _ASM_POWERPC_ERRNO_H
|
||||
|
||||
#undef EDEADLOCK
|
||||
#include <asm-generic/errno.h>
|
||||
|
||||
#undef EDEADLOCK
|
||||
|
@ -362,14 +362,11 @@ static inline unsigned long eeh_token_to_phys(unsigned long token)
|
||||
pa = pte_pfn(*ptep);
|
||||
|
||||
/* On radix we can do hugepage mappings for io, so handle that */
|
||||
if (hugepage_shift) {
|
||||
pa <<= hugepage_shift;
|
||||
pa |= token & ((1ul << hugepage_shift) - 1);
|
||||
} else {
|
||||
pa <<= PAGE_SHIFT;
|
||||
pa |= token & (PAGE_SIZE - 1);
|
||||
}
|
||||
if (!hugepage_shift)
|
||||
hugepage_shift = PAGE_SHIFT;
|
||||
|
||||
pa <<= PAGE_SHIFT;
|
||||
pa |= token & ((1ul << hugepage_shift) - 1);
|
||||
return pa;
|
||||
}
|
||||
|
||||
|
@ -231,10 +231,23 @@ static void cpu_ready_for_interrupts(void)
|
||||
* If we are not in hypervisor mode the job is done once for
|
||||
* the whole partition in configure_exceptions().
|
||||
*/
|
||||
if (cpu_has_feature(CPU_FTR_HVMODE) &&
|
||||
cpu_has_feature(CPU_FTR_ARCH_207S)) {
|
||||
if (cpu_has_feature(CPU_FTR_HVMODE)) {
|
||||
unsigned long lpcr = mfspr(SPRN_LPCR);
|
||||
mtspr(SPRN_LPCR, lpcr | LPCR_AIL_3);
|
||||
unsigned long new_lpcr = lpcr;
|
||||
|
||||
if (cpu_has_feature(CPU_FTR_ARCH_31)) {
|
||||
/* P10 DD1 does not have HAIL */
|
||||
if (pvr_version_is(PVR_POWER10) &&
|
||||
(mfspr(SPRN_PVR) & 0xf00) == 0x100)
|
||||
new_lpcr |= LPCR_AIL_3;
|
||||
else
|
||||
new_lpcr |= LPCR_HAIL;
|
||||
} else if (cpu_has_feature(CPU_FTR_ARCH_207S)) {
|
||||
new_lpcr |= LPCR_AIL_3;
|
||||
}
|
||||
|
||||
if (new_lpcr != lpcr)
|
||||
mtspr(SPRN_LPCR, new_lpcr);
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -960,6 +960,93 @@ unsigned int kexec_fdt_totalsize_ppc64(struct kimage *image)
|
||||
return fdt_size;
|
||||
}
|
||||
|
||||
/**
|
||||
* add_node_props - Reads node properties from device node structure and add
|
||||
* them to fdt.
|
||||
* @fdt: Flattened device tree of the kernel
|
||||
* @node_offset: offset of the node to add a property at
|
||||
* @dn: device node pointer
|
||||
*
|
||||
* Returns 0 on success, negative errno on error.
|
||||
*/
|
||||
static int add_node_props(void *fdt, int node_offset, const struct device_node *dn)
|
||||
{
|
||||
int ret = 0;
|
||||
struct property *pp;
|
||||
|
||||
if (!dn)
|
||||
return -EINVAL;
|
||||
|
||||
for_each_property_of_node(dn, pp) {
|
||||
ret = fdt_setprop(fdt, node_offset, pp->name, pp->value, pp->length);
|
||||
if (ret < 0) {
|
||||
pr_err("Unable to add %s property: %s\n", pp->name, fdt_strerror(ret));
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* update_cpus_node - Update cpus node of flattened device tree using of_root
|
||||
* device node.
|
||||
* @fdt: Flattened device tree of the kernel.
|
||||
*
|
||||
* Returns 0 on success, negative errno on error.
|
||||
*/
|
||||
static int update_cpus_node(void *fdt)
|
||||
{
|
||||
struct device_node *cpus_node, *dn;
|
||||
int cpus_offset, cpus_subnode_offset, ret = 0;
|
||||
|
||||
cpus_offset = fdt_path_offset(fdt, "/cpus");
|
||||
if (cpus_offset < 0 && cpus_offset != -FDT_ERR_NOTFOUND) {
|
||||
pr_err("Malformed device tree: error reading /cpus node: %s\n",
|
||||
fdt_strerror(cpus_offset));
|
||||
return cpus_offset;
|
||||
}
|
||||
|
||||
if (cpus_offset > 0) {
|
||||
ret = fdt_del_node(fdt, cpus_offset);
|
||||
if (ret < 0) {
|
||||
pr_err("Error deleting /cpus node: %s\n", fdt_strerror(ret));
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
/* Add cpus node to fdt */
|
||||
cpus_offset = fdt_add_subnode(fdt, fdt_path_offset(fdt, "/"), "cpus");
|
||||
if (cpus_offset < 0) {
|
||||
pr_err("Error creating /cpus node: %s\n", fdt_strerror(cpus_offset));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Add cpus node properties */
|
||||
cpus_node = of_find_node_by_path("/cpus");
|
||||
ret = add_node_props(fdt, cpus_offset, cpus_node);
|
||||
of_node_put(cpus_node);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
/* Loop through all subnodes of cpus and add them to fdt */
|
||||
for_each_node_by_type(dn, "cpu") {
|
||||
cpus_subnode_offset = fdt_add_subnode(fdt, cpus_offset, dn->full_name);
|
||||
if (cpus_subnode_offset < 0) {
|
||||
pr_err("Unable to add %s subnode: %s\n", dn->full_name,
|
||||
fdt_strerror(cpus_subnode_offset));
|
||||
ret = cpus_subnode_offset;
|
||||
goto out;
|
||||
}
|
||||
|
||||
ret = add_node_props(fdt, cpus_subnode_offset, dn);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
}
|
||||
out:
|
||||
of_node_put(dn);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* setup_new_fdt_ppc64 - Update the flattend device-tree of the kernel
|
||||
* being loaded.
|
||||
@ -1020,6 +1107,11 @@ int setup_new_fdt_ppc64(const struct kimage *image, void *fdt,
|
||||
}
|
||||
}
|
||||
|
||||
/* Update cpus nodes information to account hotplug CPUs. */
|
||||
ret = update_cpus_node(fdt);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
|
||||
/* Update memory reserve map */
|
||||
ret = get_reserved_memory_ranges(&rmem);
|
||||
if (ret)
|
||||
|
@ -5,6 +5,9 @@
|
||||
|
||||
ccflags-$(CONFIG_PPC64) := $(NO_MINIMAL_TOC)
|
||||
|
||||
CFLAGS_code-patching.o += -fno-stack-protector
|
||||
CFLAGS_feature-fixups.o += -fno-stack-protector
|
||||
|
||||
CFLAGS_REMOVE_code-patching.o = $(CC_FLAGS_FTRACE)
|
||||
CFLAGS_REMOVE_feature-fixups.o = $(CC_FLAGS_FTRACE)
|
||||
|
||||
|
@ -53,6 +53,10 @@ static DECLARE_DELAYED_WORK(arch_rng_work, arch_rng_refill_buffer);
|
||||
|
||||
bool s390_arch_random_generate(u8 *buf, unsigned int nbytes)
|
||||
{
|
||||
/* max hunk is ARCH_RNG_BUF_SIZE */
|
||||
if (nbytes > ARCH_RNG_BUF_SIZE)
|
||||
return false;
|
||||
|
||||
/* lock rng buffer */
|
||||
if (!spin_trylock(&arch_rng_lock))
|
||||
return false;
|
||||
|
@ -563,7 +563,7 @@ void show_code(struct pt_regs *regs)
|
||||
|
||||
void print_fn_code(unsigned char *code, unsigned long len)
|
||||
{
|
||||
char buffer[64], *ptr;
|
||||
char buffer[128], *ptr;
|
||||
int opsize, i;
|
||||
|
||||
while (len) {
|
||||
|
@ -1421,7 +1421,7 @@ config HIGHMEM4G
|
||||
|
||||
config HIGHMEM64G
|
||||
bool "64GB"
|
||||
depends on !M486 && !M586 && !M586TSC && !M586MMX && !MGEODE_LX && !MGEODEGX1 && !MCYRIXIII && !MELAN && !MWINCHIPC6 && !WINCHIP3D && !MK6
|
||||
depends on !M486SX && !M486 && !M586 && !M586TSC && !M586MMX && !MGEODE_LX && !MGEODEGX1 && !MCYRIXIII && !MELAN && !MWINCHIPC6 && !WINCHIP3D && !MK6
|
||||
select X86_PAE
|
||||
help
|
||||
Select this if you have a 32-bit processor and more than 4
|
||||
|
@ -40,6 +40,7 @@ REALMODE_CFLAGS += -ffreestanding
|
||||
REALMODE_CFLAGS += -fno-stack-protector
|
||||
REALMODE_CFLAGS += $(call __cc-option, $(CC), $(REALMODE_CFLAGS), -Wno-address-of-packed-member)
|
||||
REALMODE_CFLAGS += $(call __cc-option, $(CC), $(REALMODE_CFLAGS), $(cc_stack_align4))
|
||||
REALMODE_CFLAGS += $(CLANG_FLAGS)
|
||||
export REALMODE_CFLAGS
|
||||
|
||||
# BITS is used as extension for files which are available in a 32 bit
|
||||
|
@ -46,6 +46,7 @@ KBUILD_CFLAGS += -D__DISABLE_EXPORTS
|
||||
# Disable relocation relaxation in case the link is not PIE.
|
||||
KBUILD_CFLAGS += $(call as-option,-Wa$(comma)-mrelax-relocations=no)
|
||||
KBUILD_CFLAGS += -include $(srctree)/include/linux/hidden.h
|
||||
KBUILD_CFLAGS += $(CLANG_FLAGS)
|
||||
|
||||
# sev-es.c indirectly inludes inat-table.h which is generated during
|
||||
# compilation and stored in $(objtree). Add the directory to the includes so
|
||||
|
@ -23,12 +23,6 @@ SYM_FUNC_START(get_sev_encryption_bit)
|
||||
push %ecx
|
||||
push %edx
|
||||
|
||||
/* Check if running under a hypervisor */
|
||||
movl $1, %eax
|
||||
cpuid
|
||||
bt $31, %ecx /* Check the hypervisor bit */
|
||||
jnc .Lno_sev
|
||||
|
||||
movl $0x80000000, %eax /* CPUID to check the highest leaf */
|
||||
cpuid
|
||||
cmpl $0x8000001f, %eax /* See if 0x8000001f is available */
|
||||
|
@ -1847,7 +1847,7 @@ static inline void setup_getcpu(int cpu)
|
||||
unsigned long cpudata = vdso_encode_cpunode(cpu, early_cpu_to_node(cpu));
|
||||
struct desc_struct d = { };
|
||||
|
||||
if (boot_cpu_has(X86_FEATURE_RDTSCP))
|
||||
if (boot_cpu_has(X86_FEATURE_RDTSCP) || boot_cpu_has(X86_FEATURE_RDPID))
|
||||
write_rdtscp_aux(cpudata);
|
||||
|
||||
/* Store CPU and node number in limit. */
|
||||
|
@ -186,7 +186,6 @@ void __init do_vc_no_ghcb(struct pt_regs *regs, unsigned long exit_code)
|
||||
* make it accessible to the hypervisor.
|
||||
*
|
||||
* In particular, check for:
|
||||
* - Hypervisor CPUID bit
|
||||
* - Availability of CPUID leaf 0x8000001f
|
||||
* - SEV CPUID bit.
|
||||
*
|
||||
@ -194,10 +193,7 @@ void __init do_vc_no_ghcb(struct pt_regs *regs, unsigned long exit_code)
|
||||
* can't be checked here.
|
||||
*/
|
||||
|
||||
if ((fn == 1 && !(regs->cx & BIT(31))))
|
||||
/* Hypervisor bit */
|
||||
goto fail;
|
||||
else if (fn == 0x80000000 && (regs->ax < 0x8000001f))
|
||||
if (fn == 0x80000000 && (regs->ax < 0x8000001f))
|
||||
/* SEV leaf check */
|
||||
goto fail;
|
||||
else if ((fn == 0x8000001f && !(regs->ax & BIT(1))))
|
||||
|
@ -503,14 +503,10 @@ void __init sme_enable(struct boot_params *bp)
|
||||
|
||||
#define AMD_SME_BIT BIT(0)
|
||||
#define AMD_SEV_BIT BIT(1)
|
||||
/*
|
||||
* Set the feature mask (SME or SEV) based on whether we are
|
||||
* running under a hypervisor.
|
||||
*/
|
||||
eax = 1;
|
||||
ecx = 0;
|
||||
native_cpuid(&eax, &ebx, &ecx, &edx);
|
||||
feature_mask = (ecx & BIT(31)) ? AMD_SEV_BIT : AMD_SME_BIT;
|
||||
|
||||
/* Check the SEV MSR whether SEV or SME is enabled */
|
||||
sev_status = __rdmsr(MSR_AMD64_SEV);
|
||||
feature_mask = (sev_status & MSR_AMD64_SEV_ENABLED) ? AMD_SEV_BIT : AMD_SME_BIT;
|
||||
|
||||
/*
|
||||
* Check for the SME/SEV feature:
|
||||
@ -530,19 +526,26 @@ void __init sme_enable(struct boot_params *bp)
|
||||
|
||||
/* Check if memory encryption is enabled */
|
||||
if (feature_mask == AMD_SME_BIT) {
|
||||
/*
|
||||
* No SME if Hypervisor bit is set. This check is here to
|
||||
* prevent a guest from trying to enable SME. For running as a
|
||||
* KVM guest the MSR_K8_SYSCFG will be sufficient, but there
|
||||
* might be other hypervisors which emulate that MSR as non-zero
|
||||
* or even pass it through to the guest.
|
||||
* A malicious hypervisor can still trick a guest into this
|
||||
* path, but there is no way to protect against that.
|
||||
*/
|
||||
eax = 1;
|
||||
ecx = 0;
|
||||
native_cpuid(&eax, &ebx, &ecx, &edx);
|
||||
if (ecx & BIT(31))
|
||||
return;
|
||||
|
||||
/* For SME, check the SYSCFG MSR */
|
||||
msr = __rdmsr(MSR_K8_SYSCFG);
|
||||
if (!(msr & MSR_K8_SYSCFG_MEM_ENCRYPT))
|
||||
return;
|
||||
} else {
|
||||
/* For SEV, check the SEV MSR */
|
||||
msr = __rdmsr(MSR_AMD64_SEV);
|
||||
if (!(msr & MSR_AMD64_SEV_ENABLED))
|
||||
return;
|
||||
|
||||
/* Save SEV_STATUS to avoid reading MSR again */
|
||||
sev_status = msr;
|
||||
|
||||
/* SEV state cannot be controlled by a command line option */
|
||||
sme_me_mask = me_mask;
|
||||
sev_enabled = true;
|
||||
|
@ -562,7 +562,7 @@ void crypto_destroy_tfm(void *mem, struct crypto_tfm *tfm)
|
||||
{
|
||||
struct crypto_alg *alg;
|
||||
|
||||
if (unlikely(!mem))
|
||||
if (IS_ERR_OR_NULL(mem))
|
||||
return;
|
||||
|
||||
alg = tfm->__crt_alg;
|
||||
|
10
crypto/rng.c
10
crypto/rng.c
@ -34,22 +34,18 @@ int crypto_rng_reset(struct crypto_rng *tfm, const u8 *seed, unsigned int slen)
|
||||
u8 *buf = NULL;
|
||||
int err;
|
||||
|
||||
crypto_stats_get(alg);
|
||||
if (!seed && slen) {
|
||||
buf = kmalloc(slen, GFP_KERNEL);
|
||||
if (!buf) {
|
||||
crypto_alg_put(alg);
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
err = get_random_bytes_wait(buf, slen);
|
||||
if (err) {
|
||||
crypto_alg_put(alg);
|
||||
if (err)
|
||||
goto out;
|
||||
}
|
||||
seed = buf;
|
||||
}
|
||||
|
||||
crypto_stats_get(alg);
|
||||
err = crypto_rng_alg(tfm)->seed(tfm, seed, slen);
|
||||
crypto_stats_rng_seed(alg, err);
|
||||
out:
|
||||
|
@ -329,7 +329,7 @@ static int __init gtdt_import_sbsa_gwdt(struct acpi_gtdt_watchdog *wd,
|
||||
int index)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
int irq = map_gt_gsi(wd->timer_interrupt, wd->timer_flags);
|
||||
int irq;
|
||||
|
||||
/*
|
||||
* According to SBSA specification the size of refresh and control
|
||||
@ -338,7 +338,7 @@ static int __init gtdt_import_sbsa_gwdt(struct acpi_gtdt_watchdog *wd,
|
||||
struct resource res[] = {
|
||||
DEFINE_RES_MEM(wd->control_frame_address, SZ_4K),
|
||||
DEFINE_RES_MEM(wd->refresh_frame_address, SZ_4K),
|
||||
DEFINE_RES_IRQ(irq),
|
||||
{},
|
||||
};
|
||||
int nr_res = ARRAY_SIZE(res);
|
||||
|
||||
@ -348,10 +348,11 @@ static int __init gtdt_import_sbsa_gwdt(struct acpi_gtdt_watchdog *wd,
|
||||
|
||||
if (!(wd->refresh_frame_address && wd->control_frame_address)) {
|
||||
pr_err(FW_BUG "failed to get the Watchdog base address.\n");
|
||||
acpi_unregister_gsi(wd->timer_interrupt);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
irq = map_gt_gsi(wd->timer_interrupt, wd->timer_flags);
|
||||
res[2] = (struct resource)DEFINE_RES_IRQ(irq);
|
||||
if (irq <= 0) {
|
||||
pr_warn("failed to map the Watchdog interrupt.\n");
|
||||
nr_res--;
|
||||
@ -364,7 +365,8 @@ static int __init gtdt_import_sbsa_gwdt(struct acpi_gtdt_watchdog *wd,
|
||||
*/
|
||||
pdev = platform_device_register_simple("sbsa-gwdt", index, res, nr_res);
|
||||
if (IS_ERR(pdev)) {
|
||||
acpi_unregister_gsi(wd->timer_interrupt);
|
||||
if (irq > 0)
|
||||
acpi_unregister_gsi(wd->timer_interrupt);
|
||||
return PTR_ERR(pdev);
|
||||
}
|
||||
|
||||
|
@ -42,6 +42,8 @@ static ssize_t cm_write(struct file *file, const char __user * user_buf,
|
||||
sizeof(struct acpi_table_header)))
|
||||
return -EFAULT;
|
||||
uncopied_bytes = max_size = table.length;
|
||||
/* make sure the buf is not allocated */
|
||||
kfree(buf);
|
||||
buf = kzalloc(max_size, GFP_KERNEL);
|
||||
if (!buf)
|
||||
return -ENOMEM;
|
||||
@ -55,6 +57,7 @@ static ssize_t cm_write(struct file *file, const char __user * user_buf,
|
||||
(*ppos + count < count) ||
|
||||
(count > uncopied_bytes)) {
|
||||
kfree(buf);
|
||||
buf = NULL;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@ -76,7 +79,6 @@ static ssize_t cm_write(struct file *file, const char __user * user_buf,
|
||||
add_taint(TAINT_OVERRIDDEN_ACPI_TABLE, LOCKDEP_NOW_UNRELIABLE);
|
||||
}
|
||||
|
||||
kfree(buf);
|
||||
return count;
|
||||
}
|
||||
|
||||
|
@ -1772,6 +1772,11 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
hpriv->flags |= AHCI_HFLAG_NO_DEVSLP;
|
||||
|
||||
#ifdef CONFIG_ARM64
|
||||
if (pdev->vendor == PCI_VENDOR_ID_HUAWEI &&
|
||||
pdev->device == 0xa235 &&
|
||||
pdev->revision < 0x30)
|
||||
hpriv->flags |= AHCI_HFLAG_NO_SXS;
|
||||
|
||||
if (pdev->vendor == 0x177d && pdev->device == 0xa01c)
|
||||
hpriv->irq_handler = ahci_thunderx_irq_handler;
|
||||
#endif
|
||||
|
@ -242,6 +242,7 @@ enum {
|
||||
suspend/resume */
|
||||
AHCI_HFLAG_IGN_NOTSUPP_POWER_ON = (1 << 27), /* ignore -EOPNOTSUPP
|
||||
from phy_power_on() */
|
||||
AHCI_HFLAG_NO_SXS = (1 << 28), /* SXS not supported */
|
||||
|
||||
/* ap->flags bits */
|
||||
|
||||
|
@ -493,6 +493,11 @@ void ahci_save_initial_config(struct device *dev, struct ahci_host_priv *hpriv)
|
||||
cap |= HOST_CAP_ALPM;
|
||||
}
|
||||
|
||||
if ((cap & HOST_CAP_SXS) && (hpriv->flags & AHCI_HFLAG_NO_SXS)) {
|
||||
dev_info(dev, "controller does not support SXS, disabling CAP_SXS\n");
|
||||
cap &= ~HOST_CAP_SXS;
|
||||
}
|
||||
|
||||
if (hpriv->force_port_map && port_map != hpriv->force_port_map) {
|
||||
dev_info(dev, "forcing port_map 0x%x -> 0x%x\n",
|
||||
port_map, hpriv->force_port_map);
|
||||
|
@ -433,10 +433,14 @@ void rnbd_clt_remove_dev_symlink(struct rnbd_clt_dev *dev)
|
||||
* i.e. rnbd_clt_unmap_dev_store() leading to a sysfs warning because
|
||||
* of sysfs link already was removed already.
|
||||
*/
|
||||
if (dev->blk_symlink_name && try_module_get(THIS_MODULE)) {
|
||||
sysfs_remove_link(rnbd_devs_kobj, dev->blk_symlink_name);
|
||||
if (dev->blk_symlink_name) {
|
||||
if (try_module_get(THIS_MODULE)) {
|
||||
sysfs_remove_link(rnbd_devs_kobj, dev->blk_symlink_name);
|
||||
module_put(THIS_MODULE);
|
||||
}
|
||||
/* It should be freed always. */
|
||||
kfree(dev->blk_symlink_name);
|
||||
module_put(THIS_MODULE);
|
||||
dev->blk_symlink_name = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -544,6 +544,7 @@ void mhi_deinit_chan_ctxt(struct mhi_controller *mhi_cntrl,
|
||||
struct mhi_ring *buf_ring;
|
||||
struct mhi_ring *tre_ring;
|
||||
struct mhi_chan_ctxt *chan_ctxt;
|
||||
u32 tmp;
|
||||
|
||||
buf_ring = &mhi_chan->buf_ring;
|
||||
tre_ring = &mhi_chan->tre_ring;
|
||||
@ -554,7 +555,19 @@ void mhi_deinit_chan_ctxt(struct mhi_controller *mhi_cntrl,
|
||||
vfree(buf_ring->base);
|
||||
|
||||
buf_ring->base = tre_ring->base = NULL;
|
||||
tre_ring->ctxt_wp = NULL;
|
||||
chan_ctxt->rbase = 0;
|
||||
chan_ctxt->rlen = 0;
|
||||
chan_ctxt->rp = 0;
|
||||
chan_ctxt->wp = 0;
|
||||
|
||||
tmp = chan_ctxt->chcfg;
|
||||
tmp &= ~CHAN_CTX_CHSTATE_MASK;
|
||||
tmp |= (MHI_CH_STATE_DISABLED << CHAN_CTX_CHSTATE_SHIFT);
|
||||
chan_ctxt->chcfg = tmp;
|
||||
|
||||
/* Update to all cores */
|
||||
smp_wmb();
|
||||
}
|
||||
|
||||
int mhi_init_chan_ctxt(struct mhi_controller *mhi_cntrl,
|
||||
@ -1267,7 +1280,8 @@ static int mhi_driver_remove(struct device *dev)
|
||||
|
||||
mutex_lock(&mhi_chan->mutex);
|
||||
|
||||
if (ch_state[dir] == MHI_CH_STATE_ENABLED &&
|
||||
if ((ch_state[dir] == MHI_CH_STATE_ENABLED ||
|
||||
ch_state[dir] == MHI_CH_STATE_STOP) &&
|
||||
!mhi_chan->offload_ch)
|
||||
mhi_deinit_chan_ctxt(mhi_cntrl, mhi_chan);
|
||||
|
||||
|
@ -220,10 +220,17 @@ static void mhi_del_ring_element(struct mhi_controller *mhi_cntrl,
|
||||
smp_wmb();
|
||||
}
|
||||
|
||||
static bool is_valid_ring_ptr(struct mhi_ring *ring, dma_addr_t addr)
|
||||
{
|
||||
return addr >= ring->iommu_base && addr < ring->iommu_base + ring->len;
|
||||
}
|
||||
|
||||
int mhi_destroy_device(struct device *dev, void *data)
|
||||
{
|
||||
struct mhi_chan *ul_chan, *dl_chan;
|
||||
struct mhi_device *mhi_dev;
|
||||
struct mhi_controller *mhi_cntrl;
|
||||
enum mhi_ee_type ee = MHI_EE_MAX;
|
||||
|
||||
if (dev->bus != &mhi_bus_type)
|
||||
return 0;
|
||||
@ -235,6 +242,17 @@ int mhi_destroy_device(struct device *dev, void *data)
|
||||
if (mhi_dev->dev_type == MHI_DEVICE_CONTROLLER)
|
||||
return 0;
|
||||
|
||||
ul_chan = mhi_dev->ul_chan;
|
||||
dl_chan = mhi_dev->dl_chan;
|
||||
|
||||
/*
|
||||
* If execution environment is specified, remove only those devices that
|
||||
* started in them based on ee_mask for the channels as we move on to a
|
||||
* different execution environment
|
||||
*/
|
||||
if (data)
|
||||
ee = *(enum mhi_ee_type *)data;
|
||||
|
||||
/*
|
||||
* For the suspend and resume case, this function will get called
|
||||
* without mhi_unregister_controller(). Hence, we need to drop the
|
||||
@ -242,11 +260,19 @@ int mhi_destroy_device(struct device *dev, void *data)
|
||||
* be sure that there will be no instances of mhi_dev left after
|
||||
* this.
|
||||
*/
|
||||
if (mhi_dev->ul_chan)
|
||||
put_device(&mhi_dev->ul_chan->mhi_dev->dev);
|
||||
if (ul_chan) {
|
||||
if (ee != MHI_EE_MAX && !(ul_chan->ee_mask & BIT(ee)))
|
||||
return 0;
|
||||
|
||||
if (mhi_dev->dl_chan)
|
||||
put_device(&mhi_dev->dl_chan->mhi_dev->dev);
|
||||
put_device(&ul_chan->mhi_dev->dev);
|
||||
}
|
||||
|
||||
if (dl_chan) {
|
||||
if (ee != MHI_EE_MAX && !(dl_chan->ee_mask & BIT(ee)))
|
||||
return 0;
|
||||
|
||||
put_device(&dl_chan->mhi_dev->dev);
|
||||
}
|
||||
|
||||
dev_dbg(&mhi_cntrl->mhi_dev->dev, "destroy device for chan:%s\n",
|
||||
mhi_dev->name);
|
||||
@ -349,7 +375,16 @@ irqreturn_t mhi_irq_handler(int irq_number, void *dev)
|
||||
struct mhi_event_ctxt *er_ctxt =
|
||||
&mhi_cntrl->mhi_ctxt->er_ctxt[mhi_event->er_index];
|
||||
struct mhi_ring *ev_ring = &mhi_event->ring;
|
||||
void *dev_rp = mhi_to_virtual(ev_ring, er_ctxt->rp);
|
||||
dma_addr_t ptr = er_ctxt->rp;
|
||||
void *dev_rp;
|
||||
|
||||
if (!is_valid_ring_ptr(ev_ring, ptr)) {
|
||||
dev_err(&mhi_cntrl->mhi_dev->dev,
|
||||
"Event ring rp points outside of the event ring\n");
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
dev_rp = mhi_to_virtual(ev_ring, ptr);
|
||||
|
||||
/* Only proceed if event ring has pending events */
|
||||
if (ev_ring->rp == dev_rp)
|
||||
@ -498,6 +533,11 @@ static int parse_xfer_event(struct mhi_controller *mhi_cntrl,
|
||||
struct mhi_buf_info *buf_info;
|
||||
u16 xfer_len;
|
||||
|
||||
if (!is_valid_ring_ptr(tre_ring, ptr)) {
|
||||
dev_err(&mhi_cntrl->mhi_dev->dev,
|
||||
"Event element points outside of the tre ring\n");
|
||||
break;
|
||||
}
|
||||
/* Get the TRB this event points to */
|
||||
ev_tre = mhi_to_virtual(tre_ring, ptr);
|
||||
|
||||
@ -657,6 +697,12 @@ static void mhi_process_cmd_completion(struct mhi_controller *mhi_cntrl,
|
||||
struct mhi_chan *mhi_chan;
|
||||
u32 chan;
|
||||
|
||||
if (!is_valid_ring_ptr(mhi_ring, ptr)) {
|
||||
dev_err(&mhi_cntrl->mhi_dev->dev,
|
||||
"Event element points outside of the cmd ring\n");
|
||||
return;
|
||||
}
|
||||
|
||||
cmd_pkt = mhi_to_virtual(mhi_ring, ptr);
|
||||
|
||||
chan = MHI_TRE_GET_CMD_CHID(cmd_pkt);
|
||||
@ -681,6 +727,7 @@ int mhi_process_ctrl_ev_ring(struct mhi_controller *mhi_cntrl,
|
||||
struct device *dev = &mhi_cntrl->mhi_dev->dev;
|
||||
u32 chan;
|
||||
int count = 0;
|
||||
dma_addr_t ptr = er_ctxt->rp;
|
||||
|
||||
/*
|
||||
* This is a quick check to avoid unnecessary event processing
|
||||
@ -690,7 +737,13 @@ int mhi_process_ctrl_ev_ring(struct mhi_controller *mhi_cntrl,
|
||||
if (unlikely(MHI_EVENT_ACCESS_INVALID(mhi_cntrl->pm_state)))
|
||||
return -EIO;
|
||||
|
||||
dev_rp = mhi_to_virtual(ev_ring, er_ctxt->rp);
|
||||
if (!is_valid_ring_ptr(ev_ring, ptr)) {
|
||||
dev_err(&mhi_cntrl->mhi_dev->dev,
|
||||
"Event ring rp points outside of the event ring\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
dev_rp = mhi_to_virtual(ev_ring, ptr);
|
||||
local_rp = ev_ring->rp;
|
||||
|
||||
while (dev_rp != local_rp) {
|
||||
@ -801,6 +854,8 @@ int mhi_process_ctrl_ev_ring(struct mhi_controller *mhi_cntrl,
|
||||
*/
|
||||
if (chan < mhi_cntrl->max_chan) {
|
||||
mhi_chan = &mhi_cntrl->mhi_chan[chan];
|
||||
if (!mhi_chan->configured)
|
||||
break;
|
||||
parse_xfer_event(mhi_cntrl, local_rp, mhi_chan);
|
||||
event_quota--;
|
||||
}
|
||||
@ -812,7 +867,15 @@ int mhi_process_ctrl_ev_ring(struct mhi_controller *mhi_cntrl,
|
||||
|
||||
mhi_recycle_ev_ring_element(mhi_cntrl, ev_ring);
|
||||
local_rp = ev_ring->rp;
|
||||
dev_rp = mhi_to_virtual(ev_ring, er_ctxt->rp);
|
||||
|
||||
ptr = er_ctxt->rp;
|
||||
if (!is_valid_ring_ptr(ev_ring, ptr)) {
|
||||
dev_err(&mhi_cntrl->mhi_dev->dev,
|
||||
"Event ring rp points outside of the event ring\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
dev_rp = mhi_to_virtual(ev_ring, ptr);
|
||||
count++;
|
||||
}
|
||||
|
||||
@ -835,11 +898,18 @@ int mhi_process_data_event_ring(struct mhi_controller *mhi_cntrl,
|
||||
int count = 0;
|
||||
u32 chan;
|
||||
struct mhi_chan *mhi_chan;
|
||||
dma_addr_t ptr = er_ctxt->rp;
|
||||
|
||||
if (unlikely(MHI_EVENT_ACCESS_INVALID(mhi_cntrl->pm_state)))
|
||||
return -EIO;
|
||||
|
||||
dev_rp = mhi_to_virtual(ev_ring, er_ctxt->rp);
|
||||
if (!is_valid_ring_ptr(ev_ring, ptr)) {
|
||||
dev_err(&mhi_cntrl->mhi_dev->dev,
|
||||
"Event ring rp points outside of the event ring\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
dev_rp = mhi_to_virtual(ev_ring, ptr);
|
||||
local_rp = ev_ring->rp;
|
||||
|
||||
while (dev_rp != local_rp && event_quota > 0) {
|
||||
@ -853,7 +923,8 @@ int mhi_process_data_event_ring(struct mhi_controller *mhi_cntrl,
|
||||
* Only process the event ring elements whose channel
|
||||
* ID is within the maximum supported range.
|
||||
*/
|
||||
if (chan < mhi_cntrl->max_chan) {
|
||||
if (chan < mhi_cntrl->max_chan &&
|
||||
mhi_cntrl->mhi_chan[chan].configured) {
|
||||
mhi_chan = &mhi_cntrl->mhi_chan[chan];
|
||||
|
||||
if (likely(type == MHI_PKT_TYPE_TX_EVENT)) {
|
||||
@ -867,7 +938,15 @@ int mhi_process_data_event_ring(struct mhi_controller *mhi_cntrl,
|
||||
|
||||
mhi_recycle_ev_ring_element(mhi_cntrl, ev_ring);
|
||||
local_rp = ev_ring->rp;
|
||||
dev_rp = mhi_to_virtual(ev_ring, er_ctxt->rp);
|
||||
|
||||
ptr = er_ctxt->rp;
|
||||
if (!is_valid_ring_ptr(ev_ring, ptr)) {
|
||||
dev_err(&mhi_cntrl->mhi_dev->dev,
|
||||
"Event ring rp points outside of the event ring\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
dev_rp = mhi_to_virtual(ev_ring, ptr);
|
||||
count++;
|
||||
}
|
||||
read_lock_bh(&mhi_cntrl->pm_lock);
|
||||
@ -1394,6 +1473,7 @@ static void mhi_mark_stale_events(struct mhi_controller *mhi_cntrl,
|
||||
struct mhi_ring *ev_ring;
|
||||
struct device *dev = &mhi_cntrl->mhi_dev->dev;
|
||||
unsigned long flags;
|
||||
dma_addr_t ptr;
|
||||
|
||||
dev_dbg(dev, "Marking all events for chan: %d as stale\n", chan);
|
||||
|
||||
@ -1401,7 +1481,15 @@ static void mhi_mark_stale_events(struct mhi_controller *mhi_cntrl,
|
||||
|
||||
/* mark all stale events related to channel as STALE event */
|
||||
spin_lock_irqsave(&mhi_event->lock, flags);
|
||||
dev_rp = mhi_to_virtual(ev_ring, er_ctxt->rp);
|
||||
|
||||
ptr = er_ctxt->rp;
|
||||
if (!is_valid_ring_ptr(ev_ring, ptr)) {
|
||||
dev_err(&mhi_cntrl->mhi_dev->dev,
|
||||
"Event ring rp points outside of the event ring\n");
|
||||
dev_rp = ev_ring->rp;
|
||||
} else {
|
||||
dev_rp = mhi_to_virtual(ev_ring, ptr);
|
||||
}
|
||||
|
||||
local_rp = ev_ring->rp;
|
||||
while (dev_rp != local_rp) {
|
||||
|
@ -376,6 +376,7 @@ static int mhi_pm_mission_mode_transition(struct mhi_controller *mhi_cntrl)
|
||||
{
|
||||
struct mhi_event *mhi_event;
|
||||
struct device *dev = &mhi_cntrl->mhi_dev->dev;
|
||||
enum mhi_ee_type current_ee = mhi_cntrl->ee;
|
||||
int i, ret;
|
||||
|
||||
dev_dbg(dev, "Processing Mission Mode transition\n");
|
||||
@ -390,6 +391,8 @@ static int mhi_pm_mission_mode_transition(struct mhi_controller *mhi_cntrl)
|
||||
|
||||
wake_up_all(&mhi_cntrl->state_event);
|
||||
|
||||
device_for_each_child(&mhi_cntrl->mhi_dev->dev, ¤t_ee,
|
||||
mhi_destroy_device);
|
||||
mhi_cntrl->status_cb(mhi_cntrl, MHI_CB_EE_MISSION_MODE);
|
||||
|
||||
/* Force MHI to be in M0 state before continuing */
|
||||
@ -992,7 +995,7 @@ int mhi_async_power_up(struct mhi_controller *mhi_cntrl)
|
||||
&val) ||
|
||||
!val,
|
||||
msecs_to_jiffies(mhi_cntrl->timeout_ms));
|
||||
if (ret) {
|
||||
if (!ret) {
|
||||
ret = -EIO;
|
||||
dev_info(dev, "Failed to reset MHI due to syserr state\n");
|
||||
goto error_bhi_offset;
|
||||
|
@ -635,6 +635,51 @@ static int sysc_parse_and_check_child_range(struct sysc *ddata)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Interconnect instances to probe before l4_per instances */
|
||||
static struct resource early_bus_ranges[] = {
|
||||
/* am3/4 l4_wkup */
|
||||
{ .start = 0x44c00000, .end = 0x44c00000 + 0x300000, },
|
||||
/* omap4/5 and dra7 l4_cfg */
|
||||
{ .start = 0x4a000000, .end = 0x4a000000 + 0x300000, },
|
||||
/* omap4 l4_wkup */
|
||||
{ .start = 0x4a300000, .end = 0x4a300000 + 0x30000, },
|
||||
/* omap5 and dra7 l4_wkup without dra7 dcan segment */
|
||||
{ .start = 0x4ae00000, .end = 0x4ae00000 + 0x30000, },
|
||||
};
|
||||
|
||||
static atomic_t sysc_defer = ATOMIC_INIT(10);
|
||||
|
||||
/**
|
||||
* sysc_defer_non_critical - defer non_critical interconnect probing
|
||||
* @ddata: device driver data
|
||||
*
|
||||
* We want to probe l4_cfg and l4_wkup interconnect instances before any
|
||||
* l4_per instances as l4_per instances depend on resources on l4_cfg and
|
||||
* l4_wkup interconnects.
|
||||
*/
|
||||
static int sysc_defer_non_critical(struct sysc *ddata)
|
||||
{
|
||||
struct resource *res;
|
||||
int i;
|
||||
|
||||
if (!atomic_read(&sysc_defer))
|
||||
return 0;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(early_bus_ranges); i++) {
|
||||
res = &early_bus_ranges[i];
|
||||
if (ddata->module_pa >= res->start &&
|
||||
ddata->module_pa <= res->end) {
|
||||
atomic_set(&sysc_defer, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
atomic_dec_if_positive(&sysc_defer);
|
||||
|
||||
return -EPROBE_DEFER;
|
||||
}
|
||||
|
||||
static struct device_node *stdout_path;
|
||||
|
||||
static void sysc_init_stdout_path(struct sysc *ddata)
|
||||
@ -859,6 +904,10 @@ static int sysc_map_and_check_registers(struct sysc *ddata)
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
error = sysc_defer_non_critical(ddata);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
sysc_check_children(ddata);
|
||||
|
||||
error = sysc_parse_registers(ddata);
|
||||
|
@ -819,7 +819,7 @@ static bool __init crng_init_try_arch_early(struct crng_state *crng)
|
||||
|
||||
static void __maybe_unused crng_initialize_secondary(struct crng_state *crng)
|
||||
{
|
||||
memcpy(&crng->state[0], "expand 32-byte k", 16);
|
||||
chacha_init_consts(crng->state);
|
||||
_get_random_bytes(&crng->state[4], sizeof(__u32) * 12);
|
||||
crng_init_try_arch(crng);
|
||||
crng->init_time = jiffies - CRNG_RESEED_INTERVAL - 1;
|
||||
@ -827,7 +827,7 @@ static void __maybe_unused crng_initialize_secondary(struct crng_state *crng)
|
||||
|
||||
static void __init crng_initialize_primary(struct crng_state *crng)
|
||||
{
|
||||
memcpy(&crng->state[0], "expand 32-byte k", 16);
|
||||
chacha_init_consts(crng->state);
|
||||
_extract_entropy(&input_pool, &crng->state[4], sizeof(__u32) * 12, 0);
|
||||
if (crng_init_try_arch_early(crng) && trust_cpu) {
|
||||
invalidate_batched_entropy();
|
||||
|
@ -41,6 +41,27 @@ struct acpi_tcpa {
|
||||
};
|
||||
};
|
||||
|
||||
/* Check that the given log is indeed a TPM2 log. */
|
||||
static bool tpm_is_tpm2_log(void *bios_event_log, u64 len)
|
||||
{
|
||||
struct tcg_efi_specid_event_head *efispecid;
|
||||
struct tcg_pcr_event *event_header;
|
||||
int n;
|
||||
|
||||
if (len < sizeof(*event_header))
|
||||
return false;
|
||||
len -= sizeof(*event_header);
|
||||
event_header = bios_event_log;
|
||||
|
||||
if (len < sizeof(*efispecid))
|
||||
return false;
|
||||
efispecid = (struct tcg_efi_specid_event_head *)event_header->event;
|
||||
|
||||
n = memcmp(efispecid->signature, TCG_SPECID_SIG,
|
||||
sizeof(TCG_SPECID_SIG));
|
||||
return n == 0;
|
||||
}
|
||||
|
||||
/* read binary bios log */
|
||||
int tpm_read_log_acpi(struct tpm_chip *chip)
|
||||
{
|
||||
@ -52,6 +73,7 @@ int tpm_read_log_acpi(struct tpm_chip *chip)
|
||||
struct acpi_table_tpm2 *tbl;
|
||||
struct acpi_tpm2_phy *tpm2_phy;
|
||||
int format;
|
||||
int ret;
|
||||
|
||||
log = &chip->log;
|
||||
|
||||
@ -112,6 +134,7 @@ int tpm_read_log_acpi(struct tpm_chip *chip)
|
||||
|
||||
log->bios_event_log_end = log->bios_event_log + len;
|
||||
|
||||
ret = -EIO;
|
||||
virt = acpi_os_map_iomem(start, len);
|
||||
if (!virt)
|
||||
goto err;
|
||||
@ -119,11 +142,19 @@ int tpm_read_log_acpi(struct tpm_chip *chip)
|
||||
memcpy_fromio(log->bios_event_log, virt, len);
|
||||
|
||||
acpi_os_unmap_iomem(virt, len);
|
||||
|
||||
if (chip->flags & TPM_CHIP_FLAG_TPM2 &&
|
||||
!tpm_is_tpm2_log(log->bios_event_log, len)) {
|
||||
/* try EFI log next */
|
||||
ret = -ENODEV;
|
||||
goto err;
|
||||
}
|
||||
|
||||
return format;
|
||||
|
||||
err:
|
||||
kfree(log->bios_event_log);
|
||||
log->bios_event_log = NULL;
|
||||
return -EIO;
|
||||
return ret;
|
||||
|
||||
}
|
||||
|
@ -107,6 +107,9 @@ void tpm_bios_log_setup(struct tpm_chip *chip)
|
||||
int log_version;
|
||||
int rc = 0;
|
||||
|
||||
if (chip->flags & TPM_CHIP_FLAG_VIRTUAL)
|
||||
return;
|
||||
|
||||
rc = tpm_read_log(chip);
|
||||
if (rc < 0)
|
||||
return;
|
||||
|
@ -17,6 +17,7 @@ int tpm_read_log_efi(struct tpm_chip *chip)
|
||||
{
|
||||
|
||||
struct efi_tcg2_final_events_table *final_tbl = NULL;
|
||||
int final_events_log_size = efi_tpm_final_log_size;
|
||||
struct linux_efi_tpm_eventlog *log_tbl;
|
||||
struct tpm_bios_log *log;
|
||||
u32 log_size;
|
||||
@ -66,12 +67,12 @@ int tpm_read_log_efi(struct tpm_chip *chip)
|
||||
ret = tpm_log_version;
|
||||
|
||||
if (efi.tpm_final_log == EFI_INVALID_TABLE_ADDR ||
|
||||
efi_tpm_final_log_size == 0 ||
|
||||
final_events_log_size == 0 ||
|
||||
tpm_log_version != EFI_TCG2_EVENT_LOG_FORMAT_TCG_2)
|
||||
goto out;
|
||||
|
||||
final_tbl = memremap(efi.tpm_final_log,
|
||||
sizeof(*final_tbl) + efi_tpm_final_log_size,
|
||||
sizeof(*final_tbl) + final_events_log_size,
|
||||
MEMREMAP_WB);
|
||||
if (!final_tbl) {
|
||||
pr_err("Could not map UEFI TPM final log\n");
|
||||
@ -80,10 +81,18 @@ int tpm_read_log_efi(struct tpm_chip *chip)
|
||||
goto out;
|
||||
}
|
||||
|
||||
efi_tpm_final_log_size -= log_tbl->final_events_preboot_size;
|
||||
/*
|
||||
* The 'final events log' size excludes the 'final events preboot log'
|
||||
* at its beginning.
|
||||
*/
|
||||
final_events_log_size -= log_tbl->final_events_preboot_size;
|
||||
|
||||
/*
|
||||
* Allocate memory for the 'combined log' where we will append the
|
||||
* 'final events log' to.
|
||||
*/
|
||||
tmp = krealloc(log->bios_event_log,
|
||||
log_size + efi_tpm_final_log_size,
|
||||
log_size + final_events_log_size,
|
||||
GFP_KERNEL);
|
||||
if (!tmp) {
|
||||
kfree(log->bios_event_log);
|
||||
@ -94,15 +103,19 @@ int tpm_read_log_efi(struct tpm_chip *chip)
|
||||
log->bios_event_log = tmp;
|
||||
|
||||
/*
|
||||
* Copy any of the final events log that didn't also end up in the
|
||||
* main log. Events can be logged in both if events are generated
|
||||
* Append any of the 'final events log' that didn't also end up in the
|
||||
* 'main log'. Events can be logged in both if events are generated
|
||||
* between GetEventLog() and ExitBootServices().
|
||||
*/
|
||||
memcpy((void *)log->bios_event_log + log_size,
|
||||
final_tbl->events + log_tbl->final_events_preboot_size,
|
||||
efi_tpm_final_log_size);
|
||||
final_events_log_size);
|
||||
/*
|
||||
* The size of the 'combined log' is the size of the 'main log' plus
|
||||
* the size of the 'final events log'.
|
||||
*/
|
||||
log->bios_event_log_end = log->bios_event_log +
|
||||
log_size + efi_tpm_final_log_size;
|
||||
log_size + final_events_log_size;
|
||||
|
||||
out:
|
||||
memunmap(final_tbl);
|
||||
|
@ -146,6 +146,7 @@ static void __init __socfpga_gate_init(struct device_node *node,
|
||||
if (IS_ERR(socfpga_clk->sys_mgr_base_addr)) {
|
||||
pr_err("%s: failed to find altr,sys-mgr regmap!\n",
|
||||
__func__);
|
||||
kfree(socfpga_clk);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -135,13 +135,13 @@ static int tegra_cpuidle_c7_enter(void)
|
||||
{
|
||||
int err;
|
||||
|
||||
if (tegra_cpuidle_using_firmware()) {
|
||||
err = call_firmware_op(prepare_idle, TF_PM_MODE_LP2_NOFLUSH_L2);
|
||||
if (err)
|
||||
return err;
|
||||
err = call_firmware_op(prepare_idle, TF_PM_MODE_LP2_NOFLUSH_L2);
|
||||
if (err && err != -ENOSYS)
|
||||
return err;
|
||||
|
||||
return call_firmware_op(do_idle, 0);
|
||||
}
|
||||
err = call_firmware_op(do_idle, 0);
|
||||
if (err != -ENOSYS)
|
||||
return err;
|
||||
|
||||
return cpu_suspend(0, tegra30_pm_secondary_cpu_suspend);
|
||||
}
|
||||
|
@ -932,7 +932,7 @@ static int sun8i_ce_probe(struct platform_device *pdev)
|
||||
if (err)
|
||||
goto error_alg;
|
||||
|
||||
err = pm_runtime_get_sync(ce->dev);
|
||||
err = pm_runtime_resume_and_get(ce->dev);
|
||||
if (err < 0)
|
||||
goto error_alg;
|
||||
|
||||
|
@ -351,7 +351,7 @@ int sun8i_ss_cipher_init(struct crypto_tfm *tfm)
|
||||
op->enginectx.op.prepare_request = NULL;
|
||||
op->enginectx.op.unprepare_request = NULL;
|
||||
|
||||
err = pm_runtime_get_sync(op->ss->dev);
|
||||
err = pm_runtime_resume_and_get(op->ss->dev);
|
||||
if (err < 0) {
|
||||
dev_err(op->ss->dev, "pm error %d\n", err);
|
||||
goto error_pm;
|
||||
|
@ -753,7 +753,7 @@ static int sun8i_ss_probe(struct platform_device *pdev)
|
||||
if (err)
|
||||
goto error_alg;
|
||||
|
||||
err = pm_runtime_get_sync(ss->dev);
|
||||
err = pm_runtime_resume_and_get(ss->dev);
|
||||
if (err < 0)
|
||||
goto error_alg;
|
||||
|
||||
|
@ -544,7 +544,7 @@ static int sec_skcipher_init(struct crypto_skcipher *tfm)
|
||||
crypto_skcipher_set_reqsize(tfm, sizeof(struct sec_req));
|
||||
ctx->c_ctx.ivsize = crypto_skcipher_ivsize(tfm);
|
||||
if (ctx->c_ctx.ivsize > SEC_IV_SIZE) {
|
||||
dev_err(SEC_CTX_DEV(ctx), "get error skcipher iv size!\n");
|
||||
pr_err("get error skcipher iv size!\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -103,7 +103,7 @@ static int omap_aes_hw_init(struct omap_aes_dev *dd)
|
||||
dd->err = 0;
|
||||
}
|
||||
|
||||
err = pm_runtime_get_sync(dd->dev);
|
||||
err = pm_runtime_resume_and_get(dd->dev);
|
||||
if (err < 0) {
|
||||
dev_err(dd->dev, "failed to get sync: %d\n", err);
|
||||
return err;
|
||||
@ -1133,7 +1133,7 @@ static int omap_aes_probe(struct platform_device *pdev)
|
||||
pm_runtime_set_autosuspend_delay(dev, DEFAULT_AUTOSUSPEND_DELAY);
|
||||
|
||||
pm_runtime_enable(dev);
|
||||
err = pm_runtime_get_sync(dev);
|
||||
err = pm_runtime_resume_and_get(dev);
|
||||
if (err < 0) {
|
||||
dev_err(dev, "%s: failed to get_sync(%d)\n",
|
||||
__func__, err);
|
||||
@ -1302,7 +1302,7 @@ static int omap_aes_suspend(struct device *dev)
|
||||
|
||||
static int omap_aes_resume(struct device *dev)
|
||||
{
|
||||
pm_runtime_get_sync(dev);
|
||||
pm_runtime_resume_and_get(dev);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
@ -671,7 +671,7 @@ static int qat_alg_sgl_to_bufl(struct qat_crypto_instance *inst,
|
||||
struct qat_alg_buf_list *bufl;
|
||||
struct qat_alg_buf_list *buflout = NULL;
|
||||
dma_addr_t blp;
|
||||
dma_addr_t bloutp = 0;
|
||||
dma_addr_t bloutp;
|
||||
struct scatterlist *sg;
|
||||
size_t sz_out, sz = struct_size(bufl, bufers, n + 1);
|
||||
|
||||
@ -683,6 +683,9 @@ static int qat_alg_sgl_to_bufl(struct qat_crypto_instance *inst,
|
||||
if (unlikely(!bufl))
|
||||
return -ENOMEM;
|
||||
|
||||
for_each_sg(sgl, sg, n, i)
|
||||
bufl->bufers[i].addr = DMA_MAPPING_ERROR;
|
||||
|
||||
blp = dma_map_single(dev, bufl, sz, DMA_TO_DEVICE);
|
||||
if (unlikely(dma_mapping_error(dev, blp)))
|
||||
goto err_in;
|
||||
@ -716,10 +719,14 @@ static int qat_alg_sgl_to_bufl(struct qat_crypto_instance *inst,
|
||||
dev_to_node(&GET_DEV(inst->accel_dev)));
|
||||
if (unlikely(!buflout))
|
||||
goto err_in;
|
||||
|
||||
bufers = buflout->bufers;
|
||||
for_each_sg(sglout, sg, n, i)
|
||||
bufers[i].addr = DMA_MAPPING_ERROR;
|
||||
|
||||
bloutp = dma_map_single(dev, buflout, sz_out, DMA_TO_DEVICE);
|
||||
if (unlikely(dma_mapping_error(dev, bloutp)))
|
||||
goto err_out;
|
||||
bufers = buflout->bufers;
|
||||
for_each_sg(sglout, sg, n, i) {
|
||||
int y = sg_nctr;
|
||||
|
||||
|
@ -2345,7 +2345,7 @@ static int sa_ul_probe(struct platform_device *pdev)
|
||||
dev_set_drvdata(sa_k3_dev, dev_data);
|
||||
|
||||
pm_runtime_enable(dev);
|
||||
ret = pm_runtime_get_sync(dev);
|
||||
ret = pm_runtime_resume_and_get(dev);
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev, "%s: failed to get sync: %d\n", __func__,
|
||||
ret);
|
||||
|
@ -542,7 +542,7 @@ static int stm32_cryp_hw_init(struct stm32_cryp *cryp)
|
||||
int ret;
|
||||
u32 cfg, hw_mode;
|
||||
|
||||
pm_runtime_get_sync(cryp->dev);
|
||||
pm_runtime_resume_and_get(cryp->dev);
|
||||
|
||||
/* Disable interrupt */
|
||||
stm32_cryp_write(cryp, CRYP_IMSCR, 0);
|
||||
@ -2043,7 +2043,7 @@ static int stm32_cryp_remove(struct platform_device *pdev)
|
||||
if (!cryp)
|
||||
return -ENODEV;
|
||||
|
||||
ret = pm_runtime_get_sync(cryp->dev);
|
||||
ret = pm_runtime_resume_and_get(cryp->dev);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
@ -812,7 +812,7 @@ static void stm32_hash_finish_req(struct ahash_request *req, int err)
|
||||
static int stm32_hash_hw_init(struct stm32_hash_dev *hdev,
|
||||
struct stm32_hash_request_ctx *rctx)
|
||||
{
|
||||
pm_runtime_get_sync(hdev->dev);
|
||||
pm_runtime_resume_and_get(hdev->dev);
|
||||
|
||||
if (!(HASH_FLAGS_INIT & hdev->flags)) {
|
||||
stm32_hash_write(hdev, HASH_CR, HASH_CR_INIT);
|
||||
@ -961,7 +961,7 @@ static int stm32_hash_export(struct ahash_request *req, void *out)
|
||||
u32 *preg;
|
||||
unsigned int i;
|
||||
|
||||
pm_runtime_get_sync(hdev->dev);
|
||||
pm_runtime_resume_and_get(hdev->dev);
|
||||
|
||||
while ((stm32_hash_read(hdev, HASH_SR) & HASH_SR_BUSY))
|
||||
cpu_relax();
|
||||
@ -999,7 +999,7 @@ static int stm32_hash_import(struct ahash_request *req, const void *in)
|
||||
|
||||
preg = rctx->hw_context;
|
||||
|
||||
pm_runtime_get_sync(hdev->dev);
|
||||
pm_runtime_resume_and_get(hdev->dev);
|
||||
|
||||
stm32_hash_write(hdev, HASH_IMR, *preg++);
|
||||
stm32_hash_write(hdev, HASH_STR, *preg++);
|
||||
@ -1565,7 +1565,7 @@ static int stm32_hash_remove(struct platform_device *pdev)
|
||||
if (!hdev)
|
||||
return -ENODEV;
|
||||
|
||||
ret = pm_runtime_get_sync(hdev->dev);
|
||||
ret = pm_runtime_resume_and_get(hdev->dev);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
|
@ -601,7 +601,7 @@ static irqreturn_t arizona_hpdet_irq(int irq, void *data)
|
||||
struct arizona *arizona = info->arizona;
|
||||
int id_gpio = arizona->pdata.hpdet_id_gpio;
|
||||
unsigned int report = EXTCON_JACK_HEADPHONE;
|
||||
int ret, reading;
|
||||
int ret, reading, state;
|
||||
bool mic = false;
|
||||
|
||||
mutex_lock(&info->lock);
|
||||
@ -614,12 +614,11 @@ static irqreturn_t arizona_hpdet_irq(int irq, void *data)
|
||||
}
|
||||
|
||||
/* If the cable was removed while measuring ignore the result */
|
||||
ret = extcon_get_state(info->edev, EXTCON_MECHANICAL);
|
||||
if (ret < 0) {
|
||||
dev_err(arizona->dev, "Failed to check cable state: %d\n",
|
||||
ret);
|
||||
state = extcon_get_state(info->edev, EXTCON_MECHANICAL);
|
||||
if (state < 0) {
|
||||
dev_err(arizona->dev, "Failed to check cable state: %d\n", state);
|
||||
goto out;
|
||||
} else if (!ret) {
|
||||
} else if (!state) {
|
||||
dev_dbg(arizona->dev, "Ignoring HPDET for removed cable\n");
|
||||
goto done;
|
||||
}
|
||||
@ -667,7 +666,7 @@ static irqreturn_t arizona_hpdet_irq(int irq, void *data)
|
||||
gpio_set_value_cansleep(id_gpio, 0);
|
||||
|
||||
/* If we have a mic then reenable MICDET */
|
||||
if (mic || info->mic)
|
||||
if (state && (mic || info->mic))
|
||||
arizona_start_mic(info);
|
||||
|
||||
if (info->hpdet_active) {
|
||||
@ -675,7 +674,9 @@ static irqreturn_t arizona_hpdet_irq(int irq, void *data)
|
||||
info->hpdet_active = false;
|
||||
}
|
||||
|
||||
info->hpdet_done = true;
|
||||
/* Do not set hp_det done when the cable has been unplugged */
|
||||
if (state)
|
||||
info->hpdet_done = true;
|
||||
|
||||
out:
|
||||
mutex_unlock(&info->lock);
|
||||
@ -1759,25 +1760,6 @@ static int arizona_extcon_remove(struct platform_device *pdev)
|
||||
bool change;
|
||||
int ret;
|
||||
|
||||
ret = regmap_update_bits_check(arizona->regmap, ARIZONA_MIC_DETECT_1,
|
||||
ARIZONA_MICD_ENA, 0,
|
||||
&change);
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev, "Failed to disable micd on remove: %d\n",
|
||||
ret);
|
||||
} else if (change) {
|
||||
regulator_disable(info->micvdd);
|
||||
pm_runtime_put(info->dev);
|
||||
}
|
||||
|
||||
gpiod_put(info->micd_pol_gpio);
|
||||
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
|
||||
regmap_update_bits(arizona->regmap,
|
||||
ARIZONA_MICD_CLAMP_CONTROL,
|
||||
ARIZONA_MICD_CLAMP_MODE_MASK, 0);
|
||||
|
||||
if (info->micd_clamp) {
|
||||
jack_irq_rise = ARIZONA_IRQ_MICD_CLAMP_RISE;
|
||||
jack_irq_fall = ARIZONA_IRQ_MICD_CLAMP_FALL;
|
||||
@ -1793,10 +1775,31 @@ static int arizona_extcon_remove(struct platform_device *pdev)
|
||||
arizona_free_irq(arizona, jack_irq_rise, info);
|
||||
arizona_free_irq(arizona, jack_irq_fall, info);
|
||||
cancel_delayed_work_sync(&info->hpdet_work);
|
||||
cancel_delayed_work_sync(&info->micd_detect_work);
|
||||
cancel_delayed_work_sync(&info->micd_timeout_work);
|
||||
|
||||
ret = regmap_update_bits_check(arizona->regmap, ARIZONA_MIC_DETECT_1,
|
||||
ARIZONA_MICD_ENA, 0,
|
||||
&change);
|
||||
if (ret < 0) {
|
||||
dev_err(&pdev->dev, "Failed to disable micd on remove: %d\n",
|
||||
ret);
|
||||
} else if (change) {
|
||||
regulator_disable(info->micvdd);
|
||||
pm_runtime_put(info->dev);
|
||||
}
|
||||
|
||||
regmap_update_bits(arizona->regmap,
|
||||
ARIZONA_MICD_CLAMP_CONTROL,
|
||||
ARIZONA_MICD_CLAMP_MODE_MASK, 0);
|
||||
regmap_update_bits(arizona->regmap, ARIZONA_JACK_DETECT_ANALOGUE,
|
||||
ARIZONA_JD1_ENA, 0);
|
||||
arizona_clk32k_disable(arizona);
|
||||
|
||||
gpiod_put(info->micd_pol_gpio);
|
||||
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -13,7 +13,8 @@ cflags-$(CONFIG_X86) += -m$(BITS) -D__KERNEL__ \
|
||||
-Wno-pointer-sign \
|
||||
$(call cc-disable-warning, address-of-packed-member) \
|
||||
$(call cc-disable-warning, gnu) \
|
||||
-fno-asynchronous-unwind-tables
|
||||
-fno-asynchronous-unwind-tables \
|
||||
$(CLANG_FLAGS)
|
||||
|
||||
# arm64 uses the full KBUILD_CFLAGS so it's necessary to explicitly
|
||||
# disable the stackleak plugin
|
||||
|
@ -61,14 +61,16 @@ static void cci_pci_free_irq(struct pci_dev *pcidev)
|
||||
}
|
||||
|
||||
/* PCI Device ID */
|
||||
#define PCIE_DEVICE_ID_PF_INT_5_X 0xBCBD
|
||||
#define PCIE_DEVICE_ID_PF_INT_6_X 0xBCC0
|
||||
#define PCIE_DEVICE_ID_PF_DSC_1_X 0x09C4
|
||||
#define PCIE_DEVICE_ID_INTEL_PAC_N3000 0x0B30
|
||||
#define PCIE_DEVICE_ID_PF_INT_5_X 0xBCBD
|
||||
#define PCIE_DEVICE_ID_PF_INT_6_X 0xBCC0
|
||||
#define PCIE_DEVICE_ID_PF_DSC_1_X 0x09C4
|
||||
#define PCIE_DEVICE_ID_INTEL_PAC_N3000 0x0B30
|
||||
#define PCIE_DEVICE_ID_INTEL_PAC_D5005 0x0B2B
|
||||
/* VF Device */
|
||||
#define PCIE_DEVICE_ID_VF_INT_5_X 0xBCBF
|
||||
#define PCIE_DEVICE_ID_VF_INT_6_X 0xBCC1
|
||||
#define PCIE_DEVICE_ID_VF_DSC_1_X 0x09C5
|
||||
#define PCIE_DEVICE_ID_VF_INT_5_X 0xBCBF
|
||||
#define PCIE_DEVICE_ID_VF_INT_6_X 0xBCC1
|
||||
#define PCIE_DEVICE_ID_VF_DSC_1_X 0x09C5
|
||||
#define PCIE_DEVICE_ID_INTEL_PAC_D5005_VF 0x0B2C
|
||||
|
||||
static struct pci_device_id cci_pcie_id_tbl[] = {
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIE_DEVICE_ID_PF_INT_5_X),},
|
||||
@ -78,6 +80,8 @@ static struct pci_device_id cci_pcie_id_tbl[] = {
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIE_DEVICE_ID_PF_DSC_1_X),},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIE_DEVICE_ID_VF_DSC_1_X),},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIE_DEVICE_ID_INTEL_PAC_N3000),},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIE_DEVICE_ID_INTEL_PAC_D5005),},
|
||||
{PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCIE_DEVICE_ID_INTEL_PAC_D5005_VF),},
|
||||
{0,}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(pci, cci_pcie_id_tbl);
|
||||
|
@ -3551,6 +3551,7 @@ void amdgpu_device_fini(struct amdgpu_device *adev)
|
||||
{
|
||||
dev_info(adev->dev, "amdgpu: finishing device.\n");
|
||||
flush_delayed_work(&adev->delayed_init_work);
|
||||
ttm_bo_lock_delayed_workqueue(&adev->mman.bdev);
|
||||
adev->shutdown = true;
|
||||
|
||||
kfree(adev->pci_state);
|
||||
|
@ -532,6 +532,8 @@ void amdgpu_fence_driver_fini(struct amdgpu_device *adev)
|
||||
|
||||
if (!ring || !ring->fence_drv.initialized)
|
||||
continue;
|
||||
if (!ring->no_scheduler)
|
||||
drm_sched_fini(&ring->sched);
|
||||
r = amdgpu_fence_wait_empty(ring);
|
||||
if (r) {
|
||||
/* no need to trigger GPU reset as we are unloading */
|
||||
@ -540,8 +542,7 @@ void amdgpu_fence_driver_fini(struct amdgpu_device *adev)
|
||||
if (ring->fence_drv.irq_src)
|
||||
amdgpu_irq_put(adev, ring->fence_drv.irq_src,
|
||||
ring->fence_drv.irq_type);
|
||||
if (!ring->no_scheduler)
|
||||
drm_sched_fini(&ring->sched);
|
||||
|
||||
del_timer_sync(&ring->fence_drv.fallback_timer);
|
||||
for (j = 0; j <= ring->fence_drv.num_fences_mask; ++j)
|
||||
dma_fence_put(ring->fence_drv.fences[j]);
|
||||
|
@ -499,7 +499,7 @@ void amdgpu_irq_gpu_reset_resume_helper(struct amdgpu_device *adev)
|
||||
for (j = 0; j < AMDGPU_MAX_IRQ_SRC_ID; ++j) {
|
||||
struct amdgpu_irq_src *src = adev->irq.client[i].sources[j];
|
||||
|
||||
if (!src)
|
||||
if (!src || !src->funcs || !src->funcs->set)
|
||||
continue;
|
||||
for (k = 0; k < src->num_types; k++)
|
||||
amdgpu_irq_update(adev, src, k);
|
||||
|
@ -1034,7 +1034,7 @@ static void amdgpu_ttm_tt_unpin_userptr(struct ttm_bo_device *bdev,
|
||||
DMA_BIDIRECTIONAL : DMA_TO_DEVICE;
|
||||
|
||||
/* double check that we don't free the table twice */
|
||||
if (!ttm->sg->sgl)
|
||||
if (!ttm->sg || !ttm->sg->sgl)
|
||||
return;
|
||||
|
||||
/* unmap the pages mapped to the device */
|
||||
@ -1254,13 +1254,13 @@ static void amdgpu_ttm_backend_unbind(struct ttm_bo_device *bdev,
|
||||
struct amdgpu_ttm_tt *gtt = (void *)ttm;
|
||||
int r;
|
||||
|
||||
if (!gtt->bound)
|
||||
return;
|
||||
|
||||
/* if the pages have userptr pinning then clear that first */
|
||||
if (gtt->userptr)
|
||||
amdgpu_ttm_tt_unpin_userptr(bdev, ttm);
|
||||
|
||||
if (!gtt->bound)
|
||||
return;
|
||||
|
||||
if (gtt->offset == AMDGPU_BO_INVALID_OFFSET)
|
||||
return;
|
||||
|
||||
|
@ -259,7 +259,7 @@ int amdgpu_uvd_sw_init(struct amdgpu_device *adev)
|
||||
if ((adev->asic_type == CHIP_POLARIS10 ||
|
||||
adev->asic_type == CHIP_POLARIS11) &&
|
||||
(adev->uvd.fw_version < FW_1_66_16))
|
||||
DRM_ERROR("POLARIS10/11 UVD firmware version %hu.%hu is too old.\n",
|
||||
DRM_ERROR("POLARIS10/11 UVD firmware version %u.%u is too old.\n",
|
||||
version_major, version_minor);
|
||||
} else {
|
||||
unsigned int enc_major, enc_minor, dec_minor;
|
||||
|
@ -465,15 +465,22 @@ int amdgpu_xgmi_update_topology(struct amdgpu_hive_info *hive, struct amdgpu_dev
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* NOTE psp_xgmi_node_info.num_hops layout is as follows:
|
||||
* num_hops[7:6] = link type (0 = xGMI2, 1 = xGMI3, 2/3 = reserved)
|
||||
* num_hops[5:3] = reserved
|
||||
* num_hops[2:0] = number of hops
|
||||
*/
|
||||
int amdgpu_xgmi_get_hops_count(struct amdgpu_device *adev,
|
||||
struct amdgpu_device *peer_adev)
|
||||
{
|
||||
struct psp_xgmi_topology_info *top = &adev->psp.xgmi_context.top_info;
|
||||
uint8_t num_hops_mask = 0x7;
|
||||
int i;
|
||||
|
||||
for (i = 0 ; i < top->num_nodes; ++i)
|
||||
if (top->nodes[i].node_id == peer_adev->gmc.xgmi.node_id)
|
||||
return top->nodes[i].num_hops;
|
||||
return top->nodes[i].num_hops & num_hops_mask;
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
@ -33,6 +33,11 @@ static int kfd_debugfs_open(struct inode *inode, struct file *file)
|
||||
|
||||
return single_open(file, show, NULL);
|
||||
}
|
||||
static int kfd_debugfs_hang_hws_read(struct seq_file *m, void *data)
|
||||
{
|
||||
seq_printf(m, "echo gpu_id > hang_hws\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ssize_t kfd_debugfs_hang_hws_write(struct file *file,
|
||||
const char __user *user_buf, size_t size, loff_t *ppos)
|
||||
@ -94,7 +99,7 @@ void kfd_debugfs_init(void)
|
||||
debugfs_create_file("rls", S_IFREG | 0444, debugfs_root,
|
||||
kfd_debugfs_rls_by_device, &kfd_debugfs_fops);
|
||||
debugfs_create_file("hang_hws", S_IFREG | 0200, debugfs_root,
|
||||
NULL, &kfd_debugfs_hang_hws_fops);
|
||||
kfd_debugfs_hang_hws_read, &kfd_debugfs_hang_hws_fops);
|
||||
}
|
||||
|
||||
void kfd_debugfs_fini(void)
|
||||
|
@ -1128,6 +1128,9 @@ static int set_sched_resources(struct device_queue_manager *dqm)
|
||||
|
||||
static int initialize_cpsch(struct device_queue_manager *dqm)
|
||||
{
|
||||
uint64_t num_sdma_queues;
|
||||
uint64_t num_xgmi_sdma_queues;
|
||||
|
||||
pr_debug("num of pipes: %d\n", get_pipes_per_mec(dqm));
|
||||
|
||||
mutex_init(&dqm->lock_hidden);
|
||||
@ -1136,8 +1139,18 @@ static int initialize_cpsch(struct device_queue_manager *dqm)
|
||||
dqm->active_cp_queue_count = 0;
|
||||
dqm->gws_queue_count = 0;
|
||||
dqm->active_runlist = false;
|
||||
dqm->sdma_bitmap = ~0ULL >> (64 - get_num_sdma_queues(dqm));
|
||||
dqm->xgmi_sdma_bitmap = ~0ULL >> (64 - get_num_xgmi_sdma_queues(dqm));
|
||||
|
||||
num_sdma_queues = get_num_sdma_queues(dqm);
|
||||
if (num_sdma_queues >= BITS_PER_TYPE(dqm->sdma_bitmap))
|
||||
dqm->sdma_bitmap = ULLONG_MAX;
|
||||
else
|
||||
dqm->sdma_bitmap = (BIT_ULL(num_sdma_queues) - 1);
|
||||
|
||||
num_xgmi_sdma_queues = get_num_xgmi_sdma_queues(dqm);
|
||||
if (num_xgmi_sdma_queues >= BITS_PER_TYPE(dqm->xgmi_sdma_bitmap))
|
||||
dqm->xgmi_sdma_bitmap = ULLONG_MAX;
|
||||
else
|
||||
dqm->xgmi_sdma_bitmap = (BIT_ULL(num_xgmi_sdma_queues) - 1);
|
||||
|
||||
INIT_WORK(&dqm->hw_exception_work, kfd_process_hw_exception);
|
||||
|
||||
|
@ -5328,6 +5328,15 @@ create_validate_stream_for_sink(struct amdgpu_dm_connector *aconnector,
|
||||
|
||||
} while (stream == NULL && requested_bpc >= 6);
|
||||
|
||||
if (dc_result == DC_FAIL_ENC_VALIDATE && !aconnector->force_yuv420_output) {
|
||||
DRM_DEBUG_KMS("Retry forcing YCbCr420 encoding\n");
|
||||
|
||||
aconnector->force_yuv420_output = true;
|
||||
stream = create_validate_stream_for_sink(aconnector, drm_mode,
|
||||
dm_state, old_stream);
|
||||
aconnector->force_yuv420_output = false;
|
||||
}
|
||||
|
||||
return stream;
|
||||
}
|
||||
|
||||
@ -6800,10 +6809,6 @@ static int get_cursor_position(struct drm_plane *plane, struct drm_crtc *crtc,
|
||||
int x, y;
|
||||
int xorigin = 0, yorigin = 0;
|
||||
|
||||
position->enable = false;
|
||||
position->x = 0;
|
||||
position->y = 0;
|
||||
|
||||
if (!crtc || !plane->state->fb)
|
||||
return 0;
|
||||
|
||||
@ -6850,7 +6855,7 @@ static void handle_cursor_update(struct drm_plane *plane,
|
||||
struct dm_crtc_state *crtc_state = crtc ? to_dm_crtc_state(crtc->state) : NULL;
|
||||
struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
|
||||
uint64_t address = afb ? afb->address : 0;
|
||||
struct dc_cursor_position position;
|
||||
struct dc_cursor_position position = {0};
|
||||
struct dc_cursor_attributes attributes;
|
||||
int ret;
|
||||
|
||||
@ -8659,7 +8664,7 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
|
||||
}
|
||||
|
||||
#if defined(CONFIG_DRM_AMD_DC_DCN)
|
||||
if (adev->asic_type >= CHIP_NAVI10) {
|
||||
if (dc_resource_is_dsc_encoding_supported(dc)) {
|
||||
for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
|
||||
if (drm_atomic_crtc_needs_modeset(new_crtc_state)) {
|
||||
ret = add_affected_mst_dsc_crtcs(state, crtc);
|
||||
|
@ -68,18 +68,6 @@ struct common_irq_params {
|
||||
enum dc_irq_source irq_src;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct irq_list_head - Linked-list for low context IRQ handlers.
|
||||
*
|
||||
* @head: The list_head within &struct handler_data
|
||||
* @work: A work_struct containing the deferred handler work
|
||||
*/
|
||||
struct irq_list_head {
|
||||
struct list_head head;
|
||||
/* In case this interrupt needs post-processing, 'work' will be queued*/
|
||||
struct work_struct work;
|
||||
};
|
||||
|
||||
/**
|
||||
* struct dm_compressor_info - Buffer info used by frame buffer compression
|
||||
* @cpu_addr: MMIO cpu addr
|
||||
@ -270,7 +258,7 @@ struct amdgpu_display_manager {
|
||||
* Note that handlers are called in the same order as they were
|
||||
* registered (FIFO).
|
||||
*/
|
||||
struct irq_list_head irq_handler_list_low_tab[DAL_IRQ_SOURCES_NUMBER];
|
||||
struct list_head irq_handler_list_low_tab[DAL_IRQ_SOURCES_NUMBER];
|
||||
|
||||
/**
|
||||
* @irq_handler_list_high_tab:
|
||||
|
@ -150,7 +150,7 @@ static int parse_write_buffer_into_params(char *wr_buf, uint32_t wr_buf_size,
|
||||
*
|
||||
* --- to get dp configuration
|
||||
*
|
||||
* cat link_settings
|
||||
* cat /sys/kernel/debug/dri/0/DP-x/link_settings
|
||||
*
|
||||
* It will list current, verified, reported, preferred dp configuration.
|
||||
* current -- for current video mode
|
||||
@ -163,7 +163,7 @@ static int parse_write_buffer_into_params(char *wr_buf, uint32_t wr_buf_size,
|
||||
* echo <lane_count> <link_rate> > link_settings
|
||||
*
|
||||
* for example, to force to 2 lane, 2.7GHz,
|
||||
* echo 4 0xa > link_settings
|
||||
* echo 4 0xa > /sys/kernel/debug/dri/0/DP-x/link_settings
|
||||
*
|
||||
* spread_spectrum could not be changed dynamically.
|
||||
*
|
||||
@ -171,7 +171,7 @@ static int parse_write_buffer_into_params(char *wr_buf, uint32_t wr_buf_size,
|
||||
* done. please check link settings after force operation to see if HW get
|
||||
* programming.
|
||||
*
|
||||
* cat link_settings
|
||||
* cat /sys/kernel/debug/dri/0/DP-x/link_settings
|
||||
*
|
||||
* check current and preferred settings.
|
||||
*
|
||||
@ -255,7 +255,7 @@ static ssize_t dp_link_settings_write(struct file *f, const char __user *buf,
|
||||
int max_param_num = 2;
|
||||
uint8_t param_nums = 0;
|
||||
long param[2];
|
||||
bool valid_input = false;
|
||||
bool valid_input = true;
|
||||
|
||||
if (size == 0)
|
||||
return -EINVAL;
|
||||
@ -282,9 +282,9 @@ static ssize_t dp_link_settings_write(struct file *f, const char __user *buf,
|
||||
case LANE_COUNT_ONE:
|
||||
case LANE_COUNT_TWO:
|
||||
case LANE_COUNT_FOUR:
|
||||
valid_input = true;
|
||||
break;
|
||||
default:
|
||||
valid_input = false;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -294,9 +294,9 @@ static ssize_t dp_link_settings_write(struct file *f, const char __user *buf,
|
||||
case LINK_RATE_RBR2:
|
||||
case LINK_RATE_HIGH2:
|
||||
case LINK_RATE_HIGH3:
|
||||
valid_input = true;
|
||||
break;
|
||||
default:
|
||||
valid_input = false;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -310,10 +310,11 @@ static ssize_t dp_link_settings_write(struct file *f, const char __user *buf,
|
||||
* spread spectrum will not be changed
|
||||
*/
|
||||
prefer_link_settings.link_spread = link->cur_link_settings.link_spread;
|
||||
prefer_link_settings.use_link_rate_set = false;
|
||||
prefer_link_settings.lane_count = param[0];
|
||||
prefer_link_settings.link_rate = param[1];
|
||||
|
||||
dc_link_set_preferred_link_settings(dc, &prefer_link_settings, link);
|
||||
dc_link_set_preferred_training_settings(dc, &prefer_link_settings, NULL, link, true);
|
||||
|
||||
kfree(wr_buf);
|
||||
return size;
|
||||
|
@ -82,6 +82,7 @@ struct amdgpu_dm_irq_handler_data {
|
||||
struct amdgpu_display_manager *dm;
|
||||
/* DAL irq source which registered for this interrupt. */
|
||||
enum dc_irq_source irq_source;
|
||||
struct work_struct work;
|
||||
};
|
||||
|
||||
#define DM_IRQ_TABLE_LOCK(adev, flags) \
|
||||
@ -111,20 +112,10 @@ static void init_handler_common_data(struct amdgpu_dm_irq_handler_data *hcd,
|
||||
*/
|
||||
static void dm_irq_work_func(struct work_struct *work)
|
||||
{
|
||||
struct irq_list_head *irq_list_head =
|
||||
container_of(work, struct irq_list_head, work);
|
||||
struct list_head *handler_list = &irq_list_head->head;
|
||||
struct amdgpu_dm_irq_handler_data *handler_data;
|
||||
struct amdgpu_dm_irq_handler_data *handler_data =
|
||||
container_of(work, struct amdgpu_dm_irq_handler_data, work);
|
||||
|
||||
list_for_each_entry(handler_data, handler_list, list) {
|
||||
DRM_DEBUG_KMS("DM_IRQ: work_func: for dal_src=%d\n",
|
||||
handler_data->irq_source);
|
||||
|
||||
DRM_DEBUG_KMS("DM_IRQ: schedule_work: for dal_src=%d\n",
|
||||
handler_data->irq_source);
|
||||
|
||||
handler_data->handler(handler_data->handler_arg);
|
||||
}
|
||||
handler_data->handler(handler_data->handler_arg);
|
||||
|
||||
/* Call a DAL subcomponent which registered for interrupt notification
|
||||
* at INTERRUPT_LOW_IRQ_CONTEXT.
|
||||
@ -156,7 +147,7 @@ static struct list_head *remove_irq_handler(struct amdgpu_device *adev,
|
||||
break;
|
||||
case INTERRUPT_LOW_IRQ_CONTEXT:
|
||||
default:
|
||||
hnd_list = &adev->dm.irq_handler_list_low_tab[irq_source].head;
|
||||
hnd_list = &adev->dm.irq_handler_list_low_tab[irq_source];
|
||||
break;
|
||||
}
|
||||
|
||||
@ -287,7 +278,8 @@ void *amdgpu_dm_irq_register_interrupt(struct amdgpu_device *adev,
|
||||
break;
|
||||
case INTERRUPT_LOW_IRQ_CONTEXT:
|
||||
default:
|
||||
hnd_list = &adev->dm.irq_handler_list_low_tab[irq_source].head;
|
||||
hnd_list = &adev->dm.irq_handler_list_low_tab[irq_source];
|
||||
INIT_WORK(&handler_data->work, dm_irq_work_func);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -369,7 +361,7 @@ void amdgpu_dm_irq_unregister_interrupt(struct amdgpu_device *adev,
|
||||
int amdgpu_dm_irq_init(struct amdgpu_device *adev)
|
||||
{
|
||||
int src;
|
||||
struct irq_list_head *lh;
|
||||
struct list_head *lh;
|
||||
|
||||
DRM_DEBUG_KMS("DM_IRQ\n");
|
||||
|
||||
@ -378,9 +370,7 @@ int amdgpu_dm_irq_init(struct amdgpu_device *adev)
|
||||
for (src = 0; src < DAL_IRQ_SOURCES_NUMBER; src++) {
|
||||
/* low context handler list init */
|
||||
lh = &adev->dm.irq_handler_list_low_tab[src];
|
||||
INIT_LIST_HEAD(&lh->head);
|
||||
INIT_WORK(&lh->work, dm_irq_work_func);
|
||||
|
||||
INIT_LIST_HEAD(lh);
|
||||
/* high context handler init */
|
||||
INIT_LIST_HEAD(&adev->dm.irq_handler_list_high_tab[src]);
|
||||
}
|
||||
@ -397,8 +387,11 @@ int amdgpu_dm_irq_init(struct amdgpu_device *adev)
|
||||
void amdgpu_dm_irq_fini(struct amdgpu_device *adev)
|
||||
{
|
||||
int src;
|
||||
struct irq_list_head *lh;
|
||||
struct list_head *lh;
|
||||
struct list_head *entry, *tmp;
|
||||
struct amdgpu_dm_irq_handler_data *handler;
|
||||
unsigned long irq_table_flags;
|
||||
|
||||
DRM_DEBUG_KMS("DM_IRQ: releasing resources.\n");
|
||||
for (src = 0; src < DAL_IRQ_SOURCES_NUMBER; src++) {
|
||||
DM_IRQ_TABLE_LOCK(adev, irq_table_flags);
|
||||
@ -407,7 +400,16 @@ void amdgpu_dm_irq_fini(struct amdgpu_device *adev)
|
||||
* (because no code can schedule a new one). */
|
||||
lh = &adev->dm.irq_handler_list_low_tab[src];
|
||||
DM_IRQ_TABLE_UNLOCK(adev, irq_table_flags);
|
||||
flush_work(&lh->work);
|
||||
|
||||
if (!list_empty(lh)) {
|
||||
list_for_each_safe(entry, tmp, lh) {
|
||||
handler = list_entry(
|
||||
entry,
|
||||
struct amdgpu_dm_irq_handler_data,
|
||||
list);
|
||||
flush_work(&handler->work);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -417,6 +419,8 @@ int amdgpu_dm_irq_suspend(struct amdgpu_device *adev)
|
||||
struct list_head *hnd_list_h;
|
||||
struct list_head *hnd_list_l;
|
||||
unsigned long irq_table_flags;
|
||||
struct list_head *entry, *tmp;
|
||||
struct amdgpu_dm_irq_handler_data *handler;
|
||||
|
||||
DM_IRQ_TABLE_LOCK(adev, irq_table_flags);
|
||||
|
||||
@ -427,14 +431,22 @@ int amdgpu_dm_irq_suspend(struct amdgpu_device *adev)
|
||||
* will be disabled from manage_dm_interrupts on disable CRTC.
|
||||
*/
|
||||
for (src = DC_IRQ_SOURCE_HPD1; src <= DC_IRQ_SOURCE_HPD6RX; src++) {
|
||||
hnd_list_l = &adev->dm.irq_handler_list_low_tab[src].head;
|
||||
hnd_list_l = &adev->dm.irq_handler_list_low_tab[src];
|
||||
hnd_list_h = &adev->dm.irq_handler_list_high_tab[src];
|
||||
if (!list_empty(hnd_list_l) || !list_empty(hnd_list_h))
|
||||
dc_interrupt_set(adev->dm.dc, src, false);
|
||||
|
||||
DM_IRQ_TABLE_UNLOCK(adev, irq_table_flags);
|
||||
flush_work(&adev->dm.irq_handler_list_low_tab[src].work);
|
||||
|
||||
if (!list_empty(hnd_list_l)) {
|
||||
list_for_each_safe (entry, tmp, hnd_list_l) {
|
||||
handler = list_entry(
|
||||
entry,
|
||||
struct amdgpu_dm_irq_handler_data,
|
||||
list);
|
||||
flush_work(&handler->work);
|
||||
}
|
||||
}
|
||||
DM_IRQ_TABLE_LOCK(adev, irq_table_flags);
|
||||
}
|
||||
|
||||
@ -454,7 +466,7 @@ int amdgpu_dm_irq_resume_early(struct amdgpu_device *adev)
|
||||
|
||||
/* re-enable short pulse interrupts HW interrupt */
|
||||
for (src = DC_IRQ_SOURCE_HPD1RX; src <= DC_IRQ_SOURCE_HPD6RX; src++) {
|
||||
hnd_list_l = &adev->dm.irq_handler_list_low_tab[src].head;
|
||||
hnd_list_l = &adev->dm.irq_handler_list_low_tab[src];
|
||||
hnd_list_h = &adev->dm.irq_handler_list_high_tab[src];
|
||||
if (!list_empty(hnd_list_l) || !list_empty(hnd_list_h))
|
||||
dc_interrupt_set(adev->dm.dc, src, true);
|
||||
@ -480,7 +492,7 @@ int amdgpu_dm_irq_resume_late(struct amdgpu_device *adev)
|
||||
* will be enabled from manage_dm_interrupts on enable CRTC.
|
||||
*/
|
||||
for (src = DC_IRQ_SOURCE_HPD1; src <= DC_IRQ_SOURCE_HPD6; src++) {
|
||||
hnd_list_l = &adev->dm.irq_handler_list_low_tab[src].head;
|
||||
hnd_list_l = &adev->dm.irq_handler_list_low_tab[src];
|
||||
hnd_list_h = &adev->dm.irq_handler_list_high_tab[src];
|
||||
if (!list_empty(hnd_list_l) || !list_empty(hnd_list_h))
|
||||
dc_interrupt_set(adev->dm.dc, src, true);
|
||||
@ -497,22 +509,53 @@ int amdgpu_dm_irq_resume_late(struct amdgpu_device *adev)
|
||||
static void amdgpu_dm_irq_schedule_work(struct amdgpu_device *adev,
|
||||
enum dc_irq_source irq_source)
|
||||
{
|
||||
unsigned long irq_table_flags;
|
||||
struct work_struct *work = NULL;
|
||||
struct list_head *handler_list = &adev->dm.irq_handler_list_low_tab[irq_source];
|
||||
struct amdgpu_dm_irq_handler_data *handler_data;
|
||||
bool work_queued = false;
|
||||
|
||||
DM_IRQ_TABLE_LOCK(adev, irq_table_flags);
|
||||
if (list_empty(handler_list))
|
||||
return;
|
||||
|
||||
if (!list_empty(&adev->dm.irq_handler_list_low_tab[irq_source].head))
|
||||
work = &adev->dm.irq_handler_list_low_tab[irq_source].work;
|
||||
|
||||
DM_IRQ_TABLE_UNLOCK(adev, irq_table_flags);
|
||||
|
||||
if (work) {
|
||||
if (!schedule_work(work))
|
||||
DRM_INFO("amdgpu_dm_irq_schedule_work FAILED src %d\n",
|
||||
irq_source);
|
||||
list_for_each_entry (handler_data, handler_list, list) {
|
||||
if (!queue_work(system_highpri_wq, &handler_data->work)) {
|
||||
continue;
|
||||
} else {
|
||||
work_queued = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!work_queued) {
|
||||
struct amdgpu_dm_irq_handler_data *handler_data_add;
|
||||
/*get the amdgpu_dm_irq_handler_data of first item pointed by handler_list*/
|
||||
handler_data = container_of(handler_list->next, struct amdgpu_dm_irq_handler_data, list);
|
||||
|
||||
/*allocate a new amdgpu_dm_irq_handler_data*/
|
||||
handler_data_add = kzalloc(sizeof(*handler_data), GFP_KERNEL);
|
||||
if (!handler_data_add) {
|
||||
DRM_ERROR("DM_IRQ: failed to allocate irq handler!\n");
|
||||
return;
|
||||
}
|
||||
|
||||
/*copy new amdgpu_dm_irq_handler_data members from handler_data*/
|
||||
handler_data_add->handler = handler_data->handler;
|
||||
handler_data_add->handler_arg = handler_data->handler_arg;
|
||||
handler_data_add->dm = handler_data->dm;
|
||||
handler_data_add->irq_source = irq_source;
|
||||
|
||||
list_add_tail(&handler_data_add->list, handler_list);
|
||||
|
||||
INIT_WORK(&handler_data_add->work, dm_irq_work_func);
|
||||
|
||||
if (queue_work(system_highpri_wq, &handler_data_add->work))
|
||||
DRM_DEBUG("Queued work for handling interrupt from "
|
||||
"display for IRQ source %d\n",
|
||||
irq_source);
|
||||
else
|
||||
DRM_ERROR("Failed to queue work for handling interrupt "
|
||||
"from display for IRQ source %d\n",
|
||||
irq_source);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -240,6 +240,7 @@ static void dcn3_update_clocks(struct clk_mgr *clk_mgr_base,
|
||||
bool force_reset = false;
|
||||
bool update_uclk = false;
|
||||
bool p_state_change_support;
|
||||
int total_plane_count;
|
||||
|
||||
if (dc->work_arounds.skip_clock_update || !clk_mgr->smu_present)
|
||||
return;
|
||||
@ -280,7 +281,8 @@ static void dcn3_update_clocks(struct clk_mgr *clk_mgr_base,
|
||||
clk_mgr_base->clks.socclk_khz = new_clocks->socclk_khz;
|
||||
|
||||
clk_mgr_base->clks.prev_p_state_change_support = clk_mgr_base->clks.p_state_change_support;
|
||||
p_state_change_support = new_clocks->p_state_change_support || (display_count == 0);
|
||||
total_plane_count = clk_mgr_helper_get_active_plane_cnt(dc, context);
|
||||
p_state_change_support = new_clocks->p_state_change_support || (total_plane_count == 0);
|
||||
if (should_update_pstate_support(safe_to_lower, p_state_change_support, clk_mgr_base->clks.p_state_change_support)) {
|
||||
clk_mgr_base->clks.p_state_change_support = p_state_change_support;
|
||||
|
||||
|
@ -2345,7 +2345,8 @@ static void commit_planes_do_stream_update(struct dc *dc,
|
||||
if (pipe_ctx->stream_res.audio && !dc->debug.az_endpoint_mute_only)
|
||||
pipe_ctx->stream_res.audio->funcs->az_disable(pipe_ctx->stream_res.audio);
|
||||
|
||||
dc->hwss.optimize_bandwidth(dc, dc->current_state);
|
||||
dc->optimized_required = true;
|
||||
|
||||
} else {
|
||||
if (dc->optimize_seamless_boot_streams == 0)
|
||||
dc->hwss.prepare_bandwidth(dc, dc->current_state);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user