mirror of https://gitee.com/openkylin/linux.git
urgent i686 mmap fix for drm drivers
-----BEGIN PGP SIGNATURE----- iQIcBAABAgAGBQJa+mZEAAoJEAx081l5xIa+p/4P/3kIW0Zk6wO2HOF2u4TRZdhe 2b6yYP6ig1MMpLsJuRH2f8hnWl2f+CBzhwHaKbUni9ffY4TboOWeoYL5YWap2Pcp MxRLBXBAI9+8zqqsrm/VB4gQL/Xp0nghN3CT1khLnMs38BkFUX7nASiSIknVIxj3 ux/95o0Tb2uYN886ILZCixPjmNUSgfNAyQuNNKRmT1EM3mgDZ2mc6BJoArPcCBqr 0vkekQA9+ZK4XYEHfjq/0CrVMLXhjaO05+BADK8A8WOtyvU+0xKjJjmQx0sQAd6L Vcr+aMabJP8+3LeMDjIWqH0wUk6YqECwnUOoBkJFp5YTx+D1ff2RzmlWwvt9skIZ 4tmyFMfAn8XKkoSwa598/jamxOgTmMTIO8/6dJfO01sDgUvmTeR5z+ZTDG9FudFW 7Y2aHLMm19kitjqLDCpWBPmFGYVmfIsqA52qSgIjF4JVIurDk3PLRbQt++4k2j84 hLvYClJIs4ulTfmNRuBH4cVYtW5H5ohIkwP9L715Y+7ag/LUdQB1V6QsrX1bHEXg KX1jP1UHqpUwNEQ9N2/1wVv1Ss7p7CKFY3C2UAMacRyymrws4McziPuXUalkBArs royz2gRc5ykpbZ7Itlls43XlyMYxBeaogq+P2ODHouQMfDM21Gam/mpBPz3+t2c5 fo9rLqk3NqxPbHud1NJH =4NJV -----END PGP SIGNATURE----- Merge drm-fixes-for-v4.17-rc6-urgent into drm-next Need to backmerge some nouveau fixes to reduce the nouveau -next conflicts a lot. Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
commit
1fafef9dfe
|
@ -145,7 +145,7 @@ feature enabled.]
|
||||||
|
|
||||||
In this mode ``intel_pstate`` registers utilization update callbacks with the
|
In this mode ``intel_pstate`` registers utilization update callbacks with the
|
||||||
CPU scheduler in order to run a P-state selection algorithm, either
|
CPU scheduler in order to run a P-state selection algorithm, either
|
||||||
``powersave`` or ``performance``, depending on the ``scaling_cur_freq`` policy
|
``powersave`` or ``performance``, depending on the ``scaling_governor`` policy
|
||||||
setting in ``sysfs``. The current CPU frequency information to be made
|
setting in ``sysfs``. The current CPU frequency information to be made
|
||||||
available from the ``scaling_cur_freq`` policy attribute in ``sysfs`` is
|
available from the ``scaling_cur_freq`` policy attribute in ``sysfs`` is
|
||||||
periodically updated by those utilization update callbacks too.
|
periodically updated by those utilization update callbacks too.
|
||||||
|
|
|
@ -15,7 +15,7 @@ Sleep States That Can Be Supported
|
||||||
==================================
|
==================================
|
||||||
|
|
||||||
Depending on its configuration and the capabilities of the platform it runs on,
|
Depending on its configuration and the capabilities of the platform it runs on,
|
||||||
the Linux kernel can support up to four system sleep states, includig
|
the Linux kernel can support up to four system sleep states, including
|
||||||
hibernation and up to three variants of system suspend. The sleep states that
|
hibernation and up to three variants of system suspend. The sleep states that
|
||||||
can be supported by the kernel are listed below.
|
can be supported by the kernel are listed below.
|
||||||
|
|
||||||
|
|
|
@ -557,6 +557,14 @@ A: Although LLVM IR generation and optimization try to stay architecture
|
||||||
pulls in some header files containing file scope host assembly codes.
|
pulls in some header files containing file scope host assembly codes.
|
||||||
- You can add "-fno-jump-tables" to work around the switch table issue.
|
- You can add "-fno-jump-tables" to work around the switch table issue.
|
||||||
|
|
||||||
Otherwise, you can use bpf target.
|
Otherwise, you can use bpf target. Additionally, you _must_ use bpf target
|
||||||
|
when:
|
||||||
|
|
||||||
|
- Your program uses data structures with pointer or long / unsigned long
|
||||||
|
types that interface with BPF helpers or context data structures. Access
|
||||||
|
into these structures is verified by the BPF verifier and may result
|
||||||
|
in verification failures if the native architecture is not aligned with
|
||||||
|
the BPF architecture, e.g. 64-bit. An example of this is
|
||||||
|
BPF_PROG_TYPE_SK_MSG require '-target bpf'
|
||||||
|
|
||||||
Happy BPF hacking!
|
Happy BPF hacking!
|
||||||
|
|
|
@ -264,7 +264,10 @@ i) Constructor
|
||||||
data device, but just remove the mapping.
|
data device, but just remove the mapping.
|
||||||
|
|
||||||
read_only: Don't allow any changes to be made to the pool
|
read_only: Don't allow any changes to be made to the pool
|
||||||
metadata.
|
metadata. This mode is only available after the
|
||||||
|
thin-pool has been created and first used in full
|
||||||
|
read/write mode. It cannot be specified on initial
|
||||||
|
thin-pool creation.
|
||||||
|
|
||||||
error_if_no_space: Error IOs, instead of queueing, if no space.
|
error_if_no_space: Error IOs, instead of queueing, if no space.
|
||||||
|
|
||||||
|
|
|
@ -30,7 +30,6 @@ compatible:
|
||||||
Optional properties:
|
Optional properties:
|
||||||
- dma-coherent : Present if dma operations are coherent
|
- dma-coherent : Present if dma operations are coherent
|
||||||
- clocks : a list of phandle + clock specifier pairs
|
- clocks : a list of phandle + clock specifier pairs
|
||||||
- resets : a list of phandle + reset specifier pairs
|
|
||||||
- target-supply : regulator for SATA target power
|
- target-supply : regulator for SATA target power
|
||||||
- phys : reference to the SATA PHY node
|
- phys : reference to the SATA PHY node
|
||||||
- phy-names : must be "sata-phy"
|
- phy-names : must be "sata-phy"
|
||||||
|
|
|
@ -38,7 +38,7 @@ Display Timings
|
||||||
require specific display timings. The panel-timing subnode expresses those
|
require specific display timings. The panel-timing subnode expresses those
|
||||||
timings as specified in the timing subnode section of the display timing
|
timings as specified in the timing subnode section of the display timing
|
||||||
bindings defined in
|
bindings defined in
|
||||||
Documentation/devicetree/bindings/display/display-timing.txt.
|
Documentation/devicetree/bindings/display/panel/display-timing.txt.
|
||||||
|
|
||||||
|
|
||||||
Connectivity
|
Connectivity
|
||||||
|
|
|
@ -26,6 +26,7 @@ Required Properties:
|
||||||
- "renesas,dmac-r8a7794" (R-Car E2)
|
- "renesas,dmac-r8a7794" (R-Car E2)
|
||||||
- "renesas,dmac-r8a7795" (R-Car H3)
|
- "renesas,dmac-r8a7795" (R-Car H3)
|
||||||
- "renesas,dmac-r8a7796" (R-Car M3-W)
|
- "renesas,dmac-r8a7796" (R-Car M3-W)
|
||||||
|
- "renesas,dmac-r8a77965" (R-Car M3-N)
|
||||||
- "renesas,dmac-r8a77970" (R-Car V3M)
|
- "renesas,dmac-r8a77970" (R-Car V3M)
|
||||||
- "renesas,dmac-r8a77980" (R-Car V3H)
|
- "renesas,dmac-r8a77980" (R-Car V3H)
|
||||||
|
|
||||||
|
|
|
@ -4,6 +4,13 @@ Required properties:
|
||||||
- compatible:
|
- compatible:
|
||||||
atmel,maxtouch
|
atmel,maxtouch
|
||||||
|
|
||||||
|
The following compatibles have been used in various products but are
|
||||||
|
deprecated:
|
||||||
|
atmel,qt602240_ts
|
||||||
|
atmel,atmel_mxt_ts
|
||||||
|
atmel,atmel_mxt_tp
|
||||||
|
atmel,mXT224
|
||||||
|
|
||||||
- reg: The I2C address of the device
|
- reg: The I2C address of the device
|
||||||
|
|
||||||
- interrupts: The sink for the touchpad's IRQ output
|
- interrupts: The sink for the touchpad's IRQ output
|
||||||
|
|
|
@ -5,7 +5,9 @@ Required properties:
|
||||||
- compatible: Must contain one or more of the following:
|
- compatible: Must contain one or more of the following:
|
||||||
- "renesas,rcar-gen3-canfd" for R-Car Gen3 compatible controller.
|
- "renesas,rcar-gen3-canfd" for R-Car Gen3 compatible controller.
|
||||||
- "renesas,r8a7795-canfd" for R8A7795 (R-Car H3) compatible controller.
|
- "renesas,r8a7795-canfd" for R8A7795 (R-Car H3) compatible controller.
|
||||||
- "renesas,r8a7796-canfd" for R8A7796 (R-Car M3) compatible controller.
|
- "renesas,r8a7796-canfd" for R8A7796 (R-Car M3-W) compatible controller.
|
||||||
|
- "renesas,r8a77970-canfd" for R8A77970 (R-Car V3M) compatible controller.
|
||||||
|
- "renesas,r8a77980-canfd" for R8A77980 (R-Car V3H) compatible controller.
|
||||||
|
|
||||||
When compatible with the generic version, nodes must list the
|
When compatible with the generic version, nodes must list the
|
||||||
SoC-specific version corresponding to the platform first, followed by the
|
SoC-specific version corresponding to the platform first, followed by the
|
||||||
|
|
|
@ -18,6 +18,7 @@ Required properties:
|
||||||
|
|
||||||
- "renesas,etheravb-r8a7795" for the R8A7795 SoC.
|
- "renesas,etheravb-r8a7795" for the R8A7795 SoC.
|
||||||
- "renesas,etheravb-r8a7796" for the R8A7796 SoC.
|
- "renesas,etheravb-r8a7796" for the R8A7796 SoC.
|
||||||
|
- "renesas,etheravb-r8a77965" for the R8A77965 SoC.
|
||||||
- "renesas,etheravb-r8a77970" for the R8A77970 SoC.
|
- "renesas,etheravb-r8a77970" for the R8A77970 SoC.
|
||||||
- "renesas,etheravb-r8a77980" for the R8A77980 SoC.
|
- "renesas,etheravb-r8a77980" for the R8A77980 SoC.
|
||||||
- "renesas,etheravb-r8a77995" for the R8A77995 SoC.
|
- "renesas,etheravb-r8a77995" for the R8A77995 SoC.
|
||||||
|
|
|
@ -56,9 +56,9 @@ pins it needs, and how they should be configured, with regard to muxer
|
||||||
configuration, drive strength and pullups. If one of these options is
|
configuration, drive strength and pullups. If one of these options is
|
||||||
not set, its actual value will be unspecified.
|
not set, its actual value will be unspecified.
|
||||||
|
|
||||||
This driver supports the generic pin multiplexing and configuration
|
Allwinner A1X Pin Controller supports the generic pin multiplexing and
|
||||||
bindings. For details on each properties, you can refer to
|
configuration bindings. For details on each properties, you can refer to
|
||||||
./pinctrl-bindings.txt.
|
./pinctrl-bindings.txt.
|
||||||
|
|
||||||
Required sub-node properties:
|
Required sub-node properties:
|
||||||
- pins
|
- pins
|
||||||
|
|
|
@ -43,6 +43,8 @@ Required properties:
|
||||||
- "renesas,hscif-r8a7795" for R8A7795 (R-Car H3) HSCIF compatible UART.
|
- "renesas,hscif-r8a7795" for R8A7795 (R-Car H3) HSCIF compatible UART.
|
||||||
- "renesas,scif-r8a7796" for R8A7796 (R-Car M3-W) SCIF compatible UART.
|
- "renesas,scif-r8a7796" for R8A7796 (R-Car M3-W) SCIF compatible UART.
|
||||||
- "renesas,hscif-r8a7796" for R8A7796 (R-Car M3-W) HSCIF compatible UART.
|
- "renesas,hscif-r8a7796" for R8A7796 (R-Car M3-W) HSCIF compatible UART.
|
||||||
|
- "renesas,scif-r8a77965" for R8A77965 (R-Car M3-N) SCIF compatible UART.
|
||||||
|
- "renesas,hscif-r8a77965" for R8A77965 (R-Car M3-N) HSCIF compatible UART.
|
||||||
- "renesas,scif-r8a77970" for R8A77970 (R-Car V3M) SCIF compatible UART.
|
- "renesas,scif-r8a77970" for R8A77970 (R-Car V3M) SCIF compatible UART.
|
||||||
- "renesas,hscif-r8a77970" for R8A77970 (R-Car V3M) HSCIF compatible UART.
|
- "renesas,hscif-r8a77970" for R8A77970 (R-Car V3M) HSCIF compatible UART.
|
||||||
- "renesas,scif-r8a77980" for R8A77980 (R-Car V3H) SCIF compatible UART.
|
- "renesas,scif-r8a77980" for R8A77980 (R-Car V3H) SCIF compatible UART.
|
||||||
|
|
|
@ -182,6 +182,7 @@ karo Ka-Ro electronics GmbH
|
||||||
keithkoep Keith & Koep GmbH
|
keithkoep Keith & Koep GmbH
|
||||||
keymile Keymile GmbH
|
keymile Keymile GmbH
|
||||||
khadas Khadas
|
khadas Khadas
|
||||||
|
kiebackpeter Kieback & Peter GmbH
|
||||||
kinetic Kinetic Technologies
|
kinetic Kinetic Technologies
|
||||||
kingnovel Kingnovel Technology Co., Ltd.
|
kingnovel Kingnovel Technology Co., Ltd.
|
||||||
kosagi Sutajio Ko-Usagi PTE Ltd.
|
kosagi Sutajio Ko-Usagi PTE Ltd.
|
||||||
|
|
|
@ -98,6 +98,14 @@ Finally, if you need to remove all overlays in one-go, just call
|
||||||
of_overlay_remove_all() which will remove every single one in the correct
|
of_overlay_remove_all() which will remove every single one in the correct
|
||||||
order.
|
order.
|
||||||
|
|
||||||
|
In addition, there is the option to register notifiers that get called on
|
||||||
|
overlay operations. See of_overlay_notifier_register/unregister and
|
||||||
|
enum of_overlay_notify_action for details.
|
||||||
|
|
||||||
|
Note that a notifier callback is not supposed to store pointers to a device
|
||||||
|
tree node or its content beyond OF_OVERLAY_POST_REMOVE corresponding to the
|
||||||
|
respective node it received.
|
||||||
|
|
||||||
Overlay DTS Format
|
Overlay DTS Format
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
|
|
|
@ -177,14 +177,14 @@ BUGS
|
||||||
****
|
****
|
||||||
|
|
||||||
|
|
||||||
Report bugs to Mauro Carvalho Chehab <mchehab@s-opensource.com>
|
Report bugs to Mauro Carvalho Chehab <mchehab@kernel.org>
|
||||||
|
|
||||||
|
|
||||||
COPYRIGHT
|
COPYRIGHT
|
||||||
*********
|
*********
|
||||||
|
|
||||||
|
|
||||||
Copyright (c) 2016 by Mauro Carvalho Chehab <mchehab@s-opensource.com>.
|
Copyright (c) 2016 by Mauro Carvalho Chehab <mchehab+samsung@kernel.org>.
|
||||||
|
|
||||||
License GPLv2: GNU GPL version 2 <http://gnu.org/licenses/gpl.html>.
|
License GPLv2: GNU GPL version 2 <http://gnu.org/licenses/gpl.html>.
|
||||||
|
|
||||||
|
|
|
@ -7,7 +7,7 @@ file: uapi/v4l/keytable.c
|
||||||
|
|
||||||
/* keytable.c - This program allows checking/replacing keys at IR
|
/* keytable.c - This program allows checking/replacing keys at IR
|
||||||
|
|
||||||
Copyright (C) 2006-2009 Mauro Carvalho Chehab <mchehab@infradead.org>
|
Copyright (C) 2006-2009 Mauro Carvalho Chehab <mchehab@kernel.org>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -6,7 +6,7 @@ file: media/v4l/v4l2grab.c
|
||||||
.. code-block:: c
|
.. code-block:: c
|
||||||
|
|
||||||
/* V4L2 video picture grabber
|
/* V4L2 video picture grabber
|
||||||
Copyright (C) 2009 Mauro Carvalho Chehab <mchehab@infradead.org>
|
Copyright (C) 2009 Mauro Carvalho Chehab <mchehab@kernel.org>
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
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
|
it under the terms of the GNU General Public License as published by
|
||||||
|
|
|
@ -387,11 +387,11 @@ tree for more details.
|
||||||
|
|
||||||
=head1 BUGS
|
=head1 BUGS
|
||||||
|
|
||||||
Report bugs to Mauro Carvalho Chehab <mchehab@s-opensource.com>
|
Report bugs to Mauro Carvalho Chehab <mchehab@kernel.org>
|
||||||
|
|
||||||
=head1 COPYRIGHT
|
=head1 COPYRIGHT
|
||||||
|
|
||||||
Copyright (c) 2016 by Mauro Carvalho Chehab <mchehab@s-opensource.com>.
|
Copyright (c) 2016 by Mauro Carvalho Chehab <mchehab+samsung@kernel.org>.
|
||||||
|
|
||||||
License GPLv2: GNU GPL version 2 <http://gnu.org/licenses/gpl.html>.
|
License GPLv2: GNU GPL version 2 <http://gnu.org/licenses/gpl.html>.
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ communicating in English you can also ask the Chinese maintainer for
|
||||||
help. Contact the Chinese maintainer if this translation is outdated
|
help. Contact the Chinese maintainer if this translation is outdated
|
||||||
or if there is a problem with the translation.
|
or if there is a problem with the translation.
|
||||||
|
|
||||||
Maintainer: Mauro Carvalho Chehab <mchehab@infradead.org>
|
Maintainer: Mauro Carvalho Chehab <mchehab@kernel.org>
|
||||||
Chinese maintainer: Fu Wei <tekkamanninja@gmail.com>
|
Chinese maintainer: Fu Wei <tekkamanninja@gmail.com>
|
||||||
---------------------------------------------------------------------
|
---------------------------------------------------------------------
|
||||||
Documentation/video4linux/v4l2-framework.txt 的中文翻译
|
Documentation/video4linux/v4l2-framework.txt 的中文翻译
|
||||||
|
@ -14,7 +14,7 @@ Documentation/video4linux/v4l2-framework.txt 的中文翻译
|
||||||
如果想评论或更新本文的内容,请直接联系原文档的维护者。如果你使用英文
|
如果想评论或更新本文的内容,请直接联系原文档的维护者。如果你使用英文
|
||||||
交流有困难的话,也可以向中文版维护者求助。如果本翻译更新不及时或者翻
|
交流有困难的话,也可以向中文版维护者求助。如果本翻译更新不及时或者翻
|
||||||
译存在问题,请联系中文版维护者。
|
译存在问题,请联系中文版维护者。
|
||||||
英文版维护者: Mauro Carvalho Chehab <mchehab@infradead.org>
|
英文版维护者: Mauro Carvalho Chehab <mchehab@kernel.org>
|
||||||
中文版维护者: 傅炜 Fu Wei <tekkamanninja@gmail.com>
|
中文版维护者: 傅炜 Fu Wei <tekkamanninja@gmail.com>
|
||||||
中文版翻译者: 傅炜 Fu Wei <tekkamanninja@gmail.com>
|
中文版翻译者: 傅炜 Fu Wei <tekkamanninja@gmail.com>
|
||||||
中文版校译者: 傅炜 Fu Wei <tekkamanninja@gmail.com>
|
中文版校译者: 傅炜 Fu Wei <tekkamanninja@gmail.com>
|
||||||
|
|
33
MAINTAINERS
33
MAINTAINERS
|
@ -137,9 +137,9 @@ Maintainers List (try to look for most precise areas first)
|
||||||
-----------------------------------
|
-----------------------------------
|
||||||
|
|
||||||
3C59X NETWORK DRIVER
|
3C59X NETWORK DRIVER
|
||||||
M: Steffen Klassert <klassert@mathematik.tu-chemnitz.de>
|
M: Steffen Klassert <klassert@kernel.org>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Maintained
|
S: Odd Fixes
|
||||||
F: Documentation/networking/vortex.txt
|
F: Documentation/networking/vortex.txt
|
||||||
F: drivers/net/ethernet/3com/3c59x.c
|
F: drivers/net/ethernet/3com/3c59x.c
|
||||||
|
|
||||||
|
@ -2556,7 +2556,6 @@ F: Documentation/devicetree/bindings/sound/axentia,*
|
||||||
F: sound/soc/atmel/tse850-pcm5142.c
|
F: sound/soc/atmel/tse850-pcm5142.c
|
||||||
|
|
||||||
AZ6007 DVB DRIVER
|
AZ6007 DVB DRIVER
|
||||||
M: Mauro Carvalho Chehab <mchehab@s-opensource.com>
|
|
||||||
M: Mauro Carvalho Chehab <mchehab@kernel.org>
|
M: Mauro Carvalho Chehab <mchehab@kernel.org>
|
||||||
L: linux-media@vger.kernel.org
|
L: linux-media@vger.kernel.org
|
||||||
W: https://linuxtv.org
|
W: https://linuxtv.org
|
||||||
|
@ -3085,7 +3084,6 @@ F: include/linux/btrfs*
|
||||||
F: include/uapi/linux/btrfs*
|
F: include/uapi/linux/btrfs*
|
||||||
|
|
||||||
BTTV VIDEO4LINUX DRIVER
|
BTTV VIDEO4LINUX DRIVER
|
||||||
M: Mauro Carvalho Chehab <mchehab@s-opensource.com>
|
|
||||||
M: Mauro Carvalho Chehab <mchehab@kernel.org>
|
M: Mauro Carvalho Chehab <mchehab@kernel.org>
|
||||||
L: linux-media@vger.kernel.org
|
L: linux-media@vger.kernel.org
|
||||||
W: https://linuxtv.org
|
W: https://linuxtv.org
|
||||||
|
@ -3695,7 +3693,6 @@ F: drivers/cpufreq/arm_big_little_dt.c
|
||||||
|
|
||||||
CPU POWER MONITORING SUBSYSTEM
|
CPU POWER MONITORING SUBSYSTEM
|
||||||
M: Thomas Renninger <trenn@suse.com>
|
M: Thomas Renninger <trenn@suse.com>
|
||||||
M: Shuah Khan <shuahkh@osg.samsung.com>
|
|
||||||
M: Shuah Khan <shuah@kernel.org>
|
M: Shuah Khan <shuah@kernel.org>
|
||||||
L: linux-pm@vger.kernel.org
|
L: linux-pm@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
@ -3814,7 +3811,6 @@ S: Maintained
|
||||||
F: drivers/media/dvb-frontends/cx24120*
|
F: drivers/media/dvb-frontends/cx24120*
|
||||||
|
|
||||||
CX88 VIDEO4LINUX DRIVER
|
CX88 VIDEO4LINUX DRIVER
|
||||||
M: Mauro Carvalho Chehab <mchehab@s-opensource.com>
|
|
||||||
M: Mauro Carvalho Chehab <mchehab@kernel.org>
|
M: Mauro Carvalho Chehab <mchehab@kernel.org>
|
||||||
L: linux-media@vger.kernel.org
|
L: linux-media@vger.kernel.org
|
||||||
W: https://linuxtv.org
|
W: https://linuxtv.org
|
||||||
|
@ -5072,7 +5068,6 @@ F: drivers/edac/thunderx_edac*
|
||||||
|
|
||||||
EDAC-CORE
|
EDAC-CORE
|
||||||
M: Borislav Petkov <bp@alien8.de>
|
M: Borislav Petkov <bp@alien8.de>
|
||||||
M: Mauro Carvalho Chehab <mchehab@s-opensource.com>
|
|
||||||
M: Mauro Carvalho Chehab <mchehab@kernel.org>
|
M: Mauro Carvalho Chehab <mchehab@kernel.org>
|
||||||
L: linux-edac@vger.kernel.org
|
L: linux-edac@vger.kernel.org
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/bp/bp.git for-next
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/bp/bp.git for-next
|
||||||
|
@ -5101,7 +5096,6 @@ S: Maintained
|
||||||
F: drivers/edac/fsl_ddr_edac.*
|
F: drivers/edac/fsl_ddr_edac.*
|
||||||
|
|
||||||
EDAC-GHES
|
EDAC-GHES
|
||||||
M: Mauro Carvalho Chehab <mchehab@s-opensource.com>
|
|
||||||
M: Mauro Carvalho Chehab <mchehab@kernel.org>
|
M: Mauro Carvalho Chehab <mchehab@kernel.org>
|
||||||
L: linux-edac@vger.kernel.org
|
L: linux-edac@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
@ -5118,21 +5112,18 @@ S: Maintained
|
||||||
F: drivers/edac/i5000_edac.c
|
F: drivers/edac/i5000_edac.c
|
||||||
|
|
||||||
EDAC-I5400
|
EDAC-I5400
|
||||||
M: Mauro Carvalho Chehab <mchehab@s-opensource.com>
|
|
||||||
M: Mauro Carvalho Chehab <mchehab@kernel.org>
|
M: Mauro Carvalho Chehab <mchehab@kernel.org>
|
||||||
L: linux-edac@vger.kernel.org
|
L: linux-edac@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/edac/i5400_edac.c
|
F: drivers/edac/i5400_edac.c
|
||||||
|
|
||||||
EDAC-I7300
|
EDAC-I7300
|
||||||
M: Mauro Carvalho Chehab <mchehab@s-opensource.com>
|
|
||||||
M: Mauro Carvalho Chehab <mchehab@kernel.org>
|
M: Mauro Carvalho Chehab <mchehab@kernel.org>
|
||||||
L: linux-edac@vger.kernel.org
|
L: linux-edac@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/edac/i7300_edac.c
|
F: drivers/edac/i7300_edac.c
|
||||||
|
|
||||||
EDAC-I7CORE
|
EDAC-I7CORE
|
||||||
M: Mauro Carvalho Chehab <mchehab@s-opensource.com>
|
|
||||||
M: Mauro Carvalho Chehab <mchehab@kernel.org>
|
M: Mauro Carvalho Chehab <mchehab@kernel.org>
|
||||||
L: linux-edac@vger.kernel.org
|
L: linux-edac@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
@ -5182,7 +5173,6 @@ S: Maintained
|
||||||
F: drivers/edac/r82600_edac.c
|
F: drivers/edac/r82600_edac.c
|
||||||
|
|
||||||
EDAC-SBRIDGE
|
EDAC-SBRIDGE
|
||||||
M: Mauro Carvalho Chehab <mchehab@s-opensource.com>
|
|
||||||
M: Mauro Carvalho Chehab <mchehab@kernel.org>
|
M: Mauro Carvalho Chehab <mchehab@kernel.org>
|
||||||
L: linux-edac@vger.kernel.org
|
L: linux-edac@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
@ -5241,7 +5231,6 @@ S: Maintained
|
||||||
F: drivers/net/ethernet/ibm/ehea/
|
F: drivers/net/ethernet/ibm/ehea/
|
||||||
|
|
||||||
EM28XX VIDEO4LINUX DRIVER
|
EM28XX VIDEO4LINUX DRIVER
|
||||||
M: Mauro Carvalho Chehab <mchehab@s-opensource.com>
|
|
||||||
M: Mauro Carvalho Chehab <mchehab@kernel.org>
|
M: Mauro Carvalho Chehab <mchehab@kernel.org>
|
||||||
L: linux-media@vger.kernel.org
|
L: linux-media@vger.kernel.org
|
||||||
W: https://linuxtv.org
|
W: https://linuxtv.org
|
||||||
|
@ -7696,9 +7685,11 @@ L: linux-kbuild@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: Documentation/kbuild/
|
F: Documentation/kbuild/
|
||||||
F: Makefile
|
F: Makefile
|
||||||
F: scripts/Makefile.*
|
F: scripts/Kbuild*
|
||||||
|
F: scripts/Makefile*
|
||||||
F: scripts/basic/
|
F: scripts/basic/
|
||||||
F: scripts/mk*
|
F: scripts/mk*
|
||||||
|
F: scripts/mod/
|
||||||
F: scripts/package/
|
F: scripts/package/
|
||||||
|
|
||||||
KERNEL JANITORS
|
KERNEL JANITORS
|
||||||
|
@ -7723,7 +7714,6 @@ F: include/linux/sunrpc/
|
||||||
F: include/uapi/linux/sunrpc/
|
F: include/uapi/linux/sunrpc/
|
||||||
|
|
||||||
KERNEL SELFTEST FRAMEWORK
|
KERNEL SELFTEST FRAMEWORK
|
||||||
M: Shuah Khan <shuahkh@osg.samsung.com>
|
|
||||||
M: Shuah Khan <shuah@kernel.org>
|
M: Shuah Khan <shuah@kernel.org>
|
||||||
L: linux-kselftest@vger.kernel.org
|
L: linux-kselftest@vger.kernel.org
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest.git
|
||||||
|
@ -8890,7 +8880,6 @@ F: Documentation/devicetree/bindings/media/nvidia,tegra-vde.txt
|
||||||
F: drivers/staging/media/tegra-vde/
|
F: drivers/staging/media/tegra-vde/
|
||||||
|
|
||||||
MEDIA INPUT INFRASTRUCTURE (V4L/DVB)
|
MEDIA INPUT INFRASTRUCTURE (V4L/DVB)
|
||||||
M: Mauro Carvalho Chehab <mchehab@s-opensource.com>
|
|
||||||
M: Mauro Carvalho Chehab <mchehab@kernel.org>
|
M: Mauro Carvalho Chehab <mchehab@kernel.org>
|
||||||
P: LinuxTV.org Project
|
P: LinuxTV.org Project
|
||||||
L: linux-media@vger.kernel.org
|
L: linux-media@vger.kernel.org
|
||||||
|
@ -9744,6 +9733,7 @@ W: https://fedorahosted.org/dropwatch/
|
||||||
F: net/core/drop_monitor.c
|
F: net/core/drop_monitor.c
|
||||||
|
|
||||||
NETWORKING DRIVERS
|
NETWORKING DRIVERS
|
||||||
|
M: "David S. Miller" <davem@davemloft.net>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
W: http://www.linuxfoundation.org/en/Net
|
W: http://www.linuxfoundation.org/en/Net
|
||||||
Q: http://patchwork.ozlabs.org/project/netdev/list/
|
Q: http://patchwork.ozlabs.org/project/netdev/list/
|
||||||
|
@ -9900,7 +9890,7 @@ F: include/linux/platform_data/nxp-nci.h
|
||||||
F: Documentation/devicetree/bindings/net/nfc/
|
F: Documentation/devicetree/bindings/net/nfc/
|
||||||
|
|
||||||
NFS, SUNRPC, AND LOCKD CLIENTS
|
NFS, SUNRPC, AND LOCKD CLIENTS
|
||||||
M: Trond Myklebust <trond.myklebust@primarydata.com>
|
M: Trond Myklebust <trond.myklebust@hammerspace.com>
|
||||||
M: Anna Schumaker <anna.schumaker@netapp.com>
|
M: Anna Schumaker <anna.schumaker@netapp.com>
|
||||||
L: linux-nfs@vger.kernel.org
|
L: linux-nfs@vger.kernel.org
|
||||||
W: http://client.linux-nfs.org
|
W: http://client.linux-nfs.org
|
||||||
|
@ -12278,7 +12268,6 @@ S: Odd Fixes
|
||||||
F: drivers/media/i2c/saa6588*
|
F: drivers/media/i2c/saa6588*
|
||||||
|
|
||||||
SAA7134 VIDEO4LINUX DRIVER
|
SAA7134 VIDEO4LINUX DRIVER
|
||||||
M: Mauro Carvalho Chehab <mchehab@s-opensource.com>
|
|
||||||
M: Mauro Carvalho Chehab <mchehab@kernel.org>
|
M: Mauro Carvalho Chehab <mchehab@kernel.org>
|
||||||
L: linux-media@vger.kernel.org
|
L: linux-media@vger.kernel.org
|
||||||
W: https://linuxtv.org
|
W: https://linuxtv.org
|
||||||
|
@ -12517,6 +12506,7 @@ F: drivers/scsi/st_*.h
|
||||||
SCTP PROTOCOL
|
SCTP PROTOCOL
|
||||||
M: Vlad Yasevich <vyasevich@gmail.com>
|
M: Vlad Yasevich <vyasevich@gmail.com>
|
||||||
M: Neil Horman <nhorman@tuxdriver.com>
|
M: Neil Horman <nhorman@tuxdriver.com>
|
||||||
|
M: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
|
||||||
L: linux-sctp@vger.kernel.org
|
L: linux-sctp@vger.kernel.org
|
||||||
W: http://lksctp.sourceforge.net
|
W: http://lksctp.sourceforge.net
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
@ -12782,7 +12772,6 @@ S: Maintained
|
||||||
F: drivers/media/radio/si4713/radio-usb-si4713.c
|
F: drivers/media/radio/si4713/radio-usb-si4713.c
|
||||||
|
|
||||||
SIANO DVB DRIVER
|
SIANO DVB DRIVER
|
||||||
M: Mauro Carvalho Chehab <mchehab@s-opensource.com>
|
|
||||||
M: Mauro Carvalho Chehab <mchehab@kernel.org>
|
M: Mauro Carvalho Chehab <mchehab@kernel.org>
|
||||||
L: linux-media@vger.kernel.org
|
L: linux-media@vger.kernel.org
|
||||||
W: https://linuxtv.org
|
W: https://linuxtv.org
|
||||||
|
@ -13773,7 +13762,6 @@ S: Maintained
|
||||||
F: drivers/media/i2c/tda9840*
|
F: drivers/media/i2c/tda9840*
|
||||||
|
|
||||||
TEA5761 TUNER DRIVER
|
TEA5761 TUNER DRIVER
|
||||||
M: Mauro Carvalho Chehab <mchehab@s-opensource.com>
|
|
||||||
M: Mauro Carvalho Chehab <mchehab@kernel.org>
|
M: Mauro Carvalho Chehab <mchehab@kernel.org>
|
||||||
L: linux-media@vger.kernel.org
|
L: linux-media@vger.kernel.org
|
||||||
W: https://linuxtv.org
|
W: https://linuxtv.org
|
||||||
|
@ -13782,7 +13770,6 @@ S: Odd fixes
|
||||||
F: drivers/media/tuners/tea5761.*
|
F: drivers/media/tuners/tea5761.*
|
||||||
|
|
||||||
TEA5767 TUNER DRIVER
|
TEA5767 TUNER DRIVER
|
||||||
M: Mauro Carvalho Chehab <mchehab@s-opensource.com>
|
|
||||||
M: Mauro Carvalho Chehab <mchehab@kernel.org>
|
M: Mauro Carvalho Chehab <mchehab@kernel.org>
|
||||||
L: linux-media@vger.kernel.org
|
L: linux-media@vger.kernel.org
|
||||||
W: https://linuxtv.org
|
W: https://linuxtv.org
|
||||||
|
@ -13872,7 +13859,6 @@ S: Supported
|
||||||
F: drivers/iommu/tegra*
|
F: drivers/iommu/tegra*
|
||||||
|
|
||||||
TEGRA KBC DRIVER
|
TEGRA KBC DRIVER
|
||||||
M: Rakesh Iyer <riyer@nvidia.com>
|
|
||||||
M: Laxman Dewangan <ldewangan@nvidia.com>
|
M: Laxman Dewangan <ldewangan@nvidia.com>
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/input/keyboard/tegra-kbc.c
|
F: drivers/input/keyboard/tegra-kbc.c
|
||||||
|
@ -14199,7 +14185,6 @@ F: Documentation/networking/tlan.txt
|
||||||
F: drivers/net/ethernet/ti/tlan.*
|
F: drivers/net/ethernet/ti/tlan.*
|
||||||
|
|
||||||
TM6000 VIDEO4LINUX DRIVER
|
TM6000 VIDEO4LINUX DRIVER
|
||||||
M: Mauro Carvalho Chehab <mchehab@s-opensource.com>
|
|
||||||
M: Mauro Carvalho Chehab <mchehab@kernel.org>
|
M: Mauro Carvalho Chehab <mchehab@kernel.org>
|
||||||
L: linux-media@vger.kernel.org
|
L: linux-media@vger.kernel.org
|
||||||
W: https://linuxtv.org
|
W: https://linuxtv.org
|
||||||
|
@ -14682,7 +14667,6 @@ F: drivers/usb/common/usb-otg-fsm.c
|
||||||
|
|
||||||
USB OVER IP DRIVER
|
USB OVER IP DRIVER
|
||||||
M: Valentina Manea <valentina.manea.m@gmail.com>
|
M: Valentina Manea <valentina.manea.m@gmail.com>
|
||||||
M: Shuah Khan <shuahkh@osg.samsung.com>
|
|
||||||
M: Shuah Khan <shuah@kernel.org>
|
M: Shuah Khan <shuah@kernel.org>
|
||||||
L: linux-usb@vger.kernel.org
|
L: linux-usb@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
@ -15426,7 +15410,6 @@ S: Maintained
|
||||||
F: arch/x86/entry/vdso/
|
F: arch/x86/entry/vdso/
|
||||||
|
|
||||||
XC2028/3028 TUNER DRIVER
|
XC2028/3028 TUNER DRIVER
|
||||||
M: Mauro Carvalho Chehab <mchehab@s-opensource.com>
|
|
||||||
M: Mauro Carvalho Chehab <mchehab@kernel.org>
|
M: Mauro Carvalho Chehab <mchehab@kernel.org>
|
||||||
L: linux-media@vger.kernel.org
|
L: linux-media@vger.kernel.org
|
||||||
W: https://linuxtv.org
|
W: https://linuxtv.org
|
||||||
|
|
4
Makefile
4
Makefile
|
@ -2,8 +2,8 @@
|
||||||
VERSION = 4
|
VERSION = 4
|
||||||
PATCHLEVEL = 17
|
PATCHLEVEL = 17
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc3
|
EXTRAVERSION = -rc5
|
||||||
NAME = Fearless Coyote
|
NAME = Merciless Moray
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
# To see a list of typical targets execute "make help"
|
# To see a list of typical targets execute "make help"
|
||||||
|
|
|
@ -464,6 +464,10 @@ config GCC_PLUGIN_LATENT_ENTROPY
|
||||||
config GCC_PLUGIN_STRUCTLEAK
|
config GCC_PLUGIN_STRUCTLEAK
|
||||||
bool "Force initialization of variables containing userspace addresses"
|
bool "Force initialization of variables containing userspace addresses"
|
||||||
depends on GCC_PLUGINS
|
depends on GCC_PLUGINS
|
||||||
|
# Currently STRUCTLEAK inserts initialization out of live scope of
|
||||||
|
# variables from KASAN point of view. This leads to KASAN false
|
||||||
|
# positive reports. Prohibit this combination for now.
|
||||||
|
depends on !KASAN_EXTRA
|
||||||
help
|
help
|
||||||
This plugin zero-initializes any structures containing a
|
This plugin zero-initializes any structures containing a
|
||||||
__user attribute. This can prevent some classes of information
|
__user attribute. This can prevent some classes of information
|
||||||
|
|
|
@ -303,7 +303,7 @@ wdog: wdog@53fdc000 {
|
||||||
};
|
};
|
||||||
|
|
||||||
can1: can@53fe4000 {
|
can1: can@53fe4000 {
|
||||||
compatible = "fsl,imx35-flexcan";
|
compatible = "fsl,imx35-flexcan", "fsl,imx25-flexcan";
|
||||||
reg = <0x53fe4000 0x1000>;
|
reg = <0x53fe4000 0x1000>;
|
||||||
clocks = <&clks 33>, <&clks 33>;
|
clocks = <&clks 33>, <&clks 33>;
|
||||||
clock-names = "ipg", "per";
|
clock-names = "ipg", "per";
|
||||||
|
@ -312,7 +312,7 @@ can1: can@53fe4000 {
|
||||||
};
|
};
|
||||||
|
|
||||||
can2: can@53fe8000 {
|
can2: can@53fe8000 {
|
||||||
compatible = "fsl,imx35-flexcan";
|
compatible = "fsl,imx35-flexcan", "fsl,imx25-flexcan";
|
||||||
reg = <0x53fe8000 0x1000>;
|
reg = <0x53fe8000 0x1000>;
|
||||||
clocks = <&clks 34>, <&clks 34>;
|
clocks = <&clks 34>, <&clks 34>;
|
||||||
clock-names = "ipg", "per";
|
clock-names = "ipg", "per";
|
||||||
|
|
|
@ -551,7 +551,7 @@ uart2: serial@53fc0000 {
|
||||||
};
|
};
|
||||||
|
|
||||||
can1: can@53fc8000 {
|
can1: can@53fc8000 {
|
||||||
compatible = "fsl,imx53-flexcan";
|
compatible = "fsl,imx53-flexcan", "fsl,imx25-flexcan";
|
||||||
reg = <0x53fc8000 0x4000>;
|
reg = <0x53fc8000 0x4000>;
|
||||||
interrupts = <82>;
|
interrupts = <82>;
|
||||||
clocks = <&clks IMX5_CLK_CAN1_IPG_GATE>,
|
clocks = <&clks IMX5_CLK_CAN1_IPG_GATE>,
|
||||||
|
@ -561,7 +561,7 @@ can1: can@53fc8000 {
|
||||||
};
|
};
|
||||||
|
|
||||||
can2: can@53fcc000 {
|
can2: can@53fcc000 {
|
||||||
compatible = "fsl,imx53-flexcan";
|
compatible = "fsl,imx53-flexcan", "fsl,imx25-flexcan";
|
||||||
reg = <0x53fcc000 0x4000>;
|
reg = <0x53fcc000 0x4000>;
|
||||||
interrupts = <83>;
|
interrupts = <83>;
|
||||||
clocks = <&clks IMX5_CLK_CAN2_IPG_GATE>,
|
clocks = <&clks IMX5_CLK_CAN2_IPG_GATE>,
|
||||||
|
|
|
@ -75,6 +75,7 @@
|
||||||
#define ARM_CPU_IMP_CAVIUM 0x43
|
#define ARM_CPU_IMP_CAVIUM 0x43
|
||||||
#define ARM_CPU_IMP_BRCM 0x42
|
#define ARM_CPU_IMP_BRCM 0x42
|
||||||
#define ARM_CPU_IMP_QCOM 0x51
|
#define ARM_CPU_IMP_QCOM 0x51
|
||||||
|
#define ARM_CPU_IMP_NVIDIA 0x4E
|
||||||
|
|
||||||
#define ARM_CPU_PART_AEM_V8 0xD0F
|
#define ARM_CPU_PART_AEM_V8 0xD0F
|
||||||
#define ARM_CPU_PART_FOUNDATION 0xD00
|
#define ARM_CPU_PART_FOUNDATION 0xD00
|
||||||
|
@ -99,6 +100,9 @@
|
||||||
#define QCOM_CPU_PART_FALKOR 0xC00
|
#define QCOM_CPU_PART_FALKOR 0xC00
|
||||||
#define QCOM_CPU_PART_KRYO 0x200
|
#define QCOM_CPU_PART_KRYO 0x200
|
||||||
|
|
||||||
|
#define NVIDIA_CPU_PART_DENVER 0x003
|
||||||
|
#define NVIDIA_CPU_PART_CARMEL 0x004
|
||||||
|
|
||||||
#define MIDR_CORTEX_A53 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A53)
|
#define MIDR_CORTEX_A53 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A53)
|
||||||
#define MIDR_CORTEX_A57 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A57)
|
#define MIDR_CORTEX_A57 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A57)
|
||||||
#define MIDR_CORTEX_A72 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A72)
|
#define MIDR_CORTEX_A72 MIDR_CPU_MODEL(ARM_CPU_IMP_ARM, ARM_CPU_PART_CORTEX_A72)
|
||||||
|
@ -114,6 +118,8 @@
|
||||||
#define MIDR_QCOM_FALKOR_V1 MIDR_CPU_MODEL(ARM_CPU_IMP_QCOM, QCOM_CPU_PART_FALKOR_V1)
|
#define MIDR_QCOM_FALKOR_V1 MIDR_CPU_MODEL(ARM_CPU_IMP_QCOM, QCOM_CPU_PART_FALKOR_V1)
|
||||||
#define MIDR_QCOM_FALKOR MIDR_CPU_MODEL(ARM_CPU_IMP_QCOM, QCOM_CPU_PART_FALKOR)
|
#define MIDR_QCOM_FALKOR MIDR_CPU_MODEL(ARM_CPU_IMP_QCOM, QCOM_CPU_PART_FALKOR)
|
||||||
#define MIDR_QCOM_KRYO MIDR_CPU_MODEL(ARM_CPU_IMP_QCOM, QCOM_CPU_PART_KRYO)
|
#define MIDR_QCOM_KRYO MIDR_CPU_MODEL(ARM_CPU_IMP_QCOM, QCOM_CPU_PART_KRYO)
|
||||||
|
#define MIDR_NVIDIA_DENVER MIDR_CPU_MODEL(ARM_CPU_IMP_NVIDIA, NVIDIA_CPU_PART_DENVER)
|
||||||
|
#define MIDR_NVIDIA_CARMEL MIDR_CPU_MODEL(ARM_CPU_IMP_NVIDIA, NVIDIA_CPU_PART_CARMEL)
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
|
|
|
@ -333,7 +333,7 @@ static inline void kvm_vcpu_set_be(struct kvm_vcpu *vcpu)
|
||||||
} else {
|
} else {
|
||||||
u64 sctlr = vcpu_read_sys_reg(vcpu, SCTLR_EL1);
|
u64 sctlr = vcpu_read_sys_reg(vcpu, SCTLR_EL1);
|
||||||
sctlr |= (1 << 25);
|
sctlr |= (1 << 25);
|
||||||
vcpu_write_sys_reg(vcpu, SCTLR_EL1, sctlr);
|
vcpu_write_sys_reg(vcpu, sctlr, SCTLR_EL1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -316,6 +316,7 @@ static const struct midr_range arm64_bp_harden_smccc_cpus[] = {
|
||||||
MIDR_ALL_VERSIONS(MIDR_CAVIUM_THUNDERX2),
|
MIDR_ALL_VERSIONS(MIDR_CAVIUM_THUNDERX2),
|
||||||
MIDR_ALL_VERSIONS(MIDR_QCOM_FALKOR_V1),
|
MIDR_ALL_VERSIONS(MIDR_QCOM_FALKOR_V1),
|
||||||
MIDR_ALL_VERSIONS(MIDR_QCOM_FALKOR),
|
MIDR_ALL_VERSIONS(MIDR_QCOM_FALKOR),
|
||||||
|
MIDR_ALL_VERSIONS(MIDR_NVIDIA_DENVER),
|
||||||
{},
|
{},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -18,11 +18,20 @@
|
||||||
#include <linux/compiler.h>
|
#include <linux/compiler.h>
|
||||||
#include <linux/irqchip/arm-gic.h>
|
#include <linux/irqchip/arm-gic.h>
|
||||||
#include <linux/kvm_host.h>
|
#include <linux/kvm_host.h>
|
||||||
|
#include <linux/swab.h>
|
||||||
|
|
||||||
#include <asm/kvm_emulate.h>
|
#include <asm/kvm_emulate.h>
|
||||||
#include <asm/kvm_hyp.h>
|
#include <asm/kvm_hyp.h>
|
||||||
#include <asm/kvm_mmu.h>
|
#include <asm/kvm_mmu.h>
|
||||||
|
|
||||||
|
static bool __hyp_text __is_be(struct kvm_vcpu *vcpu)
|
||||||
|
{
|
||||||
|
if (vcpu_mode_is_32bit(vcpu))
|
||||||
|
return !!(read_sysreg_el2(spsr) & COMPAT_PSR_E_BIT);
|
||||||
|
|
||||||
|
return !!(read_sysreg(SCTLR_EL1) & SCTLR_ELx_EE);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* __vgic_v2_perform_cpuif_access -- perform a GICV access on behalf of the
|
* __vgic_v2_perform_cpuif_access -- perform a GICV access on behalf of the
|
||||||
* guest.
|
* guest.
|
||||||
|
@ -64,14 +73,19 @@ int __hyp_text __vgic_v2_perform_cpuif_access(struct kvm_vcpu *vcpu)
|
||||||
addr += fault_ipa - vgic->vgic_cpu_base;
|
addr += fault_ipa - vgic->vgic_cpu_base;
|
||||||
|
|
||||||
if (kvm_vcpu_dabt_iswrite(vcpu)) {
|
if (kvm_vcpu_dabt_iswrite(vcpu)) {
|
||||||
u32 data = vcpu_data_guest_to_host(vcpu,
|
u32 data = vcpu_get_reg(vcpu, rd);
|
||||||
vcpu_get_reg(vcpu, rd),
|
if (__is_be(vcpu)) {
|
||||||
sizeof(u32));
|
/* guest pre-swabbed data, undo this for writel() */
|
||||||
|
data = swab32(data);
|
||||||
|
}
|
||||||
writel_relaxed(data, addr);
|
writel_relaxed(data, addr);
|
||||||
} else {
|
} else {
|
||||||
u32 data = readl_relaxed(addr);
|
u32 data = readl_relaxed(addr);
|
||||||
vcpu_set_reg(vcpu, rd, vcpu_data_host_to_guest(vcpu, data,
|
if (__is_be(vcpu)) {
|
||||||
sizeof(u32)));
|
/* guest expects swabbed data */
|
||||||
|
data = swab32(data);
|
||||||
|
}
|
||||||
|
vcpu_set_reg(vcpu, rd, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
@ -646,8 +646,10 @@ static int keep_initrd __initdata;
|
||||||
|
|
||||||
void __init free_initrd_mem(unsigned long start, unsigned long end)
|
void __init free_initrd_mem(unsigned long start, unsigned long end)
|
||||||
{
|
{
|
||||||
if (!keep_initrd)
|
if (!keep_initrd) {
|
||||||
free_reserved_area((void *)start, (void *)end, 0, "initrd");
|
free_reserved_area((void *)start, (void *)end, 0, "initrd");
|
||||||
|
memblock_free(__virt_to_phys(start), end - start);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __init keepinitrd_setup(char *__unused)
|
static int __init keepinitrd_setup(char *__unused)
|
||||||
|
|
|
@ -216,6 +216,12 @@ static inline void memcpy_toio(volatile void __iomem *dst, const void *src,
|
||||||
memcpy((void *) dst, src, count);
|
memcpy((void *) dst, src, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void memset_io(volatile void __iomem *addr, int value,
|
||||||
|
size_t size)
|
||||||
|
{
|
||||||
|
memset((void __force *)addr, value, size);
|
||||||
|
}
|
||||||
|
|
||||||
#define PCI_IO_ADDR (volatile void __iomem *)
|
#define PCI_IO_ADDR (volatile void __iomem *)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -199,3 +199,4 @@ csum_partial_copy_nocheck(const void *src, void *dst, int len, __wsum sum)
|
||||||
memcpy(dst, src, len);
|
memcpy(dst, src, len);
|
||||||
return csum_partial(dst, len, sum);
|
return csum_partial(dst, len, sum);
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL(csum_partial_copy_nocheck);
|
||||||
|
|
|
@ -123,6 +123,9 @@ INSTALL_TARGETS = zinstall install
|
||||||
|
|
||||||
PHONY += bzImage $(BOOT_TARGETS) $(INSTALL_TARGETS)
|
PHONY += bzImage $(BOOT_TARGETS) $(INSTALL_TARGETS)
|
||||||
|
|
||||||
|
# Default kernel to build
|
||||||
|
all: bzImage
|
||||||
|
|
||||||
zImage: vmlinuz
|
zImage: vmlinuz
|
||||||
Image: vmlinux
|
Image: vmlinux
|
||||||
|
|
||||||
|
|
|
@ -448,7 +448,8 @@ static int match_by_id(struct device * dev, void * data)
|
||||||
* Checks all the children of @parent for a matching @id. If none
|
* Checks all the children of @parent for a matching @id. If none
|
||||||
* found, it allocates a new device and returns it.
|
* found, it allocates a new device and returns it.
|
||||||
*/
|
*/
|
||||||
static struct parisc_device * alloc_tree_node(struct device *parent, char id)
|
static struct parisc_device * __init alloc_tree_node(
|
||||||
|
struct device *parent, char id)
|
||||||
{
|
{
|
||||||
struct match_id_data d = {
|
struct match_id_data d = {
|
||||||
.id = id,
|
.id = id,
|
||||||
|
@ -825,8 +826,8 @@ static void walk_lower_bus(struct parisc_device *dev)
|
||||||
* devices which are not physically connected (such as extra serial &
|
* devices which are not physically connected (such as extra serial &
|
||||||
* keyboard ports). This problem is not yet solved.
|
* keyboard ports). This problem is not yet solved.
|
||||||
*/
|
*/
|
||||||
static void walk_native_bus(unsigned long io_io_low, unsigned long io_io_high,
|
static void __init walk_native_bus(unsigned long io_io_low,
|
||||||
struct device *parent)
|
unsigned long io_io_high, struct device *parent)
|
||||||
{
|
{
|
||||||
int i, devices_found = 0;
|
int i, devices_found = 0;
|
||||||
unsigned long hpa = io_io_low;
|
unsigned long hpa = io_io_low;
|
||||||
|
|
|
@ -174,7 +174,7 @@ void pcibios_set_master(struct pci_dev *dev)
|
||||||
* pcibios_init_bridge() initializes cache line and default latency
|
* pcibios_init_bridge() initializes cache line and default latency
|
||||||
* for pci controllers and pci-pci bridges
|
* for pci controllers and pci-pci bridges
|
||||||
*/
|
*/
|
||||||
void __init pcibios_init_bridge(struct pci_dev *dev)
|
void __ref pcibios_init_bridge(struct pci_dev *dev)
|
||||||
{
|
{
|
||||||
unsigned short bridge_ctl, bridge_ctl_new;
|
unsigned short bridge_ctl, bridge_ctl_new;
|
||||||
|
|
||||||
|
|
|
@ -205,7 +205,7 @@ static int __init rtc_init(void)
|
||||||
device_initcall(rtc_init);
|
device_initcall(rtc_init);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void read_persistent_clock(struct timespec *ts)
|
void read_persistent_clock64(struct timespec64 *ts)
|
||||||
{
|
{
|
||||||
static struct pdc_tod tod_data;
|
static struct pdc_tod tod_data;
|
||||||
if (pdc_tod_read(&tod_data) == 0) {
|
if (pdc_tod_read(&tod_data) == 0) {
|
||||||
|
|
|
@ -837,6 +837,17 @@ void __init initialize_ivt(const void *iva)
|
||||||
if (pdc_instr(&instr) == PDC_OK)
|
if (pdc_instr(&instr) == PDC_OK)
|
||||||
ivap[0] = instr;
|
ivap[0] = instr;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Rules for the checksum of the HPMC handler:
|
||||||
|
* 1. The IVA does not point to PDC/PDH space (ie: the OS has installed
|
||||||
|
* its own IVA).
|
||||||
|
* 2. The word at IVA + 32 is nonzero.
|
||||||
|
* 3. If Length (IVA + 60) is not zero, then Length (IVA + 60) and
|
||||||
|
* Address (IVA + 56) are word-aligned.
|
||||||
|
* 4. The checksum of the 8 words starting at IVA + 32 plus the sum of
|
||||||
|
* the Length/4 words starting at Address is zero.
|
||||||
|
*/
|
||||||
|
|
||||||
/* Compute Checksum for HPMC handler */
|
/* Compute Checksum for HPMC handler */
|
||||||
length = os_hpmc_size;
|
length = os_hpmc_size;
|
||||||
ivap[7] = length;
|
ivap[7] = length;
|
||||||
|
|
|
@ -516,7 +516,7 @@ static void __init map_pages(unsigned long start_vaddr,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void free_initmem(void)
|
void __ref free_initmem(void)
|
||||||
{
|
{
|
||||||
unsigned long init_begin = (unsigned long)__init_begin;
|
unsigned long init_begin = (unsigned long)__init_begin;
|
||||||
unsigned long init_end = (unsigned long)__init_end;
|
unsigned long init_end = (unsigned long)__init_end;
|
||||||
|
|
|
@ -69,17 +69,30 @@ struct dyn_arch_ftrace {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_FTRACE_SYSCALLS) && !defined(__ASSEMBLY__)
|
#if defined(CONFIG_FTRACE_SYSCALLS) && !defined(__ASSEMBLY__)
|
||||||
#ifdef PPC64_ELF_ABI_v1
|
/*
|
||||||
|
* Some syscall entry functions on powerpc start with "ppc_" (fork and clone,
|
||||||
|
* for instance) or ppc32_/ppc64_. We should also match the sys_ variant with
|
||||||
|
* those.
|
||||||
|
*/
|
||||||
#define ARCH_HAS_SYSCALL_MATCH_SYM_NAME
|
#define ARCH_HAS_SYSCALL_MATCH_SYM_NAME
|
||||||
|
#ifdef PPC64_ELF_ABI_v1
|
||||||
static inline bool arch_syscall_match_sym_name(const char *sym, const char *name)
|
static inline bool arch_syscall_match_sym_name(const char *sym, const char *name)
|
||||||
{
|
{
|
||||||
/*
|
/* We need to skip past the initial dot, and the __se_sys alias */
|
||||||
* Compare the symbol name with the system call name. Skip the .sys or .SyS
|
return !strcmp(sym + 1, name) ||
|
||||||
* prefix from the symbol name and the sys prefix from the system call name and
|
(!strncmp(sym, ".__se_sys", 9) && !strcmp(sym + 6, name)) ||
|
||||||
* just match the rest. This is only needed on ppc64 since symbol names on
|
(!strncmp(sym, ".ppc_", 5) && !strcmp(sym + 5, name + 4)) ||
|
||||||
* 32bit do not start with a period so the generic function will work.
|
(!strncmp(sym, ".ppc32_", 7) && !strcmp(sym + 7, name + 4)) ||
|
||||||
*/
|
(!strncmp(sym, ".ppc64_", 7) && !strcmp(sym + 7, name + 4));
|
||||||
return !strcmp(sym + 4, name + 3);
|
}
|
||||||
|
#else
|
||||||
|
static inline bool arch_syscall_match_sym_name(const char *sym, const char *name)
|
||||||
|
{
|
||||||
|
return !strcmp(sym, name) ||
|
||||||
|
(!strncmp(sym, "__se_sys", 8) && !strcmp(sym + 5, name)) ||
|
||||||
|
(!strncmp(sym, "ppc_", 4) && !strcmp(sym + 4, name + 4)) ||
|
||||||
|
(!strncmp(sym, "ppc32_", 6) && !strcmp(sym + 6, name + 4)) ||
|
||||||
|
(!strncmp(sym, "ppc64_", 6) && !strcmp(sym + 6, name + 4));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif /* CONFIG_FTRACE_SYSCALLS && !__ASSEMBLY__ */
|
#endif /* CONFIG_FTRACE_SYSCALLS && !__ASSEMBLY__ */
|
||||||
|
|
|
@ -165,7 +165,6 @@ struct paca_struct {
|
||||||
u64 saved_msr; /* MSR saved here by enter_rtas */
|
u64 saved_msr; /* MSR saved here by enter_rtas */
|
||||||
u16 trap_save; /* Used when bad stack is encountered */
|
u16 trap_save; /* Used when bad stack is encountered */
|
||||||
u8 irq_soft_mask; /* mask for irq soft masking */
|
u8 irq_soft_mask; /* mask for irq soft masking */
|
||||||
u8 soft_enabled; /* irq soft-enable flag */
|
|
||||||
u8 irq_happened; /* irq happened while soft-disabled */
|
u8 irq_happened; /* irq happened while soft-disabled */
|
||||||
u8 io_sync; /* writel() needs spin_unlock sync */
|
u8 io_sync; /* writel() needs spin_unlock sync */
|
||||||
u8 irq_work_pending; /* IRQ_WORK interrupt while soft-disable */
|
u8 irq_work_pending; /* IRQ_WORK interrupt while soft-disable */
|
||||||
|
|
|
@ -91,6 +91,7 @@ extern int start_topology_update(void);
|
||||||
extern int stop_topology_update(void);
|
extern int stop_topology_update(void);
|
||||||
extern int prrn_is_enabled(void);
|
extern int prrn_is_enabled(void);
|
||||||
extern int find_and_online_cpu_nid(int cpu);
|
extern int find_and_online_cpu_nid(int cpu);
|
||||||
|
extern int timed_topology_update(int nsecs);
|
||||||
#else
|
#else
|
||||||
static inline int start_topology_update(void)
|
static inline int start_topology_update(void)
|
||||||
{
|
{
|
||||||
|
@ -108,16 +109,12 @@ static inline int find_and_online_cpu_nid(int cpu)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
static inline int timed_topology_update(int nsecs)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
#endif /* CONFIG_NUMA && CONFIG_PPC_SPLPAR */
|
#endif /* CONFIG_NUMA && CONFIG_PPC_SPLPAR */
|
||||||
|
|
||||||
#if defined(CONFIG_HOTPLUG_CPU) || defined(CONFIG_NEED_MULTIPLE_NODES)
|
|
||||||
#if defined(CONFIG_PPC_SPLPAR)
|
|
||||||
extern int timed_topology_update(int nsecs);
|
|
||||||
#else
|
|
||||||
#define timed_topology_update(nsecs)
|
|
||||||
#endif /* CONFIG_PPC_SPLPAR */
|
|
||||||
#endif /* CONFIG_HOTPLUG_CPU || CONFIG_NEED_MULTIPLE_NODES */
|
|
||||||
|
|
||||||
#include <asm-generic/topology.h>
|
#include <asm-generic/topology.h>
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
|
|
|
@ -9,6 +9,7 @@ config SUPERH
|
||||||
select HAVE_IDE if HAS_IOPORT_MAP
|
select HAVE_IDE if HAS_IOPORT_MAP
|
||||||
select HAVE_MEMBLOCK
|
select HAVE_MEMBLOCK
|
||||||
select HAVE_MEMBLOCK_NODE_MAP
|
select HAVE_MEMBLOCK_NODE_MAP
|
||||||
|
select NO_BOOTMEM
|
||||||
select ARCH_DISCARD_MEMBLOCK
|
select ARCH_DISCARD_MEMBLOCK
|
||||||
select HAVE_OPROFILE
|
select HAVE_OPROFILE
|
||||||
select HAVE_GENERIC_DMA_COHERENT
|
select HAVE_GENERIC_DMA_COHERENT
|
||||||
|
|
|
@ -43,7 +43,11 @@ void __ref cpu_probe(void)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(CONFIG_CPU_J2)
|
#if defined(CONFIG_CPU_J2)
|
||||||
|
#if defined(CONFIG_SMP)
|
||||||
unsigned cpu = hard_smp_processor_id();
|
unsigned cpu = hard_smp_processor_id();
|
||||||
|
#else
|
||||||
|
unsigned cpu = 0;
|
||||||
|
#endif
|
||||||
if (cpu == 0) of_scan_flat_dt(scan_cache, NULL);
|
if (cpu == 0) of_scan_flat_dt(scan_cache, NULL);
|
||||||
if (j2_ccr_base) __raw_writel(0x80000303, j2_ccr_base + 4*cpu);
|
if (j2_ccr_base) __raw_writel(0x80000303, j2_ccr_base + 4*cpu);
|
||||||
if (cpu != 0) return;
|
if (cpu != 0) return;
|
||||||
|
|
|
@ -11,7 +11,6 @@
|
||||||
#include <linux/ioport.h>
|
#include <linux/ioport.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/initrd.h>
|
#include <linux/initrd.h>
|
||||||
#include <linux/bootmem.h>
|
|
||||||
#include <linux/console.h>
|
#include <linux/console.h>
|
||||||
#include <linux/root_dev.h>
|
#include <linux/root_dev.h>
|
||||||
#include <linux/utsname.h>
|
#include <linux/utsname.h>
|
||||||
|
|
|
@ -59,7 +59,9 @@ void *dma_generic_alloc_coherent(struct device *dev, size_t size,
|
||||||
|
|
||||||
split_page(pfn_to_page(virt_to_phys(ret) >> PAGE_SHIFT), order);
|
split_page(pfn_to_page(virt_to_phys(ret) >> PAGE_SHIFT), order);
|
||||||
|
|
||||||
*dma_handle = virt_to_phys(ret) - PFN_PHYS(dev->dma_pfn_offset);
|
*dma_handle = virt_to_phys(ret);
|
||||||
|
if (!WARN_ON(!dev))
|
||||||
|
*dma_handle -= PFN_PHYS(dev->dma_pfn_offset);
|
||||||
|
|
||||||
return ret_nocache;
|
return ret_nocache;
|
||||||
}
|
}
|
||||||
|
@ -69,9 +71,12 @@ void dma_generic_free_coherent(struct device *dev, size_t size,
|
||||||
unsigned long attrs)
|
unsigned long attrs)
|
||||||
{
|
{
|
||||||
int order = get_order(size);
|
int order = get_order(size);
|
||||||
unsigned long pfn = (dma_handle >> PAGE_SHIFT) + dev->dma_pfn_offset;
|
unsigned long pfn = dma_handle >> PAGE_SHIFT;
|
||||||
int k;
|
int k;
|
||||||
|
|
||||||
|
if (!WARN_ON(!dev))
|
||||||
|
pfn += dev->dma_pfn_offset;
|
||||||
|
|
||||||
for (k = 0; k < (1 << order); k++)
|
for (k = 0; k < (1 << order); k++)
|
||||||
__free_pages(pfn_to_page(pfn + k), 0);
|
__free_pages(pfn_to_page(pfn + k), 0);
|
||||||
|
|
||||||
|
@ -143,7 +148,7 @@ int __init platform_resource_setup_memory(struct platform_device *pdev,
|
||||||
if (!memsize)
|
if (!memsize)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
buf = dma_alloc_coherent(NULL, memsize, &dma_handle, GFP_KERNEL);
|
buf = dma_alloc_coherent(&pdev->dev, memsize, &dma_handle, GFP_KERNEL);
|
||||||
if (!buf) {
|
if (!buf) {
|
||||||
pr_warning("%s: unable to allocate memory\n", name);
|
pr_warning("%s: unable to allocate memory\n", name);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
|
@ -211,59 +211,15 @@ void __init allocate_pgdat(unsigned int nid)
|
||||||
|
|
||||||
NODE_DATA(nid) = __va(phys);
|
NODE_DATA(nid) = __va(phys);
|
||||||
memset(NODE_DATA(nid), 0, sizeof(struct pglist_data));
|
memset(NODE_DATA(nid), 0, sizeof(struct pglist_data));
|
||||||
|
|
||||||
NODE_DATA(nid)->bdata = &bootmem_node_data[nid];
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
NODE_DATA(nid)->node_start_pfn = start_pfn;
|
NODE_DATA(nid)->node_start_pfn = start_pfn;
|
||||||
NODE_DATA(nid)->node_spanned_pages = end_pfn - start_pfn;
|
NODE_DATA(nid)->node_spanned_pages = end_pfn - start_pfn;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init bootmem_init_one_node(unsigned int nid)
|
|
||||||
{
|
|
||||||
unsigned long total_pages, paddr;
|
|
||||||
unsigned long end_pfn;
|
|
||||||
struct pglist_data *p;
|
|
||||||
|
|
||||||
p = NODE_DATA(nid);
|
|
||||||
|
|
||||||
/* Nothing to do.. */
|
|
||||||
if (!p->node_spanned_pages)
|
|
||||||
return;
|
|
||||||
|
|
||||||
end_pfn = pgdat_end_pfn(p);
|
|
||||||
|
|
||||||
total_pages = bootmem_bootmap_pages(p->node_spanned_pages);
|
|
||||||
|
|
||||||
paddr = memblock_alloc(total_pages << PAGE_SHIFT, PAGE_SIZE);
|
|
||||||
if (!paddr)
|
|
||||||
panic("Can't allocate bootmap for nid[%d]\n", nid);
|
|
||||||
|
|
||||||
init_bootmem_node(p, paddr >> PAGE_SHIFT, p->node_start_pfn, end_pfn);
|
|
||||||
|
|
||||||
free_bootmem_with_active_regions(nid, end_pfn);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* XXX Handle initial reservations for the system memory node
|
|
||||||
* only for the moment, we'll refactor this later for handling
|
|
||||||
* reservations in other nodes.
|
|
||||||
*/
|
|
||||||
if (nid == 0) {
|
|
||||||
struct memblock_region *reg;
|
|
||||||
|
|
||||||
/* Reserve the sections we're already using. */
|
|
||||||
for_each_memblock(reserved, reg) {
|
|
||||||
reserve_bootmem(reg->base, reg->size, BOOTMEM_DEFAULT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
sparse_memory_present_with_active_regions(nid);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void __init do_init_bootmem(void)
|
static void __init do_init_bootmem(void)
|
||||||
{
|
{
|
||||||
struct memblock_region *reg;
|
struct memblock_region *reg;
|
||||||
int i;
|
|
||||||
|
|
||||||
/* Add active regions with valid PFNs. */
|
/* Add active regions with valid PFNs. */
|
||||||
for_each_memblock(memory, reg) {
|
for_each_memblock(memory, reg) {
|
||||||
|
@ -279,9 +235,12 @@ static void __init do_init_bootmem(void)
|
||||||
|
|
||||||
plat_mem_setup();
|
plat_mem_setup();
|
||||||
|
|
||||||
for_each_online_node(i)
|
for_each_memblock(memory, reg) {
|
||||||
bootmem_init_one_node(i);
|
int nid = memblock_get_region_node(reg);
|
||||||
|
|
||||||
|
memory_present(nid, memblock_region_memory_base_pfn(reg),
|
||||||
|
memblock_region_memory_end_pfn(reg));
|
||||||
|
}
|
||||||
sparse_init();
|
sparse_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -322,7 +281,6 @@ void __init paging_init(void)
|
||||||
{
|
{
|
||||||
unsigned long max_zone_pfns[MAX_NR_ZONES];
|
unsigned long max_zone_pfns[MAX_NR_ZONES];
|
||||||
unsigned long vaddr, end;
|
unsigned long vaddr, end;
|
||||||
int nid;
|
|
||||||
|
|
||||||
sh_mv.mv_mem_init();
|
sh_mv.mv_mem_init();
|
||||||
|
|
||||||
|
@ -377,21 +335,7 @@ void __init paging_init(void)
|
||||||
kmap_coherent_init();
|
kmap_coherent_init();
|
||||||
|
|
||||||
memset(max_zone_pfns, 0, sizeof(max_zone_pfns));
|
memset(max_zone_pfns, 0, sizeof(max_zone_pfns));
|
||||||
|
max_zone_pfns[ZONE_NORMAL] = max_low_pfn;
|
||||||
for_each_online_node(nid) {
|
|
||||||
pg_data_t *pgdat = NODE_DATA(nid);
|
|
||||||
unsigned long low, start_pfn;
|
|
||||||
|
|
||||||
start_pfn = pgdat->bdata->node_min_pfn;
|
|
||||||
low = pgdat->bdata->node_low_pfn;
|
|
||||||
|
|
||||||
if (max_zone_pfns[ZONE_NORMAL] < low)
|
|
||||||
max_zone_pfns[ZONE_NORMAL] = low;
|
|
||||||
|
|
||||||
printk("Node %u: start_pfn = 0x%lx, low = 0x%lx\n",
|
|
||||||
nid, start_pfn, low);
|
|
||||||
}
|
|
||||||
|
|
||||||
free_area_init_nodes(max_zone_pfns);
|
free_area_init_nodes(max_zone_pfns);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,6 @@
|
||||||
* for more details.
|
* for more details.
|
||||||
*/
|
*/
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/bootmem.h>
|
|
||||||
#include <linux/memblock.h>
|
#include <linux/memblock.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/numa.h>
|
#include <linux/numa.h>
|
||||||
|
@ -26,9 +25,7 @@ EXPORT_SYMBOL_GPL(node_data);
|
||||||
*/
|
*/
|
||||||
void __init setup_bootmem_node(int nid, unsigned long start, unsigned long end)
|
void __init setup_bootmem_node(int nid, unsigned long start, unsigned long end)
|
||||||
{
|
{
|
||||||
unsigned long bootmap_pages;
|
|
||||||
unsigned long start_pfn, end_pfn;
|
unsigned long start_pfn, end_pfn;
|
||||||
unsigned long bootmem_paddr;
|
|
||||||
|
|
||||||
/* Don't allow bogus node assignment */
|
/* Don't allow bogus node assignment */
|
||||||
BUG_ON(nid >= MAX_NUMNODES || nid <= 0);
|
BUG_ON(nid >= MAX_NUMNODES || nid <= 0);
|
||||||
|
@ -48,25 +45,9 @@ void __init setup_bootmem_node(int nid, unsigned long start, unsigned long end)
|
||||||
SMP_CACHE_BYTES, end));
|
SMP_CACHE_BYTES, end));
|
||||||
memset(NODE_DATA(nid), 0, sizeof(struct pglist_data));
|
memset(NODE_DATA(nid), 0, sizeof(struct pglist_data));
|
||||||
|
|
||||||
NODE_DATA(nid)->bdata = &bootmem_node_data[nid];
|
|
||||||
NODE_DATA(nid)->node_start_pfn = start_pfn;
|
NODE_DATA(nid)->node_start_pfn = start_pfn;
|
||||||
NODE_DATA(nid)->node_spanned_pages = end_pfn - start_pfn;
|
NODE_DATA(nid)->node_spanned_pages = end_pfn - start_pfn;
|
||||||
|
|
||||||
/* Node-local bootmap */
|
|
||||||
bootmap_pages = bootmem_bootmap_pages(end_pfn - start_pfn);
|
|
||||||
bootmem_paddr = memblock_alloc_base(bootmap_pages << PAGE_SHIFT,
|
|
||||||
PAGE_SIZE, end);
|
|
||||||
init_bootmem_node(NODE_DATA(nid), bootmem_paddr >> PAGE_SHIFT,
|
|
||||||
start_pfn, end_pfn);
|
|
||||||
|
|
||||||
free_bootmem_with_active_regions(nid, end_pfn);
|
|
||||||
|
|
||||||
/* Reserve the pgdat and bootmap space with the bootmem allocator */
|
|
||||||
reserve_bootmem_node(NODE_DATA(nid), start_pfn << PAGE_SHIFT,
|
|
||||||
sizeof(struct pglist_data), BOOTMEM_DEFAULT);
|
|
||||||
reserve_bootmem_node(NODE_DATA(nid), bootmem_paddr,
|
|
||||||
bootmap_pages << PAGE_SHIFT, BOOTMEM_DEFAULT);
|
|
||||||
|
|
||||||
/* It's up */
|
/* It's up */
|
||||||
node_set_online(nid);
|
node_set_online(nid);
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
* the Free Software Foundation, either version 2 of the License, or
|
||||||
* (at your option) any later version.
|
* (at your option) any later version.
|
||||||
*
|
*
|
||||||
* This program is distributed in the hope that it will be useful,
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
|
|
@ -403,7 +403,7 @@ static struct vio_dev *vio_create_one(struct mdesc_handle *hp, u64 mp,
|
||||||
if (err) {
|
if (err) {
|
||||||
printk(KERN_ERR "VIO: Could not register device %s, err=%d\n",
|
printk(KERN_ERR "VIO: Could not register device %s, err=%d\n",
|
||||||
dev_name(&vdev->dev), err);
|
dev_name(&vdev->dev), err);
|
||||||
kfree(vdev);
|
put_device(&vdev->dev);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (vdev->dp)
|
if (vdev->dp)
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
#include "../vdso-fakesections.c"
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include <linux/cpu.h>
|
#include <linux/cpu.h>
|
||||||
#include <linux/bitops.h>
|
#include <linux/bitops.h>
|
||||||
#include <linux/device.h>
|
#include <linux/device.h>
|
||||||
|
#include <linux/nospec.h>
|
||||||
|
|
||||||
#include <asm/apic.h>
|
#include <asm/apic.h>
|
||||||
#include <asm/stacktrace.h>
|
#include <asm/stacktrace.h>
|
||||||
|
@ -307,14 +308,17 @@ set_ext_hw_attr(struct hw_perf_event *hwc, struct perf_event *event)
|
||||||
cache_type = (config >> 0) & 0xff;
|
cache_type = (config >> 0) & 0xff;
|
||||||
if (cache_type >= PERF_COUNT_HW_CACHE_MAX)
|
if (cache_type >= PERF_COUNT_HW_CACHE_MAX)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
cache_type = array_index_nospec(cache_type, PERF_COUNT_HW_CACHE_MAX);
|
||||||
|
|
||||||
cache_op = (config >> 8) & 0xff;
|
cache_op = (config >> 8) & 0xff;
|
||||||
if (cache_op >= PERF_COUNT_HW_CACHE_OP_MAX)
|
if (cache_op >= PERF_COUNT_HW_CACHE_OP_MAX)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
cache_op = array_index_nospec(cache_op, PERF_COUNT_HW_CACHE_OP_MAX);
|
||||||
|
|
||||||
cache_result = (config >> 16) & 0xff;
|
cache_result = (config >> 16) & 0xff;
|
||||||
if (cache_result >= PERF_COUNT_HW_CACHE_RESULT_MAX)
|
if (cache_result >= PERF_COUNT_HW_CACHE_RESULT_MAX)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
cache_result = array_index_nospec(cache_result, PERF_COUNT_HW_CACHE_RESULT_MAX);
|
||||||
|
|
||||||
val = hw_cache_event_ids[cache_type][cache_op][cache_result];
|
val = hw_cache_event_ids[cache_type][cache_op][cache_result];
|
||||||
|
|
||||||
|
@ -421,6 +425,8 @@ int x86_setup_perfctr(struct perf_event *event)
|
||||||
if (attr->config >= x86_pmu.max_events)
|
if (attr->config >= x86_pmu.max_events)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
attr->config = array_index_nospec((unsigned long)attr->config, x86_pmu.max_events);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The generic map:
|
* The generic map:
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -92,6 +92,7 @@
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/perf_event.h>
|
#include <linux/perf_event.h>
|
||||||
|
#include <linux/nospec.h>
|
||||||
#include <asm/cpu_device_id.h>
|
#include <asm/cpu_device_id.h>
|
||||||
#include <asm/intel-family.h>
|
#include <asm/intel-family.h>
|
||||||
#include "../perf_event.h"
|
#include "../perf_event.h"
|
||||||
|
@ -302,6 +303,7 @@ static int cstate_pmu_event_init(struct perf_event *event)
|
||||||
} else if (event->pmu == &cstate_pkg_pmu) {
|
} else if (event->pmu == &cstate_pkg_pmu) {
|
||||||
if (cfg >= PERF_CSTATE_PKG_EVENT_MAX)
|
if (cfg >= PERF_CSTATE_PKG_EVENT_MAX)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
cfg = array_index_nospec((unsigned long)cfg, PERF_CSTATE_PKG_EVENT_MAX);
|
||||||
if (!pkg_msr[cfg].attr)
|
if (!pkg_msr[cfg].attr)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
event->hw.event_base = pkg_msr[cfg].msr;
|
event->hw.event_base = pkg_msr[cfg].msr;
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
// SPDX-License-Identifier: GPL-2.0
|
// SPDX-License-Identifier: GPL-2.0
|
||||||
#include <linux/perf_event.h>
|
#include <linux/perf_event.h>
|
||||||
|
#include <linux/nospec.h>
|
||||||
#include <asm/intel-family.h>
|
#include <asm/intel-family.h>
|
||||||
|
|
||||||
enum perf_msr_id {
|
enum perf_msr_id {
|
||||||
|
@ -158,9 +159,6 @@ static int msr_event_init(struct perf_event *event)
|
||||||
if (event->attr.type != event->pmu->type)
|
if (event->attr.type != event->pmu->type)
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
|
|
||||||
if (cfg >= PERF_MSR_EVENT_MAX)
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
/* unsupported modes and filters */
|
/* unsupported modes and filters */
|
||||||
if (event->attr.exclude_user ||
|
if (event->attr.exclude_user ||
|
||||||
event->attr.exclude_kernel ||
|
event->attr.exclude_kernel ||
|
||||||
|
@ -171,6 +169,11 @@ static int msr_event_init(struct perf_event *event)
|
||||||
event->attr.sample_period) /* no sampling */
|
event->attr.sample_period) /* no sampling */
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
if (cfg >= PERF_MSR_EVENT_MAX)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
cfg = array_index_nospec((unsigned long)cfg, PERF_MSR_EVENT_MAX);
|
||||||
|
|
||||||
if (!msr[cfg].attr)
|
if (!msr[cfg].attr)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
|
|
@ -848,6 +848,11 @@ void get_cpu_cap(struct cpuinfo_x86 *c)
|
||||||
c->x86_power = edx;
|
c->x86_power = edx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (c->extended_cpuid_level >= 0x80000008) {
|
||||||
|
cpuid(0x80000008, &eax, &ebx, &ecx, &edx);
|
||||||
|
c->x86_capability[CPUID_8000_0008_EBX] = ebx;
|
||||||
|
}
|
||||||
|
|
||||||
if (c->extended_cpuid_level >= 0x8000000a)
|
if (c->extended_cpuid_level >= 0x8000000a)
|
||||||
c->x86_capability[CPUID_8000_000A_EDX] = cpuid_edx(0x8000000a);
|
c->x86_capability[CPUID_8000_000A_EDX] = cpuid_edx(0x8000000a);
|
||||||
|
|
||||||
|
@ -871,7 +876,6 @@ static void get_cpu_address_sizes(struct cpuinfo_x86 *c)
|
||||||
|
|
||||||
c->x86_virt_bits = (eax >> 8) & 0xff;
|
c->x86_virt_bits = (eax >> 8) & 0xff;
|
||||||
c->x86_phys_bits = eax & 0xff;
|
c->x86_phys_bits = eax & 0xff;
|
||||||
c->x86_capability[CPUID_8000_0008_EBX] = ebx;
|
|
||||||
}
|
}
|
||||||
#ifdef CONFIG_X86_32
|
#ifdef CONFIG_X86_32
|
||||||
else if (cpu_has(c, X86_FEATURE_PAE) || cpu_has(c, X86_FEATURE_PSE36))
|
else if (cpu_has(c, X86_FEATURE_PAE) || cpu_has(c, X86_FEATURE_PSE36))
|
||||||
|
|
|
@ -1067,6 +1067,7 @@ static struct clocksource clocksource_tsc_early = {
|
||||||
.resume = tsc_resume,
|
.resume = tsc_resume,
|
||||||
.mark_unstable = tsc_cs_mark_unstable,
|
.mark_unstable = tsc_cs_mark_unstable,
|
||||||
.tick_stable = tsc_cs_tick_stable,
|
.tick_stable = tsc_cs_tick_stable,
|
||||||
|
.list = LIST_HEAD_INIT(clocksource_tsc_early.list),
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -1086,6 +1087,7 @@ static struct clocksource clocksource_tsc = {
|
||||||
.resume = tsc_resume,
|
.resume = tsc_resume,
|
||||||
.mark_unstable = tsc_cs_mark_unstable,
|
.mark_unstable = tsc_cs_mark_unstable,
|
||||||
.tick_stable = tsc_cs_tick_stable,
|
.tick_stable = tsc_cs_tick_stable,
|
||||||
|
.list = LIST_HEAD_INIT(clocksource_tsc.list),
|
||||||
};
|
};
|
||||||
|
|
||||||
void mark_tsc_unstable(char *reason)
|
void mark_tsc_unstable(char *reason)
|
||||||
|
@ -1098,13 +1100,9 @@ void mark_tsc_unstable(char *reason)
|
||||||
clear_sched_clock_stable();
|
clear_sched_clock_stable();
|
||||||
disable_sched_clock_irqtime();
|
disable_sched_clock_irqtime();
|
||||||
pr_info("Marking TSC unstable due to %s\n", reason);
|
pr_info("Marking TSC unstable due to %s\n", reason);
|
||||||
/* Change only the rating, when not registered */
|
|
||||||
if (clocksource_tsc.mult) {
|
clocksource_mark_unstable(&clocksource_tsc_early);
|
||||||
clocksource_mark_unstable(&clocksource_tsc);
|
clocksource_mark_unstable(&clocksource_tsc);
|
||||||
} else {
|
|
||||||
clocksource_tsc.flags |= CLOCK_SOURCE_UNSTABLE;
|
|
||||||
clocksource_tsc.rating = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EXPORT_SYMBOL_GPL(mark_tsc_unstable);
|
EXPORT_SYMBOL_GPL(mark_tsc_unstable);
|
||||||
|
@ -1244,7 +1242,7 @@ static void tsc_refine_calibration_work(struct work_struct *work)
|
||||||
|
|
||||||
/* Don't bother refining TSC on unstable systems */
|
/* Don't bother refining TSC on unstable systems */
|
||||||
if (tsc_unstable)
|
if (tsc_unstable)
|
||||||
return;
|
goto unreg;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Since the work is started early in boot, we may be
|
* Since the work is started early in boot, we may be
|
||||||
|
@ -1297,11 +1295,12 @@ static void tsc_refine_calibration_work(struct work_struct *work)
|
||||||
|
|
||||||
out:
|
out:
|
||||||
if (tsc_unstable)
|
if (tsc_unstable)
|
||||||
return;
|
goto unreg;
|
||||||
|
|
||||||
if (boot_cpu_has(X86_FEATURE_ART))
|
if (boot_cpu_has(X86_FEATURE_ART))
|
||||||
art_related_clocksource = &clocksource_tsc;
|
art_related_clocksource = &clocksource_tsc;
|
||||||
clocksource_register_khz(&clocksource_tsc, tsc_khz);
|
clocksource_register_khz(&clocksource_tsc, tsc_khz);
|
||||||
|
unreg:
|
||||||
clocksource_unregister(&clocksource_tsc_early);
|
clocksource_unregister(&clocksource_tsc_early);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1311,8 +1310,8 @@ static int __init init_tsc_clocksource(void)
|
||||||
if (!boot_cpu_has(X86_FEATURE_TSC) || tsc_disabled > 0 || !tsc_khz)
|
if (!boot_cpu_has(X86_FEATURE_TSC) || tsc_disabled > 0 || !tsc_khz)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (check_tsc_unstable())
|
if (tsc_unstable)
|
||||||
return 0;
|
goto unreg;
|
||||||
|
|
||||||
if (tsc_clocksource_reliable)
|
if (tsc_clocksource_reliable)
|
||||||
clocksource_tsc.flags &= ~CLOCK_SOURCE_MUST_VERIFY;
|
clocksource_tsc.flags &= ~CLOCK_SOURCE_MUST_VERIFY;
|
||||||
|
@ -1328,6 +1327,7 @@ static int __init init_tsc_clocksource(void)
|
||||||
if (boot_cpu_has(X86_FEATURE_ART))
|
if (boot_cpu_has(X86_FEATURE_ART))
|
||||||
art_related_clocksource = &clocksource_tsc;
|
art_related_clocksource = &clocksource_tsc;
|
||||||
clocksource_register_khz(&clocksource_tsc, tsc_khz);
|
clocksource_register_khz(&clocksource_tsc, tsc_khz);
|
||||||
|
unreg:
|
||||||
clocksource_unregister(&clocksource_tsc_early);
|
clocksource_unregister(&clocksource_tsc_early);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1463,23 +1463,6 @@ static void start_sw_tscdeadline(struct kvm_lapic *apic)
|
||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void start_sw_period(struct kvm_lapic *apic)
|
|
||||||
{
|
|
||||||
if (!apic->lapic_timer.period)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (apic_lvtt_oneshot(apic) &&
|
|
||||||
ktime_after(ktime_get(),
|
|
||||||
apic->lapic_timer.target_expiration)) {
|
|
||||||
apic_timer_expired(apic);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
hrtimer_start(&apic->lapic_timer.timer,
|
|
||||||
apic->lapic_timer.target_expiration,
|
|
||||||
HRTIMER_MODE_ABS_PINNED);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void update_target_expiration(struct kvm_lapic *apic, uint32_t old_divisor)
|
static void update_target_expiration(struct kvm_lapic *apic, uint32_t old_divisor)
|
||||||
{
|
{
|
||||||
ktime_t now, remaining;
|
ktime_t now, remaining;
|
||||||
|
@ -1546,6 +1529,26 @@ static void advance_periodic_target_expiration(struct kvm_lapic *apic)
|
||||||
apic->lapic_timer.period);
|
apic->lapic_timer.period);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void start_sw_period(struct kvm_lapic *apic)
|
||||||
|
{
|
||||||
|
if (!apic->lapic_timer.period)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (ktime_after(ktime_get(),
|
||||||
|
apic->lapic_timer.target_expiration)) {
|
||||||
|
apic_timer_expired(apic);
|
||||||
|
|
||||||
|
if (apic_lvtt_oneshot(apic))
|
||||||
|
return;
|
||||||
|
|
||||||
|
advance_periodic_target_expiration(apic);
|
||||||
|
}
|
||||||
|
|
||||||
|
hrtimer_start(&apic->lapic_timer.timer,
|
||||||
|
apic->lapic_timer.target_expiration,
|
||||||
|
HRTIMER_MODE_ABS_PINNED);
|
||||||
|
}
|
||||||
|
|
||||||
bool kvm_lapic_hv_timer_in_use(struct kvm_vcpu *vcpu)
|
bool kvm_lapic_hv_timer_in_use(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
if (!lapic_in_kernel(vcpu))
|
if (!lapic_in_kernel(vcpu))
|
||||||
|
|
|
@ -1027,7 +1027,17 @@ xadd: if (is_imm8(insn->off))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BPF_JMP | BPF_JA:
|
case BPF_JMP | BPF_JA:
|
||||||
|
if (insn->off == -1)
|
||||||
|
/* -1 jmp instructions will always jump
|
||||||
|
* backwards two bytes. Explicitly handling
|
||||||
|
* this case avoids wasting too many passes
|
||||||
|
* when there are long sequences of replaced
|
||||||
|
* dead code.
|
||||||
|
*/
|
||||||
|
jmp_offset = -2;
|
||||||
|
else
|
||||||
jmp_offset = addrs[i + insn->off] - addrs[i];
|
jmp_offset = addrs[i + insn->off] - addrs[i];
|
||||||
|
|
||||||
if (!jmp_offset)
|
if (!jmp_offset)
|
||||||
/* optimize out nop jumps */
|
/* optimize out nop jumps */
|
||||||
break;
|
break;
|
||||||
|
@ -1226,6 +1236,7 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *prog)
|
||||||
for (pass = 0; pass < 20 || image; pass++) {
|
for (pass = 0; pass < 20 || image; pass++) {
|
||||||
proglen = do_jit(prog, addrs, image, oldproglen, &ctx);
|
proglen = do_jit(prog, addrs, image, oldproglen, &ctx);
|
||||||
if (proglen <= 0) {
|
if (proglen <= 0) {
|
||||||
|
out_image:
|
||||||
image = NULL;
|
image = NULL;
|
||||||
if (header)
|
if (header)
|
||||||
bpf_jit_binary_free(header);
|
bpf_jit_binary_free(header);
|
||||||
|
@ -1236,8 +1247,7 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *prog)
|
||||||
if (proglen != oldproglen) {
|
if (proglen != oldproglen) {
|
||||||
pr_err("bpf_jit: proglen=%d != oldproglen=%d\n",
|
pr_err("bpf_jit: proglen=%d != oldproglen=%d\n",
|
||||||
proglen, oldproglen);
|
proglen, oldproglen);
|
||||||
prog = orig_prog;
|
goto out_image;
|
||||||
goto out_addrs;
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1273,7 +1283,7 @@ struct bpf_prog *bpf_int_jit_compile(struct bpf_prog *prog)
|
||||||
prog = orig_prog;
|
prog = orig_prog;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!prog->is_func || extra_pass) {
|
if (!image || !prog->is_func || extra_pass) {
|
||||||
out_addrs:
|
out_addrs:
|
||||||
kfree(addrs);
|
kfree(addrs);
|
||||||
kfree(jit_data);
|
kfree(jit_data);
|
||||||
|
|
|
@ -65,6 +65,19 @@ static void __init xen_hvm_init_mem_mapping(void)
|
||||||
{
|
{
|
||||||
early_memunmap(HYPERVISOR_shared_info, PAGE_SIZE);
|
early_memunmap(HYPERVISOR_shared_info, PAGE_SIZE);
|
||||||
HYPERVISOR_shared_info = __va(PFN_PHYS(shared_info_pfn));
|
HYPERVISOR_shared_info = __va(PFN_PHYS(shared_info_pfn));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The virtual address of the shared_info page has changed, so
|
||||||
|
* the vcpu_info pointer for VCPU 0 is now stale.
|
||||||
|
*
|
||||||
|
* The prepare_boot_cpu callback will re-initialize it via
|
||||||
|
* xen_vcpu_setup, but we can't rely on that to be called for
|
||||||
|
* old Xen versions (xen_have_vector_callback == 0).
|
||||||
|
*
|
||||||
|
* It is, in any case, bad to have a stale vcpu_info pointer
|
||||||
|
* so reset it now.
|
||||||
|
*/
|
||||||
|
xen_vcpu_info_reset(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init init_hvm_pv_info(void)
|
static void __init init_hvm_pv_info(void)
|
||||||
|
|
|
@ -421,24 +421,15 @@ static void xen_load_gdt(const struct desc_ptr *dtr)
|
||||||
{
|
{
|
||||||
unsigned long va = dtr->address;
|
unsigned long va = dtr->address;
|
||||||
unsigned int size = dtr->size + 1;
|
unsigned int size = dtr->size + 1;
|
||||||
unsigned pages = DIV_ROUND_UP(size, PAGE_SIZE);
|
unsigned long pfn, mfn;
|
||||||
unsigned long frames[pages];
|
|
||||||
int f;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* A GDT can be up to 64k in size, which corresponds to 8192
|
|
||||||
* 8-byte entries, or 16 4k pages..
|
|
||||||
*/
|
|
||||||
|
|
||||||
BUG_ON(size > 65536);
|
|
||||||
BUG_ON(va & ~PAGE_MASK);
|
|
||||||
|
|
||||||
for (f = 0; va < dtr->address + size; va += PAGE_SIZE, f++) {
|
|
||||||
int level;
|
int level;
|
||||||
pte_t *ptep;
|
pte_t *ptep;
|
||||||
unsigned long pfn, mfn;
|
|
||||||
void *virt;
|
void *virt;
|
||||||
|
|
||||||
|
/* @size should be at most GDT_SIZE which is smaller than PAGE_SIZE. */
|
||||||
|
BUG_ON(size > PAGE_SIZE);
|
||||||
|
BUG_ON(va & ~PAGE_MASK);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The GDT is per-cpu and is in the percpu data area.
|
* The GDT is per-cpu and is in the percpu data area.
|
||||||
* That can be virtually mapped, so we need to do a
|
* That can be virtually mapped, so we need to do a
|
||||||
|
@ -453,13 +444,10 @@ static void xen_load_gdt(const struct desc_ptr *dtr)
|
||||||
mfn = pfn_to_mfn(pfn);
|
mfn = pfn_to_mfn(pfn);
|
||||||
virt = __va(PFN_PHYS(pfn));
|
virt = __va(PFN_PHYS(pfn));
|
||||||
|
|
||||||
frames[f] = mfn;
|
|
||||||
|
|
||||||
make_lowmem_page_readonly((void *)va);
|
make_lowmem_page_readonly((void *)va);
|
||||||
make_lowmem_page_readonly(virt);
|
make_lowmem_page_readonly(virt);
|
||||||
}
|
|
||||||
|
|
||||||
if (HYPERVISOR_set_gdt(frames, size / sizeof(struct desc_struct)))
|
if (HYPERVISOR_set_gdt(&mfn, size / sizeof(struct desc_struct)))
|
||||||
BUG();
|
BUG();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -470,21 +458,12 @@ static void __init xen_load_gdt_boot(const struct desc_ptr *dtr)
|
||||||
{
|
{
|
||||||
unsigned long va = dtr->address;
|
unsigned long va = dtr->address;
|
||||||
unsigned int size = dtr->size + 1;
|
unsigned int size = dtr->size + 1;
|
||||||
unsigned pages = DIV_ROUND_UP(size, PAGE_SIZE);
|
|
||||||
unsigned long frames[pages];
|
|
||||||
int f;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* A GDT can be up to 64k in size, which corresponds to 8192
|
|
||||||
* 8-byte entries, or 16 4k pages..
|
|
||||||
*/
|
|
||||||
|
|
||||||
BUG_ON(size > 65536);
|
|
||||||
BUG_ON(va & ~PAGE_MASK);
|
|
||||||
|
|
||||||
for (f = 0; va < dtr->address + size; va += PAGE_SIZE, f++) {
|
|
||||||
pte_t pte;
|
|
||||||
unsigned long pfn, mfn;
|
unsigned long pfn, mfn;
|
||||||
|
pte_t pte;
|
||||||
|
|
||||||
|
/* @size should be at most GDT_SIZE which is smaller than PAGE_SIZE. */
|
||||||
|
BUG_ON(size > PAGE_SIZE);
|
||||||
|
BUG_ON(va & ~PAGE_MASK);
|
||||||
|
|
||||||
pfn = virt_to_pfn(va);
|
pfn = virt_to_pfn(va);
|
||||||
mfn = pfn_to_mfn(pfn);
|
mfn = pfn_to_mfn(pfn);
|
||||||
|
@ -494,10 +473,7 @@ static void __init xen_load_gdt_boot(const struct desc_ptr *dtr)
|
||||||
if (HYPERVISOR_update_va_mapping((unsigned long)va, pte, 0))
|
if (HYPERVISOR_update_va_mapping((unsigned long)va, pte, 0))
|
||||||
BUG();
|
BUG();
|
||||||
|
|
||||||
frames[f] = mfn;
|
if (HYPERVISOR_set_gdt(&mfn, size / sizeof(struct desc_struct)))
|
||||||
}
|
|
||||||
|
|
||||||
if (HYPERVISOR_set_gdt(frames, size / sizeof(struct desc_struct)))
|
|
||||||
BUG();
|
BUG();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -95,18 +95,15 @@ static void blk_mq_check_inflight(struct blk_mq_hw_ctx *hctx,
|
||||||
{
|
{
|
||||||
struct mq_inflight *mi = priv;
|
struct mq_inflight *mi = priv;
|
||||||
|
|
||||||
if (blk_mq_rq_state(rq) == MQ_RQ_IN_FLIGHT) {
|
|
||||||
/*
|
/*
|
||||||
* index[0] counts the specific partition that was asked
|
* index[0] counts the specific partition that was asked for. index[1]
|
||||||
* for. index[1] counts the ones that are active on the
|
* counts the ones that are active on the whole device, so increment
|
||||||
* whole device, so increment that if mi->part is indeed
|
* that if mi->part is indeed a partition, and not a whole device.
|
||||||
* a partition, and not a whole device.
|
|
||||||
*/
|
*/
|
||||||
if (rq->part == mi->part)
|
if (rq->part == mi->part)
|
||||||
mi->inflight[0]++;
|
mi->inflight[0]++;
|
||||||
if (mi->part->partno)
|
if (mi->part->partno)
|
||||||
mi->inflight[1]++;
|
mi->inflight[1]++;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void blk_mq_in_flight(struct request_queue *q, struct hd_struct *part,
|
void blk_mq_in_flight(struct request_queue *q, struct hd_struct *part,
|
||||||
|
@ -118,6 +115,25 @@ void blk_mq_in_flight(struct request_queue *q, struct hd_struct *part,
|
||||||
blk_mq_queue_tag_busy_iter(q, blk_mq_check_inflight, &mi);
|
blk_mq_queue_tag_busy_iter(q, blk_mq_check_inflight, &mi);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void blk_mq_check_inflight_rw(struct blk_mq_hw_ctx *hctx,
|
||||||
|
struct request *rq, void *priv,
|
||||||
|
bool reserved)
|
||||||
|
{
|
||||||
|
struct mq_inflight *mi = priv;
|
||||||
|
|
||||||
|
if (rq->part == mi->part)
|
||||||
|
mi->inflight[rq_data_dir(rq)]++;
|
||||||
|
}
|
||||||
|
|
||||||
|
void blk_mq_in_flight_rw(struct request_queue *q, struct hd_struct *part,
|
||||||
|
unsigned int inflight[2])
|
||||||
|
{
|
||||||
|
struct mq_inflight mi = { .part = part, .inflight = inflight, };
|
||||||
|
|
||||||
|
inflight[0] = inflight[1] = 0;
|
||||||
|
blk_mq_queue_tag_busy_iter(q, blk_mq_check_inflight_rw, &mi);
|
||||||
|
}
|
||||||
|
|
||||||
void blk_freeze_queue_start(struct request_queue *q)
|
void blk_freeze_queue_start(struct request_queue *q)
|
||||||
{
|
{
|
||||||
int freeze_depth;
|
int freeze_depth;
|
||||||
|
|
|
@ -189,6 +189,8 @@ static inline bool blk_mq_hw_queue_mapped(struct blk_mq_hw_ctx *hctx)
|
||||||
|
|
||||||
void blk_mq_in_flight(struct request_queue *q, struct hd_struct *part,
|
void blk_mq_in_flight(struct request_queue *q, struct hd_struct *part,
|
||||||
unsigned int inflight[2]);
|
unsigned int inflight[2]);
|
||||||
|
void blk_mq_in_flight_rw(struct request_queue *q, struct hd_struct *part,
|
||||||
|
unsigned int inflight[2]);
|
||||||
|
|
||||||
static inline void blk_mq_put_dispatch_budget(struct blk_mq_hw_ctx *hctx)
|
static inline void blk_mq_put_dispatch_budget(struct blk_mq_hw_ctx *hctx)
|
||||||
{
|
{
|
||||||
|
|
|
@ -82,6 +82,18 @@ void part_in_flight(struct request_queue *q, struct hd_struct *part,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void part_in_flight_rw(struct request_queue *q, struct hd_struct *part,
|
||||||
|
unsigned int inflight[2])
|
||||||
|
{
|
||||||
|
if (q->mq_ops) {
|
||||||
|
blk_mq_in_flight_rw(q, part, inflight);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
inflight[0] = atomic_read(&part->in_flight[0]);
|
||||||
|
inflight[1] = atomic_read(&part->in_flight[1]);
|
||||||
|
}
|
||||||
|
|
||||||
struct hd_struct *__disk_get_part(struct gendisk *disk, int partno)
|
struct hd_struct *__disk_get_part(struct gendisk *disk, int partno)
|
||||||
{
|
{
|
||||||
struct disk_part_tbl *ptbl = rcu_dereference(disk->part_tbl);
|
struct disk_part_tbl *ptbl = rcu_dereference(disk->part_tbl);
|
||||||
|
|
|
@ -145,13 +145,15 @@ ssize_t part_stat_show(struct device *dev,
|
||||||
jiffies_to_msecs(part_stat_read(p, time_in_queue)));
|
jiffies_to_msecs(part_stat_read(p, time_in_queue)));
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t part_inflight_show(struct device *dev,
|
ssize_t part_inflight_show(struct device *dev, struct device_attribute *attr,
|
||||||
struct device_attribute *attr, char *buf)
|
char *buf)
|
||||||
{
|
{
|
||||||
struct hd_struct *p = dev_to_part(dev);
|
struct hd_struct *p = dev_to_part(dev);
|
||||||
|
struct request_queue *q = part_to_disk(p)->queue;
|
||||||
|
unsigned int inflight[2];
|
||||||
|
|
||||||
return sprintf(buf, "%8u %8u\n", atomic_read(&p->in_flight[0]),
|
part_in_flight_rw(q, p, inflight);
|
||||||
atomic_read(&p->in_flight[1]));
|
return sprintf(buf, "%8u %8u\n", inflight[0], inflight[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_FAIL_MAKE_REQUEST
|
#ifdef CONFIG_FAIL_MAKE_REQUEST
|
||||||
|
|
|
@ -698,7 +698,7 @@ static int ahci_vt8251_hardreset(struct ata_link *link, unsigned int *class,
|
||||||
|
|
||||||
DPRINTK("ENTER\n");
|
DPRINTK("ENTER\n");
|
||||||
|
|
||||||
ahci_stop_engine(ap);
|
hpriv->stop_engine(ap);
|
||||||
|
|
||||||
rc = sata_link_hardreset(link, sata_ehc_deb_timing(&link->eh_context),
|
rc = sata_link_hardreset(link, sata_ehc_deb_timing(&link->eh_context),
|
||||||
deadline, &online, NULL);
|
deadline, &online, NULL);
|
||||||
|
@ -724,7 +724,7 @@ static int ahci_p5wdh_hardreset(struct ata_link *link, unsigned int *class,
|
||||||
bool online;
|
bool online;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
ahci_stop_engine(ap);
|
hpriv->stop_engine(ap);
|
||||||
|
|
||||||
/* clear D2H reception area to properly wait for D2H FIS */
|
/* clear D2H reception area to properly wait for D2H FIS */
|
||||||
ata_tf_init(link->device, &tf);
|
ata_tf_init(link->device, &tf);
|
||||||
|
@ -788,7 +788,7 @@ static int ahci_avn_hardreset(struct ata_link *link, unsigned int *class,
|
||||||
|
|
||||||
DPRINTK("ENTER\n");
|
DPRINTK("ENTER\n");
|
||||||
|
|
||||||
ahci_stop_engine(ap);
|
hpriv->stop_engine(ap);
|
||||||
|
|
||||||
for (i = 0; i < 2; i++) {
|
for (i = 0; i < 2; i++) {
|
||||||
u16 val;
|
u16 val;
|
||||||
|
|
|
@ -350,7 +350,6 @@ struct ahci_host_priv {
|
||||||
u32 em_msg_type; /* EM message type */
|
u32 em_msg_type; /* EM message type */
|
||||||
bool got_runtime_pm; /* Did we do pm_runtime_get? */
|
bool got_runtime_pm; /* Did we do pm_runtime_get? */
|
||||||
struct clk *clks[AHCI_MAX_CLKS]; /* Optional */
|
struct clk *clks[AHCI_MAX_CLKS]; /* Optional */
|
||||||
struct reset_control *rsts; /* Optional */
|
|
||||||
struct regulator **target_pwrs; /* Optional */
|
struct regulator **target_pwrs; /* Optional */
|
||||||
/*
|
/*
|
||||||
* If platform uses PHYs. There is a 1:1 relation between the port number and
|
* If platform uses PHYs. There is a 1:1 relation between the port number and
|
||||||
|
@ -366,6 +365,13 @@ struct ahci_host_priv {
|
||||||
* be overridden anytime before the host is activated.
|
* be overridden anytime before the host is activated.
|
||||||
*/
|
*/
|
||||||
void (*start_engine)(struct ata_port *ap);
|
void (*start_engine)(struct ata_port *ap);
|
||||||
|
/*
|
||||||
|
* Optional ahci_stop_engine override, if not set this gets set to the
|
||||||
|
* default ahci_stop_engine during ahci_save_initial_config, this can
|
||||||
|
* be overridden anytime before the host is activated.
|
||||||
|
*/
|
||||||
|
int (*stop_engine)(struct ata_port *ap);
|
||||||
|
|
||||||
irqreturn_t (*irq_handler)(int irq, void *dev_instance);
|
irqreturn_t (*irq_handler)(int irq, void *dev_instance);
|
||||||
|
|
||||||
/* only required for per-port MSI(-X) support */
|
/* only required for per-port MSI(-X) support */
|
||||||
|
|
|
@ -62,6 +62,60 @@ static void ahci_mvebu_regret_option(struct ahci_host_priv *hpriv)
|
||||||
writel(0x80, hpriv->mmio + AHCI_VENDOR_SPECIFIC_0_DATA);
|
writel(0x80, hpriv->mmio + AHCI_VENDOR_SPECIFIC_0_DATA);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ahci_mvebu_stop_engine
|
||||||
|
*
|
||||||
|
* @ap: Target ata port
|
||||||
|
*
|
||||||
|
* Errata Ref#226 - SATA Disk HOT swap issue when connected through
|
||||||
|
* Port Multiplier in FIS-based Switching mode.
|
||||||
|
*
|
||||||
|
* To avoid the issue, according to design, the bits[11:8, 0] of
|
||||||
|
* register PxFBS are cleared when Port Command and Status (0x18) bit[0]
|
||||||
|
* changes its value from 1 to 0, i.e. falling edge of Port
|
||||||
|
* Command and Status bit[0] sends PULSE that resets PxFBS
|
||||||
|
* bits[11:8; 0].
|
||||||
|
*
|
||||||
|
* This function is used to override function of "ahci_stop_engine"
|
||||||
|
* from libahci.c by adding the mvebu work around(WA) to save PxFBS
|
||||||
|
* value before the PxCMD ST write of 0, then restore PxFBS value.
|
||||||
|
*
|
||||||
|
* Return: 0 on success; Error code otherwise.
|
||||||
|
*/
|
||||||
|
int ahci_mvebu_stop_engine(struct ata_port *ap)
|
||||||
|
{
|
||||||
|
void __iomem *port_mmio = ahci_port_base(ap);
|
||||||
|
u32 tmp, port_fbs;
|
||||||
|
|
||||||
|
tmp = readl(port_mmio + PORT_CMD);
|
||||||
|
|
||||||
|
/* check if the HBA is idle */
|
||||||
|
if ((tmp & (PORT_CMD_START | PORT_CMD_LIST_ON)) == 0)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
/* save the port PxFBS register for later restore */
|
||||||
|
port_fbs = readl(port_mmio + PORT_FBS);
|
||||||
|
|
||||||
|
/* setting HBA to idle */
|
||||||
|
tmp &= ~PORT_CMD_START;
|
||||||
|
writel(tmp, port_mmio + PORT_CMD);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* bit #15 PxCMD signal doesn't clear PxFBS,
|
||||||
|
* restore the PxFBS register right after clearing the PxCMD ST,
|
||||||
|
* no need to wait for the PxCMD bit #15.
|
||||||
|
*/
|
||||||
|
writel(port_fbs, port_mmio + PORT_FBS);
|
||||||
|
|
||||||
|
/* wait for engine to stop. This could be as long as 500 msec */
|
||||||
|
tmp = ata_wait_register(ap, port_mmio + PORT_CMD,
|
||||||
|
PORT_CMD_LIST_ON, PORT_CMD_LIST_ON, 1, 500);
|
||||||
|
if (tmp & PORT_CMD_LIST_ON)
|
||||||
|
return -EIO;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_PM_SLEEP
|
#ifdef CONFIG_PM_SLEEP
|
||||||
static int ahci_mvebu_suspend(struct platform_device *pdev, pm_message_t state)
|
static int ahci_mvebu_suspend(struct platform_device *pdev, pm_message_t state)
|
||||||
{
|
{
|
||||||
|
@ -112,6 +166,8 @@ static int ahci_mvebu_probe(struct platform_device *pdev)
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
|
hpriv->stop_engine = ahci_mvebu_stop_engine;
|
||||||
|
|
||||||
if (of_device_is_compatible(pdev->dev.of_node,
|
if (of_device_is_compatible(pdev->dev.of_node,
|
||||||
"marvell,armada-380-ahci")) {
|
"marvell,armada-380-ahci")) {
|
||||||
dram = mv_mbus_dram_info();
|
dram = mv_mbus_dram_info();
|
||||||
|
|
|
@ -96,7 +96,7 @@ static int ahci_qoriq_hardreset(struct ata_link *link, unsigned int *class,
|
||||||
|
|
||||||
DPRINTK("ENTER\n");
|
DPRINTK("ENTER\n");
|
||||||
|
|
||||||
ahci_stop_engine(ap);
|
hpriv->stop_engine(ap);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* There is a errata on ls1021a Rev1.0 and Rev2.0 which is:
|
* There is a errata on ls1021a Rev1.0 and Rev2.0 which is:
|
||||||
|
|
|
@ -165,7 +165,7 @@ static int xgene_ahci_restart_engine(struct ata_port *ap)
|
||||||
PORT_CMD_ISSUE, 0x0, 1, 100))
|
PORT_CMD_ISSUE, 0x0, 1, 100))
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
|
|
||||||
ahci_stop_engine(ap);
|
hpriv->stop_engine(ap);
|
||||||
ahci_start_fis_rx(ap);
|
ahci_start_fis_rx(ap);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -421,7 +421,7 @@ static int xgene_ahci_hardreset(struct ata_link *link, unsigned int *class,
|
||||||
portrxfis_saved = readl(port_mmio + PORT_FIS_ADDR);
|
portrxfis_saved = readl(port_mmio + PORT_FIS_ADDR);
|
||||||
portrxfishi_saved = readl(port_mmio + PORT_FIS_ADDR_HI);
|
portrxfishi_saved = readl(port_mmio + PORT_FIS_ADDR_HI);
|
||||||
|
|
||||||
ahci_stop_engine(ap);
|
hpriv->stop_engine(ap);
|
||||||
|
|
||||||
rc = xgene_ahci_do_hardreset(link, deadline, &online);
|
rc = xgene_ahci_do_hardreset(link, deadline, &online);
|
||||||
|
|
||||||
|
|
|
@ -560,6 +560,9 @@ void ahci_save_initial_config(struct device *dev, struct ahci_host_priv *hpriv)
|
||||||
if (!hpriv->start_engine)
|
if (!hpriv->start_engine)
|
||||||
hpriv->start_engine = ahci_start_engine;
|
hpriv->start_engine = ahci_start_engine;
|
||||||
|
|
||||||
|
if (!hpriv->stop_engine)
|
||||||
|
hpriv->stop_engine = ahci_stop_engine;
|
||||||
|
|
||||||
if (!hpriv->irq_handler)
|
if (!hpriv->irq_handler)
|
||||||
hpriv->irq_handler = ahci_single_level_irq_intr;
|
hpriv->irq_handler = ahci_single_level_irq_intr;
|
||||||
}
|
}
|
||||||
|
@ -897,9 +900,10 @@ static void ahci_start_port(struct ata_port *ap)
|
||||||
static int ahci_deinit_port(struct ata_port *ap, const char **emsg)
|
static int ahci_deinit_port(struct ata_port *ap, const char **emsg)
|
||||||
{
|
{
|
||||||
int rc;
|
int rc;
|
||||||
|
struct ahci_host_priv *hpriv = ap->host->private_data;
|
||||||
|
|
||||||
/* disable DMA */
|
/* disable DMA */
|
||||||
rc = ahci_stop_engine(ap);
|
rc = hpriv->stop_engine(ap);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
*emsg = "failed to stop engine";
|
*emsg = "failed to stop engine";
|
||||||
return rc;
|
return rc;
|
||||||
|
@ -1310,7 +1314,7 @@ int ahci_kick_engine(struct ata_port *ap)
|
||||||
int busy, rc;
|
int busy, rc;
|
||||||
|
|
||||||
/* stop engine */
|
/* stop engine */
|
||||||
rc = ahci_stop_engine(ap);
|
rc = hpriv->stop_engine(ap);
|
||||||
if (rc)
|
if (rc)
|
||||||
goto out_restart;
|
goto out_restart;
|
||||||
|
|
||||||
|
@ -1549,7 +1553,7 @@ int ahci_do_hardreset(struct ata_link *link, unsigned int *class,
|
||||||
|
|
||||||
DPRINTK("ENTER\n");
|
DPRINTK("ENTER\n");
|
||||||
|
|
||||||
ahci_stop_engine(ap);
|
hpriv->stop_engine(ap);
|
||||||
|
|
||||||
/* clear D2H reception area to properly wait for D2H FIS */
|
/* clear D2H reception area to properly wait for D2H FIS */
|
||||||
ata_tf_init(link->device, &tf);
|
ata_tf_init(link->device, &tf);
|
||||||
|
@ -2075,14 +2079,14 @@ void ahci_error_handler(struct ata_port *ap)
|
||||||
|
|
||||||
if (!(ap->pflags & ATA_PFLAG_FROZEN)) {
|
if (!(ap->pflags & ATA_PFLAG_FROZEN)) {
|
||||||
/* restart engine */
|
/* restart engine */
|
||||||
ahci_stop_engine(ap);
|
hpriv->stop_engine(ap);
|
||||||
hpriv->start_engine(ap);
|
hpriv->start_engine(ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
sata_pmp_error_handler(ap);
|
sata_pmp_error_handler(ap);
|
||||||
|
|
||||||
if (!ata_dev_enabled(ap->link.device))
|
if (!ata_dev_enabled(ap->link.device))
|
||||||
ahci_stop_engine(ap);
|
hpriv->stop_engine(ap);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(ahci_error_handler);
|
EXPORT_SYMBOL_GPL(ahci_error_handler);
|
||||||
|
|
||||||
|
@ -2129,7 +2133,7 @@ static void ahci_set_aggressive_devslp(struct ata_port *ap, bool sleep)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* set DITO, MDAT, DETO and enable DevSlp, need to stop engine first */
|
/* set DITO, MDAT, DETO and enable DevSlp, need to stop engine first */
|
||||||
rc = ahci_stop_engine(ap);
|
rc = hpriv->stop_engine(ap);
|
||||||
if (rc)
|
if (rc)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -2189,7 +2193,7 @@ static void ahci_enable_fbs(struct ata_port *ap)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = ahci_stop_engine(ap);
|
rc = hpriv->stop_engine(ap);
|
||||||
if (rc)
|
if (rc)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -2222,7 +2226,7 @@ static void ahci_disable_fbs(struct ata_port *ap)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
rc = ahci_stop_engine(ap);
|
rc = hpriv->stop_engine(ap);
|
||||||
if (rc)
|
if (rc)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,6 @@
|
||||||
#include <linux/phy/phy.h>
|
#include <linux/phy/phy.h>
|
||||||
#include <linux/pm_runtime.h>
|
#include <linux/pm_runtime.h>
|
||||||
#include <linux/of_platform.h>
|
#include <linux/of_platform.h>
|
||||||
#include <linux/reset.h>
|
|
||||||
#include "ahci.h"
|
#include "ahci.h"
|
||||||
|
|
||||||
static void ahci_host_stop(struct ata_host *host);
|
static void ahci_host_stop(struct ata_host *host);
|
||||||
|
@ -196,8 +195,7 @@ EXPORT_SYMBOL_GPL(ahci_platform_disable_regulators);
|
||||||
* following order:
|
* following order:
|
||||||
* 1) Regulator
|
* 1) Regulator
|
||||||
* 2) Clocks (through ahci_platform_enable_clks)
|
* 2) Clocks (through ahci_platform_enable_clks)
|
||||||
* 3) Resets
|
* 3) Phys
|
||||||
* 4) Phys
|
|
||||||
*
|
*
|
||||||
* If resource enabling fails at any point the previous enabled resources
|
* If resource enabling fails at any point the previous enabled resources
|
||||||
* are disabled in reverse order.
|
* are disabled in reverse order.
|
||||||
|
@ -217,19 +215,12 @@ int ahci_platform_enable_resources(struct ahci_host_priv *hpriv)
|
||||||
if (rc)
|
if (rc)
|
||||||
goto disable_regulator;
|
goto disable_regulator;
|
||||||
|
|
||||||
rc = reset_control_deassert(hpriv->rsts);
|
rc = ahci_platform_enable_phys(hpriv);
|
||||||
if (rc)
|
if (rc)
|
||||||
goto disable_clks;
|
goto disable_clks;
|
||||||
|
|
||||||
rc = ahci_platform_enable_phys(hpriv);
|
|
||||||
if (rc)
|
|
||||||
goto disable_resets;
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
disable_resets:
|
|
||||||
reset_control_assert(hpriv->rsts);
|
|
||||||
|
|
||||||
disable_clks:
|
disable_clks:
|
||||||
ahci_platform_disable_clks(hpriv);
|
ahci_platform_disable_clks(hpriv);
|
||||||
|
|
||||||
|
@ -248,15 +239,12 @@ EXPORT_SYMBOL_GPL(ahci_platform_enable_resources);
|
||||||
* following order:
|
* following order:
|
||||||
* 1) Phys
|
* 1) Phys
|
||||||
* 2) Clocks (through ahci_platform_disable_clks)
|
* 2) Clocks (through ahci_platform_disable_clks)
|
||||||
* 3) Resets
|
* 3) Regulator
|
||||||
* 4) Regulator
|
|
||||||
*/
|
*/
|
||||||
void ahci_platform_disable_resources(struct ahci_host_priv *hpriv)
|
void ahci_platform_disable_resources(struct ahci_host_priv *hpriv)
|
||||||
{
|
{
|
||||||
ahci_platform_disable_phys(hpriv);
|
ahci_platform_disable_phys(hpriv);
|
||||||
|
|
||||||
reset_control_assert(hpriv->rsts);
|
|
||||||
|
|
||||||
ahci_platform_disable_clks(hpriv);
|
ahci_platform_disable_clks(hpriv);
|
||||||
|
|
||||||
ahci_platform_disable_regulators(hpriv);
|
ahci_platform_disable_regulators(hpriv);
|
||||||
|
@ -405,12 +393,6 @@ struct ahci_host_priv *ahci_platform_get_resources(struct platform_device *pdev)
|
||||||
hpriv->clks[i] = clk;
|
hpriv->clks[i] = clk;
|
||||||
}
|
}
|
||||||
|
|
||||||
hpriv->rsts = devm_reset_control_array_get_optional_shared(dev);
|
|
||||||
if (IS_ERR(hpriv->rsts)) {
|
|
||||||
rc = PTR_ERR(hpriv->rsts);
|
|
||||||
goto err_out;
|
|
||||||
}
|
|
||||||
|
|
||||||
hpriv->nports = child_nodes = of_get_child_count(dev->of_node);
|
hpriv->nports = child_nodes = of_get_child_count(dev->of_node);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -4549,6 +4549,12 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
|
||||||
ATA_HORKAGE_ZERO_AFTER_TRIM |
|
ATA_HORKAGE_ZERO_AFTER_TRIM |
|
||||||
ATA_HORKAGE_NOLPM, },
|
ATA_HORKAGE_NOLPM, },
|
||||||
|
|
||||||
|
/* This specific Samsung model/firmware-rev does not handle LPM well */
|
||||||
|
{ "SAMSUNG MZMPC128HBFU-000MV", "CXM14M1Q", ATA_HORKAGE_NOLPM, },
|
||||||
|
|
||||||
|
/* Sandisk devices which are known to not handle LPM well */
|
||||||
|
{ "SanDisk SD7UB3Q*G1001", NULL, ATA_HORKAGE_NOLPM, },
|
||||||
|
|
||||||
/* devices that don't properly handle queued TRIM commands */
|
/* devices that don't properly handle queued TRIM commands */
|
||||||
{ "Micron_M500_*", NULL, ATA_HORKAGE_NO_NCQ_TRIM |
|
{ "Micron_M500_*", NULL, ATA_HORKAGE_NO_NCQ_TRIM |
|
||||||
ATA_HORKAGE_ZERO_AFTER_TRIM, },
|
ATA_HORKAGE_ZERO_AFTER_TRIM, },
|
||||||
|
|
|
@ -175,8 +175,8 @@ static void ata_eh_handle_port_resume(struct ata_port *ap)
|
||||||
{ }
|
{ }
|
||||||
#endif /* CONFIG_PM */
|
#endif /* CONFIG_PM */
|
||||||
|
|
||||||
static void __ata_ehi_pushv_desc(struct ata_eh_info *ehi, const char *fmt,
|
static __printf(2, 0) void __ata_ehi_pushv_desc(struct ata_eh_info *ehi,
|
||||||
va_list args)
|
const char *fmt, va_list args)
|
||||||
{
|
{
|
||||||
ehi->desc_len += vscnprintf(ehi->desc + ehi->desc_len,
|
ehi->desc_len += vscnprintf(ehi->desc + ehi->desc_len,
|
||||||
ATA_EH_DESC_LEN - ehi->desc_len,
|
ATA_EH_DESC_LEN - ehi->desc_len,
|
||||||
|
|
|
@ -410,7 +410,7 @@ static int ahci_highbank_hardreset(struct ata_link *link, unsigned int *class,
|
||||||
int rc;
|
int rc;
|
||||||
int retry = 100;
|
int retry = 100;
|
||||||
|
|
||||||
ahci_stop_engine(ap);
|
hpriv->stop_engine(ap);
|
||||||
|
|
||||||
/* clear D2H reception area to properly wait for D2H FIS */
|
/* clear D2H reception area to properly wait for D2H FIS */
|
||||||
ata_tf_init(link->device, &tf);
|
ata_tf_init(link->device, &tf);
|
||||||
|
|
|
@ -285,13 +285,13 @@ static const struct sil24_cerr_info {
|
||||||
[PORT_CERR_INCONSISTENT] = { AC_ERR_HSM, ATA_EH_RESET,
|
[PORT_CERR_INCONSISTENT] = { AC_ERR_HSM, ATA_EH_RESET,
|
||||||
"protocol mismatch" },
|
"protocol mismatch" },
|
||||||
[PORT_CERR_DIRECTION] = { AC_ERR_HSM, ATA_EH_RESET,
|
[PORT_CERR_DIRECTION] = { AC_ERR_HSM, ATA_EH_RESET,
|
||||||
"data directon mismatch" },
|
"data direction mismatch" },
|
||||||
[PORT_CERR_UNDERRUN] = { AC_ERR_HSM, ATA_EH_RESET,
|
[PORT_CERR_UNDERRUN] = { AC_ERR_HSM, ATA_EH_RESET,
|
||||||
"ran out of SGEs while writing" },
|
"ran out of SGEs while writing" },
|
||||||
[PORT_CERR_OVERRUN] = { AC_ERR_HSM, ATA_EH_RESET,
|
[PORT_CERR_OVERRUN] = { AC_ERR_HSM, ATA_EH_RESET,
|
||||||
"ran out of SGEs while reading" },
|
"ran out of SGEs while reading" },
|
||||||
[PORT_CERR_PKT_PROT] = { AC_ERR_HSM, ATA_EH_RESET,
|
[PORT_CERR_PKT_PROT] = { AC_ERR_HSM, ATA_EH_RESET,
|
||||||
"invalid data directon for ATAPI CDB" },
|
"invalid data direction for ATAPI CDB" },
|
||||||
[PORT_CERR_SGT_BOUNDARY] = { AC_ERR_SYSTEM, ATA_EH_RESET,
|
[PORT_CERR_SGT_BOUNDARY] = { AC_ERR_SYSTEM, ATA_EH_RESET,
|
||||||
"SGT not on qword boundary" },
|
"SGT not on qword boundary" },
|
||||||
[PORT_CERR_SGT_TGTABRT] = { AC_ERR_HOST_BUS, ATA_EH_RESET,
|
[PORT_CERR_SGT_TGTABRT] = { AC_ERR_HOST_BUS, ATA_EH_RESET,
|
||||||
|
|
|
@ -191,7 +191,7 @@ static char *res_strings[] = {
|
||||||
"reserved 37",
|
"reserved 37",
|
||||||
"reserved 38",
|
"reserved 38",
|
||||||
"reserved 39",
|
"reserved 39",
|
||||||
"reseverd 40",
|
"reserved 40",
|
||||||
"reserved 41",
|
"reserved 41",
|
||||||
"reserved 42",
|
"reserved 42",
|
||||||
"reserved 43",
|
"reserved 43",
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <linux/atomic.h>
|
#include <linux/atomic.h>
|
||||||
#include <linux/uaccess.h>
|
#include <linux/uaccess.h>
|
||||||
|
#include <linux/nospec.h>
|
||||||
|
|
||||||
#include "uPD98401.h"
|
#include "uPD98401.h"
|
||||||
#include "uPD98402.h"
|
#include "uPD98402.h"
|
||||||
|
@ -1458,6 +1459,8 @@ static int zatm_ioctl(struct atm_dev *dev,unsigned int cmd,void __user *arg)
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
if (pool < 0 || pool > ZATM_LAST_POOL)
|
if (pool < 0 || pool > ZATM_LAST_POOL)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
pool = array_index_nospec(pool,
|
||||||
|
ZATM_LAST_POOL + 1);
|
||||||
spin_lock_irqsave(&zatm_dev->lock, flags);
|
spin_lock_irqsave(&zatm_dev->lock, flags);
|
||||||
info = zatm_dev->pool_info[pool];
|
info = zatm_dev->pool_info[pool];
|
||||||
if (cmd == ZATM_GETPOOLZ) {
|
if (cmd == ZATM_GETPOOLZ) {
|
||||||
|
|
|
@ -2366,7 +2366,9 @@ static int rbd_obj_issue_copyup(struct rbd_obj_request *obj_req, u32 bytes)
|
||||||
osd_req_op_cls_init(obj_req->osd_req, 0, CEPH_OSD_OP_CALL, "rbd",
|
osd_req_op_cls_init(obj_req->osd_req, 0, CEPH_OSD_OP_CALL, "rbd",
|
||||||
"copyup");
|
"copyup");
|
||||||
osd_req_op_cls_request_data_bvecs(obj_req->osd_req, 0,
|
osd_req_op_cls_request_data_bvecs(obj_req->osd_req, 0,
|
||||||
obj_req->copyup_bvecs, bytes);
|
obj_req->copyup_bvecs,
|
||||||
|
obj_req->copyup_bvec_count,
|
||||||
|
bytes);
|
||||||
|
|
||||||
switch (obj_req->img_request->op_type) {
|
switch (obj_req->img_request->op_type) {
|
||||||
case OBJ_OP_WRITE:
|
case OBJ_OP_WRITE:
|
||||||
|
|
|
@ -231,6 +231,7 @@ static const struct usb_device_id blacklist_table[] = {
|
||||||
{ USB_DEVICE(0x0930, 0x0227), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x0930, 0x0227), .driver_info = BTUSB_ATH3012 },
|
||||||
{ USB_DEVICE(0x0b05, 0x17d0), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x0b05, 0x17d0), .driver_info = BTUSB_ATH3012 },
|
||||||
{ USB_DEVICE(0x0cf3, 0x0036), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x0cf3, 0x0036), .driver_info = BTUSB_ATH3012 },
|
||||||
|
{ USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 },
|
||||||
{ USB_DEVICE(0x0cf3, 0x3008), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x0cf3, 0x3008), .driver_info = BTUSB_ATH3012 },
|
||||||
{ USB_DEVICE(0x0cf3, 0x311d), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x0cf3, 0x311d), .driver_info = BTUSB_ATH3012 },
|
||||||
{ USB_DEVICE(0x0cf3, 0x311e), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x0cf3, 0x311e), .driver_info = BTUSB_ATH3012 },
|
||||||
|
@ -263,7 +264,6 @@ static const struct usb_device_id blacklist_table[] = {
|
||||||
{ USB_DEVICE(0x0489, 0xe03c), .driver_info = BTUSB_ATH3012 },
|
{ USB_DEVICE(0x0489, 0xe03c), .driver_info = BTUSB_ATH3012 },
|
||||||
|
|
||||||
/* QCA ROME chipset */
|
/* QCA ROME chipset */
|
||||||
{ USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_QCA_ROME },
|
|
||||||
{ USB_DEVICE(0x0cf3, 0xe007), .driver_info = BTUSB_QCA_ROME },
|
{ USB_DEVICE(0x0cf3, 0xe007), .driver_info = BTUSB_QCA_ROME },
|
||||||
{ USB_DEVICE(0x0cf3, 0xe009), .driver_info = BTUSB_QCA_ROME },
|
{ USB_DEVICE(0x0cf3, 0xe009), .driver_info = BTUSB_QCA_ROME },
|
||||||
{ USB_DEVICE(0x0cf3, 0xe010), .driver_info = BTUSB_QCA_ROME },
|
{ USB_DEVICE(0x0cf3, 0xe010), .driver_info = BTUSB_QCA_ROME },
|
||||||
|
@ -399,6 +399,13 @@ static const struct dmi_system_id btusb_needs_reset_resume_table[] = {
|
||||||
DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 3060"),
|
DMI_MATCH(DMI_PRODUCT_NAME, "OptiPlex 3060"),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
/* Dell XPS 9360 (QCA ROME device 0cf3:e300) */
|
||||||
|
.matches = {
|
||||||
|
DMI_MATCH(DMI_SYS_VENDOR, "Dell Inc."),
|
||||||
|
DMI_MATCH(DMI_PRODUCT_NAME, "XPS 13 9360"),
|
||||||
|
},
|
||||||
|
},
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -2852,6 +2859,12 @@ static int btusb_config_oob_wake(struct hci_dev *hdev)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static void btusb_check_needs_reset_resume(struct usb_interface *intf)
|
||||||
|
{
|
||||||
|
if (dmi_check_system(btusb_needs_reset_resume_table))
|
||||||
|
interface_to_usbdev(intf)->quirks |= USB_QUIRK_RESET_RESUME;
|
||||||
|
}
|
||||||
|
|
||||||
static int btusb_probe(struct usb_interface *intf,
|
static int btusb_probe(struct usb_interface *intf,
|
||||||
const struct usb_device_id *id)
|
const struct usb_device_id *id)
|
||||||
{
|
{
|
||||||
|
@ -2974,9 +2987,6 @@ static int btusb_probe(struct usb_interface *intf,
|
||||||
hdev->send = btusb_send_frame;
|
hdev->send = btusb_send_frame;
|
||||||
hdev->notify = btusb_notify;
|
hdev->notify = btusb_notify;
|
||||||
|
|
||||||
if (dmi_check_system(btusb_needs_reset_resume_table))
|
|
||||||
interface_to_usbdev(intf)->quirks |= USB_QUIRK_RESET_RESUME;
|
|
||||||
|
|
||||||
#ifdef CONFIG_PM
|
#ifdef CONFIG_PM
|
||||||
err = btusb_config_oob_wake(hdev);
|
err = btusb_config_oob_wake(hdev);
|
||||||
if (err)
|
if (err)
|
||||||
|
@ -3064,6 +3074,7 @@ static int btusb_probe(struct usb_interface *intf,
|
||||||
data->setup_on_usb = btusb_setup_qca;
|
data->setup_on_usb = btusb_setup_qca;
|
||||||
hdev->set_bdaddr = btusb_set_bdaddr_ath3012;
|
hdev->set_bdaddr = btusb_set_bdaddr_ath3012;
|
||||||
set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
|
set_bit(HCI_QUIRK_SIMULTANEOUS_DISCOVERY, &hdev->quirks);
|
||||||
|
btusb_check_needs_reset_resume(intf);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_BT_HCIBTUSB_RTL
|
#ifdef CONFIG_BT_HCIBTUSB_RTL
|
||||||
|
|
|
@ -195,7 +195,7 @@ static int uninorth_insert_memory(struct agp_memory *mem, off_t pg_start, int ty
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int uninorth_remove_memory(struct agp_memory *mem, off_t pg_start, int type)
|
static int uninorth_remove_memory(struct agp_memory *mem, off_t pg_start, int type)
|
||||||
{
|
{
|
||||||
size_t i;
|
size_t i;
|
||||||
u32 *gp;
|
u32 *gp;
|
||||||
|
@ -470,7 +470,7 @@ static int uninorth_free_gatt_table(struct agp_bridge_data *bridge)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void null_cache_flush(void)
|
static void null_cache_flush(void)
|
||||||
{
|
{
|
||||||
mb();
|
mb();
|
||||||
}
|
}
|
||||||
|
|
|
@ -541,7 +541,7 @@ static int cs2000_probe(struct i2c_client *client,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cs2000_resume(struct device *dev)
|
static int __maybe_unused cs2000_resume(struct device *dev)
|
||||||
{
|
{
|
||||||
struct cs2000_priv *priv = dev_get_drvdata(dev);
|
struct cs2000_priv *priv = dev_get_drvdata(dev);
|
||||||
|
|
||||||
|
|
|
@ -112,10 +112,18 @@ static int clk_mux_set_parent(struct clk_hw *hw, u8 index)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int clk_mux_determine_rate(struct clk_hw *hw,
|
||||||
|
struct clk_rate_request *req)
|
||||||
|
{
|
||||||
|
struct clk_mux *mux = to_clk_mux(hw);
|
||||||
|
|
||||||
|
return clk_mux_determine_rate_flags(hw, req, mux->flags);
|
||||||
|
}
|
||||||
|
|
||||||
const struct clk_ops clk_mux_ops = {
|
const struct clk_ops clk_mux_ops = {
|
||||||
.get_parent = clk_mux_get_parent,
|
.get_parent = clk_mux_get_parent,
|
||||||
.set_parent = clk_mux_set_parent,
|
.set_parent = clk_mux_set_parent,
|
||||||
.determine_rate = __clk_mux_determine_rate,
|
.determine_rate = clk_mux_determine_rate,
|
||||||
};
|
};
|
||||||
EXPORT_SYMBOL_GPL(clk_mux_ops);
|
EXPORT_SYMBOL_GPL(clk_mux_ops);
|
||||||
|
|
||||||
|
|
|
@ -216,7 +216,7 @@ static const char * const usart1_src[] = {
|
||||||
"pclk5", "pll3_q", "ck_hsi", "ck_csi", "pll4_q", "ck_hse"
|
"pclk5", "pll3_q", "ck_hsi", "ck_csi", "pll4_q", "ck_hse"
|
||||||
};
|
};
|
||||||
|
|
||||||
const char * const usart234578_src[] = {
|
static const char * const usart234578_src[] = {
|
||||||
"pclk1", "pll4_q", "ck_hsi", "ck_csi", "ck_hse"
|
"pclk1", "pll4_q", "ck_hsi", "ck_csi", "ck_hse"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -224,10 +224,6 @@ static const char * const usart6_src[] = {
|
||||||
"pclk2", "pll4_q", "ck_hsi", "ck_csi", "ck_hse"
|
"pclk2", "pll4_q", "ck_hsi", "ck_csi", "ck_hse"
|
||||||
};
|
};
|
||||||
|
|
||||||
static const char * const dfsdm_src[] = {
|
|
||||||
"pclk2", "ck_mcu"
|
|
||||||
};
|
|
||||||
|
|
||||||
static const char * const fdcan_src[] = {
|
static const char * const fdcan_src[] = {
|
||||||
"ck_hse", "pll3_q", "pll4_q"
|
"ck_hse", "pll3_q", "pll4_q"
|
||||||
};
|
};
|
||||||
|
@ -316,10 +312,8 @@ struct stm32_clk_mgate {
|
||||||
struct clock_config {
|
struct clock_config {
|
||||||
u32 id;
|
u32 id;
|
||||||
const char *name;
|
const char *name;
|
||||||
union {
|
|
||||||
const char *parent_name;
|
const char *parent_name;
|
||||||
const char * const *parent_names;
|
const char * const *parent_names;
|
||||||
};
|
|
||||||
int num_parents;
|
int num_parents;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
void *cfg;
|
void *cfg;
|
||||||
|
@ -469,7 +463,7 @@ static void mp1_gate_clk_disable(struct clk_hw *hw)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const struct clk_ops mp1_gate_clk_ops = {
|
static const struct clk_ops mp1_gate_clk_ops = {
|
||||||
.enable = mp1_gate_clk_enable,
|
.enable = mp1_gate_clk_enable,
|
||||||
.disable = mp1_gate_clk_disable,
|
.disable = mp1_gate_clk_disable,
|
||||||
.is_enabled = clk_gate_is_enabled,
|
.is_enabled = clk_gate_is_enabled,
|
||||||
|
@ -698,7 +692,7 @@ static void mp1_mgate_clk_disable(struct clk_hw *hw)
|
||||||
mp1_gate_clk_disable(hw);
|
mp1_gate_clk_disable(hw);
|
||||||
}
|
}
|
||||||
|
|
||||||
const struct clk_ops mp1_mgate_clk_ops = {
|
static const struct clk_ops mp1_mgate_clk_ops = {
|
||||||
.enable = mp1_mgate_clk_enable,
|
.enable = mp1_mgate_clk_enable,
|
||||||
.disable = mp1_mgate_clk_disable,
|
.disable = mp1_mgate_clk_disable,
|
||||||
.is_enabled = clk_gate_is_enabled,
|
.is_enabled = clk_gate_is_enabled,
|
||||||
|
@ -732,7 +726,7 @@ static int clk_mmux_set_parent(struct clk_hw *hw, u8 index)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
const struct clk_ops clk_mmux_ops = {
|
static const struct clk_ops clk_mmux_ops = {
|
||||||
.get_parent = clk_mmux_get_parent,
|
.get_parent = clk_mmux_get_parent,
|
||||||
.set_parent = clk_mmux_set_parent,
|
.set_parent = clk_mmux_set_parent,
|
||||||
.determine_rate = __clk_mux_determine_rate,
|
.determine_rate = __clk_mux_determine_rate,
|
||||||
|
@ -1048,7 +1042,7 @@ struct stm32_pll_cfg {
|
||||||
u32 offset;
|
u32 offset;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct clk_hw *_clk_register_pll(struct device *dev,
|
static struct clk_hw *_clk_register_pll(struct device *dev,
|
||||||
struct clk_hw_onecell_data *clk_data,
|
struct clk_hw_onecell_data *clk_data,
|
||||||
void __iomem *base, spinlock_t *lock,
|
void __iomem *base, spinlock_t *lock,
|
||||||
const struct clock_config *cfg)
|
const struct clock_config *cfg)
|
||||||
|
@ -1405,7 +1399,8 @@ enum {
|
||||||
G_USBH,
|
G_USBH,
|
||||||
G_ETHSTP,
|
G_ETHSTP,
|
||||||
G_RTCAPB,
|
G_RTCAPB,
|
||||||
G_TZC,
|
G_TZC1,
|
||||||
|
G_TZC2,
|
||||||
G_TZPC,
|
G_TZPC,
|
||||||
G_IWDG1,
|
G_IWDG1,
|
||||||
G_BSEC,
|
G_BSEC,
|
||||||
|
@ -1417,7 +1412,7 @@ enum {
|
||||||
G_LAST
|
G_LAST
|
||||||
};
|
};
|
||||||
|
|
||||||
struct stm32_mgate mp1_mgate[G_LAST];
|
static struct stm32_mgate mp1_mgate[G_LAST];
|
||||||
|
|
||||||
#define _K_GATE(_id, _gate_offset, _gate_bit_idx, _gate_flags,\
|
#define _K_GATE(_id, _gate_offset, _gate_bit_idx, _gate_flags,\
|
||||||
_mgate, _ops)\
|
_mgate, _ops)\
|
||||||
|
@ -1440,7 +1435,7 @@ struct stm32_mgate mp1_mgate[G_LAST];
|
||||||
&mp1_mgate[_id], &mp1_mgate_clk_ops)
|
&mp1_mgate[_id], &mp1_mgate_clk_ops)
|
||||||
|
|
||||||
/* Peripheral gates */
|
/* Peripheral gates */
|
||||||
struct stm32_gate_cfg per_gate_cfg[G_LAST] = {
|
static struct stm32_gate_cfg per_gate_cfg[G_LAST] = {
|
||||||
/* Multi gates */
|
/* Multi gates */
|
||||||
K_GATE(G_MDIO, RCC_APB1ENSETR, 31, 0),
|
K_GATE(G_MDIO, RCC_APB1ENSETR, 31, 0),
|
||||||
K_MGATE(G_DAC12, RCC_APB1ENSETR, 29, 0),
|
K_MGATE(G_DAC12, RCC_APB1ENSETR, 29, 0),
|
||||||
|
@ -1506,7 +1501,8 @@ struct stm32_gate_cfg per_gate_cfg[G_LAST] = {
|
||||||
K_GATE(G_BSEC, RCC_APB5ENSETR, 16, 0),
|
K_GATE(G_BSEC, RCC_APB5ENSETR, 16, 0),
|
||||||
K_GATE(G_IWDG1, RCC_APB5ENSETR, 15, 0),
|
K_GATE(G_IWDG1, RCC_APB5ENSETR, 15, 0),
|
||||||
K_GATE(G_TZPC, RCC_APB5ENSETR, 13, 0),
|
K_GATE(G_TZPC, RCC_APB5ENSETR, 13, 0),
|
||||||
K_GATE(G_TZC, RCC_APB5ENSETR, 12, 0),
|
K_GATE(G_TZC2, RCC_APB5ENSETR, 12, 0),
|
||||||
|
K_GATE(G_TZC1, RCC_APB5ENSETR, 11, 0),
|
||||||
K_GATE(G_RTCAPB, RCC_APB5ENSETR, 8, 0),
|
K_GATE(G_RTCAPB, RCC_APB5ENSETR, 8, 0),
|
||||||
K_MGATE(G_USART1, RCC_APB5ENSETR, 4, 0),
|
K_MGATE(G_USART1, RCC_APB5ENSETR, 4, 0),
|
||||||
K_MGATE(G_I2C6, RCC_APB5ENSETR, 3, 0),
|
K_MGATE(G_I2C6, RCC_APB5ENSETR, 3, 0),
|
||||||
|
@ -1600,7 +1596,7 @@ enum {
|
||||||
M_LAST
|
M_LAST
|
||||||
};
|
};
|
||||||
|
|
||||||
struct stm32_mmux ker_mux[M_LAST];
|
static struct stm32_mmux ker_mux[M_LAST];
|
||||||
|
|
||||||
#define _K_MUX(_id, _offset, _shift, _width, _mux_flags, _mmux, _ops)\
|
#define _K_MUX(_id, _offset, _shift, _width, _mux_flags, _mmux, _ops)\
|
||||||
[_id] = {\
|
[_id] = {\
|
||||||
|
@ -1623,7 +1619,7 @@ struct stm32_mmux ker_mux[M_LAST];
|
||||||
_K_MUX(_id, _offset, _shift, _width, _mux_flags,\
|
_K_MUX(_id, _offset, _shift, _width, _mux_flags,\
|
||||||
&ker_mux[_id], &clk_mmux_ops)
|
&ker_mux[_id], &clk_mmux_ops)
|
||||||
|
|
||||||
const struct stm32_mux_cfg ker_mux_cfg[M_LAST] = {
|
static const struct stm32_mux_cfg ker_mux_cfg[M_LAST] = {
|
||||||
/* Kernel multi mux */
|
/* Kernel multi mux */
|
||||||
K_MMUX(M_SDMMC12, RCC_SDMMC12CKSELR, 0, 3, 0),
|
K_MMUX(M_SDMMC12, RCC_SDMMC12CKSELR, 0, 3, 0),
|
||||||
K_MMUX(M_SPI23, RCC_SPI2S23CKSELR, 0, 3, 0),
|
K_MMUX(M_SPI23, RCC_SPI2S23CKSELR, 0, 3, 0),
|
||||||
|
@ -1860,7 +1856,8 @@ static const struct clock_config stm32mp1_clock_cfg[] = {
|
||||||
PCLK(USART1, "usart1", "pclk5", 0, G_USART1),
|
PCLK(USART1, "usart1", "pclk5", 0, G_USART1),
|
||||||
PCLK(RTCAPB, "rtcapb", "pclk5", CLK_IGNORE_UNUSED |
|
PCLK(RTCAPB, "rtcapb", "pclk5", CLK_IGNORE_UNUSED |
|
||||||
CLK_IS_CRITICAL, G_RTCAPB),
|
CLK_IS_CRITICAL, G_RTCAPB),
|
||||||
PCLK(TZC, "tzc", "pclk5", CLK_IGNORE_UNUSED, G_TZC),
|
PCLK(TZC1, "tzc1", "ck_axi", CLK_IGNORE_UNUSED, G_TZC1),
|
||||||
|
PCLK(TZC2, "tzc2", "ck_axi", CLK_IGNORE_UNUSED, G_TZC2),
|
||||||
PCLK(TZPC, "tzpc", "pclk5", CLK_IGNORE_UNUSED, G_TZPC),
|
PCLK(TZPC, "tzpc", "pclk5", CLK_IGNORE_UNUSED, G_TZPC),
|
||||||
PCLK(IWDG1, "iwdg1", "pclk5", 0, G_IWDG1),
|
PCLK(IWDG1, "iwdg1", "pclk5", 0, G_IWDG1),
|
||||||
PCLK(BSEC, "bsec", "pclk5", CLK_IGNORE_UNUSED, G_BSEC),
|
PCLK(BSEC, "bsec", "pclk5", CLK_IGNORE_UNUSED, G_BSEC),
|
||||||
|
@ -1916,8 +1913,7 @@ static const struct clock_config stm32mp1_clock_cfg[] = {
|
||||||
KCLK(RNG1_K, "rng1_k", rng_src, 0, G_RNG1, M_RNG1),
|
KCLK(RNG1_K, "rng1_k", rng_src, 0, G_RNG1, M_RNG1),
|
||||||
KCLK(RNG2_K, "rng2_k", rng_src, 0, G_RNG2, M_RNG2),
|
KCLK(RNG2_K, "rng2_k", rng_src, 0, G_RNG2, M_RNG2),
|
||||||
KCLK(USBPHY_K, "usbphy_k", usbphy_src, 0, G_USBPHY, M_USBPHY),
|
KCLK(USBPHY_K, "usbphy_k", usbphy_src, 0, G_USBPHY, M_USBPHY),
|
||||||
KCLK(STGEN_K, "stgen_k", stgen_src, CLK_IGNORE_UNUSED,
|
KCLK(STGEN_K, "stgen_k", stgen_src, CLK_IS_CRITICAL, G_STGEN, M_STGEN),
|
||||||
G_STGEN, M_STGEN),
|
|
||||||
KCLK(SPDIF_K, "spdif_k", spdif_src, 0, G_SPDIF, M_SPDIF),
|
KCLK(SPDIF_K, "spdif_k", spdif_src, 0, G_SPDIF, M_SPDIF),
|
||||||
KCLK(SPI1_K, "spi1_k", spi123_src, 0, G_SPI1, M_SPI1),
|
KCLK(SPI1_K, "spi1_k", spi123_src, 0, G_SPI1, M_SPI1),
|
||||||
KCLK(SPI2_K, "spi2_k", spi123_src, 0, G_SPI2, M_SPI23),
|
KCLK(SPI2_K, "spi2_k", spi123_src, 0, G_SPI2, M_SPI23),
|
||||||
|
@ -1948,8 +1944,8 @@ static const struct clock_config stm32mp1_clock_cfg[] = {
|
||||||
KCLK(FDCAN_K, "fdcan_k", fdcan_src, 0, G_FDCAN, M_FDCAN),
|
KCLK(FDCAN_K, "fdcan_k", fdcan_src, 0, G_FDCAN, M_FDCAN),
|
||||||
KCLK(SAI1_K, "sai1_k", sai_src, 0, G_SAI1, M_SAI1),
|
KCLK(SAI1_K, "sai1_k", sai_src, 0, G_SAI1, M_SAI1),
|
||||||
KCLK(SAI2_K, "sai2_k", sai2_src, 0, G_SAI2, M_SAI2),
|
KCLK(SAI2_K, "sai2_k", sai2_src, 0, G_SAI2, M_SAI2),
|
||||||
KCLK(SAI3_K, "sai3_k", sai_src, 0, G_SAI2, M_SAI3),
|
KCLK(SAI3_K, "sai3_k", sai_src, 0, G_SAI3, M_SAI3),
|
||||||
KCLK(SAI4_K, "sai4_k", sai_src, 0, G_SAI2, M_SAI4),
|
KCLK(SAI4_K, "sai4_k", sai_src, 0, G_SAI4, M_SAI4),
|
||||||
KCLK(ADC12_K, "adc12_k", adc12_src, 0, G_ADC12, M_ADC12),
|
KCLK(ADC12_K, "adc12_k", adc12_src, 0, G_ADC12, M_ADC12),
|
||||||
KCLK(DSI_K, "dsi_k", dsi_src, 0, G_DSI, M_DSI),
|
KCLK(DSI_K, "dsi_k", dsi_src, 0, G_DSI, M_DSI),
|
||||||
KCLK(ADFSDM_K, "adfsdm_k", sai_src, 0, G_ADFSDM, M_SAI1),
|
KCLK(ADFSDM_K, "adfsdm_k", sai_src, 0, G_ADFSDM, M_SAI1),
|
||||||
|
@ -1992,10 +1988,6 @@ static const struct clock_config stm32mp1_clock_cfg[] = {
|
||||||
_DIV(RCC_MCO2CFGR, 4, 4, 0, NULL)),
|
_DIV(RCC_MCO2CFGR, 4, 4, 0, NULL)),
|
||||||
|
|
||||||
/* Debug clocks */
|
/* Debug clocks */
|
||||||
FIXED_FACTOR(NO_ID, "ck_axi_div2", "ck_axi", 0, 1, 2),
|
|
||||||
|
|
||||||
GATE(DBG, "ck_apb_dbg", "ck_axi_div2", 0, RCC_DBGCFGR, 8, 0),
|
|
||||||
|
|
||||||
GATE(CK_DBG, "ck_sys_dbg", "ck_axi", 0, RCC_DBGCFGR, 8, 0),
|
GATE(CK_DBG, "ck_sys_dbg", "ck_axi", 0, RCC_DBGCFGR, 8, 0),
|
||||||
|
|
||||||
COMPOSITE(CK_TRACE, "ck_trace", ck_trace_src, CLK_OPS_PARENT_ENABLE,
|
COMPOSITE(CK_TRACE, "ck_trace", ck_trace_src, CLK_OPS_PARENT_ENABLE,
|
||||||
|
|
|
@ -426,8 +426,8 @@ static bool mux_is_better_rate(unsigned long rate, unsigned long now,
|
||||||
return now <= rate && now > best;
|
return now <= rate && now > best;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
int clk_mux_determine_rate_flags(struct clk_hw *hw,
|
||||||
clk_mux_determine_rate_flags(struct clk_hw *hw, struct clk_rate_request *req,
|
struct clk_rate_request *req,
|
||||||
unsigned long flags)
|
unsigned long flags)
|
||||||
{
|
{
|
||||||
struct clk_core *core = hw->core, *parent, *best_parent = NULL;
|
struct clk_core *core = hw->core, *parent, *best_parent = NULL;
|
||||||
|
@ -488,6 +488,7 @@ clk_mux_determine_rate_flags(struct clk_hw *hw, struct clk_rate_request *req,
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(clk_mux_determine_rate_flags);
|
||||||
|
|
||||||
struct clk *__clk_lookup(const char *name)
|
struct clk *__clk_lookup(const char *name)
|
||||||
{
|
{
|
||||||
|
|
|
@ -153,10 +153,19 @@ static int clk_regmap_mux_set_parent(struct clk_hw *hw, u8 index)
|
||||||
val << mux->shift);
|
val << mux->shift);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int clk_regmap_mux_determine_rate(struct clk_hw *hw,
|
||||||
|
struct clk_rate_request *req)
|
||||||
|
{
|
||||||
|
struct clk_regmap *clk = to_clk_regmap(hw);
|
||||||
|
struct clk_regmap_mux_data *mux = clk_get_regmap_mux_data(clk);
|
||||||
|
|
||||||
|
return clk_mux_determine_rate_flags(hw, req, mux->flags);
|
||||||
|
}
|
||||||
|
|
||||||
const struct clk_ops clk_regmap_mux_ops = {
|
const struct clk_ops clk_regmap_mux_ops = {
|
||||||
.get_parent = clk_regmap_mux_get_parent,
|
.get_parent = clk_regmap_mux_get_parent,
|
||||||
.set_parent = clk_regmap_mux_set_parent,
|
.set_parent = clk_regmap_mux_set_parent,
|
||||||
.determine_rate = __clk_mux_determine_rate,
|
.determine_rate = clk_regmap_mux_determine_rate,
|
||||||
};
|
};
|
||||||
EXPORT_SYMBOL_GPL(clk_regmap_mux_ops);
|
EXPORT_SYMBOL_GPL(clk_regmap_mux_ops);
|
||||||
|
|
||||||
|
|
|
@ -17,8 +17,6 @@
|
||||||
#define AO_RTC_ALT_CLK_CNTL0 0x94
|
#define AO_RTC_ALT_CLK_CNTL0 0x94
|
||||||
#define AO_RTC_ALT_CLK_CNTL1 0x98
|
#define AO_RTC_ALT_CLK_CNTL1 0x98
|
||||||
|
|
||||||
extern const struct clk_ops meson_aoclk_gate_regmap_ops;
|
|
||||||
|
|
||||||
struct aoclk_cec_32k {
|
struct aoclk_cec_32k {
|
||||||
struct clk_hw hw;
|
struct clk_hw hw;
|
||||||
struct regmap *regmap;
|
struct regmap *regmap;
|
||||||
|
|
|
@ -253,7 +253,7 @@ static struct clk_fixed_factor meson8b_fclk_div3_div = {
|
||||||
.mult = 1,
|
.mult = 1,
|
||||||
.div = 3,
|
.div = 3,
|
||||||
.hw.init = &(struct clk_init_data){
|
.hw.init = &(struct clk_init_data){
|
||||||
.name = "fclk_div_div3",
|
.name = "fclk_div3_div",
|
||||||
.ops = &clk_fixed_factor_ops,
|
.ops = &clk_fixed_factor_ops,
|
||||||
.parent_names = (const char *[]){ "fixed_pll" },
|
.parent_names = (const char *[]){ "fixed_pll" },
|
||||||
.num_parents = 1,
|
.num_parents = 1,
|
||||||
|
@ -632,7 +632,8 @@ static struct clk_regmap meson8b_cpu_clk = {
|
||||||
.hw.init = &(struct clk_init_data){
|
.hw.init = &(struct clk_init_data){
|
||||||
.name = "cpu_clk",
|
.name = "cpu_clk",
|
||||||
.ops = &clk_regmap_mux_ro_ops,
|
.ops = &clk_regmap_mux_ro_ops,
|
||||||
.parent_names = (const char *[]){ "xtal", "cpu_out_sel" },
|
.parent_names = (const char *[]){ "xtal",
|
||||||
|
"cpu_scale_out_sel" },
|
||||||
.num_parents = 2,
|
.num_parents = 2,
|
||||||
.flags = (CLK_SET_RATE_PARENT |
|
.flags = (CLK_SET_RATE_PARENT |
|
||||||
CLK_SET_RATE_NO_REPARENT),
|
CLK_SET_RATE_NO_REPARENT),
|
||||||
|
|
|
@ -126,6 +126,49 @@ static void cppc_cpufreq_stop_cpu(struct cpufreq_policy *policy)
|
||||||
cpu->perf_caps.lowest_perf, cpu_num, ret);
|
cpu->perf_caps.lowest_perf, cpu_num, ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The PCC subspace describes the rate at which platform can accept commands
|
||||||
|
* on the shared PCC channel (including READs which do not count towards freq
|
||||||
|
* trasition requests), so ideally we need to use the PCC values as a fallback
|
||||||
|
* if we don't have a platform specific transition_delay_us
|
||||||
|
*/
|
||||||
|
#ifdef CONFIG_ARM64
|
||||||
|
#include <asm/cputype.h>
|
||||||
|
|
||||||
|
static unsigned int cppc_cpufreq_get_transition_delay_us(int cpu)
|
||||||
|
{
|
||||||
|
unsigned long implementor = read_cpuid_implementor();
|
||||||
|
unsigned long part_num = read_cpuid_part_number();
|
||||||
|
unsigned int delay_us = 0;
|
||||||
|
|
||||||
|
switch (implementor) {
|
||||||
|
case ARM_CPU_IMP_QCOM:
|
||||||
|
switch (part_num) {
|
||||||
|
case QCOM_CPU_PART_FALKOR_V1:
|
||||||
|
case QCOM_CPU_PART_FALKOR:
|
||||||
|
delay_us = 10000;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
delay_us = cppc_get_transition_latency(cpu) / NSEC_PER_USEC;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
delay_us = cppc_get_transition_latency(cpu) / NSEC_PER_USEC;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return delay_us;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
static unsigned int cppc_cpufreq_get_transition_delay_us(int cpu)
|
||||||
|
{
|
||||||
|
return cppc_get_transition_latency(cpu) / NSEC_PER_USEC;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int cppc_cpufreq_cpu_init(struct cpufreq_policy *policy)
|
static int cppc_cpufreq_cpu_init(struct cpufreq_policy *policy)
|
||||||
{
|
{
|
||||||
struct cppc_cpudata *cpu;
|
struct cppc_cpudata *cpu;
|
||||||
|
@ -162,8 +205,7 @@ static int cppc_cpufreq_cpu_init(struct cpufreq_policy *policy)
|
||||||
cpu->perf_caps.highest_perf;
|
cpu->perf_caps.highest_perf;
|
||||||
policy->cpuinfo.max_freq = cppc_dmi_max_khz;
|
policy->cpuinfo.max_freq = cppc_dmi_max_khz;
|
||||||
|
|
||||||
policy->transition_delay_us = cppc_get_transition_latency(cpu_num) /
|
policy->transition_delay_us = cppc_cpufreq_get_transition_delay_us(cpu_num);
|
||||||
NSEC_PER_USEC;
|
|
||||||
policy->shared_type = cpu->shared_type;
|
policy->shared_type = cpu->shared_type;
|
||||||
|
|
||||||
if (policy->shared_type == CPUFREQ_SHARED_TYPE_ANY) {
|
if (policy->shared_type == CPUFREQ_SHARED_TYPE_ANY) {
|
||||||
|
|
|
@ -384,7 +384,7 @@ static void aspeed_gpio_irq_set_mask(struct irq_data *d, bool set)
|
||||||
if (set)
|
if (set)
|
||||||
reg |= bit;
|
reg |= bit;
|
||||||
else
|
else
|
||||||
reg &= bit;
|
reg &= ~bit;
|
||||||
iowrite32(reg, addr);
|
iowrite32(reg, addr);
|
||||||
|
|
||||||
spin_unlock_irqrestore(&gpio->lock, flags);
|
spin_unlock_irqrestore(&gpio->lock, flags);
|
||||||
|
|
|
@ -116,9 +116,9 @@ static int idio_16_gpio_get_multiple(struct gpio_chip *chip,
|
||||||
unsigned long word_mask;
|
unsigned long word_mask;
|
||||||
const unsigned long port_mask = GENMASK(gpio_reg_size - 1, 0);
|
const unsigned long port_mask = GENMASK(gpio_reg_size - 1, 0);
|
||||||
unsigned long port_state;
|
unsigned long port_state;
|
||||||
u8 __iomem ports[] = {
|
void __iomem *ports[] = {
|
||||||
idio16gpio->reg->out0_7, idio16gpio->reg->out8_15,
|
&idio16gpio->reg->out0_7, &idio16gpio->reg->out8_15,
|
||||||
idio16gpio->reg->in0_7, idio16gpio->reg->in8_15,
|
&idio16gpio->reg->in0_7, &idio16gpio->reg->in8_15,
|
||||||
};
|
};
|
||||||
|
|
||||||
/* clear bits array to a clean slate */
|
/* clear bits array to a clean slate */
|
||||||
|
@ -143,7 +143,7 @@ static int idio_16_gpio_get_multiple(struct gpio_chip *chip,
|
||||||
}
|
}
|
||||||
|
|
||||||
/* read bits from current gpio port */
|
/* read bits from current gpio port */
|
||||||
port_state = ioread8(ports + i);
|
port_state = ioread8(ports[i]);
|
||||||
|
|
||||||
/* store acquired bits at respective bits array offset */
|
/* store acquired bits at respective bits array offset */
|
||||||
bits[word_index] |= port_state << word_offset;
|
bits[word_index] |= port_state << word_offset;
|
||||||
|
|
|
@ -206,10 +206,10 @@ static int idio_24_gpio_get_multiple(struct gpio_chip *chip,
|
||||||
unsigned long word_mask;
|
unsigned long word_mask;
|
||||||
const unsigned long port_mask = GENMASK(gpio_reg_size - 1, 0);
|
const unsigned long port_mask = GENMASK(gpio_reg_size - 1, 0);
|
||||||
unsigned long port_state;
|
unsigned long port_state;
|
||||||
u8 __iomem ports[] = {
|
void __iomem *ports[] = {
|
||||||
idio24gpio->reg->out0_7, idio24gpio->reg->out8_15,
|
&idio24gpio->reg->out0_7, &idio24gpio->reg->out8_15,
|
||||||
idio24gpio->reg->out16_23, idio24gpio->reg->in0_7,
|
&idio24gpio->reg->out16_23, &idio24gpio->reg->in0_7,
|
||||||
idio24gpio->reg->in8_15, idio24gpio->reg->in16_23,
|
&idio24gpio->reg->in8_15, &idio24gpio->reg->in16_23,
|
||||||
};
|
};
|
||||||
const unsigned long out_mode_mask = BIT(1);
|
const unsigned long out_mode_mask = BIT(1);
|
||||||
|
|
||||||
|
@ -217,7 +217,7 @@ static int idio_24_gpio_get_multiple(struct gpio_chip *chip,
|
||||||
bitmap_zero(bits, chip->ngpio);
|
bitmap_zero(bits, chip->ngpio);
|
||||||
|
|
||||||
/* get bits are evaluated a gpio port register at a time */
|
/* get bits are evaluated a gpio port register at a time */
|
||||||
for (i = 0; i < ARRAY_SIZE(ports); i++) {
|
for (i = 0; i < ARRAY_SIZE(ports) + 1; i++) {
|
||||||
/* gpio offset in bits array */
|
/* gpio offset in bits array */
|
||||||
bits_offset = i * gpio_reg_size;
|
bits_offset = i * gpio_reg_size;
|
||||||
|
|
||||||
|
@ -236,7 +236,7 @@ static int idio_24_gpio_get_multiple(struct gpio_chip *chip,
|
||||||
|
|
||||||
/* read bits from current gpio port (port 6 is TTL GPIO) */
|
/* read bits from current gpio port (port 6 is TTL GPIO) */
|
||||||
if (i < 6)
|
if (i < 6)
|
||||||
port_state = ioread8(ports + i);
|
port_state = ioread8(ports[i]);
|
||||||
else if (ioread8(&idio24gpio->reg->ctl) & out_mode_mask)
|
else if (ioread8(&idio24gpio->reg->ctl) & out_mode_mask)
|
||||||
port_state = ioread8(&idio24gpio->reg->ttl_out0_7);
|
port_state = ioread8(&idio24gpio->reg->ttl_out0_7);
|
||||||
else
|
else
|
||||||
|
@ -301,9 +301,9 @@ static void idio_24_gpio_set_multiple(struct gpio_chip *chip,
|
||||||
const unsigned long port_mask = GENMASK(gpio_reg_size, 0);
|
const unsigned long port_mask = GENMASK(gpio_reg_size, 0);
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
unsigned int out_state;
|
unsigned int out_state;
|
||||||
u8 __iomem ports[] = {
|
void __iomem *ports[] = {
|
||||||
idio24gpio->reg->out0_7, idio24gpio->reg->out8_15,
|
&idio24gpio->reg->out0_7, &idio24gpio->reg->out8_15,
|
||||||
idio24gpio->reg->out16_23
|
&idio24gpio->reg->out16_23
|
||||||
};
|
};
|
||||||
const unsigned long out_mode_mask = BIT(1);
|
const unsigned long out_mode_mask = BIT(1);
|
||||||
const unsigned int ttl_offset = 48;
|
const unsigned int ttl_offset = 48;
|
||||||
|
@ -327,9 +327,9 @@ static void idio_24_gpio_set_multiple(struct gpio_chip *chip,
|
||||||
raw_spin_lock_irqsave(&idio24gpio->lock, flags);
|
raw_spin_lock_irqsave(&idio24gpio->lock, flags);
|
||||||
|
|
||||||
/* process output lines */
|
/* process output lines */
|
||||||
out_state = ioread8(ports + i) & ~gpio_mask;
|
out_state = ioread8(ports[i]) & ~gpio_mask;
|
||||||
out_state |= (*bits >> bits_offset) & gpio_mask;
|
out_state |= (*bits >> bits_offset) & gpio_mask;
|
||||||
iowrite8(out_state, ports + i);
|
iowrite8(out_state, ports[i]);
|
||||||
|
|
||||||
raw_spin_unlock_irqrestore(&idio24gpio->lock, flags);
|
raw_spin_unlock_irqrestore(&idio24gpio->lock, flags);
|
||||||
}
|
}
|
||||||
|
|
|
@ -497,7 +497,7 @@ static int linehandle_create(struct gpio_device *gdev, void __user *ip)
|
||||||
struct gpiohandle_request handlereq;
|
struct gpiohandle_request handlereq;
|
||||||
struct linehandle_state *lh;
|
struct linehandle_state *lh;
|
||||||
struct file *file;
|
struct file *file;
|
||||||
int fd, i, ret;
|
int fd, i, count = 0, ret;
|
||||||
u32 lflags;
|
u32 lflags;
|
||||||
|
|
||||||
if (copy_from_user(&handlereq, ip, sizeof(handlereq)))
|
if (copy_from_user(&handlereq, ip, sizeof(handlereq)))
|
||||||
|
@ -558,6 +558,7 @@ static int linehandle_create(struct gpio_device *gdev, void __user *ip)
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out_free_descs;
|
goto out_free_descs;
|
||||||
lh->descs[i] = desc;
|
lh->descs[i] = desc;
|
||||||
|
count = i;
|
||||||
|
|
||||||
if (lflags & GPIOHANDLE_REQUEST_ACTIVE_LOW)
|
if (lflags & GPIOHANDLE_REQUEST_ACTIVE_LOW)
|
||||||
set_bit(FLAG_ACTIVE_LOW, &desc->flags);
|
set_bit(FLAG_ACTIVE_LOW, &desc->flags);
|
||||||
|
@ -628,7 +629,7 @@ static int linehandle_create(struct gpio_device *gdev, void __user *ip)
|
||||||
out_put_unused_fd:
|
out_put_unused_fd:
|
||||||
put_unused_fd(fd);
|
put_unused_fd(fd);
|
||||||
out_free_descs:
|
out_free_descs:
|
||||||
for (; i >= 0; i--)
|
for (i = 0; i < count; i++)
|
||||||
gpiod_free(lh->descs[i]);
|
gpiod_free(lh->descs[i]);
|
||||||
kfree(lh->label);
|
kfree(lh->label);
|
||||||
out_free_lh:
|
out_free_lh:
|
||||||
|
@ -902,7 +903,7 @@ static int lineevent_create(struct gpio_device *gdev, void __user *ip)
|
||||||
desc = &gdev->descs[offset];
|
desc = &gdev->descs[offset];
|
||||||
ret = gpiod_request(desc, le->label);
|
ret = gpiod_request(desc, le->label);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out_free_desc;
|
goto out_free_label;
|
||||||
le->desc = desc;
|
le->desc = desc;
|
||||||
le->eflags = eflags;
|
le->eflags = eflags;
|
||||||
|
|
||||||
|
|
|
@ -1451,7 +1451,7 @@ bool calculate_user_regamma_ramp(struct dc_transfer_func *output_tf,
|
||||||
|
|
||||||
kfree(rgb_regamma);
|
kfree(rgb_regamma);
|
||||||
rgb_regamma_alloc_fail:
|
rgb_regamma_alloc_fail:
|
||||||
kfree(rgb_user);
|
kvfree(rgb_user);
|
||||||
rgb_user_alloc_fail:
|
rgb_user_alloc_fail:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -84,6 +84,7 @@ config DRM_SIL_SII8620
|
||||||
tristate "Silicon Image SII8620 HDMI/MHL bridge"
|
tristate "Silicon Image SII8620 HDMI/MHL bridge"
|
||||||
depends on OF && RC_CORE
|
depends on OF && RC_CORE
|
||||||
select DRM_KMS_HELPER
|
select DRM_KMS_HELPER
|
||||||
|
imply EXTCON
|
||||||
help
|
help
|
||||||
Silicon Image SII8620 HDMI/MHL bridge chip driver.
|
Silicon Image SII8620 HDMI/MHL bridge chip driver.
|
||||||
|
|
||||||
|
|
|
@ -155,6 +155,8 @@ void drm_atomic_state_default_clear(struct drm_atomic_state *state)
|
||||||
state->connectors[i].state);
|
state->connectors[i].state);
|
||||||
state->connectors[i].ptr = NULL;
|
state->connectors[i].ptr = NULL;
|
||||||
state->connectors[i].state = NULL;
|
state->connectors[i].state = NULL;
|
||||||
|
state->connectors[i].old_state = NULL;
|
||||||
|
state->connectors[i].new_state = NULL;
|
||||||
drm_connector_put(connector);
|
drm_connector_put(connector);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -169,6 +171,8 @@ void drm_atomic_state_default_clear(struct drm_atomic_state *state)
|
||||||
|
|
||||||
state->crtcs[i].ptr = NULL;
|
state->crtcs[i].ptr = NULL;
|
||||||
state->crtcs[i].state = NULL;
|
state->crtcs[i].state = NULL;
|
||||||
|
state->crtcs[i].old_state = NULL;
|
||||||
|
state->crtcs[i].new_state = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < config->num_total_plane; i++) {
|
for (i = 0; i < config->num_total_plane; i++) {
|
||||||
|
@ -181,6 +185,8 @@ void drm_atomic_state_default_clear(struct drm_atomic_state *state)
|
||||||
state->planes[i].state);
|
state->planes[i].state);
|
||||||
state->planes[i].ptr = NULL;
|
state->planes[i].ptr = NULL;
|
||||||
state->planes[i].state = NULL;
|
state->planes[i].state = NULL;
|
||||||
|
state->planes[i].old_state = NULL;
|
||||||
|
state->planes[i].new_state = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < state->num_private_objs; i++) {
|
for (i = 0; i < state->num_private_objs; i++) {
|
||||||
|
@ -190,6 +196,8 @@ void drm_atomic_state_default_clear(struct drm_atomic_state *state)
|
||||||
state->private_objs[i].state);
|
state->private_objs[i].state);
|
||||||
state->private_objs[i].ptr = NULL;
|
state->private_objs[i].ptr = NULL;
|
||||||
state->private_objs[i].state = NULL;
|
state->private_objs[i].state = NULL;
|
||||||
|
state->private_objs[i].old_state = NULL;
|
||||||
|
state->private_objs[i].new_state = NULL;
|
||||||
}
|
}
|
||||||
state->num_private_objs = 0;
|
state->num_private_objs = 0;
|
||||||
|
|
||||||
|
|
|
@ -212,6 +212,7 @@ static int drm_open_helper(struct file *filp, struct drm_minor *minor)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
filp->private_data = priv;
|
filp->private_data = priv;
|
||||||
|
filp->f_mode |= FMODE_UNSIGNED_OFFSET;
|
||||||
priv->filp = filp;
|
priv->filp = filp;
|
||||||
priv->pid = get_pid(task_pid(current));
|
priv->pid = get_pid(task_pid(current));
|
||||||
priv->minor = minor;
|
priv->minor = minor;
|
||||||
|
|
|
@ -214,7 +214,6 @@ nouveau_bo_new(struct nouveau_cli *cli, u64 size, int align,
|
||||||
INIT_LIST_HEAD(&nvbo->entry);
|
INIT_LIST_HEAD(&nvbo->entry);
|
||||||
INIT_LIST_HEAD(&nvbo->vma_list);
|
INIT_LIST_HEAD(&nvbo->vma_list);
|
||||||
nvbo->bo.bdev = &drm->ttm.bdev;
|
nvbo->bo.bdev = &drm->ttm.bdev;
|
||||||
nvbo->cli = cli;
|
|
||||||
|
|
||||||
/* This is confusing, and doesn't actually mean we want an uncached
|
/* This is confusing, and doesn't actually mean we want an uncached
|
||||||
* mapping, but is what NOUVEAU_GEM_DOMAIN_COHERENT gets translated
|
* mapping, but is what NOUVEAU_GEM_DOMAIN_COHERENT gets translated
|
||||||
|
|
|
@ -26,8 +26,6 @@ struct nouveau_bo {
|
||||||
|
|
||||||
struct list_head vma_list;
|
struct list_head vma_list;
|
||||||
|
|
||||||
struct nouveau_cli *cli;
|
|
||||||
|
|
||||||
unsigned contig:1;
|
unsigned contig:1;
|
||||||
unsigned page:5;
|
unsigned page:5;
|
||||||
unsigned kind:8;
|
unsigned kind:8;
|
||||||
|
|
|
@ -63,7 +63,7 @@ nouveau_vram_manager_new(struct ttm_mem_type_manager *man,
|
||||||
struct ttm_mem_reg *reg)
|
struct ttm_mem_reg *reg)
|
||||||
{
|
{
|
||||||
struct nouveau_bo *nvbo = nouveau_bo(bo);
|
struct nouveau_bo *nvbo = nouveau_bo(bo);
|
||||||
struct nouveau_drm *drm = nvbo->cli->drm;
|
struct nouveau_drm *drm = nouveau_bdev(bo->bdev);
|
||||||
struct nouveau_mem *mem;
|
struct nouveau_mem *mem;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -103,7 +103,7 @@ nouveau_gart_manager_new(struct ttm_mem_type_manager *man,
|
||||||
struct ttm_mem_reg *reg)
|
struct ttm_mem_reg *reg)
|
||||||
{
|
{
|
||||||
struct nouveau_bo *nvbo = nouveau_bo(bo);
|
struct nouveau_bo *nvbo = nouveau_bo(bo);
|
||||||
struct nouveau_drm *drm = nvbo->cli->drm;
|
struct nouveau_drm *drm = nouveau_bdev(bo->bdev);
|
||||||
struct nouveau_mem *mem;
|
struct nouveau_mem *mem;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
@ -131,7 +131,7 @@ nv04_gart_manager_new(struct ttm_mem_type_manager *man,
|
||||||
struct ttm_mem_reg *reg)
|
struct ttm_mem_reg *reg)
|
||||||
{
|
{
|
||||||
struct nouveau_bo *nvbo = nouveau_bo(bo);
|
struct nouveau_bo *nvbo = nouveau_bo(bo);
|
||||||
struct nouveau_drm *drm = nvbo->cli->drm;
|
struct nouveau_drm *drm = nouveau_bdev(bo->bdev);
|
||||||
struct nouveau_mem *mem;
|
struct nouveau_mem *mem;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
|
|
@ -3264,10 +3264,11 @@ nv50_mstm_destroy_connector(struct drm_dp_mst_topology_mgr *mgr,
|
||||||
|
|
||||||
drm_connector_unregister(&mstc->connector);
|
drm_connector_unregister(&mstc->connector);
|
||||||
|
|
||||||
drm_modeset_lock_all(drm->dev);
|
|
||||||
drm_fb_helper_remove_one_connector(&drm->fbcon->helper, &mstc->connector);
|
drm_fb_helper_remove_one_connector(&drm->fbcon->helper, &mstc->connector);
|
||||||
|
|
||||||
|
drm_modeset_lock(&drm->dev->mode_config.connection_mutex, NULL);
|
||||||
mstc->port = NULL;
|
mstc->port = NULL;
|
||||||
drm_modeset_unlock_all(drm->dev);
|
drm_modeset_unlock(&drm->dev->mode_config.connection_mutex);
|
||||||
|
|
||||||
drm_connector_unreference(&mstc->connector);
|
drm_connector_unreference(&mstc->connector);
|
||||||
}
|
}
|
||||||
|
@ -3277,9 +3278,7 @@ nv50_mstm_register_connector(struct drm_connector *connector)
|
||||||
{
|
{
|
||||||
struct nouveau_drm *drm = nouveau_drm(connector->dev);
|
struct nouveau_drm *drm = nouveau_drm(connector->dev);
|
||||||
|
|
||||||
drm_modeset_lock_all(drm->dev);
|
|
||||||
drm_fb_helper_add_one_connector(&drm->fbcon->helper, connector);
|
drm_fb_helper_add_one_connector(&drm->fbcon->helper, connector);
|
||||||
drm_modeset_unlock_all(drm->dev);
|
|
||||||
|
|
||||||
drm_connector_register(connector);
|
drm_connector_register(connector);
|
||||||
}
|
}
|
||||||
|
|
|
@ -828,6 +828,12 @@ static void dispc_ovl_set_scale_coef(struct dispc_device *dispc,
|
||||||
h_coef = dispc_ovl_get_scale_coef(fir_hinc, true);
|
h_coef = dispc_ovl_get_scale_coef(fir_hinc, true);
|
||||||
v_coef = dispc_ovl_get_scale_coef(fir_vinc, five_taps);
|
v_coef = dispc_ovl_get_scale_coef(fir_vinc, five_taps);
|
||||||
|
|
||||||
|
if (!h_coef || !v_coef) {
|
||||||
|
dev_err(&dispc->pdev->dev, "%s: failed to find scale coefs\n",
|
||||||
|
__func__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < 8; i++) {
|
for (i = 0; i < 8; i++) {
|
||||||
u32 h, hv;
|
u32 h, hv;
|
||||||
|
|
||||||
|
@ -2342,7 +2348,7 @@ static int dispc_ovl_calc_scaling_24xx(struct dispc_device *dispc,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (in_width > maxsinglelinewidth) {
|
if (in_width > maxsinglelinewidth) {
|
||||||
DSSERR("Cannot scale max input width exceeded");
|
DSSERR("Cannot scale max input width exceeded\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -2424,13 +2430,13 @@ static int dispc_ovl_calc_scaling_34xx(struct dispc_device *dispc,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (in_width > (maxsinglelinewidth * 2)) {
|
if (in_width > (maxsinglelinewidth * 2)) {
|
||||||
DSSERR("Cannot setup scaling");
|
DSSERR("Cannot setup scaling\n");
|
||||||
DSSERR("width exceeds maximum width possible");
|
DSSERR("width exceeds maximum width possible\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (in_width > maxsinglelinewidth && *five_taps) {
|
if (in_width > maxsinglelinewidth && *five_taps) {
|
||||||
DSSERR("cannot setup scaling with five taps");
|
DSSERR("cannot setup scaling with five taps\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -2472,7 +2478,7 @@ static int dispc_ovl_calc_scaling_44xx(struct dispc_device *dispc,
|
||||||
in_width > maxsinglelinewidth && ++*decim_x);
|
in_width > maxsinglelinewidth && ++*decim_x);
|
||||||
|
|
||||||
if (in_width > maxsinglelinewidth) {
|
if (in_width > maxsinglelinewidth) {
|
||||||
DSSERR("Cannot scale width exceeds max line width");
|
DSSERR("Cannot scale width exceeds max line width\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2490,7 +2496,7 @@ static int dispc_ovl_calc_scaling_44xx(struct dispc_device *dispc,
|
||||||
* bandwidth. Despite what theory says this appears to
|
* bandwidth. Despite what theory says this appears to
|
||||||
* be true also for 16-bit color formats.
|
* be true also for 16-bit color formats.
|
||||||
*/
|
*/
|
||||||
DSSERR("Not enough bandwidth, too much downscaling (x-decimation factor %d > 4)", *decim_x);
|
DSSERR("Not enough bandwidth, too much downscaling (x-decimation factor %d > 4)\n", *decim_x);
|
||||||
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
@ -4633,7 +4639,7 @@ static int dispc_errata_i734_wa_init(struct dispc_device *dispc)
|
||||||
i734_buf.size, &i734_buf.paddr,
|
i734_buf.size, &i734_buf.paddr,
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
if (!i734_buf.vaddr) {
|
if (!i734_buf.vaddr) {
|
||||||
dev_err(&dispc->pdev->dev, "%s: dma_alloc_writecombine failed",
|
dev_err(&dispc->pdev->dev, "%s: dma_alloc_writecombine failed\n",
|
||||||
__func__);
|
__func__);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
|
@ -679,7 +679,7 @@ static int hdmi_audio_config(struct device *dev,
|
||||||
struct omap_dss_audio *dss_audio)
|
struct omap_dss_audio *dss_audio)
|
||||||
{
|
{
|
||||||
struct omap_hdmi *hd = dev_get_drvdata(dev);
|
struct omap_hdmi *hd = dev_get_drvdata(dev);
|
||||||
int ret;
|
int ret = 0;
|
||||||
|
|
||||||
mutex_lock(&hd->lock);
|
mutex_lock(&hd->lock);
|
||||||
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue