mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 18:41:58 +09:00
Merge 5.15.24 into android13-5.15
Changes in 5.15.24 integrity: check the return value of audit_log_start() ima: fix reference leak in asymmetric_verify() ima: Remove ima_policy file before directory ima: Allow template selection with ima_template[_fmt]= after ima_hash= ima: Do not print policy rule with inactive LSM labels mmc: sdhci-of-esdhc: Check for error num after setting mask mmc: core: Wait for command setting 'Power Off Notification' bit to complete can: isotp: fix potential CAN frame reception race in isotp_rcv() can: isotp: fix error path in isotp_sendmsg() to unlock wait queue net: phy: marvell: Fix RGMII Tx/Rx delays setting in 88e1121-compatible PHYs net: phy: marvell: Fix MDI-x polarity setting in 88e1118-compatible PHYs NFS: Fix initialisation of nfs_client cl_flags field NFSD: Fix NFSv3 SETATTR/CREATE's handling of large file sizes NFSD: Fix ia_size underflow NFSD: Clamp WRITE offsets NFSD: Fix offset type in I/O trace points NFSD: Fix the behavior of READ near OFFSET_MAX thermal/drivers/int340x: Improve the tcc offset saving for suspend/resume thermal/drivers/int340x: processor_thermal: Suppot 64 bit RFIM responses thermal: int340x: Limit Kconfig to 64-bit thermal/drivers/int340x: Fix RFIM mailbox write commands tracing: Propagate is_signed to expression NFS: change nfs_access_get_cached to only report the mask NFSv4 only print the label when its queried nfs: nfs4clinet: check the return value of kstrdup() NFSv4.1: Fix uninitialised variable in devicenotify NFSv4 remove zero number of fs_locations entries error check NFSv4 store server support for fs_location attribute NFSv4.1 query for fs_location attr on a new file system NFSv4 expose nfs_parse_server_name function NFSv4 handle port presence in fs_location server string SUNRPC allow for unspecified transport time in rpc_clnt_add_xprt net/sunrpc: fix reference count leaks in rpc_sysfs_xprt_state_change sunrpc: Fix potential race conditions in rpc_sysfs_xprt_state_change() irqchip/realtek-rtl: Service all pending interrupts perf/x86/rapl: fix AMD event handling x86/perf: Avoid warning for Arch LBR without XSAVE sched: Avoid double preemption in __cond_resched_*lock*() drm/vc4: Fix deadlock on DSI device attach error drm: panel-orientation-quirks: Add quirk for the 1Netbook OneXPlayer net: sched: Clarify error message when qdisc kind is unknown powerpc/fixmap: Fix VM debug warning on unmap scsi: target: iscsi: Make sure the np under each tpg is unique scsi: ufs: ufshcd-pltfrm: Check the return value of devm_kstrdup() scsi: qedf: Add stag_work to all the vports scsi: qedf: Fix refcount issue when LOGO is received during TMF scsi: qedf: Change context reset messages to ratelimited scsi: pm8001: Fix bogus FW crash for maxcpus=1 scsi: ufs: Use generic error code in ufshcd_set_dev_pwr_mode() scsi: ufs: Treat link loss as fatal error scsi: myrs: Fix crash in error case net: stmmac: reduce unnecessary wakeups from eee sw timer PM: hibernate: Remove register_nosave_region_late() drm/amd/display: Correct MPC split policy for DCN301 usb: dwc2: gadget: don't try to disable ep0 in dwc2_hsotg_suspend perf: Always wake the parent event nvme-pci: add the IGNORE_DEV_SUBNQN quirk for Intel P4500/P4600 SSDs MIPS: Fix build error due to PTR used in more places net: stmmac: dwmac-sun8i: use return val of readl_poll_timeout() KVM: eventfd: Fix false positive RCU usage warning KVM: nVMX: eVMCS: Filter out VM_EXIT_SAVE_VMX_PREEMPTION_TIMER KVM: nVMX: Also filter MSR_IA32_VMX_TRUE_PINBASED_CTLS when eVMCS KVM: SVM: Don't kill SEV guest if SMAP erratum triggers in usermode KVM: VMX: Set vmcs.PENDING_DBG.BS on #DB in STI/MOVSS blocking shadow KVM: x86: Report deprecated x87 features in supported CPUID riscv: fix build with binutils 2.38 riscv: cpu-hotplug: clear cpu from numa map when teardown riscv: eliminate unreliable __builtin_frame_address(1) gfs2: Fix gfs2_release for non-writers regression ARM: dts: imx23-evk: Remove MX23_PAD_SSP1_DETECT from hog group ARM: dts: Fix boot regression on Skomer ARM: socfpga: fix missing RESET_CONTROLLER nvme-tcp: fix bogus request completion when failing to send AER ACPI/IORT: Check node revision for PMCG resources PM: s2idle: ACPI: Fix wakeup interrupts handling drm/amdgpu/display: change pipe policy for DCN 2.0 drm/rockchip: vop: Correct RK3399 VOP register fields drm/i915: Allow !join_mbus cases for adlp+ dbuf configuration drm/i915: Populate pipe dbuf slices more accurately during readout ARM: dts: Fix timer regression for beagleboard revision c ARM: dts: meson: Fix the UART compatible strings ARM: dts: meson8: Fix the UART device-tree schema validation ARM: dts: meson8b: Fix the UART device-tree schema validation phy: broadcom: Kconfig: Fix PHY_BRCM_USB config option staging: fbtft: Fix error path in fbtft_driver_module_init() ARM: dts: imx6qdl-udoo: Properly describe the SD card detect phy: xilinx: zynqmp: Fix bus width setting for SGMII phy: stm32: fix a refcount leak in stm32_usbphyc_pll_enable() ARM: dts: imx7ulp: Fix 'assigned-clocks-parents' typo arm64: dts: imx8mq: fix mipi_csi bidirectional port numbers usb: f_fs: Fix use-after-free for epfile phy: dphy: Correct clk_pre parameter gpio: aggregator: Fix calling into sleeping GPIO controllers NFS: Don't overfill uncached readdir pages NFS: Don't skip directory entries when doing uncached readdir drm/vc4: hdmi: Allow DBLCLK modes even if horz timing is odd. misc: fastrpc: avoid double fput() on failed usercopy net: sparx5: Fix get_stat64 crash in tcpdump netfilter: ctnetlink: disable helper autoassign arm64: dts: meson-g12b-odroid-n2: fix typo 'dio2133' arm64: dts: meson-sm1-odroid: use correct enable-gpio pin for tf-io regulator arm64: dts: meson-sm1-bananapi-m5: fix wrong GPIO domain for GPIOE_2 arm64: dts: meson-sm1-odroid: fix boot loop after reboot ixgbevf: Require large buffers for build_skb on 82599VF drm/panel: simple: Assign data from panel_dpi_probe() correctly ACPI: PM: s2idle: Cancel wakeup before dispatching EC GPE gpiolib: Never return internal error codes to user space gpio: sifive: use the correct register to read output values fbcon: Avoid 'cap' set but not used warning bonding: pair enable_port with slave_arr_updates net: dsa: mv88e6xxx: don't use devres for mdiobus net: dsa: ar9331: register the mdiobus under devres net: dsa: bcm_sf2: don't use devres for mdiobus net: dsa: felix: don't use devres for mdiobus net: dsa: mt7530: fix kernel bug in mdiobus_free() when unbinding net: dsa: lantiq_gswip: don't use devres for mdiobus ipmr,ip6mr: acquire RTNL before calling ip[6]mr_free_table() on failure path nfp: flower: fix ida_idx not being released net: do not keep the dst cache when uncloning an skb dst and its metadata net: fix a memleak when uncloning an skb dst and its metadata veth: fix races around rq->rx_notify_masked net: mdio: aspeed: Add missing MODULE_DEVICE_TABLE tipc: rate limit warning for received illegal binding update net: amd-xgbe: disable interrupts during pci removal drm/amd/pm: fix hwmon node of power1_label create issue mptcp: netlink: process IPv6 addrs in creating listening sockets dpaa2-eth: unregister the netdev before disconnecting from the PHY ice: fix an error code in ice_cfg_phy_fec() ice: fix IPIP and SIT TSO offload ice: Fix KASAN error in LAG NETDEV_UNREGISTER handler ice: Avoid RTNL lock when re-creating auxiliary device net: mscc: ocelot: fix mutex lock error during ethtool stats read net: dsa: mv88e6xxx: fix use-after-free in mv88e6xxx_mdios_unregister vt_ioctl: fix array_index_nospec in vt_setactivate vt_ioctl: add array_index_nospec to VT_ACTIVATE n_tty: wake up poll(POLLRDNORM) on receiving data eeprom: ee1004: limit i2c reads to I2C_SMBUS_BLOCK_MAX usb: dwc2: drd: fix soft connect when gadget is unconfigured Revert "usb: dwc2: drd: fix soft connect when gadget is unconfigured" net: usb: ax88179_178a: Fix out-of-bounds accesses in RX fixup usb: ulpi: Move of_node_put to ulpi_dev_release usb: ulpi: Call of_node_put correctly usb: dwc3: gadget: Prevent core from processing stale TRBs usb: gadget: udc: renesas_usb3: Fix host to USB_ROLE_NONE transition USB: gadget: validate interface OS descriptor requests usb: gadget: rndis: check size of RNDIS_MSG_SET command usb: gadget: f_uac2: Define specific wTerminalType usb: raw-gadget: fix handling of dual-direction-capable endpoints USB: serial: ftdi_sio: add support for Brainboxes US-159/235/320 USB: serial: option: add ZTE MF286D modem USB: serial: ch341: add support for GW Instek USB2.0-Serial devices USB: serial: cp210x: add NCR Retail IO box id USB: serial: cp210x: add CPI Bulk Coin Recycler id speakup-dectlk: Restore pitch setting phy: ti: Fix missing sentinel for clk_div_table iio: buffer: Fix file related error handling in IIO_BUFFER_GET_FD_IOCTL mm: memcg: synchronize objcg lists with a dedicated spinlock seccomp: Invalidate seccomp mode to catch death failures signal: HANDLER_EXIT should clear SIGNAL_UNKILLABLE s390/cio: verify the driver availability for path_event call bus: mhi: pci_generic: Add mru_default for Foxconn SDX55 bus: mhi: pci_generic: Add mru_default for Cinterion MV31-W hwmon: (dell-smm) Speed up setting of fan speed x86/sgx: Silence softlockup detection when releasing large enclaves Makefile.extrawarn: Move -Wunaligned-access to W=1 scsi: lpfc: Remove NVMe support if kernel has NVME_FC disabled scsi: lpfc: Reduce log messages seen after firmware download MIPS: octeon: Fix missed PTR->PTR_WD conversion arm64: dts: imx8mq: fix lcdif port node perf: Fix list corruption in perf_cgroup_switch() iommu: Fix potential use-after-free during probe Linux 5.15.24 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Ibe10e24eeda28e78c35f7656bc49cf11f58d858c
This commit is contained in:
@@ -119,6 +119,9 @@ Boards (incomplete list of examples):
|
||||
- OMAP3 BeagleBoard : Low cost community board
|
||||
compatible = "ti,omap3-beagle", "ti,omap3430", "ti,omap3"
|
||||
|
||||
- OMAP3 BeagleBoard A to B4 : Early BeagleBoard revisions A to B4 with a timer quirk
|
||||
compatible = "ti,omap3-beagle-ab4", "ti,omap3-beagle", "ti,omap3430", "ti,omap3"
|
||||
|
||||
- OMAP3 Tobi with Overo : Commercial expansion board with daughter board
|
||||
compatible = "gumstix,omap3-overo-tobi", "gumstix,omap3-overo", "ti,omap3430", "ti,omap3"
|
||||
|
||||
|
||||
2
Makefile
2
Makefile
@@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 15
|
||||
SUBLEVEL = 23
|
||||
SUBLEVEL = 24
|
||||
EXTRAVERSION =
|
||||
NAME = Trick or Treat
|
||||
|
||||
|
||||
@@ -779,6 +779,7 @@ dtb-$(CONFIG_ARCH_OMAP3) += \
|
||||
logicpd-som-lv-37xx-devkit.dtb \
|
||||
omap3430-sdp.dtb \
|
||||
omap3-beagle.dtb \
|
||||
omap3-beagle-ab4.dtb \
|
||||
omap3-beagle-xm.dtb \
|
||||
omap3-beagle-xm-ab.dtb \
|
||||
omap3-cm-t3517.dtb \
|
||||
|
||||
@@ -79,7 +79,6 @@
|
||||
MX23_PAD_LCD_RESET__GPIO_1_18
|
||||
MX23_PAD_PWM3__GPIO_1_29
|
||||
MX23_PAD_PWM4__GPIO_1_30
|
||||
MX23_PAD_SSP1_DETECT__SSP1_DETECT
|
||||
>;
|
||||
fsl,drive-strength = <MXS_DRIVE_4mA>;
|
||||
fsl,voltage = <MXS_VOLTAGE_HIGH>;
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
* Author: Fabio Estevam <fabio.estevam@freescale.com>
|
||||
*/
|
||||
|
||||
#include <dt-bindings/gpio/gpio.h>
|
||||
|
||||
/ {
|
||||
aliases {
|
||||
backlight = &backlight;
|
||||
@@ -226,6 +228,7 @@
|
||||
MX6QDL_PAD_SD3_DAT1__SD3_DATA1 0x17059
|
||||
MX6QDL_PAD_SD3_DAT2__SD3_DATA2 0x17059
|
||||
MX6QDL_PAD_SD3_DAT3__SD3_DATA3 0x17059
|
||||
MX6QDL_PAD_SD3_DAT5__GPIO7_IO00 0x1b0b0
|
||||
>;
|
||||
};
|
||||
|
||||
@@ -304,7 +307,7 @@
|
||||
&usdhc3 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_usdhc3>;
|
||||
non-removable;
|
||||
cd-gpios = <&gpio7 0 GPIO_ACTIVE_LOW>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
|
||||
@@ -259,7 +259,7 @@
|
||||
interrupts = <GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&pcc2 IMX7ULP_CLK_WDG1>;
|
||||
assigned-clocks = <&pcc2 IMX7ULP_CLK_WDG1>;
|
||||
assigned-clocks-parents = <&scg1 IMX7ULP_CLK_FIRC_BUS_CLK>;
|
||||
assigned-clock-parents = <&scg1 IMX7ULP_CLK_FIRC_BUS_CLK>;
|
||||
timeout-sec = <40>;
|
||||
};
|
||||
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
};
|
||||
|
||||
uart_A: serial@84c0 {
|
||||
compatible = "amlogic,meson6-uart", "amlogic,meson-uart";
|
||||
compatible = "amlogic,meson6-uart";
|
||||
reg = <0x84c0 0x18>;
|
||||
interrupts = <GIC_SPI 26 IRQ_TYPE_EDGE_RISING>;
|
||||
fifo-size = <128>;
|
||||
@@ -67,7 +67,7 @@
|
||||
};
|
||||
|
||||
uart_B: serial@84dc {
|
||||
compatible = "amlogic,meson6-uart", "amlogic,meson-uart";
|
||||
compatible = "amlogic,meson6-uart";
|
||||
reg = <0x84dc 0x18>;
|
||||
interrupts = <GIC_SPI 75 IRQ_TYPE_EDGE_RISING>;
|
||||
status = "disabled";
|
||||
@@ -105,7 +105,7 @@
|
||||
};
|
||||
|
||||
uart_C: serial@8700 {
|
||||
compatible = "amlogic,meson6-uart", "amlogic,meson-uart";
|
||||
compatible = "amlogic,meson6-uart";
|
||||
reg = <0x8700 0x18>;
|
||||
interrupts = <GIC_SPI 93 IRQ_TYPE_EDGE_RISING>;
|
||||
status = "disabled";
|
||||
@@ -228,7 +228,7 @@
|
||||
};
|
||||
|
||||
uart_AO: serial@4c0 {
|
||||
compatible = "amlogic,meson6-uart", "amlogic,meson-ao-uart", "amlogic,meson-uart";
|
||||
compatible = "amlogic,meson6-uart", "amlogic,meson-ao-uart";
|
||||
reg = <0x4c0 0x18>;
|
||||
interrupts = <GIC_SPI 90 IRQ_TYPE_EDGE_RISING>;
|
||||
status = "disabled";
|
||||
|
||||
@@ -736,27 +736,27 @@
|
||||
};
|
||||
|
||||
&uart_AO {
|
||||
compatible = "amlogic,meson8-uart", "amlogic,meson-uart";
|
||||
clocks = <&clkc CLKID_CLK81>, <&xtal>, <&clkc CLKID_CLK81>;
|
||||
clock-names = "baud", "xtal", "pclk";
|
||||
compatible = "amlogic,meson8-uart", "amlogic,meson-ao-uart";
|
||||
clocks = <&xtal>, <&clkc CLKID_CLK81>, <&clkc CLKID_CLK81>;
|
||||
clock-names = "xtal", "pclk", "baud";
|
||||
};
|
||||
|
||||
&uart_A {
|
||||
compatible = "amlogic,meson8-uart", "amlogic,meson-uart";
|
||||
clocks = <&clkc CLKID_CLK81>, <&xtal>, <&clkc CLKID_UART0>;
|
||||
clock-names = "baud", "xtal", "pclk";
|
||||
compatible = "amlogic,meson8-uart";
|
||||
clocks = <&xtal>, <&clkc CLKID_UART0>, <&clkc CLKID_CLK81>;
|
||||
clock-names = "xtal", "pclk", "baud";
|
||||
};
|
||||
|
||||
&uart_B {
|
||||
compatible = "amlogic,meson8-uart", "amlogic,meson-uart";
|
||||
clocks = <&clkc CLKID_CLK81>, <&xtal>, <&clkc CLKID_UART1>;
|
||||
clock-names = "baud", "xtal", "pclk";
|
||||
compatible = "amlogic,meson8-uart";
|
||||
clocks = <&xtal>, <&clkc CLKID_UART0>, <&clkc CLKID_CLK81>;
|
||||
clock-names = "xtal", "pclk", "baud";
|
||||
};
|
||||
|
||||
&uart_C {
|
||||
compatible = "amlogic,meson8-uart", "amlogic,meson-uart";
|
||||
clocks = <&clkc CLKID_CLK81>, <&xtal>, <&clkc CLKID_UART2>;
|
||||
clock-names = "baud", "xtal", "pclk";
|
||||
compatible = "amlogic,meson8-uart";
|
||||
clocks = <&xtal>, <&clkc CLKID_UART0>, <&clkc CLKID_CLK81>;
|
||||
clock-names = "xtal", "pclk", "baud";
|
||||
};
|
||||
|
||||
&usb0 {
|
||||
|
||||
@@ -724,27 +724,27 @@
|
||||
};
|
||||
|
||||
&uart_AO {
|
||||
compatible = "amlogic,meson8b-uart", "amlogic,meson-uart";
|
||||
clocks = <&clkc CLKID_CLK81>, <&xtal>, <&clkc CLKID_CLK81>;
|
||||
clock-names = "baud", "xtal", "pclk";
|
||||
compatible = "amlogic,meson8b-uart", "amlogic,meson-ao-uart";
|
||||
clocks = <&xtal>, <&clkc CLKID_CLK81>, <&clkc CLKID_CLK81>;
|
||||
clock-names = "xtal", "pclk", "baud";
|
||||
};
|
||||
|
||||
&uart_A {
|
||||
compatible = "amlogic,meson8b-uart", "amlogic,meson-uart";
|
||||
clocks = <&clkc CLKID_CLK81>, <&xtal>, <&clkc CLKID_UART0>;
|
||||
clock-names = "baud", "xtal", "pclk";
|
||||
compatible = "amlogic,meson8b-uart";
|
||||
clocks = <&xtal>, <&clkc CLKID_UART0>, <&clkc CLKID_CLK81>;
|
||||
clock-names = "xtal", "pclk", "baud";
|
||||
};
|
||||
|
||||
&uart_B {
|
||||
compatible = "amlogic,meson8b-uart", "amlogic,meson-uart";
|
||||
clocks = <&clkc CLKID_CLK81>, <&xtal>, <&clkc CLKID_UART1>;
|
||||
clock-names = "baud", "xtal", "pclk";
|
||||
compatible = "amlogic,meson8b-uart";
|
||||
clocks = <&xtal>, <&clkc CLKID_UART0>, <&clkc CLKID_CLK81>;
|
||||
clock-names = "xtal", "pclk", "baud";
|
||||
};
|
||||
|
||||
&uart_C {
|
||||
compatible = "amlogic,meson8b-uart", "amlogic,meson-uart";
|
||||
clocks = <&clkc CLKID_CLK81>, <&xtal>, <&clkc CLKID_UART2>;
|
||||
clock-names = "baud", "xtal", "pclk";
|
||||
compatible = "amlogic,meson8b-uart";
|
||||
clocks = <&xtal>, <&clkc CLKID_UART0>, <&clkc CLKID_CLK81>;
|
||||
clock-names = "xtal", "pclk", "baud";
|
||||
};
|
||||
|
||||
&usb0 {
|
||||
|
||||
47
arch/arm/boot/dts/omap3-beagle-ab4.dts
Normal file
47
arch/arm/boot/dts/omap3-beagle-ab4.dts
Normal file
@@ -0,0 +1,47 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/dts-v1/;
|
||||
|
||||
#include "omap3-beagle.dts"
|
||||
|
||||
/ {
|
||||
model = "TI OMAP3 BeagleBoard A to B4";
|
||||
compatible = "ti,omap3-beagle-ab4", "ti,omap3-beagle", "ti,omap3430", "ti,omap3";
|
||||
};
|
||||
|
||||
/*
|
||||
* Workaround for capacitor C70 issue, see "Boards revision A and < B5"
|
||||
* section at https://elinux.org/BeagleBoard_Community
|
||||
*/
|
||||
|
||||
/* Unusable as clocksource because of unreliable oscillator */
|
||||
&counter32k {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
/* Unusable as clockevent because of unreliable oscillator, allow to idle */
|
||||
&timer1_target {
|
||||
/delete-property/ti,no-reset-on-init;
|
||||
/delete-property/ti,no-idle;
|
||||
timer@0 {
|
||||
/delete-property/ti,timer-alwon;
|
||||
};
|
||||
};
|
||||
|
||||
/* Preferred always-on timer for clocksource */
|
||||
&timer12_target {
|
||||
ti,no-reset-on-init;
|
||||
ti,no-idle;
|
||||
timer@0 {
|
||||
/* Always clocked by secure_32k_fck */
|
||||
};
|
||||
};
|
||||
|
||||
/* Preferred timer for clockevent */
|
||||
&timer2_target {
|
||||
ti,no-reset-on-init;
|
||||
ti,no-idle;
|
||||
timer@0 {
|
||||
assigned-clocks = <&gpt2_fck>;
|
||||
assigned-clock-parents = <&sys_ck>;
|
||||
};
|
||||
};
|
||||
@@ -304,39 +304,6 @@
|
||||
phys = <0 &hsusb2_phy>;
|
||||
};
|
||||
|
||||
/* Unusable as clocksource because of unreliable oscillator */
|
||||
&counter32k {
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
/* Unusable as clockevent because if unreliable oscillator, allow to idle */
|
||||
&timer1_target {
|
||||
/delete-property/ti,no-reset-on-init;
|
||||
/delete-property/ti,no-idle;
|
||||
timer@0 {
|
||||
/delete-property/ti,timer-alwon;
|
||||
};
|
||||
};
|
||||
|
||||
/* Preferred always-on timer for clocksource */
|
||||
&timer12_target {
|
||||
ti,no-reset-on-init;
|
||||
ti,no-idle;
|
||||
timer@0 {
|
||||
/* Always clocked by secure_32k_fck */
|
||||
};
|
||||
};
|
||||
|
||||
/* Preferred timer for clockevent */
|
||||
&timer2_target {
|
||||
ti,no-reset-on-init;
|
||||
ti,no-idle;
|
||||
timer@0 {
|
||||
assigned-clocks = <&gpt2_fck>;
|
||||
assigned-clock-parents = <&sys_ck>;
|
||||
};
|
||||
};
|
||||
|
||||
&twl_gpio {
|
||||
ti,use-leds;
|
||||
/* pullups: BIT(1) */
|
||||
|
||||
@@ -181,10 +181,6 @@
|
||||
cap-sd-highspeed;
|
||||
cap-mmc-highspeed;
|
||||
/* All direction control is used */
|
||||
st,sig-dir-cmd;
|
||||
st,sig-dir-dat0;
|
||||
st,sig-dir-dat2;
|
||||
st,sig-dir-dat31;
|
||||
st,sig-pin-fbclk;
|
||||
full-pwr-cycle;
|
||||
vmmc-supply = <&ab8500_ldo_aux3_reg>;
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
menuconfig ARCH_INTEL_SOCFPGA
|
||||
bool "Altera SOCFPGA family"
|
||||
depends on ARCH_MULTI_V7
|
||||
select ARCH_HAS_RESET_CONTROLLER
|
||||
select ARCH_SUPPORTS_BIG_ENDIAN
|
||||
select ARM_AMBA
|
||||
select ARM_GIC
|
||||
@@ -18,6 +19,7 @@ menuconfig ARCH_INTEL_SOCFPGA
|
||||
select PL310_ERRATA_727915
|
||||
select PL310_ERRATA_753970 if PL310
|
||||
select PL310_ERRATA_769419
|
||||
select RESET_CONTROLLER
|
||||
|
||||
if ARCH_INTEL_SOCFPGA
|
||||
config SOCFPGA_SUSPEND
|
||||
|
||||
@@ -17,7 +17,7 @@
|
||||
rtc1 = &vrtc;
|
||||
};
|
||||
|
||||
dioo2133: audio-amplifier-0 {
|
||||
dio2133: audio-amplifier-0 {
|
||||
compatible = "simple-audio-amplifier";
|
||||
enable-gpios = <&gpio_ao GPIOAO_2 GPIO_ACTIVE_HIGH>;
|
||||
VCC-supply = <&vcc_5v>;
|
||||
@@ -217,7 +217,7 @@
|
||||
audio-widgets = "Line", "Lineout";
|
||||
audio-aux-devs = <&tdmout_b>, <&tdmout_c>, <&tdmin_a>,
|
||||
<&tdmin_b>, <&tdmin_c>, <&tdmin_lb>,
|
||||
<&dioo2133>;
|
||||
<&dio2133>;
|
||||
audio-routing = "TDMOUT_B IN 0", "FRDDR_A OUT 1",
|
||||
"TDMOUT_B IN 1", "FRDDR_B OUT 1",
|
||||
"TDMOUT_B IN 2", "FRDDR_C OUT 1",
|
||||
|
||||
@@ -123,7 +123,7 @@
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
|
||||
enable-gpio = <&gpio GPIOE_2 GPIO_ACTIVE_HIGH>;
|
||||
enable-gpio = <&gpio_ao GPIOE_2 GPIO_ACTIVE_HIGH>;
|
||||
enable-active-high;
|
||||
regulator-always-on;
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
regulator-max-microvolt = <3300000>;
|
||||
vin-supply = <&vcc_5v>;
|
||||
|
||||
enable-gpio = <&gpio GPIOE_2 GPIO_ACTIVE_HIGH>;
|
||||
enable-gpio = <&gpio_ao GPIOE_2 GPIO_OPEN_DRAIN>;
|
||||
enable-active-high;
|
||||
regulator-always-on;
|
||||
|
||||
|
||||
@@ -526,7 +526,7 @@
|
||||
assigned-clock-rates = <0>, <0>, <0>, <594000000>;
|
||||
status = "disabled";
|
||||
|
||||
port@0 {
|
||||
port {
|
||||
lcdif_mipi_dsi: endpoint {
|
||||
remote-endpoint = <&mipi_dsi_lcdif_in>;
|
||||
};
|
||||
@@ -1123,8 +1123,8 @@
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
|
||||
csi1_mipi_ep: endpoint {
|
||||
remote-endpoint = <&csi1_ep>;
|
||||
@@ -1175,8 +1175,8 @@
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
port@0 {
|
||||
reg = <0>;
|
||||
port@1 {
|
||||
reg = <1>;
|
||||
|
||||
csi2_mipi_ep: endpoint {
|
||||
remote-endpoint = <&csi2_ep>;
|
||||
|
||||
@@ -74,7 +74,7 @@
|
||||
#define EXC(inst_reg,addr,handler) \
|
||||
9: inst_reg, addr; \
|
||||
.section __ex_table,"a"; \
|
||||
PTR 9b, handler; \
|
||||
PTR_WD 9b, handler; \
|
||||
.previous
|
||||
|
||||
/*
|
||||
|
||||
@@ -276,7 +276,7 @@ symbol = value
|
||||
|
||||
#define PTR_SCALESHIFT 2
|
||||
|
||||
#define PTR .word
|
||||
#define PTR_WD .word
|
||||
#define PTRSIZE 4
|
||||
#define PTRLOG 2
|
||||
#endif
|
||||
@@ -301,7 +301,7 @@ symbol = value
|
||||
|
||||
#define PTR_SCALESHIFT 3
|
||||
|
||||
#define PTR .dword
|
||||
#define PTR_WD .dword
|
||||
#define PTRSIZE 8
|
||||
#define PTRLOG 3
|
||||
#endif
|
||||
|
||||
@@ -32,7 +32,7 @@ do { \
|
||||
".previous\n" \
|
||||
\
|
||||
".section\t__ex_table,\"a\"\n\t" \
|
||||
STR(PTR) "\t1b, 3b\n\t" \
|
||||
STR(PTR_WD) "\t1b, 3b\n\t" \
|
||||
".previous\n" \
|
||||
\
|
||||
: [tmp_dst] "=&r" (dst), [tmp_err] "=r" (error)\
|
||||
@@ -54,7 +54,7 @@ do { \
|
||||
".previous\n" \
|
||||
\
|
||||
".section\t__ex_table,\"a\"\n\t"\
|
||||
STR(PTR) "\t1b, 3b\n\t" \
|
||||
STR(PTR_WD) "\t1b, 3b\n\t" \
|
||||
".previous\n" \
|
||||
\
|
||||
: [tmp_err] "=r" (error) \
|
||||
|
||||
@@ -119,7 +119,7 @@ static inline void flush_scache_line(unsigned long addr)
|
||||
" j 2b \n" \
|
||||
" .previous \n" \
|
||||
" .section __ex_table,\"a\" \n" \
|
||||
" "STR(PTR)" 1b, 3b \n" \
|
||||
" "STR(PTR_WD)" 1b, 3b \n" \
|
||||
" .previous" \
|
||||
: "+r" (__err) \
|
||||
: "i" (op), "r" (addr), "i" (-EFAULT)); \
|
||||
@@ -142,7 +142,7 @@ static inline void flush_scache_line(unsigned long addr)
|
||||
" j 2b \n" \
|
||||
" .previous \n" \
|
||||
" .section __ex_table,\"a\" \n" \
|
||||
" "STR(PTR)" 1b, 3b \n" \
|
||||
" "STR(PTR_WD)" 1b, 3b \n" \
|
||||
" .previous" \
|
||||
: "+r" (__err) \
|
||||
: "i" (op), "r" (addr), "i" (-EFAULT)); \
|
||||
|
||||
@@ -20,8 +20,8 @@ do { \
|
||||
"j\t3b\n\t" \
|
||||
".previous\n\t" \
|
||||
".section\t__ex_table,\"a\"\n\t" \
|
||||
STR(PTR)"\t1b, 4b\n\t" \
|
||||
STR(PTR)"\t2b, 4b\n\t" \
|
||||
STR(PTR_WD)"\t1b, 4b\n\t" \
|
||||
STR(PTR_WD)"\t2b, 4b\n\t" \
|
||||
".previous" \
|
||||
: "=&r" (value), "=r" (res) \
|
||||
: "r" (addr), "i" (-EFAULT)); \
|
||||
@@ -41,8 +41,8 @@ do { \
|
||||
"j\t3b\n\t" \
|
||||
".previous\n\t" \
|
||||
".section\t__ex_table,\"a\"\n\t" \
|
||||
STR(PTR)"\t1b, 4b\n\t" \
|
||||
STR(PTR)"\t2b, 4b\n\t" \
|
||||
STR(PTR_WD)"\t1b, 4b\n\t" \
|
||||
STR(PTR_WD)"\t2b, 4b\n\t" \
|
||||
".previous" \
|
||||
: "=&r" (value), "=r" (res) \
|
||||
: "r" (addr), "i" (-EFAULT)); \
|
||||
@@ -74,10 +74,10 @@ do { \
|
||||
"j\t10b\n\t" \
|
||||
".previous\n\t" \
|
||||
".section\t__ex_table,\"a\"\n\t" \
|
||||
STR(PTR)"\t1b, 11b\n\t" \
|
||||
STR(PTR)"\t2b, 11b\n\t" \
|
||||
STR(PTR)"\t3b, 11b\n\t" \
|
||||
STR(PTR)"\t4b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t1b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t2b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t3b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t4b, 11b\n\t" \
|
||||
".previous" \
|
||||
: "=&r" (value), "=r" (res) \
|
||||
: "r" (addr), "i" (-EFAULT)); \
|
||||
@@ -102,8 +102,8 @@ do { \
|
||||
"j\t3b\n\t" \
|
||||
".previous\n\t" \
|
||||
".section\t__ex_table,\"a\"\n\t" \
|
||||
STR(PTR)"\t1b, 4b\n\t" \
|
||||
STR(PTR)"\t2b, 4b\n\t" \
|
||||
STR(PTR_WD)"\t1b, 4b\n\t" \
|
||||
STR(PTR_WD)"\t2b, 4b\n\t" \
|
||||
".previous" \
|
||||
: "=&r" (value), "=r" (res) \
|
||||
: "r" (addr), "i" (-EFAULT)); \
|
||||
@@ -125,8 +125,8 @@ do { \
|
||||
"j\t3b\n\t" \
|
||||
".previous\n\t" \
|
||||
".section\t__ex_table,\"a\"\n\t" \
|
||||
STR(PTR)"\t1b, 4b\n\t" \
|
||||
STR(PTR)"\t2b, 4b\n\t" \
|
||||
STR(PTR_WD)"\t1b, 4b\n\t" \
|
||||
STR(PTR_WD)"\t2b, 4b\n\t" \
|
||||
".previous" \
|
||||
: "=&r" (value), "=r" (res) \
|
||||
: "r" (addr), "i" (-EFAULT)); \
|
||||
@@ -145,8 +145,8 @@ do { \
|
||||
"j\t3b\n\t" \
|
||||
".previous\n\t" \
|
||||
".section\t__ex_table,\"a\"\n\t" \
|
||||
STR(PTR)"\t1b, 4b\n\t" \
|
||||
STR(PTR)"\t2b, 4b\n\t" \
|
||||
STR(PTR_WD)"\t1b, 4b\n\t" \
|
||||
STR(PTR_WD)"\t2b, 4b\n\t" \
|
||||
".previous" \
|
||||
: "=&r" (value), "=r" (res) \
|
||||
: "r" (addr), "i" (-EFAULT)); \
|
||||
@@ -178,10 +178,10 @@ do { \
|
||||
"j\t10b\n\t" \
|
||||
".previous\n\t" \
|
||||
".section\t__ex_table,\"a\"\n\t" \
|
||||
STR(PTR)"\t1b, 11b\n\t" \
|
||||
STR(PTR)"\t2b, 11b\n\t" \
|
||||
STR(PTR)"\t3b, 11b\n\t" \
|
||||
STR(PTR)"\t4b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t1b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t2b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t3b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t4b, 11b\n\t" \
|
||||
".previous" \
|
||||
: "=&r" (value), "=r" (res) \
|
||||
: "r" (addr), "i" (-EFAULT)); \
|
||||
@@ -223,14 +223,14 @@ do { \
|
||||
"j\t10b\n\t" \
|
||||
".previous\n\t" \
|
||||
".section\t__ex_table,\"a\"\n\t" \
|
||||
STR(PTR)"\t1b, 11b\n\t" \
|
||||
STR(PTR)"\t2b, 11b\n\t" \
|
||||
STR(PTR)"\t3b, 11b\n\t" \
|
||||
STR(PTR)"\t4b, 11b\n\t" \
|
||||
STR(PTR)"\t5b, 11b\n\t" \
|
||||
STR(PTR)"\t6b, 11b\n\t" \
|
||||
STR(PTR)"\t7b, 11b\n\t" \
|
||||
STR(PTR)"\t8b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t1b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t2b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t3b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t4b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t5b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t6b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t7b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t8b, 11b\n\t" \
|
||||
".previous" \
|
||||
: "=&r" (value), "=r" (res) \
|
||||
: "r" (addr), "i" (-EFAULT)); \
|
||||
@@ -255,8 +255,8 @@ do { \
|
||||
"j\t3b\n\t" \
|
||||
".previous\n\t" \
|
||||
".section\t__ex_table,\"a\"\n\t" \
|
||||
STR(PTR)"\t1b, 4b\n\t" \
|
||||
STR(PTR)"\t2b, 4b\n\t" \
|
||||
STR(PTR_WD)"\t1b, 4b\n\t" \
|
||||
STR(PTR_WD)"\t2b, 4b\n\t" \
|
||||
".previous" \
|
||||
: "=r" (res) \
|
||||
: "r" (value), "r" (addr), "i" (-EFAULT));\
|
||||
@@ -276,8 +276,8 @@ do { \
|
||||
"j\t3b\n\t" \
|
||||
".previous\n\t" \
|
||||
".section\t__ex_table,\"a\"\n\t" \
|
||||
STR(PTR)"\t1b, 4b\n\t" \
|
||||
STR(PTR)"\t2b, 4b\n\t" \
|
||||
STR(PTR_WD)"\t1b, 4b\n\t" \
|
||||
STR(PTR_WD)"\t2b, 4b\n\t" \
|
||||
".previous" \
|
||||
: "=r" (res) \
|
||||
: "r" (value), "r" (addr), "i" (-EFAULT)); \
|
||||
@@ -296,8 +296,8 @@ do { \
|
||||
"j\t3b\n\t" \
|
||||
".previous\n\t" \
|
||||
".section\t__ex_table,\"a\"\n\t" \
|
||||
STR(PTR)"\t1b, 4b\n\t" \
|
||||
STR(PTR)"\t2b, 4b\n\t" \
|
||||
STR(PTR_WD)"\t1b, 4b\n\t" \
|
||||
STR(PTR_WD)"\t2b, 4b\n\t" \
|
||||
".previous" \
|
||||
: "=r" (res) \
|
||||
: "r" (value), "r" (addr), "i" (-EFAULT)); \
|
||||
@@ -325,10 +325,10 @@ do { \
|
||||
"j\t10b\n\t" \
|
||||
".previous\n\t" \
|
||||
".section\t__ex_table,\"a\"\n\t" \
|
||||
STR(PTR)"\t1b, 11b\n\t" \
|
||||
STR(PTR)"\t2b, 11b\n\t" \
|
||||
STR(PTR)"\t3b, 11b\n\t" \
|
||||
STR(PTR)"\t4b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t1b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t2b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t3b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t4b, 11b\n\t" \
|
||||
".previous" \
|
||||
: "=&r" (res) \
|
||||
: "r" (value), "r" (addr), "i" (-EFAULT) \
|
||||
@@ -365,14 +365,14 @@ do { \
|
||||
"j\t10b\n\t" \
|
||||
".previous\n\t" \
|
||||
".section\t__ex_table,\"a\"\n\t" \
|
||||
STR(PTR)"\t1b, 11b\n\t" \
|
||||
STR(PTR)"\t2b, 11b\n\t" \
|
||||
STR(PTR)"\t3b, 11b\n\t" \
|
||||
STR(PTR)"\t4b, 11b\n\t" \
|
||||
STR(PTR)"\t5b, 11b\n\t" \
|
||||
STR(PTR)"\t6b, 11b\n\t" \
|
||||
STR(PTR)"\t7b, 11b\n\t" \
|
||||
STR(PTR)"\t8b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t1b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t2b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t3b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t4b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t5b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t6b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t7b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t8b, 11b\n\t" \
|
||||
".previous" \
|
||||
: "=&r" (res) \
|
||||
: "r" (value), "r" (addr), "i" (-EFAULT) \
|
||||
@@ -398,8 +398,8 @@ do { \
|
||||
"j\t3b\n\t" \
|
||||
".previous\n\t" \
|
||||
".section\t__ex_table,\"a\"\n\t" \
|
||||
STR(PTR)"\t1b, 4b\n\t" \
|
||||
STR(PTR)"\t2b, 4b\n\t" \
|
||||
STR(PTR_WD)"\t1b, 4b\n\t" \
|
||||
STR(PTR_WD)"\t2b, 4b\n\t" \
|
||||
".previous" \
|
||||
: "=&r" (value), "=r" (res) \
|
||||
: "r" (addr), "i" (-EFAULT)); \
|
||||
@@ -419,8 +419,8 @@ do { \
|
||||
"j\t3b\n\t" \
|
||||
".previous\n\t" \
|
||||
".section\t__ex_table,\"a\"\n\t" \
|
||||
STR(PTR)"\t1b, 4b\n\t" \
|
||||
STR(PTR)"\t2b, 4b\n\t" \
|
||||
STR(PTR_WD)"\t1b, 4b\n\t" \
|
||||
STR(PTR_WD)"\t2b, 4b\n\t" \
|
||||
".previous" \
|
||||
: "=&r" (value), "=r" (res) \
|
||||
: "r" (addr), "i" (-EFAULT)); \
|
||||
@@ -452,10 +452,10 @@ do { \
|
||||
"j\t10b\n\t" \
|
||||
".previous\n\t" \
|
||||
".section\t__ex_table,\"a\"\n\t" \
|
||||
STR(PTR)"\t1b, 11b\n\t" \
|
||||
STR(PTR)"\t2b, 11b\n\t" \
|
||||
STR(PTR)"\t3b, 11b\n\t" \
|
||||
STR(PTR)"\t4b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t1b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t2b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t3b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t4b, 11b\n\t" \
|
||||
".previous" \
|
||||
: "=&r" (value), "=r" (res) \
|
||||
: "r" (addr), "i" (-EFAULT)); \
|
||||
@@ -481,8 +481,8 @@ do { \
|
||||
"j\t3b\n\t" \
|
||||
".previous\n\t" \
|
||||
".section\t__ex_table,\"a\"\n\t" \
|
||||
STR(PTR)"\t1b, 4b\n\t" \
|
||||
STR(PTR)"\t2b, 4b\n\t" \
|
||||
STR(PTR_WD)"\t1b, 4b\n\t" \
|
||||
STR(PTR_WD)"\t2b, 4b\n\t" \
|
||||
".previous" \
|
||||
: "=&r" (value), "=r" (res) \
|
||||
: "r" (addr), "i" (-EFAULT)); \
|
||||
@@ -504,8 +504,8 @@ do { \
|
||||
"j\t3b\n\t" \
|
||||
".previous\n\t" \
|
||||
".section\t__ex_table,\"a\"\n\t" \
|
||||
STR(PTR)"\t1b, 4b\n\t" \
|
||||
STR(PTR)"\t2b, 4b\n\t" \
|
||||
STR(PTR_WD)"\t1b, 4b\n\t" \
|
||||
STR(PTR_WD)"\t2b, 4b\n\t" \
|
||||
".previous" \
|
||||
: "=&r" (value), "=r" (res) \
|
||||
: "r" (addr), "i" (-EFAULT)); \
|
||||
@@ -524,8 +524,8 @@ do { \
|
||||
"j\t3b\n\t" \
|
||||
".previous\n\t" \
|
||||
".section\t__ex_table,\"a\"\n\t" \
|
||||
STR(PTR)"\t1b, 4b\n\t" \
|
||||
STR(PTR)"\t2b, 4b\n\t" \
|
||||
STR(PTR_WD)"\t1b, 4b\n\t" \
|
||||
STR(PTR_WD)"\t2b, 4b\n\t" \
|
||||
".previous" \
|
||||
: "=&r" (value), "=r" (res) \
|
||||
: "r" (addr), "i" (-EFAULT)); \
|
||||
@@ -557,10 +557,10 @@ do { \
|
||||
"j\t10b\n\t" \
|
||||
".previous\n\t" \
|
||||
".section\t__ex_table,\"a\"\n\t" \
|
||||
STR(PTR)"\t1b, 11b\n\t" \
|
||||
STR(PTR)"\t2b, 11b\n\t" \
|
||||
STR(PTR)"\t3b, 11b\n\t" \
|
||||
STR(PTR)"\t4b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t1b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t2b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t3b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t4b, 11b\n\t" \
|
||||
".previous" \
|
||||
: "=&r" (value), "=r" (res) \
|
||||
: "r" (addr), "i" (-EFAULT)); \
|
||||
@@ -602,14 +602,14 @@ do { \
|
||||
"j\t10b\n\t" \
|
||||
".previous\n\t" \
|
||||
".section\t__ex_table,\"a\"\n\t" \
|
||||
STR(PTR)"\t1b, 11b\n\t" \
|
||||
STR(PTR)"\t2b, 11b\n\t" \
|
||||
STR(PTR)"\t3b, 11b\n\t" \
|
||||
STR(PTR)"\t4b, 11b\n\t" \
|
||||
STR(PTR)"\t5b, 11b\n\t" \
|
||||
STR(PTR)"\t6b, 11b\n\t" \
|
||||
STR(PTR)"\t7b, 11b\n\t" \
|
||||
STR(PTR)"\t8b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t1b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t2b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t3b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t4b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t5b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t6b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t7b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t8b, 11b\n\t" \
|
||||
".previous" \
|
||||
: "=&r" (value), "=r" (res) \
|
||||
: "r" (addr), "i" (-EFAULT)); \
|
||||
@@ -632,8 +632,8 @@ do { \
|
||||
"j\t3b\n\t" \
|
||||
".previous\n\t" \
|
||||
".section\t__ex_table,\"a\"\n\t" \
|
||||
STR(PTR)"\t1b, 4b\n\t" \
|
||||
STR(PTR)"\t2b, 4b\n\t" \
|
||||
STR(PTR_WD)"\t1b, 4b\n\t" \
|
||||
STR(PTR_WD)"\t2b, 4b\n\t" \
|
||||
".previous" \
|
||||
: "=r" (res) \
|
||||
: "r" (value), "r" (addr), "i" (-EFAULT));\
|
||||
@@ -653,8 +653,8 @@ do { \
|
||||
"j\t3b\n\t" \
|
||||
".previous\n\t" \
|
||||
".section\t__ex_table,\"a\"\n\t" \
|
||||
STR(PTR)"\t1b, 4b\n\t" \
|
||||
STR(PTR)"\t2b, 4b\n\t" \
|
||||
STR(PTR_WD)"\t1b, 4b\n\t" \
|
||||
STR(PTR_WD)"\t2b, 4b\n\t" \
|
||||
".previous" \
|
||||
: "=r" (res) \
|
||||
: "r" (value), "r" (addr), "i" (-EFAULT)); \
|
||||
@@ -673,8 +673,8 @@ do { \
|
||||
"j\t3b\n\t" \
|
||||
".previous\n\t" \
|
||||
".section\t__ex_table,\"a\"\n\t" \
|
||||
STR(PTR)"\t1b, 4b\n\t" \
|
||||
STR(PTR)"\t2b, 4b\n\t" \
|
||||
STR(PTR_WD)"\t1b, 4b\n\t" \
|
||||
STR(PTR_WD)"\t2b, 4b\n\t" \
|
||||
".previous" \
|
||||
: "=r" (res) \
|
||||
: "r" (value), "r" (addr), "i" (-EFAULT)); \
|
||||
@@ -703,10 +703,10 @@ do { \
|
||||
"j\t10b\n\t" \
|
||||
".previous\n\t" \
|
||||
".section\t__ex_table,\"a\"\n\t" \
|
||||
STR(PTR)"\t1b, 11b\n\t" \
|
||||
STR(PTR)"\t2b, 11b\n\t" \
|
||||
STR(PTR)"\t3b, 11b\n\t" \
|
||||
STR(PTR)"\t4b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t1b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t2b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t3b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t4b, 11b\n\t" \
|
||||
".previous" \
|
||||
: "=&r" (res) \
|
||||
: "r" (value), "r" (addr), "i" (-EFAULT) \
|
||||
@@ -743,14 +743,14 @@ do { \
|
||||
"j\t10b\n\t" \
|
||||
".previous\n\t" \
|
||||
".section\t__ex_table,\"a\"\n\t" \
|
||||
STR(PTR)"\t1b, 11b\n\t" \
|
||||
STR(PTR)"\t2b, 11b\n\t" \
|
||||
STR(PTR)"\t3b, 11b\n\t" \
|
||||
STR(PTR)"\t4b, 11b\n\t" \
|
||||
STR(PTR)"\t5b, 11b\n\t" \
|
||||
STR(PTR)"\t6b, 11b\n\t" \
|
||||
STR(PTR)"\t7b, 11b\n\t" \
|
||||
STR(PTR)"\t8b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t1b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t2b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t3b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t4b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t5b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t6b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t7b, 11b\n\t" \
|
||||
STR(PTR_WD)"\t8b, 11b\n\t" \
|
||||
".previous" \
|
||||
: "=&r" (res) \
|
||||
: "r" (value), "r" (addr), "i" (-EFAULT) \
|
||||
|
||||
@@ -1258,10 +1258,10 @@ fpu_emul:
|
||||
" j 10b\n"
|
||||
" .previous\n"
|
||||
" .section __ex_table,\"a\"\n"
|
||||
STR(PTR) " 1b,8b\n"
|
||||
STR(PTR) " 2b,8b\n"
|
||||
STR(PTR) " 3b,8b\n"
|
||||
STR(PTR) " 4b,8b\n"
|
||||
STR(PTR_WD) " 1b,8b\n"
|
||||
STR(PTR_WD) " 2b,8b\n"
|
||||
STR(PTR_WD) " 3b,8b\n"
|
||||
STR(PTR_WD) " 4b,8b\n"
|
||||
" .previous\n"
|
||||
" .set pop\n"
|
||||
: "+&r"(rt), "=&r"(rs),
|
||||
@@ -1333,10 +1333,10 @@ fpu_emul:
|
||||
" j 10b\n"
|
||||
" .previous\n"
|
||||
" .section __ex_table,\"a\"\n"
|
||||
STR(PTR) " 1b,8b\n"
|
||||
STR(PTR) " 2b,8b\n"
|
||||
STR(PTR) " 3b,8b\n"
|
||||
STR(PTR) " 4b,8b\n"
|
||||
STR(PTR_WD) " 1b,8b\n"
|
||||
STR(PTR_WD) " 2b,8b\n"
|
||||
STR(PTR_WD) " 3b,8b\n"
|
||||
STR(PTR_WD) " 4b,8b\n"
|
||||
" .previous\n"
|
||||
" .set pop\n"
|
||||
: "+&r"(rt), "=&r"(rs),
|
||||
@@ -1404,10 +1404,10 @@ fpu_emul:
|
||||
" j 9b\n"
|
||||
" .previous\n"
|
||||
" .section __ex_table,\"a\"\n"
|
||||
STR(PTR) " 1b,8b\n"
|
||||
STR(PTR) " 2b,8b\n"
|
||||
STR(PTR) " 3b,8b\n"
|
||||
STR(PTR) " 4b,8b\n"
|
||||
STR(PTR_WD) " 1b,8b\n"
|
||||
STR(PTR_WD) " 2b,8b\n"
|
||||
STR(PTR_WD) " 3b,8b\n"
|
||||
STR(PTR_WD) " 4b,8b\n"
|
||||
" .previous\n"
|
||||
" .set pop\n"
|
||||
: "+&r"(rt), "=&r"(rs),
|
||||
@@ -1474,10 +1474,10 @@ fpu_emul:
|
||||
" j 9b\n"
|
||||
" .previous\n"
|
||||
" .section __ex_table,\"a\"\n"
|
||||
STR(PTR) " 1b,8b\n"
|
||||
STR(PTR) " 2b,8b\n"
|
||||
STR(PTR) " 3b,8b\n"
|
||||
STR(PTR) " 4b,8b\n"
|
||||
STR(PTR_WD) " 1b,8b\n"
|
||||
STR(PTR_WD) " 2b,8b\n"
|
||||
STR(PTR_WD) " 3b,8b\n"
|
||||
STR(PTR_WD) " 4b,8b\n"
|
||||
" .previous\n"
|
||||
" .set pop\n"
|
||||
: "+&r"(rt), "=&r"(rs),
|
||||
@@ -1589,14 +1589,14 @@ fpu_emul:
|
||||
" j 9b\n"
|
||||
" .previous\n"
|
||||
" .section __ex_table,\"a\"\n"
|
||||
STR(PTR) " 1b,8b\n"
|
||||
STR(PTR) " 2b,8b\n"
|
||||
STR(PTR) " 3b,8b\n"
|
||||
STR(PTR) " 4b,8b\n"
|
||||
STR(PTR) " 5b,8b\n"
|
||||
STR(PTR) " 6b,8b\n"
|
||||
STR(PTR) " 7b,8b\n"
|
||||
STR(PTR) " 0b,8b\n"
|
||||
STR(PTR_WD) " 1b,8b\n"
|
||||
STR(PTR_WD) " 2b,8b\n"
|
||||
STR(PTR_WD) " 3b,8b\n"
|
||||
STR(PTR_WD) " 4b,8b\n"
|
||||
STR(PTR_WD) " 5b,8b\n"
|
||||
STR(PTR_WD) " 6b,8b\n"
|
||||
STR(PTR_WD) " 7b,8b\n"
|
||||
STR(PTR_WD) " 0b,8b\n"
|
||||
" .previous\n"
|
||||
" .set pop\n"
|
||||
: "+&r"(rt), "=&r"(rs),
|
||||
@@ -1708,14 +1708,14 @@ fpu_emul:
|
||||
" j 9b\n"
|
||||
" .previous\n"
|
||||
" .section __ex_table,\"a\"\n"
|
||||
STR(PTR) " 1b,8b\n"
|
||||
STR(PTR) " 2b,8b\n"
|
||||
STR(PTR) " 3b,8b\n"
|
||||
STR(PTR) " 4b,8b\n"
|
||||
STR(PTR) " 5b,8b\n"
|
||||
STR(PTR) " 6b,8b\n"
|
||||
STR(PTR) " 7b,8b\n"
|
||||
STR(PTR) " 0b,8b\n"
|
||||
STR(PTR_WD) " 1b,8b\n"
|
||||
STR(PTR_WD) " 2b,8b\n"
|
||||
STR(PTR_WD) " 3b,8b\n"
|
||||
STR(PTR_WD) " 4b,8b\n"
|
||||
STR(PTR_WD) " 5b,8b\n"
|
||||
STR(PTR_WD) " 6b,8b\n"
|
||||
STR(PTR_WD) " 7b,8b\n"
|
||||
STR(PTR_WD) " 0b,8b\n"
|
||||
" .previous\n"
|
||||
" .set pop\n"
|
||||
: "+&r"(rt), "=&r"(rs),
|
||||
@@ -1827,14 +1827,14 @@ fpu_emul:
|
||||
" j 9b\n"
|
||||
" .previous\n"
|
||||
" .section __ex_table,\"a\"\n"
|
||||
STR(PTR) " 1b,8b\n"
|
||||
STR(PTR) " 2b,8b\n"
|
||||
STR(PTR) " 3b,8b\n"
|
||||
STR(PTR) " 4b,8b\n"
|
||||
STR(PTR) " 5b,8b\n"
|
||||
STR(PTR) " 6b,8b\n"
|
||||
STR(PTR) " 7b,8b\n"
|
||||
STR(PTR) " 0b,8b\n"
|
||||
STR(PTR_WD) " 1b,8b\n"
|
||||
STR(PTR_WD) " 2b,8b\n"
|
||||
STR(PTR_WD) " 3b,8b\n"
|
||||
STR(PTR_WD) " 4b,8b\n"
|
||||
STR(PTR_WD) " 5b,8b\n"
|
||||
STR(PTR_WD) " 6b,8b\n"
|
||||
STR(PTR_WD) " 7b,8b\n"
|
||||
STR(PTR_WD) " 0b,8b\n"
|
||||
" .previous\n"
|
||||
" .set pop\n"
|
||||
: "+&r"(rt), "=&r"(rs),
|
||||
@@ -1945,14 +1945,14 @@ fpu_emul:
|
||||
" j 9b\n"
|
||||
" .previous\n"
|
||||
" .section __ex_table,\"a\"\n"
|
||||
STR(PTR) " 1b,8b\n"
|
||||
STR(PTR) " 2b,8b\n"
|
||||
STR(PTR) " 3b,8b\n"
|
||||
STR(PTR) " 4b,8b\n"
|
||||
STR(PTR) " 5b,8b\n"
|
||||
STR(PTR) " 6b,8b\n"
|
||||
STR(PTR) " 7b,8b\n"
|
||||
STR(PTR) " 0b,8b\n"
|
||||
STR(PTR_WD) " 1b,8b\n"
|
||||
STR(PTR_WD) " 2b,8b\n"
|
||||
STR(PTR_WD) " 3b,8b\n"
|
||||
STR(PTR_WD) " 4b,8b\n"
|
||||
STR(PTR_WD) " 5b,8b\n"
|
||||
STR(PTR_WD) " 6b,8b\n"
|
||||
STR(PTR_WD) " 7b,8b\n"
|
||||
STR(PTR_WD) " 0b,8b\n"
|
||||
" .previous\n"
|
||||
" .set pop\n"
|
||||
: "+&r"(rt), "=&r"(rs),
|
||||
@@ -2007,7 +2007,7 @@ fpu_emul:
|
||||
"j 2b\n"
|
||||
".previous\n"
|
||||
".section __ex_table,\"a\"\n"
|
||||
STR(PTR) " 1b,3b\n"
|
||||
STR(PTR_WD) " 1b,3b\n"
|
||||
".previous\n"
|
||||
: "=&r"(res), "+&r"(err)
|
||||
: "r"(vaddr), "i"(SIGSEGV)
|
||||
@@ -2065,7 +2065,7 @@ fpu_emul:
|
||||
"j 2b\n"
|
||||
".previous\n"
|
||||
".section __ex_table,\"a\"\n"
|
||||
STR(PTR) " 1b,3b\n"
|
||||
STR(PTR_WD) " 1b,3b\n"
|
||||
".previous\n"
|
||||
: "+&r"(res), "+&r"(err)
|
||||
: "r"(vaddr), "i"(SIGSEGV));
|
||||
@@ -2126,7 +2126,7 @@ fpu_emul:
|
||||
"j 2b\n"
|
||||
".previous\n"
|
||||
".section __ex_table,\"a\"\n"
|
||||
STR(PTR) " 1b,3b\n"
|
||||
STR(PTR_WD) " 1b,3b\n"
|
||||
".previous\n"
|
||||
: "=&r"(res), "+&r"(err)
|
||||
: "r"(vaddr), "i"(SIGSEGV)
|
||||
@@ -2189,7 +2189,7 @@ fpu_emul:
|
||||
"j 2b\n"
|
||||
".previous\n"
|
||||
".section __ex_table,\"a\"\n"
|
||||
STR(PTR) " 1b,3b\n"
|
||||
STR(PTR_WD) " 1b,3b\n"
|
||||
".previous\n"
|
||||
: "+&r"(res), "+&r"(err)
|
||||
: "r"(vaddr), "i"(SIGSEGV));
|
||||
|
||||
@@ -23,14 +23,14 @@
|
||||
#define EX(a,b) \
|
||||
9: a,##b; \
|
||||
.section __ex_table,"a"; \
|
||||
PTR 9b,fault; \
|
||||
PTR_WD 9b,fault; \
|
||||
.previous
|
||||
|
||||
#define EX2(a,b) \
|
||||
9: a,##b; \
|
||||
.section __ex_table,"a"; \
|
||||
PTR 9b,fault; \
|
||||
PTR 9b+4,fault; \
|
||||
PTR_WD 9b,fault; \
|
||||
PTR_WD 9b+4,fault; \
|
||||
.previous
|
||||
|
||||
.set mips1
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
.ex\@: \insn \reg, \src
|
||||
.set pop
|
||||
.section __ex_table,"a"
|
||||
PTR .ex\@, fault
|
||||
PTR_WD .ex\@, fault
|
||||
.previous
|
||||
.endm
|
||||
|
||||
|
||||
@@ -147,10 +147,10 @@ LEAF(kexec_smp_wait)
|
||||
|
||||
kexec_args:
|
||||
EXPORT(kexec_args)
|
||||
arg0: PTR 0x0
|
||||
arg1: PTR 0x0
|
||||
arg2: PTR 0x0
|
||||
arg3: PTR 0x0
|
||||
arg0: PTR_WD 0x0
|
||||
arg1: PTR_WD 0x0
|
||||
arg2: PTR_WD 0x0
|
||||
arg3: PTR_WD 0x0
|
||||
.size kexec_args,PTRSIZE*4
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
@@ -161,10 +161,10 @@ arg3: PTR 0x0
|
||||
*/
|
||||
secondary_kexec_args:
|
||||
EXPORT(secondary_kexec_args)
|
||||
s_arg0: PTR 0x0
|
||||
s_arg1: PTR 0x0
|
||||
s_arg2: PTR 0x0
|
||||
s_arg3: PTR 0x0
|
||||
s_arg0: PTR_WD 0x0
|
||||
s_arg1: PTR_WD 0x0
|
||||
s_arg2: PTR_WD 0x0
|
||||
s_arg3: PTR_WD 0x0
|
||||
.size secondary_kexec_args,PTRSIZE*4
|
||||
kexec_flag:
|
||||
LONG 0x1
|
||||
@@ -173,17 +173,17 @@ kexec_flag:
|
||||
|
||||
kexec_start_address:
|
||||
EXPORT(kexec_start_address)
|
||||
PTR 0x0
|
||||
PTR_WD 0x0
|
||||
.size kexec_start_address, PTRSIZE
|
||||
|
||||
kexec_indirection_page:
|
||||
EXPORT(kexec_indirection_page)
|
||||
PTR 0
|
||||
PTR_WD 0
|
||||
.size kexec_indirection_page, PTRSIZE
|
||||
|
||||
relocate_new_kernel_end:
|
||||
|
||||
relocate_new_kernel_size:
|
||||
EXPORT(relocate_new_kernel_size)
|
||||
PTR relocate_new_kernel_end - relocate_new_kernel
|
||||
PTR_WD relocate_new_kernel_end - relocate_new_kernel
|
||||
.size relocate_new_kernel_size, PTRSIZE
|
||||
|
||||
@@ -72,10 +72,10 @@ loads_done:
|
||||
.set pop
|
||||
|
||||
.section __ex_table,"a"
|
||||
PTR load_a4, bad_stack_a4
|
||||
PTR load_a5, bad_stack_a5
|
||||
PTR load_a6, bad_stack_a6
|
||||
PTR load_a7, bad_stack_a7
|
||||
PTR_WD load_a4, bad_stack_a4
|
||||
PTR_WD load_a5, bad_stack_a5
|
||||
PTR_WD load_a6, bad_stack_a6
|
||||
PTR_WD load_a7, bad_stack_a7
|
||||
.previous
|
||||
|
||||
lw t0, TI_FLAGS($28) # syscall tracing enabled?
|
||||
@@ -216,7 +216,7 @@ einval: li v0, -ENOSYS
|
||||
#endif /* CONFIG_MIPS_MT_FPAFF */
|
||||
|
||||
#define __SYSCALL_WITH_COMPAT(nr, native, compat) __SYSCALL(nr, native)
|
||||
#define __SYSCALL(nr, entry) PTR entry
|
||||
#define __SYSCALL(nr, entry) PTR_WD entry
|
||||
.align 2
|
||||
.type sys_call_table, @object
|
||||
EXPORT(sys_call_table)
|
||||
|
||||
@@ -101,7 +101,7 @@ not_n32_scall:
|
||||
|
||||
END(handle_sysn32)
|
||||
|
||||
#define __SYSCALL(nr, entry) PTR entry
|
||||
#define __SYSCALL(nr, entry) PTR_WD entry
|
||||
.type sysn32_call_table, @object
|
||||
EXPORT(sysn32_call_table)
|
||||
#include <asm/syscall_table_n32.h>
|
||||
|
||||
@@ -109,7 +109,7 @@ illegal_syscall:
|
||||
j n64_syscall_exit
|
||||
END(handle_sys64)
|
||||
|
||||
#define __SYSCALL(nr, entry) PTR entry
|
||||
#define __SYSCALL(nr, entry) PTR_WD entry
|
||||
.align 3
|
||||
.type sys_call_table, @object
|
||||
EXPORT(sys_call_table)
|
||||
|
||||
@@ -73,10 +73,10 @@ load_a7: lw a7, 28(t0) # argument #8 from usp
|
||||
loads_done:
|
||||
|
||||
.section __ex_table,"a"
|
||||
PTR load_a4, bad_stack_a4
|
||||
PTR load_a5, bad_stack_a5
|
||||
PTR load_a6, bad_stack_a6
|
||||
PTR load_a7, bad_stack_a7
|
||||
PTR_WD load_a4, bad_stack_a4
|
||||
PTR_WD load_a5, bad_stack_a5
|
||||
PTR_WD load_a6, bad_stack_a6
|
||||
PTR_WD load_a7, bad_stack_a7
|
||||
.previous
|
||||
|
||||
li t1, _TIF_WORK_SYSCALL_ENTRY
|
||||
@@ -214,7 +214,7 @@ einval: li v0, -ENOSYS
|
||||
END(sys32_syscall)
|
||||
|
||||
#define __SYSCALL_WITH_COMPAT(nr, native, compat) __SYSCALL(nr, compat)
|
||||
#define __SYSCALL(nr, entry) PTR entry
|
||||
#define __SYSCALL(nr, entry) PTR_WD entry
|
||||
.align 3
|
||||
.type sys32_call_table,@object
|
||||
EXPORT(sys32_call_table)
|
||||
|
||||
@@ -122,8 +122,8 @@ static inline int mips_atomic_set(unsigned long addr, unsigned long new)
|
||||
" j 3b \n"
|
||||
" .previous \n"
|
||||
" .section __ex_table,\"a\" \n"
|
||||
" "STR(PTR)" 1b, 4b \n"
|
||||
" "STR(PTR)" 2b, 4b \n"
|
||||
" "STR(PTR_WD)" 1b, 4b \n"
|
||||
" "STR(PTR_WD)" 2b, 4b \n"
|
||||
" .previous \n"
|
||||
" .set pop \n"
|
||||
: [old] "=&r" (old),
|
||||
@@ -152,8 +152,8 @@ static inline int mips_atomic_set(unsigned long addr, unsigned long new)
|
||||
" j 3b \n"
|
||||
" .previous \n"
|
||||
" .section __ex_table,\"a\" \n"
|
||||
" "STR(PTR)" 1b, 5b \n"
|
||||
" "STR(PTR)" 2b, 5b \n"
|
||||
" "STR(PTR_WD)" 1b, 5b \n"
|
||||
" "STR(PTR_WD)" 2b, 5b \n"
|
||||
" .previous \n"
|
||||
" .set pop \n"
|
||||
: [old] "=&r" (old),
|
||||
|
||||
@@ -347,7 +347,7 @@ EXPORT_SYMBOL(csum_partial)
|
||||
.if \mode == LEGACY_MODE; \
|
||||
9: insn reg, addr; \
|
||||
.section __ex_table,"a"; \
|
||||
PTR 9b, .L_exc; \
|
||||
PTR_WD 9b, .L_exc; \
|
||||
.previous; \
|
||||
/* This is enabled in EVA mode */ \
|
||||
.else; \
|
||||
@@ -356,7 +356,7 @@ EXPORT_SYMBOL(csum_partial)
|
||||
((\to == USEROP) && (type == ST_INSN)); \
|
||||
9: __BUILD_EVA_INSN(insn##e, reg, addr); \
|
||||
.section __ex_table,"a"; \
|
||||
PTR 9b, .L_exc; \
|
||||
PTR_WD 9b, .L_exc; \
|
||||
.previous; \
|
||||
.else; \
|
||||
/* EVA without exception */ \
|
||||
|
||||
@@ -116,7 +116,7 @@
|
||||
.if \mode == LEGACY_MODE; \
|
||||
9: insn reg, addr; \
|
||||
.section __ex_table,"a"; \
|
||||
PTR 9b, handler; \
|
||||
PTR_WD 9b, handler; \
|
||||
.previous; \
|
||||
/* This is assembled in EVA mode */ \
|
||||
.else; \
|
||||
@@ -125,7 +125,7 @@
|
||||
((\to == USEROP) && (type == ST_INSN)); \
|
||||
9: __BUILD_EVA_INSN(insn##e, reg, addr); \
|
||||
.section __ex_table,"a"; \
|
||||
PTR 9b, handler; \
|
||||
PTR_WD 9b, handler; \
|
||||
.previous; \
|
||||
.else; \
|
||||
/* \
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
9: ___BUILD_EVA_INSN(insn, reg, addr); \
|
||||
.endif; \
|
||||
.section __ex_table,"a"; \
|
||||
PTR 9b, handler; \
|
||||
PTR_WD 9b, handler; \
|
||||
.previous
|
||||
|
||||
.macro f_fill64 dst, offset, val, fixup, mode
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
#define EX(insn,reg,addr,handler) \
|
||||
9: insn reg, addr; \
|
||||
.section __ex_table,"a"; \
|
||||
PTR 9b, handler; \
|
||||
PTR_WD 9b, handler; \
|
||||
.previous
|
||||
|
||||
/*
|
||||
@@ -59,7 +59,7 @@ LEAF(__strncpy_from_user_asm)
|
||||
jr ra
|
||||
|
||||
.section __ex_table,"a"
|
||||
PTR 1b, .Lfault
|
||||
PTR_WD 1b, .Lfault
|
||||
.previous
|
||||
|
||||
EXPORT_SYMBOL(__strncpy_from_user_asm)
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
#define EX(insn,reg,addr,handler) \
|
||||
9: insn reg, addr; \
|
||||
.section __ex_table,"a"; \
|
||||
PTR 9b, handler; \
|
||||
PTR_WD 9b, handler; \
|
||||
.previous
|
||||
|
||||
/*
|
||||
|
||||
@@ -178,6 +178,7 @@ static inline bool pte_user(pte_t pte)
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
int map_kernel_page(unsigned long va, phys_addr_t pa, pgprot_t prot);
|
||||
void unmap_kernel_page(unsigned long va);
|
||||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
|
||||
|
||||
@@ -1082,6 +1082,8 @@ static inline int map_kernel_page(unsigned long ea, unsigned long pa, pgprot_t p
|
||||
return hash__map_kernel_page(ea, pa, prot);
|
||||
}
|
||||
|
||||
void unmap_kernel_page(unsigned long va);
|
||||
|
||||
static inline int __meminit vmemmap_create_mapping(unsigned long start,
|
||||
unsigned long page_size,
|
||||
unsigned long phys)
|
||||
|
||||
@@ -111,8 +111,10 @@ static inline void __set_fixmap(enum fixed_addresses idx,
|
||||
BUILD_BUG_ON(idx >= __end_of_fixed_addresses);
|
||||
else if (WARN_ON(idx >= __end_of_fixed_addresses))
|
||||
return;
|
||||
|
||||
map_kernel_page(__fix_to_virt(idx), phys, flags);
|
||||
if (pgprot_val(flags))
|
||||
map_kernel_page(__fix_to_virt(idx), phys, flags);
|
||||
else
|
||||
unmap_kernel_page(__fix_to_virt(idx));
|
||||
}
|
||||
|
||||
#define __early_set_fixmap __set_fixmap
|
||||
|
||||
@@ -64,6 +64,7 @@ extern int icache_44x_need_flush;
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
int map_kernel_page(unsigned long va, phys_addr_t pa, pgprot_t prot);
|
||||
void unmap_kernel_page(unsigned long va);
|
||||
|
||||
#endif /* !__ASSEMBLY__ */
|
||||
|
||||
|
||||
@@ -308,6 +308,7 @@ static inline void __ptep_set_access_flags(struct vm_area_struct *vma,
|
||||
#define __swp_entry_to_pte(x) __pte((x).val)
|
||||
|
||||
int map_kernel_page(unsigned long ea, unsigned long pa, pgprot_t prot);
|
||||
void unmap_kernel_page(unsigned long va);
|
||||
extern int __meminit vmemmap_create_mapping(unsigned long start,
|
||||
unsigned long page_size,
|
||||
unsigned long phys);
|
||||
|
||||
@@ -203,6 +203,15 @@ void set_pte_at(struct mm_struct *mm, unsigned long addr, pte_t *ptep,
|
||||
__set_pte_at(mm, addr, ptep, pte, 0);
|
||||
}
|
||||
|
||||
void unmap_kernel_page(unsigned long va)
|
||||
{
|
||||
pmd_t *pmdp = pmd_off_k(va);
|
||||
pte_t *ptep = pte_offset_kernel(pmdp, va);
|
||||
|
||||
pte_clear(&init_mm, va, ptep);
|
||||
flush_tlb_kernel_range(va, va + PAGE_SIZE);
|
||||
}
|
||||
|
||||
/*
|
||||
* This is called when relaxing access to a PTE. It's also called in the page
|
||||
* fault path when we don't hit any of the major fault cases, ie, a minor
|
||||
|
||||
@@ -52,6 +52,12 @@ riscv-march-$(CONFIG_ARCH_RV32I) := rv32ima
|
||||
riscv-march-$(CONFIG_ARCH_RV64I) := rv64ima
|
||||
riscv-march-$(CONFIG_FPU) := $(riscv-march-y)fd
|
||||
riscv-march-$(CONFIG_RISCV_ISA_C) := $(riscv-march-y)c
|
||||
|
||||
# Newer binutils versions default to ISA spec version 20191213 which moves some
|
||||
# instructions from the I extension to the Zicsr and Zifencei extensions.
|
||||
toolchain-need-zicsr-zifencei := $(call cc-option-yn, -march=$(riscv-march-y)_zicsr_zifencei)
|
||||
riscv-march-$(toolchain-need-zicsr-zifencei) := $(riscv-march-y)_zicsr_zifencei
|
||||
|
||||
KBUILD_CFLAGS += -march=$(subst fd,,$(riscv-march-y))
|
||||
KBUILD_AFLAGS += -march=$(riscv-march-y)
|
||||
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
#include <linux/sched/hotplug.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/cpu_ops.h>
|
||||
#include <asm/numa.h>
|
||||
#include <asm/sbi.h>
|
||||
|
||||
void cpu_stop(void);
|
||||
@@ -46,6 +47,7 @@ int __cpu_disable(void)
|
||||
return ret;
|
||||
|
||||
remove_cpu_topology(cpu);
|
||||
numa_remove_cpu(cpu);
|
||||
set_cpu_online(cpu, false);
|
||||
irq_migrate_all_off_this_cpu();
|
||||
|
||||
|
||||
@@ -22,15 +22,16 @@ void notrace walk_stackframe(struct task_struct *task, struct pt_regs *regs,
|
||||
bool (*fn)(void *, unsigned long), void *arg)
|
||||
{
|
||||
unsigned long fp, sp, pc;
|
||||
int level = 0;
|
||||
|
||||
if (regs) {
|
||||
fp = frame_pointer(regs);
|
||||
sp = user_stack_pointer(regs);
|
||||
pc = instruction_pointer(regs);
|
||||
} else if (task == NULL || task == current) {
|
||||
fp = (unsigned long)__builtin_frame_address(1);
|
||||
sp = (unsigned long)__builtin_frame_address(0);
|
||||
pc = (unsigned long)__builtin_return_address(0);
|
||||
fp = (unsigned long)__builtin_frame_address(0);
|
||||
sp = sp_in_global;
|
||||
pc = (unsigned long)walk_stackframe;
|
||||
} else {
|
||||
/* task blocked in __switch_to */
|
||||
fp = task->thread.s[0];
|
||||
@@ -42,7 +43,7 @@ void notrace walk_stackframe(struct task_struct *task, struct pt_regs *regs,
|
||||
unsigned long low, high;
|
||||
struct stackframe *frame;
|
||||
|
||||
if (unlikely(!__kernel_text_address(pc) || !fn(arg, pc)))
|
||||
if (unlikely(!__kernel_text_address(pc) || (level++ >= 1 && !fn(arg, pc))))
|
||||
break;
|
||||
|
||||
/* Validate frame pointer */
|
||||
|
||||
@@ -1734,6 +1734,9 @@ static bool is_arch_lbr_xsave_available(void)
|
||||
* Check the LBR state with the corresponding software structure.
|
||||
* Disable LBR XSAVES support if the size doesn't match.
|
||||
*/
|
||||
if (xfeature_size(XFEATURE_LBR) == 0)
|
||||
return false;
|
||||
|
||||
if (WARN_ON(xfeature_size(XFEATURE_LBR) != get_lbr_state_size()))
|
||||
return false;
|
||||
|
||||
|
||||
@@ -536,11 +536,14 @@ static struct perf_msr intel_rapl_spr_msrs[] = {
|
||||
* - perf_msr_probe(PERF_RAPL_MAX)
|
||||
* - want to use same event codes across both architectures
|
||||
*/
|
||||
static struct perf_msr amd_rapl_msrs[PERF_RAPL_MAX] = {
|
||||
[PERF_RAPL_PKG] = { MSR_AMD_PKG_ENERGY_STATUS, &rapl_events_pkg_group, test_msr },
|
||||
static struct perf_msr amd_rapl_msrs[] = {
|
||||
[PERF_RAPL_PP0] = { 0, &rapl_events_cores_group, 0, false, 0 },
|
||||
[PERF_RAPL_PKG] = { MSR_AMD_PKG_ENERGY_STATUS, &rapl_events_pkg_group, test_msr, false, RAPL_MSR_MASK },
|
||||
[PERF_RAPL_RAM] = { 0, &rapl_events_ram_group, 0, false, 0 },
|
||||
[PERF_RAPL_PP1] = { 0, &rapl_events_gpu_group, 0, false, 0 },
|
||||
[PERF_RAPL_PSYS] = { 0, &rapl_events_psys_group, 0, false, 0 },
|
||||
};
|
||||
|
||||
|
||||
static int rapl_cpu_offline(unsigned int cpu)
|
||||
{
|
||||
struct rapl_pmu *pmu = cpu_to_rapl_pmu(cpu);
|
||||
|
||||
@@ -410,6 +410,8 @@ void sgx_encl_release(struct kref *ref)
|
||||
}
|
||||
|
||||
kfree(entry);
|
||||
/* Invoke scheduler to prevent soft lockups. */
|
||||
cond_resched();
|
||||
}
|
||||
|
||||
xa_destroy(&encl->page_array);
|
||||
|
||||
@@ -421,12 +421,13 @@ void kvm_set_cpu_caps(void)
|
||||
);
|
||||
|
||||
kvm_cpu_cap_mask(CPUID_7_0_EBX,
|
||||
F(FSGSBASE) | F(SGX) | F(BMI1) | F(HLE) | F(AVX2) | F(SMEP) |
|
||||
F(BMI2) | F(ERMS) | F(INVPCID) | F(RTM) | 0 /*MPX*/ | F(RDSEED) |
|
||||
F(ADX) | F(SMAP) | F(AVX512IFMA) | F(AVX512F) | F(AVX512PF) |
|
||||
F(AVX512ER) | F(AVX512CD) | F(CLFLUSHOPT) | F(CLWB) | F(AVX512DQ) |
|
||||
F(SHA_NI) | F(AVX512BW) | F(AVX512VL) | 0 /*INTEL_PT*/
|
||||
);
|
||||
F(FSGSBASE) | F(SGX) | F(BMI1) | F(HLE) | F(AVX2) |
|
||||
F(FDP_EXCPTN_ONLY) | F(SMEP) | F(BMI2) | F(ERMS) | F(INVPCID) |
|
||||
F(RTM) | F(ZERO_FCS_FDS) | 0 /*MPX*/ | F(AVX512F) |
|
||||
F(AVX512DQ) | F(RDSEED) | F(ADX) | F(SMAP) | F(AVX512IFMA) |
|
||||
F(CLFLUSHOPT) | F(CLWB) | 0 /*INTEL_PT*/ | F(AVX512PF) |
|
||||
F(AVX512ER) | F(AVX512CD) | F(SHA_NI) | F(AVX512BW) |
|
||||
F(AVX512VL));
|
||||
|
||||
kvm_cpu_cap_mask(CPUID_7_ECX,
|
||||
F(AVX512VBMI) | F(LA57) | F(PKU) | 0 /*OSPKE*/ | F(RDPID) |
|
||||
|
||||
@@ -4473,7 +4473,21 @@ static bool svm_can_emulate_instruction(struct kvm_vcpu *vcpu, void *insn, int i
|
||||
is_user = svm_get_cpl(vcpu) == 3;
|
||||
if (smap && (!smep || is_user)) {
|
||||
pr_err_ratelimited("KVM: SEV Guest triggered AMD Erratum 1096\n");
|
||||
kvm_make_request(KVM_REQ_TRIPLE_FAULT, vcpu);
|
||||
|
||||
/*
|
||||
* If the fault occurred in userspace, arbitrarily inject #GP
|
||||
* to avoid killing the guest and to hopefully avoid confusing
|
||||
* the guest kernel too much, e.g. injecting #PF would not be
|
||||
* coherent with respect to the guest's page tables. Request
|
||||
* triple fault if the fault occurred in the kernel as there's
|
||||
* no fault that KVM can inject without confusing the guest.
|
||||
* In practice, the triple fault is moot as no sane SEV kernel
|
||||
* will execute from user memory while also running with SMAP=1.
|
||||
*/
|
||||
if (is_user)
|
||||
kvm_inject_gp(vcpu, 0);
|
||||
else
|
||||
kvm_make_request(KVM_REQ_TRIPLE_FAULT, vcpu);
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
@@ -362,6 +362,7 @@ void nested_evmcs_filter_control_msr(u32 msr_index, u64 *pdata)
|
||||
case MSR_IA32_VMX_PROCBASED_CTLS2:
|
||||
ctl_high &= ~EVMCS1_UNSUPPORTED_2NDEXEC;
|
||||
break;
|
||||
case MSR_IA32_VMX_TRUE_PINBASED_CTLS:
|
||||
case MSR_IA32_VMX_PINBASED_CTLS:
|
||||
ctl_high &= ~EVMCS1_UNSUPPORTED_PINCTRL;
|
||||
break;
|
||||
|
||||
@@ -59,7 +59,9 @@ DECLARE_STATIC_KEY_FALSE(enable_evmcs);
|
||||
SECONDARY_EXEC_SHADOW_VMCS | \
|
||||
SECONDARY_EXEC_TSC_SCALING | \
|
||||
SECONDARY_EXEC_PAUSE_LOOP_EXITING)
|
||||
#define EVMCS1_UNSUPPORTED_VMEXIT_CTRL (VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL)
|
||||
#define EVMCS1_UNSUPPORTED_VMEXIT_CTRL \
|
||||
(VM_EXIT_LOAD_IA32_PERF_GLOBAL_CTRL | \
|
||||
VM_EXIT_SAVE_VMX_PREEMPTION_TIMER)
|
||||
#define EVMCS1_UNSUPPORTED_VMENTRY_CTRL (VM_ENTRY_LOAD_IA32_PERF_GLOBAL_CTRL)
|
||||
#define EVMCS1_UNSUPPORTED_VMFUNC (VMX_VMFUNC_EPTP_SWITCHING)
|
||||
|
||||
|
||||
@@ -4791,8 +4791,33 @@ static int handle_exception_nmi(struct kvm_vcpu *vcpu)
|
||||
dr6 = vmx_get_exit_qual(vcpu);
|
||||
if (!(vcpu->guest_debug &
|
||||
(KVM_GUESTDBG_SINGLESTEP | KVM_GUESTDBG_USE_HW_BP))) {
|
||||
/*
|
||||
* If the #DB was due to ICEBP, a.k.a. INT1, skip the
|
||||
* instruction. ICEBP generates a trap-like #DB, but
|
||||
* despite its interception control being tied to #DB,
|
||||
* is an instruction intercept, i.e. the VM-Exit occurs
|
||||
* on the ICEBP itself. Note, skipping ICEBP also
|
||||
* clears STI and MOVSS blocking.
|
||||
*
|
||||
* For all other #DBs, set vmcs.PENDING_DBG_EXCEPTIONS.BS
|
||||
* if single-step is enabled in RFLAGS and STI or MOVSS
|
||||
* blocking is active, as the CPU doesn't set the bit
|
||||
* on VM-Exit due to #DB interception. VM-Entry has a
|
||||
* consistency check that a single-step #DB is pending
|
||||
* in this scenario as the previous instruction cannot
|
||||
* have toggled RFLAGS.TF 0=>1 (because STI and POP/MOV
|
||||
* don't modify RFLAGS), therefore the one instruction
|
||||
* delay when activating single-step breakpoints must
|
||||
* have already expired. Note, the CPU sets/clears BS
|
||||
* as appropriate for all other VM-Exits types.
|
||||
*/
|
||||
if (is_icebp(intr_info))
|
||||
WARN_ON(!skip_emulated_instruction(vcpu));
|
||||
else if ((vmx_get_rflags(vcpu) & X86_EFLAGS_TF) &&
|
||||
(vmcs_read32(GUEST_INTERRUPTIBILITY_INFO) &
|
||||
(GUEST_INTR_STATE_STI | GUEST_INTR_STATE_MOV_SS)))
|
||||
vmcs_writel(GUEST_PENDING_DBG_EXCEPTIONS,
|
||||
vmcs_readl(GUEST_PENDING_DBG_EXCEPTIONS) | DR6_BS);
|
||||
|
||||
kvm_queue_exception_p(vcpu, DB_VECTOR, dr6);
|
||||
return 1;
|
||||
|
||||
@@ -44,6 +44,7 @@ static struct var_t vars[] = {
|
||||
{ CAPS_START, .u.s = {"[:dv ap 160] " } },
|
||||
{ CAPS_STOP, .u.s = {"[:dv ap 100 ] " } },
|
||||
{ RATE, .u.n = {"[:ra %d] ", 180, 75, 650, 0, 0, NULL } },
|
||||
{ PITCH, .u.n = {"[:dv ap %d] ", 122, 50, 350, 0, 0, NULL } },
|
||||
{ INFLECTION, .u.n = {"[:dv pr %d] ", 100, 0, 10000, 0, 0, NULL } },
|
||||
{ VOL, .u.n = {"[:dv g5 %d] ", 86, 60, 86, 0, 0, NULL } },
|
||||
{ PUNCT, .u.n = {"[:pu %c] ", 0, 0, 2, 0, 0, "nsa" } },
|
||||
|
||||
@@ -1361,9 +1361,17 @@ static void __init arm_smmu_v3_pmcg_init_resources(struct resource *res,
|
||||
res[0].start = pmcg->page0_base_address;
|
||||
res[0].end = pmcg->page0_base_address + SZ_4K - 1;
|
||||
res[0].flags = IORESOURCE_MEM;
|
||||
res[1].start = pmcg->page1_base_address;
|
||||
res[1].end = pmcg->page1_base_address + SZ_4K - 1;
|
||||
res[1].flags = IORESOURCE_MEM;
|
||||
/*
|
||||
* The initial version in DEN0049C lacked a way to describe register
|
||||
* page 1, which makes it broken for most PMCG implementations; in
|
||||
* that case, just let the driver fail gracefully if it expects to
|
||||
* find a second memory resource.
|
||||
*/
|
||||
if (node->revision > 0) {
|
||||
res[1].start = pmcg->page1_base_address;
|
||||
res[1].end = pmcg->page1_base_address + SZ_4K - 1;
|
||||
res[1].flags = IORESOURCE_MEM;
|
||||
}
|
||||
|
||||
if (pmcg->overflow_gsiv)
|
||||
acpi_iort_register_irq(pmcg->overflow_gsiv, "overflow",
|
||||
|
||||
@@ -2051,6 +2051,16 @@ bool acpi_ec_dispatch_gpe(void)
|
||||
if (acpi_any_gpe_status_set(first_ec->gpe))
|
||||
return true;
|
||||
|
||||
/*
|
||||
* Cancel the SCI wakeup and process all pending events in case there
|
||||
* are any wakeup ones in there.
|
||||
*
|
||||
* Note that if any non-EC GPEs are active at this point, the SCI will
|
||||
* retrigger after the rearming in acpi_s2idle_wake(), so no events
|
||||
* should be missed by canceling the wakeup here.
|
||||
*/
|
||||
pm_system_cancel_wakeup();
|
||||
|
||||
/*
|
||||
* Dispatch the EC GPE in-band, but do not report wakeup in any case
|
||||
* to allow the caller to process events properly after that.
|
||||
|
||||
@@ -739,21 +739,15 @@ bool acpi_s2idle_wake(void)
|
||||
return true;
|
||||
}
|
||||
|
||||
/* Check non-EC GPE wakeups and dispatch the EC GPE. */
|
||||
/*
|
||||
* Check non-EC GPE wakeups and if there are none, cancel the
|
||||
* SCI-related wakeup and dispatch the EC GPE.
|
||||
*/
|
||||
if (acpi_ec_dispatch_gpe()) {
|
||||
pm_pr_dbg("ACPI non-EC GPE wakeup\n");
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Cancel the SCI wakeup and process all pending events in case
|
||||
* there are any wakeup ones in there.
|
||||
*
|
||||
* Note that if any non-EC GPEs are active at this point, the
|
||||
* SCI will retrigger after the rearming below, so no events
|
||||
* should be missed by canceling the wakeup here.
|
||||
*/
|
||||
pm_system_cancel_wakeup();
|
||||
acpi_os_wait_events_complete();
|
||||
|
||||
/*
|
||||
@@ -767,6 +761,7 @@ bool acpi_s2idle_wake(void)
|
||||
return true;
|
||||
}
|
||||
|
||||
pm_wakeup_clear(acpi_sci_irq);
|
||||
rearm_wake_irq(acpi_sci_irq);
|
||||
}
|
||||
|
||||
|
||||
@@ -37,7 +37,8 @@ suspend_state_t pm_suspend_target_state;
|
||||
bool events_check_enabled __read_mostly;
|
||||
|
||||
/* First wakeup IRQ seen by the kernel in the last cycle. */
|
||||
unsigned int pm_wakeup_irq __read_mostly;
|
||||
static unsigned int wakeup_irq[2] __read_mostly;
|
||||
static DEFINE_RAW_SPINLOCK(wakeup_irq_lock);
|
||||
|
||||
/* If greater than 0 and the system is suspending, terminate the suspend. */
|
||||
static atomic_t pm_abort_suspend __read_mostly;
|
||||
@@ -981,16 +982,39 @@ void pm_system_cancel_wakeup(void)
|
||||
atomic_dec_if_positive(&pm_abort_suspend);
|
||||
}
|
||||
|
||||
void pm_wakeup_clear(bool reset)
|
||||
void pm_wakeup_clear(unsigned int irq_number)
|
||||
{
|
||||
pm_wakeup_irq = 0;
|
||||
if (reset)
|
||||
raw_spin_lock_irq(&wakeup_irq_lock);
|
||||
|
||||
if (irq_number && wakeup_irq[0] == irq_number)
|
||||
wakeup_irq[0] = wakeup_irq[1];
|
||||
else
|
||||
wakeup_irq[0] = 0;
|
||||
|
||||
wakeup_irq[1] = 0;
|
||||
|
||||
raw_spin_unlock_irq(&wakeup_irq_lock);
|
||||
|
||||
if (!irq_number)
|
||||
atomic_set(&pm_abort_suspend, 0);
|
||||
}
|
||||
|
||||
void pm_system_irq_wakeup(unsigned int irq_number)
|
||||
{
|
||||
if (pm_wakeup_irq == 0) {
|
||||
unsigned long flags;
|
||||
|
||||
raw_spin_lock_irqsave(&wakeup_irq_lock, flags);
|
||||
|
||||
if (wakeup_irq[0] == 0)
|
||||
wakeup_irq[0] = irq_number;
|
||||
else if (wakeup_irq[1] == 0)
|
||||
wakeup_irq[1] = irq_number;
|
||||
else
|
||||
irq_number = 0;
|
||||
|
||||
raw_spin_unlock_irqrestore(&wakeup_irq_lock, flags);
|
||||
|
||||
if (irq_number) {
|
||||
struct irq_desc *desc;
|
||||
const char *name = "null";
|
||||
|
||||
@@ -1002,12 +1026,15 @@ void pm_system_irq_wakeup(unsigned int irq_number)
|
||||
|
||||
log_irq_wakeup_reason(irq_number);
|
||||
pr_warn("%s: %d triggered %s\n", __func__, irq_number, name);
|
||||
|
||||
pm_wakeup_irq = irq_number;
|
||||
pm_system_wakeup();
|
||||
}
|
||||
}
|
||||
|
||||
unsigned int pm_wakeup_irq(void)
|
||||
{
|
||||
return wakeup_irq[0];
|
||||
}
|
||||
|
||||
/**
|
||||
* pm_get_wakeup_count - Read the number of registered wakeup events.
|
||||
* @count: Address to store the value at.
|
||||
|
||||
@@ -366,6 +366,7 @@ static const struct mhi_pci_dev_info mhi_foxconn_sdx55_info = {
|
||||
.config = &modem_foxconn_sdx55_config,
|
||||
.bar_num = MHI_PCI_DEFAULT_BAR_NUM,
|
||||
.dma_data_width = 32,
|
||||
.mru_default = 32768,
|
||||
.sideband_wake = false,
|
||||
};
|
||||
|
||||
@@ -401,6 +402,7 @@ static const struct mhi_pci_dev_info mhi_mv31_info = {
|
||||
.config = &modem_mv31_config,
|
||||
.bar_num = MHI_PCI_DEFAULT_BAR_NUM,
|
||||
.dma_data_width = 32,
|
||||
.mru_default = 32768,
|
||||
};
|
||||
|
||||
static const struct pci_device_id mhi_pci_id_table[] = {
|
||||
|
||||
@@ -241,7 +241,7 @@ static void __init dmtimer_systimer_assign_alwon(void)
|
||||
bool quirk_unreliable_oscillator = false;
|
||||
|
||||
/* Quirk unreliable 32 KiHz oscillator with incomplete dts */
|
||||
if (of_machine_is_compatible("ti,omap3-beagle") ||
|
||||
if (of_machine_is_compatible("ti,omap3-beagle-ab4") ||
|
||||
of_machine_is_compatible("timll,omap3-devkit8000")) {
|
||||
quirk_unreliable_oscillator = true;
|
||||
counter_32k = -ENODEV;
|
||||
|
||||
@@ -273,7 +273,8 @@ static int gpio_fwd_get(struct gpio_chip *chip, unsigned int offset)
|
||||
{
|
||||
struct gpiochip_fwd *fwd = gpiochip_get_data(chip);
|
||||
|
||||
return gpiod_get_value(fwd->descs[offset]);
|
||||
return chip->can_sleep ? gpiod_get_value_cansleep(fwd->descs[offset])
|
||||
: gpiod_get_value(fwd->descs[offset]);
|
||||
}
|
||||
|
||||
static int gpio_fwd_get_multiple(struct gpiochip_fwd *fwd, unsigned long *mask,
|
||||
@@ -292,7 +293,10 @@ static int gpio_fwd_get_multiple(struct gpiochip_fwd *fwd, unsigned long *mask,
|
||||
for_each_set_bit(i, mask, fwd->chip.ngpio)
|
||||
descs[j++] = fwd->descs[i];
|
||||
|
||||
error = gpiod_get_array_value(j, descs, NULL, values);
|
||||
if (fwd->chip.can_sleep)
|
||||
error = gpiod_get_array_value_cansleep(j, descs, NULL, values);
|
||||
else
|
||||
error = gpiod_get_array_value(j, descs, NULL, values);
|
||||
if (error)
|
||||
return error;
|
||||
|
||||
@@ -327,7 +331,10 @@ static void gpio_fwd_set(struct gpio_chip *chip, unsigned int offset, int value)
|
||||
{
|
||||
struct gpiochip_fwd *fwd = gpiochip_get_data(chip);
|
||||
|
||||
gpiod_set_value(fwd->descs[offset], value);
|
||||
if (chip->can_sleep)
|
||||
gpiod_set_value_cansleep(fwd->descs[offset], value);
|
||||
else
|
||||
gpiod_set_value(fwd->descs[offset], value);
|
||||
}
|
||||
|
||||
static void gpio_fwd_set_multiple(struct gpiochip_fwd *fwd, unsigned long *mask,
|
||||
@@ -346,7 +353,10 @@ static void gpio_fwd_set_multiple(struct gpiochip_fwd *fwd, unsigned long *mask,
|
||||
descs[j++] = fwd->descs[i];
|
||||
}
|
||||
|
||||
gpiod_set_array_value(j, descs, NULL, values);
|
||||
if (fwd->chip.can_sleep)
|
||||
gpiod_set_array_value_cansleep(j, descs, NULL, values);
|
||||
else
|
||||
gpiod_set_array_value(j, descs, NULL, values);
|
||||
}
|
||||
|
||||
static void gpio_fwd_set_multiple_locked(struct gpio_chip *chip,
|
||||
|
||||
@@ -223,7 +223,7 @@ static int sifive_gpio_probe(struct platform_device *pdev)
|
||||
NULL,
|
||||
chip->base + SIFIVE_GPIO_OUTPUT_EN,
|
||||
chip->base + SIFIVE_GPIO_INPUT_EN,
|
||||
0);
|
||||
BGPIOF_READ_OUTPUT_REG_SET);
|
||||
if (ret) {
|
||||
dev_err(dev, "unable to init generic GPIO\n");
|
||||
return ret;
|
||||
|
||||
@@ -330,7 +330,7 @@ static int linehandle_create(struct gpio_device *gdev, void __user *ip)
|
||||
goto out_free_lh;
|
||||
}
|
||||
|
||||
ret = gpiod_request(desc, lh->label);
|
||||
ret = gpiod_request_user(desc, lh->label);
|
||||
if (ret)
|
||||
goto out_free_lh;
|
||||
lh->descs[i] = desc;
|
||||
@@ -1378,7 +1378,7 @@ static int linereq_create(struct gpio_device *gdev, void __user *ip)
|
||||
goto out_free_linereq;
|
||||
}
|
||||
|
||||
ret = gpiod_request(desc, lr->label);
|
||||
ret = gpiod_request_user(desc, lr->label);
|
||||
if (ret)
|
||||
goto out_free_linereq;
|
||||
|
||||
@@ -1764,7 +1764,7 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip)
|
||||
}
|
||||
}
|
||||
|
||||
ret = gpiod_request(desc, le->label);
|
||||
ret = gpiod_request_user(desc, le->label);
|
||||
if (ret)
|
||||
goto out_free_le;
|
||||
le->desc = desc;
|
||||
|
||||
@@ -475,12 +475,9 @@ static ssize_t export_store(struct class *class,
|
||||
* they may be undone on its behalf too.
|
||||
*/
|
||||
|
||||
status = gpiod_request(desc, "sysfs");
|
||||
if (status) {
|
||||
if (status == -EPROBE_DEFER)
|
||||
status = -ENODEV;
|
||||
status = gpiod_request_user(desc, "sysfs");
|
||||
if (status)
|
||||
goto done;
|
||||
}
|
||||
|
||||
status = gpiod_set_transitory(desc, false);
|
||||
if (!status) {
|
||||
|
||||
@@ -135,6 +135,18 @@ struct gpio_desc {
|
||||
|
||||
int gpiod_request(struct gpio_desc *desc, const char *label);
|
||||
void gpiod_free(struct gpio_desc *desc);
|
||||
|
||||
static inline int gpiod_request_user(struct gpio_desc *desc, const char *label)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = gpiod_request(desc, label);
|
||||
if (ret == -EPROBE_DEFER)
|
||||
ret = -ENODEV;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int gpiod_configure_flags(struct gpio_desc *desc, const char *con_id,
|
||||
unsigned long lflags, enum gpiod_flags dflags);
|
||||
int gpio_set_debounce_timeout(struct gpio_desc *desc, unsigned int debounce);
|
||||
|
||||
@@ -1067,7 +1067,7 @@ static const struct dc_debug_options debug_defaults_drv = {
|
||||
.timing_trace = false,
|
||||
.clock_trace = true,
|
||||
.disable_pplib_clock_request = true,
|
||||
.pipe_split_policy = MPC_SPLIT_DYNAMIC,
|
||||
.pipe_split_policy = MPC_SPLIT_AVOID_MULT_DISP,
|
||||
.force_single_disp_pipe_split = false,
|
||||
.disable_dcc = DCC_ENABLE,
|
||||
.vsr_support = true,
|
||||
|
||||
@@ -863,7 +863,7 @@ static const struct dc_debug_options debug_defaults_drv = {
|
||||
.disable_clock_gate = true,
|
||||
.disable_pplib_clock_request = true,
|
||||
.disable_pplib_wm_range = true,
|
||||
.pipe_split_policy = MPC_SPLIT_DYNAMIC,
|
||||
.pipe_split_policy = MPC_SPLIT_AVOID,
|
||||
.force_single_disp_pipe_split = false,
|
||||
.disable_dcc = DCC_ENABLE,
|
||||
.vsr_support = true,
|
||||
|
||||
@@ -3445,8 +3445,7 @@ static umode_t hwmon_attributes_visible(struct kobject *kobj,
|
||||
attr == &sensor_dev_attr_power2_cap_min.dev_attr.attr ||
|
||||
attr == &sensor_dev_attr_power2_cap.dev_attr.attr ||
|
||||
attr == &sensor_dev_attr_power2_cap_default.dev_attr.attr ||
|
||||
attr == &sensor_dev_attr_power2_label.dev_attr.attr ||
|
||||
attr == &sensor_dev_attr_power1_label.dev_attr.attr))
|
||||
attr == &sensor_dev_attr_power2_label.dev_attr.attr))
|
||||
return 0;
|
||||
|
||||
return effective_mode;
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
*/
|
||||
|
||||
#include <linux/bitfield.h>
|
||||
#include <linux/bits.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/math64.h>
|
||||
@@ -196,12 +197,9 @@ static u32 ps2bc(struct nwl_dsi *dsi, unsigned long long ps)
|
||||
/*
|
||||
* ui2bc - UI time periods to byte clock cycles
|
||||
*/
|
||||
static u32 ui2bc(struct nwl_dsi *dsi, unsigned long long ui)
|
||||
static u32 ui2bc(unsigned int ui)
|
||||
{
|
||||
u32 bpp = mipi_dsi_pixel_format_to_bpp(dsi->format);
|
||||
|
||||
return DIV64_U64_ROUND_UP(ui * dsi->lanes,
|
||||
dsi->mode.clock * 1000 * bpp);
|
||||
return DIV_ROUND_UP(ui, BITS_PER_BYTE);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -232,12 +230,12 @@ static int nwl_dsi_config_host(struct nwl_dsi *dsi)
|
||||
}
|
||||
|
||||
/* values in byte clock cycles */
|
||||
cycles = ui2bc(dsi, cfg->clk_pre);
|
||||
cycles = ui2bc(cfg->clk_pre);
|
||||
DRM_DEV_DEBUG_DRIVER(dsi->dev, "cfg_t_pre: 0x%x\n", cycles);
|
||||
nwl_dsi_write(dsi, NWL_DSI_CFG_T_PRE, cycles);
|
||||
cycles = ps2bc(dsi, cfg->lpx + cfg->clk_prepare + cfg->clk_zero);
|
||||
DRM_DEV_DEBUG_DRIVER(dsi->dev, "cfg_tx_gap (pre): 0x%x\n", cycles);
|
||||
cycles += ui2bc(dsi, cfg->clk_pre);
|
||||
cycles += ui2bc(cfg->clk_pre);
|
||||
DRM_DEV_DEBUG_DRIVER(dsi->dev, "cfg_t_post: 0x%x\n", cycles);
|
||||
nwl_dsi_write(dsi, NWL_DSI_CFG_T_POST, cycles);
|
||||
cycles = ps2bc(dsi, cfg->hs_exit);
|
||||
|
||||
@@ -115,6 +115,12 @@ static const struct drm_dmi_panel_orientation_data lcd1280x1920_rightside_up = {
|
||||
.orientation = DRM_MODE_PANEL_ORIENTATION_RIGHT_UP,
|
||||
};
|
||||
|
||||
static const struct drm_dmi_panel_orientation_data lcd1600x2560_leftside_up = {
|
||||
.width = 1600,
|
||||
.height = 2560,
|
||||
.orientation = DRM_MODE_PANEL_ORIENTATION_LEFT_UP,
|
||||
};
|
||||
|
||||
static const struct dmi_system_id orientation_data[] = {
|
||||
{ /* Acer One 10 (S1003) */
|
||||
.matches = {
|
||||
@@ -261,6 +267,12 @@ static const struct dmi_system_id orientation_data[] = {
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_VERSION, "Default string"),
|
||||
},
|
||||
.driver_data = (void *)&onegx1_pro,
|
||||
}, { /* OneXPlayer */
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "ONE-NETBOOK TECHNOLOGY CO., LTD."),
|
||||
DMI_EXACT_MATCH(DMI_PRODUCT_NAME, "ONE XPLAYER"),
|
||||
},
|
||||
.driver_data = (void *)&lcd1600x2560_leftside_up,
|
||||
}, { /* Samsung GalaxyBook 10.6 */
|
||||
.matches = {
|
||||
DMI_EXACT_MATCH(DMI_SYS_VENDOR, "SAMSUNG ELECTRONICS CO., LTD."),
|
||||
|
||||
@@ -4708,6 +4708,10 @@ static const struct dbuf_slice_conf_entry dg2_allowed_dbufs[] = {
|
||||
};
|
||||
|
||||
static const struct dbuf_slice_conf_entry adlp_allowed_dbufs[] = {
|
||||
/*
|
||||
* Keep the join_mbus cases first so check_mbus_joined()
|
||||
* will prefer them over the !join_mbus cases.
|
||||
*/
|
||||
{
|
||||
.active_pipes = BIT(PIPE_A),
|
||||
.dbuf_mask = {
|
||||
@@ -4722,6 +4726,20 @@ static const struct dbuf_slice_conf_entry adlp_allowed_dbufs[] = {
|
||||
},
|
||||
.join_mbus = true,
|
||||
},
|
||||
{
|
||||
.active_pipes = BIT(PIPE_A),
|
||||
.dbuf_mask = {
|
||||
[PIPE_A] = BIT(DBUF_S1) | BIT(DBUF_S2),
|
||||
},
|
||||
.join_mbus = false,
|
||||
},
|
||||
{
|
||||
.active_pipes = BIT(PIPE_B),
|
||||
.dbuf_mask = {
|
||||
[PIPE_B] = BIT(DBUF_S3) | BIT(DBUF_S4),
|
||||
},
|
||||
.join_mbus = false,
|
||||
},
|
||||
{
|
||||
.active_pipes = BIT(PIPE_A) | BIT(PIPE_B),
|
||||
.dbuf_mask = {
|
||||
@@ -4838,13 +4856,14 @@ static bool adlp_check_mbus_joined(u8 active_pipes)
|
||||
return check_mbus_joined(active_pipes, adlp_allowed_dbufs);
|
||||
}
|
||||
|
||||
static u8 compute_dbuf_slices(enum pipe pipe, u8 active_pipes,
|
||||
static u8 compute_dbuf_slices(enum pipe pipe, u8 active_pipes, bool join_mbus,
|
||||
const struct dbuf_slice_conf_entry *dbuf_slices)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < dbuf_slices[i].active_pipes; i++) {
|
||||
if (dbuf_slices[i].active_pipes == active_pipes)
|
||||
if (dbuf_slices[i].active_pipes == active_pipes &&
|
||||
dbuf_slices[i].join_mbus == join_mbus)
|
||||
return dbuf_slices[i].dbuf_mask[pipe];
|
||||
}
|
||||
return 0;
|
||||
@@ -4855,7 +4874,7 @@ static u8 compute_dbuf_slices(enum pipe pipe, u8 active_pipes,
|
||||
* returns correspondent DBuf slice mask as stated in BSpec for particular
|
||||
* platform.
|
||||
*/
|
||||
static u8 icl_compute_dbuf_slices(enum pipe pipe, u8 active_pipes)
|
||||
static u8 icl_compute_dbuf_slices(enum pipe pipe, u8 active_pipes, bool join_mbus)
|
||||
{
|
||||
/*
|
||||
* FIXME: For ICL this is still a bit unclear as prev BSpec revision
|
||||
@@ -4869,37 +4888,41 @@ static u8 icl_compute_dbuf_slices(enum pipe pipe, u8 active_pipes)
|
||||
* still here - we will need it once those additional constraints
|
||||
* pop up.
|
||||
*/
|
||||
return compute_dbuf_slices(pipe, active_pipes, icl_allowed_dbufs);
|
||||
return compute_dbuf_slices(pipe, active_pipes, join_mbus,
|
||||
icl_allowed_dbufs);
|
||||
}
|
||||
|
||||
static u8 tgl_compute_dbuf_slices(enum pipe pipe, u8 active_pipes)
|
||||
static u8 tgl_compute_dbuf_slices(enum pipe pipe, u8 active_pipes, bool join_mbus)
|
||||
{
|
||||
return compute_dbuf_slices(pipe, active_pipes, tgl_allowed_dbufs);
|
||||
return compute_dbuf_slices(pipe, active_pipes, join_mbus,
|
||||
tgl_allowed_dbufs);
|
||||
}
|
||||
|
||||
static u32 adlp_compute_dbuf_slices(enum pipe pipe, u32 active_pipes)
|
||||
static u8 adlp_compute_dbuf_slices(enum pipe pipe, u8 active_pipes, bool join_mbus)
|
||||
{
|
||||
return compute_dbuf_slices(pipe, active_pipes, adlp_allowed_dbufs);
|
||||
return compute_dbuf_slices(pipe, active_pipes, join_mbus,
|
||||
adlp_allowed_dbufs);
|
||||
}
|
||||
|
||||
static u32 dg2_compute_dbuf_slices(enum pipe pipe, u32 active_pipes)
|
||||
static u8 dg2_compute_dbuf_slices(enum pipe pipe, u8 active_pipes, bool join_mbus)
|
||||
{
|
||||
return compute_dbuf_slices(pipe, active_pipes, dg2_allowed_dbufs);
|
||||
return compute_dbuf_slices(pipe, active_pipes, join_mbus,
|
||||
dg2_allowed_dbufs);
|
||||
}
|
||||
|
||||
static u8 skl_compute_dbuf_slices(struct intel_crtc *crtc, u8 active_pipes)
|
||||
static u8 skl_compute_dbuf_slices(struct intel_crtc *crtc, u8 active_pipes, bool join_mbus)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
|
||||
enum pipe pipe = crtc->pipe;
|
||||
|
||||
if (IS_DG2(dev_priv))
|
||||
return dg2_compute_dbuf_slices(pipe, active_pipes);
|
||||
return dg2_compute_dbuf_slices(pipe, active_pipes, join_mbus);
|
||||
else if (IS_ALDERLAKE_P(dev_priv))
|
||||
return adlp_compute_dbuf_slices(pipe, active_pipes);
|
||||
return adlp_compute_dbuf_slices(pipe, active_pipes, join_mbus);
|
||||
else if (DISPLAY_VER(dev_priv) == 12)
|
||||
return tgl_compute_dbuf_slices(pipe, active_pipes);
|
||||
return tgl_compute_dbuf_slices(pipe, active_pipes, join_mbus);
|
||||
else if (DISPLAY_VER(dev_priv) == 11)
|
||||
return icl_compute_dbuf_slices(pipe, active_pipes);
|
||||
return icl_compute_dbuf_slices(pipe, active_pipes, join_mbus);
|
||||
/*
|
||||
* For anything else just return one slice yet.
|
||||
* Should be extended for other platforms.
|
||||
@@ -6110,11 +6133,16 @@ skl_compute_ddb(struct intel_atomic_state *state)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (IS_ALDERLAKE_P(dev_priv))
|
||||
new_dbuf_state->joined_mbus =
|
||||
adlp_check_mbus_joined(new_dbuf_state->active_pipes);
|
||||
|
||||
for_each_intel_crtc(&dev_priv->drm, crtc) {
|
||||
enum pipe pipe = crtc->pipe;
|
||||
|
||||
new_dbuf_state->slices[pipe] =
|
||||
skl_compute_dbuf_slices(crtc, new_dbuf_state->active_pipes);
|
||||
skl_compute_dbuf_slices(crtc, new_dbuf_state->active_pipes,
|
||||
new_dbuf_state->joined_mbus);
|
||||
|
||||
if (old_dbuf_state->slices[pipe] == new_dbuf_state->slices[pipe])
|
||||
continue;
|
||||
@@ -6126,9 +6154,6 @@ skl_compute_ddb(struct intel_atomic_state *state)
|
||||
|
||||
new_dbuf_state->enabled_slices = intel_dbuf_enabled_slices(new_dbuf_state);
|
||||
|
||||
if (IS_ALDERLAKE_P(dev_priv))
|
||||
new_dbuf_state->joined_mbus = adlp_check_mbus_joined(new_dbuf_state->active_pipes);
|
||||
|
||||
if (old_dbuf_state->enabled_slices != new_dbuf_state->enabled_slices ||
|
||||
old_dbuf_state->joined_mbus != new_dbuf_state->joined_mbus) {
|
||||
ret = intel_atomic_serialize_global_state(&new_dbuf_state->base);
|
||||
@@ -6609,6 +6634,7 @@ void skl_wm_get_hw_state(struct drm_i915_private *dev_priv)
|
||||
enum pipe pipe = crtc->pipe;
|
||||
unsigned int mbus_offset;
|
||||
enum plane_id plane_id;
|
||||
u8 slices;
|
||||
|
||||
skl_pipe_wm_get_hw_state(crtc, &crtc_state->wm.skl.optimal);
|
||||
crtc_state->wm.skl.raw = crtc_state->wm.skl.optimal;
|
||||
@@ -6628,19 +6654,22 @@ void skl_wm_get_hw_state(struct drm_i915_private *dev_priv)
|
||||
skl_ddb_entry_union(&dbuf_state->ddb[pipe], ddb_uv);
|
||||
}
|
||||
|
||||
dbuf_state->slices[pipe] =
|
||||
skl_compute_dbuf_slices(crtc, dbuf_state->active_pipes);
|
||||
|
||||
dbuf_state->weight[pipe] = intel_crtc_ddb_weight(crtc_state);
|
||||
|
||||
/*
|
||||
* Used for checking overlaps, so we need absolute
|
||||
* offsets instead of MBUS relative offsets.
|
||||
*/
|
||||
mbus_offset = mbus_ddb_offset(dev_priv, dbuf_state->slices[pipe]);
|
||||
slices = skl_compute_dbuf_slices(crtc, dbuf_state->active_pipes,
|
||||
dbuf_state->joined_mbus);
|
||||
mbus_offset = mbus_ddb_offset(dev_priv, slices);
|
||||
crtc_state->wm.skl.ddb.start = mbus_offset + dbuf_state->ddb[pipe].start;
|
||||
crtc_state->wm.skl.ddb.end = mbus_offset + dbuf_state->ddb[pipe].end;
|
||||
|
||||
/* The slices actually used by the planes on the pipe */
|
||||
dbuf_state->slices[pipe] =
|
||||
skl_ddb_dbuf_slice_mask(dev_priv, &crtc_state->wm.skl.ddb);
|
||||
|
||||
drm_dbg_kms(&dev_priv->drm,
|
||||
"[CRTC:%d:%s] dbuf slices 0x%x, ddb (%d - %d), active pipes 0x%x, mbus joined: %s\n",
|
||||
crtc->base.base.id, crtc->base.name,
|
||||
|
||||
@@ -721,6 +721,7 @@ static int panel_simple_probe(struct device *dev, const struct panel_desc *desc,
|
||||
err = panel_dpi_probe(dev, panel);
|
||||
if (err)
|
||||
goto free_ddc;
|
||||
desc = panel->desc;
|
||||
} else {
|
||||
if (!of_get_display_timing(dev->of_node, "panel-timing", &dt))
|
||||
panel_simple_parse_panel_timing_node(dev, panel, &dt);
|
||||
|
||||
@@ -902,6 +902,7 @@ static const struct vop_win_phy rk3399_win01_data = {
|
||||
.enable = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 0),
|
||||
.format = VOP_REG(RK3288_WIN0_CTRL0, 0x7, 1),
|
||||
.rb_swap = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 12),
|
||||
.x_mir_en = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 21),
|
||||
.y_mir_en = VOP_REG(RK3288_WIN0_CTRL0, 0x1, 22),
|
||||
.act_info = VOP_REG(RK3288_WIN0_ACT_INFO, 0x1fff1fff, 0),
|
||||
.dsp_info = VOP_REG(RK3288_WIN0_DSP_INFO, 0x0fff0fff, 0),
|
||||
@@ -912,6 +913,7 @@ static const struct vop_win_phy rk3399_win01_data = {
|
||||
.uv_vir = VOP_REG(RK3288_WIN0_VIR, 0x3fff, 16),
|
||||
.src_alpha_ctl = VOP_REG(RK3288_WIN0_SRC_ALPHA_CTRL, 0xff, 0),
|
||||
.dst_alpha_ctl = VOP_REG(RK3288_WIN0_DST_ALPHA_CTRL, 0xff, 0),
|
||||
.channel = VOP_REG(RK3288_WIN0_CTRL2, 0xff, 0),
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -922,11 +924,11 @@ static const struct vop_win_phy rk3399_win01_data = {
|
||||
static const struct vop_win_data rk3399_vop_win_data[] = {
|
||||
{ .base = 0x00, .phy = &rk3399_win01_data,
|
||||
.type = DRM_PLANE_TYPE_PRIMARY },
|
||||
{ .base = 0x40, .phy = &rk3288_win01_data,
|
||||
{ .base = 0x40, .phy = &rk3368_win01_data,
|
||||
.type = DRM_PLANE_TYPE_OVERLAY },
|
||||
{ .base = 0x00, .phy = &rk3288_win23_data,
|
||||
{ .base = 0x00, .phy = &rk3368_win23_data,
|
||||
.type = DRM_PLANE_TYPE_OVERLAY },
|
||||
{ .base = 0x50, .phy = &rk3288_win23_data,
|
||||
{ .base = 0x50, .phy = &rk3368_win23_data,
|
||||
.type = DRM_PLANE_TYPE_CURSOR },
|
||||
};
|
||||
|
||||
|
||||
@@ -1262,7 +1262,6 @@ static int vc4_dsi_host_attach(struct mipi_dsi_host *host,
|
||||
struct mipi_dsi_device *device)
|
||||
{
|
||||
struct vc4_dsi *dsi = host_to_dsi(host);
|
||||
int ret;
|
||||
|
||||
dsi->lanes = device->lanes;
|
||||
dsi->channel = device->channel;
|
||||
@@ -1297,18 +1296,15 @@ static int vc4_dsi_host_attach(struct mipi_dsi_host *host,
|
||||
return 0;
|
||||
}
|
||||
|
||||
ret = component_add(&dsi->pdev->dev, &vc4_dsi_ops);
|
||||
if (ret) {
|
||||
mipi_dsi_host_unregister(&dsi->dsi_host);
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
return component_add(&dsi->pdev->dev, &vc4_dsi_ops);
|
||||
}
|
||||
|
||||
static int vc4_dsi_host_detach(struct mipi_dsi_host *host,
|
||||
struct mipi_dsi_device *device)
|
||||
{
|
||||
struct vc4_dsi *dsi = host_to_dsi(host);
|
||||
|
||||
component_del(&dsi->pdev->dev, &vc4_dsi_ops);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1706,9 +1702,7 @@ static int vc4_dsi_dev_remove(struct platform_device *pdev)
|
||||
struct device *dev = &pdev->dev;
|
||||
struct vc4_dsi *dsi = dev_get_drvdata(dev);
|
||||
|
||||
component_del(&pdev->dev, &vc4_dsi_ops);
|
||||
mipi_dsi_host_unregister(&dsi->dsi_host);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -1090,6 +1090,7 @@ static int vc4_hdmi_encoder_atomic_check(struct drm_encoder *encoder,
|
||||
unsigned long long tmds_rate;
|
||||
|
||||
if (vc4_hdmi->variant->unsupported_odd_h_timings &&
|
||||
!(mode->flags & DRM_MODE_FLAG_DBLCLK) &&
|
||||
((mode->hdisplay % 2) || (mode->hsync_start % 2) ||
|
||||
(mode->hsync_end % 2) || (mode->htotal % 2)))
|
||||
return -EINVAL;
|
||||
@@ -1137,6 +1138,7 @@ vc4_hdmi_encoder_mode_valid(struct drm_encoder *encoder,
|
||||
struct vc4_hdmi *vc4_hdmi = encoder_to_vc4_hdmi(encoder);
|
||||
|
||||
if (vc4_hdmi->variant->unsupported_odd_h_timings &&
|
||||
!(mode->flags & DRM_MODE_FLAG_DBLCLK) &&
|
||||
((mode->hdisplay % 2) || (mode->hsync_start % 2) ||
|
||||
(mode->hsync_end % 2) || (mode->htotal % 2)))
|
||||
return MODE_H_ILLEGAL;
|
||||
|
||||
@@ -326,7 +326,7 @@ static int i8k_enable_fan_auto_mode(const struct dell_smm_data *data, bool enabl
|
||||
}
|
||||
|
||||
/*
|
||||
* Set the fan speed (off, low, high). Returns the new fan status.
|
||||
* Set the fan speed (off, low, high, ...).
|
||||
*/
|
||||
static int i8k_set_fan(const struct dell_smm_data *data, int fan, int speed)
|
||||
{
|
||||
@@ -338,7 +338,7 @@ static int i8k_set_fan(const struct dell_smm_data *data, int fan, int speed)
|
||||
speed = (speed < 0) ? 0 : ((speed > data->i8k_fan_max) ? data->i8k_fan_max : speed);
|
||||
regs.ebx = (fan & 0xff) | (speed << 8);
|
||||
|
||||
return i8k_smm(®s) ? : i8k_get_fan_status(data, fan);
|
||||
return i8k_smm(®s);
|
||||
}
|
||||
|
||||
static int __init i8k_get_temp_type(int sensor)
|
||||
@@ -452,7 +452,7 @@ static int
|
||||
i8k_ioctl_unlocked(struct file *fp, struct dell_smm_data *data, unsigned int cmd, unsigned long arg)
|
||||
{
|
||||
int val = 0;
|
||||
int speed;
|
||||
int speed, err;
|
||||
unsigned char buff[16];
|
||||
int __user *argp = (int __user *)arg;
|
||||
|
||||
@@ -513,7 +513,11 @@ i8k_ioctl_unlocked(struct file *fp, struct dell_smm_data *data, unsigned int cmd
|
||||
if (copy_from_user(&speed, argp + 1, sizeof(int)))
|
||||
return -EFAULT;
|
||||
|
||||
val = i8k_set_fan(data, val, speed);
|
||||
err = i8k_set_fan(data, val, speed);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
val = i8k_get_fan_status(data, val);
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
@@ -1446,9 +1446,17 @@ static long iio_device_buffer_getfd(struct iio_dev *indio_dev, unsigned long arg
|
||||
}
|
||||
|
||||
if (copy_to_user(ival, &fd, sizeof(fd))) {
|
||||
put_unused_fd(fd);
|
||||
ret = -EFAULT;
|
||||
goto error_free_ib;
|
||||
/*
|
||||
* "Leak" the fd, as there's not much we can do about this
|
||||
* anyway. 'fd' might have been closed already, as
|
||||
* anon_inode_getfd() called fd_install() on it, which made
|
||||
* it reachable by userland.
|
||||
*
|
||||
* Instead of allowing a malicious user to play tricks with
|
||||
* us, rely on the process exit path to do any necessary
|
||||
* cleanup, as in releasing the file, if still needed.
|
||||
*/
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -206,9 +206,14 @@ static struct dev_iommu *dev_iommu_get(struct device *dev)
|
||||
|
||||
static void dev_iommu_free(struct device *dev)
|
||||
{
|
||||
iommu_fwspec_free(dev);
|
||||
kfree(dev->iommu);
|
||||
struct dev_iommu *param = dev->iommu;
|
||||
|
||||
dev->iommu = NULL;
|
||||
if (param->fwspec) {
|
||||
fwnode_handle_put(param->fwspec->iommu_fwnode);
|
||||
kfree(param->fwspec);
|
||||
}
|
||||
kfree(param);
|
||||
}
|
||||
|
||||
static int __iommu_probe_device(struct device *dev, struct list_head *group_list)
|
||||
|
||||
@@ -76,16 +76,20 @@ static void realtek_irq_dispatch(struct irq_desc *desc)
|
||||
{
|
||||
struct irq_chip *chip = irq_desc_get_chip(desc);
|
||||
struct irq_domain *domain;
|
||||
unsigned int pending;
|
||||
unsigned long pending;
|
||||
unsigned int soc_int;
|
||||
|
||||
chained_irq_enter(chip, desc);
|
||||
pending = readl(REG(RTL_ICTL_GIMR)) & readl(REG(RTL_ICTL_GISR));
|
||||
|
||||
if (unlikely(!pending)) {
|
||||
spurious_interrupt();
|
||||
goto out;
|
||||
}
|
||||
|
||||
domain = irq_desc_get_handler_data(desc);
|
||||
generic_handle_domain_irq(domain, __ffs(pending));
|
||||
for_each_set_bit(soc_int, &pending, 32)
|
||||
generic_handle_domain_irq(domain, soc_int);
|
||||
|
||||
out:
|
||||
chained_irq_exit(chip, desc);
|
||||
|
||||
@@ -114,6 +114,9 @@ static ssize_t ee1004_eeprom_read(struct i2c_client *client, char *buf,
|
||||
if (offset + count > EE1004_PAGE_SIZE)
|
||||
count = EE1004_PAGE_SIZE - offset;
|
||||
|
||||
if (count > I2C_SMBUS_BLOCK_MAX)
|
||||
count = I2C_SMBUS_BLOCK_MAX;
|
||||
|
||||
return i2c_smbus_read_i2c_block_data_or_emulated(client, offset, count, buf);
|
||||
}
|
||||
|
||||
|
||||
@@ -1286,7 +1286,14 @@ static int fastrpc_dmabuf_alloc(struct fastrpc_user *fl, char __user *argp)
|
||||
}
|
||||
|
||||
if (copy_to_user(argp, &bp, sizeof(bp))) {
|
||||
dma_buf_put(buf->dmabuf);
|
||||
/*
|
||||
* The usercopy failed, but we can't do much about it, as
|
||||
* dma_buf_fd() already called fd_install() and made the
|
||||
* file descriptor accessible for the current process. It
|
||||
* might already be closed and dmabuf no longer valid when
|
||||
* we reach this point. Therefore "leak" the fd and rely on
|
||||
* the process exit path to do any required cleanup.
|
||||
*/
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
|
||||
@@ -66,7 +66,7 @@ static const unsigned int sd_au_size[] = {
|
||||
__res & __mask; \
|
||||
})
|
||||
|
||||
#define SD_POWEROFF_NOTIFY_TIMEOUT_MS 2000
|
||||
#define SD_POWEROFF_NOTIFY_TIMEOUT_MS 1000
|
||||
#define SD_WRITE_EXTR_SINGLE_TIMEOUT_MS 1000
|
||||
|
||||
struct sd_busy_data {
|
||||
@@ -1663,6 +1663,12 @@ static int sd_poweroff_notify(struct mmc_card *card)
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Find out when the command is completed. */
|
||||
err = mmc_poll_for_busy(card, SD_WRITE_EXTR_SINGLE_TIMEOUT_MS, false,
|
||||
MMC_BUSY_EXTR_SINGLE);
|
||||
if (err)
|
||||
goto out;
|
||||
|
||||
cb_data.card = card;
|
||||
cb_data.reg_buf = reg_buf;
|
||||
err = __mmc_poll_for_busy(card, SD_POWEROFF_NOTIFY_TIMEOUT_MS,
|
||||
|
||||
@@ -524,12 +524,16 @@ static void esdhc_of_adma_workaround(struct sdhci_host *host, u32 intmask)
|
||||
|
||||
static int esdhc_of_enable_dma(struct sdhci_host *host)
|
||||
{
|
||||
int ret;
|
||||
u32 value;
|
||||
struct device *dev = mmc_dev(host->mmc);
|
||||
|
||||
if (of_device_is_compatible(dev->of_node, "fsl,ls1043a-esdhc") ||
|
||||
of_device_is_compatible(dev->of_node, "fsl,ls1046a-esdhc"))
|
||||
dma_set_mask_and_coherent(dev, DMA_BIT_MASK(40));
|
||||
of_device_is_compatible(dev->of_node, "fsl,ls1046a-esdhc")) {
|
||||
ret = dma_set_mask_and_coherent(dev, DMA_BIT_MASK(40));
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
value = sdhci_readl(host, ESDHC_DMA_SYSCTL);
|
||||
|
||||
|
||||
@@ -1021,8 +1021,8 @@ static void ad_mux_machine(struct port *port, bool *update_slave_arr)
|
||||
if (port->aggregator &&
|
||||
port->aggregator->is_active &&
|
||||
!__port_is_enabled(port)) {
|
||||
|
||||
__enable_port(port);
|
||||
*update_slave_arr = true;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@@ -1779,6 +1779,7 @@ static void ad_agg_selection_logic(struct aggregator *agg,
|
||||
port = port->next_port_in_aggregator) {
|
||||
__enable_port(port);
|
||||
}
|
||||
*update_slave_arr = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -584,7 +584,7 @@ static int bcm_sf2_mdio_register(struct dsa_switch *ds)
|
||||
get_device(&priv->master_mii_bus->dev);
|
||||
priv->master_mii_dn = dn;
|
||||
|
||||
priv->slave_mii_bus = devm_mdiobus_alloc(ds->dev);
|
||||
priv->slave_mii_bus = mdiobus_alloc();
|
||||
if (!priv->slave_mii_bus) {
|
||||
of_node_put(dn);
|
||||
return -ENOMEM;
|
||||
@@ -644,8 +644,10 @@ static int bcm_sf2_mdio_register(struct dsa_switch *ds)
|
||||
}
|
||||
|
||||
err = mdiobus_register(priv->slave_mii_bus);
|
||||
if (err && dn)
|
||||
if (err && dn) {
|
||||
mdiobus_free(priv->slave_mii_bus);
|
||||
of_node_put(dn);
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
@@ -653,6 +655,7 @@ static int bcm_sf2_mdio_register(struct dsa_switch *ds)
|
||||
static void bcm_sf2_mdio_unregister(struct bcm_sf2_priv *priv)
|
||||
{
|
||||
mdiobus_unregister(priv->slave_mii_bus);
|
||||
mdiobus_free(priv->slave_mii_bus);
|
||||
of_node_put(priv->master_mii_dn);
|
||||
}
|
||||
|
||||
|
||||
@@ -497,8 +497,9 @@ static int gswip_mdio_rd(struct mii_bus *bus, int addr, int reg)
|
||||
static int gswip_mdio(struct gswip_priv *priv, struct device_node *mdio_np)
|
||||
{
|
||||
struct dsa_switch *ds = priv->ds;
|
||||
int err;
|
||||
|
||||
ds->slave_mii_bus = devm_mdiobus_alloc(priv->dev);
|
||||
ds->slave_mii_bus = mdiobus_alloc();
|
||||
if (!ds->slave_mii_bus)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -511,7 +512,11 @@ static int gswip_mdio(struct gswip_priv *priv, struct device_node *mdio_np)
|
||||
ds->slave_mii_bus->parent = priv->dev;
|
||||
ds->slave_mii_bus->phy_mask = ~ds->phys_mii_mask;
|
||||
|
||||
return of_mdiobus_register(ds->slave_mii_bus, mdio_np);
|
||||
err = of_mdiobus_register(ds->slave_mii_bus, mdio_np);
|
||||
if (err)
|
||||
mdiobus_free(ds->slave_mii_bus);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static int gswip_pce_table_entry_read(struct gswip_priv *priv,
|
||||
@@ -2170,8 +2175,10 @@ disable_switch:
|
||||
gswip_mdio_mask(priv, GSWIP_MDIO_GLOB_ENABLE, 0, GSWIP_MDIO_GLOB);
|
||||
dsa_unregister_switch(priv->ds);
|
||||
mdio_bus:
|
||||
if (mdio_np)
|
||||
if (mdio_np) {
|
||||
mdiobus_unregister(priv->ds->slave_mii_bus);
|
||||
mdiobus_free(priv->ds->slave_mii_bus);
|
||||
}
|
||||
put_mdio_node:
|
||||
of_node_put(mdio_np);
|
||||
for (i = 0; i < priv->num_gphy_fw; i++)
|
||||
@@ -2194,6 +2201,7 @@ static int gswip_remove(struct platform_device *pdev)
|
||||
|
||||
if (priv->ds->slave_mii_bus) {
|
||||
mdiobus_unregister(priv->ds->slave_mii_bus);
|
||||
mdiobus_free(priv->ds->slave_mii_bus);
|
||||
of_node_put(priv->ds->slave_mii_bus->dev.of_node);
|
||||
}
|
||||
|
||||
|
||||
@@ -2066,7 +2066,7 @@ mt7530_setup_mdio(struct mt7530_priv *priv)
|
||||
if (priv->irq)
|
||||
mt7530_setup_mdio_irq(priv);
|
||||
|
||||
ret = mdiobus_register(bus);
|
||||
ret = devm_mdiobus_register(dev, bus);
|
||||
if (ret) {
|
||||
dev_err(dev, "failed to register MDIO bus: %d\n", ret);
|
||||
if (priv->irq)
|
||||
|
||||
@@ -3416,7 +3416,7 @@ static int mv88e6xxx_mdio_register(struct mv88e6xxx_chip *chip,
|
||||
return err;
|
||||
}
|
||||
|
||||
bus = devm_mdiobus_alloc_size(chip->dev, sizeof(*mdio_bus));
|
||||
bus = mdiobus_alloc_size(sizeof(*mdio_bus));
|
||||
if (!bus)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -3441,14 +3441,14 @@ static int mv88e6xxx_mdio_register(struct mv88e6xxx_chip *chip,
|
||||
if (!external) {
|
||||
err = mv88e6xxx_g2_irq_mdio_setup(chip, bus);
|
||||
if (err)
|
||||
return err;
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = of_mdiobus_register(bus, np);
|
||||
if (err) {
|
||||
dev_err(chip->dev, "Cannot register MDIO bus (%d)\n", err);
|
||||
mv88e6xxx_g2_irq_mdio_free(chip, bus);
|
||||
return err;
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (external)
|
||||
@@ -3457,21 +3457,26 @@ static int mv88e6xxx_mdio_register(struct mv88e6xxx_chip *chip,
|
||||
list_add(&mdio_bus->list, &chip->mdios);
|
||||
|
||||
return 0;
|
||||
|
||||
out:
|
||||
mdiobus_free(bus);
|
||||
return err;
|
||||
}
|
||||
|
||||
static void mv88e6xxx_mdios_unregister(struct mv88e6xxx_chip *chip)
|
||||
|
||||
{
|
||||
struct mv88e6xxx_mdio_bus *mdio_bus;
|
||||
struct mv88e6xxx_mdio_bus *mdio_bus, *p;
|
||||
struct mii_bus *bus;
|
||||
|
||||
list_for_each_entry(mdio_bus, &chip->mdios, list) {
|
||||
list_for_each_entry_safe(mdio_bus, p, &chip->mdios, list) {
|
||||
bus = mdio_bus->bus;
|
||||
|
||||
if (!mdio_bus->external)
|
||||
mv88e6xxx_g2_irq_mdio_free(chip, bus);
|
||||
|
||||
mdiobus_unregister(bus);
|
||||
mdiobus_free(bus);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1066,7 +1066,7 @@ static int vsc9959_mdio_bus_alloc(struct ocelot *ocelot)
|
||||
return PTR_ERR(hw);
|
||||
}
|
||||
|
||||
bus = devm_mdiobus_alloc_size(dev, sizeof(*mdio_priv));
|
||||
bus = mdiobus_alloc_size(sizeof(*mdio_priv));
|
||||
if (!bus)
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -1086,6 +1086,7 @@ static int vsc9959_mdio_bus_alloc(struct ocelot *ocelot)
|
||||
rc = mdiobus_register(bus);
|
||||
if (rc < 0) {
|
||||
dev_err(dev, "failed to register MDIO bus\n");
|
||||
mdiobus_free(bus);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -1135,6 +1136,7 @@ static void vsc9959_mdio_bus_free(struct ocelot *ocelot)
|
||||
lynx_pcs_destroy(pcs);
|
||||
}
|
||||
mdiobus_unregister(felix->imdio);
|
||||
mdiobus_free(felix->imdio);
|
||||
}
|
||||
|
||||
static void vsc9959_sched_speed_set(struct ocelot *ocelot, int port,
|
||||
|
||||
@@ -378,7 +378,7 @@ static int ar9331_sw_mbus_init(struct ar9331_sw_priv *priv)
|
||||
if (!mnp)
|
||||
return -ENODEV;
|
||||
|
||||
ret = of_mdiobus_register(mbus, mnp);
|
||||
ret = devm_of_mdiobus_register(dev, mbus, mnp);
|
||||
of_node_put(mnp);
|
||||
if (ret)
|
||||
return ret;
|
||||
@@ -1093,7 +1093,6 @@ static void ar9331_sw_remove(struct mdio_device *mdiodev)
|
||||
}
|
||||
|
||||
irq_domain_remove(priv->irqdomain);
|
||||
mdiobus_unregister(priv->mbus);
|
||||
dsa_unregister_switch(&priv->ds);
|
||||
|
||||
reset_control_assert(priv->sw_reset);
|
||||
|
||||
@@ -418,6 +418,9 @@ static void xgbe_pci_remove(struct pci_dev *pdev)
|
||||
|
||||
pci_free_irq_vectors(pdata->pcidev);
|
||||
|
||||
/* Disable all interrupts in the hardware */
|
||||
XP_IOWRITE(pdata, XP_INT_EN, 0x0);
|
||||
|
||||
xgbe_free_pdata(pdata);
|
||||
}
|
||||
|
||||
|
||||
@@ -4511,12 +4511,12 @@ static int dpaa2_eth_remove(struct fsl_mc_device *ls_dev)
|
||||
#ifdef CONFIG_DEBUG_FS
|
||||
dpaa2_dbg_remove(priv);
|
||||
#endif
|
||||
|
||||
unregister_netdev(net_dev);
|
||||
rtnl_lock();
|
||||
dpaa2_eth_disconnect_mac(priv);
|
||||
rtnl_unlock();
|
||||
|
||||
unregister_netdev(net_dev);
|
||||
|
||||
dpaa2_eth_dl_port_del(priv);
|
||||
dpaa2_eth_dl_traps_unregister(priv);
|
||||
dpaa2_eth_dl_unregister(priv);
|
||||
|
||||
@@ -398,6 +398,7 @@ enum ice_pf_flags {
|
||||
ICE_FLAG_VF_TRUE_PROMISC_ENA,
|
||||
ICE_FLAG_MDD_AUTO_RESET_VF,
|
||||
ICE_FLAG_LINK_LENIENT_MODE_ENA,
|
||||
ICE_FLAG_PLUG_AUX_DEV,
|
||||
ICE_PF_FLAGS_NBITS /* must be last */
|
||||
};
|
||||
|
||||
@@ -692,7 +693,7 @@ static inline void ice_set_rdma_cap(struct ice_pf *pf)
|
||||
if (pf->hw.func_caps.common_cap.rdma && pf->num_rdma_msix) {
|
||||
set_bit(ICE_FLAG_RDMA_ENA, pf->flags);
|
||||
set_bit(ICE_FLAG_AUX_ENA, pf->flags);
|
||||
ice_plug_aux_dev(pf);
|
||||
set_bit(ICE_FLAG_PLUG_AUX_DEV, pf->flags);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -3272,7 +3272,8 @@ ice_cfg_phy_fec(struct ice_port_info *pi, struct ice_aqc_set_phy_cfg_data *cfg,
|
||||
!ice_fw_supports_report_dflt_cfg(hw)) {
|
||||
struct ice_link_default_override_tlv tlv;
|
||||
|
||||
if (ice_get_link_default_override(&tlv, pi))
|
||||
status = ice_get_link_default_override(&tlv, pi);
|
||||
if (status)
|
||||
goto out;
|
||||
|
||||
if (!(tlv.options & ICE_LINK_OVERRIDE_STRICT_MODE) &&
|
||||
|
||||
@@ -204,17 +204,39 @@ ice_lag_unlink(struct ice_lag *lag,
|
||||
lag->upper_netdev = NULL;
|
||||
}
|
||||
|
||||
if (lag->peer_netdev) {
|
||||
dev_put(lag->peer_netdev);
|
||||
lag->peer_netdev = NULL;
|
||||
}
|
||||
|
||||
lag->peer_netdev = NULL;
|
||||
ice_set_sriov_cap(pf);
|
||||
ice_set_rdma_cap(pf);
|
||||
lag->bonded = false;
|
||||
lag->role = ICE_LAG_NONE;
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_lag_unregister - handle netdev unregister events
|
||||
* @lag: LAG info struct
|
||||
* @netdev: netdev reporting the event
|
||||
*/
|
||||
static void ice_lag_unregister(struct ice_lag *lag, struct net_device *netdev)
|
||||
{
|
||||
struct ice_pf *pf = lag->pf;
|
||||
|
||||
/* check to see if this event is for this netdev
|
||||
* check that we are in an aggregate
|
||||
*/
|
||||
if (netdev != lag->netdev || !lag->bonded)
|
||||
return;
|
||||
|
||||
if (lag->upper_netdev) {
|
||||
dev_put(lag->upper_netdev);
|
||||
lag->upper_netdev = NULL;
|
||||
ice_set_sriov_cap(pf);
|
||||
ice_set_rdma_cap(pf);
|
||||
}
|
||||
/* perform some cleanup in case we come back */
|
||||
lag->bonded = false;
|
||||
lag->role = ICE_LAG_NONE;
|
||||
}
|
||||
|
||||
/**
|
||||
* ice_lag_changeupper_event - handle LAG changeupper event
|
||||
* @lag: LAG info struct
|
||||
@@ -307,7 +329,7 @@ ice_lag_event_handler(struct notifier_block *notif_blk, unsigned long event,
|
||||
ice_lag_info_event(lag, ptr);
|
||||
break;
|
||||
case NETDEV_UNREGISTER:
|
||||
ice_lag_unlink(lag, ptr);
|
||||
ice_lag_unregister(lag, netdev);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
||||
@@ -528,6 +528,7 @@ struct ice_tx_ctx_desc {
|
||||
(0x3FFFFULL << ICE_TXD_CTX_QW1_TSO_LEN_S)
|
||||
|
||||
#define ICE_TXD_CTX_QW1_MSS_S 50
|
||||
#define ICE_TXD_CTX_MIN_MSS 64
|
||||
|
||||
enum ice_tx_ctx_desc_cmd_bits {
|
||||
ICE_TX_CTX_DESC_TSO = 0x01,
|
||||
|
||||
@@ -2141,6 +2141,9 @@ static void ice_service_task(struct work_struct *work)
|
||||
return;
|
||||
}
|
||||
|
||||
if (test_and_clear_bit(ICE_FLAG_PLUG_AUX_DEV, pf->flags))
|
||||
ice_plug_aux_dev(pf);
|
||||
|
||||
ice_clean_adminq_subtask(pf);
|
||||
ice_check_media_subtask(pf);
|
||||
ice_check_for_hang_subtask(pf);
|
||||
@@ -7206,6 +7209,7 @@ ice_features_check(struct sk_buff *skb,
|
||||
struct net_device __always_unused *netdev,
|
||||
netdev_features_t features)
|
||||
{
|
||||
bool gso = skb_is_gso(skb);
|
||||
size_t len;
|
||||
|
||||
/* No point in doing any of this if neither checksum nor GSO are
|
||||
@@ -7218,24 +7222,32 @@ ice_features_check(struct sk_buff *skb,
|
||||
/* We cannot support GSO if the MSS is going to be less than
|
||||
* 64 bytes. If it is then we need to drop support for GSO.
|
||||
*/
|
||||
if (skb_is_gso(skb) && (skb_shinfo(skb)->gso_size < 64))
|
||||
if (gso && (skb_shinfo(skb)->gso_size < ICE_TXD_CTX_MIN_MSS))
|
||||
features &= ~NETIF_F_GSO_MASK;
|
||||
|
||||
len = skb_network_header(skb) - skb->data;
|
||||
len = skb_network_offset(skb);
|
||||
if (len > ICE_TXD_MACLEN_MAX || len & 0x1)
|
||||
goto out_rm_features;
|
||||
|
||||
len = skb_transport_header(skb) - skb_network_header(skb);
|
||||
len = skb_network_header_len(skb);
|
||||
if (len > ICE_TXD_IPLEN_MAX || len & 0x1)
|
||||
goto out_rm_features;
|
||||
|
||||
if (skb->encapsulation) {
|
||||
len = skb_inner_network_header(skb) - skb_transport_header(skb);
|
||||
if (len > ICE_TXD_L4LEN_MAX || len & 0x1)
|
||||
goto out_rm_features;
|
||||
/* this must work for VXLAN frames AND IPIP/SIT frames, and in
|
||||
* the case of IPIP frames, the transport header pointer is
|
||||
* after the inner header! So check to make sure that this
|
||||
* is a GRE or UDP_TUNNEL frame before doing that math.
|
||||
*/
|
||||
if (gso && (skb_shinfo(skb)->gso_type &
|
||||
(SKB_GSO_GRE | SKB_GSO_UDP_TUNNEL))) {
|
||||
len = skb_inner_network_header(skb) -
|
||||
skb_transport_header(skb);
|
||||
if (len > ICE_TXD_L4LEN_MAX || len & 0x1)
|
||||
goto out_rm_features;
|
||||
}
|
||||
|
||||
len = skb_inner_transport_header(skb) -
|
||||
skb_inner_network_header(skb);
|
||||
len = skb_inner_network_header_len(skb);
|
||||
if (len > ICE_TXD_IPLEN_MAX || len & 0x1)
|
||||
goto out_rm_features;
|
||||
}
|
||||
|
||||
@@ -1984,14 +1984,15 @@ static void ixgbevf_set_rx_buffer_len(struct ixgbevf_adapter *adapter,
|
||||
if (adapter->flags & IXGBEVF_FLAGS_LEGACY_RX)
|
||||
return;
|
||||
|
||||
if (PAGE_SIZE < 8192)
|
||||
if (max_frame > IXGBEVF_MAX_FRAME_BUILD_SKB)
|
||||
set_ring_uses_large_buffer(rx_ring);
|
||||
|
||||
/* 82599 can't rely on RXDCTL.RLPML to restrict the size of the frame */
|
||||
if (adapter->hw.mac.type == ixgbe_mac_82599_vf && !ring_uses_large_buffer(rx_ring))
|
||||
return;
|
||||
|
||||
set_ring_build_skb_enabled(rx_ring);
|
||||
|
||||
if (PAGE_SIZE < 8192) {
|
||||
if (max_frame <= IXGBEVF_MAX_FRAME_BUILD_SKB)
|
||||
return;
|
||||
|
||||
set_ring_uses_large_buffer(rx_ring);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1103,7 +1103,7 @@ void sparx5_get_stats64(struct net_device *ndev,
|
||||
stats->tx_carrier_errors = portstats[spx5_stats_tx_csense_cnt];
|
||||
stats->tx_window_errors = portstats[spx5_stats_tx_late_coll_cnt];
|
||||
stats->rx_dropped = portstats[spx5_stats_ana_ac_port_stat_lsb_cnt];
|
||||
for (idx = 0; idx < 2 * SPX5_PRIOS; ++idx, ++stats)
|
||||
for (idx = 0; idx < 2 * SPX5_PRIOS; ++idx)
|
||||
stats->rx_dropped += portstats[spx5_stats_green_p0_rx_port_drop
|
||||
+ idx];
|
||||
stats->tx_dropped = portstats[spx5_stats_tx_local_drop];
|
||||
|
||||
@@ -1215,12 +1215,11 @@ void ocelot_get_strings(struct ocelot *ocelot, int port, u32 sset, u8 *data)
|
||||
}
|
||||
EXPORT_SYMBOL(ocelot_get_strings);
|
||||
|
||||
/* Caller must hold &ocelot->stats_lock */
|
||||
static void ocelot_update_stats(struct ocelot *ocelot)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
mutex_lock(&ocelot->stats_lock);
|
||||
|
||||
for (i = 0; i < ocelot->num_phys_ports; i++) {
|
||||
/* Configure the port to read the stats from */
|
||||
ocelot_write(ocelot, SYS_STAT_CFG_STAT_VIEW(i), SYS_STAT_CFG);
|
||||
@@ -1239,8 +1238,6 @@ static void ocelot_update_stats(struct ocelot *ocelot)
|
||||
~(u64)U32_MAX) + val;
|
||||
}
|
||||
}
|
||||
|
||||
mutex_unlock(&ocelot->stats_lock);
|
||||
}
|
||||
|
||||
static void ocelot_check_stats_work(struct work_struct *work)
|
||||
@@ -1249,7 +1246,9 @@ static void ocelot_check_stats_work(struct work_struct *work)
|
||||
struct ocelot *ocelot = container_of(del_work, struct ocelot,
|
||||
stats_work);
|
||||
|
||||
mutex_lock(&ocelot->stats_lock);
|
||||
ocelot_update_stats(ocelot);
|
||||
mutex_unlock(&ocelot->stats_lock);
|
||||
|
||||
queue_delayed_work(ocelot->stats_queue, &ocelot->stats_work,
|
||||
OCELOT_STATS_CHECK_DELAY);
|
||||
@@ -1259,12 +1258,16 @@ void ocelot_get_ethtool_stats(struct ocelot *ocelot, int port, u64 *data)
|
||||
{
|
||||
int i;
|
||||
|
||||
mutex_lock(&ocelot->stats_lock);
|
||||
|
||||
/* check and update now */
|
||||
ocelot_update_stats(ocelot);
|
||||
|
||||
/* Copy all counters */
|
||||
for (i = 0; i < ocelot->num_stats; i++)
|
||||
*data++ = ocelot->stats[port * ocelot->num_stats + i];
|
||||
|
||||
mutex_unlock(&ocelot->stats_lock);
|
||||
}
|
||||
EXPORT_SYMBOL(ocelot_get_ethtool_stats);
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user