mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2025-01-06 05:06:29 +00:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
This commit is contained in:
commit
356d71e00d
22
Documentation/ABI/obsolete/sysfs-class-dax
Normal file
22
Documentation/ABI/obsolete/sysfs-class-dax
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
What: /sys/class/dax/
|
||||||
|
Date: May, 2016
|
||||||
|
KernelVersion: v4.7
|
||||||
|
Contact: linux-nvdimm@lists.01.org
|
||||||
|
Description: Device DAX is the device-centric analogue of Filesystem
|
||||||
|
DAX (CONFIG_FS_DAX). It allows memory ranges to be
|
||||||
|
allocated and mapped without need of an intervening file
|
||||||
|
system. Device DAX is strict, precise and predictable.
|
||||||
|
Specifically this interface:
|
||||||
|
|
||||||
|
1/ Guarantees fault granularity with respect to a given
|
||||||
|
page size (pte, pmd, or pud) set at configuration time.
|
||||||
|
|
||||||
|
2/ Enforces deterministic behavior by being strict about
|
||||||
|
what fault scenarios are supported.
|
||||||
|
|
||||||
|
The /sys/class/dax/ interface enumerates all the
|
||||||
|
device-dax instances in the system. The ABI is
|
||||||
|
deprecated and will be removed after 2020. It is
|
||||||
|
replaced with the DAX bus interface /sys/bus/dax/ where
|
||||||
|
device-dax instances can be found under
|
||||||
|
/sys/bus/dax/devices/
|
@ -86,6 +86,13 @@ Description:
|
|||||||
The unit size is one block, now only support configuring in range
|
The unit size is one block, now only support configuring in range
|
||||||
of [1, 512].
|
of [1, 512].
|
||||||
|
|
||||||
|
What: /sys/fs/f2fs/<disk>/umount_discard_timeout
|
||||||
|
Date: January 2019
|
||||||
|
Contact: "Jaegeuk Kim" <jaegeuk@kernel.org>
|
||||||
|
Description:
|
||||||
|
Set timeout to issue discard commands during umount.
|
||||||
|
Default: 5 secs
|
||||||
|
|
||||||
What: /sys/fs/f2fs/<disk>/max_victim_search
|
What: /sys/fs/f2fs/<disk>/max_victim_search
|
||||||
Date: January 2014
|
Date: January 2014
|
||||||
Contact: "Jaegeuk Kim" <jaegeuk.kim@samsung.com>
|
Contact: "Jaegeuk Kim" <jaegeuk.kim@samsung.com>
|
||||||
|
@ -756,3 +756,6 @@ These currently include:
|
|||||||
The cache mode for raid5. raid5 could include an extra disk for
|
The cache mode for raid5. raid5 could include an extra disk for
|
||||||
caching. The mode can be "write-throuth" and "write-back". The
|
caching. The mode can be "write-throuth" and "write-back". The
|
||||||
default is "write-through".
|
default is "write-through".
|
||||||
|
|
||||||
|
ppl_write_hint
|
||||||
|
NVMe stream ID to be set for each PPL write request.
|
||||||
|
@ -6,7 +6,7 @@ TL;DR summary
|
|||||||
* Use only NEON instructions, or VFP instructions that don't rely on support
|
* Use only NEON instructions, or VFP instructions that don't rely on support
|
||||||
code
|
code
|
||||||
* Isolate your NEON code in a separate compilation unit, and compile it with
|
* Isolate your NEON code in a separate compilation unit, and compile it with
|
||||||
'-mfpu=neon -mfloat-abi=softfp'
|
'-march=armv7-a -mfpu=neon -mfloat-abi=softfp'
|
||||||
* Put kernel_neon_begin() and kernel_neon_end() calls around the calls into your
|
* Put kernel_neon_begin() and kernel_neon_end() calls around the calls into your
|
||||||
NEON code
|
NEON code
|
||||||
* Don't sleep in your NEON code, and be aware that it will be executed with
|
* Don't sleep in your NEON code, and be aware that it will be executed with
|
||||||
@ -87,7 +87,7 @@ instructions appearing in unexpected places if no special care is taken.
|
|||||||
Therefore, the recommended and only supported way of using NEON/VFP in the
|
Therefore, the recommended and only supported way of using NEON/VFP in the
|
||||||
kernel is by adhering to the following rules:
|
kernel is by adhering to the following rules:
|
||||||
* isolate the NEON code in a separate compilation unit and compile it with
|
* isolate the NEON code in a separate compilation unit and compile it with
|
||||||
'-mfpu=neon -mfloat-abi=softfp';
|
'-march=armv7-a -mfpu=neon -mfloat-abi=softfp';
|
||||||
* issue the calls to kernel_neon_begin(), kernel_neon_end() as well as the calls
|
* issue the calls to kernel_neon_begin(), kernel_neon_end() as well as the calls
|
||||||
into the unit containing the NEON code from a compilation unit which is *not*
|
into the unit containing the NEON code from a compilation unit which is *not*
|
||||||
built with the GCC flag '-mfpu=neon' set.
|
built with the GCC flag '-mfpu=neon' set.
|
||||||
|
@ -36,7 +36,6 @@ ssd1307: oled@3c {
|
|||||||
reg = <0x3c>;
|
reg = <0x3c>;
|
||||||
pwms = <&pwm 4 3000>;
|
pwms = <&pwm 4 3000>;
|
||||||
reset-gpios = <&gpio2 7>;
|
reset-gpios = <&gpio2 7>;
|
||||||
reset-active-low;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
ssd1306: oled@3c {
|
ssd1306: oled@3c {
|
||||||
@ -44,7 +43,6 @@ ssd1306: oled@3c {
|
|||||||
reg = <0x3c>;
|
reg = <0x3c>;
|
||||||
pwms = <&pwm 4 3000>;
|
pwms = <&pwm 4 3000>;
|
||||||
reset-gpios = <&gpio2 7>;
|
reset-gpios = <&gpio2 7>;
|
||||||
reset-active-low;
|
|
||||||
solomon,com-lrremap;
|
solomon,com-lrremap;
|
||||||
solomon,com-invdir;
|
solomon,com-invdir;
|
||||||
solomon,com-offset = <32>;
|
solomon,com-offset = <32>;
|
||||||
|
@ -16,6 +16,7 @@ Required properties:
|
|||||||
- "renesas,irqc-r8a7793" (R-Car M2-N)
|
- "renesas,irqc-r8a7793" (R-Car M2-N)
|
||||||
- "renesas,irqc-r8a7794" (R-Car E2)
|
- "renesas,irqc-r8a7794" (R-Car E2)
|
||||||
- "renesas,intc-ex-r8a774a1" (RZ/G2M)
|
- "renesas,intc-ex-r8a774a1" (RZ/G2M)
|
||||||
|
- "renesas,intc-ex-r8a774c0" (RZ/G2E)
|
||||||
- "renesas,intc-ex-r8a7795" (R-Car H3)
|
- "renesas,intc-ex-r8a7795" (R-Car H3)
|
||||||
- "renesas,intc-ex-r8a7796" (R-Car M3-W)
|
- "renesas,intc-ex-r8a7796" (R-Car M3-W)
|
||||||
- "renesas,intc-ex-r8a77965" (R-Car M3-N)
|
- "renesas,intc-ex-r8a77965" (R-Car M3-N)
|
||||||
|
@ -12,10 +12,15 @@ Required properties:
|
|||||||
Subnodes:
|
Subnodes:
|
||||||
|
|
||||||
The integrated switch subnode should be specified according to the binding
|
The integrated switch subnode should be specified according to the binding
|
||||||
described in dsa/dsa.txt. As the QCA8K switches do not have a N:N mapping of
|
described in dsa/dsa.txt. If the QCA8K switch is connect to a SoC's external
|
||||||
port and PHY id, each subnode describing a port needs to have a valid phandle
|
mdio-bus each subnode describing a port needs to have a valid phandle
|
||||||
referencing the internal PHY connected to it. The CPU port of this switch is
|
referencing the internal PHY it is connected to. This is because there's no
|
||||||
always port 0.
|
N:N mapping of port and PHY id.
|
||||||
|
|
||||||
|
Don't use mixed external and internal mdio-bus configurations, as this is
|
||||||
|
not supported by the hardware.
|
||||||
|
|
||||||
|
The CPU port of this switch is always port 0.
|
||||||
|
|
||||||
A CPU port node has the following optional node:
|
A CPU port node has the following optional node:
|
||||||
|
|
||||||
@ -31,8 +36,9 @@ For QCA8K the 'fixed-link' sub-node supports only the following properties:
|
|||||||
- 'full-duplex' (boolean, optional), to indicate that full duplex is
|
- 'full-duplex' (boolean, optional), to indicate that full duplex is
|
||||||
used. When absent, half duplex is assumed.
|
used. When absent, half duplex is assumed.
|
||||||
|
|
||||||
Example:
|
Examples:
|
||||||
|
|
||||||
|
for the external mdio-bus configuration:
|
||||||
|
|
||||||
&mdio0 {
|
&mdio0 {
|
||||||
phy_port1: phy@0 {
|
phy_port1: phy@0 {
|
||||||
@ -55,12 +61,12 @@ Example:
|
|||||||
reg = <4>;
|
reg = <4>;
|
||||||
};
|
};
|
||||||
|
|
||||||
switch0@0 {
|
switch@10 {
|
||||||
compatible = "qca,qca8337";
|
compatible = "qca,qca8337";
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
|
|
||||||
reg = <0>;
|
reg = <0x10>;
|
||||||
|
|
||||||
ports {
|
ports {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
@ -108,3 +114,56 @@ Example:
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
for the internal master mdio-bus configuration:
|
||||||
|
|
||||||
|
&mdio0 {
|
||||||
|
switch@10 {
|
||||||
|
compatible = "qca,qca8337";
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
|
reg = <0x10>;
|
||||||
|
|
||||||
|
ports {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
|
||||||
|
port@0 {
|
||||||
|
reg = <0>;
|
||||||
|
label = "cpu";
|
||||||
|
ethernet = <&gmac1>;
|
||||||
|
phy-mode = "rgmii";
|
||||||
|
fixed-link {
|
||||||
|
speed = 1000;
|
||||||
|
full-duplex;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
port@1 {
|
||||||
|
reg = <1>;
|
||||||
|
label = "lan1";
|
||||||
|
};
|
||||||
|
|
||||||
|
port@2 {
|
||||||
|
reg = <2>;
|
||||||
|
label = "lan2";
|
||||||
|
};
|
||||||
|
|
||||||
|
port@3 {
|
||||||
|
reg = <3>;
|
||||||
|
label = "lan3";
|
||||||
|
};
|
||||||
|
|
||||||
|
port@4 {
|
||||||
|
reg = <4>;
|
||||||
|
label = "lan4";
|
||||||
|
};
|
||||||
|
|
||||||
|
port@5 {
|
||||||
|
reg = <5>;
|
||||||
|
label = "wan";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
@ -111,7 +111,8 @@ negotiated size) and send larger write sizes to modern servers.
|
|||||||
|
|
||||||
5) Continue to extend the smb3 "buildbot" which does automated xfstesting
|
5) Continue to extend the smb3 "buildbot" which does automated xfstesting
|
||||||
against Windows, Samba and Azure currently - to add additional tests and
|
against Windows, Samba and Azure currently - to add additional tests and
|
||||||
to allow the buildbot to execute the tests faster.
|
to allow the buildbot to execute the tests faster. The URL for the
|
||||||
|
buildbot is: http://smb3-test-rhel-75.southcentralus.cloudapp.azure.com
|
||||||
|
|
||||||
6) Address various coverity warnings (most are not bugs per-se, but
|
6) Address various coverity warnings (most are not bugs per-se, but
|
||||||
the more warnings are addressed, the easier it is to spot real
|
the more warnings are addressed, the easier it is to spot real
|
||||||
|
@ -1,16 +1,21 @@
|
|||||||
This is the client VFS module for the SMB3 NAS protocol as well
|
This is the client VFS module for the SMB3 NAS protocol as well
|
||||||
older dialects such as the Common Internet File System (CIFS)
|
as for older dialects such as the Common Internet File System (CIFS)
|
||||||
protocol which was the successor to the Server Message Block
|
protocol which was the successor to the Server Message Block
|
||||||
(SMB) protocol, the native file sharing mechanism for most early
|
(SMB) protocol, the native file sharing mechanism for most early
|
||||||
PC operating systems. New and improved versions of CIFS are now
|
PC operating systems. New and improved versions of CIFS are now
|
||||||
called SMB2 and SMB3. These dialects are also supported by the
|
called SMB2 and SMB3. Use of SMB3 (and later, including SMB3.1.1)
|
||||||
CIFS VFS module. CIFS is fully supported by network
|
is strongly preferred over using older dialects like CIFS due to
|
||||||
file servers such as Windows 2000, 2003, 2008, 2012 and 2016
|
security reaasons. All modern dialects, including the most recent,
|
||||||
as well by Samba (which provides excellent CIFS
|
SMB3.1.1 are supported by the CIFS VFS module. The SMB3 protocol
|
||||||
server support for Linux and many other operating systems), Apple
|
is implemented and supported by all major file servers
|
||||||
systems, as well as most Network Attached Storage vendors, so
|
such as all modern versions of Windows (including Windows 2016
|
||||||
this network filesystem client can mount to a wide variety of
|
Server), as well as by Samba (which provides excellent
|
||||||
servers.
|
CIFS/SMB2/SMB3 server support and tools for Linux and many other
|
||||||
|
operating systems). Apple systems also support SMB3 well, as
|
||||||
|
do most Network Attached Storage vendors, so this network
|
||||||
|
filesystem client can mount to a wide variety of systems.
|
||||||
|
It also supports mounting to the cloud (for example
|
||||||
|
Microsoft Azure), including the necessary security features.
|
||||||
|
|
||||||
The intent of this module is to provide the most advanced network
|
The intent of this module is to provide the most advanced network
|
||||||
file system function for SMB3 compliant servers, including advanced
|
file system function for SMB3 compliant servers, including advanced
|
||||||
@ -24,12 +29,17 @@
|
|||||||
cluster file systems for fileserving in some Linux to Linux environments,
|
cluster file systems for fileserving in some Linux to Linux environments,
|
||||||
not just in Linux to Windows (or Linux to Mac) environments.
|
not just in Linux to Windows (or Linux to Mac) environments.
|
||||||
|
|
||||||
This filesystem has an mount utility (mount.cifs) that can be obtained from
|
This filesystem has a mount utility (mount.cifs) and various user space
|
||||||
|
tools (including smbinfo and setcifsacl) that can be obtained from
|
||||||
|
|
||||||
https://ftp.samba.org/pub/linux-cifs/cifs-utils/
|
https://git.samba.org/?p=cifs-utils.git
|
||||||
|
or
|
||||||
|
git://git.samba.org/cifs-utils.git
|
||||||
|
|
||||||
It must be installed in the directory with the other mount helpers.
|
mount.cifs should be installed in the directory with the other mount helpers.
|
||||||
|
|
||||||
For more information on the module see the project wiki page at
|
For more information on the module see the project wiki page at
|
||||||
|
|
||||||
|
https://wiki.samba.org/index.php/LinuxCIFS
|
||||||
|
and
|
||||||
https://wiki.samba.org/index.php/LinuxCIFS_utils
|
https://wiki.samba.org/index.php/LinuxCIFS_utils
|
||||||
|
@ -126,6 +126,8 @@ disable_ext_identify Disable the extension list configured by mkfs, so f2fs
|
|||||||
does not aware of cold files such as media files.
|
does not aware of cold files such as media files.
|
||||||
inline_xattr Enable the inline xattrs feature.
|
inline_xattr Enable the inline xattrs feature.
|
||||||
noinline_xattr Disable the inline xattrs feature.
|
noinline_xattr Disable the inline xattrs feature.
|
||||||
|
inline_xattr_size=%u Support configuring inline xattr size, it depends on
|
||||||
|
flexible inline xattr feature.
|
||||||
inline_data Enable the inline data feature: New created small(<~3.4k)
|
inline_data Enable the inline data feature: New created small(<~3.4k)
|
||||||
files can be written into inode block.
|
files can be written into inode block.
|
||||||
inline_dentry Enable the inline dir feature: data in new created
|
inline_dentry Enable the inline dir feature: data in new created
|
||||||
|
@ -1274,7 +1274,7 @@ See subsequent chapter for the syntax of the Kbuild file.
|
|||||||
|
|
||||||
--- 7.4 mandatory-y
|
--- 7.4 mandatory-y
|
||||||
|
|
||||||
mandatory-y is essentially used by include/(uapi/)asm-generic/Kbuild.asm
|
mandatory-y is essentially used by include/(uapi/)asm-generic/Kbuild
|
||||||
to define the minimum set of ASM headers that all architectures must have.
|
to define the minimum set of ASM headers that all architectures must have.
|
||||||
|
|
||||||
This works like optional generic-y. If a mandatory header is missing
|
This works like optional generic-y. If a mandatory header is missing
|
||||||
|
@ -44,10 +44,10 @@ including the Netfilter hooks and the flowtable fastpath bypass.
|
|||||||
/ \ / \ |Routing | / \
|
/ \ / \ |Routing | / \
|
||||||
--> ingress ---> prerouting ---> |decision| | postrouting |--> neigh_xmit
|
--> ingress ---> prerouting ---> |decision| | postrouting |--> neigh_xmit
|
||||||
\_________/ \__________/ ---------- \____________/ ^
|
\_________/ \__________/ ---------- \____________/ ^
|
||||||
| ^ | | ^ |
|
| ^ | ^ |
|
||||||
flowtable | | ____\/___ | |
|
flowtable | ____\/___ | |
|
||||||
| | | / \ | |
|
| | / \ | |
|
||||||
__\/___ | --------->| forward |------------ |
|
__\/___ | | forward |------------ |
|
||||||
|-----| | \_________/ |
|
|-----| | \_________/ |
|
||||||
|-----| | 'flow offload' rule |
|
|-----| | 'flow offload' rule |
|
||||||
|-----| | adds entry to |
|
|-----| | adds entry to |
|
||||||
|
@ -45,6 +45,23 @@ the API. The only supported use is one virtual machine per process,
|
|||||||
and one vcpu per thread.
|
and one vcpu per thread.
|
||||||
|
|
||||||
|
|
||||||
|
It is important to note that althought VM ioctls may only be issued from
|
||||||
|
the process that created the VM, a VM's lifecycle is associated with its
|
||||||
|
file descriptor, not its creator (process). In other words, the VM and
|
||||||
|
its resources, *including the associated address space*, are not freed
|
||||||
|
until the last reference to the VM's file descriptor has been released.
|
||||||
|
For example, if fork() is issued after ioctl(KVM_CREATE_VM), the VM will
|
||||||
|
not be freed until both the parent (original) process and its child have
|
||||||
|
put their references to the VM's file descriptor.
|
||||||
|
|
||||||
|
Because a VM's resources are not freed until the last reference to its
|
||||||
|
file descriptor is released, creating additional references to a VM via
|
||||||
|
via fork(), dup(), etc... without careful consideration is strongly
|
||||||
|
discouraged and may have unwanted side effects, e.g. memory allocated
|
||||||
|
by and on behalf of the VM's process may not be freed/unaccounted when
|
||||||
|
the VM is shut down.
|
||||||
|
|
||||||
|
|
||||||
3. Extensions
|
3. Extensions
|
||||||
-------------
|
-------------
|
||||||
|
|
||||||
|
@ -53,7 +53,8 @@ the global max polling interval then the polling interval can be increased in
|
|||||||
the hope that next time during the longer polling interval the wake up source
|
the hope that next time during the longer polling interval the wake up source
|
||||||
will be received while the host is polling and the latency benefits will be
|
will be received while the host is polling and the latency benefits will be
|
||||||
received. The polling interval is grown in the function grow_halt_poll_ns() and
|
received. The polling interval is grown in the function grow_halt_poll_ns() and
|
||||||
is multiplied by the module parameter halt_poll_ns_grow.
|
is multiplied by the module parameters halt_poll_ns_grow and
|
||||||
|
halt_poll_ns_grow_start.
|
||||||
|
|
||||||
In the event that the total block time was greater than the global max polling
|
In the event that the total block time was greater than the global max polling
|
||||||
interval then the host will never poll for long enough (limited by the global
|
interval then the host will never poll for long enough (limited by the global
|
||||||
@ -80,22 +81,30 @@ shrunk. These variables are defined in include/linux/kvm_host.h and as module
|
|||||||
parameters in virt/kvm/kvm_main.c, or arch/powerpc/kvm/book3s_hv.c in the
|
parameters in virt/kvm/kvm_main.c, or arch/powerpc/kvm/book3s_hv.c in the
|
||||||
powerpc kvm-hv case.
|
powerpc kvm-hv case.
|
||||||
|
|
||||||
Module Parameter | Description | Default Value
|
Module Parameter | Description | Default Value
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
halt_poll_ns | The global max polling interval | KVM_HALT_POLL_NS_DEFAULT
|
halt_poll_ns | The global max polling | KVM_HALT_POLL_NS_DEFAULT
|
||||||
| which defines the ceiling value |
|
| interval which defines |
|
||||||
| of the polling interval for | (per arch value)
|
| the ceiling value of the |
|
||||||
| each vcpu. |
|
| polling interval for | (per arch value)
|
||||||
|
| each vcpu. |
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
halt_poll_ns_grow | The value by which the halt | 2
|
halt_poll_ns_grow | The value by which the | 2
|
||||||
| polling interval is multiplied |
|
| halt polling interval is |
|
||||||
| in the grow_halt_poll_ns() |
|
| multiplied in the |
|
||||||
| function. |
|
| grow_halt_poll_ns() |
|
||||||
|
| function. |
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
halt_poll_ns_shrink | The value by which the halt | 0
|
halt_poll_ns_grow_start | The initial value to grow | 10000
|
||||||
| polling interval is divided in |
|
| to from zero in the |
|
||||||
| the shrink_halt_poll_ns() |
|
| grow_halt_poll_ns() |
|
||||||
| function. |
|
| function. |
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
halt_poll_ns_shrink | The value by which the | 0
|
||||||
|
| halt polling interval is |
|
||||||
|
| divided in the |
|
||||||
|
| shrink_halt_poll_ns() |
|
||||||
|
| function. |
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
These module parameters can be set from the debugfs files in:
|
These module parameters can be set from the debugfs files in:
|
||||||
|
@ -224,10 +224,6 @@ Shadow pages contain the following information:
|
|||||||
A bitmap indicating which sptes in spt point (directly or indirectly) at
|
A bitmap indicating which sptes in spt point (directly or indirectly) at
|
||||||
pages that may be unsynchronized. Used to quickly locate all unsychronized
|
pages that may be unsynchronized. Used to quickly locate all unsychronized
|
||||||
pages reachable from a given page.
|
pages reachable from a given page.
|
||||||
mmu_valid_gen:
|
|
||||||
Generation number of the page. It is compared with kvm->arch.mmu_valid_gen
|
|
||||||
during hash table lookup, and used to skip invalidated shadow pages (see
|
|
||||||
"Zapping all pages" below.)
|
|
||||||
clear_spte_count:
|
clear_spte_count:
|
||||||
Only present on 32-bit hosts, where a 64-bit spte cannot be written
|
Only present on 32-bit hosts, where a 64-bit spte cannot be written
|
||||||
atomically. The reader uses this while running out of the MMU lock
|
atomically. The reader uses this while running out of the MMU lock
|
||||||
@ -402,27 +398,6 @@ causes its disallow_lpage to be incremented, thus preventing instantiation of
|
|||||||
a large spte. The frames at the end of an unaligned memory slot have
|
a large spte. The frames at the end of an unaligned memory slot have
|
||||||
artificially inflated ->disallow_lpages so they can never be instantiated.
|
artificially inflated ->disallow_lpages so they can never be instantiated.
|
||||||
|
|
||||||
Zapping all pages (page generation count)
|
|
||||||
=========================================
|
|
||||||
|
|
||||||
For the large memory guests, walking and zapping all pages is really slow
|
|
||||||
(because there are a lot of pages), and also blocks memory accesses of
|
|
||||||
all VCPUs because it needs to hold the MMU lock.
|
|
||||||
|
|
||||||
To make it be more scalable, kvm maintains a global generation number
|
|
||||||
which is stored in kvm->arch.mmu_valid_gen. Every shadow page stores
|
|
||||||
the current global generation-number into sp->mmu_valid_gen when it
|
|
||||||
is created. Pages with a mismatching generation number are "obsolete".
|
|
||||||
|
|
||||||
When KVM need zap all shadow pages sptes, it just simply increases the global
|
|
||||||
generation-number then reload root shadow pages on all vcpus. As the VCPUs
|
|
||||||
create new shadow page tables, the old pages are not used because of the
|
|
||||||
mismatching generation number.
|
|
||||||
|
|
||||||
KVM then walks through all pages and zaps obsolete pages. While the zap
|
|
||||||
operation needs to take the MMU lock, the lock can be released periodically
|
|
||||||
so that the VCPUs can make progress.
|
|
||||||
|
|
||||||
Fast invalidation of MMIO sptes
|
Fast invalidation of MMIO sptes
|
||||||
===============================
|
===============================
|
||||||
|
|
||||||
@ -435,8 +410,7 @@ shadow pages, and is made more scalable with a similar technique.
|
|||||||
MMIO sptes have a few spare bits, which are used to store a
|
MMIO sptes have a few spare bits, which are used to store a
|
||||||
generation number. The global generation number is stored in
|
generation number. The global generation number is stored in
|
||||||
kvm_memslots(kvm)->generation, and increased whenever guest memory info
|
kvm_memslots(kvm)->generation, and increased whenever guest memory info
|
||||||
changes. This generation number is distinct from the one described in
|
changes.
|
||||||
the previous section.
|
|
||||||
|
|
||||||
When KVM finds an MMIO spte, it checks the generation number of the spte.
|
When KVM finds an MMIO spte, it checks the generation number of the spte.
|
||||||
If the generation number of the spte does not equal the global generation
|
If the generation number of the spte does not equal the global generation
|
||||||
@ -452,13 +426,16 @@ stored into the MMIO spte. Thus, the MMIO spte might be created based on
|
|||||||
out-of-date information, but with an up-to-date generation number.
|
out-of-date information, but with an up-to-date generation number.
|
||||||
|
|
||||||
To avoid this, the generation number is incremented again after synchronize_srcu
|
To avoid this, the generation number is incremented again after synchronize_srcu
|
||||||
returns; thus, the low bit of kvm_memslots(kvm)->generation is only 1 during a
|
returns; thus, bit 63 of kvm_memslots(kvm)->generation set to 1 only during a
|
||||||
memslot update, while some SRCU readers might be using the old copy. We do not
|
memslot update, while some SRCU readers might be using the old copy. We do not
|
||||||
want to use an MMIO sptes created with an odd generation number, and we can do
|
want to use an MMIO sptes created with an odd generation number, and we can do
|
||||||
this without losing a bit in the MMIO spte. The low bit of the generation
|
this without losing a bit in the MMIO spte. The "update in-progress" bit of the
|
||||||
is not stored in MMIO spte, and presumed zero when it is extracted out of the
|
generation is not stored in MMIO spte, and is so is implicitly zero when the
|
||||||
spte. If KVM is unlucky and creates an MMIO spte while the low bit is 1,
|
generation is extracted out of the spte. If KVM is unlucky and creates an MMIO
|
||||||
the next access to the spte will always be a cache miss.
|
spte while an update is in-progress, the next access to the spte will always be
|
||||||
|
a cache miss. For example, a subsequent access during the update window will
|
||||||
|
miss due to the in-progress flag diverging, while an access after the update
|
||||||
|
window closes will have a higher generation number (as compared to the spte).
|
||||||
|
|
||||||
|
|
||||||
Further reading
|
Further reading
|
||||||
|
31
MAINTAINERS
31
MAINTAINERS
@ -5278,7 +5278,7 @@ 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@armlinux.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: etnaviv@lists.freedesktop.org
|
L: etnaviv@lists.freedesktop.org (moderated for non-subscribers)
|
||||||
L: dri-devel@lists.freedesktop.org
|
L: dri-devel@lists.freedesktop.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/gpu/drm/etnaviv/
|
F: drivers/gpu/drm/etnaviv/
|
||||||
@ -8096,6 +8096,16 @@ F: include/linux/iommu.h
|
|||||||
F: include/linux/of_iommu.h
|
F: include/linux/of_iommu.h
|
||||||
F: include/linux/iova.h
|
F: include/linux/iova.h
|
||||||
|
|
||||||
|
IO_URING
|
||||||
|
M: Jens Axboe <axboe@kernel.dk>
|
||||||
|
L: linux-block@vger.kernel.org
|
||||||
|
L: linux-fsdevel@vger.kernel.org
|
||||||
|
T: git git://git.kernel.dk/linux-block
|
||||||
|
T: git git://git.kernel.dk/liburing
|
||||||
|
S: Maintained
|
||||||
|
F: fs/io_uring.c
|
||||||
|
F: include/uapi/linux/io_uring.h
|
||||||
|
|
||||||
IP MASQUERADING
|
IP MASQUERADING
|
||||||
M: Juanjo Ciarlante <jjciarla@raiz.uncu.edu.ar>
|
M: Juanjo Ciarlante <jjciarla@raiz.uncu.edu.ar>
|
||||||
S: Maintained
|
S: Maintained
|
||||||
@ -8461,6 +8471,7 @@ F: include/linux/kvm*
|
|||||||
F: include/kvm/iodev.h
|
F: include/kvm/iodev.h
|
||||||
F: virt/kvm/*
|
F: virt/kvm/*
|
||||||
F: tools/kvm/
|
F: tools/kvm/
|
||||||
|
F: tools/testing/selftests/kvm/
|
||||||
|
|
||||||
KERNEL VIRTUAL MACHINE FOR AMD-V (KVM/amd)
|
KERNEL VIRTUAL MACHINE FOR AMD-V (KVM/amd)
|
||||||
M: Joerg Roedel <joro@8bytes.org>
|
M: Joerg Roedel <joro@8bytes.org>
|
||||||
@ -8470,29 +8481,25 @@ S: Maintained
|
|||||||
F: arch/x86/include/asm/svm.h
|
F: arch/x86/include/asm/svm.h
|
||||||
F: arch/x86/kvm/svm.c
|
F: arch/x86/kvm/svm.c
|
||||||
|
|
||||||
KERNEL VIRTUAL MACHINE FOR ARM (KVM/arm)
|
KERNEL VIRTUAL MACHINE FOR ARM/ARM64 (KVM/arm, KVM/arm64)
|
||||||
M: Christoffer Dall <christoffer.dall@arm.com>
|
M: Christoffer Dall <christoffer.dall@arm.com>
|
||||||
M: Marc Zyngier <marc.zyngier@arm.com>
|
M: Marc Zyngier <marc.zyngier@arm.com>
|
||||||
|
R: James Morse <james.morse@arm.com>
|
||||||
|
R: Julien Thierry <julien.thierry@arm.com>
|
||||||
|
R: Suzuki K Pouloze <suzuki.poulose@arm.com>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
L: kvmarm@lists.cs.columbia.edu
|
L: kvmarm@lists.cs.columbia.edu
|
||||||
W: http://systems.cs.columbia.edu/projects/kvm-arm
|
W: http://systems.cs.columbia.edu/projects/kvm-arm
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kvmarm/kvmarm.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kvmarm/kvmarm.git
|
||||||
S: Supported
|
S: Maintained
|
||||||
F: arch/arm/include/uapi/asm/kvm*
|
F: arch/arm/include/uapi/asm/kvm*
|
||||||
F: arch/arm/include/asm/kvm*
|
F: arch/arm/include/asm/kvm*
|
||||||
F: arch/arm/kvm/
|
F: arch/arm/kvm/
|
||||||
F: virt/kvm/arm/
|
|
||||||
F: include/kvm/arm_*
|
|
||||||
|
|
||||||
KERNEL VIRTUAL MACHINE FOR ARM64 (KVM/arm64)
|
|
||||||
M: Christoffer Dall <christoffer.dall@arm.com>
|
|
||||||
M: Marc Zyngier <marc.zyngier@arm.com>
|
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
|
||||||
L: kvmarm@lists.cs.columbia.edu
|
|
||||||
S: Maintained
|
|
||||||
F: arch/arm64/include/uapi/asm/kvm*
|
F: arch/arm64/include/uapi/asm/kvm*
|
||||||
F: arch/arm64/include/asm/kvm*
|
F: arch/arm64/include/asm/kvm*
|
||||||
F: arch/arm64/kvm/
|
F: arch/arm64/kvm/
|
||||||
|
F: virt/kvm/arm/
|
||||||
|
F: include/kvm/arm_*
|
||||||
|
|
||||||
KERNEL VIRTUAL MACHINE FOR MIPS (KVM/mips)
|
KERNEL VIRTUAL MACHINE FOR MIPS (KVM/mips)
|
||||||
M: James Hogan <jhogan@kernel.org>
|
M: James Hogan <jhogan@kernel.org>
|
||||||
|
22
Makefile
22
Makefile
@ -1,8 +1,8 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
VERSION = 5
|
VERSION = 5
|
||||||
PATCHLEVEL = 0
|
PATCHLEVEL = 1
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION =
|
EXTRAVERSION = -rc2
|
||||||
NAME = Shy Crocodile
|
NAME = Shy Crocodile
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
@ -31,6 +31,16 @@ _all:
|
|||||||
# descending is started. They are now explicitly listed as the
|
# descending is started. They are now explicitly listed as the
|
||||||
# prepare rule.
|
# prepare rule.
|
||||||
|
|
||||||
|
# Ugly workaround for Debian make-kpkg:
|
||||||
|
# make-kpkg directly includes the top Makefile of Linux kernel. In such a case,
|
||||||
|
# skip sub-make to support debian_* targets in ruleset/kernel_version.mk, but
|
||||||
|
# displays warning to discourage such abusage.
|
||||||
|
ifneq ($(word 2, $(MAKEFILE_LIST)),)
|
||||||
|
$(warning Do not include top Makefile of Linux Kernel)
|
||||||
|
sub-make-done := 1
|
||||||
|
MAKEFLAGS += -rR
|
||||||
|
endif
|
||||||
|
|
||||||
ifneq ($(sub-make-done),1)
|
ifneq ($(sub-make-done),1)
|
||||||
|
|
||||||
# Do not use make's built-in rules and variables
|
# Do not use make's built-in rules and variables
|
||||||
@ -402,7 +412,7 @@ CHECK = sparse
|
|||||||
|
|
||||||
CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ \
|
CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ \
|
||||||
-Wbitwise -Wno-return-void -Wno-unknown-attribute $(CF)
|
-Wbitwise -Wno-return-void -Wno-unknown-attribute $(CF)
|
||||||
NOSTDINC_FLAGS =
|
NOSTDINC_FLAGS :=
|
||||||
CFLAGS_MODULE =
|
CFLAGS_MODULE =
|
||||||
AFLAGS_MODULE =
|
AFLAGS_MODULE =
|
||||||
LDFLAGS_MODULE =
|
LDFLAGS_MODULE =
|
||||||
@ -1088,9 +1098,11 @@ asm-generic := -f $(srctree)/scripts/Makefile.asm-generic obj
|
|||||||
|
|
||||||
PHONY += asm-generic uapi-asm-generic
|
PHONY += asm-generic uapi-asm-generic
|
||||||
asm-generic: uapi-asm-generic
|
asm-generic: uapi-asm-generic
|
||||||
$(Q)$(MAKE) $(asm-generic)=arch/$(SRCARCH)/include/generated/asm
|
$(Q)$(MAKE) $(asm-generic)=arch/$(SRCARCH)/include/generated/asm \
|
||||||
|
generic=include/asm-generic
|
||||||
uapi-asm-generic:
|
uapi-asm-generic:
|
||||||
$(Q)$(MAKE) $(asm-generic)=arch/$(SRCARCH)/include/generated/uapi/asm
|
$(Q)$(MAKE) $(asm-generic)=arch/$(SRCARCH)/include/generated/uapi/asm \
|
||||||
|
generic=include/uapi/asm-generic
|
||||||
|
|
||||||
PHONY += prepare-objtool
|
PHONY += prepare-objtool
|
||||||
prepare-objtool: $(objtool_target)
|
prepare-objtool: $(objtool_target)
|
||||||
|
@ -1,3 +1 @@
|
|||||||
include include/uapi/asm-generic/Kbuild.asm
|
|
||||||
|
|
||||||
generated-y += unistd_32.h
|
generated-y += unistd_32.h
|
||||||
|
@ -144,11 +144,11 @@ config ARC_CPU_770
|
|||||||
Support for ARC770 core introduced with Rel 4.10 (Summer 2011)
|
Support for ARC770 core introduced with Rel 4.10 (Summer 2011)
|
||||||
This core has a bunch of cool new features:
|
This core has a bunch of cool new features:
|
||||||
-MMU-v3: Variable Page Sz (4k, 8k, 16k), bigger J-TLB (128x4)
|
-MMU-v3: Variable Page Sz (4k, 8k, 16k), bigger J-TLB (128x4)
|
||||||
Shared Address Spaces (for sharing TLB entries in MMU)
|
Shared Address Spaces (for sharing TLB entries in MMU)
|
||||||
-Caches: New Prog Model, Region Flush
|
-Caches: New Prog Model, Region Flush
|
||||||
-Insns: endian swap, load-locked/store-conditional, time-stamp-ctr
|
-Insns: endian swap, load-locked/store-conditional, time-stamp-ctr
|
||||||
|
|
||||||
endif #ISA_ARCOMPACT
|
endif #ISA_ARCOMPACT
|
||||||
|
|
||||||
config ARC_CPU_HS
|
config ARC_CPU_HS
|
||||||
bool "ARC-HS"
|
bool "ARC-HS"
|
||||||
@ -198,7 +198,7 @@ config ARC_SMP_HALT_ON_RESET
|
|||||||
at designated entry point. For other case, all jump to common
|
at designated entry point. For other case, all jump to common
|
||||||
entry point and spin wait for Master's signal.
|
entry point and spin wait for Master's signal.
|
||||||
|
|
||||||
endif #SMP
|
endif #SMP
|
||||||
|
|
||||||
config ARC_MCIP
|
config ARC_MCIP
|
||||||
bool "ARConnect Multicore IP (MCIP) Support "
|
bool "ARConnect Multicore IP (MCIP) Support "
|
||||||
@ -249,7 +249,7 @@ config ARC_CACHE_VIPT_ALIASING
|
|||||||
bool "Support VIPT Aliasing D$"
|
bool "Support VIPT Aliasing D$"
|
||||||
depends on ARC_HAS_DCACHE && ISA_ARCOMPACT
|
depends on ARC_HAS_DCACHE && ISA_ARCOMPACT
|
||||||
|
|
||||||
endif #ARC_CACHE
|
endif #ARC_CACHE
|
||||||
|
|
||||||
config ARC_HAS_ICCM
|
config ARC_HAS_ICCM
|
||||||
bool "Use ICCM"
|
bool "Use ICCM"
|
||||||
@ -370,7 +370,7 @@ config ARC_FPU_SAVE_RESTORE
|
|||||||
based on actual usage of FPU by a task. Thus our implemn does
|
based on actual usage of FPU by a task. Thus our implemn does
|
||||||
this for all tasks in system.
|
this for all tasks in system.
|
||||||
|
|
||||||
endif #ISA_ARCOMPACT
|
endif #ISA_ARCOMPACT
|
||||||
|
|
||||||
config ARC_CANT_LLSC
|
config ARC_CANT_LLSC
|
||||||
def_bool n
|
def_bool n
|
||||||
@ -386,6 +386,15 @@ config ARC_HAS_SWAPE
|
|||||||
|
|
||||||
if ISA_ARCV2
|
if ISA_ARCV2
|
||||||
|
|
||||||
|
config ARC_USE_UNALIGNED_MEM_ACCESS
|
||||||
|
bool "Enable unaligned access in HW"
|
||||||
|
default y
|
||||||
|
select HAVE_EFFICIENT_UNALIGNED_ACCESS
|
||||||
|
help
|
||||||
|
The ARC HS architecture supports unaligned memory access
|
||||||
|
which is disabled by default. Enable unaligned access in
|
||||||
|
hardware and use software to use it
|
||||||
|
|
||||||
config ARC_HAS_LL64
|
config ARC_HAS_LL64
|
||||||
bool "Insn: 64bit LDD/STD"
|
bool "Insn: 64bit LDD/STD"
|
||||||
help
|
help
|
||||||
@ -414,7 +423,7 @@ config ARC_IRQ_NO_AUTOSAVE
|
|||||||
This is programmable and can be optionally disabled in which case
|
This is programmable and can be optionally disabled in which case
|
||||||
software INTERRUPT_PROLOGUE/EPILGUE do the needed work
|
software INTERRUPT_PROLOGUE/EPILGUE do the needed work
|
||||||
|
|
||||||
endif # ISA_ARCV2
|
endif # ISA_ARCV2
|
||||||
|
|
||||||
endmenu # "ARC CPU Configuration"
|
endmenu # "ARC CPU Configuration"
|
||||||
|
|
||||||
|
@ -28,6 +28,12 @@ cflags-$(CONFIG_ARC_HAS_SWAPE) += -mswape
|
|||||||
|
|
||||||
ifdef CONFIG_ISA_ARCV2
|
ifdef CONFIG_ISA_ARCV2
|
||||||
|
|
||||||
|
ifdef CONFIG_ARC_USE_UNALIGNED_MEM_ACCESS
|
||||||
|
cflags-y += -munaligned-access
|
||||||
|
else
|
||||||
|
cflags-y += -mno-unaligned-access
|
||||||
|
endif
|
||||||
|
|
||||||
ifndef CONFIG_ARC_HAS_LL64
|
ifndef CONFIG_ARC_HAS_LL64
|
||||||
cflags-y += -mno-ll64
|
cflags-y += -mno-ll64
|
||||||
endif
|
endif
|
||||||
|
@ -38,7 +38,7 @@ ahb_clk: clkdiv_ahb {
|
|||||||
clock-div = <6>;
|
clock-div = <6>;
|
||||||
};
|
};
|
||||||
|
|
||||||
iomux: iomux@FF10601c {
|
iomux: iomux@ff10601c {
|
||||||
/* Port 1 */
|
/* Port 1 */
|
||||||
pctl_tsin_s0: pctl-tsin-s0 { /* Serial TS-in 0 */
|
pctl_tsin_s0: pctl-tsin-s0 { /* Serial TS-in 0 */
|
||||||
abilis,function = "mis0";
|
abilis,function = "mis0";
|
||||||
@ -162,182 +162,182 @@ pctl_gpio_i: pctl-gpio-i {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
gpioa: gpio@FF140000 {
|
gpioa: gpio@ff140000 {
|
||||||
compatible = "abilis,tb10x-gpio";
|
compatible = "abilis,tb10x-gpio";
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
interrupts = <27 2>;
|
interrupts = <27 2>;
|
||||||
reg = <0xFF140000 0x1000>;
|
reg = <0xff140000 0x1000>;
|
||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
abilis,ngpio = <3>;
|
abilis,ngpio = <3>;
|
||||||
gpio-ranges = <&iomux 0 0 0>;
|
gpio-ranges = <&iomux 0 0 0>;
|
||||||
gpio-ranges-group-names = "gpioa";
|
gpio-ranges-group-names = "gpioa";
|
||||||
};
|
};
|
||||||
gpiob: gpio@FF141000 {
|
gpiob: gpio@ff141000 {
|
||||||
compatible = "abilis,tb10x-gpio";
|
compatible = "abilis,tb10x-gpio";
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
interrupts = <27 2>;
|
interrupts = <27 2>;
|
||||||
reg = <0xFF141000 0x1000>;
|
reg = <0xff141000 0x1000>;
|
||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
abilis,ngpio = <2>;
|
abilis,ngpio = <2>;
|
||||||
gpio-ranges = <&iomux 0 0 0>;
|
gpio-ranges = <&iomux 0 0 0>;
|
||||||
gpio-ranges-group-names = "gpiob";
|
gpio-ranges-group-names = "gpiob";
|
||||||
};
|
};
|
||||||
gpioc: gpio@FF142000 {
|
gpioc: gpio@ff142000 {
|
||||||
compatible = "abilis,tb10x-gpio";
|
compatible = "abilis,tb10x-gpio";
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
interrupts = <27 2>;
|
interrupts = <27 2>;
|
||||||
reg = <0xFF142000 0x1000>;
|
reg = <0xff142000 0x1000>;
|
||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
abilis,ngpio = <3>;
|
abilis,ngpio = <3>;
|
||||||
gpio-ranges = <&iomux 0 0 0>;
|
gpio-ranges = <&iomux 0 0 0>;
|
||||||
gpio-ranges-group-names = "gpioc";
|
gpio-ranges-group-names = "gpioc";
|
||||||
};
|
};
|
||||||
gpiod: gpio@FF143000 {
|
gpiod: gpio@ff143000 {
|
||||||
compatible = "abilis,tb10x-gpio";
|
compatible = "abilis,tb10x-gpio";
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
interrupts = <27 2>;
|
interrupts = <27 2>;
|
||||||
reg = <0xFF143000 0x1000>;
|
reg = <0xff143000 0x1000>;
|
||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
abilis,ngpio = <2>;
|
abilis,ngpio = <2>;
|
||||||
gpio-ranges = <&iomux 0 0 0>;
|
gpio-ranges = <&iomux 0 0 0>;
|
||||||
gpio-ranges-group-names = "gpiod";
|
gpio-ranges-group-names = "gpiod";
|
||||||
};
|
};
|
||||||
gpioe: gpio@FF144000 {
|
gpioe: gpio@ff144000 {
|
||||||
compatible = "abilis,tb10x-gpio";
|
compatible = "abilis,tb10x-gpio";
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
interrupts = <27 2>;
|
interrupts = <27 2>;
|
||||||
reg = <0xFF144000 0x1000>;
|
reg = <0xff144000 0x1000>;
|
||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
abilis,ngpio = <3>;
|
abilis,ngpio = <3>;
|
||||||
gpio-ranges = <&iomux 0 0 0>;
|
gpio-ranges = <&iomux 0 0 0>;
|
||||||
gpio-ranges-group-names = "gpioe";
|
gpio-ranges-group-names = "gpioe";
|
||||||
};
|
};
|
||||||
gpiof: gpio@FF145000 {
|
gpiof: gpio@ff145000 {
|
||||||
compatible = "abilis,tb10x-gpio";
|
compatible = "abilis,tb10x-gpio";
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
interrupts = <27 2>;
|
interrupts = <27 2>;
|
||||||
reg = <0xFF145000 0x1000>;
|
reg = <0xff145000 0x1000>;
|
||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
abilis,ngpio = <2>;
|
abilis,ngpio = <2>;
|
||||||
gpio-ranges = <&iomux 0 0 0>;
|
gpio-ranges = <&iomux 0 0 0>;
|
||||||
gpio-ranges-group-names = "gpiof";
|
gpio-ranges-group-names = "gpiof";
|
||||||
};
|
};
|
||||||
gpiog: gpio@FF146000 {
|
gpiog: gpio@ff146000 {
|
||||||
compatible = "abilis,tb10x-gpio";
|
compatible = "abilis,tb10x-gpio";
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
interrupts = <27 2>;
|
interrupts = <27 2>;
|
||||||
reg = <0xFF146000 0x1000>;
|
reg = <0xff146000 0x1000>;
|
||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
abilis,ngpio = <3>;
|
abilis,ngpio = <3>;
|
||||||
gpio-ranges = <&iomux 0 0 0>;
|
gpio-ranges = <&iomux 0 0 0>;
|
||||||
gpio-ranges-group-names = "gpiog";
|
gpio-ranges-group-names = "gpiog";
|
||||||
};
|
};
|
||||||
gpioh: gpio@FF147000 {
|
gpioh: gpio@ff147000 {
|
||||||
compatible = "abilis,tb10x-gpio";
|
compatible = "abilis,tb10x-gpio";
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
interrupts = <27 2>;
|
interrupts = <27 2>;
|
||||||
reg = <0xFF147000 0x1000>;
|
reg = <0xff147000 0x1000>;
|
||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
abilis,ngpio = <2>;
|
abilis,ngpio = <2>;
|
||||||
gpio-ranges = <&iomux 0 0 0>;
|
gpio-ranges = <&iomux 0 0 0>;
|
||||||
gpio-ranges-group-names = "gpioh";
|
gpio-ranges-group-names = "gpioh";
|
||||||
};
|
};
|
||||||
gpioi: gpio@FF148000 {
|
gpioi: gpio@ff148000 {
|
||||||
compatible = "abilis,tb10x-gpio";
|
compatible = "abilis,tb10x-gpio";
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
interrupts = <27 2>;
|
interrupts = <27 2>;
|
||||||
reg = <0xFF148000 0x1000>;
|
reg = <0xff148000 0x1000>;
|
||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
abilis,ngpio = <12>;
|
abilis,ngpio = <12>;
|
||||||
gpio-ranges = <&iomux 0 0 0>;
|
gpio-ranges = <&iomux 0 0 0>;
|
||||||
gpio-ranges-group-names = "gpioi";
|
gpio-ranges-group-names = "gpioi";
|
||||||
};
|
};
|
||||||
gpioj: gpio@FF149000 {
|
gpioj: gpio@ff149000 {
|
||||||
compatible = "abilis,tb10x-gpio";
|
compatible = "abilis,tb10x-gpio";
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
interrupts = <27 2>;
|
interrupts = <27 2>;
|
||||||
reg = <0xFF149000 0x1000>;
|
reg = <0xff149000 0x1000>;
|
||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
abilis,ngpio = <32>;
|
abilis,ngpio = <32>;
|
||||||
gpio-ranges = <&iomux 0 0 0>;
|
gpio-ranges = <&iomux 0 0 0>;
|
||||||
gpio-ranges-group-names = "gpioj";
|
gpio-ranges-group-names = "gpioj";
|
||||||
};
|
};
|
||||||
gpiok: gpio@FF14a000 {
|
gpiok: gpio@ff14a000 {
|
||||||
compatible = "abilis,tb10x-gpio";
|
compatible = "abilis,tb10x-gpio";
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
interrupts = <27 2>;
|
interrupts = <27 2>;
|
||||||
reg = <0xFF14A000 0x1000>;
|
reg = <0xff14a000 0x1000>;
|
||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
abilis,ngpio = <22>;
|
abilis,ngpio = <22>;
|
||||||
gpio-ranges = <&iomux 0 0 0>;
|
gpio-ranges = <&iomux 0 0 0>;
|
||||||
gpio-ranges-group-names = "gpiok";
|
gpio-ranges-group-names = "gpiok";
|
||||||
};
|
};
|
||||||
gpiol: gpio@FF14b000 {
|
gpiol: gpio@ff14b000 {
|
||||||
compatible = "abilis,tb10x-gpio";
|
compatible = "abilis,tb10x-gpio";
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
interrupts = <27 2>;
|
interrupts = <27 2>;
|
||||||
reg = <0xFF14B000 0x1000>;
|
reg = <0xff14b000 0x1000>;
|
||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
abilis,ngpio = <4>;
|
abilis,ngpio = <4>;
|
||||||
gpio-ranges = <&iomux 0 0 0>;
|
gpio-ranges = <&iomux 0 0 0>;
|
||||||
gpio-ranges-group-names = "gpiol";
|
gpio-ranges-group-names = "gpiol";
|
||||||
};
|
};
|
||||||
gpiom: gpio@FF14c000 {
|
gpiom: gpio@ff14c000 {
|
||||||
compatible = "abilis,tb10x-gpio";
|
compatible = "abilis,tb10x-gpio";
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
interrupts = <27 2>;
|
interrupts = <27 2>;
|
||||||
reg = <0xFF14C000 0x1000>;
|
reg = <0xff14c000 0x1000>;
|
||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
abilis,ngpio = <4>;
|
abilis,ngpio = <4>;
|
||||||
gpio-ranges = <&iomux 0 0 0>;
|
gpio-ranges = <&iomux 0 0 0>;
|
||||||
gpio-ranges-group-names = "gpiom";
|
gpio-ranges-group-names = "gpiom";
|
||||||
};
|
};
|
||||||
gpion: gpio@FF14d000 {
|
gpion: gpio@ff14d000 {
|
||||||
compatible = "abilis,tb10x-gpio";
|
compatible = "abilis,tb10x-gpio";
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
interrupts = <27 2>;
|
interrupts = <27 2>;
|
||||||
reg = <0xFF14D000 0x1000>;
|
reg = <0xff14d000 0x1000>;
|
||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
abilis,ngpio = <5>;
|
abilis,ngpio = <5>;
|
||||||
|
@ -37,27 +37,27 @@ memory {
|
|||||||
};
|
};
|
||||||
|
|
||||||
soc100 {
|
soc100 {
|
||||||
uart@FF100000 {
|
uart@ff100000 {
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&pctl_uart0>;
|
pinctrl-0 = <&pctl_uart0>;
|
||||||
};
|
};
|
||||||
ethernet@FE100000 {
|
ethernet@fe100000 {
|
||||||
phy-mode = "rgmii";
|
phy-mode = "rgmii";
|
||||||
};
|
};
|
||||||
|
|
||||||
i2c0: i2c@FF120000 {
|
i2c0: i2c@ff120000 {
|
||||||
i2c-sda-hold-time-ns = <432>;
|
i2c-sda-hold-time-ns = <432>;
|
||||||
};
|
};
|
||||||
i2c1: i2c@FF121000 {
|
i2c1: i2c@ff121000 {
|
||||||
i2c-sda-hold-time-ns = <432>;
|
i2c-sda-hold-time-ns = <432>;
|
||||||
};
|
};
|
||||||
i2c2: i2c@FF122000 {
|
i2c2: i2c@ff122000 {
|
||||||
i2c-sda-hold-time-ns = <432>;
|
i2c-sda-hold-time-ns = <432>;
|
||||||
};
|
};
|
||||||
i2c3: i2c@FF123000 {
|
i2c3: i2c@ff123000 {
|
||||||
i2c-sda-hold-time-ns = <432>;
|
i2c-sda-hold-time-ns = <432>;
|
||||||
};
|
};
|
||||||
i2c4: i2c@FF124000 {
|
i2c4: i2c@ff124000 {
|
||||||
i2c-sda-hold-time-ns = <432>;
|
i2c-sda-hold-time-ns = <432>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@ ahb_clk: clkdiv_ahb {
|
|||||||
clock-div = <6>;
|
clock-div = <6>;
|
||||||
};
|
};
|
||||||
|
|
||||||
iomux: iomux@FF10601c {
|
iomux: iomux@ff10601c {
|
||||||
/* Port 1 */
|
/* Port 1 */
|
||||||
pctl_tsin_s0: pctl-tsin-s0 { /* Serial TS-in 0 */
|
pctl_tsin_s0: pctl-tsin-s0 { /* Serial TS-in 0 */
|
||||||
abilis,function = "mis0";
|
abilis,function = "mis0";
|
||||||
@ -171,182 +171,182 @@ pctl_gpio_i: pctl-gpio-i {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
gpioa: gpio@FF140000 {
|
gpioa: gpio@ff140000 {
|
||||||
compatible = "abilis,tb10x-gpio";
|
compatible = "abilis,tb10x-gpio";
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
interrupts = <27 2>;
|
interrupts = <27 2>;
|
||||||
reg = <0xFF140000 0x1000>;
|
reg = <0xff140000 0x1000>;
|
||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
abilis,ngpio = <3>;
|
abilis,ngpio = <3>;
|
||||||
gpio-ranges = <&iomux 0 0 0>;
|
gpio-ranges = <&iomux 0 0 0>;
|
||||||
gpio-ranges-group-names = "gpioa";
|
gpio-ranges-group-names = "gpioa";
|
||||||
};
|
};
|
||||||
gpiob: gpio@FF141000 {
|
gpiob: gpio@ff141000 {
|
||||||
compatible = "abilis,tb10x-gpio";
|
compatible = "abilis,tb10x-gpio";
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
interrupts = <27 2>;
|
interrupts = <27 2>;
|
||||||
reg = <0xFF141000 0x1000>;
|
reg = <0xff141000 0x1000>;
|
||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
abilis,ngpio = <2>;
|
abilis,ngpio = <2>;
|
||||||
gpio-ranges = <&iomux 0 0 0>;
|
gpio-ranges = <&iomux 0 0 0>;
|
||||||
gpio-ranges-group-names = "gpiob";
|
gpio-ranges-group-names = "gpiob";
|
||||||
};
|
};
|
||||||
gpioc: gpio@FF142000 {
|
gpioc: gpio@ff142000 {
|
||||||
compatible = "abilis,tb10x-gpio";
|
compatible = "abilis,tb10x-gpio";
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
interrupts = <27 2>;
|
interrupts = <27 2>;
|
||||||
reg = <0xFF142000 0x1000>;
|
reg = <0xff142000 0x1000>;
|
||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
abilis,ngpio = <3>;
|
abilis,ngpio = <3>;
|
||||||
gpio-ranges = <&iomux 0 0 0>;
|
gpio-ranges = <&iomux 0 0 0>;
|
||||||
gpio-ranges-group-names = "gpioc";
|
gpio-ranges-group-names = "gpioc";
|
||||||
};
|
};
|
||||||
gpiod: gpio@FF143000 {
|
gpiod: gpio@ff143000 {
|
||||||
compatible = "abilis,tb10x-gpio";
|
compatible = "abilis,tb10x-gpio";
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
interrupts = <27 2>;
|
interrupts = <27 2>;
|
||||||
reg = <0xFF143000 0x1000>;
|
reg = <0xff143000 0x1000>;
|
||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
abilis,ngpio = <2>;
|
abilis,ngpio = <2>;
|
||||||
gpio-ranges = <&iomux 0 0 0>;
|
gpio-ranges = <&iomux 0 0 0>;
|
||||||
gpio-ranges-group-names = "gpiod";
|
gpio-ranges-group-names = "gpiod";
|
||||||
};
|
};
|
||||||
gpioe: gpio@FF144000 {
|
gpioe: gpio@ff144000 {
|
||||||
compatible = "abilis,tb10x-gpio";
|
compatible = "abilis,tb10x-gpio";
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
interrupts = <27 2>;
|
interrupts = <27 2>;
|
||||||
reg = <0xFF144000 0x1000>;
|
reg = <0xff144000 0x1000>;
|
||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
abilis,ngpio = <3>;
|
abilis,ngpio = <3>;
|
||||||
gpio-ranges = <&iomux 0 0 0>;
|
gpio-ranges = <&iomux 0 0 0>;
|
||||||
gpio-ranges-group-names = "gpioe";
|
gpio-ranges-group-names = "gpioe";
|
||||||
};
|
};
|
||||||
gpiof: gpio@FF145000 {
|
gpiof: gpio@ff145000 {
|
||||||
compatible = "abilis,tb10x-gpio";
|
compatible = "abilis,tb10x-gpio";
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
interrupts = <27 2>;
|
interrupts = <27 2>;
|
||||||
reg = <0xFF145000 0x1000>;
|
reg = <0xff145000 0x1000>;
|
||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
abilis,ngpio = <2>;
|
abilis,ngpio = <2>;
|
||||||
gpio-ranges = <&iomux 0 0 0>;
|
gpio-ranges = <&iomux 0 0 0>;
|
||||||
gpio-ranges-group-names = "gpiof";
|
gpio-ranges-group-names = "gpiof";
|
||||||
};
|
};
|
||||||
gpiog: gpio@FF146000 {
|
gpiog: gpio@ff146000 {
|
||||||
compatible = "abilis,tb10x-gpio";
|
compatible = "abilis,tb10x-gpio";
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
interrupts = <27 2>;
|
interrupts = <27 2>;
|
||||||
reg = <0xFF146000 0x1000>;
|
reg = <0xff146000 0x1000>;
|
||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
abilis,ngpio = <3>;
|
abilis,ngpio = <3>;
|
||||||
gpio-ranges = <&iomux 0 0 0>;
|
gpio-ranges = <&iomux 0 0 0>;
|
||||||
gpio-ranges-group-names = "gpiog";
|
gpio-ranges-group-names = "gpiog";
|
||||||
};
|
};
|
||||||
gpioh: gpio@FF147000 {
|
gpioh: gpio@ff147000 {
|
||||||
compatible = "abilis,tb10x-gpio";
|
compatible = "abilis,tb10x-gpio";
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
interrupts = <27 2>;
|
interrupts = <27 2>;
|
||||||
reg = <0xFF147000 0x1000>;
|
reg = <0xff147000 0x1000>;
|
||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
abilis,ngpio = <2>;
|
abilis,ngpio = <2>;
|
||||||
gpio-ranges = <&iomux 0 0 0>;
|
gpio-ranges = <&iomux 0 0 0>;
|
||||||
gpio-ranges-group-names = "gpioh";
|
gpio-ranges-group-names = "gpioh";
|
||||||
};
|
};
|
||||||
gpioi: gpio@FF148000 {
|
gpioi: gpio@ff148000 {
|
||||||
compatible = "abilis,tb10x-gpio";
|
compatible = "abilis,tb10x-gpio";
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
interrupts = <27 2>;
|
interrupts = <27 2>;
|
||||||
reg = <0xFF148000 0x1000>;
|
reg = <0xff148000 0x1000>;
|
||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
abilis,ngpio = <12>;
|
abilis,ngpio = <12>;
|
||||||
gpio-ranges = <&iomux 0 0 0>;
|
gpio-ranges = <&iomux 0 0 0>;
|
||||||
gpio-ranges-group-names = "gpioi";
|
gpio-ranges-group-names = "gpioi";
|
||||||
};
|
};
|
||||||
gpioj: gpio@FF149000 {
|
gpioj: gpio@ff149000 {
|
||||||
compatible = "abilis,tb10x-gpio";
|
compatible = "abilis,tb10x-gpio";
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
interrupts = <27 2>;
|
interrupts = <27 2>;
|
||||||
reg = <0xFF149000 0x1000>;
|
reg = <0xff149000 0x1000>;
|
||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
abilis,ngpio = <32>;
|
abilis,ngpio = <32>;
|
||||||
gpio-ranges = <&iomux 0 0 0>;
|
gpio-ranges = <&iomux 0 0 0>;
|
||||||
gpio-ranges-group-names = "gpioj";
|
gpio-ranges-group-names = "gpioj";
|
||||||
};
|
};
|
||||||
gpiok: gpio@FF14a000 {
|
gpiok: gpio@ff14a000 {
|
||||||
compatible = "abilis,tb10x-gpio";
|
compatible = "abilis,tb10x-gpio";
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
interrupts = <27 2>;
|
interrupts = <27 2>;
|
||||||
reg = <0xFF14A000 0x1000>;
|
reg = <0xff14a000 0x1000>;
|
||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
abilis,ngpio = <22>;
|
abilis,ngpio = <22>;
|
||||||
gpio-ranges = <&iomux 0 0 0>;
|
gpio-ranges = <&iomux 0 0 0>;
|
||||||
gpio-ranges-group-names = "gpiok";
|
gpio-ranges-group-names = "gpiok";
|
||||||
};
|
};
|
||||||
gpiol: gpio@FF14b000 {
|
gpiol: gpio@ff14b000 {
|
||||||
compatible = "abilis,tb10x-gpio";
|
compatible = "abilis,tb10x-gpio";
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
interrupts = <27 2>;
|
interrupts = <27 2>;
|
||||||
reg = <0xFF14B000 0x1000>;
|
reg = <0xff14b000 0x1000>;
|
||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
abilis,ngpio = <4>;
|
abilis,ngpio = <4>;
|
||||||
gpio-ranges = <&iomux 0 0 0>;
|
gpio-ranges = <&iomux 0 0 0>;
|
||||||
gpio-ranges-group-names = "gpiol";
|
gpio-ranges-group-names = "gpiol";
|
||||||
};
|
};
|
||||||
gpiom: gpio@FF14c000 {
|
gpiom: gpio@ff14c000 {
|
||||||
compatible = "abilis,tb10x-gpio";
|
compatible = "abilis,tb10x-gpio";
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
interrupts = <27 2>;
|
interrupts = <27 2>;
|
||||||
reg = <0xFF14C000 0x1000>;
|
reg = <0xff14c000 0x1000>;
|
||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
abilis,ngpio = <4>;
|
abilis,ngpio = <4>;
|
||||||
gpio-ranges = <&iomux 0 0 0>;
|
gpio-ranges = <&iomux 0 0 0>;
|
||||||
gpio-ranges-group-names = "gpiom";
|
gpio-ranges-group-names = "gpiom";
|
||||||
};
|
};
|
||||||
gpion: gpio@FF14d000 {
|
gpion: gpio@ff14d000 {
|
||||||
compatible = "abilis,tb10x-gpio";
|
compatible = "abilis,tb10x-gpio";
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
interrupts = <27 2>;
|
interrupts = <27 2>;
|
||||||
reg = <0xFF14D000 0x1000>;
|
reg = <0xff14d000 0x1000>;
|
||||||
gpio-controller;
|
gpio-controller;
|
||||||
#gpio-cells = <2>;
|
#gpio-cells = <2>;
|
||||||
abilis,ngpio = <5>;
|
abilis,ngpio = <5>;
|
||||||
|
@ -37,27 +37,27 @@ memory {
|
|||||||
};
|
};
|
||||||
|
|
||||||
soc100 {
|
soc100 {
|
||||||
uart@FF100000 {
|
uart@ff100000 {
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&pctl_uart0>;
|
pinctrl-0 = <&pctl_uart0>;
|
||||||
};
|
};
|
||||||
ethernet@FE100000 {
|
ethernet@fe100000 {
|
||||||
phy-mode = "rgmii";
|
phy-mode = "rgmii";
|
||||||
};
|
};
|
||||||
|
|
||||||
i2c0: i2c@FF120000 {
|
i2c0: i2c@ff120000 {
|
||||||
i2c-sda-hold-time-ns = <432>;
|
i2c-sda-hold-time-ns = <432>;
|
||||||
};
|
};
|
||||||
i2c1: i2c@FF121000 {
|
i2c1: i2c@ff121000 {
|
||||||
i2c-sda-hold-time-ns = <432>;
|
i2c-sda-hold-time-ns = <432>;
|
||||||
};
|
};
|
||||||
i2c2: i2c@FF122000 {
|
i2c2: i2c@ff122000 {
|
||||||
i2c-sda-hold-time-ns = <432>;
|
i2c-sda-hold-time-ns = <432>;
|
||||||
};
|
};
|
||||||
i2c3: i2c@FF123000 {
|
i2c3: i2c@ff123000 {
|
||||||
i2c-sda-hold-time-ns = <432>;
|
i2c-sda-hold-time-ns = <432>;
|
||||||
};
|
};
|
||||||
i2c4: i2c@FF124000 {
|
i2c4: i2c@ff124000 {
|
||||||
i2c-sda-hold-time-ns = <432>;
|
i2c-sda-hold-time-ns = <432>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -54,7 +54,7 @@ soc100 {
|
|||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
device_type = "soc";
|
device_type = "soc";
|
||||||
ranges = <0xfe000000 0xfe000000 0x02000000
|
ranges = <0xfe000000 0xfe000000 0x02000000
|
||||||
0x000F0000 0x000F0000 0x00010000>;
|
0x000f0000 0x000f0000 0x00010000>;
|
||||||
compatible = "abilis,tb10x", "simple-bus";
|
compatible = "abilis,tb10x", "simple-bus";
|
||||||
|
|
||||||
pll0: oscillator {
|
pll0: oscillator {
|
||||||
@ -75,10 +75,10 @@ ahb_clk: clkdiv_ahb {
|
|||||||
clock-output-names = "ahb_clk";
|
clock-output-names = "ahb_clk";
|
||||||
};
|
};
|
||||||
|
|
||||||
iomux: iomux@FF10601c {
|
iomux: iomux@ff10601c {
|
||||||
compatible = "abilis,tb10x-iomux";
|
compatible = "abilis,tb10x-iomux";
|
||||||
#gpio-range-cells = <3>;
|
#gpio-range-cells = <3>;
|
||||||
reg = <0xFF10601c 0x4>;
|
reg = <0xff10601c 0x4>;
|
||||||
};
|
};
|
||||||
|
|
||||||
intc: interrupt-controller {
|
intc: interrupt-controller {
|
||||||
@ -88,7 +88,7 @@ intc: interrupt-controller {
|
|||||||
};
|
};
|
||||||
tb10x_ictl: pic@fe002000 {
|
tb10x_ictl: pic@fe002000 {
|
||||||
compatible = "abilis,tb10x-ictl";
|
compatible = "abilis,tb10x-ictl";
|
||||||
reg = <0xFE002000 0x20>;
|
reg = <0xfe002000 0x20>;
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <2>;
|
#interrupt-cells = <2>;
|
||||||
interrupt-parent = <&intc>;
|
interrupt-parent = <&intc>;
|
||||||
@ -96,27 +96,27 @@ tb10x_ictl: pic@fe002000 {
|
|||||||
20 21 22 23 24 25 26 27 28 29 30 31>;
|
20 21 22 23 24 25 26 27 28 29 30 31>;
|
||||||
};
|
};
|
||||||
|
|
||||||
uart@FF100000 {
|
uart@ff100000 {
|
||||||
compatible = "snps,dw-apb-uart";
|
compatible = "snps,dw-apb-uart";
|
||||||
reg = <0xFF100000 0x100>;
|
reg = <0xff100000 0x100>;
|
||||||
clock-frequency = <166666666>;
|
clock-frequency = <166666666>;
|
||||||
interrupts = <25 8>;
|
interrupts = <25 8>;
|
||||||
reg-shift = <2>;
|
reg-shift = <2>;
|
||||||
reg-io-width = <4>;
|
reg-io-width = <4>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
};
|
};
|
||||||
ethernet@FE100000 {
|
ethernet@fe100000 {
|
||||||
compatible = "snps,dwmac-3.70a","snps,dwmac";
|
compatible = "snps,dwmac-3.70a","snps,dwmac";
|
||||||
reg = <0xFE100000 0x1058>;
|
reg = <0xfe100000 0x1058>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
interrupts = <6 8>;
|
interrupts = <6 8>;
|
||||||
interrupt-names = "macirq";
|
interrupt-names = "macirq";
|
||||||
clocks = <&ahb_clk>;
|
clocks = <&ahb_clk>;
|
||||||
clock-names = "stmmaceth";
|
clock-names = "stmmaceth";
|
||||||
};
|
};
|
||||||
dma@FE000000 {
|
dma@fe000000 {
|
||||||
compatible = "snps,dma-spear1340";
|
compatible = "snps,dma-spear1340";
|
||||||
reg = <0xFE000000 0x400>;
|
reg = <0xfe000000 0x400>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
interrupts = <14 8>;
|
interrupts = <14 8>;
|
||||||
dma-channels = <6>;
|
dma-channels = <6>;
|
||||||
@ -132,70 +132,70 @@ dma@FE000000 {
|
|||||||
multi-block = <1 1 1 1 1 1>;
|
multi-block = <1 1 1 1 1 1>;
|
||||||
};
|
};
|
||||||
|
|
||||||
i2c0: i2c@FF120000 {
|
i2c0: i2c@ff120000 {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
compatible = "snps,designware-i2c";
|
compatible = "snps,designware-i2c";
|
||||||
reg = <0xFF120000 0x1000>;
|
reg = <0xff120000 0x1000>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
interrupts = <12 8>;
|
interrupts = <12 8>;
|
||||||
clocks = <&ahb_clk>;
|
clocks = <&ahb_clk>;
|
||||||
};
|
};
|
||||||
i2c1: i2c@FF121000 {
|
i2c1: i2c@ff121000 {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
compatible = "snps,designware-i2c";
|
compatible = "snps,designware-i2c";
|
||||||
reg = <0xFF121000 0x1000>;
|
reg = <0xff121000 0x1000>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
interrupts = <12 8>;
|
interrupts = <12 8>;
|
||||||
clocks = <&ahb_clk>;
|
clocks = <&ahb_clk>;
|
||||||
};
|
};
|
||||||
i2c2: i2c@FF122000 {
|
i2c2: i2c@ff122000 {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
compatible = "snps,designware-i2c";
|
compatible = "snps,designware-i2c";
|
||||||
reg = <0xFF122000 0x1000>;
|
reg = <0xff122000 0x1000>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
interrupts = <12 8>;
|
interrupts = <12 8>;
|
||||||
clocks = <&ahb_clk>;
|
clocks = <&ahb_clk>;
|
||||||
};
|
};
|
||||||
i2c3: i2c@FF123000 {
|
i2c3: i2c@ff123000 {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
compatible = "snps,designware-i2c";
|
compatible = "snps,designware-i2c";
|
||||||
reg = <0xFF123000 0x1000>;
|
reg = <0xff123000 0x1000>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
interrupts = <12 8>;
|
interrupts = <12 8>;
|
||||||
clocks = <&ahb_clk>;
|
clocks = <&ahb_clk>;
|
||||||
};
|
};
|
||||||
i2c4: i2c@FF124000 {
|
i2c4: i2c@ff124000 {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
compatible = "snps,designware-i2c";
|
compatible = "snps,designware-i2c";
|
||||||
reg = <0xFF124000 0x1000>;
|
reg = <0xff124000 0x1000>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
interrupts = <12 8>;
|
interrupts = <12 8>;
|
||||||
clocks = <&ahb_clk>;
|
clocks = <&ahb_clk>;
|
||||||
};
|
};
|
||||||
|
|
||||||
spi0: spi@0xFE010000 {
|
spi0: spi@fe010000 {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
cell-index = <0>;
|
cell-index = <0>;
|
||||||
compatible = "abilis,tb100-spi";
|
compatible = "abilis,tb100-spi";
|
||||||
num-cs = <1>;
|
num-cs = <1>;
|
||||||
reg = <0xFE010000 0x20>;
|
reg = <0xfe010000 0x20>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
interrupts = <26 8>;
|
interrupts = <26 8>;
|
||||||
clocks = <&ahb_clk>;
|
clocks = <&ahb_clk>;
|
||||||
};
|
};
|
||||||
spi1: spi@0xFE011000 {
|
spi1: spi@fe011000 {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
cell-index = <1>;
|
cell-index = <1>;
|
||||||
compatible = "abilis,tb100-spi";
|
compatible = "abilis,tb100-spi";
|
||||||
num-cs = <2>;
|
num-cs = <2>;
|
||||||
reg = <0xFE011000 0x20>;
|
reg = <0xfe011000 0x20>;
|
||||||
interrupt-parent = <&tb10x_ictl>;
|
interrupt-parent = <&tb10x_ictl>;
|
||||||
interrupts = <10 8>;
|
interrupts = <10 8>;
|
||||||
clocks = <&ahb_clk>;
|
clocks = <&ahb_clk>;
|
||||||
@ -226,23 +226,23 @@ tb10x_stream_proc: tb10x-stream-proc {
|
|||||||
interrupts = <20 2>, <19 2>;
|
interrupts = <20 2>, <19 2>;
|
||||||
interrupt-names = "cmd_irq", "event_irq";
|
interrupt-names = "cmd_irq", "event_irq";
|
||||||
};
|
};
|
||||||
tb10x_mdsc0: tb10x-mdscr@FF300000 {
|
tb10x_mdsc0: tb10x-mdscr@ff300000 {
|
||||||
compatible = "abilis,tb100-mdscr";
|
compatible = "abilis,tb100-mdscr";
|
||||||
reg = <0xFF300000 0x7000>;
|
reg = <0xff300000 0x7000>;
|
||||||
tb100-mdscr-manage-tsin;
|
tb100-mdscr-manage-tsin;
|
||||||
};
|
};
|
||||||
tb10x_mscr0: tb10x-mdscr@FF307000 {
|
tb10x_mscr0: tb10x-mdscr@ff307000 {
|
||||||
compatible = "abilis,tb100-mdscr";
|
compatible = "abilis,tb100-mdscr";
|
||||||
reg = <0xFF307000 0x7000>;
|
reg = <0xff307000 0x7000>;
|
||||||
};
|
};
|
||||||
tb10x_scr0: tb10x-mdscr@ff30e000 {
|
tb10x_scr0: tb10x-mdscr@ff30e000 {
|
||||||
compatible = "abilis,tb100-mdscr";
|
compatible = "abilis,tb100-mdscr";
|
||||||
reg = <0xFF30e000 0x4000>;
|
reg = <0xff30e000 0x4000>;
|
||||||
tb100-mdscr-manage-tsin;
|
tb100-mdscr-manage-tsin;
|
||||||
};
|
};
|
||||||
tb10x_scr1: tb10x-mdscr@ff312000 {
|
tb10x_scr1: tb10x-mdscr@ff312000 {
|
||||||
compatible = "abilis,tb100-mdscr";
|
compatible = "abilis,tb100-mdscr";
|
||||||
reg = <0xFF312000 0x4000>;
|
reg = <0xff312000 0x4000>;
|
||||||
tb100-mdscr-manage-tsin;
|
tb100-mdscr-manage-tsin;
|
||||||
};
|
};
|
||||||
tb10x_wfb: tb10x-wfb@ff319000 {
|
tb10x_wfb: tb10x-wfb@ff319000 {
|
||||||
|
@ -41,7 +41,7 @@ core_intc: arc700-intc@cpu {
|
|||||||
* this GPIO block ORs all interrupts on CPU card (creg,..)
|
* this GPIO block ORs all interrupts on CPU card (creg,..)
|
||||||
* to uplink only 1 IRQ to ARC core intc
|
* to uplink only 1 IRQ to ARC core intc
|
||||||
*/
|
*/
|
||||||
dw-apb-gpio@0x2000 {
|
dw-apb-gpio@2000 {
|
||||||
compatible = "snps,dw-apb-gpio";
|
compatible = "snps,dw-apb-gpio";
|
||||||
reg = < 0x2000 0x80 >;
|
reg = < 0x2000 0x80 >;
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
@ -60,7 +60,7 @@ ictl_intc: gpio-controller@0 {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
debug_uart: dw-apb-uart@0x5000 {
|
debug_uart: dw-apb-uart@5000 {
|
||||||
compatible = "snps,dw-apb-uart";
|
compatible = "snps,dw-apb-uart";
|
||||||
reg = <0x5000 0x100>;
|
reg = <0x5000 0x100>;
|
||||||
clock-frequency = <33333000>;
|
clock-frequency = <33333000>;
|
||||||
@ -88,7 +88,7 @@ arcpct0: pct {
|
|||||||
* avoid duplicating the MB dtsi file given that IRQ from
|
* avoid duplicating the MB dtsi file given that IRQ from
|
||||||
* this intc to cpu intc are different for axs101 and axs103
|
* this intc to cpu intc are different for axs101 and axs103
|
||||||
*/
|
*/
|
||||||
mb_intc: dw-apb-ictl@0xe0012000 {
|
mb_intc: dw-apb-ictl@e0012000 {
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
compatible = "snps,dw-apb-ictl";
|
compatible = "snps,dw-apb-ictl";
|
||||||
reg = < 0x0 0xe0012000 0x0 0x200 >;
|
reg = < 0x0 0xe0012000 0x0 0x200 >;
|
||||||
|
@ -55,7 +55,7 @@ core_intc: archs-intc@cpu {
|
|||||||
* this GPIO block ORs all interrupts on CPU card (creg,..)
|
* this GPIO block ORs all interrupts on CPU card (creg,..)
|
||||||
* to uplink only 1 IRQ to ARC core intc
|
* to uplink only 1 IRQ to ARC core intc
|
||||||
*/
|
*/
|
||||||
dw-apb-gpio@0x2000 {
|
dw-apb-gpio@2000 {
|
||||||
compatible = "snps,dw-apb-gpio";
|
compatible = "snps,dw-apb-gpio";
|
||||||
reg = < 0x2000 0x80 >;
|
reg = < 0x2000 0x80 >;
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
@ -74,7 +74,7 @@ ictl_intc: gpio-controller@0 {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
debug_uart: dw-apb-uart@0x5000 {
|
debug_uart: dw-apb-uart@5000 {
|
||||||
compatible = "snps,dw-apb-uart";
|
compatible = "snps,dw-apb-uart";
|
||||||
reg = <0x5000 0x100>;
|
reg = <0x5000 0x100>;
|
||||||
clock-frequency = <33333000>;
|
clock-frequency = <33333000>;
|
||||||
@ -102,19 +102,19 @@ arcpct0: pct {
|
|||||||
* external DMA buffer located outside of IOC aperture.
|
* external DMA buffer located outside of IOC aperture.
|
||||||
*/
|
*/
|
||||||
axs10x_mb {
|
axs10x_mb {
|
||||||
ethernet@0x18000 {
|
ethernet@18000 {
|
||||||
dma-coherent;
|
dma-coherent;
|
||||||
};
|
};
|
||||||
|
|
||||||
ehci@0x40000 {
|
ehci@40000 {
|
||||||
dma-coherent;
|
dma-coherent;
|
||||||
};
|
};
|
||||||
|
|
||||||
ohci@0x60000 {
|
ohci@60000 {
|
||||||
dma-coherent;
|
dma-coherent;
|
||||||
};
|
};
|
||||||
|
|
||||||
mmc@0x15000 {
|
mmc@15000 {
|
||||||
dma-coherent;
|
dma-coherent;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@ -132,7 +132,7 @@ mmc@0x15000 {
|
|||||||
* avoid duplicating the MB dtsi file given that IRQ from
|
* avoid duplicating the MB dtsi file given that IRQ from
|
||||||
* this intc to cpu intc are different for axs101 and axs103
|
* this intc to cpu intc are different for axs101 and axs103
|
||||||
*/
|
*/
|
||||||
mb_intc: dw-apb-ictl@0xe0012000 {
|
mb_intc: dw-apb-ictl@e0012000 {
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
compatible = "snps,dw-apb-ictl";
|
compatible = "snps,dw-apb-ictl";
|
||||||
reg = < 0x0 0xe0012000 0x0 0x200 >;
|
reg = < 0x0 0xe0012000 0x0 0x200 >;
|
||||||
@ -153,7 +153,7 @@ reserved-memory {
|
|||||||
#size-cells = <2>;
|
#size-cells = <2>;
|
||||||
ranges;
|
ranges;
|
||||||
/*
|
/*
|
||||||
* Move frame buffer out of IOC aperture (0x8z-0xAz).
|
* Move frame buffer out of IOC aperture (0x8z-0xaz).
|
||||||
*/
|
*/
|
||||||
frame_buffer: frame_buffer@be000000 {
|
frame_buffer: frame_buffer@be000000 {
|
||||||
compatible = "shared-dma-pool";
|
compatible = "shared-dma-pool";
|
||||||
|
@ -62,7 +62,7 @@ idu_intc: idu-interrupt-controller {
|
|||||||
* this GPIO block ORs all interrupts on CPU card (creg,..)
|
* this GPIO block ORs all interrupts on CPU card (creg,..)
|
||||||
* to uplink only 1 IRQ to ARC core intc
|
* to uplink only 1 IRQ to ARC core intc
|
||||||
*/
|
*/
|
||||||
dw-apb-gpio@0x2000 {
|
dw-apb-gpio@2000 {
|
||||||
compatible = "snps,dw-apb-gpio";
|
compatible = "snps,dw-apb-gpio";
|
||||||
reg = < 0x2000 0x80 >;
|
reg = < 0x2000 0x80 >;
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
@ -81,7 +81,7 @@ ictl_intc: gpio-controller@0 {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
debug_uart: dw-apb-uart@0x5000 {
|
debug_uart: dw-apb-uart@5000 {
|
||||||
compatible = "snps,dw-apb-uart";
|
compatible = "snps,dw-apb-uart";
|
||||||
reg = <0x5000 0x100>;
|
reg = <0x5000 0x100>;
|
||||||
clock-frequency = <33333000>;
|
clock-frequency = <33333000>;
|
||||||
@ -109,19 +109,19 @@ arcpct0: pct {
|
|||||||
* external DMA buffer located outside of IOC aperture.
|
* external DMA buffer located outside of IOC aperture.
|
||||||
*/
|
*/
|
||||||
axs10x_mb {
|
axs10x_mb {
|
||||||
ethernet@0x18000 {
|
ethernet@18000 {
|
||||||
dma-coherent;
|
dma-coherent;
|
||||||
};
|
};
|
||||||
|
|
||||||
ehci@0x40000 {
|
ehci@40000 {
|
||||||
dma-coherent;
|
dma-coherent;
|
||||||
};
|
};
|
||||||
|
|
||||||
ohci@0x60000 {
|
ohci@60000 {
|
||||||
dma-coherent;
|
dma-coherent;
|
||||||
};
|
};
|
||||||
|
|
||||||
mmc@0x15000 {
|
mmc@15000 {
|
||||||
dma-coherent;
|
dma-coherent;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@ -138,7 +138,7 @@ mmc@0x15000 {
|
|||||||
* avoid duplicating the MB dtsi file given that IRQ from
|
* avoid duplicating the MB dtsi file given that IRQ from
|
||||||
* this intc to cpu intc are different for axs101 and axs103
|
* this intc to cpu intc are different for axs101 and axs103
|
||||||
*/
|
*/
|
||||||
mb_intc: dw-apb-ictl@0xe0012000 {
|
mb_intc: dw-apb-ictl@e0012000 {
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
compatible = "snps,dw-apb-ictl";
|
compatible = "snps,dw-apb-ictl";
|
||||||
reg = < 0x0 0xe0012000 0x0 0x200 >;
|
reg = < 0x0 0xe0012000 0x0 0x200 >;
|
||||||
@ -159,7 +159,7 @@ reserved-memory {
|
|||||||
#size-cells = <2>;
|
#size-cells = <2>;
|
||||||
ranges;
|
ranges;
|
||||||
/*
|
/*
|
||||||
* Move frame buffer out of IOC aperture (0x8z-0xAz).
|
* Move frame buffer out of IOC aperture (0x8z-0xaz).
|
||||||
*/
|
*/
|
||||||
frame_buffer: frame_buffer@be000000 {
|
frame_buffer: frame_buffer@be000000 {
|
||||||
compatible = "shared-dma-pool";
|
compatible = "shared-dma-pool";
|
||||||
|
@ -72,7 +72,7 @@ pguclk: pguclk {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
gmac: ethernet@0x18000 {
|
gmac: ethernet@18000 {
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
compatible = "snps,dwmac";
|
compatible = "snps,dwmac";
|
||||||
reg = < 0x18000 0x2000 >;
|
reg = < 0x18000 0x2000 >;
|
||||||
@ -88,13 +88,13 @@ gmac: ethernet@0x18000 {
|
|||||||
mac-address = [00 00 00 00 00 00]; /* Filled in by U-Boot */
|
mac-address = [00 00 00 00 00 00]; /* Filled in by U-Boot */
|
||||||
};
|
};
|
||||||
|
|
||||||
ehci@0x40000 {
|
ehci@40000 {
|
||||||
compatible = "generic-ehci";
|
compatible = "generic-ehci";
|
||||||
reg = < 0x40000 0x100 >;
|
reg = < 0x40000 0x100 >;
|
||||||
interrupts = < 8 >;
|
interrupts = < 8 >;
|
||||||
};
|
};
|
||||||
|
|
||||||
ohci@0x60000 {
|
ohci@60000 {
|
||||||
compatible = "generic-ohci";
|
compatible = "generic-ohci";
|
||||||
reg = < 0x60000 0x100 >;
|
reg = < 0x60000 0x100 >;
|
||||||
interrupts = < 8 >;
|
interrupts = < 8 >;
|
||||||
@ -118,7 +118,7 @@ ohci@0x60000 {
|
|||||||
* dw_mci_pltfm_prepare_command() is used in generic platform
|
* dw_mci_pltfm_prepare_command() is used in generic platform
|
||||||
* code.
|
* code.
|
||||||
*/
|
*/
|
||||||
mmc@0x15000 {
|
mmc@15000 {
|
||||||
compatible = "altr,socfpga-dw-mshc";
|
compatible = "altr,socfpga-dw-mshc";
|
||||||
reg = < 0x15000 0x400 >;
|
reg = < 0x15000 0x400 >;
|
||||||
fifo-depth = < 16 >;
|
fifo-depth = < 16 >;
|
||||||
@ -129,7 +129,7 @@ mmc@0x15000 {
|
|||||||
bus-width = < 4 >;
|
bus-width = < 4 >;
|
||||||
};
|
};
|
||||||
|
|
||||||
uart@0x20000 {
|
uart@20000 {
|
||||||
compatible = "snps,dw-apb-uart";
|
compatible = "snps,dw-apb-uart";
|
||||||
reg = <0x20000 0x100>;
|
reg = <0x20000 0x100>;
|
||||||
clock-frequency = <33333333>;
|
clock-frequency = <33333333>;
|
||||||
@ -139,7 +139,7 @@ uart@0x20000 {
|
|||||||
reg-io-width = <4>;
|
reg-io-width = <4>;
|
||||||
};
|
};
|
||||||
|
|
||||||
uart@0x21000 {
|
uart@21000 {
|
||||||
compatible = "snps,dw-apb-uart";
|
compatible = "snps,dw-apb-uart";
|
||||||
reg = <0x21000 0x100>;
|
reg = <0x21000 0x100>;
|
||||||
clock-frequency = <33333333>;
|
clock-frequency = <33333333>;
|
||||||
@ -150,7 +150,7 @@ uart@0x21000 {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/* UART muxed with USB data port (ttyS3) */
|
/* UART muxed with USB data port (ttyS3) */
|
||||||
uart@0x22000 {
|
uart@22000 {
|
||||||
compatible = "snps,dw-apb-uart";
|
compatible = "snps,dw-apb-uart";
|
||||||
reg = <0x22000 0x100>;
|
reg = <0x22000 0x100>;
|
||||||
clock-frequency = <33333333>;
|
clock-frequency = <33333333>;
|
||||||
@ -160,7 +160,7 @@ uart@0x22000 {
|
|||||||
reg-io-width = <4>;
|
reg-io-width = <4>;
|
||||||
};
|
};
|
||||||
|
|
||||||
i2c@0x1d000 {
|
i2c@1d000 {
|
||||||
compatible = "snps,designware-i2c";
|
compatible = "snps,designware-i2c";
|
||||||
reg = <0x1d000 0x100>;
|
reg = <0x1d000 0x100>;
|
||||||
clock-frequency = <400000>;
|
clock-frequency = <400000>;
|
||||||
@ -177,7 +177,7 @@ i2s: i2s@1e000 {
|
|||||||
#sound-dai-cells = <0>;
|
#sound-dai-cells = <0>;
|
||||||
};
|
};
|
||||||
|
|
||||||
i2c@0x1f000 {
|
i2c@1f000 {
|
||||||
compatible = "snps,designware-i2c";
|
compatible = "snps,designware-i2c";
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
@ -218,13 +218,13 @@ adv7511_output: endpoint {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
eeprom@0x54{
|
eeprom@54{
|
||||||
compatible = "atmel,24c01";
|
compatible = "atmel,24c01";
|
||||||
reg = <0x54>;
|
reg = <0x54>;
|
||||||
pagesize = <0x8>;
|
pagesize = <0x8>;
|
||||||
};
|
};
|
||||||
|
|
||||||
eeprom@0x57{
|
eeprom@57{
|
||||||
compatible = "atmel,24c04";
|
compatible = "atmel,24c04";
|
||||||
reg = <0x57>;
|
reg = <0x57>;
|
||||||
pagesize = <0x8>;
|
pagesize = <0x8>;
|
||||||
|
@ -110,12 +110,12 @@ soc {
|
|||||||
cgu_rst: reset-controller@8a0 {
|
cgu_rst: reset-controller@8a0 {
|
||||||
compatible = "snps,hsdk-reset";
|
compatible = "snps,hsdk-reset";
|
||||||
#reset-cells = <1>;
|
#reset-cells = <1>;
|
||||||
reg = <0x8A0 0x4>, <0xFF0 0x4>;
|
reg = <0x8a0 0x4>, <0xff0 0x4>;
|
||||||
};
|
};
|
||||||
|
|
||||||
core_clk: core-clk@0 {
|
core_clk: core-clk@0 {
|
||||||
compatible = "snps,hsdk-core-pll-clock";
|
compatible = "snps,hsdk-core-pll-clock";
|
||||||
reg = <0x00 0x10>, <0x14B8 0x4>;
|
reg = <0x00 0x10>, <0x14b8 0x4>;
|
||||||
#clock-cells = <0>;
|
#clock-cells = <0>;
|
||||||
clocks = <&input_clk>;
|
clocks = <&input_clk>;
|
||||||
|
|
||||||
@ -167,6 +167,18 @@ mmcclk_biu: mmcclk-biu {
|
|||||||
#clock-cells = <0>;
|
#clock-cells = <0>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
dmac_core_clk: dmac-core-clk {
|
||||||
|
compatible = "fixed-clock";
|
||||||
|
clock-frequency = <400000000>;
|
||||||
|
#clock-cells = <0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
dmac_cfg_clk: dmac-gpu-cfg-clk {
|
||||||
|
compatible = "fixed-clock";
|
||||||
|
clock-frequency = <200000000>;
|
||||||
|
#clock-cells = <0>;
|
||||||
|
};
|
||||||
|
|
||||||
gmac: ethernet@8000 {
|
gmac: ethernet@8000 {
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
compatible = "snps,dwmac";
|
compatible = "snps,dwmac";
|
||||||
@ -200,6 +212,7 @@ ohci@60000 {
|
|||||||
compatible = "snps,hsdk-v1.0-ohci", "generic-ohci";
|
compatible = "snps,hsdk-v1.0-ohci", "generic-ohci";
|
||||||
reg = <0x60000 0x100>;
|
reg = <0x60000 0x100>;
|
||||||
interrupts = <15>;
|
interrupts = <15>;
|
||||||
|
resets = <&cgu_rst HSDK_USB_RESET>;
|
||||||
dma-coherent;
|
dma-coherent;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -207,6 +220,7 @@ ehci@40000 {
|
|||||||
compatible = "snps,hsdk-v1.0-ehci", "generic-ehci";
|
compatible = "snps,hsdk-v1.0-ehci", "generic-ehci";
|
||||||
reg = <0x40000 0x100>;
|
reg = <0x40000 0x100>;
|
||||||
interrupts = <15>;
|
interrupts = <15>;
|
||||||
|
resets = <&cgu_rst HSDK_USB_RESET>;
|
||||||
dma-coherent;
|
dma-coherent;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -237,6 +251,21 @@ gpio_port_a: gpio-controller@0 {
|
|||||||
reg = <0>;
|
reg = <0>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
dmac: dmac@80000 {
|
||||||
|
compatible = "snps,axi-dma-1.01a";
|
||||||
|
reg = <0x80000 0x400>;
|
||||||
|
interrupts = <27>;
|
||||||
|
clocks = <&dmac_core_clk>, <&dmac_cfg_clk>;
|
||||||
|
clock-names = "core-clk", "cfgr-clk";
|
||||||
|
|
||||||
|
dma-channels = <4>;
|
||||||
|
snps,dma-masters = <2>;
|
||||||
|
snps,data-width = <3>;
|
||||||
|
snps,block-size = <4096 4096 4096 4096>;
|
||||||
|
snps,priority = <0 1 2 3>;
|
||||||
|
snps,axi-max-burst-len = <16>;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
memory@80000000 {
|
memory@80000000 {
|
||||||
|
@ -36,7 +36,7 @@ core_intc: archs-intc@cpu {
|
|||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
};
|
};
|
||||||
|
|
||||||
debug_uart: dw-apb-uart@0x5000 {
|
debug_uart: dw-apb-uart@5000 {
|
||||||
compatible = "snps,dw-apb-uart";
|
compatible = "snps,dw-apb-uart";
|
||||||
reg = <0x5000 0x100>;
|
reg = <0x5000 0x100>;
|
||||||
clock-frequency = <2403200>;
|
clock-frequency = <2403200>;
|
||||||
@ -49,7 +49,7 @@ debug_uart: dw-apb-uart@0x5000 {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
mb_intc: dw-apb-ictl@0xe0012000 {
|
mb_intc: dw-apb-ictl@e0012000 {
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
compatible = "snps,dw-apb-ictl";
|
compatible = "snps,dw-apb-ictl";
|
||||||
reg = < 0xe0012000 0x200 >;
|
reg = < 0xe0012000 0x200 >;
|
||||||
|
@ -44,7 +44,7 @@ idu_intc: idu-interrupt-controller {
|
|||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
};
|
};
|
||||||
|
|
||||||
debug_uart: dw-apb-uart@0x5000 {
|
debug_uart: dw-apb-uart@5000 {
|
||||||
compatible = "snps,dw-apb-uart";
|
compatible = "snps,dw-apb-uart";
|
||||||
reg = <0x5000 0x100>;
|
reg = <0x5000 0x100>;
|
||||||
clock-frequency = <2403200>;
|
clock-frequency = <2403200>;
|
||||||
@ -57,7 +57,7 @@ debug_uart: dw-apb-uart@0x5000 {
|
|||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
mb_intc: dw-apb-ictl@0xe0012000 {
|
mb_intc: dw-apb-ictl@e0012000 {
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
compatible = "snps,dw-apb-ictl";
|
compatible = "snps,dw-apb-ictl";
|
||||||
reg = < 0xe0012000 0x200 >;
|
reg = < 0xe0012000 0x200 >;
|
||||||
|
@ -36,7 +36,7 @@ pguclk: pguclk {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
ethernet@0x18000 {
|
ethernet@18000 {
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
compatible = "snps,dwmac";
|
compatible = "snps,dwmac";
|
||||||
reg = < 0x18000 0x2000 >;
|
reg = < 0x18000 0x2000 >;
|
||||||
@ -49,13 +49,13 @@ ethernet@0x18000 {
|
|||||||
clock-names = "stmmaceth";
|
clock-names = "stmmaceth";
|
||||||
};
|
};
|
||||||
|
|
||||||
ehci@0x40000 {
|
ehci@40000 {
|
||||||
compatible = "generic-ehci";
|
compatible = "generic-ehci";
|
||||||
reg = < 0x40000 0x100 >;
|
reg = < 0x40000 0x100 >;
|
||||||
interrupts = < 8 >;
|
interrupts = < 8 >;
|
||||||
};
|
};
|
||||||
|
|
||||||
uart@0x20000 {
|
uart@20000 {
|
||||||
compatible = "snps,dw-apb-uart";
|
compatible = "snps,dw-apb-uart";
|
||||||
reg = <0x20000 0x100>;
|
reg = <0x20000 0x100>;
|
||||||
clock-frequency = <2403200>;
|
clock-frequency = <2403200>;
|
||||||
@ -65,7 +65,7 @@ uart@0x20000 {
|
|||||||
reg-io-width = <4>;
|
reg-io-width = <4>;
|
||||||
};
|
};
|
||||||
|
|
||||||
uart@0x21000 {
|
uart@21000 {
|
||||||
compatible = "snps,dw-apb-uart";
|
compatible = "snps,dw-apb-uart";
|
||||||
reg = <0x21000 0x100>;
|
reg = <0x21000 0x100>;
|
||||||
clock-frequency = <2403200>;
|
clock-frequency = <2403200>;
|
||||||
@ -75,7 +75,7 @@ uart@0x21000 {
|
|||||||
reg-io-width = <4>;
|
reg-io-width = <4>;
|
||||||
};
|
};
|
||||||
|
|
||||||
uart@0x22000 {
|
uart@22000 {
|
||||||
compatible = "snps,dw-apb-uart";
|
compatible = "snps,dw-apb-uart";
|
||||||
reg = <0x22000 0x100>;
|
reg = <0x22000 0x100>;
|
||||||
clock-frequency = <2403200>;
|
clock-frequency = <2403200>;
|
||||||
@ -101,7 +101,7 @@ ps2: ps2@e0017400 {
|
|||||||
interrupt-names = "arc_ps2_irq";
|
interrupt-names = "arc_ps2_irq";
|
||||||
};
|
};
|
||||||
|
|
||||||
mmc@0x15000 {
|
mmc@15000 {
|
||||||
compatible = "snps,dw-mshc";
|
compatible = "snps,dw-mshc";
|
||||||
reg = <0x15000 0x400>;
|
reg = <0x15000 0x400>;
|
||||||
fifo-depth = <1024>;
|
fifo-depth = <1024>;
|
||||||
@ -117,11 +117,11 @@ mmc@0x15000 {
|
|||||||
* Embedded Vision subsystem UIO mappings; only relevant for EV VDK
|
* Embedded Vision subsystem UIO mappings; only relevant for EV VDK
|
||||||
*
|
*
|
||||||
* This node is intentionally put outside of MB above becase
|
* This node is intentionally put outside of MB above becase
|
||||||
* it maps areas outside of MB's 0xEz-0xFz.
|
* it maps areas outside of MB's 0xez-0xfz.
|
||||||
*/
|
*/
|
||||||
uio_ev: uio@0xD0000000 {
|
uio_ev: uio@d0000000 {
|
||||||
compatible = "generic-uio";
|
compatible = "generic-uio";
|
||||||
reg = <0xD0000000 0x2000 0xD1000000 0x2000 0x90000000 0x10000000 0xC0000000 0x10000000>;
|
reg = <0xd0000000 0x2000 0xd1000000 0x2000 0x90000000 0x10000000 0xc0000000 0x10000000>;
|
||||||
reg-names = "ev_gsa", "ev_ctrl", "ev_shared_mem", "ev_code_mem";
|
reg-names = "ev_gsa", "ev_ctrl", "ev_shared_mem", "ev_code_mem";
|
||||||
interrupt-parent = <&mb_intc>;
|
interrupt-parent = <&mb_intc>;
|
||||||
interrupts = <23>;
|
interrupts = <23>;
|
||||||
|
@ -8,6 +8,7 @@ CONFIG_NAMESPACES=y
|
|||||||
# CONFIG_UTS_NS is not set
|
# CONFIG_UTS_NS is not set
|
||||||
# CONFIG_PID_NS is not set
|
# CONFIG_PID_NS is not set
|
||||||
CONFIG_BLK_DEV_INITRD=y
|
CONFIG_BLK_DEV_INITRD=y
|
||||||
|
CONFIG_BLK_DEV_RAM=y
|
||||||
CONFIG_EMBEDDED=y
|
CONFIG_EMBEDDED=y
|
||||||
CONFIG_PERF_EVENTS=y
|
CONFIG_PERF_EVENTS=y
|
||||||
# CONFIG_VM_EVENT_COUNTERS is not set
|
# CONFIG_VM_EVENT_COUNTERS is not set
|
||||||
|
@ -82,6 +82,7 @@
|
|||||||
#define ECR_V_DTLB_MISS 0x05
|
#define ECR_V_DTLB_MISS 0x05
|
||||||
#define ECR_V_PROTV 0x06
|
#define ECR_V_PROTV 0x06
|
||||||
#define ECR_V_TRAP 0x09
|
#define ECR_V_TRAP 0x09
|
||||||
|
#define ECR_V_MISALIGN 0x0d
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* DTLB Miss and Protection Violation Cause Codes */
|
/* DTLB Miss and Protection Violation Cause Codes */
|
||||||
@ -167,14 +168,6 @@ struct bcr_mpy {
|
|||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
struct bcr_extn_xymem {
|
|
||||||
#ifdef CONFIG_CPU_BIG_ENDIAN
|
|
||||||
unsigned int ram_org:2, num_banks:4, bank_sz:4, ver:8;
|
|
||||||
#else
|
|
||||||
unsigned int ver:8, bank_sz:4, num_banks:4, ram_org:2;
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
struct bcr_iccm_arcompact {
|
struct bcr_iccm_arcompact {
|
||||||
#ifdef CONFIG_CPU_BIG_ENDIAN
|
#ifdef CONFIG_CPU_BIG_ENDIAN
|
||||||
unsigned int base:16, pad:5, sz:3, ver:8;
|
unsigned int base:16, pad:5, sz:3, ver:8;
|
||||||
@ -312,7 +305,7 @@ struct cpuinfo_arc {
|
|||||||
struct cpuinfo_arc_bpu bpu;
|
struct cpuinfo_arc_bpu bpu;
|
||||||
struct bcr_identity core;
|
struct bcr_identity core;
|
||||||
struct bcr_isa_arcv2 isa;
|
struct bcr_isa_arcv2 isa;
|
||||||
const char *details, *name;
|
const char *release, *name;
|
||||||
unsigned int vec_base;
|
unsigned int vec_base;
|
||||||
struct cpuinfo_arc_ccm iccm, dccm;
|
struct cpuinfo_arc_ccm iccm, dccm;
|
||||||
struct {
|
struct {
|
||||||
@ -322,7 +315,6 @@ struct cpuinfo_arc {
|
|||||||
timer0:1, timer1:1, rtc:1, gfrc:1, pad4:4;
|
timer0:1, timer1:1, rtc:1, gfrc:1, pad4:4;
|
||||||
} extn;
|
} extn;
|
||||||
struct bcr_mpy extn_mpy;
|
struct bcr_mpy extn_mpy;
|
||||||
struct bcr_extn_xymem extn_xymem;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct cpuinfo_arc cpuinfo_arc700[];
|
extern struct cpuinfo_arc cpuinfo_arc700[];
|
||||||
|
@ -44,7 +44,13 @@
|
|||||||
#define ARCV2_IRQ_DEF_PRIO 1
|
#define ARCV2_IRQ_DEF_PRIO 1
|
||||||
|
|
||||||
/* seed value for status register */
|
/* seed value for status register */
|
||||||
#define ISA_INIT_STATUS_BITS (STATUS_IE_MASK | STATUS_AD_MASK | \
|
#ifdef CONFIG_ARC_USE_UNALIGNED_MEM_ACCESS
|
||||||
|
#define __AD_ENB STATUS_AD_MASK
|
||||||
|
#else
|
||||||
|
#define __AD_ENB 0
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define ISA_INIT_STATUS_BITS (STATUS_IE_MASK | __AD_ENB | \
|
||||||
(ARCV2_IRQ_DEF_PRIO << 1))
|
(ARCV2_IRQ_DEF_PRIO << 1))
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
@ -105,10 +105,10 @@ static const char * const arc_pmu_ev_hw_map[] = {
|
|||||||
[PERF_COUNT_HW_INSTRUCTIONS] = "iall",
|
[PERF_COUNT_HW_INSTRUCTIONS] = "iall",
|
||||||
/* All jump instructions that are taken */
|
/* All jump instructions that are taken */
|
||||||
[PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = "ijmptak",
|
[PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = "ijmptak",
|
||||||
[PERF_COUNT_ARC_BPOK] = "bpok", /* NP-NT, PT-T, PNT-NT */
|
|
||||||
#ifdef CONFIG_ISA_ARCV2
|
#ifdef CONFIG_ISA_ARCV2
|
||||||
[PERF_COUNT_HW_BRANCH_MISSES] = "bpmp",
|
[PERF_COUNT_HW_BRANCH_MISSES] = "bpmp",
|
||||||
#else
|
#else
|
||||||
|
[PERF_COUNT_ARC_BPOK] = "bpok", /* NP-NT, PT-T, PNT-NT */
|
||||||
[PERF_COUNT_HW_BRANCH_MISSES] = "bpfail", /* NP-T, PT-NT, PNT-T */
|
[PERF_COUNT_HW_BRANCH_MISSES] = "bpfail", /* NP-T, PT-NT, PNT-T */
|
||||||
#endif
|
#endif
|
||||||
[PERF_COUNT_ARC_LDC] = "imemrdc", /* Instr: mem read cached */
|
[PERF_COUNT_ARC_LDC] = "imemrdc", /* Instr: mem read cached */
|
||||||
|
@ -21,8 +21,6 @@ static inline void arch_spin_lock(arch_spinlock_t *lock)
|
|||||||
{
|
{
|
||||||
unsigned int val;
|
unsigned int val;
|
||||||
|
|
||||||
smp_mb();
|
|
||||||
|
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
"1: llock %[val], [%[slock]] \n"
|
"1: llock %[val], [%[slock]] \n"
|
||||||
" breq %[val], %[LOCKED], 1b \n" /* spin while LOCKED */
|
" breq %[val], %[LOCKED], 1b \n" /* spin while LOCKED */
|
||||||
@ -34,6 +32,14 @@ static inline void arch_spin_lock(arch_spinlock_t *lock)
|
|||||||
[LOCKED] "r" (__ARCH_SPIN_LOCK_LOCKED__)
|
[LOCKED] "r" (__ARCH_SPIN_LOCK_LOCKED__)
|
||||||
: "memory", "cc");
|
: "memory", "cc");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ACQUIRE barrier to ensure load/store after taking the lock
|
||||||
|
* don't "bleed-up" out of the critical section (leak-in is allowed)
|
||||||
|
* http://www.spinics.net/lists/kernel/msg2010409.html
|
||||||
|
*
|
||||||
|
* ARCv2 only has load-load, store-store and all-all barrier
|
||||||
|
* thus need the full all-all barrier
|
||||||
|
*/
|
||||||
smp_mb();
|
smp_mb();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -42,8 +48,6 @@ static inline int arch_spin_trylock(arch_spinlock_t *lock)
|
|||||||
{
|
{
|
||||||
unsigned int val, got_it = 0;
|
unsigned int val, got_it = 0;
|
||||||
|
|
||||||
smp_mb();
|
|
||||||
|
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
"1: llock %[val], [%[slock]] \n"
|
"1: llock %[val], [%[slock]] \n"
|
||||||
" breq %[val], %[LOCKED], 4f \n" /* already LOCKED, just bail */
|
" breq %[val], %[LOCKED], 4f \n" /* already LOCKED, just bail */
|
||||||
@ -67,9 +71,7 @@ static inline void arch_spin_unlock(arch_spinlock_t *lock)
|
|||||||
{
|
{
|
||||||
smp_mb();
|
smp_mb();
|
||||||
|
|
||||||
lock->slock = __ARCH_SPIN_LOCK_UNLOCKED__;
|
WRITE_ONCE(lock->slock, __ARCH_SPIN_LOCK_UNLOCKED__);
|
||||||
|
|
||||||
smp_mb();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -81,8 +83,6 @@ static inline void arch_read_lock(arch_rwlock_t *rw)
|
|||||||
{
|
{
|
||||||
unsigned int val;
|
unsigned int val;
|
||||||
|
|
||||||
smp_mb();
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* zero means writer holds the lock exclusively, deny Reader.
|
* zero means writer holds the lock exclusively, deny Reader.
|
||||||
* Otherwise grant lock to first/subseq reader
|
* Otherwise grant lock to first/subseq reader
|
||||||
@ -113,8 +113,6 @@ static inline int arch_read_trylock(arch_rwlock_t *rw)
|
|||||||
{
|
{
|
||||||
unsigned int val, got_it = 0;
|
unsigned int val, got_it = 0;
|
||||||
|
|
||||||
smp_mb();
|
|
||||||
|
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
"1: llock %[val], [%[rwlock]] \n"
|
"1: llock %[val], [%[rwlock]] \n"
|
||||||
" brls %[val], %[WR_LOCKED], 4f\n" /* <= 0: already write locked, bail */
|
" brls %[val], %[WR_LOCKED], 4f\n" /* <= 0: already write locked, bail */
|
||||||
@ -140,8 +138,6 @@ static inline void arch_write_lock(arch_rwlock_t *rw)
|
|||||||
{
|
{
|
||||||
unsigned int val;
|
unsigned int val;
|
||||||
|
|
||||||
smp_mb();
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If reader(s) hold lock (lock < __ARCH_RW_LOCK_UNLOCKED__),
|
* If reader(s) hold lock (lock < __ARCH_RW_LOCK_UNLOCKED__),
|
||||||
* deny writer. Otherwise if unlocked grant to writer
|
* deny writer. Otherwise if unlocked grant to writer
|
||||||
@ -175,8 +171,6 @@ static inline int arch_write_trylock(arch_rwlock_t *rw)
|
|||||||
{
|
{
|
||||||
unsigned int val, got_it = 0;
|
unsigned int val, got_it = 0;
|
||||||
|
|
||||||
smp_mb();
|
|
||||||
|
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
"1: llock %[val], [%[rwlock]] \n"
|
"1: llock %[val], [%[rwlock]] \n"
|
||||||
" brne %[val], %[UNLOCKED], 4f \n" /* !UNLOCKED, bail */
|
" brne %[val], %[UNLOCKED], 4f \n" /* !UNLOCKED, bail */
|
||||||
@ -217,17 +211,13 @@ static inline void arch_read_unlock(arch_rwlock_t *rw)
|
|||||||
: [val] "=&r" (val)
|
: [val] "=&r" (val)
|
||||||
: [rwlock] "r" (&(rw->counter))
|
: [rwlock] "r" (&(rw->counter))
|
||||||
: "memory", "cc");
|
: "memory", "cc");
|
||||||
|
|
||||||
smp_mb();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void arch_write_unlock(arch_rwlock_t *rw)
|
static inline void arch_write_unlock(arch_rwlock_t *rw)
|
||||||
{
|
{
|
||||||
smp_mb();
|
smp_mb();
|
||||||
|
|
||||||
rw->counter = __ARCH_RW_LOCK_UNLOCKED__;
|
WRITE_ONCE(rw->counter, __ARCH_RW_LOCK_UNLOCKED__);
|
||||||
|
|
||||||
smp_mb();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#else /* !CONFIG_ARC_HAS_LLSC */
|
#else /* !CONFIG_ARC_HAS_LLSC */
|
||||||
@ -237,10 +227,9 @@ static inline void arch_spin_lock(arch_spinlock_t *lock)
|
|||||||
unsigned int val = __ARCH_SPIN_LOCK_LOCKED__;
|
unsigned int val = __ARCH_SPIN_LOCK_LOCKED__;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This smp_mb() is technically superfluous, we only need the one
|
* Per lkmm, smp_mb() is only required after _lock (and before_unlock)
|
||||||
* after the lock for providing the ACQUIRE semantics.
|
* for ACQ and REL semantics respectively. However EX based spinlocks
|
||||||
* However doing the "right" thing was regressing hackbench
|
* need the extra smp_mb to workaround a hardware quirk.
|
||||||
* so keeping this, pending further investigation
|
|
||||||
*/
|
*/
|
||||||
smp_mb();
|
smp_mb();
|
||||||
|
|
||||||
@ -257,14 +246,6 @@ static inline void arch_spin_lock(arch_spinlock_t *lock)
|
|||||||
#endif
|
#endif
|
||||||
: "memory");
|
: "memory");
|
||||||
|
|
||||||
/*
|
|
||||||
* ACQUIRE barrier to ensure load/store after taking the lock
|
|
||||||
* don't "bleed-up" out of the critical section (leak-in is allowed)
|
|
||||||
* http://www.spinics.net/lists/kernel/msg2010409.html
|
|
||||||
*
|
|
||||||
* ARCv2 only has load-load, store-store and all-all barrier
|
|
||||||
* thus need the full all-all barrier
|
|
||||||
*/
|
|
||||||
smp_mb();
|
smp_mb();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -309,8 +290,7 @@ static inline void arch_spin_unlock(arch_spinlock_t *lock)
|
|||||||
: "memory");
|
: "memory");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* superfluous, but keeping for now - see pairing version in
|
* see pairing version/comment in arch_spin_lock above
|
||||||
* arch_spin_lock above
|
|
||||||
*/
|
*/
|
||||||
smp_mb();
|
smp_mb();
|
||||||
}
|
}
|
||||||
@ -344,7 +324,6 @@ static inline int arch_read_trylock(arch_rwlock_t *rw)
|
|||||||
arch_spin_unlock(&(rw->lock_mutex));
|
arch_spin_unlock(&(rw->lock_mutex));
|
||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
|
|
||||||
smp_mb();
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,2 @@
|
|||||||
include include/uapi/asm-generic/Kbuild.asm
|
|
||||||
|
|
||||||
generic-y += kvm_para.h
|
generic-y += kvm_para.h
|
||||||
generic-y += ucontext.h
|
generic-y += ucontext.h
|
||||||
|
@ -54,7 +54,12 @@
|
|||||||
; gcc 7.3.1 (ARC GNU 2018.03) onwards generates unaligned access
|
; gcc 7.3.1 (ARC GNU 2018.03) onwards generates unaligned access
|
||||||
; by default
|
; by default
|
||||||
lr r5, [status32]
|
lr r5, [status32]
|
||||||
|
#ifdef CONFIG_ARC_USE_UNALIGNED_MEM_ACCESS
|
||||||
bset r5, r5, STATUS_AD_BIT
|
bset r5, r5, STATUS_AD_BIT
|
||||||
|
#else
|
||||||
|
; Although disabled at reset, bootloader might have enabled it
|
||||||
|
bclr r5, r5, STATUS_AD_BIT
|
||||||
|
#endif
|
||||||
kflag r5
|
kflag r5
|
||||||
#endif
|
#endif
|
||||||
.endm
|
.endm
|
||||||
@ -106,6 +111,7 @@ ENTRY(stext)
|
|||||||
; r2 = pointer to uboot provided cmdline or external DTB in mem
|
; r2 = pointer to uboot provided cmdline or external DTB in mem
|
||||||
; These are handled later in handle_uboot_args()
|
; These are handled later in handle_uboot_args()
|
||||||
st r0, [@uboot_tag]
|
st r0, [@uboot_tag]
|
||||||
|
st r1, [@uboot_magic]
|
||||||
st r2, [@uboot_arg]
|
st r2, [@uboot_arg]
|
||||||
|
|
||||||
; setup "current" tsk and optionally cache it in dedicated r25
|
; setup "current" tsk and optionally cache it in dedicated r25
|
||||||
|
@ -95,7 +95,7 @@ void arc_init_IRQ(void)
|
|||||||
|
|
||||||
/* setup status32, don't enable intr yet as kernel doesn't want */
|
/* setup status32, don't enable intr yet as kernel doesn't want */
|
||||||
tmp = read_aux_reg(ARC_REG_STATUS32);
|
tmp = read_aux_reg(ARC_REG_STATUS32);
|
||||||
tmp |= STATUS_AD_MASK | (ARCV2_IRQ_DEF_PRIO << 1);
|
tmp |= ARCV2_IRQ_DEF_PRIO << 1;
|
||||||
tmp &= ~STATUS_IE_MASK;
|
tmp &= ~STATUS_IE_MASK;
|
||||||
asm volatile("kflag %0 \n"::"r"(tmp));
|
asm volatile("kflag %0 \n"::"r"(tmp));
|
||||||
}
|
}
|
||||||
|
@ -36,6 +36,7 @@ unsigned int intr_to_DE_cnt;
|
|||||||
|
|
||||||
/* Part of U-boot ABI: see head.S */
|
/* Part of U-boot ABI: see head.S */
|
||||||
int __initdata uboot_tag;
|
int __initdata uboot_tag;
|
||||||
|
int __initdata uboot_magic;
|
||||||
char __initdata *uboot_arg;
|
char __initdata *uboot_arg;
|
||||||
|
|
||||||
const struct machine_desc *machine_desc;
|
const struct machine_desc *machine_desc;
|
||||||
@ -44,29 +45,24 @@ struct task_struct *_current_task[NR_CPUS]; /* For stack switching */
|
|||||||
|
|
||||||
struct cpuinfo_arc cpuinfo_arc700[NR_CPUS];
|
struct cpuinfo_arc cpuinfo_arc700[NR_CPUS];
|
||||||
|
|
||||||
static const struct id_to_str arc_cpu_rel[] = {
|
static const struct id_to_str arc_legacy_rel[] = {
|
||||||
|
/* ID.ARCVER, Release */
|
||||||
#ifdef CONFIG_ISA_ARCOMPACT
|
#ifdef CONFIG_ISA_ARCOMPACT
|
||||||
{ 0x34, "R4.10"},
|
{ 0x34, "R4.10"},
|
||||||
{ 0x35, "R4.11"},
|
{ 0x35, "R4.11"},
|
||||||
#else
|
#else
|
||||||
{ 0x51, "R2.0" },
|
{ 0x51, "R2.0" },
|
||||||
{ 0x52, "R2.1" },
|
{ 0x52, "R2.1" },
|
||||||
{ 0x53, "R3.0" },
|
{ 0x53, "R3.0" },
|
||||||
{ 0x54, "R3.10a" },
|
|
||||||
#endif
|
#endif
|
||||||
{ 0x00, NULL }
|
{ 0x00, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct id_to_str arc_cpu_nm[] = {
|
static const struct id_to_str arc_cpu_rel[] = {
|
||||||
#ifdef CONFIG_ISA_ARCOMPACT
|
/* UARCH.MAJOR, Release */
|
||||||
{ 0x20, "ARC 600" },
|
{ 0, "R3.10a"},
|
||||||
{ 0x30, "ARC 770" }, /* 750 identified seperately */
|
{ 1, "R3.50a"},
|
||||||
#else
|
{ 0xFF, NULL }
|
||||||
{ 0x40, "ARC EM" },
|
|
||||||
{ 0x50, "ARC HS38" },
|
|
||||||
{ 0x54, "ARC HS48" },
|
|
||||||
#endif
|
|
||||||
{ 0x00, "Unknown" }
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static void read_decode_ccm_bcr(struct cpuinfo_arc *cpu)
|
static void read_decode_ccm_bcr(struct cpuinfo_arc *cpu)
|
||||||
@ -116,31 +112,72 @@ static void read_decode_ccm_bcr(struct cpuinfo_arc *cpu)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void decode_arc_core(struct cpuinfo_arc *cpu)
|
||||||
|
{
|
||||||
|
struct bcr_uarch_build_arcv2 uarch;
|
||||||
|
const struct id_to_str *tbl;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Up until (including) the first core4 release (0x54) things were
|
||||||
|
* simple: AUX IDENTITY.ARCVER was sufficient to identify arc family
|
||||||
|
* and release: 0x50 to 0x53 was HS38, 0x54 was HS48 (dual issue)
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (cpu->core.family < 0x54) { /* includes arc700 */
|
||||||
|
|
||||||
|
for (tbl = &arc_legacy_rel[0]; tbl->id != 0; tbl++) {
|
||||||
|
if (cpu->core.family == tbl->id) {
|
||||||
|
cpu->release = tbl->str;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (is_isa_arcompact())
|
||||||
|
cpu->name = "ARC700";
|
||||||
|
else if (tbl->str)
|
||||||
|
cpu->name = "HS38";
|
||||||
|
else
|
||||||
|
cpu->name = cpu->release = "Unknown";
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* However the subsequent HS release (same 0x54) allow HS38 or HS48
|
||||||
|
* configurations and encode this info in a different BCR.
|
||||||
|
* The BCR was introduced in 0x54 so can't be read unconditionally.
|
||||||
|
*/
|
||||||
|
|
||||||
|
READ_BCR(ARC_REG_MICRO_ARCH_BCR, uarch);
|
||||||
|
|
||||||
|
if (uarch.prod == 4) {
|
||||||
|
cpu->name = "HS48";
|
||||||
|
cpu->extn.dual = 1;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
cpu->name = "HS38";
|
||||||
|
}
|
||||||
|
|
||||||
|
for (tbl = &arc_cpu_rel[0]; tbl->id != 0xFF; tbl++) {
|
||||||
|
if (uarch.maj == tbl->id) {
|
||||||
|
cpu->release = tbl->str;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void read_arc_build_cfg_regs(void)
|
static void read_arc_build_cfg_regs(void)
|
||||||
{
|
{
|
||||||
struct bcr_timer timer;
|
struct bcr_timer timer;
|
||||||
struct bcr_generic bcr;
|
struct bcr_generic bcr;
|
||||||
struct cpuinfo_arc *cpu = &cpuinfo_arc700[smp_processor_id()];
|
struct cpuinfo_arc *cpu = &cpuinfo_arc700[smp_processor_id()];
|
||||||
const struct id_to_str *tbl;
|
|
||||||
struct bcr_isa_arcv2 isa;
|
struct bcr_isa_arcv2 isa;
|
||||||
struct bcr_actionpoint ap;
|
struct bcr_actionpoint ap;
|
||||||
|
|
||||||
FIX_PTR(cpu);
|
FIX_PTR(cpu);
|
||||||
|
|
||||||
READ_BCR(AUX_IDENTITY, cpu->core);
|
READ_BCR(AUX_IDENTITY, cpu->core);
|
||||||
|
decode_arc_core(cpu);
|
||||||
for (tbl = &arc_cpu_rel[0]; tbl->id != 0; tbl++) {
|
|
||||||
if (cpu->core.family == tbl->id) {
|
|
||||||
cpu->details = tbl->str;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (tbl = &arc_cpu_nm[0]; tbl->id != 0; tbl++) {
|
|
||||||
if ((cpu->core.family & 0xF4) == tbl->id)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
cpu->name = tbl->str;
|
|
||||||
|
|
||||||
READ_BCR(ARC_REG_TIMERS_BCR, timer);
|
READ_BCR(ARC_REG_TIMERS_BCR, timer);
|
||||||
cpu->extn.timer0 = timer.t0;
|
cpu->extn.timer0 = timer.t0;
|
||||||
@ -151,16 +188,6 @@ static void read_arc_build_cfg_regs(void)
|
|||||||
|
|
||||||
READ_BCR(ARC_REG_MUL_BCR, cpu->extn_mpy);
|
READ_BCR(ARC_REG_MUL_BCR, cpu->extn_mpy);
|
||||||
|
|
||||||
cpu->extn.norm = read_aux_reg(ARC_REG_NORM_BCR) > 1 ? 1 : 0; /* 2,3 */
|
|
||||||
cpu->extn.barrel = read_aux_reg(ARC_REG_BARREL_BCR) > 1 ? 1 : 0; /* 2,3 */
|
|
||||||
cpu->extn.swap = read_aux_reg(ARC_REG_SWAP_BCR) ? 1 : 0; /* 1,3 */
|
|
||||||
cpu->extn.crc = read_aux_reg(ARC_REG_CRC_BCR) ? 1 : 0;
|
|
||||||
cpu->extn.minmax = read_aux_reg(ARC_REG_MIXMAX_BCR) > 1 ? 1 : 0; /* 2 */
|
|
||||||
cpu->extn.swape = (cpu->core.family >= 0x34) ? 1 :
|
|
||||||
IS_ENABLED(CONFIG_ARC_HAS_SWAPE);
|
|
||||||
|
|
||||||
READ_BCR(ARC_REG_XY_MEM_BCR, cpu->extn_xymem);
|
|
||||||
|
|
||||||
/* Read CCM BCRs for boot reporting even if not enabled in Kconfig */
|
/* Read CCM BCRs for boot reporting even if not enabled in Kconfig */
|
||||||
read_decode_ccm_bcr(cpu);
|
read_decode_ccm_bcr(cpu);
|
||||||
|
|
||||||
@ -198,30 +225,12 @@ static void read_arc_build_cfg_regs(void)
|
|||||||
cpu->bpu.num_pred = 2048 << bpu.pte;
|
cpu->bpu.num_pred = 2048 << bpu.pte;
|
||||||
cpu->bpu.ret_stk = 4 << bpu.rse;
|
cpu->bpu.ret_stk = 4 << bpu.rse;
|
||||||
|
|
||||||
if (cpu->core.family >= 0x54) {
|
/* if dual issue hardware, is it enabled ? */
|
||||||
|
if (cpu->extn.dual) {
|
||||||
|
unsigned int exec_ctrl;
|
||||||
|
|
||||||
struct bcr_uarch_build_arcv2 uarch;
|
READ_BCR(AUX_EXEC_CTRL, exec_ctrl);
|
||||||
|
cpu->extn.dual_enb = !(exec_ctrl & 1);
|
||||||
/*
|
|
||||||
* The first 0x54 core (uarch maj:min 0:1 or 0:2) was
|
|
||||||
* dual issue only (HS4x). But next uarch rev (1:0)
|
|
||||||
* allows it be configured for single issue (HS3x)
|
|
||||||
* Ensure we fiddle with dual issue only on HS4x
|
|
||||||
*/
|
|
||||||
READ_BCR(ARC_REG_MICRO_ARCH_BCR, uarch);
|
|
||||||
|
|
||||||
if (uarch.prod == 4) {
|
|
||||||
unsigned int exec_ctrl;
|
|
||||||
|
|
||||||
/* dual issue hardware always present */
|
|
||||||
cpu->extn.dual = 1;
|
|
||||||
|
|
||||||
READ_BCR(AUX_EXEC_CTRL, exec_ctrl);
|
|
||||||
|
|
||||||
/* dual issue hardware enabled ? */
|
|
||||||
cpu->extn.dual_enb = !(exec_ctrl & 1);
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -263,7 +272,8 @@ static char *arc_cpu_mumbojumbo(int cpu_id, char *buf, int len)
|
|||||||
{
|
{
|
||||||
struct cpuinfo_arc *cpu = &cpuinfo_arc700[cpu_id];
|
struct cpuinfo_arc *cpu = &cpuinfo_arc700[cpu_id];
|
||||||
struct bcr_identity *core = &cpu->core;
|
struct bcr_identity *core = &cpu->core;
|
||||||
int i, n = 0, ua = 0;
|
char mpy_opt[16];
|
||||||
|
int n = 0;
|
||||||
|
|
||||||
FIX_PTR(cpu);
|
FIX_PTR(cpu);
|
||||||
|
|
||||||
@ -272,7 +282,7 @@ static char *arc_cpu_mumbojumbo(int cpu_id, char *buf, int len)
|
|||||||
core->family, core->cpu_id, core->chip_id);
|
core->family, core->cpu_id, core->chip_id);
|
||||||
|
|
||||||
n += scnprintf(buf + n, len - n, "processor [%d]\t: %s %s (%s ISA) %s%s%s\n",
|
n += scnprintf(buf + n, len - n, "processor [%d]\t: %s %s (%s ISA) %s%s%s\n",
|
||||||
cpu_id, cpu->name, cpu->details,
|
cpu_id, cpu->name, cpu->release,
|
||||||
is_isa_arcompact() ? "ARCompact" : "ARCv2",
|
is_isa_arcompact() ? "ARCompact" : "ARCv2",
|
||||||
IS_AVAIL1(cpu->isa.be, "[Big-Endian]"),
|
IS_AVAIL1(cpu->isa.be, "[Big-Endian]"),
|
||||||
IS_AVAIL3(cpu->extn.dual, cpu->extn.dual_enb, " Dual-Issue "));
|
IS_AVAIL3(cpu->extn.dual, cpu->extn.dual_enb, " Dual-Issue "));
|
||||||
@ -283,61 +293,50 @@ static char *arc_cpu_mumbojumbo(int cpu_id, char *buf, int len)
|
|||||||
IS_AVAIL2(cpu->extn.rtc, "RTC [UP 64-bit] ", CONFIG_ARC_TIMERS_64BIT),
|
IS_AVAIL2(cpu->extn.rtc, "RTC [UP 64-bit] ", CONFIG_ARC_TIMERS_64BIT),
|
||||||
IS_AVAIL2(cpu->extn.gfrc, "GFRC [SMP 64-bit] ", CONFIG_ARC_TIMERS_64BIT));
|
IS_AVAIL2(cpu->extn.gfrc, "GFRC [SMP 64-bit] ", CONFIG_ARC_TIMERS_64BIT));
|
||||||
|
|
||||||
#ifdef __ARC_UNALIGNED__
|
|
||||||
ua = 1;
|
|
||||||
#endif
|
|
||||||
n += i = scnprintf(buf + n, len - n, "%s%s%s%s%s%s",
|
|
||||||
IS_AVAIL2(cpu->isa.atomic, "atomic ", CONFIG_ARC_HAS_LLSC),
|
|
||||||
IS_AVAIL2(cpu->isa.ldd, "ll64 ", CONFIG_ARC_HAS_LL64),
|
|
||||||
IS_AVAIL1(cpu->isa.unalign, "unalign "), IS_USED_RUN(ua));
|
|
||||||
|
|
||||||
if (i)
|
|
||||||
n += scnprintf(buf + n, len - n, "\n\t\t: ");
|
|
||||||
|
|
||||||
if (cpu->extn_mpy.ver) {
|
if (cpu->extn_mpy.ver) {
|
||||||
if (cpu->extn_mpy.ver <= 0x2) { /* ARCompact */
|
if (is_isa_arcompact()) {
|
||||||
n += scnprintf(buf + n, len - n, "mpy ");
|
scnprintf(mpy_opt, 16, "mpy");
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
int opt = 2; /* stock MPY/MPYH */
|
int opt = 2; /* stock MPY/MPYH */
|
||||||
|
|
||||||
if (cpu->extn_mpy.dsp) /* OPT 7-9 */
|
if (cpu->extn_mpy.dsp) /* OPT 7-9 */
|
||||||
opt = cpu->extn_mpy.dsp + 6;
|
opt = cpu->extn_mpy.dsp + 6;
|
||||||
|
|
||||||
n += scnprintf(buf + n, len - n, "mpy[opt %d] ", opt);
|
scnprintf(mpy_opt, 16, "mpy[opt %d] ", opt);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
n += scnprintf(buf + n, len - n, "%s%s%s%s%s%s%s%s\n",
|
n += scnprintf(buf + n, len - n, "%s%s%s%s%s%s%s%s\n",
|
||||||
IS_AVAIL1(cpu->isa.div_rem, "div_rem "),
|
IS_AVAIL2(cpu->isa.atomic, "atomic ", CONFIG_ARC_HAS_LLSC),
|
||||||
IS_AVAIL1(cpu->extn.norm, "norm "),
|
IS_AVAIL2(cpu->isa.ldd, "ll64 ", CONFIG_ARC_HAS_LL64),
|
||||||
IS_AVAIL1(cpu->extn.barrel, "barrel-shift "),
|
IS_AVAIL2(cpu->isa.unalign, "unalign ", CONFIG_ARC_USE_UNALIGNED_MEM_ACCESS),
|
||||||
IS_AVAIL1(cpu->extn.swap, "swap "),
|
IS_AVAIL1(cpu->extn_mpy.ver, mpy_opt),
|
||||||
IS_AVAIL1(cpu->extn.minmax, "minmax "),
|
IS_AVAIL1(cpu->isa.div_rem, "div_rem "));
|
||||||
IS_AVAIL1(cpu->extn.crc, "crc "),
|
|
||||||
IS_AVAIL2(cpu->extn.swape, "swape", CONFIG_ARC_HAS_SWAPE));
|
|
||||||
|
|
||||||
if (cpu->bpu.ver)
|
if (cpu->bpu.ver) {
|
||||||
n += scnprintf(buf + n, len - n,
|
n += scnprintf(buf + n, len - n,
|
||||||
"BPU\t\t: %s%s match, cache:%d, Predict Table:%d Return stk: %d",
|
"BPU\t\t: %s%s match, cache:%d, Predict Table:%d Return stk: %d",
|
||||||
IS_AVAIL1(cpu->bpu.full, "full"),
|
IS_AVAIL1(cpu->bpu.full, "full"),
|
||||||
IS_AVAIL1(!cpu->bpu.full, "partial"),
|
IS_AVAIL1(!cpu->bpu.full, "partial"),
|
||||||
cpu->bpu.num_cache, cpu->bpu.num_pred, cpu->bpu.ret_stk);
|
cpu->bpu.num_cache, cpu->bpu.num_pred, cpu->bpu.ret_stk);
|
||||||
|
|
||||||
if (is_isa_arcv2()) {
|
if (is_isa_arcv2()) {
|
||||||
struct bcr_lpb lpb;
|
struct bcr_lpb lpb;
|
||||||
|
|
||||||
READ_BCR(ARC_REG_LPB_BUILD, lpb);
|
READ_BCR(ARC_REG_LPB_BUILD, lpb);
|
||||||
if (lpb.ver) {
|
if (lpb.ver) {
|
||||||
unsigned int ctl;
|
unsigned int ctl;
|
||||||
ctl = read_aux_reg(ARC_REG_LPB_CTRL);
|
ctl = read_aux_reg(ARC_REG_LPB_CTRL);
|
||||||
|
|
||||||
n += scnprintf(buf + n, len - n, " Loop Buffer:%d %s",
|
n += scnprintf(buf + n, len - n, " Loop Buffer:%d %s",
|
||||||
lpb.entries,
|
lpb.entries,
|
||||||
IS_DISABLED_RUN(!ctl));
|
IS_DISABLED_RUN(!ctl));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
n += scnprintf(buf + n, len - n, "\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
n += scnprintf(buf + n, len - n, "\n");
|
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -390,11 +389,6 @@ static char *arc_extn_mumbojumbo(int cpu_id, char *buf, int len)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
n += scnprintf(buf + n, len - n, "OS ABI [v%d]\t: %s\n",
|
|
||||||
EF_ARC_OSABI_CURRENT >> 8,
|
|
||||||
EF_ARC_OSABI_CURRENT == EF_ARC_OSABI_V3 ?
|
|
||||||
"no-legacy-syscalls" : "64-bit data any register aligned");
|
|
||||||
|
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -497,6 +491,8 @@ static inline bool uboot_arg_invalid(unsigned long addr)
|
|||||||
#define UBOOT_TAG_NONE 0
|
#define UBOOT_TAG_NONE 0
|
||||||
#define UBOOT_TAG_CMDLINE 1
|
#define UBOOT_TAG_CMDLINE 1
|
||||||
#define UBOOT_TAG_DTB 2
|
#define UBOOT_TAG_DTB 2
|
||||||
|
/* We always pass 0 as magic from U-boot */
|
||||||
|
#define UBOOT_MAGIC_VALUE 0
|
||||||
|
|
||||||
void __init handle_uboot_args(void)
|
void __init handle_uboot_args(void)
|
||||||
{
|
{
|
||||||
@ -511,6 +507,11 @@ void __init handle_uboot_args(void)
|
|||||||
goto ignore_uboot_args;
|
goto ignore_uboot_args;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (uboot_magic != UBOOT_MAGIC_VALUE) {
|
||||||
|
pr_warn(IGNORE_ARGS "non zero uboot magic\n");
|
||||||
|
goto ignore_uboot_args;
|
||||||
|
}
|
||||||
|
|
||||||
if (uboot_tag != UBOOT_TAG_NONE &&
|
if (uboot_tag != UBOOT_TAG_NONE &&
|
||||||
uboot_arg_invalid((unsigned long)uboot_arg)) {
|
uboot_arg_invalid((unsigned long)uboot_arg)) {
|
||||||
pr_warn(IGNORE_ARGS "invalid uboot arg: '%px'\n", uboot_arg);
|
pr_warn(IGNORE_ARGS "invalid uboot arg: '%px'\n", uboot_arg);
|
||||||
|
@ -145,7 +145,8 @@ static void show_ecr_verbose(struct pt_regs *regs)
|
|||||||
} else if (vec == ECR_V_PROTV) {
|
} else if (vec == ECR_V_PROTV) {
|
||||||
if (cause_code == ECR_C_PROTV_INST_FETCH)
|
if (cause_code == ECR_C_PROTV_INST_FETCH)
|
||||||
pr_cont("Execute from Non-exec Page\n");
|
pr_cont("Execute from Non-exec Page\n");
|
||||||
else if (cause_code == ECR_C_PROTV_MISALIG_DATA)
|
else if (cause_code == ECR_C_PROTV_MISALIG_DATA &&
|
||||||
|
IS_ENABLED(CONFIG_ISA_ARCOMPACT))
|
||||||
pr_cont("Misaligned r/w from 0x%08lx\n", address);
|
pr_cont("Misaligned r/w from 0x%08lx\n", address);
|
||||||
else
|
else
|
||||||
pr_cont("%s access not allowed on page\n",
|
pr_cont("%s access not allowed on page\n",
|
||||||
@ -161,6 +162,8 @@ static void show_ecr_verbose(struct pt_regs *regs)
|
|||||||
pr_cont("Bus Error from Data Mem\n");
|
pr_cont("Bus Error from Data Mem\n");
|
||||||
else
|
else
|
||||||
pr_cont("Bus Error, check PRM\n");
|
pr_cont("Bus Error, check PRM\n");
|
||||||
|
} else if (vec == ECR_V_MISALIGN) {
|
||||||
|
pr_cont("Misaligned r/w from 0x%08lx\n", address);
|
||||||
#endif
|
#endif
|
||||||
} else if (vec == ECR_V_TRAP) {
|
} else if (vec == ECR_V_TRAP) {
|
||||||
if (regs->ecr_param == 5)
|
if (regs->ecr_param == 5)
|
||||||
|
@ -8,4 +8,10 @@
|
|||||||
lib-y := strchr-700.o strcpy-700.o strlen.o memcmp.o
|
lib-y := strchr-700.o strcpy-700.o strlen.o memcmp.o
|
||||||
|
|
||||||
lib-$(CONFIG_ISA_ARCOMPACT) += memcpy-700.o memset.o strcmp.o
|
lib-$(CONFIG_ISA_ARCOMPACT) += memcpy-700.o memset.o strcmp.o
|
||||||
lib-$(CONFIG_ISA_ARCV2) += memcpy-archs.o memset-archs.o strcmp-archs.o
|
lib-$(CONFIG_ISA_ARCV2) += memset-archs.o strcmp-archs.o
|
||||||
|
|
||||||
|
ifdef CONFIG_ARC_USE_UNALIGNED_MEM_ACCESS
|
||||||
|
lib-$(CONFIG_ISA_ARCV2) +=memcpy-archs-unaligned.o
|
||||||
|
else
|
||||||
|
lib-$(CONFIG_ISA_ARCV2) +=memcpy-archs.o
|
||||||
|
endif
|
||||||
|
47
arch/arc/lib/memcpy-archs-unaligned.S
Normal file
47
arch/arc/lib/memcpy-archs-unaligned.S
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
/* SPDX-License-Identifier: GPL-2.0+ */
|
||||||
|
/*
|
||||||
|
* ARCv2 memcpy implementation optimized for unaligned memory access using.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2019 Synopsys
|
||||||
|
* Author: Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/linkage.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_ARC_HAS_LL64
|
||||||
|
# define LOADX(DST,RX) ldd.ab DST, [RX, 8]
|
||||||
|
# define STOREX(SRC,RX) std.ab SRC, [RX, 8]
|
||||||
|
# define ZOLSHFT 5
|
||||||
|
# define ZOLAND 0x1F
|
||||||
|
#else
|
||||||
|
# define LOADX(DST,RX) ld.ab DST, [RX, 4]
|
||||||
|
# define STOREX(SRC,RX) st.ab SRC, [RX, 4]
|
||||||
|
# define ZOLSHFT 4
|
||||||
|
# define ZOLAND 0xF
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ENTRY_CFI(memcpy)
|
||||||
|
mov r3, r0 ; don;t clobber ret val
|
||||||
|
|
||||||
|
lsr.f lp_count, r2, ZOLSHFT
|
||||||
|
lpnz @.Lcopy32_64bytes
|
||||||
|
;; LOOP START
|
||||||
|
LOADX (r6, r1)
|
||||||
|
LOADX (r8, r1)
|
||||||
|
LOADX (r10, r1)
|
||||||
|
LOADX (r4, r1)
|
||||||
|
STOREX (r6, r3)
|
||||||
|
STOREX (r8, r3)
|
||||||
|
STOREX (r10, r3)
|
||||||
|
STOREX (r4, r3)
|
||||||
|
.Lcopy32_64bytes:
|
||||||
|
|
||||||
|
and.f lp_count, r2, ZOLAND ;Last remaining 31 bytes
|
||||||
|
lpnz @.Lcopyremainingbytes
|
||||||
|
;; LOOP START
|
||||||
|
ldb.ab r5, [r1, 1]
|
||||||
|
stb.ab r5, [r3, 1]
|
||||||
|
.Lcopyremainingbytes:
|
||||||
|
|
||||||
|
j [blink]
|
||||||
|
END_CFI(memcpy)
|
@ -26,8 +26,8 @@ config EZNPS_MTM_EXT
|
|||||||
help
|
help
|
||||||
Here we add new hierarchy for CPUs topology.
|
Here we add new hierarchy for CPUs topology.
|
||||||
We got:
|
We got:
|
||||||
Core
|
Core
|
||||||
Thread
|
Thread
|
||||||
At the new thread level each CPU represent one HW thread.
|
At the new thread level each CPU represent one HW thread.
|
||||||
At highest hierarchy each core contain 16 threads,
|
At highest hierarchy each core contain 16 threads,
|
||||||
any of them seem like CPU from Linux point of view.
|
any of them seem like CPU from Linux point of view.
|
||||||
@ -35,10 +35,10 @@ config EZNPS_MTM_EXT
|
|||||||
core and HW scheduler round robin between them.
|
core and HW scheduler round robin between them.
|
||||||
|
|
||||||
config EZNPS_MEM_ERROR_ALIGN
|
config EZNPS_MEM_ERROR_ALIGN
|
||||||
bool "ARC-EZchip Memory error as an exception"
|
bool "ARC-EZchip Memory error as an exception"
|
||||||
depends on EZNPS_MTM_EXT
|
depends on EZNPS_MTM_EXT
|
||||||
default n
|
default n
|
||||||
help
|
help
|
||||||
On the real chip of the NPS, user memory errors are handled
|
On the real chip of the NPS, user memory errors are handled
|
||||||
as a machine check exception, which is fatal, whereas on
|
as a machine check exception, which is fatal, whereas on
|
||||||
simulator platform for NPS, is handled as a Level 2 interrupt
|
simulator platform for NPS, is handled as a Level 2 interrupt
|
||||||
|
@ -1310,7 +1310,7 @@ config SCHED_SMT
|
|||||||
config HAVE_ARM_SCU
|
config HAVE_ARM_SCU
|
||||||
bool
|
bool
|
||||||
help
|
help
|
||||||
This option enables support for the ARM system coherency unit
|
This option enables support for the ARM snoop control unit
|
||||||
|
|
||||||
config HAVE_ARM_ARCH_TIMER
|
config HAVE_ARM_ARCH_TIMER
|
||||||
bool "Architected timer support"
|
bool "Architected timer support"
|
||||||
@ -1322,7 +1322,6 @@ config HAVE_ARM_ARCH_TIMER
|
|||||||
|
|
||||||
config HAVE_ARM_TWD
|
config HAVE_ARM_TWD
|
||||||
bool
|
bool
|
||||||
select TIMER_OF if OF
|
|
||||||
help
|
help
|
||||||
This options enables support for the ARM timer and watchdog unit
|
This options enables support for the ARM timer and watchdog unit
|
||||||
|
|
||||||
|
@ -20,10 +20,12 @@ config DRAM_SIZE
|
|||||||
|
|
||||||
config FLASH_MEM_BASE
|
config FLASH_MEM_BASE
|
||||||
hex 'FLASH Base Address' if SET_MEM_PARAM
|
hex 'FLASH Base Address' if SET_MEM_PARAM
|
||||||
|
depends on CPU_ARM740T || CPU_ARM946E || CPU_ARM940T
|
||||||
default 0x00400000
|
default 0x00400000
|
||||||
|
|
||||||
config FLASH_SIZE
|
config FLASH_SIZE
|
||||||
hex 'FLASH Size' if SET_MEM_PARAM
|
hex 'FLASH Size' if SET_MEM_PARAM
|
||||||
|
depends on CPU_ARM740T || CPU_ARM946E || CPU_ARM940T
|
||||||
default 0x00400000
|
default 0x00400000
|
||||||
|
|
||||||
config PROCESSOR_ID
|
config PROCESSOR_ID
|
||||||
|
@ -10,7 +10,7 @@
|
|||||||
#
|
#
|
||||||
# Copyright (C) 1995-2001 by Russell King
|
# Copyright (C) 1995-2001 by Russell King
|
||||||
|
|
||||||
LDFLAGS_vmlinux :=-p --no-undefined -X --pic-veneer
|
LDFLAGS_vmlinux := --no-undefined -X --pic-veneer
|
||||||
ifeq ($(CONFIG_CPU_ENDIAN_BE8),y)
|
ifeq ($(CONFIG_CPU_ENDIAN_BE8),y)
|
||||||
LDFLAGS_vmlinux += --be8
|
LDFLAGS_vmlinux += --be8
|
||||||
KBUILD_LDFLAGS_MODULE += --be8
|
KBUILD_LDFLAGS_MODULE += --be8
|
||||||
|
@ -8,7 +8,7 @@
|
|||||||
|
|
||||||
GCOV_PROFILE := n
|
GCOV_PROFILE := n
|
||||||
|
|
||||||
LDFLAGS_bootp :=-p --no-undefined -X \
|
LDFLAGS_bootp := --no-undefined -X \
|
||||||
--defsym initrd_phys=$(INITRD_PHYS) \
|
--defsym initrd_phys=$(INITRD_PHYS) \
|
||||||
--defsym params_phys=$(PARAMS_PHYS) -T
|
--defsym params_phys=$(PARAMS_PHYS) -T
|
||||||
AFLAGS_initrd.o :=-DINITRD=\"$(INITRD)\"
|
AFLAGS_initrd.o :=-DINITRD=\"$(INITRD)\"
|
||||||
|
@ -44,7 +44,7 @@ _start: add lr, pc, #-0x8 @ lr = current load addr
|
|||||||
*/
|
*/
|
||||||
movne r10, #0 @ terminator
|
movne r10, #0 @ terminator
|
||||||
movne r4, #2 @ Size of this entry (2 words)
|
movne r4, #2 @ Size of this entry (2 words)
|
||||||
stmneia r9, {r4, r5, r10} @ Size, ATAG_CORE, terminator
|
stmiane r9, {r4, r5, r10} @ Size, ATAG_CORE, terminator
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* find the end of the tag list, and then add an INITRD tag on the end.
|
* find the end of the tag list, and then add an INITRD tag on the end.
|
||||||
|
@ -132,8 +132,6 @@ endif
|
|||||||
ifeq ($(CONFIG_CPU_ENDIAN_BE8),y)
|
ifeq ($(CONFIG_CPU_ENDIAN_BE8),y)
|
||||||
LDFLAGS_vmlinux += --be8
|
LDFLAGS_vmlinux += --be8
|
||||||
endif
|
endif
|
||||||
# ?
|
|
||||||
LDFLAGS_vmlinux += -p
|
|
||||||
# Report unresolved symbol references
|
# Report unresolved symbol references
|
||||||
LDFLAGS_vmlinux += --no-undefined
|
LDFLAGS_vmlinux += --no-undefined
|
||||||
# Delete all temporary local symbols
|
# Delete all temporary local symbols
|
||||||
|
@ -75,7 +75,7 @@ Lrow4bpplp:
|
|||||||
tst r1, #7 @ avoid using r7 directly after
|
tst r1, #7 @ avoid using r7 directly after
|
||||||
str r7, [r0, -r5]!
|
str r7, [r0, -r5]!
|
||||||
subne r1, r1, #1
|
subne r1, r1, #1
|
||||||
ldrneb r7, [r6, r1]
|
ldrbne r7, [r6, r1]
|
||||||
bne Lrow4bpplp
|
bne Lrow4bpplp
|
||||||
ldmfd sp!, {r4 - r7, pc}
|
ldmfd sp!, {r4 - r7, pc}
|
||||||
|
|
||||||
@ -103,7 +103,7 @@ Lrow8bpplp:
|
|||||||
sub r0, r0, r5 @ avoid ip
|
sub r0, r0, r5 @ avoid ip
|
||||||
stmia r0, {r4, ip}
|
stmia r0, {r4, ip}
|
||||||
subne r1, r1, #1
|
subne r1, r1, #1
|
||||||
ldrneb r7, [r6, r1]
|
ldrbne r7, [r6, r1]
|
||||||
bne Lrow8bpplp
|
bne Lrow8bpplp
|
||||||
ldmfd sp!, {r4 - r7, pc}
|
ldmfd sp!, {r4 - r7, pc}
|
||||||
|
|
||||||
|
@ -11,6 +11,7 @@
|
|||||||
|
|
||||||
/dts-v1/;
|
/dts-v1/;
|
||||||
#include "imx28.dtsi"
|
#include "imx28.dtsi"
|
||||||
|
#include <dt-bindings/gpio/gpio.h>
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
model = "Crystalfontz CFA-10036 Board";
|
model = "Crystalfontz CFA-10036 Board";
|
||||||
@ -96,7 +97,7 @@ ssd1306: oled@3c {
|
|||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&ssd1306_cfa10036>;
|
pinctrl-0 = <&ssd1306_cfa10036>;
|
||||||
reg = <0x3c>;
|
reg = <0x3c>;
|
||||||
reset-gpios = <&gpio2 7 0>;
|
reset-gpios = <&gpio2 7 GPIO_ACTIVE_LOW>;
|
||||||
solomon,height = <32>;
|
solomon,height = <32>;
|
||||||
solomon,width = <128>;
|
solomon,width = <128>;
|
||||||
solomon,page-offset = <0>;
|
solomon,page-offset = <0>;
|
||||||
|
@ -381,7 +381,7 @@ static int __init nocache_trampoline(unsigned long _arg)
|
|||||||
unsigned int cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1);
|
unsigned int cluster = MPIDR_AFFINITY_LEVEL(mpidr, 1);
|
||||||
phys_reset_t phys_reset;
|
phys_reset_t phys_reset;
|
||||||
|
|
||||||
mcpm_set_entry_vector(cpu, cluster, cpu_resume);
|
mcpm_set_entry_vector(cpu, cluster, cpu_resume_no_hyp);
|
||||||
setup_mm_for_reboot();
|
setup_mm_for_reboot();
|
||||||
|
|
||||||
__mcpm_cpu_going_down(cpu, cluster);
|
__mcpm_cpu_going_down(cpu, cluster);
|
||||||
|
@ -18,7 +18,6 @@ generic-y += segment.h
|
|||||||
generic-y += serial.h
|
generic-y += serial.h
|
||||||
generic-y += simd.h
|
generic-y += simd.h
|
||||||
generic-y += sizes.h
|
generic-y += sizes.h
|
||||||
generic-y += timex.h
|
|
||||||
generic-y += trace_clock.h
|
generic-y += trace_clock.h
|
||||||
|
|
||||||
generated-y += mach-types.h
|
generated-y += mach-types.h
|
||||||
|
@ -55,7 +55,7 @@
|
|||||||
#define ICH_VTR __ACCESS_CP15(c12, 4, c11, 1)
|
#define ICH_VTR __ACCESS_CP15(c12, 4, c11, 1)
|
||||||
#define ICH_MISR __ACCESS_CP15(c12, 4, c11, 2)
|
#define ICH_MISR __ACCESS_CP15(c12, 4, c11, 2)
|
||||||
#define ICH_EISR __ACCESS_CP15(c12, 4, c11, 3)
|
#define ICH_EISR __ACCESS_CP15(c12, 4, c11, 3)
|
||||||
#define ICH_ELSR __ACCESS_CP15(c12, 4, c11, 5)
|
#define ICH_ELRSR __ACCESS_CP15(c12, 4, c11, 5)
|
||||||
#define ICH_VMCR __ACCESS_CP15(c12, 4, c11, 7)
|
#define ICH_VMCR __ACCESS_CP15(c12, 4, c11, 7)
|
||||||
|
|
||||||
#define __LR0(x) __ACCESS_CP15(c12, 4, c12, x)
|
#define __LR0(x) __ACCESS_CP15(c12, 4, c12, x)
|
||||||
@ -152,7 +152,7 @@ CPUIF_MAP(ICH_HCR, ICH_HCR_EL2)
|
|||||||
CPUIF_MAP(ICH_VTR, ICH_VTR_EL2)
|
CPUIF_MAP(ICH_VTR, ICH_VTR_EL2)
|
||||||
CPUIF_MAP(ICH_MISR, ICH_MISR_EL2)
|
CPUIF_MAP(ICH_MISR, ICH_MISR_EL2)
|
||||||
CPUIF_MAP(ICH_EISR, ICH_EISR_EL2)
|
CPUIF_MAP(ICH_EISR, ICH_EISR_EL2)
|
||||||
CPUIF_MAP(ICH_ELSR, ICH_ELSR_EL2)
|
CPUIF_MAP(ICH_ELRSR, ICH_ELRSR_EL2)
|
||||||
CPUIF_MAP(ICH_VMCR, ICH_VMCR_EL2)
|
CPUIF_MAP(ICH_VMCR, ICH_VMCR_EL2)
|
||||||
CPUIF_MAP(ICH_AP0R3, ICH_AP0R3_EL2)
|
CPUIF_MAP(ICH_AP0R3, ICH_AP0R3_EL2)
|
||||||
CPUIF_MAP(ICH_AP0R2, ICH_AP0R2_EL2)
|
CPUIF_MAP(ICH_AP0R2, ICH_AP0R2_EL2)
|
||||||
|
@ -376,9 +376,9 @@ THUMB( orr \reg , \reg , #PSR_T_BIT )
|
|||||||
.macro usraccoff, instr, reg, ptr, inc, off, cond, abort, t=TUSER()
|
.macro usraccoff, instr, reg, ptr, inc, off, cond, abort, t=TUSER()
|
||||||
9999:
|
9999:
|
||||||
.if \inc == 1
|
.if \inc == 1
|
||||||
\instr\cond\()b\()\t\().w \reg, [\ptr, #\off]
|
\instr\()b\t\cond\().w \reg, [\ptr, #\off]
|
||||||
.elseif \inc == 4
|
.elseif \inc == 4
|
||||||
\instr\cond\()\t\().w \reg, [\ptr, #\off]
|
\instr\t\cond\().w \reg, [\ptr, #\off]
|
||||||
.else
|
.else
|
||||||
.error "Unsupported inc macro argument"
|
.error "Unsupported inc macro argument"
|
||||||
.endif
|
.endif
|
||||||
@ -417,9 +417,9 @@ THUMB( orr \reg , \reg , #PSR_T_BIT )
|
|||||||
.rept \rept
|
.rept \rept
|
||||||
9999:
|
9999:
|
||||||
.if \inc == 1
|
.if \inc == 1
|
||||||
\instr\cond\()b\()\t \reg, [\ptr], #\inc
|
\instr\()b\t\cond \reg, [\ptr], #\inc
|
||||||
.elseif \inc == 4
|
.elseif \inc == 4
|
||||||
\instr\cond\()\t \reg, [\ptr], #\inc
|
\instr\t\cond \reg, [\ptr], #\inc
|
||||||
.else
|
.else
|
||||||
.error "Unsupported inc macro argument"
|
.error "Unsupported inc macro argument"
|
||||||
.endif
|
.endif
|
||||||
@ -460,7 +460,7 @@ THUMB( orr \reg , \reg , #PSR_T_BIT )
|
|||||||
.macro check_uaccess, addr:req, size:req, limit:req, tmp:req, bad:req
|
.macro check_uaccess, addr:req, size:req, limit:req, tmp:req, bad:req
|
||||||
#ifndef CONFIG_CPU_USE_DOMAINS
|
#ifndef CONFIG_CPU_USE_DOMAINS
|
||||||
adds \tmp, \addr, #\size - 1
|
adds \tmp, \addr, #\size - 1
|
||||||
sbcccs \tmp, \tmp, \limit
|
sbcscc \tmp, \tmp, \limit
|
||||||
bcs \bad
|
bcs \bad
|
||||||
#ifdef CONFIG_CPU_SPECTRE
|
#ifdef CONFIG_CPU_SPECTRE
|
||||||
movcs \addr, #0
|
movcs \addr, #0
|
||||||
@ -474,7 +474,7 @@ THUMB( orr \reg , \reg , #PSR_T_BIT )
|
|||||||
sub \tmp, \limit, #1
|
sub \tmp, \limit, #1
|
||||||
subs \tmp, \tmp, \addr @ tmp = limit - 1 - addr
|
subs \tmp, \tmp, \addr @ tmp = limit - 1 - addr
|
||||||
addhs \tmp, \tmp, #1 @ if (tmp >= 0) {
|
addhs \tmp, \tmp, #1 @ if (tmp >= 0) {
|
||||||
subhss \tmp, \tmp, \size @ tmp = limit - (addr + size) }
|
subshs \tmp, \tmp, \size @ tmp = limit - (addr + size) }
|
||||||
movlo \addr, #0 @ if (tmp < 0) addr = NULL
|
movlo \addr, #0 @ if (tmp < 0) addr = NULL
|
||||||
csdb
|
csdb
|
||||||
#endif
|
#endif
|
||||||
|
@ -11,6 +11,8 @@
|
|||||||
#define sev() __asm__ __volatile__ ("sev" : : : "memory")
|
#define sev() __asm__ __volatile__ ("sev" : : : "memory")
|
||||||
#define wfe() __asm__ __volatile__ ("wfe" : : : "memory")
|
#define wfe() __asm__ __volatile__ ("wfe" : : : "memory")
|
||||||
#define wfi() __asm__ __volatile__ ("wfi" : : : "memory")
|
#define wfi() __asm__ __volatile__ ("wfi" : : : "memory")
|
||||||
|
#else
|
||||||
|
#define wfe() do { } while (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if __LINUX_ARM_ARCH__ >= 7
|
#if __LINUX_ARM_ARCH__ >= 7
|
||||||
|
@ -16,25 +16,25 @@
|
|||||||
ldr \tmp, =irq_prio_h
|
ldr \tmp, =irq_prio_h
|
||||||
teq \irqstat, #0
|
teq \irqstat, #0
|
||||||
#ifdef IOMD_BASE
|
#ifdef IOMD_BASE
|
||||||
ldreqb \irqstat, [\base, #IOMD_DMAREQ] @ get dma
|
ldrbeq \irqstat, [\base, #IOMD_DMAREQ] @ get dma
|
||||||
addeq \tmp, \tmp, #256 @ irq_prio_h table size
|
addeq \tmp, \tmp, #256 @ irq_prio_h table size
|
||||||
teqeq \irqstat, #0
|
teqeq \irqstat, #0
|
||||||
bne 2406f
|
bne 2406f
|
||||||
#endif
|
#endif
|
||||||
ldreqb \irqstat, [\base, #IOMD_IRQREQA] @ get low priority
|
ldrbeq \irqstat, [\base, #IOMD_IRQREQA] @ get low priority
|
||||||
addeq \tmp, \tmp, #256 @ irq_prio_d table size
|
addeq \tmp, \tmp, #256 @ irq_prio_d table size
|
||||||
teqeq \irqstat, #0
|
teqeq \irqstat, #0
|
||||||
#ifdef IOMD_IRQREQC
|
#ifdef IOMD_IRQREQC
|
||||||
ldreqb \irqstat, [\base, #IOMD_IRQREQC]
|
ldrbeq \irqstat, [\base, #IOMD_IRQREQC]
|
||||||
addeq \tmp, \tmp, #256 @ irq_prio_l table size
|
addeq \tmp, \tmp, #256 @ irq_prio_l table size
|
||||||
teqeq \irqstat, #0
|
teqeq \irqstat, #0
|
||||||
#endif
|
#endif
|
||||||
#ifdef IOMD_IRQREQD
|
#ifdef IOMD_IRQREQD
|
||||||
ldreqb \irqstat, [\base, #IOMD_IRQREQD]
|
ldrbeq \irqstat, [\base, #IOMD_IRQREQD]
|
||||||
addeq \tmp, \tmp, #256 @ irq_prio_lc table size
|
addeq \tmp, \tmp, #256 @ irq_prio_lc table size
|
||||||
teqeq \irqstat, #0
|
teqeq \irqstat, #0
|
||||||
#endif
|
#endif
|
||||||
2406: ldrneb \irqnr, [\tmp, \irqstat] @ get IRQ number
|
2406: ldrbne \irqnr, [\tmp, \irqstat] @ get IRQ number
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -265,6 +265,14 @@ static inline bool kvm_vcpu_dabt_isextabt(struct kvm_vcpu *vcpu)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline bool kvm_is_write_fault(struct kvm_vcpu *vcpu)
|
||||||
|
{
|
||||||
|
if (kvm_vcpu_trap_is_iabt(vcpu))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return kvm_vcpu_dabt_iswrite(vcpu);
|
||||||
|
}
|
||||||
|
|
||||||
static inline u32 kvm_vcpu_hvc_get_imm(struct kvm_vcpu *vcpu)
|
static inline u32 kvm_vcpu_hvc_get_imm(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
return kvm_vcpu_get_hsr(vcpu) & HSR_HVC_IMM_MASK;
|
return kvm_vcpu_get_hsr(vcpu) & HSR_HVC_IMM_MASK;
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
#include <asm/kvm_asm.h>
|
#include <asm/kvm_asm.h>
|
||||||
#include <asm/kvm_mmio.h>
|
#include <asm/kvm_mmio.h>
|
||||||
#include <asm/fpstate.h>
|
#include <asm/fpstate.h>
|
||||||
|
#include <asm/smp_plat.h>
|
||||||
#include <kvm/arm_arch_timer.h>
|
#include <kvm/arm_arch_timer.h>
|
||||||
|
|
||||||
#define __KVM_HAVE_ARCH_INTC_INITIALIZED
|
#define __KVM_HAVE_ARCH_INTC_INITIALIZED
|
||||||
@ -57,10 +58,13 @@ int __attribute_const__ kvm_target_cpu(void);
|
|||||||
int kvm_reset_vcpu(struct kvm_vcpu *vcpu);
|
int kvm_reset_vcpu(struct kvm_vcpu *vcpu);
|
||||||
void kvm_reset_coprocs(struct kvm_vcpu *vcpu);
|
void kvm_reset_coprocs(struct kvm_vcpu *vcpu);
|
||||||
|
|
||||||
struct kvm_arch {
|
struct kvm_vmid {
|
||||||
/* VTTBR value associated with below pgd and vmid */
|
/* The VMID generation used for the virt. memory system */
|
||||||
u64 vttbr;
|
u64 vmid_gen;
|
||||||
|
u32 vmid;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct kvm_arch {
|
||||||
/* The last vcpu id that ran on each physical CPU */
|
/* The last vcpu id that ran on each physical CPU */
|
||||||
int __percpu *last_vcpu_ran;
|
int __percpu *last_vcpu_ran;
|
||||||
|
|
||||||
@ -70,11 +74,11 @@ struct kvm_arch {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* The VMID generation used for the virt. memory system */
|
/* The VMID generation used for the virt. memory system */
|
||||||
u64 vmid_gen;
|
struct kvm_vmid vmid;
|
||||||
u32 vmid;
|
|
||||||
|
|
||||||
/* Stage-2 page table */
|
/* Stage-2 page table */
|
||||||
pgd_t *pgd;
|
pgd_t *pgd;
|
||||||
|
phys_addr_t pgd_phys;
|
||||||
|
|
||||||
/* Interrupt controller */
|
/* Interrupt controller */
|
||||||
struct vgic_dist vgic;
|
struct vgic_dist vgic;
|
||||||
@ -148,6 +152,13 @@ struct kvm_cpu_context {
|
|||||||
|
|
||||||
typedef struct kvm_cpu_context kvm_cpu_context_t;
|
typedef struct kvm_cpu_context kvm_cpu_context_t;
|
||||||
|
|
||||||
|
static inline void kvm_init_host_cpu_context(kvm_cpu_context_t *cpu_ctxt,
|
||||||
|
int cpu)
|
||||||
|
{
|
||||||
|
/* The host's MPIDR is immutable, so let's set it up at boot time */
|
||||||
|
cpu_ctxt->cp15[c0_MPIDR] = cpu_logical_map(cpu);
|
||||||
|
}
|
||||||
|
|
||||||
struct vcpu_reset_state {
|
struct vcpu_reset_state {
|
||||||
unsigned long pc;
|
unsigned long pc;
|
||||||
unsigned long r0;
|
unsigned long r0;
|
||||||
@ -224,7 +235,35 @@ unsigned long kvm_arm_num_regs(struct kvm_vcpu *vcpu);
|
|||||||
int kvm_arm_copy_reg_indices(struct kvm_vcpu *vcpu, u64 __user *indices);
|
int kvm_arm_copy_reg_indices(struct kvm_vcpu *vcpu, u64 __user *indices);
|
||||||
int kvm_arm_get_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg);
|
int kvm_arm_get_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg);
|
||||||
int kvm_arm_set_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg);
|
int kvm_arm_set_reg(struct kvm_vcpu *vcpu, const struct kvm_one_reg *reg);
|
||||||
unsigned long kvm_call_hyp(void *hypfn, ...);
|
|
||||||
|
unsigned long __kvm_call_hyp(void *hypfn, ...);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The has_vhe() part doesn't get emitted, but is used for type-checking.
|
||||||
|
*/
|
||||||
|
#define kvm_call_hyp(f, ...) \
|
||||||
|
do { \
|
||||||
|
if (has_vhe()) { \
|
||||||
|
f(__VA_ARGS__); \
|
||||||
|
} else { \
|
||||||
|
__kvm_call_hyp(kvm_ksym_ref(f), ##__VA_ARGS__); \
|
||||||
|
} \
|
||||||
|
} while(0)
|
||||||
|
|
||||||
|
#define kvm_call_hyp_ret(f, ...) \
|
||||||
|
({ \
|
||||||
|
typeof(f(__VA_ARGS__)) ret; \
|
||||||
|
\
|
||||||
|
if (has_vhe()) { \
|
||||||
|
ret = f(__VA_ARGS__); \
|
||||||
|
} else { \
|
||||||
|
ret = __kvm_call_hyp(kvm_ksym_ref(f), \
|
||||||
|
##__VA_ARGS__); \
|
||||||
|
} \
|
||||||
|
\
|
||||||
|
ret; \
|
||||||
|
})
|
||||||
|
|
||||||
void force_vm_exit(const cpumask_t *mask);
|
void force_vm_exit(const cpumask_t *mask);
|
||||||
int __kvm_arm_vcpu_get_events(struct kvm_vcpu *vcpu,
|
int __kvm_arm_vcpu_get_events(struct kvm_vcpu *vcpu,
|
||||||
struct kvm_vcpu_events *events);
|
struct kvm_vcpu_events *events);
|
||||||
@ -275,7 +314,7 @@ static inline void __cpu_init_hyp_mode(phys_addr_t pgd_ptr,
|
|||||||
* compliant with the PCS!).
|
* compliant with the PCS!).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
kvm_call_hyp((void*)hyp_stack_ptr, vector_ptr, pgd_ptr);
|
__kvm_call_hyp((void*)hyp_stack_ptr, vector_ptr, pgd_ptr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void __cpu_init_stage2(void)
|
static inline void __cpu_init_stage2(void)
|
||||||
|
@ -40,6 +40,7 @@
|
|||||||
#define TTBR1 __ACCESS_CP15_64(1, c2)
|
#define TTBR1 __ACCESS_CP15_64(1, c2)
|
||||||
#define VTTBR __ACCESS_CP15_64(6, c2)
|
#define VTTBR __ACCESS_CP15_64(6, c2)
|
||||||
#define PAR __ACCESS_CP15_64(0, c7)
|
#define PAR __ACCESS_CP15_64(0, c7)
|
||||||
|
#define CNTP_CVAL __ACCESS_CP15_64(2, c14)
|
||||||
#define CNTV_CVAL __ACCESS_CP15_64(3, c14)
|
#define CNTV_CVAL __ACCESS_CP15_64(3, c14)
|
||||||
#define CNTVOFF __ACCESS_CP15_64(4, c14)
|
#define CNTVOFF __ACCESS_CP15_64(4, c14)
|
||||||
|
|
||||||
@ -85,6 +86,7 @@
|
|||||||
#define TID_PRIV __ACCESS_CP15(c13, 0, c0, 4)
|
#define TID_PRIV __ACCESS_CP15(c13, 0, c0, 4)
|
||||||
#define HTPIDR __ACCESS_CP15(c13, 4, c0, 2)
|
#define HTPIDR __ACCESS_CP15(c13, 4, c0, 2)
|
||||||
#define CNTKCTL __ACCESS_CP15(c14, 0, c1, 0)
|
#define CNTKCTL __ACCESS_CP15(c14, 0, c1, 0)
|
||||||
|
#define CNTP_CTL __ACCESS_CP15(c14, 0, c2, 1)
|
||||||
#define CNTV_CTL __ACCESS_CP15(c14, 0, c3, 1)
|
#define CNTV_CTL __ACCESS_CP15(c14, 0, c3, 1)
|
||||||
#define CNTHCTL __ACCESS_CP15(c14, 4, c1, 0)
|
#define CNTHCTL __ACCESS_CP15(c14, 4, c1, 0)
|
||||||
|
|
||||||
@ -94,6 +96,8 @@
|
|||||||
#define read_sysreg_el0(r) read_sysreg(r##_el0)
|
#define read_sysreg_el0(r) read_sysreg(r##_el0)
|
||||||
#define write_sysreg_el0(v, r) write_sysreg(v, r##_el0)
|
#define write_sysreg_el0(v, r) write_sysreg(v, r##_el0)
|
||||||
|
|
||||||
|
#define cntp_ctl_el0 CNTP_CTL
|
||||||
|
#define cntp_cval_el0 CNTP_CVAL
|
||||||
#define cntv_ctl_el0 CNTV_CTL
|
#define cntv_ctl_el0 CNTV_CTL
|
||||||
#define cntv_cval_el0 CNTV_CVAL
|
#define cntv_cval_el0 CNTV_CVAL
|
||||||
#define cntvoff_el2 CNTVOFF
|
#define cntvoff_el2 CNTVOFF
|
||||||
|
@ -421,9 +421,14 @@ static inline int hyp_map_aux_data(void)
|
|||||||
|
|
||||||
static inline void kvm_set_ipa_limit(void) {}
|
static inline void kvm_set_ipa_limit(void) {}
|
||||||
|
|
||||||
static inline bool kvm_cpu_has_cnp(void)
|
static __always_inline u64 kvm_get_vttbr(struct kvm *kvm)
|
||||||
{
|
{
|
||||||
return false;
|
struct kvm_vmid *vmid = &kvm->arch.vmid;
|
||||||
|
u64 vmid_field, baddr;
|
||||||
|
|
||||||
|
baddr = kvm->arch.pgd_phys;
|
||||||
|
vmid_field = (u64)vmid->vmid << VTTBR_VMID_SHIFT;
|
||||||
|
return kvm_phys_to_vttbr(baddr) | vmid_field;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* !__ASSEMBLY__ */
|
#endif /* !__ASSEMBLY__ */
|
||||||
|
@ -125,6 +125,9 @@ extern pgprot_t pgprot_s2_device;
|
|||||||
#define pgprot_stronglyordered(prot) \
|
#define pgprot_stronglyordered(prot) \
|
||||||
__pgprot_modify(prot, L_PTE_MT_MASK, L_PTE_MT_UNCACHED)
|
__pgprot_modify(prot, L_PTE_MT_MASK, L_PTE_MT_UNCACHED)
|
||||||
|
|
||||||
|
#define pgprot_device(prot) \
|
||||||
|
__pgprot_modify(prot, L_PTE_MT_MASK, L_PTE_MT_DEV_SHARED | L_PTE_SHARED | L_PTE_DIRTY | L_PTE_XN)
|
||||||
|
|
||||||
#ifdef CONFIG_ARM_DMA_MEM_BUFFERABLE
|
#ifdef CONFIG_ARM_DMA_MEM_BUFFERABLE
|
||||||
#define pgprot_dmacoherent(prot) \
|
#define pgprot_dmacoherent(prot) \
|
||||||
__pgprot_modify(prot, L_PTE_MT_MASK, L_PTE_MT_BUFFERABLE | L_PTE_XN)
|
__pgprot_modify(prot, L_PTE_MT_MASK, L_PTE_MT_BUFFERABLE | L_PTE_XN)
|
||||||
|
@ -89,7 +89,11 @@ extern void release_thread(struct task_struct *);
|
|||||||
unsigned long get_wchan(struct task_struct *p);
|
unsigned long get_wchan(struct task_struct *p);
|
||||||
|
|
||||||
#if __LINUX_ARM_ARCH__ == 6 || defined(CONFIG_ARM_ERRATA_754327)
|
#if __LINUX_ARM_ARCH__ == 6 || defined(CONFIG_ARM_ERRATA_754327)
|
||||||
#define cpu_relax() smp_mb()
|
#define cpu_relax() \
|
||||||
|
do { \
|
||||||
|
smp_mb(); \
|
||||||
|
__asm__ __volatile__("nop; nop; nop; nop; nop; nop; nop; nop; nop; nop;"); \
|
||||||
|
} while (0)
|
||||||
#else
|
#else
|
||||||
#define cpu_relax() barrier()
|
#define cpu_relax() barrier()
|
||||||
#endif
|
#endif
|
||||||
|
@ -67,7 +67,6 @@ struct secondary_data {
|
|||||||
void *stack;
|
void *stack;
|
||||||
};
|
};
|
||||||
extern struct secondary_data secondary_data;
|
extern struct secondary_data secondary_data;
|
||||||
extern volatile int pen_release;
|
|
||||||
extern void secondary_startup(void);
|
extern void secondary_startup(void);
|
||||||
extern void secondary_startup_arm(void);
|
extern void secondary_startup_arm(void);
|
||||||
|
|
||||||
|
@ -19,20 +19,4 @@
|
|||||||
#define TWD_TIMER_CONTROL_PERIODIC (1 << 1)
|
#define TWD_TIMER_CONTROL_PERIODIC (1 << 1)
|
||||||
#define TWD_TIMER_CONTROL_IT_ENABLE (1 << 2)
|
#define TWD_TIMER_CONTROL_IT_ENABLE (1 << 2)
|
||||||
|
|
||||||
#include <linux/ioport.h>
|
|
||||||
|
|
||||||
struct twd_local_timer {
|
|
||||||
struct resource res[2];
|
|
||||||
};
|
|
||||||
|
|
||||||
#define DEFINE_TWD_LOCAL_TIMER(name,base,irq) \
|
|
||||||
struct twd_local_timer name __initdata = { \
|
|
||||||
.res = { \
|
|
||||||
DEFINE_RES_MEM(base, 0x10), \
|
|
||||||
DEFINE_RES_IRQ(irq), \
|
|
||||||
}, \
|
|
||||||
};
|
|
||||||
|
|
||||||
int twd_local_timer_register(struct twd_local_timer *);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -210,11 +210,12 @@ static inline void arch_read_lock(arch_rwlock_t *rw)
|
|||||||
|
|
||||||
prefetchw(&rw->lock);
|
prefetchw(&rw->lock);
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
|
" .syntax unified\n"
|
||||||
"1: ldrex %0, [%2]\n"
|
"1: ldrex %0, [%2]\n"
|
||||||
" adds %0, %0, #1\n"
|
" adds %0, %0, #1\n"
|
||||||
" strexpl %1, %0, [%2]\n"
|
" strexpl %1, %0, [%2]\n"
|
||||||
WFE("mi")
|
WFE("mi")
|
||||||
" rsbpls %0, %1, #0\n"
|
" rsbspl %0, %1, #0\n"
|
||||||
" bmi 1b"
|
" bmi 1b"
|
||||||
: "=&r" (tmp), "=&r" (tmp2)
|
: "=&r" (tmp), "=&r" (tmp2)
|
||||||
: "r" (&rw->lock)
|
: "r" (&rw->lock)
|
||||||
|
@ -10,6 +10,7 @@ struct sleep_save_sp {
|
|||||||
};
|
};
|
||||||
|
|
||||||
extern void cpu_resume(void);
|
extern void cpu_resume(void);
|
||||||
|
extern void cpu_resume_no_hyp(void);
|
||||||
extern void cpu_resume_arm(void);
|
extern void cpu_resume_arm(void);
|
||||||
extern int cpu_suspend(unsigned long, int (*)(unsigned long));
|
extern int cpu_suspend(unsigned long, int (*)(unsigned long));
|
||||||
|
|
||||||
|
@ -85,7 +85,8 @@ static inline void set_fs(mm_segment_t fs)
|
|||||||
#define __range_ok(addr, size) ({ \
|
#define __range_ok(addr, size) ({ \
|
||||||
unsigned long flag, roksum; \
|
unsigned long flag, roksum; \
|
||||||
__chk_user_ptr(addr); \
|
__chk_user_ptr(addr); \
|
||||||
__asm__("adds %1, %2, %3; sbcccs %1, %1, %0; movcc %0, #0" \
|
__asm__(".syntax unified\n" \
|
||||||
|
"adds %1, %2, %3; sbcscc %1, %1, %0; movcc %0, #0" \
|
||||||
: "=&r" (flag), "=&r" (roksum) \
|
: "=&r" (flag), "=&r" (roksum) \
|
||||||
: "r" (addr), "Ir" (size), "0" (current_thread_info()->addr_limit) \
|
: "r" (addr), "Ir" (size), "0" (current_thread_info()->addr_limit) \
|
||||||
: "cc"); \
|
: "cc"); \
|
||||||
|
@ -49,7 +49,7 @@
|
|||||||
* (0 -> msp; 1 -> psp). Bits [1:0] are fixed to 0b01.
|
* (0 -> msp; 1 -> psp). Bits [1:0] are fixed to 0b01.
|
||||||
*/
|
*/
|
||||||
#define EXC_RET_STACK_MASK 0x00000004
|
#define EXC_RET_STACK_MASK 0x00000004
|
||||||
#define EXC_RET_THREADMODE_PROCESSSTACK 0xfffffffd
|
#define EXC_RET_THREADMODE_PROCESSSTACK (3 << 2)
|
||||||
|
|
||||||
/* Cache related definitions */
|
/* Cache related definitions */
|
||||||
|
|
||||||
|
@ -29,13 +29,13 @@
|
|||||||
ldr \tmp, =elf_hwcap @ may not have MVFR regs
|
ldr \tmp, =elf_hwcap @ may not have MVFR regs
|
||||||
ldr \tmp, [\tmp, #0]
|
ldr \tmp, [\tmp, #0]
|
||||||
tst \tmp, #HWCAP_VFPD32
|
tst \tmp, #HWCAP_VFPD32
|
||||||
ldcnel p11, cr0, [\base],#32*4 @ FLDMIAD \base!, {d16-d31}
|
ldclne p11, cr0, [\base],#32*4 @ FLDMIAD \base!, {d16-d31}
|
||||||
addeq \base, \base, #32*4 @ step over unused register space
|
addeq \base, \base, #32*4 @ step over unused register space
|
||||||
#else
|
#else
|
||||||
VFPFMRX \tmp, MVFR0 @ Media and VFP Feature Register 0
|
VFPFMRX \tmp, MVFR0 @ Media and VFP Feature Register 0
|
||||||
and \tmp, \tmp, #MVFR0_A_SIMD_MASK @ A_SIMD field
|
and \tmp, \tmp, #MVFR0_A_SIMD_MASK @ A_SIMD field
|
||||||
cmp \tmp, #2 @ 32 x 64bit registers?
|
cmp \tmp, #2 @ 32 x 64bit registers?
|
||||||
ldceql p11, cr0, [\base],#32*4 @ FLDMIAD \base!, {d16-d31}
|
ldcleq p11, cr0, [\base],#32*4 @ FLDMIAD \base!, {d16-d31}
|
||||||
addne \base, \base, #32*4 @ step over unused register space
|
addne \base, \base, #32*4 @ step over unused register space
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
@ -53,13 +53,13 @@
|
|||||||
ldr \tmp, =elf_hwcap @ may not have MVFR regs
|
ldr \tmp, =elf_hwcap @ may not have MVFR regs
|
||||||
ldr \tmp, [\tmp, #0]
|
ldr \tmp, [\tmp, #0]
|
||||||
tst \tmp, #HWCAP_VFPD32
|
tst \tmp, #HWCAP_VFPD32
|
||||||
stcnel p11, cr0, [\base],#32*4 @ FSTMIAD \base!, {d16-d31}
|
stclne p11, cr0, [\base],#32*4 @ FSTMIAD \base!, {d16-d31}
|
||||||
addeq \base, \base, #32*4 @ step over unused register space
|
addeq \base, \base, #32*4 @ step over unused register space
|
||||||
#else
|
#else
|
||||||
VFPFMRX \tmp, MVFR0 @ Media and VFP Feature Register 0
|
VFPFMRX \tmp, MVFR0 @ Media and VFP Feature Register 0
|
||||||
and \tmp, \tmp, #MVFR0_A_SIMD_MASK @ A_SIMD field
|
and \tmp, \tmp, #MVFR0_A_SIMD_MASK @ A_SIMD field
|
||||||
cmp \tmp, #2 @ 32 x 64bit registers?
|
cmp \tmp, #2 @ 32 x 64bit registers?
|
||||||
stceql p11, cr0, [\base],#32*4 @ FSTMIAD \base!, {d16-d31}
|
stcleq p11, cr0, [\base],#32*4 @ FSTMIAD \base!, {d16-d31}
|
||||||
addne \base, \base, #32*4 @ step over unused register space
|
addne \base, \base, #32*4 @ step over unused register space
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
@ -173,7 +173,7 @@
|
|||||||
|
|
||||||
.macro senduart, rd, rx
|
.macro senduart, rd, rx
|
||||||
cmp \rx, #0
|
cmp \rx, #0
|
||||||
strneb \rd, [\rx, #UART_TX << UART_SHIFT]
|
strbne \rd, [\rx, #UART_TX << UART_SHIFT]
|
||||||
1001:
|
1001:
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
# SPDX-License-Identifier: GPL-2.0
|
# SPDX-License-Identifier: GPL-2.0
|
||||||
include include/uapi/asm-generic/Kbuild.asm
|
|
||||||
|
|
||||||
generated-y += unistd-common.h
|
generated-y += unistd-common.h
|
||||||
generated-y += unistd-oabi.h
|
generated-y += unistd-oabi.h
|
||||||
|
@ -86,7 +86,7 @@ hexbuf_rel: .long hexbuf_addr - .
|
|||||||
ENTRY(printascii)
|
ENTRY(printascii)
|
||||||
addruart_current r3, r1, r2
|
addruart_current r3, r1, r2
|
||||||
1: teq r0, #0
|
1: teq r0, #0
|
||||||
ldrneb r1, [r0], #1
|
ldrbne r1, [r0], #1
|
||||||
teqne r1, #0
|
teqne r1, #0
|
||||||
reteq lr
|
reteq lr
|
||||||
2: teq r1, #'\n'
|
2: teq r1, #'\n'
|
||||||
|
@ -636,7 +636,7 @@ call_fpe:
|
|||||||
@ Test if we need to give access to iWMMXt coprocessors
|
@ Test if we need to give access to iWMMXt coprocessors
|
||||||
ldr r5, [r10, #TI_FLAGS]
|
ldr r5, [r10, #TI_FLAGS]
|
||||||
rsbs r7, r8, #(1 << 8) @ CP 0 or 1 only
|
rsbs r7, r8, #(1 << 8) @ CP 0 or 1 only
|
||||||
movcss r7, r5, lsr #(TIF_USING_IWMMXT + 1)
|
movscs r7, r5, lsr #(TIF_USING_IWMMXT + 1)
|
||||||
bcs iwmmxt_task_enable
|
bcs iwmmxt_task_enable
|
||||||
#endif
|
#endif
|
||||||
ARM( add pc, pc, r8, lsr #6 )
|
ARM( add pc, pc, r8, lsr #6 )
|
||||||
@ -872,7 +872,7 @@ __kuser_cmpxchg64: @ 0xffff0f60
|
|||||||
smp_dmb arm
|
smp_dmb arm
|
||||||
1: ldrexd r0, r1, [r2] @ load current val
|
1: ldrexd r0, r1, [r2] @ load current val
|
||||||
eors r3, r0, r4 @ compare with oldval (1)
|
eors r3, r0, r4 @ compare with oldval (1)
|
||||||
eoreqs r3, r1, r5 @ compare with oldval (2)
|
eorseq r3, r1, r5 @ compare with oldval (2)
|
||||||
strexdeq r3, r6, r7, [r2] @ store newval if eq
|
strexdeq r3, r6, r7, [r2] @ store newval if eq
|
||||||
teqeq r3, #1 @ success?
|
teqeq r3, #1 @ success?
|
||||||
beq 1b @ if no then retry
|
beq 1b @ if no then retry
|
||||||
@ -896,8 +896,8 @@ __kuser_cmpxchg64: @ 0xffff0f60
|
|||||||
ldmia r1, {r6, lr} @ load new val
|
ldmia r1, {r6, lr} @ load new val
|
||||||
1: ldmia r2, {r0, r1} @ load current val
|
1: ldmia r2, {r0, r1} @ load current val
|
||||||
eors r3, r0, r4 @ compare with oldval (1)
|
eors r3, r0, r4 @ compare with oldval (1)
|
||||||
eoreqs r3, r1, r5 @ compare with oldval (2)
|
eorseq r3, r1, r5 @ compare with oldval (2)
|
||||||
2: stmeqia r2, {r6, lr} @ store newval if eq
|
2: stmiaeq r2, {r6, lr} @ store newval if eq
|
||||||
rsbs r0, r3, #0 @ set return val and C flag
|
rsbs r0, r3, #0 @ set return val and C flag
|
||||||
ldmfd sp!, {r4, r5, r6, pc}
|
ldmfd sp!, {r4, r5, r6, pc}
|
||||||
|
|
||||||
@ -911,7 +911,7 @@ kuser_cmpxchg64_fixup:
|
|||||||
mov r7, #0xffff0fff
|
mov r7, #0xffff0fff
|
||||||
sub r7, r7, #(0xffff0fff - (0xffff0f60 + (1b - __kuser_cmpxchg64)))
|
sub r7, r7, #(0xffff0fff - (0xffff0f60 + (1b - __kuser_cmpxchg64)))
|
||||||
subs r8, r4, r7
|
subs r8, r4, r7
|
||||||
rsbcss r8, r8, #(2b - 1b)
|
rsbscs r8, r8, #(2b - 1b)
|
||||||
strcs r7, [sp, #S_PC]
|
strcs r7, [sp, #S_PC]
|
||||||
#if __LINUX_ARM_ARCH__ < 6
|
#if __LINUX_ARM_ARCH__ < 6
|
||||||
bcc kuser_cmpxchg32_fixup
|
bcc kuser_cmpxchg32_fixup
|
||||||
@ -969,7 +969,7 @@ kuser_cmpxchg32_fixup:
|
|||||||
mov r7, #0xffff0fff
|
mov r7, #0xffff0fff
|
||||||
sub r7, r7, #(0xffff0fff - (0xffff0fc0 + (1b - __kuser_cmpxchg)))
|
sub r7, r7, #(0xffff0fff - (0xffff0fc0 + (1b - __kuser_cmpxchg)))
|
||||||
subs r8, r4, r7
|
subs r8, r4, r7
|
||||||
rsbcss r8, r8, #(2b - 1b)
|
rsbscs r8, r8, #(2b - 1b)
|
||||||
strcs r7, [sp, #S_PC]
|
strcs r7, [sp, #S_PC]
|
||||||
ret lr
|
ret lr
|
||||||
.previous
|
.previous
|
||||||
|
@ -373,7 +373,7 @@ sys_syscall:
|
|||||||
movhs scno, #0
|
movhs scno, #0
|
||||||
csdb
|
csdb
|
||||||
#endif
|
#endif
|
||||||
stmloia sp, {r5, r6} @ shuffle args
|
stmialo sp, {r5, r6} @ shuffle args
|
||||||
movlo r0, r1
|
movlo r0, r1
|
||||||
movlo r1, r2
|
movlo r1, r2
|
||||||
movlo r2, r3
|
movlo r2, r3
|
||||||
|
@ -127,7 +127,8 @@
|
|||||||
*/
|
*/
|
||||||
.macro v7m_exception_slow_exit ret_r0
|
.macro v7m_exception_slow_exit ret_r0
|
||||||
cpsid i
|
cpsid i
|
||||||
ldr lr, =EXC_RET_THREADMODE_PROCESSSTACK
|
ldr lr, =exc_ret
|
||||||
|
ldr lr, [lr]
|
||||||
|
|
||||||
@ read original r12, sp, lr, pc and xPSR
|
@ read original r12, sp, lr, pc and xPSR
|
||||||
add r12, sp, #S_IP
|
add r12, sp, #S_IP
|
||||||
@ -387,8 +388,8 @@
|
|||||||
badr lr, \ret @ return address
|
badr lr, \ret @ return address
|
||||||
.if \reload
|
.if \reload
|
||||||
add r1, sp, #S_R0 + S_OFF @ pointer to regs
|
add r1, sp, #S_R0 + S_OFF @ pointer to regs
|
||||||
ldmccia r1, {r0 - r6} @ reload r0-r6
|
ldmiacc r1, {r0 - r6} @ reload r0-r6
|
||||||
stmccia sp, {r4, r5} @ update stack arguments
|
stmiacc sp, {r4, r5} @ update stack arguments
|
||||||
.endif
|
.endif
|
||||||
ldrcc pc, [\table, \tmp, lsl #2] @ call sys_* routine
|
ldrcc pc, [\table, \tmp, lsl #2] @ call sys_* routine
|
||||||
#else
|
#else
|
||||||
@ -396,8 +397,8 @@
|
|||||||
badr lr, \ret @ return address
|
badr lr, \ret @ return address
|
||||||
.if \reload
|
.if \reload
|
||||||
add r1, sp, #S_R0 + S_OFF @ pointer to regs
|
add r1, sp, #S_R0 + S_OFF @ pointer to regs
|
||||||
ldmccia r1, {r0 - r6} @ reload r0-r6
|
ldmiacc r1, {r0 - r6} @ reload r0-r6
|
||||||
stmccia sp, {r4, r5} @ update stack arguments
|
stmiacc sp, {r4, r5} @ update stack arguments
|
||||||
.endif
|
.endif
|
||||||
ldrcc pc, [\table, \nr, lsl #2] @ call sys_* routine
|
ldrcc pc, [\table, \nr, lsl #2] @ call sys_* routine
|
||||||
#endif
|
#endif
|
||||||
|
@ -146,3 +146,7 @@ ENTRY(vector_table)
|
|||||||
.rept CONFIG_CPU_V7M_NUM_IRQ
|
.rept CONFIG_CPU_V7M_NUM_IRQ
|
||||||
.long __irq_entry @ External Interrupts
|
.long __irq_entry @ External Interrupts
|
||||||
.endr
|
.endr
|
||||||
|
.align 2
|
||||||
|
.globl exc_ret
|
||||||
|
exc_ret:
|
||||||
|
.space 4
|
||||||
|
@ -439,8 +439,8 @@ M_CLASS(str r6, [r12, #PMSAv8_RLAR_A(3)])
|
|||||||
str r5, [r12, #PMSAv8_RBAR_A(0)]
|
str r5, [r12, #PMSAv8_RBAR_A(0)]
|
||||||
str r6, [r12, #PMSAv8_RLAR_A(0)]
|
str r6, [r12, #PMSAv8_RLAR_A(0)]
|
||||||
#else
|
#else
|
||||||
mcr p15, 0, r5, c6, c10, 1 @ PRBAR4
|
mcr p15, 0, r5, c6, c10, 0 @ PRBAR4
|
||||||
mcr p15, 0, r6, c6, c10, 2 @ PRLAR4
|
mcr p15, 0, r6, c6, c10, 1 @ PRLAR4
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
ret lr
|
ret lr
|
||||||
|
@ -180,8 +180,8 @@ ARM_BE8(orr r7, r7, #(1 << 25)) @ HSCTLR.EE
|
|||||||
@ Check whether GICv3 system registers are available
|
@ Check whether GICv3 system registers are available
|
||||||
mrc p15, 0, r7, c0, c1, 1 @ ID_PFR1
|
mrc p15, 0, r7, c0, c1, 1 @ ID_PFR1
|
||||||
ubfx r7, r7, #28, #4
|
ubfx r7, r7, #28, #4
|
||||||
cmp r7, #1
|
teq r7, #0
|
||||||
bne 2f
|
beq 2f
|
||||||
|
|
||||||
@ Enable system register accesses
|
@ Enable system register accesses
|
||||||
mrc p15, 4, r7, c12, c9, 5 @ ICC_HSRE
|
mrc p15, 4, r7, c12, c9, 5 @ ICC_HSRE
|
||||||
|
@ -91,8 +91,11 @@ void machine_crash_nonpanic_core(void *unused)
|
|||||||
|
|
||||||
set_cpu_online(smp_processor_id(), false);
|
set_cpu_online(smp_processor_id(), false);
|
||||||
atomic_dec(&waiting_for_crash_ipi);
|
atomic_dec(&waiting_for_crash_ipi);
|
||||||
while (1)
|
|
||||||
|
while (1) {
|
||||||
cpu_relax();
|
cpu_relax();
|
||||||
|
wfe();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void crash_smp_send_stop(void)
|
void crash_smp_send_stop(void)
|
||||||
|
@ -16,7 +16,7 @@ struct patch {
|
|||||||
unsigned int insn;
|
unsigned int insn;
|
||||||
};
|
};
|
||||||
|
|
||||||
static DEFINE_SPINLOCK(patch_lock);
|
static DEFINE_RAW_SPINLOCK(patch_lock);
|
||||||
|
|
||||||
static void __kprobes *patch_map(void *addr, int fixmap, unsigned long *flags)
|
static void __kprobes *patch_map(void *addr, int fixmap, unsigned long *flags)
|
||||||
__acquires(&patch_lock)
|
__acquires(&patch_lock)
|
||||||
@ -33,7 +33,7 @@ static void __kprobes *patch_map(void *addr, int fixmap, unsigned long *flags)
|
|||||||
return addr;
|
return addr;
|
||||||
|
|
||||||
if (flags)
|
if (flags)
|
||||||
spin_lock_irqsave(&patch_lock, *flags);
|
raw_spin_lock_irqsave(&patch_lock, *flags);
|
||||||
else
|
else
|
||||||
__acquire(&patch_lock);
|
__acquire(&patch_lock);
|
||||||
|
|
||||||
@ -48,7 +48,7 @@ static void __kprobes patch_unmap(int fixmap, unsigned long *flags)
|
|||||||
clear_fixmap(fixmap);
|
clear_fixmap(fixmap);
|
||||||
|
|
||||||
if (flags)
|
if (flags)
|
||||||
spin_unlock_irqrestore(&patch_lock, *flags);
|
raw_spin_unlock_irqrestore(&patch_lock, *flags);
|
||||||
else
|
else
|
||||||
__release(&patch_lock);
|
__release(&patch_lock);
|
||||||
}
|
}
|
||||||
|
@ -120,6 +120,14 @@ ENDPROC(cpu_resume_after_mmu)
|
|||||||
.text
|
.text
|
||||||
.align
|
.align
|
||||||
|
|
||||||
|
#ifdef CONFIG_MCPM
|
||||||
|
.arm
|
||||||
|
THUMB( .thumb )
|
||||||
|
ENTRY(cpu_resume_no_hyp)
|
||||||
|
ARM_BE8(setend be) @ ensure we are in BE mode
|
||||||
|
b no_hyp
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_MMU
|
#ifdef CONFIG_MMU
|
||||||
.arm
|
.arm
|
||||||
ENTRY(cpu_resume_arm)
|
ENTRY(cpu_resume_arm)
|
||||||
@ -135,6 +143,7 @@ ARM_BE8(setend be) @ ensure we are in BE mode
|
|||||||
bl __hyp_stub_install_secondary
|
bl __hyp_stub_install_secondary
|
||||||
#endif
|
#endif
|
||||||
safe_svcmode_maskall r1
|
safe_svcmode_maskall r1
|
||||||
|
no_hyp:
|
||||||
mov r1, #0
|
mov r1, #0
|
||||||
ALT_SMP(mrc p15, 0, r0, c0, c0, 5)
|
ALT_SMP(mrc p15, 0, r0, c0, c0, 5)
|
||||||
ALT_UP_B(1f)
|
ALT_UP_B(1f)
|
||||||
@ -163,6 +172,9 @@ ENDPROC(cpu_resume)
|
|||||||
|
|
||||||
#ifdef CONFIG_MMU
|
#ifdef CONFIG_MMU
|
||||||
ENDPROC(cpu_resume_arm)
|
ENDPROC(cpu_resume_arm)
|
||||||
|
#endif
|
||||||
|
#ifdef CONFIG_MCPM
|
||||||
|
ENDPROC(cpu_resume_no_hyp)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
.align 2
|
.align 2
|
||||||
|
@ -62,12 +62,6 @@
|
|||||||
*/
|
*/
|
||||||
struct secondary_data secondary_data;
|
struct secondary_data secondary_data;
|
||||||
|
|
||||||
/*
|
|
||||||
* control for which core is the next to come out of the secondary
|
|
||||||
* boot "holding pen"
|
|
||||||
*/
|
|
||||||
volatile int pen_release = -1;
|
|
||||||
|
|
||||||
enum ipi_msg_type {
|
enum ipi_msg_type {
|
||||||
IPI_WAKEUP,
|
IPI_WAKEUP,
|
||||||
IPI_TIMER,
|
IPI_TIMER,
|
||||||
@ -604,8 +598,10 @@ static void ipi_cpu_stop(unsigned int cpu)
|
|||||||
local_fiq_disable();
|
local_fiq_disable();
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
|
|
||||||
while (1)
|
while (1) {
|
||||||
cpu_relax();
|
cpu_relax();
|
||||||
|
wfe();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static DEFINE_PER_CPU(struct completion *, cpu_completion);
|
static DEFINE_PER_CPU(struct completion *, cpu_completion);
|
||||||
|
@ -100,8 +100,6 @@ static void twd_timer_stop(void)
|
|||||||
disable_percpu_irq(clk->irq);
|
disable_percpu_irq(clk->irq);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_COMMON_CLK
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Updates clockevent frequency when the cpu frequency changes.
|
* Updates clockevent frequency when the cpu frequency changes.
|
||||||
* Called on the cpu that is changing frequency with interrupts disabled.
|
* Called on the cpu that is changing frequency with interrupts disabled.
|
||||||
@ -143,54 +141,6 @@ static int twd_clk_init(void)
|
|||||||
}
|
}
|
||||||
core_initcall(twd_clk_init);
|
core_initcall(twd_clk_init);
|
||||||
|
|
||||||
#elif defined (CONFIG_CPU_FREQ)
|
|
||||||
|
|
||||||
#include <linux/cpufreq.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Updates clockevent frequency when the cpu frequency changes.
|
|
||||||
* Called on the cpu that is changing frequency with interrupts disabled.
|
|
||||||
*/
|
|
||||||
static void twd_update_frequency(void *data)
|
|
||||||
{
|
|
||||||
twd_timer_rate = clk_get_rate(twd_clk);
|
|
||||||
|
|
||||||
clockevents_update_freq(raw_cpu_ptr(twd_evt), twd_timer_rate);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int twd_cpufreq_transition(struct notifier_block *nb,
|
|
||||||
unsigned long state, void *data)
|
|
||||||
{
|
|
||||||
struct cpufreq_freqs *freqs = data;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The twd clock events must be reprogrammed to account for the new
|
|
||||||
* frequency. The timer is local to a cpu, so cross-call to the
|
|
||||||
* changing cpu.
|
|
||||||
*/
|
|
||||||
if (state == CPUFREQ_POSTCHANGE)
|
|
||||||
smp_call_function_single(freqs->cpu, twd_update_frequency,
|
|
||||||
NULL, 1);
|
|
||||||
|
|
||||||
return NOTIFY_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct notifier_block twd_cpufreq_nb = {
|
|
||||||
.notifier_call = twd_cpufreq_transition,
|
|
||||||
};
|
|
||||||
|
|
||||||
static int twd_cpufreq_init(void)
|
|
||||||
{
|
|
||||||
if (twd_evt && raw_cpu_ptr(twd_evt) && !IS_ERR(twd_clk))
|
|
||||||
return cpufreq_register_notifier(&twd_cpufreq_nb,
|
|
||||||
CPUFREQ_TRANSITION_NOTIFIER);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
core_initcall(twd_cpufreq_init);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static void twd_calibrate_rate(void)
|
static void twd_calibrate_rate(void)
|
||||||
{
|
{
|
||||||
unsigned long count;
|
unsigned long count;
|
||||||
@ -366,21 +316,6 @@ static int __init twd_local_timer_common_register(struct device_node *np)
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
int __init twd_local_timer_register(struct twd_local_timer *tlt)
|
|
||||||
{
|
|
||||||
if (twd_base || twd_evt)
|
|
||||||
return -EBUSY;
|
|
||||||
|
|
||||||
twd_ppi = tlt->res[1].start;
|
|
||||||
|
|
||||||
twd_base = ioremap(tlt->res[0].start, resource_size(&tlt->res[0]));
|
|
||||||
if (!twd_base)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
return twd_local_timer_common_register(NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CONFIG_OF
|
|
||||||
static int __init twd_local_timer_of_register(struct device_node *np)
|
static int __init twd_local_timer_of_register(struct device_node *np)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
@ -406,4 +341,3 @@ static int __init twd_local_timer_of_register(struct device_node *np)
|
|||||||
TIMER_OF_DECLARE(arm_twd_a9, "arm,cortex-a9-twd-timer", twd_local_timer_of_register);
|
TIMER_OF_DECLARE(arm_twd_a9, "arm,cortex-a9-twd-timer", twd_local_timer_of_register);
|
||||||
TIMER_OF_DECLARE(arm_twd_a5, "arm,cortex-a5-twd-timer", twd_local_timer_of_register);
|
TIMER_OF_DECLARE(arm_twd_a5, "arm,cortex-a5-twd-timer", twd_local_timer_of_register);
|
||||||
TIMER_OF_DECLARE(arm_twd_11mp, "arm,arm11mp-twd-timer", twd_local_timer_of_register);
|
TIMER_OF_DECLARE(arm_twd_11mp, "arm,arm11mp-twd-timer", twd_local_timer_of_register);
|
||||||
#endif
|
|
||||||
|
@ -93,7 +93,7 @@ extern const struct unwind_idx __start_unwind_idx[];
|
|||||||
static const struct unwind_idx *__origin_unwind_idx;
|
static const struct unwind_idx *__origin_unwind_idx;
|
||||||
extern const struct unwind_idx __stop_unwind_idx[];
|
extern const struct unwind_idx __stop_unwind_idx[];
|
||||||
|
|
||||||
static DEFINE_SPINLOCK(unwind_lock);
|
static DEFINE_RAW_SPINLOCK(unwind_lock);
|
||||||
static LIST_HEAD(unwind_tables);
|
static LIST_HEAD(unwind_tables);
|
||||||
|
|
||||||
/* Convert a prel31 symbol to an absolute address */
|
/* Convert a prel31 symbol to an absolute address */
|
||||||
@ -201,7 +201,7 @@ static const struct unwind_idx *unwind_find_idx(unsigned long addr)
|
|||||||
/* module unwind tables */
|
/* module unwind tables */
|
||||||
struct unwind_table *table;
|
struct unwind_table *table;
|
||||||
|
|
||||||
spin_lock_irqsave(&unwind_lock, flags);
|
raw_spin_lock_irqsave(&unwind_lock, flags);
|
||||||
list_for_each_entry(table, &unwind_tables, list) {
|
list_for_each_entry(table, &unwind_tables, list) {
|
||||||
if (addr >= table->begin_addr &&
|
if (addr >= table->begin_addr &&
|
||||||
addr < table->end_addr) {
|
addr < table->end_addr) {
|
||||||
@ -213,7 +213,7 @@ static const struct unwind_idx *unwind_find_idx(unsigned long addr)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
spin_unlock_irqrestore(&unwind_lock, flags);
|
raw_spin_unlock_irqrestore(&unwind_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
pr_debug("%s: idx = %p\n", __func__, idx);
|
pr_debug("%s: idx = %p\n", __func__, idx);
|
||||||
@ -529,9 +529,9 @@ struct unwind_table *unwind_table_add(unsigned long start, unsigned long size,
|
|||||||
tab->begin_addr = text_addr;
|
tab->begin_addr = text_addr;
|
||||||
tab->end_addr = text_addr + text_size;
|
tab->end_addr = text_addr + text_size;
|
||||||
|
|
||||||
spin_lock_irqsave(&unwind_lock, flags);
|
raw_spin_lock_irqsave(&unwind_lock, flags);
|
||||||
list_add_tail(&tab->list, &unwind_tables);
|
list_add_tail(&tab->list, &unwind_tables);
|
||||||
spin_unlock_irqrestore(&unwind_lock, flags);
|
raw_spin_unlock_irqrestore(&unwind_lock, flags);
|
||||||
|
|
||||||
return tab;
|
return tab;
|
||||||
}
|
}
|
||||||
@ -543,9 +543,9 @@ void unwind_table_del(struct unwind_table *tab)
|
|||||||
if (!tab)
|
if (!tab)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
spin_lock_irqsave(&unwind_lock, flags);
|
raw_spin_lock_irqsave(&unwind_lock, flags);
|
||||||
list_del(&tab->list);
|
list_del(&tab->list);
|
||||||
spin_unlock_irqrestore(&unwind_lock, flags);
|
raw_spin_unlock_irqrestore(&unwind_lock, flags);
|
||||||
|
|
||||||
kfree(tab);
|
kfree(tab);
|
||||||
}
|
}
|
||||||
|
@ -8,9 +8,8 @@ ifeq ($(plus_virt),+virt)
|
|||||||
plus_virt_def := -DREQUIRES_VIRT=1
|
plus_virt_def := -DREQUIRES_VIRT=1
|
||||||
endif
|
endif
|
||||||
|
|
||||||
ccflags-y += -Iarch/arm/kvm -Ivirt/kvm/arm/vgic
|
ccflags-y += -I $(srctree)/$(src) -I $(srctree)/virt/kvm/arm/vgic
|
||||||
CFLAGS_arm.o := -I. $(plus_virt_def)
|
CFLAGS_arm.o := $(plus_virt_def)
|
||||||
CFLAGS_mmu.o := -I.
|
|
||||||
|
|
||||||
AFLAGS_init.o := -Wa,-march=armv7-a$(plus_virt)
|
AFLAGS_init.o := -Wa,-march=armv7-a$(plus_virt)
|
||||||
AFLAGS_interrupts.o := -Wa,-march=armv7-a$(plus_virt)
|
AFLAGS_interrupts.o := -Wa,-march=armv7-a$(plus_virt)
|
||||||
|
@ -293,15 +293,16 @@ static bool access_cntp_tval(struct kvm_vcpu *vcpu,
|
|||||||
const struct coproc_params *p,
|
const struct coproc_params *p,
|
||||||
const struct coproc_reg *r)
|
const struct coproc_reg *r)
|
||||||
{
|
{
|
||||||
u64 now = kvm_phys_timer_read();
|
u32 val;
|
||||||
u64 val;
|
|
||||||
|
|
||||||
if (p->is_write) {
|
if (p->is_write) {
|
||||||
val = *vcpu_reg(vcpu, p->Rt1);
|
val = *vcpu_reg(vcpu, p->Rt1);
|
||||||
kvm_arm_timer_set_reg(vcpu, KVM_REG_ARM_PTIMER_CVAL, val + now);
|
kvm_arm_timer_write_sysreg(vcpu,
|
||||||
|
TIMER_PTIMER, TIMER_REG_TVAL, val);
|
||||||
} else {
|
} else {
|
||||||
val = kvm_arm_timer_get_reg(vcpu, KVM_REG_ARM_PTIMER_CVAL);
|
val = kvm_arm_timer_read_sysreg(vcpu,
|
||||||
*vcpu_reg(vcpu, p->Rt1) = val - now;
|
TIMER_PTIMER, TIMER_REG_TVAL);
|
||||||
|
*vcpu_reg(vcpu, p->Rt1) = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -315,9 +316,11 @@ static bool access_cntp_ctl(struct kvm_vcpu *vcpu,
|
|||||||
|
|
||||||
if (p->is_write) {
|
if (p->is_write) {
|
||||||
val = *vcpu_reg(vcpu, p->Rt1);
|
val = *vcpu_reg(vcpu, p->Rt1);
|
||||||
kvm_arm_timer_set_reg(vcpu, KVM_REG_ARM_PTIMER_CTL, val);
|
kvm_arm_timer_write_sysreg(vcpu,
|
||||||
|
TIMER_PTIMER, TIMER_REG_CTL, val);
|
||||||
} else {
|
} else {
|
||||||
val = kvm_arm_timer_get_reg(vcpu, KVM_REG_ARM_PTIMER_CTL);
|
val = kvm_arm_timer_read_sysreg(vcpu,
|
||||||
|
TIMER_PTIMER, TIMER_REG_CTL);
|
||||||
*vcpu_reg(vcpu, p->Rt1) = val;
|
*vcpu_reg(vcpu, p->Rt1) = val;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -333,9 +336,11 @@ static bool access_cntp_cval(struct kvm_vcpu *vcpu,
|
|||||||
if (p->is_write) {
|
if (p->is_write) {
|
||||||
val = (u64)*vcpu_reg(vcpu, p->Rt2) << 32;
|
val = (u64)*vcpu_reg(vcpu, p->Rt2) << 32;
|
||||||
val |= *vcpu_reg(vcpu, p->Rt1);
|
val |= *vcpu_reg(vcpu, p->Rt1);
|
||||||
kvm_arm_timer_set_reg(vcpu, KVM_REG_ARM_PTIMER_CVAL, val);
|
kvm_arm_timer_write_sysreg(vcpu,
|
||||||
|
TIMER_PTIMER, TIMER_REG_CVAL, val);
|
||||||
} else {
|
} else {
|
||||||
val = kvm_arm_timer_get_reg(vcpu, KVM_REG_ARM_PTIMER_CVAL);
|
val = kvm_arm_timer_read_sysreg(vcpu,
|
||||||
|
TIMER_PTIMER, TIMER_REG_CVAL);
|
||||||
*vcpu_reg(vcpu, p->Rt1) = val;
|
*vcpu_reg(vcpu, p->Rt1) = val;
|
||||||
*vcpu_reg(vcpu, p->Rt2) = val >> 32;
|
*vcpu_reg(vcpu, p->Rt2) = val >> 32;
|
||||||
}
|
}
|
||||||
|
@ -27,7 +27,6 @@ static u64 *cp15_64(struct kvm_cpu_context *ctxt, int idx)
|
|||||||
|
|
||||||
void __hyp_text __sysreg_save_state(struct kvm_cpu_context *ctxt)
|
void __hyp_text __sysreg_save_state(struct kvm_cpu_context *ctxt)
|
||||||
{
|
{
|
||||||
ctxt->cp15[c0_MPIDR] = read_sysreg(VMPIDR);
|
|
||||||
ctxt->cp15[c0_CSSELR] = read_sysreg(CSSELR);
|
ctxt->cp15[c0_CSSELR] = read_sysreg(CSSELR);
|
||||||
ctxt->cp15[c1_SCTLR] = read_sysreg(SCTLR);
|
ctxt->cp15[c1_SCTLR] = read_sysreg(SCTLR);
|
||||||
ctxt->cp15[c1_CPACR] = read_sysreg(CPACR);
|
ctxt->cp15[c1_CPACR] = read_sysreg(CPACR);
|
||||||
|
@ -176,7 +176,7 @@ THUMB( orr lr, lr, #PSR_T_BIT )
|
|||||||
msr spsr_cxsf, lr
|
msr spsr_cxsf, lr
|
||||||
ldr lr, =panic
|
ldr lr, =panic
|
||||||
msr ELR_hyp, lr
|
msr ELR_hyp, lr
|
||||||
ldr lr, =kvm_call_hyp
|
ldr lr, =__kvm_call_hyp
|
||||||
clrex
|
clrex
|
||||||
eret
|
eret
|
||||||
ENDPROC(__hyp_do_panic)
|
ENDPROC(__hyp_do_panic)
|
||||||
|
@ -77,7 +77,7 @@ static void __hyp_text __deactivate_traps(struct kvm_vcpu *vcpu)
|
|||||||
static void __hyp_text __activate_vm(struct kvm_vcpu *vcpu)
|
static void __hyp_text __activate_vm(struct kvm_vcpu *vcpu)
|
||||||
{
|
{
|
||||||
struct kvm *kvm = kern_hyp_va(vcpu->kvm);
|
struct kvm *kvm = kern_hyp_va(vcpu->kvm);
|
||||||
write_sysreg(kvm->arch.vttbr, VTTBR);
|
write_sysreg(kvm_get_vttbr(kvm), VTTBR);
|
||||||
write_sysreg(vcpu->arch.midr, VPIDR);
|
write_sysreg(vcpu->arch.midr, VPIDR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -41,7 +41,7 @@ void __hyp_text __kvm_tlb_flush_vmid(struct kvm *kvm)
|
|||||||
|
|
||||||
/* Switch to requested VMID */
|
/* Switch to requested VMID */
|
||||||
kvm = kern_hyp_va(kvm);
|
kvm = kern_hyp_va(kvm);
|
||||||
write_sysreg(kvm->arch.vttbr, VTTBR);
|
write_sysreg(kvm_get_vttbr(kvm), VTTBR);
|
||||||
isb();
|
isb();
|
||||||
|
|
||||||
write_sysreg(0, TLBIALLIS);
|
write_sysreg(0, TLBIALLIS);
|
||||||
@ -61,7 +61,7 @@ void __hyp_text __kvm_tlb_flush_local_vmid(struct kvm_vcpu *vcpu)
|
|||||||
struct kvm *kvm = kern_hyp_va(kern_hyp_va(vcpu)->kvm);
|
struct kvm *kvm = kern_hyp_va(kern_hyp_va(vcpu)->kvm);
|
||||||
|
|
||||||
/* Switch to requested VMID */
|
/* Switch to requested VMID */
|
||||||
write_sysreg(kvm->arch.vttbr, VTTBR);
|
write_sysreg(kvm_get_vttbr(kvm), VTTBR);
|
||||||
isb();
|
isb();
|
||||||
|
|
||||||
write_sysreg(0, TLBIALL);
|
write_sysreg(0, TLBIALL);
|
||||||
|
@ -42,7 +42,7 @@
|
|||||||
* r12: caller save
|
* r12: caller save
|
||||||
* rest: callee save
|
* rest: callee save
|
||||||
*/
|
*/
|
||||||
ENTRY(kvm_call_hyp)
|
ENTRY(__kvm_call_hyp)
|
||||||
hvc #0
|
hvc #0
|
||||||
bx lr
|
bx lr
|
||||||
ENDPROC(kvm_call_hyp)
|
ENDPROC(__kvm_call_hyp)
|
||||||
|
@ -39,7 +39,7 @@ $(obj)/csumpartialcopy.o: $(obj)/csumpartialcopygeneric.S
|
|||||||
$(obj)/csumpartialcopyuser.o: $(obj)/csumpartialcopygeneric.S
|
$(obj)/csumpartialcopyuser.o: $(obj)/csumpartialcopygeneric.S
|
||||||
|
|
||||||
ifeq ($(CONFIG_KERNEL_MODE_NEON),y)
|
ifeq ($(CONFIG_KERNEL_MODE_NEON),y)
|
||||||
NEON_FLAGS := -mfloat-abi=softfp -mfpu=neon
|
NEON_FLAGS := -march=armv7-a -mfloat-abi=softfp -mfpu=neon
|
||||||
CFLAGS_xor-neon.o += $(NEON_FLAGS)
|
CFLAGS_xor-neon.o += $(NEON_FLAGS)
|
||||||
obj-$(CONFIG_XOR_BLOCKS) += xor-neon.o
|
obj-$(CONFIG_XOR_BLOCKS) += xor-neon.o
|
||||||
endif
|
endif
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
ENTRY( \name )
|
ENTRY( \name )
|
||||||
UNWIND( .fnstart )
|
UNWIND( .fnstart )
|
||||||
ands ip, r1, #3
|
ands ip, r1, #3
|
||||||
strneb r1, [ip] @ assert word-aligned
|
strbne r1, [ip] @ assert word-aligned
|
||||||
mov r2, #1
|
mov r2, #1
|
||||||
and r3, r0, #31 @ Get bit offset
|
and r3, r0, #31 @ Get bit offset
|
||||||
mov r0, r0, lsr #5
|
mov r0, r0, lsr #5
|
||||||
@ -32,7 +32,7 @@ ENDPROC(\name )
|
|||||||
ENTRY( \name )
|
ENTRY( \name )
|
||||||
UNWIND( .fnstart )
|
UNWIND( .fnstart )
|
||||||
ands ip, r1, #3
|
ands ip, r1, #3
|
||||||
strneb r1, [ip] @ assert word-aligned
|
strbne r1, [ip] @ assert word-aligned
|
||||||
mov r2, #1
|
mov r2, #1
|
||||||
and r3, r0, #31 @ Get bit offset
|
and r3, r0, #31 @ Get bit offset
|
||||||
mov r0, r0, lsr #5
|
mov r0, r0, lsr #5
|
||||||
@ -62,7 +62,7 @@ ENDPROC(\name )
|
|||||||
ENTRY( \name )
|
ENTRY( \name )
|
||||||
UNWIND( .fnstart )
|
UNWIND( .fnstart )
|
||||||
ands ip, r1, #3
|
ands ip, r1, #3
|
||||||
strneb r1, [ip] @ assert word-aligned
|
strbne r1, [ip] @ assert word-aligned
|
||||||
and r2, r0, #31
|
and r2, r0, #31
|
||||||
mov r0, r0, lsr #5
|
mov r0, r0, lsr #5
|
||||||
mov r3, #1
|
mov r3, #1
|
||||||
@ -89,7 +89,7 @@ ENDPROC(\name )
|
|||||||
ENTRY( \name )
|
ENTRY( \name )
|
||||||
UNWIND( .fnstart )
|
UNWIND( .fnstart )
|
||||||
ands ip, r1, #3
|
ands ip, r1, #3
|
||||||
strneb r1, [ip] @ assert word-aligned
|
strbne r1, [ip] @ assert word-aligned
|
||||||
and r3, r0, #31
|
and r3, r0, #31
|
||||||
mov r0, r0, lsr #5
|
mov r0, r0, lsr #5
|
||||||
save_and_disable_irqs ip
|
save_and_disable_irqs ip
|
||||||
|
@ -44,7 +44,7 @@ UNWIND(.save {r1, lr})
|
|||||||
strusr r2, r0, 1, ne, rept=2
|
strusr r2, r0, 1, ne, rept=2
|
||||||
tst r1, #1 @ x1 x0 x1 x0 x1 x0 x1
|
tst r1, #1 @ x1 x0 x1 x0 x1 x0 x1
|
||||||
it ne @ explicit IT needed for the label
|
it ne @ explicit IT needed for the label
|
||||||
USER( strnebt r2, [r0])
|
USER( strbtne r2, [r0])
|
||||||
mov r0, #0
|
mov r0, #0
|
||||||
ldmfd sp!, {r1, pc}
|
ldmfd sp!, {r1, pc}
|
||||||
UNWIND(.fnend)
|
UNWIND(.fnend)
|
||||||
|
@ -91,7 +91,7 @@
|
|||||||
.endm
|
.endm
|
||||||
|
|
||||||
.macro str1b ptr reg cond=al abort
|
.macro str1b ptr reg cond=al abort
|
||||||
str\cond\()b \reg, [\ptr], #1
|
strb\cond \reg, [\ptr], #1
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
.macro enter reg1 reg2
|
.macro enter reg1 reg2
|
||||||
|
@ -39,9 +39,9 @@ ENTRY(copy_page)
|
|||||||
.endr
|
.endr
|
||||||
subs r2, r2, #1 @ 1
|
subs r2, r2, #1 @ 1
|
||||||
stmia r0!, {r3, r4, ip, lr} @ 4
|
stmia r0!, {r3, r4, ip, lr} @ 4
|
||||||
ldmgtia r1!, {r3, r4, ip, lr} @ 4
|
ldmiagt r1!, {r3, r4, ip, lr} @ 4
|
||||||
bgt 1b @ 1
|
bgt 1b @ 1
|
||||||
PLD( ldmeqia r1!, {r3, r4, ip, lr} )
|
PLD( ldmiaeq r1!, {r3, r4, ip, lr} )
|
||||||
PLD( beq 2b )
|
PLD( beq 2b )
|
||||||
ldmfd sp!, {r4, pc} @ 3
|
ldmfd sp!, {r4, pc} @ 3
|
||||||
ENDPROC(copy_page)
|
ENDPROC(copy_page)
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user