This is the 5.4.22 stable release
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAl5TfSAACgkQONu9yGCS aT4I8w//SU+w9Tj8Crpt1BI7Lk2AiTGvyZtX0wGd53vzFKGy+Wi1Oba1ybB+xyYw UgMJJpoOgp9gTatRgjDl0vO/7U7vZckigPpog3pSW+xq2JW0kTWGS2z04hUjWKkG W4l3sAGwHRv7MTBbpjECDSHv+6x6ZqlWcVodpkHqLNmGxR0mYuiB6Zu8QuCu1bl0 K0SAlt+yd0laUt2bU3wpEqBwGXHepz+IqsqcYp78sAeytT8ds9ZfPxKv98CvLlXs VLVr87UqZy3Hkl6IWKGrmdhWbTZE+3AyjKnxlA8PovA0ET5xO/IFPLHVhVX+or+5 UFp/1qvacr+EIu8CKvftc2n1CflaRXIn/QNpwdemh94mi/2TqiXiqAUu1EiW56vg /PUH8G72Q26AiWSmD3WRr09ohTu4hfz6fIDKV60qmdVe4AUffLw0SnBEE0VFA3/S lVKZeXKkePeMlHcTyRDQ6+/y49yjfq2exdrjetypOwRa1emHxj/YsfdnEWYfwT53 sikMLjP4XA7v5rsDr9LJTwQL/V/7euu1Hr3lSGpRv8vmePprvfmivTLcY5tgvOTC GZ51Em+CxJ+W4vCJKHuM7i0nUvf2Knn5lBidq4KsvLRUuZ31mSXSfSn4bW6Gl/Jm RZPDC71MqT/FMtfuQLlVNqIw2umC1buNa5SwZ8GhJG6za4gU4FU= =L+e0 -----END PGP SIGNATURE----- Merge 5.4.22 into android-5.4 Changes in 5.4.22 core: Don't skip generic XDP program execution for cloned SKBs enic: prevent waking up stopped tx queues over watchdog reset net/smc: fix leak of kernel memory to user space net: dsa: tag_qca: Make sure there is headroom for tag net/sched: matchall: add missing validation of TCA_MATCHALL_FLAGS net/sched: flower: add missing validation of TCA_FLOWER_FLAGS drm/gma500: Fixup fbdev stolen size usage evaluation ath10k: Fix qmi init error handling wil6210: fix break that is never reached because of zero'ing of a retry counter drm/qxl: Complete exception handling in qxl_device_init() rcu/nocb: Fix dump_tree hierarchy print always active rcu: Fix missed wakeup of exp_wq waiters rcu: Fix data-race due to atomic_t copy-by-value f2fs: preallocate DIO blocks when forcing buffered_io f2fs: call f2fs_balance_fs outside of locked page media: meson: add missing allocation failure check on new_buf clk: meson: pll: Fix by 0 division in __pll_params_to_rate() cpu/hotplug, stop_machine: Fix stop_machine vs hotplug order brcmfmac: Fix memory leak in brcmf_p2p_create_p2pdev() brcmfmac: Fix use after free in brcmf_sdio_readframes() PCI: Fix pci_add_dma_alias() bitmask size drm/amd/display: Map ODM memory correctly when doing ODM combine leds: pca963x: Fix open-drain initialization ext4: fix ext4_dax_read/write inode locking sequence for IOCB_NOWAIT ALSA: ctl: allow TLV read operation for callback type of element in locked case gianfar: Fix TX timestamping with a stacked DSA driver pinctrl: sh-pfc: sh7264: Fix CAN function GPIOs printk: fix exclusive_console replaying drm/mipi_dbi: Fix off-by-one bugs in mipi_dbi_blank() drm/msm/adreno: fix zap vs no-zap handling pxa168fb: Fix the function used to release some memory in an error handling path media: ov5640: Fix check for PLL1 exceeding max allowed rate media: i2c: mt9v032: fix enum mbus codes and frame sizes media: sun4i-csi: Deal with DRAM offset media: sun4i-csi: Fix data sampling polarity handling media: sun4i-csi: Fix [HV]sync polarity handling clk: at91: sam9x60: fix programmable clock prescaler powerpc/powernv/iov: Ensure the pdn for VFs always contains a valid PE number clk: meson: meson8b: make the CCF use the glitch-free mali mux gpio: gpio-grgpio: fix possible sleep-in-atomic-context bugs in grgpio_irq_map/unmap() iommu/vt-d: Fix off-by-one in PASID allocation x86/fpu: Deactivate FPU state after failure during state load char/random: silence a lockdep splat with printk() media: sti: bdisp: fix a possible sleep-in-atomic-context bug in bdisp_device_run() kernel/module: Fix memleak in module_add_modinfo_attrs() IB/core: Let IB core distribute cache update events pinctrl: baytrail: Do not clear IRQ flags on direct-irq enabled pins efi/x86: Map the entire EFI vendor string before copying it MIPS: Loongson: Fix potential NULL dereference in loongson3_platform_init() sparc: Add .exit.data section. net: ethernet: ixp4xx: Standard module init raid6/test: fix a compilation error uio: fix a sleep-in-atomic-context bug in uio_dmem_genirq_irqcontrol() drm/amdgpu/sriov: workaround on rev_id for Navi12 under sriov spi: fsl-lpspi: fix only one cs-gpio working drm/nouveau/nouveau: fix incorrect sizeof on args.src an args.dst usb: gadget: udc: fix possible sleep-in-atomic-context bugs in gr_probe() usb: dwc2: Fix IN FIFO allocation clocksource/drivers/bcm2835_timer: Fix memory leak of timer drm/amd/display: Clear state after exiting fixed active VRR state kselftest: Minimise dependency of get_size on C library interfaces jbd2: clear JBD2_ABORT flag before journal_reset to update log tail info when load journal ext4: fix deadlock allocating bio_post_read_ctx from mempool clk: ti: dra7: fix parent for gmac_clkctrl x86/sysfb: Fix check for bad VRAM size pwm: omap-dmtimer: Simplify error handling udf: Allow writing to 'Rewritable' partitions dmaengine: fsl-qdma: fix duplicated argument to && wan/hdlc_x25: fix skb handling s390/pci: Fix possible deadlock in recover_store() powerpc/iov: Move VF pdev fixup into pcibios_fixup_iov() tracing: Fix tracing_stat return values in error handling paths tracing: Fix very unlikely race of registering two stat tracers ARM: 8952/1: Disable kmemleak on XIP kernels ext4, jbd2: ensure panic when aborting with zero errno ath10k: Correct the DMA direction for management tx buffers rtw88: fix rate mask for 1SS chip brcmfmac: sdio: Fix OOB interrupt initialization on brcm43362 selftests: settings: tests can be in subsubdirs rtc: i2c/spi: Avoid inclusion of REGMAP support when not needed drm/amd/display: Retrain dongles when SINK_COUNT becomes non-zero tracing: Simplify assignment parsing for hist triggers nbd: add a flush_workqueue in nbd_start_device KVM: s390: ENOTSUPP -> EOPNOTSUPP fixups Btrfs: keep pages dirty when using btrfs_writepage_fixup_worker drivers/block/zram/zram_drv.c: fix error return codes not being returned in writeback_store block, bfq: do not plug I/O for bfq_queues with no proc refs kconfig: fix broken dependency in randconfig-generated .config clk: qcom: Don't overwrite 'cfg' in clk_rcg2_dfs_populate_freq() clk: qcom: rcg2: Don't crash if our parent can't be found; return an error drm/amdkfd: Fix a bug in SDMA RLC queue counting under HWS mode bpf, sockhash: Synchronize_rcu before free'ing map drm/amdgpu: remove 4 set but not used variable in amdgpu_atombios_get_connector_info_from_object_table ath10k: correct the tlv len of ath10k_wmi_tlv_op_gen_config_pno_start drm/amdgpu: Ensure ret is always initialized when using SOC15_WAIT_ON_RREG drm/panel: simple: Add Logic PD Type 28 display support arm64: dts: rockchip: Fix NanoPC-T4 cooling maps modules: lockdep: Suppress suspicious RCU usage warning ASoC: intel: sof_rt5682: Add quirk for number of HDMI DAI's ASoC: intel: sof_rt5682: Add support for tgl-max98357a-rt5682 regulator: rk808: Lower log level on optional GPIOs being not available net/wan/fsl_ucc_hdlc: reject muram offsets above 64K NFC: port100: Convert cpu_to_le16(le16_to_cpu(E1) + E2) to use le16_add_cpu(). arm64: dts: allwinner: H6: Add PMU mode arm64: dts: allwinner: H5: Add PMU node arm: dts: allwinner: H3: Add PMU node opp: Free static OPPs on errors while adding them selinux: ensure we cleanup the internal AVC counters on error in avc_insert() arm64: dts: qcom: msm8996: Disable USB2 PHY suspend by core padata: validate cpumask without removed CPU during offline clk: imx: Add correct failure handling for clk based helpers ARM: exynos_defconfig: Bring back explicitly wanted options ARM: dts: imx6: rdu2: Disable WP for USDHC2 and USDHC3 ARM: dts: imx6: rdu2: Limit USBH1 to Full Speed bus: ti-sysc: Implement quirk handling for CLKDM_NOAUTO PCI: iproc: Apply quirk_paxc_bridge() for module as well as built-in media: cx23885: Add support for AVerMedia CE310B PCI: Add generic quirk for increasing D3hot delay PCI: Increase D3 delay for AMD Ryzen5/7 XHCI controllers Revert "nfp: abm: fix memory leak in nfp_abm_u32_knode_replace" gpu/drm: ingenic: Avoid null pointer deference in plane atomic update selftests/net: make so_txtime more robust to timer variance media: v4l2-device.h: Explicitly compare grp{id,mask} to zero in v4l2_device macros reiserfs: Fix spurious unlock in reiserfs_fill_super() error handling samples/bpf: Set -fno-stack-protector when building BPF programs r8169: check that Realtek PHY driver module is loaded fore200e: Fix incorrect checks of NULL pointer dereference netfilter: nft_tunnel: add the missing ERSPAN_VERSION nla_policy ALSA: usx2y: Adjust indentation in snd_usX2Y_hwdep_dsp_status PCI: Add nr_devfns parameter to pci_add_dma_alias() PCI: Add DMA alias quirk for PLX PEX NTB b43legacy: Fix -Wcast-function-type ipw2x00: Fix -Wcast-function-type iwlegacy: Fix -Wcast-function-type rtlwifi: rtl_pci: Fix -Wcast-function-type orinoco: avoid assertion in case of NULL pointer drm/amdgpu: fix KIQ ring test fail in TDR of SRIOV clk: qcom: smd: Add missing bimc clock ACPICA: Disassembler: create buffer fields in ACPI_PARSE_LOAD_PASS1 nfsd: Clone should commit src file metadata too scsi: ufs: Complete pending requests in host reset and restore path scsi: aic7xxx: Adjust indentation in ahc_find_syncrate crypto: inside-secure - add unspecified HAS_IOMEM dependency drm/mediatek: handle events when enabling/disabling crtc clk: renesas: rcar-gen3: Allow changing the RPC[D2] clocks ARM: dts: r8a7779: Add device node for ARM global timer selinux: ensure we cleanup the internal AVC counters on error in avc_update() scsi: lpfc: Fix: Rework setting of fdmi symbolic node name registration arm64: dts: qcom: db845c: Enable ath10k 8bit host-cap quirk iommu/amd: Check feature support bit before accessing MSI capability registers iommu/amd: Only support x2APIC with IVHD type 11h/40h iommu/iova: Silence warnings under memory pressure clk: actually call the clock init before any other callback of the clock dmaengine: Store module owner in dma_device struct dmaengine: imx-sdma: Fix memory leak bpf: Print error message for bpftool cgroup show net: phy: realtek: add logging for the RGMII TX delay configuration crypto: chtls - Fixed memory leak x86/vdso: Provide missing include file PM / devfreq: exynos-ppmu: Fix excessive stack usage PM / devfreq: rk3399_dmc: Add COMPILE_TEST and HAVE_ARM_SMCCC dependency drm/fbdev: Fallback to non tiled mode if all tiles not present pinctrl: sh-pfc: sh7269: Fix CAN function GPIOs reset: uniphier: Add SCSSI reset control for each channel ASoC: soc-topology: fix endianness issues fbdev: fix numbering of fbcon options RDMA/rxe: Fix error type of mmap_offset clk: sunxi-ng: add mux and pll notifiers for A64 CPU clock ALSA: sh: Fix unused variable warnings clk: Use parent node pointer during registration if necessary clk: uniphier: Add SCSSI clock gate for each channel ALSA: hda/realtek - Apply mic mute LED quirk for Dell E7xx laptops, too ALSA: sh: Fix compile warning wrt const net: phy: fixed_phy: fix use-after-free when checking link GPIO tools lib api fs: Fix gcc9 stringop-truncation compilation error vfio/spapr/nvlink2: Skip unpinning pages on error exit ASoC: Intel: sof_rt5682: Ignore the speaker amp when there isn't one. ACPI: button: Add DMI quirk for Razer Blade Stealth 13 late 2019 lid switch iommu/vt-d: Match CPU and IOMMU paging mode iommu/vt-d: Avoid sending invalid page response drm/amdkfd: Fix permissions of hang_hws mlx5: work around high stack usage with gcc RDMA/hns: Avoid printing address of mtt page drm: remove the newline for CRC source name. usb: dwc3: use proper initializers for property entries ARM: dts: stm32: Add power-supply for DSI panel on stm32f469-disco usbip: Fix unsafe unaligned pointer usage udf: Fix free space reporting for metadata and virtual partitions drm/mediatek: Add gamma property according to hardware capability staging: rtl8188: avoid excessive stack usage IB/hfi1: Add software counter for ctxt0 seq drop IB/hfi1: Add RcvShortLengthErrCnt to hfi1stats soc/tegra: fuse: Correct straps' address for older Tegra124 device trees efi/x86: Don't panic or BUG() on non-critical error conditions rcu: Use WRITE_ONCE() for assignments to ->pprev for hlist_nulls Input: edt-ft5x06 - work around first register access error bnxt: Detach page from page pool before sending up the stack x86/nmi: Remove irq_work from the long duration NMI handler wan: ixp4xx_hss: fix compile-testing on 64-bit clocksource: davinci: only enable clockevents once tim34 is initialized arm64: dts: rockchip: fix dwmmc clock name for px30 arm64: dts: rockchip: add reg property to brcmf sub-nodes ARM: dts: rockchip: add reg property to brcmf sub node for rk3188-bqedison2qc ALSA: usb-audio: Add boot quirk for MOTU M Series ASoC: atmel: fix build error with CONFIG_SND_ATMEL_SOC_DMA=m raid6/test: fix a compilation warning tty: synclinkmp: Adjust indentation in several functions tty: synclink_gt: Adjust indentation in several functions misc: xilinx_sdfec: fix xsdfec_poll()'s return type visorbus: fix uninitialized variable access driver core: platform: Prevent resouce overflow from causing infinite loops driver core: Print device when resources present in really_probe() ASoC: SOF: Intel: hda-dai: fix compilation warning in pcm_prepare bpf: Return -EBADRQC for invalid map type in __bpf_tx_xdp_map vme: bridges: reduce stack usage drm/nouveau/secboot/gm20b: initialize pointer in gm20b_secboot_new() drm/nouveau/gr/gk20a,gm200-: add terminators to method lists read from fw drm/nouveau: Fix copy-paste error in nouveau_fence_wait_uevent_handler drm/nouveau/drm/ttm: Remove set but not used variable 'mem' drm/nouveau/fault/gv100-: fix memory leak on module unload dm thin: don't allow changing data device during thin-pool reload gpiolib: Set lockdep class for hierarchical irq domains drm/vmwgfx: prevent memory leak in vmw_cmdbuf_res_add perf/imx_ddr: Fix cpu hotplug state cleanup usb: musb: omap2430: Get rid of musb .set_vbus for omap2430 glue kbuild: remove *.tmp file when filechk fails iommu/arm-smmu-v3: Use WRITE_ONCE() when changing validity of an STE ALSA: usb-audio: unlock on error in probe f2fs: set I_LINKABLE early to avoid wrong access by vfs f2fs: free sysfs kobject scsi: ufs: pass device information to apply_dev_quirks scsi: ufs-mediatek: add apply_dev_quirks variant operation scsi: iscsi: Don't destroy session if there are outstanding connections crypto: essiv - fix AEAD capitalization and preposition use in help text ALSA: usb-audio: add implicit fb quirk for MOTU M Series RDMA/mlx5: Don't fake udata for kernel path arm64: lse: fix LSE atomics with LLVM's integrated assembler arm64: fix alternatives with LLVM's integrated assembler drm/amd/display: fixup DML dependencies EDAC/sifive: Fix return value check in ecc_register() KVM: PPC: Remove set but not used variable 'ra', 'rs', 'rt' arm64: dts: ti: k3-j721e-main: Add missing power-domains for smmu sched/core: Fix size of rq::uclamp initialization sched/topology: Assert non-NUMA topology masks don't (partially) overlap perf/x86/amd: Constrain Large Increment per Cycle events watchdog/softlockup: Enforce that timestamp is valid on boot debugobjects: Fix various data races ASoC: SOF: Intel: hda: Fix SKL dai count regulator: vctrl-regulator: Avoid deadlock getting and setting the voltage f2fs: fix memleak of kobject x86/mm: Fix NX bit clearing issue in kernel_map_pages_in_pgd pwm: omap-dmtimer: Remove PWM chip in .remove before making it unfunctional cmd64x: potential buffer overflow in cmd64x_program_timings() ide: serverworks: potential overflow in svwks_set_pio_mode() pwm: Remove set but not set variable 'pwm' btrfs: fix possible NULL-pointer dereference in integrity checks btrfs: safely advance counter when looking up bio csums btrfs: device stats, log when stats are zeroed module: avoid setting info->name early in case we can fall back to info->mod->name remoteproc: Initialize rproc_class before use regulator: core: Fix exported symbols to the exported GPL version irqchip/mbigen: Set driver .suppress_bind_attrs to avoid remove problems ALSA: hda/hdmi - add retry logic to parse_intel_hdmi() spi: spi-fsl-qspi: Ensure width is respected in spi-mem operations kbuild: use -S instead of -E for precise cc-option test in Kconfig objtool: Fix ARCH=x86_64 build error x86/decoder: Add TEST opcode to Group3-2 s390: adjust -mpacked-stack support check for clang 10 s390/ftrace: generate traced function stack frame driver core: platform: fix u32 greater or equal to zero comparison bpf, btf: Always output invariant hit in pahole DWARF to BTF transform ALSA: hda - Add docking station support for Lenovo Thinkpad T420s sunrpc: Fix potential leaks in sunrpc_cache_unhash() drm/nouveau/mmu: fix comptag memory leak powerpc/sriov: Remove VF eeh_dev state when disabling SR-IOV media: uvcvideo: Add a quirk to force GEO GC6500 Camera bits-per-pixel value btrfs: separate definition of assertion failure handlers btrfs: Fix split-brain handling when changing FSID to metadata uuid bcache: cached_dev_free needs to put the sb page bcache: rework error unwinding in register_bcache bcache: fix use-after-free in register_bcache() iommu/vt-d: Remove unnecessary WARN_ON_ONCE() alarmtimer: Make alarmtimer platform device child of RTC device selftests: bpf: Reset global state between reuseport test runs jbd2: switch to use jbd2_journal_abort() when failed to submit the commit record jbd2: make sure ESHUTDOWN to be recorded in the journal superblock powerpc/pseries/lparcfg: Fix display of Maximum Memory selftests/eeh: Bump EEH wait time to 60s ARM: 8951/1: Fix Kexec compilation issue. ALSA: usb-audio: add quirks for Line6 Helix devices fw>=2.82 hostap: Adjust indentation in prism2_hostapd_add_sta rtw88: fix potential NULL skb access in TX ISR iwlegacy: ensure loop counter addr does not wrap and cause an infinite loop cifs: fix unitialized variable poential problem with network I/O cache lock patch cifs: Fix mount options set in automount cifs: fix NULL dereference in match_prepath bpf: map_seq_next should always increase position index powerpc/mm: Don't log user reads to 0xffffffff ceph: check availability of mds cluster on mount after wait timeout rbd: work around -Wuninitialized warning drm/amd/display: do not allocate display_mode_lib unnecessarily irqchip/gic-v3: Only provision redistributors that are enabled in ACPI drm/nouveau/disp/nv50-: prevent oops when no channel method map provided char: hpet: Fix out-of-bounds read bug ftrace: fpid_next() should increase position index trigger_next should increase position index radeon: insert 10ms sleep in dce5_crtc_load_lut powerpc: Do not consider weak unresolved symbol relocations as bad btrfs: do not do delalloc reservation under page lock ocfs2: make local header paths relative to C files ocfs2: fix a NULL pointer dereference when call ocfs2_update_inode_fsync_trans() lib/scatterlist.c: adjust indentation in __sg_alloc_table reiserfs: prevent NULL pointer dereference in reiserfs_insert_item() bcache: fix memory corruption in bch_cache_accounting_clear() bcache: explicity type cast in bset_bkey_last() bcache: fix incorrect data type usage in btree_flush_write() irqchip/gic-v3-its: Reference to its_invall_cmd descriptor when building INVALL nvmet: Pass lockdep expression to RCU lists nvme-pci: remove nvmeq->tags iwlwifi: mvm: Fix thermal zone registration iwlwifi: mvm: Check the sta is not NULL in iwl_mvm_cfg_he_sta() asm-generic/tlb: add missing CONFIG symbol microblaze: Prevent the overflow of the start brd: check and limit max_part par drm/amdgpu/smu10: fix smu10_get_clock_by_type_with_latency drm/amdgpu/smu10: fix smu10_get_clock_by_type_with_voltage NFS: Fix memory leaks help_next should increase position index i40e: Relax i40e_xsk_wakeup's return value when PF is busy cifs: log warning message (once) if out of disk space virtio_balloon: prevent pfn array overflow fuse: don't overflow LLONG_MAX with end offset mlxsw: spectrum_dpipe: Add missing error path s390/pci: Recover handle in clp_set_pci_fn() drm/amdgpu/display: handle multiple numbers of fclks in dcn_calcs.c (v2) bcache: properly initialize 'path' and 'err' in register_bcache() rtc: Kconfig: select REGMAP_I2C when necessary Linux 5.4.22 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Iaeb3945493ecc81a0ae90ef87b19ceb2caf48164
This commit is contained in:
commit
835bd1de9c
@ -127,7 +127,7 @@ C. Boot options
|
||||
is typically located on the same video card. Thus, the consoles that
|
||||
are controlled by the VGA console will be garbled.
|
||||
|
||||
4. fbcon=rotate:<n>
|
||||
5. fbcon=rotate:<n>
|
||||
|
||||
This option changes the orientation angle of the console display. The
|
||||
value 'n' accepts the following:
|
||||
@ -152,21 +152,21 @@ C. Boot options
|
||||
Actually, the underlying fb driver is totally ignorant of console
|
||||
rotation.
|
||||
|
||||
5. fbcon=margin:<color>
|
||||
6. fbcon=margin:<color>
|
||||
|
||||
This option specifies the color of the margins. The margins are the
|
||||
leftover area at the right and the bottom of the screen that are not
|
||||
used by text. By default, this area will be black. The 'color' value
|
||||
is an integer number that depends on the framebuffer driver being used.
|
||||
|
||||
6. fbcon=nodefer
|
||||
7. fbcon=nodefer
|
||||
|
||||
If the kernel is compiled with deferred fbcon takeover support, normally
|
||||
the framebuffer contents, left in place by the firmware/bootloader, will
|
||||
be preserved until there actually is some text is output to the console.
|
||||
This option causes fbcon to bind immediately to the fbdev device.
|
||||
|
||||
7. fbcon=logo-pos:<location>
|
||||
8. fbcon=logo-pos:<location>
|
||||
|
||||
The only possible 'location' is 'center' (without quotes), and when
|
||||
given, the bootup logo is moved from the default top-left corner
|
||||
|
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 4
|
||||
SUBLEVEL = 21
|
||||
SUBLEVEL = 22
|
||||
EXTRAVERSION =
|
||||
NAME = Kleptomaniac Octopus
|
||||
|
||||
|
@ -399,6 +399,9 @@ config HAVE_RCU_TABLE_FREE
|
||||
config HAVE_MMU_GATHER_PAGE_SIZE
|
||||
bool
|
||||
|
||||
config MMU_GATHER_NO_RANGE
|
||||
bool
|
||||
|
||||
config HAVE_MMU_GATHER_NO_GATHER
|
||||
bool
|
||||
|
||||
|
@ -75,7 +75,7 @@ config ARM
|
||||
select HAVE_CONTEXT_TRACKING
|
||||
select HAVE_COPY_THREAD_TLS
|
||||
select HAVE_C_RECORDMCOUNT
|
||||
select HAVE_DEBUG_KMEMLEAK
|
||||
select HAVE_DEBUG_KMEMLEAK if !XIP_KERNEL
|
||||
select HAVE_DMA_CONTIGUOUS if MMU
|
||||
select HAVE_DYNAMIC_FTRACE if !XIP_KERNEL && !CPU_ENDIAN_BE32 && MMU
|
||||
select HAVE_DYNAMIC_FTRACE_WITH_REGS if HAVE_DYNAMIC_FTRACE
|
||||
@ -1907,7 +1907,7 @@ config XIP_DEFLATED_DATA
|
||||
config KEXEC
|
||||
bool "Kexec system call (EXPERIMENTAL)"
|
||||
depends on (!SMP || PM_SLEEP_SMP)
|
||||
depends on !CPU_V7M
|
||||
depends on MMU
|
||||
select KEXEC_CORE
|
||||
help
|
||||
kexec is a system call that implements the ability to shutdown your
|
||||
|
@ -627,7 +627,7 @@ &usdhc2 {
|
||||
pinctrl-0 = <&pinctrl_usdhc2>;
|
||||
bus-width = <4>;
|
||||
cd-gpios = <&gpio2 2 GPIO_ACTIVE_LOW>;
|
||||
wp-gpios = <&gpio2 3 GPIO_ACTIVE_HIGH>;
|
||||
disable-wp;
|
||||
vmmc-supply = <®_3p3v_sd>;
|
||||
vqmmc-supply = <®_3p3v>;
|
||||
no-1-8-v;
|
||||
@ -640,7 +640,7 @@ &usdhc3 {
|
||||
pinctrl-0 = <&pinctrl_usdhc3>;
|
||||
bus-width = <4>;
|
||||
cd-gpios = <&gpio2 0 GPIO_ACTIVE_LOW>;
|
||||
wp-gpios = <&gpio2 1 GPIO_ACTIVE_HIGH>;
|
||||
disable-wp;
|
||||
vmmc-supply = <®_3p3v_sd>;
|
||||
vqmmc-supply = <®_3p3v>;
|
||||
no-1-8-v;
|
||||
@ -774,6 +774,7 @@ switchphy4: switchphy@4 {
|
||||
&usbh1 {
|
||||
vbus-supply = <®_5p0v_main>;
|
||||
disable-over-current;
|
||||
maximum-speed = "full-speed";
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@ -1055,7 +1056,6 @@ MX6QDL_PAD_SD2_DAT0__SD2_DATA0 0x17059
|
||||
MX6QDL_PAD_SD2_DAT1__SD2_DATA1 0x17059
|
||||
MX6QDL_PAD_SD2_DAT2__SD2_DATA2 0x17059
|
||||
MX6QDL_PAD_SD2_DAT3__SD2_DATA3 0x17059
|
||||
MX6QDL_PAD_NANDF_D3__GPIO2_IO03 0x40010040
|
||||
MX6QDL_PAD_NANDF_D2__GPIO2_IO02 0x40010040
|
||||
>;
|
||||
};
|
||||
@ -1068,7 +1068,6 @@ MX6QDL_PAD_SD3_DAT0__SD3_DATA0 0x17059
|
||||
MX6QDL_PAD_SD3_DAT1__SD3_DATA1 0x17059
|
||||
MX6QDL_PAD_SD3_DAT2__SD3_DATA2 0x17059
|
||||
MX6QDL_PAD_SD3_DAT3__SD3_DATA3 0x17059
|
||||
MX6QDL_PAD_NANDF_D1__GPIO2_IO01 0x40010040
|
||||
MX6QDL_PAD_NANDF_D0__GPIO2_IO00 0x40010040
|
||||
|
||||
>;
|
||||
|
@ -68,6 +68,14 @@ gic: interrupt-controller@f0001000 {
|
||||
<0xf0000100 0x100>;
|
||||
};
|
||||
|
||||
timer@f0000200 {
|
||||
compatible = "arm,cortex-a9-global-timer";
|
||||
reg = <0xf0000200 0x100>;
|
||||
interrupts = <GIC_PPI 11
|
||||
(GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_EDGE_RISING)>;
|
||||
clocks = <&cpg_clocks R8A7779_CLK_ZS>;
|
||||
};
|
||||
|
||||
timer@f0000600 {
|
||||
compatible = "arm,cortex-a9-twd-timer";
|
||||
reg = <0xf0000600 0x20>;
|
||||
|
@ -466,9 +466,12 @@ &mmc1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&sd1_clk>, <&sd1_cmd>, <&sd1_bus4>;
|
||||
vmmcq-supply = <&vccio_wl>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
status = "okay";
|
||||
|
||||
brcmf: wifi@1 {
|
||||
reg = <1>;
|
||||
compatible = "brcm,bcm4329-fmac";
|
||||
interrupt-parent = <&gpio3>;
|
||||
interrupts = <RK_PD2 GPIO_ACTIVE_HIGH>;
|
||||
|
@ -76,6 +76,13 @@ mmc_vcard: mmc_vcard {
|
||||
regulator-max-microvolt = <3300000>;
|
||||
};
|
||||
|
||||
vdd_dsi: vdd-dsi {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vdd_dsi";
|
||||
regulator-min-microvolt = <3300000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
};
|
||||
|
||||
soc {
|
||||
dma-ranges = <0xc0000000 0x0 0x10000000>;
|
||||
};
|
||||
@ -155,6 +162,7 @@ panel-dsi@0 {
|
||||
compatible = "orisetech,otm8009a";
|
||||
reg = <0>; /* dsi virtual channel (0..3) */
|
||||
reset-gpios = <&gpioh 7 GPIO_ACTIVE_LOW>;
|
||||
power-supply = <&vdd_dsi>;
|
||||
status = "okay";
|
||||
|
||||
port {
|
||||
|
@ -80,7 +80,7 @@ cpu0: cpu@0 {
|
||||
#cooling-cells = <2>;
|
||||
};
|
||||
|
||||
cpu@1 {
|
||||
cpu1: cpu@1 {
|
||||
compatible = "arm,cortex-a7";
|
||||
device_type = "cpu";
|
||||
reg = <1>;
|
||||
@ -90,7 +90,7 @@ cpu@1 {
|
||||
#cooling-cells = <2>;
|
||||
};
|
||||
|
||||
cpu@2 {
|
||||
cpu2: cpu@2 {
|
||||
compatible = "arm,cortex-a7";
|
||||
device_type = "cpu";
|
||||
reg = <2>;
|
||||
@ -100,7 +100,7 @@ cpu@2 {
|
||||
#cooling-cells = <2>;
|
||||
};
|
||||
|
||||
cpu@3 {
|
||||
cpu3: cpu@3 {
|
||||
compatible = "arm,cortex-a7";
|
||||
device_type = "cpu";
|
||||
reg = <3>;
|
||||
@ -111,6 +111,15 @@ cpu@3 {
|
||||
};
|
||||
};
|
||||
|
||||
pmu {
|
||||
compatible = "arm,cortex-a7-pmu";
|
||||
interrupts = <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 122 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-affinity = <&cpu0>, <&cpu1>, <&cpu2>, <&cpu3>;
|
||||
};
|
||||
|
||||
timer {
|
||||
compatible = "arm,armv7-timer";
|
||||
interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_LEVEL_LOW)>,
|
||||
|
@ -38,6 +38,7 @@ CONFIG_CRYPTO_SHA256_ARM=m
|
||||
CONFIG_CRYPTO_SHA512_ARM=m
|
||||
CONFIG_CRYPTO_AES_ARM_BS=m
|
||||
CONFIG_CRYPTO_CHACHA20_NEON=m
|
||||
CONFIG_KALLSYMS_ALL=y
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
CONFIG_PARTITION_ADVANCED=y
|
||||
@ -92,6 +93,7 @@ CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_CRYPTOLOOP=y
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_SIZE=8192
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_CHR_DEV_SG=y
|
||||
CONFIG_ATA=y
|
||||
@ -290,6 +292,7 @@ CONFIG_CROS_EC_SPI=y
|
||||
CONFIG_COMMON_CLK_MAX77686=y
|
||||
CONFIG_COMMON_CLK_S2MPS11=y
|
||||
CONFIG_EXYNOS_IOMMU=y
|
||||
CONFIG_PM_DEVFREQ=y
|
||||
CONFIG_DEVFREQ_GOV_PERFORMANCE=y
|
||||
CONFIG_DEVFREQ_GOV_POWERSAVE=y
|
||||
CONFIG_DEVFREQ_GOV_USERSPACE=y
|
||||
@ -354,4 +357,7 @@ CONFIG_SOFTLOCKUP_DETECTOR=y
|
||||
# CONFIG_DETECT_HUNG_TASK is not set
|
||||
CONFIG_PROVE_LOCKING=y
|
||||
CONFIG_DEBUG_ATOMIC_SLEEP=y
|
||||
CONFIG_DEBUG_RT_MUTEXES=y
|
||||
CONFIG_DEBUG_SPINLOCK=y
|
||||
CONFIG_DEBUG_MUTEXES=y
|
||||
CONFIG_DEBUG_USER=y
|
||||
|
@ -54,21 +54,21 @@ cpu0: cpu@0 {
|
||||
enable-method = "psci";
|
||||
};
|
||||
|
||||
cpu@1 {
|
||||
cpu1: cpu@1 {
|
||||
compatible = "arm,cortex-a53";
|
||||
device_type = "cpu";
|
||||
reg = <1>;
|
||||
enable-method = "psci";
|
||||
};
|
||||
|
||||
cpu@2 {
|
||||
cpu2: cpu@2 {
|
||||
compatible = "arm,cortex-a53";
|
||||
device_type = "cpu";
|
||||
reg = <2>;
|
||||
enable-method = "psci";
|
||||
};
|
||||
|
||||
cpu@3 {
|
||||
cpu3: cpu@3 {
|
||||
compatible = "arm,cortex-a53";
|
||||
device_type = "cpu";
|
||||
reg = <3>;
|
||||
@ -76,6 +76,16 @@ cpu@3 {
|
||||
};
|
||||
};
|
||||
|
||||
pmu {
|
||||
compatible = "arm,cortex-a53-pmu",
|
||||
"arm,armv8-pmuv3";
|
||||
interrupts = <GIC_SPI 116 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 117 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 118 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 119 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-affinity = <&cpu0>, <&cpu1>, <&cpu2>, <&cpu3>;
|
||||
};
|
||||
|
||||
psci {
|
||||
compatible = "arm,psci-0.2";
|
||||
method = "smc";
|
||||
|
@ -70,6 +70,16 @@ ext_osc32k: ext_osc32k_clk {
|
||||
clock-output-names = "ext_osc32k";
|
||||
};
|
||||
|
||||
pmu {
|
||||
compatible = "arm,cortex-a53-pmu",
|
||||
"arm,armv8-pmuv3";
|
||||
interrupts = <GIC_SPI 140 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 141 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 142 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 143 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-affinity = <&cpu0>, <&cpu1>, <&cpu2>, <&cpu3>;
|
||||
};
|
||||
|
||||
psci {
|
||||
compatible = "arm,psci-0.2";
|
||||
method = "smc";
|
||||
|
@ -1598,6 +1598,8 @@ dwc3@7600000 {
|
||||
interrupts = <0 138 IRQ_TYPE_LEVEL_HIGH>;
|
||||
phys = <&hsusb_phy2>;
|
||||
phy-names = "usb2-phy";
|
||||
snps,dis_u2_susphy_quirk;
|
||||
snps,dis_enblslpm_quirk;
|
||||
};
|
||||
};
|
||||
|
||||
@ -1628,6 +1630,8 @@ dwc3@6a00000 {
|
||||
interrupts = <0 131 IRQ_TYPE_LEVEL_HIGH>;
|
||||
phys = <&hsusb_phy1>, <&ssusb_phy_0>;
|
||||
phy-names = "usb2-phy", "usb3-phy";
|
||||
snps,dis_u2_susphy_quirk;
|
||||
snps,dis_enblslpm_quirk;
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -764,6 +764,8 @@ &wifi {
|
||||
vdd-1.8-xo-supply = <&vreg_l7a_1p8>;
|
||||
vdd-1.3-rfa-supply = <&vreg_l17a_1p3>;
|
||||
vdd-3.3-ch0-supply = <&vreg_l25a_3p3>;
|
||||
|
||||
qcom,snoc-host-cap-8bit-quirk;
|
||||
};
|
||||
|
||||
/* PINCTRL - additions to nodes defined in sdm845.dtsi */
|
||||
|
@ -768,7 +768,7 @@ sdmmc: dwmmc@ff370000 {
|
||||
interrupts = <GIC_SPI 54 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&cru HCLK_SDMMC>, <&cru SCLK_SDMMC>,
|
||||
<&cru SCLK_SDMMC_DRV>, <&cru SCLK_SDMMC_SAMPLE>;
|
||||
clock-names = "biu", "ciu", "ciu-drv", "ciu-sample";
|
||||
clock-names = "biu", "ciu", "ciu-drive", "ciu-sample";
|
||||
fifo-depth = <0x100>;
|
||||
max-frequency = <150000000>;
|
||||
pinctrl-names = "default";
|
||||
@ -783,7 +783,7 @@ sdio: dwmmc@ff380000 {
|
||||
interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&cru HCLK_SDIO>, <&cru SCLK_SDIO>,
|
||||
<&cru SCLK_SDIO_DRV>, <&cru SCLK_SDIO_SAMPLE>;
|
||||
clock-names = "biu", "ciu", "ciu-drv", "ciu-sample";
|
||||
clock-names = "biu", "ciu", "ciu-drive", "ciu-sample";
|
||||
fifo-depth = <0x100>;
|
||||
max-frequency = <150000000>;
|
||||
pinctrl-names = "default";
|
||||
@ -798,7 +798,7 @@ emmc: dwmmc@ff390000 {
|
||||
interrupts = <GIC_SPI 53 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&cru HCLK_EMMC>, <&cru SCLK_EMMC>,
|
||||
<&cru SCLK_EMMC_DRV>, <&cru SCLK_EMMC_SAMPLE>;
|
||||
clock-names = "biu", "ciu", "ciu-drv", "ciu-sample";
|
||||
clock-names = "biu", "ciu", "ciu-drive", "ciu-sample";
|
||||
fifo-depth = <0x100>;
|
||||
max-frequency = <150000000>;
|
||||
power-domains = <&power PX30_PD_MMC_NAND>;
|
||||
|
@ -669,9 +669,12 @@ &sdio0 {
|
||||
vqmmc-supply = &vcc1v8_s3; /* IO line */
|
||||
vmmc-supply = &vcc_sdio; /* card's power */
|
||||
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
status = "okay";
|
||||
|
||||
brcmf: wifi@1 {
|
||||
reg = <1>;
|
||||
compatible = "brcm,bcm4329-fmac";
|
||||
interrupt-parent = <&gpio0>;
|
||||
interrupts = <RK_PA3 GPIO_ACTIVE_HIGH>;
|
||||
|
@ -654,9 +654,12 @@ &sdio0 {
|
||||
sd-uhs-sdr104;
|
||||
vqmmc-supply = <&vcc1v8_s3>;
|
||||
vmmc-supply = <&vccio_sd>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
status = "okay";
|
||||
|
||||
brcmf: wifi@1 {
|
||||
reg = <1>;
|
||||
compatible = "brcm,bcm4329-fmac";
|
||||
interrupt-parent = <&gpio0>;
|
||||
interrupts = <RK_PA3 GPIO_ACTIVE_HIGH>;
|
||||
|
@ -94,33 +94,6 @@ map3 {
|
||||
};
|
||||
};
|
||||
|
||||
&gpu_thermal {
|
||||
trips {
|
||||
gpu_warm: gpu_warm {
|
||||
temperature = <55000>;
|
||||
hysteresis = <2000>;
|
||||
type = "active";
|
||||
};
|
||||
|
||||
gpu_hot: gpu_hot {
|
||||
temperature = <65000>;
|
||||
hysteresis = <2000>;
|
||||
type = "active";
|
||||
};
|
||||
};
|
||||
cooling-maps {
|
||||
map1 {
|
||||
trip = <&gpu_warm>;
|
||||
cooling-device = <&fan THERMAL_NO_LIMIT 1>;
|
||||
};
|
||||
|
||||
map2 {
|
||||
trip = <&gpu_hot>;
|
||||
cooling-device = <&fan 2 THERMAL_NO_LIMIT>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&pinctrl {
|
||||
ir {
|
||||
ir_rx: ir-rx {
|
||||
|
@ -648,9 +648,12 @@ &sdio0 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&sdio0_bus4 &sdio0_cmd &sdio0_clk>;
|
||||
sd-uhs-sdr104;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
status = "okay";
|
||||
|
||||
brcmf: wifi@1 {
|
||||
reg = <1>;
|
||||
compatible = "brcm,bcm4329-fmac";
|
||||
interrupt-parent = <&gpio0>;
|
||||
interrupts = <RK_PA3 GPIO_ACTIVE_HIGH>;
|
||||
|
@ -43,6 +43,7 @@ gic_its: gic-its@1820000 {
|
||||
smmu0: smmu@36600000 {
|
||||
compatible = "arm,smmu-v3";
|
||||
reg = <0x0 0x36600000 0x0 0x100000>;
|
||||
power-domains = <&k3_pds 229 TI_SCI_PD_EXCLUSIVE>;
|
||||
interrupt-parent = <&gic500>;
|
||||
interrupts = <GIC_SPI 772 IRQ_TYPE_EDGE_RISING>,
|
||||
<GIC_SPI 768 IRQ_TYPE_EDGE_RISING>;
|
||||
|
@ -92,7 +92,8 @@ static inline void __disable_dcache_nomsr(void)
|
||||
#define CACHE_LOOP_LIMITS(start, end, cache_line_length, cache_size) \
|
||||
do { \
|
||||
int align = ~(cache_line_length - 1); \
|
||||
end = min(start + cache_size, end); \
|
||||
if (start < UINT_MAX - cache_size) \
|
||||
end = min(start + cache_size, end); \
|
||||
start &= align; \
|
||||
} while (0)
|
||||
|
||||
|
@ -27,6 +27,9 @@ static int __init loongson3_platform_init(void)
|
||||
continue;
|
||||
|
||||
pdev = kzalloc(sizeof(struct platform_device), GFP_KERNEL);
|
||||
if (!pdev)
|
||||
return -ENOMEM;
|
||||
|
||||
pdev->name = loongson_sysconf.sensors[i].name;
|
||||
pdev->id = loongson_sysconf.sensors[i].id;
|
||||
pdev->dev.platform_data = &loongson_sysconf.sensors[i];
|
||||
|
@ -17,11 +17,11 @@ quiet_cmd_head_check = CHKHEAD $@
|
||||
quiet_cmd_relocs_check = CHKREL $@
|
||||
ifdef CONFIG_PPC_BOOK3S_64
|
||||
cmd_relocs_check = \
|
||||
$(CONFIG_SHELL) $(srctree)/arch/powerpc/tools/relocs_check.sh "$(OBJDUMP)" "$@" ; \
|
||||
$(CONFIG_SHELL) $(srctree)/arch/powerpc/tools/relocs_check.sh "$(OBJDUMP)" "$(NM)" "$@" ; \
|
||||
$(BASH) $(srctree)/arch/powerpc/tools/unrel_branch_check.sh "$(OBJDUMP)" "$@"
|
||||
else
|
||||
cmd_relocs_check = \
|
||||
$(CONFIG_SHELL) $(srctree)/arch/powerpc/tools/relocs_check.sh "$(OBJDUMP)" "$@"
|
||||
$(CONFIG_SHELL) $(srctree)/arch/powerpc/tools/relocs_check.sh "$(OBJDUMP)" "$(NM)" "$@"
|
||||
endif
|
||||
|
||||
# `@true` prevents complaint when there is nothing to be done
|
||||
|
@ -541,12 +541,6 @@ static void eeh_rmv_device(struct eeh_dev *edev, void *userdata)
|
||||
|
||||
pci_iov_remove_virtfn(edev->physfn, pdn->vf_index);
|
||||
edev->pdev = NULL;
|
||||
|
||||
/*
|
||||
* We have to set the VF PE number to invalid one, which is
|
||||
* required to plug the VF successfully.
|
||||
*/
|
||||
pdn->pe_number = IODA_INVALID_PE;
|
||||
#endif
|
||||
if (rmv_data)
|
||||
list_add(&edev->rmv_entry, &rmv_data->removed_vf_list);
|
||||
|
@ -244,9 +244,22 @@ void remove_dev_pci_data(struct pci_dev *pdev)
|
||||
continue;
|
||||
|
||||
#ifdef CONFIG_EEH
|
||||
/* Release EEH device for the VF */
|
||||
/*
|
||||
* Release EEH state for this VF. The PCI core
|
||||
* has already torn down the pci_dev for this VF, but
|
||||
* we're responsible to removing the eeh_dev since it
|
||||
* has the same lifetime as the pci_dn that spawned it.
|
||||
*/
|
||||
edev = pdn_to_eeh_dev(pdn);
|
||||
if (edev) {
|
||||
/*
|
||||
* We allocate pci_dn's for the totalvfs count,
|
||||
* but only only the vfs that were activated
|
||||
* have a configured PE.
|
||||
*/
|
||||
if (edev->pe)
|
||||
eeh_rmv_from_parent_pe(edev);
|
||||
|
||||
pdn->edev = NULL;
|
||||
kfree(edev);
|
||||
}
|
||||
|
@ -73,7 +73,6 @@ int kvmppc_emulate_loadstore(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct kvm_run *run = vcpu->run;
|
||||
u32 inst;
|
||||
int ra, rs, rt;
|
||||
enum emulation_result emulated = EMULATE_FAIL;
|
||||
int advance = 1;
|
||||
struct instruction_op op;
|
||||
@ -85,10 +84,6 @@ int kvmppc_emulate_loadstore(struct kvm_vcpu *vcpu)
|
||||
if (emulated != EMULATE_DONE)
|
||||
return emulated;
|
||||
|
||||
ra = get_ra(inst);
|
||||
rs = get_rs(inst);
|
||||
rt = get_rt(inst);
|
||||
|
||||
vcpu->arch.mmio_vsx_copy_nums = 0;
|
||||
vcpu->arch.mmio_vsx_offset = 0;
|
||||
vcpu->arch.mmio_copy_type = KVMPPC_VSX_COPY_NONE;
|
||||
|
@ -354,6 +354,9 @@ static void sanity_check_fault(bool is_write, bool is_user,
|
||||
* Userspace trying to access kernel address, we get PROTFAULT for that.
|
||||
*/
|
||||
if (is_user && address >= TASK_SIZE) {
|
||||
if ((long)address == -1)
|
||||
return;
|
||||
|
||||
pr_crit_ratelimited("%s[%d]: User access of kernel address (%lx) - exploit attempt? (uid: %d)\n",
|
||||
current->comm, current->pid, address,
|
||||
from_kuid(&init_user_ns, current_uid()));
|
||||
|
@ -1558,6 +1558,10 @@ static void pnv_ioda_setup_vf_PE(struct pci_dev *pdev, u16 num_vfs)
|
||||
|
||||
/* Reserve PE for each VF */
|
||||
for (vf_index = 0; vf_index < num_vfs; vf_index++) {
|
||||
int vf_devfn = pci_iov_virtfn_devfn(pdev, vf_index);
|
||||
int vf_bus = pci_iov_virtfn_bus(pdev, vf_index);
|
||||
struct pci_dn *vf_pdn;
|
||||
|
||||
if (pdn->m64_single_mode)
|
||||
pe_num = pdn->pe_num_map[vf_index];
|
||||
else
|
||||
@ -1570,13 +1574,11 @@ static void pnv_ioda_setup_vf_PE(struct pci_dev *pdev, u16 num_vfs)
|
||||
pe->pbus = NULL;
|
||||
pe->parent_dev = pdev;
|
||||
pe->mve_number = -1;
|
||||
pe->rid = (pci_iov_virtfn_bus(pdev, vf_index) << 8) |
|
||||
pci_iov_virtfn_devfn(pdev, vf_index);
|
||||
pe->rid = (vf_bus << 8) | vf_devfn;
|
||||
|
||||
pe_info(pe, "VF %04d:%02d:%02d.%d associated with PE#%x\n",
|
||||
hose->global_number, pdev->bus->number,
|
||||
PCI_SLOT(pci_iov_virtfn_devfn(pdev, vf_index)),
|
||||
PCI_FUNC(pci_iov_virtfn_devfn(pdev, vf_index)), pe_num);
|
||||
PCI_SLOT(vf_devfn), PCI_FUNC(vf_devfn), pe_num);
|
||||
|
||||
if (pnv_ioda_configure_pe(phb, pe)) {
|
||||
/* XXX What do we do here ? */
|
||||
@ -1590,6 +1592,15 @@ static void pnv_ioda_setup_vf_PE(struct pci_dev *pdev, u16 num_vfs)
|
||||
list_add_tail(&pe->list, &phb->ioda.pe_list);
|
||||
mutex_unlock(&phb->ioda.pe_list_mutex);
|
||||
|
||||
/* associate this pe to it's pdn */
|
||||
list_for_each_entry(vf_pdn, &pdn->parent->child_list, list) {
|
||||
if (vf_pdn->busno == vf_bus &&
|
||||
vf_pdn->devfn == vf_devfn) {
|
||||
vf_pdn->pe_number = pe_num;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
pnv_pci_ioda2_setup_dma_pe(phb, pe);
|
||||
#ifdef CONFIG_IOMMU_API
|
||||
iommu_register_group(&pe->table_group,
|
||||
@ -2889,9 +2900,6 @@ static void pnv_pci_ioda_fixup_iov_resources(struct pci_dev *pdev)
|
||||
struct pci_dn *pdn;
|
||||
int mul, total_vfs;
|
||||
|
||||
if (!pdev->is_physfn || pci_dev_is_added(pdev))
|
||||
return;
|
||||
|
||||
pdn = pci_get_pdn(pdev);
|
||||
pdn->vfs_expanded = 0;
|
||||
pdn->m64_single_mode = false;
|
||||
@ -2966,6 +2974,30 @@ static void pnv_pci_ioda_fixup_iov_resources(struct pci_dev *pdev)
|
||||
res->end = res->start - 1;
|
||||
}
|
||||
}
|
||||
|
||||
static void pnv_pci_ioda_fixup_iov(struct pci_dev *pdev)
|
||||
{
|
||||
if (WARN_ON(pci_dev_is_added(pdev)))
|
||||
return;
|
||||
|
||||
if (pdev->is_virtfn) {
|
||||
struct pnv_ioda_pe *pe = pnv_ioda_get_pe(pdev);
|
||||
|
||||
/*
|
||||
* VF PEs are single-device PEs so their pdev pointer needs to
|
||||
* be set. The pdev doesn't exist when the PE is allocated (in
|
||||
* (pcibios_sriov_enable()) so we fix it up here.
|
||||
*/
|
||||
pe->pdev = pdev;
|
||||
WARN_ON(!(pe->flags & PNV_IODA_PE_VF));
|
||||
} else if (pdev->is_physfn) {
|
||||
/*
|
||||
* For PFs adjust their allocated IOV resources to match what
|
||||
* the PHB can support using it's M64 BAR table.
|
||||
*/
|
||||
pnv_pci_ioda_fixup_iov_resources(pdev);
|
||||
}
|
||||
}
|
||||
#endif /* CONFIG_PCI_IOV */
|
||||
|
||||
static void pnv_ioda_setup_pe_res(struct pnv_ioda_pe *pe,
|
||||
@ -3862,7 +3894,7 @@ static void __init pnv_pci_init_ioda_phb(struct device_node *np,
|
||||
ppc_md.pcibios_default_alignment = pnv_pci_default_alignment;
|
||||
|
||||
#ifdef CONFIG_PCI_IOV
|
||||
ppc_md.pcibios_fixup_sriov = pnv_pci_ioda_fixup_iov_resources;
|
||||
ppc_md.pcibios_fixup_sriov = pnv_pci_ioda_fixup_iov;
|
||||
ppc_md.pcibios_iov_resource_alignment = pnv_pci_iov_resource_alignment;
|
||||
ppc_md.pcibios_sriov_enable = pnv_pcibios_sriov_enable;
|
||||
ppc_md.pcibios_sriov_disable = pnv_pcibios_sriov_disable;
|
||||
|
@ -814,24 +814,6 @@ void pnv_pci_dma_dev_setup(struct pci_dev *pdev)
|
||||
{
|
||||
struct pci_controller *hose = pci_bus_to_host(pdev->bus);
|
||||
struct pnv_phb *phb = hose->private_data;
|
||||
#ifdef CONFIG_PCI_IOV
|
||||
struct pnv_ioda_pe *pe;
|
||||
struct pci_dn *pdn;
|
||||
|
||||
/* Fix the VF pdn PE number */
|
||||
if (pdev->is_virtfn) {
|
||||
pdn = pci_get_pdn(pdev);
|
||||
WARN_ON(pdn->pe_number != IODA_INVALID_PE);
|
||||
list_for_each_entry(pe, &phb->ioda.pe_list, list) {
|
||||
if (pe->rid == ((pdev->bus->number << 8) |
|
||||
(pdev->devfn & 0xff))) {
|
||||
pdn->pe_number = pe->pe_number;
|
||||
pe->pdev = pdev;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* CONFIG_PCI_IOV */
|
||||
|
||||
if (phb && phb->dma_dev_setup)
|
||||
phb->dma_dev_setup(phb, pdev);
|
||||
|
@ -435,10 +435,10 @@ static void maxmem_data(struct seq_file *m)
|
||||
{
|
||||
unsigned long maxmem = 0;
|
||||
|
||||
maxmem += drmem_info->n_lmbs * drmem_info->lmb_size;
|
||||
maxmem += (unsigned long)drmem_info->n_lmbs * drmem_info->lmb_size;
|
||||
maxmem += hugetlb_total_pages() * PAGE_SIZE;
|
||||
|
||||
seq_printf(m, "MaxMem=%ld\n", maxmem);
|
||||
seq_printf(m, "MaxMem=%lu\n", maxmem);
|
||||
}
|
||||
|
||||
static int pseries_lparcfg_data(struct seq_file *m, void *v)
|
||||
|
@ -10,14 +10,21 @@
|
||||
# based on relocs_check.pl
|
||||
# Copyright © 2009 IBM Corporation
|
||||
|
||||
if [ $# -lt 2 ]; then
|
||||
echo "$0 [path to objdump] [path to vmlinux]" 1>&2
|
||||
if [ $# -lt 3 ]; then
|
||||
echo "$0 [path to objdump] [path to nm] [path to vmlinux]" 1>&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Have Kbuild supply the path to objdump so we handle cross compilation.
|
||||
# Have Kbuild supply the path to objdump and nm so we handle cross compilation.
|
||||
objdump="$1"
|
||||
vmlinux="$2"
|
||||
nm="$2"
|
||||
vmlinux="$3"
|
||||
|
||||
# Remove from the bad relocations those that match an undefined weak symbol
|
||||
# which will result in an absolute relocation to 0.
|
||||
# Weak unresolved symbols are of that form in nm output:
|
||||
# " w _binary__btf_vmlinux_bin_end"
|
||||
undef_weak_symbols=$($nm "$vmlinux" | awk '$1 ~ /w/ { print $2 }')
|
||||
|
||||
bad_relocs=$(
|
||||
$objdump -R "$vmlinux" |
|
||||
@ -26,8 +33,6 @@ $objdump -R "$vmlinux" |
|
||||
# These relocations are okay
|
||||
# On PPC64:
|
||||
# R_PPC64_RELATIVE, R_PPC64_NONE
|
||||
# R_PPC64_ADDR64 mach_<name>
|
||||
# R_PPC64_ADDR64 __crc_<name>
|
||||
# On PPC:
|
||||
# R_PPC_RELATIVE, R_PPC_ADDR16_HI,
|
||||
# R_PPC_ADDR16_HA,R_PPC_ADDR16_LO,
|
||||
@ -39,8 +44,7 @@ R_PPC_ADDR16_HI
|
||||
R_PPC_ADDR16_HA
|
||||
R_PPC_RELATIVE
|
||||
R_PPC_NONE' |
|
||||
grep -E -v '\<R_PPC64_ADDR64[[:space:]]+mach_' |
|
||||
grep -E -v '\<R_PPC64_ADDR64[[:space:]]+__crc_'
|
||||
([ "$undef_weak_symbols" ] && grep -F -w -v "$undef_weak_symbols" || cat)
|
||||
)
|
||||
|
||||
if [ -z "$bad_relocs" ]; then
|
||||
|
@ -69,7 +69,7 @@ cflags-y += -Wa,-I$(srctree)/arch/$(ARCH)/include
|
||||
#
|
||||
cflags-$(CONFIG_FRAME_POINTER) += -fno-optimize-sibling-calls
|
||||
|
||||
ifeq ($(call cc-option-yn,-mpacked-stack),y)
|
||||
ifeq ($(call cc-option-yn,-mpacked-stack -mbackchain -msoft-float),y)
|
||||
cflags-$(CONFIG_PACK_STACK) += -mpacked-stack -D__PACK_STACK
|
||||
aflags-$(CONFIG_PACK_STACK) += -D__PACK_STACK
|
||||
endif
|
||||
|
@ -183,7 +183,7 @@ void zpci_remove_reserved_devices(void);
|
||||
/* CLP */
|
||||
int clp_scan_pci_devices(void);
|
||||
int clp_rescan_pci_devices(void);
|
||||
int clp_rescan_pci_devices_simple(void);
|
||||
int clp_rescan_pci_devices_simple(u32 *fid);
|
||||
int clp_add_pci_device(u32, u32, int);
|
||||
int clp_enable_fh(struct zpci_dev *, u8);
|
||||
int clp_disable_fh(struct zpci_dev *);
|
||||
|
@ -26,6 +26,12 @@ ENDPROC(ftrace_stub)
|
||||
#define STACK_PTREGS (STACK_FRAME_OVERHEAD)
|
||||
#define STACK_PTREGS_GPRS (STACK_PTREGS + __PT_GPRS)
|
||||
#define STACK_PTREGS_PSW (STACK_PTREGS + __PT_PSW)
|
||||
#ifdef __PACK_STACK
|
||||
/* allocate just enough for r14, r15 and backchain */
|
||||
#define TRACED_FUNC_FRAME_SIZE 24
|
||||
#else
|
||||
#define TRACED_FUNC_FRAME_SIZE STACK_FRAME_OVERHEAD
|
||||
#endif
|
||||
|
||||
ENTRY(_mcount)
|
||||
BR_EX %r14
|
||||
@ -39,9 +45,16 @@ ENTRY(ftrace_caller)
|
||||
#if !(defined(CC_USING_HOTPATCH) || defined(CC_USING_NOP_MCOUNT))
|
||||
aghi %r0,MCOUNT_RETURN_FIXUP
|
||||
#endif
|
||||
aghi %r15,-STACK_FRAME_SIZE
|
||||
# allocate stack frame for ftrace_caller to contain traced function
|
||||
aghi %r15,-TRACED_FUNC_FRAME_SIZE
|
||||
stg %r1,__SF_BACKCHAIN(%r15)
|
||||
stg %r0,(__SF_GPRS+8*8)(%r15)
|
||||
stg %r15,(__SF_GPRS+9*8)(%r15)
|
||||
# allocate pt_regs and stack frame for ftrace_trace_function
|
||||
aghi %r15,-STACK_FRAME_SIZE
|
||||
stg %r1,(STACK_PTREGS_GPRS+15*8)(%r15)
|
||||
aghi %r1,-TRACED_FUNC_FRAME_SIZE
|
||||
stg %r1,__SF_BACKCHAIN(%r15)
|
||||
stg %r0,(STACK_PTREGS_PSW+8)(%r15)
|
||||
stmg %r2,%r14,(STACK_PTREGS_GPRS+2*8)(%r15)
|
||||
#ifdef CONFIG_HAVE_MARCH_Z196_FEATURES
|
||||
|
@ -2191,7 +2191,7 @@ static int flic_ais_mode_get_all(struct kvm *kvm, struct kvm_device_attr *attr)
|
||||
return -EINVAL;
|
||||
|
||||
if (!test_kvm_facility(kvm, 72))
|
||||
return -ENOTSUPP;
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
mutex_lock(&fi->ais_lock);
|
||||
ais.simm = fi->simm;
|
||||
@ -2500,7 +2500,7 @@ static int modify_ais_mode(struct kvm *kvm, struct kvm_device_attr *attr)
|
||||
int ret = 0;
|
||||
|
||||
if (!test_kvm_facility(kvm, 72))
|
||||
return -ENOTSUPP;
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (copy_from_user(&req, (void __user *)attr->addr, sizeof(req)))
|
||||
return -EFAULT;
|
||||
@ -2580,7 +2580,7 @@ static int flic_ais_mode_set_all(struct kvm *kvm, struct kvm_device_attr *attr)
|
||||
struct kvm_s390_ais_all ais;
|
||||
|
||||
if (!test_kvm_facility(kvm, 72))
|
||||
return -ENOTSUPP;
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (copy_from_user(&ais, (void __user *)attr->addr, sizeof(ais)))
|
||||
return -EFAULT;
|
||||
|
@ -934,5 +934,5 @@ subsys_initcall_sync(pci_base_init);
|
||||
void zpci_rescan(void)
|
||||
{
|
||||
if (zpci_is_enabled())
|
||||
clp_rescan_pci_devices_simple();
|
||||
clp_rescan_pci_devices_simple(NULL);
|
||||
}
|
||||
|
@ -240,12 +240,14 @@ int clp_add_pci_device(u32 fid, u32 fh, int configured)
|
||||
}
|
||||
|
||||
/*
|
||||
* Enable/Disable a given PCI function defined by its function handle.
|
||||
* Enable/Disable a given PCI function and update its function handle if
|
||||
* necessary
|
||||
*/
|
||||
static int clp_set_pci_fn(u32 *fh, u8 nr_dma_as, u8 command)
|
||||
static int clp_set_pci_fn(struct zpci_dev *zdev, u8 nr_dma_as, u8 command)
|
||||
{
|
||||
struct clp_req_rsp_set_pci *rrb;
|
||||
int rc, retries = 100;
|
||||
u32 fid = zdev->fid;
|
||||
|
||||
rrb = clp_alloc_block(GFP_KERNEL);
|
||||
if (!rrb)
|
||||
@ -256,7 +258,7 @@ static int clp_set_pci_fn(u32 *fh, u8 nr_dma_as, u8 command)
|
||||
rrb->request.hdr.len = sizeof(rrb->request);
|
||||
rrb->request.hdr.cmd = CLP_SET_PCI_FN;
|
||||
rrb->response.hdr.len = sizeof(rrb->response);
|
||||
rrb->request.fh = *fh;
|
||||
rrb->request.fh = zdev->fh;
|
||||
rrb->request.oc = command;
|
||||
rrb->request.ndas = nr_dma_as;
|
||||
|
||||
@ -269,12 +271,17 @@ static int clp_set_pci_fn(u32 *fh, u8 nr_dma_as, u8 command)
|
||||
}
|
||||
} while (rrb->response.hdr.rsp == CLP_RC_SETPCIFN_BUSY);
|
||||
|
||||
if (!rc && rrb->response.hdr.rsp == CLP_RC_OK)
|
||||
*fh = rrb->response.fh;
|
||||
else {
|
||||
if (rc || rrb->response.hdr.rsp != CLP_RC_OK) {
|
||||
zpci_err("Set PCI FN:\n");
|
||||
zpci_err_clp(rrb->response.hdr.rsp, rc);
|
||||
rc = -EIO;
|
||||
}
|
||||
|
||||
if (!rc && rrb->response.hdr.rsp == CLP_RC_OK) {
|
||||
zdev->fh = rrb->response.fh;
|
||||
} else if (!rc && rrb->response.hdr.rsp == CLP_RC_SETPCIFN_ALRDY &&
|
||||
rrb->response.fh == 0) {
|
||||
/* Function is already in desired state - update handle */
|
||||
rc = clp_rescan_pci_devices_simple(&fid);
|
||||
}
|
||||
clp_free_block(rrb);
|
||||
return rc;
|
||||
@ -282,18 +289,17 @@ static int clp_set_pci_fn(u32 *fh, u8 nr_dma_as, u8 command)
|
||||
|
||||
int clp_enable_fh(struct zpci_dev *zdev, u8 nr_dma_as)
|
||||
{
|
||||
u32 fh = zdev->fh;
|
||||
int rc;
|
||||
|
||||
rc = clp_set_pci_fn(&fh, nr_dma_as, CLP_SET_ENABLE_PCI_FN);
|
||||
zpci_dbg(3, "ena fid:%x, fh:%x, rc:%d\n", zdev->fid, fh, rc);
|
||||
rc = clp_set_pci_fn(zdev, nr_dma_as, CLP_SET_ENABLE_PCI_FN);
|
||||
zpci_dbg(3, "ena fid:%x, fh:%x, rc:%d\n", zdev->fid, zdev->fh, rc);
|
||||
if (rc)
|
||||
goto out;
|
||||
|
||||
zdev->fh = fh;
|
||||
if (zpci_use_mio(zdev)) {
|
||||
rc = clp_set_pci_fn(&fh, nr_dma_as, CLP_SET_ENABLE_MIO);
|
||||
zpci_dbg(3, "ena mio fid:%x, fh:%x, rc:%d\n", zdev->fid, fh, rc);
|
||||
rc = clp_set_pci_fn(zdev, nr_dma_as, CLP_SET_ENABLE_MIO);
|
||||
zpci_dbg(3, "ena mio fid:%x, fh:%x, rc:%d\n",
|
||||
zdev->fid, zdev->fh, rc);
|
||||
if (rc)
|
||||
clp_disable_fh(zdev);
|
||||
}
|
||||
@ -309,11 +315,8 @@ int clp_disable_fh(struct zpci_dev *zdev)
|
||||
if (!zdev_enabled(zdev))
|
||||
return 0;
|
||||
|
||||
rc = clp_set_pci_fn(&fh, 0, CLP_SET_DISABLE_PCI_FN);
|
||||
rc = clp_set_pci_fn(zdev, 0, CLP_SET_DISABLE_PCI_FN);
|
||||
zpci_dbg(3, "dis fid:%x, fh:%x, rc:%d\n", zdev->fid, fh, rc);
|
||||
if (!rc)
|
||||
zdev->fh = fh;
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
@ -370,10 +373,14 @@ static void __clp_add(struct clp_fh_list_entry *entry, void *data)
|
||||
static void __clp_update(struct clp_fh_list_entry *entry, void *data)
|
||||
{
|
||||
struct zpci_dev *zdev;
|
||||
u32 *fid = data;
|
||||
|
||||
if (!entry->vendor_id)
|
||||
return;
|
||||
|
||||
if (fid && *fid != entry->fid)
|
||||
return;
|
||||
|
||||
zdev = get_zdev_by_fid(entry->fid);
|
||||
if (!zdev)
|
||||
return;
|
||||
@ -413,7 +420,10 @@ int clp_rescan_pci_devices(void)
|
||||
return rc;
|
||||
}
|
||||
|
||||
int clp_rescan_pci_devices_simple(void)
|
||||
/* Rescan PCI functions and refresh function handles. If fid is non-NULL only
|
||||
* refresh the handle of the function matching @fid
|
||||
*/
|
||||
int clp_rescan_pci_devices_simple(u32 *fid)
|
||||
{
|
||||
struct clp_req_rsp_list_pci *rrb;
|
||||
int rc;
|
||||
@ -422,7 +432,7 @@ int clp_rescan_pci_devices_simple(void)
|
||||
if (!rrb)
|
||||
return -ENOMEM;
|
||||
|
||||
rc = clp_list_pci(rrb, NULL, __clp_update);
|
||||
rc = clp_list_pci(rrb, fid, __clp_update);
|
||||
|
||||
clp_free_block(rrb);
|
||||
return rc;
|
||||
|
@ -13,6 +13,8 @@
|
||||
#include <linux/stat.h>
|
||||
#include <linux/pci.h>
|
||||
|
||||
#include "../../../drivers/pci/pci.h"
|
||||
|
||||
#include <asm/sclp.h>
|
||||
|
||||
#define zpci_attr(name, fmt, member) \
|
||||
@ -49,31 +51,50 @@ static DEVICE_ATTR_RO(mio_enabled);
|
||||
static ssize_t recover_store(struct device *dev, struct device_attribute *attr,
|
||||
const char *buf, size_t count)
|
||||
{
|
||||
struct kernfs_node *kn;
|
||||
struct pci_dev *pdev = to_pci_dev(dev);
|
||||
struct zpci_dev *zdev = to_zpci(pdev);
|
||||
int ret;
|
||||
int ret = 0;
|
||||
|
||||
if (!device_remove_file_self(dev, attr))
|
||||
return count;
|
||||
/* Can't use device_remove_self() here as that would lead us to lock
|
||||
* the pci_rescan_remove_lock while holding the device' kernfs lock.
|
||||
* This would create a possible deadlock with disable_slot() which is
|
||||
* not directly protected by the device' kernfs lock but takes it
|
||||
* during the device removal which happens under
|
||||
* pci_rescan_remove_lock.
|
||||
*
|
||||
* This is analogous to sdev_store_delete() in
|
||||
* drivers/scsi/scsi_sysfs.c
|
||||
*/
|
||||
kn = sysfs_break_active_protection(&dev->kobj, &attr->attr);
|
||||
WARN_ON_ONCE(!kn);
|
||||
/* device_remove_file() serializes concurrent calls ignoring all but
|
||||
* the first
|
||||
*/
|
||||
device_remove_file(dev, attr);
|
||||
|
||||
/* A concurrent call to recover_store() may slip between
|
||||
* sysfs_break_active_protection() and the sysfs file removal.
|
||||
* Once it unblocks from pci_lock_rescan_remove() the original pdev
|
||||
* will already be removed.
|
||||
*/
|
||||
pci_lock_rescan_remove();
|
||||
pci_stop_and_remove_bus_device(pdev);
|
||||
ret = zpci_disable_device(zdev);
|
||||
if (ret)
|
||||
goto error;
|
||||
if (pci_dev_is_added(pdev)) {
|
||||
pci_stop_and_remove_bus_device(pdev);
|
||||
ret = zpci_disable_device(zdev);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
ret = zpci_enable_device(zdev);
|
||||
if (ret)
|
||||
goto error;
|
||||
|
||||
pci_rescan_bus(zdev->bus);
|
||||
ret = zpci_enable_device(zdev);
|
||||
if (ret)
|
||||
goto out;
|
||||
pci_rescan_bus(zdev->bus);
|
||||
}
|
||||
out:
|
||||
pci_unlock_rescan_remove();
|
||||
|
||||
return count;
|
||||
|
||||
error:
|
||||
pci_unlock_rescan_remove();
|
||||
return ret;
|
||||
if (kn)
|
||||
sysfs_unbreak_active_protection(kn);
|
||||
return ret ? ret : count;
|
||||
}
|
||||
static DEVICE_ATTR_WO(recover);
|
||||
|
||||
|
@ -78,8 +78,15 @@ enum {
|
||||
GPIO_FN_WDTOVF,
|
||||
|
||||
/* CAN */
|
||||
GPIO_FN_CTX1, GPIO_FN_CRX1, GPIO_FN_CTX0, GPIO_FN_CTX0_CTX1,
|
||||
GPIO_FN_CRX0, GPIO_FN_CRX0_CRX1, GPIO_FN_CRX0_CRX1_CRX2,
|
||||
GPIO_FN_CTX2, GPIO_FN_CRX2,
|
||||
GPIO_FN_CTX1, GPIO_FN_CRX1,
|
||||
GPIO_FN_CTX0, GPIO_FN_CRX0,
|
||||
GPIO_FN_CTX0_CTX1, GPIO_FN_CRX0_CRX1,
|
||||
GPIO_FN_CTX0_CTX1_CTX2, GPIO_FN_CRX0_CRX1_CRX2,
|
||||
GPIO_FN_CTX2_PJ21, GPIO_FN_CRX2_PJ20,
|
||||
GPIO_FN_CTX1_PJ23, GPIO_FN_CRX1_PJ22,
|
||||
GPIO_FN_CTX0_CTX1_PJ23, GPIO_FN_CRX0_CRX1_PJ22,
|
||||
GPIO_FN_CTX0_CTX1_CTX2_PJ21, GPIO_FN_CRX0_CRX1_CRX2_PJ20,
|
||||
|
||||
/* DMAC */
|
||||
GPIO_FN_TEND0, GPIO_FN_DACK0, GPIO_FN_DREQ0,
|
||||
|
@ -172,12 +172,14 @@ SECTIONS
|
||||
}
|
||||
PERCPU_SECTION(SMP_CACHE_BYTES)
|
||||
|
||||
#ifdef CONFIG_JUMP_LABEL
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
.exit.text : {
|
||||
EXIT_TEXT
|
||||
}
|
||||
#endif
|
||||
|
||||
.exit.data : {
|
||||
EXIT_DATA
|
||||
}
|
||||
|
||||
. = ALIGN(PAGE_SIZE);
|
||||
__init_end = .;
|
||||
|
@ -11,6 +11,7 @@
|
||||
#include <linux/smp.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/mm_types.h>
|
||||
#include <linux/elf.h>
|
||||
|
||||
#include <asm/processor.h>
|
||||
#include <asm/vdso.h>
|
||||
|
@ -302,6 +302,25 @@ static inline int amd_pmu_addr_offset(int index, bool eventsel)
|
||||
return offset;
|
||||
}
|
||||
|
||||
/*
|
||||
* AMD64 events are detected based on their event codes.
|
||||
*/
|
||||
static inline unsigned int amd_get_event_code(struct hw_perf_event *hwc)
|
||||
{
|
||||
return ((hwc->config >> 24) & 0x0f00) | (hwc->config & 0x00ff);
|
||||
}
|
||||
|
||||
static inline bool amd_is_pair_event_code(struct hw_perf_event *hwc)
|
||||
{
|
||||
if (!(x86_pmu.flags & PMU_FL_PAIR))
|
||||
return false;
|
||||
|
||||
switch (amd_get_event_code(hwc)) {
|
||||
case 0x003: return true; /* Retired SSE/AVX FLOPs */
|
||||
default: return false;
|
||||
}
|
||||
}
|
||||
|
||||
static int amd_core_hw_config(struct perf_event *event)
|
||||
{
|
||||
if (event->attr.exclude_host && event->attr.exclude_guest)
|
||||
@ -320,14 +339,6 @@ static int amd_core_hw_config(struct perf_event *event)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* AMD64 events are detected based on their event codes.
|
||||
*/
|
||||
static inline unsigned int amd_get_event_code(struct hw_perf_event *hwc)
|
||||
{
|
||||
return ((hwc->config >> 24) & 0x0f00) | (hwc->config & 0x00ff);
|
||||
}
|
||||
|
||||
static inline int amd_is_nb_event(struct hw_perf_event *hwc)
|
||||
{
|
||||
return (hwc->config & 0xe0) == 0xe0;
|
||||
@ -865,6 +876,20 @@ amd_get_event_constraints_f15h(struct cpu_hw_events *cpuc, int idx,
|
||||
}
|
||||
}
|
||||
|
||||
static struct event_constraint pair_constraint;
|
||||
|
||||
static struct event_constraint *
|
||||
amd_get_event_constraints_f17h(struct cpu_hw_events *cpuc, int idx,
|
||||
struct perf_event *event)
|
||||
{
|
||||
struct hw_perf_event *hwc = &event->hw;
|
||||
|
||||
if (amd_is_pair_event_code(hwc))
|
||||
return &pair_constraint;
|
||||
|
||||
return &unconstrained;
|
||||
}
|
||||
|
||||
static ssize_t amd_event_sysfs_show(char *page, u64 config)
|
||||
{
|
||||
u64 event = (config & ARCH_PERFMON_EVENTSEL_EVENT) |
|
||||
@ -908,33 +933,15 @@ static __initconst const struct x86_pmu amd_pmu = {
|
||||
|
||||
static int __init amd_core_pmu_init(void)
|
||||
{
|
||||
u64 even_ctr_mask = 0ULL;
|
||||
int i;
|
||||
|
||||
if (!boot_cpu_has(X86_FEATURE_PERFCTR_CORE))
|
||||
return 0;
|
||||
|
||||
/* Avoid calulating the value each time in the NMI handler */
|
||||
/* Avoid calculating the value each time in the NMI handler */
|
||||
perf_nmi_window = msecs_to_jiffies(100);
|
||||
|
||||
switch (boot_cpu_data.x86) {
|
||||
case 0x15:
|
||||
pr_cont("Fam15h ");
|
||||
x86_pmu.get_event_constraints = amd_get_event_constraints_f15h;
|
||||
break;
|
||||
case 0x17:
|
||||
pr_cont("Fam17h ");
|
||||
/*
|
||||
* In family 17h, there are no event constraints in the PMC hardware.
|
||||
* We fallback to using default amd_get_event_constraints.
|
||||
*/
|
||||
break;
|
||||
case 0x18:
|
||||
pr_cont("Fam18h ");
|
||||
/* Using default amd_get_event_constraints. */
|
||||
break;
|
||||
default:
|
||||
pr_err("core perfctr but no constraints; unknown hardware!\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
/*
|
||||
* If core performance counter extensions exists, we must use
|
||||
* MSR_F15H_PERF_CTL/MSR_F15H_PERF_CTR msrs. See also
|
||||
@ -949,6 +956,30 @@ static int __init amd_core_pmu_init(void)
|
||||
*/
|
||||
x86_pmu.amd_nb_constraints = 0;
|
||||
|
||||
if (boot_cpu_data.x86 == 0x15) {
|
||||
pr_cont("Fam15h ");
|
||||
x86_pmu.get_event_constraints = amd_get_event_constraints_f15h;
|
||||
}
|
||||
if (boot_cpu_data.x86 >= 0x17) {
|
||||
pr_cont("Fam17h+ ");
|
||||
/*
|
||||
* Family 17h and compatibles have constraints for Large
|
||||
* Increment per Cycle events: they may only be assigned an
|
||||
* even numbered counter that has a consecutive adjacent odd
|
||||
* numbered counter following it.
|
||||
*/
|
||||
for (i = 0; i < x86_pmu.num_counters - 1; i += 2)
|
||||
even_ctr_mask |= 1 << i;
|
||||
|
||||
pair_constraint = (struct event_constraint)
|
||||
__EVENT_CONSTRAINT(0, even_ctr_mask, 0,
|
||||
x86_pmu.num_counters / 2, 0,
|
||||
PERF_X86_EVENT_PAIR);
|
||||
|
||||
x86_pmu.get_event_constraints = amd_get_event_constraints_f17h;
|
||||
x86_pmu.flags |= PMU_FL_PAIR;
|
||||
}
|
||||
|
||||
pr_cont("core perfctr, ");
|
||||
return 0;
|
||||
}
|
||||
|
@ -77,6 +77,7 @@ static inline bool constraint_match(struct event_constraint *c, u64 ecode)
|
||||
#define PERF_X86_EVENT_AUTO_RELOAD 0x0200 /* use PEBS auto-reload */
|
||||
#define PERF_X86_EVENT_LARGE_PEBS 0x0400 /* use large PEBS */
|
||||
#define PERF_X86_EVENT_PEBS_VIA_PT 0x0800 /* use PT buffer for PEBS */
|
||||
#define PERF_X86_EVENT_PAIR 0x1000 /* Large Increment per Cycle */
|
||||
|
||||
struct amd_nb {
|
||||
int nb_id; /* NorthBridge id */
|
||||
@ -735,6 +736,7 @@ do { \
|
||||
#define PMU_FL_EXCL_ENABLED 0x8 /* exclusive counter active */
|
||||
#define PMU_FL_PEBS_ALL 0x10 /* all events are valid PEBS events */
|
||||
#define PMU_FL_TFA 0x20 /* deal with TSX force abort */
|
||||
#define PMU_FL_PAIR 0x40 /* merge counters for large incr. events */
|
||||
|
||||
#define EVENT_VAR(_id) event_attr_##_id
|
||||
#define EVENT_PTR(_id) &event_attr_##_id.attr.attr
|
||||
|
@ -41,7 +41,6 @@ struct nmiaction {
|
||||
struct list_head list;
|
||||
nmi_handler_t handler;
|
||||
u64 max_duration;
|
||||
struct irq_work irq_work;
|
||||
unsigned long flags;
|
||||
const char *name;
|
||||
};
|
||||
|
@ -352,6 +352,7 @@ static int __fpu__restore_sig(void __user *buf, void __user *buf_fx, int size)
|
||||
fpregs_unlock();
|
||||
return 0;
|
||||
}
|
||||
fpregs_deactivate(fpu);
|
||||
fpregs_unlock();
|
||||
}
|
||||
|
||||
@ -403,6 +404,8 @@ static int __fpu__restore_sig(void __user *buf, void __user *buf_fx, int size)
|
||||
}
|
||||
if (!ret)
|
||||
fpregs_mark_activate();
|
||||
else
|
||||
fpregs_deactivate(fpu);
|
||||
fpregs_unlock();
|
||||
|
||||
err_out:
|
||||
|
@ -104,18 +104,22 @@ static int __init nmi_warning_debugfs(void)
|
||||
}
|
||||
fs_initcall(nmi_warning_debugfs);
|
||||
|
||||
static void nmi_max_handler(struct irq_work *w)
|
||||
static void nmi_check_duration(struct nmiaction *action, u64 duration)
|
||||
{
|
||||
struct nmiaction *a = container_of(w, struct nmiaction, irq_work);
|
||||
u64 whole_msecs = READ_ONCE(action->max_duration);
|
||||
int remainder_ns, decimal_msecs;
|
||||
u64 whole_msecs = READ_ONCE(a->max_duration);
|
||||
|
||||
if (duration < nmi_longest_ns || duration < action->max_duration)
|
||||
return;
|
||||
|
||||
action->max_duration = duration;
|
||||
|
||||
remainder_ns = do_div(whole_msecs, (1000 * 1000));
|
||||
decimal_msecs = remainder_ns / 1000;
|
||||
|
||||
printk_ratelimited(KERN_INFO
|
||||
"INFO: NMI handler (%ps) took too long to run: %lld.%03d msecs\n",
|
||||
a->handler, whole_msecs, decimal_msecs);
|
||||
action->handler, whole_msecs, decimal_msecs);
|
||||
}
|
||||
|
||||
static int nmi_handle(unsigned int type, struct pt_regs *regs)
|
||||
@ -142,11 +146,7 @@ static int nmi_handle(unsigned int type, struct pt_regs *regs)
|
||||
delta = sched_clock() - delta;
|
||||
trace_nmi_handler(a->handler, (int)delta, thishandled);
|
||||
|
||||
if (delta < nmi_longest_ns || delta < a->max_duration)
|
||||
continue;
|
||||
|
||||
a->max_duration = delta;
|
||||
irq_work_queue(&a->irq_work);
|
||||
nmi_check_duration(a, delta);
|
||||
}
|
||||
|
||||
rcu_read_unlock();
|
||||
@ -164,8 +164,6 @@ int __register_nmi_handler(unsigned int type, struct nmiaction *action)
|
||||
if (!action->handler)
|
||||
return -EINVAL;
|
||||
|
||||
init_irq_work(&action->irq_work, nmi_max_handler);
|
||||
|
||||
raw_spin_lock_irqsave(&desc->lock, flags);
|
||||
|
||||
/*
|
||||
|
@ -90,11 +90,11 @@ __init int create_simplefb(const struct screen_info *si,
|
||||
if (si->orig_video_isVGA == VIDEO_TYPE_VLFB)
|
||||
size <<= 16;
|
||||
length = mode->height * mode->stride;
|
||||
length = PAGE_ALIGN(length);
|
||||
if (length > size) {
|
||||
printk(KERN_WARNING "sysfb: VRAM smaller than advertised\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
length = PAGE_ALIGN(length);
|
||||
|
||||
/* setup IORESOURCE_MEM as framebuffer memory */
|
||||
memset(&res, 0, sizeof(res));
|
||||
|
@ -909,7 +909,7 @@ EndTable
|
||||
|
||||
GrpTable: Grp3_2
|
||||
0: TEST Ev,Iz
|
||||
1:
|
||||
1: TEST Ev,Iz
|
||||
2: NOT Ev
|
||||
3: NEG Ev
|
||||
4: MUL rAX,Ev
|
||||
|
@ -2215,7 +2215,7 @@ int __init kernel_map_pages_in_pgd(pgd_t *pgd, u64 pfn, unsigned long address,
|
||||
.pgd = pgd,
|
||||
.numpages = numpages,
|
||||
.mask_set = __pgprot(0),
|
||||
.mask_clr = __pgprot(0),
|
||||
.mask_clr = __pgprot(~page_flags & (_PAGE_NX|_PAGE_RW)),
|
||||
.flags = 0,
|
||||
};
|
||||
|
||||
@ -2224,12 +2224,6 @@ int __init kernel_map_pages_in_pgd(pgd_t *pgd, u64 pfn, unsigned long address,
|
||||
if (!(__supported_pte_mask & _PAGE_NX))
|
||||
goto out;
|
||||
|
||||
if (!(page_flags & _PAGE_NX))
|
||||
cpa.mask_clr = __pgprot(_PAGE_NX);
|
||||
|
||||
if (!(page_flags & _PAGE_RW))
|
||||
cpa.mask_clr = __pgprot(_PAGE_RW);
|
||||
|
||||
if (!(page_flags & _PAGE_ENC))
|
||||
cpa.mask_clr = pgprot_encrypted(cpa.mask_clr);
|
||||
|
||||
|
@ -504,7 +504,6 @@ void __init efi_init(void)
|
||||
efi_char16_t *c16;
|
||||
char vendor[100] = "unknown";
|
||||
int i = 0;
|
||||
void *tmp;
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
if (boot_params.efi_info.efi_systab_hi ||
|
||||
@ -529,14 +528,16 @@ void __init efi_init(void)
|
||||
/*
|
||||
* Show what we know for posterity
|
||||
*/
|
||||
c16 = tmp = early_memremap(efi.systab->fw_vendor, 2);
|
||||
c16 = early_memremap_ro(efi.systab->fw_vendor,
|
||||
sizeof(vendor) * sizeof(efi_char16_t));
|
||||
if (c16) {
|
||||
for (i = 0; i < sizeof(vendor) - 1 && *c16; ++i)
|
||||
vendor[i] = *c16++;
|
||||
for (i = 0; i < sizeof(vendor) - 1 && c16[i]; ++i)
|
||||
vendor[i] = c16[i];
|
||||
vendor[i] = '\0';
|
||||
} else
|
||||
early_memunmap(c16, sizeof(vendor) * sizeof(efi_char16_t));
|
||||
} else {
|
||||
pr_err("Could not map the firmware vendor!\n");
|
||||
early_memunmap(tmp, 2);
|
||||
}
|
||||
|
||||
pr_info("EFI v%u.%.02u by %s\n",
|
||||
efi.systab->hdr.revision >> 16,
|
||||
@ -953,16 +954,14 @@ static void __init __efi_enter_virtual_mode(void)
|
||||
|
||||
if (efi_alloc_page_tables()) {
|
||||
pr_err("Failed to allocate EFI page tables\n");
|
||||
clear_bit(EFI_RUNTIME_SERVICES, &efi.flags);
|
||||
return;
|
||||
goto err;
|
||||
}
|
||||
|
||||
efi_merge_regions();
|
||||
new_memmap = efi_map_regions(&count, &pg_shift);
|
||||
if (!new_memmap) {
|
||||
pr_err("Error reallocating memory, EFI runtime non-functional!\n");
|
||||
clear_bit(EFI_RUNTIME_SERVICES, &efi.flags);
|
||||
return;
|
||||
goto err;
|
||||
}
|
||||
|
||||
pa = __pa(new_memmap);
|
||||
@ -976,8 +975,7 @@ static void __init __efi_enter_virtual_mode(void)
|
||||
|
||||
if (efi_memmap_init_late(pa, efi.memmap.desc_size * count)) {
|
||||
pr_err("Failed to remap late EFI memory map\n");
|
||||
clear_bit(EFI_RUNTIME_SERVICES, &efi.flags);
|
||||
return;
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (efi_enabled(EFI_DBG)) {
|
||||
@ -985,12 +983,11 @@ static void __init __efi_enter_virtual_mode(void)
|
||||
efi_print_memmap();
|
||||
}
|
||||
|
||||
BUG_ON(!efi.systab);
|
||||
if (WARN_ON(!efi.systab))
|
||||
goto err;
|
||||
|
||||
if (efi_setup_page_tables(pa, 1 << pg_shift)) {
|
||||
clear_bit(EFI_RUNTIME_SERVICES, &efi.flags);
|
||||
return;
|
||||
}
|
||||
if (efi_setup_page_tables(pa, 1 << pg_shift))
|
||||
goto err;
|
||||
|
||||
efi_sync_low_kernel_mappings();
|
||||
|
||||
@ -1010,9 +1007,9 @@ static void __init __efi_enter_virtual_mode(void)
|
||||
}
|
||||
|
||||
if (status != EFI_SUCCESS) {
|
||||
pr_alert("Unable to switch EFI into virtual mode (status=%lx)!\n",
|
||||
status);
|
||||
panic("EFI call to SetVirtualAddressMap() failed!");
|
||||
pr_err("Unable to switch EFI into virtual mode (status=%lx)!\n",
|
||||
status);
|
||||
goto err;
|
||||
}
|
||||
|
||||
efi_free_boot_services();
|
||||
@ -1041,6 +1038,10 @@ static void __init __efi_enter_virtual_mode(void)
|
||||
|
||||
/* clean DUMMY object */
|
||||
efi_delete_dummy_variable();
|
||||
return;
|
||||
|
||||
err:
|
||||
clear_bit(EFI_RUNTIME_SERVICES, &efi.flags);
|
||||
}
|
||||
|
||||
void __init efi_enter_virtual_mode(void)
|
||||
|
@ -392,11 +392,12 @@ int __init efi_setup_page_tables(unsigned long pa_memmap, unsigned num_pages)
|
||||
return 0;
|
||||
|
||||
page = alloc_page(GFP_KERNEL|__GFP_DMA32);
|
||||
if (!page)
|
||||
panic("Unable to allocate EFI runtime stack < 4GB\n");
|
||||
if (!page) {
|
||||
pr_err("Unable to allocate EFI runtime stack < 4GB\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
efi_scratch.phys_stack = virt_to_phys(page_address(page));
|
||||
efi_scratch.phys_stack += PAGE_SIZE; /* stack grows down */
|
||||
efi_scratch.phys_stack = page_to_phys(page + 1); /* stack grows down */
|
||||
|
||||
npages = (_etext - _text) >> PAGE_SHIFT;
|
||||
text = __pa(_text);
|
||||
|
@ -3444,6 +3444,10 @@ static void bfq_dispatch_remove(struct request_queue *q, struct request *rq)
|
||||
static bool idling_needed_for_service_guarantees(struct bfq_data *bfqd,
|
||||
struct bfq_queue *bfqq)
|
||||
{
|
||||
/* No point in idling for bfqq if it won't get requests any longer */
|
||||
if (unlikely(!bfqq_process_refs(bfqq)))
|
||||
return false;
|
||||
|
||||
return (bfqq->wr_coeff > 1 &&
|
||||
(bfqd->wr_busy_queues <
|
||||
bfq_tot_busy_queues(bfqd) ||
|
||||
@ -4077,6 +4081,10 @@ static bool idling_boosts_thr_without_issues(struct bfq_data *bfqd,
|
||||
bfqq_sequential_and_IO_bound,
|
||||
idling_boosts_thr;
|
||||
|
||||
/* No point in idling for bfqq if it won't get requests any longer */
|
||||
if (unlikely(!bfqq_process_refs(bfqq)))
|
||||
return false;
|
||||
|
||||
bfqq_sequential_and_IO_bound = !BFQQ_SEEKY(bfqq) &&
|
||||
bfq_bfqq_IO_bound(bfqq) && bfq_bfqq_has_short_ttime(bfqq);
|
||||
|
||||
@ -4170,6 +4178,10 @@ static bool bfq_better_to_idle(struct bfq_queue *bfqq)
|
||||
struct bfq_data *bfqd = bfqq->bfqd;
|
||||
bool idling_boosts_thr_with_no_issue, idling_needed_for_service_guar;
|
||||
|
||||
/* No point in idling for bfqq if it won't get requests any longer */
|
||||
if (unlikely(!bfqq_process_refs(bfqq)))
|
||||
return false;
|
||||
|
||||
if (unlikely(bfqd->strict_guarantees))
|
||||
return true;
|
||||
|
||||
|
@ -500,10 +500,10 @@ config CRYPTO_ESSIV
|
||||
encryption.
|
||||
|
||||
This driver implements a crypto API template that can be
|
||||
instantiated either as a skcipher or as a aead (depending on the
|
||||
instantiated either as an skcipher or as an AEAD (depending on the
|
||||
type of the first template argument), and which defers encryption
|
||||
and decryption requests to the encapsulated cipher after applying
|
||||
ESSIV to the input IV. Note that in the aead case, it is assumed
|
||||
ESSIV to the input IV. Note that in the AEAD case, it is assumed
|
||||
that the keys are presented in the same format used by the authenc
|
||||
template, and that the IV appears at the end of the authenticated
|
||||
associated data (AAD) region (which is how dm-crypt uses it.)
|
||||
|
@ -244,7 +244,7 @@ acpi_ds_create_buffer_field(union acpi_parse_object *op,
|
||||
* FUNCTION: acpi_ds_get_field_names
|
||||
*
|
||||
* PARAMETERS: info - create_field info structure
|
||||
* ` walk_state - Current method state
|
||||
* walk_state - Current method state
|
||||
* arg - First parser arg for the field name list
|
||||
*
|
||||
* RETURN: Status
|
||||
|
@ -410,6 +410,27 @@ acpi_status acpi_ds_load1_end_op(struct acpi_walk_state *walk_state)
|
||||
ACPI_DEBUG_PRINT((ACPI_DB_DISPATCH, "Op=%p State=%p\n", op,
|
||||
walk_state));
|
||||
|
||||
/*
|
||||
* Disassembler: handle create field operators here.
|
||||
*
|
||||
* create_buffer_field is a deferred op that is typically processed in load
|
||||
* pass 2. However, disassembly of control method contents walk the parse
|
||||
* tree with ACPI_PARSE_LOAD_PASS1 and AML_CREATE operators are processed
|
||||
* in a later walk. This is a problem when there is a control method that
|
||||
* has the same name as the AML_CREATE object. In this case, any use of the
|
||||
* name segment will be detected as a method call rather than a reference
|
||||
* to a buffer field.
|
||||
*
|
||||
* This earlier creation during disassembly solves this issue by inserting
|
||||
* the named object in the ACPI namespace so that references to this name
|
||||
* would be a name string rather than a method call.
|
||||
*/
|
||||
if ((walk_state->parse_flags & ACPI_PARSE_DISASSEMBLE) &&
|
||||
(walk_state->op_info->flags & AML_CREATE)) {
|
||||
status = acpi_ds_create_buffer_field(op, walk_state);
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/* We are only interested in opcodes that have an associated name */
|
||||
|
||||
if (!(walk_state->op_info->flags & (AML_NAMED | AML_FIELD))) {
|
||||
|
@ -89,6 +89,17 @@ static const struct dmi_system_id lid_blacklst[] = {
|
||||
},
|
||||
.driver_data = (void *)(long)ACPI_BUTTON_LID_INIT_OPEN,
|
||||
},
|
||||
{
|
||||
/*
|
||||
* Razer Blade Stealth 13 late 2019, notification of the LID device
|
||||
* only happens on close, not on open and _LID always returns closed.
|
||||
*/
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "Razer"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Razer Blade Stealth 13 Late 2019"),
|
||||
},
|
||||
.driver_data = (void *)(long)ACPI_BUTTON_LID_INIT_OPEN,
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
|
@ -1414,12 +1414,14 @@ fore200e_open(struct atm_vcc *vcc)
|
||||
static void
|
||||
fore200e_close(struct atm_vcc* vcc)
|
||||
{
|
||||
struct fore200e* fore200e = FORE200E_DEV(vcc->dev);
|
||||
struct fore200e_vcc* fore200e_vcc;
|
||||
struct fore200e* fore200e;
|
||||
struct fore200e_vc_map* vc_map;
|
||||
unsigned long flags;
|
||||
|
||||
ASSERT(vcc);
|
||||
fore200e = FORE200E_DEV(vcc->dev);
|
||||
|
||||
ASSERT((vcc->vpi >= 0) && (vcc->vpi < 1<<FORE200E_VPI_BITS));
|
||||
ASSERT((vcc->vci >= 0) && (vcc->vci < 1<<FORE200E_VCI_BITS));
|
||||
|
||||
@ -1464,10 +1466,10 @@ fore200e_close(struct atm_vcc* vcc)
|
||||
static int
|
||||
fore200e_send(struct atm_vcc *vcc, struct sk_buff *skb)
|
||||
{
|
||||
struct fore200e* fore200e = FORE200E_DEV(vcc->dev);
|
||||
struct fore200e_vcc* fore200e_vcc = FORE200E_VCC(vcc);
|
||||
struct fore200e* fore200e;
|
||||
struct fore200e_vcc* fore200e_vcc;
|
||||
struct fore200e_vc_map* vc_map;
|
||||
struct host_txq* txq = &fore200e->host_txq;
|
||||
struct host_txq* txq;
|
||||
struct host_txq_entry* entry;
|
||||
struct tpd* tpd;
|
||||
struct tpd_haddr tpd_haddr;
|
||||
@ -1480,9 +1482,18 @@ fore200e_send(struct atm_vcc *vcc, struct sk_buff *skb)
|
||||
unsigned char* data;
|
||||
unsigned long flags;
|
||||
|
||||
ASSERT(vcc);
|
||||
ASSERT(fore200e);
|
||||
ASSERT(fore200e_vcc);
|
||||
if (!vcc)
|
||||
return -EINVAL;
|
||||
|
||||
fore200e = FORE200E_DEV(vcc->dev);
|
||||
fore200e_vcc = FORE200E_VCC(vcc);
|
||||
|
||||
if (!fore200e)
|
||||
return -EINVAL;
|
||||
|
||||
txq = &fore200e->host_txq;
|
||||
if (!fore200e_vcc)
|
||||
return -EINVAL;
|
||||
|
||||
if (!test_bit(ATM_VF_READY, &vcc->flags)) {
|
||||
DPRINTK(1, "VC %d.%d.%d not ready for tx\n", vcc->itf, vcc->vpi, vcc->vpi);
|
||||
|
@ -516,7 +516,10 @@ static int really_probe(struct device *dev, struct device_driver *drv)
|
||||
atomic_inc(&probe_count);
|
||||
pr_debug("bus: '%s': %s: probing driver %s with device %s\n",
|
||||
drv->bus->name, __func__, drv->name, dev_name(dev));
|
||||
WARN_ON(!list_empty(&dev->devres_head));
|
||||
if (!list_empty(&dev->devres_head)) {
|
||||
dev_crit(dev, "Resources present before probing\n");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
re_probe:
|
||||
dev->driver = drv;
|
||||
|
@ -27,6 +27,7 @@
|
||||
#include <linux/limits.h>
|
||||
#include <linux/property.h>
|
||||
#include <linux/kmemleak.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
#include "base.h"
|
||||
#include "power/power.h"
|
||||
@ -48,7 +49,7 @@ EXPORT_SYMBOL_GPL(platform_bus);
|
||||
struct resource *platform_get_resource(struct platform_device *dev,
|
||||
unsigned int type, unsigned int num)
|
||||
{
|
||||
int i;
|
||||
u32 i;
|
||||
|
||||
for (i = 0; i < dev->num_resources; i++) {
|
||||
struct resource *r = &dev->resource[i];
|
||||
@ -226,7 +227,7 @@ struct resource *platform_get_resource_byname(struct platform_device *dev,
|
||||
unsigned int type,
|
||||
const char *name)
|
||||
{
|
||||
int i;
|
||||
u32 i;
|
||||
|
||||
for (i = 0; i < dev->num_resources; i++) {
|
||||
struct resource *r = &dev->resource[i];
|
||||
@ -473,7 +474,8 @@ EXPORT_SYMBOL_GPL(platform_device_add_properties);
|
||||
*/
|
||||
int platform_device_add(struct platform_device *pdev)
|
||||
{
|
||||
int i, ret;
|
||||
u32 i;
|
||||
int ret;
|
||||
|
||||
if (!pdev)
|
||||
return -EINVAL;
|
||||
@ -541,7 +543,7 @@ int platform_device_add(struct platform_device *pdev)
|
||||
pdev->id = PLATFORM_DEVID_AUTO;
|
||||
}
|
||||
|
||||
while (--i >= 0) {
|
||||
while (i--) {
|
||||
struct resource *r = &pdev->resource[i];
|
||||
if (r->parent)
|
||||
release_resource(r);
|
||||
@ -562,7 +564,7 @@ EXPORT_SYMBOL_GPL(platform_device_add);
|
||||
*/
|
||||
void platform_device_del(struct platform_device *pdev)
|
||||
{
|
||||
int i;
|
||||
u32 i;
|
||||
|
||||
if (!IS_ERR_OR_NULL(pdev)) {
|
||||
device_del(&pdev->dev);
|
||||
|
@ -470,6 +470,25 @@ static struct kobject *brd_probe(dev_t dev, int *part, void *data)
|
||||
return kobj;
|
||||
}
|
||||
|
||||
static inline void brd_check_and_reset_par(void)
|
||||
{
|
||||
if (unlikely(!max_part))
|
||||
max_part = 1;
|
||||
|
||||
/*
|
||||
* make sure 'max_part' can be divided exactly by (1U << MINORBITS),
|
||||
* otherwise, it is possiable to get same dev_t when adding partitions.
|
||||
*/
|
||||
if ((1U << MINORBITS) % max_part != 0)
|
||||
max_part = 1UL << fls(max_part);
|
||||
|
||||
if (max_part > DISK_MAX_PARTS) {
|
||||
pr_info("brd: max_part can't be larger than %d, reset max_part = %d.\n",
|
||||
DISK_MAX_PARTS, DISK_MAX_PARTS);
|
||||
max_part = DISK_MAX_PARTS;
|
||||
}
|
||||
}
|
||||
|
||||
static int __init brd_init(void)
|
||||
{
|
||||
struct brd_device *brd, *next;
|
||||
@ -493,8 +512,7 @@ static int __init brd_init(void)
|
||||
if (register_blkdev(RAMDISK_MAJOR, "ramdisk"))
|
||||
return -EIO;
|
||||
|
||||
if (unlikely(!max_part))
|
||||
max_part = 1;
|
||||
brd_check_and_reset_par();
|
||||
|
||||
for (i = 0; i < rd_nr; i++) {
|
||||
brd = brd_alloc(i);
|
||||
|
@ -1265,6 +1265,16 @@ static int nbd_start_device(struct nbd_device *nbd)
|
||||
args = kzalloc(sizeof(*args), GFP_KERNEL);
|
||||
if (!args) {
|
||||
sock_shutdown(nbd);
|
||||
/*
|
||||
* If num_connections is m (2 < m),
|
||||
* and NO.1 ~ NO.n(1 < n < m) kzallocs are successful.
|
||||
* But NO.(n + 1) failed. We still have n recv threads.
|
||||
* So, add flush_workqueue here to prevent recv threads
|
||||
* dropping the last config_refs and trying to destroy
|
||||
* the workqueue from inside the workqueue.
|
||||
*/
|
||||
if (i)
|
||||
flush_workqueue(nbd->recv_workq);
|
||||
return -ENOMEM;
|
||||
}
|
||||
sk_set_memalloc(config->socks[i]->sock->sk);
|
||||
|
@ -2739,7 +2739,7 @@ static int rbd_img_fill_nodata(struct rbd_img_request *img_req,
|
||||
u64 off, u64 len)
|
||||
{
|
||||
struct ceph_file_extent ex = { off, len };
|
||||
union rbd_img_fill_iter dummy;
|
||||
union rbd_img_fill_iter dummy = {};
|
||||
struct rbd_img_fill_ctx fctx = {
|
||||
.pos_type = OBJ_REQUEST_NODATA,
|
||||
.pos = &dummy,
|
||||
|
@ -626,7 +626,7 @@ static ssize_t writeback_store(struct device *dev,
|
||||
struct bio bio;
|
||||
struct bio_vec bio_vec;
|
||||
struct page *page;
|
||||
ssize_t ret;
|
||||
ssize_t ret = len;
|
||||
int mode;
|
||||
unsigned long blk_idx = 0;
|
||||
|
||||
@ -762,7 +762,6 @@ static ssize_t writeback_store(struct device *dev,
|
||||
|
||||
if (blk_idx)
|
||||
free_block_bdev(zram, blk_idx);
|
||||
ret = len;
|
||||
__free_page(page);
|
||||
release_init_lock:
|
||||
up_read(&zram->init_lock);
|
||||
|
@ -479,7 +479,7 @@ static void sysc_clkdm_deny_idle(struct sysc *ddata)
|
||||
{
|
||||
struct ti_sysc_platform_data *pdata;
|
||||
|
||||
if (ddata->legacy_mode)
|
||||
if (ddata->legacy_mode || (ddata->cfg.quirks & SYSC_QUIRK_CLKDM_NOAUTO))
|
||||
return;
|
||||
|
||||
pdata = dev_get_platdata(ddata->dev);
|
||||
@ -491,7 +491,7 @@ static void sysc_clkdm_allow_idle(struct sysc *ddata)
|
||||
{
|
||||
struct ti_sysc_platform_data *pdata;
|
||||
|
||||
if (ddata->legacy_mode)
|
||||
if (ddata->legacy_mode || (ddata->cfg.quirks & SYSC_QUIRK_CLKDM_NOAUTO))
|
||||
return;
|
||||
|
||||
pdata = dev_get_platdata(ddata->dev);
|
||||
@ -1251,6 +1251,12 @@ static const struct sysc_revision_quirk sysc_revision_quirks[] = {
|
||||
/* Quirks that need to be set based on detected module */
|
||||
SYSC_QUIRK("aess", 0, 0, 0x10, -1, 0x40000000, 0xffffffff,
|
||||
SYSC_MODULE_QUIRK_AESS),
|
||||
SYSC_QUIRK("dcan", 0x48480000, 0x20, -1, -1, 0xa3170504, 0xffffffff,
|
||||
SYSC_QUIRK_CLKDM_NOAUTO),
|
||||
SYSC_QUIRK("dwc3", 0x48880000, 0, 0x10, -1, 0x500a0200, 0xffffffff,
|
||||
SYSC_QUIRK_CLKDM_NOAUTO),
|
||||
SYSC_QUIRK("dwc3", 0x488c0000, 0, 0x10, -1, 0x500a0200, 0xffffffff,
|
||||
SYSC_QUIRK_CLKDM_NOAUTO),
|
||||
SYSC_QUIRK("hdq1w", 0, 0, 0x14, 0x18, 0x00000006, 0xffffffff,
|
||||
SYSC_MODULE_QUIRK_HDQ1W),
|
||||
SYSC_QUIRK("hdq1w", 0, 0, 0x14, 0x18, 0x0000000a, 0xffffffff,
|
||||
|
@ -855,7 +855,7 @@ int hpet_alloc(struct hpet_data *hdp)
|
||||
return 0;
|
||||
}
|
||||
|
||||
hpetp = kzalloc(struct_size(hpetp, hp_dev, hdp->hd_nirqs - 1),
|
||||
hpetp = kzalloc(struct_size(hpetp, hp_dev, hdp->hd_nirqs),
|
||||
GFP_KERNEL);
|
||||
|
||||
if (!hpetp)
|
||||
|
@ -47,6 +47,7 @@ static const struct clk_programmable_layout sam9x60_programmable_layout = {
|
||||
.pres_shift = 8,
|
||||
.css_mask = 0x1f,
|
||||
.have_slck_mck = 0,
|
||||
.is_pres_direct = 1,
|
||||
};
|
||||
|
||||
static const struct clk_pcr_layout sam9x60_pcr_layout = {
|
||||
|
@ -3400,6 +3400,21 @@ static int __clk_core_init(struct clk_core *core)
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* optional platform-specific magic
|
||||
*
|
||||
* The .init callback is not used by any of the basic clock types, but
|
||||
* exists for weird hardware that must perform initialization magic.
|
||||
* Please consider other ways of solving initialization problems before
|
||||
* using this callback, as its use is discouraged.
|
||||
*
|
||||
* If it exist, this callback should called before any other callback of
|
||||
* the clock
|
||||
*/
|
||||
if (core->ops->init)
|
||||
core->ops->init(core->hw);
|
||||
|
||||
|
||||
core->parent = __clk_init_parent(core);
|
||||
|
||||
/*
|
||||
@ -3424,17 +3439,6 @@ static int __clk_core_init(struct clk_core *core)
|
||||
core->orphan = true;
|
||||
}
|
||||
|
||||
/*
|
||||
* optional platform-specific magic
|
||||
*
|
||||
* The .init callback is not used by any of the basic clock types, but
|
||||
* exists for weird hardware that must perform initialization magic.
|
||||
* Please consider other ways of solving initialization problems before
|
||||
* using this callback, as its use is discouraged.
|
||||
*/
|
||||
if (core->ops->init)
|
||||
core->ops->init(core->hw);
|
||||
|
||||
/*
|
||||
* Set clk's accuracy. The preferred method is to use
|
||||
* .recalc_accuracy. For simple clocks and lazy developers the default
|
||||
@ -3796,6 +3800,28 @@ __clk_register(struct device *dev, struct device_node *np, struct clk_hw *hw)
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
/**
|
||||
* dev_or_parent_of_node() - Get device node of @dev or @dev's parent
|
||||
* @dev: Device to get device node of
|
||||
*
|
||||
* Return: device node pointer of @dev, or the device node pointer of
|
||||
* @dev->parent if dev doesn't have a device node, or NULL if neither
|
||||
* @dev or @dev->parent have a device node.
|
||||
*/
|
||||
static struct device_node *dev_or_parent_of_node(struct device *dev)
|
||||
{
|
||||
struct device_node *np;
|
||||
|
||||
if (!dev)
|
||||
return NULL;
|
||||
|
||||
np = dev_of_node(dev);
|
||||
if (!np)
|
||||
np = dev_of_node(dev->parent);
|
||||
|
||||
return np;
|
||||
}
|
||||
|
||||
/**
|
||||
* clk_register - allocate a new clock, register it and return an opaque cookie
|
||||
* @dev: device that is registering this clock
|
||||
@ -3811,7 +3837,7 @@ __clk_register(struct device *dev, struct device_node *np, struct clk_hw *hw)
|
||||
*/
|
||||
struct clk *clk_register(struct device *dev, struct clk_hw *hw)
|
||||
{
|
||||
return __clk_register(dev, dev_of_node(dev), hw);
|
||||
return __clk_register(dev, dev_or_parent_of_node(dev), hw);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(clk_register);
|
||||
|
||||
@ -3827,7 +3853,8 @@ EXPORT_SYMBOL_GPL(clk_register);
|
||||
*/
|
||||
int clk_hw_register(struct device *dev, struct clk_hw *hw)
|
||||
{
|
||||
return PTR_ERR_OR_ZERO(__clk_register(dev, dev_of_node(dev), hw));
|
||||
return PTR_ERR_OR_ZERO(__clk_register(dev, dev_or_parent_of_node(dev),
|
||||
hw));
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(clk_hw_register);
|
||||
|
||||
|
@ -51,48 +51,48 @@ struct imx_pll14xx_clk {
|
||||
};
|
||||
|
||||
#define imx_clk_cpu(name, parent_name, div, mux, pll, step) \
|
||||
imx_clk_hw_cpu(name, parent_name, div, mux, pll, step)->clk
|
||||
to_clk(imx_clk_hw_cpu(name, parent_name, div, mux, pll, step))
|
||||
|
||||
#define clk_register_gate2(dev, name, parent_name, flags, reg, bit_idx, \
|
||||
cgr_val, clk_gate_flags, lock, share_count) \
|
||||
clk_hw_register_gate2(dev, name, parent_name, flags, reg, bit_idx, \
|
||||
cgr_val, clk_gate_flags, lock, share_count)->clk
|
||||
to_clk(clk_hw_register_gate2(dev, name, parent_name, flags, reg, bit_idx, \
|
||||
cgr_val, clk_gate_flags, lock, share_count))
|
||||
|
||||
#define imx_clk_pllv3(type, name, parent_name, base, div_mask) \
|
||||
imx_clk_hw_pllv3(type, name, parent_name, base, div_mask)->clk
|
||||
to_clk(imx_clk_hw_pllv3(type, name, parent_name, base, div_mask))
|
||||
|
||||
#define imx_clk_pfd(name, parent_name, reg, idx) \
|
||||
imx_clk_hw_pfd(name, parent_name, reg, idx)->clk
|
||||
to_clk(imx_clk_hw_pfd(name, parent_name, reg, idx))
|
||||
|
||||
#define imx_clk_gate_exclusive(name, parent, reg, shift, exclusive_mask) \
|
||||
imx_clk_hw_gate_exclusive(name, parent, reg, shift, exclusive_mask)->clk
|
||||
to_clk(imx_clk_hw_gate_exclusive(name, parent, reg, shift, exclusive_mask))
|
||||
|
||||
#define imx_clk_fixed_factor(name, parent, mult, div) \
|
||||
imx_clk_hw_fixed_factor(name, parent, mult, div)->clk
|
||||
to_clk(imx_clk_hw_fixed_factor(name, parent, mult, div))
|
||||
|
||||
#define imx_clk_divider2(name, parent, reg, shift, width) \
|
||||
imx_clk_hw_divider2(name, parent, reg, shift, width)->clk
|
||||
to_clk(imx_clk_hw_divider2(name, parent, reg, shift, width))
|
||||
|
||||
#define imx_clk_gate_dis(name, parent, reg, shift) \
|
||||
imx_clk_hw_gate_dis(name, parent, reg, shift)->clk
|
||||
to_clk(imx_clk_hw_gate_dis(name, parent, reg, shift))
|
||||
|
||||
#define imx_clk_gate2(name, parent, reg, shift) \
|
||||
imx_clk_hw_gate2(name, parent, reg, shift)->clk
|
||||
to_clk(imx_clk_hw_gate2(name, parent, reg, shift))
|
||||
|
||||
#define imx_clk_gate2_flags(name, parent, reg, shift, flags) \
|
||||
imx_clk_hw_gate2_flags(name, parent, reg, shift, flags)->clk
|
||||
to_clk(imx_clk_hw_gate2_flags(name, parent, reg, shift, flags))
|
||||
|
||||
#define imx_clk_gate2_shared2(name, parent, reg, shift, share_count) \
|
||||
imx_clk_hw_gate2_shared2(name, parent, reg, shift, share_count)->clk
|
||||
to_clk(imx_clk_hw_gate2_shared2(name, parent, reg, shift, share_count))
|
||||
|
||||
#define imx_clk_gate3(name, parent, reg, shift) \
|
||||
imx_clk_hw_gate3(name, parent, reg, shift)->clk
|
||||
to_clk(imx_clk_hw_gate3(name, parent, reg, shift))
|
||||
|
||||
#define imx_clk_gate4(name, parent, reg, shift) \
|
||||
imx_clk_hw_gate4(name, parent, reg, shift)->clk
|
||||
to_clk(imx_clk_hw_gate4(name, parent, reg, shift))
|
||||
|
||||
#define imx_clk_mux(name, reg, shift, width, parents, num_parents) \
|
||||
imx_clk_hw_mux(name, reg, shift, width, parents, num_parents)->clk
|
||||
to_clk(imx_clk_hw_mux(name, reg, shift, width, parents, num_parents))
|
||||
|
||||
struct clk *imx_clk_pll14xx(const char *name, const char *parent_name,
|
||||
void __iomem *base, const struct imx_pll14xx_clk *pll_clk);
|
||||
@ -195,6 +195,13 @@ struct clk_hw *imx_clk_hw_fixup_mux(const char *name, void __iomem *reg,
|
||||
u8 shift, u8 width, const char * const *parents,
|
||||
int num_parents, void (*fixup)(u32 *val));
|
||||
|
||||
static inline struct clk *to_clk(struct clk_hw *hw)
|
||||
{
|
||||
if (IS_ERR_OR_NULL(hw))
|
||||
return ERR_CAST(hw);
|
||||
return hw->clk;
|
||||
}
|
||||
|
||||
static inline struct clk *imx_clk_fixed(const char *name, int rate)
|
||||
{
|
||||
return clk_register_fixed_rate(NULL, name, NULL, 0, rate);
|
||||
|
@ -77,6 +77,15 @@ static unsigned long meson_clk_pll_recalc_rate(struct clk_hw *hw,
|
||||
unsigned int m, n, frac;
|
||||
|
||||
n = meson_parm_read(clk->map, &pll->n);
|
||||
|
||||
/*
|
||||
* On some HW, N is set to zero on init. This value is invalid as
|
||||
* it would result in a division by zero. The rate can't be
|
||||
* calculated in this case
|
||||
*/
|
||||
if (n == 0)
|
||||
return 0;
|
||||
|
||||
m = meson_parm_read(clk->map, &pll->m);
|
||||
|
||||
frac = MESON_PARM_APPLICABLE(&pll->frac) ?
|
||||
|
@ -1764,8 +1764,11 @@ static struct clk_regmap meson8b_hdmi_sys = {
|
||||
|
||||
/*
|
||||
* The MALI IP is clocked by two identical clocks (mali_0 and mali_1)
|
||||
* muxed by a glitch-free switch on Meson8b and Meson8m2. Meson8 only
|
||||
* has mali_0 and no glitch-free mux.
|
||||
* muxed by a glitch-free switch on Meson8b and Meson8m2. The CCF can
|
||||
* actually manage this glitch-free mux because it does top-to-bottom
|
||||
* updates the each clock tree and switches to the "inactive" one when
|
||||
* CLK_SET_RATE_GATE is set.
|
||||
* Meson8 only has mali_0 and no glitch-free mux.
|
||||
*/
|
||||
static const struct clk_hw *meson8b_mali_0_1_parent_hws[] = {
|
||||
&meson8b_xtal.hw,
|
||||
@ -1830,7 +1833,7 @@ static struct clk_regmap meson8b_mali_0 = {
|
||||
&meson8b_mali_0_div.hw
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT,
|
||||
},
|
||||
};
|
||||
|
||||
@ -1885,7 +1888,7 @@ static struct clk_regmap meson8b_mali_1 = {
|
||||
&meson8b_mali_1_div.hw
|
||||
},
|
||||
.num_parents = 1,
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.flags = CLK_SET_RATE_GATE | CLK_SET_RATE_PARENT,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -217,6 +217,9 @@ static int _freq_tbl_determine_rate(struct clk_hw *hw, const struct freq_tbl *f,
|
||||
|
||||
clk_flags = clk_hw_get_flags(hw);
|
||||
p = clk_hw_get_parent_by_index(hw, index);
|
||||
if (!p)
|
||||
return -EINVAL;
|
||||
|
||||
if (clk_flags & CLK_SET_RATE_PARENT) {
|
||||
rate = f->freq;
|
||||
if (f->pre_div) {
|
||||
@ -952,7 +955,7 @@ static void clk_rcg2_dfs_populate_freq(struct clk_hw *hw, unsigned int l,
|
||||
struct clk_rcg2 *rcg = to_clk_rcg2(hw);
|
||||
struct clk_hw *p;
|
||||
unsigned long prate = 0;
|
||||
u32 val, mask, cfg, mode;
|
||||
u32 val, mask, cfg, mode, src;
|
||||
int i, num_parents;
|
||||
|
||||
regmap_read(rcg->clkr.regmap, rcg->cmd_rcgr + SE_PERF_DFSR(l), &cfg);
|
||||
@ -962,12 +965,12 @@ static void clk_rcg2_dfs_populate_freq(struct clk_hw *hw, unsigned int l,
|
||||
if (cfg & mask)
|
||||
f->pre_div = cfg & mask;
|
||||
|
||||
cfg &= CFG_SRC_SEL_MASK;
|
||||
cfg >>= CFG_SRC_SEL_SHIFT;
|
||||
src = cfg & CFG_SRC_SEL_MASK;
|
||||
src >>= CFG_SRC_SEL_SHIFT;
|
||||
|
||||
num_parents = clk_hw_get_num_parents(hw);
|
||||
for (i = 0; i < num_parents; i++) {
|
||||
if (cfg == rcg->parent_map[i].cfg) {
|
||||
if (src == rcg->parent_map[i].cfg) {
|
||||
f->src = rcg->parent_map[i].src;
|
||||
p = clk_hw_get_parent_by_index(&rcg->clkr.hw, i);
|
||||
prate = clk_hw_get_rate(p);
|
||||
|
@ -648,6 +648,7 @@ static const struct rpm_smd_clk_desc rpm_clk_qcs404 = {
|
||||
};
|
||||
|
||||
/* msm8998 */
|
||||
DEFINE_CLK_SMD_RPM(msm8998, bimc_clk, bimc_a_clk, QCOM_SMD_RPM_MEM_CLK, 0);
|
||||
DEFINE_CLK_SMD_RPM(msm8998, pcnoc_clk, pcnoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 0);
|
||||
DEFINE_CLK_SMD_RPM(msm8998, snoc_clk, snoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 1);
|
||||
DEFINE_CLK_SMD_RPM(msm8998, cnoc_clk, cnoc_a_clk, QCOM_SMD_RPM_BUS_CLK, 2);
|
||||
@ -671,6 +672,8 @@ DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8998, rf_clk2_pin, rf_clk2_a_pin, 5);
|
||||
DEFINE_CLK_SMD_RPM_XO_BUFFER(msm8998, rf_clk3, rf_clk3_a, 6);
|
||||
DEFINE_CLK_SMD_RPM_XO_BUFFER_PINCTRL(msm8998, rf_clk3_pin, rf_clk3_a_pin, 6);
|
||||
static struct clk_smd_rpm *msm8998_clks[] = {
|
||||
[RPM_SMD_BIMC_CLK] = &msm8998_bimc_clk,
|
||||
[RPM_SMD_BIMC_A_CLK] = &msm8998_bimc_a_clk,
|
||||
[RPM_SMD_PCNOC_CLK] = &msm8998_pcnoc_clk,
|
||||
[RPM_SMD_PCNOC_A_CLK] = &msm8998_pcnoc_a_clk,
|
||||
[RPM_SMD_SNOC_CLK] = &msm8998_snoc_clk,
|
||||
|
@ -464,7 +464,8 @@ static struct clk * __init cpg_rpc_clk_register(const char *name,
|
||||
|
||||
clk = clk_register_composite(NULL, name, &parent_name, 1, NULL, NULL,
|
||||
&rpc->div.hw, &clk_divider_ops,
|
||||
&rpc->gate.hw, &clk_gate_ops, 0);
|
||||
&rpc->gate.hw, &clk_gate_ops,
|
||||
CLK_SET_RATE_PARENT);
|
||||
if (IS_ERR(clk)) {
|
||||
kfree(rpc);
|
||||
return clk;
|
||||
@ -500,7 +501,8 @@ static struct clk * __init cpg_rpcd2_clk_register(const char *name,
|
||||
|
||||
clk = clk_register_composite(NULL, name, &parent_name, 1, NULL, NULL,
|
||||
&rpcd2->fixed.hw, &clk_fixed_factor_ops,
|
||||
&rpcd2->gate.hw, &clk_gate_ops, 0);
|
||||
&rpcd2->gate.hw, &clk_gate_ops,
|
||||
CLK_SET_RATE_PARENT);
|
||||
if (IS_ERR(clk))
|
||||
kfree(rpcd2);
|
||||
|
||||
|
@ -921,11 +921,26 @@ static const struct sunxi_ccu_desc sun50i_a64_ccu_desc = {
|
||||
.num_resets = ARRAY_SIZE(sun50i_a64_ccu_resets),
|
||||
};
|
||||
|
||||
static struct ccu_pll_nb sun50i_a64_pll_cpu_nb = {
|
||||
.common = &pll_cpux_clk.common,
|
||||
/* copy from pll_cpux_clk */
|
||||
.enable = BIT(31),
|
||||
.lock = BIT(28),
|
||||
};
|
||||
|
||||
static struct ccu_mux_nb sun50i_a64_cpu_nb = {
|
||||
.common = &cpux_clk.common,
|
||||
.cm = &cpux_clk.mux,
|
||||
.delay_us = 1, /* > 8 clock cycles at 24 MHz */
|
||||
.bypass_index = 1, /* index of 24 MHz oscillator */
|
||||
};
|
||||
|
||||
static int sun50i_a64_ccu_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct resource *res;
|
||||
void __iomem *reg;
|
||||
u32 val;
|
||||
int ret;
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
reg = devm_ioremap_resource(&pdev->dev, res);
|
||||
@ -939,7 +954,18 @@ static int sun50i_a64_ccu_probe(struct platform_device *pdev)
|
||||
|
||||
writel(0x515, reg + SUN50I_A64_PLL_MIPI_REG);
|
||||
|
||||
return sunxi_ccu_probe(pdev->dev.of_node, reg, &sun50i_a64_ccu_desc);
|
||||
ret = sunxi_ccu_probe(pdev->dev.of_node, reg, &sun50i_a64_ccu_desc);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* Gate then ungate PLL CPU after any rate changes */
|
||||
ccu_pll_notifier_register(&sun50i_a64_pll_cpu_nb);
|
||||
|
||||
/* Reparent CPU during PLL CPU rate changes */
|
||||
ccu_mux_notifier_register(pll_cpux_clk.common.hw.clk,
|
||||
&sun50i_a64_cpu_nb);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct of_device_id sun50i_a64_ccu_ids[] = {
|
||||
|
@ -405,7 +405,7 @@ static const struct omap_clkctrl_bit_data dra7_gmac_bit_data[] __initconst = {
|
||||
};
|
||||
|
||||
static const struct omap_clkctrl_reg_data dra7_gmac_clkctrl_regs[] __initconst = {
|
||||
{ DRA7_GMAC_GMAC_CLKCTRL, dra7_gmac_bit_data, CLKF_SW_SUP, "dpll_gmac_ck" },
|
||||
{ DRA7_GMAC_GMAC_CLKCTRL, dra7_gmac_bit_data, CLKF_SW_SUP, "gmac_main_clk" },
|
||||
{ 0 },
|
||||
};
|
||||
|
||||
|
@ -18,8 +18,8 @@
|
||||
#define UNIPHIER_PERI_CLK_FI2C(idx, ch) \
|
||||
UNIPHIER_CLK_GATE("i2c" #ch, (idx), "i2c", 0x24, 24 + (ch))
|
||||
|
||||
#define UNIPHIER_PERI_CLK_SCSSI(idx) \
|
||||
UNIPHIER_CLK_GATE("scssi", (idx), "spi", 0x20, 17)
|
||||
#define UNIPHIER_PERI_CLK_SCSSI(idx, ch) \
|
||||
UNIPHIER_CLK_GATE("scssi" #ch, (idx), "spi", 0x20, 17 + (ch))
|
||||
|
||||
#define UNIPHIER_PERI_CLK_MCSSI(idx) \
|
||||
UNIPHIER_CLK_GATE("mcssi", (idx), "spi", 0x24, 14)
|
||||
@ -35,7 +35,7 @@ const struct uniphier_clk_data uniphier_ld4_peri_clk_data[] = {
|
||||
UNIPHIER_PERI_CLK_I2C(6, 2),
|
||||
UNIPHIER_PERI_CLK_I2C(7, 3),
|
||||
UNIPHIER_PERI_CLK_I2C(8, 4),
|
||||
UNIPHIER_PERI_CLK_SCSSI(11),
|
||||
UNIPHIER_PERI_CLK_SCSSI(11, 0),
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
||||
@ -51,7 +51,10 @@ const struct uniphier_clk_data uniphier_pro4_peri_clk_data[] = {
|
||||
UNIPHIER_PERI_CLK_FI2C(8, 4),
|
||||
UNIPHIER_PERI_CLK_FI2C(9, 5),
|
||||
UNIPHIER_PERI_CLK_FI2C(10, 6),
|
||||
UNIPHIER_PERI_CLK_SCSSI(11),
|
||||
UNIPHIER_PERI_CLK_MCSSI(12),
|
||||
UNIPHIER_PERI_CLK_SCSSI(11, 0),
|
||||
UNIPHIER_PERI_CLK_SCSSI(12, 1),
|
||||
UNIPHIER_PERI_CLK_SCSSI(13, 2),
|
||||
UNIPHIER_PERI_CLK_SCSSI(14, 3),
|
||||
UNIPHIER_PERI_CLK_MCSSI(15),
|
||||
{ /* sentinel */ }
|
||||
};
|
||||
|
@ -121,7 +121,7 @@ static int __init bcm2835_timer_init(struct device_node *node)
|
||||
ret = setup_irq(irq, &timer->act);
|
||||
if (ret) {
|
||||
pr_err("Can't set up timer IRQ\n");
|
||||
goto err_iounmap;
|
||||
goto err_timer_free;
|
||||
}
|
||||
|
||||
clockevents_config_and_register(&timer->evt, freq, 0xf, 0xffffffff);
|
||||
@ -130,6 +130,9 @@ static int __init bcm2835_timer_init(struct device_node *node)
|
||||
|
||||
return 0;
|
||||
|
||||
err_timer_free:
|
||||
kfree(timer);
|
||||
|
||||
err_iounmap:
|
||||
iounmap(base);
|
||||
return ret;
|
||||
|
@ -302,10 +302,6 @@ int __init davinci_timer_register(struct clk *clk,
|
||||
return rv;
|
||||
}
|
||||
|
||||
clockevents_config_and_register(&clockevent->dev, tick_rate,
|
||||
DAVINCI_TIMER_MIN_DELTA,
|
||||
DAVINCI_TIMER_MAX_DELTA);
|
||||
|
||||
davinci_clocksource.dev.rating = 300;
|
||||
davinci_clocksource.dev.read = davinci_clocksource_read;
|
||||
davinci_clocksource.dev.mask =
|
||||
@ -323,6 +319,10 @@ int __init davinci_timer_register(struct clk *clk,
|
||||
davinci_clocksource_init_tim34(base);
|
||||
}
|
||||
|
||||
clockevents_config_and_register(&clockevent->dev, tick_rate,
|
||||
DAVINCI_TIMER_MIN_DELTA,
|
||||
DAVINCI_TIMER_MAX_DELTA);
|
||||
|
||||
rv = clocksource_register_hz(&davinci_clocksource.dev, tick_rate);
|
||||
if (rv) {
|
||||
pr_err("Unable to register clocksource");
|
||||
|
@ -739,7 +739,7 @@ source "drivers/crypto/stm32/Kconfig"
|
||||
|
||||
config CRYPTO_DEV_SAFEXCEL
|
||||
tristate "Inside Secure's SafeXcel cryptographic engine driver"
|
||||
depends on OF || PCI || COMPILE_TEST
|
||||
depends on (OF || PCI || COMPILE_TEST) && HAS_IOMEM
|
||||
select CRYPTO_LIB_AES
|
||||
select CRYPTO_AUTHENC
|
||||
select CRYPTO_BLKCIPHER
|
||||
|
@ -727,6 +727,14 @@ static int chtls_close_listsrv_rpl(struct chtls_dev *cdev, struct sk_buff *skb)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void chtls_purge_wr_queue(struct sock *sk)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
|
||||
while ((skb = dequeue_wr(sk)) != NULL)
|
||||
kfree_skb(skb);
|
||||
}
|
||||
|
||||
static void chtls_release_resources(struct sock *sk)
|
||||
{
|
||||
struct chtls_sock *csk = rcu_dereference_sk_user_data(sk);
|
||||
@ -741,6 +749,11 @@ static void chtls_release_resources(struct sock *sk)
|
||||
kfree_skb(csk->txdata_skb_cache);
|
||||
csk->txdata_skb_cache = NULL;
|
||||
|
||||
if (csk->wr_credits != csk->wr_max_credits) {
|
||||
chtls_purge_wr_queue(sk);
|
||||
chtls_reset_wr_list(csk);
|
||||
}
|
||||
|
||||
if (csk->l2t_entry) {
|
||||
cxgb4_l2t_release(csk->l2t_entry);
|
||||
csk->l2t_entry = NULL;
|
||||
@ -1735,6 +1748,7 @@ static void chtls_peer_close(struct sock *sk, struct sk_buff *skb)
|
||||
else
|
||||
sk_wake_async(sk, SOCK_WAKE_WAITD, POLL_IN);
|
||||
}
|
||||
kfree_skb(skb);
|
||||
}
|
||||
|
||||
static void chtls_close_con_rpl(struct sock *sk, struct sk_buff *skb)
|
||||
@ -2062,19 +2076,6 @@ static int chtls_conn_cpl(struct chtls_dev *cdev, struct sk_buff *skb)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct sk_buff *dequeue_wr(struct sock *sk)
|
||||
{
|
||||
struct chtls_sock *csk = rcu_dereference_sk_user_data(sk);
|
||||
struct sk_buff *skb = csk->wr_skb_head;
|
||||
|
||||
if (likely(skb)) {
|
||||
/* Don't bother clearing the tail */
|
||||
csk->wr_skb_head = WR_SKB_CB(skb)->next_wr;
|
||||
WR_SKB_CB(skb)->next_wr = NULL;
|
||||
}
|
||||
return skb;
|
||||
}
|
||||
|
||||
static void chtls_rx_ack(struct sock *sk, struct sk_buff *skb)
|
||||
{
|
||||
struct cpl_fw4_ack *hdr = cplhdr(skb) + RSS_HDR;
|
||||
|
@ -185,6 +185,12 @@ static inline void chtls_kfree_skb(struct sock *sk, struct sk_buff *skb)
|
||||
kfree_skb(skb);
|
||||
}
|
||||
|
||||
static inline void chtls_reset_wr_list(struct chtls_sock *csk)
|
||||
{
|
||||
csk->wr_skb_head = NULL;
|
||||
csk->wr_skb_tail = NULL;
|
||||
}
|
||||
|
||||
static inline void enqueue_wr(struct chtls_sock *csk, struct sk_buff *skb)
|
||||
{
|
||||
WR_SKB_CB(skb)->next_wr = NULL;
|
||||
@ -197,4 +203,19 @@ static inline void enqueue_wr(struct chtls_sock *csk, struct sk_buff *skb)
|
||||
WR_SKB_CB(csk->wr_skb_tail)->next_wr = skb;
|
||||
csk->wr_skb_tail = skb;
|
||||
}
|
||||
|
||||
static inline struct sk_buff *dequeue_wr(struct sock *sk)
|
||||
{
|
||||
struct chtls_sock *csk = rcu_dereference_sk_user_data(sk);
|
||||
struct sk_buff *skb = NULL;
|
||||
|
||||
skb = csk->wr_skb_head;
|
||||
|
||||
if (likely(skb)) {
|
||||
/* Don't bother clearing the tail */
|
||||
csk->wr_skb_head = WR_SKB_CB(skb)->next_wr;
|
||||
WR_SKB_CB(skb)->next_wr = NULL;
|
||||
}
|
||||
return skb;
|
||||
}
|
||||
#endif
|
||||
|
@ -350,6 +350,7 @@ int chtls_setkey(struct chtls_sock *csk, u32 keylen, u32 optname)
|
||||
kwr->sc_imm.cmd_more = cpu_to_be32(ULPTX_CMD_V(ULP_TX_SC_IMM));
|
||||
kwr->sc_imm.len = cpu_to_be32(klen);
|
||||
|
||||
lock_sock(sk);
|
||||
/* key info */
|
||||
kctx = (struct _key_ctx *)(kwr + 1);
|
||||
ret = chtls_key_info(csk, kctx, keylen, optname);
|
||||
@ -388,8 +389,10 @@ int chtls_setkey(struct chtls_sock *csk, u32 keylen, u32 optname)
|
||||
csk->tlshws.txkey = keyid;
|
||||
}
|
||||
|
||||
release_sock(sk);
|
||||
return ret;
|
||||
out_notcb:
|
||||
release_sock(sk);
|
||||
free_tls_keyid(sk);
|
||||
out_nokey:
|
||||
kfree_skb(skb);
|
||||
|
@ -118,7 +118,8 @@ config ARM_TEGRA20_DEVFREQ
|
||||
|
||||
config ARM_RK3399_DMC_DEVFREQ
|
||||
tristate "ARM RK3399 DMC DEVFREQ Driver"
|
||||
depends on ARCH_ROCKCHIP
|
||||
depends on (ARCH_ROCKCHIP && HAVE_ARM_SMCCC) || \
|
||||
(COMPILE_TEST && HAVE_ARM_SMCCC)
|
||||
select DEVFREQ_EVENT_ROCKCHIP_DFI
|
||||
select DEVFREQ_GOV_SIMPLE_ONDEMAND
|
||||
select PM_DEVFREQ_EVENT
|
||||
|
@ -34,7 +34,7 @@ config DEVFREQ_EVENT_EXYNOS_PPMU
|
||||
|
||||
config DEVFREQ_EVENT_ROCKCHIP_DFI
|
||||
tristate "ROCKCHIP DFI DEVFREQ event Driver"
|
||||
depends on ARCH_ROCKCHIP
|
||||
depends on ARCH_ROCKCHIP || COMPILE_TEST
|
||||
help
|
||||
This add the devfreq-event driver for Rockchip SoC. It provides DFI
|
||||
(DDR Monitor Module) driver to count ddr load.
|
||||
|
@ -101,17 +101,22 @@ static struct __exynos_ppmu_events {
|
||||
PPMU_EVENT(dmc1_1),
|
||||
};
|
||||
|
||||
static int exynos_ppmu_find_ppmu_id(struct devfreq_event_dev *edev)
|
||||
static int __exynos_ppmu_find_ppmu_id(const char *edev_name)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(ppmu_events); i++)
|
||||
if (!strcmp(edev->desc->name, ppmu_events[i].name))
|
||||
if (!strcmp(edev_name, ppmu_events[i].name))
|
||||
return ppmu_events[i].id;
|
||||
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static int exynos_ppmu_find_ppmu_id(struct devfreq_event_dev *edev)
|
||||
{
|
||||
return __exynos_ppmu_find_ppmu_id(edev->desc->name);
|
||||
}
|
||||
|
||||
/*
|
||||
* The devfreq-event ops structure for PPMU v1.1
|
||||
*/
|
||||
@ -556,13 +561,11 @@ static int of_get_devfreq_events(struct device_node *np,
|
||||
* use default if not.
|
||||
*/
|
||||
if (info->ppmu_type == EXYNOS_TYPE_PPMU_V2) {
|
||||
struct devfreq_event_dev edev;
|
||||
int id;
|
||||
/* Not all registers take the same value for
|
||||
* read+write data count.
|
||||
*/
|
||||
edev.desc = &desc[j];
|
||||
id = exynos_ppmu_find_ppmu_id(&edev);
|
||||
id = __exynos_ppmu_find_ppmu_id(desc[j].name);
|
||||
|
||||
switch (id) {
|
||||
case PPMU_PMNCNT0:
|
||||
|
@ -179,7 +179,7 @@ __dma_device_satisfies_mask(struct dma_device *device,
|
||||
|
||||
static struct module *dma_chan_to_owner(struct dma_chan *chan)
|
||||
{
|
||||
return chan->device->dev->driver->owner;
|
||||
return chan->device->owner;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -919,6 +919,8 @@ int dma_async_device_register(struct dma_device *device)
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
device->owner = device->dev->driver->owner;
|
||||
|
||||
if (dma_has_cap(DMA_MEMCPY, device->cap_mask) && !device->device_prep_dma_memcpy) {
|
||||
dev_err(device->dev,
|
||||
"Device claims capability %s, but op is not defined\n",
|
||||
|
@ -304,7 +304,7 @@ static void fsl_qdma_free_chan_resources(struct dma_chan *chan)
|
||||
|
||||
vchan_dma_desc_free_list(&fsl_chan->vchan, &head);
|
||||
|
||||
if (!fsl_queue->comp_pool && !fsl_queue->comp_pool)
|
||||
if (!fsl_queue->comp_pool && !fsl_queue->desc_pool)
|
||||
return;
|
||||
|
||||
list_for_each_entry_safe(comp_temp, _comp_temp,
|
||||
|
@ -760,12 +760,8 @@ static void sdma_start_desc(struct sdma_channel *sdmac)
|
||||
return;
|
||||
}
|
||||
sdmac->desc = desc = to_sdma_desc(&vd->tx);
|
||||
/*
|
||||
* Do not delete the node in desc_issued list in cyclic mode, otherwise
|
||||
* the desc allocated will never be freed in vchan_dma_desc_free_list
|
||||
*/
|
||||
if (!(sdmac->flags & IMX_DMA_SG_LOOP))
|
||||
list_del(&vd->node);
|
||||
|
||||
list_del(&vd->node);
|
||||
|
||||
sdma->channel_control[channel].base_bd_ptr = desc->bd_phys;
|
||||
sdma->channel_control[channel].current_bd_ptr = desc->bd_phys;
|
||||
@ -1071,7 +1067,6 @@ static void sdma_channel_terminate_work(struct work_struct *work)
|
||||
|
||||
spin_lock_irqsave(&sdmac->vc.lock, flags);
|
||||
vchan_get_all_descriptors(&sdmac->vc, &head);
|
||||
sdmac->desc = NULL;
|
||||
spin_unlock_irqrestore(&sdmac->vc.lock, flags);
|
||||
vchan_dma_desc_free_list(&sdmac->vc, &head);
|
||||
sdmac->context_loaded = false;
|
||||
@ -1080,11 +1075,19 @@ static void sdma_channel_terminate_work(struct work_struct *work)
|
||||
static int sdma_disable_channel_async(struct dma_chan *chan)
|
||||
{
|
||||
struct sdma_channel *sdmac = to_sdma_chan(chan);
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&sdmac->vc.lock, flags);
|
||||
|
||||
sdma_disable_channel(chan);
|
||||
|
||||
if (sdmac->desc)
|
||||
if (sdmac->desc) {
|
||||
vchan_terminate_vdesc(&sdmac->desc->vd);
|
||||
sdmac->desc = NULL;
|
||||
schedule_work(&sdmac->terminate_worker);
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&sdmac->vc.lock, flags);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -54,8 +54,8 @@ static int ecc_register(struct platform_device *pdev)
|
||||
p->dci = edac_device_alloc_ctl_info(0, "sifive_ecc", 1, "sifive_ecc",
|
||||
1, 1, NULL, 0,
|
||||
edac_device_alloc_index());
|
||||
if (IS_ERR(p->dci))
|
||||
return PTR_ERR(p->dci);
|
||||
if (!p->dci)
|
||||
return -ENOMEM;
|
||||
|
||||
p->dci->dev = &pdev->dev;
|
||||
p->dci->mod_name = "Sifive ECC Manager";
|
||||
|
@ -253,17 +253,16 @@ static int grgpio_irq_map(struct irq_domain *d, unsigned int irq,
|
||||
lirq->irq = irq;
|
||||
uirq = &priv->uirqs[lirq->index];
|
||||
if (uirq->refcnt == 0) {
|
||||
spin_unlock_irqrestore(&priv->gc.bgpio_lock, flags);
|
||||
ret = request_irq(uirq->uirq, grgpio_irq_handler, 0,
|
||||
dev_name(priv->dev), priv);
|
||||
if (ret) {
|
||||
dev_err(priv->dev,
|
||||
"Could not request underlying irq %d\n",
|
||||
uirq->uirq);
|
||||
|
||||
spin_unlock_irqrestore(&priv->gc.bgpio_lock, flags);
|
||||
|
||||
return ret;
|
||||
}
|
||||
spin_lock_irqsave(&priv->gc.bgpio_lock, flags);
|
||||
}
|
||||
uirq->refcnt++;
|
||||
|
||||
@ -309,8 +308,11 @@ static void grgpio_irq_unmap(struct irq_domain *d, unsigned int irq)
|
||||
if (index >= 0) {
|
||||
uirq = &priv->uirqs[lirq->index];
|
||||
uirq->refcnt--;
|
||||
if (uirq->refcnt == 0)
|
||||
if (uirq->refcnt == 0) {
|
||||
spin_unlock_irqrestore(&priv->gc.bgpio_lock, flags);
|
||||
free_irq(uirq->uirq, priv);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&priv->gc.bgpio_lock, flags);
|
||||
|
@ -1924,6 +1924,7 @@ static int gpiochip_hierarchy_irq_domain_alloc(struct irq_domain *d,
|
||||
parent_type);
|
||||
chip_info(gc, "alloc_irqs_parent for %d parent hwirq %d\n",
|
||||
irq, parent_hwirq);
|
||||
irq_set_lockdep_class(irq, gc->irq.lock_key, gc->irq.request_key);
|
||||
ret = irq_domain_alloc_irqs_parent(d, irq, 1, &parent_fwspec);
|
||||
if (ret)
|
||||
chip_err(gc,
|
||||
|
@ -338,17 +338,9 @@ bool amdgpu_atombios_get_connector_info_from_object_table(struct amdgpu_device *
|
||||
path_size += le16_to_cpu(path->usSize);
|
||||
|
||||
if (device_support & le16_to_cpu(path->usDeviceTag)) {
|
||||
uint8_t con_obj_id, con_obj_num, con_obj_type;
|
||||
|
||||
con_obj_id =
|
||||
uint8_t con_obj_id =
|
||||
(le16_to_cpu(path->usConnObjectId) & OBJECT_ID_MASK)
|
||||
>> OBJECT_ID_SHIFT;
|
||||
con_obj_num =
|
||||
(le16_to_cpu(path->usConnObjectId) & ENUM_ID_MASK)
|
||||
>> ENUM_ID_SHIFT;
|
||||
con_obj_type =
|
||||
(le16_to_cpu(path->usConnObjectId) &
|
||||
OBJECT_TYPE_MASK) >> OBJECT_TYPE_SHIFT;
|
||||
|
||||
/* Skip TV/CV support */
|
||||
if ((le16_to_cpu(path->usDeviceTag) ==
|
||||
@ -373,14 +365,7 @@ bool amdgpu_atombios_get_connector_info_from_object_table(struct amdgpu_device *
|
||||
router.ddc_valid = false;
|
||||
router.cd_valid = false;
|
||||
for (j = 0; j < ((le16_to_cpu(path->usSize) - 8) / 2); j++) {
|
||||
uint8_t grph_obj_id, grph_obj_num, grph_obj_type;
|
||||
|
||||
grph_obj_id =
|
||||
(le16_to_cpu(path->usGraphicObjIds[j]) &
|
||||
OBJECT_ID_MASK) >> OBJECT_ID_SHIFT;
|
||||
grph_obj_num =
|
||||
(le16_to_cpu(path->usGraphicObjIds[j]) &
|
||||
ENUM_ID_MASK) >> ENUM_ID_SHIFT;
|
||||
uint8_t grph_obj_type=
|
||||
grph_obj_type =
|
||||
(le16_to_cpu(path->usGraphicObjIds[j]) &
|
||||
OBJECT_TYPE_MASK) >> OBJECT_TYPE_SHIFT;
|
||||
|
@ -3466,8 +3466,6 @@ static int amdgpu_device_reset_sriov(struct amdgpu_device *adev,
|
||||
if (r)
|
||||
return r;
|
||||
|
||||
amdgpu_amdkfd_pre_reset(adev);
|
||||
|
||||
/* Resume IP prior to SMC */
|
||||
r = amdgpu_device_ip_reinit_early_sriov(adev);
|
||||
if (r)
|
||||
|
@ -660,6 +660,12 @@ static int nv_common_early_init(void *handle)
|
||||
adev->pg_flags = AMD_PG_SUPPORT_VCN |
|
||||
AMD_PG_SUPPORT_VCN_DPG |
|
||||
AMD_PG_SUPPORT_ATHUB;
|
||||
/* guest vm gets 0xffffffff when reading RCC_DEV0_EPF0_STRAP0,
|
||||
* as a consequence, the rev_id and external_rev_id are wrong.
|
||||
* workaround it by hardcoding rev_id to 0 (default value).
|
||||
*/
|
||||
if (amdgpu_sriov_vf(adev))
|
||||
adev->rev_id = 0;
|
||||
adev->external_rev_id = adev->rev_id + 0xa;
|
||||
break;
|
||||
default:
|
||||
|
@ -52,6 +52,7 @@
|
||||
uint32_t old_ = 0; \
|
||||
uint32_t tmp_ = RREG32(adev->reg_offset[ip##_HWIP][inst][reg##_BASE_IDX] + reg); \
|
||||
uint32_t loop = adev->usec_timeout; \
|
||||
ret = 0; \
|
||||
while ((tmp_ & (mask)) != (expected_value)) { \
|
||||
if (old_ != tmp_) { \
|
||||
loop = adev->usec_timeout; \
|
||||
|
@ -93,7 +93,7 @@ void kfd_debugfs_init(void)
|
||||
kfd_debugfs_hqds_by_device, &kfd_debugfs_fops);
|
||||
debugfs_create_file("rls", S_IFREG | 0444, debugfs_root,
|
||||
kfd_debugfs_rls_by_device, &kfd_debugfs_fops);
|
||||
debugfs_create_file("hang_hws", S_IFREG | 0644, debugfs_root,
|
||||
debugfs_create_file("hang_hws", S_IFREG | 0200, debugfs_root,
|
||||
NULL, &kfd_debugfs_hang_hws_fops);
|
||||
}
|
||||
|
||||
|
@ -1181,16 +1181,18 @@ static int create_queue_cpsch(struct device_queue_manager *dqm, struct queue *q,
|
||||
|
||||
list_add(&q->list, &qpd->queues_list);
|
||||
qpd->queue_count++;
|
||||
|
||||
if (q->properties.type == KFD_QUEUE_TYPE_SDMA)
|
||||
dqm->sdma_queue_count++;
|
||||
else if (q->properties.type == KFD_QUEUE_TYPE_SDMA_XGMI)
|
||||
dqm->xgmi_sdma_queue_count++;
|
||||
|
||||
if (q->properties.is_active) {
|
||||
dqm->queue_count++;
|
||||
retval = execute_queues_cpsch(dqm,
|
||||
KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0);
|
||||
}
|
||||
|
||||
if (q->properties.type == KFD_QUEUE_TYPE_SDMA)
|
||||
dqm->sdma_queue_count++;
|
||||
else if (q->properties.type == KFD_QUEUE_TYPE_SDMA_XGMI)
|
||||
dqm->xgmi_sdma_queue_count++;
|
||||
/*
|
||||
* Unconditionally increment this counter, regardless of the queue's
|
||||
* type or whether the queue is active.
|
||||
|
@ -1438,6 +1438,7 @@ void dcn_bw_update_from_pplib(struct dc *dc)
|
||||
struct dc_context *ctx = dc->ctx;
|
||||
struct dm_pp_clock_levels_with_voltage fclks = {0}, dcfclks = {0};
|
||||
bool res;
|
||||
unsigned vmin0p65_idx, vmid0p72_idx, vnom0p8_idx, vmax0p9_idx;
|
||||
|
||||
/* TODO: This is not the proper way to obtain fabric_and_dram_bandwidth, should be min(fclk, memclk) */
|
||||
res = dm_pp_get_clock_levels_by_type_with_voltage(
|
||||
@ -1449,17 +1450,28 @@ void dcn_bw_update_from_pplib(struct dc *dc)
|
||||
res = verify_clock_values(&fclks);
|
||||
|
||||
if (res) {
|
||||
ASSERT(fclks.num_levels >= 3);
|
||||
dc->dcn_soc->fabric_and_dram_bandwidth_vmin0p65 = 32 * (fclks.data[0].clocks_in_khz / 1000.0) / 1000.0;
|
||||
dc->dcn_soc->fabric_and_dram_bandwidth_vmid0p72 = dc->dcn_soc->number_of_channels *
|
||||
(fclks.data[fclks.num_levels - (fclks.num_levels > 2 ? 3 : 2)].clocks_in_khz / 1000.0)
|
||||
* ddr4_dram_factor_single_Channel / 1000.0;
|
||||
dc->dcn_soc->fabric_and_dram_bandwidth_vnom0p8 = dc->dcn_soc->number_of_channels *
|
||||
(fclks.data[fclks.num_levels - 2].clocks_in_khz / 1000.0)
|
||||
* ddr4_dram_factor_single_Channel / 1000.0;
|
||||
dc->dcn_soc->fabric_and_dram_bandwidth_vmax0p9 = dc->dcn_soc->number_of_channels *
|
||||
(fclks.data[fclks.num_levels - 1].clocks_in_khz / 1000.0)
|
||||
* ddr4_dram_factor_single_Channel / 1000.0;
|
||||
ASSERT(fclks.num_levels);
|
||||
|
||||
vmin0p65_idx = 0;
|
||||
vmid0p72_idx = fclks.num_levels -
|
||||
(fclks.num_levels > 2 ? 3 : (fclks.num_levels > 1 ? 2 : 1));
|
||||
vnom0p8_idx = fclks.num_levels - (fclks.num_levels > 1 ? 2 : 1);
|
||||
vmax0p9_idx = fclks.num_levels - 1;
|
||||
|
||||
dc->dcn_soc->fabric_and_dram_bandwidth_vmin0p65 =
|
||||
32 * (fclks.data[vmin0p65_idx].clocks_in_khz / 1000.0) / 1000.0;
|
||||
dc->dcn_soc->fabric_and_dram_bandwidth_vmid0p72 =
|
||||
dc->dcn_soc->number_of_channels *
|
||||
(fclks.data[vmid0p72_idx].clocks_in_khz / 1000.0)
|
||||
* ddr4_dram_factor_single_Channel / 1000.0;
|
||||
dc->dcn_soc->fabric_and_dram_bandwidth_vnom0p8 =
|
||||
dc->dcn_soc->number_of_channels *
|
||||
(fclks.data[vnom0p8_idx].clocks_in_khz / 1000.0)
|
||||
* ddr4_dram_factor_single_Channel / 1000.0;
|
||||
dc->dcn_soc->fabric_and_dram_bandwidth_vmax0p9 =
|
||||
dc->dcn_soc->number_of_channels *
|
||||
(fclks.data[vmax0p9_idx].clocks_in_khz / 1000.0)
|
||||
* ddr4_dram_factor_single_Channel / 1000.0;
|
||||
} else
|
||||
BREAK_TO_DEBUGGER();
|
||||
|
||||
|
@ -2267,12 +2267,7 @@ void dc_set_power_state(
|
||||
enum dc_acpi_cm_power_state power_state)
|
||||
{
|
||||
struct kref refcount;
|
||||
struct display_mode_lib *dml = kzalloc(sizeof(struct display_mode_lib),
|
||||
GFP_KERNEL);
|
||||
|
||||
ASSERT(dml);
|
||||
if (!dml)
|
||||
return;
|
||||
struct display_mode_lib *dml;
|
||||
|
||||
switch (power_state) {
|
||||
case DC_ACPI_CM_POWER_STATE_D0:
|
||||
@ -2294,6 +2289,12 @@ void dc_set_power_state(
|
||||
* clean state, and dc hw programming optimizations will not
|
||||
* cause any trouble.
|
||||
*/
|
||||
dml = kzalloc(sizeof(struct display_mode_lib),
|
||||
GFP_KERNEL);
|
||||
|
||||
ASSERT(dml);
|
||||
if (!dml)
|
||||
return;
|
||||
|
||||
/* Preserve refcount */
|
||||
refcount = dc->current_state->refcount;
|
||||
@ -2307,10 +2308,10 @@ void dc_set_power_state(
|
||||
dc->current_state->refcount = refcount;
|
||||
dc->current_state->bw_ctx.dml = *dml;
|
||||
|
||||
kfree(dml);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
kfree(dml);
|
||||
}
|
||||
|
||||
void dc_resume(struct dc *dc)
|
||||
|
@ -948,8 +948,7 @@ bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason)
|
||||
same_edid = is_same_edid(&prev_sink->dc_edid, &sink->dc_edid);
|
||||
|
||||
if (link->connector_signal == SIGNAL_TYPE_DISPLAY_PORT &&
|
||||
sink_caps.transaction_type == DDC_TRANSACTION_TYPE_I2C_OVER_AUX &&
|
||||
reason != DETECT_REASON_HPDRX) {
|
||||
sink_caps.transaction_type == DDC_TRANSACTION_TYPE_I2C_OVER_AUX) {
|
||||
/*
|
||||
* TODO debug why Dell 2413 doesn't like
|
||||
* two link trainings
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user