Merge tag 'android12-5.10.238_r00' into android12-5.10
This merges the android12-5.10.238_r00 tag into the android12-5.10 branch, catching it up with the latest LTS releases. It contains the following commits: *e294be0590Revert "ipv6: save dontfrag in cork" *a8b6c668c3UPSTREAM: tracing: Fix compilation warning on arm32 *e480b3fdd0Revert "coredump: hand a pidfd to the usermode coredump helper" *6f5b20583cRevert "tcp: bring back NUMA dispersion in inet_ehash_locks_alloc()" *2ed49dc1beMerge 5.10.238 into android12-5.10-lts |\ | *01e7e36b86Linux 5.10.238 | *3989785df0perf/arm-cmn: Initialise cmn->cpu earlier | *68afc774aaxen/swiotlb: relax alignment requirements | *4922525037platform/x86: thinkpad_acpi: Ignore battery threshold change event notification | *f71afc34c0platform/x86: fujitsu-laptop: Support Lifebook S2110 hotkeys | *de468d6ef2tpm: tis: Double the timeout B to 4s | *9757a1ceeespi: spi-sun4i: fix early activation | *f61e85f284um: let 'make clean' properly clean underlying SUBARCH as well | *d8f444f8caplatform/x86: thinkpad_acpi: Support also NEC Lavie X1475JAS | *4348aaf61dnfs: don't share pNFS DS connections between net namespaces | *ade0b6dcc3HID: quirks: Add ADATA XPG alpha wireless mouse support | *4ab90190a3coredump: hand a pidfd to the usermode coredump helper | *9b30b78f13fork: use pidfd_prepare() | *e5d92fd33fpid: add pidfd_prepare() | *3ab0b54767coredump: fix error handling for replace_fd() | *6672e6c008net_sched: hfsc: Address reentrant enqueue adding class to eltree twice | *efe1274799smb: client: Reset all search buffer pointers when releasing buffer | *a24c2f05acsmb: client: Fix use-after-free in cifs_fill_dirent | *7822843a20drm/i915/gvt: fix unterminated-string-initialization warning | *18adea7148kbuild: Disable -Wdefault-const-init-unsafe | *bf848fbbe1spi: spi-fsl-dspi: Reset SR flags before sending a new message | *795287e1f4spi: spi-fsl-dspi: Halt the module after a new message transfer | *8c210e9355spi: spi-fsl-dspi: restrict register range for regmap access | *73a782e604mm/page_alloc.c: avoid infinite retries caused by cpuset race | *78934bf97bmemcg: always call cond_resched() after fn() | *9ac75dc3b4drm/edid: fixed the bug that hdr metadata was not reset | *7a5dac0e91llc: fix data loss when reading from a socket in llc_ui_recvmsg() | *8170d8ec4eALSA: pcm: Fix race of buffer access at PCM OSS layer | *659701c0b9can: bcm: add missing rcu read protection for procfs content | *7595de7bc5can: bcm: add locking for bcm_op runtime updates | *b9ad8e50e8padata: do not leak refcount in reorder_work | *bf7bba75b9crypto: algif_hash - fix double free in hash_accept | *d42ed4de6anet/tipc: fix slab-use-after-free Read in tipc_aead_encrypt_done | *f9f593e34dsch_hfsc: Fix qlen accounting bug when using peek in hfsc_enqueue() | *181ed0f867net: dwmac-sun8i: Use parsed internal PHY address instead of 1 | *3c2e34cb52bridge: netfilter: Fix forwarding of fragmented packets | *2c0ff1ca87xfrm: Sanitize marks before insert | *b89eb56a37__legitimize_mnt(): check for MNT_SYNC_UMOUNT should be under mount_lock | *61e885ba30xenbus: Allow PVH dom0 a non-local xenstore | *a641154cedbtrfs: correct the order of prelim_ref arguments in btrfs__prelim_ref | *17e58be5b4nvmet-tcp: don't restore null sk_state_change | *daf62a66ddALSA: hda/realtek: Add quirk for HP Spectre x360 15-df1xxx | *0c55dc9863ASoC: Intel: bytcr_rt5640: Add DMI quirk for Acer Aspire SW3-013 | *f675deb457pinctrl: meson: define the pull up/down resistor value as 60 kOhm | *effa82980edrm: Add valid clones check | *c32f0eb01adrm/atomic: clarify the rules around drm_atomic_state->allow_modeset | *fa8eb4c0b4regulator: ad5398: Add device tree support | *e7c959730espi: zynqmp-gqspi: Always acknowledge interrupts | *6d41c97e80wifi: rtw88: Don't use static local variable in rtw8822b_set_tx_power_index_by_rate | *a01140e65aperf/amd/ibs: Fix perf_ibs_op.cnt_mask for CurCnt | *b9321fb28abpftool: Fix readlink usage in get_fd_type | *56797a1228drm/ast: Find VBIOS mode from regular display size | *a0a3ce634cHID: usbkbd: Fix the bit shift number for LED_KANA | *2bd08f26f0scsi: st: Restore some drive settings after reset | *8281d8f5cascsi: lpfc: Handle duplicate D_IDs in ndlp search-by D_ID routine | *af635d1651rcu: fix header guard for rcu_all_qs() | *a86bf985acrcu: handle quiescent states for PREEMPT_RCU=n, PREEMPT_COUNT=y | *87d076987avxlan: Annotate FDB data races | *28b9b430b9hwmon: (xgene-hwmon) use appropriate type for the latency value | *ab92dfb595wifi: rtw88: Fix download_firmware_validate() for RTL8814AU | *2d8b8d1d78ip: fib_rules: Fetch net from fib_rule in fib[46]_rule_configure(). | *b2e98af500net/mlx5e: reduce rep rxq depth to 256 for ECPF | *82b98272f8net/mlx5e: set the tx_queue_len for pfifo_fast | *09efd5c644net/mlx5: Extend Ethtool loopback selftest to support non-linear SKB | *244b1d6ea5drm/amd/display: Initial psr_version with correct setting | *7a951750d8phy: core: don't require set_mode() callback for phy_get_mode() to work | *422e123a1dnet/mlx4_core: Avoid impossible mlx4_db_alloc() order value | *b94053544fmedia: v4l: Memset argument to 0 before calling get_mbus_config pad op | *d68957733asmack: recognize ipv4 CIPSO w/o categories | *7340f98c4apinctrl: devicetree: do not goto err when probing hogs in pinctrl_dt_to_map | *59f527efb2ASoC: soc-dai: check return value at snd_soc_dai_set_tdm_slot() | *4ab8ae5228ASoC: tas2764: Power up/down amp on mute ops | *d1618eb1f4ASoC: ops: Enforce platform maximum on initial value | *1641049a03net/mlx5: Apply rate-limiting to high temperature warning | *622968e002net/mlx5: Modify LSB bitmask in temperature event to include only the first bit | *1072ab283fACPI: HED: Always initialize before evged | *8ae8882942PCI: Fix old_size lower bound in calculate_iosize() too | *2b1b1e1a6aeth: mlx4: don't try to complete XDP frames in netpoll | *bc3fedee24can: c_can: Use of_property_present() to test existence of DT property | *4d3cc6d4b8EDAC/ie31200: work around false positive build warning | *5bfa81539enet: pktgen: fix access outside of user given buffer in pktgen_thread_write() | *fadf35ef01wifi: rtw88: Fix rtw_desc_to_mcsrate() to handle MCS16-31 | *6b0a05ce2fwifi: rtw88: Fix rtw_init_ht_cap() for RTL8814AU | *bec2df8e1fwifi: rtw88: Fix rtw_init_vht_cap() for RTL8814AU | *19ec4d39f5scsi: mpt3sas: Send a diag reset if target reset fails | *4cb82b4998clocksource: mips-gic-timer: Enable counter when CPUs start | *407d668bc4MIPS: pm-cps: Use per-CPU variables as per-CPU, not per-core | *4660588176MIPS: Use arch specific syscall name match function | *41084946c7libbpf: Fix out-of-bound read | *2067fff722cpuidle: menu: Avoid discarding useful information | *7ef8b95ebdx86/nmi: Add an emergency handler in nmi_desc & use it in nmi_shootdown_cpus() | *c7e8e3e359soc: ti: k3-socinfo: Do not use syscon helper to build regmap | *2b2f5b7226bonding: report duplicate MAC address in all situations | *dea8bad907net: xgene-v2: remove incorrect ACPI_PTR annotation | *370e39467adrm/amdkfd: KFD release_work possible circular locking | *74dfce1fccnet/mlx5: Avoid report two health errors on same syndrome | *50fdcc4310PCI: brcmstb: Add a softdep to MIP MSI-X driver | *39df1a1172PCI: brcmstb: Expand inbound window size up to 64GB | *fe012878e5fpga: altera-cvp: Increase credit timeout | *fa6e92cd33drm/mediatek: mtk_dpi: Add checks for reg_h_fre_con existence | *889ded822bhwmon: (gpio-fan) Add missing mutex locks | *0aa2553778x86/bugs: Make spectre user default depend on MITIGATION_SPECTRE_V2 | *df4f82a77eclk: imx8mp: inform CCF of maximum frequency of clocks | *199a3c7902ipv4: fib: Move fib_valid_key_len() to rtm_to_fib_config(). | *1c9ee77919net: pktgen: fix mpls maximum labels list parsing | *9eaafc291cnet: ethernet: ti: cpsw_new: populate netdev of_node | *c28113306apinctrl: bcm281xx: Use "unsigned int" instead of bare "unsigned" | *0884dd3abbmedia: cx231xx: set device_caps for 417 | *4c8253a9acdrm/amdgpu: Do not program AGP BAR regs under SRIOV in gfxhub_v1_0.c | *341e3a5984orangefs: Do not truncate file size | *c5356a5e80dm cache: prevent BUG_ON by blocking retries on failed device resumes | *9e11ff5d4bmedia: c8sectpfe: Call of_node_put(i2c_bus) only once in c8sectpfe_probe() | *d554d682d7ARM: tegra: Switch DSI-B clock parent to PLLD on Tegra114 | *0f8663e55bieee802154: ca8210: Use proper setters and getters for bitwise types | *4dc2cd5b5frtc: ds1307: stop disabling alarms on probe | *b53d6e9525tcp: bring back NUMA dispersion in inet_ehash_locks_alloc() | *59e70d9f3cpowerpc/prom_init: Fixup missing #size-cells on PowerBook6,7 | *9c34cf83c8arm64: tegra: p2597: Fix gpio for vdd-1v8-dis regulator | *29533d1a54ipv6: save dontfrag in cork | *a068093dd5mmc: sdhci: Disable SD card clock before changing parameters | *a15de882a7arm64/mm: Check PUD_TYPE_TABLE in pud_bad() | *5fce032040netfilter: conntrack: Bound nf_conntrack sysctl writes | *b546e22245posix-timers: Add cond_resched() to posix_timer_add() search loop | *5239ba49adxen: Add support for XenServer 6.1 platform device | *7c0077d465dm: restrict dm device size to 2^63-512 bytes | *7aeb611fb1kbuild: fix argument parsing in scripts/config | *14ace52301rtc: rv3032: fix EERD location | *44a214d6d6tcp: reorganize tcp_in_ack_event() and tcp_count_delivered() | *817491f4ebscsi: st: ERASE does not change tape location | *f9f14433b5scsi: st: Tighten the page format heuristics with MODE SELECT | *a138989f05ext4: reorder capability check last | *3ca86bb3a9um: Update min_low_pfn to match changes in uml_reserved | *b282338b5aum: Store full CSGSFS and SS register from mcontext | *97b7f4b760btrfs: send: return -ENAMETOOLONG when attempting a path that is too long | *4012eb35e3btrfs: avoid linker error in btrfs_find_create_tree_block() | *af99e62d41i2c: pxa: fix call balance of i2c->clk handling routines | *05e227f6e9i2c: qup: Vote for interconnect bandwidth to DRAM | *6f45bd2823mmc: host: Wait for Vdd to settle on card power off | *396c46d3f5libnvdimm/labels: Fix divide error in nd_label_data_init() | *8429ff01e9pNFS/flexfiles: Report ENETDOWN as a connection error | *a48a00d0cftools/build: Don't pass test log files to linker | *c41492d291dql: Fix dql->limit value when reset. | *d3178bebdbthermal/drivers/qoriq: Power down TMU on system suspend | *b159705960SUNRPC: rpcbind should never reset the port to the value '0' | *e190770c92SUNRPC: rpc_clnt_set_transport() must not change the autobind setting | *abb4c308abNFSv4: Treat ENETUNREACH errors as fatal for state recovery | *2503c45e66fbdev: core: tileblit: Implement missing margin clearing for tileblit | *67c9d5b881fbcon: Use correct erase colour for clearing in fbcon | *0c65d9250ffbdev: fsl-diu-fb: add missing device_remove_file() | *415228b49cmailbox: use error ret code of of_parse_phandle_with_args() | *d76c718c1aNFSv4: Check for delegation validity in nfs_start_delegation_return_locked() | *e9fc7a2e22kconfig: merge_config: use an empty file as initfile | *6d41126116cgroup: Fix compilation issue due to cgroup_mutex not being exported | *d79d81f6f4dma-mapping: avoid potential unused data compilation warning | *2c5081439cscsi: target: iscsi: Fix timeout on deleted connection | *ba2f6ec287ice: arfs: fix use-after-free when freeing @rx_cpu_rmap | *2991dc357anetfilter: nf_tables: do not defer rule destruction via call_rcu | *558f503f70netfilter: nf_tables: wait for rcu grace period on net_device removal | *d7d4114988netfilter: nf_tables: pass nft_chain to destroy function, not nft_ctx | *9c309d2434btrfs: don't BUG_ON() when 0 reference count at btrfs_lookup_extent_info() | *526bcef2f7selftests/mm: compaction_test: support platform with huge mount of memory | *878e9cb0b0usb: typec: fix pm usage counter imbalance in ucsi_ccg_sync_control() | *627c2a5056usb: typec: fix potential array underflow in ucsi_ccg_sync_control() | *6b989ea1c4usb: typec: altmodes/displayport: create sysfs nodes as driver's default device attribute group | *9908dc0d2edrm/vmwgfx: Fix a deadlock in dma buf fence polling | *2202e87fc1ASoC: q6afe-clocks: fix reprobing of the driver | *6f37f3325aclocksource/i8253: Use raw_spinlock_irqsave() in clockevent_i8253_disable() | *d943f633acdmaengine: ti: k3-udma: Use cap_mask directly from dma_device structure instead of a local copy | *27e71fa087dmaengine: ti: k3-udma: Add missing locking | *ff0f820fa5wifi: mt76: disable napi on driver removal | *ed3e5b2db8phy: renesas: rcar-gen3-usb2: Set timing registers only once | *8d1f8e7bcdphy: Fix error handling in tegra_xusb_port_init | *253db536a7tracing: samples: Initialize trace_array_printk() with the correct function | *1980ae17c0ALSA: es1968: Add error handling for snd_pcm_hw_constraint_pow2() | *23a2008bf1ACPI: PPTT: Fix processor subtable walk | *2ef52532a4dmaengine: Revert "dmaengine: dmatest: Fix dmatest waiting less when interrupted" | *df07deddd8NFSv4/pnfs: Reset the layout state after a layoutreturn | *07b572c473qlcnic: fix memory leak in qlcnic_sriov_channel_cfg_cmd() | *0c604f8649ALSA: sh: SND_AICA should depend on SH_DMA_API | *3315894713net: dsa: sja1105: discard incoming frames in BR_STATE_LISTENING | *0772a608d7net: cadence: macb: Fix a possible deadlock in macb_halt_tx. | *ea1132ccb1net_sched: Flush gso_skb list too during ->change() | *f9a7eedd04spi: loopback-test: Do not split 1024-byte hexdumps | *4c189fd40anfs: handle failure of nfs_get_lock_context in unlock path | *3a3b73e135RDMA/rxe: Fix slab-use-after-free Read in rxe_queue_cleanup bug | *3a0b85edfeiio: chemical: sps30: use aligned_s64 for timestamp | *968a9c8792iio: adc: ad7768-1: Fix insufficient alignment of timestamp. | *15e59d31bcplatform/x86: asus-wmi: Fix wlan_ctrl_by_user detection | *32235dd3e7do_umount(): add missing barrier before refcount checks in sync case | *97cb96f32bnvme: unblock ctrl state transition for firmware update | *45df326b06drm/panel: simple: Update timings for AUO G101EVN010 | *6237cedff8MIPS: Fix MAX_REG_OFFSET | *93e7a50c42iio: adc: dln2: Use aligned_s64 for timestamp | *90ca39f915types: Complement the aligned types with signed 64-bit one | *72ae71167eusb: usbtmc: Fix erroneous generic_read ioctl return | *5f157004f2usb: usbtmc: Fix erroneous wait_srq ioctl return | *8394408597usb: usbtmc: Fix erroneous get_stb ioctl error returns | *b92fd2945eUSB: usbtmc: use interruptible sleep in usbtmc_read | *a9931f1b52usb: typec: ucsi: displayport: Fix NULL pointer access | *40ebc380c3usb: typec: tcpm: delay SNK_TRY_WAIT_DEBOUNCE to SRC_TRYWAIT transition | *a60bff6f40usb: host: tegra: Prevent host controller crash when OTG port is used | *8773ff720fusb: gadget: tegra-xudc: ACK ST_RC after clearing CTRL_RUN | *35f4785d41ocfs2: stop quota recovery before disabling quotas | *6633b3c921ocfs2: implement handshaking with ocfs2 recovery thread | *0460e4a34aocfs2: switch osb->disable_recovery to enum | *a63d998735module: ensure that kobject_put() is safe for module type kobjects | *f1bcac367bxenbus: Use kref to track req lifetime | *2aef06fa35usb: uhci-platform: Make the clock really optional | *76727a1d81iio: imu: st_lsm6dsx: fix possible lockup in st_lsm6dsx_read_tagged_fifo | *84e39f628aiio: imu: st_lsm6dsx: fix possible lockup in st_lsm6dsx_read_fifo | *6d3cc4993biio: adis16201: Correct inclinometer channel resolution | *e971961fcfiio: adc: ad7606: fix serial register access | *a9e535c551staging: axis-fifo: Correct handling of tx_fifo_depth for size validation | *fabbfa8551staging: axis-fifo: Remove hardware resets for user errors | *687ea9fbfestaging: iio: adc: ad7816: Correct conditional logic for store mode | *e9ce70e6abInput: synaptics - enable InterTouch on TUXEDO InfinityBook Pro 14 v5 | *326b1dc20eInput: synaptics - enable SMBus for HP Elitebook 850 G1 | *121a7ea81fInput: synaptics - enable InterTouch on Dell Precision M3800 | *22978ae200Input: synaptics - enable InterTouch on Dynabook Portege X30L-G | *d3402d706fInput: synaptics - enable InterTouch on Dynabook Portege X30-D | *7ef9543173net: dsa: b53: fix learning on VLAN unaware bridges | *4eb585c849net: dsa: b53: fix VLAN ID for untagged vlan on bridge leave | *bb7d26fe2bnet: dsa: b53: allow leaky reserved multicast | *226ce0ec38netfilter: ipset: fix region locking in hash types | *d2f7cc2fc2can: gw: fix RCU/BH usage in cgw_create_job() | *6753820baercu/kvfree: Add kvfree_rcu_mightsleep() and kfree_rcu_mightsleep() | *2b2a4a70b3can: gw: use call_rcu() instead of costly synchronize_rcu() | *06b4f110c7openvswitch: Fix unsafe attribute parsing in output_userspace() | *cfac711e22can: mcp251xfd: mcp251xfd_remove(): fix order of unregistration calls | *d8e6a27e92scsi: target: Fix WRITE_SAME No Data Buffer crash | *e237776efadm: fix copying after src array boundaries | *049feaeb25usb: chipidea: ci_hdrc_imx: implement usb_phy_init() error handling | *bd67fa76f5usb: chipidea: ci_hdrc_imx: use dev_err_probe() | *b63de43af8irqchip/gic-v2m: Prevent use after free of gicv2m_get_fwnode() | *6c114cb439irqchip/gic-v2m: Mark a few functions __init | *5028b86e38irqchip/gic-v2m: Add const to of_device_id | *22d26ee255Revert "drm/meson: vclk: fix calculation of 59.94 fractional rates" | *733e62786bof: module: add buffer overflow check in of_modalias() | *ca3cd03472PCI: imx6: Skip controller_id generation logic for i.MX7D | *7acce3dc26net: fec: ERR007885 Workaround for conventional TX | *6c65ee5ad6net: lan743x: Fix memleak issue when GSO enabled | *9b4d4e2a91nvme-tcp: fix premature queue removal and I/O failover | *6305ad7aa3bnxt_en: Fix ethtool -d byte order for 32-bit values | *a7ee67aa84net: ipv6: fix UDPv6 GSO segmentation with NAT | *babc30868enet: dlink: Correct endianness handling of led_mode | *005a479540net_sched: qfq: Fix double list add in class with netem as child qdisc | *24388ba0a1net_sched: ets: Fix double list add in class with netem as child qdisc | *e0cf8ee23enet_sched: hfsc: Fix a UAF vulnerability in class with netem as child qdisc | *4b07ac06b0net_sched: drr: Fix double list add in class with netem as child qdisc | *7c26b2782cnet/mlx5: E-switch, Fix error handling for enabling roce | *8e8923c988net/mlx5: Remove return statement exist at the end of void function | *f8f80bf672net/mlx5: E-Switch, Initialize MAC Address for Default GID | *0117fe0a46net/sched: act_mirred: don't override retval if we already lost the skb | *665ce42104tracing: Fix oob write in trace_seq_to_buffer() | *b8a7af2c41iommu/vt-d: Apply quirk_iommu_igfx for 8086:0044 (QM57/QS57) | *a65ebfed65iommu/amd: Fix potential buffer overflow in parse_ivrs_acpihid | *5042c27b99dm: always update the array size in realloc_argv on success | *b0a9d266ccdm-integrity: fix a warning on invalid table line | *62a4f2955dwifi: brcm80211: fmac: Add error handling for brcmf_usb_dl_writeimage() | *91588ea0e7mmc: renesas_sdhi: Fix error handling in renesas_sdhi_probe | *0164788a48amd-xgbe: Fix to ensure dependent features are toggled with RX checksum offload | *757ba4d17bparisc: Fix double SIGFPE crash | *7597abc25ci2c: imx-lpi2c: Fix clock count when probe defers | *44d3f2922eEDAC/altera: Set DDR and SDMMC interrupt mask before registration | *694c767b34EDAC/altera: Test the correct error reg offset | *39d6e889c0drm/nouveau: Fix WARN_ON in nouveau_fence_context_kill() | *f21ab478d2ALSA: usb-audio: Add second USB ID for Jabra Evolve 65 headset *0fd67944cfMerge android12-5.10 into android12-5.10-lts Change-Id: I3178f657de4b6725b3133d0360640931a093deb2 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -5224,6 +5224,8 @@
|
||||
|
||||
Selecting 'on' will also enable the mitigation
|
||||
against user space to user space task attacks.
|
||||
Selecting specific mitigation does not force enable
|
||||
user mitigations.
|
||||
|
||||
Selecting 'off' will disable both the kernel and
|
||||
the user space protections.
|
||||
|
||||
14
Makefile
14
Makefile
@@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 10
|
||||
SUBLEVEL = 237
|
||||
SUBLEVEL = 238
|
||||
EXTRAVERSION =
|
||||
NAME = Dare mighty things
|
||||
|
||||
@@ -816,6 +816,18 @@ KBUILD_CFLAGS += -Wno-gnu
|
||||
# source of a reference will be _MergedGlobals and not on of the whitelisted names.
|
||||
# See modpost pattern 2
|
||||
KBUILD_CFLAGS += -mno-global-merge
|
||||
|
||||
# Clang may emit a warning when a const variable, such as the dummy variables
|
||||
# in typecheck(), or const member of an aggregate type are not initialized,
|
||||
# which can result in unexpected behavior. However, in many audited cases of
|
||||
# the "field" variant of the warning, this is intentional because the field is
|
||||
# never used within a particular call path, the field is within a union with
|
||||
# other non-const members, or the containing object is not const so the field
|
||||
# can be modified via memcpy() / memset(). While the variable warning also gets
|
||||
# disabled with this same switch, there should not be too much coverage lost
|
||||
# because -Wuninitialized will still flag when an uninitialized const variable
|
||||
# is used.
|
||||
KBUILD_CFLAGS += $(call cc-disable-warning, default-const-init-unsafe)
|
||||
else
|
||||
|
||||
# Warn about unmarked fall-throughs in switch statement.
|
||||
|
||||
@@ -126,7 +126,7 @@
|
||||
reg = <0x54400000 0x00040000>;
|
||||
clocks = <&tegra_car TEGRA114_CLK_DSIB>,
|
||||
<&tegra_car TEGRA114_CLK_DSIBLP>,
|
||||
<&tegra_car TEGRA114_CLK_PLL_D2_OUT0>;
|
||||
<&tegra_car TEGRA114_CLK_PLL_D_OUT0>;
|
||||
clock-names = "dsi", "lp", "parent";
|
||||
resets = <&tegra_car 82>;
|
||||
reset-names = "dsi";
|
||||
|
||||
@@ -1638,7 +1638,7 @@
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-always-on;
|
||||
gpio = <&exp1 14 GPIO_ACTIVE_HIGH>;
|
||||
gpio = <&exp1 9 GPIO_ACTIVE_HIGH>;
|
||||
enable-active-high;
|
||||
vin-supply = <&vdd_1v8>;
|
||||
};
|
||||
|
||||
@@ -618,7 +618,8 @@ static inline unsigned long pmd_page_vaddr(pmd_t pmd)
|
||||
pr_err("%s:%d: bad pmd %016llx.\n", __FILE__, __LINE__, pmd_val(e))
|
||||
|
||||
#define pud_none(pud) (!pud_val(pud))
|
||||
#define pud_bad(pud) (!pud_table(pud))
|
||||
#define pud_bad(pud) ((pud_val(pud) & PUD_TYPE_MASK) != \
|
||||
PUD_TYPE_TABLE)
|
||||
#define pud_present(pud) pte_present(pud_pte(pud))
|
||||
#define pud_leaf(pud) (pud_present(pud) && !pud_table(pud))
|
||||
#define pud_valid(pud) pte_valid(pud_pte(pud))
|
||||
|
||||
@@ -87,4 +87,20 @@ struct dyn_arch_ftrace {
|
||||
#endif /* CONFIG_DYNAMIC_FTRACE */
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* CONFIG_FUNCTION_TRACER */
|
||||
|
||||
#ifdef CONFIG_FTRACE_SYSCALLS
|
||||
#ifndef __ASSEMBLY__
|
||||
/*
|
||||
* Some syscall entry functions on mips start with "__sys_" (fork and clone,
|
||||
* for instance). We should also match the sys_ variant with those.
|
||||
*/
|
||||
#define ARCH_HAS_SYSCALL_MATCH_SYM_NAME
|
||||
static inline bool arch_syscall_match_sym_name(const char *sym,
|
||||
const char *name)
|
||||
{
|
||||
return !strcmp(sym, name) ||
|
||||
(!strncmp(sym, "__sys_", 6) && !strcmp(sym + 6, name + 4));
|
||||
}
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* CONFIG_FTRACE_SYSCALLS */
|
||||
#endif /* _ASM_MIPS_FTRACE_H */
|
||||
|
||||
@@ -65,7 +65,8 @@ static inline void instruction_pointer_set(struct pt_regs *regs,
|
||||
|
||||
/* Query offset/name of register from its name/offset */
|
||||
extern int regs_query_register_offset(const char *name);
|
||||
#define MAX_REG_OFFSET (offsetof(struct pt_regs, __last))
|
||||
#define MAX_REG_OFFSET \
|
||||
(offsetof(struct pt_regs, __last) - sizeof(unsigned long))
|
||||
|
||||
/**
|
||||
* regs_get_register() - get register value from its offset
|
||||
|
||||
@@ -56,10 +56,7 @@ static DEFINE_PER_CPU_ALIGNED(u32*, ready_count);
|
||||
/* Indicates online CPUs coupled with the current CPU */
|
||||
static DEFINE_PER_CPU_ALIGNED(cpumask_t, online_coupled);
|
||||
|
||||
/*
|
||||
* Used to synchronize entry to deep idle states. Actually per-core rather
|
||||
* than per-CPU.
|
||||
*/
|
||||
/* Used to synchronize entry to deep idle states */
|
||||
static DEFINE_PER_CPU_ALIGNED(atomic_t, pm_barrier);
|
||||
|
||||
/* Saved CPU state across the CPS_PM_POWER_GATED state */
|
||||
@@ -118,9 +115,10 @@ int cps_pm_enter_state(enum cps_pm_state state)
|
||||
cps_nc_entry_fn entry;
|
||||
struct core_boot_config *core_cfg;
|
||||
struct vpe_boot_config *vpe_cfg;
|
||||
atomic_t *barrier;
|
||||
|
||||
/* Check that there is an entry function for this state */
|
||||
entry = per_cpu(nc_asm_enter, core)[state];
|
||||
entry = per_cpu(nc_asm_enter, cpu)[state];
|
||||
if (!entry)
|
||||
return -EINVAL;
|
||||
|
||||
@@ -156,7 +154,7 @@ int cps_pm_enter_state(enum cps_pm_state state)
|
||||
smp_mb__after_atomic();
|
||||
|
||||
/* Create a non-coherent mapping of the core ready_count */
|
||||
core_ready_count = per_cpu(ready_count, core);
|
||||
core_ready_count = per_cpu(ready_count, cpu);
|
||||
nc_addr = kmap_noncoherent(virt_to_page(core_ready_count),
|
||||
(unsigned long)core_ready_count);
|
||||
nc_addr += ((unsigned long)core_ready_count & ~PAGE_MASK);
|
||||
@@ -164,7 +162,8 @@ int cps_pm_enter_state(enum cps_pm_state state)
|
||||
|
||||
/* Ensure ready_count is zero-initialised before the assembly runs */
|
||||
WRITE_ONCE(*nc_core_ready_count, 0);
|
||||
coupled_barrier(&per_cpu(pm_barrier, core), online);
|
||||
barrier = &per_cpu(pm_barrier, cpumask_first(&cpu_sibling_map[cpu]));
|
||||
coupled_barrier(barrier, online);
|
||||
|
||||
/* Run the generated entry code */
|
||||
left = entry(online, nc_core_ready_count);
|
||||
@@ -635,12 +634,14 @@ out_err:
|
||||
|
||||
static int cps_pm_online_cpu(unsigned int cpu)
|
||||
{
|
||||
enum cps_pm_state state;
|
||||
unsigned core = cpu_core(&cpu_data[cpu]);
|
||||
unsigned int sibling, core;
|
||||
void *entry_fn, *core_rc;
|
||||
enum cps_pm_state state;
|
||||
|
||||
core = cpu_core(&cpu_data[cpu]);
|
||||
|
||||
for (state = CPS_PM_NC_WAIT; state < CPS_PM_STATE_COUNT; state++) {
|
||||
if (per_cpu(nc_asm_enter, core)[state])
|
||||
if (per_cpu(nc_asm_enter, cpu)[state])
|
||||
continue;
|
||||
if (!test_bit(state, state_support))
|
||||
continue;
|
||||
@@ -652,16 +653,19 @@ static int cps_pm_online_cpu(unsigned int cpu)
|
||||
clear_bit(state, state_support);
|
||||
}
|
||||
|
||||
per_cpu(nc_asm_enter, core)[state] = entry_fn;
|
||||
for_each_cpu(sibling, &cpu_sibling_map[cpu])
|
||||
per_cpu(nc_asm_enter, sibling)[state] = entry_fn;
|
||||
}
|
||||
|
||||
if (!per_cpu(ready_count, core)) {
|
||||
if (!per_cpu(ready_count, cpu)) {
|
||||
core_rc = kmalloc(sizeof(u32), GFP_KERNEL);
|
||||
if (!core_rc) {
|
||||
pr_err("Failed allocate core %u ready_count\n", core);
|
||||
return -ENOMEM;
|
||||
}
|
||||
per_cpu(ready_count, core) = core_rc;
|
||||
|
||||
for_each_cpu(sibling, &cpu_sibling_map[cpu])
|
||||
per_cpu(ready_count, sibling) = core_rc;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -103,9 +103,19 @@ handle_fpe(struct pt_regs *regs)
|
||||
|
||||
memcpy(regs->fr, frcopy, sizeof regs->fr);
|
||||
if (signalcode != 0) {
|
||||
force_sig_fault(signalcode >> 24, signalcode & 0xffffff,
|
||||
(void __user *) regs->iaoq[0]);
|
||||
return -1;
|
||||
int sig = signalcode >> 24;
|
||||
|
||||
if (sig == SIGFPE) {
|
||||
/*
|
||||
* Clear floating point trap bit to avoid trapping
|
||||
* again on the first floating-point instruction in
|
||||
* the userspace signal handler.
|
||||
*/
|
||||
regs->fr[0] &= ~(1ULL << 38);
|
||||
}
|
||||
force_sig_fault(sig, signalcode & 0xffffff,
|
||||
(void __user *) regs->iaoq[0]);
|
||||
return -1;
|
||||
}
|
||||
|
||||
return signalcode ? -1 : 0;
|
||||
|
||||
@@ -2944,11 +2944,11 @@ static void __init fixup_device_tree_pmac(void)
|
||||
char type[8];
|
||||
phandle node;
|
||||
|
||||
// Some pmacs are missing #size-cells on escc nodes
|
||||
// Some pmacs are missing #size-cells on escc or i2s nodes
|
||||
for (node = 0; prom_next_node(&node); ) {
|
||||
type[0] = '\0';
|
||||
prom_getprop(node, "device_type", type, sizeof(type));
|
||||
if (prom_strcmp(type, "escc"))
|
||||
if (prom_strcmp(type, "escc") && prom_strcmp(type, "i2s"))
|
||||
continue;
|
||||
|
||||
if (prom_getproplen(node, "#size-cells") != PROM_ERROR)
|
||||
|
||||
@@ -153,5 +153,6 @@ MRPROPER_FILES += $(HOST_DIR)/include/generated
|
||||
archclean:
|
||||
@find . \( -name '*.bb' -o -name '*.bbg' -o -name '*.da' \
|
||||
-o -name '*.gcov' \) -type f -print | xargs rm -f
|
||||
$(Q)$(MAKE) -f $(srctree)/Makefile ARCH=$(HEADER_ARCH) clean
|
||||
|
||||
export HEADER_ARCH SUBARCH USER_CFLAGS CFLAGS_NO_HARDENING OS DEV_NULL_PATH
|
||||
|
||||
@@ -49,6 +49,7 @@ void __init mem_init(void)
|
||||
map_memory(brk_end, __pa(brk_end), uml_reserved - brk_end, 1, 1, 0);
|
||||
memblock_free(__pa(brk_end), uml_reserved - brk_end);
|
||||
uml_reserved = brk_end;
|
||||
min_low_pfn = PFN_UP(__pa(uml_reserved));
|
||||
|
||||
/* this will put all low memory onto the freelists */
|
||||
memblock_free_all();
|
||||
|
||||
@@ -808,7 +808,8 @@ static __init int perf_event_ibs_init(void)
|
||||
if (ibs_caps & IBS_CAPS_OPCNTEXT) {
|
||||
perf_ibs_op.max_period |= IBS_OP_MAX_CNT_EXT_MASK;
|
||||
perf_ibs_op.config_mask |= IBS_OP_MAX_CNT_EXT_MASK;
|
||||
perf_ibs_op.cnt_mask |= IBS_OP_MAX_CNT_EXT_MASK;
|
||||
perf_ibs_op.cnt_mask |= (IBS_OP_MAX_CNT_EXT_MASK |
|
||||
IBS_OP_CUR_CNT_EXT_MASK);
|
||||
}
|
||||
|
||||
ret = perf_ibs_pmu_init(&perf_ibs_op, "ibs_op");
|
||||
|
||||
@@ -59,6 +59,8 @@ int __register_nmi_handler(unsigned int, struct nmiaction *);
|
||||
|
||||
void unregister_nmi_handler(unsigned int, const char *);
|
||||
|
||||
void set_emergency_nmi_handler(unsigned int type, nmi_handler_t handler);
|
||||
|
||||
void stop_nmi(void);
|
||||
void restart_nmi(void);
|
||||
void local_touch_nmi(void);
|
||||
|
||||
@@ -402,6 +402,7 @@ struct pebs_xmm {
|
||||
*/
|
||||
#define IBS_OP_CUR_CNT (0xFFF80ULL<<32)
|
||||
#define IBS_OP_CUR_CNT_RAND (0x0007FULL<<32)
|
||||
#define IBS_OP_CUR_CNT_EXT_MASK (0x7FULL<<52)
|
||||
#define IBS_OP_CNT_CTL (1ULL<<19)
|
||||
#define IBS_OP_VAL (1ULL<<18)
|
||||
#define IBS_OP_ENABLE (1ULL<<17)
|
||||
|
||||
@@ -1231,9 +1231,13 @@ static __ro_after_init enum spectre_v2_mitigation_cmd spectre_v2_cmd;
|
||||
static enum spectre_v2_user_cmd __init
|
||||
spectre_v2_parse_user_cmdline(void)
|
||||
{
|
||||
enum spectre_v2_user_cmd mode;
|
||||
char arg[20];
|
||||
int ret, i;
|
||||
|
||||
mode = IS_ENABLED(CONFIG_MITIGATION_SPECTRE_V2) ?
|
||||
SPECTRE_V2_USER_CMD_AUTO : SPECTRE_V2_USER_CMD_NONE;
|
||||
|
||||
switch (spectre_v2_cmd) {
|
||||
case SPECTRE_V2_CMD_NONE:
|
||||
return SPECTRE_V2_USER_CMD_NONE;
|
||||
@@ -1246,7 +1250,7 @@ spectre_v2_parse_user_cmdline(void)
|
||||
ret = cmdline_find_option(boot_command_line, "spectre_v2_user",
|
||||
arg, sizeof(arg));
|
||||
if (ret < 0)
|
||||
return SPECTRE_V2_USER_CMD_AUTO;
|
||||
return mode;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(v2_user_options); i++) {
|
||||
if (match_option(arg, ret, v2_user_options[i].option)) {
|
||||
@@ -1256,8 +1260,8 @@ spectre_v2_parse_user_cmdline(void)
|
||||
}
|
||||
}
|
||||
|
||||
pr_err("Unknown user space protection option (%s). Switching to AUTO select\n", arg);
|
||||
return SPECTRE_V2_USER_CMD_AUTO;
|
||||
pr_err("Unknown user space protection option (%s). Switching to default\n", arg);
|
||||
return mode;
|
||||
}
|
||||
|
||||
static inline bool spectre_v2_in_eibrs_mode(enum spectre_v2_mitigation mode)
|
||||
|
||||
@@ -38,8 +38,12 @@
|
||||
#define CREATE_TRACE_POINTS
|
||||
#include <trace/events/nmi.h>
|
||||
|
||||
/*
|
||||
* An emergency handler can be set in any context including NMI
|
||||
*/
|
||||
struct nmi_desc {
|
||||
raw_spinlock_t lock;
|
||||
nmi_handler_t emerg_handler;
|
||||
struct list_head head;
|
||||
};
|
||||
|
||||
@@ -121,9 +125,22 @@ static void nmi_check_duration(struct nmiaction *action, u64 duration)
|
||||
static int nmi_handle(unsigned int type, struct pt_regs *regs)
|
||||
{
|
||||
struct nmi_desc *desc = nmi_to_desc(type);
|
||||
nmi_handler_t ehandler;
|
||||
struct nmiaction *a;
|
||||
int handled=0;
|
||||
|
||||
/*
|
||||
* Call the emergency handler, if set
|
||||
*
|
||||
* In the case of crash_nmi_callback() emergency handler, it will
|
||||
* return in the case of the crashing CPU to enable it to complete
|
||||
* other necessary crashing actions ASAP. Other handlers in the
|
||||
* linked list won't need to be run.
|
||||
*/
|
||||
ehandler = desc->emerg_handler;
|
||||
if (ehandler)
|
||||
return ehandler(type, regs);
|
||||
|
||||
rcu_read_lock();
|
||||
|
||||
/*
|
||||
@@ -209,6 +226,31 @@ void unregister_nmi_handler(unsigned int type, const char *name)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(unregister_nmi_handler);
|
||||
|
||||
/**
|
||||
* set_emergency_nmi_handler - Set emergency handler
|
||||
* @type: NMI type
|
||||
* @handler: the emergency handler to be stored
|
||||
*
|
||||
* Set an emergency NMI handler which, if set, will preempt all the other
|
||||
* handlers in the linked list. If a NULL handler is passed in, it will clear
|
||||
* it. It is expected that concurrent calls to this function will not happen
|
||||
* or the system is screwed beyond repair.
|
||||
*/
|
||||
void set_emergency_nmi_handler(unsigned int type, nmi_handler_t handler)
|
||||
{
|
||||
struct nmi_desc *desc = nmi_to_desc(type);
|
||||
|
||||
if (WARN_ON_ONCE(desc->emerg_handler == handler))
|
||||
return;
|
||||
desc->emerg_handler = handler;
|
||||
|
||||
/*
|
||||
* Ensure the emergency handler is visible to other CPUs before
|
||||
* function return
|
||||
*/
|
||||
smp_wmb();
|
||||
}
|
||||
|
||||
static void
|
||||
pci_serr_error(unsigned char reason, struct pt_regs *regs)
|
||||
{
|
||||
|
||||
@@ -874,15 +874,11 @@ void nmi_shootdown_cpus(nmi_shootdown_cb callback)
|
||||
shootdown_callback = callback;
|
||||
|
||||
atomic_set(&waiting_for_crash_ipi, num_online_cpus() - 1);
|
||||
/* Would it be better to replace the trap vector here? */
|
||||
if (register_nmi_handler(NMI_LOCAL, crash_nmi_callback,
|
||||
NMI_FLAG_FIRST, "crash"))
|
||||
return; /* Return what? */
|
||||
|
||||
/*
|
||||
* Ensure the new callback function is set before sending
|
||||
* out the NMI
|
||||
* Set emergency handler to preempt other handlers.
|
||||
*/
|
||||
wmb();
|
||||
set_emergency_nmi_handler(NMI_LOCAL, crash_nmi_callback);
|
||||
|
||||
apic_send_IPI_allbutself(NMI_VECTOR);
|
||||
|
||||
|
||||
@@ -26,7 +26,6 @@ void get_regs_from_mc(struct uml_pt_regs *regs, mcontext_t *mc)
|
||||
COPY(RIP);
|
||||
COPY2(EFLAGS, EFL);
|
||||
COPY2(CS, CSGSFS);
|
||||
regs->gp[CS / sizeof(unsigned long)] &= 0xffff;
|
||||
regs->gp[CS / sizeof(unsigned long)] |= 3;
|
||||
regs->gp[SS / sizeof(unsigned long)] = mc->gregs[REG_CSGSFS] >> 48;
|
||||
#endif
|
||||
}
|
||||
|
||||
@@ -262,10 +262,6 @@ static int hash_accept(struct socket *sock, struct socket *newsock, int flags,
|
||||
return err;
|
||||
|
||||
err = crypto_ahash_import(&ctx2->req, state);
|
||||
if (err) {
|
||||
sock_orphan(sk2);
|
||||
sock_put(sk2);
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -432,7 +432,7 @@ config ACPI_SBS
|
||||
the modules will be called sbs and sbshc.
|
||||
|
||||
config ACPI_HED
|
||||
tristate "Hardware Error Device"
|
||||
bool "Hardware Error Device"
|
||||
help
|
||||
This driver supports the Hardware Error Device (PNP0C33),
|
||||
which is used to report some hardware errors notified via
|
||||
|
||||
@@ -72,7 +72,12 @@ static struct acpi_driver acpi_hed_driver = {
|
||||
.notify = acpi_hed_notify,
|
||||
},
|
||||
};
|
||||
module_acpi_driver(acpi_hed_driver);
|
||||
|
||||
static int __init acpi_hed_driver_init(void)
|
||||
{
|
||||
return acpi_bus_register_driver(&acpi_hed_driver);
|
||||
}
|
||||
subsys_initcall(acpi_hed_driver_init);
|
||||
|
||||
ACPI_MODULE_NAME("hed");
|
||||
MODULE_AUTHOR("Huang Ying");
|
||||
|
||||
@@ -219,16 +219,18 @@ static int acpi_pptt_leaf_node(struct acpi_table_header *table_hdr,
|
||||
sizeof(struct acpi_table_pptt));
|
||||
proc_sz = sizeof(struct acpi_pptt_processor);
|
||||
|
||||
while ((unsigned long)entry + proc_sz < table_end) {
|
||||
/* ignore subtable types that are smaller than a processor node */
|
||||
while ((unsigned long)entry + proc_sz <= table_end) {
|
||||
cpu_node = (struct acpi_pptt_processor *)entry;
|
||||
|
||||
if (entry->type == ACPI_PPTT_TYPE_PROCESSOR &&
|
||||
cpu_node->parent == node_entry)
|
||||
return 0;
|
||||
if (entry->length == 0)
|
||||
return 0;
|
||||
|
||||
entry = ACPI_ADD_PTR(struct acpi_subtable_header, entry,
|
||||
entry->length);
|
||||
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
@@ -261,15 +263,18 @@ static struct acpi_pptt_processor *acpi_find_processor_node(struct acpi_table_he
|
||||
proc_sz = sizeof(struct acpi_pptt_processor);
|
||||
|
||||
/* find the processor structure associated with this cpuid */
|
||||
while ((unsigned long)entry + proc_sz < table_end) {
|
||||
while ((unsigned long)entry + proc_sz <= table_end) {
|
||||
cpu_node = (struct acpi_pptt_processor *)entry;
|
||||
|
||||
if (entry->length == 0) {
|
||||
pr_warn("Invalid zero length subtable\n");
|
||||
break;
|
||||
}
|
||||
/* entry->length may not equal proc_sz, revalidate the processor structure length */
|
||||
if (entry->type == ACPI_PPTT_TYPE_PROCESSOR &&
|
||||
acpi_cpu_id == cpu_node->acpi_processor_id &&
|
||||
(unsigned long)entry + entry->length <= table_end &&
|
||||
entry->length == proc_sz + cpu_node->number_of_priv_resources * sizeof(u32) &&
|
||||
acpi_pptt_leaf_node(table_hdr, cpu_node)) {
|
||||
return (struct acpi_pptt_processor *)entry;
|
||||
}
|
||||
|
||||
@@ -53,7 +53,7 @@ enum tis_int_flags {
|
||||
enum tis_defaults {
|
||||
TIS_MEM_LEN = 0x5000,
|
||||
TIS_SHORT_TIMEOUT = 750, /* ms */
|
||||
TIS_LONG_TIMEOUT = 2000, /* 2 sec */
|
||||
TIS_LONG_TIMEOUT = 4000, /* 4 secs */
|
||||
TIS_TIMEOUT_MIN_ATML = 14700, /* usecs */
|
||||
TIS_TIMEOUT_MAX_ATML = 15000, /* usecs */
|
||||
};
|
||||
|
||||
@@ -8,6 +8,7 @@
|
||||
#include <linux/err.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/units.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/slab.h>
|
||||
@@ -417,11 +418,151 @@ static const char * const imx8mp_clkout_sels[] = {"audio_pll1_out", "audio_pll2_
|
||||
static struct clk_hw **hws;
|
||||
static struct clk_hw_onecell_data *clk_hw_data;
|
||||
|
||||
struct imx8mp_clock_constraints {
|
||||
unsigned int clkid;
|
||||
u32 maxrate;
|
||||
};
|
||||
|
||||
/*
|
||||
* Below tables are taken from IMX8MPCEC Rev. 2.1, 07/2023
|
||||
* Table 13. Maximum frequency of modules.
|
||||
* Probable typos fixed are marked with a comment.
|
||||
*/
|
||||
static const struct imx8mp_clock_constraints imx8mp_clock_common_constraints[] = {
|
||||
{ IMX8MP_CLK_A53_DIV, 1000 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_ENET_AXI, 266666667 }, /* Datasheet claims 266MHz */
|
||||
{ IMX8MP_CLK_NAND_USDHC_BUS, 266666667 }, /* Datasheet claims 266MHz */
|
||||
{ IMX8MP_CLK_MEDIA_APB, 200 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_HDMI_APB, 133333333 }, /* Datasheet claims 133MHz */
|
||||
{ IMX8MP_CLK_ML_AXI, 800 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_AHB, 133333333 },
|
||||
{ IMX8MP_CLK_IPG_ROOT, 66666667 },
|
||||
{ IMX8MP_CLK_AUDIO_AHB, 400 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_MEDIA_DISP2_PIX, 170 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_DRAM_ALT, 666666667 },
|
||||
{ IMX8MP_CLK_DRAM_APB, 200 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_CAN1, 80 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_CAN2, 80 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_PCIE_AUX, 10 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_I2C5, 66666667 }, /* Datasheet claims 66MHz */
|
||||
{ IMX8MP_CLK_I2C6, 66666667 }, /* Datasheet claims 66MHz */
|
||||
{ IMX8MP_CLK_SAI1, 66666667 }, /* Datasheet claims 66MHz */
|
||||
{ IMX8MP_CLK_SAI2, 66666667 }, /* Datasheet claims 66MHz */
|
||||
{ IMX8MP_CLK_SAI3, 66666667 }, /* Datasheet claims 66MHz */
|
||||
{ IMX8MP_CLK_SAI5, 66666667 }, /* Datasheet claims 66MHz */
|
||||
{ IMX8MP_CLK_SAI6, 66666667 }, /* Datasheet claims 66MHz */
|
||||
{ IMX8MP_CLK_ENET_QOS, 125 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_ENET_QOS_TIMER, 200 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_ENET_REF, 125 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_ENET_TIMER, 125 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_ENET_PHY_REF, 125 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_NAND, 500 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_QSPI, 400 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_USDHC1, 400 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_USDHC2, 400 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_I2C1, 66666667 }, /* Datasheet claims 66MHz */
|
||||
{ IMX8MP_CLK_I2C2, 66666667 }, /* Datasheet claims 66MHz */
|
||||
{ IMX8MP_CLK_I2C3, 66666667 }, /* Datasheet claims 66MHz */
|
||||
{ IMX8MP_CLK_I2C4, 66666667 }, /* Datasheet claims 66MHz */
|
||||
{ IMX8MP_CLK_UART1, 80 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_UART2, 80 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_UART3, 80 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_UART4, 80 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_ECSPI1, 80 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_ECSPI2, 80 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_PWM1, 66666667 }, /* Datasheet claims 66MHz */
|
||||
{ IMX8MP_CLK_PWM2, 66666667 }, /* Datasheet claims 66MHz */
|
||||
{ IMX8MP_CLK_PWM3, 66666667 }, /* Datasheet claims 66MHz */
|
||||
{ IMX8MP_CLK_PWM4, 66666667 }, /* Datasheet claims 66MHz */
|
||||
{ IMX8MP_CLK_GPT1, 100 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_GPT2, 100 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_GPT3, 100 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_GPT4, 100 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_GPT5, 100 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_GPT6, 100 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_WDOG, 66666667 }, /* Datasheet claims 66MHz */
|
||||
{ IMX8MP_CLK_IPP_DO_CLKO1, 200 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_IPP_DO_CLKO2, 200 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_HDMI_REF_266M, 266 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_USDHC3, 400 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_MEDIA_MIPI_PHY1_REF, 300 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_MEDIA_DISP1_PIX, 250 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_MEDIA_CAM2_PIX, 277 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_MEDIA_LDB, 595 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_MEDIA_MIPI_TEST_BYTE, 200 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_ECSPI3, 80 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_PDM, 200 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_SAI7, 66666667 }, /* Datasheet claims 66MHz */
|
||||
{ IMX8MP_CLK_MAIN_AXI, 400 * HZ_PER_MHZ },
|
||||
{ /* Sentinel */ }
|
||||
};
|
||||
|
||||
static const struct imx8mp_clock_constraints imx8mp_clock_nominal_constraints[] = {
|
||||
{ IMX8MP_CLK_M7_CORE, 600 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_ML_CORE, 800 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_GPU3D_CORE, 800 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_GPU3D_SHADER_CORE, 800 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_GPU2D_CORE, 800 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_AUDIO_AXI_SRC, 600 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_HSIO_AXI, 400 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_MEDIA_ISP, 400 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_VPU_BUS, 600 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_MEDIA_AXI, 400 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_HDMI_AXI, 400 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_GPU_AXI, 600 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_GPU_AHB, 300 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_NOC, 800 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_NOC_IO, 600 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_ML_AHB, 300 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_VPU_G1, 600 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_VPU_G2, 500 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_MEDIA_CAM1_PIX, 400 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_VPU_VC8000E, 400 * HZ_PER_MHZ }, /* Datasheet claims 500MHz */
|
||||
{ IMX8MP_CLK_DRAM_CORE, 800 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_GIC, 400 * HZ_PER_MHZ },
|
||||
{ /* Sentinel */ }
|
||||
};
|
||||
|
||||
static const struct imx8mp_clock_constraints imx8mp_clock_overdrive_constraints[] = {
|
||||
{ IMX8MP_CLK_M7_CORE, 800 * HZ_PER_MHZ},
|
||||
{ IMX8MP_CLK_ML_CORE, 1000 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_GPU3D_CORE, 1000 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_GPU3D_SHADER_CORE, 1000 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_GPU2D_CORE, 1000 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_AUDIO_AXI_SRC, 800 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_HSIO_AXI, 500 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_MEDIA_ISP, 500 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_VPU_BUS, 800 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_MEDIA_AXI, 500 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_HDMI_AXI, 500 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_GPU_AXI, 800 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_GPU_AHB, 400 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_NOC, 1000 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_NOC_IO, 800 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_ML_AHB, 400 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_VPU_G1, 800 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_VPU_G2, 700 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_MEDIA_CAM1_PIX, 500 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_VPU_VC8000E, 500 * HZ_PER_MHZ }, /* Datasheet claims 400MHz */
|
||||
{ IMX8MP_CLK_DRAM_CORE, 1000 * HZ_PER_MHZ },
|
||||
{ IMX8MP_CLK_GIC, 500 * HZ_PER_MHZ },
|
||||
{ /* Sentinel */ }
|
||||
};
|
||||
|
||||
static void imx8mp_clocks_apply_constraints(const struct imx8mp_clock_constraints constraints[])
|
||||
{
|
||||
const struct imx8mp_clock_constraints *constr;
|
||||
|
||||
for (constr = constraints; constr->clkid; constr++)
|
||||
clk_hw_set_rate_range(hws[constr->clkid], 0, constr->maxrate);
|
||||
}
|
||||
|
||||
static int imx8mp_clocks_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct device_node *np = dev->of_node;
|
||||
void __iomem *anatop_base, *ccm_base;
|
||||
const char *opmode;
|
||||
int err;
|
||||
|
||||
np = of_find_compatible_node(NULL, NULL, "fsl,imx8mp-anatop");
|
||||
@@ -736,6 +877,16 @@ static int imx8mp_clocks_probe(struct platform_device *pdev)
|
||||
|
||||
imx_check_clk_hws(hws, IMX8MP_CLK_END);
|
||||
|
||||
imx8mp_clocks_apply_constraints(imx8mp_clock_common_constraints);
|
||||
|
||||
err = of_property_read_string(np, "fsl,operating-mode", &opmode);
|
||||
if (!err) {
|
||||
if (!strcmp(opmode, "nominal"))
|
||||
imx8mp_clocks_apply_constraints(imx8mp_clock_nominal_constraints);
|
||||
else if (!strcmp(opmode, "overdrive"))
|
||||
imx8mp_clocks_apply_constraints(imx8mp_clock_overdrive_constraints);
|
||||
}
|
||||
|
||||
err = of_clk_add_hw_provider(np, of_clk_hw_onecell_get, clk_hw_data);
|
||||
if (err < 0) {
|
||||
dev_err(dev, "failed to register hws for i.MX8MP\n");
|
||||
|
||||
@@ -103,7 +103,9 @@ int __init clocksource_i8253_init(void)
|
||||
#ifdef CONFIG_CLKEVT_I8253
|
||||
void clockevent_i8253_disable(void)
|
||||
{
|
||||
raw_spin_lock(&i8253_lock);
|
||||
unsigned long flags;
|
||||
|
||||
raw_spin_lock_irqsave(&i8253_lock, flags);
|
||||
|
||||
/*
|
||||
* Writing the MODE register should stop the counter, according to
|
||||
@@ -133,7 +135,7 @@ void clockevent_i8253_disable(void)
|
||||
|
||||
outb_p(0x30, PIT_MODE);
|
||||
|
||||
raw_spin_unlock(&i8253_lock);
|
||||
raw_spin_unlock_irqrestore(&i8253_lock, flags);
|
||||
}
|
||||
|
||||
static int pit_shutdown(struct clock_event_device *evt)
|
||||
|
||||
@@ -119,6 +119,9 @@ static void gic_update_frequency(void *data)
|
||||
|
||||
static int gic_starting_cpu(unsigned int cpu)
|
||||
{
|
||||
/* Ensure the GIC counter is running */
|
||||
clear_gic_config(GIC_CONFIG_COUNTSTOP);
|
||||
|
||||
gic_clockevent_cpu_init(cpu, this_cpu_ptr(&gic_clockevent_device));
|
||||
return 0;
|
||||
}
|
||||
@@ -253,9 +256,6 @@ static int __init gic_clocksource_of_init(struct device_node *node)
|
||||
pr_warn("Unable to register clock notifier\n");
|
||||
}
|
||||
|
||||
/* And finally start the counter */
|
||||
clear_gic_config(GIC_CONFIG_COUNTSTOP);
|
||||
|
||||
/*
|
||||
* It's safe to use the MIPS GIC timer as a sched clock source only if
|
||||
* its ticks are stable, which is true on either the platforms with
|
||||
|
||||
@@ -249,8 +249,19 @@ again:
|
||||
* This can deal with workloads that have long pauses interspersed
|
||||
* with sporadic activity with a bunch of short pauses.
|
||||
*/
|
||||
if ((divisor * 4) <= INTERVALS * 3)
|
||||
if (divisor * 4 <= INTERVALS * 3) {
|
||||
/*
|
||||
* If there are sufficiently many data points still under
|
||||
* consideration after the outliers have been eliminated,
|
||||
* returning without a prediction would be a mistake because it
|
||||
* is likely that the next interval will not exceed the current
|
||||
* maximum, so return the latter in that case.
|
||||
*/
|
||||
if (divisor >= INTERVALS / 2)
|
||||
return max;
|
||||
|
||||
return UINT_MAX;
|
||||
}
|
||||
|
||||
thresh = max - 1;
|
||||
goto again;
|
||||
|
||||
@@ -825,9 +825,9 @@ static int dmatest_func(void *data)
|
||||
} else {
|
||||
dma_async_issue_pending(chan);
|
||||
|
||||
wait_event_timeout(thread->done_wait,
|
||||
done->done,
|
||||
msecs_to_jiffies(params->timeout));
|
||||
wait_event_freezable_timeout(thread->done_wait,
|
||||
done->done,
|
||||
msecs_to_jiffies(params->timeout));
|
||||
|
||||
status = dma_async_is_tx_complete(chan, cookie, NULL,
|
||||
NULL);
|
||||
|
||||
@@ -962,8 +962,11 @@ static void udma_check_tx_completion(struct work_struct *work)
|
||||
u32 residue_diff;
|
||||
ktime_t time_diff;
|
||||
unsigned long delay;
|
||||
unsigned long flags;
|
||||
|
||||
while (1) {
|
||||
spin_lock_irqsave(&uc->vc.lock, flags);
|
||||
|
||||
if (uc->desc) {
|
||||
/* Get previous residue and time stamp */
|
||||
residue_diff = uc->tx_drain.residue;
|
||||
@@ -998,6 +1001,8 @@ static void udma_check_tx_completion(struct work_struct *work)
|
||||
break;
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&uc->vc.lock, flags);
|
||||
|
||||
usleep_range(ktime_to_us(delay),
|
||||
ktime_to_us(delay) + 10);
|
||||
continue;
|
||||
@@ -1014,6 +1019,8 @@ static void udma_check_tx_completion(struct work_struct *work)
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
spin_unlock_irqrestore(&uc->vc.lock, flags);
|
||||
}
|
||||
|
||||
static irqreturn_t udma_ring_irq_handler(int irq, void *data)
|
||||
@@ -3075,7 +3082,6 @@ static struct dma_chan *udma_of_xlate(struct of_phandle_args *dma_spec,
|
||||
struct of_dma *ofdma)
|
||||
{
|
||||
struct udma_dev *ud = ofdma->of_dma_data;
|
||||
dma_cap_mask_t mask = ud->ddev.cap_mask;
|
||||
struct udma_filter_param filter_param;
|
||||
struct dma_chan *chan;
|
||||
|
||||
@@ -3088,7 +3094,7 @@ static struct dma_chan *udma_of_xlate(struct of_phandle_args *dma_spec,
|
||||
else
|
||||
filter_param.atype = 0;
|
||||
|
||||
chan = __dma_request_channel(&mask, udma_dma_filter_fn, &filter_param,
|
||||
chan = __dma_request_channel(&ud->ddev.cap_mask, udma_dma_filter_fn, &filter_param,
|
||||
ofdma->of_node);
|
||||
if (!chan) {
|
||||
dev_err(ud->dev, "get channel fail in %s.\n", __func__);
|
||||
|
||||
@@ -97,7 +97,7 @@ static irqreturn_t altr_sdram_mc_err_handler(int irq, void *dev_id)
|
||||
if (status & priv->ecc_stat_ce_mask) {
|
||||
regmap_read(drvdata->mc_vbase, priv->ecc_saddr_offset,
|
||||
&err_addr);
|
||||
if (priv->ecc_uecnt_offset)
|
||||
if (priv->ecc_cecnt_offset)
|
||||
regmap_read(drvdata->mc_vbase, priv->ecc_cecnt_offset,
|
||||
&err_count);
|
||||
edac_mc_handle_error(HW_EVENT_ERR_CORRECTED, mci, err_count,
|
||||
@@ -1006,9 +1006,6 @@ altr_init_a10_ecc_block(struct device_node *np, u32 irq_mask,
|
||||
}
|
||||
}
|
||||
|
||||
/* Interrupt mode set to every SBERR */
|
||||
regmap_write(ecc_mgr_map, ALTR_A10_ECC_INTMODE_OFST,
|
||||
ALTR_A10_ECC_INTMODE);
|
||||
/* Enable ECC */
|
||||
ecc_set_bits(ecc_ctrl_en_mask, (ecc_block_base +
|
||||
ALTR_A10_ECC_CTRL_OFST));
|
||||
@@ -2089,6 +2086,10 @@ static int altr_edac_a10_probe(struct platform_device *pdev)
|
||||
return PTR_ERR(edac->ecc_mgr_map);
|
||||
}
|
||||
|
||||
/* Set irq mask for DDR SBE to avoid any pending irq before registration */
|
||||
regmap_write(edac->ecc_mgr_map, A10_SYSMGR_ECC_INTMASK_SET_OFST,
|
||||
(A10_SYSMGR_ECC_INTMASK_SDMMCB | A10_SYSMGR_ECC_INTMASK_DDR0));
|
||||
|
||||
edac->irq_chip.name = pdev->dev.of_node->name;
|
||||
edac->irq_chip.irq_mask = a10_eccmgr_irq_mask;
|
||||
edac->irq_chip.irq_unmask = a10_eccmgr_irq_unmask;
|
||||
|
||||
@@ -249,6 +249,8 @@ struct altr_sdram_mc_data {
|
||||
#define A10_SYSMGR_ECC_INTMASK_SET_OFST 0x94
|
||||
#define A10_SYSMGR_ECC_INTMASK_CLR_OFST 0x98
|
||||
#define A10_SYSMGR_ECC_INTMASK_OCRAM BIT(1)
|
||||
#define A10_SYSMGR_ECC_INTMASK_SDMMCB BIT(16)
|
||||
#define A10_SYSMGR_ECC_INTMASK_DDR0 BIT(17)
|
||||
|
||||
#define A10_SYSMGR_ECC_INTSTAT_SERR_OFST 0x9C
|
||||
#define A10_SYSMGR_ECC_INTSTAT_DERR_OFST 0xA0
|
||||
|
||||
@@ -398,10 +398,9 @@ static int ie31200_probe1(struct pci_dev *pdev, int dev_idx)
|
||||
int i, j, ret;
|
||||
struct mem_ctl_info *mci = NULL;
|
||||
struct edac_mc_layer layers[2];
|
||||
struct dimm_data dimm_info[IE31200_CHANNELS][IE31200_DIMMS_PER_CHANNEL];
|
||||
void __iomem *window;
|
||||
struct ie31200_priv *priv;
|
||||
u32 addr_decode, mad_offset;
|
||||
u32 addr_decode[IE31200_CHANNELS], mad_offset;
|
||||
|
||||
/*
|
||||
* Kaby Lake, Coffee Lake seem to work like Skylake. Please re-visit
|
||||
@@ -459,19 +458,10 @@ static int ie31200_probe1(struct pci_dev *pdev, int dev_idx)
|
||||
mad_offset = IE31200_MAD_DIMM_0_OFFSET;
|
||||
}
|
||||
|
||||
/* populate DIMM info */
|
||||
for (i = 0; i < IE31200_CHANNELS; i++) {
|
||||
addr_decode = readl(window + mad_offset +
|
||||
addr_decode[i] = readl(window + mad_offset +
|
||||
(i * 4));
|
||||
edac_dbg(0, "addr_decode: 0x%x\n", addr_decode);
|
||||
for (j = 0; j < IE31200_DIMMS_PER_CHANNEL; j++) {
|
||||
populate_dimm_info(&dimm_info[i][j], addr_decode, j,
|
||||
skl);
|
||||
edac_dbg(0, "size: 0x%x, rank: %d, width: %d\n",
|
||||
dimm_info[i][j].size,
|
||||
dimm_info[i][j].dual_rank,
|
||||
dimm_info[i][j].x16_width);
|
||||
}
|
||||
edac_dbg(0, "addr_decode: 0x%x\n", addr_decode[i]);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -482,14 +472,22 @@ static int ie31200_probe1(struct pci_dev *pdev, int dev_idx)
|
||||
*/
|
||||
for (i = 0; i < IE31200_DIMMS_PER_CHANNEL; i++) {
|
||||
for (j = 0; j < IE31200_CHANNELS; j++) {
|
||||
struct dimm_data dimm_info;
|
||||
struct dimm_info *dimm;
|
||||
unsigned long nr_pages;
|
||||
|
||||
nr_pages = IE31200_PAGES(dimm_info[j][i].size, skl);
|
||||
populate_dimm_info(&dimm_info, addr_decode[j], i,
|
||||
skl);
|
||||
edac_dbg(0, "size: 0x%x, rank: %d, width: %d\n",
|
||||
dimm_info.size,
|
||||
dimm_info.dual_rank,
|
||||
dimm_info.x16_width);
|
||||
|
||||
nr_pages = IE31200_PAGES(dimm_info.size, skl);
|
||||
if (nr_pages == 0)
|
||||
continue;
|
||||
|
||||
if (dimm_info[j][i].dual_rank) {
|
||||
if (dimm_info.dual_rank) {
|
||||
nr_pages = nr_pages / 2;
|
||||
dimm = edac_get_dimm(mci, (i * 2) + 1, j, 0);
|
||||
dimm->nr_pages = nr_pages;
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
/* V2 Defines */
|
||||
#define VSE_CVP_TX_CREDITS 0x49 /* 8bit */
|
||||
|
||||
#define V2_CREDIT_TIMEOUT_US 20000
|
||||
#define V2_CREDIT_TIMEOUT_US 40000
|
||||
#define V2_CHECK_CREDIT_US 10
|
||||
#define V2_POLL_TIMEOUT_US 1000000
|
||||
#define V2_USER_TIMEOUT_US 500000
|
||||
|
||||
@@ -70,12 +70,12 @@ static void gfxhub_v1_0_init_system_aperture_regs(struct amdgpu_device *adev)
|
||||
{
|
||||
uint64_t value;
|
||||
|
||||
/* Program the AGP BAR */
|
||||
WREG32_SOC15_RLC(GC, 0, mmMC_VM_AGP_BASE, 0);
|
||||
WREG32_SOC15_RLC(GC, 0, mmMC_VM_AGP_BOT, adev->gmc.agp_start >> 24);
|
||||
WREG32_SOC15_RLC(GC, 0, mmMC_VM_AGP_TOP, adev->gmc.agp_end >> 24);
|
||||
|
||||
if (!amdgpu_sriov_vf(adev) || adev->asic_type <= CHIP_VEGA10) {
|
||||
/* Program the AGP BAR */
|
||||
WREG32_SOC15_RLC(GC, 0, mmMC_VM_AGP_BASE, 0);
|
||||
WREG32_SOC15_RLC(GC, 0, mmMC_VM_AGP_BOT, adev->gmc.agp_start >> 24);
|
||||
WREG32_SOC15_RLC(GC, 0, mmMC_VM_AGP_TOP, adev->gmc.agp_end >> 24);
|
||||
|
||||
/* Program the system aperture low logical page number. */
|
||||
WREG32_SOC15_RLC(GC, 0, mmMC_VM_SYSTEM_APERTURE_LOW_ADDR,
|
||||
min(adev->gmc.fb_start, adev->gmc.agp_start) >> 18);
|
||||
|
||||
@@ -755,6 +755,14 @@ struct kfd_process *kfd_create_process(struct file *filep)
|
||||
if (thread->group_leader->mm != thread->mm)
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
/* If the process just called exec(3), it is possible that the
|
||||
* cleanup of the kfd_process (following the release of the mm
|
||||
* of the old process image) is still in the cleanup work queue.
|
||||
* Make sure to drain any job before trying to recreate any
|
||||
* resource for this process.
|
||||
*/
|
||||
flush_workqueue(kfd_process_wq);
|
||||
|
||||
/*
|
||||
* take kfd processes mutex before starting of process creation
|
||||
* so there won't be a case where two threads of the same process
|
||||
@@ -767,14 +775,6 @@ struct kfd_process *kfd_create_process(struct file *filep)
|
||||
if (process) {
|
||||
pr_debug("Process already found\n");
|
||||
} else {
|
||||
/* If the process just called exec(3), it is possible that the
|
||||
* cleanup of the kfd_process (following the release of the mm
|
||||
* of the old process image) is still in the cleanup work queue.
|
||||
* Make sure to drain any job before trying to recreate any
|
||||
* resource for this process.
|
||||
*/
|
||||
flush_workqueue(kfd_process_wq);
|
||||
|
||||
process = create_process(thread);
|
||||
if (IS_ERR(process))
|
||||
goto out;
|
||||
|
||||
@@ -228,6 +228,7 @@ static bool create_links(
|
||||
link->link_id.type = OBJECT_TYPE_CONNECTOR;
|
||||
link->link_id.id = CONNECTOR_ID_VIRTUAL;
|
||||
link->link_id.enum_id = ENUM_ID_1;
|
||||
link->psr_settings.psr_version = DC_PSR_VERSION_UNSUPPORTED;
|
||||
link->link_enc = kzalloc(sizeof(*link->link_enc), GFP_KERNEL);
|
||||
|
||||
if (!link->link_enc) {
|
||||
|
||||
@@ -104,7 +104,7 @@ static bool ast_get_vbios_mode_info(const struct drm_format_info *format,
|
||||
return false;
|
||||
}
|
||||
|
||||
switch (mode->crtc_hdisplay) {
|
||||
switch (mode->hdisplay) {
|
||||
case 640:
|
||||
vbios_mode->enh_table = &res_640x480[refresh_rate_index];
|
||||
break;
|
||||
@@ -115,7 +115,7 @@ static bool ast_get_vbios_mode_info(const struct drm_format_info *format,
|
||||
vbios_mode->enh_table = &res_1024x768[refresh_rate_index];
|
||||
break;
|
||||
case 1280:
|
||||
if (mode->crtc_vdisplay == 800)
|
||||
if (mode->vdisplay == 800)
|
||||
vbios_mode->enh_table = &res_1280x800[refresh_rate_index];
|
||||
else
|
||||
vbios_mode->enh_table = &res_1280x1024[refresh_rate_index];
|
||||
@@ -127,7 +127,7 @@ static bool ast_get_vbios_mode_info(const struct drm_format_info *format,
|
||||
vbios_mode->enh_table = &res_1440x900[refresh_rate_index];
|
||||
break;
|
||||
case 1600:
|
||||
if (mode->crtc_vdisplay == 900)
|
||||
if (mode->vdisplay == 900)
|
||||
vbios_mode->enh_table = &res_1600x900[refresh_rate_index];
|
||||
else
|
||||
vbios_mode->enh_table = &res_1600x1200[refresh_rate_index];
|
||||
@@ -136,7 +136,7 @@ static bool ast_get_vbios_mode_info(const struct drm_format_info *format,
|
||||
vbios_mode->enh_table = &res_1680x1050[refresh_rate_index];
|
||||
break;
|
||||
case 1920:
|
||||
if (mode->crtc_vdisplay == 1080)
|
||||
if (mode->vdisplay == 1080)
|
||||
vbios_mode->enh_table = &res_1920x1080[refresh_rate_index];
|
||||
else
|
||||
vbios_mode->enh_table = &res_1920x1200[refresh_rate_index];
|
||||
@@ -180,6 +180,7 @@ static bool ast_get_vbios_mode_info(const struct drm_format_info *format,
|
||||
hborder = (vbios_mode->enh_table->flags & HBorder) ? 8 : 0;
|
||||
vborder = (vbios_mode->enh_table->flags & VBorder) ? 8 : 0;
|
||||
|
||||
adjusted_mode->crtc_hdisplay = vbios_mode->enh_table->hde;
|
||||
adjusted_mode->crtc_htotal = vbios_mode->enh_table->ht;
|
||||
adjusted_mode->crtc_hblank_start = vbios_mode->enh_table->hde + hborder;
|
||||
adjusted_mode->crtc_hblank_end = vbios_mode->enh_table->ht - hborder;
|
||||
@@ -189,6 +190,7 @@ static bool ast_get_vbios_mode_info(const struct drm_format_info *format,
|
||||
vbios_mode->enh_table->hfp +
|
||||
vbios_mode->enh_table->hsync);
|
||||
|
||||
adjusted_mode->crtc_vdisplay = vbios_mode->enh_table->vde;
|
||||
adjusted_mode->crtc_vtotal = vbios_mode->enh_table->vt;
|
||||
adjusted_mode->crtc_vblank_start = vbios_mode->enh_table->vde + vborder;
|
||||
adjusted_mode->crtc_vblank_end = vbios_mode->enh_table->vt - vborder;
|
||||
|
||||
@@ -557,6 +557,30 @@ mode_valid(struct drm_atomic_state *state)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int drm_atomic_check_valid_clones(struct drm_atomic_state *state,
|
||||
struct drm_crtc *crtc)
|
||||
{
|
||||
struct drm_encoder *drm_enc;
|
||||
struct drm_crtc_state *crtc_state = drm_atomic_get_new_crtc_state(state,
|
||||
crtc);
|
||||
|
||||
drm_for_each_encoder_mask(drm_enc, crtc->dev, crtc_state->encoder_mask) {
|
||||
if (!drm_enc->possible_clones) {
|
||||
DRM_DEBUG("enc%d possible_clones is 0\n", drm_enc->base.id);
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((crtc_state->encoder_mask & drm_enc->possible_clones) !=
|
||||
crtc_state->encoder_mask) {
|
||||
DRM_DEBUG("crtc%d failed valid clone check for mask 0x%x\n",
|
||||
crtc->base.id, crtc_state->encoder_mask);
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* drm_atomic_helper_check_modeset - validate state object for modeset changes
|
||||
* @dev: DRM device
|
||||
@@ -720,6 +744,10 @@ drm_atomic_helper_check_modeset(struct drm_device *dev,
|
||||
ret = drm_atomic_add_affected_planes(state, crtc);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
|
||||
ret = drm_atomic_check_valid_clones(state, crtc);
|
||||
if (ret != 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -5097,6 +5097,7 @@ drm_reset_display_info(struct drm_connector *connector)
|
||||
info->has_hdmi_infoframe = false;
|
||||
info->rgb_quant_range_selectable = false;
|
||||
memset(&info->hdmi, 0, sizeof(info->hdmi));
|
||||
memset(&connector->hdr_sink_metadata, 0, sizeof(connector->hdr_sink_metadata));
|
||||
|
||||
info->non_desktop = 0;
|
||||
memset(&info->monitor_range, 0, sizeof(info->monitor_range));
|
||||
|
||||
@@ -222,7 +222,8 @@ int intel_vgpu_init_opregion(struct intel_vgpu *vgpu)
|
||||
u8 *buf;
|
||||
struct opregion_header *header;
|
||||
struct vbt v;
|
||||
const char opregion_signature[16] = OPREGION_SIGNATURE;
|
||||
|
||||
static_assert(sizeof(header->signature) == sizeof(OPREGION_SIGNATURE) - 1);
|
||||
|
||||
gvt_dbg_core("init vgpu%d opregion\n", vgpu->id);
|
||||
vgpu_opregion(vgpu)->va = (void *)__get_free_pages(GFP_KERNEL |
|
||||
@@ -236,8 +237,9 @@ int intel_vgpu_init_opregion(struct intel_vgpu *vgpu)
|
||||
/* emulated opregion with VBT mailbox only */
|
||||
buf = (u8 *)vgpu_opregion(vgpu)->va;
|
||||
header = (struct opregion_header *)buf;
|
||||
memcpy(header->signature, opregion_signature,
|
||||
sizeof(opregion_signature));
|
||||
|
||||
memcpy(header->signature, OPREGION_SIGNATURE, sizeof(header->signature));
|
||||
|
||||
header->size = 0x8;
|
||||
header->opregion_ver = 0x02000000;
|
||||
header->mboxes = MBOX_VBT;
|
||||
|
||||
@@ -340,12 +340,13 @@ static void mtk_dpi_config_swap_input(struct mtk_dpi *dpi, bool enable)
|
||||
|
||||
static void mtk_dpi_config_2n_h_fre(struct mtk_dpi *dpi)
|
||||
{
|
||||
mtk_dpi_mask(dpi, dpi->conf->reg_h_fre_con, H_FRE_2N, H_FRE_2N);
|
||||
if (dpi->conf->reg_h_fre_con)
|
||||
mtk_dpi_mask(dpi, dpi->conf->reg_h_fre_con, H_FRE_2N, H_FRE_2N);
|
||||
}
|
||||
|
||||
static void mtk_dpi_config_disable_edge(struct mtk_dpi *dpi)
|
||||
{
|
||||
if (dpi->conf->edge_sel_en)
|
||||
if (dpi->conf->edge_sel_en && dpi->conf->reg_h_fre_con)
|
||||
mtk_dpi_mask(dpi, dpi->conf->reg_h_fre_con, 0, EDGE_SEL_EN);
|
||||
}
|
||||
|
||||
|
||||
@@ -790,13 +790,13 @@ meson_vclk_vic_supported_freq(struct meson_drm *priv, unsigned int phy_freq,
|
||||
FREQ_1000_1001(params[i].pixel_freq));
|
||||
DRM_DEBUG_DRIVER("i = %d phy_freq = %d alt = %d\n",
|
||||
i, params[i].phy_freq,
|
||||
FREQ_1000_1001(params[i].phy_freq/1000)*1000);
|
||||
FREQ_1000_1001(params[i].phy_freq/10)*10);
|
||||
/* Match strict frequency */
|
||||
if (phy_freq == params[i].phy_freq &&
|
||||
vclk_freq == params[i].vclk_freq)
|
||||
return MODE_OK;
|
||||
/* Match 1000/1001 variant */
|
||||
if (phy_freq == (FREQ_1000_1001(params[i].phy_freq/1000)*1000) &&
|
||||
if (phy_freq == (FREQ_1000_1001(params[i].phy_freq/10)*10) &&
|
||||
vclk_freq == FREQ_1000_1001(params[i].vclk_freq))
|
||||
return MODE_OK;
|
||||
}
|
||||
@@ -1070,7 +1070,7 @@ void meson_vclk_setup(struct meson_drm *priv, unsigned int target,
|
||||
|
||||
for (freq = 0 ; params[freq].pixel_freq ; ++freq) {
|
||||
if ((phy_freq == params[freq].phy_freq ||
|
||||
phy_freq == FREQ_1000_1001(params[freq].phy_freq/1000)*1000) &&
|
||||
phy_freq == FREQ_1000_1001(params[freq].phy_freq/10)*10) &&
|
||||
(vclk_freq == params[freq].vclk_freq ||
|
||||
vclk_freq == FREQ_1000_1001(params[freq].vclk_freq))) {
|
||||
if (vclk_freq != params[freq].vclk_freq)
|
||||
|
||||
@@ -95,7 +95,7 @@ nouveau_fence_context_kill(struct nouveau_fence_chan *fctx, int error)
|
||||
while (!list_empty(&fctx->pending)) {
|
||||
fence = list_entry(fctx->pending.next, typeof(*fence), head);
|
||||
|
||||
if (error)
|
||||
if (error && !dma_fence_is_signaled_locked(&fence->base))
|
||||
dma_fence_set_error(&fence->base, error);
|
||||
|
||||
if (nouveau_fence_signal(fence))
|
||||
|
||||
@@ -964,27 +964,28 @@ static const struct panel_desc auo_g070vvn01 = {
|
||||
},
|
||||
};
|
||||
|
||||
static const struct drm_display_mode auo_g101evn010_mode = {
|
||||
.clock = 68930,
|
||||
.hdisplay = 1280,
|
||||
.hsync_start = 1280 + 82,
|
||||
.hsync_end = 1280 + 82 + 2,
|
||||
.htotal = 1280 + 82 + 2 + 84,
|
||||
.vdisplay = 800,
|
||||
.vsync_start = 800 + 8,
|
||||
.vsync_end = 800 + 8 + 2,
|
||||
.vtotal = 800 + 8 + 2 + 6,
|
||||
static const struct display_timing auo_g101evn010_timing = {
|
||||
.pixelclock = { 64000000, 68930000, 85000000 },
|
||||
.hactive = { 1280, 1280, 1280 },
|
||||
.hfront_porch = { 8, 64, 256 },
|
||||
.hback_porch = { 8, 64, 256 },
|
||||
.hsync_len = { 40, 168, 767 },
|
||||
.vactive = { 800, 800, 800 },
|
||||
.vfront_porch = { 4, 8, 100 },
|
||||
.vback_porch = { 4, 8, 100 },
|
||||
.vsync_len = { 8, 16, 223 },
|
||||
};
|
||||
|
||||
static const struct panel_desc auo_g101evn010 = {
|
||||
.modes = &auo_g101evn010_mode,
|
||||
.num_modes = 1,
|
||||
.timings = &auo_g101evn010_timing,
|
||||
.num_timings = 1,
|
||||
.bpc = 6,
|
||||
.size = {
|
||||
.width = 216,
|
||||
.height = 135,
|
||||
},
|
||||
.bus_format = MEDIA_BUS_FMT_RGB666_1X7X3_SPWG,
|
||||
.bus_flags = DRM_BUS_FLAG_DE_HIGH,
|
||||
.connector_type = DRM_MODE_CONNECTOR_LVDS,
|
||||
};
|
||||
|
||||
|
||||
@@ -32,7 +32,6 @@
|
||||
#define VMW_FENCE_WRAP (1 << 31)
|
||||
|
||||
struct vmw_fence_manager {
|
||||
int num_fence_objects;
|
||||
struct vmw_private *dev_priv;
|
||||
spinlock_t lock;
|
||||
struct list_head fence_list;
|
||||
@@ -113,13 +112,13 @@ static void vmw_fence_obj_destroy(struct dma_fence *f)
|
||||
{
|
||||
struct vmw_fence_obj *fence =
|
||||
container_of(f, struct vmw_fence_obj, base);
|
||||
|
||||
struct vmw_fence_manager *fman = fman_from_fence(fence);
|
||||
|
||||
spin_lock(&fman->lock);
|
||||
list_del_init(&fence->head);
|
||||
--fman->num_fence_objects;
|
||||
spin_unlock(&fman->lock);
|
||||
if (!list_empty(&fence->head)) {
|
||||
spin_lock(&fman->lock);
|
||||
list_del_init(&fence->head);
|
||||
spin_unlock(&fman->lock);
|
||||
}
|
||||
fence->destroy(fence);
|
||||
}
|
||||
|
||||
@@ -250,7 +249,6 @@ static const struct dma_fence_ops vmw_fence_ops = {
|
||||
.release = vmw_fence_obj_destroy,
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Execute signal actions on fences recently signaled.
|
||||
* This is done from a workqueue so we don't have to execute
|
||||
@@ -353,7 +351,6 @@ static int vmw_fence_obj_init(struct vmw_fence_manager *fman,
|
||||
goto out_unlock;
|
||||
}
|
||||
list_add_tail(&fence->head, &fman->fence_list);
|
||||
++fman->num_fence_objects;
|
||||
|
||||
out_unlock:
|
||||
spin_unlock(&fman->lock);
|
||||
@@ -402,7 +399,7 @@ static bool vmw_fence_goal_new_locked(struct vmw_fence_manager *fman,
|
||||
{
|
||||
u32 goal_seqno;
|
||||
u32 *fifo_mem;
|
||||
struct vmw_fence_obj *fence;
|
||||
struct vmw_fence_obj *fence, *next_fence;
|
||||
|
||||
if (likely(!fman->seqno_valid))
|
||||
return false;
|
||||
@@ -413,7 +410,7 @@ static bool vmw_fence_goal_new_locked(struct vmw_fence_manager *fman,
|
||||
return false;
|
||||
|
||||
fman->seqno_valid = false;
|
||||
list_for_each_entry(fence, &fman->fence_list, head) {
|
||||
list_for_each_entry_safe(fence, next_fence, &fman->fence_list, head) {
|
||||
if (!list_empty(&fence->seq_passed_actions)) {
|
||||
fman->seqno_valid = true;
|
||||
vmw_mmio_write(fence->base.seqno,
|
||||
|
||||
@@ -41,6 +41,10 @@
|
||||
#define USB_VENDOR_ID_ACTIONSTAR 0x2101
|
||||
#define USB_DEVICE_ID_ACTIONSTAR_1011 0x1011
|
||||
|
||||
#define USB_VENDOR_ID_ADATA_XPG 0x125f
|
||||
#define USB_VENDOR_ID_ADATA_XPG_WL_GAMING_MOUSE 0x7505
|
||||
#define USB_VENDOR_ID_ADATA_XPG_WL_GAMING_MOUSE_DONGLE 0x7506
|
||||
|
||||
#define USB_VENDOR_ID_ADS_TECH 0x06e1
|
||||
#define USB_DEVICE_ID_ADS_TECH_RADIO_SI470X 0xa155
|
||||
|
||||
|
||||
@@ -27,6 +27,8 @@
|
||||
static const struct hid_device_id hid_quirks[] = {
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_AASHIMA, USB_DEVICE_ID_AASHIMA_GAMEPAD), HID_QUIRK_BADPAD },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_AASHIMA, USB_DEVICE_ID_AASHIMA_PREDATOR), HID_QUIRK_BADPAD },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ADATA_XPG, USB_VENDOR_ID_ADATA_XPG_WL_GAMING_MOUSE), HID_QUIRK_ALWAYS_POLL },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_ADATA_XPG, USB_VENDOR_ID_ADATA_XPG_WL_GAMING_MOUSE_DONGLE), HID_QUIRK_ALWAYS_POLL },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_AFATECH, USB_DEVICE_ID_AFATECH_AF9016), HID_QUIRK_FULLSPEED_INTERVAL },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_AIREN, USB_DEVICE_ID_AIREN_SLIMPLUS), HID_QUIRK_NOGET },
|
||||
{ HID_USB_DEVICE(USB_VENDOR_ID_AKAI_09E8, USB_DEVICE_ID_AKAI_09E8_MIDIMIX), HID_QUIRK_NO_INIT_REPORTS },
|
||||
|
||||
@@ -160,7 +160,7 @@ static int usb_kbd_event(struct input_dev *dev, unsigned int type,
|
||||
return -1;
|
||||
|
||||
spin_lock_irqsave(&kbd->leds_lock, flags);
|
||||
kbd->newleds = (!!test_bit(LED_KANA, dev->led) << 3) | (!!test_bit(LED_COMPOSE, dev->led) << 3) |
|
||||
kbd->newleds = (!!test_bit(LED_KANA, dev->led) << 4) | (!!test_bit(LED_COMPOSE, dev->led) << 3) |
|
||||
(!!test_bit(LED_SCROLLL, dev->led) << 2) | (!!test_bit(LED_CAPSL, dev->led) << 1) |
|
||||
(!!test_bit(LED_NUML, dev->led));
|
||||
|
||||
|
||||
@@ -394,7 +394,12 @@ static int gpio_fan_set_cur_state(struct thermal_cooling_device *cdev,
|
||||
if (state >= fan_data->num_speed)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&fan_data->lock);
|
||||
|
||||
set_fan_speed(fan_data, state);
|
||||
|
||||
mutex_unlock(&fan_data->lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -490,7 +495,11 @@ MODULE_DEVICE_TABLE(of, of_gpio_fan_match);
|
||||
|
||||
static void gpio_fan_stop(void *data)
|
||||
{
|
||||
struct gpio_fan_data *fan_data = data;
|
||||
|
||||
mutex_lock(&fan_data->lock);
|
||||
set_fan_speed(data, 0);
|
||||
mutex_unlock(&fan_data->lock);
|
||||
}
|
||||
|
||||
static int gpio_fan_probe(struct platform_device *pdev)
|
||||
@@ -564,7 +573,9 @@ static int gpio_fan_suspend(struct device *dev)
|
||||
|
||||
if (fan_data->gpios) {
|
||||
fan_data->resume_speed = fan_data->speed_index;
|
||||
mutex_lock(&fan_data->lock);
|
||||
set_fan_speed(fan_data, 0);
|
||||
mutex_unlock(&fan_data->lock);
|
||||
}
|
||||
|
||||
return 0;
|
||||
@@ -574,8 +585,11 @@ static int gpio_fan_resume(struct device *dev)
|
||||
{
|
||||
struct gpio_fan_data *fan_data = dev_get_drvdata(dev);
|
||||
|
||||
if (fan_data->gpios)
|
||||
if (fan_data->gpios) {
|
||||
mutex_lock(&fan_data->lock);
|
||||
set_fan_speed(fan_data, fan_data->resume_speed);
|
||||
mutex_unlock(&fan_data->lock);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -110,7 +110,7 @@ struct xgene_hwmon_dev {
|
||||
|
||||
phys_addr_t comm_base_addr;
|
||||
void *pcc_comm_addr;
|
||||
u64 usecs_lat;
|
||||
unsigned int usecs_lat;
|
||||
};
|
||||
|
||||
/*
|
||||
|
||||
@@ -616,9 +616,9 @@ static int lpi2c_imx_probe(struct platform_device *pdev)
|
||||
return 0;
|
||||
|
||||
rpm_disable:
|
||||
pm_runtime_put(&pdev->dev);
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
pm_runtime_dont_use_autosuspend(&pdev->dev);
|
||||
pm_runtime_put_sync(&pdev->dev);
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1508,7 +1508,10 @@ static int i2c_pxa_probe(struct platform_device *dev)
|
||||
i2c->adap.name);
|
||||
}
|
||||
|
||||
clk_prepare_enable(i2c->clk);
|
||||
ret = clk_prepare_enable(i2c->clk);
|
||||
if (ret)
|
||||
return dev_err_probe(&dev->dev, ret,
|
||||
"failed to enable clock\n");
|
||||
|
||||
if (i2c->use_pio) {
|
||||
i2c->adap.algo = &i2c_pxa_pio_algorithm;
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/interconnect.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/module.h>
|
||||
@@ -150,6 +151,8 @@
|
||||
/* TAG length for DATA READ in RX FIFO */
|
||||
#define READ_RX_TAGS_LEN 2
|
||||
|
||||
#define QUP_BUS_WIDTH 8
|
||||
|
||||
static unsigned int scl_freq;
|
||||
module_param_named(scl_freq, scl_freq, uint, 0444);
|
||||
MODULE_PARM_DESC(scl_freq, "SCL frequency override");
|
||||
@@ -227,6 +230,7 @@ struct qup_i2c_dev {
|
||||
int irq;
|
||||
struct clk *clk;
|
||||
struct clk *pclk;
|
||||
struct icc_path *icc_path;
|
||||
struct i2c_adapter adap;
|
||||
|
||||
int clk_ctl;
|
||||
@@ -255,6 +259,10 @@ struct qup_i2c_dev {
|
||||
/* To configure when bus is in run state */
|
||||
u32 config_run;
|
||||
|
||||
/* bandwidth votes */
|
||||
u32 src_clk_freq;
|
||||
u32 cur_bw_clk_freq;
|
||||
|
||||
/* dma parameters */
|
||||
bool is_dma;
|
||||
/* To check if the current transfer is using DMA */
|
||||
@@ -453,6 +461,23 @@ static int qup_i2c_bus_active(struct qup_i2c_dev *qup, int len)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int qup_i2c_vote_bw(struct qup_i2c_dev *qup, u32 clk_freq)
|
||||
{
|
||||
u32 needed_peak_bw;
|
||||
int ret;
|
||||
|
||||
if (qup->cur_bw_clk_freq == clk_freq)
|
||||
return 0;
|
||||
|
||||
needed_peak_bw = Bps_to_icc(clk_freq * QUP_BUS_WIDTH);
|
||||
ret = icc_set_bw(qup->icc_path, 0, needed_peak_bw);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
qup->cur_bw_clk_freq = clk_freq;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void qup_i2c_write_tx_fifo_v1(struct qup_i2c_dev *qup)
|
||||
{
|
||||
struct qup_i2c_block *blk = &qup->blk;
|
||||
@@ -840,6 +865,10 @@ static int qup_i2c_bam_xfer(struct i2c_adapter *adap, struct i2c_msg *msg,
|
||||
int ret = 0;
|
||||
int idx = 0;
|
||||
|
||||
ret = qup_i2c_vote_bw(qup, qup->src_clk_freq);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
enable_irq(qup->irq);
|
||||
ret = qup_i2c_req_dma(qup);
|
||||
|
||||
@@ -1645,6 +1674,7 @@ static void qup_i2c_disable_clocks(struct qup_i2c_dev *qup)
|
||||
config = readl(qup->base + QUP_CONFIG);
|
||||
config |= QUP_CLOCK_AUTO_GATE;
|
||||
writel(config, qup->base + QUP_CONFIG);
|
||||
qup_i2c_vote_bw(qup, 0);
|
||||
clk_disable_unprepare(qup->pclk);
|
||||
}
|
||||
|
||||
@@ -1745,6 +1775,11 @@ static int qup_i2c_probe(struct platform_device *pdev)
|
||||
goto fail_dma;
|
||||
}
|
||||
qup->is_dma = true;
|
||||
|
||||
qup->icc_path = devm_of_icc_get(&pdev->dev, NULL);
|
||||
if (IS_ERR(qup->icc_path))
|
||||
return dev_err_probe(&pdev->dev, PTR_ERR(qup->icc_path),
|
||||
"failed to get interconnect path\n");
|
||||
}
|
||||
|
||||
nodma:
|
||||
@@ -1793,6 +1828,7 @@ nodma:
|
||||
qup_i2c_enable_clocks(qup);
|
||||
src_clk_freq = clk_get_rate(qup->clk);
|
||||
}
|
||||
qup->src_clk_freq = src_clk_freq;
|
||||
|
||||
/*
|
||||
* Bootloaders might leave a pending interrupt on certain QUP's,
|
||||
|
||||
@@ -214,9 +214,9 @@ static const struct iio_chan_spec adis16201_channels[] = {
|
||||
BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 14),
|
||||
ADIS_AUX_ADC_CHAN(ADIS16201_AUX_ADC_REG, ADIS16201_SCAN_AUX_ADC, 0, 12),
|
||||
ADIS_INCLI_CHAN(X, ADIS16201_XINCL_OUT_REG, ADIS16201_SCAN_INCLI_X,
|
||||
BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 14),
|
||||
BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 12),
|
||||
ADIS_INCLI_CHAN(Y, ADIS16201_YINCL_OUT_REG, ADIS16201_SCAN_INCLI_Y,
|
||||
BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 14),
|
||||
BIT(IIO_CHAN_INFO_CALIBBIAS), 0, 12),
|
||||
IIO_CHAN_SOFT_TIMESTAMP(7)
|
||||
};
|
||||
|
||||
|
||||
@@ -127,7 +127,7 @@ static int ad7606_spi_reg_read(struct ad7606_state *st, unsigned int addr)
|
||||
{
|
||||
.tx_buf = &st->d16[0],
|
||||
.len = 2,
|
||||
.cs_change = 0,
|
||||
.cs_change = 1,
|
||||
}, {
|
||||
.rx_buf = &st->d16[1],
|
||||
.len = 2,
|
||||
|
||||
@@ -168,7 +168,7 @@ struct ad7768_state {
|
||||
union {
|
||||
struct {
|
||||
__be32 chan;
|
||||
s64 timestamp;
|
||||
aligned_s64 timestamp;
|
||||
} scan;
|
||||
__be32 d32;
|
||||
u8 d8[2];
|
||||
|
||||
@@ -483,7 +483,7 @@ static irqreturn_t dln2_adc_trigger_h(int irq, void *p)
|
||||
struct iio_dev *indio_dev = pf->indio_dev;
|
||||
struct {
|
||||
__le16 values[DLN2_ADC_MAX_CHANNELS];
|
||||
int64_t timestamp_space;
|
||||
aligned_s64 timestamp_space;
|
||||
} data;
|
||||
struct dln2_adc_get_all_vals dev_data;
|
||||
struct dln2_adc *dln2 = iio_priv(indio_dev);
|
||||
|
||||
@@ -232,7 +232,7 @@ static irqreturn_t sps30_trigger_handler(int irq, void *p)
|
||||
int ret;
|
||||
struct {
|
||||
s32 data[4]; /* PM1, PM2P5, PM4, PM10 */
|
||||
s64 ts;
|
||||
aligned_s64 ts;
|
||||
} scan;
|
||||
|
||||
mutex_lock(&state->lock);
|
||||
|
||||
@@ -369,6 +369,9 @@ int st_lsm6dsx_read_fifo(struct st_lsm6dsx_hw *hw)
|
||||
if (fifo_status & cpu_to_le16(ST_LSM6DSX_FIFO_EMPTY_MASK))
|
||||
return 0;
|
||||
|
||||
if (!pattern_len)
|
||||
pattern_len = ST_LSM6DSX_SAMPLE_SIZE;
|
||||
|
||||
fifo_len = (le16_to_cpu(fifo_status) & fifo_diff_mask) *
|
||||
ST_LSM6DSX_CHAN_SIZE;
|
||||
fifo_len = (fifo_len / pattern_len) * pattern_len;
|
||||
@@ -586,6 +589,9 @@ int st_lsm6dsx_read_tagged_fifo(struct st_lsm6dsx_hw *hw)
|
||||
if (!fifo_len)
|
||||
return 0;
|
||||
|
||||
if (!pattern_len)
|
||||
pattern_len = ST_LSM6DSX_TAGGED_SAMPLE_SIZE;
|
||||
|
||||
for (read_len = 0; read_len < fifo_len; read_len += pattern_len) {
|
||||
err = st_lsm6dsx_read_block(hw,
|
||||
ST_LSM6DSX_REG_FIFO_OUT_TAG_ADDR,
|
||||
|
||||
@@ -69,11 +69,8 @@ int rxe_cq_from_init(struct rxe_dev *rxe, struct rxe_cq *cq, int cqe,
|
||||
|
||||
err = do_mmap_info(rxe, uresp ? &uresp->mi : NULL, udata,
|
||||
cq->queue->buf, cq->queue->buf_size, &cq->queue->ip);
|
||||
if (err) {
|
||||
vfree(cq->queue->buf);
|
||||
kfree(cq->queue);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
if (uresp)
|
||||
cq->is_user = 1;
|
||||
|
||||
@@ -163,6 +163,7 @@ static const char * const topbuttonpad_pnp_ids[] = {
|
||||
|
||||
static const char * const smbus_pnp_ids[] = {
|
||||
/* all of the topbuttonpad_pnp_ids are valid, we just add some extras */
|
||||
"DLL060d", /* Dell Precision M3800 */
|
||||
"LEN0048", /* X1 Carbon 3 */
|
||||
"LEN0046", /* X250 */
|
||||
"LEN0049", /* Yoga 11e */
|
||||
@@ -187,11 +188,15 @@ static const char * const smbus_pnp_ids[] = {
|
||||
"LEN2054", /* E480 */
|
||||
"LEN2055", /* E580 */
|
||||
"LEN2068", /* T14 Gen 1 */
|
||||
"SYN1221", /* TUXEDO InfinityBook Pro 14 v5 */
|
||||
"SYN3003", /* HP EliteBook 850 G1 */
|
||||
"SYN3015", /* HP EliteBook 840 G2 */
|
||||
"SYN3052", /* HP EliteBook 840 G4 */
|
||||
"SYN3221", /* HP 15-ay000 */
|
||||
"SYN323d", /* HP Spectre X360 13-w013dx */
|
||||
"SYN3257", /* HP Envy 13-ad105ng */
|
||||
"TOS01f6", /* Dynabook Portege X30L-G */
|
||||
"TOS0213", /* Dynabook Portege X30-D */
|
||||
NULL
|
||||
};
|
||||
|
||||
|
||||
@@ -3243,6 +3243,14 @@ found:
|
||||
while (*uid == '0' && *(uid + 1))
|
||||
uid++;
|
||||
|
||||
if (strlen(hid) >= ACPIHID_HID_LEN) {
|
||||
pr_err("Invalid command line: hid is too long\n");
|
||||
return 1;
|
||||
} else if (strlen(uid) >= ACPIHID_UID_LEN) {
|
||||
pr_err("Invalid command line: uid is too long\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
i = early_acpihid_map_size++;
|
||||
memcpy(early_acpihid_map[i].hid, hid, strlen(hid));
|
||||
memcpy(early_acpihid_map[i].uid, uid, strlen(uid));
|
||||
|
||||
@@ -6234,6 +6234,9 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2e30, quirk_iommu_igfx);
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2e40, quirk_iommu_igfx);
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x2e90, quirk_iommu_igfx);
|
||||
|
||||
/* QM57/QS57 integrated gfx malfunctions with dmar */
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x0044, quirk_iommu_igfx);
|
||||
|
||||
/* Broadwell igfx malfunctions with dmar */
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x1606, quirk_iommu_igfx);
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x160B, quirk_iommu_igfx);
|
||||
@@ -6311,7 +6314,6 @@ static void quirk_calpella_no_shadow_gtt(struct pci_dev *dev)
|
||||
}
|
||||
}
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x0040, quirk_calpella_no_shadow_gtt);
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x0044, quirk_calpella_no_shadow_gtt);
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x0062, quirk_calpella_no_shadow_gtt);
|
||||
DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, 0x006a, quirk_calpella_no_shadow_gtt);
|
||||
|
||||
|
||||
@@ -263,7 +263,7 @@ static struct msi_domain_info gicv2m_pmsi_domain_info = {
|
||||
.chip = &gicv2m_pmsi_irq_chip,
|
||||
};
|
||||
|
||||
static void gicv2m_teardown(void)
|
||||
static void __init gicv2m_teardown(void)
|
||||
{
|
||||
struct v2m_data *v2m, *tmp;
|
||||
|
||||
@@ -278,7 +278,7 @@ static void gicv2m_teardown(void)
|
||||
}
|
||||
}
|
||||
|
||||
static int gicv2m_allocate_domains(struct irq_domain *parent)
|
||||
static __init int gicv2m_allocate_domains(struct irq_domain *parent)
|
||||
{
|
||||
struct irq_domain *inner_domain, *pci_domain, *plat_domain;
|
||||
struct v2m_data *v2m;
|
||||
@@ -408,7 +408,7 @@ err_free_v2m:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct of_device_id gicv2m_device_id[] = {
|
||||
static __initconst struct of_device_id gicv2m_device_id[] = {
|
||||
{ .compatible = "arm,gic-v2m-frame", },
|
||||
{},
|
||||
};
|
||||
@@ -473,7 +473,7 @@ static struct fwnode_handle *gicv2m_get_fwnode(struct device *dev)
|
||||
return data->fwnode;
|
||||
}
|
||||
|
||||
static bool acpi_check_amazon_graviton_quirks(void)
|
||||
static __init bool acpi_check_amazon_graviton_quirks(void)
|
||||
{
|
||||
static struct acpi_table_madt *madt;
|
||||
acpi_status status;
|
||||
|
||||
@@ -344,11 +344,12 @@ struct mbox_chan *mbox_request_channel(struct mbox_client *cl, int index)
|
||||
|
||||
mutex_lock(&con_mutex);
|
||||
|
||||
if (of_parse_phandle_with_args(dev->of_node, "mboxes",
|
||||
"#mbox-cells", index, &spec)) {
|
||||
ret = of_parse_phandle_with_args(dev->of_node, "mboxes", "#mbox-cells",
|
||||
index, &spec);
|
||||
if (ret) {
|
||||
dev_dbg(dev, "%s: can't parse \"mboxes\" property\n", __func__);
|
||||
mutex_unlock(&con_mutex);
|
||||
return ERR_PTR(-ENODEV);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
chan = ERR_PTR(-EPROBE_DEFER);
|
||||
|
||||
@@ -2958,6 +2958,27 @@ static dm_cblock_t get_cache_dev_size(struct cache *cache)
|
||||
return to_cblock(size);
|
||||
}
|
||||
|
||||
static bool can_resume(struct cache *cache)
|
||||
{
|
||||
/*
|
||||
* Disallow retrying the resume operation for devices that failed the
|
||||
* first resume attempt, as the failure leaves the policy object partially
|
||||
* initialized. Retrying could trigger BUG_ON when loading cache mappings
|
||||
* into the incomplete policy object.
|
||||
*/
|
||||
if (cache->sized && !cache->loaded_mappings) {
|
||||
if (get_cache_mode(cache) != CM_WRITE)
|
||||
DMERR("%s: unable to resume a failed-loaded cache, please check metadata.",
|
||||
cache_device_name(cache));
|
||||
else
|
||||
DMERR("%s: unable to resume cache due to missing proper cache table reload",
|
||||
cache_device_name(cache));
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool can_resize(struct cache *cache, dm_cblock_t new_size)
|
||||
{
|
||||
if (from_cblock(new_size) > from_cblock(cache->cache_size)) {
|
||||
@@ -3006,6 +3027,9 @@ static int cache_preresume(struct dm_target *ti)
|
||||
struct cache *cache = ti->private;
|
||||
dm_cblock_t csize = get_cache_dev_size(cache);
|
||||
|
||||
if (!can_resume(cache))
|
||||
return -EINVAL;
|
||||
|
||||
/*
|
||||
* Check to see if the cache has resized.
|
||||
*/
|
||||
|
||||
@@ -4392,7 +4392,7 @@ static void dm_integrity_dtr(struct dm_target *ti)
|
||||
BUG_ON(!RB_EMPTY_ROOT(&ic->in_progress));
|
||||
BUG_ON(!list_empty(&ic->wait_list));
|
||||
|
||||
if (ic->mode == 'B')
|
||||
if (ic->mode == 'B' && ic->bitmap_flush_work.work.func)
|
||||
cancel_delayed_work_sync(&ic->bitmap_flush_work);
|
||||
if (ic->metadata_wq)
|
||||
destroy_workqueue(ic->metadata_wq);
|
||||
|
||||
@@ -517,8 +517,9 @@ static char **realloc_argv(unsigned *size, char **old_argv)
|
||||
gfp = GFP_NOIO;
|
||||
}
|
||||
argv = kmalloc_array(new_size, sizeof(*argv), gfp);
|
||||
if (argv && old_argv) {
|
||||
memcpy(argv, old_argv, *size * sizeof(*argv));
|
||||
if (argv) {
|
||||
if (old_argv)
|
||||
memcpy(argv, old_argv, *size * sizeof(*argv));
|
||||
*size = new_size;
|
||||
}
|
||||
|
||||
@@ -685,6 +686,10 @@ int dm_table_add_target(struct dm_table *t, const char *type,
|
||||
DMERR("%s: zero-length target", dm_device_name(t->md));
|
||||
return -EINVAL;
|
||||
}
|
||||
if (start + len < start || start + len > LLONG_MAX >> SECTOR_SHIFT) {
|
||||
DMERR("%s: too large device", dm_device_name(t->md));
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
tgt->type = dm_get_target_type(type);
|
||||
if (!tgt->type) {
|
||||
|
||||
@@ -811,13 +811,12 @@ static int c8sectpfe_probe(struct platform_device *pdev)
|
||||
}
|
||||
tsin->i2c_adapter =
|
||||
of_find_i2c_adapter_by_node(i2c_bus);
|
||||
of_node_put(i2c_bus);
|
||||
if (!tsin->i2c_adapter) {
|
||||
dev_err(&pdev->dev, "No i2c adapter found\n");
|
||||
of_node_put(i2c_bus);
|
||||
ret = -ENODEV;
|
||||
goto err_clk_disable;
|
||||
}
|
||||
of_node_put(i2c_bus);
|
||||
|
||||
tsin->rst_gpio = of_get_named_gpio(child, "reset-gpios", 0);
|
||||
|
||||
|
||||
@@ -1722,6 +1722,8 @@ static void cx231xx_video_dev_init(
|
||||
vfd->lock = &dev->lock;
|
||||
vfd->release = video_device_release_empty;
|
||||
vfd->ctrl_handler = &dev->mpeg_ctrl_handler.hdl;
|
||||
vfd->device_caps = V4L2_CAP_READWRITE | V4L2_CAP_STREAMING |
|
||||
V4L2_CAP_VIDEO_CAPTURE;
|
||||
video_set_drvdata(vfd, dev);
|
||||
if (dev->tuner_type == TUNER_ABSENT) {
|
||||
v4l2_disable_ioctl(vfd, VIDIOC_G_FREQUENCY);
|
||||
|
||||
@@ -315,6 +315,8 @@ static int call_enum_dv_timings(struct v4l2_subdev *sd,
|
||||
static int call_get_mbus_config(struct v4l2_subdev *sd, unsigned int pad,
|
||||
struct v4l2_mbus_config *config)
|
||||
{
|
||||
memset(config, 0, sizeof(*config));
|
||||
|
||||
return check_pad(sd, pad) ? :
|
||||
sd->ops->pad->get_mbus_config(sd, pad, config);
|
||||
}
|
||||
|
||||
@@ -1108,26 +1108,26 @@ int renesas_sdhi_probe(struct platform_device *pdev,
|
||||
num_irqs = platform_irq_count(pdev);
|
||||
if (num_irqs < 0) {
|
||||
ret = num_irqs;
|
||||
goto eirq;
|
||||
goto edisclk;
|
||||
}
|
||||
|
||||
/* There must be at least one IRQ source */
|
||||
if (!num_irqs) {
|
||||
ret = -ENXIO;
|
||||
goto eirq;
|
||||
goto edisclk;
|
||||
}
|
||||
|
||||
for (i = 0; i < num_irqs; i++) {
|
||||
irq = platform_get_irq(pdev, i);
|
||||
if (irq < 0) {
|
||||
ret = irq;
|
||||
goto eirq;
|
||||
goto edisclk;
|
||||
}
|
||||
|
||||
ret = devm_request_irq(&pdev->dev, irq, tmio_mmc_irq, 0,
|
||||
dev_name(&pdev->dev), host);
|
||||
if (ret)
|
||||
goto eirq;
|
||||
goto edisclk;
|
||||
}
|
||||
|
||||
ret = tmio_mmc_host_probe(host);
|
||||
@@ -1139,8 +1139,6 @@ int renesas_sdhi_probe(struct platform_device *pdev,
|
||||
|
||||
return ret;
|
||||
|
||||
eirq:
|
||||
tmio_mmc_host_remove(host);
|
||||
edisclk:
|
||||
renesas_sdhi_clk_disable(host);
|
||||
efree:
|
||||
|
||||
@@ -666,8 +666,12 @@ static void sdhci_intel_set_power(struct sdhci_host *host, unsigned char mode,
|
||||
|
||||
sdhci_set_power(host, mode, vdd);
|
||||
|
||||
if (mode == MMC_POWER_OFF)
|
||||
if (mode == MMC_POWER_OFF) {
|
||||
if (slot->chip->pdev->device == PCI_DEVICE_ID_INTEL_APL_SD ||
|
||||
slot->chip->pdev->device == PCI_DEVICE_ID_INTEL_BYT_SD)
|
||||
usleep_range(15000, 17500);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Bus power might not enable after D3 -> D0 transition due to the
|
||||
|
||||
@@ -1999,10 +1999,15 @@ void sdhci_set_clock(struct sdhci_host *host, unsigned int clock)
|
||||
|
||||
host->mmc->actual_clock = 0;
|
||||
|
||||
sdhci_writew(host, 0, SDHCI_CLOCK_CONTROL);
|
||||
clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL);
|
||||
if (clk & SDHCI_CLOCK_CARD_EN)
|
||||
sdhci_writew(host, clk & ~SDHCI_CLOCK_CARD_EN,
|
||||
SDHCI_CLOCK_CONTROL);
|
||||
|
||||
if (clock == 0)
|
||||
if (clock == 0) {
|
||||
sdhci_writew(host, 0, SDHCI_CLOCK_CONTROL);
|
||||
return;
|
||||
}
|
||||
|
||||
clk = sdhci_calc_clk(host, clock, &host->mmc->actual_clock);
|
||||
sdhci_enable_clk(host, clk);
|
||||
|
||||
@@ -2239,7 +2239,7 @@ static int __bond_release_one(struct net_device *bond_dev,
|
||||
|
||||
RCU_INIT_POINTER(bond->current_arp_slave, NULL);
|
||||
|
||||
if (!all && (!bond->params.fail_over_mac ||
|
||||
if (!all && (bond->params.fail_over_mac != BOND_FOM_ACTIVE ||
|
||||
BOND_MODE(bond) != BOND_MODE_ACTIVEBACKUP)) {
|
||||
if (ether_addr_equal_64bits(bond_dev->dev_addr, slave->perm_hwaddr) &&
|
||||
bond_has_slaves(bond))
|
||||
|
||||
@@ -330,7 +330,7 @@ static int c_can_plat_probe(struct platform_device *pdev)
|
||||
/* Check if we need custom RAMINIT via syscon. Mostly for TI
|
||||
* platforms. Only supported with DT boot.
|
||||
*/
|
||||
if (np && of_property_read_bool(np, "syscon-raminit")) {
|
||||
if (np && of_property_present(np, "syscon-raminit")) {
|
||||
u32 id;
|
||||
struct c_can_raminit *raminit = &priv->raminit_sys;
|
||||
|
||||
|
||||
@@ -2889,8 +2889,8 @@ static int mcp251xfd_remove(struct spi_device *spi)
|
||||
struct mcp251xfd_priv *priv = spi_get_drvdata(spi);
|
||||
struct net_device *ndev = priv->ndev;
|
||||
|
||||
can_rx_offload_del(&priv->offload);
|
||||
mcp251xfd_unregister(priv);
|
||||
can_rx_offload_del(&priv->offload);
|
||||
spi->max_speed_hz = priv->spi_max_speed_hz_orig;
|
||||
free_candev(ndev);
|
||||
|
||||
|
||||
@@ -373,15 +373,17 @@ static void b53_enable_vlan(struct b53_device *dev, bool enable,
|
||||
b53_read8(dev, B53_VLAN_PAGE, B53_VLAN_CTRL5, &vc5);
|
||||
}
|
||||
|
||||
vc1 &= ~VC1_RX_MCST_FWD_EN;
|
||||
|
||||
if (enable) {
|
||||
vc0 |= VC0_VLAN_EN | VC0_VID_CHK_EN | VC0_VID_HASH_VID;
|
||||
vc1 |= VC1_RX_MCST_UNTAG_EN | VC1_RX_MCST_FWD_EN;
|
||||
vc1 |= VC1_RX_MCST_UNTAG_EN;
|
||||
vc4 &= ~VC4_ING_VID_CHECK_MASK;
|
||||
if (enable_filtering) {
|
||||
vc4 |= VC4_ING_VID_VIO_DROP << VC4_ING_VID_CHECK_S;
|
||||
vc5 |= VC5_DROP_VTABLE_MISS;
|
||||
} else {
|
||||
vc4 |= VC4_ING_VID_VIO_FWD << VC4_ING_VID_CHECK_S;
|
||||
vc4 |= VC4_NO_ING_VID_CHK << VC4_ING_VID_CHECK_S;
|
||||
vc5 &= ~VC5_DROP_VTABLE_MISS;
|
||||
}
|
||||
|
||||
@@ -393,7 +395,7 @@ static void b53_enable_vlan(struct b53_device *dev, bool enable,
|
||||
|
||||
} else {
|
||||
vc0 &= ~(VC0_VLAN_EN | VC0_VID_CHK_EN | VC0_VID_HASH_VID);
|
||||
vc1 &= ~(VC1_RX_MCST_UNTAG_EN | VC1_RX_MCST_FWD_EN);
|
||||
vc1 &= ~VC1_RX_MCST_UNTAG_EN;
|
||||
vc4 &= ~VC4_ING_VID_CHECK_MASK;
|
||||
vc5 &= ~VC5_DROP_VTABLE_MISS;
|
||||
|
||||
@@ -1870,7 +1872,7 @@ EXPORT_SYMBOL(b53_br_join);
|
||||
void b53_br_leave(struct dsa_switch *ds, int port, struct net_device *br)
|
||||
{
|
||||
struct b53_device *dev = ds->priv;
|
||||
struct b53_vlan *vl = &dev->vlans[0];
|
||||
struct b53_vlan *vl;
|
||||
s8 cpu_port = dsa_to_port(ds, port)->cpu_dp->index;
|
||||
unsigned int i;
|
||||
u16 pvlan, reg, pvid;
|
||||
@@ -1896,6 +1898,7 @@ void b53_br_leave(struct dsa_switch *ds, int port, struct net_device *br)
|
||||
dev->ports[port].vlan_ctl_mask = pvlan;
|
||||
|
||||
pvid = b53_default_pvid(dev);
|
||||
vl = &dev->vlans[pvid];
|
||||
|
||||
/* Make this port join all VLANs without VLAN entries */
|
||||
if (is58xx(dev)) {
|
||||
|
||||
@@ -1644,6 +1644,7 @@ static void sja1105_bridge_stp_state_set(struct dsa_switch *ds, int port,
|
||||
switch (state) {
|
||||
case BR_STATE_DISABLED:
|
||||
case BR_STATE_BLOCKING:
|
||||
case BR_STATE_LISTENING:
|
||||
/* From UM10944 description of DRPDTAG (why put this there?):
|
||||
* "Management traffic flows to the port regardless of the state
|
||||
* of the INGRESS flag". So BPDUs are still be allowed to pass.
|
||||
@@ -1653,11 +1654,6 @@ static void sja1105_bridge_stp_state_set(struct dsa_switch *ds, int port,
|
||||
mac[port].egress = false;
|
||||
mac[port].dyn_learn = false;
|
||||
break;
|
||||
case BR_STATE_LISTENING:
|
||||
mac[port].ingress = true;
|
||||
mac[port].egress = false;
|
||||
mac[port].dyn_learn = false;
|
||||
break;
|
||||
case BR_STATE_LEARNING:
|
||||
mac[port].ingress = true;
|
||||
mac[port].egress = false;
|
||||
|
||||
@@ -373,8 +373,13 @@ static int xgbe_map_rx_buffer(struct xgbe_prv_data *pdata,
|
||||
}
|
||||
|
||||
/* Set up the header page info */
|
||||
xgbe_set_buffer_data(&rdata->rx.hdr, &ring->rx_hdr_pa,
|
||||
XGBE_SKB_ALLOC_SIZE);
|
||||
if (pdata->netdev->features & NETIF_F_RXCSUM) {
|
||||
xgbe_set_buffer_data(&rdata->rx.hdr, &ring->rx_hdr_pa,
|
||||
XGBE_SKB_ALLOC_SIZE);
|
||||
} else {
|
||||
xgbe_set_buffer_data(&rdata->rx.hdr, &ring->rx_hdr_pa,
|
||||
pdata->rx_buf_size);
|
||||
}
|
||||
|
||||
/* Set up the buffer page info */
|
||||
xgbe_set_buffer_data(&rdata->rx.buf, &ring->rx_buf_pa,
|
||||
|
||||
@@ -320,6 +320,18 @@ static void xgbe_config_sph_mode(struct xgbe_prv_data *pdata)
|
||||
XGMAC_IOWRITE_BITS(pdata, MAC_RCR, HDSMS, XGBE_SPH_HDSMS_SIZE);
|
||||
}
|
||||
|
||||
static void xgbe_disable_sph_mode(struct xgbe_prv_data *pdata)
|
||||
{
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < pdata->channel_count; i++) {
|
||||
if (!pdata->channel[i]->rx_ring)
|
||||
break;
|
||||
|
||||
XGMAC_DMA_IOWRITE_BITS(pdata->channel[i], DMA_CH_CR, SPH, 0);
|
||||
}
|
||||
}
|
||||
|
||||
static int xgbe_write_rss_reg(struct xgbe_prv_data *pdata, unsigned int type,
|
||||
unsigned int index, unsigned int val)
|
||||
{
|
||||
@@ -3495,8 +3507,12 @@ static int xgbe_init(struct xgbe_prv_data *pdata)
|
||||
xgbe_config_tx_coalesce(pdata);
|
||||
xgbe_config_rx_buffer_size(pdata);
|
||||
xgbe_config_tso_mode(pdata);
|
||||
xgbe_config_sph_mode(pdata);
|
||||
xgbe_config_rss(pdata);
|
||||
|
||||
if (pdata->netdev->features & NETIF_F_RXCSUM) {
|
||||
xgbe_config_sph_mode(pdata);
|
||||
xgbe_config_rss(pdata);
|
||||
}
|
||||
|
||||
desc_if->wrapper_tx_desc_init(pdata);
|
||||
desc_if->wrapper_rx_desc_init(pdata);
|
||||
xgbe_enable_dma_interrupts(pdata);
|
||||
@@ -3650,5 +3666,9 @@ void xgbe_init_function_ptrs_dev(struct xgbe_hw_if *hw_if)
|
||||
hw_if->disable_vxlan = xgbe_disable_vxlan;
|
||||
hw_if->set_vxlan_id = xgbe_set_vxlan_id;
|
||||
|
||||
/* For Split Header*/
|
||||
hw_if->enable_sph = xgbe_config_sph_mode;
|
||||
hw_if->disable_sph = xgbe_disable_sph_mode;
|
||||
|
||||
DBGPR("<--xgbe_init_function_ptrs\n");
|
||||
}
|
||||
|
||||
@@ -2264,10 +2264,17 @@ static int xgbe_set_features(struct net_device *netdev,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if ((features & NETIF_F_RXCSUM) && !rxcsum)
|
||||
if ((features & NETIF_F_RXCSUM) && !rxcsum) {
|
||||
hw_if->enable_sph(pdata);
|
||||
hw_if->enable_vxlan(pdata);
|
||||
hw_if->enable_rx_csum(pdata);
|
||||
else if (!(features & NETIF_F_RXCSUM) && rxcsum)
|
||||
schedule_work(&pdata->restart_work);
|
||||
} else if (!(features & NETIF_F_RXCSUM) && rxcsum) {
|
||||
hw_if->disable_sph(pdata);
|
||||
hw_if->disable_vxlan(pdata);
|
||||
hw_if->disable_rx_csum(pdata);
|
||||
schedule_work(&pdata->restart_work);
|
||||
}
|
||||
|
||||
if ((features & NETIF_F_HW_VLAN_CTAG_RX) && !rxvlan)
|
||||
hw_if->enable_rx_vlan_stripping(pdata);
|
||||
|
||||
@@ -833,6 +833,10 @@ struct xgbe_hw_if {
|
||||
void (*enable_vxlan)(struct xgbe_prv_data *);
|
||||
void (*disable_vxlan)(struct xgbe_prv_data *);
|
||||
void (*set_vxlan_id)(struct xgbe_prv_data *);
|
||||
|
||||
/* For Split Header */
|
||||
void (*enable_sph)(struct xgbe_prv_data *pdata);
|
||||
void (*disable_sph)(struct xgbe_prv_data *pdata);
|
||||
};
|
||||
|
||||
/* This structure represents implementation specific routines for an
|
||||
|
||||
@@ -9,8 +9,6 @@
|
||||
|
||||
#include "main.h"
|
||||
|
||||
static const struct acpi_device_id xge_acpi_match[];
|
||||
|
||||
static int xge_get_resources(struct xge_pdata *pdata)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
@@ -733,7 +731,7 @@ MODULE_DEVICE_TABLE(acpi, xge_acpi_match);
|
||||
static struct platform_driver xge_driver = {
|
||||
.driver = {
|
||||
.name = "xgene-enet-v2",
|
||||
.acpi_match_table = ACPI_PTR(xge_acpi_match),
|
||||
.acpi_match_table = xge_acpi_match,
|
||||
},
|
||||
.probe = xge_probe,
|
||||
.remove = xge_remove,
|
||||
|
||||
@@ -1344,6 +1344,17 @@ static int bnxt_get_regs_len(struct net_device *dev)
|
||||
return reg_len;
|
||||
}
|
||||
|
||||
#define BNXT_PCIE_32B_ENTRY(start, end) \
|
||||
{ offsetof(struct pcie_ctx_hw_stats, start), \
|
||||
offsetof(struct pcie_ctx_hw_stats, end) }
|
||||
|
||||
static const struct {
|
||||
u16 start;
|
||||
u16 end;
|
||||
} bnxt_pcie_32b_entries[] = {
|
||||
BNXT_PCIE_32B_ENTRY(pcie_ltssm_histogram[0], pcie_ltssm_histogram[3]),
|
||||
};
|
||||
|
||||
static void bnxt_get_regs(struct net_device *dev, struct ethtool_regs *regs,
|
||||
void *_p)
|
||||
{
|
||||
@@ -1372,12 +1383,27 @@ static void bnxt_get_regs(struct net_device *dev, struct ethtool_regs *regs,
|
||||
mutex_lock(&bp->hwrm_cmd_lock);
|
||||
rc = _hwrm_send_message(bp, &req, sizeof(req), HWRM_CMD_TIMEOUT);
|
||||
if (!rc) {
|
||||
__le64 *src = (__le64 *)hw_pcie_stats;
|
||||
u64 *dst = (u64 *)(_p + BNXT_PXP_REG_LEN);
|
||||
int i;
|
||||
u8 *dst = (u8 *)(_p + BNXT_PXP_REG_LEN);
|
||||
u8 *src = (u8 *)hw_pcie_stats;
|
||||
int i, j;
|
||||
|
||||
for (i = 0; i < sizeof(*hw_pcie_stats) / sizeof(__le64); i++)
|
||||
dst[i] = le64_to_cpu(src[i]);
|
||||
for (i = 0, j = 0; i < sizeof(*hw_pcie_stats); ) {
|
||||
if (i >= bnxt_pcie_32b_entries[j].start &&
|
||||
i <= bnxt_pcie_32b_entries[j].end) {
|
||||
u32 *dst32 = (u32 *)(dst + i);
|
||||
|
||||
*dst32 = le32_to_cpu(*(__le32 *)(src + i));
|
||||
i += 4;
|
||||
if (i > bnxt_pcie_32b_entries[j].end &&
|
||||
j < ARRAY_SIZE(bnxt_pcie_32b_entries) - 1)
|
||||
j++;
|
||||
} else {
|
||||
u64 *dst64 = (u64 *)(dst + i);
|
||||
|
||||
*dst64 = le64_to_cpu(*(__le64 *)(src + i));
|
||||
i += 8;
|
||||
}
|
||||
}
|
||||
}
|
||||
mutex_unlock(&bp->hwrm_cmd_lock);
|
||||
dma_free_coherent(&bp->pdev->dev, sizeof(*hw_pcie_stats), hw_pcie_stats,
|
||||
|
||||
@@ -826,22 +826,15 @@ static void macb_update_stats(struct macb *bp)
|
||||
|
||||
static int macb_halt_tx(struct macb *bp)
|
||||
{
|
||||
unsigned long halt_time, timeout;
|
||||
u32 status;
|
||||
u32 status;
|
||||
|
||||
macb_writel(bp, NCR, macb_readl(bp, NCR) | MACB_BIT(THALT));
|
||||
|
||||
timeout = jiffies + usecs_to_jiffies(MACB_HALT_TIMEOUT);
|
||||
do {
|
||||
halt_time = jiffies;
|
||||
status = macb_readl(bp, TSR);
|
||||
if (!(status & MACB_BIT(TGO)))
|
||||
return 0;
|
||||
|
||||
udelay(250);
|
||||
} while (time_before(halt_time, timeout));
|
||||
|
||||
return -ETIMEDOUT;
|
||||
/* Poll TSR until TGO is cleared or timeout. */
|
||||
return read_poll_timeout_atomic(macb_readl, status,
|
||||
!(status & MACB_BIT(TGO)),
|
||||
250, MACB_HALT_TIMEOUT, false,
|
||||
bp, TSR);
|
||||
}
|
||||
|
||||
static void macb_tx_unmap(struct macb *bp, struct macb_tx_skb *tx_skb)
|
||||
|
||||
@@ -353,7 +353,7 @@ parse_eeprom (struct net_device *dev)
|
||||
dev->dev_addr[i] = psrom->mac_addr[i];
|
||||
|
||||
if (np->chip_id == CHIP_IP1000A) {
|
||||
np->led_mode = psrom->led_mode;
|
||||
np->led_mode = le16_to_cpu(psrom->led_mode);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -335,7 +335,7 @@ typedef struct t_SROM {
|
||||
u16 sub_system_id; /* 0x06 */
|
||||
u16 pci_base_1; /* 0x08 (IP1000A only) */
|
||||
u16 pci_base_2; /* 0x0a (IP1000A only) */
|
||||
u16 led_mode; /* 0x0c (IP1000A only) */
|
||||
__le16 led_mode; /* 0x0c (IP1000A only) */
|
||||
u16 reserved1[9]; /* 0x0e-0x1f */
|
||||
u8 mac_addr[6]; /* 0x20-0x25 */
|
||||
u8 reserved2[10]; /* 0x26-0x2f */
|
||||
|
||||
@@ -602,7 +602,12 @@ static int fec_enet_txq_submit_skb(struct fec_enet_priv_tx_q *txq,
|
||||
txq->bd.cur = bdp;
|
||||
|
||||
/* Trigger transmission start */
|
||||
writel(0, txq->bd.reg_desc_active);
|
||||
if (!(fep->quirks & FEC_QUIRK_ERR007885) ||
|
||||
!readl(txq->bd.reg_desc_active) ||
|
||||
!readl(txq->bd.reg_desc_active) ||
|
||||
!readl(txq->bd.reg_desc_active) ||
|
||||
!readl(txq->bd.reg_desc_active))
|
||||
writel(0, txq->bd.reg_desc_active);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -577,7 +577,7 @@ void ice_free_cpu_rx_rmap(struct ice_vsi *vsi)
|
||||
{
|
||||
struct net_device *netdev;
|
||||
|
||||
if (!vsi || vsi->type != ICE_VSI_PF || !vsi->arfs_fltr_list)
|
||||
if (!vsi || vsi->type != ICE_VSI_PF)
|
||||
return;
|
||||
|
||||
netdev = vsi->netdev;
|
||||
@@ -600,7 +600,7 @@ int ice_set_cpu_rx_rmap(struct ice_vsi *vsi)
|
||||
int base_idx, i;
|
||||
|
||||
if (!vsi || vsi->type != ICE_VSI_PF)
|
||||
return -EINVAL;
|
||||
return 0;
|
||||
|
||||
pf = vsi->back;
|
||||
netdev = vsi->netdev;
|
||||
@@ -638,7 +638,6 @@ void ice_remove_arfs(struct ice_pf *pf)
|
||||
if (!pf_vsi)
|
||||
return;
|
||||
|
||||
ice_free_cpu_rx_rmap(pf_vsi);
|
||||
ice_clear_arfs(pf_vsi);
|
||||
}
|
||||
|
||||
@@ -655,9 +654,5 @@ void ice_rebuild_arfs(struct ice_pf *pf)
|
||||
return;
|
||||
|
||||
ice_remove_arfs(pf);
|
||||
if (ice_set_cpu_rx_rmap(pf_vsi)) {
|
||||
dev_err(ice_pf_to_dev(pf), "Failed to rebuild aRFS\n");
|
||||
return;
|
||||
}
|
||||
ice_init_arfs(pf_vsi);
|
||||
}
|
||||
|
||||
@@ -2411,6 +2411,8 @@ void ice_vsi_free_irq(struct ice_vsi *vsi)
|
||||
return;
|
||||
|
||||
vsi->irqs_ready = false;
|
||||
ice_free_cpu_rx_rmap(vsi);
|
||||
|
||||
ice_for_each_q_vector(vsi, i) {
|
||||
u16 vector = i + base;
|
||||
int irq_num;
|
||||
@@ -2424,7 +2426,8 @@ void ice_vsi_free_irq(struct ice_vsi *vsi)
|
||||
continue;
|
||||
|
||||
/* clear the affinity notifier in the IRQ descriptor */
|
||||
irq_set_affinity_notifier(irq_num, NULL);
|
||||
if (!IS_ENABLED(CONFIG_RFS_ACCEL))
|
||||
irq_set_affinity_notifier(irq_num, NULL);
|
||||
|
||||
/* clear the affinity_mask in the IRQ descriptor */
|
||||
irq_set_affinity_hint(irq_num, NULL);
|
||||
|
||||
@@ -2247,6 +2247,13 @@ static int ice_vsi_req_irq_msix(struct ice_vsi *vsi, char *basename)
|
||||
irq_set_affinity_hint(irq_num, &q_vector->affinity_mask);
|
||||
}
|
||||
|
||||
err = ice_set_cpu_rx_rmap(vsi);
|
||||
if (err) {
|
||||
netdev_err(vsi->netdev, "Failed to setup CPU RMAP on VSI %u: %pe\n",
|
||||
vsi->vsi_num, ERR_PTR(err));
|
||||
goto free_q_irqs;
|
||||
}
|
||||
|
||||
vsi->irqs_ready = true;
|
||||
return 0;
|
||||
|
||||
@@ -3242,22 +3249,12 @@ static int ice_setup_pf_sw(struct ice_pf *pf)
|
||||
*/
|
||||
ice_napi_add(vsi);
|
||||
|
||||
status = ice_set_cpu_rx_rmap(vsi);
|
||||
if (status) {
|
||||
dev_err(ice_pf_to_dev(pf), "Failed to set CPU Rx map VSI %d error %d\n",
|
||||
vsi->vsi_num, status);
|
||||
status = -EINVAL;
|
||||
goto unroll_napi_add;
|
||||
}
|
||||
status = ice_init_mac_fltr(pf);
|
||||
if (status)
|
||||
goto free_cpu_rx_map;
|
||||
goto unroll_napi_add;
|
||||
|
||||
return status;
|
||||
|
||||
free_cpu_rx_map:
|
||||
ice_free_cpu_rx_rmap(vsi);
|
||||
|
||||
unroll_napi_add:
|
||||
if (vsi) {
|
||||
ice_napi_del(vsi);
|
||||
@@ -4598,7 +4595,6 @@ static int __maybe_unused ice_suspend(struct device *dev)
|
||||
continue;
|
||||
ice_vsi_free_q_vectors(pf->vsi[v]);
|
||||
}
|
||||
ice_free_cpu_rx_rmap(ice_get_main_vsi(pf));
|
||||
ice_clear_interrupt_scheme(pf);
|
||||
|
||||
pci_save_state(pdev);
|
||||
|
||||
@@ -682,9 +682,9 @@ static struct mlx4_db_pgdir *mlx4_alloc_db_pgdir(struct device *dma_device)
|
||||
}
|
||||
|
||||
static int mlx4_alloc_db_from_pgdir(struct mlx4_db_pgdir *pgdir,
|
||||
struct mlx4_db *db, int order)
|
||||
struct mlx4_db *db, unsigned int order)
|
||||
{
|
||||
int o;
|
||||
unsigned int o;
|
||||
int i;
|
||||
|
||||
for (o = order; o <= 1; ++o) {
|
||||
@@ -712,7 +712,7 @@ found:
|
||||
return 0;
|
||||
}
|
||||
|
||||
int mlx4_db_alloc(struct mlx4_dev *dev, struct mlx4_db *db, int order)
|
||||
int mlx4_db_alloc(struct mlx4_dev *dev, struct mlx4_db *db, unsigned int order)
|
||||
{
|
||||
struct mlx4_priv *priv = mlx4_priv(dev);
|
||||
struct mlx4_db_pgdir *pgdir;
|
||||
|
||||
@@ -445,6 +445,8 @@ int mlx4_en_process_tx_cq(struct net_device *dev,
|
||||
|
||||
if (unlikely(!priv->port_up))
|
||||
return 0;
|
||||
if (unlikely(!napi_budget) && cq->type == TX_XDP)
|
||||
return 0;
|
||||
|
||||
netdev_txq_bql_complete_prefetchw(ring->tx_queue);
|
||||
|
||||
|
||||
@@ -53,6 +53,7 @@
|
||||
#define MLX5E_REP_PARAMS_DEF_LOG_SQ_SIZE \
|
||||
max(0x7, MLX5E_PARAMS_MINIMUM_LOG_SQ_SIZE)
|
||||
#define MLX5E_REP_PARAMS_DEF_NUM_CHANNELS 1
|
||||
#define MLX5E_REP_PARAMS_DEF_LOG_RQ_SIZE 0x8
|
||||
|
||||
static const char mlx5e_rep_driver_name[] = "mlx5e_rep";
|
||||
|
||||
@@ -702,6 +703,8 @@ static void mlx5e_build_rep_params(struct net_device *netdev)
|
||||
|
||||
/* RQ */
|
||||
mlx5e_build_rq_params(mdev, params);
|
||||
if (!mlx5e_is_uplink_rep(priv) && mlx5_core_is_ecpf(mdev))
|
||||
params->log_rq_mtu_frames = MLX5E_REP_PARAMS_DEF_LOG_RQ_SIZE;
|
||||
|
||||
/* CQ moderation params */
|
||||
params->rx_dim_enabled = MLX5_CAP_GEN(mdev, cq_moderation);
|
||||
@@ -740,6 +743,8 @@ static void mlx5e_build_rep_netdev(struct net_device *netdev)
|
||||
}
|
||||
|
||||
netdev->watchdog_timeo = 15 * HZ;
|
||||
if (mlx5_core_is_ecpf(mdev))
|
||||
netdev->tx_queue_len = 1 << MLX5E_REP_PARAMS_DEF_LOG_SQ_SIZE;
|
||||
|
||||
netdev->features |= NETIF_F_NETNS_LOCAL;
|
||||
|
||||
|
||||
@@ -188,6 +188,9 @@ mlx5e_test_loopback_validate(struct sk_buff *skb,
|
||||
struct udphdr *udph;
|
||||
struct iphdr *iph;
|
||||
|
||||
if (skb_linearize(skb))
|
||||
goto out;
|
||||
|
||||
/* We are only going to peek, no need to clone the SKB */
|
||||
if (MLX5E_TEST_PKT_SIZE - ETH_HLEN > skb_headlen(skb))
|
||||
goto out;
|
||||
|
||||
@@ -2317,7 +2317,9 @@ int esw_offloads_enable(struct mlx5_eswitch *esw)
|
||||
esw->offloads.encap = DEVLINK_ESWITCH_ENCAP_MODE_NONE;
|
||||
|
||||
mutex_init(&esw->offloads.termtbl_mutex);
|
||||
mlx5_rdma_enable_roce(esw->dev);
|
||||
err = mlx5_rdma_enable_roce(esw->dev);
|
||||
if (err)
|
||||
goto err_roce;
|
||||
|
||||
err = mlx5_esw_host_number_init(esw);
|
||||
if (err)
|
||||
@@ -2366,6 +2368,7 @@ err_vport_metadata:
|
||||
err_metadata:
|
||||
esw->flags &= ~MLX5_ESWITCH_VPORT_MATCH_METADATA;
|
||||
mlx5_rdma_disable_roce(esw->dev);
|
||||
err_roce:
|
||||
mutex_destroy(&esw->offloads.termtbl_mutex);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -156,11 +156,16 @@ static int temp_warn(struct notifier_block *nb, unsigned long type, void *data)
|
||||
u64 value_msb;
|
||||
|
||||
value_lsb = be64_to_cpu(eqe->data.temp_warning.sensor_warning_lsb);
|
||||
/* bit 1-63 are not supported for NICs,
|
||||
* hence read only bit 0 (asic) from lsb.
|
||||
*/
|
||||
value_lsb &= 0x1;
|
||||
value_msb = be64_to_cpu(eqe->data.temp_warning.sensor_warning_msb);
|
||||
|
||||
mlx5_core_warn(events->dev,
|
||||
"High temperature on sensors with bit set %llx %llx",
|
||||
value_msb, value_lsb);
|
||||
if (net_ratelimit())
|
||||
mlx5_core_warn(events->dev,
|
||||
"High temperature on sensors with bit set %llx %llx",
|
||||
value_msb, value_lsb);
|
||||
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
@@ -733,6 +733,7 @@ static void poll_health(struct timer_list *t)
|
||||
health->prev = count;
|
||||
if (health->miss_counter == MAX_MISSES) {
|
||||
mlx5_core_err(dev, "device's health compromised - reached miss count\n");
|
||||
health->synd = ioread8(&h->synd);
|
||||
print_health_info(dev);
|
||||
queue_work(health->wq, &health->report_work);
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user