Merge 4.20-rc2 into tty-next
We want the tty/serial fixes in here as well. Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
commit
c17a1ca14c
1
.mailmap
1
.mailmap
|
@ -159,6 +159,7 @@ Peter Oruba <peter@oruba.de>
|
||||||
Peter Oruba <peter.oruba@amd.com>
|
Peter Oruba <peter.oruba@amd.com>
|
||||||
Pratyush Anand <pratyush.anand@gmail.com> <pratyush.anand@st.com>
|
Pratyush Anand <pratyush.anand@gmail.com> <pratyush.anand@st.com>
|
||||||
Praveen BP <praveenbp@ti.com>
|
Praveen BP <praveenbp@ti.com>
|
||||||
|
Punit Agrawal <punitagrawal@gmail.com> <punit.agrawal@arm.com>
|
||||||
Qais Yousef <qsyousef@gmail.com> <qais.yousef@imgtec.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> <bug-track@fisher-privat.net>
|
||||||
Oleksij Rempel <linux@rempel-privat.de> <external.Oleksij.Rempel@de.bosch.com>
|
Oleksij Rempel <linux@rempel-privat.de> <external.Oleksij.Rempel@de.bosch.com>
|
||||||
|
|
|
@ -37,8 +37,8 @@ Description:
|
||||||
0-| / \/ \/
|
0-| / \/ \/
|
||||||
+---0----1----2----3----4----5----6------------> time (s)
|
+---0----1----2----3----4----5----6------------> time (s)
|
||||||
|
|
||||||
2. To make the LED go instantly from one brigntess value to another,
|
2. To make the LED go instantly from one brightness value to another,
|
||||||
we should use use zero-time lengths (the brightness must be same as
|
we should use zero-time lengths (the brightness must be same as
|
||||||
the previous tuple's). So the format should be:
|
the previous tuple's). So the format should be:
|
||||||
"brightness_1 duration_1 brightness_1 0 brightness_2 duration_2
|
"brightness_1 duration_1 brightness_1 0 brightness_2 duration_2
|
||||||
brightness_2 0 ...". For example:
|
brightness_2 0 ...". For example:
|
||||||
|
|
|
@ -27,7 +27,7 @@ SoCs:
|
||||||
compatible = "renesas,r8a77470"
|
compatible = "renesas,r8a77470"
|
||||||
- RZ/G2M (R8A774A1)
|
- RZ/G2M (R8A774A1)
|
||||||
compatible = "renesas,r8a774a1"
|
compatible = "renesas,r8a774a1"
|
||||||
- RZ/G2E (RA8774C0)
|
- RZ/G2E (R8A774C0)
|
||||||
compatible = "renesas,r8a774c0"
|
compatible = "renesas,r8a774c0"
|
||||||
- R-Car M1A (R8A77781)
|
- R-Car M1A (R8A77781)
|
||||||
compatible = "renesas,r8a7778"
|
compatible = "renesas,r8a7778"
|
||||||
|
|
|
@ -1,8 +1,12 @@
|
||||||
I2C for OMAP platforms
|
I2C for OMAP platforms
|
||||||
|
|
||||||
Required properties :
|
Required properties :
|
||||||
- compatible : Must be "ti,omap2420-i2c", "ti,omap2430-i2c", "ti,omap3-i2c"
|
- compatible : Must be
|
||||||
or "ti,omap4-i2c"
|
"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)
|
- ti,hwmods : Must be "i2c<n>", n being the instance number (1-based)
|
||||||
- #address-cells = <1>;
|
- #address-cells = <1>;
|
||||||
- #size-cells = <0>;
|
- #size-cells = <0>;
|
||||||
|
|
|
@ -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
|
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)
|
ffff880000000000 | -120 TB | ffff887fffffffff | 0.5 TB | LDT remap for PTI
|
||||||
ffffc80000000000 | -56 TB | ffffc8ffffffffff | 1 TB | ... unused hole
|
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)
|
ffffc90000000000 | -55 TB | ffffe8ffffffffff | 32 TB | vmalloc/ioremap space (vmalloc_base)
|
||||||
ffffe90000000000 | -23 TB | ffffe9ffffffffff | 1 TB | ... unused hole
|
ffffe90000000000 | -23 TB | ffffe9ffffffffff | 1 TB | ... unused hole
|
||||||
ffffea0000000000 | -22 TB | ffffeaffffffffff | 1 TB | virtual memory map (vmemmap_base)
|
ffffea0000000000 | -22 TB | ffffeaffffffffff | 1 TB | virtual memory map (vmemmap_base)
|
||||||
ffffeb0000000000 | -21 TB | ffffebffffffffff | 1 TB | ... unused hole
|
ffffeb0000000000 | -21 TB | ffffebffffffffff | 1 TB | ... unused hole
|
||||||
ffffec0000000000 | -20 TB | fffffbffffffffff | 16 TB | KASAN shadow memory
|
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
|
fffffc0000000000 | -4 TB | fffffdffffffffff | 2 TB | ... unused hole
|
||||||
| | | | vaddr_end for KASLR
|
| | | | vaddr_end for KASLR
|
||||||
fffffe0000000000 | -2 TB | fffffe7fffffffff | 0.5 TB | cpu_entry_area mapping
|
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
|
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
|
ffffff8000000000 | -512 GB | ffffffeeffffffff | 444 GB | ... unused hole
|
||||||
ffffffef00000000 | -68 GB | fffffffeffffffff | 64 GB | EFI region mapping space
|
ffffffef00000000 | -68 GB | fffffffeffffffff | 64 GB | EFI region mapping space
|
||||||
ffffffff00000000 | -4 GB | ffffffff7fffffff | 2 GB | ... unused hole
|
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
|
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.
|
| | | | starting offset of kernel mappings.
|
||||||
__________________|____________|__________________|_________|___________________________________________________________
|
__________________|____________|__________________|_________|___________________________________________________________
|
||||||
|
|
|
|
||||||
|
@ -91,23 +92,24 @@ __________________|____________|__________________|_________|___________________
|
||||||
____________________________________________________________|___________________________________________________________
|
____________________________________________________________|___________________________________________________________
|
||||||
| | | |
|
| | | |
|
||||||
ff00000000000000 | -64 PB | ff0fffffffffffff | 4 PB | ... guard hole, also reserved for hypervisor
|
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)
|
ff10000000000000 | -60 PB | ff10ffffffffffff | 0.25 PB | LDT remap for PTI
|
||||||
ff90000000000000 | -28 PB | ff9fffffffffffff | 4 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)
|
ffa0000000000000 | -24 PB | ffd1ffffffffffff | 12.5 PB | vmalloc/ioremap space (vmalloc_base)
|
||||||
ffd2000000000000 | -11.5 PB | ffd3ffffffffffff | 0.5 PB | ... unused hole
|
ffd2000000000000 | -11.5 PB | ffd3ffffffffffff | 0.5 PB | ... unused hole
|
||||||
ffd4000000000000 | -11 PB | ffd5ffffffffffff | 0.5 PB | virtual memory map (vmemmap_base)
|
ffd4000000000000 | -11 PB | ffd5ffffffffffff | 0.5 PB | virtual memory map (vmemmap_base)
|
||||||
ffd6000000000000 | -10.5 PB | ffdeffffffffffff | 2.25 PB | ... unused hole
|
ffd6000000000000 | -10.5 PB | ffdeffffffffffff | 2.25 PB | ... unused hole
|
||||||
ffdf000000000000 | -8.25 PB | fffffdffffffffff | ~8 PB | KASAN shadow memory
|
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:
|
| 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
|
ffffff8000000000 | -512 GB | ffffffeeffffffff | 444 GB | ... unused hole
|
||||||
ffffffef00000000 | -68 GB | fffffffeffffffff | 64 GB | EFI region mapping space
|
ffffffef00000000 | -68 GB | fffffffeffffffff | 64 GB | EFI region mapping space
|
||||||
ffffffff00000000 | -4 GB | ffffffff7fffffff | 2 GB | ... unused hole
|
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
|
0C8/004 ALL ext_cmd_line_ptr cmd_line_ptr high 32bits
|
||||||
140/080 ALL edid_info Video mode setup (struct edid_info)
|
140/080 ALL edid_info Video mode setup (struct edid_info)
|
||||||
1C0/020 ALL efi_info EFI 32 information (struct efi_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
|
1E4/004 ALL scratch Scratch field for the kernel setup code
|
||||||
1E8/001 ALL e820_entries Number of entries in e820_table (below)
|
1E8/001 ALL e820_entries Number of entries in e820_table (below)
|
||||||
1E9/001 ALL eddbuf_entries Number of entries in eddbuf (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
|
HID CORE LAYER
|
||||||
M: Jiri Kosina <jikos@kernel.org>
|
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
|
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
|
S: Maintained
|
||||||
F: drivers/hid/
|
F: drivers/hid/
|
||||||
F: include/linux/hid*
|
F: include/linux/hid*
|
||||||
|
@ -6861,6 +6861,13 @@ L: linux-acpi@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/i2c/i2c-core-acpi.c
|
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
|
I2C MUXES
|
||||||
M: Peter Rosin <peda@axentia.se>
|
M: Peter Rosin <peda@axentia.se>
|
||||||
L: linux-i2c@vger.kernel.org
|
L: linux-i2c@vger.kernel.org
|
||||||
|
@ -8367,7 +8374,7 @@ F: drivers/media/dvb-frontends/lgdt3305.*
|
||||||
LIBATA PATA ARASAN COMPACT FLASH CONTROLLER
|
LIBATA PATA ARASAN COMPACT FLASH CONTROLLER
|
||||||
M: Viresh Kumar <vireshk@kernel.org>
|
M: Viresh Kumar <vireshk@kernel.org>
|
||||||
L: linux-ide@vger.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
|
S: Maintained
|
||||||
F: include/linux/pata_arasan_cf_data.h
|
F: include/linux/pata_arasan_cf_data.h
|
||||||
F: drivers/ata/pata_arasan_cf.c
|
F: drivers/ata/pata_arasan_cf.c
|
||||||
|
@ -8384,7 +8391,7 @@ F: drivers/ata/ata_generic.c
|
||||||
LIBATA PATA FARADAY FTIDE010 AND GEMINI SATA BRIDGE DRIVERS
|
LIBATA PATA FARADAY FTIDE010 AND GEMINI SATA BRIDGE DRIVERS
|
||||||
M: Linus Walleij <linus.walleij@linaro.org>
|
M: Linus Walleij <linus.walleij@linaro.org>
|
||||||
L: linux-ide@vger.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
|
S: Maintained
|
||||||
F: drivers/ata/pata_ftide010.c
|
F: drivers/ata/pata_ftide010.c
|
||||||
F: drivers/ata/sata_gemini.c
|
F: drivers/ata/sata_gemini.c
|
||||||
|
@ -8403,7 +8410,7 @@ F: include/linux/ahci_platform.h
|
||||||
LIBATA SATA PROMISE TX2/TX4 CONTROLLER DRIVER
|
LIBATA SATA PROMISE TX2/TX4 CONTROLLER DRIVER
|
||||||
M: Mikael Pettersson <mikpelinux@gmail.com>
|
M: Mikael Pettersson <mikpelinux@gmail.com>
|
||||||
L: linux-ide@vger.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
|
S: Maintained
|
||||||
F: drivers/ata/sata_promise.*
|
F: drivers/ata/sata_promise.*
|
||||||
|
|
||||||
|
@ -10784,6 +10791,14 @@ L: linux-omap@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/arm/mach-omap2/omap_hwmod.*
|
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)
|
OMAP IMAGING SUBSYSTEM (OMAP3 ISP and OMAP4 ISS)
|
||||||
M: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
M: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
|
||||||
L: linux-media@vger.kernel.org
|
L: linux-media@vger.kernel.org
|
||||||
|
@ -15436,9 +15451,9 @@ F: include/linux/usb/gadget*
|
||||||
|
|
||||||
USB HID/HIDBP DRIVERS (USB KEYBOARDS, MICE, REMOTE CONTROLS, ...)
|
USB HID/HIDBP DRIVERS (USB KEYBOARDS, MICE, REMOTE CONTROLS, ...)
|
||||||
M: Jiri Kosina <jikos@kernel.org>
|
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
|
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
|
S: Maintained
|
||||||
F: Documentation/hid/hiddev.txt
|
F: Documentation/hid/hiddev.txt
|
||||||
F: drivers/hid/usbhid/
|
F: drivers/hid/usbhid/
|
||||||
|
|
2
Makefile
2
Makefile
|
@ -2,7 +2,7 @@
|
||||||
VERSION = 4
|
VERSION = 4
|
||||||
PATCHLEVEL = 20
|
PATCHLEVEL = 20
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc1
|
EXTRAVERSION = -rc2
|
||||||
NAME = "People's Front"
|
NAME = "People's Front"
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
|
|
@ -73,9 +73,15 @@
|
||||||
})
|
})
|
||||||
|
|
||||||
#define user_termios_to_kernel_termios(k, u) \
|
#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) \
|
#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))
|
copy_to_user(u, k, sizeof(struct termios))
|
||||||
|
|
||||||
#endif /* _ALPHA_TERMIOS_H */
|
#endif /* _ALPHA_TERMIOS_H */
|
||||||
|
|
|
@ -32,6 +32,11 @@
|
||||||
#define TCXONC _IO('t', 30)
|
#define TCXONC _IO('t', 30)
|
||||||
#define TCFLSH _IO('t', 31)
|
#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 TIOCSWINSZ _IOW('t', 103, struct winsize)
|
||||||
#define TIOCGWINSZ _IOR('t', 104, struct winsize)
|
#define TIOCGWINSZ _IOR('t', 104, struct winsize)
|
||||||
#define TIOCSTART _IO('t', 110) /* start output, like ^Q */
|
#define TIOCSTART _IO('t', 110) /* start output, like ^Q */
|
||||||
|
|
|
@ -26,6 +26,19 @@ struct termios {
|
||||||
speed_t c_ospeed; /* output speed */
|
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 */
|
/* Alpha has matching termios and ktermios */
|
||||||
|
|
||||||
struct ktermios {
|
struct ktermios {
|
||||||
|
@ -152,6 +165,7 @@ struct ktermios {
|
||||||
#define B3000000 00034
|
#define B3000000 00034
|
||||||
#define B3500000 00035
|
#define B3500000 00035
|
||||||
#define B4000000 00036
|
#define B4000000 00036
|
||||||
|
#define BOTHER 00037
|
||||||
|
|
||||||
#define CSIZE 00001400
|
#define CSIZE 00001400
|
||||||
#define CS5 00000000
|
#define CS5 00000000
|
||||||
|
@ -169,6 +183,9 @@ struct ktermios {
|
||||||
#define CMSPAR 010000000000 /* mark or space (stick) parity */
|
#define CMSPAR 010000000000 /* mark or space (stick) parity */
|
||||||
#define CRTSCTS 020000000000 /* flow control */
|
#define CRTSCTS 020000000000 /* flow control */
|
||||||
|
|
||||||
|
#define CIBAUD 07600000
|
||||||
|
#define IBSHIFT 16
|
||||||
|
|
||||||
/* c_lflag bits */
|
/* c_lflag bits */
|
||||||
#define ISIG 0x00000080
|
#define ISIG 0x00000080
|
||||||
#define ICANON 0x00000100
|
#define ICANON 0x00000100
|
||||||
|
|
|
@ -55,7 +55,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
chosen {
|
chosen {
|
||||||
stdout-path = "&uart1:115200n8";
|
stdout-path = "serial0:115200n8";
|
||||||
};
|
};
|
||||||
|
|
||||||
memory@70000000 {
|
memory@70000000 {
|
||||||
|
|
|
@ -740,7 +740,7 @@
|
||||||
i2c1: i2c@21a0000 {
|
i2c1: i2c@21a0000 {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
compatible = "fs,imx6sll-i2c", "fsl,imx21-i2c";
|
compatible = "fsl,imx6sll-i2c", "fsl,imx21-i2c";
|
||||||
reg = <0x021a0000 0x4000>;
|
reg = <0x021a0000 0x4000>;
|
||||||
interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
|
interrupts = <GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
clocks = <&clks IMX6SLL_CLK_I2C1>;
|
clocks = <&clks IMX6SLL_CLK_I2C1>;
|
||||||
|
|
|
@ -117,7 +117,9 @@
|
||||||
regulator-name = "enet_3v3";
|
regulator-name = "enet_3v3";
|
||||||
regulator-min-microvolt = <3300000>;
|
regulator-min-microvolt = <3300000>;
|
||||||
regulator-max-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 {
|
reg_pcie_gpio: regulator-pcie-gpio {
|
||||||
|
@ -180,6 +182,7 @@
|
||||||
phy-supply = <®_enet_3v3>;
|
phy-supply = <®_enet_3v3>;
|
||||||
phy-mode = "rgmii";
|
phy-mode = "rgmii";
|
||||||
phy-handle = <ðphy1>;
|
phy-handle = <ðphy1>;
|
||||||
|
phy-reset-gpios = <&gpio2 7 GPIO_ACTIVE_LOW>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
mdio {
|
mdio {
|
||||||
|
@ -373,6 +376,8 @@
|
||||||
MX6SX_PAD_RGMII1_RD3__ENET1_RX_DATA_3 0x3081
|
MX6SX_PAD_RGMII1_RD3__ENET1_RX_DATA_3 0x3081
|
||||||
MX6SX_PAD_RGMII1_RX_CTL__ENET1_RX_EN 0x3081
|
MX6SX_PAD_RGMII1_RX_CTL__ENET1_RX_EN 0x3081
|
||||||
MX6SX_PAD_ENET2_RX_CLK__ENET2_REF_CLK_25M 0x91
|
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";
|
compatible = "fsl,vf610m4";
|
||||||
|
|
||||||
chosen {
|
chosen {
|
||||||
bootargs = "console=ttyLP2,115200 clk_ignore_unused init=/linuxrc rw";
|
bootargs = "clk_ignore_unused init=/linuxrc rw";
|
||||||
stdout-path = "&uart2";
|
stdout-path = "serial2:115200";
|
||||||
};
|
};
|
||||||
|
|
||||||
memory@8c000000 {
|
memory@8c000000 {
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
CONFIG_SYSVIPC=y
|
CONFIG_SYSVIPC=y
|
||||||
CONFIG_NO_HZ=y
|
CONFIG_NO_HZ=y
|
||||||
CONFIG_HIGH_RES_TIMERS=y
|
CONFIG_HIGH_RES_TIMERS=y
|
||||||
CONFIG_PREEMPT=y
|
|
||||||
CONFIG_CGROUPS=y
|
CONFIG_CGROUPS=y
|
||||||
CONFIG_BLK_DEV_INITRD=y
|
CONFIG_BLK_DEV_INITRD=y
|
||||||
CONFIG_EMBEDDED=y
|
CONFIG_EMBEDDED=y
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
#ifndef _ASM_PGTABLE_2LEVEL_H
|
#ifndef _ASM_PGTABLE_2LEVEL_H
|
||||||
#define _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
|
* Hardware-wise, we have a two level page table structure, where the first
|
||||||
|
|
|
@ -112,7 +112,7 @@ ENTRY(cpu_v7_hvc_switch_mm)
|
||||||
hvc #0
|
hvc #0
|
||||||
ldmfd sp!, {r0 - r3}
|
ldmfd sp!, {r0 - r3}
|
||||||
b cpu_v7_switch_mm
|
b cpu_v7_switch_mm
|
||||||
ENDPROC(cpu_v7_smc_switch_mm)
|
ENDPROC(cpu_v7_hvc_switch_mm)
|
||||||
#endif
|
#endif
|
||||||
ENTRY(cpu_v7_iciallu_switch_mm)
|
ENTRY(cpu_v7_iciallu_switch_mm)
|
||||||
mov r3, #0
|
mov r3, #0
|
||||||
|
|
|
@ -139,6 +139,7 @@
|
||||||
clock-names = "stmmaceth";
|
clock-names = "stmmaceth";
|
||||||
tx-fifo-depth = <16384>;
|
tx-fifo-depth = <16384>;
|
||||||
rx-fifo-depth = <16384>;
|
rx-fifo-depth = <16384>;
|
||||||
|
snps,multicast-filter-bins = <256>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -154,6 +155,7 @@
|
||||||
clock-names = "stmmaceth";
|
clock-names = "stmmaceth";
|
||||||
tx-fifo-depth = <16384>;
|
tx-fifo-depth = <16384>;
|
||||||
rx-fifo-depth = <16384>;
|
rx-fifo-depth = <16384>;
|
||||||
|
snps,multicast-filter-bins = <256>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -169,6 +171,7 @@
|
||||||
clock-names = "stmmaceth";
|
clock-names = "stmmaceth";
|
||||||
tx-fifo-depth = <16384>;
|
tx-fifo-depth = <16384>;
|
||||||
rx-fifo-depth = <16384>;
|
rx-fifo-depth = <16384>;
|
||||||
|
snps,multicast-filter-bins = <256>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -652,7 +652,7 @@
|
||||||
clock-names = "fck", "brg_int", "scif_clk";
|
clock-names = "fck", "brg_int", "scif_clk";
|
||||||
dmas = <&dmac1 0x35>, <&dmac1 0x34>,
|
dmas = <&dmac1 0x35>, <&dmac1 0x34>,
|
||||||
<&dmac2 0x35>, <&dmac2 0x34>;
|
<&dmac2 0x35>, <&dmac2 0x34>;
|
||||||
dma-names = "tx", "rx";
|
dma-names = "tx", "rx", "tx", "rx";
|
||||||
power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
|
power-domains = <&sysc R8A7795_PD_ALWAYS_ON>;
|
||||||
resets = <&cpg 518>;
|
resets = <&cpg 518>;
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
|
|
||||||
aliases {
|
aliases {
|
||||||
serial0 = &scif0;
|
serial0 = &scif0;
|
||||||
ethernet0 = &avb;
|
ethernet0 = &gether;
|
||||||
};
|
};
|
||||||
|
|
||||||
chosen {
|
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 {
|
&canfd {
|
||||||
pinctrl-0 = <&canfd0_pins>;
|
pinctrl-0 = <&canfd0_pins>;
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
|
@ -139,6 +122,23 @@
|
||||||
clock-frequency = <32768>;
|
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 {
|
&i2c0 {
|
||||||
pinctrl-0 = <&i2c0_pins>;
|
pinctrl-0 = <&i2c0_pins>;
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
|
@ -236,16 +236,17 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
&pfc {
|
&pfc {
|
||||||
avb_pins: avb {
|
|
||||||
groups = "avb_mdio", "avb_rgmii";
|
|
||||||
function = "avb";
|
|
||||||
};
|
|
||||||
|
|
||||||
canfd0_pins: canfd0 {
|
canfd0_pins: canfd0 {
|
||||||
groups = "canfd0_data_a";
|
groups = "canfd0_data_a";
|
||||||
function = "canfd0";
|
function = "canfd0";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
gether_pins: gether {
|
||||||
|
groups = "gether_mdio_a", "gether_rgmii",
|
||||||
|
"gether_txcrefclk", "gether_txcrefclk_mega";
|
||||||
|
function = "gether";
|
||||||
|
};
|
||||||
|
|
||||||
i2c0_pins: i2c0 {
|
i2c0_pins: i2c0 {
|
||||||
groups = "i2c0";
|
groups = "i2c0";
|
||||||
function = "i2c0";
|
function = "i2c0";
|
||||||
|
|
|
@ -24,6 +24,14 @@
|
||||||
#define KERNEL_DS UL(-1)
|
#define KERNEL_DS UL(-1)
|
||||||
#define USER_DS (TASK_SIZE_64 - 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__
|
#ifndef __ASSEMBLY__
|
||||||
#ifdef __KERNEL__
|
#ifdef __KERNEL__
|
||||||
|
|
||||||
|
|
|
@ -483,8 +483,6 @@ void __init arm64_memblock_init(void)
|
||||||
high_memory = __va(memblock_end_of_DRAM() - 1) + 1;
|
high_memory = __va(memblock_end_of_DRAM() - 1) + 1;
|
||||||
|
|
||||||
dma_contiguous_reserve(arm64_dma_phys_limit);
|
dma_contiguous_reserve(arm64_dma_phys_limit);
|
||||||
|
|
||||||
memblock_allow_resize();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init bootmem_init(void)
|
void __init bootmem_init(void)
|
||||||
|
|
|
@ -659,6 +659,8 @@ void __init paging_init(void)
|
||||||
|
|
||||||
memblock_free(__pa_symbol(init_pg_dir),
|
memblock_free(__pa_symbol(init_pg_dir),
|
||||||
__pa_symbol(init_pg_end) - __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
|
#ifdef CONFIG_SUN3
|
||||||
#define PTRS_PER_PTE 16
|
#define PTRS_PER_PTE 16
|
||||||
#define __PAGETABLE_PMD_FOLDED
|
#define __PAGETABLE_PMD_FOLDED 1
|
||||||
#define PTRS_PER_PMD 1
|
#define PTRS_PER_PMD 1
|
||||||
#define PTRS_PER_PGD 2048
|
#define PTRS_PER_PGD 2048
|
||||||
#elif defined(CONFIG_COLDFIRE)
|
#elif defined(CONFIG_COLDFIRE)
|
||||||
#define PTRS_PER_PTE 512
|
#define PTRS_PER_PTE 512
|
||||||
#define __PAGETABLE_PMD_FOLDED
|
#define __PAGETABLE_PMD_FOLDED 1
|
||||||
#define PTRS_PER_PMD 1
|
#define PTRS_PER_PMD 1
|
||||||
#define PTRS_PER_PGD 1024
|
#define PTRS_PER_PGD 1024
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -63,7 +63,7 @@ extern int mem_init_done;
|
||||||
|
|
||||||
#include <asm-generic/4level-fixup.h>
|
#include <asm-generic/4level-fixup.h>
|
||||||
|
|
||||||
#define __PAGETABLE_PMD_FOLDED
|
#define __PAGETABLE_PMD_FOLDED 1
|
||||||
|
|
||||||
#ifdef __KERNEL__
|
#ifdef __KERNEL__
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
|
@ -67,7 +67,7 @@ void (*cvmx_override_pko_queue_priority) (int pko_port,
|
||||||
void (*cvmx_override_ipd_port_setup) (int ipd_port);
|
void (*cvmx_override_ipd_port_setup) (int ipd_port);
|
||||||
|
|
||||||
/* Port count per interface */
|
/* 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
|
* 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;
|
void *ret;
|
||||||
|
|
||||||
ret = dma_direct_alloc_pages(dev, size, dma_handle, gfp, attrs);
|
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);
|
dma_cache_wback_inv((unsigned long) ret, size);
|
||||||
ret = (void *)UNCAC_ADDR(ret);
|
ret = (void *)UNCAC_ADDR(ret);
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
#ifndef _ASMNDS32_PGTABLE_H
|
#ifndef _ASMNDS32_PGTABLE_H
|
||||||
#define _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/4level-fixup.h>
|
||||||
#include <asm-generic/sizes.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
|
#if CONFIG_PGTABLE_LEVELS == 3
|
||||||
#define BITS_PER_PMD (PAGE_SHIFT + PMD_ORDER - BITS_PER_PMD_ENTRY)
|
#define BITS_PER_PMD (PAGE_SHIFT + PMD_ORDER - BITS_PER_PMD_ENTRY)
|
||||||
#else
|
#else
|
||||||
#define __PAGETABLE_PMD_FOLDED
|
#define __PAGETABLE_PMD_FOLDED 1
|
||||||
#define BITS_PER_PMD 0
|
#define BITS_PER_PMD 0
|
||||||
#endif
|
#endif
|
||||||
#define PTRS_PER_PMD (1UL << BITS_PER_PMD)
|
#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),-g)
|
||||||
KBUILD_CFLAGS_DECOMPRESSOR += $(if $(CONFIG_DEBUG_INFO_DWARF4), $(call cc-option, -gdwarf-4,))
|
KBUILD_CFLAGS_DECOMPRESSOR += $(if $(CONFIG_DEBUG_INFO_DWARF4), $(call cc-option, -gdwarf-4,))
|
||||||
UTS_MACHINE := s390x
|
UTS_MACHINE := s390x
|
||||||
STACK_SIZE := $(if $(CONFIG_KASAN),32768,16384)
|
STACK_SIZE := $(if $(CONFIG_KASAN),65536,16384)
|
||||||
CHECKFLAGS += -D__s390__ -D__s390x__
|
CHECKFLAGS += -D__s390__ -D__s390x__
|
||||||
|
|
||||||
export LD_BFD
|
export LD_BFD
|
||||||
|
|
|
@ -22,10 +22,10 @@ OBJCOPYFLAGS :=
|
||||||
OBJECTS := $(addprefix $(obj)/,$(obj-y))
|
OBJECTS := $(addprefix $(obj)/,$(obj-y))
|
||||||
|
|
||||||
LDFLAGS_vmlinux := --oformat $(LD_BFD) -e startup -T
|
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)
|
$(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
|
$(obj)/info.bin: vmlinux FORCE
|
||||||
$(call if_changed,objcopy)
|
$(call if_changed,objcopy)
|
||||||
|
|
||||||
|
@ -46,17 +46,17 @@ suffix-$(CONFIG_KERNEL_LZMA) := .lzma
|
||||||
suffix-$(CONFIG_KERNEL_LZO) := .lzo
|
suffix-$(CONFIG_KERNEL_LZO) := .lzo
|
||||||
suffix-$(CONFIG_KERNEL_XZ) := .xz
|
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)
|
$(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)
|
$(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)
|
$(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)
|
$(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)
|
$(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)
|
$(call if_changed,xzkern)
|
||||||
|
|
||||||
OBJCOPYFLAGS_piggy.o := -I binary -O elf64-s390 -B s390:64-bit --rename-section .data=.vmlinux.bin.compressed
|
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_PREEMPT=y
|
||||||
CONFIG_HZ_100=y
|
CONFIG_HZ_100=y
|
||||||
CONFIG_KEXEC_FILE=y
|
CONFIG_KEXEC_FILE=y
|
||||||
|
CONFIG_EXPOLINE=y
|
||||||
|
CONFIG_EXPOLINE_AUTO=y
|
||||||
CONFIG_MEMORY_HOTPLUG=y
|
CONFIG_MEMORY_HOTPLUG=y
|
||||||
CONFIG_MEMORY_HOTREMOVE=y
|
CONFIG_MEMORY_HOTREMOVE=y
|
||||||
CONFIG_KSM=y
|
CONFIG_KSM=y
|
||||||
|
@ -84,9 +86,11 @@ CONFIG_PCI_DEBUG=y
|
||||||
CONFIG_HOTPLUG_PCI=y
|
CONFIG_HOTPLUG_PCI=y
|
||||||
CONFIG_HOTPLUG_PCI_S390=y
|
CONFIG_HOTPLUG_PCI_S390=y
|
||||||
CONFIG_CHSC_SCH=y
|
CONFIG_CHSC_SCH=y
|
||||||
|
CONFIG_VFIO_AP=m
|
||||||
CONFIG_CRASH_DUMP=y
|
CONFIG_CRASH_DUMP=y
|
||||||
CONFIG_BINFMT_MISC=m
|
CONFIG_BINFMT_MISC=m
|
||||||
CONFIG_HIBERNATION=y
|
CONFIG_HIBERNATION=y
|
||||||
|
CONFIG_PM_DEBUG=y
|
||||||
CONFIG_NET=y
|
CONFIG_NET=y
|
||||||
CONFIG_PACKET=y
|
CONFIG_PACKET=y
|
||||||
CONFIG_PACKET_DIAG=m
|
CONFIG_PACKET_DIAG=m
|
||||||
|
@ -161,8 +165,6 @@ CONFIG_NF_CONNTRACK_TFTP=m
|
||||||
CONFIG_NF_CT_NETLINK=m
|
CONFIG_NF_CT_NETLINK=m
|
||||||
CONFIG_NF_CT_NETLINK_TIMEOUT=m
|
CONFIG_NF_CT_NETLINK_TIMEOUT=m
|
||||||
CONFIG_NF_TABLES=m
|
CONFIG_NF_TABLES=m
|
||||||
CONFIG_NFT_EXTHDR=m
|
|
||||||
CONFIG_NFT_META=m
|
|
||||||
CONFIG_NFT_CT=m
|
CONFIG_NFT_CT=m
|
||||||
CONFIG_NFT_COUNTER=m
|
CONFIG_NFT_COUNTER=m
|
||||||
CONFIG_NFT_LOG=m
|
CONFIG_NFT_LOG=m
|
||||||
|
@ -365,6 +367,8 @@ CONFIG_NET_ACT_SKBEDIT=m
|
||||||
CONFIG_NET_ACT_CSUM=m
|
CONFIG_NET_ACT_CSUM=m
|
||||||
CONFIG_DNS_RESOLVER=y
|
CONFIG_DNS_RESOLVER=y
|
||||||
CONFIG_OPENVSWITCH=m
|
CONFIG_OPENVSWITCH=m
|
||||||
|
CONFIG_VSOCKETS=m
|
||||||
|
CONFIG_VIRTIO_VSOCKETS=m
|
||||||
CONFIG_NETLINK_DIAG=m
|
CONFIG_NETLINK_DIAG=m
|
||||||
CONFIG_CGROUP_NET_PRIO=y
|
CONFIG_CGROUP_NET_PRIO=y
|
||||||
CONFIG_BPF_JIT=y
|
CONFIG_BPF_JIT=y
|
||||||
|
@ -461,6 +465,7 @@ CONFIG_PPTP=m
|
||||||
CONFIG_PPPOL2TP=m
|
CONFIG_PPPOL2TP=m
|
||||||
CONFIG_PPP_ASYNC=m
|
CONFIG_PPP_ASYNC=m
|
||||||
CONFIG_PPP_SYNC_TTY=m
|
CONFIG_PPP_SYNC_TTY=m
|
||||||
|
CONFIG_ISM=m
|
||||||
CONFIG_INPUT_EVDEV=y
|
CONFIG_INPUT_EVDEV=y
|
||||||
# CONFIG_INPUT_KEYBOARD is not set
|
# CONFIG_INPUT_KEYBOARD is not set
|
||||||
# CONFIG_INPUT_MOUSE is not set
|
# CONFIG_INPUT_MOUSE is not set
|
||||||
|
@ -486,9 +491,12 @@ CONFIG_MLX4_INFINIBAND=m
|
||||||
CONFIG_MLX5_INFINIBAND=m
|
CONFIG_MLX5_INFINIBAND=m
|
||||||
CONFIG_VFIO=m
|
CONFIG_VFIO=m
|
||||||
CONFIG_VFIO_PCI=m
|
CONFIG_VFIO_PCI=m
|
||||||
|
CONFIG_VFIO_MDEV=m
|
||||||
|
CONFIG_VFIO_MDEV_DEVICE=m
|
||||||
CONFIG_VIRTIO_PCI=m
|
CONFIG_VIRTIO_PCI=m
|
||||||
CONFIG_VIRTIO_BALLOON=m
|
CONFIG_VIRTIO_BALLOON=m
|
||||||
CONFIG_VIRTIO_INPUT=y
|
CONFIG_VIRTIO_INPUT=y
|
||||||
|
CONFIG_S390_AP_IOMMU=y
|
||||||
CONFIG_EXT4_FS=y
|
CONFIG_EXT4_FS=y
|
||||||
CONFIG_EXT4_FS_POSIX_ACL=y
|
CONFIG_EXT4_FS_POSIX_ACL=y
|
||||||
CONFIG_EXT4_FS_SECURITY=y
|
CONFIG_EXT4_FS_SECURITY=y
|
||||||
|
@ -615,7 +623,6 @@ CONFIG_DEBUG_CREDENTIALS=y
|
||||||
CONFIG_RCU_TORTURE_TEST=m
|
CONFIG_RCU_TORTURE_TEST=m
|
||||||
CONFIG_RCU_CPU_STALL_TIMEOUT=300
|
CONFIG_RCU_CPU_STALL_TIMEOUT=300
|
||||||
CONFIG_NOTIFIER_ERROR_INJECTION=m
|
CONFIG_NOTIFIER_ERROR_INJECTION=m
|
||||||
CONFIG_PM_NOTIFIER_ERROR_INJECT=m
|
|
||||||
CONFIG_NETDEV_NOTIFIER_ERROR_INJECT=m
|
CONFIG_NETDEV_NOTIFIER_ERROR_INJECT=m
|
||||||
CONFIG_FAULT_INJECTION=y
|
CONFIG_FAULT_INJECTION=y
|
||||||
CONFIG_FAILSLAB=y
|
CONFIG_FAILSLAB=y
|
||||||
|
@ -727,3 +734,4 @@ CONFIG_APPLDATA_BASE=y
|
||||||
CONFIG_KVM=m
|
CONFIG_KVM=m
|
||||||
CONFIG_KVM_S390_UCONTROL=y
|
CONFIG_KVM_S390_UCONTROL=y
|
||||||
CONFIG_VHOST_NET=m
|
CONFIG_VHOST_NET=m
|
||||||
|
CONFIG_VHOST_VSOCK=m
|
||||||
|
|
|
@ -65,6 +65,8 @@ CONFIG_NR_CPUS=512
|
||||||
CONFIG_NUMA=y
|
CONFIG_NUMA=y
|
||||||
CONFIG_HZ_100=y
|
CONFIG_HZ_100=y
|
||||||
CONFIG_KEXEC_FILE=y
|
CONFIG_KEXEC_FILE=y
|
||||||
|
CONFIG_EXPOLINE=y
|
||||||
|
CONFIG_EXPOLINE_AUTO=y
|
||||||
CONFIG_MEMORY_HOTPLUG=y
|
CONFIG_MEMORY_HOTPLUG=y
|
||||||
CONFIG_MEMORY_HOTREMOVE=y
|
CONFIG_MEMORY_HOTREMOVE=y
|
||||||
CONFIG_KSM=y
|
CONFIG_KSM=y
|
||||||
|
@ -82,9 +84,11 @@ CONFIG_PCI=y
|
||||||
CONFIG_HOTPLUG_PCI=y
|
CONFIG_HOTPLUG_PCI=y
|
||||||
CONFIG_HOTPLUG_PCI_S390=y
|
CONFIG_HOTPLUG_PCI_S390=y
|
||||||
CONFIG_CHSC_SCH=y
|
CONFIG_CHSC_SCH=y
|
||||||
|
CONFIG_VFIO_AP=m
|
||||||
CONFIG_CRASH_DUMP=y
|
CONFIG_CRASH_DUMP=y
|
||||||
CONFIG_BINFMT_MISC=m
|
CONFIG_BINFMT_MISC=m
|
||||||
CONFIG_HIBERNATION=y
|
CONFIG_HIBERNATION=y
|
||||||
|
CONFIG_PM_DEBUG=y
|
||||||
CONFIG_NET=y
|
CONFIG_NET=y
|
||||||
CONFIG_PACKET=y
|
CONFIG_PACKET=y
|
||||||
CONFIG_PACKET_DIAG=m
|
CONFIG_PACKET_DIAG=m
|
||||||
|
@ -159,8 +163,6 @@ CONFIG_NF_CONNTRACK_TFTP=m
|
||||||
CONFIG_NF_CT_NETLINK=m
|
CONFIG_NF_CT_NETLINK=m
|
||||||
CONFIG_NF_CT_NETLINK_TIMEOUT=m
|
CONFIG_NF_CT_NETLINK_TIMEOUT=m
|
||||||
CONFIG_NF_TABLES=m
|
CONFIG_NF_TABLES=m
|
||||||
CONFIG_NFT_EXTHDR=m
|
|
||||||
CONFIG_NFT_META=m
|
|
||||||
CONFIG_NFT_CT=m
|
CONFIG_NFT_CT=m
|
||||||
CONFIG_NFT_COUNTER=m
|
CONFIG_NFT_COUNTER=m
|
||||||
CONFIG_NFT_LOG=m
|
CONFIG_NFT_LOG=m
|
||||||
|
@ -362,6 +364,8 @@ CONFIG_NET_ACT_SKBEDIT=m
|
||||||
CONFIG_NET_ACT_CSUM=m
|
CONFIG_NET_ACT_CSUM=m
|
||||||
CONFIG_DNS_RESOLVER=y
|
CONFIG_DNS_RESOLVER=y
|
||||||
CONFIG_OPENVSWITCH=m
|
CONFIG_OPENVSWITCH=m
|
||||||
|
CONFIG_VSOCKETS=m
|
||||||
|
CONFIG_VIRTIO_VSOCKETS=m
|
||||||
CONFIG_NETLINK_DIAG=m
|
CONFIG_NETLINK_DIAG=m
|
||||||
CONFIG_CGROUP_NET_PRIO=y
|
CONFIG_CGROUP_NET_PRIO=y
|
||||||
CONFIG_BPF_JIT=y
|
CONFIG_BPF_JIT=y
|
||||||
|
@ -458,6 +462,7 @@ CONFIG_PPTP=m
|
||||||
CONFIG_PPPOL2TP=m
|
CONFIG_PPPOL2TP=m
|
||||||
CONFIG_PPP_ASYNC=m
|
CONFIG_PPP_ASYNC=m
|
||||||
CONFIG_PPP_SYNC_TTY=m
|
CONFIG_PPP_SYNC_TTY=m
|
||||||
|
CONFIG_ISM=m
|
||||||
CONFIG_INPUT_EVDEV=y
|
CONFIG_INPUT_EVDEV=y
|
||||||
# CONFIG_INPUT_KEYBOARD is not set
|
# CONFIG_INPUT_KEYBOARD is not set
|
||||||
# CONFIG_INPUT_MOUSE is not set
|
# CONFIG_INPUT_MOUSE is not set
|
||||||
|
@ -483,9 +488,12 @@ CONFIG_MLX4_INFINIBAND=m
|
||||||
CONFIG_MLX5_INFINIBAND=m
|
CONFIG_MLX5_INFINIBAND=m
|
||||||
CONFIG_VFIO=m
|
CONFIG_VFIO=m
|
||||||
CONFIG_VFIO_PCI=m
|
CONFIG_VFIO_PCI=m
|
||||||
|
CONFIG_VFIO_MDEV=m
|
||||||
|
CONFIG_VFIO_MDEV_DEVICE=m
|
||||||
CONFIG_VIRTIO_PCI=m
|
CONFIG_VIRTIO_PCI=m
|
||||||
CONFIG_VIRTIO_BALLOON=m
|
CONFIG_VIRTIO_BALLOON=m
|
||||||
CONFIG_VIRTIO_INPUT=y
|
CONFIG_VIRTIO_INPUT=y
|
||||||
|
CONFIG_S390_AP_IOMMU=y
|
||||||
CONFIG_EXT4_FS=y
|
CONFIG_EXT4_FS=y
|
||||||
CONFIG_EXT4_FS_POSIX_ACL=y
|
CONFIG_EXT4_FS_POSIX_ACL=y
|
||||||
CONFIG_EXT4_FS_SECURITY=y
|
CONFIG_EXT4_FS_SECURITY=y
|
||||||
|
@ -666,3 +674,4 @@ CONFIG_APPLDATA_BASE=y
|
||||||
CONFIG_KVM=m
|
CONFIG_KVM=m
|
||||||
CONFIG_KVM_S390_UCONTROL=y
|
CONFIG_KVM_S390_UCONTROL=y
|
||||||
CONFIG_VHOST_NET=m
|
CONFIG_VHOST_NET=m
|
||||||
|
CONFIG_VHOST_VSOCK=m
|
||||||
|
|
|
@ -26,14 +26,23 @@ CONFIG_CGROUP_CPUACCT=y
|
||||||
CONFIG_CGROUP_PERF=y
|
CONFIG_CGROUP_PERF=y
|
||||||
CONFIG_NAMESPACES=y
|
CONFIG_NAMESPACES=y
|
||||||
CONFIG_USER_NS=y
|
CONFIG_USER_NS=y
|
||||||
|
CONFIG_CHECKPOINT_RESTORE=y
|
||||||
CONFIG_BLK_DEV_INITRD=y
|
CONFIG_BLK_DEV_INITRD=y
|
||||||
CONFIG_EXPERT=y
|
CONFIG_EXPERT=y
|
||||||
# CONFIG_SYSFS_SYSCALL is not set
|
# CONFIG_SYSFS_SYSCALL is not set
|
||||||
CONFIG_CHECKPOINT_RESTORE=y
|
|
||||||
CONFIG_BPF_SYSCALL=y
|
CONFIG_BPF_SYSCALL=y
|
||||||
CONFIG_USERFAULTFD=y
|
CONFIG_USERFAULTFD=y
|
||||||
# CONFIG_COMPAT_BRK is not set
|
# CONFIG_COMPAT_BRK is not set
|
||||||
CONFIG_PROFILING=y
|
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_OPROFILE=y
|
||||||
CONFIG_KPROBES=y
|
CONFIG_KPROBES=y
|
||||||
CONFIG_JUMP_LABEL=y
|
CONFIG_JUMP_LABEL=y
|
||||||
|
@ -44,11 +53,7 @@ CONFIG_BLK_DEV_INTEGRITY=y
|
||||||
CONFIG_PARTITION_ADVANCED=y
|
CONFIG_PARTITION_ADVANCED=y
|
||||||
CONFIG_IBM_PARTITION=y
|
CONFIG_IBM_PARTITION=y
|
||||||
CONFIG_DEFAULT_DEADLINE=y
|
CONFIG_DEFAULT_DEADLINE=y
|
||||||
CONFIG_LIVEPATCH=y
|
CONFIG_BINFMT_MISC=m
|
||||||
CONFIG_NR_CPUS=256
|
|
||||||
CONFIG_NUMA=y
|
|
||||||
CONFIG_HZ_100=y
|
|
||||||
CONFIG_KEXEC_FILE=y
|
|
||||||
CONFIG_MEMORY_HOTPLUG=y
|
CONFIG_MEMORY_HOTPLUG=y
|
||||||
CONFIG_MEMORY_HOTREMOVE=y
|
CONFIG_MEMORY_HOTREMOVE=y
|
||||||
CONFIG_KSM=y
|
CONFIG_KSM=y
|
||||||
|
@ -60,9 +65,6 @@ CONFIG_ZBUD=m
|
||||||
CONFIG_ZSMALLOC=m
|
CONFIG_ZSMALLOC=m
|
||||||
CONFIG_ZSMALLOC_STAT=y
|
CONFIG_ZSMALLOC_STAT=y
|
||||||
CONFIG_IDLE_PAGE_TRACKING=y
|
CONFIG_IDLE_PAGE_TRACKING=y
|
||||||
CONFIG_CRASH_DUMP=y
|
|
||||||
CONFIG_BINFMT_MISC=m
|
|
||||||
CONFIG_HIBERNATION=y
|
|
||||||
CONFIG_NET=y
|
CONFIG_NET=y
|
||||||
CONFIG_PACKET=y
|
CONFIG_PACKET=y
|
||||||
CONFIG_UNIX=y
|
CONFIG_UNIX=y
|
||||||
|
@ -98,6 +100,7 @@ CONFIG_BLK_DEV_NBD=m
|
||||||
CONFIG_BLK_DEV_RAM=y
|
CONFIG_BLK_DEV_RAM=y
|
||||||
CONFIG_VIRTIO_BLK=y
|
CONFIG_VIRTIO_BLK=y
|
||||||
CONFIG_SCSI=y
|
CONFIG_SCSI=y
|
||||||
|
# CONFIG_SCSI_MQ_DEFAULT is not set
|
||||||
CONFIG_BLK_DEV_SD=y
|
CONFIG_BLK_DEV_SD=y
|
||||||
CONFIG_CHR_DEV_ST=y
|
CONFIG_CHR_DEV_ST=y
|
||||||
CONFIG_BLK_DEV_SR=y
|
CONFIG_BLK_DEV_SR=y
|
||||||
|
@ -131,6 +134,7 @@ CONFIG_EQUALIZER=m
|
||||||
CONFIG_TUN=m
|
CONFIG_TUN=m
|
||||||
CONFIG_VIRTIO_NET=y
|
CONFIG_VIRTIO_NET=y
|
||||||
# CONFIG_NET_VENDOR_ALACRITECH is not set
|
# CONFIG_NET_VENDOR_ALACRITECH is not set
|
||||||
|
# CONFIG_NET_VENDOR_AURORA is not set
|
||||||
# CONFIG_NET_VENDOR_CORTINA is not set
|
# CONFIG_NET_VENDOR_CORTINA is not set
|
||||||
# CONFIG_NET_VENDOR_SOLARFLARE is not set
|
# CONFIG_NET_VENDOR_SOLARFLARE is not set
|
||||||
# CONFIG_NET_VENDOR_SOCIONEXT is not set
|
# CONFIG_NET_VENDOR_SOCIONEXT is not set
|
||||||
|
@ -157,33 +161,6 @@ CONFIG_TMPFS=y
|
||||||
CONFIG_TMPFS_POSIX_ACL=y
|
CONFIG_TMPFS_POSIX_ACL=y
|
||||||
CONFIG_HUGETLBFS=y
|
CONFIG_HUGETLBFS=y
|
||||||
# CONFIG_NETWORK_FILESYSTEMS is not set
|
# 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_CRYPTD=m
|
||||||
CONFIG_CRYPTO_AUTHENC=m
|
CONFIG_CRYPTO_AUTHENC=m
|
||||||
CONFIG_CRYPTO_TEST=m
|
CONFIG_CRYPTO_TEST=m
|
||||||
|
@ -193,6 +170,7 @@ CONFIG_CRYPTO_CBC=y
|
||||||
CONFIG_CRYPTO_CFB=m
|
CONFIG_CRYPTO_CFB=m
|
||||||
CONFIG_CRYPTO_CTS=m
|
CONFIG_CRYPTO_CTS=m
|
||||||
CONFIG_CRYPTO_LRW=m
|
CONFIG_CRYPTO_LRW=m
|
||||||
|
CONFIG_CRYPTO_OFB=m
|
||||||
CONFIG_CRYPTO_PCBC=m
|
CONFIG_CRYPTO_PCBC=m
|
||||||
CONFIG_CRYPTO_XTS=m
|
CONFIG_CRYPTO_XTS=m
|
||||||
CONFIG_CRYPTO_CMAC=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_SKCIPHER=m
|
||||||
CONFIG_CRYPTO_USER_API_RNG=m
|
CONFIG_CRYPTO_USER_API_RNG=m
|
||||||
CONFIG_ZCRYPT=m
|
CONFIG_ZCRYPT=m
|
||||||
CONFIG_ZCRYPT_MULTIDEVNODES=y
|
|
||||||
CONFIG_PKEY=m
|
CONFIG_PKEY=m
|
||||||
CONFIG_CRYPTO_PAES_S390=m
|
CONFIG_CRYPTO_PAES_S390=m
|
||||||
CONFIG_CRYPTO_SHA1_S390=m
|
CONFIG_CRYPTO_SHA1_S390=m
|
||||||
|
@ -247,4 +224,30 @@ CONFIG_CRC7=m
|
||||||
# CONFIG_XZ_DEC_ARM is not set
|
# CONFIG_XZ_DEC_ARM is not set
|
||||||
# CONFIG_XZ_DEC_ARMTHUMB is not set
|
# CONFIG_XZ_DEC_ARMTHUMB is not set
|
||||||
# CONFIG_XZ_DEC_SPARC 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_limit = STACK_TOP_MAX;
|
||||||
mm->context.asce = __pa(mm->pgd) | _ASCE_TABLE_LENGTH |
|
mm->context.asce = __pa(mm->pgd) | _ASCE_TABLE_LENGTH |
|
||||||
_ASCE_USER_BITS | _ASCE_TYPE_REGION3;
|
_ASCE_USER_BITS | _ASCE_TYPE_REGION3;
|
||||||
/* pgd_alloc() did not account this pud */
|
|
||||||
mm_inc_nr_puds(mm);
|
|
||||||
break;
|
break;
|
||||||
case -PAGE_SIZE:
|
case -PAGE_SIZE:
|
||||||
/* forked 5-level task, set new asce with new_mm->pgd */
|
/* 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 */
|
/* forked 2-level compat task, set new asce with new mm->pgd */
|
||||||
mm->context.asce = __pa(mm->pgd) | _ASCE_TABLE_LENGTH |
|
mm->context.asce = __pa(mm->pgd) | _ASCE_TABLE_LENGTH |
|
||||||
_ASCE_USER_BITS | _ASCE_TYPE_SEGMENT;
|
_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));
|
crst_table_init((unsigned long *) mm->pgd, pgd_entry_type(mm));
|
||||||
return 0;
|
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)
|
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;
|
return _SEGMENT_ENTRY_EMPTY;
|
||||||
if (mm->context.asce_limit <= _REGION2_SIZE)
|
if (mm_pud_folded(mm))
|
||||||
return _REGION3_ENTRY_EMPTY;
|
return _REGION3_ENTRY_EMPTY;
|
||||||
if (mm->context.asce_limit <= _REGION1_SIZE)
|
if (mm_p4d_folded(mm))
|
||||||
return _REGION2_ENTRY_EMPTY;
|
return _REGION2_ENTRY_EMPTY;
|
||||||
return _REGION1_ENTRY_EMPTY;
|
return _REGION1_ENTRY_EMPTY;
|
||||||
}
|
}
|
||||||
|
|
|
@ -493,6 +493,24 @@ static inline int is_module_addr(void *addr)
|
||||||
_REGION_ENTRY_PROTECT | \
|
_REGION_ENTRY_PROTECT | \
|
||||||
_REGION_ENTRY_NOEXEC)
|
_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)
|
static inline int mm_has_pgste(struct mm_struct *mm)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_PGSTE
|
#ifdef CONFIG_PGSTE
|
||||||
|
|
|
@ -236,7 +236,7 @@ static inline unsigned long current_stack_pointer(void)
|
||||||
return sp;
|
return sp;
|
||||||
}
|
}
|
||||||
|
|
||||||
static __no_sanitize_address_or_inline unsigned short stap(void)
|
static __no_kasan_or_inline unsigned short stap(void)
|
||||||
{
|
{
|
||||||
unsigned short cpu_address;
|
unsigned short cpu_address;
|
||||||
|
|
||||||
|
@ -330,7 +330,7 @@ static inline void __load_psw(psw_t psw)
|
||||||
* Set PSW mask to specified value, while leaving the
|
* Set PSW mask to specified value, while leaving the
|
||||||
* PSW addr pointing to the next instruction.
|
* PSW addr pointing to the next instruction.
|
||||||
*/
|
*/
|
||||||
static __no_sanitize_address_or_inline void __load_psw_mask(unsigned long mask)
|
static __no_kasan_or_inline void __load_psw_mask(unsigned long mask)
|
||||||
{
|
{
|
||||||
unsigned long addr;
|
unsigned long addr;
|
||||||
psw_t psw;
|
psw_t psw;
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
* General size of kernel stacks
|
* General size of kernel stacks
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_KASAN
|
#ifdef CONFIG_KASAN
|
||||||
#define THREAD_SIZE_ORDER 3
|
#define THREAD_SIZE_ORDER 4
|
||||||
#else
|
#else
|
||||||
#define THREAD_SIZE_ORDER 2
|
#define THREAD_SIZE_ORDER 2
|
||||||
#endif
|
#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,
|
static inline void pmd_free_tlb(struct mmu_gather *tlb, pmd_t *pmd,
|
||||||
unsigned long address)
|
unsigned long address)
|
||||||
{
|
{
|
||||||
if (tlb->mm->context.asce_limit <= _REGION3_SIZE)
|
if (mm_pmd_folded(tlb->mm))
|
||||||
return;
|
return;
|
||||||
pgtable_pmd_page_dtor(virt_to_page(pmd));
|
pgtable_pmd_page_dtor(virt_to_page(pmd));
|
||||||
tlb_remove_table(tlb, 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,
|
static inline void p4d_free_tlb(struct mmu_gather *tlb, p4d_t *p4d,
|
||||||
unsigned long address)
|
unsigned long address)
|
||||||
{
|
{
|
||||||
if (tlb->mm->context.asce_limit <= _REGION1_SIZE)
|
if (mm_p4d_folded(tlb->mm))
|
||||||
return;
|
return;
|
||||||
tlb_remove_table(tlb, p4d);
|
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,
|
static inline void pud_free_tlb(struct mmu_gather *tlb, pud_t *pud,
|
||||||
unsigned long address)
|
unsigned long address)
|
||||||
{
|
{
|
||||||
if (tlb->mm->context.asce_limit <= _REGION2_SIZE)
|
if (mm_pud_folded(tlb->mm))
|
||||||
return;
|
return;
|
||||||
tlb_remove_table(tlb, pud);
|
tlb_remove_table(tlb, pud);
|
||||||
}
|
}
|
||||||
|
|
|
@ -236,10 +236,10 @@ ENTRY(__switch_to)
|
||||||
stmg %r6,%r15,__SF_GPRS(%r15) # store gprs of prev task
|
stmg %r6,%r15,__SF_GPRS(%r15) # store gprs of prev task
|
||||||
lghi %r4,__TASK_stack
|
lghi %r4,__TASK_stack
|
||||||
lghi %r1,__TASK_thread
|
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
|
stg %r15,__THREAD_ksp(%r1,%r2) # store kernel stack of prev
|
||||||
lgr %r15,%r5
|
lg %r15,0(%r4,%r3) # start of kernel stack of next
|
||||||
aghi %r15,STACK_INIT # end of kernel stack of next
|
agr %r15,%r5 # end of kernel stack of next
|
||||||
stg %r3,__LC_CURRENT # store task struct of next
|
stg %r3,__LC_CURRENT # store task struct of next
|
||||||
stg %r15,__LC_KERNEL_STACK # store end of kernel stack
|
stg %r15,__LC_KERNEL_STACK # store end of kernel stack
|
||||||
lg %r15,__THREAD_ksp(%r1,%r3) # load kernel stack of next
|
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;
|
return -ENOENT;
|
||||||
|
|
||||||
if (ev > PERF_CPUM_CF_MAX_CTR)
|
if (ev > PERF_CPUM_CF_MAX_CTR)
|
||||||
return -EINVAL;
|
return -ENOENT;
|
||||||
|
|
||||||
/* Obtain the counter set to which the specified counter belongs */
|
/* Obtain the counter set to which the specified counter belongs */
|
||||||
set = get_counter_set(ev);
|
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, PERF_EVENT_CPUM_SF);
|
||||||
CPUMF_EVENT_ATTR(SF, SF_CYCLES_BASIC_DIAG, PERF_EVENT_CPUM_SF_DIAG);
|
CPUMF_EVENT_ATTR(SF, SF_CYCLES_BASIC_DIAG, PERF_EVENT_CPUM_SF_DIAG);
|
||||||
|
|
||||||
static struct attribute *cpumsf_pmu_events_attr[] = {
|
/* Attribute list for CPU_SF.
|
||||||
CPUMF_EVENT_PTR(SF, SF_CYCLES_BASIC),
|
*
|
||||||
NULL,
|
* The availablitiy depends on the CPU_MF sampling facility authorization
|
||||||
NULL,
|
* 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");
|
PMU_FORMAT_ATTR(event, "config:0-63");
|
||||||
|
@ -2040,7 +2060,10 @@ static int __init init_cpum_sampling_pmu(void)
|
||||||
|
|
||||||
if (si.ad) {
|
if (si.ad) {
|
||||||
sfb_set_limits(CPUM_SF_MIN_SDB, CPUM_SF_MAX_SDB);
|
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);
|
CPUMF_EVENT_PTR(SF, SF_CYCLES_BASIC_DIAG);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,7 @@ KASAN_SANITIZE := n
|
||||||
$(obj)/vdso32_wrapper.o : $(obj)/vdso32.so
|
$(obj)/vdso32_wrapper.o : $(obj)/vdso32.so
|
||||||
|
|
||||||
# link rule for the .so file, .lds has to be first
|
# 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)
|
$(call if_changed,vdso32ld)
|
||||||
|
|
||||||
# strip rule for the .so file
|
# strip rule for the .so file
|
||||||
|
@ -46,12 +46,12 @@ $(obj)/%.so: $(obj)/%.so.dbg FORCE
|
||||||
$(call if_changed,objcopy)
|
$(call if_changed,objcopy)
|
||||||
|
|
||||||
# assembly rules for the .S files
|
# assembly rules for the .S files
|
||||||
$(obj-vdso32): %.o: %.S
|
$(obj-vdso32): %.o: %.S FORCE
|
||||||
$(call if_changed_dep,vdso32as)
|
$(call if_changed_dep,vdso32as)
|
||||||
|
|
||||||
# actual build commands
|
# actual build commands
|
||||||
quiet_cmd_vdso32ld = VDSO32L $@
|
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 $@
|
quiet_cmd_vdso32as = VDSO32A $@
|
||||||
cmd_vdso32as = $(CC) $(a_flags) -c -o $@ $<
|
cmd_vdso32as = $(CC) $(a_flags) -c -o $@ $<
|
||||||
|
|
||||||
|
|
|
@ -37,7 +37,7 @@ KASAN_SANITIZE := n
|
||||||
$(obj)/vdso64_wrapper.o : $(obj)/vdso64.so
|
$(obj)/vdso64_wrapper.o : $(obj)/vdso64.so
|
||||||
|
|
||||||
# link rule for the .so file, .lds has to be first
|
# 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)
|
$(call if_changed,vdso64ld)
|
||||||
|
|
||||||
# strip rule for the .so file
|
# strip rule for the .so file
|
||||||
|
@ -46,12 +46,12 @@ $(obj)/%.so: $(obj)/%.so.dbg FORCE
|
||||||
$(call if_changed,objcopy)
|
$(call if_changed,objcopy)
|
||||||
|
|
||||||
# assembly rules for the .S files
|
# assembly rules for the .S files
|
||||||
$(obj-vdso64): %.o: %.S
|
$(obj-vdso64): %.o: %.S FORCE
|
||||||
$(call if_changed_dep,vdso64as)
|
$(call if_changed_dep,vdso64as)
|
||||||
|
|
||||||
# actual build commands
|
# actual build commands
|
||||||
quiet_cmd_vdso64ld = VDSO64L $@
|
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 $@
|
quiet_cmd_vdso64as = VDSO64A $@
|
||||||
cmd_vdso64as = $(CC) $(a_flags) -c -o $@ $<
|
cmd_vdso64as = $(CC) $(a_flags) -c -o $@ $<
|
||||||
|
|
||||||
|
|
|
@ -154,14 +154,14 @@ SECTIONS
|
||||||
* uncompressed image info used by the decompressor
|
* uncompressed image info used by the decompressor
|
||||||
* it should match struct vmlinux_info
|
* it should match struct vmlinux_info
|
||||||
*/
|
*/
|
||||||
.vmlinux.info 0 : {
|
.vmlinux.info 0 (INFO) : {
|
||||||
QUAD(_stext) /* default_lma */
|
QUAD(_stext) /* default_lma */
|
||||||
QUAD(startup_continue) /* entry */
|
QUAD(startup_continue) /* entry */
|
||||||
QUAD(__bss_start - _stext) /* image_size */
|
QUAD(__bss_start - _stext) /* image_size */
|
||||||
QUAD(__bss_stop - __bss_start) /* bss_size */
|
QUAD(__bss_stop - __bss_start) /* bss_size */
|
||||||
QUAD(__boot_data_start) /* bootdata_off */
|
QUAD(__boot_data_start) /* bootdata_off */
|
||||||
QUAD(__boot_data_end - __boot_data_start) /* bootdata_size */
|
QUAD(__boot_data_end - __boot_data_start) /* bootdata_size */
|
||||||
}
|
} :NONE
|
||||||
|
|
||||||
/* Debugging sections. */
|
/* Debugging sections. */
|
||||||
STABS_DEBUG
|
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_limit = _REGION1_SIZE;
|
||||||
mm->context.asce = __pa(mm->pgd) | _ASCE_TABLE_LENGTH |
|
mm->context.asce = __pa(mm->pgd) | _ASCE_TABLE_LENGTH |
|
||||||
_ASCE_USER_BITS | _ASCE_TYPE_REGION2;
|
_ASCE_USER_BITS | _ASCE_TYPE_REGION2;
|
||||||
|
mm_inc_nr_puds(mm);
|
||||||
} else {
|
} else {
|
||||||
crst_table_init(table, _REGION1_ENTRY_EMPTY);
|
crst_table_init(table, _REGION1_ENTRY_EMPTY);
|
||||||
pgd_populate(mm, (pgd_t *) table, (p4d_t *) pgd);
|
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;
|
return mode->distance ? mode->distance(a, b) : 0;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(__node_distance);
|
||||||
|
|
||||||
int numa_debug_enabled;
|
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;
|
io_req->fds[0] = dev->cow.fd;
|
||||||
else
|
else
|
||||||
io_req->fds[0] = dev->fd;
|
io_req->fds[0] = dev->fd;
|
||||||
|
io_req->error = 0;
|
||||||
|
|
||||||
if (req_op(req) == REQ_OP_FLUSH) {
|
if (req_op(req) == REQ_OP_FLUSH) {
|
||||||
io_req->op = UBD_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->cow_offset = -1;
|
||||||
io_req->offset = off;
|
io_req->offset = off;
|
||||||
io_req->length = bvec->bv_len;
|
io_req->length = bvec->bv_len;
|
||||||
io_req->error = 0;
|
|
||||||
io_req->sector_mask = 0;
|
io_req->sector_mask = 0;
|
||||||
|
|
||||||
io_req->op = rq_data_dir(req) == READ ? UBD_READ : UBD_WRITE;
|
io_req->op = rq_data_dir(req) == READ ? UBD_READ : UBD_WRITE;
|
||||||
io_req->offsets[0] = 0;
|
io_req->offsets[0] = 0;
|
||||||
io_req->offsets[1] = dev->cow.data_offset;
|
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,
|
static blk_status_t ubd_queue_rq(struct blk_mq_hw_ctx *hctx,
|
||||||
const struct blk_mq_queue_data *bd)
|
const struct blk_mq_queue_data *bd)
|
||||||
{
|
{
|
||||||
|
struct ubd *ubd_dev = hctx->queue->queuedata;
|
||||||
struct request *req = bd->rq;
|
struct request *req = bd->rq;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
blk_mq_start_request(req);
|
blk_mq_start_request(req);
|
||||||
|
|
||||||
|
spin_lock_irq(&ubd_dev->lock);
|
||||||
|
|
||||||
if (req_op(req) == REQ_OP_FLUSH) {
|
if (req_op(req) == REQ_OP_FLUSH) {
|
||||||
ret = ubd_queue_one_vec(hctx, req, 0, NULL);
|
ret = ubd_queue_one_vec(hctx, req, 0, NULL);
|
||||||
} else {
|
} else {
|
||||||
|
@ -1361,9 +1363,11 @@ static blk_status_t ubd_queue_rq(struct blk_mq_hw_ctx *hctx,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
if (ret < 0) {
|
spin_unlock_irq(&ubd_dev->lock);
|
||||||
|
|
||||||
|
if (ret < 0)
|
||||||
blk_mq_requeue_request(req, true);
|
blk_mq_requeue_request(req, true);
|
||||||
}
|
|
||||||
return BLK_STS_OK;
|
return BLK_STS_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -525,7 +525,6 @@ config X86_VSMP
|
||||||
bool "ScaleMP vSMP"
|
bool "ScaleMP vSMP"
|
||||||
select HYPERVISOR_GUEST
|
select HYPERVISOR_GUEST
|
||||||
select PARAVIRT
|
select PARAVIRT
|
||||||
select PARAVIRT_XXL
|
|
||||||
depends on X86_64 && PCI
|
depends on X86_64 && PCI
|
||||||
depends on X86_EXTENDED_PLATFORM
|
depends on X86_EXTENDED_PLATFORM
|
||||||
depends on SMP
|
depends on SMP
|
||||||
|
|
|
@ -213,8 +213,6 @@ ifdef CONFIG_X86_64
|
||||||
KBUILD_LDFLAGS += $(call ld-option, -z max-page-size=0x200000)
|
KBUILD_LDFLAGS += $(call ld-option, -z max-page-size=0x200000)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Speed up the build
|
|
||||||
KBUILD_CFLAGS += -pipe
|
|
||||||
# Workaround for a gcc prelease that unfortunately was shipped in a suse release
|
# Workaround for a gcc prelease that unfortunately was shipped in a suse release
|
||||||
KBUILD_CFLAGS += -Wno-sign-compare
|
KBUILD_CFLAGS += -Wno-sign-compare
|
||||||
#
|
#
|
||||||
|
@ -239,7 +237,7 @@ archheaders:
|
||||||
archmacros:
|
archmacros:
|
||||||
$(Q)$(MAKE) $(build)=arch/x86/kernel arch/x86/kernel/macros.s
|
$(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
|
export ASM_MACRO_FLAGS
|
||||||
KBUILD_CFLAGS += $(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);
|
int mce_available(struct cpuinfo_x86 *c);
|
||||||
bool mce_is_memory_error(struct mce *m);
|
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_exception_count);
|
||||||
DECLARE_PER_CPU(unsigned, mce_poll_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");
|
: "cc");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
return hv_status;
|
return hv_status;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -33,12 +33,14 @@
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set __PAGE_OFFSET to the most negative possible address +
|
* Set __PAGE_OFFSET to the most negative possible address +
|
||||||
* PGDIR_SIZE*16 (pgd slot 272). The gap is to allow a space for a
|
* PGDIR_SIZE*17 (pgd slot 273).
|
||||||
* hypervisor to fit. Choosing 16 slots here is arbitrary, but it's
|
*
|
||||||
* what Xen requires.
|
* 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_L5 _AC(0xff11000000000000, UL)
|
||||||
#define __PAGE_OFFSET_BASE_L4 _AC(0xffff880000000000, UL)
|
#define __PAGE_OFFSET_BASE_L4 _AC(0xffff888000000000, UL)
|
||||||
|
|
||||||
#ifdef CONFIG_DYNAMIC_MEMORY_LAYOUT
|
#ifdef CONFIG_DYNAMIC_MEMORY_LAYOUT
|
||||||
#define __PAGE_OFFSET page_offset_base
|
#define __PAGE_OFFSET page_offset_base
|
||||||
|
|
|
@ -111,9 +111,7 @@ extern unsigned int ptrs_per_p4d;
|
||||||
*/
|
*/
|
||||||
#define MAXMEM (1UL << MAX_PHYSMEM_BITS)
|
#define MAXMEM (1UL << MAX_PHYSMEM_BITS)
|
||||||
|
|
||||||
#define LDT_PGD_ENTRY_L4 -3UL
|
#define LDT_PGD_ENTRY -240UL
|
||||||
#define LDT_PGD_ENTRY_L5 -112UL
|
|
||||||
#define LDT_PGD_ENTRY (pgtable_l5_enabled() ? LDT_PGD_ENTRY_L5 : LDT_PGD_ENTRY_L4)
|
|
||||||
#define LDT_BASE_ADDR (LDT_PGD_ENTRY << PGDIR_SHIFT)
|
#define LDT_BASE_ADDR (LDT_PGD_ENTRY << PGDIR_SHIFT)
|
||||||
#define LDT_END_ADDR (LDT_BASE_ADDR + PGDIR_SIZE)
|
#define LDT_END_ADDR (LDT_BASE_ADDR + PGDIR_SIZE)
|
||||||
|
|
||||||
|
|
|
@ -13,12 +13,15 @@
|
||||||
#define queued_fetch_set_pending_acquire queued_fetch_set_pending_acquire
|
#define queued_fetch_set_pending_acquire queued_fetch_set_pending_acquire
|
||||||
static __always_inline u32 queued_fetch_set_pending_acquire(struct qspinlock *lock)
|
static __always_inline u32 queued_fetch_set_pending_acquire(struct qspinlock *lock)
|
||||||
{
|
{
|
||||||
u32 val = 0;
|
u32 val;
|
||||||
|
|
||||||
if (GEN_BINARY_RMWcc(LOCK_PREFIX "btsl", lock->val.counter, c,
|
|
||||||
"I", _Q_PENDING_OFFSET))
|
|
||||||
val |= _Q_PENDING_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;
|
val |= atomic_read(&lock->val) & ~_Q_PENDING_MASK;
|
||||||
|
|
||||||
return val;
|
return val;
|
||||||
|
|
|
@ -9,7 +9,7 @@
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
|
|
||||||
#include <linux/uaccess.h>
|
#include <asm/extable.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
#include <asm/pgtable.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)
|
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
|
#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
|
* be somewhat complicated (e.g. segment offset would require an instruction
|
||||||
* parser). So only support physical addresses up to page granuality for now.
|
* 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))
|
if (!(m->status & MCI_STATUS_ADDRV))
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -505,6 +505,7 @@ static int mce_usable_address(struct mce *m)
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(mce_usable_address);
|
||||||
|
|
||||||
bool mce_is_memory_error(struct mce *m)
|
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);
|
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)
|
if (m->cpuvendor == X86_VENDOR_AMD && m->status & MCI_STATUS_DEFERRED)
|
||||||
return false;
|
return false;
|
||||||
|
@ -547,6 +548,7 @@ static bool mce_is_correctable(struct mce *m)
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(mce_is_correctable);
|
||||||
|
|
||||||
static bool cec_add_mce(struct mce *m)
|
static bool cec_add_mce(struct mce *m)
|
||||||
{
|
{
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/irq.h>
|
#include <linux/irq.h>
|
||||||
#include <linux/kexec.h>
|
#include <linux/kexec.h>
|
||||||
|
#include <linux/i8253.h>
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/hypervisor.h>
|
#include <asm/hypervisor.h>
|
||||||
#include <asm/hyperv-tlfs.h>
|
#include <asm/hyperv-tlfs.h>
|
||||||
|
@ -295,6 +296,16 @@ static void __init ms_hyperv_init_platform(void)
|
||||||
if (efi_enabled(EFI_BOOT))
|
if (efi_enabled(EFI_BOOT))
|
||||||
x86_platform.get_nmi_reason = hv_get_nmi_reason;
|
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)
|
#if IS_ENABLED(CONFIG_HYPERV)
|
||||||
/*
|
/*
|
||||||
* Setup the hook to get control post apic initialization.
|
* 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);
|
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;
|
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
|
* If PTI is enabled, this maps the LDT into the kernelmode and
|
||||||
* usermode tables for the given mm.
|
* 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
|
static int
|
||||||
map_ldt_struct(struct mm_struct *mm, struct ldt_struct *ldt, int slot)
|
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;
|
unsigned long va;
|
||||||
bool is_vmalloc;
|
bool is_vmalloc;
|
||||||
spinlock_t *ptl;
|
spinlock_t *ptl;
|
||||||
pgd_t *pgd;
|
int i, nr_pages;
|
||||||
int i;
|
|
||||||
|
|
||||||
if (!static_cpu_has(X86_FEATURE_PTI))
|
if (!static_cpu_has(X86_FEATURE_PTI))
|
||||||
return 0;
|
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 */
|
/* Check if the current mappings are sane */
|
||||||
sanity_check_ldt_mapping(mm);
|
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);
|
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;
|
unsigned long offset = i << PAGE_SHIFT;
|
||||||
const void *src = (char *)ldt->entries + offset;
|
const void *src = (char *)ldt->entries + offset;
|
||||||
unsigned long pfn;
|
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 */
|
/* Propagate LDT mapping to the user page-table */
|
||||||
map_ldt_struct_to_user(mm);
|
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;
|
ldt->slot = slot;
|
||||||
return 0;
|
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 */
|
#else /* !CONFIG_PAGE_TABLE_ISOLATION */
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -286,6 +298,10 @@ map_ldt_struct(struct mm_struct *mm, struct ldt_struct *ldt, int slot)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void unmap_ldt_struct(struct mm_struct *mm, struct ldt_struct *ldt)
|
||||||
|
{
|
||||||
|
}
|
||||||
#endif /* CONFIG_PAGE_TABLE_ISOLATION */
|
#endif /* CONFIG_PAGE_TABLE_ISOLATION */
|
||||||
|
|
||||||
static void free_ldt_pgtables(struct mm_struct *mm)
|
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);
|
install_ldt(mm, new_ldt);
|
||||||
|
unmap_ldt_struct(mm, old_ldt);
|
||||||
free_ldt_struct(old_ldt);
|
free_ldt_struct(old_ldt);
|
||||||
error = 0;
|
error = 0;
|
||||||
|
|
||||||
|
|
|
@ -26,65 +26,8 @@
|
||||||
|
|
||||||
#define TOPOLOGY_REGISTER_OFFSET 0x10
|
#define TOPOLOGY_REGISTER_OFFSET 0x10
|
||||||
|
|
||||||
#if defined CONFIG_PCI && defined CONFIG_PARAVIRT_XXL
|
#ifdef CONFIG_PCI
|
||||||
/*
|
static void __init set_vsmp_ctl(void)
|
||||||
* 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)
|
|
||||||
{
|
{
|
||||||
void __iomem *address;
|
void __iomem *address;
|
||||||
unsigned int cap, ctl, cfg;
|
unsigned int cap, ctl, cfg;
|
||||||
|
@ -109,28 +52,12 @@ static void __init set_vsmp_pv_ops(void)
|
||||||
}
|
}
|
||||||
#endif
|
#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);
|
writel(ctl, address + 4);
|
||||||
ctl = readl(address + 4);
|
ctl = readl(address + 4);
|
||||||
pr_info("vSMP CTL: control set to:0x%08x\n", ctl);
|
pr_info("vSMP CTL: control set to:0x%08x\n", ctl);
|
||||||
|
|
||||||
early_iounmap(address, 8);
|
early_iounmap(address, 8);
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
static void __init set_vsmp_pv_ops(void)
|
|
||||||
{
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef CONFIG_PCI
|
|
||||||
static int is_vsmp = -1;
|
static int is_vsmp = -1;
|
||||||
|
|
||||||
static void __init detect_vsmp_box(void)
|
static void __init detect_vsmp_box(void)
|
||||||
|
@ -164,11 +91,14 @@ static int is_vsmp_box(void)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
static void __init set_vsmp_ctl(void)
|
||||||
|
{
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void __init vsmp_cap_cpus(void)
|
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;
|
void __iomem *address;
|
||||||
unsigned int cfg, topology, node_shift, maxcpus;
|
unsigned int cfg, topology, node_shift, maxcpus;
|
||||||
|
|
||||||
|
@ -221,6 +151,6 @@ void __init vsmp_init(void)
|
||||||
|
|
||||||
vsmp_cap_cpus();
|
vsmp_cap_cpus();
|
||||||
|
|
||||||
set_vsmp_pv_ops();
|
set_vsmp_ctl();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1905,7 +1905,7 @@ void __init xen_setup_kernel_pagetable(pgd_t *pgd, unsigned long max_pfn)
|
||||||
init_top_pgt[0] = __pgd(0);
|
init_top_pgt[0] = __pgd(0);
|
||||||
|
|
||||||
/* Pre-constructed entries are in pfn, so convert to mfn */
|
/* 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 */
|
/* L4[511] -> level3_kernel_pgt */
|
||||||
convert_pfn_mfn(init_top_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[0] = (unsigned long)pgd;
|
||||||
addr[1] = (unsigned long)l3;
|
addr[1] = (unsigned long)l3;
|
||||||
addr[2] = (unsigned long)l2;
|
addr[2] = (unsigned long)l2;
|
||||||
/* Graft it onto L4[272][0]. Note that we creating an aliasing problem:
|
/* Graft it onto L4[273][0]. Note that we creating an aliasing problem:
|
||||||
* Both L4[272][0] and L4[511][510] have entries that point to the same
|
* 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
|
* 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
|
* 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
|
* 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.
|
* The interface requires atomic updates on p2m elements.
|
||||||
* xen_safe_write_ulong() is using __put_user which does an atomic
|
* xen_safe_write_ulong() is using an atomic store via asm().
|
||||||
* store via asm().
|
|
||||||
*/
|
*/
|
||||||
if (likely(!xen_safe_write_ulong(xen_p2m_addr + pfn, mfn)))
|
if (likely(!xen_safe_write_ulong(xen_p2m_addr + pfn, mfn)))
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include <linux/log2.h>
|
#include <linux/log2.h>
|
||||||
#include <linux/gfp.h>
|
#include <linux/gfp.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
|
#include <linux/atomic.h>
|
||||||
|
|
||||||
#include <asm/paravirt.h>
|
#include <asm/paravirt.h>
|
||||||
#include <asm/qspinlock.h>
|
#include <asm/qspinlock.h>
|
||||||
|
@ -21,6 +22,7 @@
|
||||||
|
|
||||||
static DEFINE_PER_CPU(int, lock_kicker_irq) = -1;
|
static DEFINE_PER_CPU(int, lock_kicker_irq) = -1;
|
||||||
static DEFINE_PER_CPU(char *, irq_name);
|
static DEFINE_PER_CPU(char *, irq_name);
|
||||||
|
static DEFINE_PER_CPU(atomic_t, xen_qlock_wait_nest);
|
||||||
static bool xen_pvspin = true;
|
static bool xen_pvspin = true;
|
||||||
|
|
||||||
static void xen_qlock_kick(int cpu)
|
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)
|
static void xen_qlock_wait(u8 *byte, u8 val)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
|
||||||
int irq = __this_cpu_read(lock_kicker_irq);
|
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 kicker interrupts not initialized yet, just spin */
|
||||||
if (irq == -1 || in_nmi())
|
if (irq == -1 || in_nmi())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* Guard against reentry. */
|
/* Detect reentry. */
|
||||||
local_irq_save(flags);
|
atomic_inc(nest_cnt);
|
||||||
|
|
||||||
/* If irq pending already clear it. */
|
/* If irq pending already and no nested call clear it. */
|
||||||
if (xen_test_irq_pending(irq)) {
|
if (atomic_read(nest_cnt) == 1 && xen_test_irq_pending(irq)) {
|
||||||
xen_clear_irq_pending(irq);
|
xen_clear_irq_pending(irq);
|
||||||
} else if (READ_ONCE(*byte) == val) {
|
} else if (READ_ONCE(*byte) == val) {
|
||||||
/* Block until irq becomes pending (or a spurious wakeup) */
|
/* Block until irq becomes pending (or a spurious wakeup) */
|
||||||
xen_poll_irq(irq);
|
xen_poll_irq(irq);
|
||||||
}
|
}
|
||||||
|
|
||||||
local_irq_restore(flags);
|
atomic_dec(nest_cnt);
|
||||||
}
|
}
|
||||||
|
|
||||||
static irqreturn_t dummy_handler(int irq, void *dev_id)
|
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)
|
if (ret)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
} else {
|
} else {
|
||||||
|
zero_fill_bio(bio);
|
||||||
iov_iter_advance(iter, bio->bi_iter.bi_size);
|
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)
|
if ((sector | nr_sects) & bs_mask)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (!nr_sects)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
while (nr_sects) {
|
while (nr_sects) {
|
||||||
unsigned int req_sects = nr_sects;
|
unsigned int req_sects = min_t(unsigned int, nr_sects,
|
||||||
sector_t end_sect;
|
bio_allowed_max_sectors(q));
|
||||||
|
|
||||||
if (!req_sects)
|
|
||||||
goto fail;
|
|
||||||
if (req_sects > UINT_MAX >> 9)
|
|
||||||
req_sects = UINT_MAX >> 9;
|
|
||||||
|
|
||||||
end_sect = sector + req_sects;
|
|
||||||
|
|
||||||
bio = blk_next_bio(bio, 0, gfp_mask);
|
bio = blk_next_bio(bio, 0, gfp_mask);
|
||||||
bio->bi_iter.bi_sector = sector;
|
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_set_op_attrs(bio, op, 0);
|
||||||
|
|
||||||
bio->bi_iter.bi_size = req_sects << 9;
|
bio->bi_iter.bi_size = req_sects << 9;
|
||||||
|
sector += req_sects;
|
||||||
nr_sects -= req_sects;
|
nr_sects -= req_sects;
|
||||||
sector = end_sect;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We can loop for a long time in here, if someone does
|
* 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;
|
*biop = bio;
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
fail:
|
|
||||||
if (bio) {
|
|
||||||
submit_bio_wait(bio);
|
|
||||||
bio_put(bio);
|
|
||||||
}
|
|
||||||
*biop = NULL;
|
|
||||||
return -EOPNOTSUPP;
|
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(__blkdev_issue_discard);
|
EXPORT_SYMBOL(__blkdev_issue_discard);
|
||||||
|
|
||||||
|
@ -161,7 +149,7 @@ static int __blkdev_issue_write_same(struct block_device *bdev, sector_t sector,
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
/* Ensure that max_write_same_sectors doesn't overflow bi_size */
|
/* 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) {
|
while (nr_sects) {
|
||||||
bio = blk_next_bio(bio, 1, gfp_mask);
|
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);
|
bio_get_first_bvec(prev_rq->bio, &pb);
|
||||||
else
|
else
|
||||||
bio_get_first_bvec(prev, &pb);
|
bio_get_first_bvec(prev, &pb);
|
||||||
if (pb.bv_offset)
|
if (pb.bv_offset & queue_virt_boundary(q))
|
||||||
return true;
|
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. */
|
/* Zero-sector (unknown) and one-sector granularities are the same. */
|
||||||
granularity = max(q->limits.discard_granularity >> 9, 1U);
|
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;
|
max_discard_sectors -= max_discard_sectors % granularity;
|
||||||
|
|
||||||
if (unlikely(!max_discard_sectors)) {
|
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,
|
static inline bool __bvec_gap_to_prev(struct request_queue *q,
|
||||||
struct bio_vec *bprv, unsigned int offset)
|
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));
|
((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;
|
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
|
* 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 acpi_nfit_desc *acpi_desc;
|
||||||
struct nfit_spa *nfit_spa;
|
struct nfit_spa *nfit_spa;
|
||||||
|
|
||||||
/* We only care about memory errors */
|
/* We only care about uncorrectable memory errors */
|
||||||
if (!mce_is_memory_error(mce))
|
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;
|
return NOTIFY_DONE;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -1,14 +1,10 @@
|
||||||
|
// SPDX-License-Identifier: GPL-2.0+
|
||||||
/*
|
/*
|
||||||
* Renesas R-Car SATA driver
|
* Renesas R-Car SATA driver
|
||||||
*
|
*
|
||||||
* Author: Vladimir Barinov <source@cogentembedded.com>
|
* Author: Vladimir Barinov <source@cogentembedded.com>
|
||||||
* Copyright (C) 2013-2015 Cogent Embedded, Inc.
|
* Copyright (C) 2013-2015 Cogent Embedded, Inc.
|
||||||
* Copyright (C) 2013-2015 Renesas Solutions Corp.
|
* 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>
|
#include <linux/kernel.h>
|
||||||
|
|
|
@ -1919,6 +1919,7 @@ static int negotiate_mq(struct blkfront_info *info)
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
if (!info->rinfo) {
|
if (!info->rinfo) {
|
||||||
xenbus_dev_fatal(info->xbdev, -ENOMEM, "allocating ring_info structure");
|
xenbus_dev_fatal(info->xbdev, -ENOMEM, "allocating ring_info structure");
|
||||||
|
info->nr_rings = 0;
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -210,6 +210,7 @@ static int of_fixed_factor_clk_remove(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct clk *clk = platform_get_drvdata(pdev);
|
struct clk *clk = platform_get_drvdata(pdev);
|
||||||
|
|
||||||
|
of_clk_del_provider(pdev->dev.of_node);
|
||||||
clk_unregister_fixed_factor(clk);
|
clk_unregister_fixed_factor(clk);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -325,6 +325,7 @@ static struct clk_regmap axg_fclk_div2 = {
|
||||||
.ops = &clk_regmap_gate_ops,
|
.ops = &clk_regmap_gate_ops,
|
||||||
.parent_names = (const char *[]){ "fclk_div2_div" },
|
.parent_names = (const char *[]){ "fclk_div2_div" },
|
||||||
.num_parents = 1,
|
.num_parents = 1,
|
||||||
|
.flags = CLK_IS_CRITICAL,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -349,6 +350,18 @@ static struct clk_regmap axg_fclk_div3 = {
|
||||||
.ops = &clk_regmap_gate_ops,
|
.ops = &clk_regmap_gate_ops,
|
||||||
.parent_names = (const char *[]){ "fclk_div3_div" },
|
.parent_names = (const char *[]){ "fclk_div3_div" },
|
||||||
.num_parents = 1,
|
.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,
|
.ops = &clk_regmap_gate_ops,
|
||||||
.parent_names = (const char *[]){ "fclk_div3_div" },
|
.parent_names = (const char *[]){ "fclk_div3_div" },
|
||||||
.num_parents = 1,
|
.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,
|
.div = 1,
|
||||||
.hw.init = &(struct clk_init_data){
|
.hw.init = &(struct clk_init_data){
|
||||||
.name = "cxo",
|
.name = "cxo",
|
||||||
.parent_names = (const char *[]){ "xo_board" },
|
.parent_names = (const char *[]){ "xo-board" },
|
||||||
.num_parents = 1,
|
.num_parents = 1,
|
||||||
.ops = &clk_fixed_factor_ops,
|
.ops = &clk_fixed_factor_ops,
|
||||||
},
|
},
|
||||||
|
|
|
@ -20,6 +20,13 @@
|
||||||
DEFINE_RAW_SPINLOCK(i8253_lock);
|
DEFINE_RAW_SPINLOCK(i8253_lock);
|
||||||
EXPORT_SYMBOL(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
|
#ifdef CONFIG_CLKSRC_I8253
|
||||||
/*
|
/*
|
||||||
* Since the PIT overflows every tick, its not very useful
|
* 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);
|
raw_spin_lock(&i8253_lock);
|
||||||
|
|
||||||
outb_p(0x30, PIT_MODE);
|
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);
|
raw_spin_unlock(&i8253_lock);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -151,6 +151,7 @@ extern int amdgpu_compute_multipipe;
|
||||||
extern int amdgpu_gpu_recovery;
|
extern int amdgpu_gpu_recovery;
|
||||||
extern int amdgpu_emu_mode;
|
extern int amdgpu_emu_mode;
|
||||||
extern uint amdgpu_smu_memory_pool_size;
|
extern uint amdgpu_smu_memory_pool_size;
|
||||||
|
extern uint amdgpu_dc_feature_mask;
|
||||||
extern struct amdgpu_mgpu_info mgpu_info;
|
extern struct amdgpu_mgpu_info mgpu_info;
|
||||||
|
|
||||||
#ifdef CONFIG_DRM_AMDGPU_SI
|
#ifdef CONFIG_DRM_AMDGPU_SI
|
||||||
|
|
|
@ -127,6 +127,9 @@ int amdgpu_compute_multipipe = -1;
|
||||||
int amdgpu_gpu_recovery = -1; /* auto */
|
int amdgpu_gpu_recovery = -1; /* auto */
|
||||||
int amdgpu_emu_mode = 0;
|
int amdgpu_emu_mode = 0;
|
||||||
uint amdgpu_smu_memory_pool_size = 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 = {
|
struct amdgpu_mgpu_info mgpu_info = {
|
||||||
.mutex = __MUTEX_INITIALIZER(mgpu_info.mutex),
|
.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)");
|
MODULE_PARM_DESC(halt_if_hws_hang, "Halt if HWS hang is detected (0 = off (default), 1 = on)");
|
||||||
#endif
|
#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[] = {
|
static const struct pci_device_id pciidlist[] = {
|
||||||
#ifdef CONFIG_DRM_AMDGPU_SI
|
#ifdef CONFIG_DRM_AMDGPU_SI
|
||||||
{0x1002, 0x6780, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_TAHITI},
|
{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[SMUIO_HWIP][i] = (uint32_t *)(&(SMUIO_BASE.instance[i]));
|
||||||
adev->reg_offset[NBIF_HWIP][i] = (uint32_t *)(&(NBIO_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[THM_HWIP][i] = (uint32_t *)(&(THM_BASE.instance[i]));
|
||||||
|
adev->reg_offset[CLK_HWIP][i] = (uint32_t *)(&(CLK_BASE.instance[i]));
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -429,6 +429,9 @@ static int amdgpu_dm_init(struct amdgpu_device *adev)
|
||||||
adev->asic_type < CHIP_RAVEN)
|
adev->asic_type < CHIP_RAVEN)
|
||||||
init_data.flags.gpu_vm_support = true;
|
init_data.flags.gpu_vm_support = true;
|
||||||
|
|
||||||
|
if (amdgpu_dc_feature_mask & DC_FBC_MASK)
|
||||||
|
init_data.flags.fbc_support = true;
|
||||||
|
|
||||||
/* Display Core create. */
|
/* Display Core create. */
|
||||||
adev->dm.dc = dc_create(&init_data);
|
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);
|
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,
|
if (dc_link_set_backlight_level(dm->backlight_link,
|
||||||
bd->props.brightness, 0, 0))
|
bd->props.brightness, 0, 0))
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -2707,18 +2703,11 @@ create_stream_for_sink(struct amdgpu_dm_connector *aconnector,
|
||||||
drm_connector = &aconnector->base;
|
drm_connector = &aconnector->base;
|
||||||
|
|
||||||
if (!aconnector->dc_sink) {
|
if (!aconnector->dc_sink) {
|
||||||
/*
|
if (!aconnector->mst_port) {
|
||||||
* Create dc_sink when necessary to MST
|
sink = create_fake_sink(aconnector);
|
||||||
* Don't apply fake_sink to MST
|
if (!sink)
|
||||||
*/
|
return stream;
|
||||||
if (aconnector->mst_port) {
|
|
||||||
dm_dp_mst_dc_sink_create(drm_connector);
|
|
||||||
return stream;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sink = create_fake_sink(aconnector);
|
|
||||||
if (!sink)
|
|
||||||
return stream;
|
|
||||||
} else {
|
} else {
|
||||||
sink = aconnector->dc_sink;
|
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 = {
|
static const struct drm_plane_funcs dm_plane_funcs = {
|
||||||
.update_plane = drm_atomic_helper_update_plane,
|
.update_plane = drm_atomic_helper_update_plane,
|
||||||
.disable_plane = drm_atomic_helper_disable_plane,
|
.disable_plane = drm_atomic_helper_disable_plane,
|
||||||
.destroy = drm_plane_cleanup,
|
.destroy = drm_primary_helper_destroy,
|
||||||
.reset = dm_drm_plane_reset,
|
.reset = dm_drm_plane_reset,
|
||||||
.atomic_duplicate_state = dm_drm_plane_duplicate_state,
|
.atomic_duplicate_state = dm_drm_plane_duplicate_state,
|
||||||
.atomic_destroy_state = dm_drm_plane_destroy_state,
|
.atomic_destroy_state = dm_drm_plane_destroy_state,
|
||||||
|
|
|
@ -160,8 +160,6 @@ struct amdgpu_dm_connector {
|
||||||
struct mutex hpd_lock;
|
struct mutex hpd_lock;
|
||||||
|
|
||||||
bool fake_enable;
|
bool fake_enable;
|
||||||
|
|
||||||
bool mst_connected;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define to_amdgpu_dm_connector(x) container_of(x, struct amdgpu_dm_connector, base)
|
#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
|
.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)
|
static int dm_dp_mst_get_modes(struct drm_connector *connector)
|
||||||
{
|
{
|
||||||
struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_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_device *adev = dev->dev_private;
|
||||||
struct amdgpu_encoder *amdgpu_encoder;
|
struct amdgpu_encoder *amdgpu_encoder;
|
||||||
struct drm_encoder *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);
|
amdgpu_encoder = kzalloc(sizeof(*amdgpu_encoder), GFP_KERNEL);
|
||||||
if (!amdgpu_encoder)
|
if (!amdgpu_encoder)
|
||||||
return NULL;
|
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_device *adev = dev->dev_private;
|
||||||
struct amdgpu_dm_connector *aconnector;
|
struct amdgpu_dm_connector *aconnector;
|
||||||
struct drm_connector *connector;
|
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);
|
aconnector = kzalloc(sizeof(*aconnector), GFP_KERNEL);
|
||||||
if (!aconnector)
|
if (!aconnector)
|
||||||
|
@ -421,8 +363,6 @@ dm_dp_add_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
|
||||||
*/
|
*/
|
||||||
amdgpu_dm_connector_funcs_reset(connector);
|
amdgpu_dm_connector_funcs_reset(connector);
|
||||||
|
|
||||||
aconnector->mst_connected = true;
|
|
||||||
|
|
||||||
DRM_INFO("DM_MST: added connector: %p [id: %d] [master: %p]\n",
|
DRM_INFO("DM_MST: added connector: %p [id: %d] [master: %p]\n",
|
||||||
aconnector, connector->base.id, aconnector->mst_port);
|
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,
|
static void dm_dp_destroy_mst_connector(struct drm_dp_mst_topology_mgr *mgr,
|
||||||
struct drm_connector *connector)
|
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);
|
struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
|
||||||
|
|
||||||
DRM_INFO("DM_MST: Disabling connector: %p [id: %d] [master: %p]\n",
|
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->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)
|
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);
|
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)
|
static void dm_dp_mst_register_connector(struct drm_connector *connector)
|
||||||
{
|
{
|
||||||
struct drm_device *dev = connector->dev;
|
struct drm_device *dev = connector->dev;
|
||||||
struct amdgpu_device *adev = dev->dev_private;
|
struct amdgpu_device *adev = dev->dev_private;
|
||||||
struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
|
|
||||||
|
|
||||||
if (adev->mode_info.rfbdev)
|
if (adev->mode_info.rfbdev)
|
||||||
drm_fb_helper_add_one_connector(&adev->mode_info.rfbdev->helper, connector);
|
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_ERROR("adev->mode_info.rfbdev is NULL\n");
|
||||||
|
|
||||||
drm_connector_register(connector);
|
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 = {
|
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,
|
void amdgpu_dm_initialize_dp_connector(struct amdgpu_display_manager *dm,
|
||||||
struct amdgpu_dm_connector *aconnector);
|
struct amdgpu_dm_connector *aconnector);
|
||||||
void dm_dp_mst_dc_sink_create(struct drm_connector *connector);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1722,7 +1722,7 @@ static void write_i2c_retimer_setting(
|
||||||
i2c_success = i2c_write(pipe_ctx, slave_address,
|
i2c_success = i2c_write(pipe_ctx, slave_address,
|
||||||
buffer, sizeof(buffer));
|
buffer, sizeof(buffer));
|
||||||
RETIMER_REDRIVER_INFO("retimer write to slave_address = 0x%x,\
|
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);
|
slave_address, buffer[0], buffer[1], i2c_success?1:0);
|
||||||
if (!i2c_success)
|
if (!i2c_success)
|
||||||
/* Write failure */
|
/* Write failure */
|
||||||
|
@ -1734,7 +1734,7 @@ static void write_i2c_retimer_setting(
|
||||||
i2c_success = i2c_write(pipe_ctx, slave_address,
|
i2c_success = i2c_write(pipe_ctx, slave_address,
|
||||||
buffer, sizeof(buffer));
|
buffer, sizeof(buffer));
|
||||||
RETIMER_REDRIVER_INFO("retimer write to slave_address = 0x%x,\
|
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);
|
slave_address, buffer[0], buffer[1], i2c_success?1:0);
|
||||||
if (!i2c_success)
|
if (!i2c_success)
|
||||||
/* Write failure */
|
/* Write failure */
|
||||||
|
|
|
@ -169,6 +169,7 @@ struct link_training_settings;
|
||||||
struct dc_config {
|
struct dc_config {
|
||||||
bool gpu_vm_support;
|
bool gpu_vm_support;
|
||||||
bool disable_disp_pll_sharing;
|
bool disable_disp_pll_sharing;
|
||||||
|
bool fbc_support;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum visual_confirm {
|
enum visual_confirm {
|
||||||
|
|
|
@ -1736,7 +1736,12 @@ static void set_static_screen_control(struct pipe_ctx **pipe_ctx,
|
||||||
if (events->force_trigger)
|
if (events->force_trigger)
|
||||||
value |= 0x1;
|
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++)
|
for (i = 0; i < num_pipes; i++)
|
||||||
pipe_ctx[i]->stream_res.tg->funcs->
|
pipe_ctx[i]->stream_res.tg->funcs->
|
||||||
|
|
|
@ -1362,7 +1362,8 @@ static bool construct(
|
||||||
pool->base.sw_i2cs[i] = NULL;
|
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))
|
if (!underlay_create(ctx, &pool->base))
|
||||||
goto res_create_fail;
|
goto res_create_fail;
|
||||||
|
|
|
@ -133,6 +133,10 @@ enum PP_FEATURE_MASK {
|
||||||
PP_AVFS_MASK = 0x40000,
|
PP_AVFS_MASK = 0x40000,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
enum DC_FEATURE_MASK {
|
||||||
|
DC_FBC_MASK = 0x1,
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* struct amd_ip_funcs - general hooks for managing amdgpu IP Blocks
|
* 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;
|
struct atom_common_table_header table_header;
|
||||||
uint8_t smuip_min_ver;
|
uint8_t smuip_min_ver;
|
||||||
uint8_t smuip_max_ver;
|
uint8_t smuip_max_ver;
|
||||||
uint8_t smu_rsd1;
|
uint8_t waflclk_ss_mode;
|
||||||
uint8_t gpuclk_ss_mode;
|
uint8_t gpuclk_ss_mode;
|
||||||
uint16_t sclk_ss_percentage;
|
uint16_t sclk_ss_percentage;
|
||||||
uint16_t sclk_ss_rate_10hz;
|
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 syspll3_1_vco_freq_10khz;
|
||||||
uint32_t bootup_fclk_10khz;
|
uint32_t bootup_fclk_10khz;
|
||||||
uint32_t bootup_waflclk_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.disable_auto_wattman = 1;
|
||||||
data->registry_data.auto_wattman_debug = 0;
|
data->registry_data.auto_wattman_debug = 0;
|
||||||
data->registry_data.auto_wattman_sample_period = 100;
|
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.auto_wattman_threshold = 50;
|
||||||
data->registry_data.gfxoff_controlled_by_driver = 1;
|
data->registry_data.gfxoff_controlled_by_driver = 1;
|
||||||
data->gfxoff_allowed = false;
|
data->gfxoff_allowed = false;
|
||||||
|
@ -829,6 +830,28 @@ static int vega20_enable_all_smu_features(struct pp_hwmgr *hwmgr)
|
||||||
return 0;
|
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)
|
static int vega20_disable_all_smu_features(struct pp_hwmgr *hwmgr)
|
||||||
{
|
{
|
||||||
struct vega20_hwmgr *data =
|
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!",
|
"[EnableDPMTasks] Failed to enable all smu features!",
|
||||||
return result);
|
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 */
|
/* Initialize UVD/VCE powergating state */
|
||||||
vega20_init_powergate_state(hwmgr);
|
vega20_init_powergate_state(hwmgr);
|
||||||
|
|
||||||
|
@ -1972,19 +2005,6 @@ static int vega20_read_sensor(struct pp_hwmgr *hwmgr, int idx,
|
||||||
return ret;
|
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,
|
int vega20_display_clock_voltage_request(struct pp_hwmgr *hwmgr,
|
||||||
struct pp_display_clock_request *clock_req)
|
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;
|
struct pp_display_clock_request clock_req;
|
||||||
int ret = 0;
|
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.dcefClock = hwmgr->display_config->min_dcef_set_clk;
|
||||||
min_clocks.dcefClockInSR = hwmgr->display_config->min_dcef_deep_sleep_set_clk;
|
min_clocks.dcefClockInSR = hwmgr->display_config->min_dcef_deep_sleep_set_clk;
|
||||||
min_clocks.memoryClock = hwmgr->display_config->min_mem_set_clock;
|
min_clocks.memoryClock = hwmgr->display_config->min_mem_set_clock;
|
||||||
|
|
|
@ -328,6 +328,7 @@ struct vega20_registry_data {
|
||||||
uint8_t disable_auto_wattman;
|
uint8_t disable_auto_wattman;
|
||||||
uint32_t auto_wattman_debug;
|
uint32_t auto_wattman_debug;
|
||||||
uint32_t auto_wattman_sample_period;
|
uint32_t auto_wattman_sample_period;
|
||||||
|
uint32_t fclk_gfxclk_ratio;
|
||||||
uint8_t auto_wattman_threshold;
|
uint8_t auto_wattman_threshold;
|
||||||
uint8_t log_avfs_param;
|
uint8_t log_avfs_param;
|
||||||
uint8_t enable_enginess;
|
uint8_t enable_enginess;
|
||||||
|
|
|
@ -105,7 +105,8 @@
|
||||||
#define PPSMC_MSG_SetSystemVirtualDramAddrHigh 0x4B
|
#define PPSMC_MSG_SetSystemVirtualDramAddrHigh 0x4B
|
||||||
#define PPSMC_MSG_SetSystemVirtualDramAddrLow 0x4C
|
#define PPSMC_MSG_SetSystemVirtualDramAddrLow 0x4C
|
||||||
#define PPSMC_MSG_WaflTest 0x4D
|
#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_AllowGfxOff 0x51
|
||||||
#define PPSMC_MSG_DisallowGfxOff 0x52
|
#define PPSMC_MSG_DisallowGfxOff 0x52
|
||||||
#define PPSMC_MSG_GetPptLimit 0x53
|
#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
|
* If the GPU managed to complete this jobs fence, the timout is
|
||||||
* spurious. Bail out.
|
* spurious. Bail out.
|
||||||
*/
|
*/
|
||||||
if (fence_completed(gpu, submit->out_fence->seqno))
|
if (dma_fence_is_signaled(submit->out_fence))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -164,13 +164,6 @@ static u32 decon_get_frame_count(struct decon_context *ctx, bool end)
|
||||||
return frm;
|
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)
|
static void decon_setup_trigger(struct decon_context *ctx)
|
||||||
{
|
{
|
||||||
if (!ctx->crtc->i80_mode && !(ctx->out_type & I80_HW_TRG))
|
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,
|
.disable = decon_disable,
|
||||||
.enable_vblank = decon_enable_vblank,
|
.enable_vblank = decon_enable_vblank,
|
||||||
.disable_vblank = decon_disable_vblank,
|
.disable_vblank = decon_disable_vblank,
|
||||||
.get_vblank_counter = decon_get_vblank_counter,
|
|
||||||
.atomic_begin = decon_atomic_begin,
|
.atomic_begin = decon_atomic_begin,
|
||||||
.update_plane = decon_update_plane,
|
.update_plane = decon_update_plane,
|
||||||
.disable_plane = decon_disable_plane,
|
.disable_plane = decon_disable_plane,
|
||||||
|
@ -554,7 +546,6 @@ static int decon_bind(struct device *dev, struct device *master, void *data)
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ctx->drm_dev = drm_dev;
|
ctx->drm_dev = drm_dev;
|
||||||
drm_dev->max_vblank_count = 0xffffffff;
|
|
||||||
|
|
||||||
for (win = ctx->first_win; win < WINDOWS_NR; win++) {
|
for (win = ctx->first_win; win < WINDOWS_NR; win++) {
|
||||||
ctx->configs[win].pixel_formats = decon_formats;
|
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);
|
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 = {
|
static const struct drm_crtc_funcs exynos_crtc_funcs = {
|
||||||
.set_config = drm_atomic_helper_set_config,
|
.set_config = drm_atomic_helper_set_config,
|
||||||
.page_flip = drm_atomic_helper_page_flip,
|
.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,
|
.atomic_destroy_state = drm_atomic_helper_crtc_destroy_state,
|
||||||
.enable_vblank = exynos_drm_crtc_enable_vblank,
|
.enable_vblank = exynos_drm_crtc_enable_vblank,
|
||||||
.disable_vblank = exynos_drm_crtc_disable_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,
|
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);
|
void (*disable)(struct exynos_drm_crtc *crtc);
|
||||||
int (*enable_vblank)(struct exynos_drm_crtc *crtc);
|
int (*enable_vblank)(struct exynos_drm_crtc *crtc);
|
||||||
void (*disable_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,
|
enum drm_mode_status (*mode_valid)(struct exynos_drm_crtc *crtc,
|
||||||
const struct drm_display_mode *mode);
|
const struct drm_display_mode *mode);
|
||||||
bool (*mode_fixup)(struct exynos_drm_crtc *crtc,
|
bool (*mode_fixup)(struct exynos_drm_crtc *crtc,
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
|
|
||||||
#include <drm/drmP.h>
|
#include <drm/drmP.h>
|
||||||
#include <drm/drm_crtc_helper.h>
|
#include <drm/drm_crtc_helper.h>
|
||||||
|
#include <drm/drm_fb_helper.h>
|
||||||
#include <drm/drm_mipi_dsi.h>
|
#include <drm/drm_mipi_dsi.h>
|
||||||
#include <drm/drm_panel.h>
|
#include <drm/drm_panel.h>
|
||||||
#include <drm/drm_atomic_helper.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 exynos_dsi *dsi = encoder_to_dsi(encoder);
|
||||||
struct drm_connector *connector = &dsi->connector;
|
struct drm_connector *connector = &dsi->connector;
|
||||||
|
struct drm_device *drm = encoder->dev;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
connector->polled = DRM_CONNECTOR_POLL_HPD;
|
connector->polled = DRM_CONNECTOR_POLL_HPD;
|
||||||
|
|
||||||
ret = drm_connector_init(encoder->dev, connector,
|
ret = drm_connector_init(drm, connector, &exynos_dsi_connector_funcs,
|
||||||
&exynos_dsi_connector_funcs,
|
|
||||||
DRM_MODE_CONNECTOR_DSI);
|
DRM_MODE_CONNECTOR_DSI);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
DRM_ERROR("Failed to initialize connector with drm\n");
|
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;
|
connector->status = connector_status_disconnected;
|
||||||
drm_connector_helper_add(connector, &exynos_dsi_connector_helper_funcs);
|
drm_connector_helper_add(connector, &exynos_dsi_connector_helper_funcs);
|
||||||
drm_connector_attach_encoder(connector, encoder);
|
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;
|
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);
|
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);
|
drm_panel_attach(dsi->panel, &dsi->connector);
|
||||||
dsi->connector.status = connector_status_connected;
|
dsi->connector.status = connector_status_connected;
|
||||||
}
|
}
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue