mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-25 21:24:08 +08:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
This commit is contained in:
commit
2b9b7502df
1
.mailmap
1
.mailmap
@ -159,6 +159,7 @@ Peter Oruba <peter@oruba.de>
|
||||
Peter Oruba <peter.oruba@amd.com>
|
||||
Pratyush Anand <pratyush.anand@gmail.com> <pratyush.anand@st.com>
|
||||
Praveen BP <praveenbp@ti.com>
|
||||
Punit Agrawal <punitagrawal@gmail.com> <punit.agrawal@arm.com>
|
||||
Qais Yousef <qsyousef@gmail.com> <qais.yousef@imgtec.com>
|
||||
Oleksij Rempel <linux@rempel-privat.de> <bug-track@fisher-privat.net>
|
||||
Oleksij Rempel <linux@rempel-privat.de> <external.Oleksij.Rempel@de.bosch.com>
|
||||
|
@ -37,8 +37,8 @@ Description:
|
||||
0-| / \/ \/
|
||||
+---0----1----2----3----4----5----6------------> time (s)
|
||||
|
||||
2. To make the LED go instantly from one brigntess value to another,
|
||||
we should use use zero-time lengths (the brightness must be same as
|
||||
2. To make the LED go instantly from one brightness value to another,
|
||||
we should use zero-time lengths (the brightness must be same as
|
||||
the previous tuple's). So the format should be:
|
||||
"brightness_1 duration_1 brightness_1 0 brightness_2 duration_2
|
||||
brightness_2 0 ...". For example:
|
||||
|
@ -27,7 +27,7 @@ SoCs:
|
||||
compatible = "renesas,r8a77470"
|
||||
- RZ/G2M (R8A774A1)
|
||||
compatible = "renesas,r8a774a1"
|
||||
- RZ/G2E (RA8774C0)
|
||||
- RZ/G2E (R8A774C0)
|
||||
compatible = "renesas,r8a774c0"
|
||||
- R-Car M1A (R8A77781)
|
||||
compatible = "renesas,r8a7778"
|
||||
|
@ -1,8 +1,12 @@
|
||||
I2C for OMAP platforms
|
||||
|
||||
Required properties :
|
||||
- compatible : Must be "ti,omap2420-i2c", "ti,omap2430-i2c", "ti,omap3-i2c"
|
||||
or "ti,omap4-i2c"
|
||||
- compatible : Must be
|
||||
"ti,omap2420-i2c" for OMAP2420 SoCs
|
||||
"ti,omap2430-i2c" for OMAP2430 SoCs
|
||||
"ti,omap3-i2c" for OMAP3 SoCs
|
||||
"ti,omap4-i2c" for OMAP4+ SoCs
|
||||
"ti,am654-i2c", "ti,omap4-i2c" for AM654 SoCs
|
||||
- ti,hwmods : Must be "i2c<n>", n being the instance number (1-based)
|
||||
- #address-cells = <1>;
|
||||
- #size-cells = <0>;
|
||||
|
18
Documentation/i2c/busses/i2c-nvidia-gpu
Normal file
18
Documentation/i2c/busses/i2c-nvidia-gpu
Normal file
@ -0,0 +1,18 @@
|
||||
Kernel driver i2c-nvidia-gpu
|
||||
|
||||
Datasheet: not publicly available.
|
||||
|
||||
Authors:
|
||||
Ajay Gupta <ajayg@nvidia.com>
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
i2c-nvidia-gpu is a driver for I2C controller included in NVIDIA Turing
|
||||
and later GPUs and it is used to communicate with Type-C controller on GPUs.
|
||||
|
||||
If your 'lspci -v' listing shows something like the following,
|
||||
|
||||
01:00.3 Serial bus controller [0c80]: NVIDIA Corporation Device 1ad9 (rev a1)
|
||||
|
||||
then this driver should support the I2C controller of your GPU.
|
@ -34,23 +34,24 @@ __________________|____________|__________________|_________|___________________
|
||||
____________________________________________________________|___________________________________________________________
|
||||
| | | |
|
||||
ffff800000000000 | -128 TB | ffff87ffffffffff | 8 TB | ... guard hole, also reserved for hypervisor
|
||||
ffff880000000000 | -120 TB | ffffc7ffffffffff | 64 TB | direct mapping of all physical memory (page_offset_base)
|
||||
ffffc80000000000 | -56 TB | ffffc8ffffffffff | 1 TB | ... unused hole
|
||||
ffff880000000000 | -120 TB | ffff887fffffffff | 0.5 TB | LDT remap for PTI
|
||||
ffff888000000000 | -119.5 TB | ffffc87fffffffff | 64 TB | direct mapping of all physical memory (page_offset_base)
|
||||
ffffc88000000000 | -55.5 TB | ffffc8ffffffffff | 0.5 TB | ... unused hole
|
||||
ffffc90000000000 | -55 TB | ffffe8ffffffffff | 32 TB | vmalloc/ioremap space (vmalloc_base)
|
||||
ffffe90000000000 | -23 TB | ffffe9ffffffffff | 1 TB | ... unused hole
|
||||
ffffea0000000000 | -22 TB | ffffeaffffffffff | 1 TB | virtual memory map (vmemmap_base)
|
||||
ffffeb0000000000 | -21 TB | ffffebffffffffff | 1 TB | ... unused hole
|
||||
ffffec0000000000 | -20 TB | fffffbffffffffff | 16 TB | KASAN shadow memory
|
||||
__________________|____________|__________________|_________|____________________________________________________________
|
||||
|
|
||||
| Identical layout to the 56-bit one from here on:
|
||||
____________________________________________________________|____________________________________________________________
|
||||
| | | |
|
||||
fffffc0000000000 | -4 TB | fffffdffffffffff | 2 TB | ... unused hole
|
||||
| | | | vaddr_end for KASLR
|
||||
fffffe0000000000 | -2 TB | fffffe7fffffffff | 0.5 TB | cpu_entry_area mapping
|
||||
fffffe8000000000 | -1.5 TB | fffffeffffffffff | 0.5 TB | LDT remap for PTI
|
||||
fffffe8000000000 | -1.5 TB | fffffeffffffffff | 0.5 TB | ... unused hole
|
||||
ffffff0000000000 | -1 TB | ffffff7fffffffff | 0.5 TB | %esp fixup stacks
|
||||
__________________|____________|__________________|_________|____________________________________________________________
|
||||
|
|
||||
| Identical layout to the 47-bit one from here on:
|
||||
____________________________________________________________|____________________________________________________________
|
||||
| | | |
|
||||
ffffff8000000000 | -512 GB | ffffffeeffffffff | 444 GB | ... unused hole
|
||||
ffffffef00000000 | -68 GB | fffffffeffffffff | 64 GB | EFI region mapping space
|
||||
ffffffff00000000 | -4 GB | ffffffff7fffffff | 2 GB | ... unused hole
|
||||
@ -83,7 +84,7 @@ Notes:
|
||||
__________________|____________|__________________|_________|___________________________________________________________
|
||||
| | | |
|
||||
0000800000000000 | +64 PB | ffff7fffffffffff | ~16K PB | ... huge, still almost 64 bits wide hole of non-canonical
|
||||
| | | | virtual memory addresses up to the -128 TB
|
||||
| | | | virtual memory addresses up to the -64 PB
|
||||
| | | | starting offset of kernel mappings.
|
||||
__________________|____________|__________________|_________|___________________________________________________________
|
||||
|
|
||||
@ -91,23 +92,24 @@ __________________|____________|__________________|_________|___________________
|
||||
____________________________________________________________|___________________________________________________________
|
||||
| | | |
|
||||
ff00000000000000 | -64 PB | ff0fffffffffffff | 4 PB | ... guard hole, also reserved for hypervisor
|
||||
ff10000000000000 | -60 PB | ff8fffffffffffff | 32 PB | direct mapping of all physical memory (page_offset_base)
|
||||
ff90000000000000 | -28 PB | ff9fffffffffffff | 4 PB | LDT remap for PTI
|
||||
ff10000000000000 | -60 PB | ff10ffffffffffff | 0.25 PB | LDT remap for PTI
|
||||
ff11000000000000 | -59.75 PB | ff90ffffffffffff | 32 PB | direct mapping of all physical memory (page_offset_base)
|
||||
ff91000000000000 | -27.75 PB | ff9fffffffffffff | 3.75 PB | ... unused hole
|
||||
ffa0000000000000 | -24 PB | ffd1ffffffffffff | 12.5 PB | vmalloc/ioremap space (vmalloc_base)
|
||||
ffd2000000000000 | -11.5 PB | ffd3ffffffffffff | 0.5 PB | ... unused hole
|
||||
ffd4000000000000 | -11 PB | ffd5ffffffffffff | 0.5 PB | virtual memory map (vmemmap_base)
|
||||
ffd6000000000000 | -10.5 PB | ffdeffffffffffff | 2.25 PB | ... unused hole
|
||||
ffdf000000000000 | -8.25 PB | fffffdffffffffff | ~8 PB | KASAN shadow memory
|
||||
fffffc0000000000 | -4 TB | fffffdffffffffff | 2 TB | ... unused hole
|
||||
| | | | vaddr_end for KASLR
|
||||
fffffe0000000000 | -2 TB | fffffe7fffffffff | 0.5 TB | cpu_entry_area mapping
|
||||
fffffe8000000000 | -1.5 TB | fffffeffffffffff | 0.5 TB | ... unused hole
|
||||
ffffff0000000000 | -1 TB | ffffff7fffffffff | 0.5 TB | %esp fixup stacks
|
||||
__________________|____________|__________________|_________|____________________________________________________________
|
||||
|
|
||||
| Identical layout to the 47-bit one from here on:
|
||||
____________________________________________________________|____________________________________________________________
|
||||
| | | |
|
||||
fffffc0000000000 | -4 TB | fffffdffffffffff | 2 TB | ... unused hole
|
||||
| | | | vaddr_end for KASLR
|
||||
fffffe0000000000 | -2 TB | fffffe7fffffffff | 0.5 TB | cpu_entry_area mapping
|
||||
fffffe8000000000 | -1.5 TB | fffffeffffffffff | 0.5 TB | ... unused hole
|
||||
ffffff0000000000 | -1 TB | ffffff7fffffffff | 0.5 TB | %esp fixup stacks
|
||||
ffffff8000000000 | -512 GB | ffffffeeffffffff | 444 GB | ... unused hole
|
||||
ffffffef00000000 | -68 GB | fffffffeffffffff | 64 GB | EFI region mapping space
|
||||
ffffffff00000000 | -4 GB | ffffffff7fffffff | 2 GB | ... unused hole
|
||||
|
@ -25,7 +25,7 @@ Offset Proto Name Meaning
|
||||
0C8/004 ALL ext_cmd_line_ptr cmd_line_ptr high 32bits
|
||||
140/080 ALL edid_info Video mode setup (struct edid_info)
|
||||
1C0/020 ALL efi_info EFI 32 information (struct efi_info)
|
||||
1E0/004 ALL alk_mem_k Alternative mem check, in KB
|
||||
1E0/004 ALL alt_mem_k Alternative mem check, in KB
|
||||
1E4/004 ALL scratch Scratch field for the kernel setup code
|
||||
1E8/001 ALL e820_entries Number of entries in e820_table (below)
|
||||
1E9/001 ALL eddbuf_entries Number of entries in eddbuf (below)
|
||||
|
29
MAINTAINERS
29
MAINTAINERS
@ -6607,9 +6607,9 @@ F: arch/*/include/asm/suspend*.h
|
||||
|
||||
HID CORE LAYER
|
||||
M: Jiri Kosina <jikos@kernel.org>
|
||||
R: Benjamin Tissoires <benjamin.tissoires@redhat.com>
|
||||
M: Benjamin Tissoires <benjamin.tissoires@redhat.com>
|
||||
L: linux-input@vger.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid.git
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid.git
|
||||
S: Maintained
|
||||
F: drivers/hid/
|
||||
F: include/linux/hid*
|
||||
@ -6861,6 +6861,13 @@ L: linux-acpi@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/i2c/i2c-core-acpi.c
|
||||
|
||||
I2C CONTROLLER DRIVER FOR NVIDIA GPU
|
||||
M: Ajay Gupta <ajayg@nvidia.com>
|
||||
L: linux-i2c@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/i2c/busses/i2c-nvidia-gpu
|
||||
F: drivers/i2c/busses/i2c-nvidia-gpu.c
|
||||
|
||||
I2C MUXES
|
||||
M: Peter Rosin <peda@axentia.se>
|
||||
L: linux-i2c@vger.kernel.org
|
||||
@ -8360,7 +8367,7 @@ F: drivers/media/dvb-frontends/lgdt3305.*
|
||||
LIBATA PATA ARASAN COMPACT FLASH CONTROLLER
|
||||
M: Viresh Kumar <vireshk@kernel.org>
|
||||
L: linux-ide@vger.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git
|
||||
S: Maintained
|
||||
F: include/linux/pata_arasan_cf_data.h
|
||||
F: drivers/ata/pata_arasan_cf.c
|
||||
@ -8377,7 +8384,7 @@ F: drivers/ata/ata_generic.c
|
||||
LIBATA PATA FARADAY FTIDE010 AND GEMINI SATA BRIDGE DRIVERS
|
||||
M: Linus Walleij <linus.walleij@linaro.org>
|
||||
L: linux-ide@vger.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git
|
||||
S: Maintained
|
||||
F: drivers/ata/pata_ftide010.c
|
||||
F: drivers/ata/sata_gemini.c
|
||||
@ -8396,7 +8403,7 @@ F: include/linux/ahci_platform.h
|
||||
LIBATA SATA PROMISE TX2/TX4 CONTROLLER DRIVER
|
||||
M: Mikael Pettersson <mikpelinux@gmail.com>
|
||||
L: linux-ide@vger.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tj/libata.git
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/axboe/linux-block.git
|
||||
S: Maintained
|
||||
F: drivers/ata/sata_promise.*
|
||||
|
||||
@ -10777,6 +10784,14 @@ L: linux-omap@vger.kernel.org
|
||||
S: Maintained
|
||||
F: arch/arm/mach-omap2/omap_hwmod.*
|
||||
|
||||
OMAP I2C DRIVER
|
||||
M: Vignesh R <vigneshr@ti.com>
|
||||
L: linux-omap@vger.kernel.org
|
||||
L: linux-i2c@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/i2c/i2c-omap.txt
|
||||
F: drivers/i2c/busses/i2c-omap.c
|
||||
|
||||
OMAP IMAGING SUBSYSTEM (OMAP3 ISP and OMAP4 ISS)
|
||||
M: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||
L: linux-media@vger.kernel.org
|
||||
@ -15429,9 +15444,9 @@ F: include/linux/usb/gadget*
|
||||
|
||||
USB HID/HIDBP DRIVERS (USB KEYBOARDS, MICE, REMOTE CONTROLS, ...)
|
||||
M: Jiri Kosina <jikos@kernel.org>
|
||||
R: Benjamin Tissoires <benjamin.tissoires@redhat.com>
|
||||
M: Benjamin Tissoires <benjamin.tissoires@redhat.com>
|
||||
L: linux-usb@vger.kernel.org
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/hid.git
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/hid/hid.git
|
||||
S: Maintained
|
||||
F: Documentation/hid/hiddev.txt
|
||||
F: drivers/hid/usbhid/
|
||||
|
2
Makefile
2
Makefile
@ -2,7 +2,7 @@
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 20
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc1
|
||||
EXTRAVERSION = -rc2
|
||||
NAME = "People's Front"
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
@ -73,9 +73,15 @@
|
||||
})
|
||||
|
||||
#define user_termios_to_kernel_termios(k, u) \
|
||||
copy_from_user(k, u, sizeof(struct termios))
|
||||
copy_from_user(k, u, sizeof(struct termios2))
|
||||
|
||||
#define kernel_termios_to_user_termios(u, k) \
|
||||
copy_to_user(u, k, sizeof(struct termios2))
|
||||
|
||||
#define user_termios_to_kernel_termios_1(k, u) \
|
||||
copy_from_user(k, u, sizeof(struct termios))
|
||||
|
||||
#define kernel_termios_to_user_termios_1(u, k) \
|
||||
copy_to_user(u, k, sizeof(struct termios))
|
||||
|
||||
#endif /* _ALPHA_TERMIOS_H */
|
||||
|
@ -32,6 +32,11 @@
|
||||
#define TCXONC _IO('t', 30)
|
||||
#define TCFLSH _IO('t', 31)
|
||||
|
||||
#define TCGETS2 _IOR('T', 42, struct termios2)
|
||||
#define TCSETS2 _IOW('T', 43, struct termios2)
|
||||
#define TCSETSW2 _IOW('T', 44, struct termios2)
|
||||
#define TCSETSF2 _IOW('T', 45, struct termios2)
|
||||
|
||||
#define TIOCSWINSZ _IOW('t', 103, struct winsize)
|
||||
#define TIOCGWINSZ _IOR('t', 104, struct winsize)
|
||||
#define TIOCSTART _IO('t', 110) /* start output, like ^Q */
|
||||
|
@ -26,6 +26,19 @@ struct termios {
|
||||
speed_t c_ospeed; /* output speed */
|
||||
};
|
||||
|
||||
/* Alpha has identical termios and termios2 */
|
||||
|
||||
struct termios2 {
|
||||
tcflag_t c_iflag; /* input mode flags */
|
||||
tcflag_t c_oflag; /* output mode flags */
|
||||
tcflag_t c_cflag; /* control mode flags */
|
||||
tcflag_t c_lflag; /* local mode flags */
|
||||
cc_t c_cc[NCCS]; /* control characters */
|
||||
cc_t c_line; /* line discipline (== c_cc[19]) */
|
||||
speed_t c_ispeed; /* input speed */
|
||||
speed_t c_ospeed; /* output speed */
|
||||
};
|
||||
|
||||
/* Alpha has matching termios and ktermios */
|
||||
|
||||
struct ktermios {
|
||||
@ -152,6 +165,7 @@ struct ktermios {
|
||||
#define B3000000 00034
|
||||
#define B3500000 00035
|
||||
#define B4000000 00036
|
||||
#define BOTHER 00037
|
||||
|
||||
#define CSIZE 00001400
|
||||
#define CS5 00000000
|
||||
@ -169,6 +183,9 @@ struct ktermios {
|
||||
#define CMSPAR 010000000000 /* mark or space (stick) parity */
|
||||
#define CRTSCTS 020000000000 /* flow control */
|
||||
|
||||
#define CIBAUD 07600000
|
||||
#define IBSHIFT 16
|
||||
|
||||
/* c_lflag bits */
|
||||
#define ISIG 0x00000080
|
||||
#define ICANON 0x00000100
|
||||
|
@ -55,7 +55,7 @@
|
||||
};
|
||||
|
||||
chosen {
|
||||
stdout-path = "&uart1:115200n8";
|
||||
stdout-path = "serial0:115200n8";
|
||||
};
|
||||
|
||||
memory@70000000 {
|
||||
|
@ -740,7 +740,7 @@
|
||||
i2c1: i2c@21a0000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "fs,imx6sll-i2c", "fsl,imx21-i2c";
|
||||
compatible = "fsl,imx6sll-i2c", "fsl,imx21-i2c";
|
||||
reg = <0x021a0000 0x4000>;
|
||||
interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clks IMX6SLL_CLK_I2C1>;
|
||||
|
@ -117,7 +117,9 @@
|
||||
regulator-name = "enet_3v3";
|
||||
regulator-min-microvolt = <3300000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
gpios = <&gpio2 6 GPIO_ACTIVE_LOW>;
|
||||
gpio = <&gpio2 6 GPIO_ACTIVE_LOW>;
|
||||
regulator-boot-on;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
reg_pcie_gpio: regulator-pcie-gpio {
|
||||
@ -180,6 +182,7 @@
|
||||
phy-supply = <®_enet_3v3>;
|
||||
phy-mode = "rgmii";
|
||||
phy-handle = <ðphy1>;
|
||||
phy-reset-gpios = <&gpio2 7 GPIO_ACTIVE_LOW>;
|
||||
status = "okay";
|
||||
|
||||
mdio {
|
||||
@ -373,6 +376,8 @@
|
||||
MX6SX_PAD_RGMII1_RD3__ENET1_RX_DATA_3 0x3081
|
||||
MX6SX_PAD_RGMII1_RX_CTL__ENET1_RX_EN 0x3081
|
||||
MX6SX_PAD_ENET2_RX_CLK__ENET2_REF_CLK_25M 0x91
|
||||
/* phy reset */
|
||||
MX6SX_PAD_ENET2_CRS__GPIO2_IO_7 0x10b0
|
||||
>;
|
||||
};
|
||||
|
||||
|
@ -50,8 +50,8 @@
|
||||
compatible = "fsl,vf610m4";
|
||||
|
||||
chosen {
|
||||
bootargs = "console=ttyLP2,115200 clk_ignore_unused init=/linuxrc rw";
|
||||
stdout-path = "&uart2";
|
||||
bootargs = "clk_ignore_unused init=/linuxrc rw";
|
||||
stdout-path = "serial2:115200";
|
||||
};
|
||||
|
||||
memory@8c000000 {
|
||||
|
@ -1,7 +1,6 @@
|
||||
CONFIG_SYSVIPC=y
|
||||
CONFIG_NO_HZ=y
|
||||
CONFIG_HIGH_RES_TIMERS=y
|
||||
CONFIG_PREEMPT=y
|
||||
CONFIG_CGROUPS=y
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_EMBEDDED=y
|
||||
|
@ -10,7 +10,7 @@
|
||||
#ifndef _ASM_PGTABLE_2LEVEL_H
|
||||
#define _ASM_PGTABLE_2LEVEL_H
|
||||
|
||||
#define __PAGETABLE_PMD_FOLDED
|
||||
#define __PAGETABLE_PMD_FOLDED 1
|
||||
|
||||
/*
|
||||
* Hardware-wise, we have a two level page table structure, where the first
|
||||
|
@ -139,6 +139,7 @@
|
||||
clock-names = "stmmaceth";
|
||||
tx-fifo-depth = <16384>;
|
||||
rx-fifo-depth = <16384>;
|
||||
snps,multicast-filter-bins = <256>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@ -154,6 +155,7 @@
|
||||
clock-names = "stmmaceth";
|
||||
tx-fifo-depth = <16384>;
|
||||
rx-fifo-depth = <16384>;
|
||||
snps,multicast-filter-bins = <256>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
@ -169,6 +171,7 @@
|
||||
clock-names = "stmmaceth";
|
||||
tx-fifo-depth = <16384>;
|
||||
rx-fifo-depth = <16384>;
|
||||
snps,multicast-filter-bins = <256>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -652,7 +652,7 @@
|
||||
clock-names = "fck", "brg_int", "scif_clk";
|
||||
dmas = <&dmac1 0x35>, <&dmac1 0x34>,
|
||||
<&dmac2 0x35>, <&dmac2 0x34>;
|
||||
dma-names = "tx", "rx";
|
||||
dma-names = "tx", "rx", "tx", "rx";
|
||||
power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
|
||||
resets = <&cpg 518>;
|
||||
status = "disabled";
|
||||
|
@ -15,7 +15,7 @@
|
||||
|
||||
aliases {
|
||||
serial0 = &scif0;
|
||||
ethernet0 = &avb;
|
||||
ethernet0 = &gether;
|
||||
};
|
||||
|
||||
chosen {
|
||||
@ -97,23 +97,6 @@
|
||||
};
|
||||
};
|
||||
|
||||
&avb {
|
||||
pinctrl-0 = <&avb_pins>;
|
||||
pinctrl-names = "default";
|
||||
|
||||
phy-mode = "rgmii-id";
|
||||
phy-handle = <&phy0>;
|
||||
renesas,no-ether-link;
|
||||
status = "okay";
|
||||
|
||||
phy0: ethernet-phy@0 {
|
||||
rxc-skew-ps = <1500>;
|
||||
reg = <0>;
|
||||
interrupt-parent = <&gpio1>;
|
||||
interrupts = <17 IRQ_TYPE_LEVEL_LOW>;
|
||||
};
|
||||
};
|
||||
|
||||
&canfd {
|
||||
pinctrl-0 = <&canfd0_pins>;
|
||||
pinctrl-names = "default";
|
||||
@ -139,6 +122,23 @@
|
||||
clock-frequency = <32768>;
|
||||
};
|
||||
|
||||
&gether {
|
||||
pinctrl-0 = <&gether_pins>;
|
||||
pinctrl-names = "default";
|
||||
|
||||
phy-mode = "rgmii-id";
|
||||
phy-handle = <&phy0>;
|
||||
renesas,no-ether-link;
|
||||
status = "okay";
|
||||
|
||||
phy0: ethernet-phy@0 {
|
||||
rxc-skew-ps = <1500>;
|
||||
reg = <0>;
|
||||
interrupt-parent = <&gpio4>;
|
||||
interrupts = <23 IRQ_TYPE_LEVEL_LOW>;
|
||||
};
|
||||
};
|
||||
|
||||
&i2c0 {
|
||||
pinctrl-0 = <&i2c0_pins>;
|
||||
pinctrl-names = "default";
|
||||
@ -236,16 +236,17 @@
|
||||
};
|
||||
|
||||
&pfc {
|
||||
avb_pins: avb {
|
||||
groups = "avb_mdio", "avb_rgmii";
|
||||
function = "avb";
|
||||
};
|
||||
|
||||
canfd0_pins: canfd0 {
|
||||
groups = "canfd0_data_a";
|
||||
function = "canfd0";
|
||||
};
|
||||
|
||||
gether_pins: gether {
|
||||
groups = "gether_mdio_a", "gether_rgmii",
|
||||
"gether_txcrefclk", "gether_txcrefclk_mega";
|
||||
function = "gether";
|
||||
};
|
||||
|
||||
i2c0_pins: i2c0 {
|
||||
groups = "i2c0";
|
||||
function = "i2c0";
|
||||
|
@ -24,6 +24,14 @@
|
||||
#define KERNEL_DS UL(-1)
|
||||
#define USER_DS (TASK_SIZE_64 - 1)
|
||||
|
||||
/*
|
||||
* On arm64 systems, unaligned accesses by the CPU are cheap, and so there is
|
||||
* no point in shifting all network buffers by 2 bytes just to make some IP
|
||||
* header fields appear aligned in memory, potentially sacrificing some DMA
|
||||
* performance on some platforms.
|
||||
*/
|
||||
#define NET_IP_ALIGN 0
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
#ifdef __KERNEL__
|
||||
|
||||
|
@ -483,8 +483,6 @@ void __init arm64_memblock_init(void)
|
||||
high_memory = __va(memblock_end_of_DRAM() - 1) + 1;
|
||||
|
||||
dma_contiguous_reserve(arm64_dma_phys_limit);
|
||||
|
||||
memblock_allow_resize();
|
||||
}
|
||||
|
||||
void __init bootmem_init(void)
|
||||
|
@ -659,6 +659,8 @@ void __init paging_init(void)
|
||||
|
||||
memblock_free(__pa_symbol(init_pg_dir),
|
||||
__pa_symbol(init_pg_end) - __pa_symbol(init_pg_dir));
|
||||
|
||||
memblock_allow_resize();
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -55,12 +55,12 @@
|
||||
*/
|
||||
#ifdef CONFIG_SUN3
|
||||
#define PTRS_PER_PTE 16
|
||||
#define __PAGETABLE_PMD_FOLDED
|
||||
#define __PAGETABLE_PMD_FOLDED 1
|
||||
#define PTRS_PER_PMD 1
|
||||
#define PTRS_PER_PGD 2048
|
||||
#elif defined(CONFIG_COLDFIRE)
|
||||
#define PTRS_PER_PTE 512
|
||||
#define __PAGETABLE_PMD_FOLDED
|
||||
#define __PAGETABLE_PMD_FOLDED 1
|
||||
#define PTRS_PER_PMD 1
|
||||
#define PTRS_PER_PGD 1024
|
||||
#else
|
||||
|
@ -63,7 +63,7 @@ extern int mem_init_done;
|
||||
|
||||
#include <asm-generic/4level-fixup.h>
|
||||
|
||||
#define __PAGETABLE_PMD_FOLDED
|
||||
#define __PAGETABLE_PMD_FOLDED 1
|
||||
|
||||
#ifdef __KERNEL__
|
||||
#ifndef __ASSEMBLY__
|
||||
|
@ -67,7 +67,7 @@ void (*cvmx_override_pko_queue_priority) (int pko_port,
|
||||
void (*cvmx_override_ipd_port_setup) (int ipd_port);
|
||||
|
||||
/* Port count per interface */
|
||||
static int interface_port_count[5];
|
||||
static int interface_port_count[9];
|
||||
|
||||
/**
|
||||
* Return the number of interfaces the chip has. Each interface
|
||||
|
@ -50,7 +50,7 @@ void *arch_dma_alloc(struct device *dev, size_t size,
|
||||
void *ret;
|
||||
|
||||
ret = dma_direct_alloc_pages(dev, size, dma_handle, gfp, attrs);
|
||||
if (!ret && !(attrs & DMA_ATTR_NON_CONSISTENT)) {
|
||||
if (ret && !(attrs & DMA_ATTR_NON_CONSISTENT)) {
|
||||
dma_cache_wback_inv((unsigned long) ret, size);
|
||||
ret = (void *)UNCAC_ADDR(ret);
|
||||
}
|
||||
|
@ -4,7 +4,7 @@
|
||||
#ifndef _ASMNDS32_PGTABLE_H
|
||||
#define _ASMNDS32_PGTABLE_H
|
||||
|
||||
#define __PAGETABLE_PMD_FOLDED
|
||||
#define __PAGETABLE_PMD_FOLDED 1
|
||||
#include <asm-generic/4level-fixup.h>
|
||||
#include <asm-generic/sizes.h>
|
||||
|
||||
|
@ -111,7 +111,7 @@ static inline void purge_tlb_entries(struct mm_struct *mm, unsigned long addr)
|
||||
#if CONFIG_PGTABLE_LEVELS == 3
|
||||
#define BITS_PER_PMD (PAGE_SHIFT + PMD_ORDER - BITS_PER_PMD_ENTRY)
|
||||
#else
|
||||
#define __PAGETABLE_PMD_FOLDED
|
||||
#define __PAGETABLE_PMD_FOLDED 1
|
||||
#define BITS_PER_PMD 0
|
||||
#endif
|
||||
#define PTRS_PER_PMD (1UL << BITS_PER_PMD)
|
||||
|
@ -27,7 +27,7 @@ KBUILD_CFLAGS_DECOMPRESSOR += $(call cc-option,-ffreestanding)
|
||||
KBUILD_CFLAGS_DECOMPRESSOR += $(if $(CONFIG_DEBUG_INFO),-g)
|
||||
KBUILD_CFLAGS_DECOMPRESSOR += $(if $(CONFIG_DEBUG_INFO_DWARF4), $(call cc-option, -gdwarf-4,))
|
||||
UTS_MACHINE := s390x
|
||||
STACK_SIZE := $(if $(CONFIG_KASAN),32768,16384)
|
||||
STACK_SIZE := $(if $(CONFIG_KASAN),65536,16384)
|
||||
CHECKFLAGS += -D__s390__ -D__s390x__
|
||||
|
||||
export LD_BFD
|
||||
|
@ -22,10 +22,10 @@ OBJCOPYFLAGS :=
|
||||
OBJECTS := $(addprefix $(obj)/,$(obj-y))
|
||||
|
||||
LDFLAGS_vmlinux := --oformat $(LD_BFD) -e startup -T
|
||||
$(obj)/vmlinux: $(obj)/vmlinux.lds $(objtree)/arch/s390/boot/startup.a $(OBJECTS)
|
||||
$(obj)/vmlinux: $(obj)/vmlinux.lds $(objtree)/arch/s390/boot/startup.a $(OBJECTS) FORCE
|
||||
$(call if_changed,ld)
|
||||
|
||||
OBJCOPYFLAGS_info.bin := -O binary --only-section=.vmlinux.info
|
||||
OBJCOPYFLAGS_info.bin := -O binary --only-section=.vmlinux.info --set-section-flags .vmlinux.info=load
|
||||
$(obj)/info.bin: vmlinux FORCE
|
||||
$(call if_changed,objcopy)
|
||||
|
||||
@ -46,17 +46,17 @@ suffix-$(CONFIG_KERNEL_LZMA) := .lzma
|
||||
suffix-$(CONFIG_KERNEL_LZO) := .lzo
|
||||
suffix-$(CONFIG_KERNEL_XZ) := .xz
|
||||
|
||||
$(obj)/vmlinux.bin.gz: $(vmlinux.bin.all-y)
|
||||
$(obj)/vmlinux.bin.gz: $(vmlinux.bin.all-y) FORCE
|
||||
$(call if_changed,gzip)
|
||||
$(obj)/vmlinux.bin.bz2: $(vmlinux.bin.all-y)
|
||||
$(obj)/vmlinux.bin.bz2: $(vmlinux.bin.all-y) FORCE
|
||||
$(call if_changed,bzip2)
|
||||
$(obj)/vmlinux.bin.lz4: $(vmlinux.bin.all-y)
|
||||
$(obj)/vmlinux.bin.lz4: $(vmlinux.bin.all-y) FORCE
|
||||
$(call if_changed,lz4)
|
||||
$(obj)/vmlinux.bin.lzma: $(vmlinux.bin.all-y)
|
||||
$(obj)/vmlinux.bin.lzma: $(vmlinux.bin.all-y) FORCE
|
||||
$(call if_changed,lzma)
|
||||
$(obj)/vmlinux.bin.lzo: $(vmlinux.bin.all-y)
|
||||
$(obj)/vmlinux.bin.lzo: $(vmlinux.bin.all-y) FORCE
|
||||
$(call if_changed,lzo)
|
||||
$(obj)/vmlinux.bin.xz: $(vmlinux.bin.all-y)
|
||||
$(obj)/vmlinux.bin.xz: $(vmlinux.bin.all-y) FORCE
|
||||
$(call if_changed,xzkern)
|
||||
|
||||
OBJCOPYFLAGS_piggy.o := -I binary -O elf64-s390 -B s390:64-bit --rename-section .data=.vmlinux.bin.compressed
|
||||
|
@ -64,6 +64,8 @@ CONFIG_NUMA=y
|
||||
CONFIG_PREEMPT=y
|
||||
CONFIG_HZ_100=y
|
||||
CONFIG_KEXEC_FILE=y
|
||||
CONFIG_EXPOLINE=y
|
||||
CONFIG_EXPOLINE_AUTO=y
|
||||
CONFIG_MEMORY_HOTPLUG=y
|
||||
CONFIG_MEMORY_HOTREMOVE=y
|
||||
CONFIG_KSM=y
|
||||
@ -84,9 +86,11 @@ CONFIG_PCI_DEBUG=y
|
||||
CONFIG_HOTPLUG_PCI=y
|
||||
CONFIG_HOTPLUG_PCI_S390=y
|
||||
CONFIG_CHSC_SCH=y
|
||||
CONFIG_VFIO_AP=m
|
||||
CONFIG_CRASH_DUMP=y
|
||||
CONFIG_BINFMT_MISC=m
|
||||
CONFIG_HIBERNATION=y
|
||||
CONFIG_PM_DEBUG=y
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_PACKET_DIAG=m
|
||||
@ -161,8 +165,6 @@ CONFIG_NF_CONNTRACK_TFTP=m
|
||||
CONFIG_NF_CT_NETLINK=m
|
||||
CONFIG_NF_CT_NETLINK_TIMEOUT=m
|
||||
CONFIG_NF_TABLES=m
|
||||
CONFIG_NFT_EXTHDR=m
|
||||
CONFIG_NFT_META=m
|
||||
CONFIG_NFT_CT=m
|
||||
CONFIG_NFT_COUNTER=m
|
||||
CONFIG_NFT_LOG=m
|
||||
@ -365,6 +367,8 @@ CONFIG_NET_ACT_SKBEDIT=m
|
||||
CONFIG_NET_ACT_CSUM=m
|
||||
CONFIG_DNS_RESOLVER=y
|
||||
CONFIG_OPENVSWITCH=m
|
||||
CONFIG_VSOCKETS=m
|
||||
CONFIG_VIRTIO_VSOCKETS=m
|
||||
CONFIG_NETLINK_DIAG=m
|
||||
CONFIG_CGROUP_NET_PRIO=y
|
||||
CONFIG_BPF_JIT=y
|
||||
@ -461,6 +465,7 @@ CONFIG_PPTP=m
|
||||
CONFIG_PPPOL2TP=m
|
||||
CONFIG_PPP_ASYNC=m
|
||||
CONFIG_PPP_SYNC_TTY=m
|
||||
CONFIG_ISM=m
|
||||
CONFIG_INPUT_EVDEV=y
|
||||
# CONFIG_INPUT_KEYBOARD is not set
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
@ -486,9 +491,12 @@ CONFIG_MLX4_INFINIBAND=m
|
||||
CONFIG_MLX5_INFINIBAND=m
|
||||
CONFIG_VFIO=m
|
||||
CONFIG_VFIO_PCI=m
|
||||
CONFIG_VFIO_MDEV=m
|
||||
CONFIG_VFIO_MDEV_DEVICE=m
|
||||
CONFIG_VIRTIO_PCI=m
|
||||
CONFIG_VIRTIO_BALLOON=m
|
||||
CONFIG_VIRTIO_INPUT=y
|
||||
CONFIG_S390_AP_IOMMU=y
|
||||
CONFIG_EXT4_FS=y
|
||||
CONFIG_EXT4_FS_POSIX_ACL=y
|
||||
CONFIG_EXT4_FS_SECURITY=y
|
||||
@ -615,7 +623,6 @@ CONFIG_DEBUG_CREDENTIALS=y
|
||||
CONFIG_RCU_TORTURE_TEST=m
|
||||
CONFIG_RCU_CPU_STALL_TIMEOUT=300
|
||||
CONFIG_NOTIFIER_ERROR_INJECTION=m
|
||||
CONFIG_PM_NOTIFIER_ERROR_INJECT=m
|
||||
CONFIG_NETDEV_NOTIFIER_ERROR_INJECT=m
|
||||
CONFIG_FAULT_INJECTION=y
|
||||
CONFIG_FAILSLAB=y
|
||||
@ -727,3 +734,4 @@ CONFIG_APPLDATA_BASE=y
|
||||
CONFIG_KVM=m
|
||||
CONFIG_KVM_S390_UCONTROL=y
|
||||
CONFIG_VHOST_NET=m
|
||||
CONFIG_VHOST_VSOCK=m
|
||||
|
@ -65,6 +65,8 @@ CONFIG_NR_CPUS=512
|
||||
CONFIG_NUMA=y
|
||||
CONFIG_HZ_100=y
|
||||
CONFIG_KEXEC_FILE=y
|
||||
CONFIG_EXPOLINE=y
|
||||
CONFIG_EXPOLINE_AUTO=y
|
||||
CONFIG_MEMORY_HOTPLUG=y
|
||||
CONFIG_MEMORY_HOTREMOVE=y
|
||||
CONFIG_KSM=y
|
||||
@ -82,9 +84,11 @@ CONFIG_PCI=y
|
||||
CONFIG_HOTPLUG_PCI=y
|
||||
CONFIG_HOTPLUG_PCI_S390=y
|
||||
CONFIG_CHSC_SCH=y
|
||||
CONFIG_VFIO_AP=m
|
||||
CONFIG_CRASH_DUMP=y
|
||||
CONFIG_BINFMT_MISC=m
|
||||
CONFIG_HIBERNATION=y
|
||||
CONFIG_PM_DEBUG=y
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_PACKET_DIAG=m
|
||||
@ -159,8 +163,6 @@ CONFIG_NF_CONNTRACK_TFTP=m
|
||||
CONFIG_NF_CT_NETLINK=m
|
||||
CONFIG_NF_CT_NETLINK_TIMEOUT=m
|
||||
CONFIG_NF_TABLES=m
|
||||
CONFIG_NFT_EXTHDR=m
|
||||
CONFIG_NFT_META=m
|
||||
CONFIG_NFT_CT=m
|
||||
CONFIG_NFT_COUNTER=m
|
||||
CONFIG_NFT_LOG=m
|
||||
@ -362,6 +364,8 @@ CONFIG_NET_ACT_SKBEDIT=m
|
||||
CONFIG_NET_ACT_CSUM=m
|
||||
CONFIG_DNS_RESOLVER=y
|
||||
CONFIG_OPENVSWITCH=m
|
||||
CONFIG_VSOCKETS=m
|
||||
CONFIG_VIRTIO_VSOCKETS=m
|
||||
CONFIG_NETLINK_DIAG=m
|
||||
CONFIG_CGROUP_NET_PRIO=y
|
||||
CONFIG_BPF_JIT=y
|
||||
@ -458,6 +462,7 @@ CONFIG_PPTP=m
|
||||
CONFIG_PPPOL2TP=m
|
||||
CONFIG_PPP_ASYNC=m
|
||||
CONFIG_PPP_SYNC_TTY=m
|
||||
CONFIG_ISM=m
|
||||
CONFIG_INPUT_EVDEV=y
|
||||
# CONFIG_INPUT_KEYBOARD is not set
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
@ -483,9 +488,12 @@ CONFIG_MLX4_INFINIBAND=m
|
||||
CONFIG_MLX5_INFINIBAND=m
|
||||
CONFIG_VFIO=m
|
||||
CONFIG_VFIO_PCI=m
|
||||
CONFIG_VFIO_MDEV=m
|
||||
CONFIG_VFIO_MDEV_DEVICE=m
|
||||
CONFIG_VIRTIO_PCI=m
|
||||
CONFIG_VIRTIO_BALLOON=m
|
||||
CONFIG_VIRTIO_INPUT=y
|
||||
CONFIG_S390_AP_IOMMU=y
|
||||
CONFIG_EXT4_FS=y
|
||||
CONFIG_EXT4_FS_POSIX_ACL=y
|
||||
CONFIG_EXT4_FS_SECURITY=y
|
||||
@ -666,3 +674,4 @@ CONFIG_APPLDATA_BASE=y
|
||||
CONFIG_KVM=m
|
||||
CONFIG_KVM_S390_UCONTROL=y
|
||||
CONFIG_VHOST_NET=m
|
||||
CONFIG_VHOST_VSOCK=m
|
||||
|
@ -26,14 +26,23 @@ CONFIG_CGROUP_CPUACCT=y
|
||||
CONFIG_CGROUP_PERF=y
|
||||
CONFIG_NAMESPACES=y
|
||||
CONFIG_USER_NS=y
|
||||
CONFIG_CHECKPOINT_RESTORE=y
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_EXPERT=y
|
||||
# CONFIG_SYSFS_SYSCALL is not set
|
||||
CONFIG_CHECKPOINT_RESTORE=y
|
||||
CONFIG_BPF_SYSCALL=y
|
||||
CONFIG_USERFAULTFD=y
|
||||
# CONFIG_COMPAT_BRK is not set
|
||||
CONFIG_PROFILING=y
|
||||
CONFIG_LIVEPATCH=y
|
||||
CONFIG_NR_CPUS=256
|
||||
CONFIG_NUMA=y
|
||||
CONFIG_HZ_100=y
|
||||
CONFIG_KEXEC_FILE=y
|
||||
CONFIG_CRASH_DUMP=y
|
||||
CONFIG_HIBERNATION=y
|
||||
CONFIG_PM_DEBUG=y
|
||||
CONFIG_CMM=m
|
||||
CONFIG_OPROFILE=y
|
||||
CONFIG_KPROBES=y
|
||||
CONFIG_JUMP_LABEL=y
|
||||
@ -44,11 +53,7 @@ CONFIG_BLK_DEV_INTEGRITY=y
|
||||
CONFIG_PARTITION_ADVANCED=y
|
||||
CONFIG_IBM_PARTITION=y
|
||||
CONFIG_DEFAULT_DEADLINE=y
|
||||
CONFIG_LIVEPATCH=y
|
||||
CONFIG_NR_CPUS=256
|
||||
CONFIG_NUMA=y
|
||||
CONFIG_HZ_100=y
|
||||
CONFIG_KEXEC_FILE=y
|
||||
CONFIG_BINFMT_MISC=m
|
||||
CONFIG_MEMORY_HOTPLUG=y
|
||||
CONFIG_MEMORY_HOTREMOVE=y
|
||||
CONFIG_KSM=y
|
||||
@ -60,9 +65,6 @@ CONFIG_ZBUD=m
|
||||
CONFIG_ZSMALLOC=m
|
||||
CONFIG_ZSMALLOC_STAT=y
|
||||
CONFIG_IDLE_PAGE_TRACKING=y
|
||||
CONFIG_CRASH_DUMP=y
|
||||
CONFIG_BINFMT_MISC=m
|
||||
CONFIG_HIBERNATION=y
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_UNIX=y
|
||||
@ -98,6 +100,7 @@ CONFIG_BLK_DEV_NBD=m
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_VIRTIO_BLK=y
|
||||
CONFIG_SCSI=y
|
||||
# CONFIG_SCSI_MQ_DEFAULT is not set
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_CHR_DEV_ST=y
|
||||
CONFIG_BLK_DEV_SR=y
|
||||
@ -131,6 +134,7 @@ CONFIG_EQUALIZER=m
|
||||
CONFIG_TUN=m
|
||||
CONFIG_VIRTIO_NET=y
|
||||
# CONFIG_NET_VENDOR_ALACRITECH is not set
|
||||
# CONFIG_NET_VENDOR_AURORA is not set
|
||||
# CONFIG_NET_VENDOR_CORTINA is not set
|
||||
# CONFIG_NET_VENDOR_SOLARFLARE is not set
|
||||
# CONFIG_NET_VENDOR_SOCIONEXT is not set
|
||||
@ -157,33 +161,6 @@ CONFIG_TMPFS=y
|
||||
CONFIG_TMPFS_POSIX_ACL=y
|
||||
CONFIG_HUGETLBFS=y
|
||||
# CONFIG_NETWORK_FILESYSTEMS is not set
|
||||
CONFIG_DEBUG_INFO=y
|
||||
CONFIG_DEBUG_INFO_DWARF4=y
|
||||
CONFIG_GDB_SCRIPTS=y
|
||||
CONFIG_UNUSED_SYMBOLS=y
|
||||
CONFIG_DEBUG_SECTION_MISMATCH=y
|
||||
CONFIG_DEBUG_FORCE_WEAK_PER_CPU=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_DEBUG_PAGEALLOC=y
|
||||
CONFIG_DETECT_HUNG_TASK=y
|
||||
CONFIG_PANIC_ON_OOPS=y
|
||||
CONFIG_PROVE_LOCKING=y
|
||||
CONFIG_LOCK_STAT=y
|
||||
CONFIG_DEBUG_LOCKDEP=y
|
||||
CONFIG_DEBUG_ATOMIC_SLEEP=y
|
||||
CONFIG_DEBUG_LIST=y
|
||||
CONFIG_DEBUG_SG=y
|
||||
CONFIG_DEBUG_NOTIFIERS=y
|
||||
CONFIG_RCU_CPU_STALL_TIMEOUT=60
|
||||
CONFIG_LATENCYTOP=y
|
||||
CONFIG_SCHED_TRACER=y
|
||||
CONFIG_FTRACE_SYSCALLS=y
|
||||
CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP=y
|
||||
CONFIG_STACK_TRACER=y
|
||||
CONFIG_BLK_DEV_IO_TRACE=y
|
||||
CONFIG_FUNCTION_PROFILER=y
|
||||
# CONFIG_RUNTIME_TESTING_MENU is not set
|
||||
CONFIG_S390_PTDUMP=y
|
||||
CONFIG_CRYPTO_CRYPTD=m
|
||||
CONFIG_CRYPTO_AUTHENC=m
|
||||
CONFIG_CRYPTO_TEST=m
|
||||
@ -193,6 +170,7 @@ CONFIG_CRYPTO_CBC=y
|
||||
CONFIG_CRYPTO_CFB=m
|
||||
CONFIG_CRYPTO_CTS=m
|
||||
CONFIG_CRYPTO_LRW=m
|
||||
CONFIG_CRYPTO_OFB=m
|
||||
CONFIG_CRYPTO_PCBC=m
|
||||
CONFIG_CRYPTO_XTS=m
|
||||
CONFIG_CRYPTO_CMAC=m
|
||||
@ -231,7 +209,6 @@ CONFIG_CRYPTO_USER_API_HASH=m
|
||||
CONFIG_CRYPTO_USER_API_SKCIPHER=m
|
||||
CONFIG_CRYPTO_USER_API_RNG=m
|
||||
CONFIG_ZCRYPT=m
|
||||
CONFIG_ZCRYPT_MULTIDEVNODES=y
|
||||
CONFIG_PKEY=m
|
||||
CONFIG_CRYPTO_PAES_S390=m
|
||||
CONFIG_CRYPTO_SHA1_S390=m
|
||||
@ -247,4 +224,30 @@ CONFIG_CRC7=m
|
||||
# CONFIG_XZ_DEC_ARM is not set
|
||||
# CONFIG_XZ_DEC_ARMTHUMB is not set
|
||||
# CONFIG_XZ_DEC_SPARC is not set
|
||||
CONFIG_CMM=m
|
||||
CONFIG_DEBUG_INFO=y
|
||||
CONFIG_DEBUG_INFO_DWARF4=y
|
||||
CONFIG_GDB_SCRIPTS=y
|
||||
CONFIG_UNUSED_SYMBOLS=y
|
||||
CONFIG_DEBUG_SECTION_MISMATCH=y
|
||||
CONFIG_DEBUG_FORCE_WEAK_PER_CPU=y
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_DEBUG_PAGEALLOC=y
|
||||
CONFIG_DETECT_HUNG_TASK=y
|
||||
CONFIG_PANIC_ON_OOPS=y
|
||||
CONFIG_PROVE_LOCKING=y
|
||||
CONFIG_LOCK_STAT=y
|
||||
CONFIG_DEBUG_LOCKDEP=y
|
||||
CONFIG_DEBUG_ATOMIC_SLEEP=y
|
||||
CONFIG_DEBUG_LIST=y
|
||||
CONFIG_DEBUG_SG=y
|
||||
CONFIG_DEBUG_NOTIFIERS=y
|
||||
CONFIG_RCU_CPU_STALL_TIMEOUT=60
|
||||
CONFIG_LATENCYTOP=y
|
||||
CONFIG_SCHED_TRACER=y
|
||||
CONFIG_FTRACE_SYSCALLS=y
|
||||
CONFIG_TRACER_SNAPSHOT_PER_CPU_SWAP=y
|
||||
CONFIG_STACK_TRACER=y
|
||||
CONFIG_BLK_DEV_IO_TRACE=y
|
||||
CONFIG_FUNCTION_PROFILER=y
|
||||
# CONFIG_RUNTIME_TESTING_MENU is not set
|
||||
CONFIG_S390_PTDUMP=y
|
||||
|
@ -46,8 +46,6 @@ static inline int init_new_context(struct task_struct *tsk,
|
||||
mm->context.asce_limit = STACK_TOP_MAX;
|
||||
mm->context.asce = __pa(mm->pgd) | _ASCE_TABLE_LENGTH |
|
||||
_ASCE_USER_BITS | _ASCE_TYPE_REGION3;
|
||||
/* pgd_alloc() did not account this pud */
|
||||
mm_inc_nr_puds(mm);
|
||||
break;
|
||||
case -PAGE_SIZE:
|
||||
/* forked 5-level task, set new asce with new_mm->pgd */
|
||||
@ -63,9 +61,6 @@ static inline int init_new_context(struct task_struct *tsk,
|
||||
/* forked 2-level compat task, set new asce with new mm->pgd */
|
||||
mm->context.asce = __pa(mm->pgd) | _ASCE_TABLE_LENGTH |
|
||||
_ASCE_USER_BITS | _ASCE_TYPE_SEGMENT;
|
||||
/* pgd_alloc() did not account this pmd */
|
||||
mm_inc_nr_pmds(mm);
|
||||
mm_inc_nr_puds(mm);
|
||||
}
|
||||
crst_table_init((unsigned long *) mm->pgd, pgd_entry_type(mm));
|
||||
return 0;
|
||||
|
@ -36,11 +36,11 @@ static inline void crst_table_init(unsigned long *crst, unsigned long entry)
|
||||
|
||||
static inline unsigned long pgd_entry_type(struct mm_struct *mm)
|
||||
{
|
||||
if (mm->context.asce_limit <= _REGION3_SIZE)
|
||||
if (mm_pmd_folded(mm))
|
||||
return _SEGMENT_ENTRY_EMPTY;
|
||||
if (mm->context.asce_limit <= _REGION2_SIZE)
|
||||
if (mm_pud_folded(mm))
|
||||
return _REGION3_ENTRY_EMPTY;
|
||||
if (mm->context.asce_limit <= _REGION1_SIZE)
|
||||
if (mm_p4d_folded(mm))
|
||||
return _REGION2_ENTRY_EMPTY;
|
||||
return _REGION1_ENTRY_EMPTY;
|
||||
}
|
||||
|
@ -493,6 +493,24 @@ static inline int is_module_addr(void *addr)
|
||||
_REGION_ENTRY_PROTECT | \
|
||||
_REGION_ENTRY_NOEXEC)
|
||||
|
||||
static inline bool mm_p4d_folded(struct mm_struct *mm)
|
||||
{
|
||||
return mm->context.asce_limit <= _REGION1_SIZE;
|
||||
}
|
||||
#define mm_p4d_folded(mm) mm_p4d_folded(mm)
|
||||
|
||||
static inline bool mm_pud_folded(struct mm_struct *mm)
|
||||
{
|
||||
return mm->context.asce_limit <= _REGION2_SIZE;
|
||||
}
|
||||
#define mm_pud_folded(mm) mm_pud_folded(mm)
|
||||
|
||||
static inline bool mm_pmd_folded(struct mm_struct *mm)
|
||||
{
|
||||
return mm->context.asce_limit <= _REGION3_SIZE;
|
||||
}
|
||||
#define mm_pmd_folded(mm) mm_pmd_folded(mm)
|
||||
|
||||
static inline int mm_has_pgste(struct mm_struct *mm)
|
||||
{
|
||||
#ifdef CONFIG_PGSTE
|
||||
|
@ -14,7 +14,7 @@
|
||||
* General size of kernel stacks
|
||||
*/
|
||||
#ifdef CONFIG_KASAN
|
||||
#define THREAD_SIZE_ORDER 3
|
||||
#define THREAD_SIZE_ORDER 4
|
||||
#else
|
||||
#define THREAD_SIZE_ORDER 2
|
||||
#endif
|
||||
|
@ -136,7 +136,7 @@ static inline void pte_free_tlb(struct mmu_gather *tlb, pgtable_t pte,
|
||||
static inline void pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd,
|
||||
unsigned long address)
|
||||
{
|
||||
if (tlb->mm->context.asce_limit <= _REGION3_SIZE)
|
||||
if (mm_pmd_folded(tlb->mm))
|
||||
return;
|
||||
pgtable_pmd_page_dtor(virt_to_page(pmd));
|
||||
tlb_remove_table(tlb, pmd);
|
||||
@ -152,7 +152,7 @@ static inline void pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd,
|
||||
static inline void p4d_free_tlb(struct mmu_gather *tlb, p4d_t *p4d,
|
||||
unsigned long address)
|
||||
{
|
||||
if (tlb->mm->context.asce_limit <= _REGION1_SIZE)
|
||||
if (mm_p4d_folded(tlb->mm))
|
||||
return;
|
||||
tlb_remove_table(tlb, p4d);
|
||||
}
|
||||
@ -167,7 +167,7 @@ static inline void p4d_free_tlb(struct mmu_gather *tlb, p4d_t *p4d,
|
||||
static inline void pud_free_tlb(struct mmu_gather *tlb, pud_t *pud,
|
||||
unsigned long address)
|
||||
{
|
||||
if (tlb->mm->context.asce_limit <= _REGION2_SIZE)
|
||||
if (mm_pud_folded(tlb->mm))
|
||||
return;
|
||||
tlb_remove_table(tlb, pud);
|
||||
}
|
||||
|
@ -236,10 +236,10 @@ ENTRY(__switch_to)
|
||||
stmg %r6,%r15,__SF_GPRS(%r15) # store gprs of prev task
|
||||
lghi %r4,__TASK_stack
|
||||
lghi %r1,__TASK_thread
|
||||
lg %r5,0(%r4,%r3) # start of kernel stack of next
|
||||
llill %r5,STACK_INIT
|
||||
stg %r15,__THREAD_ksp(%r1,%r2) # store kernel stack of prev
|
||||
lgr %r15,%r5
|
||||
aghi %r15,STACK_INIT # end of kernel stack of next
|
||||
lg %r15,0(%r4,%r3) # start of kernel stack of next
|
||||
agr %r15,%r5 # end of kernel stack of next
|
||||
stg %r3,__LC_CURRENT # store task struct of next
|
||||
stg %r15,__LC_KERNEL_STACK # store end of kernel stack
|
||||
lg %r15,__THREAD_ksp(%r1,%r3) # load kernel stack of next
|
||||
|
@ -373,7 +373,7 @@ static int __hw_perf_event_init(struct perf_event *event)
|
||||
return -ENOENT;
|
||||
|
||||
if (ev > PERF_CPUM_CF_MAX_CTR)
|
||||
return -EINVAL;
|
||||
return -ENOENT;
|
||||
|
||||
/* Obtain the counter set to which the specified counter belongs */
|
||||
set = get_counter_set(ev);
|
||||
|
@ -1842,10 +1842,30 @@ static void cpumsf_pmu_del(struct perf_event *event, int flags)
|
||||
CPUMF_EVENT_ATTR(SF, SF_CYCLES_BASIC, PERF_EVENT_CPUM_SF);
|
||||
CPUMF_EVENT_ATTR(SF, SF_CYCLES_BASIC_DIAG, PERF_EVENT_CPUM_SF_DIAG);
|
||||
|
||||
static struct attribute *cpumsf_pmu_events_attr[] = {
|
||||
CPUMF_EVENT_PTR(SF, SF_CYCLES_BASIC),
|
||||
NULL,
|
||||
NULL,
|
||||
/* Attribute list for CPU_SF.
|
||||
*
|
||||
* The availablitiy depends on the CPU_MF sampling facility authorization
|
||||
* for basic + diagnositic samples. This is determined at initialization
|
||||
* time by the sampling facility device driver.
|
||||
* If the authorization for basic samples is turned off, it should be
|
||||
* also turned off for diagnostic sampling.
|
||||
*
|
||||
* During initialization of the device driver, check the authorization
|
||||
* level for diagnostic sampling and installs the attribute
|
||||
* file for diagnostic sampling if necessary.
|
||||
*
|
||||
* For now install a placeholder to reference all possible attributes:
|
||||
* SF_CYCLES_BASIC and SF_CYCLES_BASIC_DIAG.
|
||||
* Add another entry for the final NULL pointer.
|
||||
*/
|
||||
enum {
|
||||
SF_CYCLES_BASIC_ATTR_IDX = 0,
|
||||
SF_CYCLES_BASIC_DIAG_ATTR_IDX,
|
||||
SF_CYCLES_ATTR_MAX
|
||||
};
|
||||
|
||||
static struct attribute *cpumsf_pmu_events_attr[SF_CYCLES_ATTR_MAX + 1] = {
|
||||
[SF_CYCLES_BASIC_ATTR_IDX] = CPUMF_EVENT_PTR(SF, SF_CYCLES_BASIC)
|
||||
};
|
||||
|
||||
PMU_FORMAT_ATTR(event, "config:0-63");
|
||||
@ -2040,7 +2060,10 @@ static int __init init_cpum_sampling_pmu(void)
|
||||
|
||||
if (si.ad) {
|
||||
sfb_set_limits(CPUM_SF_MIN_SDB, CPUM_SF_MAX_SDB);
|
||||
cpumsf_pmu_events_attr[1] =
|
||||
/* Sampling of diagnostic data authorized,
|
||||
* install event into attribute list of PMU device.
|
||||
*/
|
||||
cpumsf_pmu_events_attr[SF_CYCLES_BASIC_DIAG_ATTR_IDX] =
|
||||
CPUMF_EVENT_PTR(SF, SF_CYCLES_BASIC_DIAG);
|
||||
}
|
||||
|
||||
|
@ -37,7 +37,7 @@ KASAN_SANITIZE := n
|
||||
$(obj)/vdso32_wrapper.o : $(obj)/vdso32.so
|
||||
|
||||
# link rule for the .so file, .lds has to be first
|
||||
$(obj)/vdso32.so.dbg: $(src)/vdso32.lds $(obj-vdso32)
|
||||
$(obj)/vdso32.so.dbg: $(src)/vdso32.lds $(obj-vdso32) FORCE
|
||||
$(call if_changed,vdso32ld)
|
||||
|
||||
# strip rule for the .so file
|
||||
@ -46,12 +46,12 @@ $(obj)/%.so: $(obj)/%.so.dbg FORCE
|
||||
$(call if_changed,objcopy)
|
||||
|
||||
# assembly rules for the .S files
|
||||
$(obj-vdso32): %.o: %.S
|
||||
$(obj-vdso32): %.o: %.S FORCE
|
||||
$(call if_changed_dep,vdso32as)
|
||||
|
||||
# actual build commands
|
||||
quiet_cmd_vdso32ld = VDSO32L $@
|
||||
cmd_vdso32ld = $(CC) $(c_flags) -Wl,-T $^ -o $@
|
||||
cmd_vdso32ld = $(CC) $(c_flags) -Wl,-T $(filter %.lds %.o,$^) -o $@
|
||||
quiet_cmd_vdso32as = VDSO32A $@
|
||||
cmd_vdso32as = $(CC) $(a_flags) -c -o $@ $<
|
||||
|
||||
|
@ -37,7 +37,7 @@ KASAN_SANITIZE := n
|
||||
$(obj)/vdso64_wrapper.o : $(obj)/vdso64.so
|
||||
|
||||
# link rule for the .so file, .lds has to be first
|
||||
$(obj)/vdso64.so.dbg: $(src)/vdso64.lds $(obj-vdso64)
|
||||
$(obj)/vdso64.so.dbg: $(src)/vdso64.lds $(obj-vdso64) FORCE
|
||||
$(call if_changed,vdso64ld)
|
||||
|
||||
# strip rule for the .so file
|
||||
@ -46,12 +46,12 @@ $(obj)/%.so: $(obj)/%.so.dbg FORCE
|
||||
$(call if_changed,objcopy)
|
||||
|
||||
# assembly rules for the .S files
|
||||
$(obj-vdso64): %.o: %.S
|
||||
$(obj-vdso64): %.o: %.S FORCE
|
||||
$(call if_changed_dep,vdso64as)
|
||||
|
||||
# actual build commands
|
||||
quiet_cmd_vdso64ld = VDSO64L $@
|
||||
cmd_vdso64ld = $(CC) $(c_flags) -Wl,-T $^ -o $@
|
||||
cmd_vdso64ld = $(CC) $(c_flags) -Wl,-T $(filter %.lds %.o,$^) -o $@
|
||||
quiet_cmd_vdso64as = VDSO64A $@
|
||||
cmd_vdso64as = $(CC) $(a_flags) -c -o $@ $<
|
||||
|
||||
|
@ -154,14 +154,14 @@ SECTIONS
|
||||
* uncompressed image info used by the decompressor
|
||||
* it should match struct vmlinux_info
|
||||
*/
|
||||
.vmlinux.info 0 : {
|
||||
.vmlinux.info 0 (INFO) : {
|
||||
QUAD(_stext) /* default_lma */
|
||||
QUAD(startup_continue) /* entry */
|
||||
QUAD(__bss_start - _stext) /* image_size */
|
||||
QUAD(__bss_stop - __bss_start) /* bss_size */
|
||||
QUAD(__boot_data_start) /* bootdata_off */
|
||||
QUAD(__boot_data_end - __boot_data_start) /* bootdata_size */
|
||||
}
|
||||
} :NONE
|
||||
|
||||
/* Debugging sections. */
|
||||
STABS_DEBUG
|
||||
|
@ -101,6 +101,7 @@ int crst_table_upgrade(struct mm_struct *mm, unsigned long end)
|
||||
mm->context.asce_limit = _REGION1_SIZE;
|
||||
mm->context.asce = __pa(mm->pgd) | _ASCE_TABLE_LENGTH |
|
||||
_ASCE_USER_BITS | _ASCE_TYPE_REGION2;
|
||||
mm_inc_nr_puds(mm);
|
||||
} else {
|
||||
crst_table_init(table, _REGION1_ENTRY_EMPTY);
|
||||
pgd_populate(mm, (pgd_t *) table, (p4d_t *) pgd);
|
||||
|
@ -53,6 +53,7 @@ int __node_distance(int a, int b)
|
||||
{
|
||||
return mode->distance ? mode->distance(a, b) : 0;
|
||||
}
|
||||
EXPORT_SYMBOL(__node_distance);
|
||||
|
||||
int numa_debug_enabled;
|
||||
|
||||
|
@ -1305,6 +1305,7 @@ static int ubd_queue_one_vec(struct blk_mq_hw_ctx *hctx, struct request *req,
|
||||
io_req->fds[0] = dev->cow.fd;
|
||||
else
|
||||
io_req->fds[0] = dev->fd;
|
||||
io_req->error = 0;
|
||||
|
||||
if (req_op(req) == REQ_OP_FLUSH) {
|
||||
io_req->op = UBD_FLUSH;
|
||||
@ -1313,9 +1314,7 @@ static int ubd_queue_one_vec(struct blk_mq_hw_ctx *hctx, struct request *req,
|
||||
io_req->cow_offset = -1;
|
||||
io_req->offset = off;
|
||||
io_req->length = bvec->bv_len;
|
||||
io_req->error = 0;
|
||||
io_req->sector_mask = 0;
|
||||
|
||||
io_req->op = rq_data_dir(req) == READ ? UBD_READ : UBD_WRITE;
|
||||
io_req->offsets[0] = 0;
|
||||
io_req->offsets[1] = dev->cow.data_offset;
|
||||
@ -1341,11 +1340,14 @@ static int ubd_queue_one_vec(struct blk_mq_hw_ctx *hctx, struct request *req,
|
||||
static blk_status_t ubd_queue_rq(struct blk_mq_hw_ctx *hctx,
|
||||
const struct blk_mq_queue_data *bd)
|
||||
{
|
||||
struct ubd *ubd_dev = hctx->queue->queuedata;
|
||||
struct request *req = bd->rq;
|
||||
int ret = 0;
|
||||
|
||||
blk_mq_start_request(req);
|
||||
|
||||
spin_lock_irq(&ubd_dev->lock);
|
||||
|
||||
if (req_op(req) == REQ_OP_FLUSH) {
|
||||
ret = ubd_queue_one_vec(hctx, req, 0, NULL);
|
||||
} else {
|
||||
@ -1361,9 +1363,11 @@ static blk_status_t ubd_queue_rq(struct blk_mq_hw_ctx *hctx,
|
||||
}
|
||||
}
|
||||
out:
|
||||
if (ret < 0) {
|
||||
spin_unlock_irq(&ubd_dev->lock);
|
||||
|
||||
if (ret < 0)
|
||||
blk_mq_requeue_request(req, true);
|
||||
}
|
||||
|
||||
return BLK_STS_OK;
|
||||
}
|
||||
|
||||
|
@ -525,7 +525,6 @@ config X86_VSMP
|
||||
bool "ScaleMP vSMP"
|
||||
select HYPERVISOR_GUEST
|
||||
select PARAVIRT
|
||||
select PARAVIRT_XXL
|
||||
depends on X86_64 && PCI
|
||||
depends on X86_EXTENDED_PLATFORM
|
||||
depends on SMP
|
||||
|
@ -213,8 +213,6 @@ ifdef CONFIG_X86_64
|
||||
KBUILD_LDFLAGS += $(call ld-option, -z max-page-size=0x200000)
|
||||
endif
|
||||
|
||||
# Speed up the build
|
||||
KBUILD_CFLAGS += -pipe
|
||||
# Workaround for a gcc prelease that unfortunately was shipped in a suse release
|
||||
KBUILD_CFLAGS += -Wno-sign-compare
|
||||
#
|
||||
@ -239,7 +237,7 @@ archheaders:
|
||||
archmacros:
|
||||
$(Q)$(MAKE) $(build)=arch/x86/kernel arch/x86/kernel/macros.s
|
||||
|
||||
ASM_MACRO_FLAGS = -Wa,arch/x86/kernel/macros.s -Wa,-
|
||||
ASM_MACRO_FLAGS = -Wa,arch/x86/kernel/macros.s
|
||||
export ASM_MACRO_FLAGS
|
||||
KBUILD_CFLAGS += $(ASM_MACRO_FLAGS)
|
||||
|
||||
|
@ -221,6 +221,8 @@ static inline void mce_hygon_feature_init(struct cpuinfo_x86 *c) { return mce_am
|
||||
|
||||
int mce_available(struct cpuinfo_x86 *c);
|
||||
bool mce_is_memory_error(struct mce *m);
|
||||
bool mce_is_correctable(struct mce *m);
|
||||
int mce_usable_address(struct mce *m);
|
||||
|
||||
DECLARE_PER_CPU(unsigned, mce_exception_count);
|
||||
DECLARE_PER_CPU(unsigned, mce_poll_count);
|
||||
|
@ -232,7 +232,7 @@ static inline u64 hv_do_fast_hypercall16(u16 code, u64 input1, u64 input2)
|
||||
: "cc");
|
||||
}
|
||||
#endif
|
||||
return hv_status;
|
||||
return hv_status;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -33,12 +33,14 @@
|
||||
|
||||
/*
|
||||
* Set __PAGE_OFFSET to the most negative possible address +
|
||||
* PGDIR_SIZE*16 (pgd slot 272). The gap is to allow a space for a
|
||||
* hypervisor to fit. Choosing 16 slots here is arbitrary, but it's
|
||||
* what Xen requires.
|
||||
* PGDIR_SIZE*17 (pgd slot 273).
|
||||
*
|
||||
* The gap is to allow a space for LDT remap for PTI (1 pgd slot) and space for
|
||||
* a hypervisor (16 slots). Choosing 16 slots for a hypervisor is arbitrary,
|
||||
* but it's what Xen requires.
|
||||
*/
|
||||
#define __PAGE_OFFSET_BASE_L5 _AC(0xff10000000000000, UL)
|
||||
#define __PAGE_OFFSET_BASE_L4 _AC(0xffff880000000000, UL)
|
||||
#define __PAGE_OFFSET_BASE_L5 _AC(0xff11000000000000, UL)
|
||||
#define __PAGE_OFFSET_BASE_L4 _AC(0xffff888000000000, UL)
|
||||
|
||||
#ifdef CONFIG_DYNAMIC_MEMORY_LAYOUT
|
||||
#define __PAGE_OFFSET page_offset_base
|
||||
|
@ -111,9 +111,7 @@ extern unsigned int ptrs_per_p4d;
|
||||
*/
|
||||
#define MAXMEM (1UL << MAX_PHYSMEM_BITS)
|
||||
|
||||
#define LDT_PGD_ENTRY_L4 -3UL
|
||||
#define LDT_PGD_ENTRY_L5 -112UL
|
||||
#define LDT_PGD_ENTRY (pgtable_l5_enabled() ? LDT_PGD_ENTRY_L5 : LDT_PGD_ENTRY_L4)
|
||||
#define LDT_PGD_ENTRY -240UL
|
||||
#define LDT_BASE_ADDR (LDT_PGD_ENTRY << PGDIR_SHIFT)
|
||||
#define LDT_END_ADDR (LDT_BASE_ADDR + PGDIR_SIZE)
|
||||
|
||||
|
@ -13,12 +13,15 @@
|
||||
#define queued_fetch_set_pending_acquire queued_fetch_set_pending_acquire
|
||||
static __always_inline u32 queued_fetch_set_pending_acquire(struct qspinlock *lock)
|
||||
{
|
||||
u32 val = 0;
|
||||
|
||||
if (GEN_BINARY_RMWcc(LOCK_PREFIX "btsl", lock->val.counter, c,
|
||||
"I", _Q_PENDING_OFFSET))
|
||||
val |= _Q_PENDING_VAL;
|
||||
u32 val;
|
||||
|
||||
/*
|
||||
* We can't use GEN_BINARY_RMWcc() inside an if() stmt because asm goto
|
||||
* and CONFIG_PROFILE_ALL_BRANCHES=y results in a label inside a
|
||||
* statement expression, which GCC doesn't like.
|
||||
*/
|
||||
val = GEN_BINARY_RMWcc(LOCK_PREFIX "btsl", lock->val.counter, c,
|
||||
"I", _Q_PENDING_OFFSET) * _Q_PENDING_VAL;
|
||||
val |= atomic_read(&lock->val) & ~_Q_PENDING_MASK;
|
||||
|
||||
return val;
|
||||
|
@ -9,7 +9,7 @@
|
||||
#include <linux/mm.h>
|
||||
#include <linux/device.h>
|
||||
|
||||
#include <linux/uaccess.h>
|
||||
#include <asm/extable.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/pgtable.h>
|
||||
|
||||
@ -93,12 +93,39 @@ clear_foreign_p2m_mapping(struct gnttab_unmap_grant_ref *unmap_ops,
|
||||
*/
|
||||
static inline int xen_safe_write_ulong(unsigned long *addr, unsigned long val)
|
||||
{
|
||||
return __put_user(val, (unsigned long __user *)addr);
|
||||
int ret = 0;
|
||||
|
||||
asm volatile("1: mov %[val], %[ptr]\n"
|
||||
"2:\n"
|
||||
".section .fixup, \"ax\"\n"
|
||||
"3: sub $1, %[ret]\n"
|
||||
" jmp 2b\n"
|
||||
".previous\n"
|
||||
_ASM_EXTABLE(1b, 3b)
|
||||
: [ret] "+r" (ret), [ptr] "=m" (*addr)
|
||||
: [val] "r" (val));
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline int xen_safe_read_ulong(unsigned long *addr, unsigned long *val)
|
||||
static inline int xen_safe_read_ulong(const unsigned long *addr,
|
||||
unsigned long *val)
|
||||
{
|
||||
return __get_user(*val, (unsigned long __user *)addr);
|
||||
int ret = 0;
|
||||
unsigned long rval = ~0ul;
|
||||
|
||||
asm volatile("1: mov %[ptr], %[rval]\n"
|
||||
"2:\n"
|
||||
".section .fixup, \"ax\"\n"
|
||||
"3: sub $1, %[ret]\n"
|
||||
" jmp 2b\n"
|
||||
".previous\n"
|
||||
_ASM_EXTABLE(1b, 3b)
|
||||
: [ret] "+r" (ret), [rval] "+r" (rval)
|
||||
: [ptr] "m" (*addr));
|
||||
*val = rval;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_XEN_PV
|
||||
|
@ -485,7 +485,7 @@ static void mce_report_event(struct pt_regs *regs)
|
||||
* be somewhat complicated (e.g. segment offset would require an instruction
|
||||
* parser). So only support physical addresses up to page granuality for now.
|
||||
*/
|
||||
static int mce_usable_address(struct mce *m)
|
||||
int mce_usable_address(struct mce *m)
|
||||
{
|
||||
if (!(m->status & MCI_STATUS_ADDRV))
|
||||
return 0;
|
||||
@ -505,6 +505,7 @@ static int mce_usable_address(struct mce *m)
|
||||
|
||||
return 1;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mce_usable_address);
|
||||
|
||||
bool mce_is_memory_error(struct mce *m)
|
||||
{
|
||||
@ -534,7 +535,7 @@ bool mce_is_memory_error(struct mce *m)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mce_is_memory_error);
|
||||
|
||||
static bool mce_is_correctable(struct mce *m)
|
||||
bool mce_is_correctable(struct mce *m)
|
||||
{
|
||||
if (m->cpuvendor == X86_VENDOR_AMD && m->status & MCI_STATUS_DEFERRED)
|
||||
return false;
|
||||
@ -547,6 +548,7 @@ static bool mce_is_correctable(struct mce *m)
|
||||
|
||||
return true;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(mce_is_correctable);
|
||||
|
||||
static bool cec_add_mce(struct mce *m)
|
||||
{
|
||||
|
@ -20,6 +20,7 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/irq.h>
|
||||
#include <linux/kexec.h>
|
||||
#include <linux/i8253.h>
|
||||
#include <asm/processor.h>
|
||||
#include <asm/hypervisor.h>
|
||||
#include <asm/hyperv-tlfs.h>
|
||||
@ -295,6 +296,16 @@ static void __init ms_hyperv_init_platform(void)
|
||||
if (efi_enabled(EFI_BOOT))
|
||||
x86_platform.get_nmi_reason = hv_get_nmi_reason;
|
||||
|
||||
/*
|
||||
* Hyper-V VMs have a PIT emulation quirk such that zeroing the
|
||||
* counter register during PIT shutdown restarts the PIT. So it
|
||||
* continues to interrupt @18.2 HZ. Setting i8253_clear_counter
|
||||
* to false tells pit_shutdown() not to zero the counter so that
|
||||
* the PIT really is shutdown. Generation 2 VMs don't have a PIT,
|
||||
* and setting this value has no effect.
|
||||
*/
|
||||
i8253_clear_counter_on_shutdown = false;
|
||||
|
||||
#if IS_ENABLED(CONFIG_HYPERV)
|
||||
/*
|
||||
* Setup the hook to get control post apic initialization.
|
||||
|
@ -77,7 +77,7 @@ static __init int setup_vmw_sched_clock(char *s)
|
||||
}
|
||||
early_param("no-vmw-sched-clock", setup_vmw_sched_clock);
|
||||
|
||||
static unsigned long long vmware_sched_clock(void)
|
||||
static unsigned long long notrace vmware_sched_clock(void)
|
||||
{
|
||||
unsigned long long ns;
|
||||
|
||||
|
@ -199,14 +199,6 @@ static void sanity_check_ldt_mapping(struct mm_struct *mm)
|
||||
/*
|
||||
* If PTI is enabled, this maps the LDT into the kernelmode and
|
||||
* usermode tables for the given mm.
|
||||
*
|
||||
* There is no corresponding unmap function. Even if the LDT is freed, we
|
||||
* leave the PTEs around until the slot is reused or the mm is destroyed.
|
||||
* This is harmless: the LDT is always in ordinary memory, and no one will
|
||||
* access the freed slot.
|
||||
*
|
||||
* If we wanted to unmap freed LDTs, we'd also need to do a flush to make
|
||||
* it useful, and the flush would slow down modify_ldt().
|
||||
*/
|
||||
static int
|
||||
map_ldt_struct(struct mm_struct *mm, struct ldt_struct *ldt, int slot)
|
||||
@ -214,8 +206,7 @@ map_ldt_struct(struct mm_struct *mm, struct ldt_struct *ldt, int slot)
|
||||
unsigned long va;
|
||||
bool is_vmalloc;
|
||||
spinlock_t *ptl;
|
||||
pgd_t *pgd;
|
||||
int i;
|
||||
int i, nr_pages;
|
||||
|
||||
if (!static_cpu_has(X86_FEATURE_PTI))
|
||||
return 0;
|
||||
@ -229,16 +220,11 @@ map_ldt_struct(struct mm_struct *mm, struct ldt_struct *ldt, int slot)
|
||||
/* Check if the current mappings are sane */
|
||||
sanity_check_ldt_mapping(mm);
|
||||
|
||||
/*
|
||||
* Did we already have the top level entry allocated? We can't
|
||||
* use pgd_none() for this because it doens't do anything on
|
||||
* 4-level page table kernels.
|
||||
*/
|
||||
pgd = pgd_offset(mm, LDT_BASE_ADDR);
|
||||
|
||||
is_vmalloc = is_vmalloc_addr(ldt->entries);
|
||||
|
||||
for (i = 0; i * PAGE_SIZE < ldt->nr_entries * LDT_ENTRY_SIZE; i++) {
|
||||
nr_pages = DIV_ROUND_UP(ldt->nr_entries * LDT_ENTRY_SIZE, PAGE_SIZE);
|
||||
|
||||
for (i = 0; i < nr_pages; i++) {
|
||||
unsigned long offset = i << PAGE_SHIFT;
|
||||
const void *src = (char *)ldt->entries + offset;
|
||||
unsigned long pfn;
|
||||
@ -272,13 +258,39 @@ map_ldt_struct(struct mm_struct *mm, struct ldt_struct *ldt, int slot)
|
||||
/* Propagate LDT mapping to the user page-table */
|
||||
map_ldt_struct_to_user(mm);
|
||||
|
||||
va = (unsigned long)ldt_slot_va(slot);
|
||||
flush_tlb_mm_range(mm, va, va + LDT_SLOT_STRIDE, PAGE_SHIFT, false);
|
||||
|
||||
ldt->slot = slot;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void unmap_ldt_struct(struct mm_struct *mm, struct ldt_struct *ldt)
|
||||
{
|
||||
unsigned long va;
|
||||
int i, nr_pages;
|
||||
|
||||
if (!ldt)
|
||||
return;
|
||||
|
||||
/* LDT map/unmap is only required for PTI */
|
||||
if (!static_cpu_has(X86_FEATURE_PTI))
|
||||
return;
|
||||
|
||||
nr_pages = DIV_ROUND_UP(ldt->nr_entries * LDT_ENTRY_SIZE, PAGE_SIZE);
|
||||
|
||||
for (i = 0; i < nr_pages; i++) {
|
||||
unsigned long offset = i << PAGE_SHIFT;
|
||||
spinlock_t *ptl;
|
||||
pte_t *ptep;
|
||||
|
||||
va = (unsigned long)ldt_slot_va(ldt->slot) + offset;
|
||||
ptep = get_locked_pte(mm, va, &ptl);
|
||||
pte_clear(mm, va, ptep);
|
||||
pte_unmap_unlock(ptep, ptl);
|
||||
}
|
||||
|
||||
va = (unsigned long)ldt_slot_va(ldt->slot);
|
||||
flush_tlb_mm_range(mm, va, va + nr_pages * PAGE_SIZE, PAGE_SHIFT, false);
|
||||
}
|
||||
|
||||
#else /* !CONFIG_PAGE_TABLE_ISOLATION */
|
||||
|
||||
static int
|
||||
@ -286,6 +298,10 @@ map_ldt_struct(struct mm_struct *mm, struct ldt_struct *ldt, int slot)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void unmap_ldt_struct(struct mm_struct *mm, struct ldt_struct *ldt)
|
||||
{
|
||||
}
|
||||
#endif /* CONFIG_PAGE_TABLE_ISOLATION */
|
||||
|
||||
static void free_ldt_pgtables(struct mm_struct *mm)
|
||||
@ -524,6 +540,7 @@ static int write_ldt(void __user *ptr, unsigned long bytecount, int oldmode)
|
||||
}
|
||||
|
||||
install_ldt(mm, new_ldt);
|
||||
unmap_ldt_struct(mm, old_ldt);
|
||||
free_ldt_struct(old_ldt);
|
||||
error = 0;
|
||||
|
||||
|
@ -26,65 +26,8 @@
|
||||
|
||||
#define TOPOLOGY_REGISTER_OFFSET 0x10
|
||||
|
||||
#if defined CONFIG_PCI && defined CONFIG_PARAVIRT_XXL
|
||||
/*
|
||||
* Interrupt control on vSMPowered systems:
|
||||
* ~AC is a shadow of IF. If IF is 'on' AC should be 'off'
|
||||
* and vice versa.
|
||||
*/
|
||||
|
||||
asmlinkage __visible unsigned long vsmp_save_fl(void)
|
||||
{
|
||||
unsigned long flags = native_save_fl();
|
||||
|
||||
if (!(flags & X86_EFLAGS_IF) || (flags & X86_EFLAGS_AC))
|
||||
flags &= ~X86_EFLAGS_IF;
|
||||
return flags;
|
||||
}
|
||||
PV_CALLEE_SAVE_REGS_THUNK(vsmp_save_fl);
|
||||
|
||||
__visible void vsmp_restore_fl(unsigned long flags)
|
||||
{
|
||||
if (flags & X86_EFLAGS_IF)
|
||||
flags &= ~X86_EFLAGS_AC;
|
||||
else
|
||||
flags |= X86_EFLAGS_AC;
|
||||
native_restore_fl(flags);
|
||||
}
|
||||
PV_CALLEE_SAVE_REGS_THUNK(vsmp_restore_fl);
|
||||
|
||||
asmlinkage __visible void vsmp_irq_disable(void)
|
||||
{
|
||||
unsigned long flags = native_save_fl();
|
||||
|
||||
native_restore_fl((flags & ~X86_EFLAGS_IF) | X86_EFLAGS_AC);
|
||||
}
|
||||
PV_CALLEE_SAVE_REGS_THUNK(vsmp_irq_disable);
|
||||
|
||||
asmlinkage __visible void vsmp_irq_enable(void)
|
||||
{
|
||||
unsigned long flags = native_save_fl();
|
||||
|
||||
native_restore_fl((flags | X86_EFLAGS_IF) & (~X86_EFLAGS_AC));
|
||||
}
|
||||
PV_CALLEE_SAVE_REGS_THUNK(vsmp_irq_enable);
|
||||
|
||||
static unsigned __init vsmp_patch(u8 type, void *ibuf,
|
||||
unsigned long addr, unsigned len)
|
||||
{
|
||||
switch (type) {
|
||||
case PARAVIRT_PATCH(irq.irq_enable):
|
||||
case PARAVIRT_PATCH(irq.irq_disable):
|
||||
case PARAVIRT_PATCH(irq.save_fl):
|
||||
case PARAVIRT_PATCH(irq.restore_fl):
|
||||
return paravirt_patch_default(type, ibuf, addr, len);
|
||||
default:
|
||||
return native_patch(type, ibuf, addr, len);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static void __init set_vsmp_pv_ops(void)
|
||||
#ifdef CONFIG_PCI
|
||||
static void __init set_vsmp_ctl(void)
|
||||
{
|
||||
void __iomem *address;
|
||||
unsigned int cap, ctl, cfg;
|
||||
@ -109,28 +52,12 @@ static void __init set_vsmp_pv_ops(void)
|
||||
}
|
||||
#endif
|
||||
|
||||
if (cap & ctl & (1 << 4)) {
|
||||
/* Setup irq ops and turn on vSMP IRQ fastpath handling */
|
||||
pv_ops.irq.irq_disable = PV_CALLEE_SAVE(vsmp_irq_disable);
|
||||
pv_ops.irq.irq_enable = PV_CALLEE_SAVE(vsmp_irq_enable);
|
||||
pv_ops.irq.save_fl = PV_CALLEE_SAVE(vsmp_save_fl);
|
||||
pv_ops.irq.restore_fl = PV_CALLEE_SAVE(vsmp_restore_fl);
|
||||
pv_ops.init.patch = vsmp_patch;
|
||||
ctl &= ~(1 << 4);
|
||||
}
|
||||
writel(ctl, address + 4);
|
||||
ctl = readl(address + 4);
|
||||
pr_info("vSMP CTL: control set to:0x%08x\n", ctl);
|
||||
|
||||
early_iounmap(address, 8);
|
||||
}
|
||||
#else
|
||||
static void __init set_vsmp_pv_ops(void)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
static int is_vsmp = -1;
|
||||
|
||||
static void __init detect_vsmp_box(void)
|
||||
@ -164,11 +91,14 @@ static int is_vsmp_box(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static void __init set_vsmp_ctl(void)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
static void __init vsmp_cap_cpus(void)
|
||||
{
|
||||
#if !defined(CONFIG_X86_VSMP) && defined(CONFIG_SMP)
|
||||
#if !defined(CONFIG_X86_VSMP) && defined(CONFIG_SMP) && defined(CONFIG_PCI)
|
||||
void __iomem *address;
|
||||
unsigned int cfg, topology, node_shift, maxcpus;
|
||||
|
||||
@ -221,6 +151,6 @@ void __init vsmp_init(void)
|
||||
|
||||
vsmp_cap_cpus();
|
||||
|
||||
set_vsmp_pv_ops();
|
||||
set_vsmp_ctl();
|
||||
return;
|
||||
}
|
||||
|
@ -1905,7 +1905,7 @@ void __init xen_setup_kernel_pagetable(pgd_t *pgd, unsigned long max_pfn)
|
||||
init_top_pgt[0] = __pgd(0);
|
||||
|
||||
/* Pre-constructed entries are in pfn, so convert to mfn */
|
||||
/* L4[272] -> level3_ident_pgt */
|
||||
/* L4[273] -> level3_ident_pgt */
|
||||
/* L4[511] -> level3_kernel_pgt */
|
||||
convert_pfn_mfn(init_top_pgt);
|
||||
|
||||
@ -1925,8 +1925,8 @@ void __init xen_setup_kernel_pagetable(pgd_t *pgd, unsigned long max_pfn)
|
||||
addr[0] = (unsigned long)pgd;
|
||||
addr[1] = (unsigned long)l3;
|
||||
addr[2] = (unsigned long)l2;
|
||||
/* Graft it onto L4[272][0]. Note that we creating an aliasing problem:
|
||||
* Both L4[272][0] and L4[511][510] have entries that point to the same
|
||||
/* Graft it onto L4[273][0]. Note that we creating an aliasing problem:
|
||||
* Both L4[273][0] and L4[511][510] have entries that point to the same
|
||||
* L2 (PMD) tables. Meaning that if you modify it in __va space
|
||||
* it will be also modified in the __ka space! (But if you just
|
||||
* modify the PMD table to point to other PTE's or none, then you
|
||||
|
@ -656,8 +656,7 @@ bool __set_phys_to_machine(unsigned long pfn, unsigned long mfn)
|
||||
|
||||
/*
|
||||
* The interface requires atomic updates on p2m elements.
|
||||
* xen_safe_write_ulong() is using __put_user which does an atomic
|
||||
* store via asm().
|
||||
* xen_safe_write_ulong() is using an atomic store via asm().
|
||||
*/
|
||||
if (likely(!xen_safe_write_ulong(xen_p2m_addr + pfn, mfn)))
|
||||
return true;
|
||||
|
@ -9,6 +9,7 @@
|
||||
#include <linux/log2.h>
|
||||
#include <linux/gfp.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/atomic.h>
|
||||
|
||||
#include <asm/paravirt.h>
|
||||
#include <asm/qspinlock.h>
|
||||
@ -21,6 +22,7 @@
|
||||
|
||||
static DEFINE_PER_CPU(int, lock_kicker_irq) = -1;
|
||||
static DEFINE_PER_CPU(char *, irq_name);
|
||||
static DEFINE_PER_CPU(atomic_t, xen_qlock_wait_nest);
|
||||
static bool xen_pvspin = true;
|
||||
|
||||
static void xen_qlock_kick(int cpu)
|
||||
@ -39,25 +41,25 @@ static void xen_qlock_kick(int cpu)
|
||||
*/
|
||||
static void xen_qlock_wait(u8 *byte, u8 val)
|
||||
{
|
||||
unsigned long flags;
|
||||
int irq = __this_cpu_read(lock_kicker_irq);
|
||||
atomic_t *nest_cnt = this_cpu_ptr(&xen_qlock_wait_nest);
|
||||
|
||||
/* If kicker interrupts not initialized yet, just spin */
|
||||
if (irq == -1 || in_nmi())
|
||||
return;
|
||||
|
||||
/* Guard against reentry. */
|
||||
local_irq_save(flags);
|
||||
/* Detect reentry. */
|
||||
atomic_inc(nest_cnt);
|
||||
|
||||
/* If irq pending already clear it. */
|
||||
if (xen_test_irq_pending(irq)) {
|
||||
/* If irq pending already and no nested call clear it. */
|
||||
if (atomic_read(nest_cnt) == 1 && xen_test_irq_pending(irq)) {
|
||||
xen_clear_irq_pending(irq);
|
||||
} else if (READ_ONCE(*byte) == val) {
|
||||
/* Block until irq becomes pending (or a spurious wakeup) */
|
||||
xen_poll_irq(irq);
|
||||
}
|
||||
|
||||
local_irq_restore(flags);
|
||||
atomic_dec(nest_cnt);
|
||||
}
|
||||
|
||||
static irqreturn_t dummy_handler(int irq, void *dev_id)
|
||||
|
@ -1260,6 +1260,7 @@ struct bio *bio_copy_user_iov(struct request_queue *q,
|
||||
if (ret)
|
||||
goto cleanup;
|
||||
} else {
|
||||
zero_fill_bio(bio);
|
||||
iov_iter_advance(iter, bio->bi_iter.bi_size);
|
||||
}
|
||||
|
||||
|
@ -51,16 +51,12 @@ int __blkdev_issue_discard(struct block_device *bdev, sector_t sector,
|
||||
if ((sector | nr_sects) & bs_mask)
|
||||
return -EINVAL;
|
||||
|
||||
if (!nr_sects)
|
||||
return -EINVAL;
|
||||
|
||||
while (nr_sects) {
|
||||
unsigned int req_sects = nr_sects;
|
||||
sector_t end_sect;
|
||||
|
||||
if (!req_sects)
|
||||
goto fail;
|
||||
if (req_sects > UINT_MAX >> 9)
|
||||
req_sects = UINT_MAX >> 9;
|
||||
|
||||
end_sect = sector + req_sects;
|
||||
unsigned int req_sects = min_t(unsigned int, nr_sects,
|
||||
bio_allowed_max_sectors(q));
|
||||
|
||||
bio = blk_next_bio(bio, 0, gfp_mask);
|
||||
bio->bi_iter.bi_sector = sector;
|
||||
@ -68,8 +64,8 @@ int __blkdev_issue_discard(struct block_device *bdev, sector_t sector,
|
||||
bio_set_op_attrs(bio, op, 0);
|
||||
|
||||
bio->bi_iter.bi_size = req_sects << 9;
|
||||
sector += req_sects;
|
||||
nr_sects -= req_sects;
|
||||
sector = end_sect;
|
||||
|
||||
/*
|
||||
* We can loop for a long time in here, if someone does
|
||||
@ -82,14 +78,6 @@ int __blkdev_issue_discard(struct block_device *bdev, sector_t sector,
|
||||
|
||||
*biop = bio;
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
if (bio) {
|
||||
submit_bio_wait(bio);
|
||||
bio_put(bio);
|
||||
}
|
||||
*biop = NULL;
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
EXPORT_SYMBOL(__blkdev_issue_discard);
|
||||
|
||||
@ -161,7 +149,7 @@ static int __blkdev_issue_write_same(struct block_device *bdev, sector_t sector,
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
/* Ensure that max_write_same_sectors doesn't overflow bi_size */
|
||||
max_write_same_sectors = UINT_MAX >> 9;
|
||||
max_write_same_sectors = bio_allowed_max_sectors(q);
|
||||
|
||||
while (nr_sects) {
|
||||
bio = blk_next_bio(bio, 1, gfp_mask);
|
||||
|
@ -46,7 +46,7 @@ static inline bool bio_will_gap(struct request_queue *q,
|
||||
bio_get_first_bvec(prev_rq->bio, &pb);
|
||||
else
|
||||
bio_get_first_bvec(prev, &pb);
|
||||
if (pb.bv_offset)
|
||||
if (pb.bv_offset & queue_virt_boundary(q))
|
||||
return true;
|
||||
|
||||
/*
|
||||
@ -90,7 +90,8 @@ static struct bio *blk_bio_discard_split(struct request_queue *q,
|
||||
/* Zero-sector (unknown) and one-sector granularities are the same. */
|
||||
granularity = max(q->limits.discard_granularity >> 9, 1U);
|
||||
|
||||
max_discard_sectors = min(q->limits.max_discard_sectors, UINT_MAX >> 9);
|
||||
max_discard_sectors = min(q->limits.max_discard_sectors,
|
||||
bio_allowed_max_sectors(q));
|
||||
max_discard_sectors -= max_discard_sectors % granularity;
|
||||
|
||||
if (unlikely(!max_discard_sectors)) {
|
||||
|
12
block/blk.h
12
block/blk.h
@ -169,7 +169,7 @@ static inline bool biovec_phys_mergeable(struct request_queue *q,
|
||||
static inline bool __bvec_gap_to_prev(struct request_queue *q,
|
||||
struct bio_vec *bprv, unsigned int offset)
|
||||
{
|
||||
return offset ||
|
||||
return (offset & queue_virt_boundary(q)) ||
|
||||
((bprv->bv_offset + bprv->bv_len) & queue_virt_boundary(q));
|
||||
}
|
||||
|
||||
@ -395,6 +395,16 @@ static inline unsigned long blk_rq_deadline(struct request *rq)
|
||||
return rq->__deadline & ~0x1UL;
|
||||
}
|
||||
|
||||
/*
|
||||
* The max size one bio can handle is UINT_MAX becasue bvec_iter.bi_size
|
||||
* is defined as 'unsigned int', meantime it has to aligned to with logical
|
||||
* block size which is the minimum accepted unit by hardware.
|
||||
*/
|
||||
static inline unsigned int bio_allowed_max_sectors(struct request_queue *q)
|
||||
{
|
||||
return round_down(UINT_MAX, queue_logical_block_size(q)) >> 9;
|
||||
}
|
||||
|
||||
/*
|
||||
* Internal io_context interface
|
||||
*/
|
||||
|
@ -25,8 +25,12 @@ static int nfit_handle_mce(struct notifier_block *nb, unsigned long val,
|
||||
struct acpi_nfit_desc *acpi_desc;
|
||||
struct nfit_spa *nfit_spa;
|
||||
|
||||
/* We only care about memory errors */
|
||||
if (!mce_is_memory_error(mce))
|
||||
/* We only care about uncorrectable memory errors */
|
||||
if (!mce_is_memory_error(mce) || mce_is_correctable(mce))
|
||||
return NOTIFY_DONE;
|
||||
|
||||
/* Verify the address reported in the MCE is valid. */
|
||||
if (!mce_usable_address(mce))
|
||||
return NOTIFY_DONE;
|
||||
|
||||
/*
|
||||
|
@ -1,14 +1,10 @@
|
||||
// SPDX-License-Identifier: GPL-2.0+
|
||||
/*
|
||||
* Renesas R-Car SATA driver
|
||||
*
|
||||
* Author: Vladimir Barinov <source@cogentembedded.com>
|
||||
* Copyright (C) 2013-2015 Cogent Embedded, Inc.
|
||||
* Copyright (C) 2013-2015 Renesas Solutions Corp.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
|
@ -1919,6 +1919,7 @@ static int negotiate_mq(struct blkfront_info *info)
|
||||
GFP_KERNEL);
|
||||
if (!info->rinfo) {
|
||||
xenbus_dev_fatal(info->xbdev, -ENOMEM, "allocating ring_info structure");
|
||||
info->nr_rings = 0;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
@ -210,6 +210,7 @@ static int of_fixed_factor_clk_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct clk *clk = platform_get_drvdata(pdev);
|
||||
|
||||
of_clk_del_provider(pdev->dev.of_node);
|
||||
clk_unregister_fixed_factor(clk);
|
||||
|
||||
return 0;
|
||||
|
@ -325,6 +325,7 @@ static struct clk_regmap axg_fclk_div2 = {
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
.parent_names = (const char *[]){ "fclk_div2_div" },
|
||||
.num_parents = 1,
|
||||
.flags = CLK_IS_CRITICAL,
|
||||
},
|
||||
};
|
||||
|
||||
@ -349,6 +350,18 @@ static struct clk_regmap axg_fclk_div3 = {
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
.parent_names = (const char *[]){ "fclk_div3_div" },
|
||||
.num_parents = 1,
|
||||
/*
|
||||
* FIXME:
|
||||
* This clock, as fdiv2, is used by the SCPI FW and is required
|
||||
* by the platform to operate correctly.
|
||||
* Until the following condition are met, we need this clock to
|
||||
* be marked as critical:
|
||||
* a) The SCPI generic driver claims and enable all the clocks
|
||||
* it needs
|
||||
* b) CCF has a clock hand-off mechanism to make the sure the
|
||||
* clock stays on until the proper driver comes along
|
||||
*/
|
||||
.flags = CLK_IS_CRITICAL,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -506,6 +506,18 @@ static struct clk_regmap gxbb_fclk_div3 = {
|
||||
.ops = &clk_regmap_gate_ops,
|
||||
.parent_names = (const char *[]){ "fclk_div3_div" },
|
||||
.num_parents = 1,
|
||||
/*
|
||||
* FIXME:
|
||||
* This clock, as fdiv2, is used by the SCPI FW and is required
|
||||
* by the platform to operate correctly.
|
||||
* Until the following condition are met, we need this clock to
|
||||
* be marked as critical:
|
||||
* a) The SCPI generic driver claims and enable all the clocks
|
||||
* it needs
|
||||
* b) CCF has a clock hand-off mechanism to make the sure the
|
||||
* clock stays on until the proper driver comes along
|
||||
*/
|
||||
.flags = CLK_IS_CRITICAL,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -265,7 +265,7 @@ static struct clk_fixed_factor cxo = {
|
||||
.div = 1,
|
||||
.hw.init = &(struct clk_init_data){
|
||||
.name = "cxo",
|
||||
.parent_names = (const char *[]){ "xo_board" },
|
||||
.parent_names = (const char *[]){ "xo-board" },
|
||||
.num_parents = 1,
|
||||
.ops = &clk_fixed_factor_ops,
|
||||
},
|
||||
|
@ -20,6 +20,13 @@
|
||||
DEFINE_RAW_SPINLOCK(i8253_lock);
|
||||
EXPORT_SYMBOL(i8253_lock);
|
||||
|
||||
/*
|
||||
* Handle PIT quirk in pit_shutdown() where zeroing the counter register
|
||||
* restarts the PIT, negating the shutdown. On platforms with the quirk,
|
||||
* platform specific code can set this to false.
|
||||
*/
|
||||
bool i8253_clear_counter_on_shutdown __ro_after_init = true;
|
||||
|
||||
#ifdef CONFIG_CLKSRC_I8253
|
||||
/*
|
||||
* Since the PIT overflows every tick, its not very useful
|
||||
@ -109,8 +116,11 @@ static int pit_shutdown(struct clock_event_device *evt)
|
||||
raw_spin_lock(&i8253_lock);
|
||||
|
||||
outb_p(0x30, PIT_MODE);
|
||||
outb_p(0, PIT_CH0);
|
||||
outb_p(0, PIT_CH0);
|
||||
|
||||
if (i8253_clear_counter_on_shutdown) {
|
||||
outb_p(0, PIT_CH0);
|
||||
outb_p(0, PIT_CH0);
|
||||
}
|
||||
|
||||
raw_spin_unlock(&i8253_lock);
|
||||
return 0;
|
||||
|
@ -151,6 +151,7 @@ extern int amdgpu_compute_multipipe;
|
||||
extern int amdgpu_gpu_recovery;
|
||||
extern int amdgpu_emu_mode;
|
||||
extern uint amdgpu_smu_memory_pool_size;
|
||||
extern uint amdgpu_dc_feature_mask;
|
||||
extern struct amdgpu_mgpu_info mgpu_info;
|
||||
|
||||
#ifdef CONFIG_DRM_AMDGPU_SI
|
||||
|
@ -127,6 +127,9 @@ int amdgpu_compute_multipipe = -1;
|
||||
int amdgpu_gpu_recovery = -1; /* auto */
|
||||
int amdgpu_emu_mode = 0;
|
||||
uint amdgpu_smu_memory_pool_size = 0;
|
||||
/* FBC (bit 0) disabled by default*/
|
||||
uint amdgpu_dc_feature_mask = 0;
|
||||
|
||||
struct amdgpu_mgpu_info mgpu_info = {
|
||||
.mutex = __MUTEX_INITIALIZER(mgpu_info.mutex),
|
||||
};
|
||||
@ -631,6 +634,14 @@ module_param(halt_if_hws_hang, int, 0644);
|
||||
MODULE_PARM_DESC(halt_if_hws_hang, "Halt if HWS hang is detected (0 = off (default), 1 = on)");
|
||||
#endif
|
||||
|
||||
/**
|
||||
* DOC: dcfeaturemask (uint)
|
||||
* Override display features enabled. See enum DC_FEATURE_MASK in drivers/gpu/drm/amd/include/amd_shared.h.
|
||||
* The default is the current set of stable display features.
|
||||
*/
|
||||
MODULE_PARM_DESC(dcfeaturemask, "all stable DC features enabled (default))");
|
||||
module_param_named(dcfeaturemask, amdgpu_dc_feature_mask, uint, 0444);
|
||||
|
||||
static const struct pci_device_id pciidlist[] = {
|
||||
#ifdef CONFIG_DRM_AMDGPU_SI
|
||||
{0x1002, 0x6780, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
|
||||
|
@ -49,6 +49,7 @@ int vega20_reg_base_init(struct amdgpu_device *adev)
|
||||
adev->reg_offset[SMUIO_HWIP][i] = (uint32_t *)(&(SMUIO_BASE.instance[i]));
|
||||
adev->reg_offset[NBIF_HWIP][i] = (uint32_t *)(&(NBIO_BASE.instance[i]));
|
||||
adev->reg_offset[THM_HWIP][i] = (uint32_t *)(&(THM_BASE.instance[i]));
|
||||
adev->reg_offset[CLK_HWIP][i] = (uint32_t *)(&(CLK_BASE.instance[i]));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
@ -429,6 +429,9 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)
|
||||
adev->asic_type < CHIP_RAVEN)
|
||||
init_data.flags.gpu_vm_support = true;
|
||||
|
||||
if (amdgpu_dc_feature_mask & DC_FBC_MASK)
|
||||
init_data.flags.fbc_support = true;
|
||||
|
||||
/* Display Core create. */
|
||||
adev->dm.dc = dc_create(&init_data);
|
||||
|
||||
@ -1524,13 +1527,6 @@ static int amdgpu_dm_backlight_update_status(struct backlight_device *bd)
|
||||
{
|
||||
struct amdgpu_display_manager *dm = bl_get_data(bd);
|
||||
|
||||
/*
|
||||
* PWM interperts 0 as 100% rather than 0% because of HW
|
||||
* limitation for level 0.So limiting minimum brightness level
|
||||
* to 1.
|
||||
*/
|
||||
if (bd->props.brightness < 1)
|
||||
return 1;
|
||||
if (dc_link_set_backlight_level(dm->backlight_link,
|
||||
bd->props.brightness, 0, 0))
|
||||
return 0;
|
||||
@ -2707,18 +2703,11 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
|
||||
drm_connector = &aconnector->base;
|
||||
|
||||
if (!aconnector->dc_sink) {
|
||||
/*
|
||||
* Create dc_sink when necessary to MST
|
||||
* Don't apply fake_sink to MST
|
||||
*/
|
||||
if (aconnector->mst_port) {
|
||||
dm_dp_mst_dc_sink_create(drm_connector);
|
||||
return stream;
|
||||
if (!aconnector->mst_port) {
|
||||
sink = create_fake_sink(aconnector);
|
||||
if (!sink)
|
||||
return stream;
|
||||
}
|
||||
|
||||
sink = create_fake_sink(aconnector);
|
||||
if (!sink)
|
||||
return stream;
|
||||
} else {
|
||||
sink = aconnector->dc_sink;
|
||||
}
|
||||
@ -3308,7 +3297,7 @@ void dm_drm_plane_destroy_state(struct drm_plane *plane,
|
||||
static const struct drm_plane_funcs dm_plane_funcs = {
|
||||
.update_plane = drm_atomic_helper_update_plane,
|
||||
.disable_plane = drm_atomic_helper_disable_plane,
|
||||
.destroy = drm_plane_cleanup,
|
||||
.destroy = drm_primary_helper_destroy,
|
||||
.reset = dm_drm_plane_reset,
|
||||
.atomic_duplicate_state = dm_drm_plane_duplicate_state,
|
||||
.atomic_destroy_state = dm_drm_plane_destroy_state,
|
||||
|
@ -160,8 +160,6 @@ struct amdgpu_dm_connector {
|
||||
struct mutex hpd_lock;
|
||||
|
||||
bool fake_enable;
|
||||
|
||||
bool mst_connected;
|
||||
};
|
||||
|
||||
#define to_amdgpu_dm_connector(x) container_of(x, struct amdgpu_dm_connector, base)
|
||||
|
@ -205,40 +205,6 @@ static const struct drm_connector_funcs dm_dp_mst_connector_funcs = {
|
||||
.atomic_get_property = amdgpu_dm_connector_atomic_get_property
|
||||
};
|
||||
|
||||
void dm_dp_mst_dc_sink_create(struct drm_connector *connector)
|
||||
{
|
||||
struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
|
||||
struct dc_sink *dc_sink;
|
||||
struct dc_sink_init_data init_params = {
|
||||
.link = aconnector->dc_link,
|
||||
.sink_signal = SIGNAL_TYPE_DISPLAY_PORT_MST };
|
||||
|
||||
/* FIXME none of this is safe. we shouldn't touch aconnector here in
|
||||
* atomic_check
|
||||
*/
|
||||
|
||||
/*
|
||||
* TODO: Need to further figure out why ddc.algo is NULL while MST port exists
|
||||
*/
|
||||
if (!aconnector->port || !aconnector->port->aux.ddc.algo)
|
||||
return;
|
||||
|
||||
ASSERT(aconnector->edid);
|
||||
|
||||
dc_sink = dc_link_add_remote_sink(
|
||||
aconnector->dc_link,
|
||||
(uint8_t *)aconnector->edid,
|
||||
(aconnector->edid->extensions + 1) * EDID_LENGTH,
|
||||
&init_params);
|
||||
|
||||
dc_sink->priv = aconnector;
|
||||
aconnector->dc_sink = dc_sink;
|
||||
|
||||
if (aconnector->dc_sink)
|
||||
amdgpu_dm_update_freesync_caps(
|
||||
connector, aconnector->edid);
|
||||
}
|
||||
|
||||
static int dm_dp_mst_get_modes(struct drm_connector *connector)
|
||||
{
|
||||
struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
|
||||
@ -319,12 +285,7 @@ dm_dp_create_fake_mst_encoder(struct amdgpu_dm_connector *connector)
|
||||
struct amdgpu_device *adev = dev->dev_private;
|
||||
struct amdgpu_encoder *amdgpu_encoder;
|
||||
struct drm_encoder *encoder;
|
||||
const struct drm_connector_helper_funcs *connector_funcs =
|
||||
connector->base.helper_private;
|
||||
struct drm_encoder *enc_master =
|
||||
connector_funcs->best_encoder(&connector->base);
|
||||
|
||||
DRM_DEBUG_KMS("enc master is %p\n", enc_master);
|
||||
amdgpu_encoder = kzalloc(sizeof(*amdgpu_encoder), GFP_KERNEL);
|
||||
if (!amdgpu_encoder)
|
||||
return NULL;
|
||||
@ -354,25 +315,6 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
|
||||
struct amdgpu_device *adev = dev->dev_private;
|
||||
struct amdgpu_dm_connector *aconnector;
|
||||
struct drm_connector *connector;
|
||||
struct drm_connector_list_iter conn_iter;
|
||||
|
||||
drm_connector_list_iter_begin(dev, &conn_iter);
|
||||
drm_for_each_connector_iter(connector, &conn_iter) {
|
||||
aconnector = to_amdgpu_dm_connector(connector);
|
||||
if (aconnector->mst_port == master
|
||||
&& !aconnector->port) {
|
||||
DRM_INFO("DM_MST: reusing connector: %p [id: %d] [master: %p]\n",
|
||||
aconnector, connector->base.id, aconnector->mst_port);
|
||||
|
||||
aconnector->port = port;
|
||||
drm_connector_set_path_property(connector, pathprop);
|
||||
|
||||
drm_connector_list_iter_end(&conn_iter);
|
||||
aconnector->mst_connected = true;
|
||||
return &aconnector->base;
|
||||
}
|
||||
}
|
||||
drm_connector_list_iter_end(&conn_iter);
|
||||
|
||||
aconnector = kzalloc(sizeof(*aconnector), GFP_KERNEL);
|
||||
if (!aconnector)
|
||||
@ -421,8 +363,6 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
|
||||
*/
|
||||
amdgpu_dm_connector_funcs_reset(connector);
|
||||
|
||||
aconnector->mst_connected = true;
|
||||
|
||||
DRM_INFO("DM_MST: added connector: %p [id: %d] [master: %p]\n",
|
||||
aconnector, connector->base.id, aconnector->mst_port);
|
||||
|
||||
@ -434,6 +374,9 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
|
||||
static void dm_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
|
||||
struct drm_connector *connector)
|
||||
{
|
||||
struct amdgpu_dm_connector *master = container_of(mgr, struct amdgpu_dm_connector, mst_mgr);
|
||||
struct drm_device *dev = master->base.dev;
|
||||
struct amdgpu_device *adev = dev->dev_private;
|
||||
struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
|
||||
|
||||
DRM_INFO("DM_MST: Disabling connector: %p [id: %d] [master: %p]\n",
|
||||
@ -447,7 +390,10 @@ static void dm_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
|
||||
aconnector->dc_sink = NULL;
|
||||
}
|
||||
|
||||
aconnector->mst_connected = false;
|
||||
drm_connector_unregister(connector);
|
||||
if (adev->mode_info.rfbdev)
|
||||
drm_fb_helper_remove_one_connector(&adev->mode_info.rfbdev->helper, connector);
|
||||
drm_connector_put(connector);
|
||||
}
|
||||
|
||||
static void dm_dp_mst_hotplug(struct drm_dp_mst_topology_mgr *mgr)
|
||||
@ -458,18 +404,10 @@ static void dm_dp_mst_hotplug(struct drm_dp_mst_topology_mgr *mgr)
|
||||
drm_kms_helper_hotplug_event(dev);
|
||||
}
|
||||
|
||||
static void dm_dp_mst_link_status_reset(struct drm_connector *connector)
|
||||
{
|
||||
mutex_lock(&connector->dev->mode_config.mutex);
|
||||
drm_connector_set_link_status_property(connector, DRM_MODE_LINK_STATUS_BAD);
|
||||
mutex_unlock(&connector->dev->mode_config.mutex);
|
||||
}
|
||||
|
||||
static void dm_dp_mst_register_connector(struct drm_connector *connector)
|
||||
{
|
||||
struct drm_device *dev = connector->dev;
|
||||
struct amdgpu_device *adev = dev->dev_private;
|
||||
struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
|
||||
|
||||
if (adev->mode_info.rfbdev)
|
||||
drm_fb_helper_add_one_connector(&adev->mode_info.rfbdev->helper, connector);
|
||||
@ -477,9 +415,6 @@ static void dm_dp_mst_register_connector(struct drm_connector *connector)
|
||||
DRM_ERROR("adev->mode_info.rfbdev is NULL\n");
|
||||
|
||||
drm_connector_register(connector);
|
||||
|
||||
if (aconnector->mst_connected)
|
||||
dm_dp_mst_link_status_reset(connector);
|
||||
}
|
||||
|
||||
static const struct drm_dp_mst_topology_cbs dm_mst_cbs = {
|
||||
|
@ -31,6 +31,5 @@ struct amdgpu_dm_connector;
|
||||
|
||||
void amdgpu_dm_initialize_dp_connector(struct amdgpu_display_manager *dm,
|
||||
struct amdgpu_dm_connector *aconnector);
|
||||
void dm_dp_mst_dc_sink_create(struct drm_connector *connector);
|
||||
|
||||
#endif
|
||||
|
@ -1722,7 +1722,7 @@ static void write_i2c_retimer_setting(
|
||||
i2c_success = i2c_write(pipe_ctx, slave_address,
|
||||
buffer, sizeof(buffer));
|
||||
RETIMER_REDRIVER_INFO("retimer write to slave_address = 0x%x,\
|
||||
offset = 0x%d, reg_val = 0x%d, i2c_success = %d\n",
|
||||
offset = 0x%x, reg_val = 0x%x, i2c_success = %d\n",
|
||||
slave_address, buffer[0], buffer[1], i2c_success?1:0);
|
||||
if (!i2c_success)
|
||||
/* Write failure */
|
||||
@ -1734,7 +1734,7 @@ static void write_i2c_retimer_setting(
|
||||
i2c_success = i2c_write(pipe_ctx, slave_address,
|
||||
buffer, sizeof(buffer));
|
||||
RETIMER_REDRIVER_INFO("retimer write to slave_address = 0x%x,\
|
||||
offset = 0x%d, reg_val = 0x%d, i2c_success = %d\n",
|
||||
offset = 0x%x, reg_val = 0x%x, i2c_success = %d\n",
|
||||
slave_address, buffer[0], buffer[1], i2c_success?1:0);
|
||||
if (!i2c_success)
|
||||
/* Write failure */
|
||||
|
@ -169,6 +169,7 @@ struct link_training_settings;
|
||||
struct dc_config {
|
||||
bool gpu_vm_support;
|
||||
bool disable_disp_pll_sharing;
|
||||
bool fbc_support;
|
||||
};
|
||||
|
||||
enum visual_confirm {
|
||||
|
@ -1736,7 +1736,12 @@ static void set_static_screen_control(struct pipe_ctx **pipe_ctx,
|
||||
if (events->force_trigger)
|
||||
value |= 0x1;
|
||||
|
||||
value |= 0x84;
|
||||
if (num_pipes) {
|
||||
struct dc *dc = pipe_ctx[0]->stream->ctx->dc;
|
||||
|
||||
if (dc->fbc_compressor)
|
||||
value |= 0x84;
|
||||
}
|
||||
|
||||
for (i = 0; i < num_pipes; i++)
|
||||
pipe_ctx[i]->stream_res.tg->funcs->
|
||||
|
@ -1362,7 +1362,8 @@ static bool construct(
|
||||
pool->base.sw_i2cs[i] = NULL;
|
||||
}
|
||||
|
||||
dc->fbc_compressor = dce110_compressor_create(ctx);
|
||||
if (dc->config.fbc_support)
|
||||
dc->fbc_compressor = dce110_compressor_create(ctx);
|
||||
|
||||
if (!underlay_create(ctx, &pool->base))
|
||||
goto res_create_fail;
|
||||
|
@ -133,6 +133,10 @@ enum PP_FEATURE_MASK {
|
||||
PP_AVFS_MASK = 0x40000,
|
||||
};
|
||||
|
||||
enum DC_FEATURE_MASK {
|
||||
DC_FBC_MASK = 0x1,
|
||||
};
|
||||
|
||||
/**
|
||||
* struct amd_ip_funcs - general hooks for managing amdgpu IP Blocks
|
||||
*/
|
||||
|
@ -1325,7 +1325,7 @@ struct atom_smu_info_v3_3 {
|
||||
struct atom_common_table_header table_header;
|
||||
uint8_t smuip_min_ver;
|
||||
uint8_t smuip_max_ver;
|
||||
uint8_t smu_rsd1;
|
||||
uint8_t waflclk_ss_mode;
|
||||
uint8_t gpuclk_ss_mode;
|
||||
uint16_t sclk_ss_percentage;
|
||||
uint16_t sclk_ss_rate_10hz;
|
||||
@ -1355,7 +1355,10 @@ struct atom_smu_info_v3_3 {
|
||||
uint32_t syspll3_1_vco_freq_10khz;
|
||||
uint32_t bootup_fclk_10khz;
|
||||
uint32_t bootup_waflclk_10khz;
|
||||
uint32_t reserved[3];
|
||||
uint32_t smu_info_caps;
|
||||
uint16_t waflclk_ss_percentage; // in unit of 0.001%
|
||||
uint16_t smuinitoffset;
|
||||
uint32_t reserved;
|
||||
};
|
||||
|
||||
/*
|
||||
|
@ -120,6 +120,7 @@ static void vega20_set_default_registry_data(struct pp_hwmgr *hwmgr)
|
||||
data->registry_data.disable_auto_wattman = 1;
|
||||
data->registry_data.auto_wattman_debug = 0;
|
||||
data->registry_data.auto_wattman_sample_period = 100;
|
||||
data->registry_data.fclk_gfxclk_ratio = 0x3F6CCCCD;
|
||||
data->registry_data.auto_wattman_threshold = 50;
|
||||
data->registry_data.gfxoff_controlled_by_driver = 1;
|
||||
data->gfxoff_allowed = false;
|
||||
@ -829,6 +830,28 @@ static int vega20_enable_all_smu_features(struct pp_hwmgr *hwmgr)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vega20_notify_smc_display_change(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct vega20_hwmgr *data = (struct vega20_hwmgr *)(hwmgr->backend);
|
||||
|
||||
if (data->smu_features[GNLD_DPM_UCLK].enabled)
|
||||
return smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetUclkFastSwitch,
|
||||
1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int vega20_send_clock_ratio(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct vega20_hwmgr *data =
|
||||
(struct vega20_hwmgr *)(hwmgr->backend);
|
||||
|
||||
return smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetFclkGfxClkRatio,
|
||||
data->registry_data.fclk_gfxclk_ratio);
|
||||
}
|
||||
|
||||
static int vega20_disable_all_smu_features(struct pp_hwmgr *hwmgr)
|
||||
{
|
||||
struct vega20_hwmgr *data =
|
||||
@ -1532,6 +1555,16 @@ static int vega20_enable_dpm_tasks(struct pp_hwmgr *hwmgr)
|
||||
"[EnableDPMTasks] Failed to enable all smu features!",
|
||||
return result);
|
||||
|
||||
result = vega20_notify_smc_display_change(hwmgr);
|
||||
PP_ASSERT_WITH_CODE(!result,
|
||||
"[EnableDPMTasks] Failed to notify smc display change!",
|
||||
return result);
|
||||
|
||||
result = vega20_send_clock_ratio(hwmgr);
|
||||
PP_ASSERT_WITH_CODE(!result,
|
||||
"[EnableDPMTasks] Failed to send clock ratio!",
|
||||
return result);
|
||||
|
||||
/* Initialize UVD/VCE powergating state */
|
||||
vega20_init_powergate_state(hwmgr);
|
||||
|
||||
@ -1972,19 +2005,6 @@ static int vega20_read_sensor(struct pp_hwmgr *hwmgr, int idx,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int vega20_notify_smc_display_change(struct pp_hwmgr *hwmgr,
|
||||
bool has_disp)
|
||||
{
|
||||
struct vega20_hwmgr *data = (struct vega20_hwmgr *)(hwmgr->backend);
|
||||
|
||||
if (data->smu_features[GNLD_DPM_UCLK].enabled)
|
||||
return smum_send_msg_to_smc_with_parameter(hwmgr,
|
||||
PPSMC_MSG_SetUclkFastSwitch,
|
||||
has_disp ? 1 : 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int vega20_display_clock_voltage_request(struct pp_hwmgr *hwmgr,
|
||||
struct pp_display_clock_request *clock_req)
|
||||
{
|
||||
@ -2044,13 +2064,6 @@ static int vega20_notify_smc_display_config_after_ps_adjustment(
|
||||
struct pp_display_clock_request clock_req;
|
||||
int ret = 0;
|
||||
|
||||
if ((hwmgr->display_config->num_display > 1) &&
|
||||
!hwmgr->display_config->multi_monitor_in_sync &&
|
||||
!hwmgr->display_config->nb_pstate_switch_disable)
|
||||
vega20_notify_smc_display_change(hwmgr, false);
|
||||
else
|
||||
vega20_notify_smc_display_change(hwmgr, true);
|
||||
|
||||
min_clocks.dcefClock = hwmgr->display_config->min_dcef_set_clk;
|
||||
min_clocks.dcefClockInSR = hwmgr->display_config->min_dcef_deep_sleep_set_clk;
|
||||
min_clocks.memoryClock = hwmgr->display_config->min_mem_set_clock;
|
||||
|
@ -328,6 +328,7 @@ struct vega20_registry_data {
|
||||
uint8_t disable_auto_wattman;
|
||||
uint32_t auto_wattman_debug;
|
||||
uint32_t auto_wattman_sample_period;
|
||||
uint32_t fclk_gfxclk_ratio;
|
||||
uint8_t auto_wattman_threshold;
|
||||
uint8_t log_avfs_param;
|
||||
uint8_t enable_enginess;
|
||||
|
@ -105,7 +105,8 @@
|
||||
#define PPSMC_MSG_SetSystemVirtualDramAddrHigh 0x4B
|
||||
#define PPSMC_MSG_SetSystemVirtualDramAddrLow 0x4C
|
||||
#define PPSMC_MSG_WaflTest 0x4D
|
||||
// Unused ID 0x4E to 0x50
|
||||
#define PPSMC_MSG_SetFclkGfxClkRatio 0x4E
|
||||
// Unused ID 0x4F to 0x50
|
||||
#define PPSMC_MSG_AllowGfxOff 0x51
|
||||
#define PPSMC_MSG_DisallowGfxOff 0x52
|
||||
#define PPSMC_MSG_GetPptLimit 0x53
|
||||
|
@ -93,7 +93,7 @@ static void etnaviv_sched_timedout_job(struct drm_sched_job *sched_job)
|
||||
* If the GPU managed to complete this jobs fence, the timout is
|
||||
* spurious. Bail out.
|
||||
*/
|
||||
if (fence_completed(gpu, submit->out_fence->seqno))
|
||||
if (dma_fence_is_signaled(submit->out_fence))
|
||||
return;
|
||||
|
||||
/*
|
||||
|
@ -164,13 +164,6 @@ static u32 decon_get_frame_count(struct decon_context *ctx, bool end)
|
||||
return frm;
|
||||
}
|
||||
|
||||
static u32 decon_get_vblank_counter(struct exynos_drm_crtc *crtc)
|
||||
{
|
||||
struct decon_context *ctx = crtc->ctx;
|
||||
|
||||
return decon_get_frame_count(ctx, false);
|
||||
}
|
||||
|
||||
static void decon_setup_trigger(struct decon_context *ctx)
|
||||
{
|
||||
if (!ctx->crtc->i80_mode && !(ctx->out_type & I80_HW_TRG))
|
||||
@ -536,7 +529,6 @@ static const struct exynos_drm_crtc_ops decon_crtc_ops = {
|
||||
.disable = decon_disable,
|
||||
.enable_vblank = decon_enable_vblank,
|
||||
.disable_vblank = decon_disable_vblank,
|
||||
.get_vblank_counter = decon_get_vblank_counter,
|
||||
.atomic_begin = decon_atomic_begin,
|
||||
.update_plane = decon_update_plane,
|
||||
.disable_plane = decon_disable_plane,
|
||||
@ -554,7 +546,6 @@ static int decon_bind(struct device *dev, struct device *master, void *data)
|
||||
int ret;
|
||||
|
||||
ctx->drm_dev = drm_dev;
|
||||
drm_dev->max_vblank_count = 0xffffffff;
|
||||
|
||||
for (win = ctx->first_win; win < WINDOWS_NR; win++) {
|
||||
ctx->configs[win].pixel_formats = decon_formats;
|
||||
|
@ -162,16 +162,6 @@ static void exynos_drm_crtc_disable_vblank(struct drm_crtc *crtc)
|
||||
exynos_crtc->ops->disable_vblank(exynos_crtc);
|
||||
}
|
||||
|
||||
static u32 exynos_drm_crtc_get_vblank_counter(struct drm_crtc *crtc)
|
||||
{
|
||||
struct exynos_drm_crtc *exynos_crtc = to_exynos_crtc(crtc);
|
||||
|
||||
if (exynos_crtc->ops->get_vblank_counter)
|
||||
return exynos_crtc->ops->get_vblank_counter(exynos_crtc);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct drm_crtc_funcs exynos_crtc_funcs = {
|
||||
.set_config = drm_atomic_helper_set_config,
|
||||
.page_flip = drm_atomic_helper_page_flip,
|
||||
@ -181,7 +171,6 @@ static const struct drm_crtc_funcs exynos_crtc_funcs = {
|
||||
.atomic_destroy_state = drm_atomic_helper_crtc_destroy_state,
|
||||
.enable_vblank = exynos_drm_crtc_enable_vblank,
|
||||
.disable_vblank = exynos_drm_crtc_disable_vblank,
|
||||
.get_vblank_counter = exynos_drm_crtc_get_vblank_counter,
|
||||
};
|
||||
|
||||
struct exynos_drm_crtc *exynos_drm_crtc_create(struct drm_device *drm_dev,
|
||||
|
@ -135,7 +135,6 @@ struct exynos_drm_crtc_ops {
|
||||
void (*disable)(struct exynos_drm_crtc *crtc);
|
||||
int (*enable_vblank)(struct exynos_drm_crtc *crtc);
|
||||
void (*disable_vblank)(struct exynos_drm_crtc *crtc);
|
||||
u32 (*get_vblank_counter)(struct exynos_drm_crtc *crtc);
|
||||
enum drm_mode_status (*mode_valid)(struct exynos_drm_crtc *crtc,
|
||||
const struct drm_display_mode *mode);
|
||||
bool (*mode_fixup)(struct exynos_drm_crtc *crtc,
|
||||
|
@ -14,6 +14,7 @@
|
||||
|
||||
#include <drm/drmP.h>
|
||||
#include <drm/drm_crtc_helper.h>
|
||||
#include <drm/drm_fb_helper.h>
|
||||
#include <drm/drm_mipi_dsi.h>
|
||||
#include <drm/drm_panel.h>
|
||||
#include <drm/drm_atomic_helper.h>
|
||||
@ -1474,12 +1475,12 @@ static int exynos_dsi_create_connector(struct drm_encoder *encoder)
|
||||
{
|
||||
struct exynos_dsi *dsi = encoder_to_dsi(encoder);
|
||||
struct drm_connector *connector = &dsi->connector;
|
||||
struct drm_device *drm = encoder->dev;
|
||||
int ret;
|
||||
|
||||
connector->polled = DRM_CONNECTOR_POLL_HPD;
|
||||
|
||||
ret = drm_connector_init(encoder->dev, connector,
|
||||
&exynos_dsi_connector_funcs,
|
||||
ret = drm_connector_init(drm, connector, &exynos_dsi_connector_funcs,
|
||||
DRM_MODE_CONNECTOR_DSI);
|
||||
if (ret) {
|
||||
DRM_ERROR("Failed to initialize connector with drm\n");
|
||||
@ -1489,7 +1490,12 @@ static int exynos_dsi_create_connector(struct drm_encoder *encoder)
|
||||
connector->status = connector_status_disconnected;
|
||||
drm_connector_helper_add(connector, &exynos_dsi_connector_helper_funcs);
|
||||
drm_connector_attach_encoder(connector, encoder);
|
||||
if (!drm->registered)
|
||||
return 0;
|
||||
|
||||
connector->funcs->reset(connector);
|
||||
drm_fb_helper_add_one_connector(drm->fb_helper, connector);
|
||||
drm_connector_register(connector);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1527,7 +1533,9 @@ static int exynos_dsi_host_attach(struct mipi_dsi_host *host,
|
||||
}
|
||||
|
||||
dsi->panel = of_drm_find_panel(device->dev.of_node);
|
||||
if (dsi->panel) {
|
||||
if (IS_ERR(dsi->panel)) {
|
||||
dsi->panel = NULL;
|
||||
} else {
|
||||
drm_panel_attach(dsi->panel, &dsi->connector);
|
||||
dsi->connector.status = connector_status_connected;
|
||||
}
|
||||
|
@ -192,7 +192,7 @@ int exynos_drm_fbdev_init(struct drm_device *dev)
|
||||
struct drm_fb_helper *helper;
|
||||
int ret;
|
||||
|
||||
if (!dev->mode_config.num_crtc || !dev->mode_config.num_connector)
|
||||
if (!dev->mode_config.num_crtc)
|
||||
return 0;
|
||||
|
||||
fbdev = kzalloc(sizeof(*fbdev), GFP_KERNEL);
|
||||
|
@ -1905,7 +1905,6 @@ static struct intel_vgpu_mm *intel_vgpu_create_ggtt_mm(struct intel_vgpu *vgpu)
|
||||
vgpu_free_mm(mm);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
mm->ggtt_mm.last_partial_off = -1UL;
|
||||
|
||||
return mm;
|
||||
}
|
||||
@ -1930,7 +1929,6 @@ void _intel_vgpu_mm_release(struct kref *mm_ref)
|
||||
invalidate_ppgtt_mm(mm);
|
||||
} else {
|
||||
vfree(mm->ggtt_mm.virtual_ggtt);
|
||||
mm->ggtt_mm.last_partial_off = -1UL;
|
||||
}
|
||||
|
||||
vgpu_free_mm(mm);
|
||||
@ -2168,6 +2166,8 @@ static int emulate_ggtt_mmio_write(struct intel_vgpu *vgpu, unsigned int off,
|
||||
struct intel_gvt_gtt_entry e, m;
|
||||
dma_addr_t dma_addr;
|
||||
int ret;
|
||||
struct intel_gvt_partial_pte *partial_pte, *pos, *n;
|
||||
bool partial_update = false;
|
||||
|
||||
if (bytes != 4 && bytes != 8)
|
||||
return -EINVAL;
|
||||
@ -2178,68 +2178,57 @@ static int emulate_ggtt_mmio_write(struct intel_vgpu *vgpu, unsigned int off,
|
||||
if (!vgpu_gmadr_is_valid(vgpu, gma))
|
||||
return 0;
|
||||
|
||||
ggtt_get_guest_entry(ggtt_mm, &e, g_gtt_index);
|
||||
|
||||
e.type = GTT_TYPE_GGTT_PTE;
|
||||
memcpy((void *)&e.val64 + (off & (info->gtt_entry_size - 1)), p_data,
|
||||
bytes);
|
||||
|
||||
/* If ggtt entry size is 8 bytes, and it's split into two 4 bytes
|
||||
* write, we assume the two 4 bytes writes are consecutive.
|
||||
* Otherwise, we abort and report error
|
||||
* write, save the first 4 bytes in a list and update virtual
|
||||
* PTE. Only update shadow PTE when the second 4 bytes comes.
|
||||
*/
|
||||
if (bytes < info->gtt_entry_size) {
|
||||
if (ggtt_mm->ggtt_mm.last_partial_off == -1UL) {
|
||||
/* the first partial part*/
|
||||
ggtt_mm->ggtt_mm.last_partial_off = off;
|
||||
ggtt_mm->ggtt_mm.last_partial_data = e.val64;
|
||||
return 0;
|
||||
} else if ((g_gtt_index ==
|
||||
(ggtt_mm->ggtt_mm.last_partial_off >>
|
||||
info->gtt_entry_size_shift)) &&
|
||||
(off != ggtt_mm->ggtt_mm.last_partial_off)) {
|
||||
/* the second partial part */
|
||||
bool found = false;
|
||||
|
||||
int last_off = ggtt_mm->ggtt_mm.last_partial_off &
|
||||
(info->gtt_entry_size - 1);
|
||||
list_for_each_entry_safe(pos, n,
|
||||
&ggtt_mm->ggtt_mm.partial_pte_list, list) {
|
||||
if (g_gtt_index == pos->offset >>
|
||||
info->gtt_entry_size_shift) {
|
||||
if (off != pos->offset) {
|
||||
/* the second partial part*/
|
||||
int last_off = pos->offset &
|
||||
(info->gtt_entry_size - 1);
|
||||
|
||||
memcpy((void *)&e.val64 + last_off,
|
||||
(void *)&ggtt_mm->ggtt_mm.last_partial_data +
|
||||
last_off, bytes);
|
||||
memcpy((void *)&e.val64 + last_off,
|
||||
(void *)&pos->data + last_off,
|
||||
bytes);
|
||||
|
||||
ggtt_mm->ggtt_mm.last_partial_off = -1UL;
|
||||
} else {
|
||||
int last_offset;
|
||||
list_del(&pos->list);
|
||||
kfree(pos);
|
||||
found = true;
|
||||
break;
|
||||
}
|
||||
|
||||
gvt_vgpu_err("failed to populate guest ggtt entry: abnormal ggtt entry write sequence, last_partial_off=%lx, offset=%x, bytes=%d, ggtt entry size=%d\n",
|
||||
ggtt_mm->ggtt_mm.last_partial_off, off,
|
||||
bytes, info->gtt_entry_size);
|
||||
/* update of the first partial part */
|
||||
pos->data = e.val64;
|
||||
ggtt_set_guest_entry(ggtt_mm, &e, g_gtt_index);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
/* set host ggtt entry to scratch page and clear
|
||||
* virtual ggtt entry as not present for last
|
||||
* partially write offset
|
||||
*/
|
||||
last_offset = ggtt_mm->ggtt_mm.last_partial_off &
|
||||
(~(info->gtt_entry_size - 1));
|
||||
|
||||
ggtt_get_host_entry(ggtt_mm, &m, last_offset);
|
||||
ggtt_invalidate_pte(vgpu, &m);
|
||||
ops->set_pfn(&m, gvt->gtt.scratch_mfn);
|
||||
ops->clear_present(&m);
|
||||
ggtt_set_host_entry(ggtt_mm, &m, last_offset);
|
||||
ggtt_invalidate(gvt->dev_priv);
|
||||
|
||||
ggtt_get_guest_entry(ggtt_mm, &e, last_offset);
|
||||
ops->clear_present(&e);
|
||||
ggtt_set_guest_entry(ggtt_mm, &e, last_offset);
|
||||
|
||||
ggtt_mm->ggtt_mm.last_partial_off = off;
|
||||
ggtt_mm->ggtt_mm.last_partial_data = e.val64;
|
||||
|
||||
return 0;
|
||||
if (!found) {
|
||||
/* the first partial part */
|
||||
partial_pte = kzalloc(sizeof(*partial_pte), GFP_KERNEL);
|
||||
if (!partial_pte)
|
||||
return -ENOMEM;
|
||||
partial_pte->offset = off;
|
||||
partial_pte->data = e.val64;
|
||||
list_add_tail(&partial_pte->list,
|
||||
&ggtt_mm->ggtt_mm.partial_pte_list);
|
||||
partial_update = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (ops->test_present(&e)) {
|
||||
if (!partial_update && (ops->test_present(&e))) {
|
||||
gfn = ops->get_pfn(&e);
|
||||
m = e;
|
||||
|
||||
@ -2263,16 +2252,18 @@ static int emulate_ggtt_mmio_write(struct intel_vgpu *vgpu, unsigned int off,
|
||||
} else
|
||||
ops->set_pfn(&m, dma_addr >> PAGE_SHIFT);
|
||||
} else {
|
||||
ggtt_get_host_entry(ggtt_mm, &m, g_gtt_index);
|
||||
ggtt_invalidate_pte(vgpu, &m);
|
||||
ops->set_pfn(&m, gvt->gtt.scratch_mfn);
|
||||
ops->clear_present(&m);
|
||||
}
|
||||
|
||||
out:
|
||||
ggtt_set_guest_entry(ggtt_mm, &e, g_gtt_index);
|
||||
|
||||
ggtt_get_host_entry(ggtt_mm, &e, g_gtt_index);
|
||||
ggtt_invalidate_pte(vgpu, &e);
|
||||
|
||||
ggtt_set_host_entry(ggtt_mm, &m, g_gtt_index);
|
||||
ggtt_invalidate(gvt->dev_priv);
|
||||
ggtt_set_guest_entry(ggtt_mm, &e, g_gtt_index);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -2430,6 +2421,8 @@ int intel_vgpu_init_gtt(struct intel_vgpu *vgpu)
|
||||
|
||||
intel_vgpu_reset_ggtt(vgpu, false);
|
||||
|
||||
INIT_LIST_HEAD(>t->ggtt_mm->ggtt_mm.partial_pte_list);
|
||||
|
||||
return create_scratch_page_tree(vgpu);
|
||||
}
|
||||
|
||||
@ -2454,6 +2447,14 @@ static void intel_vgpu_destroy_all_ppgtt_mm(struct intel_vgpu *vgpu)
|
||||
|
||||
static void intel_vgpu_destroy_ggtt_mm(struct intel_vgpu *vgpu)
|
||||
{
|
||||
struct intel_gvt_partial_pte *pos;
|
||||
|
||||
list_for_each_entry(pos,
|
||||
&vgpu->gtt.ggtt_mm->ggtt_mm.partial_pte_list, list) {
|
||||
gvt_dbg_mm("partial PTE update on hold 0x%lx : 0x%llx\n",
|
||||
pos->offset, pos->data);
|
||||
kfree(pos);
|
||||
}
|
||||
intel_vgpu_destroy_mm(vgpu->gtt.ggtt_mm);
|
||||
vgpu->gtt.ggtt_mm = NULL;
|
||||
}
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user