This is the 5.10.163 stable release
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAmPCczkACgkQONu9yGCS aT4tnRAAsW8h/ohmhP+O2lQ9Ekw6s9VB6KB4aJzLhQXqIZlrzk2DP3CiLxQ7DkFc AcHwFYq+sERo8O7dK6pbCW0zNvLUpbK2wJhwMHujJfSUFboXX85NR6u90U67pBKS p+yVkDSx8LNc7c676xQ7ey5rO1K2fQQ266gexjI9WOkjIFOfplVkZ7tkvt51VwAD mNvOQsZdCE6xs+T3t9YMOtAx3wW8vl1wW3QDWCHznQwOJiMEjfNEOUY/+xELnnWz DVONWPHTFNKQHZwIuVUFZdNuORq5WXoIaMZdaEFkhuOtRMnQ9l+wi8iMxX8zkgBn Ji/dPu3GdAZsJU4/rXHkY2AeZV1oJc3NLYmevoRZirTqMQCqyM+blif7Rf34kBi7 6jlGPWOjyMNe58shfHmjWTl/u4pMDoYOnm5XO+1oL+2Xg8QWCucqAlfPFB3uMh6n aL4ymzo5QRy1+tx8v7o1NOjnGWydvYn3O4fwJVkYTFaJZZr9EI7gpTmEBw/gwfuf 4TH6BC++Ai/8vgKUhpdnWuTrjomWalPTcPBgQYG4gD7ak2TM1rmgMaCl/THUe36R zPC8m2sIXKeI4zGi8TeqTgaRvFSKJnuEmVo5OPkG98fZkjekCzWHp0q1+PG2Ecy8 Mu2/AOnwb1aSfOJh2Qajoke/Wed0U6qszop8C/jPRh8D1uTmRbI= =sOTj -----END PGP SIGNATURE----- Merge 5.10.163 into android12-5.10-lts Changes in 5.10.163 usb: musb: remove extra check in musb_gadget_vbus_draw arm64: dts: qcom: ipq6018-cp01-c1: use BLSPI1 pins arm64: dts: qcom: msm8996: fix GPU OPP table ARM: dts: qcom: apq8064: fix coresight compatible arm64: dts: qcom: sdm630: fix UART1 pin bias arm64: dts: qcom: sdm845-cheza: fix AP suspend pin bias arm64: dts: qcom: msm8916: Drop MSS fallback compatible objtool, kcsan: Add volatile read/write instrumentation to whitelist ARM: dts: stm32: Drop stm32mp15xc.dtsi from Avenger96 ARM: dts: stm32: Fix AV96 WLAN regulator gpio property drivers: soc: ti: knav_qmss_queue: Mark knav_acc_firmwares as static soc: qcom: llcc: make irq truly optional soc: qcom: apr: make code more reuseable soc: qcom: apr: Add check for idr_alloc and of_property_read_string_index arm: dts: spear600: Fix clcd interrupt soc: ti: knav_qmss_queue: Use pm_runtime_resume_and_get instead of pm_runtime_get_sync soc: ti: knav_qmss_queue: Fix PM disable depth imbalance in knav_queue_probe soc: ti: smartreflex: Fix PM disable depth imbalance in omap_sr_probe perf: arm_dsu: Fix hotplug callback leak in dsu_pmu_init() perf/smmuv3: Fix hotplug callback leak in arm_smmu_pmu_init() arm64: dts: ti: k3-am65-main: Drop dma-coherent in crypto node arm64: dts: ti: k3-j721e-main: Drop dma-coherent in crypto node arm64: dts: mt2712e: Fix unit_address_vs_reg warning for oscillators arm64: dts: mt2712e: Fix unit address for pinctrl node arm64: dts: mt2712-evb: Fix vproc fixed regulators unit names arm64: dts: mt2712-evb: Fix usb vbus regulators unit names arm64: dts: mediatek: pumpkin-common: Fix devicetree warnings arm64: dts: mediatek: mt6797: Fix 26M oscillator unit name ARM: dts: dove: Fix assigned-addresses for every PCIe Root Port ARM: dts: armada-370: Fix assigned-addresses for every PCIe Root Port ARM: dts: armada-xp: Fix assigned-addresses for every PCIe Root Port ARM: dts: armada-375: Fix assigned-addresses for every PCIe Root Port ARM: dts: armada-38x: Fix assigned-addresses for every PCIe Root Port ARM: dts: armada-39x: Fix assigned-addresses for every PCIe Root Port ARM: dts: turris-omnia: Add ethernet aliases ARM: dts: turris-omnia: Add switch port 6 node arm64: dts: armada-3720-turris-mox: Add missing interrupt for RTC pstore/ram: Fix error return code in ramoops_probe() ARM: mmp: fix timer_read delay pstore: Avoid kcore oops by vmap()ing with VM_IOREMAP tpm/tpm_ftpm_tee: Fix error handling in ftpm_mod_init() tpm/tpm_crb: Fix error message in __crb_relinquish_locality() sched/fair: Cleanup task_util and capacity type sched/uclamp: Fix relationship between uclamp and migration margin cpuidle: dt: Return the correct numbers of parsed idle states alpha: fix syscall entry in !AUDUT_SYSCALL case PM: hibernate: Fix mistake in kerneldoc comment fs: don't audit the capability check in simple_xattr_list() cpufreq: qcom-hw: Fix memory leak in qcom_cpufreq_hw_read_lut() selftests/ftrace: event_triggers: wait longer for test_event_enable perf: Fix possible memleak in pmu_dev_alloc() lib/debugobjects: fix stat count and optimize debug_objects_mem_init platform/x86: huawei-wmi: fix return value calculation timerqueue: Use rb_entry_safe() in timerqueue_getnext() proc: fixup uptime selftest lib/fonts: fix undefined behavior in bit shift for get_default_font ocfs2: fix memory leak in ocfs2_stack_glue_init() MIPS: vpe-mt: fix possible memory leak while module exiting MIPS: vpe-cmp: fix possible memory leak while module exiting selftests/efivarfs: Add checking of the test return value PNP: fix name memory leak in pnp_alloc_dev() perf/x86/intel/uncore: Fix reference count leak in hswep_has_limit_sbox() perf/x86/intel/uncore: Fix reference count leak in snr_uncore_mmio_map() perf/x86/intel/uncore: Fix reference count leak in __uncore_imc_init_box() platform/chrome: cros_usbpd_notify: Fix error handling in cros_usbpd_notify_init() irqchip: gic-pm: Use pm_runtime_resume_and_get() in gic_probe() EDAC/i10nm: fix refcount leak in pci_get_dev_wrapper() nfsd: don't call nfsd_file_put from client states seqfile display genirq/irqdesc: Don't try to remove non-existing sysfs files cpufreq: amd_freq_sensitivity: Add missing pci_dev_put() libfs: add DEFINE_SIMPLE_ATTRIBUTE_SIGNED for signed value lib/notifier-error-inject: fix error when writing -errno to debugfs file docs: fault-injection: fix non-working usage of negative values debugfs: fix error when writing negative value to atomic_t debugfs file ocfs2: ocfs2_mount_volume does cleanup job before return error ocfs2: rewrite error handling of ocfs2_fill_super ocfs2: fix memory leak in ocfs2_mount_volume() rapidio: fix possible name leaks when rio_add_device() fails rapidio: rio: fix possible name leak in rio_register_mport() clocksource/drivers/sh_cmt: Make sure channel clock supply is enabled clocksource/drivers/sh_cmt: Access registers according to spec futex: Move to kernel/futex/ futex: Resend potentially swallowed owner death notification cpu/hotplug: Make target_store() a nop when target == state clocksource/drivers/timer-ti-dm: Fix missing clk_disable_unprepare in dmtimer_systimer_init_clock() ACPICA: Fix use-after-free in acpi_ut_copy_ipackage_to_ipackage() uprobes/x86: Allow to probe a NOP instruction with 0x66 prefix x86/xen: Fix memory leak in xen_smp_intr_init{_pv}() x86/xen: Fix memory leak in xen_init_lock_cpu() xen/privcmd: Fix a possible warning in privcmd_ioctl_mmap_resource() PM: runtime: Improve path in rpm_idle() when no callback PM: runtime: Do not call __rpm_callback() from rpm_idle() platform/x86: mxm-wmi: fix memleak in mxm_wmi_call_mx[ds|mx]() platform/x86: intel_scu_ipc: fix possible name leak in __intel_scu_ipc_register() MIPS: BCM63xx: Add check for NULL for clk in clk_enable MIPS: OCTEON: warn only once if deprecated link status is being used fs: sysv: Fix sysv_nblocks() returns wrong value rapidio: fix possible UAF when kfifo_alloc() fails eventfd: change int to __u64 in eventfd_signal() ifndef CONFIG_EVENTFD relay: fix type mismatch when allocating memory in relay_create_buf() hfs: Fix OOB Write in hfs_asc2mac rapidio: devices: fix missing put_device in mport_cdev_open wifi: ath9k: hif_usb: fix memory leak of urbs in ath9k_hif_usb_dealloc_tx_urbs() wifi: ath9k: hif_usb: Fix use-after-free in ath9k_hif_usb_reg_in_cb() wifi: rtl8xxxu: Fix reading the vendor of combo chips drm/bridge: adv7533: remove dynamic lane switching from adv7533 bridge libbpf: Fix use-after-free in btf_dump_name_dups libbpf: Fix null-pointer dereference in find_prog_by_sec_insn() pata_ipx4xx_cf: Fix unsigned comparison with less than zero media: coda: jpeg: Add check for kmalloc media: i2c: ad5820: Fix error path venus: pm_helpers: Fix error check in vcodec_domains_get() media: exynos4-is: Use v4l2_async_notifier_add_fwnode_remote_subdev media: exynos4-is: don't rely on the v4l2_async_subdev internals can: kvaser_usb: do not increase tx statistics when sending error message frames can: kvaser_usb: kvaser_usb_leaf: Get capabilities from device can: kvaser_usb: kvaser_usb_leaf: Rename {leaf,usbcan}_cmd_error_event to {leaf,usbcan}_cmd_can_error_event can: kvaser_usb: kvaser_usb_leaf: Handle CMD_ERROR_EVENT can: kvaser_usb_leaf: Set Warning state even without bus errors can: kvaser_usb_leaf: Fix improved state not being reported can: kvaser_usb_leaf: Fix wrong CAN state after stopping can: kvaser_usb_leaf: Fix bogus restart events can: kvaser_usb: Add struct kvaser_usb_busparams can: kvaser_usb: Compare requested bittiming parameters with actual parameters in do_set_{,data}_bittiming drm/rockchip: lvds: fix PM usage counter unbalance in poweron clk: renesas: r9a06g032: Repair grave increment error spi: Update reference to struct spi_controller drm/panel/panel-sitronix-st7701: Remove panel on DSI attach failure ima: Fix fall-through warnings for Clang ima: Handle -ESTALE returned by ima_filter_rule_match() drm/msm/hdmi: switch to drm_bridge_connector drm/msm/hdmi: drop unused GPIO support bpf: Fix slot type check in check_stack_write_var_off media: vivid: fix compose size exceed boundary media: platform: exynos4-is: fix return value check in fimc_md_probe() bpf: propagate precision in ALU/ALU64 operations bpf: Check the other end of slot_type for STACK_SPILL bpf: propagate precision across all frames, not just the last one clk: qcom: gcc-sm8250: Use retention mode for USB GDSCs mtd: Fix device name leak when register device failed in add_mtd_device() Input: joystick - fix Kconfig warning for JOYSTICK_ADC wifi: rsi: Fix handling of 802.3 EAPOL frames sent via control port media: camss: Clean up received buffers on failed start of streaming net, proc: Provide PROC_FS=n fallback for proc_create_net_single_write() rxrpc: Fix ack.bufferSize to be 0 when generating an ack drm/radeon: Add the missed acpi_put_table() to fix memory leak drm/mediatek: Modify dpi power on/off sequence. ASoC: pxa: fix null-pointer dereference in filter() regulator: core: fix unbalanced of node refcount in regulator_dev_lookup() amdgpu/pm: prevent array underflow in vega20_odn_edit_dpm_table() drm/fourcc: Add packed 10bit YUV 4:2:0 format drm/fourcc: Fix vsub/hsub for Q410 and Q401 integrity: Fix memory leakage in keyring allocation error path ima: Fix misuse of dereference of pointer in template_desc_init_fields() wifi: ath10k: Fix return value in ath10k_pci_init() mtd: lpddr2_nvm: Fix possible null-ptr-deref Input: elants_i2c - properly handle the reset GPIO when power is off media: vidtv: Fix use-after-free in vidtv_bridge_dvb_init() media: solo6x10: fix possible memory leak in solo_sysfs_init() media: platform: exynos4-is: Fix error handling in fimc_md_init() media: videobuf-dma-contig: use dma_mmap_coherent inet: add READ_ONCE(sk->sk_bound_dev_if) in inet_csk_bind_conflict() bpf: Move skb->len == 0 checks into __bpf_redirect HID: hid-sensor-custom: set fixed size for custom attributes ALSA: pcm: fix undefined behavior in bit shift for SNDRV_PCM_RATE_KNOT ALSA: seq: fix undefined behavior in bit shift for SNDRV_SEQ_FILTER_USE_EVENT regulator: core: use kfree_const() to free space conditionally clk: rockchip: Fix memory leak in rockchip_clk_register_pll() drm/amdgpu: fix pci device refcount leak bonding: fix link recovery in mode 2 when updelay is nonzero mtd: maps: pxa2xx-flash: fix memory leak in probe drbd: fix an invalid memory access caused by incorrect use of list iterator ASoC: qcom: Add checks for devm_kcalloc media: vimc: Fix wrong function called when vimc_init() fails media: imon: fix a race condition in send_packet() clk: imx: replace osc_hdmi with dummy pinctrl: pinconf-generic: add missing of_node_put() media: dvb-core: Fix ignored return value in dvb_register_frontend() media: dvb-usb: az6027: fix null-ptr-deref in az6027_i2c_xfer() media: s5p-mfc: Add variant data for MFC v7 hardware for Exynos 3250 SoC drm/tegra: Add missing clk_disable_unprepare() in tegra_dc_probe() ASoC: dt-bindings: wcd9335: fix reset line polarity in example ASoC: mediatek: mtk-btcvsd: Add checks for write and read of mtk_btcvsd_snd NFSv4.2: Clear FATTR4_WORD2_SECURITY_LABEL when done decoding NFSv4.2: Fix a memory stomp in decode_attr_security_label NFSv4.2: Fix initialisation of struct nfs4_label NFSv4: Fix a deadlock between nfs4_open_recover_helper() and delegreturn NFS: Fix an Oops in nfs_d_automount() ALSA: asihpi: fix missing pci_disable_device() wifi: iwlwifi: mvm: fix double free on tx path. ASoC: mediatek: mt8173: Fix debugfs registration for components ASoC: mediatek: mt8173: Enable IRQ when pdata is ready drm/amd/pm/smu11: BACO is supported when it's in BACO state drm/radeon: Fix PCI device refcount leak in radeon_atrm_get_bios() drm/amdgpu: Fix PCI device refcount leak in amdgpu_atrm_get_bios() ASoC: pcm512x: Fix PM disable depth imbalance in pcm512x_probe netfilter: conntrack: set icmpv6 redirects as RELATED bpf, sockmap: Fix repeated calls to sock_put() when msg has more_data bpf, sockmap: Fix data loss caused by using apply_bytes on ingress redirect bonding: uninitialized variable in bond_miimon_inspect() spi: spidev: mask SPI_CS_HIGH in SPI_IOC_RD_MODE wifi: mac80211: fix memory leak in ieee80211_if_add() wifi: cfg80211: Fix not unregister reg_pdev when load_builtin_regdb_keys() fails wifi: mt76: fix coverity overrun-call in mt76_get_txpower() regulator: core: fix module refcount leak in set_supply() clk: qcom: clk-krait: fix wrong div2 functions hsr: Add a rcu-read lock to hsr_forward_skb(). net: hsr: generate supervision frame without HSR/PRP tag hsr: Disable netpoll. hsr: Synchronize sending frames to have always incremented outgoing seq nr. hsr: Synchronize sequence number updates. configfs: fix possible memory leak in configfs_create_dir() regulator: core: fix resource leak in regulator_register() hwmon: (jc42) Convert register access and caching to regmap/regcache hwmon: (jc42) Restore the min/max/critical temperatures on resume bpf, sockmap: fix race in sock_map_free() ALSA: pcm: Set missing stop_operating flag at undoing trigger start media: saa7164: fix missing pci_disable_device() ALSA: mts64: fix possible null-ptr-defer in snd_mts64_interrupt xprtrdma: Fix regbuf data not freed in rpcrdma_req_create() SUNRPC: Fix missing release socket in rpc_sockname() NFSv4.x: Fail client initialisation if state manager thread can't run mmc: alcor: fix return value check of mmc_add_host() mmc: moxart: fix return value check of mmc_add_host() mmc: mxcmmc: fix return value check of mmc_add_host() mmc: pxamci: fix return value check of mmc_add_host() mmc: rtsx_usb_sdmmc: fix return value check of mmc_add_host() mmc: toshsd: fix return value check of mmc_add_host() mmc: vub300: fix return value check of mmc_add_host() mmc: wmt-sdmmc: fix return value check of mmc_add_host() mmc: atmel-mci: fix return value check of mmc_add_host() mmc: omap_hsmmc: fix return value check of mmc_add_host() mmc: meson-gx: fix return value check of mmc_add_host() mmc: via-sdmmc: fix return value check of mmc_add_host() mmc: wbsd: fix return value check of mmc_add_host() mmc: mmci: fix return value check of mmc_add_host() media: c8sectpfe: Add of_node_put() when breaking out of loop media: coda: Add check for dcoda_iram_alloc media: coda: Add check for kmalloc clk: samsung: Fix memory leak in _samsung_clk_register_pll() spi: spi-gpio: Don't set MOSI as an input if not 3WIRE mode wifi: rtl8xxxu: Add __packed to struct rtl8723bu_c2h wifi: rtl8xxxu: Fix the channel width reporting wifi: brcmfmac: Fix error return code in brcmf_sdio_download_firmware() blktrace: Fix output non-blktrace event when blk_classic option enabled clk: socfpga: clk-pll: Remove unused variable 'rc' clk: socfpga: use clk_hw_register for a5/c5 clk: socfpga: Fix memory leak in socfpga_gate_init() net: vmw_vsock: vmci: Check memcpy_from_msg() net: defxx: Fix missing err handling in dfx_init() net: stmmac: selftests: fix potential memleak in stmmac_test_arpoffload() drivers: net: qlcnic: Fix potential memory leak in qlcnic_sriov_init() of: overlay: fix null pointer dereferencing in find_dup_cset_node_entry() and find_dup_cset_prop() ethernet: s2io: don't call dev_kfree_skb() under spin_lock_irqsave() net: farsync: Fix kmemleak when rmmods farsync net/tunnel: wait until all sk_user_data reader finish before releasing the sock net: apple: mace: don't call dev_kfree_skb() under spin_lock_irqsave() net: apple: bmac: don't call dev_kfree_skb() under spin_lock_irqsave() net: emaclite: don't call dev_kfree_skb() under spin_lock_irqsave() net: ethernet: dnet: don't call dev_kfree_skb() under spin_lock_irqsave() hamradio: don't call dev_kfree_skb() under spin_lock_irqsave() net: amd: lance: don't call dev_kfree_skb() under spin_lock_irqsave() net: amd-xgbe: Fix logic around active and passive cables net: amd-xgbe: Check only the minimum speed for active/passive cables can: tcan4x5x: Remove invalid write in clear_interrupts net: lan9303: Fix read error execution path ntb_netdev: Use dev_kfree_skb_any() in interrupt context sctp: sysctl: make extra pointers netns aware Bluetooth: btusb: don't call kfree_skb() under spin_lock_irqsave() Bluetooth: hci_qca: don't call kfree_skb() under spin_lock_irqsave() Bluetooth: hci_ll: don't call kfree_skb() under spin_lock_irqsave() Bluetooth: hci_h5: don't call kfree_skb() under spin_lock_irqsave() Bluetooth: hci_bcsp: don't call kfree_skb() under spin_lock_irqsave() Bluetooth: hci_core: don't call kfree_skb() under spin_lock_irqsave() Bluetooth: RFCOMM: don't call kfree_skb() under spin_lock_irqsave() stmmac: fix potential division by 0 apparmor: fix a memleak in multi_transaction_new() apparmor: fix lockdep warning when removing a namespace apparmor: Fix abi check to include v8 abi crypto: sun8i-ss - use dma_addr instead u32 crypto: nitrox - avoid double free on error path in nitrox_sriov_init() scsi: core: Fix a race between scsi_done() and scsi_timeout() apparmor: Use pointer to struct aa_label for lbs_cred PCI: dwc: Fix n_fts[] array overrun RDMA/core: Fix order of nldev_exit call PCI: pci-epf-test: Register notifier if only core_init_notifier is enabled f2fs: Fix the race condition of resize flag between resizefs crypto: rockchip - do not do custom power management crypto: rockchip - do not store mode globally crypto: rockchip - add fallback for cipher crypto: rockchip - add fallback for ahash crypto: rockchip - better handle cipher key crypto: rockchip - remove non-aligned handling crypto: rockchip - delete unneeded variable initialization crypto: rockchip - rework by using crypto_engine apparmor: Fix memleak in alloc_ns() f2fs: fix normal discard process RDMA/siw: Fix immediate work request flush to completion queue RDMA/nldev: Return "-EAGAIN" if the cm_id isn't from expected port RDMA/siw: Set defined status for work completion with undefined status scsi: scsi_debug: Fix a warning in resp_write_scat() crypto: ccree - Remove debugfs when platform_driver_register failed crypto: cryptd - Use request context instead of stack for sub-request crypto: hisilicon/qm - add missing pci_dev_put() in q_num_set() RDMA/hns: Repacing 'dseg_len' by macros in fill_ext_sge_inl_data() RDMA/hns: Fix ext_sge num error when post send PCI: Check for alloc failure in pci_request_irq() RDMA/hfi: Decrease PCI device reference count in error path crypto: ccree - Make cc_debugfs_global_fini() available for module init function RDMA/hns: fix memory leak in hns_roce_alloc_mr() RDMA/rxe: Fix NULL-ptr-deref in rxe_qp_do_cleanup() when socket create failed scsi: hpsa: Fix possible memory leak in hpsa_init_one() crypto: tcrypt - Fix multibuffer skcipher speed test mem leak padata: Always leave BHs disabled when running ->parallel() padata: Fix list iterator in padata_do_serial() scsi: mpt3sas: Fix possible resource leaks in mpt3sas_transport_port_add() scsi: hpsa: Fix error handling in hpsa_add_sas_host() scsi: hpsa: Fix possible memory leak in hpsa_add_sas_device() scsi: scsi_debug: Fix a warning in resp_verify() scsi: scsi_debug: Fix a warning in resp_report_zones() scsi: fcoe: Fix possible name leak when device_register() fails scsi: scsi_debug: Fix possible name leak in sdebug_add_host_helper() scsi: ipr: Fix WARNING in ipr_init() scsi: fcoe: Fix transport not deattached when fcoe_if_init() fails scsi: snic: Fix possible UAF in snic_tgt_create() RDMA/nldev: Add checks for nla_nest_start() in fill_stat_counter_qps() f2fs: avoid victim selection from previous victim section RDMA/nldev: Fix failure to send large messages crypto: amlogic - Remove kcalloc without check crypto: omap-sham - Use pm_runtime_resume_and_get() in omap_sham_probe() riscv/mm: add arch hook arch_clear_hugepage_flags RDMA/hfi1: Fix error return code in parse_platform_config() RDMA/srp: Fix error return code in srp_parse_options() orangefs: Fix sysfs not cleanup when dev init failed RDMA/hns: Fix PBL page MTR find RDMA/hns: Fix page size cap from firmware crypto: img-hash - Fix variable dereferenced before check 'hdev->req' hwrng: amd - Fix PCI device refcount leak hwrng: geode - Fix PCI device refcount leak IB/IPoIB: Fix queue count inconsistency for PKEY child interfaces drivers: dio: fix possible memory leak in dio_init() serial: tegra: Read DMA status before terminating class: fix possible memory leak in __class_register() vfio: platform: Do not pass return buffer to ACPI _RST method uio: uio_dmem_genirq: Fix missing unlock in irq configuration uio: uio_dmem_genirq: Fix deadlock between irq config and handling usb: fotg210-udc: Fix ages old endianness issues staging: vme_user: Fix possible UAF in tsi148_dma_list_add usb: typec: Check for ops->exit instead of ops->enter in altmode_exit usb: typec: tcpci: fix of node refcount leak in tcpci_register_port() usb: typec: tipd: Fix spurious fwnode_handle_put in error path serial: amba-pl011: avoid SBSA UART accessing DMACR register serial: pl011: Do not clear RX FIFO & RX interrupt in unthrottle. serial: pch: Fix PCI device refcount leak in pch_request_dma() tty: serial: clean up stop-tx part in altera_uart_tx_chars() tty: serial: altera_uart_{r,t}x_chars() need only uart_port serial: altera_uart: fix locking in polling mode serial: sunsab: Fix error handling in sunsab_init() test_firmware: fix memory leak in test_firmware_init() misc: ocxl: fix possible name leak in ocxl_file_register_afu() ocxl: fix pci device refcount leak when calling get_function_0() misc: tifm: fix possible memory leak in tifm_7xx1_switch_media() misc: sgi-gru: fix use-after-free error in gru_set_context_option, gru_fault and gru_handle_user_call_os firmware: raspberrypi: fix possible memory leak in rpi_firmware_probe() cxl: fix possible null-ptr-deref in cxl_guest_init_afu|adapter() cxl: fix possible null-ptr-deref in cxl_pci_init_afu|adapter() iio: temperature: ltc2983: make bulk write buffer DMA-safe genirq: Add IRQF_NO_AUTOEN for request_irq/nmi() iio:imu:adis: Use IRQF_NO_AUTOEN instead of irq request then disable iio: adis: handle devices that cannot unmask the drdy pin iio: adis: stylistic changes iio:imu:adis: Move exports into IIO_ADISLIB namespace iio: adis: add '__adis_enable_irq()' implementation counter: stm32-lptimer-cnt: fix the check on arr and cmp registers update usb: roles: fix of node refcount leak in usb_role_switch_is_parent() usb: gadget: f_hid: optional SETUP/SET_REPORT mode usb: gadget: f_hid: fix f_hidg lifetime vs cdev usb: gadget: f_hid: fix refcount leak on error path drivers: mcb: fix resource leak in mcb_probe() mcb: mcb-parse: fix error handing in chameleon_parse_gdd() chardev: fix error handling in cdev_device_add() i2c: pxa-pci: fix missing pci_disable_device() on error in ce4100_i2c_probe staging: rtl8192u: Fix use after free in ieee80211_rx() staging: rtl8192e: Fix potential use-after-free in rtllib_rx_Monitor() vme: Fix error not catched in fake_init() gpiolib: Get rid of redundant 'else' gpiolib: cdev: fix NULL-pointer dereferences i2c: mux: reg: check return value after calling platform_get_resource() i2c: ismt: Fix an out-of-bounds bug in ismt_access() usb: storage: Add check for kcalloc tracing/hist: Fix issue of losting command info in error_log samples: vfio-mdev: Fix missing pci_disable_device() in mdpy_fb_probe() thermal/drivers/imx8mm_thermal: Validate temperature range fbdev: ssd1307fb: Drop optional dependency fbdev: pm2fb: fix missing pci_disable_device() fbdev: via: Fix error in via_core_init() fbdev: vermilion: decrease reference count in error path fbdev: uvesafb: Fixes an error handling path in uvesafb_probe() HSI: omap_ssi_core: fix unbalanced pm_runtime_disable() HSI: omap_ssi_core: fix possible memory leak in ssi_probe() power: supply: fix residue sysfs file in error handle route of __power_supply_register() perf trace: Return error if a system call doesn't exist perf trace: Use macro RAW_SYSCALL_ARGS_NUM to replace number perf trace: Handle failure when trace point folder is missed perf symbol: correction while adjusting symbol HSI: omap_ssi_core: Fix error handling in ssi_init() power: supply: fix null pointer dereferencing in power_supply_get_battery_info RDMA/siw: Fix pointer cast warning iommu/sun50i: Fix reset release iommu/sun50i: Consider all fault sources for reset iommu/sun50i: Fix R/W permission check iommu/sun50i: Fix flush size phy: usb: s2 WoL wakeup_count not incremented for USB->Eth devices include/uapi/linux/swab: Fix potentially missing __always_inline pwm: tegra: Improve required rate calculation dmaengine: idxd: Fix crc_val field for completion record rtc: rtc-cmos: Do not check ACPI_FADT_LOW_POWER_S0 rtc: cmos: Fix event handler registration ordering issue rtc: cmos: Fix wake alarm breakage rtc: cmos: fix build on non-ACPI platforms rtc: cmos: Call cmos_wake_setup() from cmos_do_probe() rtc: cmos: Call rtc_wake_setup() from cmos_do_probe() rtc: cmos: Eliminate forward declarations of some functions rtc: cmos: Rename ACPI-related functions rtc: cmos: Disable ACPI RTC event on removal rtc: snvs: Allow a time difference on clock register read rtc: pcf85063: Fix reading alarm iommu/amd: Fix pci device refcount leak in ppr_notifier() iommu/fsl_pamu: Fix resource leak in fsl_pamu_probe() macintosh: fix possible memory leak in macio_add_one_device() macintosh/macio-adb: check the return value of ioremap() powerpc/52xx: Fix a resource leak in an error handling path cxl: Fix refcount leak in cxl_calc_capp_routing powerpc/xmon: Enable breakpoints on 8xx powerpc/xmon: Fix -Wswitch-unreachable warning in bpt_cmds powerpc/xive: add missing iounmap() in error path in xive_spapr_populate_irq_data() kbuild: remove unneeded mkdir for external modules_install kbuild: unify modules(_install) for in-tree and external modules kbuild: refactor single builds of *.ko powerpc/perf: callchain validate kernel stack pointer bounds powerpc/83xx/mpc832x_rdb: call platform_device_put() in error case in of_fsl_spi_probe() powerpc/hv-gpci: Fix hv_gpci event list selftests/powerpc: Fix resource leaks iommu/sun50i: Remove IOMMU_DOMAIN_IDENTITY pwm: sifive: Call pwm_sifive_update_clock() while mutex is held remoteproc: sysmon: fix memory leak in qcom_add_sysmon_subdev() remoteproc: qcom_q6v5_pas: disable wakeup on probe fail or remove remoteproc: qcom_q6v5_pas: detach power domains on remove remoteproc: qcom_q6v5_pas: Fix missing of_node_put() in adsp_alloc_memory_region() powerpc/eeh: Drop redundant spinlock initialization powerpc/pseries/eeh: use correct API for error log size netfilter: flowtable: really fix NAT IPv6 offload rtc: st-lpc: Add missing clk_disable_unprepare in st_rtc_probe() rtc: pic32: Move devm_rtc_allocate_device earlier in pic32_rtc_probe() rtc: pcf85063: fix pcf85063_clkout_control NFSD: Remove spurious cb_setup_err tracepoint nfsd: under NFSv4.1, fix double svc_xprt_put on rpc_create failure net: macsec: fix net device access prior to holding a lock mISDN: hfcsusb: don't call dev_kfree_skb/kfree_skb() under spin_lock_irqsave() mISDN: hfcpci: don't call dev_kfree_skb/kfree_skb() under spin_lock_irqsave() mISDN: hfcmulti: don't call dev_kfree_skb/kfree_skb() under spin_lock_irqsave() nfc: pn533: Clear nfc_target before being used r6040: Fix kmemleak in probe and remove net: switch to storing KCOV handle directly in sk_buff net: add inline function skb_csum_is_sctp net: igc: use skb_csum_is_sctp instead of protocol check net: add a helper to avoid issues with HW TX timestamping and SO_TXTIME igc: Enhance Qbv scheduling by using first flag bit igc: Use strict cycles for Qbv scheduling igc: Add checking for basetime less than zero igc: recalculate Qbv end_time by considering cycle time igc: Lift TAPRIO schedule restriction igc: Set Qbv start_time and end_time to end_time if not being configured in GCL rtc: mxc_v2: Add missing clk_disable_unprepare() selftests: devlink: fix the fd redirect in dummy_reporter_test openvswitch: Fix flow lookup to use unmasked key skbuff: Account for tail adjustment during pull operations mailbox: zynq-ipi: fix error handling while device_register() fails net_sched: reject TCF_EM_SIMPLE case for complex ematch module rxrpc: Fix missing unlock in rxrpc_do_sendmsg() myri10ge: Fix an error handling path in myri10ge_probe() net: stream: purge sk_error_queue in sk_stream_kill_queues() rcu: Fix __this_cpu_read() lockdep warning in rcu_force_quiescent_state() arm64: make is_ttbrX_addr() noinstr-safe video: hyperv_fb: Avoid taking busy spinlock on panic path x86/hyperv: Remove unregister syscore call from Hyper-V cleanup binfmt_misc: fix shift-out-of-bounds in check_special_flags fs: jfs: fix shift-out-of-bounds in dbAllocAG udf: Avoid double brelse() in udf_rename() fs: jfs: fix shift-out-of-bounds in dbDiscardAG ACPICA: Fix error code path in acpi_ds_call_control_method() nilfs2: fix shift-out-of-bounds/overflow in nilfs_sb2_bad_offset() nilfs2: fix shift-out-of-bounds due to too large exponent of block size acct: fix potential integer overflow in encode_comp_t() hfs: fix OOB Read in __hfs_brec_find drm/etnaviv: add missing quirks for GC300 brcmfmac: return error when getting invalid max_flowrings from dongle wifi: ath9k: verify the expected usb_endpoints are present wifi: ar5523: Fix use-after-free on ar5523_cmd() timed out ASoC: codecs: rt298: Add quirk for KBL-R RVP platform ipmi: fix memleak when unload ipmi driver drm/amd/display: prevent memory leak qed (gcc13): use u16 for fid to be big enough bpf: make sure skb->len != 0 when redirecting to a tunneling device net: ethernet: ti: Fix return type of netcp_ndo_start_xmit() hamradio: baycom_epp: Fix return type of baycom_send_packet() wifi: brcmfmac: Fix potential shift-out-of-bounds in brcmf_fw_alloc_request() igb: Do not free q_vector unless new one was allocated drm/amdgpu: Fix type of second parameter in trans_msg() callback drm/amdgpu: Fix type of second parameter in odn_edit_dpm_table() callback s390/ctcm: Fix return type of ctc{mp,}m_tx() s390/netiucv: Fix return type of netiucv_tx() s390/lcs: Fix return type of lcs_start_xmit() drm/msm: Use drm_mode_copy() drm/rockchip: Use drm_mode_copy() drm/sti: Use drm_mode_copy() drivers/md/md-bitmap: check the return value of md_bitmap_get_counter() md/raid1: stop mdx_raid1 thread when raid1 array run failed drm/amd/display: fix array index out of bound error in bios parser net: add atomic_long_t to net_device_stats fields mrp: introduce active flags to prevent UAF when applicant uninit ppp: associate skb with a device at tx bpf: Prevent decl_tag from being referenced in func_proto arg ethtool: avoiding integer overflow in ethtool_phys_id() media: dvb-frontends: fix leak of memory fw media: dvbdev: adopts refcnt to avoid UAF media: dvb-usb: fix memory leak in dvb_usb_adapter_init() blk-mq: fix possible memleak when register 'hctx' failed libbpf: Avoid enum forward-declarations in public API in C++ mode regulator: core: fix use_count leakage when handling boot-on mmc: f-sdh30: Add quirks for broken timeout clock capability mmc: renesas_sdhi: better reset from HS400 mode media: si470x: Fix use-after-free in si470x_int_in_callback() clk: st: Fix memory leak in st_of_quadfs_setup() hugetlbfs: fix null-ptr-deref in hugetlbfs_parse_param() drm/fsl-dcu: Fix return type of fsl_dcu_drm_connector_mode_valid() drm/sti: Fix return type of sti_{dvo,hda,hdmi}_connector_mode_valid() orangefs: Fix kmemleak in orangefs_prepare_debugfs_help_string() orangefs: Fix kmemleak in orangefs_{kernel,client}_debug_init() hwmon: (jc42) Fix missing unlock on error in jc42_write() ALSA/ASoC: hda: move/rename snd_hdac_ext_stop_streams to hdac_stream.c ALSA: hda: add snd_hdac_stop_streams() helper ASoC: Intel: Skylake: Fix driver hang during shutdown ASoC: mediatek: mt8173-rt5650-rt5514: fix refcount leak in mt8173_rt5650_rt5514_dev_probe() ASoC: audio-graph-card: fix refcount leak of cpu_ep in __graph_for_each_link() ASoC: rockchip: pdm: Add missing clk_disable_unprepare() in rockchip_pdm_runtime_resume() ASoC: wm8994: Fix potential deadlock ASoC: rockchip: spdif: Add missing clk_disable_unprepare() in rk_spdif_runtime_resume() ASoC: rt5670: Remove unbalanced pm_runtime_put() LoadPin: Ignore the "contents" argument of the LSM hooks pstore: Switch pmsg_lock to an rt_mutex to avoid priority inversion perf debug: Set debug_peo_args and redirect_to_stderr variable to correct values in perf_quiet_option() afs: Fix lost servers_outstanding count pstore: Make sure CONFIG_PSTORE_PMSG selects CONFIG_RT_MUTEXES ima: Simplify ima_lsm_copy_rule ALSA: usb-audio: add the quirk for KT0206 device ALSA: hda/realtek: Add quirk for Lenovo TianYi510Pro-14IOB ALSA: hda/hdmi: Add HP Device 0x8711 to force connect list usb: dwc3: Fix race between dwc3_set_mode and __dwc3_set_mode usb: dwc3: core: defer probe on ulpi_read_id timeout HID: wacom: Ensure bootloader PID is usable in hidraw mode HID: mcp2221: don't connect hidraw reiserfs: Add missing calls to reiserfs_security_free() iio: adc: ad_sigma_delta: do not use internal iio_dev lock iio: adc128s052: add proper .data members in adc128_of_match table regulator: core: fix deadlock on regulator enable gcov: add support for checksum field ovl: fix use inode directly in rcu-walk mode media: dvbdev: fix build warning due to comments media: dvbdev: fix refcnt bug pwm: tegra: Fix 32 bit build usb: dwc3: qcom: Fix memory leak in dwc3_qcom_interconnect_init cifs: fix oops during encryption nvme-pci: fix doorbell buffer value endianness nvme-pci: fix mempool alloc size nvme-pci: fix page size checks ata: ahci: Fix PCS quirk application for suspend nvme: fix the NVME_CMD_EFFECTS_CSE_MASK definition nvmet: don't defer passthrough commands with trivial effects to the workqueue objtool: Fix SEGFAULT powerpc/rtas: avoid device tree lookups in rtas_os_term() powerpc/rtas: avoid scheduling in rtas_os_term() HID: multitouch: fix Asus ExpertBook P2 P2451FA trackpoint HID: plantronics: Additional PIDs for double volume key presses quirk pstore/zone: Use GFP_ATOMIC to allocate zone buffer hfsplus: fix bug causing custom uid and gid being unable to be assigned with mount binfmt: Fix error return code in load_elf_fdpic_binary() ovl: Use ovl mounter's fsuid and fsgid in ovl_link() ALSA: line6: correct midi status byte when receiving data from podxt ALSA: line6: fix stack overflow in line6_midi_transmit pnode: terminate at peers of source md: fix a crash in mempool_free mm, compaction: fix fast_isolate_around() to stay within boundaries f2fs: should put a page when checking the summary info mmc: vub300: fix warning - do not call blocking ops when !TASK_RUNNING tpm: acpi: Call acpi_put_table() to fix memory leak tpm: tpm_crb: Add the missed acpi_put_table() to fix memory leak tpm: tpm_tis: Add the missed acpi_put_table() to fix memory leak SUNRPC: Don't leak netobj memory when gss_read_proxy_verf() fails kcsan: Instrument memcpy/memset/memmove with newer Clang ASoC: Intel/SOF: use set_stream() instead of set_tdm_slots() for HDAudio ASoC/SoundWire: dai: expand 'stream' concept beyond SoundWire net/mlx5e: Fix nullptr in mlx5e_tc_add_fdb_flow() wifi: rtlwifi: remove always-true condition pointed out by GCC 12 wifi: rtlwifi: 8192de: correct checking of IQK reload torture: Exclude "NOHZ tick-stop error" from fatal errors rcu: Prevent lockdep-RCU splats on lock acquisition/release net/af_packet: add VLAN support for AF_PACKET SOCK_RAW GSO net/af_packet: make sure to pull mac header media: stv0288: use explicitly signed char soc: qcom: Select REMAP_MMIO for LLCC driver kest.pl: Fix grub2 menu handling for rebooting ktest.pl minconfig: Unset configs instead of just removing them jbd2: use the correct print format arm64: dts: qcom: sdm845-db845c: correct SPI2 pins drive strength mmc: sdhci-sprd: Disable CLK_AUTO when the clock is less than 400K btrfs: fix resolving backrefs for inline extent followed by prealloc ARM: ux500: do not directly dereference __iomem arm64: dts: qcom: sdm850-lenovo-yoga-c630: correct I2C12 pins drive strength selftests: Use optional USERCFLAGS and USERLDFLAGS PM/devfreq: governor: Add a private governor_data for governor cpufreq: Init completion before kobject_init_and_add() ALSA: patch_realtek: Fix Dell Inspiron Plus 16 ALSA: hda/realtek: Apply dual codec fixup for Dell Latitude laptops dm cache: Fix ABBA deadlock between shrink_slab and dm_cache_metadata_abort dm thin: Fix ABBA deadlock between shrink_slab and dm_pool_abort_metadata dm thin: Use last transaction's pmd->root when commit failed dm thin: resume even if in FAIL mode dm thin: Fix UAF in run_timer_softirq() dm integrity: Fix UAF in dm_integrity_dtr() dm clone: Fix UAF in clone_dtr() dm cache: Fix UAF in destroy() dm cache: set needs_check flag after aborting metadata tracing/hist: Fix out-of-bound write on 'action_data.var_ref_idx' perf/core: Call LSM hook after copying perf_event_attr KVM: nVMX: Inject #GP, not #UD, if "generic" VMXON CR0/CR4 check fails x86/microcode/intel: Do not retry microcode reloading on the APs ftrace/x86: Add back ftrace_expected for ftrace bug reports x86/kprobes: Fix kprobes instruction boudary check with CONFIG_RETHUNK tracing/hist: Fix wrong return value in parse_action_params() tracing: Fix infinite loop in tracing_read_pipe on overflowed print_trace_line staging: media: tegra-video: fix chan->mipi value on error ARM: 9256/1: NWFPE: avoid compiler-generated __aeabi_uldivmod media: dvb-core: Fix double free in dvb_register_device() media: dvb-core: Fix UAF due to refcount races at releasing cifs: fix confusing debug message cifs: fix missing display of three mount options rtc: ds1347: fix value written to century register md/bitmap: Fix bitmap chunk size overflow issues efi: Add iMac Pro 2017 to uefi skip cert quirk wifi: wilc1000: sdio: fix module autoloading ASoC: jz4740-i2s: Handle independent FIFO flush bits ipmi: fix long wait in unload when IPMI disconnect mtd: spi-nor: Check for zero erase size in spi_nor_find_best_erase_type() ima: Fix a potential NULL pointer access in ima_restore_measurement_list ipmi: fix use after free in _ipmi_destroy_user() PCI: Fix pci_device_is_present() for VFs by checking PF PCI/sysfs: Fix double free in error path crypto: n2 - add missing hash statesize driver core: Fix bus_type.match() error handling in __driver_attach() iommu/amd: Fix ivrs_acpihid cmdline parsing code remoteproc: core: Do pm_relax when in RPROC_OFFLINE state parisc: led: Fix potential null-ptr-deref in start_task() device_cgroup: Roll back to original exceptions after copy failure drm/connector: send hotplug uevent on connector cleanup drm/vmwgfx: Validate the box size for the snooped cursor drm/i915/dsi: fix VBT send packet port selection for dual link DSI drm/ingenic: Fix missing platform_driver_unregister() call in ingenic_drm_init() ext4: silence the warning when evicting inode with dioread_nolock ext4: add inode table check in __ext4_get_inode_loc to aovid possible infinite loop ext4: fix use-after-free in ext4_orphan_cleanup ext4: fix undefined behavior in bit shift for ext4_check_flag_values ext4: add EXT4_IGET_BAD flag to prevent unexpected bad inode ext4: add helper to check quota inums ext4: fix bug_on in __es_tree_search caused by bad quota inode ext4: fix reserved cluster accounting in __es_remove_extent() ext4: check and assert if marking an no_delete evicting inode dirty ext4: fix bug_on in __es_tree_search caused by bad boot loader inode ext4: init quota for 'old.inode' in 'ext4_rename' ext4: fix delayed allocation bug in ext4_clu_mapped for bigalloc + inline ext4: fix corruption when online resizing a 1K bigalloc fs ext4: fix error code return to user-space in ext4_get_branch() ext4: avoid BUG_ON when creating xattrs ext4: fix inode leak in ext4_xattr_inode_create() on an error path ext4: initialize quota before expanding inode in setproject ioctl ext4: avoid unaccounted block allocation when expanding inode ext4: allocate extended attribute value in vmalloc area drm/amdgpu: handle polaris10/11 overlap asics (v2) drm/amdgpu: make display pinning more flexible (v2) ARM: renumber bits related to _TIF_WORK_MASK perf/x86/intel/uncore: Generalize I/O stacks to PMON mapping procedure perf/x86/intel/uncore: Clear attr_update properly btrfs: replace strncpy() with strscpy() x86/mce: Get rid of msr_ops x86/MCE/AMD: Clear DFR errors found in THR handler media: s5p-mfc: Fix to handle reference queue during finishing media: s5p-mfc: Clear workbit to handle error condition media: s5p-mfc: Fix in register read and write for H264 perf probe: Use dwarf_attr_integrate as generic DWARF attr accessor perf probe: Fix to get the DW_AT_decl_file and DW_AT_call_file as unsinged data x86/kprobes: Convert to insn_decode() x86/kprobes: Fix optprobe optimization check with CONFIG_RETHUNK staging: media: tegra-video: fix device_node use after free ravb: Fix "failed to switch device to config mode" message during unbind riscv/stacktrace: Fix stack output without ra on the stack top riscv: stacktrace: Fixup ftrace_graph_ret_addr retp argument ext4: goto right label 'failed_mount3a' ext4: correct inconsistent error msg in nojournal mode mm/highmem: Lift memcpy_[to|from]_page to core ext4: use memcpy_to_page() in pagecache_write() fs: ext4: initialize fsdata in pagecache_write() ext4: move functions in super.c ext4: simplify ext4 error translation ext4: fix various seppling typos ext4: fix leaking uninitialized memory in fast-commit journal ext4: use kmemdup() to replace kmalloc + memcpy mbcache: don't reclaim used entries mbcache: add functions to delete entry if unused ext4: remove EA inode entry from mbcache on inode eviction ext4: unindent codeblock in ext4_xattr_block_set() ext4: fix race when reusing xattr blocks mbcache: automatically delete entries from cache on freeing ext4: fix deadlock due to mbcache entry corruption SUNRPC: ensure the matching upcall is in-flight upon downcall bpf: pull before calling skb_postpull_rcsum() drm/panfrost: Fix GEM handle creation ref-counting vmxnet3: correctly report csum_level for encapsulated packet veth: Fix race with AF_XDP exposing old or uninitialized descriptors nfsd: shut down the NFSv4 state objects before the filecache net: hns3: add interrupts re-initialization while doing VF FLR net: sched: fix memory leak in tcindex_set_parms qlcnic: prevent ->dcb use-after-free on qlcnic_dcb_enable() failure nfc: Fix potential resource leaks vhost/vsock: Fix error handling in vhost_vsock_init() vringh: fix range used in iotlb_translate() vhost: fix range used in translate_desc() net/mlx5: Add forgotten cleanup calls into mlx5_init_once() error path net/mlx5: Avoid recovery in probe flows net/mlx5e: IPoIB, Don't allow CQE compression to be turned on by default net/mlx5e: Fix hw mtu initializing at XDP SQ allocation net: amd-xgbe: add missed tasklet_kill net: phy: xgmiitorgmii: Fix refcount leak in xgmiitorgmii_probe RDMA/mlx5: Fix validation of max_rd_atomic caps for DC drm/meson: Reduce the FIFO lines held when AFBC is not used filelock: new helper: vfs_inode_has_locks ceph: switch to vfs_inode_has_locks() to fix file lock bug gpio: sifive: Fix refcount leak in sifive_gpio_probe net: sched: atm: dont intepret cls results when asked to drop net: sched: cbq: dont intepret cls results when asked to drop netfilter: ipset: fix hash:net,port,net hang with /0 subnet netfilter: ipset: Rework long task execution when adding/deleting entries perf tools: Fix resources leak in perf_data__open_dir() drivers/net/bonding/bond_3ad: return when there's no aggregator usb: rndis_host: Secure rndis_query check against int overflow drm/i915: unpin on error in intel_vgpu_shadow_mm_pin() caif: fix memory leak in cfctrl_linkup_request() udf: Fix extension of the last extent in the file ASoC: Intel: bytcr_rt5640: Add quirk for the Advantech MICA-071 tablet nvme: fix multipath crash caused by flush request when blktrace is enabled x86/bugs: Flush IBP in ib_prctl_set() nfsd: fix handling of readdir in v4root vs. mount upcall timeout fbdev: matroxfb: G200eW: Increase max memory from 1 MB to 16 MB riscv: uaccess: fix type of 0 variable on error in get_user() drm/i915/gvt: fix gvt debugfs destroy drm/i915/gvt: fix vgpu debugfs clean in remove ext4: don't allow journal inode to have encrypt flag selftests: set the BUILD variable to absolute path hfs/hfsplus: use WARN_ON for sanity check hfs/hfsplus: avoid WARN_ON() for sanity check, use proper error handling mbcache: Avoid nesting of cache->c_list_lock under bit locks efi: random: combine bootloader provided RNG seed with RNG protocol output io_uring: Fix unsigned 'res' comparison with zero in io_fixup_rw_res() parisc: Align parisc MADV_XXX constants with all other architectures ext4: disable fast-commit of encrypted dir operations ext4: don't set up encryption key during jbd2 transaction fsl_lpuart: Don't enable interrupts too early serial: fixup backport of "serial: Deassert Transmit Enable on probe in driver-specific way" mptcp: mark ops structures as ro_after_init mptcp: remove MPTCP 'ifdef' in TCP SYN cookies mptcp: dedicated request sock for subflow in v6 mptcp: use proper req destructor for IPv6 net: sched: disallow noqueue for qdisc classes net/ulp: prevent ULP without clone op from entering the LISTEN status ALSA: pcm: Move rwsem lock inside snd_ctl_elem_read to prevent UAF ALSA: hda/hdmi: Add a HP device 0x8715 to force connect list ALSA: hda - Enable headset mic on another Dell laptop with ALC3254 Linux 5.10.163 Change-Id: I9026971760be8484f1e1fa607f9f91243cc87785 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
commit
4922049993
@ -109,7 +109,7 @@ audio-codec@1{
|
|||||||
reg = <1 0>;
|
reg = <1 0>;
|
||||||
interrupts = <&msmgpio 54 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <&msmgpio 54 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
interrupt-names = "intr2"
|
interrupt-names = "intr2"
|
||||||
reset-gpios = <&msmgpio 64 0>;
|
reset-gpios = <&msmgpio 64 GPIO_ACTIVE_LOW>;
|
||||||
slim-ifc-dev = <&wc9335_ifd>;
|
slim-ifc-dev = <&wc9335_ifd>;
|
||||||
clock-names = "mclk", "native";
|
clock-names = "mclk", "native";
|
||||||
clocks = <&rpmcc RPM_SMD_DIV_CLK1>,
|
clocks = <&rpmcc RPM_SMD_DIV_CLK1>,
|
||||||
|
@ -25,8 +25,8 @@ hardware, which may be as simple as a set of GPIO pins or as complex as
|
|||||||
a pair of FIFOs connected to dual DMA engines on the other side of the
|
a pair of FIFOs connected to dual DMA engines on the other side of the
|
||||||
SPI shift register (maximizing throughput). Such drivers bridge between
|
SPI shift register (maximizing throughput). Such drivers bridge between
|
||||||
whatever bus they sit on (often the platform bus) and SPI, and expose
|
whatever bus they sit on (often the platform bus) and SPI, and expose
|
||||||
the SPI side of their device as a :c:type:`struct spi_master
|
the SPI side of their device as a :c:type:`struct spi_controller
|
||||||
<spi_master>`. SPI devices are children of that master,
|
<spi_controller>`. SPI devices are children of that master,
|
||||||
represented as a :c:type:`struct spi_device <spi_device>` and
|
represented as a :c:type:`struct spi_device <spi_device>` and
|
||||||
manufactured from :c:type:`struct spi_board_info
|
manufactured from :c:type:`struct spi_board_info
|
||||||
<spi_board_info>` descriptors which are usually provided by
|
<spi_board_info>` descriptors which are usually provided by
|
||||||
|
@ -78,8 +78,8 @@ configuration of fault-injection capabilities.
|
|||||||
|
|
||||||
- /sys/kernel/debug/fail*/times:
|
- /sys/kernel/debug/fail*/times:
|
||||||
|
|
||||||
specifies how many times failures may happen at most.
|
specifies how many times failures may happen at most. A value of -1
|
||||||
A value of -1 means "no limit".
|
means "no limit".
|
||||||
|
|
||||||
- /sys/kernel/debug/fail*/space:
|
- /sys/kernel/debug/fail*/space:
|
||||||
|
|
||||||
@ -167,11 +167,13 @@ configuration of fault-injection capabilities.
|
|||||||
- ERRNO: retval must be -1 to -MAX_ERRNO (-4096).
|
- ERRNO: retval must be -1 to -MAX_ERRNO (-4096).
|
||||||
- ERR_NULL: retval must be 0 or -1 to -MAX_ERRNO (-4096).
|
- ERR_NULL: retval must be 0 or -1 to -MAX_ERRNO (-4096).
|
||||||
|
|
||||||
- /sys/kernel/debug/fail_function/<functiuon-name>/retval:
|
- /sys/kernel/debug/fail_function/<function-name>/retval:
|
||||||
|
|
||||||
specifies the "error" return value to inject to the given
|
specifies the "error" return value to inject to the given function.
|
||||||
function for given function. This will be created when
|
This will be created when the user specifies a new injection entry.
|
||||||
user specifies new injection entry.
|
Note that this file only accepts unsigned values. So, if you want to
|
||||||
|
use a negative errno, you better use 'printf' instead of 'echo', e.g.:
|
||||||
|
$ printf %#x -12 > retval
|
||||||
|
|
||||||
Boot option
|
Boot option
|
||||||
^^^^^^^^^^^
|
^^^^^^^^^^^
|
||||||
@ -336,7 +338,7 @@ Application Examples
|
|||||||
FAILTYPE=fail_function
|
FAILTYPE=fail_function
|
||||||
FAILFUNC=open_ctree
|
FAILFUNC=open_ctree
|
||||||
echo $FAILFUNC > /sys/kernel/debug/$FAILTYPE/inject
|
echo $FAILFUNC > /sys/kernel/debug/$FAILTYPE/inject
|
||||||
echo -12 > /sys/kernel/debug/$FAILTYPE/$FAILFUNC/retval
|
printf %#x -12 > /sys/kernel/debug/$FAILTYPE/$FAILFUNC/retval
|
||||||
echo N > /sys/kernel/debug/$FAILTYPE/task-filter
|
echo N > /sys/kernel/debug/$FAILTYPE/task-filter
|
||||||
echo 100 > /sys/kernel/debug/$FAILTYPE/probability
|
echo 100 > /sys/kernel/debug/$FAILTYPE/probability
|
||||||
echo 0 > /sys/kernel/debug/$FAILTYPE/interval
|
echo 0 > /sys/kernel/debug/$FAILTYPE/interval
|
||||||
|
@ -7280,7 +7280,7 @@ F: Documentation/locking/*futex*
|
|||||||
F: include/asm-generic/futex.h
|
F: include/asm-generic/futex.h
|
||||||
F: include/linux/futex.h
|
F: include/linux/futex.h
|
||||||
F: include/uapi/linux/futex.h
|
F: include/uapi/linux/futex.h
|
||||||
F: kernel/futex.c
|
F: kernel/futex/*
|
||||||
F: tools/perf/bench/futex*
|
F: tools/perf/bench/futex*
|
||||||
F: tools/testing/selftests/futex/
|
F: tools/testing/selftests/futex/
|
||||||
|
|
||||||
|
108
Makefile
108
Makefile
@ -1,7 +1,7 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
VERSION = 5
|
VERSION = 5
|
||||||
PATCHLEVEL = 10
|
PATCHLEVEL = 10
|
||||||
SUBLEVEL = 162
|
SUBLEVEL = 163
|
||||||
EXTRAVERSION =
|
EXTRAVERSION =
|
||||||
NAME = Dare mighty things
|
NAME = Dare mighty things
|
||||||
|
|
||||||
@ -1511,9 +1511,7 @@ endif
|
|||||||
|
|
||||||
PHONY += modules
|
PHONY += modules
|
||||||
# if KBUILD_BUILTIN && !KBUILD_MIXED_TREE, depend on vmlinux
|
# if KBUILD_BUILTIN && !KBUILD_MIXED_TREE, depend on vmlinux
|
||||||
modules: $(if $(KBUILD_BUILTIN), $(if $(KBUILD_MIXED_TREE),,vmlinux))
|
modules: $(if $(KBUILD_BUILTIN), $(if $(KBUILD_MIXED_TREE),,vmlinux)) modules_check modules_prepare
|
||||||
modules: modules_check modules_prepare
|
|
||||||
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
|
|
||||||
|
|
||||||
PHONY += modules_check
|
PHONY += modules_check
|
||||||
modules_check: modules.order
|
modules_check: modules.order
|
||||||
@ -1531,12 +1529,9 @@ PHONY += modules_prepare
|
|||||||
modules_prepare: prepare
|
modules_prepare: prepare
|
||||||
$(Q)$(MAKE) $(build)=scripts scripts/module.lds
|
$(Q)$(MAKE) $(build)=scripts scripts/module.lds
|
||||||
|
|
||||||
# Target to install modules
|
modules_install: __modinst_pre
|
||||||
PHONY += modules_install
|
PHONY += __modinst_pre
|
||||||
modules_install: _modinst_ _modinst_post
|
__modinst_pre:
|
||||||
|
|
||||||
PHONY += _modinst_
|
|
||||||
_modinst_:
|
|
||||||
@rm -rf $(MODLIB)/kernel
|
@rm -rf $(MODLIB)/kernel
|
||||||
@rm -f $(MODLIB)/source
|
@rm -f $(MODLIB)/source
|
||||||
@mkdir -p $(MODLIB)/kernel
|
@mkdir -p $(MODLIB)/kernel
|
||||||
@ -1548,14 +1543,6 @@ _modinst_:
|
|||||||
@sed 's:^:kernel/:' modules.order > $(MODLIB)/modules.order
|
@sed 's:^:kernel/:' modules.order > $(MODLIB)/modules.order
|
||||||
@cp -f $(mixed-build-prefix)modules.builtin $(MODLIB)/
|
@cp -f $(mixed-build-prefix)modules.builtin $(MODLIB)/
|
||||||
@cp -f $(or $(mixed-build-prefix),$(objtree)/)modules.builtin.modinfo $(MODLIB)/
|
@cp -f $(or $(mixed-build-prefix),$(objtree)/)modules.builtin.modinfo $(MODLIB)/
|
||||||
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst
|
|
||||||
|
|
||||||
# This depmod is only for convenience to give the initial
|
|
||||||
# boot a modules.dep even before / is mounted read-write. However the
|
|
||||||
# boot script depmod is the master version.
|
|
||||||
PHONY += _modinst_post
|
|
||||||
_modinst_post: _modinst_
|
|
||||||
$(call cmd,depmod)
|
|
||||||
|
|
||||||
ifeq ($(CONFIG_MODULE_SIG), y)
|
ifeq ($(CONFIG_MODULE_SIG), y)
|
||||||
PHONY += modules_sign
|
PHONY += modules_sign
|
||||||
@ -1563,20 +1550,6 @@ modules_sign:
|
|||||||
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modsign
|
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modsign
|
||||||
endif
|
endif
|
||||||
|
|
||||||
else # CONFIG_MODULES
|
|
||||||
|
|
||||||
# Modules not configured
|
|
||||||
# ---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
PHONY += modules modules_install
|
|
||||||
modules modules_install:
|
|
||||||
@echo >&2
|
|
||||||
@echo >&2 "The present kernel configuration has modules disabled."
|
|
||||||
@echo >&2 "Type 'make config' and enable loadable module support."
|
|
||||||
@echo >&2 "Then build a kernel with module support enabled."
|
|
||||||
@echo >&2
|
|
||||||
@exit 1
|
|
||||||
|
|
||||||
endif # CONFIG_MODULES
|
endif # CONFIG_MODULES
|
||||||
|
|
||||||
###
|
###
|
||||||
@ -1824,26 +1797,9 @@ KBUILD_BUILTIN :=
|
|||||||
KBUILD_MODULES := 1
|
KBUILD_MODULES := 1
|
||||||
|
|
||||||
build-dirs := $(KBUILD_EXTMOD)
|
build-dirs := $(KBUILD_EXTMOD)
|
||||||
PHONY += modules
|
|
||||||
modules: $(MODORDER)
|
|
||||||
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
|
|
||||||
|
|
||||||
$(MODORDER): descend
|
$(MODORDER): descend
|
||||||
@:
|
@:
|
||||||
|
|
||||||
PHONY += modules_install
|
|
||||||
modules_install: _emodinst_ _emodinst_post
|
|
||||||
|
|
||||||
install-dir := $(if $(INSTALL_MOD_DIR),$(INSTALL_MOD_DIR),extra)
|
|
||||||
PHONY += _emodinst_
|
|
||||||
_emodinst_:
|
|
||||||
$(Q)mkdir -p $(MODLIB)/$(install-dir)
|
|
||||||
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst
|
|
||||||
|
|
||||||
PHONY += _emodinst_post
|
|
||||||
_emodinst_post: _emodinst_
|
|
||||||
$(call cmd,depmod)
|
|
||||||
|
|
||||||
compile_commands.json: $(extmod-prefix)compile_commands.json
|
compile_commands.json: $(extmod-prefix)compile_commands.json
|
||||||
PHONY += compile_commands.json
|
PHONY += compile_commands.json
|
||||||
|
|
||||||
@ -1868,6 +1824,41 @@ PHONY += prepare modules_prepare
|
|||||||
|
|
||||||
endif # KBUILD_EXTMOD
|
endif # KBUILD_EXTMOD
|
||||||
|
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
# Modules
|
||||||
|
|
||||||
|
PHONY += modules modules_install
|
||||||
|
|
||||||
|
ifdef CONFIG_MODULES
|
||||||
|
|
||||||
|
modules: $(MODORDER)
|
||||||
|
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
|
||||||
|
|
||||||
|
quiet_cmd_depmod = DEPMOD $(KERNELRELEASE)
|
||||||
|
cmd_depmod = $(CONFIG_SHELL) $(srctree)/scripts/depmod.sh $(DEPMOD) \
|
||||||
|
$(KERNELRELEASE) $(mixed-build-prefix)
|
||||||
|
|
||||||
|
modules_install:
|
||||||
|
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modinst
|
||||||
|
$(call cmd,depmod)
|
||||||
|
|
||||||
|
else # CONFIG_MODULES
|
||||||
|
|
||||||
|
# Modules not configured
|
||||||
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
modules modules_install:
|
||||||
|
@echo >&2 '***'
|
||||||
|
@echo >&2 '*** The present kernel configuration has modules disabled.'
|
||||||
|
@echo >&2 '*** To use the module feature, please run "make menuconfig" etc.'
|
||||||
|
@echo >&2 '*** to enable CONFIG_MODULES.'
|
||||||
|
@echo >&2 '***'
|
||||||
|
@exit 1
|
||||||
|
|
||||||
|
KBUILD_MODULES :=
|
||||||
|
|
||||||
|
endif # CONFIG_MODULES
|
||||||
|
|
||||||
# Single targets
|
# Single targets
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
# To build individual files in subdirectories, you can do like this:
|
# To build individual files in subdirectories, you can do like this:
|
||||||
@ -1891,18 +1882,12 @@ $(single-ko): single_modpost
|
|||||||
$(single-no-ko): descend
|
$(single-no-ko): descend
|
||||||
@:
|
@:
|
||||||
|
|
||||||
ifeq ($(KBUILD_EXTMOD),)
|
# Remove MODORDER when done because it is not the real one.
|
||||||
# For the single build of in-tree modules, use a temporary file to avoid
|
|
||||||
# the situation of modules_install installing an invalid modules.order.
|
|
||||||
MODORDER := .modules.tmp
|
|
||||||
endif
|
|
||||||
|
|
||||||
PHONY += single_modpost
|
PHONY += single_modpost
|
||||||
single_modpost: $(single-no-ko) modules_prepare
|
single_modpost: $(single-no-ko) modules_prepare
|
||||||
$(Q){ $(foreach m, $(single-ko), echo $(extmod-prefix)$m;) } > $(MODORDER)
|
$(Q){ $(foreach m, $(single-ko), echo $(extmod-prefix)$m;) } > $(MODORDER)
|
||||||
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
|
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
|
||||||
|
$(Q)rm -f $(MODORDER)
|
||||||
KBUILD_MODULES := 1
|
|
||||||
|
|
||||||
export KBUILD_SINGLE_TARGETS := $(addprefix $(extmod-prefix), $(single-no-ko))
|
export KBUILD_SINGLE_TARGETS := $(addprefix $(extmod-prefix), $(single-no-ko))
|
||||||
|
|
||||||
@ -1912,10 +1897,6 @@ build-dirs := $(foreach d, $(build-dirs), \
|
|||||||
|
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ifndef CONFIG_MODULES
|
|
||||||
KBUILD_MODULES :=
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Handle descending into subdirectories listed in $(build-dirs)
|
# Handle descending into subdirectories listed in $(build-dirs)
|
||||||
# Preset locale variables to speed up the build process. Limit locale
|
# Preset locale variables to speed up the build process. Limit locale
|
||||||
# tweaks to this spot to avoid wrong language settings when running
|
# tweaks to this spot to avoid wrong language settings when running
|
||||||
@ -2057,11 +2038,6 @@ tools/%: FORCE
|
|||||||
quiet_cmd_rmfiles = $(if $(wildcard $(rm-files)),CLEAN $(wildcard $(rm-files)))
|
quiet_cmd_rmfiles = $(if $(wildcard $(rm-files)),CLEAN $(wildcard $(rm-files)))
|
||||||
cmd_rmfiles = rm -rf $(rm-files)
|
cmd_rmfiles = rm -rf $(rm-files)
|
||||||
|
|
||||||
# Run depmod only if we have System.map and depmod is executable
|
|
||||||
quiet_cmd_depmod = DEPMOD $(KERNELRELEASE)
|
|
||||||
cmd_depmod = $(CONFIG_SHELL) $(srctree)/scripts/depmod.sh $(DEPMOD) \
|
|
||||||
$(KERNELRELEASE) $(mixed-build-prefix)
|
|
||||||
|
|
||||||
# read saved command lines for existing targets
|
# read saved command lines for existing targets
|
||||||
existing-targets := $(wildcard $(sort $(targets)))
|
existing-targets := $(wildcard $(sort $(targets)))
|
||||||
|
|
||||||
|
@ -469,8 +469,10 @@ entSys:
|
|||||||
#ifdef CONFIG_AUDITSYSCALL
|
#ifdef CONFIG_AUDITSYSCALL
|
||||||
lda $6, _TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT
|
lda $6, _TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT
|
||||||
and $3, $6, $3
|
and $3, $6, $3
|
||||||
#endif
|
|
||||||
bne $3, strace
|
bne $3, strace
|
||||||
|
#else
|
||||||
|
blbs $3, strace /* check for SYSCALL_TRACE in disguise */
|
||||||
|
#endif
|
||||||
beq $4, 1f
|
beq $4, 1f
|
||||||
ldq $27, 0($5)
|
ldq $27, 0($5)
|
||||||
1: jsr $26, ($27), sys_ni_syscall
|
1: jsr $26, ($27), sys_ni_syscall
|
||||||
|
@ -74,7 +74,7 @@ pcie0: pcie@1,0 {
|
|||||||
|
|
||||||
pcie2: pcie@2,0 {
|
pcie2: pcie@2,0 {
|
||||||
device_type = "pci";
|
device_type = "pci";
|
||||||
assigned-addresses = <0x82002800 0 0x80000 0 0x2000>;
|
assigned-addresses = <0x82001000 0 0x80000 0 0x2000>;
|
||||||
reg = <0x1000 0 0 0 0>;
|
reg = <0x1000 0 0 0 0>;
|
||||||
#address-cells = <3>;
|
#address-cells = <3>;
|
||||||
#size-cells = <2>;
|
#size-cells = <2>;
|
||||||
|
@ -582,7 +582,7 @@ pcie0: pcie@1,0 {
|
|||||||
|
|
||||||
pcie1: pcie@2,0 {
|
pcie1: pcie@2,0 {
|
||||||
device_type = "pci";
|
device_type = "pci";
|
||||||
assigned-addresses = <0x82000800 0 0x44000 0 0x2000>;
|
assigned-addresses = <0x82001000 0 0x44000 0 0x2000>;
|
||||||
reg = <0x1000 0 0 0 0>;
|
reg = <0x1000 0 0 0 0>;
|
||||||
#address-cells = <3>;
|
#address-cells = <3>;
|
||||||
#size-cells = <2>;
|
#size-cells = <2>;
|
||||||
|
@ -79,7 +79,7 @@ pcie@1,0 {
|
|||||||
/* x1 port */
|
/* x1 port */
|
||||||
pcie@2,0 {
|
pcie@2,0 {
|
||||||
device_type = "pci";
|
device_type = "pci";
|
||||||
assigned-addresses = <0x82000800 0 0x40000 0 0x2000>;
|
assigned-addresses = <0x82001000 0 0x40000 0 0x2000>;
|
||||||
reg = <0x1000 0 0 0 0>;
|
reg = <0x1000 0 0 0 0>;
|
||||||
#address-cells = <3>;
|
#address-cells = <3>;
|
||||||
#size-cells = <2>;
|
#size-cells = <2>;
|
||||||
@ -98,7 +98,7 @@ pcie@2,0 {
|
|||||||
/* x1 port */
|
/* x1 port */
|
||||||
pcie@3,0 {
|
pcie@3,0 {
|
||||||
device_type = "pci";
|
device_type = "pci";
|
||||||
assigned-addresses = <0x82000800 0 0x44000 0 0x2000>;
|
assigned-addresses = <0x82001800 0 0x44000 0 0x2000>;
|
||||||
reg = <0x1800 0 0 0 0>;
|
reg = <0x1800 0 0 0 0>;
|
||||||
#address-cells = <3>;
|
#address-cells = <3>;
|
||||||
#size-cells = <2>;
|
#size-cells = <2>;
|
||||||
|
@ -22,6 +22,12 @@ chosen {
|
|||||||
stdout-path = &uart0;
|
stdout-path = &uart0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
aliases {
|
||||||
|
ethernet0 = ð0;
|
||||||
|
ethernet1 = ð1;
|
||||||
|
ethernet2 = ð2;
|
||||||
|
};
|
||||||
|
|
||||||
memory {
|
memory {
|
||||||
device_type = "memory";
|
device_type = "memory";
|
||||||
reg = <0x00000000 0x40000000>; /* 1024 MB */
|
reg = <0x00000000 0x40000000>; /* 1024 MB */
|
||||||
@ -291,7 +297,17 @@ fixed-link {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
/* port 6 is connected to eth0 */
|
ports@6 {
|
||||||
|
reg = <6>;
|
||||||
|
label = "cpu";
|
||||||
|
ethernet = <ð0>;
|
||||||
|
phy-mode = "rgmii-id";
|
||||||
|
|
||||||
|
fixed-link {
|
||||||
|
speed = <1000>;
|
||||||
|
full-duplex;
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -84,7 +84,7 @@ pcie1: pcie@1,0 {
|
|||||||
/* x1 port */
|
/* x1 port */
|
||||||
pcie2: pcie@2,0 {
|
pcie2: pcie@2,0 {
|
||||||
device_type = "pci";
|
device_type = "pci";
|
||||||
assigned-addresses = <0x82000800 0 0x40000 0 0x2000>;
|
assigned-addresses = <0x82001000 0 0x40000 0 0x2000>;
|
||||||
reg = <0x1000 0 0 0 0>;
|
reg = <0x1000 0 0 0 0>;
|
||||||
#address-cells = <3>;
|
#address-cells = <3>;
|
||||||
#size-cells = <2>;
|
#size-cells = <2>;
|
||||||
@ -103,7 +103,7 @@ pcie2: pcie@2,0 {
|
|||||||
/* x1 port */
|
/* x1 port */
|
||||||
pcie3: pcie@3,0 {
|
pcie3: pcie@3,0 {
|
||||||
device_type = "pci";
|
device_type = "pci";
|
||||||
assigned-addresses = <0x82000800 0 0x44000 0 0x2000>;
|
assigned-addresses = <0x82001800 0 0x44000 0 0x2000>;
|
||||||
reg = <0x1800 0 0 0 0>;
|
reg = <0x1800 0 0 0 0>;
|
||||||
#address-cells = <3>;
|
#address-cells = <3>;
|
||||||
#size-cells = <2>;
|
#size-cells = <2>;
|
||||||
@ -125,7 +125,7 @@ pcie3: pcie@3,0 {
|
|||||||
*/
|
*/
|
||||||
pcie4: pcie@4,0 {
|
pcie4: pcie@4,0 {
|
||||||
device_type = "pci";
|
device_type = "pci";
|
||||||
assigned-addresses = <0x82000800 0 0x48000 0 0x2000>;
|
assigned-addresses = <0x82002000 0 0x48000 0 0x2000>;
|
||||||
reg = <0x2000 0 0 0 0>;
|
reg = <0x2000 0 0 0 0>;
|
||||||
#address-cells = <3>;
|
#address-cells = <3>;
|
||||||
#size-cells = <2>;
|
#size-cells = <2>;
|
||||||
|
@ -453,7 +453,7 @@ pcie@1,0 {
|
|||||||
/* x1 port */
|
/* x1 port */
|
||||||
pcie@2,0 {
|
pcie@2,0 {
|
||||||
device_type = "pci";
|
device_type = "pci";
|
||||||
assigned-addresses = <0x82000800 0 0x40000 0 0x2000>;
|
assigned-addresses = <0x82001000 0 0x40000 0 0x2000>;
|
||||||
reg = <0x1000 0 0 0 0>;
|
reg = <0x1000 0 0 0 0>;
|
||||||
#address-cells = <3>;
|
#address-cells = <3>;
|
||||||
#size-cells = <2>;
|
#size-cells = <2>;
|
||||||
@ -472,7 +472,7 @@ pcie@2,0 {
|
|||||||
/* x1 port */
|
/* x1 port */
|
||||||
pcie@3,0 {
|
pcie@3,0 {
|
||||||
device_type = "pci";
|
device_type = "pci";
|
||||||
assigned-addresses = <0x82000800 0 0x44000 0 0x2000>;
|
assigned-addresses = <0x82001800 0 0x44000 0 0x2000>;
|
||||||
reg = <0x1800 0 0 0 0>;
|
reg = <0x1800 0 0 0 0>;
|
||||||
#address-cells = <3>;
|
#address-cells = <3>;
|
||||||
#size-cells = <2>;
|
#size-cells = <2>;
|
||||||
@ -494,7 +494,7 @@ pcie@3,0 {
|
|||||||
*/
|
*/
|
||||||
pcie@4,0 {
|
pcie@4,0 {
|
||||||
device_type = "pci";
|
device_type = "pci";
|
||||||
assigned-addresses = <0x82000800 0 0x48000 0 0x2000>;
|
assigned-addresses = <0x82002000 0 0x48000 0 0x2000>;
|
||||||
reg = <0x2000 0 0 0 0>;
|
reg = <0x2000 0 0 0 0>;
|
||||||
#address-cells = <3>;
|
#address-cells = <3>;
|
||||||
#size-cells = <2>;
|
#size-cells = <2>;
|
||||||
|
@ -97,7 +97,7 @@ pcie1: pcie@1,0 {
|
|||||||
|
|
||||||
pcie2: pcie@2,0 {
|
pcie2: pcie@2,0 {
|
||||||
device_type = "pci";
|
device_type = "pci";
|
||||||
assigned-addresses = <0x82000800 0 0x44000 0 0x2000>;
|
assigned-addresses = <0x82001000 0 0x44000 0 0x2000>;
|
||||||
reg = <0x1000 0 0 0 0>;
|
reg = <0x1000 0 0 0 0>;
|
||||||
#address-cells = <3>;
|
#address-cells = <3>;
|
||||||
#size-cells = <2>;
|
#size-cells = <2>;
|
||||||
@ -115,7 +115,7 @@ pcie2: pcie@2,0 {
|
|||||||
|
|
||||||
pcie3: pcie@3,0 {
|
pcie3: pcie@3,0 {
|
||||||
device_type = "pci";
|
device_type = "pci";
|
||||||
assigned-addresses = <0x82000800 0 0x48000 0 0x2000>;
|
assigned-addresses = <0x82001800 0 0x48000 0 0x2000>;
|
||||||
reg = <0x1800 0 0 0 0>;
|
reg = <0x1800 0 0 0 0>;
|
||||||
#address-cells = <3>;
|
#address-cells = <3>;
|
||||||
#size-cells = <2>;
|
#size-cells = <2>;
|
||||||
@ -133,7 +133,7 @@ pcie3: pcie@3,0 {
|
|||||||
|
|
||||||
pcie4: pcie@4,0 {
|
pcie4: pcie@4,0 {
|
||||||
device_type = "pci";
|
device_type = "pci";
|
||||||
assigned-addresses = <0x82000800 0 0x4c000 0 0x2000>;
|
assigned-addresses = <0x82002000 0 0x4c000 0 0x2000>;
|
||||||
reg = <0x2000 0 0 0 0>;
|
reg = <0x2000 0 0 0 0>;
|
||||||
#address-cells = <3>;
|
#address-cells = <3>;
|
||||||
#size-cells = <2>;
|
#size-cells = <2>;
|
||||||
@ -151,7 +151,7 @@ pcie4: pcie@4,0 {
|
|||||||
|
|
||||||
pcie5: pcie@5,0 {
|
pcie5: pcie@5,0 {
|
||||||
device_type = "pci";
|
device_type = "pci";
|
||||||
assigned-addresses = <0x82000800 0 0x80000 0 0x2000>;
|
assigned-addresses = <0x82002800 0 0x80000 0 0x2000>;
|
||||||
reg = <0x2800 0 0 0 0>;
|
reg = <0x2800 0 0 0 0>;
|
||||||
#address-cells = <3>;
|
#address-cells = <3>;
|
||||||
#size-cells = <2>;
|
#size-cells = <2>;
|
||||||
|
@ -112,7 +112,7 @@ pcie1: pcie@1,0 {
|
|||||||
|
|
||||||
pcie2: pcie@2,0 {
|
pcie2: pcie@2,0 {
|
||||||
device_type = "pci";
|
device_type = "pci";
|
||||||
assigned-addresses = <0x82000800 0 0x44000 0 0x2000>;
|
assigned-addresses = <0x82001000 0 0x44000 0 0x2000>;
|
||||||
reg = <0x1000 0 0 0 0>;
|
reg = <0x1000 0 0 0 0>;
|
||||||
#address-cells = <3>;
|
#address-cells = <3>;
|
||||||
#size-cells = <2>;
|
#size-cells = <2>;
|
||||||
@ -130,7 +130,7 @@ pcie2: pcie@2,0 {
|
|||||||
|
|
||||||
pcie3: pcie@3,0 {
|
pcie3: pcie@3,0 {
|
||||||
device_type = "pci";
|
device_type = "pci";
|
||||||
assigned-addresses = <0x82000800 0 0x48000 0 0x2000>;
|
assigned-addresses = <0x82001800 0 0x48000 0 0x2000>;
|
||||||
reg = <0x1800 0 0 0 0>;
|
reg = <0x1800 0 0 0 0>;
|
||||||
#address-cells = <3>;
|
#address-cells = <3>;
|
||||||
#size-cells = <2>;
|
#size-cells = <2>;
|
||||||
@ -148,7 +148,7 @@ pcie3: pcie@3,0 {
|
|||||||
|
|
||||||
pcie4: pcie@4,0 {
|
pcie4: pcie@4,0 {
|
||||||
device_type = "pci";
|
device_type = "pci";
|
||||||
assigned-addresses = <0x82000800 0 0x4c000 0 0x2000>;
|
assigned-addresses = <0x82002000 0 0x4c000 0 0x2000>;
|
||||||
reg = <0x2000 0 0 0 0>;
|
reg = <0x2000 0 0 0 0>;
|
||||||
#address-cells = <3>;
|
#address-cells = <3>;
|
||||||
#size-cells = <2>;
|
#size-cells = <2>;
|
||||||
@ -166,7 +166,7 @@ pcie4: pcie@4,0 {
|
|||||||
|
|
||||||
pcie5: pcie@5,0 {
|
pcie5: pcie@5,0 {
|
||||||
device_type = "pci";
|
device_type = "pci";
|
||||||
assigned-addresses = <0x82000800 0 0x80000 0 0x2000>;
|
assigned-addresses = <0x82002800 0 0x80000 0 0x2000>;
|
||||||
reg = <0x2800 0 0 0 0>;
|
reg = <0x2800 0 0 0 0>;
|
||||||
#address-cells = <3>;
|
#address-cells = <3>;
|
||||||
#size-cells = <2>;
|
#size-cells = <2>;
|
||||||
@ -184,7 +184,7 @@ pcie5: pcie@5,0 {
|
|||||||
|
|
||||||
pcie6: pcie@6,0 {
|
pcie6: pcie@6,0 {
|
||||||
device_type = "pci";
|
device_type = "pci";
|
||||||
assigned-addresses = <0x82000800 0 0x84000 0 0x2000>;
|
assigned-addresses = <0x82003000 0 0x84000 0 0x2000>;
|
||||||
reg = <0x3000 0 0 0 0>;
|
reg = <0x3000 0 0 0 0>;
|
||||||
#address-cells = <3>;
|
#address-cells = <3>;
|
||||||
#size-cells = <2>;
|
#size-cells = <2>;
|
||||||
@ -202,7 +202,7 @@ pcie6: pcie@6,0 {
|
|||||||
|
|
||||||
pcie7: pcie@7,0 {
|
pcie7: pcie@7,0 {
|
||||||
device_type = "pci";
|
device_type = "pci";
|
||||||
assigned-addresses = <0x82000800 0 0x88000 0 0x2000>;
|
assigned-addresses = <0x82003800 0 0x88000 0 0x2000>;
|
||||||
reg = <0x3800 0 0 0 0>;
|
reg = <0x3800 0 0 0 0>;
|
||||||
#address-cells = <3>;
|
#address-cells = <3>;
|
||||||
#size-cells = <2>;
|
#size-cells = <2>;
|
||||||
@ -220,7 +220,7 @@ pcie7: pcie@7,0 {
|
|||||||
|
|
||||||
pcie8: pcie@8,0 {
|
pcie8: pcie@8,0 {
|
||||||
device_type = "pci";
|
device_type = "pci";
|
||||||
assigned-addresses = <0x82000800 0 0x8c000 0 0x2000>;
|
assigned-addresses = <0x82004000 0 0x8c000 0 0x2000>;
|
||||||
reg = <0x4000 0 0 0 0>;
|
reg = <0x4000 0 0 0 0>;
|
||||||
#address-cells = <3>;
|
#address-cells = <3>;
|
||||||
#size-cells = <2>;
|
#size-cells = <2>;
|
||||||
@ -238,7 +238,7 @@ pcie8: pcie@8,0 {
|
|||||||
|
|
||||||
pcie9: pcie@9,0 {
|
pcie9: pcie@9,0 {
|
||||||
device_type = "pci";
|
device_type = "pci";
|
||||||
assigned-addresses = <0x82000800 0 0x42000 0 0x2000>;
|
assigned-addresses = <0x82004800 0 0x42000 0 0x2000>;
|
||||||
reg = <0x4800 0 0 0 0>;
|
reg = <0x4800 0 0 0 0>;
|
||||||
#address-cells = <3>;
|
#address-cells = <3>;
|
||||||
#size-cells = <2>;
|
#size-cells = <2>;
|
||||||
|
@ -129,7 +129,7 @@ pcie0: pcie@1 {
|
|||||||
pcie1: pcie@2 {
|
pcie1: pcie@2 {
|
||||||
device_type = "pci";
|
device_type = "pci";
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
assigned-addresses = <0x82002800 0 0x80000 0 0x2000>;
|
assigned-addresses = <0x82001000 0 0x80000 0 0x2000>;
|
||||||
reg = <0x1000 0 0 0 0>;
|
reg = <0x1000 0 0 0 0>;
|
||||||
clocks = <&gate_clk 5>;
|
clocks = <&gate_clk 5>;
|
||||||
marvell,pcie-port = <1>;
|
marvell,pcie-port = <1>;
|
||||||
|
@ -1571,7 +1571,7 @@ wifi {
|
|||||||
};
|
};
|
||||||
|
|
||||||
etb@1a01000 {
|
etb@1a01000 {
|
||||||
compatible = "coresight-etb10", "arm,primecell";
|
compatible = "arm,coresight-etb10", "arm,primecell";
|
||||||
reg = <0x1a01000 0x1000>;
|
reg = <0x1a01000 0x1000>;
|
||||||
|
|
||||||
clocks = <&rpmcc RPM_QDSS_CLK>;
|
clocks = <&rpmcc RPM_QDSS_CLK>;
|
||||||
|
@ -47,7 +47,7 @@ clcd: clcd@fc200000 {
|
|||||||
compatible = "arm,pl110", "arm,primecell";
|
compatible = "arm,pl110", "arm,primecell";
|
||||||
reg = <0xfc200000 0x1000>;
|
reg = <0xfc200000 0x1000>;
|
||||||
interrupt-parent = <&vic1>;
|
interrupt-parent = <&vic1>;
|
||||||
interrupts = <12>;
|
interrupts = <13>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -13,7 +13,6 @@
|
|||||||
/dts-v1/;
|
/dts-v1/;
|
||||||
|
|
||||||
#include "stm32mp157.dtsi"
|
#include "stm32mp157.dtsi"
|
||||||
#include "stm32mp15xc.dtsi"
|
|
||||||
#include "stm32mp15xx-dhcor-som.dtsi"
|
#include "stm32mp15xx-dhcor-som.dtsi"
|
||||||
#include "stm32mp15xx-dhcor-avenger96.dtsi"
|
#include "stm32mp15xx-dhcor-avenger96.dtsi"
|
||||||
|
|
||||||
|
@ -100,7 +100,7 @@ wlan_pwr: regulator-wlan {
|
|||||||
regulator-min-microvolt = <3300000>;
|
regulator-min-microvolt = <3300000>;
|
||||||
regulator-max-microvolt = <3300000>;
|
regulator-max-microvolt = <3300000>;
|
||||||
|
|
||||||
gpios = <&gpioz 3 GPIO_ACTIVE_HIGH>;
|
gpio = <&gpioz 3 GPIO_ACTIVE_HIGH>;
|
||||||
enable-active-high;
|
enable-active-high;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@ -133,15 +133,16 @@ extern int vfp_restore_user_hwstate(struct user_vfp *,
|
|||||||
#define TIF_NEED_RESCHED 1 /* rescheduling necessary */
|
#define TIF_NEED_RESCHED 1 /* rescheduling necessary */
|
||||||
#define TIF_NOTIFY_RESUME 2 /* callback before returning to user */
|
#define TIF_NOTIFY_RESUME 2 /* callback before returning to user */
|
||||||
#define TIF_UPROBE 3 /* breakpointed or singlestepping */
|
#define TIF_UPROBE 3 /* breakpointed or singlestepping */
|
||||||
#define TIF_SYSCALL_TRACE 4 /* syscall trace active */
|
#define TIF_NOTIFY_SIGNAL 4 /* signal notifications exist */
|
||||||
#define TIF_SYSCALL_AUDIT 5 /* syscall auditing active */
|
|
||||||
#define TIF_SYSCALL_TRACEPOINT 6 /* syscall tracepoint instrumentation */
|
|
||||||
#define TIF_SECCOMP 7 /* seccomp syscall filtering active */
|
|
||||||
#define TIF_NOTIFY_SIGNAL 8 /* signal notifications exist */
|
|
||||||
|
|
||||||
#define TIF_USING_IWMMXT 17
|
#define TIF_USING_IWMMXT 17
|
||||||
#define TIF_MEMDIE 18 /* is terminating due to OOM killer */
|
#define TIF_MEMDIE 18 /* is terminating due to OOM killer */
|
||||||
#define TIF_RESTORE_SIGMASK 20
|
#define TIF_RESTORE_SIGMASK 19
|
||||||
|
#define TIF_SYSCALL_TRACE 20 /* syscall trace active */
|
||||||
|
#define TIF_SYSCALL_AUDIT 21 /* syscall auditing active */
|
||||||
|
#define TIF_SYSCALL_TRACEPOINT 22 /* syscall tracepoint instrumentation */
|
||||||
|
#define TIF_SECCOMP 23 /* seccomp syscall filtering active */
|
||||||
|
|
||||||
|
|
||||||
#define _TIF_SIGPENDING (1 << TIF_SIGPENDING)
|
#define _TIF_SIGPENDING (1 << TIF_SIGPENDING)
|
||||||
#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED)
|
#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED)
|
||||||
|
@ -43,18 +43,21 @@
|
|||||||
static void __iomem *mmp_timer_base = TIMERS_VIRT_BASE;
|
static void __iomem *mmp_timer_base = TIMERS_VIRT_BASE;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FIXME: the timer needs some delay to stablize the counter capture
|
* Read the timer through the CVWR register. Delay is required after requesting
|
||||||
|
* a read. The CR register cannot be directly read due to metastability issues
|
||||||
|
* documented in the PXA168 software manual.
|
||||||
*/
|
*/
|
||||||
static inline uint32_t timer_read(void)
|
static inline uint32_t timer_read(void)
|
||||||
{
|
{
|
||||||
int delay = 100;
|
uint32_t val;
|
||||||
|
int delay = 3;
|
||||||
|
|
||||||
__raw_writel(1, mmp_timer_base + TMR_CVWR(1));
|
__raw_writel(1, mmp_timer_base + TMR_CVWR(1));
|
||||||
|
|
||||||
while (delay--)
|
while (delay--)
|
||||||
cpu_relax();
|
val = __raw_readl(mmp_timer_base + TMR_CVWR(1));
|
||||||
|
|
||||||
return __raw_readl(mmp_timer_base + TMR_CVWR(1));
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u64 notrace mmp_read_sched_clock(void)
|
static u64 notrace mmp_read_sched_clock(void)
|
||||||
|
@ -11,3 +11,9 @@ nwfpe-y += fpa11.o fpa11_cpdo.o fpa11_cpdt.o \
|
|||||||
entry.o
|
entry.o
|
||||||
|
|
||||||
nwfpe-$(CONFIG_FPE_NWFPE_XP) += extended_cpdo.o
|
nwfpe-$(CONFIG_FPE_NWFPE_XP) += extended_cpdo.o
|
||||||
|
|
||||||
|
# Try really hard to avoid generating calls to __aeabi_uldivmod() from
|
||||||
|
# float64_rem() due to loop elision.
|
||||||
|
ifdef CONFIG_CC_IS_CLANG
|
||||||
|
CFLAGS_softfloat.o += -mllvm -replexitval=never
|
||||||
|
endif
|
||||||
|
@ -124,9 +124,12 @@ &i2c0 {
|
|||||||
/delete-property/ mrvl,i2c-fast-mode;
|
/delete-property/ mrvl,i2c-fast-mode;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
|
/* MCP7940MT-I/MNY RTC */
|
||||||
rtc@6f {
|
rtc@6f {
|
||||||
compatible = "microchip,mcp7940x";
|
compatible = "microchip,mcp7940x";
|
||||||
reg = <0x6f>;
|
reg = <0x6f>;
|
||||||
|
interrupt-parent = <&gpiosb>;
|
||||||
|
interrupts = <5 0>; /* GPIO2_5 */
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -26,14 +26,14 @@ chosen {
|
|||||||
stdout-path = "serial0:921600n8";
|
stdout-path = "serial0:921600n8";
|
||||||
};
|
};
|
||||||
|
|
||||||
cpus_fixed_vproc0: fixedregulator@0 {
|
cpus_fixed_vproc0: regulator-vproc-buck0 {
|
||||||
compatible = "regulator-fixed";
|
compatible = "regulator-fixed";
|
||||||
regulator-name = "vproc_buck0";
|
regulator-name = "vproc_buck0";
|
||||||
regulator-min-microvolt = <1000000>;
|
regulator-min-microvolt = <1000000>;
|
||||||
regulator-max-microvolt = <1000000>;
|
regulator-max-microvolt = <1000000>;
|
||||||
};
|
};
|
||||||
|
|
||||||
cpus_fixed_vproc1: fixedregulator@1 {
|
cpus_fixed_vproc1: regulator-vproc-buck1 {
|
||||||
compatible = "regulator-fixed";
|
compatible = "regulator-fixed";
|
||||||
regulator-name = "vproc_buck1";
|
regulator-name = "vproc_buck1";
|
||||||
regulator-min-microvolt = <1000000>;
|
regulator-min-microvolt = <1000000>;
|
||||||
@ -50,7 +50,7 @@ extcon_usb1: extcon_iddig1 {
|
|||||||
id-gpio = <&pio 14 GPIO_ACTIVE_HIGH>;
|
id-gpio = <&pio 14 GPIO_ACTIVE_HIGH>;
|
||||||
};
|
};
|
||||||
|
|
||||||
usb_p0_vbus: regulator@2 {
|
usb_p0_vbus: regulator-usb-p0-vbus {
|
||||||
compatible = "regulator-fixed";
|
compatible = "regulator-fixed";
|
||||||
regulator-name = "p0_vbus";
|
regulator-name = "p0_vbus";
|
||||||
regulator-min-microvolt = <5000000>;
|
regulator-min-microvolt = <5000000>;
|
||||||
@ -59,7 +59,7 @@ usb_p0_vbus: regulator@2 {
|
|||||||
enable-active-high;
|
enable-active-high;
|
||||||
};
|
};
|
||||||
|
|
||||||
usb_p1_vbus: regulator@3 {
|
usb_p1_vbus: regulator-usb-p1-vbus {
|
||||||
compatible = "regulator-fixed";
|
compatible = "regulator-fixed";
|
||||||
regulator-name = "p1_vbus";
|
regulator-name = "p1_vbus";
|
||||||
regulator-min-microvolt = <5000000>;
|
regulator-min-microvolt = <5000000>;
|
||||||
@ -68,7 +68,7 @@ usb_p1_vbus: regulator@3 {
|
|||||||
enable-active-high;
|
enable-active-high;
|
||||||
};
|
};
|
||||||
|
|
||||||
usb_p2_vbus: regulator@4 {
|
usb_p2_vbus: regulator-usb-p2-vbus {
|
||||||
compatible = "regulator-fixed";
|
compatible = "regulator-fixed";
|
||||||
regulator-name = "p2_vbus";
|
regulator-name = "p2_vbus";
|
||||||
regulator-min-microvolt = <5000000>;
|
regulator-min-microvolt = <5000000>;
|
||||||
@ -77,7 +77,7 @@ usb_p2_vbus: regulator@4 {
|
|||||||
enable-active-high;
|
enable-active-high;
|
||||||
};
|
};
|
||||||
|
|
||||||
usb_p3_vbus: regulator@5 {
|
usb_p3_vbus: regulator-usb-p3-vbus {
|
||||||
compatible = "regulator-fixed";
|
compatible = "regulator-fixed";
|
||||||
regulator-name = "p3_vbus";
|
regulator-name = "p3_vbus";
|
||||||
regulator-min-microvolt = <5000000>;
|
regulator-min-microvolt = <5000000>;
|
||||||
|
@ -160,70 +160,70 @@ sys_clk: dummyclk {
|
|||||||
#clock-cells = <0>;
|
#clock-cells = <0>;
|
||||||
};
|
};
|
||||||
|
|
||||||
clk26m: oscillator@0 {
|
clk26m: oscillator-26m {
|
||||||
compatible = "fixed-clock";
|
compatible = "fixed-clock";
|
||||||
#clock-cells = <0>;
|
#clock-cells = <0>;
|
||||||
clock-frequency = <26000000>;
|
clock-frequency = <26000000>;
|
||||||
clock-output-names = "clk26m";
|
clock-output-names = "clk26m";
|
||||||
};
|
};
|
||||||
|
|
||||||
clk32k: oscillator@1 {
|
clk32k: oscillator-32k {
|
||||||
compatible = "fixed-clock";
|
compatible = "fixed-clock";
|
||||||
#clock-cells = <0>;
|
#clock-cells = <0>;
|
||||||
clock-frequency = <32768>;
|
clock-frequency = <32768>;
|
||||||
clock-output-names = "clk32k";
|
clock-output-names = "clk32k";
|
||||||
};
|
};
|
||||||
|
|
||||||
clkfpc: oscillator@2 {
|
clkfpc: oscillator-50m {
|
||||||
compatible = "fixed-clock";
|
compatible = "fixed-clock";
|
||||||
#clock-cells = <0>;
|
#clock-cells = <0>;
|
||||||
clock-frequency = <50000000>;
|
clock-frequency = <50000000>;
|
||||||
clock-output-names = "clkfpc";
|
clock-output-names = "clkfpc";
|
||||||
};
|
};
|
||||||
|
|
||||||
clkaud_ext_i_0: oscillator@3 {
|
clkaud_ext_i_0: oscillator-aud0 {
|
||||||
compatible = "fixed-clock";
|
compatible = "fixed-clock";
|
||||||
#clock-cells = <0>;
|
#clock-cells = <0>;
|
||||||
clock-frequency = <6500000>;
|
clock-frequency = <6500000>;
|
||||||
clock-output-names = "clkaud_ext_i_0";
|
clock-output-names = "clkaud_ext_i_0";
|
||||||
};
|
};
|
||||||
|
|
||||||
clkaud_ext_i_1: oscillator@4 {
|
clkaud_ext_i_1: oscillator-aud1 {
|
||||||
compatible = "fixed-clock";
|
compatible = "fixed-clock";
|
||||||
#clock-cells = <0>;
|
#clock-cells = <0>;
|
||||||
clock-frequency = <196608000>;
|
clock-frequency = <196608000>;
|
||||||
clock-output-names = "clkaud_ext_i_1";
|
clock-output-names = "clkaud_ext_i_1";
|
||||||
};
|
};
|
||||||
|
|
||||||
clkaud_ext_i_2: oscillator@5 {
|
clkaud_ext_i_2: oscillator-aud2 {
|
||||||
compatible = "fixed-clock";
|
compatible = "fixed-clock";
|
||||||
#clock-cells = <0>;
|
#clock-cells = <0>;
|
||||||
clock-frequency = <180633600>;
|
clock-frequency = <180633600>;
|
||||||
clock-output-names = "clkaud_ext_i_2";
|
clock-output-names = "clkaud_ext_i_2";
|
||||||
};
|
};
|
||||||
|
|
||||||
clki2si0_mck_i: oscillator@6 {
|
clki2si0_mck_i: oscillator-i2s0 {
|
||||||
compatible = "fixed-clock";
|
compatible = "fixed-clock";
|
||||||
#clock-cells = <0>;
|
#clock-cells = <0>;
|
||||||
clock-frequency = <30000000>;
|
clock-frequency = <30000000>;
|
||||||
clock-output-names = "clki2si0_mck_i";
|
clock-output-names = "clki2si0_mck_i";
|
||||||
};
|
};
|
||||||
|
|
||||||
clki2si1_mck_i: oscillator@7 {
|
clki2si1_mck_i: oscillator-i2s1 {
|
||||||
compatible = "fixed-clock";
|
compatible = "fixed-clock";
|
||||||
#clock-cells = <0>;
|
#clock-cells = <0>;
|
||||||
clock-frequency = <30000000>;
|
clock-frequency = <30000000>;
|
||||||
clock-output-names = "clki2si1_mck_i";
|
clock-output-names = "clki2si1_mck_i";
|
||||||
};
|
};
|
||||||
|
|
||||||
clki2si2_mck_i: oscillator@8 {
|
clki2si2_mck_i: oscillator-i2s2 {
|
||||||
compatible = "fixed-clock";
|
compatible = "fixed-clock";
|
||||||
#clock-cells = <0>;
|
#clock-cells = <0>;
|
||||||
clock-frequency = <30000000>;
|
clock-frequency = <30000000>;
|
||||||
clock-output-names = "clki2si2_mck_i";
|
clock-output-names = "clki2si2_mck_i";
|
||||||
};
|
};
|
||||||
|
|
||||||
clktdmin_mclk_i: oscillator@9 {
|
clktdmin_mclk_i: oscillator-mclk {
|
||||||
compatible = "fixed-clock";
|
compatible = "fixed-clock";
|
||||||
#clock-cells = <0>;
|
#clock-cells = <0>;
|
||||||
clock-frequency = <30000000>;
|
clock-frequency = <30000000>;
|
||||||
@ -266,7 +266,7 @@ syscfg_pctl_a: syscfg_pctl_a@10005000 {
|
|||||||
reg = <0 0x10005000 0 0x1000>;
|
reg = <0 0x10005000 0 0x1000>;
|
||||||
};
|
};
|
||||||
|
|
||||||
pio: pinctrl@10005000 {
|
pio: pinctrl@1000b000 {
|
||||||
compatible = "mediatek,mt2712-pinctrl";
|
compatible = "mediatek,mt2712-pinctrl";
|
||||||
reg = <0 0x1000b000 0 0x1000>;
|
reg = <0 0x1000b000 0 0x1000>;
|
||||||
mediatek,pctl-regmap = <&syscfg_pctl_a>;
|
mediatek,pctl-regmap = <&syscfg_pctl_a>;
|
||||||
|
@ -95,7 +95,7 @@ cpu9: cpu@201 {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
clk26m: oscillator@0 {
|
clk26m: oscillator-26m {
|
||||||
compatible = "fixed-clock";
|
compatible = "fixed-clock";
|
||||||
#clock-cells = <0>;
|
#clock-cells = <0>;
|
||||||
clock-frequency = <26000000>;
|
clock-frequency = <26000000>;
|
||||||
|
@ -17,7 +17,7 @@ chosen {
|
|||||||
};
|
};
|
||||||
|
|
||||||
firmware {
|
firmware {
|
||||||
optee: optee@4fd00000 {
|
optee: optee {
|
||||||
compatible = "linaro,optee-tz";
|
compatible = "linaro,optee-tz";
|
||||||
method = "smc";
|
method = "smc";
|
||||||
};
|
};
|
||||||
@ -209,7 +209,7 @@ pins_cmd_dat {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
i2c0_pins_a: i2c0@0 {
|
i2c0_pins_a: i2c0 {
|
||||||
pins1 {
|
pins1 {
|
||||||
pinmux = <MT8516_PIN_58_SDA0__FUNC_SDA0_0>,
|
pinmux = <MT8516_PIN_58_SDA0__FUNC_SDA0_0>,
|
||||||
<MT8516_PIN_59_SCL0__FUNC_SCL0_0>;
|
<MT8516_PIN_59_SCL0__FUNC_SCL0_0>;
|
||||||
@ -217,7 +217,7 @@ pins1 {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
i2c2_pins_a: i2c2@0 {
|
i2c2_pins_a: i2c2 {
|
||||||
pins1 {
|
pins1 {
|
||||||
pinmux = <MT8516_PIN_60_SDA2__FUNC_SDA2_0>,
|
pinmux = <MT8516_PIN_60_SDA2__FUNC_SDA2_0>,
|
||||||
<MT8516_PIN_61_SCL2__FUNC_SCL2_0>;
|
<MT8516_PIN_61_SCL2__FUNC_SCL2_0>;
|
||||||
|
@ -37,6 +37,8 @@ &i2c_1 {
|
|||||||
|
|
||||||
&spi_0 {
|
&spi_0 {
|
||||||
cs-select = <0>;
|
cs-select = <0>;
|
||||||
|
pinctrl-0 = <&spi_0_pins>;
|
||||||
|
pinctrl-names = "default";
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
m25p80@0 {
|
m25p80@0 {
|
||||||
|
@ -1249,7 +1249,7 @@ spmi_bus: spmi@200f000 {
|
|||||||
};
|
};
|
||||||
|
|
||||||
mpss: remoteproc@4080000 {
|
mpss: remoteproc@4080000 {
|
||||||
compatible = "qcom,msm8916-mss-pil", "qcom,q6v5-pil";
|
compatible = "qcom,msm8916-mss-pil";
|
||||||
reg = <0x04080000 0x100>,
|
reg = <0x04080000 0x100>,
|
||||||
<0x04020000 0x040>;
|
<0x04020000 0x040>;
|
||||||
|
|
||||||
|
@ -651,17 +651,17 @@ gpu_opp_table: opp-table {
|
|||||||
compatible ="operating-points-v2";
|
compatible ="operating-points-v2";
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 624Mhz and 560Mhz are only available on speed
|
* 624Mhz is only available on speed bins 0 and 3.
|
||||||
* bin (1 << 0). All the rest are available on
|
* 560Mhz is only available on speed bins 0, 2 and 3.
|
||||||
* all bins of the hardware
|
* All the rest are available on all bins of the hardware.
|
||||||
*/
|
*/
|
||||||
opp-624000000 {
|
opp-624000000 {
|
||||||
opp-hz = /bits/ 64 <624000000>;
|
opp-hz = /bits/ 64 <624000000>;
|
||||||
opp-supported-hw = <0x01>;
|
opp-supported-hw = <0x09>;
|
||||||
};
|
};
|
||||||
opp-560000000 {
|
opp-560000000 {
|
||||||
opp-hz = /bits/ 64 <560000000>;
|
opp-hz = /bits/ 64 <560000000>;
|
||||||
opp-supported-hw = <0x01>;
|
opp-supported-hw = <0x0d>;
|
||||||
};
|
};
|
||||||
opp-510000000 {
|
opp-510000000 {
|
||||||
opp-hz = /bits/ 64 <510000000>;
|
opp-hz = /bits/ 64 <510000000>;
|
||||||
|
@ -593,7 +593,7 @@ rx-cts-rts {
|
|||||||
pins = "gpio17", "gpio18", "gpio19";
|
pins = "gpio17", "gpio18", "gpio19";
|
||||||
function = "gpio";
|
function = "gpio";
|
||||||
drive-strength = <2>;
|
drive-strength = <2>;
|
||||||
bias-no-pull;
|
bias-disable;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1292,7 +1292,7 @@ ap_suspend_l_assert: ap_suspend_l_assert {
|
|||||||
config {
|
config {
|
||||||
pins = "gpio126";
|
pins = "gpio126";
|
||||||
function = "gpio";
|
function = "gpio";
|
||||||
bias-no-pull;
|
bias-disable;
|
||||||
drive-strength = <2>;
|
drive-strength = <2>;
|
||||||
output-low;
|
output-low;
|
||||||
};
|
};
|
||||||
@ -1302,7 +1302,7 @@ ap_suspend_l_deassert: ap_suspend_l_deassert {
|
|||||||
config {
|
config {
|
||||||
pins = "gpio126";
|
pins = "gpio126";
|
||||||
function = "gpio";
|
function = "gpio";
|
||||||
bias-no-pull;
|
bias-disable;
|
||||||
drive-strength = <2>;
|
drive-strength = <2>;
|
||||||
output-high;
|
output-high;
|
||||||
};
|
};
|
||||||
|
@ -1045,7 +1045,10 @@ &wifi {
|
|||||||
|
|
||||||
/* PINCTRL - additions to nodes defined in sdm845.dtsi */
|
/* PINCTRL - additions to nodes defined in sdm845.dtsi */
|
||||||
&qup_spi2_default {
|
&qup_spi2_default {
|
||||||
drive-strength = <16>;
|
pinconf {
|
||||||
|
pins = "gpio27", "gpio28", "gpio29", "gpio30";
|
||||||
|
drive-strength = <16>;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
&qup_uart3_default{
|
&qup_uart3_default{
|
||||||
|
@ -322,8 +322,10 @@ &mss_pil {
|
|||||||
};
|
};
|
||||||
|
|
||||||
&qup_i2c12_default {
|
&qup_i2c12_default {
|
||||||
drive-strength = <2>;
|
pinmux {
|
||||||
bias-disable;
|
drive-strength = <2>;
|
||||||
|
bias-disable;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
&qup_uart6_default {
|
&qup_uart6_default {
|
||||||
|
@ -127,7 +127,6 @@ crypto: crypto@4e00000 {
|
|||||||
dmas = <&main_udmap 0xc000>, <&main_udmap 0x4000>,
|
dmas = <&main_udmap 0xc000>, <&main_udmap 0x4000>,
|
||||||
<&main_udmap 0x4001>;
|
<&main_udmap 0x4001>;
|
||||||
dma-names = "tx", "rx1", "rx2";
|
dma-names = "tx", "rx1", "rx2";
|
||||||
dma-coherent;
|
|
||||||
|
|
||||||
rng: rng@4e10000 {
|
rng: rng@4e10000 {
|
||||||
compatible = "inside-secure,safexcel-eip76";
|
compatible = "inside-secure,safexcel-eip76";
|
||||||
|
@ -367,7 +367,6 @@ main_crypto: crypto@4e00000 {
|
|||||||
dmas = <&main_udmap 0xc000>, <&main_udmap 0x4000>,
|
dmas = <&main_udmap 0xc000>, <&main_udmap 0x4000>,
|
||||||
<&main_udmap 0x4001>;
|
<&main_udmap 0x4001>;
|
||||||
dma-names = "tx", "rx1", "rx2";
|
dma-names = "tx", "rx1", "rx2";
|
||||||
dma-coherent;
|
|
||||||
|
|
||||||
rng: rng@4e10000 {
|
rng: rng@4e10000 {
|
||||||
compatible = "inside-secure,safexcel-eip76";
|
compatible = "inside-secure,safexcel-eip76";
|
||||||
|
@ -243,13 +243,13 @@ static inline void compat_start_thread(struct pt_regs *regs, unsigned long pc,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static inline bool is_ttbr0_addr(unsigned long addr)
|
static __always_inline bool is_ttbr0_addr(unsigned long addr)
|
||||||
{
|
{
|
||||||
/* entry assembly clears tags for TTBR0 addrs */
|
/* entry assembly clears tags for TTBR0 addrs */
|
||||||
return addr < TASK_SIZE;
|
return addr < TASK_SIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool is_ttbr1_addr(unsigned long addr)
|
static __always_inline bool is_ttbr1_addr(unsigned long addr)
|
||||||
{
|
{
|
||||||
/* TTBR1 addresses may have a tag if KASAN_SW_TAGS is in use */
|
/* TTBR1 addresses may have a tag if KASAN_SW_TAGS is in use */
|
||||||
return arch_kasan_reset_tag(addr) >= PAGE_OFFSET;
|
return arch_kasan_reset_tag(addr) >= PAGE_OFFSET;
|
||||||
|
@ -361,6 +361,8 @@ static struct clk clk_periph = {
|
|||||||
*/
|
*/
|
||||||
int clk_enable(struct clk *clk)
|
int clk_enable(struct clk *clk)
|
||||||
{
|
{
|
||||||
|
if (!clk)
|
||||||
|
return 0;
|
||||||
mutex_lock(&clocks_mutex);
|
mutex_lock(&clocks_mutex);
|
||||||
clk_enable_unlocked(clk);
|
clk_enable_unlocked(clk);
|
||||||
mutex_unlock(&clocks_mutex);
|
mutex_unlock(&clocks_mutex);
|
||||||
|
@ -211,7 +211,7 @@ union cvmx_helper_link_info __cvmx_helper_board_link_get(int ipd_port)
|
|||||||
{
|
{
|
||||||
union cvmx_helper_link_info result;
|
union cvmx_helper_link_info result;
|
||||||
|
|
||||||
WARN(!octeon_is_simulation(),
|
WARN_ONCE(!octeon_is_simulation(),
|
||||||
"Using deprecated link status - please update your DT");
|
"Using deprecated link status - please update your DT");
|
||||||
|
|
||||||
/* Unless we fix it later, all links are defaulted to down */
|
/* Unless we fix it later, all links are defaulted to down */
|
||||||
|
@ -1100,7 +1100,7 @@ union cvmx_helper_link_info cvmx_helper_link_get(int ipd_port)
|
|||||||
if (index == 0)
|
if (index == 0)
|
||||||
result = __cvmx_helper_rgmii_link_get(ipd_port);
|
result = __cvmx_helper_rgmii_link_get(ipd_port);
|
||||||
else {
|
else {
|
||||||
WARN(1, "Using deprecated link status - please update your DT");
|
WARN_ONCE(1, "Using deprecated link status - please update your DT");
|
||||||
result.s.full_duplex = 1;
|
result.s.full_duplex = 1;
|
||||||
result.s.link_up = 1;
|
result.s.link_up = 1;
|
||||||
result.s.speed = 1000;
|
result.s.speed = 1000;
|
||||||
|
@ -75,7 +75,6 @@ ATTRIBUTE_GROUPS(vpe);
|
|||||||
|
|
||||||
static void vpe_device_release(struct device *cd)
|
static void vpe_device_release(struct device *cd)
|
||||||
{
|
{
|
||||||
kfree(cd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct class vpe_class = {
|
static struct class vpe_class = {
|
||||||
@ -157,6 +156,7 @@ int __init vpe_module_init(void)
|
|||||||
device_del(&vpe_device);
|
device_del(&vpe_device);
|
||||||
|
|
||||||
out_class:
|
out_class:
|
||||||
|
put_device(&vpe_device);
|
||||||
class_unregister(&vpe_class);
|
class_unregister(&vpe_class);
|
||||||
|
|
||||||
out_chrdev:
|
out_chrdev:
|
||||||
@ -169,7 +169,7 @@ void __exit vpe_module_exit(void)
|
|||||||
{
|
{
|
||||||
struct vpe *v, *n;
|
struct vpe *v, *n;
|
||||||
|
|
||||||
device_del(&vpe_device);
|
device_unregister(&vpe_device);
|
||||||
class_unregister(&vpe_class);
|
class_unregister(&vpe_class);
|
||||||
unregister_chrdev(major, VPE_MODULE_NAME);
|
unregister_chrdev(major, VPE_MODULE_NAME);
|
||||||
|
|
||||||
|
@ -313,7 +313,6 @@ ATTRIBUTE_GROUPS(vpe);
|
|||||||
|
|
||||||
static void vpe_device_release(struct device *cd)
|
static void vpe_device_release(struct device *cd)
|
||||||
{
|
{
|
||||||
kfree(cd);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct class vpe_class = {
|
static struct class vpe_class = {
|
||||||
@ -497,6 +496,7 @@ int __init vpe_module_init(void)
|
|||||||
device_del(&vpe_device);
|
device_del(&vpe_device);
|
||||||
|
|
||||||
out_class:
|
out_class:
|
||||||
|
put_device(&vpe_device);
|
||||||
class_unregister(&vpe_class);
|
class_unregister(&vpe_class);
|
||||||
|
|
||||||
out_chrdev:
|
out_chrdev:
|
||||||
@ -509,7 +509,7 @@ void __exit vpe_module_exit(void)
|
|||||||
{
|
{
|
||||||
struct vpe *v, *n;
|
struct vpe *v, *n;
|
||||||
|
|
||||||
device_del(&vpe_device);
|
device_unregister(&vpe_device);
|
||||||
class_unregister(&vpe_class);
|
class_unregister(&vpe_class);
|
||||||
unregister_chrdev(major, VPE_MODULE_NAME);
|
unregister_chrdev(major, VPE_MODULE_NAME);
|
||||||
|
|
||||||
|
@ -49,28 +49,27 @@
|
|||||||
#define MADV_DONTFORK 10 /* don't inherit across fork */
|
#define MADV_DONTFORK 10 /* don't inherit across fork */
|
||||||
#define MADV_DOFORK 11 /* do inherit across fork */
|
#define MADV_DOFORK 11 /* do inherit across fork */
|
||||||
|
|
||||||
|
#define MADV_MERGEABLE 12 /* KSM may merge identical pages */
|
||||||
|
#define MADV_UNMERGEABLE 13 /* KSM may not merge identical pages */
|
||||||
|
|
||||||
|
#define MADV_HUGEPAGE 14 /* Worth backing with hugepages */
|
||||||
|
#define MADV_NOHUGEPAGE 15 /* Not worth backing with hugepages */
|
||||||
|
|
||||||
|
#define MADV_DONTDUMP 16 /* Explicity exclude from the core dump,
|
||||||
|
overrides the coredump filter bits */
|
||||||
|
#define MADV_DODUMP 17 /* Clear the MADV_NODUMP flag */
|
||||||
|
|
||||||
|
#define MADV_WIPEONFORK 18 /* Zero memory on fork, child only */
|
||||||
|
#define MADV_KEEPONFORK 19 /* Undo MADV_WIPEONFORK */
|
||||||
|
|
||||||
#define MADV_COLD 20 /* deactivate these pages */
|
#define MADV_COLD 20 /* deactivate these pages */
|
||||||
#define MADV_PAGEOUT 21 /* reclaim these pages */
|
#define MADV_PAGEOUT 21 /* reclaim these pages */
|
||||||
|
|
||||||
#define MADV_MERGEABLE 65 /* KSM may merge identical pages */
|
|
||||||
#define MADV_UNMERGEABLE 66 /* KSM may not merge identical pages */
|
|
||||||
|
|
||||||
#define MADV_HUGEPAGE 67 /* Worth backing with hugepages */
|
|
||||||
#define MADV_NOHUGEPAGE 68 /* Not worth backing with hugepages */
|
|
||||||
|
|
||||||
#define MADV_DONTDUMP 69 /* Explicity exclude from the core dump,
|
|
||||||
overrides the coredump filter bits */
|
|
||||||
#define MADV_DODUMP 70 /* Clear the MADV_NODUMP flag */
|
|
||||||
|
|
||||||
#define MADV_WIPEONFORK 71 /* Zero memory on fork, child only */
|
|
||||||
#define MADV_KEEPONFORK 72 /* Undo MADV_WIPEONFORK */
|
|
||||||
|
|
||||||
#define MADV_HWPOISON 100 /* poison a page for testing */
|
#define MADV_HWPOISON 100 /* poison a page for testing */
|
||||||
#define MADV_SOFT_OFFLINE 101 /* soft offline page for testing */
|
#define MADV_SOFT_OFFLINE 101 /* soft offline page for testing */
|
||||||
|
|
||||||
/* compatibility flags */
|
/* compatibility flags */
|
||||||
#define MAP_FILE 0
|
#define MAP_FILE 0
|
||||||
#define MAP_VARIABLE 0
|
|
||||||
|
|
||||||
#define PKEY_DISABLE_ACCESS 0x1
|
#define PKEY_DISABLE_ACCESS 0x1
|
||||||
#define PKEY_DISABLE_WRITE 0x2
|
#define PKEY_DISABLE_WRITE 0x2
|
||||||
|
@ -444,3 +444,30 @@ asmlinkage long parisc_inotify_init1(int flags)
|
|||||||
flags = FIX_O_NONBLOCK(flags);
|
flags = FIX_O_NONBLOCK(flags);
|
||||||
return sys_inotify_init1(flags);
|
return sys_inotify_init1(flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* madvise() wrapper
|
||||||
|
*
|
||||||
|
* Up to kernel v6.1 parisc has different values than all other
|
||||||
|
* platforms for the MADV_xxx flags listed below.
|
||||||
|
* To keep binary compatibility with existing userspace programs
|
||||||
|
* translate the former values to the new values.
|
||||||
|
*
|
||||||
|
* XXX: Remove this wrapper in year 2025 (or later)
|
||||||
|
*/
|
||||||
|
|
||||||
|
asmlinkage notrace long parisc_madvise(unsigned long start, size_t len_in, int behavior)
|
||||||
|
{
|
||||||
|
switch (behavior) {
|
||||||
|
case 65: behavior = MADV_MERGEABLE; break;
|
||||||
|
case 66: behavior = MADV_UNMERGEABLE; break;
|
||||||
|
case 67: behavior = MADV_HUGEPAGE; break;
|
||||||
|
case 68: behavior = MADV_NOHUGEPAGE; break;
|
||||||
|
case 69: behavior = MADV_DONTDUMP; break;
|
||||||
|
case 70: behavior = MADV_DODUMP; break;
|
||||||
|
case 71: behavior = MADV_WIPEONFORK; break;
|
||||||
|
case 72: behavior = MADV_KEEPONFORK; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return sys_madvise(start, len_in, behavior);
|
||||||
|
}
|
||||||
|
@ -131,7 +131,7 @@
|
|||||||
116 common sysinfo sys_sysinfo compat_sys_sysinfo
|
116 common sysinfo sys_sysinfo compat_sys_sysinfo
|
||||||
117 common shutdown sys_shutdown
|
117 common shutdown sys_shutdown
|
||||||
118 common fsync sys_fsync
|
118 common fsync sys_fsync
|
||||||
119 common madvise sys_madvise
|
119 common madvise parisc_madvise
|
||||||
120 common clone sys_clone_wrapper
|
120 common clone sys_clone_wrapper
|
||||||
121 common setdomainname sys_setdomainname
|
121 common setdomainname sys_setdomainname
|
||||||
122 common sendfile sys_sendfile compat_sys_sendfile
|
122 common sendfile sys_sendfile compat_sys_sendfile
|
||||||
|
@ -715,6 +715,7 @@ void __noreturn rtas_halt(void)
|
|||||||
|
|
||||||
/* Must be in the RMO region, so we place it here */
|
/* Must be in the RMO region, so we place it here */
|
||||||
static char rtas_os_term_buf[2048];
|
static char rtas_os_term_buf[2048];
|
||||||
|
static s32 ibm_os_term_token = RTAS_UNKNOWN_SERVICE;
|
||||||
|
|
||||||
void rtas_os_term(char *str)
|
void rtas_os_term(char *str)
|
||||||
{
|
{
|
||||||
@ -726,16 +727,20 @@ void rtas_os_term(char *str)
|
|||||||
* this property may terminate the partition which we want to avoid
|
* this property may terminate the partition which we want to avoid
|
||||||
* since it interferes with panic_timeout.
|
* since it interferes with panic_timeout.
|
||||||
*/
|
*/
|
||||||
if (RTAS_UNKNOWN_SERVICE == rtas_token("ibm,os-term") ||
|
if (ibm_os_term_token == RTAS_UNKNOWN_SERVICE)
|
||||||
RTAS_UNKNOWN_SERVICE == rtas_token("ibm,extended-os-term"))
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
snprintf(rtas_os_term_buf, 2048, "OS panic: %s", str);
|
snprintf(rtas_os_term_buf, 2048, "OS panic: %s", str);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Keep calling as long as RTAS returns a "try again" status,
|
||||||
|
* but don't use rtas_busy_delay(), which potentially
|
||||||
|
* schedules.
|
||||||
|
*/
|
||||||
do {
|
do {
|
||||||
status = rtas_call(rtas_token("ibm,os-term"), 1, 1, NULL,
|
status = rtas_call(ibm_os_term_token, 1, 1, NULL,
|
||||||
__pa(rtas_os_term_buf));
|
__pa(rtas_os_term_buf));
|
||||||
} while (rtas_busy_delay(status));
|
} while (rtas_busy_delay_time(status));
|
||||||
|
|
||||||
if (status != 0)
|
if (status != 0)
|
||||||
printk(KERN_EMERG "ibm,os-term call failed %d\n", status);
|
printk(KERN_EMERG "ibm,os-term call failed %d\n", status);
|
||||||
@ -1267,6 +1272,13 @@ void __init rtas_initialize(void)
|
|||||||
no_entry = of_property_read_u32(rtas.dev, "linux,rtas-entry", &entry);
|
no_entry = of_property_read_u32(rtas.dev, "linux,rtas-entry", &entry);
|
||||||
rtas.entry = no_entry ? rtas.base : entry;
|
rtas.entry = no_entry ? rtas.base : entry;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Discover these now to avoid device tree lookups in the
|
||||||
|
* panic path.
|
||||||
|
*/
|
||||||
|
if (of_property_read_bool(rtas.dev, "ibm,extended-os-term"))
|
||||||
|
ibm_os_term_token = rtas_token("ibm,os-term");
|
||||||
|
|
||||||
/* If RTAS was found, allocate the RMO buffer for it and look for
|
/* If RTAS was found, allocate the RMO buffer for it and look for
|
||||||
* the stop-self token if any
|
* the stop-self token if any
|
||||||
*/
|
*/
|
||||||
|
@ -61,6 +61,7 @@ perf_callchain_kernel(struct perf_callchain_entry_ctx *entry, struct pt_regs *re
|
|||||||
next_sp = fp[0];
|
next_sp = fp[0];
|
||||||
|
|
||||||
if (next_sp == sp + STACK_INT_FRAME_SIZE &&
|
if (next_sp == sp + STACK_INT_FRAME_SIZE &&
|
||||||
|
validate_sp(sp, current, STACK_INT_FRAME_SIZE) &&
|
||||||
fp[STACK_FRAME_MARKER] == STACK_FRAME_REGS_MARKER) {
|
fp[STACK_FRAME_MARKER] == STACK_FRAME_REGS_MARKER) {
|
||||||
/*
|
/*
|
||||||
* This looks like an interrupt frame for an
|
* This looks like an interrupt frame for an
|
||||||
|
@ -79,6 +79,7 @@ REQUEST(__field(0, 8, partition_id)
|
|||||||
)
|
)
|
||||||
#include I(REQUEST_END)
|
#include I(REQUEST_END)
|
||||||
|
|
||||||
|
#ifdef ENABLE_EVENTS_COUNTERINFO_V6
|
||||||
/*
|
/*
|
||||||
* Not available for counter_info_version >= 0x8, use
|
* Not available for counter_info_version >= 0x8, use
|
||||||
* run_instruction_cycles_by_partition(0x100) instead.
|
* run_instruction_cycles_by_partition(0x100) instead.
|
||||||
@ -92,6 +93,7 @@ REQUEST(__field(0, 8, partition_id)
|
|||||||
__count(0x10, 8, cycles)
|
__count(0x10, 8, cycles)
|
||||||
)
|
)
|
||||||
#include I(REQUEST_END)
|
#include I(REQUEST_END)
|
||||||
|
#endif
|
||||||
|
|
||||||
#define REQUEST_NAME system_performance_capabilities
|
#define REQUEST_NAME system_performance_capabilities
|
||||||
#define REQUEST_NUM 0x40
|
#define REQUEST_NUM 0x40
|
||||||
@ -103,6 +105,7 @@ REQUEST(__field(0, 1, perf_collect_privileged)
|
|||||||
)
|
)
|
||||||
#include I(REQUEST_END)
|
#include I(REQUEST_END)
|
||||||
|
|
||||||
|
#ifdef ENABLE_EVENTS_COUNTERINFO_V6
|
||||||
#define REQUEST_NAME processor_bus_utilization_abc_links
|
#define REQUEST_NAME processor_bus_utilization_abc_links
|
||||||
#define REQUEST_NUM 0x50
|
#define REQUEST_NUM 0x50
|
||||||
#define REQUEST_IDX_KIND "hw_chip_id=?"
|
#define REQUEST_IDX_KIND "hw_chip_id=?"
|
||||||
@ -194,6 +197,7 @@ REQUEST(__field(0, 4, phys_processor_idx)
|
|||||||
__count(0x28, 8, instructions_completed)
|
__count(0x28, 8, instructions_completed)
|
||||||
)
|
)
|
||||||
#include I(REQUEST_END)
|
#include I(REQUEST_END)
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Processor_core_power_mode (0x95) skipped, no counters */
|
/* Processor_core_power_mode (0x95) skipped, no counters */
|
||||||
/* Affinity_domain_information_by_virtual_processor (0xA0) skipped,
|
/* Affinity_domain_information_by_virtual_processor (0xA0) skipped,
|
||||||
|
@ -72,7 +72,7 @@ static struct attribute_group format_group = {
|
|||||||
|
|
||||||
static struct attribute_group event_group = {
|
static struct attribute_group event_group = {
|
||||||
.name = "events",
|
.name = "events",
|
||||||
.attrs = hv_gpci_event_attrs,
|
/* .attrs is set in init */
|
||||||
};
|
};
|
||||||
|
|
||||||
#define HV_CAPS_ATTR(_name, _format) \
|
#define HV_CAPS_ATTR(_name, _format) \
|
||||||
@ -330,6 +330,7 @@ static int hv_gpci_init(void)
|
|||||||
int r;
|
int r;
|
||||||
unsigned long hret;
|
unsigned long hret;
|
||||||
struct hv_perf_caps caps;
|
struct hv_perf_caps caps;
|
||||||
|
struct hv_gpci_request_buffer *arg;
|
||||||
|
|
||||||
hv_gpci_assert_offsets_correct();
|
hv_gpci_assert_offsets_correct();
|
||||||
|
|
||||||
@ -353,6 +354,36 @@ static int hv_gpci_init(void)
|
|||||||
/* sampling not supported */
|
/* sampling not supported */
|
||||||
h_gpci_pmu.capabilities |= PERF_PMU_CAP_NO_INTERRUPT;
|
h_gpci_pmu.capabilities |= PERF_PMU_CAP_NO_INTERRUPT;
|
||||||
|
|
||||||
|
arg = (void *)get_cpu_var(hv_gpci_reqb);
|
||||||
|
memset(arg, 0, HGPCI_REQ_BUFFER_SIZE);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* hcall H_GET_PERF_COUNTER_INFO populates the output
|
||||||
|
* counter_info_version value based on the system hypervisor.
|
||||||
|
* Pass the counter request 0x10 corresponds to request type
|
||||||
|
* 'Dispatch_timebase_by_processor', to get the supported
|
||||||
|
* counter_info_version.
|
||||||
|
*/
|
||||||
|
arg->params.counter_request = cpu_to_be32(0x10);
|
||||||
|
|
||||||
|
r = plpar_hcall_norets(H_GET_PERF_COUNTER_INFO,
|
||||||
|
virt_to_phys(arg), HGPCI_REQ_BUFFER_SIZE);
|
||||||
|
if (r) {
|
||||||
|
pr_devel("hcall failed, can't get supported counter_info_version: 0x%x\n", r);
|
||||||
|
arg->params.counter_info_version_out = 0x8;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Use counter_info_version_out value to assign
|
||||||
|
* required hv-gpci event list.
|
||||||
|
*/
|
||||||
|
if (arg->params.counter_info_version_out >= 0x8)
|
||||||
|
event_group.attrs = hv_gpci_event_attrs;
|
||||||
|
else
|
||||||
|
event_group.attrs = hv_gpci_event_attrs_v6;
|
||||||
|
|
||||||
|
put_cpu_var(hv_gpci_reqb);
|
||||||
|
|
||||||
r = perf_pmu_register(&h_gpci_pmu, h_gpci_pmu.name, -1);
|
r = perf_pmu_register(&h_gpci_pmu, h_gpci_pmu.name, -1);
|
||||||
if (r)
|
if (r)
|
||||||
return r;
|
return r;
|
||||||
|
@ -26,6 +26,7 @@ enum {
|
|||||||
#define REQUEST_FILE "../hv-gpci-requests.h"
|
#define REQUEST_FILE "../hv-gpci-requests.h"
|
||||||
#define NAME_LOWER hv_gpci
|
#define NAME_LOWER hv_gpci
|
||||||
#define NAME_UPPER HV_GPCI
|
#define NAME_UPPER HV_GPCI
|
||||||
|
#define ENABLE_EVENTS_COUNTERINFO_V6
|
||||||
#include "req-gen/perf.h"
|
#include "req-gen/perf.h"
|
||||||
#undef REQUEST_FILE
|
#undef REQUEST_FILE
|
||||||
#undef NAME_LOWER
|
#undef NAME_LOWER
|
||||||
|
@ -139,6 +139,26 @@ PMU_EVENT_ATTR_STRING( \
|
|||||||
#define REQUEST_(r_name, r_value, r_idx_1, r_fields) \
|
#define REQUEST_(r_name, r_value, r_idx_1, r_fields) \
|
||||||
r_fields
|
r_fields
|
||||||
|
|
||||||
|
/* Generate event list for platforms with counter_info_version 0x6 or below */
|
||||||
|
static __maybe_unused struct attribute *hv_gpci_event_attrs_v6[] = {
|
||||||
|
#include REQUEST_FILE
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Based on getPerfCountInfo v1.018 documentation, some of the hv-gpci
|
||||||
|
* events were deprecated for platform firmware that supports
|
||||||
|
* counter_info_version 0x8 or above.
|
||||||
|
* Those deprecated events are still part of platform firmware that
|
||||||
|
* support counter_info_version 0x6 and below. As per the getPerfCountInfo
|
||||||
|
* v1.018 documentation there is no counter_info_version 0x7.
|
||||||
|
* Undefining macro ENABLE_EVENTS_COUNTERINFO_V6, to disable the addition of
|
||||||
|
* deprecated events in "hv_gpci_event_attrs" attribute group, for platforms
|
||||||
|
* that supports counter_info_version 0x8 or above.
|
||||||
|
*/
|
||||||
|
#undef ENABLE_EVENTS_COUNTERINFO_V6
|
||||||
|
|
||||||
|
/* Generate event list for platforms with counter_info_version 0x8 or above*/
|
||||||
static __maybe_unused struct attribute *hv_gpci_event_attrs[] = {
|
static __maybe_unused struct attribute *hv_gpci_event_attrs[] = {
|
||||||
#include REQUEST_FILE
|
#include REQUEST_FILE
|
||||||
NULL
|
NULL
|
||||||
|
@ -530,6 +530,7 @@ static int mpc52xx_lpbfifo_probe(struct platform_device *op)
|
|||||||
err_bcom_rx_irq:
|
err_bcom_rx_irq:
|
||||||
bcom_gen_bd_rx_release(lpbfifo.bcom_rx_task);
|
bcom_gen_bd_rx_release(lpbfifo.bcom_rx_task);
|
||||||
err_bcom_rx:
|
err_bcom_rx:
|
||||||
|
free_irq(lpbfifo.irq, &lpbfifo);
|
||||||
err_irq:
|
err_irq:
|
||||||
iounmap(lpbfifo.regs);
|
iounmap(lpbfifo.regs);
|
||||||
lpbfifo.regs = NULL;
|
lpbfifo.regs = NULL;
|
||||||
|
@ -106,7 +106,7 @@ static int __init of_fsl_spi_probe(char *type, char *compatible, u32 sysclk,
|
|||||||
|
|
||||||
goto next;
|
goto next;
|
||||||
unreg:
|
unreg:
|
||||||
platform_device_del(pdev);
|
platform_device_put(pdev);
|
||||||
err:
|
err:
|
||||||
pr_err("%pOF: registration failed\n", np);
|
pr_err("%pOF: registration failed\n", np);
|
||||||
next:
|
next:
|
||||||
|
@ -846,18 +846,8 @@ static int __init eeh_pseries_init(void)
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize error log lock and size */
|
/* Initialize error log size */
|
||||||
spin_lock_init(&slot_errbuf_lock);
|
eeh_error_buf_size = rtas_get_error_log_max();
|
||||||
eeh_error_buf_size = rtas_token("rtas-error-log-max");
|
|
||||||
if (eeh_error_buf_size == RTAS_UNKNOWN_SERVICE) {
|
|
||||||
pr_info("%s: unknown EEH error log size\n",
|
|
||||||
__func__);
|
|
||||||
eeh_error_buf_size = 1024;
|
|
||||||
} else if (eeh_error_buf_size > RTAS_ERROR_LOG_MAX) {
|
|
||||||
pr_info("%s: EEH error log size %d exceeds the maximal %d\n",
|
|
||||||
__func__, eeh_error_buf_size, RTAS_ERROR_LOG_MAX);
|
|
||||||
eeh_error_buf_size = RTAS_ERROR_LOG_MAX;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Set EEH probe mode */
|
/* Set EEH probe mode */
|
||||||
eeh_add_flag(EEH_PROBE_MODE_DEVTREE | EEH_ENABLE_IO_FOR_LOG);
|
eeh_add_flag(EEH_PROBE_MODE_DEVTREE | EEH_ENABLE_IO_FOR_LOG);
|
||||||
|
@ -425,6 +425,7 @@ static int xive_spapr_populate_irq_data(u32 hw_irq, struct xive_irq_data *data)
|
|||||||
|
|
||||||
data->trig_mmio = ioremap(data->trig_page, 1u << data->esb_shift);
|
data->trig_mmio = ioremap(data->trig_page, 1u << data->esb_shift);
|
||||||
if (!data->trig_mmio) {
|
if (!data->trig_mmio) {
|
||||||
|
iounmap(data->eoi_mmio);
|
||||||
pr_err("Failed to map trigger page for irq 0x%x\n", hw_irq);
|
pr_err("Failed to map trigger page for irq 0x%x\n", hw_irq);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
@ -1383,7 +1383,6 @@ static long check_bp_loc(unsigned long addr)
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef CONFIG_PPC_8xx
|
|
||||||
static int find_free_data_bpt(void)
|
static int find_free_data_bpt(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@ -1395,7 +1394,6 @@ static int find_free_data_bpt(void)
|
|||||||
printf("Couldn't find free breakpoint register\n");
|
printf("Couldn't find free breakpoint register\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
static void print_data_bpts(void)
|
static void print_data_bpts(void)
|
||||||
{
|
{
|
||||||
@ -1435,10 +1433,9 @@ bpt_cmds(void)
|
|||||||
cmd = inchar();
|
cmd = inchar();
|
||||||
|
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
#ifndef CONFIG_PPC_8xx
|
case 'd': { /* bd - hardware data breakpoint */
|
||||||
static const char badaddr[] = "Only kernel addresses are permitted for breakpoints\n";
|
static const char badaddr[] = "Only kernel addresses are permitted for breakpoints\n";
|
||||||
int mode;
|
int mode;
|
||||||
case 'd': /* bd - hardware data breakpoint */
|
|
||||||
if (xmon_is_ro) {
|
if (xmon_is_ro) {
|
||||||
printf(xmon_ro_msg);
|
printf(xmon_ro_msg);
|
||||||
break;
|
break;
|
||||||
@ -1471,6 +1468,7 @@ bpt_cmds(void)
|
|||||||
|
|
||||||
force_enable_xmon();
|
force_enable_xmon();
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case 'i': /* bi - hardware instr breakpoint */
|
case 'i': /* bi - hardware instr breakpoint */
|
||||||
if (xmon_is_ro) {
|
if (xmon_is_ro) {
|
||||||
@ -1497,7 +1495,6 @@ bpt_cmds(void)
|
|||||||
force_enable_xmon();
|
force_enable_xmon();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
#endif
|
|
||||||
|
|
||||||
case 'c':
|
case 'c':
|
||||||
if (!scanhex(&a)) {
|
if (!scanhex(&a)) {
|
||||||
|
@ -5,4 +5,10 @@
|
|||||||
#include <asm-generic/hugetlb.h>
|
#include <asm-generic/hugetlb.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
|
|
||||||
|
static inline void arch_clear_hugepage_flags(struct page *page)
|
||||||
|
{
|
||||||
|
clear_bit(PG_dcache_clean, &page->flags);
|
||||||
|
}
|
||||||
|
#define arch_clear_hugepage_flags arch_clear_hugepage_flags
|
||||||
|
|
||||||
#endif /* _ASM_RISCV_HUGETLB_H */
|
#endif /* _ASM_RISCV_HUGETLB_H */
|
||||||
|
@ -216,7 +216,7 @@ do { \
|
|||||||
might_fault(); \
|
might_fault(); \
|
||||||
access_ok(__p, sizeof(*__p)) ? \
|
access_ok(__p, sizeof(*__p)) ? \
|
||||||
__get_user((x), __p) : \
|
__get_user((x), __p) : \
|
||||||
((x) = 0, -EFAULT); \
|
((x) = (__force __typeof__(x))0, -EFAULT); \
|
||||||
})
|
})
|
||||||
|
|
||||||
#define __put_user_asm(insn, x, ptr, err) \
|
#define __put_user_asm(insn, x, ptr, err) \
|
||||||
|
@ -57,9 +57,15 @@ void notrace walk_stackframe(struct task_struct *task, struct pt_regs *regs,
|
|||||||
/* Unwind stack frame */
|
/* Unwind stack frame */
|
||||||
frame = (struct stackframe *)fp - 1;
|
frame = (struct stackframe *)fp - 1;
|
||||||
sp = fp;
|
sp = fp;
|
||||||
fp = frame->fp;
|
if (regs && (regs->epc == pc) && (frame->fp & 0x7)) {
|
||||||
pc = ftrace_graph_ret_addr(current, NULL, frame->ra,
|
fp = frame->ra;
|
||||||
(unsigned long *)(fp - 8));
|
pc = regs->ra;
|
||||||
|
} else {
|
||||||
|
fp = frame->fp;
|
||||||
|
pc = ftrace_graph_ret_addr(current, NULL, frame->ra,
|
||||||
|
&frame->ra);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -84,6 +84,7 @@ struct intel_uncore_type {
|
|||||||
/*
|
/*
|
||||||
* Optional callbacks for managing mapping of Uncore units to PMONs
|
* Optional callbacks for managing mapping of Uncore units to PMONs
|
||||||
*/
|
*/
|
||||||
|
int (*get_topology)(struct intel_uncore_type *type);
|
||||||
int (*set_mapping)(struct intel_uncore_type *type);
|
int (*set_mapping)(struct intel_uncore_type *type);
|
||||||
void (*cleanup_mapping)(struct intel_uncore_type *type);
|
void (*cleanup_mapping)(struct intel_uncore_type *type);
|
||||||
};
|
};
|
||||||
|
@ -1274,6 +1274,7 @@ static void tgl_uncore_imc_freerunning_init_box(struct intel_uncore_box *box)
|
|||||||
/* MCHBAR is disabled */
|
/* MCHBAR is disabled */
|
||||||
if (!(mch_bar & BIT(0))) {
|
if (!(mch_bar & BIT(0))) {
|
||||||
pr_warn("perf uncore: MCHBAR is disabled. Failed to map IMC free-running counters.\n");
|
pr_warn("perf uncore: MCHBAR is disabled. Failed to map IMC free-running counters.\n");
|
||||||
|
pci_dev_put(pdev);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mch_bar &= ~BIT(0);
|
mch_bar &= ~BIT(0);
|
||||||
@ -1287,6 +1288,8 @@ static void tgl_uncore_imc_freerunning_init_box(struct intel_uncore_box *box)
|
|||||||
box->io_addr = ioremap(addr, type->mmio_map_size);
|
box->io_addr = ioremap(addr, type->mmio_map_size);
|
||||||
if (!box->io_addr)
|
if (!box->io_addr)
|
||||||
pr_warn("perf uncore: Failed to ioremap for %s.\n", type->name);
|
pr_warn("perf uncore: Failed to ioremap for %s.\n", type->name);
|
||||||
|
|
||||||
|
pci_dev_put(pdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct intel_uncore_ops tgl_uncore_imc_freerunning_ops = {
|
static struct intel_uncore_ops tgl_uncore_imc_freerunning_ops = {
|
||||||
|
@ -2828,6 +2828,7 @@ static bool hswep_has_limit_sbox(unsigned int device)
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
pci_read_config_dword(dev, HSWEP_PCU_CAPID4_OFFET, &capid4);
|
pci_read_config_dword(dev, HSWEP_PCU_CAPID4_OFFET, &capid4);
|
||||||
|
pci_dev_put(dev);
|
||||||
if (!hswep_get_chop(capid4))
|
if (!hswep_get_chop(capid4))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
@ -3642,12 +3643,19 @@ static inline u8 skx_iio_stack(struct intel_uncore_pmu *pmu, int die)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static umode_t
|
static umode_t
|
||||||
skx_iio_mapping_visible(struct kobject *kobj, struct attribute *attr, int die)
|
pmu_iio_mapping_visible(struct kobject *kobj, struct attribute *attr,
|
||||||
|
int die, int zero_bus_pmu)
|
||||||
{
|
{
|
||||||
struct intel_uncore_pmu *pmu = dev_to_uncore_pmu(kobj_to_dev(kobj));
|
struct intel_uncore_pmu *pmu = dev_to_uncore_pmu(kobj_to_dev(kobj));
|
||||||
|
|
||||||
/* Root bus 0x00 is valid only for die 0 AND pmu_idx = 0. */
|
return (!skx_iio_stack(pmu, die) && pmu->pmu_idx != zero_bus_pmu) ? 0 : attr->mode;
|
||||||
return (!skx_iio_stack(pmu, die) && pmu->pmu_idx) ? 0 : attr->mode;
|
}
|
||||||
|
|
||||||
|
static umode_t
|
||||||
|
skx_iio_mapping_visible(struct kobject *kobj, struct attribute *attr, int die)
|
||||||
|
{
|
||||||
|
/* Root bus 0x00 is valid only for pmu_idx = 0. */
|
||||||
|
return pmu_iio_mapping_visible(kobj, attr, die, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t skx_iio_mapping_show(struct device *dev,
|
static ssize_t skx_iio_mapping_show(struct device *dev,
|
||||||
@ -3739,7 +3747,23 @@ static const struct attribute_group *skx_iio_attr_update[] = {
|
|||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int skx_iio_set_mapping(struct intel_uncore_type *type)
|
static void pmu_clear_mapping_attr(const struct attribute_group **groups,
|
||||||
|
struct attribute_group *ag)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; groups[i]; i++) {
|
||||||
|
if (groups[i] == ag) {
|
||||||
|
for (i++; groups[i]; i++)
|
||||||
|
groups[i - 1] = groups[i];
|
||||||
|
groups[i - 1] = NULL;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
pmu_iio_set_mapping(struct intel_uncore_type *type, struct attribute_group *ag)
|
||||||
{
|
{
|
||||||
char buf[64];
|
char buf[64];
|
||||||
int ret;
|
int ret;
|
||||||
@ -3747,8 +3771,8 @@ static int skx_iio_set_mapping(struct intel_uncore_type *type)
|
|||||||
struct attribute **attrs = NULL;
|
struct attribute **attrs = NULL;
|
||||||
struct dev_ext_attribute *eas = NULL;
|
struct dev_ext_attribute *eas = NULL;
|
||||||
|
|
||||||
ret = skx_iio_get_topology(type);
|
ret = type->get_topology(type);
|
||||||
if (ret)
|
if (ret < 0)
|
||||||
goto clear_attr_update;
|
goto clear_attr_update;
|
||||||
|
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
@ -3774,7 +3798,7 @@ static int skx_iio_set_mapping(struct intel_uncore_type *type)
|
|||||||
eas[die].var = (void *)die;
|
eas[die].var = (void *)die;
|
||||||
attrs[die] = &eas[die].attr.attr;
|
attrs[die] = &eas[die].attr.attr;
|
||||||
}
|
}
|
||||||
skx_iio_mapping_group.attrs = attrs;
|
ag->attrs = attrs;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
err:
|
err:
|
||||||
@ -3786,10 +3810,15 @@ static int skx_iio_set_mapping(struct intel_uncore_type *type)
|
|||||||
clear_topology:
|
clear_topology:
|
||||||
kfree(type->topology);
|
kfree(type->topology);
|
||||||
clear_attr_update:
|
clear_attr_update:
|
||||||
type->attr_update = NULL;
|
pmu_clear_mapping_attr(type->attr_update, ag);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int skx_iio_set_mapping(struct intel_uncore_type *type)
|
||||||
|
{
|
||||||
|
return pmu_iio_set_mapping(type, &skx_iio_mapping_group);
|
||||||
|
}
|
||||||
|
|
||||||
static void skx_iio_cleanup_mapping(struct intel_uncore_type *type)
|
static void skx_iio_cleanup_mapping(struct intel_uncore_type *type)
|
||||||
{
|
{
|
||||||
struct attribute **attr = skx_iio_mapping_group.attrs;
|
struct attribute **attr = skx_iio_mapping_group.attrs;
|
||||||
@ -3820,6 +3849,7 @@ static struct intel_uncore_type skx_uncore_iio = {
|
|||||||
.ops = &skx_uncore_iio_ops,
|
.ops = &skx_uncore_iio_ops,
|
||||||
.format_group = &skx_uncore_iio_format_group,
|
.format_group = &skx_uncore_iio_format_group,
|
||||||
.attr_update = skx_iio_attr_update,
|
.attr_update = skx_iio_attr_update,
|
||||||
|
.get_topology = skx_iio_get_topology,
|
||||||
.set_mapping = skx_iio_set_mapping,
|
.set_mapping = skx_iio_set_mapping,
|
||||||
.cleanup_mapping = skx_iio_cleanup_mapping,
|
.cleanup_mapping = skx_iio_cleanup_mapping,
|
||||||
};
|
};
|
||||||
@ -4680,6 +4710,8 @@ static void __snr_uncore_mmio_init_box(struct intel_uncore_box *box,
|
|||||||
|
|
||||||
addr += box_ctl;
|
addr += box_ctl;
|
||||||
|
|
||||||
|
pci_dev_put(pdev);
|
||||||
|
|
||||||
box->io_addr = ioremap(addr, type->mmio_map_size);
|
box->io_addr = ioremap(addr, type->mmio_map_size);
|
||||||
if (!box->io_addr) {
|
if (!box->io_addr) {
|
||||||
pr_warn("perf uncore: Failed to ioremap for %s.\n", type->name);
|
pr_warn("perf uncore: Failed to ioremap for %s.\n", type->name);
|
||||||
|
@ -453,8 +453,6 @@ void hyperv_cleanup(void)
|
|||||||
{
|
{
|
||||||
union hv_x64_msr_hypercall_contents hypercall_msr;
|
union hv_x64_msr_hypercall_contents hypercall_msr;
|
||||||
|
|
||||||
unregister_syscore_ops(&hv_syscore_ops);
|
|
||||||
|
|
||||||
/* Reset our OS id */
|
/* Reset our OS id */
|
||||||
wrmsrl(HV_X64_MSR_GUEST_OS_ID, 0);
|
wrmsrl(HV_X64_MSR_GUEST_OS_ID, 0);
|
||||||
|
|
||||||
|
@ -1896,6 +1896,8 @@ static int ib_prctl_set(struct task_struct *task, unsigned long ctrl)
|
|||||||
if (ctrl == PR_SPEC_FORCE_DISABLE)
|
if (ctrl == PR_SPEC_FORCE_DISABLE)
|
||||||
task_set_spec_ib_force_disable(task);
|
task_set_spec_ib_force_disable(task);
|
||||||
task_update_spec_tif(task);
|
task_update_spec_tif(task);
|
||||||
|
if (task == current)
|
||||||
|
indirect_branch_prediction_barrier();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return -ERANGE;
|
return -ERANGE;
|
||||||
|
@ -513,7 +513,7 @@ static u32 get_block_address(u32 current_addr, u32 low, u32 high,
|
|||||||
/* Fall back to method we used for older processors: */
|
/* Fall back to method we used for older processors: */
|
||||||
switch (block) {
|
switch (block) {
|
||||||
case 0:
|
case 0:
|
||||||
addr = msr_ops.misc(bank);
|
addr = mca_msr_reg(bank, MCA_MISC);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
offset = ((low & MASK_BLKPTR_LO) >> 21);
|
offset = ((low & MASK_BLKPTR_LO) >> 21);
|
||||||
@ -952,6 +952,24 @@ _log_error_bank(unsigned int bank, u32 msr_stat, u32 msr_addr, u64 misc)
|
|||||||
return status & MCI_STATUS_DEFERRED;
|
return status & MCI_STATUS_DEFERRED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool _log_error_deferred(unsigned int bank, u32 misc)
|
||||||
|
{
|
||||||
|
if (!_log_error_bank(bank, mca_msr_reg(bank, MCA_STATUS),
|
||||||
|
mca_msr_reg(bank, MCA_ADDR), misc))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Non-SMCA systems don't have MCA_DESTAT/MCA_DEADDR registers.
|
||||||
|
* Return true here to avoid accessing these registers.
|
||||||
|
*/
|
||||||
|
if (!mce_flags.smca)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
/* Clear MCA_DESTAT if the deferred error was logged from MCA_STATUS. */
|
||||||
|
wrmsrl(MSR_AMD64_SMCA_MCx_DESTAT(bank), 0);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We have three scenarios for checking for Deferred errors:
|
* We have three scenarios for checking for Deferred errors:
|
||||||
*
|
*
|
||||||
@ -963,20 +981,9 @@ _log_error_bank(unsigned int bank, u32 msr_stat, u32 msr_addr, u64 misc)
|
|||||||
*/
|
*/
|
||||||
static void log_error_deferred(unsigned int bank)
|
static void log_error_deferred(unsigned int bank)
|
||||||
{
|
{
|
||||||
bool defrd;
|
if (_log_error_deferred(bank, 0))
|
||||||
|
|
||||||
defrd = _log_error_bank(bank, msr_ops.status(bank),
|
|
||||||
msr_ops.addr(bank), 0);
|
|
||||||
|
|
||||||
if (!mce_flags.smca)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Clear MCA_DESTAT if we logged the deferred error from MCA_STATUS. */
|
|
||||||
if (defrd) {
|
|
||||||
wrmsrl(MSR_AMD64_SMCA_MCx_DESTAT(bank), 0);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Only deferred errors are logged in MCA_DE{STAT,ADDR} so just check
|
* Only deferred errors are logged in MCA_DE{STAT,ADDR} so just check
|
||||||
* for a valid error.
|
* for a valid error.
|
||||||
@ -996,7 +1003,7 @@ static void amd_deferred_error_interrupt(void)
|
|||||||
|
|
||||||
static void log_error_thresholding(unsigned int bank, u64 misc)
|
static void log_error_thresholding(unsigned int bank, u64 misc)
|
||||||
{
|
{
|
||||||
_log_error_bank(bank, msr_ops.status(bank), msr_ops.addr(bank), misc);
|
_log_error_deferred(bank, misc);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void log_and_reset_block(struct threshold_block *block)
|
static void log_and_reset_block(struct threshold_block *block)
|
||||||
@ -1384,7 +1391,7 @@ static int threshold_create_bank(struct threshold_bank **bp, unsigned int cpu,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
err = allocate_threshold_blocks(cpu, b, bank, 0, msr_ops.misc(bank));
|
err = allocate_threshold_blocks(cpu, b, bank, 0, mca_msr_reg(bank, MCA_MISC));
|
||||||
if (err)
|
if (err)
|
||||||
goto out_kobj;
|
goto out_kobj;
|
||||||
|
|
||||||
|
@ -176,53 +176,27 @@ void mce_unregister_decode_chain(struct notifier_block *nb)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(mce_unregister_decode_chain);
|
EXPORT_SYMBOL_GPL(mce_unregister_decode_chain);
|
||||||
|
|
||||||
static inline u32 ctl_reg(int bank)
|
u32 mca_msr_reg(int bank, enum mca_msr reg)
|
||||||
{
|
{
|
||||||
return MSR_IA32_MCx_CTL(bank);
|
if (mce_flags.smca) {
|
||||||
}
|
switch (reg) {
|
||||||
|
case MCA_CTL: return MSR_AMD64_SMCA_MCx_CTL(bank);
|
||||||
|
case MCA_ADDR: return MSR_AMD64_SMCA_MCx_ADDR(bank);
|
||||||
|
case MCA_MISC: return MSR_AMD64_SMCA_MCx_MISC(bank);
|
||||||
|
case MCA_STATUS: return MSR_AMD64_SMCA_MCx_STATUS(bank);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static inline u32 status_reg(int bank)
|
switch (reg) {
|
||||||
{
|
case MCA_CTL: return MSR_IA32_MCx_CTL(bank);
|
||||||
return MSR_IA32_MCx_STATUS(bank);
|
case MCA_ADDR: return MSR_IA32_MCx_ADDR(bank);
|
||||||
}
|
case MCA_MISC: return MSR_IA32_MCx_MISC(bank);
|
||||||
|
case MCA_STATUS: return MSR_IA32_MCx_STATUS(bank);
|
||||||
|
}
|
||||||
|
|
||||||
static inline u32 addr_reg(int bank)
|
return 0;
|
||||||
{
|
|
||||||
return MSR_IA32_MCx_ADDR(bank);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline u32 misc_reg(int bank)
|
|
||||||
{
|
|
||||||
return MSR_IA32_MCx_MISC(bank);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline u32 smca_ctl_reg(int bank)
|
|
||||||
{
|
|
||||||
return MSR_AMD64_SMCA_MCx_CTL(bank);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline u32 smca_status_reg(int bank)
|
|
||||||
{
|
|
||||||
return MSR_AMD64_SMCA_MCx_STATUS(bank);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline u32 smca_addr_reg(int bank)
|
|
||||||
{
|
|
||||||
return MSR_AMD64_SMCA_MCx_ADDR(bank);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline u32 smca_misc_reg(int bank)
|
|
||||||
{
|
|
||||||
return MSR_AMD64_SMCA_MCx_MISC(bank);
|
|
||||||
}
|
|
||||||
|
|
||||||
struct mca_msr_regs msr_ops = {
|
|
||||||
.ctl = ctl_reg,
|
|
||||||
.status = status_reg,
|
|
||||||
.addr = addr_reg,
|
|
||||||
.misc = misc_reg
|
|
||||||
};
|
|
||||||
|
|
||||||
static void __print_mce(struct mce *m)
|
static void __print_mce(struct mce *m)
|
||||||
{
|
{
|
||||||
pr_emerg(HW_ERR "CPU %d: Machine Check%s: %Lx Bank %d: %016Lx\n",
|
pr_emerg(HW_ERR "CPU %d: Machine Check%s: %Lx Bank %d: %016Lx\n",
|
||||||
@ -371,11 +345,11 @@ static int msr_to_offset(u32 msr)
|
|||||||
|
|
||||||
if (msr == mca_cfg.rip_msr)
|
if (msr == mca_cfg.rip_msr)
|
||||||
return offsetof(struct mce, ip);
|
return offsetof(struct mce, ip);
|
||||||
if (msr == msr_ops.status(bank))
|
if (msr == mca_msr_reg(bank, MCA_STATUS))
|
||||||
return offsetof(struct mce, status);
|
return offsetof(struct mce, status);
|
||||||
if (msr == msr_ops.addr(bank))
|
if (msr == mca_msr_reg(bank, MCA_ADDR))
|
||||||
return offsetof(struct mce, addr);
|
return offsetof(struct mce, addr);
|
||||||
if (msr == msr_ops.misc(bank))
|
if (msr == mca_msr_reg(bank, MCA_MISC))
|
||||||
return offsetof(struct mce, misc);
|
return offsetof(struct mce, misc);
|
||||||
if (msr == MSR_IA32_MCG_STATUS)
|
if (msr == MSR_IA32_MCG_STATUS)
|
||||||
return offsetof(struct mce, mcgstatus);
|
return offsetof(struct mce, mcgstatus);
|
||||||
@ -694,10 +668,10 @@ static struct notifier_block mce_default_nb = {
|
|||||||
static noinstr void mce_read_aux(struct mce *m, int i)
|
static noinstr void mce_read_aux(struct mce *m, int i)
|
||||||
{
|
{
|
||||||
if (m->status & MCI_STATUS_MISCV)
|
if (m->status & MCI_STATUS_MISCV)
|
||||||
m->misc = mce_rdmsrl(msr_ops.misc(i));
|
m->misc = mce_rdmsrl(mca_msr_reg(i, MCA_MISC));
|
||||||
|
|
||||||
if (m->status & MCI_STATUS_ADDRV) {
|
if (m->status & MCI_STATUS_ADDRV) {
|
||||||
m->addr = mce_rdmsrl(msr_ops.addr(i));
|
m->addr = mce_rdmsrl(mca_msr_reg(i, MCA_ADDR));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Mask the reported address by the reported granularity.
|
* Mask the reported address by the reported granularity.
|
||||||
@ -767,7 +741,7 @@ bool machine_check_poll(enum mcp_flags flags, mce_banks_t *b)
|
|||||||
m.bank = i;
|
m.bank = i;
|
||||||
|
|
||||||
barrier();
|
barrier();
|
||||||
m.status = mce_rdmsrl(msr_ops.status(i));
|
m.status = mce_rdmsrl(mca_msr_reg(i, MCA_STATUS));
|
||||||
|
|
||||||
/* If this entry is not valid, ignore it */
|
/* If this entry is not valid, ignore it */
|
||||||
if (!(m.status & MCI_STATUS_VAL))
|
if (!(m.status & MCI_STATUS_VAL))
|
||||||
@ -835,7 +809,7 @@ bool machine_check_poll(enum mcp_flags flags, mce_banks_t *b)
|
|||||||
/*
|
/*
|
||||||
* Clear state for this bank.
|
* Clear state for this bank.
|
||||||
*/
|
*/
|
||||||
mce_wrmsrl(msr_ops.status(i), 0);
|
mce_wrmsrl(mca_msr_reg(i, MCA_STATUS), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -860,7 +834,7 @@ static int mce_no_way_out(struct mce *m, char **msg, unsigned long *validp,
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < this_cpu_read(mce_num_banks); i++) {
|
for (i = 0; i < this_cpu_read(mce_num_banks); i++) {
|
||||||
m->status = mce_rdmsrl(msr_ops.status(i));
|
m->status = mce_rdmsrl(mca_msr_reg(i, MCA_STATUS));
|
||||||
if (!(m->status & MCI_STATUS_VAL))
|
if (!(m->status & MCI_STATUS_VAL))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -1149,7 +1123,7 @@ static void mce_clear_state(unsigned long *toclear)
|
|||||||
|
|
||||||
for (i = 0; i < this_cpu_read(mce_num_banks); i++) {
|
for (i = 0; i < this_cpu_read(mce_num_banks); i++) {
|
||||||
if (test_bit(i, toclear))
|
if (test_bit(i, toclear))
|
||||||
mce_wrmsrl(msr_ops.status(i), 0);
|
mce_wrmsrl(mca_msr_reg(i, MCA_STATUS), 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1208,7 +1182,7 @@ static void __mc_scan_banks(struct mce *m, struct pt_regs *regs, struct mce *fin
|
|||||||
m->addr = 0;
|
m->addr = 0;
|
||||||
m->bank = i;
|
m->bank = i;
|
||||||
|
|
||||||
m->status = mce_rdmsrl(msr_ops.status(i));
|
m->status = mce_rdmsrl(mca_msr_reg(i, MCA_STATUS));
|
||||||
if (!(m->status & MCI_STATUS_VAL))
|
if (!(m->status & MCI_STATUS_VAL))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
@ -1704,8 +1678,8 @@ static void __mcheck_cpu_init_clear_banks(void)
|
|||||||
|
|
||||||
if (!b->init)
|
if (!b->init)
|
||||||
continue;
|
continue;
|
||||||
wrmsrl(msr_ops.ctl(i), b->ctl);
|
wrmsrl(mca_msr_reg(i, MCA_CTL), b->ctl);
|
||||||
wrmsrl(msr_ops.status(i), 0);
|
wrmsrl(mca_msr_reg(i, MCA_STATUS), 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1731,7 +1705,7 @@ static void __mcheck_cpu_check_banks(void)
|
|||||||
if (!b->init)
|
if (!b->init)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
rdmsrl(msr_ops.ctl(i), msrval);
|
rdmsrl(mca_msr_reg(i, MCA_CTL), msrval);
|
||||||
b->init = !!msrval;
|
b->init = !!msrval;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1890,13 +1864,6 @@ static void __mcheck_cpu_init_early(struct cpuinfo_x86 *c)
|
|||||||
mce_flags.succor = !!cpu_has(c, X86_FEATURE_SUCCOR);
|
mce_flags.succor = !!cpu_has(c, X86_FEATURE_SUCCOR);
|
||||||
mce_flags.smca = !!cpu_has(c, X86_FEATURE_SMCA);
|
mce_flags.smca = !!cpu_has(c, X86_FEATURE_SMCA);
|
||||||
mce_flags.amd_threshold = 1;
|
mce_flags.amd_threshold = 1;
|
||||||
|
|
||||||
if (mce_flags.smca) {
|
|
||||||
msr_ops.ctl = smca_ctl_reg;
|
|
||||||
msr_ops.status = smca_status_reg;
|
|
||||||
msr_ops.addr = smca_addr_reg;
|
|
||||||
msr_ops.misc = smca_misc_reg;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2272,7 +2239,7 @@ static void mce_disable_error_reporting(void)
|
|||||||
struct mce_bank *b = &mce_banks[i];
|
struct mce_bank *b = &mce_banks[i];
|
||||||
|
|
||||||
if (b->init)
|
if (b->init)
|
||||||
wrmsrl(msr_ops.ctl(i), 0);
|
wrmsrl(mca_msr_reg(i, MCA_CTL), 0);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -2624,7 +2591,7 @@ static void mce_reenable_cpu(void)
|
|||||||
struct mce_bank *b = &mce_banks[i];
|
struct mce_bank *b = &mce_banks[i];
|
||||||
|
|
||||||
if (b->init)
|
if (b->init)
|
||||||
wrmsrl(msr_ops.ctl(i), b->ctl);
|
wrmsrl(mca_msr_reg(i, MCA_CTL), b->ctl);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -168,14 +168,14 @@ struct mce_vendor_flags {
|
|||||||
|
|
||||||
extern struct mce_vendor_flags mce_flags;
|
extern struct mce_vendor_flags mce_flags;
|
||||||
|
|
||||||
struct mca_msr_regs {
|
enum mca_msr {
|
||||||
u32 (*ctl) (int bank);
|
MCA_CTL,
|
||||||
u32 (*status) (int bank);
|
MCA_STATUS,
|
||||||
u32 (*addr) (int bank);
|
MCA_ADDR,
|
||||||
u32 (*misc) (int bank);
|
MCA_MISC,
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct mca_msr_regs msr_ops;
|
u32 mca_msr_reg(int bank, enum mca_msr reg);
|
||||||
|
|
||||||
/* Decide whether to add MCE record to MCE event pool or filter it out. */
|
/* Decide whether to add MCE record to MCE event pool or filter it out. */
|
||||||
extern bool filter_mce(struct mce *m);
|
extern bool filter_mce(struct mce *m);
|
||||||
|
@ -659,7 +659,6 @@ void load_ucode_intel_ap(void)
|
|||||||
else
|
else
|
||||||
iup = &intel_ucode_patch;
|
iup = &intel_ucode_patch;
|
||||||
|
|
||||||
reget:
|
|
||||||
if (!*iup) {
|
if (!*iup) {
|
||||||
patch = __load_ucode_intel(&uci);
|
patch = __load_ucode_intel(&uci);
|
||||||
if (!patch)
|
if (!patch)
|
||||||
@ -670,12 +669,7 @@ void load_ucode_intel_ap(void)
|
|||||||
|
|
||||||
uci.mc = *iup;
|
uci.mc = *iup;
|
||||||
|
|
||||||
if (apply_microcode_early(&uci, true)) {
|
apply_microcode_early(&uci, true);
|
||||||
/* Mixed-silicon system? Try to refetch the proper patch: */
|
|
||||||
*iup = NULL;
|
|
||||||
|
|
||||||
goto reget;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct microcode_intel *find_patch(struct ucode_cpu_info *uci)
|
static struct microcode_intel *find_patch(struct ucode_cpu_info *uci)
|
||||||
|
@ -219,7 +219,9 @@ void ftrace_replace_code(int enable)
|
|||||||
|
|
||||||
ret = ftrace_verify_code(rec->ip, old);
|
ret = ftrace_verify_code(rec->ip, old);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
ftrace_expected = old;
|
||||||
ftrace_bug(ret, rec);
|
ftrace_bug(ret, rec);
|
||||||
|
ftrace_expected = NULL;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -37,6 +37,7 @@
|
|||||||
#include <linux/extable.h>
|
#include <linux/extable.h>
|
||||||
#include <linux/kdebug.h>
|
#include <linux/kdebug.h>
|
||||||
#include <linux/kallsyms.h>
|
#include <linux/kallsyms.h>
|
||||||
|
#include <linux/kgdb.h>
|
||||||
#include <linux/ftrace.h>
|
#include <linux/ftrace.h>
|
||||||
#include <linux/kasan.h>
|
#include <linux/kasan.h>
|
||||||
#include <linux/moduleloader.h>
|
#include <linux/moduleloader.h>
|
||||||
@ -292,6 +293,8 @@ static int can_probe(unsigned long paddr)
|
|||||||
/* Decode instructions */
|
/* Decode instructions */
|
||||||
addr = paddr - offset;
|
addr = paddr - offset;
|
||||||
while (addr < paddr) {
|
while (addr < paddr) {
|
||||||
|
int ret;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check if the instruction has been modified by another
|
* Check if the instruction has been modified by another
|
||||||
* kprobe, in which case we replace the breakpoint by the
|
* kprobe, in which case we replace the breakpoint by the
|
||||||
@ -303,15 +306,20 @@ static int can_probe(unsigned long paddr)
|
|||||||
__addr = recover_probed_instruction(buf, addr);
|
__addr = recover_probed_instruction(buf, addr);
|
||||||
if (!__addr)
|
if (!__addr)
|
||||||
return 0;
|
return 0;
|
||||||
kernel_insn_init(&insn, (void *)__addr, MAX_INSN_SIZE);
|
|
||||||
insn_get_length(&insn);
|
|
||||||
|
|
||||||
/*
|
ret = insn_decode(&insn, (void *)__addr, MAX_INSN_SIZE, INSN_MODE_KERN);
|
||||||
* Another debugging subsystem might insert this breakpoint.
|
if (ret < 0)
|
||||||
* In that case, we can't recover it.
|
|
||||||
*/
|
|
||||||
if (insn.opcode.bytes[0] == INT3_INSN_OPCODE)
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
#ifdef CONFIG_KGDB
|
||||||
|
/*
|
||||||
|
* If there is a dynamically installed kgdb sw breakpoint,
|
||||||
|
* this function should not be probed.
|
||||||
|
*/
|
||||||
|
if (insn.opcode.bytes[0] == INT3_INSN_OPCODE &&
|
||||||
|
kgdb_has_hit_break(addr))
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
addr += insn.length;
|
addr += insn.length;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -347,8 +355,8 @@ static int is_IF_modifier(kprobe_opcode_t *insn)
|
|||||||
int __copy_instruction(u8 *dest, u8 *src, u8 *real, struct insn *insn)
|
int __copy_instruction(u8 *dest, u8 *src, u8 *real, struct insn *insn)
|
||||||
{
|
{
|
||||||
kprobe_opcode_t buf[MAX_INSN_SIZE];
|
kprobe_opcode_t buf[MAX_INSN_SIZE];
|
||||||
unsigned long recovered_insn =
|
unsigned long recovered_insn = recover_probed_instruction(buf, (unsigned long)src);
|
||||||
recover_probed_instruction(buf, (unsigned long)src);
|
int ret;
|
||||||
|
|
||||||
if (!recovered_insn || !insn)
|
if (!recovered_insn || !insn)
|
||||||
return 0;
|
return 0;
|
||||||
@ -358,8 +366,9 @@ int __copy_instruction(u8 *dest, u8 *src, u8 *real, struct insn *insn)
|
|||||||
MAX_INSN_SIZE))
|
MAX_INSN_SIZE))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
kernel_insn_init(insn, dest, MAX_INSN_SIZE);
|
ret = insn_decode(insn, dest, MAX_INSN_SIZE, INSN_MODE_KERN);
|
||||||
insn_get_length(insn);
|
if (ret < 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
/* We can not probe force emulate prefixed instruction */
|
/* We can not probe force emulate prefixed instruction */
|
||||||
if (insn_has_emulate_prefix(insn))
|
if (insn_has_emulate_prefix(insn))
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
#include <linux/extable.h>
|
#include <linux/extable.h>
|
||||||
#include <linux/kdebug.h>
|
#include <linux/kdebug.h>
|
||||||
#include <linux/kallsyms.h>
|
#include <linux/kallsyms.h>
|
||||||
|
#include <linux/kgdb.h>
|
||||||
#include <linux/ftrace.h>
|
#include <linux/ftrace.h>
|
||||||
#include <linux/objtool.h>
|
#include <linux/objtool.h>
|
||||||
#include <linux/pgtable.h>
|
#include <linux/pgtable.h>
|
||||||
@ -277,19 +278,6 @@ static int insn_is_indirect_jump(struct insn *insn)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool is_padding_int3(unsigned long addr, unsigned long eaddr)
|
|
||||||
{
|
|
||||||
unsigned char ops;
|
|
||||||
|
|
||||||
for (; addr < eaddr; addr++) {
|
|
||||||
if (get_kernel_nofault(ops, (void *)addr) < 0 ||
|
|
||||||
ops != INT3_INSN_OPCODE)
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Decode whole function to ensure any instructions don't jump into target */
|
/* Decode whole function to ensure any instructions don't jump into target */
|
||||||
static int can_optimize(unsigned long paddr)
|
static int can_optimize(unsigned long paddr)
|
||||||
{
|
{
|
||||||
@ -317,6 +305,8 @@ static int can_optimize(unsigned long paddr)
|
|||||||
addr = paddr - offset;
|
addr = paddr - offset;
|
||||||
while (addr < paddr - offset + size) { /* Decode until function end */
|
while (addr < paddr - offset + size) { /* Decode until function end */
|
||||||
unsigned long recovered_insn;
|
unsigned long recovered_insn;
|
||||||
|
int ret;
|
||||||
|
|
||||||
if (search_exception_tables(addr))
|
if (search_exception_tables(addr))
|
||||||
/*
|
/*
|
||||||
* Since some fixup code will jumps into this function,
|
* Since some fixup code will jumps into this function,
|
||||||
@ -326,16 +316,19 @@ static int can_optimize(unsigned long paddr)
|
|||||||
recovered_insn = recover_probed_instruction(buf, addr);
|
recovered_insn = recover_probed_instruction(buf, addr);
|
||||||
if (!recovered_insn)
|
if (!recovered_insn)
|
||||||
return 0;
|
return 0;
|
||||||
kernel_insn_init(&insn, (void *)recovered_insn, MAX_INSN_SIZE);
|
|
||||||
insn_get_length(&insn);
|
|
||||||
/*
|
|
||||||
* In the case of detecting unknown breakpoint, this could be
|
|
||||||
* a padding INT3 between functions. Let's check that all the
|
|
||||||
* rest of the bytes are also INT3.
|
|
||||||
*/
|
|
||||||
if (insn.opcode.bytes[0] == INT3_INSN_OPCODE)
|
|
||||||
return is_padding_int3(addr, paddr - offset + size) ? 1 : 0;
|
|
||||||
|
|
||||||
|
ret = insn_decode(&insn, (void *)recovered_insn, MAX_INSN_SIZE, INSN_MODE_KERN);
|
||||||
|
if (ret < 0)
|
||||||
|
return 0;
|
||||||
|
#ifdef CONFIG_KGDB
|
||||||
|
/*
|
||||||
|
* If there is a dynamically installed kgdb sw breakpoint,
|
||||||
|
* this function should not be probed.
|
||||||
|
*/
|
||||||
|
if (insn.opcode.bytes[0] == INT3_INSN_OPCODE &&
|
||||||
|
kgdb_has_hit_break(addr))
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
/* Recover address */
|
/* Recover address */
|
||||||
insn.kaddr = (void *)addr;
|
insn.kaddr = (void *)addr;
|
||||||
insn.next_byte = (void *)(addr + insn.length);
|
insn.next_byte = (void *)(addr + insn.length);
|
||||||
|
@ -722,8 +722,9 @@ static int branch_setup_xol_ops(struct arch_uprobe *auprobe, struct insn *insn)
|
|||||||
switch (opc1) {
|
switch (opc1) {
|
||||||
case 0xeb: /* jmp 8 */
|
case 0xeb: /* jmp 8 */
|
||||||
case 0xe9: /* jmp 32 */
|
case 0xe9: /* jmp 32 */
|
||||||
case 0x90: /* prefix* + nop; same as jmp with .offs = 0 */
|
|
||||||
break;
|
break;
|
||||||
|
case 0x90: /* prefix* + nop; same as jmp with .offs = 0 */
|
||||||
|
goto setup;
|
||||||
|
|
||||||
case 0xe8: /* call relative */
|
case 0xe8: /* call relative */
|
||||||
branch_clear_offset(auprobe, insn);
|
branch_clear_offset(auprobe, insn);
|
||||||
@ -753,6 +754,7 @@ static int branch_setup_xol_ops(struct arch_uprobe *auprobe, struct insn *insn)
|
|||||||
return -ENOTSUPP;
|
return -ENOTSUPP;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setup:
|
||||||
auprobe->branch.opc1 = opc1;
|
auprobe->branch.opc1 = opc1;
|
||||||
auprobe->branch.ilen = insn->length;
|
auprobe->branch.ilen = insn->length;
|
||||||
auprobe->branch.offs = insn->immediate.value;
|
auprobe->branch.offs = insn->immediate.value;
|
||||||
|
@ -4901,24 +4901,35 @@ static int handle_vmon(struct kvm_vcpu *vcpu)
|
|||||||
| FEAT_CTL_VMX_ENABLED_OUTSIDE_SMX;
|
| FEAT_CTL_VMX_ENABLED_OUTSIDE_SMX;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Note, KVM cannot rely on hardware to perform the CR0/CR4 #UD checks
|
* Manually check CR4.VMXE checks, KVM must force CR4.VMXE=1 to enter
|
||||||
* that have higher priority than VM-Exit (see Intel SDM's pseudocode
|
* the guest and so cannot rely on hardware to perform the check,
|
||||||
* for VMXON), as KVM must load valid CR0/CR4 values into hardware while
|
* which has higher priority than VM-Exit (see Intel SDM's pseudocode
|
||||||
* running the guest, i.e. KVM needs to check the _guest_ values.
|
* for VMXON).
|
||||||
*
|
*
|
||||||
* Rely on hardware for the other two pre-VM-Exit checks, !VM86 and
|
* Rely on hardware for the other pre-VM-Exit checks, CR0.PE=1, !VM86
|
||||||
* !COMPATIBILITY modes. KVM may run the guest in VM86 to emulate Real
|
* and !COMPATIBILITY modes. For an unrestricted guest, KVM doesn't
|
||||||
* Mode, but KVM will never take the guest out of those modes.
|
* force any of the relevant guest state. For a restricted guest, KVM
|
||||||
|
* does force CR0.PE=1, but only to also force VM86 in order to emulate
|
||||||
|
* Real Mode, and so there's no need to check CR0.PE manually.
|
||||||
*/
|
*/
|
||||||
if (!nested_host_cr0_valid(vcpu, kvm_read_cr0(vcpu)) ||
|
if (!kvm_read_cr4_bits(vcpu, X86_CR4_VMXE)) {
|
||||||
!nested_host_cr4_valid(vcpu, kvm_read_cr4(vcpu))) {
|
|
||||||
kvm_queue_exception(vcpu, UD_VECTOR);
|
kvm_queue_exception(vcpu, UD_VECTOR);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* CPL=0 and all other checks that are lower priority than VM-Exit must
|
* The CPL is checked for "not in VMX operation" and for "in VMX root",
|
||||||
* be checked manually.
|
* and has higher priority than the VM-Fail due to being post-VMXON,
|
||||||
|
* i.e. VMXON #GPs outside of VMX non-root if CPL!=0. In VMX non-root,
|
||||||
|
* VMXON causes VM-Exit and KVM unconditionally forwards VMXON VM-Exits
|
||||||
|
* from L2 to L1, i.e. there's no need to check for the vCPU being in
|
||||||
|
* VMX non-root.
|
||||||
|
*
|
||||||
|
* Forwarding the VM-Exit unconditionally, i.e. without performing the
|
||||||
|
* #UD checks (see above), is functionally ok because KVM doesn't allow
|
||||||
|
* L1 to run L2 without CR4.VMXE=0, and because KVM never modifies L2's
|
||||||
|
* CR0 or CR4, i.e. it's L2's responsibility to emulate #UDs that are
|
||||||
|
* missed by hardware due to shadowing CR0 and/or CR4.
|
||||||
*/
|
*/
|
||||||
if (vmx_get_cpl(vcpu)) {
|
if (vmx_get_cpl(vcpu)) {
|
||||||
kvm_inject_gp(vcpu, 0);
|
kvm_inject_gp(vcpu, 0);
|
||||||
@ -4928,6 +4939,17 @@ static int handle_vmon(struct kvm_vcpu *vcpu)
|
|||||||
if (vmx->nested.vmxon)
|
if (vmx->nested.vmxon)
|
||||||
return nested_vmx_fail(vcpu, VMXERR_VMXON_IN_VMX_ROOT_OPERATION);
|
return nested_vmx_fail(vcpu, VMXERR_VMXON_IN_VMX_ROOT_OPERATION);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Invalid CR0/CR4 generates #GP. These checks are performed if and
|
||||||
|
* only if the vCPU isn't already in VMX operation, i.e. effectively
|
||||||
|
* have lower priority than the VM-Fail above.
|
||||||
|
*/
|
||||||
|
if (!nested_host_cr0_valid(vcpu, kvm_read_cr0(vcpu)) ||
|
||||||
|
!nested_host_cr4_valid(vcpu, kvm_read_cr4(vcpu))) {
|
||||||
|
kvm_inject_gp(vcpu, 0);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
if ((vmx->msr_ia32_feature_control & VMXON_NEEDED_FEATURES)
|
if ((vmx->msr_ia32_feature_control & VMXON_NEEDED_FEATURES)
|
||||||
!= VMXON_NEEDED_FEATURES) {
|
!= VMXON_NEEDED_FEATURES) {
|
||||||
kvm_inject_gp(vcpu, 0);
|
kvm_inject_gp(vcpu, 0);
|
||||||
|
@ -32,30 +32,30 @@ static irqreturn_t xen_reschedule_interrupt(int irq, void *dev_id)
|
|||||||
|
|
||||||
void xen_smp_intr_free(unsigned int cpu)
|
void xen_smp_intr_free(unsigned int cpu)
|
||||||
{
|
{
|
||||||
|
kfree(per_cpu(xen_resched_irq, cpu).name);
|
||||||
|
per_cpu(xen_resched_irq, cpu).name = NULL;
|
||||||
if (per_cpu(xen_resched_irq, cpu).irq >= 0) {
|
if (per_cpu(xen_resched_irq, cpu).irq >= 0) {
|
||||||
unbind_from_irqhandler(per_cpu(xen_resched_irq, cpu).irq, NULL);
|
unbind_from_irqhandler(per_cpu(xen_resched_irq, cpu).irq, NULL);
|
||||||
per_cpu(xen_resched_irq, cpu).irq = -1;
|
per_cpu(xen_resched_irq, cpu).irq = -1;
|
||||||
kfree(per_cpu(xen_resched_irq, cpu).name);
|
|
||||||
per_cpu(xen_resched_irq, cpu).name = NULL;
|
|
||||||
}
|
}
|
||||||
|
kfree(per_cpu(xen_callfunc_irq, cpu).name);
|
||||||
|
per_cpu(xen_callfunc_irq, cpu).name = NULL;
|
||||||
if (per_cpu(xen_callfunc_irq, cpu).irq >= 0) {
|
if (per_cpu(xen_callfunc_irq, cpu).irq >= 0) {
|
||||||
unbind_from_irqhandler(per_cpu(xen_callfunc_irq, cpu).irq, NULL);
|
unbind_from_irqhandler(per_cpu(xen_callfunc_irq, cpu).irq, NULL);
|
||||||
per_cpu(xen_callfunc_irq, cpu).irq = -1;
|
per_cpu(xen_callfunc_irq, cpu).irq = -1;
|
||||||
kfree(per_cpu(xen_callfunc_irq, cpu).name);
|
|
||||||
per_cpu(xen_callfunc_irq, cpu).name = NULL;
|
|
||||||
}
|
}
|
||||||
|
kfree(per_cpu(xen_debug_irq, cpu).name);
|
||||||
|
per_cpu(xen_debug_irq, cpu).name = NULL;
|
||||||
if (per_cpu(xen_debug_irq, cpu).irq >= 0) {
|
if (per_cpu(xen_debug_irq, cpu).irq >= 0) {
|
||||||
unbind_from_irqhandler(per_cpu(xen_debug_irq, cpu).irq, NULL);
|
unbind_from_irqhandler(per_cpu(xen_debug_irq, cpu).irq, NULL);
|
||||||
per_cpu(xen_debug_irq, cpu).irq = -1;
|
per_cpu(xen_debug_irq, cpu).irq = -1;
|
||||||
kfree(per_cpu(xen_debug_irq, cpu).name);
|
|
||||||
per_cpu(xen_debug_irq, cpu).name = NULL;
|
|
||||||
}
|
}
|
||||||
|
kfree(per_cpu(xen_callfuncsingle_irq, cpu).name);
|
||||||
|
per_cpu(xen_callfuncsingle_irq, cpu).name = NULL;
|
||||||
if (per_cpu(xen_callfuncsingle_irq, cpu).irq >= 0) {
|
if (per_cpu(xen_callfuncsingle_irq, cpu).irq >= 0) {
|
||||||
unbind_from_irqhandler(per_cpu(xen_callfuncsingle_irq, cpu).irq,
|
unbind_from_irqhandler(per_cpu(xen_callfuncsingle_irq, cpu).irq,
|
||||||
NULL);
|
NULL);
|
||||||
per_cpu(xen_callfuncsingle_irq, cpu).irq = -1;
|
per_cpu(xen_callfuncsingle_irq, cpu).irq = -1;
|
||||||
kfree(per_cpu(xen_callfuncsingle_irq, cpu).name);
|
|
||||||
per_cpu(xen_callfuncsingle_irq, cpu).name = NULL;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -65,6 +65,7 @@ int xen_smp_intr_init(unsigned int cpu)
|
|||||||
char *resched_name, *callfunc_name, *debug_name;
|
char *resched_name, *callfunc_name, *debug_name;
|
||||||
|
|
||||||
resched_name = kasprintf(GFP_KERNEL, "resched%d", cpu);
|
resched_name = kasprintf(GFP_KERNEL, "resched%d", cpu);
|
||||||
|
per_cpu(xen_resched_irq, cpu).name = resched_name;
|
||||||
rc = bind_ipi_to_irqhandler(XEN_RESCHEDULE_VECTOR,
|
rc = bind_ipi_to_irqhandler(XEN_RESCHEDULE_VECTOR,
|
||||||
cpu,
|
cpu,
|
||||||
xen_reschedule_interrupt,
|
xen_reschedule_interrupt,
|
||||||
@ -74,9 +75,9 @@ int xen_smp_intr_init(unsigned int cpu)
|
|||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
per_cpu(xen_resched_irq, cpu).irq = rc;
|
per_cpu(xen_resched_irq, cpu).irq = rc;
|
||||||
per_cpu(xen_resched_irq, cpu).name = resched_name;
|
|
||||||
|
|
||||||
callfunc_name = kasprintf(GFP_KERNEL, "callfunc%d", cpu);
|
callfunc_name = kasprintf(GFP_KERNEL, "callfunc%d", cpu);
|
||||||
|
per_cpu(xen_callfunc_irq, cpu).name = callfunc_name;
|
||||||
rc = bind_ipi_to_irqhandler(XEN_CALL_FUNCTION_VECTOR,
|
rc = bind_ipi_to_irqhandler(XEN_CALL_FUNCTION_VECTOR,
|
||||||
cpu,
|
cpu,
|
||||||
xen_call_function_interrupt,
|
xen_call_function_interrupt,
|
||||||
@ -86,10 +87,10 @@ int xen_smp_intr_init(unsigned int cpu)
|
|||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
per_cpu(xen_callfunc_irq, cpu).irq = rc;
|
per_cpu(xen_callfunc_irq, cpu).irq = rc;
|
||||||
per_cpu(xen_callfunc_irq, cpu).name = callfunc_name;
|
|
||||||
|
|
||||||
if (!xen_fifo_events) {
|
if (!xen_fifo_events) {
|
||||||
debug_name = kasprintf(GFP_KERNEL, "debug%d", cpu);
|
debug_name = kasprintf(GFP_KERNEL, "debug%d", cpu);
|
||||||
|
per_cpu(xen_debug_irq, cpu).name = debug_name;
|
||||||
rc = bind_virq_to_irqhandler(VIRQ_DEBUG, cpu,
|
rc = bind_virq_to_irqhandler(VIRQ_DEBUG, cpu,
|
||||||
xen_debug_interrupt,
|
xen_debug_interrupt,
|
||||||
IRQF_PERCPU | IRQF_NOBALANCING,
|
IRQF_PERCPU | IRQF_NOBALANCING,
|
||||||
@ -97,10 +98,10 @@ int xen_smp_intr_init(unsigned int cpu)
|
|||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
per_cpu(xen_debug_irq, cpu).irq = rc;
|
per_cpu(xen_debug_irq, cpu).irq = rc;
|
||||||
per_cpu(xen_debug_irq, cpu).name = debug_name;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
callfunc_name = kasprintf(GFP_KERNEL, "callfuncsingle%d", cpu);
|
callfunc_name = kasprintf(GFP_KERNEL, "callfuncsingle%d", cpu);
|
||||||
|
per_cpu(xen_callfuncsingle_irq, cpu).name = callfunc_name;
|
||||||
rc = bind_ipi_to_irqhandler(XEN_CALL_FUNCTION_SINGLE_VECTOR,
|
rc = bind_ipi_to_irqhandler(XEN_CALL_FUNCTION_SINGLE_VECTOR,
|
||||||
cpu,
|
cpu,
|
||||||
xen_call_function_single_interrupt,
|
xen_call_function_single_interrupt,
|
||||||
@ -110,7 +111,6 @@ int xen_smp_intr_init(unsigned int cpu)
|
|||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
per_cpu(xen_callfuncsingle_irq, cpu).irq = rc;
|
per_cpu(xen_callfuncsingle_irq, cpu).irq = rc;
|
||||||
per_cpu(xen_callfuncsingle_irq, cpu).name = callfunc_name;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -98,18 +98,18 @@ asmlinkage __visible void cpu_bringup_and_idle(void)
|
|||||||
|
|
||||||
void xen_smp_intr_free_pv(unsigned int cpu)
|
void xen_smp_intr_free_pv(unsigned int cpu)
|
||||||
{
|
{
|
||||||
|
kfree(per_cpu(xen_irq_work, cpu).name);
|
||||||
|
per_cpu(xen_irq_work, cpu).name = NULL;
|
||||||
if (per_cpu(xen_irq_work, cpu).irq >= 0) {
|
if (per_cpu(xen_irq_work, cpu).irq >= 0) {
|
||||||
unbind_from_irqhandler(per_cpu(xen_irq_work, cpu).irq, NULL);
|
unbind_from_irqhandler(per_cpu(xen_irq_work, cpu).irq, NULL);
|
||||||
per_cpu(xen_irq_work, cpu).irq = -1;
|
per_cpu(xen_irq_work, cpu).irq = -1;
|
||||||
kfree(per_cpu(xen_irq_work, cpu).name);
|
|
||||||
per_cpu(xen_irq_work, cpu).name = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
kfree(per_cpu(xen_pmu_irq, cpu).name);
|
||||||
|
per_cpu(xen_pmu_irq, cpu).name = NULL;
|
||||||
if (per_cpu(xen_pmu_irq, cpu).irq >= 0) {
|
if (per_cpu(xen_pmu_irq, cpu).irq >= 0) {
|
||||||
unbind_from_irqhandler(per_cpu(xen_pmu_irq, cpu).irq, NULL);
|
unbind_from_irqhandler(per_cpu(xen_pmu_irq, cpu).irq, NULL);
|
||||||
per_cpu(xen_pmu_irq, cpu).irq = -1;
|
per_cpu(xen_pmu_irq, cpu).irq = -1;
|
||||||
kfree(per_cpu(xen_pmu_irq, cpu).name);
|
|
||||||
per_cpu(xen_pmu_irq, cpu).name = NULL;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -119,6 +119,7 @@ int xen_smp_intr_init_pv(unsigned int cpu)
|
|||||||
char *callfunc_name, *pmu_name;
|
char *callfunc_name, *pmu_name;
|
||||||
|
|
||||||
callfunc_name = kasprintf(GFP_KERNEL, "irqwork%d", cpu);
|
callfunc_name = kasprintf(GFP_KERNEL, "irqwork%d", cpu);
|
||||||
|
per_cpu(xen_irq_work, cpu).name = callfunc_name;
|
||||||
rc = bind_ipi_to_irqhandler(XEN_IRQ_WORK_VECTOR,
|
rc = bind_ipi_to_irqhandler(XEN_IRQ_WORK_VECTOR,
|
||||||
cpu,
|
cpu,
|
||||||
xen_irq_work_interrupt,
|
xen_irq_work_interrupt,
|
||||||
@ -128,10 +129,10 @@ int xen_smp_intr_init_pv(unsigned int cpu)
|
|||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
per_cpu(xen_irq_work, cpu).irq = rc;
|
per_cpu(xen_irq_work, cpu).irq = rc;
|
||||||
per_cpu(xen_irq_work, cpu).name = callfunc_name;
|
|
||||||
|
|
||||||
if (is_xen_pmu) {
|
if (is_xen_pmu) {
|
||||||
pmu_name = kasprintf(GFP_KERNEL, "pmu%d", cpu);
|
pmu_name = kasprintf(GFP_KERNEL, "pmu%d", cpu);
|
||||||
|
per_cpu(xen_pmu_irq, cpu).name = pmu_name;
|
||||||
rc = bind_virq_to_irqhandler(VIRQ_XENPMU, cpu,
|
rc = bind_virq_to_irqhandler(VIRQ_XENPMU, cpu,
|
||||||
xen_pmu_irq_handler,
|
xen_pmu_irq_handler,
|
||||||
IRQF_PERCPU|IRQF_NOBALANCING,
|
IRQF_PERCPU|IRQF_NOBALANCING,
|
||||||
@ -139,7 +140,6 @@ int xen_smp_intr_init_pv(unsigned int cpu)
|
|||||||
if (rc < 0)
|
if (rc < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
per_cpu(xen_pmu_irq, cpu).irq = rc;
|
per_cpu(xen_pmu_irq, cpu).irq = rc;
|
||||||
per_cpu(xen_pmu_irq, cpu).name = pmu_name;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -75,6 +75,7 @@ void xen_init_lock_cpu(int cpu)
|
|||||||
cpu, per_cpu(lock_kicker_irq, cpu));
|
cpu, per_cpu(lock_kicker_irq, cpu));
|
||||||
|
|
||||||
name = kasprintf(GFP_KERNEL, "spinlock%d", cpu);
|
name = kasprintf(GFP_KERNEL, "spinlock%d", cpu);
|
||||||
|
per_cpu(irq_name, cpu) = name;
|
||||||
irq = bind_ipi_to_irqhandler(XEN_SPIN_UNLOCK_VECTOR,
|
irq = bind_ipi_to_irqhandler(XEN_SPIN_UNLOCK_VECTOR,
|
||||||
cpu,
|
cpu,
|
||||||
dummy_handler,
|
dummy_handler,
|
||||||
@ -85,7 +86,6 @@ void xen_init_lock_cpu(int cpu)
|
|||||||
if (irq >= 0) {
|
if (irq >= 0) {
|
||||||
disable_irq(irq); /* make sure it's never delivered */
|
disable_irq(irq); /* make sure it's never delivered */
|
||||||
per_cpu(lock_kicker_irq, cpu) = irq;
|
per_cpu(lock_kicker_irq, cpu) = irq;
|
||||||
per_cpu(irq_name, cpu) = name;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
printk("cpu %d spinlock event irq %d\n", cpu, irq);
|
printk("cpu %d spinlock event irq %d\n", cpu, irq);
|
||||||
@ -98,6 +98,8 @@ void xen_uninit_lock_cpu(int cpu)
|
|||||||
if (!xen_pvspin)
|
if (!xen_pvspin)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
kfree(per_cpu(irq_name, cpu));
|
||||||
|
per_cpu(irq_name, cpu) = NULL;
|
||||||
/*
|
/*
|
||||||
* When booting the kernel with 'mitigations=auto,nosmt', the secondary
|
* When booting the kernel with 'mitigations=auto,nosmt', the secondary
|
||||||
* CPUs are not activated, and lock_kicker_irq is not initialized.
|
* CPUs are not activated, and lock_kicker_irq is not initialized.
|
||||||
@ -108,8 +110,6 @@ void xen_uninit_lock_cpu(int cpu)
|
|||||||
|
|
||||||
unbind_from_irqhandler(irq, NULL);
|
unbind_from_irqhandler(irq, NULL);
|
||||||
per_cpu(lock_kicker_irq, cpu) = -1;
|
per_cpu(lock_kicker_irq, cpu) = -1;
|
||||||
kfree(per_cpu(irq_name, cpu));
|
|
||||||
per_cpu(irq_name, cpu) = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
PV_CALLEE_SAVE_REGS_THUNK(xen_vcpu_stolen);
|
PV_CALLEE_SAVE_REGS_THUNK(xen_vcpu_stolen);
|
||||||
|
@ -242,7 +242,7 @@ static int blk_mq_register_hctx(struct blk_mq_hw_ctx *hctx)
|
|||||||
{
|
{
|
||||||
struct request_queue *q = hctx->queue;
|
struct request_queue *q = hctx->queue;
|
||||||
struct blk_mq_ctx *ctx;
|
struct blk_mq_ctx *ctx;
|
||||||
int i, ret;
|
int i, j, ret;
|
||||||
|
|
||||||
if (!hctx->nr_ctx)
|
if (!hctx->nr_ctx)
|
||||||
return 0;
|
return 0;
|
||||||
@ -254,9 +254,16 @@ static int blk_mq_register_hctx(struct blk_mq_hw_ctx *hctx)
|
|||||||
hctx_for_each_ctx(hctx, ctx, i) {
|
hctx_for_each_ctx(hctx, ctx, i) {
|
||||||
ret = kobject_add(&ctx->kobj, &hctx->kobj, "cpu%u", ctx->cpu);
|
ret = kobject_add(&ctx->kobj, &hctx->kobj, "cpu%u", ctx->cpu);
|
||||||
if (ret)
|
if (ret)
|
||||||
break;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
out:
|
||||||
|
hctx_for_each_ctx(hctx, ctx, j) {
|
||||||
|
if (j < i)
|
||||||
|
kobject_del(&ctx->kobj);
|
||||||
|
}
|
||||||
|
kobject_del(&hctx->kobj);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -68,11 +68,12 @@ struct aead_instance_ctx {
|
|||||||
|
|
||||||
struct cryptd_skcipher_ctx {
|
struct cryptd_skcipher_ctx {
|
||||||
refcount_t refcnt;
|
refcount_t refcnt;
|
||||||
struct crypto_sync_skcipher *child;
|
struct crypto_skcipher *child;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct cryptd_skcipher_request_ctx {
|
struct cryptd_skcipher_request_ctx {
|
||||||
crypto_completion_t complete;
|
crypto_completion_t complete;
|
||||||
|
struct skcipher_request req;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct cryptd_hash_ctx {
|
struct cryptd_hash_ctx {
|
||||||
@ -227,13 +228,13 @@ static int cryptd_skcipher_setkey(struct crypto_skcipher *parent,
|
|||||||
const u8 *key, unsigned int keylen)
|
const u8 *key, unsigned int keylen)
|
||||||
{
|
{
|
||||||
struct cryptd_skcipher_ctx *ctx = crypto_skcipher_ctx(parent);
|
struct cryptd_skcipher_ctx *ctx = crypto_skcipher_ctx(parent);
|
||||||
struct crypto_sync_skcipher *child = ctx->child;
|
struct crypto_skcipher *child = ctx->child;
|
||||||
|
|
||||||
crypto_sync_skcipher_clear_flags(child, CRYPTO_TFM_REQ_MASK);
|
crypto_skcipher_clear_flags(child, CRYPTO_TFM_REQ_MASK);
|
||||||
crypto_sync_skcipher_set_flags(child,
|
crypto_skcipher_set_flags(child,
|
||||||
crypto_skcipher_get_flags(parent) &
|
crypto_skcipher_get_flags(parent) &
|
||||||
CRYPTO_TFM_REQ_MASK);
|
CRYPTO_TFM_REQ_MASK);
|
||||||
return crypto_sync_skcipher_setkey(child, key, keylen);
|
return crypto_skcipher_setkey(child, key, keylen);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cryptd_skcipher_complete(struct skcipher_request *req, int err)
|
static void cryptd_skcipher_complete(struct skcipher_request *req, int err)
|
||||||
@ -258,13 +259,13 @@ static void cryptd_skcipher_encrypt(struct crypto_async_request *base,
|
|||||||
struct cryptd_skcipher_request_ctx *rctx = skcipher_request_ctx(req);
|
struct cryptd_skcipher_request_ctx *rctx = skcipher_request_ctx(req);
|
||||||
struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
|
struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
|
||||||
struct cryptd_skcipher_ctx *ctx = crypto_skcipher_ctx(tfm);
|
struct cryptd_skcipher_ctx *ctx = crypto_skcipher_ctx(tfm);
|
||||||
struct crypto_sync_skcipher *child = ctx->child;
|
struct skcipher_request *subreq = &rctx->req;
|
||||||
SYNC_SKCIPHER_REQUEST_ON_STACK(subreq, child);
|
struct crypto_skcipher *child = ctx->child;
|
||||||
|
|
||||||
if (unlikely(err == -EINPROGRESS))
|
if (unlikely(err == -EINPROGRESS))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
skcipher_request_set_sync_tfm(subreq, child);
|
skcipher_request_set_tfm(subreq, child);
|
||||||
skcipher_request_set_callback(subreq, CRYPTO_TFM_REQ_MAY_SLEEP,
|
skcipher_request_set_callback(subreq, CRYPTO_TFM_REQ_MAY_SLEEP,
|
||||||
NULL, NULL);
|
NULL, NULL);
|
||||||
skcipher_request_set_crypt(subreq, req->src, req->dst, req->cryptlen,
|
skcipher_request_set_crypt(subreq, req->src, req->dst, req->cryptlen,
|
||||||
@ -286,13 +287,13 @@ static void cryptd_skcipher_decrypt(struct crypto_async_request *base,
|
|||||||
struct cryptd_skcipher_request_ctx *rctx = skcipher_request_ctx(req);
|
struct cryptd_skcipher_request_ctx *rctx = skcipher_request_ctx(req);
|
||||||
struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
|
struct crypto_skcipher *tfm = crypto_skcipher_reqtfm(req);
|
||||||
struct cryptd_skcipher_ctx *ctx = crypto_skcipher_ctx(tfm);
|
struct cryptd_skcipher_ctx *ctx = crypto_skcipher_ctx(tfm);
|
||||||
struct crypto_sync_skcipher *child = ctx->child;
|
struct skcipher_request *subreq = &rctx->req;
|
||||||
SYNC_SKCIPHER_REQUEST_ON_STACK(subreq, child);
|
struct crypto_skcipher *child = ctx->child;
|
||||||
|
|
||||||
if (unlikely(err == -EINPROGRESS))
|
if (unlikely(err == -EINPROGRESS))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
skcipher_request_set_sync_tfm(subreq, child);
|
skcipher_request_set_tfm(subreq, child);
|
||||||
skcipher_request_set_callback(subreq, CRYPTO_TFM_REQ_MAY_SLEEP,
|
skcipher_request_set_callback(subreq, CRYPTO_TFM_REQ_MAY_SLEEP,
|
||||||
NULL, NULL);
|
NULL, NULL);
|
||||||
skcipher_request_set_crypt(subreq, req->src, req->dst, req->cryptlen,
|
skcipher_request_set_crypt(subreq, req->src, req->dst, req->cryptlen,
|
||||||
@ -343,9 +344,10 @@ static int cryptd_skcipher_init_tfm(struct crypto_skcipher *tfm)
|
|||||||
if (IS_ERR(cipher))
|
if (IS_ERR(cipher))
|
||||||
return PTR_ERR(cipher);
|
return PTR_ERR(cipher);
|
||||||
|
|
||||||
ctx->child = (struct crypto_sync_skcipher *)cipher;
|
ctx->child = cipher;
|
||||||
crypto_skcipher_set_reqsize(
|
crypto_skcipher_set_reqsize(
|
||||||
tfm, sizeof(struct cryptd_skcipher_request_ctx));
|
tfm, sizeof(struct cryptd_skcipher_request_ctx) +
|
||||||
|
crypto_skcipher_reqsize(cipher));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -353,7 +355,7 @@ static void cryptd_skcipher_exit_tfm(struct crypto_skcipher *tfm)
|
|||||||
{
|
{
|
||||||
struct cryptd_skcipher_ctx *ctx = crypto_skcipher_ctx(tfm);
|
struct cryptd_skcipher_ctx *ctx = crypto_skcipher_ctx(tfm);
|
||||||
|
|
||||||
crypto_free_sync_skcipher(ctx->child);
|
crypto_free_skcipher(ctx->child);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cryptd_skcipher_free(struct skcipher_instance *inst)
|
static void cryptd_skcipher_free(struct skcipher_instance *inst)
|
||||||
@ -931,7 +933,7 @@ struct crypto_skcipher *cryptd_skcipher_child(struct cryptd_skcipher *tfm)
|
|||||||
{
|
{
|
||||||
struct cryptd_skcipher_ctx *ctx = crypto_skcipher_ctx(&tfm->base);
|
struct cryptd_skcipher_ctx *ctx = crypto_skcipher_ctx(&tfm->base);
|
||||||
|
|
||||||
return &ctx->child->base;
|
return ctx->child;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(cryptd_skcipher_child);
|
EXPORT_SYMBOL_GPL(cryptd_skcipher_child);
|
||||||
|
|
||||||
|
@ -1282,15 +1282,6 @@ static void test_mb_skcipher_speed(const char *algo, int enc, int secs,
|
|||||||
goto out_free_tfm;
|
goto out_free_tfm;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
for (i = 0; i < num_mb; ++i)
|
|
||||||
if (testmgr_alloc_buf(data[i].xbuf)) {
|
|
||||||
while (i--)
|
|
||||||
testmgr_free_buf(data[i].xbuf);
|
|
||||||
goto out_free_tfm;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
for (i = 0; i < num_mb; ++i) {
|
for (i = 0; i < num_mb; ++i) {
|
||||||
data[i].req = skcipher_request_alloc(tfm, GFP_KERNEL);
|
data[i].req = skcipher_request_alloc(tfm, GFP_KERNEL);
|
||||||
if (!data[i].req) {
|
if (!data[i].req) {
|
||||||
|
@ -517,7 +517,7 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread,
|
|||||||
info = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_evaluate_info));
|
info = ACPI_ALLOCATE_ZEROED(sizeof(struct acpi_evaluate_info));
|
||||||
if (!info) {
|
if (!info) {
|
||||||
status = AE_NO_MEMORY;
|
status = AE_NO_MEMORY;
|
||||||
goto cleanup;
|
goto pop_walk_state;
|
||||||
}
|
}
|
||||||
|
|
||||||
info->parameters = &this_walk_state->operands[0];
|
info->parameters = &this_walk_state->operands[0];
|
||||||
@ -529,7 +529,7 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread,
|
|||||||
|
|
||||||
ACPI_FREE(info);
|
ACPI_FREE(info);
|
||||||
if (ACPI_FAILURE(status)) {
|
if (ACPI_FAILURE(status)) {
|
||||||
goto cleanup;
|
goto pop_walk_state;
|
||||||
}
|
}
|
||||||
|
|
||||||
next_walk_state->method_nesting_depth =
|
next_walk_state->method_nesting_depth =
|
||||||
@ -575,6 +575,12 @@ acpi_ds_call_control_method(struct acpi_thread_state *thread,
|
|||||||
|
|
||||||
return_ACPI_STATUS(status);
|
return_ACPI_STATUS(status);
|
||||||
|
|
||||||
|
pop_walk_state:
|
||||||
|
|
||||||
|
/* On error, pop the walk state to be deleted from thread */
|
||||||
|
|
||||||
|
acpi_ds_pop_walk_state(thread);
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
|
||||||
/* On error, we must terminate the method properly */
|
/* On error, we must terminate the method properly */
|
||||||
|
@ -916,13 +916,6 @@ acpi_ut_copy_ipackage_to_ipackage(union acpi_operand_object *source_obj,
|
|||||||
status = acpi_ut_walk_package_tree(source_obj, dest_obj,
|
status = acpi_ut_walk_package_tree(source_obj, dest_obj,
|
||||||
acpi_ut_copy_ielement_to_ielement,
|
acpi_ut_copy_ielement_to_ielement,
|
||||||
walk_state);
|
walk_state);
|
||||||
if (ACPI_FAILURE(status)) {
|
|
||||||
|
|
||||||
/* On failure, delete the destination package object */
|
|
||||||
|
|
||||||
acpi_ut_remove_reference(dest_obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
return_ACPI_STATUS(status);
|
return_ACPI_STATUS(status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -83,6 +83,7 @@ enum board_ids {
|
|||||||
static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
|
static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent);
|
||||||
static void ahci_remove_one(struct pci_dev *dev);
|
static void ahci_remove_one(struct pci_dev *dev);
|
||||||
static void ahci_shutdown_one(struct pci_dev *dev);
|
static void ahci_shutdown_one(struct pci_dev *dev);
|
||||||
|
static void ahci_intel_pcs_quirk(struct pci_dev *pdev, struct ahci_host_priv *hpriv);
|
||||||
static int ahci_vt8251_hardreset(struct ata_link *link, unsigned int *class,
|
static int ahci_vt8251_hardreset(struct ata_link *link, unsigned int *class,
|
||||||
unsigned long deadline);
|
unsigned long deadline);
|
||||||
static int ahci_avn_hardreset(struct ata_link *link, unsigned int *class,
|
static int ahci_avn_hardreset(struct ata_link *link, unsigned int *class,
|
||||||
@ -664,6 +665,25 @@ static void ahci_pci_save_initial_config(struct pci_dev *pdev,
|
|||||||
ahci_save_initial_config(&pdev->dev, hpriv);
|
ahci_save_initial_config(&pdev->dev, hpriv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int ahci_pci_reset_controller(struct ata_host *host)
|
||||||
|
{
|
||||||
|
struct pci_dev *pdev = to_pci_dev(host->dev);
|
||||||
|
struct ahci_host_priv *hpriv = host->private_data;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
rc = ahci_reset_controller(host);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If platform firmware failed to enable ports, try to enable
|
||||||
|
* them here.
|
||||||
|
*/
|
||||||
|
ahci_intel_pcs_quirk(pdev, hpriv);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void ahci_pci_init_controller(struct ata_host *host)
|
static void ahci_pci_init_controller(struct ata_host *host)
|
||||||
{
|
{
|
||||||
struct ahci_host_priv *hpriv = host->private_data;
|
struct ahci_host_priv *hpriv = host->private_data;
|
||||||
@ -865,7 +885,7 @@ static int ahci_pci_device_runtime_resume(struct device *dev)
|
|||||||
struct ata_host *host = pci_get_drvdata(pdev);
|
struct ata_host *host = pci_get_drvdata(pdev);
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
rc = ahci_reset_controller(host);
|
rc = ahci_pci_reset_controller(host);
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
ahci_pci_init_controller(host);
|
ahci_pci_init_controller(host);
|
||||||
@ -900,7 +920,7 @@ static int ahci_pci_device_resume(struct device *dev)
|
|||||||
ahci_mcp89_apple_enable(pdev);
|
ahci_mcp89_apple_enable(pdev);
|
||||||
|
|
||||||
if (pdev->dev.power.power_state.event == PM_EVENT_SUSPEND) {
|
if (pdev->dev.power.power_state.event == PM_EVENT_SUSPEND) {
|
||||||
rc = ahci_reset_controller(host);
|
rc = ahci_pci_reset_controller(host);
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
@ -1785,12 +1805,6 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||||||
/* save initial config */
|
/* save initial config */
|
||||||
ahci_pci_save_initial_config(pdev, hpriv);
|
ahci_pci_save_initial_config(pdev, hpriv);
|
||||||
|
|
||||||
/*
|
|
||||||
* If platform firmware failed to enable ports, try to enable
|
|
||||||
* them here.
|
|
||||||
*/
|
|
||||||
ahci_intel_pcs_quirk(pdev, hpriv);
|
|
||||||
|
|
||||||
/* prepare host */
|
/* prepare host */
|
||||||
if (hpriv->cap & HOST_CAP_NCQ) {
|
if (hpriv->cap & HOST_CAP_NCQ) {
|
||||||
pi.flags |= ATA_FLAG_NCQ;
|
pi.flags |= ATA_FLAG_NCQ;
|
||||||
@ -1900,7 +1914,7 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
rc = ahci_reset_controller(host);
|
rc = ahci_pci_reset_controller(host);
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
|
@ -135,12 +135,12 @@ static void ixp4xx_setup_port(struct ata_port *ap,
|
|||||||
|
|
||||||
static int ixp4xx_pata_probe(struct platform_device *pdev)
|
static int ixp4xx_pata_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
unsigned int irq;
|
|
||||||
struct resource *cs0, *cs1;
|
struct resource *cs0, *cs1;
|
||||||
struct ata_host *host;
|
struct ata_host *host;
|
||||||
struct ata_port *ap;
|
struct ata_port *ap;
|
||||||
struct ixp4xx_pata_data *data = dev_get_platdata(&pdev->dev);
|
struct ixp4xx_pata_data *data = dev_get_platdata(&pdev->dev);
|
||||||
int ret;
|
int ret;
|
||||||
|
int irq;
|
||||||
|
|
||||||
cs0 = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
cs0 = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||||
cs1 = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
cs1 = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
||||||
|
@ -192,6 +192,11 @@ int __class_register(struct class *cls, struct lock_class_key *key)
|
|||||||
}
|
}
|
||||||
error = class_add_groups(class_get(cls), cls->class_groups);
|
error = class_add_groups(class_get(cls), cls->class_groups);
|
||||||
class_put(cls);
|
class_put(cls);
|
||||||
|
if (error) {
|
||||||
|
kobject_del(&cp->subsys.kobj);
|
||||||
|
kfree_const(cp->subsys.kobj.name);
|
||||||
|
kfree(cp);
|
||||||
|
}
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(__class_register);
|
EXPORT_SYMBOL_GPL(__class_register);
|
||||||
|
@ -1088,7 +1088,11 @@ static int __driver_attach(struct device *dev, void *data)
|
|||||||
return 0;
|
return 0;
|
||||||
} else if (ret < 0) {
|
} else if (ret < 0) {
|
||||||
dev_dbg(dev, "Bus failed to match device: %d\n", ret);
|
dev_dbg(dev, "Bus failed to match device: %d\n", ret);
|
||||||
return ret;
|
/*
|
||||||
|
* Driver could not match with device, but may match with
|
||||||
|
* another device on the bus.
|
||||||
|
*/
|
||||||
|
return 0;
|
||||||
} /* ret > 0 means positive match */
|
} /* ret > 0 means positive match */
|
||||||
|
|
||||||
if (driver_allows_async_probing(drv)) {
|
if (driver_allows_async_probing(drv)) {
|
||||||
|
@ -464,7 +464,10 @@ static int rpm_idle(struct device *dev, int rpmflags)
|
|||||||
/* Pending requests need to be canceled. */
|
/* Pending requests need to be canceled. */
|
||||||
dev->power.request = RPM_REQ_NONE;
|
dev->power.request = RPM_REQ_NONE;
|
||||||
|
|
||||||
if (dev->power.no_callbacks)
|
callback = RPM_GET_CALLBACK(dev, runtime_idle);
|
||||||
|
|
||||||
|
/* If no callback assume success. */
|
||||||
|
if (!callback || dev->power.no_callbacks)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
/* Carry out an asynchronous or a synchronous idle notification. */
|
/* Carry out an asynchronous or a synchronous idle notification. */
|
||||||
@ -480,10 +483,17 @@ static int rpm_idle(struct device *dev, int rpmflags)
|
|||||||
|
|
||||||
dev->power.idle_notification = true;
|
dev->power.idle_notification = true;
|
||||||
|
|
||||||
callback = RPM_GET_CALLBACK(dev, runtime_idle);
|
if (dev->power.irq_safe)
|
||||||
|
spin_unlock(&dev->power.lock);
|
||||||
|
else
|
||||||
|
spin_unlock_irq(&dev->power.lock);
|
||||||
|
|
||||||
if (callback)
|
retval = callback(dev);
|
||||||
retval = __rpm_callback(callback, dev);
|
|
||||||
|
if (dev->power.irq_safe)
|
||||||
|
spin_lock(&dev->power.lock);
|
||||||
|
else
|
||||||
|
spin_lock_irq(&dev->power.lock);
|
||||||
|
|
||||||
dev->power.idle_notification = false;
|
dev->power.idle_notification = false;
|
||||||
wake_up_all(&dev->power.wait_queue);
|
wake_up_all(&dev->power.wait_queue);
|
||||||
|
@ -2819,7 +2819,7 @@ enum drbd_ret_code drbd_create_device(struct drbd_config_context *adm_ctx, unsig
|
|||||||
|
|
||||||
if (init_submitter(device)) {
|
if (init_submitter(device)) {
|
||||||
err = ERR_NOMEM;
|
err = ERR_NOMEM;
|
||||||
goto out_idr_remove_vol;
|
goto out_idr_remove_from_resource;
|
||||||
}
|
}
|
||||||
|
|
||||||
add_disk(disk);
|
add_disk(disk);
|
||||||
@ -2836,8 +2836,6 @@ enum drbd_ret_code drbd_create_device(struct drbd_config_context *adm_ctx, unsig
|
|||||||
drbd_debugfs_device_add(device);
|
drbd_debugfs_device_add(device);
|
||||||
return NO_ERROR;
|
return NO_ERROR;
|
||||||
|
|
||||||
out_idr_remove_vol:
|
|
||||||
idr_remove(&connection->peer_devices, vnr);
|
|
||||||
out_idr_remove_from_resource:
|
out_idr_remove_from_resource:
|
||||||
for_each_connection_safe(connection, n, resource) {
|
for_each_connection_safe(connection, n, resource) {
|
||||||
peer_device = idr_remove(&connection->peer_devices, vnr);
|
peer_device = idr_remove(&connection->peer_devices, vnr);
|
||||||
|
@ -661,13 +661,13 @@ static inline void btusb_free_frags(struct btusb_data *data)
|
|||||||
|
|
||||||
spin_lock_irqsave(&data->rxlock, flags);
|
spin_lock_irqsave(&data->rxlock, flags);
|
||||||
|
|
||||||
kfree_skb(data->evt_skb);
|
dev_kfree_skb_irq(data->evt_skb);
|
||||||
data->evt_skb = NULL;
|
data->evt_skb = NULL;
|
||||||
|
|
||||||
kfree_skb(data->acl_skb);
|
dev_kfree_skb_irq(data->acl_skb);
|
||||||
data->acl_skb = NULL;
|
data->acl_skb = NULL;
|
||||||
|
|
||||||
kfree_skb(data->sco_skb);
|
dev_kfree_skb_irq(data->sco_skb);
|
||||||
data->sco_skb = NULL;
|
data->sco_skb = NULL;
|
||||||
|
|
||||||
spin_unlock_irqrestore(&data->rxlock, flags);
|
spin_unlock_irqrestore(&data->rxlock, flags);
|
||||||
|
@ -378,7 +378,7 @@ static void bcsp_pkt_cull(struct bcsp_struct *bcsp)
|
|||||||
i++;
|
i++;
|
||||||
|
|
||||||
__skb_unlink(skb, &bcsp->unack);
|
__skb_unlink(skb, &bcsp->unack);
|
||||||
kfree_skb(skb);
|
dev_kfree_skb_irq(skb);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (skb_queue_empty(&bcsp->unack))
|
if (skb_queue_empty(&bcsp->unack))
|
||||||
|
@ -299,7 +299,7 @@ static void h5_pkt_cull(struct h5 *h5)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
__skb_unlink(skb, &h5->unack);
|
__skb_unlink(skb, &h5->unack);
|
||||||
kfree_skb(skb);
|
dev_kfree_skb_irq(skb);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (skb_queue_empty(&h5->unack))
|
if (skb_queue_empty(&h5->unack))
|
||||||
|
@ -345,7 +345,7 @@ static int ll_enqueue(struct hci_uart *hu, struct sk_buff *skb)
|
|||||||
default:
|
default:
|
||||||
BT_ERR("illegal hcill state: %ld (losing packet)",
|
BT_ERR("illegal hcill state: %ld (losing packet)",
|
||||||
ll->hcill_state);
|
ll->hcill_state);
|
||||||
kfree_skb(skb);
|
dev_kfree_skb_irq(skb);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -905,7 +905,7 @@ static int qca_enqueue(struct hci_uart *hu, struct sk_buff *skb)
|
|||||||
default:
|
default:
|
||||||
BT_ERR("Illegal tx state: %d (losing packet)",
|
BT_ERR("Illegal tx state: %d (losing packet)",
|
||||||
qca->tx_ibs_state);
|
qca->tx_ibs_state);
|
||||||
kfree_skb(skb);
|
dev_kfree_skb_irq(skb);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -143,15 +143,19 @@ static int __init mod_init(void)
|
|||||||
found:
|
found:
|
||||||
err = pci_read_config_dword(pdev, 0x58, &pmbase);
|
err = pci_read_config_dword(pdev, 0x58, &pmbase);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
goto put_dev;
|
||||||
|
|
||||||
pmbase &= 0x0000FF00;
|
pmbase &= 0x0000FF00;
|
||||||
if (pmbase == 0)
|
if (pmbase == 0) {
|
||||||
return -EIO;
|
err = -EIO;
|
||||||
|
goto put_dev;
|
||||||
|
}
|
||||||
|
|
||||||
priv = kzalloc(sizeof(*priv), GFP_KERNEL);
|
priv = kzalloc(sizeof(*priv), GFP_KERNEL);
|
||||||
if (!priv)
|
if (!priv) {
|
||||||
return -ENOMEM;
|
err = -ENOMEM;
|
||||||
|
goto put_dev;
|
||||||
|
}
|
||||||
|
|
||||||
if (!request_region(pmbase + PMBASE_OFFSET, PMBASE_SIZE, DRV_NAME)) {
|
if (!request_region(pmbase + PMBASE_OFFSET, PMBASE_SIZE, DRV_NAME)) {
|
||||||
dev_err(&pdev->dev, DRV_NAME " region 0x%x already in use!\n",
|
dev_err(&pdev->dev, DRV_NAME " region 0x%x already in use!\n",
|
||||||
@ -185,6 +189,8 @@ static int __init mod_init(void)
|
|||||||
release_region(pmbase + PMBASE_OFFSET, PMBASE_SIZE);
|
release_region(pmbase + PMBASE_OFFSET, PMBASE_SIZE);
|
||||||
out:
|
out:
|
||||||
kfree(priv);
|
kfree(priv);
|
||||||
|
put_dev:
|
||||||
|
pci_dev_put(pdev);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -200,6 +206,8 @@ static void __exit mod_exit(void)
|
|||||||
|
|
||||||
release_region(priv->pmbase + PMBASE_OFFSET, PMBASE_SIZE);
|
release_region(priv->pmbase + PMBASE_OFFSET, PMBASE_SIZE);
|
||||||
|
|
||||||
|
pci_dev_put(priv->pcidev);
|
||||||
|
|
||||||
kfree(priv);
|
kfree(priv);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -51,6 +51,10 @@ static const struct pci_device_id pci_tbl[] = {
|
|||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(pci, pci_tbl);
|
MODULE_DEVICE_TABLE(pci, pci_tbl);
|
||||||
|
|
||||||
|
struct amd_geode_priv {
|
||||||
|
struct pci_dev *pcidev;
|
||||||
|
void __iomem *membase;
|
||||||
|
};
|
||||||
|
|
||||||
static int geode_rng_data_read(struct hwrng *rng, u32 *data)
|
static int geode_rng_data_read(struct hwrng *rng, u32 *data)
|
||||||
{
|
{
|
||||||
@ -90,6 +94,7 @@ static int __init mod_init(void)
|
|||||||
const struct pci_device_id *ent;
|
const struct pci_device_id *ent;
|
||||||
void __iomem *mem;
|
void __iomem *mem;
|
||||||
unsigned long rng_base;
|
unsigned long rng_base;
|
||||||
|
struct amd_geode_priv *priv;
|
||||||
|
|
||||||
for_each_pci_dev(pdev) {
|
for_each_pci_dev(pdev) {
|
||||||
ent = pci_match_id(pci_tbl, pdev);
|
ent = pci_match_id(pci_tbl, pdev);
|
||||||
@ -97,17 +102,26 @@ static int __init mod_init(void)
|
|||||||
goto found;
|
goto found;
|
||||||
}
|
}
|
||||||
/* Device not found. */
|
/* Device not found. */
|
||||||
goto out;
|
return err;
|
||||||
|
|
||||||
found:
|
found:
|
||||||
|
priv = kzalloc(sizeof(*priv), GFP_KERNEL);
|
||||||
|
if (!priv) {
|
||||||
|
err = -ENOMEM;
|
||||||
|
goto put_dev;
|
||||||
|
}
|
||||||
|
|
||||||
rng_base = pci_resource_start(pdev, 0);
|
rng_base = pci_resource_start(pdev, 0);
|
||||||
if (rng_base == 0)
|
if (rng_base == 0)
|
||||||
goto out;
|
goto free_priv;
|
||||||
err = -ENOMEM;
|
err = -ENOMEM;
|
||||||
mem = ioremap(rng_base, 0x58);
|
mem = ioremap(rng_base, 0x58);
|
||||||
if (!mem)
|
if (!mem)
|
||||||
goto out;
|
goto free_priv;
|
||||||
geode_rng.priv = (unsigned long)mem;
|
|
||||||
|
geode_rng.priv = (unsigned long)priv;
|
||||||
|
priv->membase = mem;
|
||||||
|
priv->pcidev = pdev;
|
||||||
|
|
||||||
pr_info("AMD Geode RNG detected\n");
|
pr_info("AMD Geode RNG detected\n");
|
||||||
err = hwrng_register(&geode_rng);
|
err = hwrng_register(&geode_rng);
|
||||||
@ -116,20 +130,26 @@ static int __init mod_init(void)
|
|||||||
err);
|
err);
|
||||||
goto err_unmap;
|
goto err_unmap;
|
||||||
}
|
}
|
||||||
out:
|
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
err_unmap:
|
err_unmap:
|
||||||
iounmap(mem);
|
iounmap(mem);
|
||||||
goto out;
|
free_priv:
|
||||||
|
kfree(priv);
|
||||||
|
put_dev:
|
||||||
|
pci_dev_put(pdev);
|
||||||
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __exit mod_exit(void)
|
static void __exit mod_exit(void)
|
||||||
{
|
{
|
||||||
void __iomem *mem = (void __iomem *)geode_rng.priv;
|
struct amd_geode_priv *priv;
|
||||||
|
|
||||||
|
priv = (struct amd_geode_priv *)geode_rng.priv;
|
||||||
hwrng_unregister(&geode_rng);
|
hwrng_unregister(&geode_rng);
|
||||||
iounmap(mem);
|
iounmap(priv->membase);
|
||||||
|
pci_dev_put(priv->pcidev);
|
||||||
|
kfree(priv);
|
||||||
}
|
}
|
||||||
|
|
||||||
module_init(mod_init);
|
module_init(mod_init);
|
||||||
|
@ -1284,6 +1284,7 @@ static void _ipmi_destroy_user(struct ipmi_user *user)
|
|||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
struct cmd_rcvr *rcvr;
|
struct cmd_rcvr *rcvr;
|
||||||
struct cmd_rcvr *rcvrs = NULL;
|
struct cmd_rcvr *rcvrs = NULL;
|
||||||
|
struct module *owner;
|
||||||
|
|
||||||
if (!acquire_ipmi_user(user, &i)) {
|
if (!acquire_ipmi_user(user, &i)) {
|
||||||
/*
|
/*
|
||||||
@ -1345,8 +1346,9 @@ static void _ipmi_destroy_user(struct ipmi_user *user)
|
|||||||
kfree(rcvr);
|
kfree(rcvr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
owner = intf->owner;
|
||||||
kref_put(&intf->refcount, intf_free);
|
kref_put(&intf->refcount, intf_free);
|
||||||
module_put(intf->owner);
|
module_put(owner);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ipmi_destroy_user(struct ipmi_user *user)
|
int ipmi_destroy_user(struct ipmi_user *user)
|
||||||
@ -3540,12 +3542,16 @@ static void deliver_smi_err_response(struct ipmi_smi *intf,
|
|||||||
struct ipmi_smi_msg *msg,
|
struct ipmi_smi_msg *msg,
|
||||||
unsigned char err)
|
unsigned char err)
|
||||||
{
|
{
|
||||||
|
int rv;
|
||||||
msg->rsp[0] = msg->data[0] | 4;
|
msg->rsp[0] = msg->data[0] | 4;
|
||||||
msg->rsp[1] = msg->data[1];
|
msg->rsp[1] = msg->data[1];
|
||||||
msg->rsp[2] = err;
|
msg->rsp[2] = err;
|
||||||
msg->rsp_size = 3;
|
msg->rsp_size = 3;
|
||||||
/* It's an error, so it will never requeue, no need to check return. */
|
|
||||||
handle_one_recv_msg(intf, msg);
|
/* This will never requeue, but it may ask us to free the message. */
|
||||||
|
rv = handle_one_recv_msg(intf, msg);
|
||||||
|
if (rv == 0)
|
||||||
|
ipmi_free_smi_msg(msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cleanup_smi_msgs(struct ipmi_smi *intf)
|
static void cleanup_smi_msgs(struct ipmi_smi *intf)
|
||||||
|
@ -2160,6 +2160,20 @@ static int __init init_ipmi_si(void)
|
|||||||
}
|
}
|
||||||
module_init(init_ipmi_si);
|
module_init(init_ipmi_si);
|
||||||
|
|
||||||
|
static void wait_msg_processed(struct smi_info *smi_info)
|
||||||
|
{
|
||||||
|
unsigned long jiffies_now;
|
||||||
|
long time_diff;
|
||||||
|
|
||||||
|
while (smi_info->curr_msg || (smi_info->si_state != SI_NORMAL)) {
|
||||||
|
jiffies_now = jiffies;
|
||||||
|
time_diff = (((long)jiffies_now - (long)smi_info->last_timeout_jiffies)
|
||||||
|
* SI_USEC_PER_JIFFY);
|
||||||
|
smi_event_handler(smi_info, time_diff);
|
||||||
|
schedule_timeout_uninterruptible(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void shutdown_smi(void *send_info)
|
static void shutdown_smi(void *send_info)
|
||||||
{
|
{
|
||||||
struct smi_info *smi_info = send_info;
|
struct smi_info *smi_info = send_info;
|
||||||
@ -2194,16 +2208,13 @@ static void shutdown_smi(void *send_info)
|
|||||||
* in the BMC. Note that timers and CPU interrupts are off,
|
* in the BMC. Note that timers and CPU interrupts are off,
|
||||||
* so no need for locks.
|
* so no need for locks.
|
||||||
*/
|
*/
|
||||||
while (smi_info->curr_msg || (smi_info->si_state != SI_NORMAL)) {
|
wait_msg_processed(smi_info);
|
||||||
poll(smi_info);
|
|
||||||
schedule_timeout_uninterruptible(1);
|
|
||||||
}
|
|
||||||
if (smi_info->handlers)
|
if (smi_info->handlers)
|
||||||
disable_si_irq(smi_info);
|
disable_si_irq(smi_info);
|
||||||
while (smi_info->curr_msg || (smi_info->si_state != SI_NORMAL)) {
|
|
||||||
poll(smi_info);
|
wait_msg_processed(smi_info);
|
||||||
schedule_timeout_uninterruptible(1);
|
|
||||||
}
|
|
||||||
if (smi_info->handlers)
|
if (smi_info->handlers)
|
||||||
smi_info->handlers->cleanup(smi_info->si_sm);
|
smi_info->handlers->cleanup(smi_info->si_sm);
|
||||||
|
|
||||||
|
@ -90,16 +90,21 @@ int tpm_read_log_acpi(struct tpm_chip *chip)
|
|||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
if (tbl->header.length <
|
if (tbl->header.length <
|
||||||
sizeof(*tbl) + sizeof(struct acpi_tpm2_phy))
|
sizeof(*tbl) + sizeof(struct acpi_tpm2_phy)) {
|
||||||
|
acpi_put_table((struct acpi_table_header *)tbl);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
tpm2_phy = (void *)tbl + sizeof(*tbl);
|
tpm2_phy = (void *)tbl + sizeof(*tbl);
|
||||||
len = tpm2_phy->log_area_minimum_length;
|
len = tpm2_phy->log_area_minimum_length;
|
||||||
|
|
||||||
start = tpm2_phy->log_area_start_address;
|
start = tpm2_phy->log_area_start_address;
|
||||||
if (!start || !len)
|
if (!start || !len) {
|
||||||
|
acpi_put_table((struct acpi_table_header *)tbl);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
acpi_put_table((struct acpi_table_header *)tbl);
|
||||||
format = EFI_TCG2_EVENT_LOG_FORMAT_TCG_2;
|
format = EFI_TCG2_EVENT_LOG_FORMAT_TCG_2;
|
||||||
} else {
|
} else {
|
||||||
/* Find TCPA entry in RSDT (ACPI_LOGICAL_ADDRESSING) */
|
/* Find TCPA entry in RSDT (ACPI_LOGICAL_ADDRESSING) */
|
||||||
@ -120,8 +125,10 @@ int tpm_read_log_acpi(struct tpm_chip *chip)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
acpi_put_table((struct acpi_table_header *)buff);
|
||||||
format = EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2;
|
format = EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!len) {
|
if (!len) {
|
||||||
dev_warn(&chip->dev, "%s: TCPA log area empty\n", __func__);
|
dev_warn(&chip->dev, "%s: TCPA log area empty\n", __func__);
|
||||||
return -EIO;
|
return -EIO;
|
||||||
@ -156,5 +163,4 @@ int tpm_read_log_acpi(struct tpm_chip *chip)
|
|||||||
kfree(log->bios_event_log);
|
kfree(log->bios_event_log);
|
||||||
log->bios_event_log = NULL;
|
log->bios_event_log = NULL;
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -252,7 +252,7 @@ static int __crb_relinquish_locality(struct device *dev,
|
|||||||
iowrite32(CRB_LOC_CTRL_RELINQUISH, &priv->regs_h->loc_ctrl);
|
iowrite32(CRB_LOC_CTRL_RELINQUISH, &priv->regs_h->loc_ctrl);
|
||||||
if (!crb_wait_for_reg_32(&priv->regs_h->loc_state, mask, value,
|
if (!crb_wait_for_reg_32(&priv->regs_h->loc_state, mask, value,
|
||||||
TPM2_TIMEOUT_C)) {
|
TPM2_TIMEOUT_C)) {
|
||||||
dev_warn(dev, "TPM_LOC_STATE_x.requestAccess timed out\n");
|
dev_warn(dev, "TPM_LOC_STATE_x.Relinquish timed out\n");
|
||||||
return -ETIME;
|
return -ETIME;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -676,12 +676,16 @@ static int crb_acpi_add(struct acpi_device *device)
|
|||||||
|
|
||||||
/* Should the FIFO driver handle this? */
|
/* Should the FIFO driver handle this? */
|
||||||
sm = buf->start_method;
|
sm = buf->start_method;
|
||||||
if (sm == ACPI_TPM2_MEMORY_MAPPED)
|
if (sm == ACPI_TPM2_MEMORY_MAPPED) {
|
||||||
return -ENODEV;
|
rc = -ENODEV;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
priv = devm_kzalloc(dev, sizeof(struct crb_priv), GFP_KERNEL);
|
priv = devm_kzalloc(dev, sizeof(struct crb_priv), GFP_KERNEL);
|
||||||
if (!priv)
|
if (!priv) {
|
||||||
return -ENOMEM;
|
rc = -ENOMEM;
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
if (sm == ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC) {
|
if (sm == ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC) {
|
||||||
if (buf->header.length < (sizeof(*buf) + sizeof(*crb_smc))) {
|
if (buf->header.length < (sizeof(*buf) + sizeof(*crb_smc))) {
|
||||||
@ -689,7 +693,8 @@ static int crb_acpi_add(struct acpi_device *device)
|
|||||||
FW_BUG "TPM2 ACPI table has wrong size %u for start method type %d\n",
|
FW_BUG "TPM2 ACPI table has wrong size %u for start method type %d\n",
|
||||||
buf->header.length,
|
buf->header.length,
|
||||||
ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC);
|
ACPI_TPM2_COMMAND_BUFFER_WITH_ARM_SMC);
|
||||||
return -EINVAL;
|
rc = -EINVAL;
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
crb_smc = ACPI_ADD_PTR(struct tpm2_crb_smc, buf, sizeof(*buf));
|
crb_smc = ACPI_ADD_PTR(struct tpm2_crb_smc, buf, sizeof(*buf));
|
||||||
priv->smc_func_id = crb_smc->smc_func_id;
|
priv->smc_func_id = crb_smc->smc_func_id;
|
||||||
@ -700,17 +705,23 @@ static int crb_acpi_add(struct acpi_device *device)
|
|||||||
|
|
||||||
rc = crb_map_io(device, priv, buf);
|
rc = crb_map_io(device, priv, buf);
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
goto out;
|
||||||
|
|
||||||
chip = tpmm_chip_alloc(dev, &tpm_crb);
|
chip = tpmm_chip_alloc(dev, &tpm_crb);
|
||||||
if (IS_ERR(chip))
|
if (IS_ERR(chip)) {
|
||||||
return PTR_ERR(chip);
|
rc = PTR_ERR(chip);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
dev_set_drvdata(&chip->dev, priv);
|
dev_set_drvdata(&chip->dev, priv);
|
||||||
chip->acpi_dev_handle = device->handle;
|
chip->acpi_dev_handle = device->handle;
|
||||||
chip->flags = TPM_CHIP_FLAG_TPM2;
|
chip->flags = TPM_CHIP_FLAG_TPM2;
|
||||||
|
|
||||||
return tpm_chip_register(chip);
|
rc = tpm_chip_register(chip);
|
||||||
|
|
||||||
|
out:
|
||||||
|
acpi_put_table((struct acpi_table_header *)buf);
|
||||||
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int crb_acpi_remove(struct acpi_device *device)
|
static int crb_acpi_remove(struct acpi_device *device)
|
||||||
|
@ -397,7 +397,13 @@ static int __init ftpm_mod_init(void)
|
|||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
return driver_register(&ftpm_tee_driver.driver);
|
rc = driver_register(&ftpm_tee_driver.driver);
|
||||||
|
if (rc) {
|
||||||
|
platform_driver_unregister(&ftpm_tee_plat_driver);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __exit ftpm_mod_exit(void)
|
static void __exit ftpm_mod_exit(void)
|
||||||
|
@ -125,6 +125,7 @@ static int check_acpi_tpm2(struct device *dev)
|
|||||||
const struct acpi_device_id *aid = acpi_match_device(tpm_acpi_tbl, dev);
|
const struct acpi_device_id *aid = acpi_match_device(tpm_acpi_tbl, dev);
|
||||||
struct acpi_table_tpm2 *tbl;
|
struct acpi_table_tpm2 *tbl;
|
||||||
acpi_status st;
|
acpi_status st;
|
||||||
|
int ret = 0;
|
||||||
|
|
||||||
if (!aid || aid->driver_data != DEVICE_IS_TPM2)
|
if (!aid || aid->driver_data != DEVICE_IS_TPM2)
|
||||||
return 0;
|
return 0;
|
||||||
@ -132,8 +133,7 @@ static int check_acpi_tpm2(struct device *dev)
|
|||||||
/* If the ACPI TPM2 signature is matched then a global ACPI_SIG_TPM2
|
/* If the ACPI TPM2 signature is matched then a global ACPI_SIG_TPM2
|
||||||
* table is mandatory
|
* table is mandatory
|
||||||
*/
|
*/
|
||||||
st =
|
st = acpi_get_table(ACPI_SIG_TPM2, 1, (struct acpi_table_header **)&tbl);
|
||||||
acpi_get_table(ACPI_SIG_TPM2, 1, (struct acpi_table_header **)&tbl);
|
|
||||||
if (ACPI_FAILURE(st) || tbl->header.length < sizeof(*tbl)) {
|
if (ACPI_FAILURE(st) || tbl->header.length < sizeof(*tbl)) {
|
||||||
dev_err(dev, FW_BUG "failed to get TPM2 ACPI table\n");
|
dev_err(dev, FW_BUG "failed to get TPM2 ACPI table\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@ -141,9 +141,10 @@ static int check_acpi_tpm2(struct device *dev)
|
|||||||
|
|
||||||
/* The tpm2_crb driver handles this device */
|
/* The tpm2_crb driver handles this device */
|
||||||
if (tbl->start_method != ACPI_TPM2_MEMORY_MAPPED)
|
if (tbl->start_method != ACPI_TPM2_MEMORY_MAPPED)
|
||||||
return -ENODEV;
|
ret = -ENODEV;
|
||||||
|
|
||||||
return 0;
|
acpi_put_table((struct acpi_table_header *)tbl);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
static int check_acpi_tpm2(struct device *dev)
|
static int check_acpi_tpm2(struct device *dev)
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user