Linux 4.6-rc7
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJXL7HfAAoJEHm+PkMAQRiGYe8IAJBGaPUq38EJh2YOV+AQf9v6 t/alhwB3DUE1E0zjLy7I7JJ+xDXtKjZh9fS6OFuIS8Q3RIrBteIJ/oH8TPpt7yZ/ SnP6rYPvYD6CImTyrh7+ORL/udEwJX8+YqFYAgUAq167gvpDjYj8r26VzdIaIN4/ oBbL8NrQNWfODieywYyhUoitVhwMz09zmBfLtGVks4vd2jUJk2Fdd9cOtGV5tRfk DPndPgyQtbr8W0mKovV8sT9WkQeV5TsUr4MLgf7hjnAGYQ8+0KamkzzVVLBeBiiw uazyrOCFkddZp+N7KbmbOmazV/yULRuLGgDjVKazoCsOaKOvoGCzrCk7daOPy6Q= =CegX -----END PGP SIGNATURE----- Merge tag 'v4.6-rc7' into patchwork Linux 4.6-rc7 * tag 'v4.6-rc7': (185 commits) Linux 4.6-rc7 parisc: fix a bug when syscall number of tracee is __NR_Linux_syscalls x86/tsc: Read all ratio bits from MSR_PLATFORM_INFO mailmap: add John Paul Adrian Glaubitz byteswap: try to avoid __builtin_constant_p gcc bug lib/stackdepot: avoid to return 0 handle mm: fix kcompactd hang during memory offlining modpost: fix module autoloading for OF devices with generic compatible property proc: prevent accessing /proc/<PID>/environ until it's ready mm/zswap: provide unique zpool name mm: thp: kvm: fix memory corruption in KVM with THP enabled MAINTAINERS: fix Rajendra Nayak's address mm, cma: prevent nr_isolated_* counters from going negative mm: update min_free_kbytes from khugepaged after core initialization huge pagecache: mmap_sem is unlocked when truncation splits pmd rapidio/mport_cdev: fix uapi type definitions mm: memcontrol: let v2 cgroups follow changes in system swappiness mm: thp: correct split_huge_pages file permission maintainers: update rmk's email address(es) writeback: Fix performance regression in wb_over_bg_thresh() ...
This commit is contained in:
commit
a022f9347a
208 changed files with 1860 additions and 920 deletions
1
.mailmap
1
.mailmap
|
@ -69,6 +69,7 @@ Jean Tourrilhes <jt@hpl.hp.com>
|
||||||
Jeff Garzik <jgarzik@pretzel.yyz.us>
|
Jeff Garzik <jgarzik@pretzel.yyz.us>
|
||||||
Jens Axboe <axboe@suse.de>
|
Jens Axboe <axboe@suse.de>
|
||||||
Jens Osterkamp <Jens.Osterkamp@de.ibm.com>
|
Jens Osterkamp <Jens.Osterkamp@de.ibm.com>
|
||||||
|
John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
|
||||||
John Stultz <johnstul@us.ibm.com>
|
John Stultz <johnstul@us.ibm.com>
|
||||||
<josh@joshtriplett.org> <josh@freedesktop.org>
|
<josh@joshtriplett.org> <josh@freedesktop.org>
|
||||||
<josh@joshtriplett.org> <josh@kernel.org>
|
<josh@joshtriplett.org> <josh@kernel.org>
|
||||||
|
|
|
@ -32,6 +32,10 @@ Optional properties:
|
||||||
- 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"
|
||||||
|
- ports-implemented : Mask that indicates which ports that the HBA supports
|
||||||
|
are available for software to use. Useful if PORTS_IMPL
|
||||||
|
is not programmed by the BIOS, which is true with
|
||||||
|
some embedded SOC's.
|
||||||
|
|
||||||
Required properties when using sub-nodes:
|
Required properties when using sub-nodes:
|
||||||
- #address-cells : number of cells to encode an address
|
- #address-cells : number of cells to encode an address
|
||||||
|
|
|
@ -45,13 +45,13 @@ Required properties:
|
||||||
Optional properties:
|
Optional properties:
|
||||||
- dual_emac_res_vlan : Specifies VID to be used to segregate the ports
|
- dual_emac_res_vlan : Specifies VID to be used to segregate the ports
|
||||||
- mac-address : See ethernet.txt file in the same directory
|
- mac-address : See ethernet.txt file in the same directory
|
||||||
- phy_id : Specifies slave phy id
|
- phy_id : Specifies slave phy id (deprecated, use phy-handle)
|
||||||
- phy-handle : See ethernet.txt file in the same directory
|
- phy-handle : See ethernet.txt file in the same directory
|
||||||
|
|
||||||
Slave sub-nodes:
|
Slave sub-nodes:
|
||||||
- fixed-link : See fixed-link.txt file in the same directory
|
- fixed-link : See fixed-link.txt file in the same directory
|
||||||
Either the property phy_id, or the sub-node
|
|
||||||
fixed-link can be specified
|
Note: Exactly one of phy_id, phy-handle, or fixed-link must be specified.
|
||||||
|
|
||||||
Note: "ti,hwmods" field is used to fetch the base address and irq
|
Note: "ti,hwmods" field is used to fetch the base address and irq
|
||||||
resources from TI, omap hwmod data base during device registration.
|
resources from TI, omap hwmod data base during device registration.
|
||||||
|
|
|
@ -6,7 +6,7 @@ This is the driver for the Altera Triple-Speed Ethernet (TSE) controllers
|
||||||
using the SGDMA and MSGDMA soft DMA IP components. The driver uses the
|
using the SGDMA and MSGDMA soft DMA IP components. The driver uses the
|
||||||
platform bus to obtain component resources. The designs used to test this
|
platform bus to obtain component resources. The designs used to test this
|
||||||
driver were built for a Cyclone(R) V SOC FPGA board, a Cyclone(R) V FPGA board,
|
driver were built for a Cyclone(R) V SOC FPGA board, a Cyclone(R) V FPGA board,
|
||||||
and tested with ARM and NIOS processor hosts seperately. The anticipated use
|
and tested with ARM and NIOS processor hosts separately. The anticipated use
|
||||||
cases are simple communications between an embedded system and an external peer
|
cases are simple communications between an embedded system and an external peer
|
||||||
for status and simple configuration of the embedded system.
|
for status and simple configuration of the embedded system.
|
||||||
|
|
||||||
|
@ -65,14 +65,14 @@ Driver parameters can be also passed in command line by using:
|
||||||
4.1) Transmit process
|
4.1) Transmit process
|
||||||
When the driver's transmit routine is called by the kernel, it sets up a
|
When the driver's transmit routine is called by the kernel, it sets up a
|
||||||
transmit descriptor by calling the underlying DMA transmit routine (SGDMA or
|
transmit descriptor by calling the underlying DMA transmit routine (SGDMA or
|
||||||
MSGDMA), and initites a transmit operation. Once the transmit is complete, an
|
MSGDMA), and initiates a transmit operation. Once the transmit is complete, an
|
||||||
interrupt is driven by the transmit DMA logic. The driver handles the transmit
|
interrupt is driven by the transmit DMA logic. The driver handles the transmit
|
||||||
completion in the context of the interrupt handling chain by recycling
|
completion in the context of the interrupt handling chain by recycling
|
||||||
resource required to send and track the requested transmit operation.
|
resource required to send and track the requested transmit operation.
|
||||||
|
|
||||||
4.2) Receive process
|
4.2) Receive process
|
||||||
The driver will post receive buffers to the receive DMA logic during driver
|
The driver will post receive buffers to the receive DMA logic during driver
|
||||||
intialization. Receive buffers may or may not be queued depending upon the
|
initialization. Receive buffers may or may not be queued depending upon the
|
||||||
underlying DMA logic (MSGDMA is able queue receive buffers, SGDMA is not able
|
underlying DMA logic (MSGDMA is able queue receive buffers, SGDMA is not able
|
||||||
to queue receive buffers to the SGDMA receive logic). When a packet is
|
to queue receive buffers to the SGDMA receive logic). When a packet is
|
||||||
received, the DMA logic generates an interrupt. The driver handles a receive
|
received, the DMA logic generates an interrupt. The driver handles a receive
|
||||||
|
|
|
@ -8,7 +8,7 @@ Initial Release:
|
||||||
This is conceptually very similar to the macvlan driver with one major
|
This is conceptually very similar to the macvlan driver with one major
|
||||||
exception of using L3 for mux-ing /demux-ing among slaves. This property makes
|
exception of using L3 for mux-ing /demux-ing among slaves. This property makes
|
||||||
the master device share the L2 with it's slave devices. I have developed this
|
the master device share the L2 with it's slave devices. I have developed this
|
||||||
driver in conjuntion with network namespaces and not sure if there is use case
|
driver in conjunction with network namespaces and not sure if there is use case
|
||||||
outside of it.
|
outside of it.
|
||||||
|
|
||||||
|
|
||||||
|
@ -42,7 +42,7 @@ out. In this mode the slaves will RX/TX multicast and broadcast (if applicable)
|
||||||
as well.
|
as well.
|
||||||
|
|
||||||
4.2 L3 mode:
|
4.2 L3 mode:
|
||||||
In this mode TX processing upto L3 happens on the stack instance attached
|
In this mode TX processing up to L3 happens on the stack instance attached
|
||||||
to the slave device and packets are switched to the stack instance of the
|
to the slave device and packets are switched to the stack instance of the
|
||||||
master device for the L2 processing and routing from that instance will be
|
master device for the L2 processing and routing from that instance will be
|
||||||
used before packets are queued on the outbound device. In this mode the slaves
|
used before packets are queued on the outbound device. In this mode the slaves
|
||||||
|
@ -56,7 +56,7 @@ situations defines your use case then you can choose to use ipvlan -
|
||||||
(a) The Linux host that is connected to the external switch / router has
|
(a) The Linux host that is connected to the external switch / router has
|
||||||
policy configured that allows only one mac per port.
|
policy configured that allows only one mac per port.
|
||||||
(b) No of virtual devices created on a master exceed the mac capacity and
|
(b) No of virtual devices created on a master exceed the mac capacity and
|
||||||
puts the NIC in promiscous mode and degraded performance is a concern.
|
puts the NIC in promiscuous mode and degraded performance is a concern.
|
||||||
(c) If the slave device is to be put into the hostile / untrusted network
|
(c) If the slave device is to be put into the hostile / untrusted network
|
||||||
namespace where L2 on the slave could be changed / misused.
|
namespace where L2 on the slave could be changed / misused.
|
||||||
|
|
||||||
|
|
|
@ -67,12 +67,12 @@ The two basic thread commands are:
|
||||||
* add_device DEVICE@NAME -- adds a single device
|
* add_device DEVICE@NAME -- adds a single device
|
||||||
* rem_device_all -- remove all associated devices
|
* rem_device_all -- remove all associated devices
|
||||||
|
|
||||||
When adding a device to a thread, a corrosponding procfile is created
|
When adding a device to a thread, a corresponding procfile is created
|
||||||
which is used for configuring this device. Thus, device names need to
|
which is used for configuring this device. Thus, device names need to
|
||||||
be unique.
|
be unique.
|
||||||
|
|
||||||
To support adding the same device to multiple threads, which is useful
|
To support adding the same device to multiple threads, which is useful
|
||||||
with multi queue NICs, a the device naming scheme is extended with "@":
|
with multi queue NICs, the device naming scheme is extended with "@":
|
||||||
device@something
|
device@something
|
||||||
|
|
||||||
The part after "@" can be anything, but it is custom to use the thread
|
The part after "@" can be anything, but it is custom to use the thread
|
||||||
|
@ -221,7 +221,7 @@ Sample scripts
|
||||||
|
|
||||||
A collection of tutorial scripts and helpers for pktgen is in the
|
A collection of tutorial scripts and helpers for pktgen is in the
|
||||||
samples/pktgen directory. The helper parameters.sh file support easy
|
samples/pktgen directory. The helper parameters.sh file support easy
|
||||||
and consistant parameter parsing across the sample scripts.
|
and consistent parameter parsing across the sample scripts.
|
||||||
|
|
||||||
Usage example and help:
|
Usage example and help:
|
||||||
./pktgen_sample01_simple.sh -i eth4 -m 00:1B:21:3C:9D:F8 -d 192.168.8.2
|
./pktgen_sample01_simple.sh -i eth4 -m 00:1B:21:3C:9D:F8 -d 192.168.8.2
|
||||||
|
|
|
@ -41,7 +41,7 @@ using an rx_handler which gives the impression that packets flow through
|
||||||
the VRF device. Similarly on egress routing rules are used to send packets
|
the VRF device. Similarly on egress routing rules are used to send packets
|
||||||
to the VRF device driver before getting sent out the actual interface. This
|
to the VRF device driver before getting sent out the actual interface. This
|
||||||
allows tcpdump on a VRF device to capture all packets into and out of the
|
allows tcpdump on a VRF device to capture all packets into and out of the
|
||||||
VRF as a whole.[1] Similiarly, netfilter [2] and tc rules can be applied
|
VRF as a whole.[1] Similarly, netfilter [2] and tc rules can be applied
|
||||||
using the VRF device to specify rules that apply to the VRF domain as a whole.
|
using the VRF device to specify rules that apply to the VRF domain as a whole.
|
||||||
|
|
||||||
[1] Packets in the forwarded state do not flow through the device, so those
|
[1] Packets in the forwarded state do not flow through the device, so those
|
||||||
|
|
|
@ -4,7 +4,7 @@ Krisztian <hidden@balabit.hu> and others and additional patches
|
||||||
from Jamal <hadi@cyberus.ca>.
|
from Jamal <hadi@cyberus.ca>.
|
||||||
|
|
||||||
The end goal for syncing is to be able to insert attributes + generate
|
The end goal for syncing is to be able to insert attributes + generate
|
||||||
events so that the an SA can be safely moved from one machine to another
|
events so that the SA can be safely moved from one machine to another
|
||||||
for HA purposes.
|
for HA purposes.
|
||||||
The idea is to synchronize the SA so that the takeover machine can do
|
The idea is to synchronize the SA so that the takeover machine can do
|
||||||
the processing of the SA as accurate as possible if it has access to it.
|
the processing of the SA as accurate as possible if it has access to it.
|
||||||
|
@ -13,7 +13,7 @@ We already have the ability to generate SA add/del/upd events.
|
||||||
These patches add ability to sync and have accurate lifetime byte (to
|
These patches add ability to sync and have accurate lifetime byte (to
|
||||||
ensure proper decay of SAs) and replay counters to avoid replay attacks
|
ensure proper decay of SAs) and replay counters to avoid replay attacks
|
||||||
with as minimal loss at failover time.
|
with as minimal loss at failover time.
|
||||||
This way a backup stays as closely uptodate as an active member.
|
This way a backup stays as closely up-to-date as an active member.
|
||||||
|
|
||||||
Because the above items change for every packet the SA receives,
|
Because the above items change for every packet the SA receives,
|
||||||
it is possible for a lot of the events to be generated.
|
it is possible for a lot of the events to be generated.
|
||||||
|
@ -163,7 +163,7 @@ If you have an SA that is getting hit by traffic in bursts such that
|
||||||
there is a period where the timer threshold expires with no packets
|
there is a period where the timer threshold expires with no packets
|
||||||
seen, then an odd behavior is seen as follows:
|
seen, then an odd behavior is seen as follows:
|
||||||
The first packet arrival after a timer expiry will trigger a timeout
|
The first packet arrival after a timer expiry will trigger a timeout
|
||||||
aevent; i.e we dont wait for a timeout period or a packet threshold
|
event; i.e we don't wait for a timeout period or a packet threshold
|
||||||
to be reached. This is done for simplicity and efficiency reasons.
|
to be reached. This is done for simplicity and efficiency reasons.
|
||||||
|
|
||||||
-JHS
|
-JHS
|
||||||
|
|
61
MAINTAINERS
61
MAINTAINERS
|
@ -872,9 +872,9 @@ F: drivers/perf/arm_pmu.c
|
||||||
F: include/linux/perf/arm_pmu.h
|
F: include/linux/perf/arm_pmu.h
|
||||||
|
|
||||||
ARM PORT
|
ARM PORT
|
||||||
M: Russell King <linux@arm.linux.org.uk>
|
M: Russell King <linux@armlinux.org.uk>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
W: http://www.arm.linux.org.uk/
|
W: http://www.armlinux.org.uk/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/arm/
|
F: arch/arm/
|
||||||
|
|
||||||
|
@ -886,35 +886,35 @@ F: arch/arm/plat-*/
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/arm/arm-soc.git
|
||||||
|
|
||||||
ARM PRIMECELL AACI PL041 DRIVER
|
ARM PRIMECELL AACI PL041 DRIVER
|
||||||
M: Russell King <linux@arm.linux.org.uk>
|
M: Russell King <linux@armlinux.org.uk>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: sound/arm/aaci.*
|
F: sound/arm/aaci.*
|
||||||
|
|
||||||
ARM PRIMECELL CLCD PL110 DRIVER
|
ARM PRIMECELL CLCD PL110 DRIVER
|
||||||
M: Russell King <linux@arm.linux.org.uk>
|
M: Russell King <linux@armlinux.org.uk>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/video/fbdev/amba-clcd.*
|
F: drivers/video/fbdev/amba-clcd.*
|
||||||
|
|
||||||
ARM PRIMECELL KMI PL050 DRIVER
|
ARM PRIMECELL KMI PL050 DRIVER
|
||||||
M: Russell King <linux@arm.linux.org.uk>
|
M: Russell King <linux@armlinux.org.uk>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/input/serio/ambakmi.*
|
F: drivers/input/serio/ambakmi.*
|
||||||
F: include/linux/amba/kmi.h
|
F: include/linux/amba/kmi.h
|
||||||
|
|
||||||
ARM PRIMECELL MMCI PL180/1 DRIVER
|
ARM PRIMECELL MMCI PL180/1 DRIVER
|
||||||
M: Russell King <linux@arm.linux.org.uk>
|
M: Russell King <linux@armlinux.org.uk>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/mmc/host/mmci.*
|
F: drivers/mmc/host/mmci.*
|
||||||
F: include/linux/amba/mmci.h
|
F: include/linux/amba/mmci.h
|
||||||
|
|
||||||
ARM PRIMECELL UART PL010 AND PL011 DRIVERS
|
ARM PRIMECELL UART PL010 AND PL011 DRIVERS
|
||||||
M: Russell King <linux@arm.linux.org.uk>
|
M: Russell King <linux@armlinux.org.uk>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/tty/serial/amba-pl01*.c
|
F: drivers/tty/serial/amba-pl01*.c
|
||||||
F: include/linux/amba/serial.h
|
F: include/linux/amba/serial.h
|
||||||
|
|
||||||
ARM PRIMECELL BUS SUPPORT
|
ARM PRIMECELL BUS SUPPORT
|
||||||
M: Russell King <linux@arm.linux.org.uk>
|
M: Russell King <linux@armlinux.org.uk>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/amba/
|
F: drivers/amba/
|
||||||
F: include/linux/amba/bus.h
|
F: include/linux/amba/bus.h
|
||||||
|
@ -1036,7 +1036,7 @@ L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
ARM/CLKDEV SUPPORT
|
ARM/CLKDEV SUPPORT
|
||||||
M: Russell King <linux@arm.linux.org.uk>
|
M: Russell King <linux@armlinux.org.uk>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/arm/include/asm/clkdev.h
|
F: arch/arm/include/asm/clkdev.h
|
||||||
|
@ -1093,9 +1093,9 @@ F: arch/arm/boot/dts/cx92755*
|
||||||
N: digicolor
|
N: digicolor
|
||||||
|
|
||||||
ARM/EBSA110 MACHINE SUPPORT
|
ARM/EBSA110 MACHINE SUPPORT
|
||||||
M: Russell King <linux@arm.linux.org.uk>
|
M: Russell King <linux@armlinux.org.uk>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
W: http://www.arm.linux.org.uk/
|
W: http://www.armlinux.org.uk/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/arm/mach-ebsa110/
|
F: arch/arm/mach-ebsa110/
|
||||||
F: drivers/net/ethernet/amd/am79c961a.*
|
F: drivers/net/ethernet/amd/am79c961a.*
|
||||||
|
@ -1124,9 +1124,9 @@ T: git git://git.berlios.de/gemini-board
|
||||||
F: arch/arm/mm/*-fa*
|
F: arch/arm/mm/*-fa*
|
||||||
|
|
||||||
ARM/FOOTBRIDGE ARCHITECTURE
|
ARM/FOOTBRIDGE ARCHITECTURE
|
||||||
M: Russell King <linux@arm.linux.org.uk>
|
M: Russell King <linux@armlinux.org.uk>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
W: http://www.arm.linux.org.uk/
|
W: http://www.armlinux.org.uk/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/arm/include/asm/hardware/dec21285.h
|
F: arch/arm/include/asm/hardware/dec21285.h
|
||||||
F: arch/arm/mach-footbridge/
|
F: arch/arm/mach-footbridge/
|
||||||
|
@ -1457,7 +1457,7 @@ S: Maintained
|
||||||
ARM/PT DIGITAL BOARD PORT
|
ARM/PT DIGITAL BOARD PORT
|
||||||
M: Stefan Eletzhofer <stefan.eletzhofer@eletztrick.de>
|
M: Stefan Eletzhofer <stefan.eletzhofer@eletztrick.de>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
W: http://www.arm.linux.org.uk/
|
W: http://www.armlinux.org.uk/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
ARM/QUALCOMM SUPPORT
|
ARM/QUALCOMM SUPPORT
|
||||||
|
@ -1493,9 +1493,9 @@ S: Supported
|
||||||
F: arch/arm64/boot/dts/renesas/
|
F: arch/arm64/boot/dts/renesas/
|
||||||
|
|
||||||
ARM/RISCPC ARCHITECTURE
|
ARM/RISCPC ARCHITECTURE
|
||||||
M: Russell King <linux@arm.linux.org.uk>
|
M: Russell King <linux@armlinux.org.uk>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
W: http://www.arm.linux.org.uk/
|
W: http://www.armlinux.org.uk/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/arm/include/asm/hardware/entry-macro-iomd.S
|
F: arch/arm/include/asm/hardware/entry-macro-iomd.S
|
||||||
F: arch/arm/include/asm/hardware/ioc.h
|
F: arch/arm/include/asm/hardware/ioc.h
|
||||||
|
@ -1773,9 +1773,9 @@ F: drivers/clk/versatile/clk-vexpress-osc.c
|
||||||
F: drivers/clocksource/versatile.c
|
F: drivers/clocksource/versatile.c
|
||||||
|
|
||||||
ARM/VFP SUPPORT
|
ARM/VFP SUPPORT
|
||||||
M: Russell King <linux@arm.linux.org.uk>
|
M: Russell King <linux@armlinux.org.uk>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
W: http://www.arm.linux.org.uk/
|
W: http://www.armlinux.org.uk/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/arm/vfp/
|
F: arch/arm/vfp/
|
||||||
|
|
||||||
|
@ -2921,7 +2921,7 @@ F: mm/cleancache.c
|
||||||
F: include/linux/cleancache.h
|
F: include/linux/cleancache.h
|
||||||
|
|
||||||
CLK API
|
CLK API
|
||||||
M: Russell King <linux@arm.linux.org.uk>
|
M: Russell King <linux@armlinux.org.uk>
|
||||||
L: linux-clk@vger.kernel.org
|
L: linux-clk@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: include/linux/clk.h
|
F: include/linux/clk.h
|
||||||
|
@ -3354,9 +3354,9 @@ S: Supported
|
||||||
F: drivers/net/ethernet/stmicro/stmmac/
|
F: drivers/net/ethernet/stmicro/stmmac/
|
||||||
|
|
||||||
CYBERPRO FB DRIVER
|
CYBERPRO FB DRIVER
|
||||||
M: Russell King <linux@arm.linux.org.uk>
|
M: Russell King <linux@armlinux.org.uk>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
W: http://www.arm.linux.org.uk/
|
W: http://www.armlinux.org.uk/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/video/fbdev/cyber2000fb.*
|
F: drivers/video/fbdev/cyber2000fb.*
|
||||||
|
|
||||||
|
@ -3881,7 +3881,7 @@ F: Documentation/devicetree/bindings/display/st,stih4xx.txt
|
||||||
|
|
||||||
DRM DRIVERS FOR VIVANTE GPU IP
|
DRM DRIVERS FOR VIVANTE GPU IP
|
||||||
M: Lucas Stach <l.stach@pengutronix.de>
|
M: Lucas Stach <l.stach@pengutronix.de>
|
||||||
R: Russell King <linux+etnaviv@arm.linux.org.uk>
|
R: Russell King <linux+etnaviv@armlinux.org.uk>
|
||||||
R: Christian Gmeiner <christian.gmeiner@gmail.com>
|
R: Christian Gmeiner <christian.gmeiner@gmail.com>
|
||||||
L: dri-devel@lists.freedesktop.org
|
L: dri-devel@lists.freedesktop.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
@ -4223,8 +4223,8 @@ F: Documentation/efi-stub.txt
|
||||||
F: arch/ia64/kernel/efi.c
|
F: arch/ia64/kernel/efi.c
|
||||||
F: arch/x86/boot/compressed/eboot.[ch]
|
F: arch/x86/boot/compressed/eboot.[ch]
|
||||||
F: arch/x86/include/asm/efi.h
|
F: arch/x86/include/asm/efi.h
|
||||||
F: arch/x86/platform/efi/*
|
F: arch/x86/platform/efi/
|
||||||
F: drivers/firmware/efi/*
|
F: drivers/firmware/efi/
|
||||||
F: include/linux/efi*.h
|
F: include/linux/efi*.h
|
||||||
|
|
||||||
EFI VARIABLE FILESYSTEM
|
EFI VARIABLE FILESYSTEM
|
||||||
|
@ -4744,7 +4744,7 @@ F: drivers/platform/x86/fujitsu-tablet.c
|
||||||
|
|
||||||
FUSE: FILESYSTEM IN USERSPACE
|
FUSE: FILESYSTEM IN USERSPACE
|
||||||
M: Miklos Szeredi <miklos@szeredi.hu>
|
M: Miklos Szeredi <miklos@szeredi.hu>
|
||||||
L: fuse-devel@lists.sourceforge.net
|
L: linux-fsdevel@vger.kernel.org
|
||||||
W: http://fuse.sourceforge.net/
|
W: http://fuse.sourceforge.net/
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
@ -4903,7 +4903,7 @@ F: net/ipv4/gre_offload.c
|
||||||
F: include/net/gre.h
|
F: include/net/gre.h
|
||||||
|
|
||||||
GRETH 10/100/1G Ethernet MAC device driver
|
GRETH 10/100/1G Ethernet MAC device driver
|
||||||
M: Kristoffer Glembo <kristoffer@gaisler.com>
|
M: Andreas Larsson <andreas@gaisler.com>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/net/ethernet/aeroflex/
|
F: drivers/net/ethernet/aeroflex/
|
||||||
|
@ -6905,7 +6905,7 @@ L: linux-man@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
MARVELL ARMADA DRM SUPPORT
|
MARVELL ARMADA DRM SUPPORT
|
||||||
M: Russell King <rmk+kernel@arm.linux.org.uk>
|
M: Russell King <rmk+kernel@armlinux.org.uk>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/gpu/drm/armada/
|
F: drivers/gpu/drm/armada/
|
||||||
|
|
||||||
|
@ -7905,7 +7905,7 @@ S: Supported
|
||||||
F: drivers/nfc/nxp-nci
|
F: drivers/nfc/nxp-nci
|
||||||
|
|
||||||
NXP TDA998X DRM DRIVER
|
NXP TDA998X DRM DRIVER
|
||||||
M: Russell King <rmk+kernel@arm.linux.org.uk>
|
M: Russell King <rmk+kernel@armlinux.org.uk>
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/gpu/drm/i2c/tda998x_drv.c
|
F: drivers/gpu/drm/i2c/tda998x_drv.c
|
||||||
F: include/drm/i2c/tda998x.h
|
F: include/drm/i2c/tda998x.h
|
||||||
|
@ -7978,7 +7978,7 @@ F: arch/arm/*omap*/*pm*
|
||||||
F: drivers/cpufreq/omap-cpufreq.c
|
F: drivers/cpufreq/omap-cpufreq.c
|
||||||
|
|
||||||
OMAP POWERDOMAIN SOC ADAPTATION LAYER SUPPORT
|
OMAP POWERDOMAIN SOC ADAPTATION LAYER SUPPORT
|
||||||
M: Rajendra Nayak <rnayak@ti.com>
|
M: Rajendra Nayak <rnayak@codeaurora.org>
|
||||||
M: Paul Walmsley <paul@pwsan.com>
|
M: Paul Walmsley <paul@pwsan.com>
|
||||||
L: linux-omap@vger.kernel.org
|
L: linux-omap@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
@ -10014,7 +10014,8 @@ F: drivers/infiniband/hw/ocrdma/
|
||||||
|
|
||||||
SFC NETWORK DRIVER
|
SFC NETWORK DRIVER
|
||||||
M: Solarflare linux maintainers <linux-net-drivers@solarflare.com>
|
M: Solarflare linux maintainers <linux-net-drivers@solarflare.com>
|
||||||
M: Shradha Shah <sshah@solarflare.com>
|
M: Edward Cree <ecree@solarflare.com>
|
||||||
|
M: Bert Kenward <bkenward@solarflare.com>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/net/ethernet/sfc/
|
F: drivers/net/ethernet/sfc/
|
||||||
|
|
2
Makefile
2
Makefile
|
@ -1,7 +1,7 @@
|
||||||
VERSION = 4
|
VERSION = 4
|
||||||
PATCHLEVEL = 6
|
PATCHLEVEL = 6
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc6
|
EXTRAVERSION = -rc7
|
||||||
NAME = Charred Weasel
|
NAME = Charred Weasel
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
|
|
@ -58,6 +58,9 @@ config GENERIC_CSUM
|
||||||
config RWSEM_GENERIC_SPINLOCK
|
config RWSEM_GENERIC_SPINLOCK
|
||||||
def_bool y
|
def_bool y
|
||||||
|
|
||||||
|
config ARCH_DISCONTIGMEM_ENABLE
|
||||||
|
def_bool y
|
||||||
|
|
||||||
config ARCH_FLATMEM_ENABLE
|
config ARCH_FLATMEM_ENABLE
|
||||||
def_bool y
|
def_bool y
|
||||||
|
|
||||||
|
@ -347,6 +350,15 @@ config ARC_HUGEPAGE_16M
|
||||||
|
|
||||||
endchoice
|
endchoice
|
||||||
|
|
||||||
|
config NODES_SHIFT
|
||||||
|
int "Maximum NUMA Nodes (as a power of 2)"
|
||||||
|
default "1" if !DISCONTIGMEM
|
||||||
|
default "2" if DISCONTIGMEM
|
||||||
|
depends on NEED_MULTIPLE_NODES
|
||||||
|
---help---
|
||||||
|
Accessing memory beyond 1GB (with or w/o PAE) requires 2 memory
|
||||||
|
zones.
|
||||||
|
|
||||||
if ISA_ARCOMPACT
|
if ISA_ARCOMPACT
|
||||||
|
|
||||||
config ARC_COMPACT_IRQ_LEVELS
|
config ARC_COMPACT_IRQ_LEVELS
|
||||||
|
@ -455,6 +467,7 @@ config LINUX_LINK_BASE
|
||||||
|
|
||||||
config HIGHMEM
|
config HIGHMEM
|
||||||
bool "High Memory Support"
|
bool "High Memory Support"
|
||||||
|
select DISCONTIGMEM
|
||||||
help
|
help
|
||||||
With ARC 2G:2G address split, only upper 2G is directly addressable by
|
With ARC 2G:2G address split, only upper 2G is directly addressable by
|
||||||
kernel. Enable this to potentially allow access to rest of 2G and PAE
|
kernel. Enable this to potentially allow access to rest of 2G and PAE
|
||||||
|
|
|
@ -13,6 +13,15 @@
|
||||||
#include <asm/byteorder.h>
|
#include <asm/byteorder.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_ISA_ARCV2
|
||||||
|
#include <asm/barrier.h>
|
||||||
|
#define __iormb() rmb()
|
||||||
|
#define __iowmb() wmb()
|
||||||
|
#else
|
||||||
|
#define __iormb() do { } while (0)
|
||||||
|
#define __iowmb() do { } while (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
extern void __iomem *ioremap(phys_addr_t paddr, unsigned long size);
|
extern void __iomem *ioremap(phys_addr_t paddr, unsigned long size);
|
||||||
extern void __iomem *ioremap_prot(phys_addr_t paddr, unsigned long size,
|
extern void __iomem *ioremap_prot(phys_addr_t paddr, unsigned long size,
|
||||||
unsigned long flags);
|
unsigned long flags);
|
||||||
|
@ -31,6 +40,15 @@ extern void iounmap(const void __iomem *addr);
|
||||||
#define ioremap_wc(phy, sz) ioremap(phy, sz)
|
#define ioremap_wc(phy, sz) ioremap(phy, sz)
|
||||||
#define ioremap_wt(phy, sz) ioremap(phy, sz)
|
#define ioremap_wt(phy, sz) ioremap(phy, sz)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* io{read,write}{16,32}be() macros
|
||||||
|
*/
|
||||||
|
#define ioread16be(p) ({ u16 __v = be16_to_cpu((__force __be16)__raw_readw(p)); __iormb(); __v; })
|
||||||
|
#define ioread32be(p) ({ u32 __v = be32_to_cpu((__force __be32)__raw_readl(p)); __iormb(); __v; })
|
||||||
|
|
||||||
|
#define iowrite16be(v,p) ({ __iowmb(); __raw_writew((__force u16)cpu_to_be16(v), p); })
|
||||||
|
#define iowrite32be(v,p) ({ __iowmb(); __raw_writel((__force u32)cpu_to_be32(v), p); })
|
||||||
|
|
||||||
/* Change struct page to physical address */
|
/* Change struct page to physical address */
|
||||||
#define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT)
|
#define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT)
|
||||||
|
|
||||||
|
@ -108,15 +126,6 @@ static inline void __raw_writel(u32 w, volatile void __iomem *addr)
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_ISA_ARCV2
|
|
||||||
#include <asm/barrier.h>
|
|
||||||
#define __iormb() rmb()
|
|
||||||
#define __iowmb() wmb()
|
|
||||||
#else
|
|
||||||
#define __iormb() do { } while (0)
|
|
||||||
#define __iowmb() do { } while (0)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* MMIO can also get buffered/optimized in micro-arch, so barriers needed
|
* MMIO can also get buffered/optimized in micro-arch, so barriers needed
|
||||||
* Based on ARM model for the typical use case
|
* Based on ARM model for the typical use case
|
||||||
|
|
43
arch/arc/include/asm/mmzone.h
Normal file
43
arch/arc/include/asm/mmzone.h
Normal file
|
@ -0,0 +1,43 @@
|
||||||
|
/*
|
||||||
|
* Copyright (C) 2016 Synopsys, Inc. (www.synopsys.com)
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License version 2 as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _ASM_ARC_MMZONE_H
|
||||||
|
#define _ASM_ARC_MMZONE_H
|
||||||
|
|
||||||
|
#ifdef CONFIG_DISCONTIGMEM
|
||||||
|
|
||||||
|
extern struct pglist_data node_data[];
|
||||||
|
#define NODE_DATA(nid) (&node_data[nid])
|
||||||
|
|
||||||
|
static inline int pfn_to_nid(unsigned long pfn)
|
||||||
|
{
|
||||||
|
int is_end_low = 1;
|
||||||
|
|
||||||
|
if (IS_ENABLED(CONFIG_ARC_HAS_PAE40))
|
||||||
|
is_end_low = pfn <= virt_to_pfn(0xFFFFFFFFUL);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* node 0: lowmem: 0x8000_0000 to 0xFFFF_FFFF
|
||||||
|
* node 1: HIGHMEM w/o PAE40: 0x0 to 0x7FFF_FFFF
|
||||||
|
* HIGHMEM with PAE40: 0x1_0000_0000 to ...
|
||||||
|
*/
|
||||||
|
if (pfn >= ARCH_PFN_OFFSET && is_end_low)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline int pfn_valid(unsigned long pfn)
|
||||||
|
{
|
||||||
|
int nid = pfn_to_nid(pfn);
|
||||||
|
|
||||||
|
return (pfn <= node_end_pfn(nid));
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_DISCONTIGMEM */
|
||||||
|
|
||||||
|
#endif
|
|
@ -72,11 +72,20 @@ typedef unsigned long pgprot_t;
|
||||||
|
|
||||||
typedef pte_t * pgtable_t;
|
typedef pte_t * pgtable_t;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Use virt_to_pfn with caution:
|
||||||
|
* If used in pte or paddr related macros, it could cause truncation
|
||||||
|
* in PAE40 builds
|
||||||
|
* As a rule of thumb, only use it in helpers starting with virt_
|
||||||
|
* You have been warned !
|
||||||
|
*/
|
||||||
#define virt_to_pfn(kaddr) (__pa(kaddr) >> PAGE_SHIFT)
|
#define virt_to_pfn(kaddr) (__pa(kaddr) >> PAGE_SHIFT)
|
||||||
|
|
||||||
#define ARCH_PFN_OFFSET virt_to_pfn(CONFIG_LINUX_LINK_BASE)
|
#define ARCH_PFN_OFFSET virt_to_pfn(CONFIG_LINUX_LINK_BASE)
|
||||||
|
|
||||||
|
#ifdef CONFIG_FLATMEM
|
||||||
#define pfn_valid(pfn) (((pfn) - ARCH_PFN_OFFSET) < max_mapnr)
|
#define pfn_valid(pfn) (((pfn) - ARCH_PFN_OFFSET) < max_mapnr)
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* __pa, __va, virt_to_page (ALERT: deprecated, don't use them)
|
* __pa, __va, virt_to_page (ALERT: deprecated, don't use them)
|
||||||
|
@ -85,12 +94,10 @@ typedef pte_t * pgtable_t;
|
||||||
* virt here means link-address/program-address as embedded in object code.
|
* virt here means link-address/program-address as embedded in object code.
|
||||||
* And for ARC, link-addr = physical address
|
* And for ARC, link-addr = physical address
|
||||||
*/
|
*/
|
||||||
#define __pa(vaddr) ((unsigned long)vaddr)
|
#define __pa(vaddr) ((unsigned long)(vaddr))
|
||||||
#define __va(paddr) ((void *)((unsigned long)(paddr)))
|
#define __va(paddr) ((void *)((unsigned long)(paddr)))
|
||||||
|
|
||||||
#define virt_to_page(kaddr) \
|
#define virt_to_page(kaddr) pfn_to_page(virt_to_pfn(kaddr))
|
||||||
(mem_map + virt_to_pfn((kaddr) - CONFIG_LINUX_LINK_BASE))
|
|
||||||
|
|
||||||
#define virt_addr_valid(kaddr) pfn_valid(virt_to_pfn(kaddr))
|
#define virt_addr_valid(kaddr) pfn_valid(virt_to_pfn(kaddr))
|
||||||
|
|
||||||
/* Default Permissions for stack/heaps pages (Non Executable) */
|
/* Default Permissions for stack/heaps pages (Non Executable) */
|
||||||
|
|
|
@ -278,14 +278,13 @@ static inline void pmd_set(pmd_t *pmdp, pte_t *ptep)
|
||||||
#define pmd_present(x) (pmd_val(x))
|
#define pmd_present(x) (pmd_val(x))
|
||||||
#define pmd_clear(xp) do { pmd_val(*(xp)) = 0; } while (0)
|
#define pmd_clear(xp) do { pmd_val(*(xp)) = 0; } while (0)
|
||||||
|
|
||||||
#define pte_page(pte) \
|
#define pte_page(pte) pfn_to_page(pte_pfn(pte))
|
||||||
(mem_map + virt_to_pfn(pte_val(pte) - CONFIG_LINUX_LINK_BASE))
|
|
||||||
|
|
||||||
#define mk_pte(page, prot) pfn_pte(page_to_pfn(page), prot)
|
#define mk_pte(page, prot) pfn_pte(page_to_pfn(page), prot)
|
||||||
#define pte_pfn(pte) virt_to_pfn(pte_val(pte))
|
#define pfn_pte(pfn, prot) (__pte(((pte_t)(pfn) << PAGE_SHIFT) | pgprot_val(prot)))
|
||||||
#define pfn_pte(pfn, prot) (__pte(((pte_t)(pfn) << PAGE_SHIFT) | \
|
|
||||||
pgprot_val(prot)))
|
/* Don't use virt_to_pfn for macros below: could cause truncations for PAE40*/
|
||||||
#define __pte_index(addr) (virt_to_pfn(addr) & (PTRS_PER_PTE - 1))
|
#define pte_pfn(pte) (pte_val(pte) >> PAGE_SHIFT)
|
||||||
|
#define __pte_index(addr) (((addr) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* pte_offset gets a @ptr to PMD entry (PGD in our 2-tier paging system)
|
* pte_offset gets a @ptr to PMD entry (PGD in our 2-tier paging system)
|
||||||
|
|
|
@ -30,11 +30,16 @@ static const unsigned long low_mem_start = CONFIG_LINUX_LINK_BASE;
|
||||||
static unsigned long low_mem_sz;
|
static unsigned long low_mem_sz;
|
||||||
|
|
||||||
#ifdef CONFIG_HIGHMEM
|
#ifdef CONFIG_HIGHMEM
|
||||||
static unsigned long min_high_pfn;
|
static unsigned long min_high_pfn, max_high_pfn;
|
||||||
static u64 high_mem_start;
|
static u64 high_mem_start;
|
||||||
static u64 high_mem_sz;
|
static u64 high_mem_sz;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_DISCONTIGMEM
|
||||||
|
struct pglist_data node_data[MAX_NUMNODES] __read_mostly;
|
||||||
|
EXPORT_SYMBOL(node_data);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* User can over-ride above with "mem=nnn[KkMm]" in cmdline */
|
/* User can over-ride above with "mem=nnn[KkMm]" in cmdline */
|
||||||
static int __init setup_mem_sz(char *str)
|
static int __init setup_mem_sz(char *str)
|
||||||
{
|
{
|
||||||
|
@ -109,13 +114,11 @@ void __init setup_arch_memory(void)
|
||||||
/* Last usable page of low mem */
|
/* Last usable page of low mem */
|
||||||
max_low_pfn = max_pfn = PFN_DOWN(low_mem_start + low_mem_sz);
|
max_low_pfn = max_pfn = PFN_DOWN(low_mem_start + low_mem_sz);
|
||||||
|
|
||||||
#ifdef CONFIG_HIGHMEM
|
#ifdef CONFIG_FLATMEM
|
||||||
min_high_pfn = PFN_DOWN(high_mem_start);
|
/* pfn_valid() uses this */
|
||||||
max_pfn = PFN_DOWN(high_mem_start + high_mem_sz);
|
max_mapnr = max_low_pfn - min_low_pfn;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
max_mapnr = max_pfn - min_low_pfn;
|
|
||||||
|
|
||||||
/*------------- bootmem allocator setup -----------------------*/
|
/*------------- bootmem allocator setup -----------------------*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -129,7 +132,7 @@ void __init setup_arch_memory(void)
|
||||||
* the crash
|
* the crash
|
||||||
*/
|
*/
|
||||||
|
|
||||||
memblock_add(low_mem_start, low_mem_sz);
|
memblock_add_node(low_mem_start, low_mem_sz, 0);
|
||||||
memblock_reserve(low_mem_start, __pa(_end) - low_mem_start);
|
memblock_reserve(low_mem_start, __pa(_end) - low_mem_start);
|
||||||
|
|
||||||
#ifdef CONFIG_BLK_DEV_INITRD
|
#ifdef CONFIG_BLK_DEV_INITRD
|
||||||
|
@ -149,13 +152,6 @@ void __init setup_arch_memory(void)
|
||||||
zones_size[ZONE_NORMAL] = max_low_pfn - min_low_pfn;
|
zones_size[ZONE_NORMAL] = max_low_pfn - min_low_pfn;
|
||||||
zones_holes[ZONE_NORMAL] = 0;
|
zones_holes[ZONE_NORMAL] = 0;
|
||||||
|
|
||||||
#ifdef CONFIG_HIGHMEM
|
|
||||||
zones_size[ZONE_HIGHMEM] = max_pfn - max_low_pfn;
|
|
||||||
|
|
||||||
/* This handles the peripheral address space hole */
|
|
||||||
zones_holes[ZONE_HIGHMEM] = min_high_pfn - max_low_pfn;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We can't use the helper free_area_init(zones[]) because it uses
|
* We can't use the helper free_area_init(zones[]) because it uses
|
||||||
* PAGE_OFFSET to compute the @min_low_pfn which would be wrong
|
* PAGE_OFFSET to compute the @min_low_pfn which would be wrong
|
||||||
|
@ -168,6 +164,34 @@ void __init setup_arch_memory(void)
|
||||||
zones_holes); /* holes */
|
zones_holes); /* holes */
|
||||||
|
|
||||||
#ifdef CONFIG_HIGHMEM
|
#ifdef CONFIG_HIGHMEM
|
||||||
|
/*
|
||||||
|
* Populate a new node with highmem
|
||||||
|
*
|
||||||
|
* On ARC (w/o PAE) HIGHMEM addresses are actually smaller (0 based)
|
||||||
|
* than addresses in normal ala low memory (0x8000_0000 based).
|
||||||
|
* Even with PAE, the huge peripheral space hole would waste a lot of
|
||||||
|
* mem with single mem_map[]. This warrants a mem_map per region design.
|
||||||
|
* Thus HIGHMEM on ARC is imlemented with DISCONTIGMEM.
|
||||||
|
*
|
||||||
|
* DISCONTIGMEM in turns requires multiple nodes. node 0 above is
|
||||||
|
* populated with normal memory zone while node 1 only has highmem
|
||||||
|
*/
|
||||||
|
node_set_online(1);
|
||||||
|
|
||||||
|
min_high_pfn = PFN_DOWN(high_mem_start);
|
||||||
|
max_high_pfn = PFN_DOWN(high_mem_start + high_mem_sz);
|
||||||
|
|
||||||
|
zones_size[ZONE_NORMAL] = 0;
|
||||||
|
zones_holes[ZONE_NORMAL] = 0;
|
||||||
|
|
||||||
|
zones_size[ZONE_HIGHMEM] = max_high_pfn - min_high_pfn;
|
||||||
|
zones_holes[ZONE_HIGHMEM] = 0;
|
||||||
|
|
||||||
|
free_area_init_node(1, /* node-id */
|
||||||
|
zones_size, /* num pages per zone */
|
||||||
|
min_high_pfn, /* first pfn of node */
|
||||||
|
zones_holes); /* holes */
|
||||||
|
|
||||||
high_memory = (void *)(min_high_pfn << PAGE_SHIFT);
|
high_memory = (void *)(min_high_pfn << PAGE_SHIFT);
|
||||||
kmap_init();
|
kmap_init();
|
||||||
#endif
|
#endif
|
||||||
|
@ -185,7 +209,7 @@ void __init mem_init(void)
|
||||||
unsigned long tmp;
|
unsigned long tmp;
|
||||||
|
|
||||||
reset_all_zones_managed_pages();
|
reset_all_zones_managed_pages();
|
||||||
for (tmp = min_high_pfn; tmp < max_pfn; tmp++)
|
for (tmp = min_high_pfn; tmp < max_high_pfn; tmp++)
|
||||||
free_highmem_page(pfn_to_page(tmp));
|
free_highmem_page(pfn_to_page(tmp));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -329,6 +329,7 @@
|
||||||
regulator-name = "V28";
|
regulator-name = "V28";
|
||||||
regulator-min-microvolt = <2800000>;
|
regulator-min-microvolt = <2800000>;
|
||||||
regulator-max-microvolt = <2800000>;
|
regulator-max-microvolt = <2800000>;
|
||||||
|
regulator-initial-mode = <0x0e>; /* RES_STATE_ACTIVE */
|
||||||
regulator-always-on; /* due to battery cover sensor */
|
regulator-always-on; /* due to battery cover sensor */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -336,30 +337,35 @@
|
||||||
regulator-name = "VCSI";
|
regulator-name = "VCSI";
|
||||||
regulator-min-microvolt = <1800000>;
|
regulator-min-microvolt = <1800000>;
|
||||||
regulator-max-microvolt = <1800000>;
|
regulator-max-microvolt = <1800000>;
|
||||||
|
regulator-initial-mode = <0x0e>; /* RES_STATE_ACTIVE */
|
||||||
};
|
};
|
||||||
|
|
||||||
&vaux3 {
|
&vaux3 {
|
||||||
regulator-name = "VMMC2_30";
|
regulator-name = "VMMC2_30";
|
||||||
regulator-min-microvolt = <2800000>;
|
regulator-min-microvolt = <2800000>;
|
||||||
regulator-max-microvolt = <3000000>;
|
regulator-max-microvolt = <3000000>;
|
||||||
|
regulator-initial-mode = <0x0e>; /* RES_STATE_ACTIVE */
|
||||||
};
|
};
|
||||||
|
|
||||||
&vaux4 {
|
&vaux4 {
|
||||||
regulator-name = "VCAM_ANA_28";
|
regulator-name = "VCAM_ANA_28";
|
||||||
regulator-min-microvolt = <2800000>;
|
regulator-min-microvolt = <2800000>;
|
||||||
regulator-max-microvolt = <2800000>;
|
regulator-max-microvolt = <2800000>;
|
||||||
|
regulator-initial-mode = <0x0e>; /* RES_STATE_ACTIVE */
|
||||||
};
|
};
|
||||||
|
|
||||||
&vmmc1 {
|
&vmmc1 {
|
||||||
regulator-name = "VMMC1";
|
regulator-name = "VMMC1";
|
||||||
regulator-min-microvolt = <1850000>;
|
regulator-min-microvolt = <1850000>;
|
||||||
regulator-max-microvolt = <3150000>;
|
regulator-max-microvolt = <3150000>;
|
||||||
|
regulator-initial-mode = <0x0e>; /* RES_STATE_ACTIVE */
|
||||||
};
|
};
|
||||||
|
|
||||||
&vmmc2 {
|
&vmmc2 {
|
||||||
regulator-name = "V28_A";
|
regulator-name = "V28_A";
|
||||||
regulator-min-microvolt = <2800000>;
|
regulator-min-microvolt = <2800000>;
|
||||||
regulator-max-microvolt = <3000000>;
|
regulator-max-microvolt = <3000000>;
|
||||||
|
regulator-initial-mode = <0x0e>; /* RES_STATE_ACTIVE */
|
||||||
regulator-always-on; /* due VIO leak to AIC34 VDDs */
|
regulator-always-on; /* due VIO leak to AIC34 VDDs */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -367,6 +373,7 @@
|
||||||
regulator-name = "VPLL";
|
regulator-name = "VPLL";
|
||||||
regulator-min-microvolt = <1800000>;
|
regulator-min-microvolt = <1800000>;
|
||||||
regulator-max-microvolt = <1800000>;
|
regulator-max-microvolt = <1800000>;
|
||||||
|
regulator-initial-mode = <0x0e>; /* RES_STATE_ACTIVE */
|
||||||
regulator-always-on;
|
regulator-always-on;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -374,6 +381,7 @@
|
||||||
regulator-name = "VSDI_CSI";
|
regulator-name = "VSDI_CSI";
|
||||||
regulator-min-microvolt = <1800000>;
|
regulator-min-microvolt = <1800000>;
|
||||||
regulator-max-microvolt = <1800000>;
|
regulator-max-microvolt = <1800000>;
|
||||||
|
regulator-initial-mode = <0x0e>; /* RES_STATE_ACTIVE */
|
||||||
regulator-always-on;
|
regulator-always-on;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -381,6 +389,7 @@
|
||||||
regulator-name = "VMMC2_IO_18";
|
regulator-name = "VMMC2_IO_18";
|
||||||
regulator-min-microvolt = <1800000>;
|
regulator-min-microvolt = <1800000>;
|
||||||
regulator-max-microvolt = <1800000>;
|
regulator-max-microvolt = <1800000>;
|
||||||
|
regulator-initial-mode = <0x0e>; /* RES_STATE_ACTIVE */
|
||||||
};
|
};
|
||||||
|
|
||||||
&vio {
|
&vio {
|
||||||
|
|
|
@ -46,7 +46,7 @@
|
||||||
0x480bd800 0x017c>;
|
0x480bd800 0x017c>;
|
||||||
interrupts = <24>;
|
interrupts = <24>;
|
||||||
iommus = <&mmu_isp>;
|
iommus = <&mmu_isp>;
|
||||||
syscon = <&scm_conf 0xdc>;
|
syscon = <&scm_conf 0x6c>;
|
||||||
ti,phy-type = <OMAP3ISP_PHY_TYPE_COMPLEX_IO>;
|
ti,phy-type = <OMAP3ISP_PHY_TYPE_COMPLEX_IO>;
|
||||||
#clock-cells = <1>;
|
#clock-cells = <1>;
|
||||||
ports {
|
ports {
|
||||||
|
|
|
@ -472,7 +472,7 @@
|
||||||
ldo1_reg: ldo1 {
|
ldo1_reg: ldo1 {
|
||||||
/* VDDAPHY_CAM: vdda_csiport */
|
/* VDDAPHY_CAM: vdda_csiport */
|
||||||
regulator-name = "ldo1";
|
regulator-name = "ldo1";
|
||||||
regulator-min-microvolt = <1500000>;
|
regulator-min-microvolt = <1800000>;
|
||||||
regulator-max-microvolt = <1800000>;
|
regulator-max-microvolt = <1800000>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -498,7 +498,7 @@
|
||||||
ldo4_reg: ldo4 {
|
ldo4_reg: ldo4 {
|
||||||
/* VDDAPHY_DISP: vdda_dsiport/hdmi */
|
/* VDDAPHY_DISP: vdda_dsiport/hdmi */
|
||||||
regulator-name = "ldo4";
|
regulator-name = "ldo4";
|
||||||
regulator-min-microvolt = <1500000>;
|
regulator-min-microvolt = <1800000>;
|
||||||
regulator-max-microvolt = <1800000>;
|
regulator-max-microvolt = <1800000>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -513,7 +513,7 @@
|
||||||
ldo1_reg: ldo1 {
|
ldo1_reg: ldo1 {
|
||||||
/* VDDAPHY_CAM: vdda_csiport */
|
/* VDDAPHY_CAM: vdda_csiport */
|
||||||
regulator-name = "ldo1";
|
regulator-name = "ldo1";
|
||||||
regulator-min-microvolt = <1500000>;
|
regulator-min-microvolt = <1800000>;
|
||||||
regulator-max-microvolt = <1800000>;
|
regulator-max-microvolt = <1800000>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -537,7 +537,7 @@
|
||||||
ldo4_reg: ldo4 {
|
ldo4_reg: ldo4 {
|
||||||
/* VDDAPHY_DISP: vdda_dsiport/hdmi */
|
/* VDDAPHY_DISP: vdda_dsiport/hdmi */
|
||||||
regulator-name = "ldo4";
|
regulator-name = "ldo4";
|
||||||
regulator-min-microvolt = <1500000>;
|
regulator-min-microvolt = <1800000>;
|
||||||
regulator-max-microvolt = <1800000>;
|
regulator-max-microvolt = <1800000>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -269,7 +269,7 @@
|
||||||
omap5_pmx_wkup: pinmux@c840 {
|
omap5_pmx_wkup: pinmux@c840 {
|
||||||
compatible = "ti,omap5-padconf",
|
compatible = "ti,omap5-padconf",
|
||||||
"pinctrl-single";
|
"pinctrl-single";
|
||||||
reg = <0xc840 0x0038>;
|
reg = <0xc840 0x003c>;
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
|
|
|
@ -666,7 +666,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
sata0: sata@29000000 {
|
sata0: sata@29000000 {
|
||||||
compatible = "generic-ahci";
|
compatible = "qcom,apq8064-ahci", "generic-ahci";
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
reg = <0x29000000 0x180>;
|
reg = <0x29000000 0x180>;
|
||||||
interrupts = <GIC_SPI 209 IRQ_TYPE_NONE>;
|
interrupts = <GIC_SPI 209 IRQ_TYPE_NONE>;
|
||||||
|
@ -688,6 +688,7 @@
|
||||||
|
|
||||||
phys = <&sata_phy0>;
|
phys = <&sata_phy0>;
|
||||||
phy-names = "sata-phy";
|
phy-names = "sata-phy";
|
||||||
|
ports-implemented = <0x1>;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Temporary fixed regulator */
|
/* Temporary fixed regulator */
|
||||||
|
|
|
@ -125,8 +125,6 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
®_dc1sw {
|
®_dc1sw {
|
||||||
regulator-min-microvolt = <3000000>;
|
|
||||||
regulator-max-microvolt = <3000000>;
|
|
||||||
regulator-name = "vcc-lcd";
|
regulator-name = "vcc-lcd";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -84,6 +84,7 @@
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
|
#ifdef CONFIG_CPU_CP15_MMU
|
||||||
static inline unsigned int get_domain(void)
|
static inline unsigned int get_domain(void)
|
||||||
{
|
{
|
||||||
unsigned int domain;
|
unsigned int domain;
|
||||||
|
@ -103,6 +104,16 @@ static inline void set_domain(unsigned val)
|
||||||
: : "r" (val) : "memory");
|
: : "r" (val) : "memory");
|
||||||
isb();
|
isb();
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
static inline unsigned int get_domain(void)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void set_domain(unsigned val)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_CPU_USE_DOMAINS
|
#ifdef CONFIG_CPU_USE_DOMAINS
|
||||||
#define modify_domain(dom,type) \
|
#define modify_domain(dom,type) \
|
||||||
|
|
|
@ -236,7 +236,7 @@ ENTRY(__setup_mpu)
|
||||||
mov r0, #CONFIG_VECTORS_BASE @ Cover from VECTORS_BASE
|
mov r0, #CONFIG_VECTORS_BASE @ Cover from VECTORS_BASE
|
||||||
ldr r5,=(MPU_AP_PL1RW_PL0NA | MPU_RGN_NORMAL)
|
ldr r5,=(MPU_AP_PL1RW_PL0NA | MPU_RGN_NORMAL)
|
||||||
/* Writing N to bits 5:1 (RSR_SZ) --> region size 2^N+1 */
|
/* Writing N to bits 5:1 (RSR_SZ) --> region size 2^N+1 */
|
||||||
mov r6, #(((PAGE_SHIFT - 1) << MPU_RSR_SZ) | 1 << MPU_RSR_EN)
|
mov r6, #(((2 * PAGE_SHIFT - 1) << MPU_RSR_SZ) | 1 << MPU_RSR_EN)
|
||||||
|
|
||||||
setup_region r0, r5, r6, MPU_DATA_SIDE @ VECTORS_BASE, PL0 NA, enabled
|
setup_region r0, r5, r6, MPU_DATA_SIDE @ VECTORS_BASE, PL0 NA, enabled
|
||||||
beq 3f @ Memory-map not unified
|
beq 3f @ Memory-map not unified
|
||||||
|
|
|
@ -1004,7 +1004,7 @@ static bool transparent_hugepage_adjust(kvm_pfn_t *pfnp, phys_addr_t *ipap)
|
||||||
kvm_pfn_t pfn = *pfnp;
|
kvm_pfn_t pfn = *pfnp;
|
||||||
gfn_t gfn = *ipap >> PAGE_SHIFT;
|
gfn_t gfn = *ipap >> PAGE_SHIFT;
|
||||||
|
|
||||||
if (PageTransCompound(pfn_to_page(pfn))) {
|
if (PageTransCompoundMap(pfn_to_page(pfn))) {
|
||||||
unsigned long mask;
|
unsigned long mask;
|
||||||
/*
|
/*
|
||||||
* The address we faulted on is backed by a transparent huge
|
* The address we faulted on is backed by a transparent huge
|
||||||
|
|
|
@ -121,6 +121,11 @@ static void read_factory_config(struct nvmem_device *nvmem, void *context)
|
||||||
const char *partnum = NULL;
|
const char *partnum = NULL;
|
||||||
struct davinci_soc_info *soc_info = &davinci_soc_info;
|
struct davinci_soc_info *soc_info = &davinci_soc_info;
|
||||||
|
|
||||||
|
if (!IS_BUILTIN(CONFIG_NVMEM)) {
|
||||||
|
pr_warn("Factory Config not available without CONFIG_NVMEM\n");
|
||||||
|
goto bad_config;
|
||||||
|
}
|
||||||
|
|
||||||
ret = nvmem_device_read(nvmem, 0, sizeof(factory_config),
|
ret = nvmem_device_read(nvmem, 0, sizeof(factory_config),
|
||||||
&factory_config);
|
&factory_config);
|
||||||
if (ret != sizeof(struct factory_config)) {
|
if (ret != sizeof(struct factory_config)) {
|
||||||
|
|
|
@ -33,6 +33,11 @@ void davinci_get_mac_addr(struct nvmem_device *nvmem, void *context)
|
||||||
char *mac_addr = davinci_soc_info.emac_pdata->mac_addr;
|
char *mac_addr = davinci_soc_info.emac_pdata->mac_addr;
|
||||||
off_t offset = (off_t)context;
|
off_t offset = (off_t)context;
|
||||||
|
|
||||||
|
if (!IS_BUILTIN(CONFIG_NVMEM)) {
|
||||||
|
pr_warn("Cannot read MAC addr from EEPROM without CONFIG_NVMEM\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* Read MAC addr from EEPROM */
|
/* Read MAC addr from EEPROM */
|
||||||
if (nvmem_device_read(nvmem, offset, ETH_ALEN, mac_addr) == ETH_ALEN)
|
if (nvmem_device_read(nvmem, offset, ETH_ALEN, mac_addr) == ETH_ALEN)
|
||||||
pr_info("Read MAC addr from EEPROM: %pM\n", mac_addr);
|
pr_info("Read MAC addr from EEPROM: %pM\n", mac_addr);
|
||||||
|
|
|
@ -92,7 +92,7 @@ static int exynos_pd_power(struct generic_pm_domain *domain, bool power_on)
|
||||||
if (IS_ERR(pd->clk[i]))
|
if (IS_ERR(pd->clk[i]))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (IS_ERR(pd->clk[i]))
|
if (IS_ERR(pd->pclk[i]))
|
||||||
continue; /* Skip on first power up */
|
continue; /* Skip on first power up */
|
||||||
if (clk_set_parent(pd->clk[i], pd->pclk[i]))
|
if (clk_set_parent(pd->clk[i], pd->pclk[i]))
|
||||||
pr_err("%s: error setting parent to clock%d\n",
|
pr_err("%s: error setting parent to clock%d\n",
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
#include <asm/assembler.h>
|
#include <asm/assembler.h>
|
||||||
|
|
||||||
.arch armv7-a
|
.arch armv7-a
|
||||||
|
.arm
|
||||||
|
|
||||||
ENTRY(secondary_trampoline)
|
ENTRY(secondary_trampoline)
|
||||||
/* CPU1 will always fetch from 0x0 when it is brought out of reset.
|
/* CPU1 will always fetch from 0x0 when it is brought out of reset.
|
||||||
|
|
|
@ -87,7 +87,6 @@ static unsigned long irbar_read(void)
|
||||||
/* MPU initialisation functions */
|
/* MPU initialisation functions */
|
||||||
void __init sanity_check_meminfo_mpu(void)
|
void __init sanity_check_meminfo_mpu(void)
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
phys_addr_t phys_offset = PHYS_OFFSET;
|
phys_addr_t phys_offset = PHYS_OFFSET;
|
||||||
phys_addr_t aligned_region_size, specified_mem_size, rounded_mem_size;
|
phys_addr_t aligned_region_size, specified_mem_size, rounded_mem_size;
|
||||||
struct memblock_region *reg;
|
struct memblock_region *reg;
|
||||||
|
@ -110,11 +109,13 @@ void __init sanity_check_meminfo_mpu(void)
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* memblock auto merges contiguous blocks, remove
|
* memblock auto merges contiguous blocks, remove
|
||||||
* all blocks afterwards
|
* all blocks afterwards in one go (we can't remove
|
||||||
|
* blocks separately while iterating)
|
||||||
*/
|
*/
|
||||||
pr_notice("Ignoring RAM after %pa, memory at %pa ignored\n",
|
pr_notice("Ignoring RAM after %pa, memory at %pa ignored\n",
|
||||||
&mem_start, ®->base);
|
&mem_end, ®->base);
|
||||||
memblock_remove(reg->base, reg->size);
|
memblock_remove(reg->base, 0 - reg->base);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -144,7 +145,7 @@ void __init sanity_check_meminfo_mpu(void)
|
||||||
pr_warn("Truncating memory from %pa to %pa (MPU region constraints)",
|
pr_warn("Truncating memory from %pa to %pa (MPU region constraints)",
|
||||||
&specified_mem_size, &aligned_region_size);
|
&specified_mem_size, &aligned_region_size);
|
||||||
memblock_remove(mem_start + aligned_region_size,
|
memblock_remove(mem_start + aligned_region_size,
|
||||||
specified_mem_size - aligned_round_size);
|
specified_mem_size - aligned_region_size);
|
||||||
|
|
||||||
mem_end = mem_start + aligned_region_size;
|
mem_end = mem_start + aligned_region_size;
|
||||||
}
|
}
|
||||||
|
@ -261,7 +262,7 @@ void __init mpu_setup(void)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
region_err = mpu_setup_region(MPU_RAM_REGION, PHYS_OFFSET,
|
region_err = mpu_setup_region(MPU_RAM_REGION, PHYS_OFFSET,
|
||||||
ilog2(meminfo.bank[0].size),
|
ilog2(memblock.memory.regions[0].size),
|
||||||
MPU_AP_PL1RW_PL0RW | MPU_RGN_NORMAL);
|
MPU_AP_PL1RW_PL0RW | MPU_RGN_NORMAL);
|
||||||
if (region_err) {
|
if (region_err) {
|
||||||
panic("MPU region initialization failure! %d", region_err);
|
panic("MPU region initialization failure! %d", region_err);
|
||||||
|
@ -285,7 +286,7 @@ void __init arm_mm_memblock_reserve(void)
|
||||||
* some architectures which the DRAM is the exception vector to trap,
|
* some architectures which the DRAM is the exception vector to trap,
|
||||||
* alloc_page breaks with error, although it is not NULL, but "0."
|
* alloc_page breaks with error, although it is not NULL, but "0."
|
||||||
*/
|
*/
|
||||||
memblock_reserve(CONFIG_VECTORS_BASE, PAGE_SIZE);
|
memblock_reserve(CONFIG_VECTORS_BASE, 2 * PAGE_SIZE);
|
||||||
#else /* ifndef CONFIG_CPU_V7M */
|
#else /* ifndef CONFIG_CPU_V7M */
|
||||||
/*
|
/*
|
||||||
* There is no dedicated vector page on V7-M. So nothing needs to be
|
* There is no dedicated vector page on V7-M. So nothing needs to be
|
||||||
|
|
|
@ -120,7 +120,6 @@
|
||||||
compatible = "fixed-clock";
|
compatible = "fixed-clock";
|
||||||
#clock-cells = <0>;
|
#clock-cells = <0>;
|
||||||
clock-frequency = <0>;
|
clock-frequency = <0>;
|
||||||
status = "disabled";
|
|
||||||
};
|
};
|
||||||
|
|
||||||
soc {
|
soc {
|
||||||
|
|
|
@ -344,7 +344,7 @@ tracesys_next:
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
cmpib,COND(=),n -1,%r20,tracesys_exit /* seccomp may have returned -1 */
|
cmpib,COND(=),n -1,%r20,tracesys_exit /* seccomp may have returned -1 */
|
||||||
comiclr,>>= __NR_Linux_syscalls, %r20, %r0
|
comiclr,>> __NR_Linux_syscalls, %r20, %r0
|
||||||
b,n .Ltracesys_nosys
|
b,n .Ltracesys_nosys
|
||||||
|
|
||||||
LDREGX %r20(%r19), %r19
|
LDREGX %r20(%r19), %r19
|
||||||
|
|
|
@ -82,7 +82,7 @@ static inline unsigned long create_zero_mask(unsigned long bits)
|
||||||
"andc %1,%1,%2\n\t"
|
"andc %1,%1,%2\n\t"
|
||||||
"popcntd %0,%1"
|
"popcntd %0,%1"
|
||||||
: "=r" (leading_zero_bits), "=&r" (trailing_zero_bit_mask)
|
: "=r" (leading_zero_bits), "=&r" (trailing_zero_bit_mask)
|
||||||
: "r" (bits));
|
: "b" (bits));
|
||||||
|
|
||||||
return leading_zero_bits;
|
return leading_zero_bits;
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,6 @@ CONFIG_INET_AH=y
|
||||||
CONFIG_INET_ESP=y
|
CONFIG_INET_ESP=y
|
||||||
CONFIG_INET_IPCOMP=y
|
CONFIG_INET_IPCOMP=y
|
||||||
# CONFIG_INET_LRO is not set
|
# CONFIG_INET_LRO is not set
|
||||||
CONFIG_IPV6_PRIVACY=y
|
|
||||||
CONFIG_INET6_AH=m
|
CONFIG_INET6_AH=m
|
||||||
CONFIG_INET6_ESP=m
|
CONFIG_INET6_ESP=m
|
||||||
CONFIG_INET6_IPCOMP=m
|
CONFIG_INET6_IPCOMP=m
|
||||||
|
|
|
@ -48,7 +48,6 @@ CONFIG_SYN_COOKIES=y
|
||||||
CONFIG_INET_AH=y
|
CONFIG_INET_AH=y
|
||||||
CONFIG_INET_ESP=y
|
CONFIG_INET_ESP=y
|
||||||
CONFIG_INET_IPCOMP=y
|
CONFIG_INET_IPCOMP=y
|
||||||
CONFIG_IPV6_PRIVACY=y
|
|
||||||
CONFIG_IPV6_ROUTER_PREF=y
|
CONFIG_IPV6_ROUTER_PREF=y
|
||||||
CONFIG_IPV6_ROUTE_INFO=y
|
CONFIG_IPV6_ROUTE_INFO=y
|
||||||
CONFIG_IPV6_OPTIMISTIC_DAD=y
|
CONFIG_IPV6_OPTIMISTIC_DAD=y
|
||||||
|
|
|
@ -48,6 +48,7 @@
|
||||||
#define SUN4V_CHIP_SPARC_M6 0x06
|
#define SUN4V_CHIP_SPARC_M6 0x06
|
||||||
#define SUN4V_CHIP_SPARC_M7 0x07
|
#define SUN4V_CHIP_SPARC_M7 0x07
|
||||||
#define SUN4V_CHIP_SPARC64X 0x8a
|
#define SUN4V_CHIP_SPARC64X 0x8a
|
||||||
|
#define SUN4V_CHIP_SPARC_SN 0x8b
|
||||||
#define SUN4V_CHIP_UNKNOWN 0xff
|
#define SUN4V_CHIP_UNKNOWN 0xff
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
|
@ -423,8 +423,10 @@
|
||||||
#define __NR_setsockopt 355
|
#define __NR_setsockopt 355
|
||||||
#define __NR_mlock2 356
|
#define __NR_mlock2 356
|
||||||
#define __NR_copy_file_range 357
|
#define __NR_copy_file_range 357
|
||||||
|
#define __NR_preadv2 358
|
||||||
|
#define __NR_pwritev2 359
|
||||||
|
|
||||||
#define NR_syscalls 358
|
#define NR_syscalls 360
|
||||||
|
|
||||||
/* Bitmask values returned from kern_features system call. */
|
/* Bitmask values returned from kern_features system call. */
|
||||||
#define KERN_FEATURE_MIXED_MODE_STACK 0x00000001
|
#define KERN_FEATURE_MIXED_MODE_STACK 0x00000001
|
||||||
|
|
|
@ -214,8 +214,7 @@ do_dcpe_tl1_nonfatal: /* Ok we may use interrupt globals safely. */
|
||||||
subcc %g1, %g2, %g1 ! Next cacheline
|
subcc %g1, %g2, %g1 ! Next cacheline
|
||||||
bge,pt %icc, 1b
|
bge,pt %icc, 1b
|
||||||
nop
|
nop
|
||||||
ba,pt %xcc, dcpe_icpe_tl1_common
|
ba,a,pt %xcc, dcpe_icpe_tl1_common
|
||||||
nop
|
|
||||||
|
|
||||||
do_dcpe_tl1_fatal:
|
do_dcpe_tl1_fatal:
|
||||||
sethi %hi(1f), %g7
|
sethi %hi(1f), %g7
|
||||||
|
@ -224,8 +223,7 @@ do_dcpe_tl1_fatal:
|
||||||
mov 0x2, %o0
|
mov 0x2, %o0
|
||||||
call cheetah_plus_parity_error
|
call cheetah_plus_parity_error
|
||||||
add %sp, PTREGS_OFF, %o1
|
add %sp, PTREGS_OFF, %o1
|
||||||
ba,pt %xcc, rtrap
|
ba,a,pt %xcc, rtrap
|
||||||
nop
|
|
||||||
.size do_dcpe_tl1,.-do_dcpe_tl1
|
.size do_dcpe_tl1,.-do_dcpe_tl1
|
||||||
|
|
||||||
.globl do_icpe_tl1
|
.globl do_icpe_tl1
|
||||||
|
@ -259,8 +257,7 @@ do_icpe_tl1_nonfatal: /* Ok we may use interrupt globals safely. */
|
||||||
subcc %g1, %g2, %g1
|
subcc %g1, %g2, %g1
|
||||||
bge,pt %icc, 1b
|
bge,pt %icc, 1b
|
||||||
nop
|
nop
|
||||||
ba,pt %xcc, dcpe_icpe_tl1_common
|
ba,a,pt %xcc, dcpe_icpe_tl1_common
|
||||||
nop
|
|
||||||
|
|
||||||
do_icpe_tl1_fatal:
|
do_icpe_tl1_fatal:
|
||||||
sethi %hi(1f), %g7
|
sethi %hi(1f), %g7
|
||||||
|
@ -269,8 +266,7 @@ do_icpe_tl1_fatal:
|
||||||
mov 0x3, %o0
|
mov 0x3, %o0
|
||||||
call cheetah_plus_parity_error
|
call cheetah_plus_parity_error
|
||||||
add %sp, PTREGS_OFF, %o1
|
add %sp, PTREGS_OFF, %o1
|
||||||
ba,pt %xcc, rtrap
|
ba,a,pt %xcc, rtrap
|
||||||
nop
|
|
||||||
.size do_icpe_tl1,.-do_icpe_tl1
|
.size do_icpe_tl1,.-do_icpe_tl1
|
||||||
|
|
||||||
.type dcpe_icpe_tl1_common,#function
|
.type dcpe_icpe_tl1_common,#function
|
||||||
|
@ -456,7 +452,7 @@ __cheetah_log_error:
|
||||||
cmp %g2, 0x63
|
cmp %g2, 0x63
|
||||||
be c_cee
|
be c_cee
|
||||||
nop
|
nop
|
||||||
ba,pt %xcc, c_deferred
|
ba,a,pt %xcc, c_deferred
|
||||||
.size __cheetah_log_error,.-__cheetah_log_error
|
.size __cheetah_log_error,.-__cheetah_log_error
|
||||||
|
|
||||||
/* Cheetah FECC trap handling, we get here from tl{0,1}_fecc
|
/* Cheetah FECC trap handling, we get here from tl{0,1}_fecc
|
||||||
|
|
|
@ -506,6 +506,12 @@ static void __init sun4v_cpu_probe(void)
|
||||||
sparc_pmu_type = "sparc-m7";
|
sparc_pmu_type = "sparc-m7";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case SUN4V_CHIP_SPARC_SN:
|
||||||
|
sparc_cpu_type = "SPARC-SN";
|
||||||
|
sparc_fpu_type = "SPARC-SN integrated FPU";
|
||||||
|
sparc_pmu_type = "sparc-sn";
|
||||||
|
break;
|
||||||
|
|
||||||
case SUN4V_CHIP_SPARC64X:
|
case SUN4V_CHIP_SPARC64X:
|
||||||
sparc_cpu_type = "SPARC64-X";
|
sparc_cpu_type = "SPARC64-X";
|
||||||
sparc_fpu_type = "SPARC64-X integrated FPU";
|
sparc_fpu_type = "SPARC64-X integrated FPU";
|
||||||
|
|
|
@ -328,6 +328,7 @@ static int iterate_cpu(struct cpuinfo_tree *t, unsigned int root_index)
|
||||||
case SUN4V_CHIP_NIAGARA5:
|
case SUN4V_CHIP_NIAGARA5:
|
||||||
case SUN4V_CHIP_SPARC_M6:
|
case SUN4V_CHIP_SPARC_M6:
|
||||||
case SUN4V_CHIP_SPARC_M7:
|
case SUN4V_CHIP_SPARC_M7:
|
||||||
|
case SUN4V_CHIP_SPARC_SN:
|
||||||
case SUN4V_CHIP_SPARC64X:
|
case SUN4V_CHIP_SPARC64X:
|
||||||
rover_inc_table = niagara_iterate_method;
|
rover_inc_table = niagara_iterate_method;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -100,8 +100,8 @@ do_fpdis:
|
||||||
fmuld %f0, %f2, %f26
|
fmuld %f0, %f2, %f26
|
||||||
faddd %f0, %f2, %f28
|
faddd %f0, %f2, %f28
|
||||||
fmuld %f0, %f2, %f30
|
fmuld %f0, %f2, %f30
|
||||||
b,pt %xcc, fpdis_exit
|
ba,a,pt %xcc, fpdis_exit
|
||||||
nop
|
|
||||||
2: andcc %g5, FPRS_DU, %g0
|
2: andcc %g5, FPRS_DU, %g0
|
||||||
bne,pt %icc, 3f
|
bne,pt %icc, 3f
|
||||||
fzero %f32
|
fzero %f32
|
||||||
|
@ -144,8 +144,8 @@ do_fpdis:
|
||||||
fmuld %f32, %f34, %f58
|
fmuld %f32, %f34, %f58
|
||||||
faddd %f32, %f34, %f60
|
faddd %f32, %f34, %f60
|
||||||
fmuld %f32, %f34, %f62
|
fmuld %f32, %f34, %f62
|
||||||
ba,pt %xcc, fpdis_exit
|
ba,a,pt %xcc, fpdis_exit
|
||||||
nop
|
|
||||||
3: mov SECONDARY_CONTEXT, %g3
|
3: mov SECONDARY_CONTEXT, %g3
|
||||||
add %g6, TI_FPREGS, %g1
|
add %g6, TI_FPREGS, %g1
|
||||||
|
|
||||||
|
@ -197,8 +197,7 @@ fpdis_exit2:
|
||||||
fp_other_bounce:
|
fp_other_bounce:
|
||||||
call do_fpother
|
call do_fpother
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
ba,pt %xcc, rtrap
|
ba,a,pt %xcc, rtrap
|
||||||
nop
|
|
||||||
.size fp_other_bounce,.-fp_other_bounce
|
.size fp_other_bounce,.-fp_other_bounce
|
||||||
|
|
||||||
.align 32
|
.align 32
|
||||||
|
|
|
@ -414,6 +414,8 @@ sun4v_chip_type:
|
||||||
cmp %g2, 'T'
|
cmp %g2, 'T'
|
||||||
be,pt %xcc, 70f
|
be,pt %xcc, 70f
|
||||||
cmp %g2, 'M'
|
cmp %g2, 'M'
|
||||||
|
be,pt %xcc, 70f
|
||||||
|
cmp %g2, 'S'
|
||||||
bne,pn %xcc, 49f
|
bne,pn %xcc, 49f
|
||||||
nop
|
nop
|
||||||
|
|
||||||
|
@ -433,6 +435,9 @@ sun4v_chip_type:
|
||||||
cmp %g2, '7'
|
cmp %g2, '7'
|
||||||
be,pt %xcc, 5f
|
be,pt %xcc, 5f
|
||||||
mov SUN4V_CHIP_SPARC_M7, %g4
|
mov SUN4V_CHIP_SPARC_M7, %g4
|
||||||
|
cmp %g2, 'N'
|
||||||
|
be,pt %xcc, 5f
|
||||||
|
mov SUN4V_CHIP_SPARC_SN, %g4
|
||||||
ba,pt %xcc, 49f
|
ba,pt %xcc, 49f
|
||||||
nop
|
nop
|
||||||
|
|
||||||
|
@ -461,9 +466,8 @@ sun4v_chip_type:
|
||||||
subcc %g3, 1, %g3
|
subcc %g3, 1, %g3
|
||||||
bne,pt %xcc, 41b
|
bne,pt %xcc, 41b
|
||||||
add %g1, 1, %g1
|
add %g1, 1, %g1
|
||||||
mov SUN4V_CHIP_SPARC64X, %g4
|
|
||||||
ba,pt %xcc, 5f
|
ba,pt %xcc, 5f
|
||||||
nop
|
mov SUN4V_CHIP_SPARC64X, %g4
|
||||||
|
|
||||||
49:
|
49:
|
||||||
mov SUN4V_CHIP_UNKNOWN, %g4
|
mov SUN4V_CHIP_UNKNOWN, %g4
|
||||||
|
@ -548,8 +552,7 @@ sun4u_init:
|
||||||
stxa %g0, [%g7] ASI_DMMU
|
stxa %g0, [%g7] ASI_DMMU
|
||||||
membar #Sync
|
membar #Sync
|
||||||
|
|
||||||
ba,pt %xcc, sun4u_continue
|
ba,a,pt %xcc, sun4u_continue
|
||||||
nop
|
|
||||||
|
|
||||||
sun4v_init:
|
sun4v_init:
|
||||||
/* Set ctx 0 */
|
/* Set ctx 0 */
|
||||||
|
@ -560,14 +563,12 @@ sun4v_init:
|
||||||
mov SECONDARY_CONTEXT, %g7
|
mov SECONDARY_CONTEXT, %g7
|
||||||
stxa %g0, [%g7] ASI_MMU
|
stxa %g0, [%g7] ASI_MMU
|
||||||
membar #Sync
|
membar #Sync
|
||||||
ba,pt %xcc, niagara_tlb_fixup
|
ba,a,pt %xcc, niagara_tlb_fixup
|
||||||
nop
|
|
||||||
|
|
||||||
sun4u_continue:
|
sun4u_continue:
|
||||||
BRANCH_IF_ANY_CHEETAH(g1, g7, cheetah_tlb_fixup)
|
BRANCH_IF_ANY_CHEETAH(g1, g7, cheetah_tlb_fixup)
|
||||||
|
|
||||||
ba,pt %xcc, spitfire_tlb_fixup
|
ba,a,pt %xcc, spitfire_tlb_fixup
|
||||||
nop
|
|
||||||
|
|
||||||
niagara_tlb_fixup:
|
niagara_tlb_fixup:
|
||||||
mov 3, %g2 /* Set TLB type to hypervisor. */
|
mov 3, %g2 /* Set TLB type to hypervisor. */
|
||||||
|
@ -595,6 +596,9 @@ niagara_tlb_fixup:
|
||||||
be,pt %xcc, niagara4_patch
|
be,pt %xcc, niagara4_patch
|
||||||
nop
|
nop
|
||||||
cmp %g1, SUN4V_CHIP_SPARC_M7
|
cmp %g1, SUN4V_CHIP_SPARC_M7
|
||||||
|
be,pt %xcc, niagara4_patch
|
||||||
|
nop
|
||||||
|
cmp %g1, SUN4V_CHIP_SPARC_SN
|
||||||
be,pt %xcc, niagara4_patch
|
be,pt %xcc, niagara4_patch
|
||||||
nop
|
nop
|
||||||
|
|
||||||
|
@ -639,8 +643,7 @@ niagara_patch:
|
||||||
call hypervisor_patch_cachetlbops
|
call hypervisor_patch_cachetlbops
|
||||||
nop
|
nop
|
||||||
|
|
||||||
ba,pt %xcc, tlb_fixup_done
|
ba,a,pt %xcc, tlb_fixup_done
|
||||||
nop
|
|
||||||
|
|
||||||
cheetah_tlb_fixup:
|
cheetah_tlb_fixup:
|
||||||
mov 2, %g2 /* Set TLB type to cheetah+. */
|
mov 2, %g2 /* Set TLB type to cheetah+. */
|
||||||
|
@ -659,8 +662,7 @@ cheetah_tlb_fixup:
|
||||||
call cheetah_patch_cachetlbops
|
call cheetah_patch_cachetlbops
|
||||||
nop
|
nop
|
||||||
|
|
||||||
ba,pt %xcc, tlb_fixup_done
|
ba,a,pt %xcc, tlb_fixup_done
|
||||||
nop
|
|
||||||
|
|
||||||
spitfire_tlb_fixup:
|
spitfire_tlb_fixup:
|
||||||
/* Set TLB type to spitfire. */
|
/* Set TLB type to spitfire. */
|
||||||
|
@ -774,8 +776,7 @@ setup_trap_table:
|
||||||
call %o1
|
call %o1
|
||||||
add %sp, (2047 + 128), %o0
|
add %sp, (2047 + 128), %o0
|
||||||
|
|
||||||
ba,pt %xcc, 2f
|
ba,a,pt %xcc, 2f
|
||||||
nop
|
|
||||||
|
|
||||||
1: sethi %hi(sparc64_ttable_tl0), %o0
|
1: sethi %hi(sparc64_ttable_tl0), %o0
|
||||||
set prom_set_trap_table_name, %g2
|
set prom_set_trap_table_name, %g2
|
||||||
|
@ -814,8 +815,7 @@ setup_trap_table:
|
||||||
|
|
||||||
BRANCH_IF_ANY_CHEETAH(o2, o3, 1f)
|
BRANCH_IF_ANY_CHEETAH(o2, o3, 1f)
|
||||||
|
|
||||||
ba,pt %xcc, 2f
|
ba,a,pt %xcc, 2f
|
||||||
nop
|
|
||||||
|
|
||||||
/* Disable STICK_INT interrupts. */
|
/* Disable STICK_INT interrupts. */
|
||||||
1:
|
1:
|
||||||
|
|
|
@ -18,8 +18,7 @@ __do_privact:
|
||||||
109: or %g7, %lo(109b), %g7
|
109: or %g7, %lo(109b), %g7
|
||||||
call do_privact
|
call do_privact
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
ba,pt %xcc, rtrap
|
ba,a,pt %xcc, rtrap
|
||||||
nop
|
|
||||||
.size __do_privact,.-__do_privact
|
.size __do_privact,.-__do_privact
|
||||||
|
|
||||||
.type do_mna,#function
|
.type do_mna,#function
|
||||||
|
@ -46,8 +45,7 @@ do_mna:
|
||||||
mov %l5, %o2
|
mov %l5, %o2
|
||||||
call mem_address_unaligned
|
call mem_address_unaligned
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
ba,pt %xcc, rtrap
|
ba,a,pt %xcc, rtrap
|
||||||
nop
|
|
||||||
.size do_mna,.-do_mna
|
.size do_mna,.-do_mna
|
||||||
|
|
||||||
.type do_lddfmna,#function
|
.type do_lddfmna,#function
|
||||||
|
@ -65,8 +63,7 @@ do_lddfmna:
|
||||||
mov %l5, %o2
|
mov %l5, %o2
|
||||||
call handle_lddfmna
|
call handle_lddfmna
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
ba,pt %xcc, rtrap
|
ba,a,pt %xcc, rtrap
|
||||||
nop
|
|
||||||
.size do_lddfmna,.-do_lddfmna
|
.size do_lddfmna,.-do_lddfmna
|
||||||
|
|
||||||
.type do_stdfmna,#function
|
.type do_stdfmna,#function
|
||||||
|
@ -84,8 +81,7 @@ do_stdfmna:
|
||||||
mov %l5, %o2
|
mov %l5, %o2
|
||||||
call handle_stdfmna
|
call handle_stdfmna
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
ba,pt %xcc, rtrap
|
ba,a,pt %xcc, rtrap
|
||||||
nop
|
|
||||||
.size do_stdfmna,.-do_stdfmna
|
.size do_stdfmna,.-do_stdfmna
|
||||||
|
|
||||||
.type breakpoint_trap,#function
|
.type breakpoint_trap,#function
|
||||||
|
|
|
@ -245,6 +245,18 @@ static void pci_parse_of_addrs(struct platform_device *op,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void pci_init_dev_archdata(struct dev_archdata *sd, void *iommu,
|
||||||
|
void *stc, void *host_controller,
|
||||||
|
struct platform_device *op,
|
||||||
|
int numa_node)
|
||||||
|
{
|
||||||
|
sd->iommu = iommu;
|
||||||
|
sd->stc = stc;
|
||||||
|
sd->host_controller = host_controller;
|
||||||
|
sd->op = op;
|
||||||
|
sd->numa_node = numa_node;
|
||||||
|
}
|
||||||
|
|
||||||
static struct pci_dev *of_create_pci_dev(struct pci_pbm_info *pbm,
|
static struct pci_dev *of_create_pci_dev(struct pci_pbm_info *pbm,
|
||||||
struct device_node *node,
|
struct device_node *node,
|
||||||
struct pci_bus *bus, int devfn)
|
struct pci_bus *bus, int devfn)
|
||||||
|
@ -259,13 +271,10 @@ static struct pci_dev *of_create_pci_dev(struct pci_pbm_info *pbm,
|
||||||
if (!dev)
|
if (!dev)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
op = of_find_device_by_node(node);
|
||||||
sd = &dev->dev.archdata;
|
sd = &dev->dev.archdata;
|
||||||
sd->iommu = pbm->iommu;
|
pci_init_dev_archdata(sd, pbm->iommu, &pbm->stc, pbm, op,
|
||||||
sd->stc = &pbm->stc;
|
pbm->numa_node);
|
||||||
sd->host_controller = pbm;
|
|
||||||
sd->op = op = of_find_device_by_node(node);
|
|
||||||
sd->numa_node = pbm->numa_node;
|
|
||||||
|
|
||||||
sd = &op->dev.archdata;
|
sd = &op->dev.archdata;
|
||||||
sd->iommu = pbm->iommu;
|
sd->iommu = pbm->iommu;
|
||||||
sd->stc = &pbm->stc;
|
sd->stc = &pbm->stc;
|
||||||
|
@ -994,6 +1003,27 @@ void pcibios_set_master(struct pci_dev *dev)
|
||||||
/* No special bus mastering setup handling */
|
/* No special bus mastering setup handling */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_PCI_IOV
|
||||||
|
int pcibios_add_device(struct pci_dev *dev)
|
||||||
|
{
|
||||||
|
struct pci_dev *pdev;
|
||||||
|
|
||||||
|
/* Add sriov arch specific initialization here.
|
||||||
|
* Copy dev_archdata from PF to VF
|
||||||
|
*/
|
||||||
|
if (dev->is_virtfn) {
|
||||||
|
struct dev_archdata *psd;
|
||||||
|
|
||||||
|
pdev = dev->physfn;
|
||||||
|
psd = &pdev->dev.archdata;
|
||||||
|
pci_init_dev_archdata(&dev->dev.archdata, psd->iommu,
|
||||||
|
psd->stc, psd->host_controller, NULL,
|
||||||
|
psd->numa_node);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif /* CONFIG_PCI_IOV */
|
||||||
|
|
||||||
static int __init pcibios_init(void)
|
static int __init pcibios_init(void)
|
||||||
{
|
{
|
||||||
pci_dfl_cache_line_size = 64 >> 2;
|
pci_dfl_cache_line_size = 64 >> 2;
|
||||||
|
|
|
@ -285,7 +285,8 @@ static void __init sun4v_patch(void)
|
||||||
|
|
||||||
sun4v_patch_2insn_range(&__sun4v_2insn_patch,
|
sun4v_patch_2insn_range(&__sun4v_2insn_patch,
|
||||||
&__sun4v_2insn_patch_end);
|
&__sun4v_2insn_patch_end);
|
||||||
if (sun4v_chip_type == SUN4V_CHIP_SPARC_M7)
|
if (sun4v_chip_type == SUN4V_CHIP_SPARC_M7 ||
|
||||||
|
sun4v_chip_type == SUN4V_CHIP_SPARC_SN)
|
||||||
sun_m7_patch_2insn_range(&__sun_m7_2insn_patch,
|
sun_m7_patch_2insn_range(&__sun_m7_2insn_patch,
|
||||||
&__sun_m7_2insn_patch_end);
|
&__sun_m7_2insn_patch_end);
|
||||||
|
|
||||||
|
@ -524,6 +525,7 @@ static void __init init_sparc64_elf_hwcap(void)
|
||||||
sun4v_chip_type == SUN4V_CHIP_NIAGARA5 ||
|
sun4v_chip_type == SUN4V_CHIP_NIAGARA5 ||
|
||||||
sun4v_chip_type == SUN4V_CHIP_SPARC_M6 ||
|
sun4v_chip_type == SUN4V_CHIP_SPARC_M6 ||
|
||||||
sun4v_chip_type == SUN4V_CHIP_SPARC_M7 ||
|
sun4v_chip_type == SUN4V_CHIP_SPARC_M7 ||
|
||||||
|
sun4v_chip_type == SUN4V_CHIP_SPARC_SN ||
|
||||||
sun4v_chip_type == SUN4V_CHIP_SPARC64X)
|
sun4v_chip_type == SUN4V_CHIP_SPARC64X)
|
||||||
cap |= HWCAP_SPARC_BLKINIT;
|
cap |= HWCAP_SPARC_BLKINIT;
|
||||||
if (sun4v_chip_type == SUN4V_CHIP_NIAGARA2 ||
|
if (sun4v_chip_type == SUN4V_CHIP_NIAGARA2 ||
|
||||||
|
@ -532,6 +534,7 @@ static void __init init_sparc64_elf_hwcap(void)
|
||||||
sun4v_chip_type == SUN4V_CHIP_NIAGARA5 ||
|
sun4v_chip_type == SUN4V_CHIP_NIAGARA5 ||
|
||||||
sun4v_chip_type == SUN4V_CHIP_SPARC_M6 ||
|
sun4v_chip_type == SUN4V_CHIP_SPARC_M6 ||
|
||||||
sun4v_chip_type == SUN4V_CHIP_SPARC_M7 ||
|
sun4v_chip_type == SUN4V_CHIP_SPARC_M7 ||
|
||||||
|
sun4v_chip_type == SUN4V_CHIP_SPARC_SN ||
|
||||||
sun4v_chip_type == SUN4V_CHIP_SPARC64X)
|
sun4v_chip_type == SUN4V_CHIP_SPARC64X)
|
||||||
cap |= HWCAP_SPARC_N2;
|
cap |= HWCAP_SPARC_N2;
|
||||||
}
|
}
|
||||||
|
@ -561,6 +564,7 @@ static void __init init_sparc64_elf_hwcap(void)
|
||||||
sun4v_chip_type == SUN4V_CHIP_NIAGARA5 ||
|
sun4v_chip_type == SUN4V_CHIP_NIAGARA5 ||
|
||||||
sun4v_chip_type == SUN4V_CHIP_SPARC_M6 ||
|
sun4v_chip_type == SUN4V_CHIP_SPARC_M6 ||
|
||||||
sun4v_chip_type == SUN4V_CHIP_SPARC_M7 ||
|
sun4v_chip_type == SUN4V_CHIP_SPARC_M7 ||
|
||||||
|
sun4v_chip_type == SUN4V_CHIP_SPARC_SN ||
|
||||||
sun4v_chip_type == SUN4V_CHIP_SPARC64X)
|
sun4v_chip_type == SUN4V_CHIP_SPARC64X)
|
||||||
cap |= (AV_SPARC_VIS | AV_SPARC_VIS2 |
|
cap |= (AV_SPARC_VIS | AV_SPARC_VIS2 |
|
||||||
AV_SPARC_ASI_BLK_INIT |
|
AV_SPARC_ASI_BLK_INIT |
|
||||||
|
@ -570,6 +574,7 @@ static void __init init_sparc64_elf_hwcap(void)
|
||||||
sun4v_chip_type == SUN4V_CHIP_NIAGARA5 ||
|
sun4v_chip_type == SUN4V_CHIP_NIAGARA5 ||
|
||||||
sun4v_chip_type == SUN4V_CHIP_SPARC_M6 ||
|
sun4v_chip_type == SUN4V_CHIP_SPARC_M6 ||
|
||||||
sun4v_chip_type == SUN4V_CHIP_SPARC_M7 ||
|
sun4v_chip_type == SUN4V_CHIP_SPARC_M7 ||
|
||||||
|
sun4v_chip_type == SUN4V_CHIP_SPARC_SN ||
|
||||||
sun4v_chip_type == SUN4V_CHIP_SPARC64X)
|
sun4v_chip_type == SUN4V_CHIP_SPARC64X)
|
||||||
cap |= (AV_SPARC_VIS3 | AV_SPARC_HPC |
|
cap |= (AV_SPARC_VIS3 | AV_SPARC_HPC |
|
||||||
AV_SPARC_FMAF);
|
AV_SPARC_FMAF);
|
||||||
|
|
|
@ -85,8 +85,7 @@ __spitfire_cee_trap_continue:
|
||||||
ba,pt %xcc, etraptl1
|
ba,pt %xcc, etraptl1
|
||||||
rd %pc, %g7
|
rd %pc, %g7
|
||||||
|
|
||||||
ba,pt %xcc, 2f
|
ba,a,pt %xcc, 2f
|
||||||
nop
|
|
||||||
|
|
||||||
1: ba,pt %xcc, etrap_irq
|
1: ba,pt %xcc, etrap_irq
|
||||||
rd %pc, %g7
|
rd %pc, %g7
|
||||||
|
@ -100,8 +99,7 @@ __spitfire_cee_trap_continue:
|
||||||
mov %l5, %o2
|
mov %l5, %o2
|
||||||
call spitfire_access_error
|
call spitfire_access_error
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
ba,pt %xcc, rtrap
|
ba,a,pt %xcc, rtrap
|
||||||
nop
|
|
||||||
.size __spitfire_access_error,.-__spitfire_access_error
|
.size __spitfire_access_error,.-__spitfire_access_error
|
||||||
|
|
||||||
/* This is the trap handler entry point for ECC correctable
|
/* This is the trap handler entry point for ECC correctable
|
||||||
|
@ -179,8 +177,7 @@ __spitfire_data_access_exception_tl1:
|
||||||
mov %l5, %o2
|
mov %l5, %o2
|
||||||
call spitfire_data_access_exception_tl1
|
call spitfire_data_access_exception_tl1
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
ba,pt %xcc, rtrap
|
ba,a,pt %xcc, rtrap
|
||||||
nop
|
|
||||||
.size __spitfire_data_access_exception_tl1,.-__spitfire_data_access_exception_tl1
|
.size __spitfire_data_access_exception_tl1,.-__spitfire_data_access_exception_tl1
|
||||||
|
|
||||||
.type __spitfire_data_access_exception,#function
|
.type __spitfire_data_access_exception,#function
|
||||||
|
@ -200,8 +197,7 @@ __spitfire_data_access_exception:
|
||||||
mov %l5, %o2
|
mov %l5, %o2
|
||||||
call spitfire_data_access_exception
|
call spitfire_data_access_exception
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
ba,pt %xcc, rtrap
|
ba,a,pt %xcc, rtrap
|
||||||
nop
|
|
||||||
.size __spitfire_data_access_exception,.-__spitfire_data_access_exception
|
.size __spitfire_data_access_exception,.-__spitfire_data_access_exception
|
||||||
|
|
||||||
.type __spitfire_insn_access_exception_tl1,#function
|
.type __spitfire_insn_access_exception_tl1,#function
|
||||||
|
@ -220,8 +216,7 @@ __spitfire_insn_access_exception_tl1:
|
||||||
mov %l5, %o2
|
mov %l5, %o2
|
||||||
call spitfire_insn_access_exception_tl1
|
call spitfire_insn_access_exception_tl1
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
ba,pt %xcc, rtrap
|
ba,a,pt %xcc, rtrap
|
||||||
nop
|
|
||||||
.size __spitfire_insn_access_exception_tl1,.-__spitfire_insn_access_exception_tl1
|
.size __spitfire_insn_access_exception_tl1,.-__spitfire_insn_access_exception_tl1
|
||||||
|
|
||||||
.type __spitfire_insn_access_exception,#function
|
.type __spitfire_insn_access_exception,#function
|
||||||
|
@ -240,6 +235,5 @@ __spitfire_insn_access_exception:
|
||||||
mov %l5, %o2
|
mov %l5, %o2
|
||||||
call spitfire_insn_access_exception
|
call spitfire_insn_access_exception
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
ba,pt %xcc, rtrap
|
ba,a,pt %xcc, rtrap
|
||||||
nop
|
|
||||||
.size __spitfire_insn_access_exception,.-__spitfire_insn_access_exception
|
.size __spitfire_insn_access_exception,.-__spitfire_insn_access_exception
|
||||||
|
|
|
@ -88,4 +88,4 @@ sys_call_table:
|
||||||
/*340*/ .long sys_ni_syscall, sys_kcmp, sys_finit_module, sys_sched_setattr, sys_sched_getattr
|
/*340*/ .long sys_ni_syscall, sys_kcmp, sys_finit_module, sys_sched_setattr, sys_sched_getattr
|
||||||
/*345*/ .long sys_renameat2, sys_seccomp, sys_getrandom, sys_memfd_create, sys_bpf
|
/*345*/ .long sys_renameat2, sys_seccomp, sys_getrandom, sys_memfd_create, sys_bpf
|
||||||
/*350*/ .long sys_execveat, sys_membarrier, sys_userfaultfd, sys_bind, sys_listen
|
/*350*/ .long sys_execveat, sys_membarrier, sys_userfaultfd, sys_bind, sys_listen
|
||||||
/*355*/ .long sys_setsockopt, sys_mlock2, sys_copy_file_range
|
/*355*/ .long sys_setsockopt, sys_mlock2, sys_copy_file_range, sys_preadv2, sys_pwritev2
|
||||||
|
|
|
@ -89,7 +89,7 @@ sys_call_table32:
|
||||||
/*340*/ .word sys_kern_features, sys_kcmp, sys_finit_module, sys_sched_setattr, sys_sched_getattr
|
/*340*/ .word sys_kern_features, sys_kcmp, sys_finit_module, sys_sched_setattr, sys_sched_getattr
|
||||||
.word sys32_renameat2, sys_seccomp, sys_getrandom, sys_memfd_create, sys_bpf
|
.word sys32_renameat2, sys_seccomp, sys_getrandom, sys_memfd_create, sys_bpf
|
||||||
/*350*/ .word sys32_execveat, sys_membarrier, sys_userfaultfd, sys_bind, sys_listen
|
/*350*/ .word sys32_execveat, sys_membarrier, sys_userfaultfd, sys_bind, sys_listen
|
||||||
.word compat_sys_setsockopt, sys_mlock2, sys_copy_file_range
|
.word compat_sys_setsockopt, sys_mlock2, sys_copy_file_range, compat_sys_preadv2, compat_sys_pwritev2
|
||||||
|
|
||||||
#endif /* CONFIG_COMPAT */
|
#endif /* CONFIG_COMPAT */
|
||||||
|
|
||||||
|
@ -170,4 +170,4 @@ sys_call_table:
|
||||||
/*340*/ .word sys_kern_features, sys_kcmp, sys_finit_module, sys_sched_setattr, sys_sched_getattr
|
/*340*/ .word sys_kern_features, sys_kcmp, sys_finit_module, sys_sched_setattr, sys_sched_getattr
|
||||||
.word sys_renameat2, sys_seccomp, sys_getrandom, sys_memfd_create, sys_bpf
|
.word sys_renameat2, sys_seccomp, sys_getrandom, sys_memfd_create, sys_bpf
|
||||||
/*350*/ .word sys64_execveat, sys_membarrier, sys_userfaultfd, sys_bind, sys_listen
|
/*350*/ .word sys64_execveat, sys_membarrier, sys_userfaultfd, sys_bind, sys_listen
|
||||||
.word sys_setsockopt, sys_mlock2, sys_copy_file_range
|
.word sys_setsockopt, sys_mlock2, sys_copy_file_range, sys_preadv2, sys_pwritev2
|
||||||
|
|
|
@ -11,8 +11,7 @@ utrap_trap: /* %g3=handler,%g4=level */
|
||||||
mov %l4, %o1
|
mov %l4, %o1
|
||||||
call bad_trap
|
call bad_trap
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
ba,pt %xcc, rtrap
|
ba,a,pt %xcc, rtrap
|
||||||
nop
|
|
||||||
|
|
||||||
invoke_utrap:
|
invoke_utrap:
|
||||||
sllx %g3, 3, %g3
|
sllx %g3, 3, %g3
|
||||||
|
|
|
@ -45,6 +45,14 @@ static const struct vio_device_id *vio_match_device(
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int vio_hotplug(struct device *dev, struct kobj_uevent_env *env)
|
||||||
|
{
|
||||||
|
const struct vio_dev *vio_dev = to_vio_dev(dev);
|
||||||
|
|
||||||
|
add_uevent_var(env, "MODALIAS=vio:T%sS%s", vio_dev->type, vio_dev->compat);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int vio_bus_match(struct device *dev, struct device_driver *drv)
|
static int vio_bus_match(struct device *dev, struct device_driver *drv)
|
||||||
{
|
{
|
||||||
struct vio_dev *vio_dev = to_vio_dev(dev);
|
struct vio_dev *vio_dev = to_vio_dev(dev);
|
||||||
|
@ -105,15 +113,25 @@ static ssize_t type_show(struct device *dev,
|
||||||
return sprintf(buf, "%s\n", vdev->type);
|
return sprintf(buf, "%s\n", vdev->type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static ssize_t modalias_show(struct device *dev, struct device_attribute *attr,
|
||||||
|
char *buf)
|
||||||
|
{
|
||||||
|
const struct vio_dev *vdev = to_vio_dev(dev);
|
||||||
|
|
||||||
|
return sprintf(buf, "vio:T%sS%s\n", vdev->type, vdev->compat);
|
||||||
|
}
|
||||||
|
|
||||||
static struct device_attribute vio_dev_attrs[] = {
|
static struct device_attribute vio_dev_attrs[] = {
|
||||||
__ATTR_RO(devspec),
|
__ATTR_RO(devspec),
|
||||||
__ATTR_RO(type),
|
__ATTR_RO(type),
|
||||||
|
__ATTR_RO(modalias),
|
||||||
__ATTR_NULL
|
__ATTR_NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct bus_type vio_bus_type = {
|
static struct bus_type vio_bus_type = {
|
||||||
.name = "vio",
|
.name = "vio",
|
||||||
.dev_attrs = vio_dev_attrs,
|
.dev_attrs = vio_dev_attrs,
|
||||||
|
.uevent = vio_hotplug,
|
||||||
.match = vio_bus_match,
|
.match = vio_bus_match,
|
||||||
.probe = vio_device_probe,
|
.probe = vio_device_probe,
|
||||||
.remove = vio_device_remove,
|
.remove = vio_device_remove,
|
||||||
|
|
|
@ -33,6 +33,10 @@ ENTRY(_start)
|
||||||
jiffies = jiffies_64;
|
jiffies = jiffies_64;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_SPARC64
|
||||||
|
ASSERT((swapper_tsb == 0x0000000000408000), "Error: sparc64 early assembler too large")
|
||||||
|
#endif
|
||||||
|
|
||||||
SECTIONS
|
SECTIONS
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_SPARC64
|
#ifdef CONFIG_SPARC64
|
||||||
|
|
|
@ -32,8 +32,7 @@ fill_fixup:
|
||||||
rd %pc, %g7
|
rd %pc, %g7
|
||||||
call do_sparc64_fault
|
call do_sparc64_fault
|
||||||
add %sp, PTREGS_OFF, %o0
|
add %sp, PTREGS_OFF, %o0
|
||||||
ba,pt %xcc, rtrap
|
ba,a,pt %xcc, rtrap
|
||||||
nop
|
|
||||||
|
|
||||||
/* Be very careful about usage of the trap globals here.
|
/* Be very careful about usage of the trap globals here.
|
||||||
* You cannot touch %g5 as that has the fault information.
|
* You cannot touch %g5 as that has the fault information.
|
||||||
|
|
|
@ -1769,6 +1769,7 @@ static void __init setup_page_offset(void)
|
||||||
max_phys_bits = 47;
|
max_phys_bits = 47;
|
||||||
break;
|
break;
|
||||||
case SUN4V_CHIP_SPARC_M7:
|
case SUN4V_CHIP_SPARC_M7:
|
||||||
|
case SUN4V_CHIP_SPARC_SN:
|
||||||
default:
|
default:
|
||||||
/* M7 and later support 52-bit virtual addresses. */
|
/* M7 and later support 52-bit virtual addresses. */
|
||||||
sparc64_va_hole_top = 0xfff8000000000000UL;
|
sparc64_va_hole_top = 0xfff8000000000000UL;
|
||||||
|
@ -1986,6 +1987,7 @@ static void __init sun4v_linear_pte_xor_finalize(void)
|
||||||
*/
|
*/
|
||||||
switch (sun4v_chip_type) {
|
switch (sun4v_chip_type) {
|
||||||
case SUN4V_CHIP_SPARC_M7:
|
case SUN4V_CHIP_SPARC_M7:
|
||||||
|
case SUN4V_CHIP_SPARC_SN:
|
||||||
pagecv_flag = 0x00;
|
pagecv_flag = 0x00;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -2138,6 +2140,7 @@ void __init paging_init(void)
|
||||||
*/
|
*/
|
||||||
switch (sun4v_chip_type) {
|
switch (sun4v_chip_type) {
|
||||||
case SUN4V_CHIP_SPARC_M7:
|
case SUN4V_CHIP_SPARC_M7:
|
||||||
|
case SUN4V_CHIP_SPARC_SN:
|
||||||
page_cache4v_flag = _PAGE_CP_4V;
|
page_cache4v_flag = _PAGE_CP_4V;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -474,6 +474,7 @@ static __init int _init_perf_amd_iommu(
|
||||||
|
|
||||||
static struct perf_amd_iommu __perf_iommu = {
|
static struct perf_amd_iommu __perf_iommu = {
|
||||||
.pmu = {
|
.pmu = {
|
||||||
|
.task_ctx_nr = perf_invalid_context,
|
||||||
.event_init = perf_iommu_event_init,
|
.event_init = perf_iommu_event_init,
|
||||||
.add = perf_iommu_add,
|
.add = perf_iommu_add,
|
||||||
.del = perf_iommu_del,
|
.del = perf_iommu_del,
|
||||||
|
|
|
@ -3637,6 +3637,8 @@ __init int intel_pmu_init(void)
|
||||||
pr_cont("Knights Landing events, ");
|
pr_cont("Knights Landing events, ");
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case 142: /* 14nm Kabylake Mobile */
|
||||||
|
case 158: /* 14nm Kabylake Desktop */
|
||||||
case 78: /* 14nm Skylake Mobile */
|
case 78: /* 14nm Skylake Mobile */
|
||||||
case 94: /* 14nm Skylake Desktop */
|
case 94: /* 14nm Skylake Desktop */
|
||||||
case 85: /* 14nm Skylake Server */
|
case 85: /* 14nm Skylake Server */
|
||||||
|
|
|
@ -891,9 +891,7 @@ void __init uv_system_init(void)
|
||||||
}
|
}
|
||||||
pr_info("UV: Found %s hub\n", hub);
|
pr_info("UV: Found %s hub\n", hub);
|
||||||
|
|
||||||
/* We now only need to map the MMRs on UV1 */
|
map_low_mmrs();
|
||||||
if (is_uv1_hub())
|
|
||||||
map_low_mmrs();
|
|
||||||
|
|
||||||
m_n_config.v = uv_read_local_mmr(UVH_RH_GAM_CONFIG_MMR );
|
m_n_config.v = uv_read_local_mmr(UVH_RH_GAM_CONFIG_MMR );
|
||||||
m_val = m_n_config.s.m_skt;
|
m_val = m_n_config.s.m_skt;
|
||||||
|
|
|
@ -106,14 +106,24 @@ static int __init efifb_set_system(const struct dmi_system_id *id)
|
||||||
continue;
|
continue;
|
||||||
for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
|
for (i = 0; i < DEVICE_COUNT_RESOURCE; i++) {
|
||||||
resource_size_t start, end;
|
resource_size_t start, end;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
|
flags = pci_resource_flags(dev, i);
|
||||||
|
if (!(flags & IORESOURCE_MEM))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (flags & IORESOURCE_UNSET)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (pci_resource_len(dev, i) == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
start = pci_resource_start(dev, i);
|
start = pci_resource_start(dev, i);
|
||||||
if (start == 0)
|
|
||||||
break;
|
|
||||||
end = pci_resource_end(dev, i);
|
end = pci_resource_end(dev, i);
|
||||||
if (screen_info.lfb_base >= start &&
|
if (screen_info.lfb_base >= start &&
|
||||||
screen_info.lfb_base < end) {
|
screen_info.lfb_base < end) {
|
||||||
found_bar = 1;
|
found_bar = 1;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -92,7 +92,7 @@ unsigned long try_msr_calibrate_tsc(void)
|
||||||
|
|
||||||
if (freq_desc_tables[cpu_index].msr_plat) {
|
if (freq_desc_tables[cpu_index].msr_plat) {
|
||||||
rdmsr(MSR_PLATFORM_INFO, lo, hi);
|
rdmsr(MSR_PLATFORM_INFO, lo, hi);
|
||||||
ratio = (lo >> 8) & 0x1f;
|
ratio = (lo >> 8) & 0xff;
|
||||||
} else {
|
} else {
|
||||||
rdmsr(MSR_IA32_PERF_STATUS, lo, hi);
|
rdmsr(MSR_IA32_PERF_STATUS, lo, hi);
|
||||||
ratio = (hi >> 8) & 0x1f;
|
ratio = (hi >> 8) & 0x1f;
|
||||||
|
|
|
@ -2823,7 +2823,7 @@ static void transparent_hugepage_adjust(struct kvm_vcpu *vcpu,
|
||||||
*/
|
*/
|
||||||
if (!is_error_noslot_pfn(pfn) && !kvm_is_reserved_pfn(pfn) &&
|
if (!is_error_noslot_pfn(pfn) && !kvm_is_reserved_pfn(pfn) &&
|
||||||
level == PT_PAGE_TABLE_LEVEL &&
|
level == PT_PAGE_TABLE_LEVEL &&
|
||||||
PageTransCompound(pfn_to_page(pfn)) &&
|
PageTransCompoundMap(pfn_to_page(pfn)) &&
|
||||||
!mmu_gfn_lpage_is_disallowed(vcpu, gfn, PT_DIRECTORY_LEVEL)) {
|
!mmu_gfn_lpage_is_disallowed(vcpu, gfn, PT_DIRECTORY_LEVEL)) {
|
||||||
unsigned long mask;
|
unsigned long mask;
|
||||||
/*
|
/*
|
||||||
|
@ -4785,7 +4785,7 @@ restart:
|
||||||
*/
|
*/
|
||||||
if (sp->role.direct &&
|
if (sp->role.direct &&
|
||||||
!kvm_is_reserved_pfn(pfn) &&
|
!kvm_is_reserved_pfn(pfn) &&
|
||||||
PageTransCompound(pfn_to_page(pfn))) {
|
PageTransCompoundMap(pfn_to_page(pfn))) {
|
||||||
drop_spte(kvm, sptep);
|
drop_spte(kvm, sptep);
|
||||||
need_tlb_flush = 1;
|
need_tlb_flush = 1;
|
||||||
goto restart;
|
goto restart;
|
||||||
|
|
|
@ -43,40 +43,40 @@ void __init efi_bgrt_init(void)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (bgrt_tab->header.length < sizeof(*bgrt_tab)) {
|
if (bgrt_tab->header.length < sizeof(*bgrt_tab)) {
|
||||||
pr_err("Ignoring BGRT: invalid length %u (expected %zu)\n",
|
pr_notice("Ignoring BGRT: invalid length %u (expected %zu)\n",
|
||||||
bgrt_tab->header.length, sizeof(*bgrt_tab));
|
bgrt_tab->header.length, sizeof(*bgrt_tab));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (bgrt_tab->version != 1) {
|
if (bgrt_tab->version != 1) {
|
||||||
pr_err("Ignoring BGRT: invalid version %u (expected 1)\n",
|
pr_notice("Ignoring BGRT: invalid version %u (expected 1)\n",
|
||||||
bgrt_tab->version);
|
bgrt_tab->version);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (bgrt_tab->status & 0xfe) {
|
if (bgrt_tab->status & 0xfe) {
|
||||||
pr_err("Ignoring BGRT: reserved status bits are non-zero %u\n",
|
pr_notice("Ignoring BGRT: reserved status bits are non-zero %u\n",
|
||||||
bgrt_tab->status);
|
bgrt_tab->status);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (bgrt_tab->image_type != 0) {
|
if (bgrt_tab->image_type != 0) {
|
||||||
pr_err("Ignoring BGRT: invalid image type %u (expected 0)\n",
|
pr_notice("Ignoring BGRT: invalid image type %u (expected 0)\n",
|
||||||
bgrt_tab->image_type);
|
bgrt_tab->image_type);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!bgrt_tab->image_address) {
|
if (!bgrt_tab->image_address) {
|
||||||
pr_err("Ignoring BGRT: null image address\n");
|
pr_notice("Ignoring BGRT: null image address\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
image = memremap(bgrt_tab->image_address, sizeof(bmp_header), MEMREMAP_WB);
|
image = memremap(bgrt_tab->image_address, sizeof(bmp_header), MEMREMAP_WB);
|
||||||
if (!image) {
|
if (!image) {
|
||||||
pr_err("Ignoring BGRT: failed to map image header memory\n");
|
pr_notice("Ignoring BGRT: failed to map image header memory\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(&bmp_header, image, sizeof(bmp_header));
|
memcpy(&bmp_header, image, sizeof(bmp_header));
|
||||||
memunmap(image);
|
memunmap(image);
|
||||||
if (bmp_header.id != 0x4d42) {
|
if (bmp_header.id != 0x4d42) {
|
||||||
pr_err("Ignoring BGRT: Incorrect BMP magic number 0x%x (expected 0x4d42)\n",
|
pr_notice("Ignoring BGRT: Incorrect BMP magic number 0x%x (expected 0x4d42)\n",
|
||||||
bmp_header.id);
|
bmp_header.id);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -84,14 +84,14 @@ void __init efi_bgrt_init(void)
|
||||||
|
|
||||||
bgrt_image = kmalloc(bgrt_image_size, GFP_KERNEL | __GFP_NOWARN);
|
bgrt_image = kmalloc(bgrt_image_size, GFP_KERNEL | __GFP_NOWARN);
|
||||||
if (!bgrt_image) {
|
if (!bgrt_image) {
|
||||||
pr_err("Ignoring BGRT: failed to allocate memory for image (wanted %zu bytes)\n",
|
pr_notice("Ignoring BGRT: failed to allocate memory for image (wanted %zu bytes)\n",
|
||||||
bgrt_image_size);
|
bgrt_image_size);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
image = memremap(bgrt_tab->image_address, bmp_header.size, MEMREMAP_WB);
|
image = memremap(bgrt_tab->image_address, bmp_header.size, MEMREMAP_WB);
|
||||||
if (!image) {
|
if (!image) {
|
||||||
pr_err("Ignoring BGRT: failed to map image memory\n");
|
pr_notice("Ignoring BGRT: failed to map image memory\n");
|
||||||
kfree(bgrt_image);
|
kfree(bgrt_image);
|
||||||
bgrt_image = NULL;
|
bgrt_image = NULL;
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -428,6 +428,9 @@ acpi_ds_begin_method_execution(struct acpi_namespace_node *method_node,
|
||||||
obj_desc->method.mutex->mutex.
|
obj_desc->method.mutex->mutex.
|
||||||
original_sync_level =
|
original_sync_level =
|
||||||
obj_desc->method.mutex->mutex.sync_level;
|
obj_desc->method.mutex->mutex.sync_level;
|
||||||
|
|
||||||
|
obj_desc->method.mutex->mutex.thread_id =
|
||||||
|
acpi_os_get_thread_id();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -287,8 +287,11 @@ static int acpi_nfit_ctl(struct nvdimm_bus_descriptor *nd_desc,
|
||||||
offset);
|
offset);
|
||||||
rc = -ENXIO;
|
rc = -ENXIO;
|
||||||
}
|
}
|
||||||
} else
|
} else {
|
||||||
rc = 0;
|
rc = 0;
|
||||||
|
if (cmd_rc)
|
||||||
|
*cmd_rc = xlat_status(buf, cmd);
|
||||||
|
}
|
||||||
|
|
||||||
out:
|
out:
|
||||||
ACPI_FREE(out_obj);
|
ACPI_FREE(out_obj);
|
||||||
|
|
|
@ -202,6 +202,14 @@ config SATA_FSL
|
||||||
|
|
||||||
If unsure, say N.
|
If unsure, say N.
|
||||||
|
|
||||||
|
config SATA_AHCI_SEATTLE
|
||||||
|
tristate "AMD Seattle 6.0Gbps AHCI SATA host controller support"
|
||||||
|
depends on ARCH_SEATTLE
|
||||||
|
help
|
||||||
|
This option enables support for AMD Seattle SATA host controller.
|
||||||
|
|
||||||
|
If unsure, say N
|
||||||
|
|
||||||
config SATA_INIC162X
|
config SATA_INIC162X
|
||||||
tristate "Initio 162x SATA support (Very Experimental)"
|
tristate "Initio 162x SATA support (Very Experimental)"
|
||||||
depends on PCI
|
depends on PCI
|
||||||
|
|
|
@ -4,6 +4,7 @@ obj-$(CONFIG_ATA) += libata.o
|
||||||
# non-SFF interface
|
# non-SFF interface
|
||||||
obj-$(CONFIG_SATA_AHCI) += ahci.o libahci.o
|
obj-$(CONFIG_SATA_AHCI) += ahci.o libahci.o
|
||||||
obj-$(CONFIG_SATA_ACARD_AHCI) += acard-ahci.o libahci.o
|
obj-$(CONFIG_SATA_ACARD_AHCI) += acard-ahci.o libahci.o
|
||||||
|
obj-$(CONFIG_SATA_AHCI_SEATTLE) += ahci_seattle.o libahci.o libahci_platform.o
|
||||||
obj-$(CONFIG_SATA_AHCI_PLATFORM) += ahci_platform.o libahci.o libahci_platform.o
|
obj-$(CONFIG_SATA_AHCI_PLATFORM) += ahci_platform.o libahci.o libahci_platform.o
|
||||||
obj-$(CONFIG_SATA_FSL) += sata_fsl.o
|
obj-$(CONFIG_SATA_FSL) += sata_fsl.o
|
||||||
obj-$(CONFIG_SATA_INIC162X) += sata_inic162x.o
|
obj-$(CONFIG_SATA_INIC162X) += sata_inic162x.o
|
||||||
|
|
|
@ -51,6 +51,9 @@ static int ahci_probe(struct platform_device *pdev)
|
||||||
if (rc)
|
if (rc)
|
||||||
return rc;
|
return rc;
|
||||||
|
|
||||||
|
of_property_read_u32(dev->of_node,
|
||||||
|
"ports-implemented", &hpriv->force_port_map);
|
||||||
|
|
||||||
if (of_device_is_compatible(dev->of_node, "hisilicon,hisi-ahci"))
|
if (of_device_is_compatible(dev->of_node, "hisilicon,hisi-ahci"))
|
||||||
hpriv->flags |= AHCI_HFLAG_NO_FBS | AHCI_HFLAG_NO_NCQ;
|
hpriv->flags |= AHCI_HFLAG_NO_FBS | AHCI_HFLAG_NO_NCQ;
|
||||||
|
|
||||||
|
|
210
drivers/ata/ahci_seattle.c
Normal file
210
drivers/ata/ahci_seattle.c
Normal file
|
@ -0,0 +1,210 @@
|
||||||
|
/*
|
||||||
|
* AMD Seattle AHCI SATA driver
|
||||||
|
*
|
||||||
|
* Copyright (c) 2015, Advanced Micro Devices
|
||||||
|
* Author: Brijesh Singh <brijesh.singh@amd.com>
|
||||||
|
*
|
||||||
|
* based on the AHCI SATA platform driver by Jeff Garzik and Anton Vorontsov
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
#include <linux/pm.h>
|
||||||
|
#include <linux/device.h>
|
||||||
|
#include <linux/of_device.h>
|
||||||
|
#include <linux/platform_device.h>
|
||||||
|
#include <linux/libata.h>
|
||||||
|
#include <linux/ahci_platform.h>
|
||||||
|
#include <linux/acpi.h>
|
||||||
|
#include <linux/pci_ids.h>
|
||||||
|
#include "ahci.h"
|
||||||
|
|
||||||
|
/* SGPIO Control Register definition
|
||||||
|
*
|
||||||
|
* Bit Type Description
|
||||||
|
* 31 RW OD7.2 (activity)
|
||||||
|
* 30 RW OD7.1 (locate)
|
||||||
|
* 29 RW OD7.0 (fault)
|
||||||
|
* 28...8 RW OD6.2...OD0.0 (3bits per port, 1 bit per LED)
|
||||||
|
* 7 RO SGPIO feature flag
|
||||||
|
* 6:4 RO Reserved
|
||||||
|
* 3:0 RO Number of ports (0 means no port supported)
|
||||||
|
*/
|
||||||
|
#define ACTIVITY_BIT_POS(x) (8 + (3 * x))
|
||||||
|
#define LOCATE_BIT_POS(x) (ACTIVITY_BIT_POS(x) + 1)
|
||||||
|
#define FAULT_BIT_POS(x) (LOCATE_BIT_POS(x) + 1)
|
||||||
|
|
||||||
|
#define ACTIVITY_MASK 0x00010000
|
||||||
|
#define LOCATE_MASK 0x00080000
|
||||||
|
#define FAULT_MASK 0x00400000
|
||||||
|
|
||||||
|
#define DRV_NAME "ahci-seattle"
|
||||||
|
|
||||||
|
static ssize_t seattle_transmit_led_message(struct ata_port *ap, u32 state,
|
||||||
|
ssize_t size);
|
||||||
|
|
||||||
|
struct seattle_plat_data {
|
||||||
|
void __iomem *sgpio_ctrl;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct ata_port_operations ahci_port_ops = {
|
||||||
|
.inherits = &ahci_ops,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct ata_port_info ahci_port_info = {
|
||||||
|
.flags = AHCI_FLAG_COMMON,
|
||||||
|
.pio_mask = ATA_PIO4,
|
||||||
|
.udma_mask = ATA_UDMA6,
|
||||||
|
.port_ops = &ahci_port_ops,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct ata_port_operations ahci_seattle_ops = {
|
||||||
|
.inherits = &ahci_ops,
|
||||||
|
.transmit_led_message = seattle_transmit_led_message,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const struct ata_port_info ahci_port_seattle_info = {
|
||||||
|
.flags = AHCI_FLAG_COMMON | ATA_FLAG_EM | ATA_FLAG_SW_ACTIVITY,
|
||||||
|
.link_flags = ATA_LFLAG_SW_ACTIVITY,
|
||||||
|
.pio_mask = ATA_PIO4,
|
||||||
|
.udma_mask = ATA_UDMA6,
|
||||||
|
.port_ops = &ahci_seattle_ops,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct scsi_host_template ahci_platform_sht = {
|
||||||
|
AHCI_SHT(DRV_NAME),
|
||||||
|
};
|
||||||
|
|
||||||
|
static ssize_t seattle_transmit_led_message(struct ata_port *ap, u32 state,
|
||||||
|
ssize_t size)
|
||||||
|
{
|
||||||
|
struct ahci_host_priv *hpriv = ap->host->private_data;
|
||||||
|
struct ahci_port_priv *pp = ap->private_data;
|
||||||
|
struct seattle_plat_data *plat_data = hpriv->plat_data;
|
||||||
|
unsigned long flags;
|
||||||
|
int pmp;
|
||||||
|
struct ahci_em_priv *emp;
|
||||||
|
u32 val;
|
||||||
|
|
||||||
|
/* get the slot number from the message */
|
||||||
|
pmp = (state & EM_MSG_LED_PMP_SLOT) >> 8;
|
||||||
|
if (pmp >= EM_MAX_SLOTS)
|
||||||
|
return -EINVAL;
|
||||||
|
emp = &pp->em_priv[pmp];
|
||||||
|
|
||||||
|
val = ioread32(plat_data->sgpio_ctrl);
|
||||||
|
if (state & ACTIVITY_MASK)
|
||||||
|
val |= 1 << ACTIVITY_BIT_POS((ap->port_no));
|
||||||
|
else
|
||||||
|
val &= ~(1 << ACTIVITY_BIT_POS((ap->port_no)));
|
||||||
|
|
||||||
|
if (state & LOCATE_MASK)
|
||||||
|
val |= 1 << LOCATE_BIT_POS((ap->port_no));
|
||||||
|
else
|
||||||
|
val &= ~(1 << LOCATE_BIT_POS((ap->port_no)));
|
||||||
|
|
||||||
|
if (state & FAULT_MASK)
|
||||||
|
val |= 1 << FAULT_BIT_POS((ap->port_no));
|
||||||
|
else
|
||||||
|
val &= ~(1 << FAULT_BIT_POS((ap->port_no)));
|
||||||
|
|
||||||
|
iowrite32(val, plat_data->sgpio_ctrl);
|
||||||
|
|
||||||
|
spin_lock_irqsave(ap->lock, flags);
|
||||||
|
|
||||||
|
/* save off new led state for port/slot */
|
||||||
|
emp->led_state = state;
|
||||||
|
|
||||||
|
spin_unlock_irqrestore(ap->lock, flags);
|
||||||
|
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct ata_port_info *ahci_seattle_get_port_info(
|
||||||
|
struct platform_device *pdev, struct ahci_host_priv *hpriv)
|
||||||
|
{
|
||||||
|
struct device *dev = &pdev->dev;
|
||||||
|
struct seattle_plat_data *plat_data;
|
||||||
|
u32 val;
|
||||||
|
|
||||||
|
plat_data = devm_kzalloc(dev, sizeof(*plat_data), GFP_KERNEL);
|
||||||
|
if (IS_ERR(plat_data))
|
||||||
|
return &ahci_port_info;
|
||||||
|
|
||||||
|
plat_data->sgpio_ctrl = devm_ioremap_resource(dev,
|
||||||
|
platform_get_resource(pdev, IORESOURCE_MEM, 1));
|
||||||
|
if (IS_ERR(plat_data->sgpio_ctrl))
|
||||||
|
return &ahci_port_info;
|
||||||
|
|
||||||
|
val = ioread32(plat_data->sgpio_ctrl);
|
||||||
|
|
||||||
|
if (!(val & 0xf))
|
||||||
|
return &ahci_port_info;
|
||||||
|
|
||||||
|
hpriv->em_loc = 0;
|
||||||
|
hpriv->em_buf_sz = 4;
|
||||||
|
hpriv->em_msg_type = EM_MSG_TYPE_LED;
|
||||||
|
hpriv->plat_data = plat_data;
|
||||||
|
|
||||||
|
dev_info(dev, "SGPIO LED control is enabled.\n");
|
||||||
|
return &ahci_port_seattle_info;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int ahci_seattle_probe(struct platform_device *pdev)
|
||||||
|
{
|
||||||
|
int rc;
|
||||||
|
struct ahci_host_priv *hpriv;
|
||||||
|
|
||||||
|
hpriv = ahci_platform_get_resources(pdev);
|
||||||
|
if (IS_ERR(hpriv))
|
||||||
|
return PTR_ERR(hpriv);
|
||||||
|
|
||||||
|
rc = ahci_platform_enable_resources(hpriv);
|
||||||
|
if (rc)
|
||||||
|
return rc;
|
||||||
|
|
||||||
|
rc = ahci_platform_init_host(pdev, hpriv,
|
||||||
|
ahci_seattle_get_port_info(pdev, hpriv),
|
||||||
|
&ahci_platform_sht);
|
||||||
|
if (rc)
|
||||||
|
goto disable_resources;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
disable_resources:
|
||||||
|
ahci_platform_disable_resources(hpriv);
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
|
|
||||||
|
static SIMPLE_DEV_PM_OPS(ahci_pm_ops, ahci_platform_suspend,
|
||||||
|
ahci_platform_resume);
|
||||||
|
|
||||||
|
static const struct acpi_device_id ahci_acpi_match[] = {
|
||||||
|
{ "AMDI0600", 0 },
|
||||||
|
{}
|
||||||
|
};
|
||||||
|
MODULE_DEVICE_TABLE(acpi, ahci_acpi_match);
|
||||||
|
|
||||||
|
static struct platform_driver ahci_seattle_driver = {
|
||||||
|
.probe = ahci_seattle_probe,
|
||||||
|
.remove = ata_platform_remove_one,
|
||||||
|
.driver = {
|
||||||
|
.name = DRV_NAME,
|
||||||
|
.acpi_match_table = ahci_acpi_match,
|
||||||
|
.pm = &ahci_pm_ops,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
module_platform_driver(ahci_seattle_driver);
|
||||||
|
|
||||||
|
MODULE_DESCRIPTION("Seattle AHCI SATA platform driver");
|
||||||
|
MODULE_AUTHOR("Brijesh Singh <brijesh.singh@amd.com>");
|
||||||
|
MODULE_LICENSE("GPL");
|
||||||
|
MODULE_ALIAS("platform:" DRV_NAME);
|
|
@ -507,6 +507,7 @@ void ahci_save_initial_config(struct device *dev, struct ahci_host_priv *hpriv)
|
||||||
dev_info(dev, "forcing port_map 0x%x -> 0x%x\n",
|
dev_info(dev, "forcing port_map 0x%x -> 0x%x\n",
|
||||||
port_map, hpriv->force_port_map);
|
port_map, hpriv->force_port_map);
|
||||||
port_map = hpriv->force_port_map;
|
port_map = hpriv->force_port_map;
|
||||||
|
hpriv->saved_port_map = port_map;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hpriv->mask_port_map) {
|
if (hpriv->mask_port_map) {
|
||||||
|
|
|
@ -259,9 +259,6 @@ unsigned long dev_pm_opp_get_max_volt_latency(struct device *dev)
|
||||||
reg = opp_table->regulator;
|
reg = opp_table->regulator;
|
||||||
if (IS_ERR(reg)) {
|
if (IS_ERR(reg)) {
|
||||||
/* Regulator may not be required for device */
|
/* Regulator may not be required for device */
|
||||||
if (reg)
|
|
||||||
dev_err(dev, "%s: Invalid regulator (%ld)\n", __func__,
|
|
||||||
PTR_ERR(reg));
|
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
|
|
||||||
static inline bool is_pset_node(struct fwnode_handle *fwnode)
|
static inline bool is_pset_node(struct fwnode_handle *fwnode)
|
||||||
{
|
{
|
||||||
return fwnode && fwnode->type == FWNODE_PDATA;
|
return !IS_ERR_OR_NULL(fwnode) && fwnode->type == FWNODE_PDATA;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline struct property_set *to_pset_node(struct fwnode_handle *fwnode)
|
static inline struct property_set *to_pset_node(struct fwnode_handle *fwnode)
|
||||||
|
|
|
@ -394,7 +394,7 @@ static void __init imx6q_clocks_init(struct device_node *ccm_node)
|
||||||
clk[IMX6QDL_CLK_LDB_DI1_DIV_3_5] = imx_clk_fixed_factor("ldb_di1_div_3_5", "ldb_di1", 2, 7);
|
clk[IMX6QDL_CLK_LDB_DI1_DIV_3_5] = imx_clk_fixed_factor("ldb_di1_div_3_5", "ldb_di1", 2, 7);
|
||||||
} else {
|
} else {
|
||||||
clk[IMX6QDL_CLK_ECSPI_ROOT] = imx_clk_divider("ecspi_root", "pll3_60m", base + 0x38, 19, 6);
|
clk[IMX6QDL_CLK_ECSPI_ROOT] = imx_clk_divider("ecspi_root", "pll3_60m", base + 0x38, 19, 6);
|
||||||
clk[IMX6QDL_CLK_CAN_ROOT] = imx_clk_divider("can_root", "pll3_60", base + 0x20, 2, 6);
|
clk[IMX6QDL_CLK_CAN_ROOT] = imx_clk_divider("can_root", "pll3_60m", base + 0x20, 2, 6);
|
||||||
clk[IMX6QDL_CLK_IPG_PER] = imx_clk_fixup_divider("ipg_per", "ipg", base + 0x1c, 0, 6, imx_cscmr1_fixup);
|
clk[IMX6QDL_CLK_IPG_PER] = imx_clk_fixup_divider("ipg_per", "ipg", base + 0x1c, 0, 6, imx_cscmr1_fixup);
|
||||||
clk[IMX6QDL_CLK_UART_SERIAL_PODF] = imx_clk_divider("uart_serial_podf", "pll3_80m", base + 0x24, 0, 6);
|
clk[IMX6QDL_CLK_UART_SERIAL_PODF] = imx_clk_divider("uart_serial_podf", "pll3_80m", base + 0x24, 0, 6);
|
||||||
clk[IMX6QDL_CLK_LDB_DI0_DIV_3_5] = imx_clk_fixed_factor("ldb_di0_div_3_5", "ldb_di0_sel", 2, 7);
|
clk[IMX6QDL_CLK_LDB_DI0_DIV_3_5] = imx_clk_fixed_factor("ldb_di0_div_3_5", "ldb_di0_sel", 2, 7);
|
||||||
|
|
|
@ -1557,21 +1557,25 @@ void cpufreq_suspend(void)
|
||||||
if (!cpufreq_driver)
|
if (!cpufreq_driver)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!has_target())
|
if (!has_target() && !cpufreq_driver->suspend)
|
||||||
goto suspend;
|
goto suspend;
|
||||||
|
|
||||||
pr_debug("%s: Suspending Governors\n", __func__);
|
pr_debug("%s: Suspending Governors\n", __func__);
|
||||||
|
|
||||||
for_each_active_policy(policy) {
|
for_each_active_policy(policy) {
|
||||||
down_write(&policy->rwsem);
|
if (has_target()) {
|
||||||
ret = cpufreq_governor(policy, CPUFREQ_GOV_STOP);
|
down_write(&policy->rwsem);
|
||||||
up_write(&policy->rwsem);
|
ret = cpufreq_governor(policy, CPUFREQ_GOV_STOP);
|
||||||
|
up_write(&policy->rwsem);
|
||||||
|
|
||||||
if (ret)
|
if (ret) {
|
||||||
pr_err("%s: Failed to stop governor for policy: %p\n",
|
pr_err("%s: Failed to stop governor for policy: %p\n",
|
||||||
__func__, policy);
|
__func__, policy);
|
||||||
else if (cpufreq_driver->suspend
|
continue;
|
||||||
&& cpufreq_driver->suspend(policy))
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cpufreq_driver->suspend && cpufreq_driver->suspend(policy))
|
||||||
pr_err("%s: Failed to suspend driver: %p\n", __func__,
|
pr_err("%s: Failed to suspend driver: %p\n", __func__,
|
||||||
policy);
|
policy);
|
||||||
}
|
}
|
||||||
|
@ -1596,7 +1600,7 @@ void cpufreq_resume(void)
|
||||||
|
|
||||||
cpufreq_suspended = false;
|
cpufreq_suspended = false;
|
||||||
|
|
||||||
if (!has_target())
|
if (!has_target() && !cpufreq_driver->resume)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
pr_debug("%s: Resuming Governors\n", __func__);
|
pr_debug("%s: Resuming Governors\n", __func__);
|
||||||
|
@ -1605,7 +1609,7 @@ void cpufreq_resume(void)
|
||||||
if (cpufreq_driver->resume && cpufreq_driver->resume(policy)) {
|
if (cpufreq_driver->resume && cpufreq_driver->resume(policy)) {
|
||||||
pr_err("%s: Failed to resume driver: %p\n", __func__,
|
pr_err("%s: Failed to resume driver: %p\n", __func__,
|
||||||
policy);
|
policy);
|
||||||
} else {
|
} else if (has_target()) {
|
||||||
down_write(&policy->rwsem);
|
down_write(&policy->rwsem);
|
||||||
ret = cpufreq_start_governor(policy);
|
ret = cpufreq_start_governor(policy);
|
||||||
up_write(&policy->rwsem);
|
up_write(&policy->rwsem);
|
||||||
|
|
|
@ -453,6 +453,14 @@ static void intel_pstate_hwp_set(const struct cpumask *cpumask)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int intel_pstate_hwp_set_policy(struct cpufreq_policy *policy)
|
||||||
|
{
|
||||||
|
if (hwp_active)
|
||||||
|
intel_pstate_hwp_set(policy->cpus);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void intel_pstate_hwp_set_online_cpus(void)
|
static void intel_pstate_hwp_set_online_cpus(void)
|
||||||
{
|
{
|
||||||
get_online_cpus();
|
get_online_cpus();
|
||||||
|
@ -1062,8 +1070,9 @@ static inline bool intel_pstate_sample(struct cpudata *cpu, u64 time)
|
||||||
|
|
||||||
static inline int32_t get_avg_frequency(struct cpudata *cpu)
|
static inline int32_t get_avg_frequency(struct cpudata *cpu)
|
||||||
{
|
{
|
||||||
return div64_u64(cpu->pstate.max_pstate_physical * cpu->sample.aperf *
|
return fp_toint(mul_fp(cpu->sample.core_pct_busy,
|
||||||
cpu->pstate.scaling, cpu->sample.mperf);
|
int_tofp(cpu->pstate.max_pstate_physical *
|
||||||
|
cpu->pstate.scaling / 100)));
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int32_t get_target_pstate_use_cpu_load(struct cpudata *cpu)
|
static inline int32_t get_target_pstate_use_cpu_load(struct cpudata *cpu)
|
||||||
|
@ -1106,8 +1115,6 @@ static inline int32_t get_target_pstate_use_performance(struct cpudata *cpu)
|
||||||
int32_t core_busy, max_pstate, current_pstate, sample_ratio;
|
int32_t core_busy, max_pstate, current_pstate, sample_ratio;
|
||||||
u64 duration_ns;
|
u64 duration_ns;
|
||||||
|
|
||||||
intel_pstate_calc_busy(cpu);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* core_busy is the ratio of actual performance to max
|
* core_busy is the ratio of actual performance to max
|
||||||
* max_pstate is the max non turbo pstate available
|
* max_pstate is the max non turbo pstate available
|
||||||
|
@ -1191,8 +1198,11 @@ static void intel_pstate_update_util(struct update_util_data *data, u64 time,
|
||||||
if ((s64)delta_ns >= pid_params.sample_rate_ns) {
|
if ((s64)delta_ns >= pid_params.sample_rate_ns) {
|
||||||
bool sample_taken = intel_pstate_sample(cpu, time);
|
bool sample_taken = intel_pstate_sample(cpu, time);
|
||||||
|
|
||||||
if (sample_taken && !hwp_active)
|
if (sample_taken) {
|
||||||
intel_pstate_adjust_busy_pstate(cpu);
|
intel_pstate_calc_busy(cpu);
|
||||||
|
if (!hwp_active)
|
||||||
|
intel_pstate_adjust_busy_pstate(cpu);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1346,8 +1356,7 @@ static int intel_pstate_set_policy(struct cpufreq_policy *policy)
|
||||||
out:
|
out:
|
||||||
intel_pstate_set_update_util_hook(policy->cpu);
|
intel_pstate_set_update_util_hook(policy->cpu);
|
||||||
|
|
||||||
if (hwp_active)
|
intel_pstate_hwp_set_policy(policy);
|
||||||
intel_pstate_hwp_set(policy->cpus);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1411,6 +1420,7 @@ static struct cpufreq_driver intel_pstate_driver = {
|
||||||
.flags = CPUFREQ_CONST_LOOPS,
|
.flags = CPUFREQ_CONST_LOOPS,
|
||||||
.verify = intel_pstate_verify_policy,
|
.verify = intel_pstate_verify_policy,
|
||||||
.setpolicy = intel_pstate_set_policy,
|
.setpolicy = intel_pstate_set_policy,
|
||||||
|
.resume = intel_pstate_hwp_set_policy,
|
||||||
.get = intel_pstate_get,
|
.get = intel_pstate_get,
|
||||||
.init = intel_pstate_cpu_init,
|
.init = intel_pstate_cpu_init,
|
||||||
.stop_cpu = intel_pstate_stop_cpu,
|
.stop_cpu = intel_pstate_stop_cpu,
|
||||||
|
|
|
@ -259,6 +259,10 @@ static int sti_cpufreq_init(void)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
if ((!of_machine_is_compatible("st,stih407")) &&
|
||||||
|
(!of_machine_is_compatible("st,stih410")))
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
ddata.cpu = get_cpu_device(0);
|
ddata.cpu = get_cpu_device(0);
|
||||||
if (!ddata.cpu) {
|
if (!ddata.cpu) {
|
||||||
dev_err(ddata.cpu, "Failed to get device for CPU0\n");
|
dev_err(ddata.cpu, "Failed to get device for CPU0\n");
|
||||||
|
|
|
@ -50,7 +50,7 @@ static int arm_enter_idle_state(struct cpuidle_device *dev,
|
||||||
* call the CPU ops suspend protocol with idle index as a
|
* call the CPU ops suspend protocol with idle index as a
|
||||||
* parameter.
|
* parameter.
|
||||||
*/
|
*/
|
||||||
arm_cpuidle_suspend(idx);
|
ret = arm_cpuidle_suspend(idx);
|
||||||
|
|
||||||
cpu_pm_exit();
|
cpu_pm_exit();
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,7 +77,7 @@ static inline u16 fw_cfg_sel_endianness(u16 key)
|
||||||
static inline void fw_cfg_read_blob(u16 key,
|
static inline void fw_cfg_read_blob(u16 key,
|
||||||
void *buf, loff_t pos, size_t count)
|
void *buf, loff_t pos, size_t count)
|
||||||
{
|
{
|
||||||
u32 glk;
|
u32 glk = -1U;
|
||||||
acpi_status status;
|
acpi_status status;
|
||||||
|
|
||||||
/* If we have ACPI, ensure mutual exclusion against any potential
|
/* If we have ACPI, ensure mutual exclusion against any potential
|
||||||
|
|
|
@ -196,44 +196,6 @@ static int gpio_rcar_irq_set_wake(struct irq_data *d, unsigned int on)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gpio_rcar_irq_bus_lock(struct irq_data *d)
|
|
||||||
{
|
|
||||||
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
|
||||||
struct gpio_rcar_priv *p = gpiochip_get_data(gc);
|
|
||||||
|
|
||||||
pm_runtime_get_sync(&p->pdev->dev);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void gpio_rcar_irq_bus_sync_unlock(struct irq_data *d)
|
|
||||||
{
|
|
||||||
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
|
||||||
struct gpio_rcar_priv *p = gpiochip_get_data(gc);
|
|
||||||
|
|
||||||
pm_runtime_put(&p->pdev->dev);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static int gpio_rcar_irq_request_resources(struct irq_data *d)
|
|
||||||
{
|
|
||||||
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
|
||||||
struct gpio_rcar_priv *p = gpiochip_get_data(gc);
|
|
||||||
int error;
|
|
||||||
|
|
||||||
error = pm_runtime_get_sync(&p->pdev->dev);
|
|
||||||
if (error < 0)
|
|
||||||
return error;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void gpio_rcar_irq_release_resources(struct irq_data *d)
|
|
||||||
{
|
|
||||||
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
|
||||||
struct gpio_rcar_priv *p = gpiochip_get_data(gc);
|
|
||||||
|
|
||||||
pm_runtime_put(&p->pdev->dev);
|
|
||||||
}
|
|
||||||
|
|
||||||
static irqreturn_t gpio_rcar_irq_handler(int irq, void *dev_id)
|
static irqreturn_t gpio_rcar_irq_handler(int irq, void *dev_id)
|
||||||
{
|
{
|
||||||
struct gpio_rcar_priv *p = dev_id;
|
struct gpio_rcar_priv *p = dev_id;
|
||||||
|
@ -280,32 +242,18 @@ static void gpio_rcar_config_general_input_output_mode(struct gpio_chip *chip,
|
||||||
|
|
||||||
static int gpio_rcar_request(struct gpio_chip *chip, unsigned offset)
|
static int gpio_rcar_request(struct gpio_chip *chip, unsigned offset)
|
||||||
{
|
{
|
||||||
struct gpio_rcar_priv *p = gpiochip_get_data(chip);
|
return pinctrl_request_gpio(chip->base + offset);
|
||||||
int error;
|
|
||||||
|
|
||||||
error = pm_runtime_get_sync(&p->pdev->dev);
|
|
||||||
if (error < 0)
|
|
||||||
return error;
|
|
||||||
|
|
||||||
error = pinctrl_request_gpio(chip->base + offset);
|
|
||||||
if (error)
|
|
||||||
pm_runtime_put(&p->pdev->dev);
|
|
||||||
|
|
||||||
return error;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void gpio_rcar_free(struct gpio_chip *chip, unsigned offset)
|
static void gpio_rcar_free(struct gpio_chip *chip, unsigned offset)
|
||||||
{
|
{
|
||||||
struct gpio_rcar_priv *p = gpiochip_get_data(chip);
|
|
||||||
|
|
||||||
pinctrl_free_gpio(chip->base + offset);
|
pinctrl_free_gpio(chip->base + offset);
|
||||||
|
|
||||||
/* Set the GPIO as an input to ensure that the next GPIO request won't
|
/*
|
||||||
|
* Set the GPIO as an input to ensure that the next GPIO request won't
|
||||||
* drive the GPIO pin as an output.
|
* drive the GPIO pin as an output.
|
||||||
*/
|
*/
|
||||||
gpio_rcar_config_general_input_output_mode(chip, offset, false);
|
gpio_rcar_config_general_input_output_mode(chip, offset, false);
|
||||||
|
|
||||||
pm_runtime_put(&p->pdev->dev);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int gpio_rcar_direction_input(struct gpio_chip *chip, unsigned offset)
|
static int gpio_rcar_direction_input(struct gpio_chip *chip, unsigned offset)
|
||||||
|
@ -452,6 +400,7 @@ static int gpio_rcar_probe(struct platform_device *pdev)
|
||||||
}
|
}
|
||||||
|
|
||||||
pm_runtime_enable(dev);
|
pm_runtime_enable(dev);
|
||||||
|
pm_runtime_get_sync(dev);
|
||||||
|
|
||||||
io = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
io = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||||
irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
|
irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
|
||||||
|
@ -488,10 +437,6 @@ static int gpio_rcar_probe(struct platform_device *pdev)
|
||||||
irq_chip->irq_unmask = gpio_rcar_irq_enable;
|
irq_chip->irq_unmask = gpio_rcar_irq_enable;
|
||||||
irq_chip->irq_set_type = gpio_rcar_irq_set_type;
|
irq_chip->irq_set_type = gpio_rcar_irq_set_type;
|
||||||
irq_chip->irq_set_wake = gpio_rcar_irq_set_wake;
|
irq_chip->irq_set_wake = gpio_rcar_irq_set_wake;
|
||||||
irq_chip->irq_bus_lock = gpio_rcar_irq_bus_lock;
|
|
||||||
irq_chip->irq_bus_sync_unlock = gpio_rcar_irq_bus_sync_unlock;
|
|
||||||
irq_chip->irq_request_resources = gpio_rcar_irq_request_resources;
|
|
||||||
irq_chip->irq_release_resources = gpio_rcar_irq_release_resources;
|
|
||||||
irq_chip->flags = IRQCHIP_SET_TYPE_MASKED | IRQCHIP_MASK_ON_SUSPEND;
|
irq_chip->flags = IRQCHIP_SET_TYPE_MASKED | IRQCHIP_MASK_ON_SUSPEND;
|
||||||
|
|
||||||
ret = gpiochip_add_data(gpio_chip, p);
|
ret = gpiochip_add_data(gpio_chip, p);
|
||||||
|
@ -522,6 +467,7 @@ static int gpio_rcar_probe(struct platform_device *pdev)
|
||||||
err1:
|
err1:
|
||||||
gpiochip_remove(gpio_chip);
|
gpiochip_remove(gpio_chip);
|
||||||
err0:
|
err0:
|
||||||
|
pm_runtime_put(dev);
|
||||||
pm_runtime_disable(dev);
|
pm_runtime_disable(dev);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -532,6 +478,7 @@ static int gpio_rcar_remove(struct platform_device *pdev)
|
||||||
|
|
||||||
gpiochip_remove(&p->gpio_chip);
|
gpiochip_remove(&p->gpio_chip);
|
||||||
|
|
||||||
|
pm_runtime_put(&pdev->dev);
|
||||||
pm_runtime_disable(&pdev->dev);
|
pm_runtime_disable(&pdev->dev);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -977,7 +977,7 @@ bool acpi_can_fallback_to_crs(struct acpi_device *adev, const char *con_id)
|
||||||
lookup = kmalloc(sizeof(*lookup), GFP_KERNEL);
|
lookup = kmalloc(sizeof(*lookup), GFP_KERNEL);
|
||||||
if (lookup) {
|
if (lookup) {
|
||||||
lookup->adev = adev;
|
lookup->adev = adev;
|
||||||
lookup->con_id = con_id;
|
lookup->con_id = kstrdup(con_id, GFP_KERNEL);
|
||||||
list_add_tail(&lookup->node, &acpi_crs_lookup_list);
|
list_add_tail(&lookup->node, &acpi_crs_lookup_list);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -541,6 +541,7 @@ int amdgpu_bo_set_metadata (struct amdgpu_bo *bo, void *metadata,
|
||||||
if (!metadata_size) {
|
if (!metadata_size) {
|
||||||
if (bo->metadata_size) {
|
if (bo->metadata_size) {
|
||||||
kfree(bo->metadata);
|
kfree(bo->metadata);
|
||||||
|
bo->metadata = NULL;
|
||||||
bo->metadata_size = 0;
|
bo->metadata_size = 0;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -298,6 +298,10 @@ bool amdgpu_atombios_encoder_mode_fixup(struct drm_encoder *encoder,
|
||||||
&& (mode->crtc_vsync_start < (mode->crtc_vdisplay + 2)))
|
&& (mode->crtc_vsync_start < (mode->crtc_vdisplay + 2)))
|
||||||
adjusted_mode->crtc_vsync_start = adjusted_mode->crtc_vdisplay + 2;
|
adjusted_mode->crtc_vsync_start = adjusted_mode->crtc_vdisplay + 2;
|
||||||
|
|
||||||
|
/* vertical FP must be at least 1 */
|
||||||
|
if (mode->crtc_vsync_start == mode->crtc_vdisplay)
|
||||||
|
adjusted_mode->crtc_vsync_start++;
|
||||||
|
|
||||||
/* get the native mode for scaling */
|
/* get the native mode for scaling */
|
||||||
if (amdgpu_encoder->active_device & (ATOM_DEVICE_LCD_SUPPORT))
|
if (amdgpu_encoder->active_device & (ATOM_DEVICE_LCD_SUPPORT))
|
||||||
amdgpu_panel_mode_fixup(encoder, adjusted_mode);
|
amdgpu_panel_mode_fixup(encoder, adjusted_mode);
|
||||||
|
|
|
@ -792,7 +792,7 @@ static int i915_drm_resume(struct drm_device *dev)
|
||||||
static int i915_drm_resume_early(struct drm_device *dev)
|
static int i915_drm_resume_early(struct drm_device *dev)
|
||||||
{
|
{
|
||||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||||
int ret = 0;
|
int ret;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We have a resume ordering issue with the snd-hda driver also
|
* We have a resume ordering issue with the snd-hda driver also
|
||||||
|
@ -803,6 +803,36 @@ static int i915_drm_resume_early(struct drm_device *dev)
|
||||||
* FIXME: This should be solved with a special hdmi sink device or
|
* FIXME: This should be solved with a special hdmi sink device or
|
||||||
* similar so that power domains can be employed.
|
* similar so that power domains can be employed.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Note that we need to set the power state explicitly, since we
|
||||||
|
* powered off the device during freeze and the PCI core won't power
|
||||||
|
* it back up for us during thaw. Powering off the device during
|
||||||
|
* freeze is not a hard requirement though, and during the
|
||||||
|
* suspend/resume phases the PCI core makes sure we get here with the
|
||||||
|
* device powered on. So in case we change our freeze logic and keep
|
||||||
|
* the device powered we can also remove the following set power state
|
||||||
|
* call.
|
||||||
|
*/
|
||||||
|
ret = pci_set_power_state(dev->pdev, PCI_D0);
|
||||||
|
if (ret) {
|
||||||
|
DRM_ERROR("failed to set PCI D0 power state (%d)\n", ret);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Note that pci_enable_device() first enables any parent bridge
|
||||||
|
* device and only then sets the power state for this device. The
|
||||||
|
* bridge enabling is a nop though, since bridge devices are resumed
|
||||||
|
* first. The order of enabling power and enabling the device is
|
||||||
|
* imposed by the PCI core as described above, so here we preserve the
|
||||||
|
* same order for the freeze/thaw phases.
|
||||||
|
*
|
||||||
|
* TODO: eventually we should remove pci_disable_device() /
|
||||||
|
* pci_enable_enable_device() from suspend/resume. Due to how they
|
||||||
|
* depend on the device enable refcount we can't anyway depend on them
|
||||||
|
* disabling/enabling the device.
|
||||||
|
*/
|
||||||
if (pci_enable_device(dev->pdev)) {
|
if (pci_enable_device(dev->pdev)) {
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
goto out;
|
goto out;
|
||||||
|
|
|
@ -2907,7 +2907,14 @@ enum skl_disp_power_wells {
|
||||||
#define GEN6_RP_STATE_CAP _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5998)
|
#define GEN6_RP_STATE_CAP _MMIO(MCHBAR_MIRROR_BASE_SNB + 0x5998)
|
||||||
#define BXT_RP_STATE_CAP _MMIO(0x138170)
|
#define BXT_RP_STATE_CAP _MMIO(0x138170)
|
||||||
|
|
||||||
#define INTERVAL_1_28_US(us) (((us) * 100) >> 7)
|
/*
|
||||||
|
* Make these a multiple of magic 25 to avoid SNB (eg. Dell XPS
|
||||||
|
* 8300) freezing up around GPU hangs. Looks as if even
|
||||||
|
* scheduling/timer interrupts start misbehaving if the RPS
|
||||||
|
* EI/thresholds are "bad", leading to a very sluggish or even
|
||||||
|
* frozen machine.
|
||||||
|
*/
|
||||||
|
#define INTERVAL_1_28_US(us) roundup(((us) * 100) >> 7, 25)
|
||||||
#define INTERVAL_1_33_US(us) (((us) * 3) >> 2)
|
#define INTERVAL_1_33_US(us) (((us) * 3) >> 2)
|
||||||
#define INTERVAL_0_833_US(us) (((us) * 6) / 5)
|
#define INTERVAL_0_833_US(us) (((us) * 6) / 5)
|
||||||
#define GT_INTERVAL_FROM_US(dev_priv, us) (IS_GEN9(dev_priv) ? \
|
#define GT_INTERVAL_FROM_US(dev_priv, us) (IS_GEN9(dev_priv) ? \
|
||||||
|
|
|
@ -443,9 +443,17 @@ void intel_prepare_ddi_buffer(struct intel_encoder *encoder)
|
||||||
} else if (IS_BROADWELL(dev_priv)) {
|
} else if (IS_BROADWELL(dev_priv)) {
|
||||||
ddi_translations_fdi = bdw_ddi_translations_fdi;
|
ddi_translations_fdi = bdw_ddi_translations_fdi;
|
||||||
ddi_translations_dp = bdw_ddi_translations_dp;
|
ddi_translations_dp = bdw_ddi_translations_dp;
|
||||||
ddi_translations_edp = bdw_ddi_translations_edp;
|
|
||||||
|
if (dev_priv->edp_low_vswing) {
|
||||||
|
ddi_translations_edp = bdw_ddi_translations_edp;
|
||||||
|
n_edp_entries = ARRAY_SIZE(bdw_ddi_translations_edp);
|
||||||
|
} else {
|
||||||
|
ddi_translations_edp = bdw_ddi_translations_dp;
|
||||||
|
n_edp_entries = ARRAY_SIZE(bdw_ddi_translations_dp);
|
||||||
|
}
|
||||||
|
|
||||||
ddi_translations_hdmi = bdw_ddi_translations_hdmi;
|
ddi_translations_hdmi = bdw_ddi_translations_hdmi;
|
||||||
n_edp_entries = ARRAY_SIZE(bdw_ddi_translations_edp);
|
|
||||||
n_dp_entries = ARRAY_SIZE(bdw_ddi_translations_dp);
|
n_dp_entries = ARRAY_SIZE(bdw_ddi_translations_dp);
|
||||||
n_hdmi_entries = ARRAY_SIZE(bdw_ddi_translations_hdmi);
|
n_hdmi_entries = ARRAY_SIZE(bdw_ddi_translations_hdmi);
|
||||||
hdmi_default_entry = 7;
|
hdmi_default_entry = 7;
|
||||||
|
@ -3201,12 +3209,6 @@ void intel_ddi_get_config(struct intel_encoder *encoder,
|
||||||
intel_ddi_clock_get(encoder, pipe_config);
|
intel_ddi_clock_get(encoder, pipe_config);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void intel_ddi_destroy(struct drm_encoder *encoder)
|
|
||||||
{
|
|
||||||
/* HDMI has nothing special to destroy, so we can go with this. */
|
|
||||||
intel_dp_encoder_destroy(encoder);
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool intel_ddi_compute_config(struct intel_encoder *encoder,
|
static bool intel_ddi_compute_config(struct intel_encoder *encoder,
|
||||||
struct intel_crtc_state *pipe_config)
|
struct intel_crtc_state *pipe_config)
|
||||||
{
|
{
|
||||||
|
@ -3225,7 +3227,8 @@ static bool intel_ddi_compute_config(struct intel_encoder *encoder,
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct drm_encoder_funcs intel_ddi_funcs = {
|
static const struct drm_encoder_funcs intel_ddi_funcs = {
|
||||||
.destroy = intel_ddi_destroy,
|
.reset = intel_dp_encoder_reset,
|
||||||
|
.destroy = intel_dp_encoder_destroy,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct intel_connector *
|
static struct intel_connector *
|
||||||
|
@ -3324,6 +3327,7 @@ void intel_ddi_init(struct drm_device *dev, enum port port)
|
||||||
intel_encoder->post_disable = intel_ddi_post_disable;
|
intel_encoder->post_disable = intel_ddi_post_disable;
|
||||||
intel_encoder->get_hw_state = intel_ddi_get_hw_state;
|
intel_encoder->get_hw_state = intel_ddi_get_hw_state;
|
||||||
intel_encoder->get_config = intel_ddi_get_config;
|
intel_encoder->get_config = intel_ddi_get_config;
|
||||||
|
intel_encoder->suspend = intel_dp_encoder_suspend;
|
||||||
|
|
||||||
intel_dig_port->port = port;
|
intel_dig_port->port = port;
|
||||||
intel_dig_port->saved_port_bits = I915_READ(DDI_BUF_CTL(port)) &
|
intel_dig_port->saved_port_bits = I915_READ(DDI_BUF_CTL(port)) &
|
||||||
|
|
|
@ -13351,6 +13351,9 @@ static int intel_atomic_prepare_commit(struct drm_device *dev,
|
||||||
}
|
}
|
||||||
|
|
||||||
for_each_crtc_in_state(state, crtc, crtc_state, i) {
|
for_each_crtc_in_state(state, crtc, crtc_state, i) {
|
||||||
|
if (state->legacy_cursor_update)
|
||||||
|
continue;
|
||||||
|
|
||||||
ret = intel_crtc_wait_for_pending_flips(crtc);
|
ret = intel_crtc_wait_for_pending_flips(crtc);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -4898,7 +4898,7 @@ void intel_dp_encoder_destroy(struct drm_encoder *encoder)
|
||||||
kfree(intel_dig_port);
|
kfree(intel_dig_port);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void intel_dp_encoder_suspend(struct intel_encoder *intel_encoder)
|
void intel_dp_encoder_suspend(struct intel_encoder *intel_encoder)
|
||||||
{
|
{
|
||||||
struct intel_dp *intel_dp = enc_to_intel_dp(&intel_encoder->base);
|
struct intel_dp *intel_dp = enc_to_intel_dp(&intel_encoder->base);
|
||||||
|
|
||||||
|
@ -4940,7 +4940,7 @@ static void intel_edp_panel_vdd_sanitize(struct intel_dp *intel_dp)
|
||||||
edp_panel_vdd_schedule_off(intel_dp);
|
edp_panel_vdd_schedule_off(intel_dp);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void intel_dp_encoder_reset(struct drm_encoder *encoder)
|
void intel_dp_encoder_reset(struct drm_encoder *encoder)
|
||||||
{
|
{
|
||||||
struct intel_dp *intel_dp;
|
struct intel_dp *intel_dp;
|
||||||
|
|
||||||
|
|
|
@ -1238,6 +1238,8 @@ void intel_dp_set_link_params(struct intel_dp *intel_dp,
|
||||||
void intel_dp_start_link_train(struct intel_dp *intel_dp);
|
void intel_dp_start_link_train(struct intel_dp *intel_dp);
|
||||||
void intel_dp_stop_link_train(struct intel_dp *intel_dp);
|
void intel_dp_stop_link_train(struct intel_dp *intel_dp);
|
||||||
void intel_dp_sink_dpms(struct intel_dp *intel_dp, int mode);
|
void intel_dp_sink_dpms(struct intel_dp *intel_dp, int mode);
|
||||||
|
void intel_dp_encoder_reset(struct drm_encoder *encoder);
|
||||||
|
void intel_dp_encoder_suspend(struct intel_encoder *intel_encoder);
|
||||||
void intel_dp_encoder_destroy(struct drm_encoder *encoder);
|
void intel_dp_encoder_destroy(struct drm_encoder *encoder);
|
||||||
int intel_dp_sink_crc(struct intel_dp *intel_dp, u8 *crc);
|
int intel_dp_sink_crc(struct intel_dp *intel_dp, u8 *crc);
|
||||||
bool intel_dp_compute_config(struct intel_encoder *encoder,
|
bool intel_dp_compute_config(struct intel_encoder *encoder,
|
||||||
|
|
|
@ -1415,8 +1415,16 @@ intel_hdmi_detect(struct drm_connector *connector, bool force)
|
||||||
hdmi_to_dig_port(intel_hdmi));
|
hdmi_to_dig_port(intel_hdmi));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!live_status)
|
if (!live_status) {
|
||||||
DRM_DEBUG_KMS("Live status not up!");
|
DRM_DEBUG_KMS("HDMI live status down\n");
|
||||||
|
/*
|
||||||
|
* Live status register is not reliable on all intel platforms.
|
||||||
|
* So consider live_status only for certain platforms, for
|
||||||
|
* others, read EDID to determine presence of sink.
|
||||||
|
*/
|
||||||
|
if (INTEL_INFO(dev_priv)->gen < 7 || IS_IVYBRIDGE(dev_priv))
|
||||||
|
live_status = true;
|
||||||
|
}
|
||||||
|
|
||||||
intel_hdmi_unset_edid(connector);
|
intel_hdmi_unset_edid(connector);
|
||||||
|
|
||||||
|
|
|
@ -310,6 +310,10 @@ static bool radeon_atom_mode_fixup(struct drm_encoder *encoder,
|
||||||
&& (mode->crtc_vsync_start < (mode->crtc_vdisplay + 2)))
|
&& (mode->crtc_vsync_start < (mode->crtc_vdisplay + 2)))
|
||||||
adjusted_mode->crtc_vsync_start = adjusted_mode->crtc_vdisplay + 2;
|
adjusted_mode->crtc_vsync_start = adjusted_mode->crtc_vdisplay + 2;
|
||||||
|
|
||||||
|
/* vertical FP must be at least 1 */
|
||||||
|
if (mode->crtc_vsync_start == mode->crtc_vdisplay)
|
||||||
|
adjusted_mode->crtc_vsync_start++;
|
||||||
|
|
||||||
/* get the native mode for scaling */
|
/* get the native mode for scaling */
|
||||||
if (radeon_encoder->active_device & (ATOM_DEVICE_LCD_SUPPORT)) {
|
if (radeon_encoder->active_device & (ATOM_DEVICE_LCD_SUPPORT)) {
|
||||||
radeon_panel_mode_fixup(encoder, adjusted_mode);
|
radeon_panel_mode_fixup(encoder, adjusted_mode);
|
||||||
|
|
|
@ -1068,7 +1068,6 @@ static int ipu_add_client_devices(struct ipu_soc *ipu, unsigned long ipu_base)
|
||||||
goto err_register;
|
goto err_register;
|
||||||
}
|
}
|
||||||
|
|
||||||
pdev->dev.of_node = of_node;
|
|
||||||
pdev->dev.parent = dev;
|
pdev->dev.parent = dev;
|
||||||
|
|
||||||
ret = platform_device_add_data(pdev, ®->pdata,
|
ret = platform_device_add_data(pdev, ®->pdata,
|
||||||
|
@ -1079,6 +1078,12 @@ static int ipu_add_client_devices(struct ipu_soc *ipu, unsigned long ipu_base)
|
||||||
platform_device_put(pdev);
|
platform_device_put(pdev);
|
||||||
goto err_register;
|
goto err_register;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set of_node only after calling platform_device_add. Otherwise
|
||||||
|
* the platform:imx-ipuv3-crtc modalias won't be used.
|
||||||
|
*/
|
||||||
|
pdev->dev.of_node = of_node;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -259,6 +259,7 @@
|
||||||
#define USB_DEVICE_ID_CORSAIR_K90 0x1b02
|
#define USB_DEVICE_ID_CORSAIR_K90 0x1b02
|
||||||
|
|
||||||
#define USB_VENDOR_ID_CREATIVELABS 0x041e
|
#define USB_VENDOR_ID_CREATIVELABS 0x041e
|
||||||
|
#define USB_DEVICE_ID_CREATIVE_SB_OMNI_SURROUND_51 0x322c
|
||||||
#define USB_DEVICE_ID_PRODIKEYS_PCMIDI 0x2801
|
#define USB_DEVICE_ID_PRODIKEYS_PCMIDI 0x2801
|
||||||
|
|
||||||
#define USB_VENDOR_ID_CVTOUCH 0x1ff7
|
#define USB_VENDOR_ID_CVTOUCH 0x1ff7
|
||||||
|
|
|
@ -71,6 +71,7 @@ static const struct hid_blacklist {
|
||||||
{ USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_3AXIS_5BUTTON_STICK, HID_QUIRK_NOGET },
|
{ USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_3AXIS_5BUTTON_STICK, HID_QUIRK_NOGET },
|
||||||
{ USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_AXIS_295, HID_QUIRK_NOGET },
|
{ USB_VENDOR_ID_CH, USB_DEVICE_ID_CH_AXIS_295, HID_QUIRK_NOGET },
|
||||||
{ USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_PIXART_USB_OPTICAL_MOUSE, HID_QUIRK_ALWAYS_POLL },
|
{ USB_VENDOR_ID_CHICONY, USB_DEVICE_ID_CHICONY_PIXART_USB_OPTICAL_MOUSE, HID_QUIRK_ALWAYS_POLL },
|
||||||
|
{ USB_VENDOR_ID_CREATIVELABS, USB_DEVICE_ID_CREATIVE_SB_OMNI_SURROUND_51, HID_QUIRK_NOGET },
|
||||||
{ USB_VENDOR_ID_DMI, USB_DEVICE_ID_DMI_ENC, HID_QUIRK_NOGET },
|
{ USB_VENDOR_ID_DMI, USB_DEVICE_ID_DMI_ENC, HID_QUIRK_NOGET },
|
||||||
{ USB_VENDOR_ID_DRAGONRISE, USB_DEVICE_ID_DRAGONRISE_WIIU, HID_QUIRK_MULTI_INPUT },
|
{ USB_VENDOR_ID_DRAGONRISE, USB_DEVICE_ID_DRAGONRISE_WIIU, HID_QUIRK_MULTI_INPUT },
|
||||||
{ USB_VENDOR_ID_ELAN, HID_ANY_ID, HID_QUIRK_ALWAYS_POLL },
|
{ USB_VENDOR_ID_ELAN, HID_ANY_ID, HID_QUIRK_ALWAYS_POLL },
|
||||||
|
|
|
@ -684,6 +684,7 @@ static int wacom_intuos_inout(struct wacom_wac *wacom)
|
||||||
|
|
||||||
wacom->tool[idx] = wacom_intuos_get_tool_type(wacom->id[idx]);
|
wacom->tool[idx] = wacom_intuos_get_tool_type(wacom->id[idx]);
|
||||||
|
|
||||||
|
wacom->shared->stylus_in_proximity = true;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3395,6 +3396,10 @@ static const struct wacom_features wacom_features_0x33E =
|
||||||
{ "Wacom Intuos PT M 2", 21600, 13500, 2047, 63,
|
{ "Wacom Intuos PT M 2", 21600, 13500, 2047, 63,
|
||||||
INTUOSHT2, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 16,
|
INTUOSHT2, WACOM_INTUOS_RES, WACOM_INTUOS_RES, .touch_max = 16,
|
||||||
.check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
|
.check_for_hid_type = true, .hid_type = HID_TYPE_USBNONE };
|
||||||
|
static const struct wacom_features wacom_features_0x343 =
|
||||||
|
{ "Wacom DTK1651", 34616, 19559, 1023, 0,
|
||||||
|
DTUS, WACOM_INTUOS_RES, WACOM_INTUOS_RES, 4,
|
||||||
|
WACOM_DTU_OFFSET, WACOM_DTU_OFFSET };
|
||||||
|
|
||||||
static const struct wacom_features wacom_features_HID_ANY_ID =
|
static const struct wacom_features wacom_features_HID_ANY_ID =
|
||||||
{ "Wacom HID", .type = HID_GENERIC };
|
{ "Wacom HID", .type = HID_GENERIC };
|
||||||
|
@ -3560,6 +3565,7 @@ const struct hid_device_id wacom_ids[] = {
|
||||||
{ USB_DEVICE_WACOM(0x33C) },
|
{ USB_DEVICE_WACOM(0x33C) },
|
||||||
{ USB_DEVICE_WACOM(0x33D) },
|
{ USB_DEVICE_WACOM(0x33D) },
|
||||||
{ USB_DEVICE_WACOM(0x33E) },
|
{ USB_DEVICE_WACOM(0x33E) },
|
||||||
|
{ USB_DEVICE_WACOM(0x343) },
|
||||||
{ USB_DEVICE_WACOM(0x4001) },
|
{ USB_DEVICE_WACOM(0x4001) },
|
||||||
{ USB_DEVICE_WACOM(0x4004) },
|
{ USB_DEVICE_WACOM(0x4004) },
|
||||||
{ USB_DEVICE_WACOM(0x5000) },
|
{ USB_DEVICE_WACOM(0x5000) },
|
||||||
|
|
|
@ -103,15 +103,29 @@ static bool hv_need_to_signal(u32 old_write, struct hv_ring_buffer_info *rbi)
|
||||||
* there is room for the producer to send the pending packet.
|
* there is room for the producer to send the pending packet.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static bool hv_need_to_signal_on_read(u32 prev_write_sz,
|
static bool hv_need_to_signal_on_read(struct hv_ring_buffer_info *rbi)
|
||||||
struct hv_ring_buffer_info *rbi)
|
|
||||||
{
|
{
|
||||||
u32 cur_write_sz;
|
u32 cur_write_sz;
|
||||||
u32 r_size;
|
u32 r_size;
|
||||||
u32 write_loc = rbi->ring_buffer->write_index;
|
u32 write_loc;
|
||||||
u32 read_loc = rbi->ring_buffer->read_index;
|
u32 read_loc = rbi->ring_buffer->read_index;
|
||||||
u32 pending_sz = rbi->ring_buffer->pending_send_sz;
|
u32 pending_sz;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Issue a full memory barrier before making the signaling decision.
|
||||||
|
* Here is the reason for having this barrier:
|
||||||
|
* If the reading of the pend_sz (in this function)
|
||||||
|
* were to be reordered and read before we commit the new read
|
||||||
|
* index (in the calling function) we could
|
||||||
|
* have a problem. If the host were to set the pending_sz after we
|
||||||
|
* have sampled pending_sz and go to sleep before we commit the
|
||||||
|
* read index, we could miss sending the interrupt. Issue a full
|
||||||
|
* memory barrier to address this.
|
||||||
|
*/
|
||||||
|
mb();
|
||||||
|
|
||||||
|
pending_sz = rbi->ring_buffer->pending_send_sz;
|
||||||
|
write_loc = rbi->ring_buffer->write_index;
|
||||||
/* If the other end is not blocked on write don't bother. */
|
/* If the other end is not blocked on write don't bother. */
|
||||||
if (pending_sz == 0)
|
if (pending_sz == 0)
|
||||||
return false;
|
return false;
|
||||||
|
@ -120,7 +134,7 @@ static bool hv_need_to_signal_on_read(u32 prev_write_sz,
|
||||||
cur_write_sz = write_loc >= read_loc ? r_size - (write_loc - read_loc) :
|
cur_write_sz = write_loc >= read_loc ? r_size - (write_loc - read_loc) :
|
||||||
read_loc - write_loc;
|
read_loc - write_loc;
|
||||||
|
|
||||||
if ((prev_write_sz < pending_sz) && (cur_write_sz >= pending_sz))
|
if (cur_write_sz >= pending_sz)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
|
@ -455,7 +469,7 @@ int hv_ringbuffer_read(struct hv_ring_buffer_info *inring_info,
|
||||||
/* Update the read index */
|
/* Update the read index */
|
||||||
hv_set_next_read_location(inring_info, next_read_location);
|
hv_set_next_read_location(inring_info, next_read_location);
|
||||||
|
|
||||||
*signal = hv_need_to_signal_on_read(bytes_avail_towrite, inring_info);
|
*signal = hv_need_to_signal_on_read(inring_info);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -451,6 +451,8 @@ static int at91_adc_probe(struct platform_device *pdev)
|
||||||
if (ret)
|
if (ret)
|
||||||
goto vref_disable;
|
goto vref_disable;
|
||||||
|
|
||||||
|
platform_set_drvdata(pdev, indio_dev);
|
||||||
|
|
||||||
ret = iio_device_register(indio_dev);
|
ret = iio_device_register(indio_dev);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto per_clk_disable_unprepare;
|
goto per_clk_disable_unprepare;
|
||||||
|
|
|
@ -104,6 +104,19 @@ static int inv_mpu6050_deselect_bypass(struct i2c_adapter *adap,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static const char *inv_mpu_match_acpi_device(struct device *dev, int *chip_id)
|
||||||
|
{
|
||||||
|
const struct acpi_device_id *id;
|
||||||
|
|
||||||
|
id = acpi_match_device(dev->driver->acpi_match_table, dev);
|
||||||
|
if (!id)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
*chip_id = (int)id->driver_data;
|
||||||
|
|
||||||
|
return dev_name(dev);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* inv_mpu_probe() - probe function.
|
* inv_mpu_probe() - probe function.
|
||||||
* @client: i2c client.
|
* @client: i2c client.
|
||||||
|
@ -115,14 +128,25 @@ static int inv_mpu_probe(struct i2c_client *client,
|
||||||
const struct i2c_device_id *id)
|
const struct i2c_device_id *id)
|
||||||
{
|
{
|
||||||
struct inv_mpu6050_state *st;
|
struct inv_mpu6050_state *st;
|
||||||
int result;
|
int result, chip_type;
|
||||||
const char *name = id ? id->name : NULL;
|
|
||||||
struct regmap *regmap;
|
struct regmap *regmap;
|
||||||
|
const char *name;
|
||||||
|
|
||||||
if (!i2c_check_functionality(client->adapter,
|
if (!i2c_check_functionality(client->adapter,
|
||||||
I2C_FUNC_SMBUS_I2C_BLOCK))
|
I2C_FUNC_SMBUS_I2C_BLOCK))
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
|
if (id) {
|
||||||
|
chip_type = (int)id->driver_data;
|
||||||
|
name = id->name;
|
||||||
|
} else if (ACPI_HANDLE(&client->dev)) {
|
||||||
|
name = inv_mpu_match_acpi_device(&client->dev, &chip_type);
|
||||||
|
if (!name)
|
||||||
|
return -ENODEV;
|
||||||
|
} else {
|
||||||
|
return -ENOSYS;
|
||||||
|
}
|
||||||
|
|
||||||
regmap = devm_regmap_init_i2c(client, &inv_mpu_regmap_config);
|
regmap = devm_regmap_init_i2c(client, &inv_mpu_regmap_config);
|
||||||
if (IS_ERR(regmap)) {
|
if (IS_ERR(regmap)) {
|
||||||
dev_err(&client->dev, "Failed to register i2c regmap %d\n",
|
dev_err(&client->dev, "Failed to register i2c regmap %d\n",
|
||||||
|
@ -131,7 +155,7 @@ static int inv_mpu_probe(struct i2c_client *client,
|
||||||
}
|
}
|
||||||
|
|
||||||
result = inv_mpu_core_probe(regmap, client->irq, name,
|
result = inv_mpu_core_probe(regmap, client->irq, name,
|
||||||
NULL, id->driver_data);
|
NULL, chip_type);
|
||||||
if (result < 0)
|
if (result < 0)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
|
|
|
@ -46,6 +46,7 @@ static int inv_mpu_probe(struct spi_device *spi)
|
||||||
struct regmap *regmap;
|
struct regmap *regmap;
|
||||||
const struct spi_device_id *id = spi_get_device_id(spi);
|
const struct spi_device_id *id = spi_get_device_id(spi);
|
||||||
const char *name = id ? id->name : NULL;
|
const char *name = id ? id->name : NULL;
|
||||||
|
const int chip_type = id ? id->driver_data : 0;
|
||||||
|
|
||||||
regmap = devm_regmap_init_spi(spi, &inv_mpu_regmap_config);
|
regmap = devm_regmap_init_spi(spi, &inv_mpu_regmap_config);
|
||||||
if (IS_ERR(regmap)) {
|
if (IS_ERR(regmap)) {
|
||||||
|
@ -55,7 +56,7 @@ static int inv_mpu_probe(struct spi_device *spi)
|
||||||
}
|
}
|
||||||
|
|
||||||
return inv_mpu_core_probe(regmap, spi->irq, name,
|
return inv_mpu_core_probe(regmap, spi->irq, name,
|
||||||
inv_mpu_i2c_disable, id->driver_data);
|
inv_mpu_i2c_disable, chip_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int inv_mpu_remove(struct spi_device *spi)
|
static int inv_mpu_remove(struct spi_device *spi)
|
||||||
|
|
|
@ -462,6 +462,8 @@ static int ak8975_setup_irq(struct ak8975_data *data)
|
||||||
int rc;
|
int rc;
|
||||||
int irq;
|
int irq;
|
||||||
|
|
||||||
|
init_waitqueue_head(&data->data_ready_queue);
|
||||||
|
clear_bit(0, &data->flags);
|
||||||
if (client->irq)
|
if (client->irq)
|
||||||
irq = client->irq;
|
irq = client->irq;
|
||||||
else
|
else
|
||||||
|
@ -477,8 +479,6 @@ static int ak8975_setup_irq(struct ak8975_data *data)
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
init_waitqueue_head(&data->data_ready_queue);
|
|
||||||
clear_bit(0, &data->flags);
|
|
||||||
data->eoc_irq = irq;
|
data->eoc_irq = irq;
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
|
@ -732,7 +732,7 @@ static int ak8975_probe(struct i2c_client *client,
|
||||||
int eoc_gpio;
|
int eoc_gpio;
|
||||||
int err;
|
int err;
|
||||||
const char *name = NULL;
|
const char *name = NULL;
|
||||||
enum asahi_compass_chipset chipset;
|
enum asahi_compass_chipset chipset = AK_MAX_TYPE;
|
||||||
|
|
||||||
/* Grab and set up the supplied GPIO. */
|
/* Grab and set up the supplied GPIO. */
|
||||||
if (client->dev.platform_data)
|
if (client->dev.platform_data)
|
||||||
|
|
|
@ -612,6 +612,7 @@ iscsi_iser_session_create(struct iscsi_endpoint *ep,
|
||||||
struct Scsi_Host *shost;
|
struct Scsi_Host *shost;
|
||||||
struct iser_conn *iser_conn = NULL;
|
struct iser_conn *iser_conn = NULL;
|
||||||
struct ib_conn *ib_conn;
|
struct ib_conn *ib_conn;
|
||||||
|
u32 max_fr_sectors;
|
||||||
u16 max_cmds;
|
u16 max_cmds;
|
||||||
|
|
||||||
shost = iscsi_host_alloc(&iscsi_iser_sht, 0, 0);
|
shost = iscsi_host_alloc(&iscsi_iser_sht, 0, 0);
|
||||||
|
@ -632,7 +633,6 @@ iscsi_iser_session_create(struct iscsi_endpoint *ep,
|
||||||
iser_conn = ep->dd_data;
|
iser_conn = ep->dd_data;
|
||||||
max_cmds = iser_conn->max_cmds;
|
max_cmds = iser_conn->max_cmds;
|
||||||
shost->sg_tablesize = iser_conn->scsi_sg_tablesize;
|
shost->sg_tablesize = iser_conn->scsi_sg_tablesize;
|
||||||
shost->max_sectors = iser_conn->scsi_max_sectors;
|
|
||||||
|
|
||||||
mutex_lock(&iser_conn->state_mutex);
|
mutex_lock(&iser_conn->state_mutex);
|
||||||
if (iser_conn->state != ISER_CONN_UP) {
|
if (iser_conn->state != ISER_CONN_UP) {
|
||||||
|
@ -657,8 +657,6 @@ iscsi_iser_session_create(struct iscsi_endpoint *ep,
|
||||||
*/
|
*/
|
||||||
shost->sg_tablesize = min_t(unsigned short, shost->sg_tablesize,
|
shost->sg_tablesize = min_t(unsigned short, shost->sg_tablesize,
|
||||||
ib_conn->device->ib_device->attrs.max_fast_reg_page_list_len);
|
ib_conn->device->ib_device->attrs.max_fast_reg_page_list_len);
|
||||||
shost->max_sectors = min_t(unsigned int,
|
|
||||||
1024, (shost->sg_tablesize * PAGE_SIZE) >> 9);
|
|
||||||
|
|
||||||
if (iscsi_host_add(shost,
|
if (iscsi_host_add(shost,
|
||||||
ib_conn->device->ib_device->dma_device)) {
|
ib_conn->device->ib_device->dma_device)) {
|
||||||
|
@ -672,6 +670,15 @@ iscsi_iser_session_create(struct iscsi_endpoint *ep,
|
||||||
goto free_host;
|
goto free_host;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FRs or FMRs can only map up to a (device) page per entry, but if the
|
||||||
|
* first entry is misaligned we'll end up using using two entries
|
||||||
|
* (head and tail) for a single page worth data, so we have to drop
|
||||||
|
* one segment from the calculation.
|
||||||
|
*/
|
||||||
|
max_fr_sectors = ((shost->sg_tablesize - 1) * PAGE_SIZE) >> 9;
|
||||||
|
shost->max_sectors = min(iser_max_sectors, max_fr_sectors);
|
||||||
|
|
||||||
if (cmds_max > max_cmds) {
|
if (cmds_max > max_cmds) {
|
||||||
iser_info("cmds_max changed from %u to %u\n",
|
iser_info("cmds_max changed from %u to %u\n",
|
||||||
cmds_max, max_cmds);
|
cmds_max, max_cmds);
|
||||||
|
@ -989,7 +996,6 @@ static struct scsi_host_template iscsi_iser_sht = {
|
||||||
.queuecommand = iscsi_queuecommand,
|
.queuecommand = iscsi_queuecommand,
|
||||||
.change_queue_depth = scsi_change_queue_depth,
|
.change_queue_depth = scsi_change_queue_depth,
|
||||||
.sg_tablesize = ISCSI_ISER_DEF_SG_TABLESIZE,
|
.sg_tablesize = ISCSI_ISER_DEF_SG_TABLESIZE,
|
||||||
.max_sectors = ISER_DEF_MAX_SECTORS,
|
|
||||||
.cmd_per_lun = ISER_DEF_CMD_PER_LUN,
|
.cmd_per_lun = ISER_DEF_CMD_PER_LUN,
|
||||||
.eh_abort_handler = iscsi_eh_abort,
|
.eh_abort_handler = iscsi_eh_abort,
|
||||||
.eh_device_reset_handler= iscsi_eh_device_reset,
|
.eh_device_reset_handler= iscsi_eh_device_reset,
|
||||||
|
|
|
@ -181,6 +181,14 @@ static void vibra_play_work(struct work_struct *work)
|
||||||
{
|
{
|
||||||
struct vibra_info *info = container_of(work,
|
struct vibra_info *info = container_of(work,
|
||||||
struct vibra_info, play_work);
|
struct vibra_info, play_work);
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
/* Do not allow effect, while the routing is set to use audio */
|
||||||
|
ret = twl6040_get_vibralr_status(info->twl6040);
|
||||||
|
if (ret & TWL6040_VIBSEL) {
|
||||||
|
dev_info(info->dev, "Vibra is configured for audio\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
mutex_lock(&info->mutex);
|
mutex_lock(&info->mutex);
|
||||||
|
|
||||||
|
@ -199,14 +207,6 @@ static int vibra_play(struct input_dev *input, void *data,
|
||||||
struct ff_effect *effect)
|
struct ff_effect *effect)
|
||||||
{
|
{
|
||||||
struct vibra_info *info = input_get_drvdata(input);
|
struct vibra_info *info = input_get_drvdata(input);
|
||||||
int ret;
|
|
||||||
|
|
||||||
/* Do not allow effect, while the routing is set to use audio */
|
|
||||||
ret = twl6040_get_vibralr_status(info->twl6040);
|
|
||||||
if (ret & TWL6040_VIBSEL) {
|
|
||||||
dev_info(&input->dev, "Vibra is configured for audio\n");
|
|
||||||
return -EBUSY;
|
|
||||||
}
|
|
||||||
|
|
||||||
info->weak_speed = effect->u.rumble.weak_magnitude;
|
info->weak_speed = effect->u.rumble.weak_magnitude;
|
||||||
info->strong_speed = effect->u.rumble.strong_magnitude;
|
info->strong_speed = effect->u.rumble.strong_magnitude;
|
||||||
|
|
|
@ -1093,6 +1093,19 @@ static int mxt_t6_command(struct mxt_data *data, u16 cmd_offset,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int mxt_acquire_irq(struct mxt_data *data)
|
||||||
|
{
|
||||||
|
int error;
|
||||||
|
|
||||||
|
enable_irq(data->irq);
|
||||||
|
|
||||||
|
error = mxt_process_messages_until_invalid(data);
|
||||||
|
if (error)
|
||||||
|
return error;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int mxt_soft_reset(struct mxt_data *data)
|
static int mxt_soft_reset(struct mxt_data *data)
|
||||||
{
|
{
|
||||||
struct device *dev = &data->client->dev;
|
struct device *dev = &data->client->dev;
|
||||||
|
@ -1111,7 +1124,7 @@ static int mxt_soft_reset(struct mxt_data *data)
|
||||||
/* Ignore CHG line for 100ms after reset */
|
/* Ignore CHG line for 100ms after reset */
|
||||||
msleep(100);
|
msleep(100);
|
||||||
|
|
||||||
enable_irq(data->irq);
|
mxt_acquire_irq(data);
|
||||||
|
|
||||||
ret = mxt_wait_for_completion(data, &data->reset_completion,
|
ret = mxt_wait_for_completion(data, &data->reset_completion,
|
||||||
MXT_RESET_TIMEOUT);
|
MXT_RESET_TIMEOUT);
|
||||||
|
@ -1466,19 +1479,6 @@ release_mem:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int mxt_acquire_irq(struct mxt_data *data)
|
|
||||||
{
|
|
||||||
int error;
|
|
||||||
|
|
||||||
enable_irq(data->irq);
|
|
||||||
|
|
||||||
error = mxt_process_messages_until_invalid(data);
|
|
||||||
if (error)
|
|
||||||
return error;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int mxt_get_info(struct mxt_data *data)
|
static int mxt_get_info(struct mxt_data *data)
|
||||||
{
|
{
|
||||||
struct i2c_client *client = data->client;
|
struct i2c_client *client = data->client;
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue