Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Conflicts: net/bridge/br_mdb.c Minor conflict in br_mdb.c, in 'net' we added a memset of the on-stack 'ip' variable whereas in 'net-next' we assign a new member 'vid'. Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Коммит
638d3c6381
|
@ -36,7 +36,7 @@ SunXi family
|
|||
+ User Manual
|
||||
http://dl.linux-sunxi.org/A20/A20%20User%20Manual%202013-03-22.pdf
|
||||
|
||||
- Allwinner A23
|
||||
- Allwinner A23 (sun8i)
|
||||
+ Datasheet
|
||||
http://dl.linux-sunxi.org/A23/A23%20Datasheet%20V1.0%2020130830.pdf
|
||||
+ User Manual
|
||||
|
@ -55,7 +55,23 @@ SunXi family
|
|||
+ User Manual
|
||||
http://dl.linux-sunxi.org/A31/A3x_release_document/A31s/IC/A31s%20User%20Manual%20%20V1.0%2020130322.pdf
|
||||
|
||||
- Allwinner A33 (sun8i)
|
||||
+ Datasheet
|
||||
http://dl.linux-sunxi.org/A33/A33%20Datasheet%20release%201.1.pdf
|
||||
+ User Manual
|
||||
http://dl.linux-sunxi.org/A33/A33%20user%20manual%20release%201.1.pdf
|
||||
|
||||
- Allwinner H3 (sun8i)
|
||||
+ Datasheet
|
||||
http://dl.linux-sunxi.org/H3/Allwinner_H3_Datasheet_V1.0.pdf
|
||||
|
||||
* Quad ARM Cortex-A15, Quad ARM Cortex-A7 based SoCs
|
||||
- Allwinner A80
|
||||
+ Datasheet
|
||||
http://dl.linux-sunxi.org/A80/A80_Datasheet_Revision_1.0_0404.pdf
|
||||
|
||||
* Octa ARM Cortex-A7 based SoCs
|
||||
- Allwinner A83T
|
||||
+ Not Supported
|
||||
+ Datasheet
|
||||
http://dl.linux-sunxi.org/A83T/A83T_datasheet_Revision_1.1.pdf
|
||||
|
|
|
@ -9,4 +9,6 @@ using one of the following compatible strings:
|
|||
allwinner,sun6i-a31
|
||||
allwinner,sun7i-a20
|
||||
allwinner,sun8i-a23
|
||||
allwinner,sun8i-a33
|
||||
allwinner,sun8i-h3
|
||||
allwinner,sun9i-a80
|
||||
|
|
|
@ -0,0 +1,59 @@
|
|||
Generic hwlock bindings
|
||||
=======================
|
||||
|
||||
Generic bindings that are common to all the hwlock platform specific driver
|
||||
implementations.
|
||||
|
||||
Please also look through the individual platform specific hwlock binding
|
||||
documentations for identifying any additional properties specific to that
|
||||
platform.
|
||||
|
||||
hwlock providers:
|
||||
=================
|
||||
|
||||
Required properties:
|
||||
- #hwlock-cells: Specifies the number of cells needed to represent a
|
||||
specific lock.
|
||||
|
||||
hwlock users:
|
||||
=============
|
||||
|
||||
Consumers that require specific hwlock(s) should specify them using the
|
||||
property "hwlocks", and an optional "hwlock-names" property.
|
||||
|
||||
Required properties:
|
||||
- hwlocks: List of phandle to a hwlock provider node and an
|
||||
associated hwlock args specifier as indicated by
|
||||
#hwlock-cells. The list can have just a single hwlock
|
||||
or multiple hwlocks, with each hwlock represented by
|
||||
a phandle and a corresponding args specifier.
|
||||
|
||||
Optional properties:
|
||||
- hwlock-names: List of hwlock name strings defined in the same order
|
||||
as the hwlocks, with one name per hwlock. Consumers can
|
||||
use the hwlock-names to match and get a specific hwlock.
|
||||
|
||||
|
||||
1. Example of a node using a single specific hwlock:
|
||||
|
||||
The following example has a node requesting a hwlock in the bank defined by
|
||||
the node hwlock1. hwlock1 is a hwlock provider with an argument specifier
|
||||
of length 1.
|
||||
|
||||
node {
|
||||
...
|
||||
hwlocks = <&hwlock1 2>;
|
||||
...
|
||||
};
|
||||
|
||||
2. Example of a node using multiple specific hwlocks:
|
||||
|
||||
The following example has a node requesting two hwlocks, a hwlock within
|
||||
the hwlock device node 'hwlock1' with #hwlock-cells value of 1, and another
|
||||
hwlock within the hwlock device node 'hwlock2' with #hwlock-cells value of 2.
|
||||
|
||||
node {
|
||||
...
|
||||
hwlocks = <&hwlock1 2>, <&hwlock2 0 3>;
|
||||
...
|
||||
};
|
|
@ -0,0 +1,26 @@
|
|||
OMAP4+ HwSpinlock Driver
|
||||
========================
|
||||
|
||||
Required properties:
|
||||
- compatible: Should be "ti,omap4-hwspinlock" for
|
||||
OMAP44xx, OMAP54xx, AM33xx, AM43xx, DRA7xx SoCs
|
||||
- reg: Contains the hwspinlock module register address space
|
||||
(base address and length)
|
||||
- ti,hwmods: Name of the hwmod associated with the hwspinlock device
|
||||
- #hwlock-cells: Should be 1. The OMAP hwspinlock users will use a
|
||||
0-indexed relative hwlock number as the argument
|
||||
specifier value for requesting a specific hwspinlock
|
||||
within a hwspinlock bank.
|
||||
|
||||
Please look at the generic hwlock binding for usage information for consumers,
|
||||
"Documentation/devicetree/bindings/hwlock/hwlock.txt"
|
||||
|
||||
Example:
|
||||
|
||||
/* OMAP4 */
|
||||
hwspinlock: spinlock@4a0f6000 {
|
||||
compatible = "ti,omap4-hwspinlock";
|
||||
reg = <0x4a0f6000 0x1000>;
|
||||
ti,hwmods = "spinlock";
|
||||
#hwlock-cells = <1>;
|
||||
};
|
|
@ -0,0 +1,39 @@
|
|||
Qualcomm Hardware Mutex Block:
|
||||
|
||||
The hardware block provides mutexes utilized between different processors on
|
||||
the SoC as part of the communication protocol used by these processors.
|
||||
|
||||
- compatible:
|
||||
Usage: required
|
||||
Value type: <string>
|
||||
Definition: must be one of:
|
||||
"qcom,sfpb-mutex",
|
||||
"qcom,tcsr-mutex"
|
||||
|
||||
- syscon:
|
||||
Usage: required
|
||||
Value type: <prop-encoded-array>
|
||||
Definition: one cell containing:
|
||||
syscon phandle
|
||||
offset of the hwmutex block within the syscon
|
||||
stride of the hwmutex registers
|
||||
|
||||
- #hwlock-cells:
|
||||
Usage: required
|
||||
Value type: <u32>
|
||||
Definition: must be 1, the specified cell represent the lock id
|
||||
(hwlock standard property, see hwlock.txt)
|
||||
|
||||
Example:
|
||||
|
||||
tcsr_mutex_block: syscon@fd484000 {
|
||||
compatible = "syscon";
|
||||
reg = <0xfd484000 0x2000>;
|
||||
};
|
||||
|
||||
hwlock@fd484000 {
|
||||
compatible = "qcom,tcsr-mutex";
|
||||
syscon = <&tcsr_mutex_block 0 0x80>;
|
||||
|
||||
#hwlock-cells = <1>;
|
||||
};
|
|
@ -0,0 +1,28 @@
|
|||
SIRF Hardware spinlock device Binding
|
||||
-----------------------------------------------
|
||||
|
||||
Required properties :
|
||||
- compatible : shall contain only one of the following:
|
||||
"sirf,hwspinlock"
|
||||
|
||||
- reg : the register address of hwspinlock
|
||||
|
||||
- #hwlock-cells : hwlock users only use the hwlock id to represent a specific
|
||||
hwlock, so the number of cells should be <1> here.
|
||||
|
||||
Please look at the generic hwlock binding for usage information for consumers,
|
||||
"Documentation/devicetree/bindings/hwlock/hwlock.txt"
|
||||
|
||||
Example of hwlock provider:
|
||||
hwlock {
|
||||
compatible = "sirf,hwspinlock";
|
||||
reg = <0x13240000 0x00010000>;
|
||||
#hwlock-cells = <1>;
|
||||
};
|
||||
|
||||
Example of hwlock users:
|
||||
node {
|
||||
...
|
||||
hwlocks = <&hwlock 2>;
|
||||
...
|
||||
};
|
|
@ -8,6 +8,7 @@ of the EMIF IP and memory parts attached to it.
|
|||
Required properties:
|
||||
- compatible : Should be of the form "ti,emif-<ip-rev>" where <ip-rev>
|
||||
is the IP revision of the specific EMIF instance.
|
||||
For am437x should be ti,emif-am4372.
|
||||
|
||||
- phy-type : <u32> indicating the DDR phy type. Following are the
|
||||
allowed values
|
||||
|
|
|
@ -0,0 +1,52 @@
|
|||
TI Wakeup M3 Remoteproc Driver
|
||||
==============================
|
||||
|
||||
The TI AM33xx and AM43xx family of devices use a small Cortex M3 co-processor
|
||||
(commonly referred to as Wakeup M3 or CM3) to help with various low power tasks
|
||||
that cannot be controlled from the MPU. This CM3 processor requires a firmware
|
||||
binary to accomplish this. The wkup_m3 remoteproc driver handles the loading of
|
||||
the firmware and booting of the CM3.
|
||||
|
||||
Wkup M3 Device Node:
|
||||
====================
|
||||
A wkup_m3 device node is used to represent the Wakeup M3 processor instance
|
||||
within the SoC. It is added as a child node of the parent interconnect bus
|
||||
(l4_wkup) through which it is accessible to the MPU.
|
||||
|
||||
Required properties:
|
||||
--------------------
|
||||
- compatible: Should be one of,
|
||||
"ti,am3352-wkup-m3" for AM33xx SoCs
|
||||
"ti,am4372-wkup-m3" for AM43xx SoCs
|
||||
- reg: Should contain the address ranges for the two internal
|
||||
memory regions, UMEM and DMEM. The parent node should
|
||||
provide an appropriate ranges property for properly
|
||||
translating these into bus addresses.
|
||||
- reg-names: Contains the corresponding names for the two memory
|
||||
regions. These should be named "umem" & "dmem".
|
||||
- ti,hwmods: Name of the hwmod associated with the wkupm3 device.
|
||||
- ti,pm-firmware: Name of firmware file to be used for loading and
|
||||
booting the wkup_m3 remote processor.
|
||||
|
||||
Example:
|
||||
--------
|
||||
/* AM33xx */
|
||||
ocp {
|
||||
l4_wkup: l4_wkup@44c00000 {
|
||||
compatible = "am335-l4-wkup", "simple-bus";
|
||||
ranges = <0 0x44c00000 0x400000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
wkup_m3: wkup_m3@100000 {
|
||||
compatible = "ti,am3352-wkup-m3";
|
||||
reg = <0x100000 0x4000>,
|
||||
<0x180000 0x2000>;
|
||||
reg-names = "umem", "dmem";
|
||||
ti,hwmods = "wkup_m3";
|
||||
ti,pm-firmware = "am335x-pm-firmware.elf";
|
||||
};
|
||||
};
|
||||
|
||||
...
|
||||
};
|
|
@ -79,9 +79,9 @@ Atmel High-Speed USB device controller
|
|||
|
||||
Required properties:
|
||||
- compatible: Should be one of the following
|
||||
"at91sam9rl-udc"
|
||||
"at91sam9g45-udc"
|
||||
"sama5d3-udc"
|
||||
"atmel,at91sam9rl-udc"
|
||||
"atmel,at91sam9g45-udc"
|
||||
"atmel,sama5d3-udc"
|
||||
- reg: Address and length of the register set for the device
|
||||
- interrupts: Should contain usba interrupt
|
||||
- clocks: Should reference the peripheral and host clocks
|
||||
|
|
|
@ -676,6 +676,29 @@ FS-Cache provides some utilities that a cache backend may make use of:
|
|||
as possible.
|
||||
|
||||
|
||||
(*) Indicate that a stale object was found and discarded:
|
||||
|
||||
void fscache_object_retrying_stale(struct fscache_object *object);
|
||||
|
||||
This is called to indicate that the lookup procedure found an object in
|
||||
the cache that the netfs decided was stale. The object has been
|
||||
discarded from the cache and the lookup will be performed again.
|
||||
|
||||
|
||||
(*) Indicate that the caching backend killed an object:
|
||||
|
||||
void fscache_object_mark_killed(struct fscache_object *object,
|
||||
enum fscache_why_object_killed why);
|
||||
|
||||
This is called to indicate that the cache backend preemptively killed an
|
||||
object. The why parameter should be set to indicate the reason:
|
||||
|
||||
FSCACHE_OBJECT_IS_STALE - the object was stale and needs discarding.
|
||||
FSCACHE_OBJECT_NO_SPACE - there was insufficient cache space
|
||||
FSCACHE_OBJECT_WAS_RETIRED - the object was retired when relinquished.
|
||||
FSCACHE_OBJECT_WAS_CULLED - the object was culled to make space.
|
||||
|
||||
|
||||
(*) Get and release references on a retrieval record:
|
||||
|
||||
void fscache_get_retrieval(struct fscache_retrieval *op);
|
||||
|
|
|
@ -284,8 +284,9 @@ proc files.
|
|||
enq=N Number of times async ops queued for processing
|
||||
can=N Number of async ops cancelled
|
||||
rej=N Number of async ops rejected due to object lookup/create failure
|
||||
ini=N Number of async ops initialised
|
||||
dfr=N Number of async ops queued for deferred release
|
||||
rel=N Number of async ops released
|
||||
rel=N Number of async ops released (should equal ini=N when idle)
|
||||
gc=N Number of deferred-release async ops garbage collected
|
||||
CacheOp alo=N Number of in-progress alloc_object() cache ops
|
||||
luo=N Number of in-progress lookup_object() cache ops
|
||||
|
@ -303,6 +304,10 @@ proc files.
|
|||
wrp=N Number of in-progress write_page() cache ops
|
||||
ucp=N Number of in-progress uncache_page() cache ops
|
||||
dsp=N Number of in-progress dissociate_pages() cache ops
|
||||
CacheEv nsp=N Number of object lookups/creations rejected due to lack of space
|
||||
stl=N Number of stale objects deleted
|
||||
rtr=N Number of objects retired when relinquished
|
||||
cul=N Number of objects culled
|
||||
|
||||
|
||||
(*) /proc/fs/fscache/histogram
|
||||
|
|
|
@ -18,8 +18,10 @@ Usage
|
|||
-----
|
||||
|
||||
If you have a block device which supports DAX, you can make a filesystem
|
||||
on it as usual. When mounting it, use the -o dax option manually
|
||||
or add 'dax' to the options in /etc/fstab.
|
||||
on it as usual. The DAX code currently only supports files with a block
|
||||
size equal to your kernel's PAGE_SIZE, so you may need to specify a block
|
||||
size when creating the filesystem. When mounting it, use the "-o dax"
|
||||
option on the command line or add 'dax' to the options in /etc/fstab.
|
||||
|
||||
|
||||
Implementation Tips for Block Driver Writers
|
||||
|
|
|
@ -500,3 +500,7 @@ in your dentry operations instead.
|
|||
dentry, it does not get nameidata at all and it gets called only when cookie
|
||||
is non-NULL. Note that link body isn't available anymore, so if you need it,
|
||||
store it as cookie.
|
||||
--
|
||||
[mandatory]
|
||||
__fd_install() & fd_install() can now sleep. Callers should not
|
||||
hold a spinlock or other resources that do not allow a schedule.
|
||||
|
|
|
@ -81,6 +81,13 @@ increase the chances of your change being accepted.
|
|||
|
||||
* Provide a detect function if and only if a chip can be detected reliably.
|
||||
|
||||
* Only the following I2C addresses shall be probed: 0x18-0x1f, 0x28-0x2f,
|
||||
0x48-0x4f, 0x58, 0x5c, 0x73 and 0x77. Probing other addresses is strongly
|
||||
discouraged as it is known to cause trouble with other (non-hwmon) I2C
|
||||
chips. If your chip lives at an address which can't be probed then the
|
||||
device will have to be instantiated explicitly (which is always better
|
||||
anyway.)
|
||||
|
||||
* Avoid writing to chip registers in the detect function. If you have to write,
|
||||
only do it after you have already gathered enough data to be certain that the
|
||||
detection is going to be successful.
|
||||
|
|
|
@ -8,6 +8,7 @@ Supported chips:
|
|||
Datasheet: http://www.winbond.com.tw
|
||||
|
||||
Author: Shane Huang (Winbond)
|
||||
Updated: Roger Lucas
|
||||
|
||||
|
||||
Module Parameters
|
||||
|
@ -38,9 +39,16 @@ parameter; this will put it into a more well-behaved state first.
|
|||
The driver implements three temperature sensors, seven fan rotation speed
|
||||
sensors, nine voltage sensors, and two automatic fan regulation
|
||||
strategies called: Smart Fan I (Thermal Cruise mode) and Smart Fan II.
|
||||
Automatic fan control mode is possible only for fan1-fan3. Fan4-fan7 can run
|
||||
synchronized with selected fan (fan1-fan3). This functionality and manual PWM
|
||||
control for fan4-fan7 is not yet implemented.
|
||||
|
||||
The driver also implements up to seven fan control outputs: pwm1-7. Pwm1-7
|
||||
can be configured to PWM output or Analogue DC output via their associated
|
||||
pwmX_mode. Outputs pwm4 through pwm7 may or may not be present depending on
|
||||
how the W83792AD/D was configured by the BIOS.
|
||||
|
||||
Automatic fan control mode is possible only for fan1-fan3.
|
||||
|
||||
For all pwmX outputs, a value of 0 means minimum fan speed and a value of
|
||||
255 means maximum fan speed.
|
||||
|
||||
Temperatures are measured in degrees Celsius and measurement resolution is 1
|
||||
degC for temp1 and 0.5 degC for temp2 and temp3. An alarm is triggered when
|
||||
|
@ -157,14 +165,14 @@ for each fan.
|
|||
/sys files
|
||||
----------
|
||||
|
||||
pwm[1-3] - this file stores PWM duty cycle or DC value (fan speed) in range:
|
||||
pwm[1-7] - this file stores PWM duty cycle or DC value (fan speed) in range:
|
||||
0 (stop) to 255 (full)
|
||||
pwm[1-3]_enable - this file controls mode of fan/temperature control:
|
||||
* 0 Disabled
|
||||
* 1 Manual mode
|
||||
* 2 Smart Fan II
|
||||
* 3 Thermal Cruise
|
||||
pwm[1-3]_mode - Select PWM of DC mode
|
||||
pwm[1-7]_mode - Select PWM or DC mode
|
||||
* 0 DC
|
||||
* 1 PWM
|
||||
thermal_cruise[1-3] - Selects the desired temperature for cruise (degC)
|
||||
|
|
|
@ -48,6 +48,16 @@ independent, drivers.
|
|||
ids for predefined purposes.
|
||||
Should be called from a process context (might sleep).
|
||||
|
||||
int of_hwspin_lock_get_id(struct device_node *np, int index);
|
||||
- retrieve the global lock id for an OF phandle-based specific lock.
|
||||
This function provides a means for DT users of a hwspinlock module
|
||||
to get the global lock id of a specific hwspinlock, so that it can
|
||||
be requested using the normal hwspin_lock_request_specific() API.
|
||||
The function returns a lock id number on success, -EPROBE_DEFER if
|
||||
the hwspinlock device is not yet registered with the core, or other
|
||||
error values.
|
||||
Should be called from a process context (might sleep).
|
||||
|
||||
int hwspin_lock_free(struct hwspinlock *hwlock);
|
||||
- free a previously-assigned hwspinlock; returns 0 on success, or an
|
||||
appropriate error code on failure (e.g. -EINVAL if the hwspinlock
|
||||
|
|
|
@ -321,6 +321,7 @@ Code Seq#(hex) Include File Comments
|
|||
0xDB 00-0F drivers/char/mwave/mwavepub.h
|
||||
0xDD 00-3F ZFCP device driver see drivers/s390/scsi/
|
||||
<mailto:aherrman@de.ibm.com>
|
||||
0xE5 00-3F linux/fuse.h
|
||||
0xEC 00-01 drivers/platform/chrome/cros_ec_dev.h ChromeOS EC driver
|
||||
0xF3 00-3F drivers/usb/misc/sisusbvga/sisusb.h sisfb (in development)
|
||||
<mailto:thomas@winischhofer.net>
|
||||
|
|
|
@ -293,6 +293,12 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
|
|||
acpi_os_name= [HW,ACPI] Tell ACPI BIOS the name of the OS
|
||||
Format: To spoof as Windows 98: ="Microsoft Windows"
|
||||
|
||||
acpi_rev_override [ACPI] Override the _REV object to return 5 (instead
|
||||
of 2 which is mandated by ACPI 6) as the supported ACPI
|
||||
specification revision (when using this switch, it may
|
||||
be necessary to carry out a cold reboot _twice_ in a
|
||||
row to make it take effect on the platform firmware).
|
||||
|
||||
acpi_osi= [HW,ACPI] Modify list of supported OS interface strings
|
||||
acpi_osi="string1" # add string1
|
||||
acpi_osi="!string2" # remove string2
|
||||
|
|
|
@ -0,0 +1,127 @@
|
|||
# NTB Drivers
|
||||
|
||||
NTB (Non-Transparent Bridge) is a type of PCI-Express bridge chip that connects
|
||||
the separate memory systems of two computers to the same PCI-Express fabric.
|
||||
Existing NTB hardware supports a common feature set, including scratchpad
|
||||
registers, doorbell registers, and memory translation windows. Scratchpad
|
||||
registers are read-and-writable registers that are accessible from either side
|
||||
of the device, so that peers can exchange a small amount of information at a
|
||||
fixed address. Doorbell registers provide a way for peers to send interrupt
|
||||
events. Memory windows allow translated read and write access to the peer
|
||||
memory.
|
||||
|
||||
## NTB Core Driver (ntb)
|
||||
|
||||
The NTB core driver defines an api wrapping the common feature set, and allows
|
||||
clients interested in NTB features to discover NTB the devices supported by
|
||||
hardware drivers. The term "client" is used here to mean an upper layer
|
||||
component making use of the NTB api. The term "driver," or "hardware driver,"
|
||||
is used here to mean a driver for a specific vendor and model of NTB hardware.
|
||||
|
||||
## NTB Client Drivers
|
||||
|
||||
NTB client drivers should register with the NTB core driver. After
|
||||
registering, the client probe and remove functions will be called appropriately
|
||||
as ntb hardware, or hardware drivers, are inserted and removed. The
|
||||
registration uses the Linux Device framework, so it should feel familiar to
|
||||
anyone who has written a pci driver.
|
||||
|
||||
### NTB Transport Client (ntb\_transport) and NTB Netdev (ntb\_netdev)
|
||||
|
||||
The primary client for NTB is the Transport client, used in tandem with NTB
|
||||
Netdev. These drivers function together to create a logical link to the peer,
|
||||
across the ntb, to exchange packets of network data. The Transport client
|
||||
establishes a logical link to the peer, and creates queue pairs to exchange
|
||||
messages and data. The NTB Netdev then creates an ethernet device using a
|
||||
Transport queue pair. Network data is copied between socket buffers and the
|
||||
Transport queue pair buffer. The Transport client may be used for other things
|
||||
besides Netdev, however no other applications have yet been written.
|
||||
|
||||
### NTB Ping Pong Test Client (ntb\_pingpong)
|
||||
|
||||
The Ping Pong test client serves as a demonstration to exercise the doorbell
|
||||
and scratchpad registers of NTB hardware, and as an example simple NTB client.
|
||||
Ping Pong enables the link when started, waits for the NTB link to come up, and
|
||||
then proceeds to read and write the doorbell scratchpad registers of the NTB.
|
||||
The peers interrupt each other using a bit mask of doorbell bits, which is
|
||||
shifted by one in each round, to test the behavior of multiple doorbell bits
|
||||
and interrupt vectors. The Ping Pong driver also reads the first local
|
||||
scratchpad, and writes the value plus one to the first peer scratchpad, each
|
||||
round before writing the peer doorbell register.
|
||||
|
||||
Module Parameters:
|
||||
|
||||
* unsafe - Some hardware has known issues with scratchpad and doorbell
|
||||
registers. By default, Ping Pong will not attempt to exercise such
|
||||
hardware. You may override this behavior at your own risk by setting
|
||||
unsafe=1.
|
||||
* delay\_ms - Specify the delay between receiving a doorbell
|
||||
interrupt event and setting the peer doorbell register for the next
|
||||
round.
|
||||
* init\_db - Specify the doorbell bits to start new series of rounds. A new
|
||||
series begins once all the doorbell bits have been shifted out of
|
||||
range.
|
||||
* dyndbg - It is suggested to specify dyndbg=+p when loading this module, and
|
||||
then to observe debugging output on the console.
|
||||
|
||||
### NTB Tool Test Client (ntb\_tool)
|
||||
|
||||
The Tool test client serves for debugging, primarily, ntb hardware and drivers.
|
||||
The Tool provides access through debugfs for reading, setting, and clearing the
|
||||
NTB doorbell, and reading and writing scratchpads.
|
||||
|
||||
The Tool does not currently have any module parameters.
|
||||
|
||||
Debugfs Files:
|
||||
|
||||
* *debugfs*/ntb\_tool/*hw*/ - A directory in debugfs will be created for each
|
||||
NTB device probed by the tool. This directory is shortened to *hw*
|
||||
below.
|
||||
* *hw*/db - This file is used to read, set, and clear the local doorbell. Not
|
||||
all operations may be supported by all hardware. To read the doorbell,
|
||||
read the file. To set the doorbell, write `s` followed by the bits to
|
||||
set (eg: `echo 's 0x0101' > db`). To clear the doorbell, write `c`
|
||||
followed by the bits to clear.
|
||||
* *hw*/mask - This file is used to read, set, and clear the local doorbell mask.
|
||||
See *db* for details.
|
||||
* *hw*/peer\_db - This file is used to read, set, and clear the peer doorbell.
|
||||
See *db* for details.
|
||||
* *hw*/peer\_mask - This file is used to read, set, and clear the peer doorbell
|
||||
mask. See *db* for details.
|
||||
* *hw*/spad - This file is used to read and write local scratchpads. To read
|
||||
the values of all scratchpads, read the file. To write values, write a
|
||||
series of pairs of scratchpad number and value
|
||||
(eg: `echo '4 0x123 7 0xabc' > spad`
|
||||
# to set scratchpads `4` and `7` to `0x123` and `0xabc`, respectively).
|
||||
* *hw*/peer\_spad - This file is used to read and write peer scratchpads. See
|
||||
*spad* for details.
|
||||
|
||||
## NTB Hardware Drivers
|
||||
|
||||
NTB hardware drivers should register devices with the NTB core driver. After
|
||||
registering, clients probe and remove functions will be called.
|
||||
|
||||
### NTB Intel Hardware Driver (ntb\_hw\_intel)
|
||||
|
||||
The Intel hardware driver supports NTB on Xeon and Atom CPUs.
|
||||
|
||||
Module Parameters:
|
||||
|
||||
* b2b\_mw\_idx - If the peer ntb is to be accessed via a memory window, then use
|
||||
this memory window to access the peer ntb. A value of zero or positive
|
||||
starts from the first mw idx, and a negative value starts from the last
|
||||
mw idx. Both sides MUST set the same value here! The default value is
|
||||
`-1`.
|
||||
* b2b\_mw\_share - If the peer ntb is to be accessed via a memory window, and if
|
||||
the memory window is large enough, still allow the client to use the
|
||||
second half of the memory window for address translation to the peer.
|
||||
* xeon\_b2b\_usd\_bar2\_addr64 - If using B2B topology on Xeon hardware, use
|
||||
this 64 bit address on the bus between the NTB devices for the window
|
||||
at BAR2, on the upstream side of the link.
|
||||
* xeon\_b2b\_usd\_bar4\_addr64 - See *xeon\_b2b\_bar2\_addr64*.
|
||||
* xeon\_b2b\_usd\_bar4\_addr32 - See *xeon\_b2b\_bar2\_addr64*.
|
||||
* xeon\_b2b\_usd\_bar5\_addr32 - See *xeon\_b2b\_bar2\_addr64*.
|
||||
* xeon\_b2b\_dsd\_bar2\_addr64 - See *xeon\_b2b\_bar2\_addr64*.
|
||||
* xeon\_b2b\_dsd\_bar4\_addr64 - See *xeon\_b2b\_bar2\_addr64*.
|
||||
* xeon\_b2b\_dsd\_bar4\_addr32 - See *xeon\_b2b\_bar2\_addr64*.
|
||||
* xeon\_b2b\_dsd\_bar5\_addr32 - See *xeon\_b2b\_bar2\_addr64*.
|
|
@ -410,8 +410,17 @@ Documentation/usb/persist.txt.
|
|||
|
||||
Q: Can I suspend-to-disk using a swap partition under LVM?
|
||||
|
||||
A: No. You can suspend successfully, but you'll not be able to
|
||||
resume. uswsusp should be able to work with LVM. See suspend.sf.net.
|
||||
A: Yes and No. You can suspend successfully, but the kernel will not be able
|
||||
to resume on its own. You need an initramfs that can recognize the resume
|
||||
situation, activate the logical volume containing the swap volume (but not
|
||||
touch any filesystems!), and eventually call
|
||||
|
||||
echo -n "$major:$minor" > /sys/power/resume
|
||||
|
||||
where $major and $minor are the respective major and minor device numbers of
|
||||
the swap volume.
|
||||
|
||||
uswsusp works with LVM, too. See http://suspend.sourceforge.net/
|
||||
|
||||
Q: I upgraded the kernel from 2.6.15 to 2.6.16. Both kernels were
|
||||
compiled with the similar configuration files. Anyway I found that
|
||||
|
|
|
@ -51,6 +51,12 @@ cost.
|
|||
rproc_shutdown() returns, and users can still use it with a subsequent
|
||||
rproc_boot(), if needed.
|
||||
|
||||
struct rproc *rproc_get_by_phandle(phandle phandle)
|
||||
- Find an rproc handle using a device tree phandle. Returns the rproc
|
||||
handle on success, and NULL on failure. This function increments
|
||||
the remote processor's refcount, so always use rproc_put() to
|
||||
decrement it back once rproc isn't needed anymore.
|
||||
|
||||
3. Typical usage
|
||||
|
||||
#include <linux/remoteproc.h>
|
||||
|
|
|
@ -50,15 +50,6 @@ def tcm_mod_build_FC_include(fabric_mod_dir_var, fabric_mod_name):
|
|||
buf = "#define " + fabric_mod_name.upper() + "_VERSION \"v0.1\"\n"
|
||||
buf += "#define " + fabric_mod_name.upper() + "_NAMELEN 32\n"
|
||||
buf += "\n"
|
||||
buf += "struct " + fabric_mod_name + "_nacl {\n"
|
||||
buf += " /* Binary World Wide unique Port Name for FC Initiator Nport */\n"
|
||||
buf += " u64 nport_wwpn;\n"
|
||||
buf += " /* ASCII formatted WWPN for FC Initiator Nport */\n"
|
||||
buf += " char nport_name[" + fabric_mod_name.upper() + "_NAMELEN];\n"
|
||||
buf += " /* Returned by " + fabric_mod_name + "_make_nodeacl() */\n"
|
||||
buf += " struct se_node_acl se_node_acl;\n"
|
||||
buf += "};\n"
|
||||
buf += "\n"
|
||||
buf += "struct " + fabric_mod_name + "_tpg {\n"
|
||||
buf += " /* FC lport target portal group tag for TCM */\n"
|
||||
buf += " u16 lport_tpgt;\n"
|
||||
|
@ -69,8 +60,6 @@ def tcm_mod_build_FC_include(fabric_mod_dir_var, fabric_mod_name):
|
|||
buf += "};\n"
|
||||
buf += "\n"
|
||||
buf += "struct " + fabric_mod_name + "_lport {\n"
|
||||
buf += " /* SCSI protocol the lport is providing */\n"
|
||||
buf += " u8 lport_proto_id;\n"
|
||||
buf += " /* Binary World Wide unique Port Name for FC Target Lport */\n"
|
||||
buf += " u64 lport_wwpn;\n"
|
||||
buf += " /* ASCII formatted WWPN for FC Target Lport */\n"
|
||||
|
@ -105,14 +94,6 @@ def tcm_mod_build_SAS_include(fabric_mod_dir_var, fabric_mod_name):
|
|||
buf = "#define " + fabric_mod_name.upper() + "_VERSION \"v0.1\"\n"
|
||||
buf += "#define " + fabric_mod_name.upper() + "_NAMELEN 32\n"
|
||||
buf += "\n"
|
||||
buf += "struct " + fabric_mod_name + "_nacl {\n"
|
||||
buf += " /* Binary World Wide unique Port Name for SAS Initiator port */\n"
|
||||
buf += " u64 iport_wwpn;\n"
|
||||
buf += " /* ASCII formatted WWPN for Sas Initiator port */\n"
|
||||
buf += " char iport_name[" + fabric_mod_name.upper() + "_NAMELEN];\n"
|
||||
buf += " /* Returned by " + fabric_mod_name + "_make_nodeacl() */\n"
|
||||
buf += " struct se_node_acl se_node_acl;\n"
|
||||
buf += "};\n\n"
|
||||
buf += "struct " + fabric_mod_name + "_tpg {\n"
|
||||
buf += " /* SAS port target portal group tag for TCM */\n"
|
||||
buf += " u16 tport_tpgt;\n"
|
||||
|
@ -122,8 +103,6 @@ def tcm_mod_build_SAS_include(fabric_mod_dir_var, fabric_mod_name):
|
|||
buf += " struct se_portal_group se_tpg;\n"
|
||||
buf += "};\n\n"
|
||||
buf += "struct " + fabric_mod_name + "_tport {\n"
|
||||
buf += " /* SCSI protocol the tport is providing */\n"
|
||||
buf += " u8 tport_proto_id;\n"
|
||||
buf += " /* Binary World Wide unique Port Name for SAS Target port */\n"
|
||||
buf += " u64 tport_wwpn;\n"
|
||||
buf += " /* ASCII formatted WWPN for SAS Target port */\n"
|
||||
|
@ -158,12 +137,6 @@ def tcm_mod_build_iSCSI_include(fabric_mod_dir_var, fabric_mod_name):
|
|||
buf = "#define " + fabric_mod_name.upper() + "_VERSION \"v0.1\"\n"
|
||||
buf += "#define " + fabric_mod_name.upper() + "_NAMELEN 32\n"
|
||||
buf += "\n"
|
||||
buf += "struct " + fabric_mod_name + "_nacl {\n"
|
||||
buf += " /* ASCII formatted InitiatorName */\n"
|
||||
buf += " char iport_name[" + fabric_mod_name.upper() + "_NAMELEN];\n"
|
||||
buf += " /* Returned by " + fabric_mod_name + "_make_nodeacl() */\n"
|
||||
buf += " struct se_node_acl se_node_acl;\n"
|
||||
buf += "};\n\n"
|
||||
buf += "struct " + fabric_mod_name + "_tpg {\n"
|
||||
buf += " /* iSCSI target portal group tag for TCM */\n"
|
||||
buf += " u16 tport_tpgt;\n"
|
||||
|
@ -173,8 +146,6 @@ def tcm_mod_build_iSCSI_include(fabric_mod_dir_var, fabric_mod_name):
|
|||
buf += " struct se_portal_group se_tpg;\n"
|
||||
buf += "};\n\n"
|
||||
buf += "struct " + fabric_mod_name + "_tport {\n"
|
||||
buf += " /* SCSI protocol the tport is providing */\n"
|
||||
buf += " u8 tport_proto_id;\n"
|
||||
buf += " /* ASCII formatted TargetName for IQN */\n"
|
||||
buf += " char tport_name[" + fabric_mod_name.upper() + "_NAMELEN];\n"
|
||||
buf += " /* Returned by " + fabric_mod_name + "_make_tport() */\n"
|
||||
|
@ -232,61 +203,12 @@ def tcm_mod_build_configfs(proto_ident, fabric_mod_dir_var, fabric_mod_name):
|
|||
buf += "#include <target/target_core_base.h>\n"
|
||||
buf += "#include <target/target_core_fabric.h>\n"
|
||||
buf += "#include <target/target_core_fabric_configfs.h>\n"
|
||||
buf += "#include <target/target_core_configfs.h>\n"
|
||||
buf += "#include <target/configfs_macros.h>\n\n"
|
||||
buf += "#include \"" + fabric_mod_name + "_base.h\"\n"
|
||||
buf += "#include \"" + fabric_mod_name + "_fabric.h\"\n\n"
|
||||
|
||||
buf += "static const struct target_core_fabric_ops " + fabric_mod_name + "_ops;\n\n"
|
||||
|
||||
buf += "static struct se_node_acl *" + fabric_mod_name + "_make_nodeacl(\n"
|
||||
buf += " struct se_portal_group *se_tpg,\n"
|
||||
buf += " struct config_group *group,\n"
|
||||
buf += " const char *name)\n"
|
||||
buf += "{\n"
|
||||
buf += " struct se_node_acl *se_nacl, *se_nacl_new;\n"
|
||||
buf += " struct " + fabric_mod_name + "_nacl *nacl;\n"
|
||||
|
||||
if proto_ident == "FC" or proto_ident == "SAS":
|
||||
buf += " u64 wwpn = 0;\n"
|
||||
|
||||
buf += " u32 nexus_depth;\n\n"
|
||||
buf += " /* " + fabric_mod_name + "_parse_wwn(name, &wwpn, 1) < 0)\n"
|
||||
buf += " return ERR_PTR(-EINVAL); */\n"
|
||||
buf += " se_nacl_new = " + fabric_mod_name + "_alloc_fabric_acl(se_tpg);\n"
|
||||
buf += " if (!se_nacl_new)\n"
|
||||
buf += " return ERR_PTR(-ENOMEM);\n"
|
||||
buf += "//#warning FIXME: Hardcoded nexus depth in " + fabric_mod_name + "_make_nodeacl()\n"
|
||||
buf += " nexus_depth = 1;\n"
|
||||
buf += " /*\n"
|
||||
buf += " * se_nacl_new may be released by core_tpg_add_initiator_node_acl()\n"
|
||||
buf += " * when converting a NodeACL from demo mode -> explict\n"
|
||||
buf += " */\n"
|
||||
buf += " se_nacl = core_tpg_add_initiator_node_acl(se_tpg, se_nacl_new,\n"
|
||||
buf += " name, nexus_depth);\n"
|
||||
buf += " if (IS_ERR(se_nacl)) {\n"
|
||||
buf += " " + fabric_mod_name + "_release_fabric_acl(se_tpg, se_nacl_new);\n"
|
||||
buf += " return se_nacl;\n"
|
||||
buf += " }\n"
|
||||
buf += " /*\n"
|
||||
buf += " * Locate our struct " + fabric_mod_name + "_nacl and set the FC Nport WWPN\n"
|
||||
buf += " */\n"
|
||||
buf += " nacl = container_of(se_nacl, struct " + fabric_mod_name + "_nacl, se_node_acl);\n"
|
||||
|
||||
if proto_ident == "FC" or proto_ident == "SAS":
|
||||
buf += " nacl->" + fabric_mod_init_port + "_wwpn = wwpn;\n"
|
||||
|
||||
buf += " /* " + fabric_mod_name + "_format_wwn(&nacl->" + fabric_mod_init_port + "_name[0], " + fabric_mod_name.upper() + "_NAMELEN, wwpn); */\n\n"
|
||||
buf += " return se_nacl;\n"
|
||||
buf += "}\n\n"
|
||||
buf += "static void " + fabric_mod_name + "_drop_nodeacl(struct se_node_acl *se_acl)\n"
|
||||
buf += "{\n"
|
||||
buf += " struct " + fabric_mod_name + "_nacl *nacl = container_of(se_acl,\n"
|
||||
buf += " struct " + fabric_mod_name + "_nacl, se_node_acl);\n"
|
||||
buf += " core_tpg_del_initiator_node_acl(se_acl->se_tpg, se_acl, 1);\n"
|
||||
buf += " kfree(nacl);\n"
|
||||
buf += "}\n\n"
|
||||
|
||||
buf += "static struct se_portal_group *" + fabric_mod_name + "_make_tpg(\n"
|
||||
buf += " struct se_wwn *wwn,\n"
|
||||
buf += " struct config_group *group,\n"
|
||||
|
@ -309,8 +231,7 @@ def tcm_mod_build_configfs(proto_ident, fabric_mod_dir_var, fabric_mod_name):
|
|||
buf += " tpg->" + fabric_mod_port + " = " + fabric_mod_port + ";\n"
|
||||
buf += " tpg->" + fabric_mod_port + "_tpgt = tpgt;\n\n"
|
||||
buf += " ret = core_tpg_register(&" + fabric_mod_name + "_ops, wwn,\n"
|
||||
buf += " &tpg->se_tpg, tpg,\n"
|
||||
buf += " TRANSPORT_TPG_TYPE_NORMAL);\n"
|
||||
buf += " &tpg->se_tpg, SCSI_PROTOCOL_SAS);\n"
|
||||
buf += " if (ret < 0) {\n"
|
||||
buf += " kfree(tpg);\n"
|
||||
buf += " return NULL;\n"
|
||||
|
@ -372,21 +293,13 @@ def tcm_mod_build_configfs(proto_ident, fabric_mod_dir_var, fabric_mod_name):
|
|||
buf += "static const struct target_core_fabric_ops " + fabric_mod_name + "_ops = {\n"
|
||||
buf += " .module = THIS_MODULE,\n"
|
||||
buf += " .name = " + fabric_mod_name + ",\n"
|
||||
buf += " .get_fabric_proto_ident = " + fabric_mod_name + "_get_fabric_proto_ident,\n"
|
||||
buf += " .get_fabric_name = " + fabric_mod_name + "_get_fabric_name,\n"
|
||||
buf += " .get_fabric_proto_ident = " + fabric_mod_name + "_get_fabric_proto_ident,\n"
|
||||
buf += " .tpg_get_wwn = " + fabric_mod_name + "_get_fabric_wwn,\n"
|
||||
buf += " .tpg_get_tag = " + fabric_mod_name + "_get_tag,\n"
|
||||
buf += " .tpg_get_default_depth = " + fabric_mod_name + "_get_default_depth,\n"
|
||||
buf += " .tpg_get_pr_transport_id = " + fabric_mod_name + "_get_pr_transport_id,\n"
|
||||
buf += " .tpg_get_pr_transport_id_len = " + fabric_mod_name + "_get_pr_transport_id_len,\n"
|
||||
buf += " .tpg_parse_pr_out_transport_id = " + fabric_mod_name + "_parse_pr_out_transport_id,\n"
|
||||
buf += " .tpg_check_demo_mode = " + fabric_mod_name + "_check_false,\n"
|
||||
buf += " .tpg_check_demo_mode_cache = " + fabric_mod_name + "_check_true,\n"
|
||||
buf += " .tpg_check_demo_mode_write_protect = " + fabric_mod_name + "_check_true,\n"
|
||||
buf += " .tpg_check_prod_mode_write_protect = " + fabric_mod_name + "_check_false,\n"
|
||||
buf += " .tpg_alloc_fabric_acl = " + fabric_mod_name + "_alloc_fabric_acl,\n"
|
||||
buf += " .tpg_release_fabric_acl = " + fabric_mod_name + "_release_fabric_acl,\n"
|
||||
buf += " .tpg_get_inst_index = " + fabric_mod_name + "_tpg_get_inst_index,\n"
|
||||
buf += " .release_cmd = " + fabric_mod_name + "_release_cmd,\n"
|
||||
buf += " .shutdown_session = " + fabric_mod_name + "_shutdown_session,\n"
|
||||
|
@ -396,7 +309,6 @@ def tcm_mod_build_configfs(proto_ident, fabric_mod_dir_var, fabric_mod_name):
|
|||
buf += " .write_pending = " + fabric_mod_name + "_write_pending,\n"
|
||||
buf += " .write_pending_status = " + fabric_mod_name + "_write_pending_status,\n"
|
||||
buf += " .set_default_node_attributes = " + fabric_mod_name + "_set_default_node_attrs,\n"
|
||||
buf += " .get_task_tag = " + fabric_mod_name + "_get_task_tag,\n"
|
||||
buf += " .get_cmd_state = " + fabric_mod_name + "_get_cmd_state,\n"
|
||||
buf += " .queue_data_in = " + fabric_mod_name + "_queue_data_in,\n"
|
||||
buf += " .queue_status = " + fabric_mod_name + "_queue_status,\n"
|
||||
|
@ -409,12 +321,6 @@ def tcm_mod_build_configfs(proto_ident, fabric_mod_dir_var, fabric_mod_name):
|
|||
buf += " .fabric_drop_wwn = " + fabric_mod_name + "_drop_" + fabric_mod_port + ",\n"
|
||||
buf += " .fabric_make_tpg = " + fabric_mod_name + "_make_tpg,\n"
|
||||
buf += " .fabric_drop_tpg = " + fabric_mod_name + "_drop_tpg,\n"
|
||||
buf += " .fabric_post_link = NULL,\n"
|
||||
buf += " .fabric_pre_unlink = NULL,\n"
|
||||
buf += " .fabric_make_np = NULL,\n"
|
||||
buf += " .fabric_drop_np = NULL,\n"
|
||||
buf += " .fabric_make_nodeacl = " + fabric_mod_name + "_make_nodeacl,\n"
|
||||
buf += " .fabric_drop_nodeacl = " + fabric_mod_name + "_drop_nodeacl,\n"
|
||||
buf += "\n"
|
||||
buf += " .tfc_wwn_attrs = " + fabric_mod_name + "_wwn_attrs;\n"
|
||||
buf += "};\n\n"
|
||||
|
@ -507,7 +413,6 @@ def tcm_mod_dump_fabric_ops(proto_ident, fabric_mod_dir_var, fabric_mod_name):
|
|||
buf += "#include <scsi/scsi_proto.h>\n"
|
||||
buf += "#include <target/target_core_base.h>\n"
|
||||
buf += "#include <target/target_core_fabric.h>\n"
|
||||
buf += "#include <target/target_core_configfs.h>\n\n"
|
||||
buf += "#include \"" + fabric_mod_name + "_base.h\"\n"
|
||||
buf += "#include \"" + fabric_mod_name + "_fabric.h\"\n\n"
|
||||
|
||||
|
@ -539,35 +444,6 @@ def tcm_mod_dump_fabric_ops(proto_ident, fabric_mod_dir_var, fabric_mod_name):
|
|||
bufi += "char *" + fabric_mod_name + "_get_fabric_name(void);\n"
|
||||
continue
|
||||
|
||||
if re.search('get_fabric_proto_ident', fo):
|
||||
buf += "u8 " + fabric_mod_name + "_get_fabric_proto_ident(struct se_portal_group *se_tpg)\n"
|
||||
buf += "{\n"
|
||||
buf += " struct " + fabric_mod_name + "_tpg *tpg = container_of(se_tpg,\n"
|
||||
buf += " struct " + fabric_mod_name + "_tpg, se_tpg);\n"
|
||||
buf += " struct " + fabric_mod_name + "_" + fabric_mod_port + " *" + fabric_mod_port + " = tpg->" + fabric_mod_port + ";\n"
|
||||
buf += " u8 proto_id;\n\n"
|
||||
buf += " switch (" + fabric_mod_port + "->" + fabric_mod_port + "_proto_id) {\n"
|
||||
if proto_ident == "FC":
|
||||
buf += " case SCSI_PROTOCOL_FCP:\n"
|
||||
buf += " default:\n"
|
||||
buf += " proto_id = fc_get_fabric_proto_ident(se_tpg);\n"
|
||||
buf += " break;\n"
|
||||
elif proto_ident == "SAS":
|
||||
buf += " case SCSI_PROTOCOL_SAS:\n"
|
||||
buf += " default:\n"
|
||||
buf += " proto_id = sas_get_fabric_proto_ident(se_tpg);\n"
|
||||
buf += " break;\n"
|
||||
elif proto_ident == "iSCSI":
|
||||
buf += " case SCSI_PROTOCOL_ISCSI:\n"
|
||||
buf += " default:\n"
|
||||
buf += " proto_id = iscsi_get_fabric_proto_ident(se_tpg);\n"
|
||||
buf += " break;\n"
|
||||
|
||||
buf += " }\n\n"
|
||||
buf += " return proto_id;\n"
|
||||
buf += "}\n\n"
|
||||
bufi += "u8 " + fabric_mod_name + "_get_fabric_proto_ident(struct se_portal_group *);\n"
|
||||
|
||||
if re.search('get_wwn', fo):
|
||||
buf += "char *" + fabric_mod_name + "_get_fabric_wwn(struct se_portal_group *se_tpg)\n"
|
||||
buf += "{\n"
|
||||
|
@ -587,150 +463,6 @@ def tcm_mod_dump_fabric_ops(proto_ident, fabric_mod_dir_var, fabric_mod_name):
|
|||
buf += "}\n\n"
|
||||
bufi += "u16 " + fabric_mod_name + "_get_tag(struct se_portal_group *);\n"
|
||||
|
||||
if re.search('get_default_depth', fo):
|
||||
buf += "u32 " + fabric_mod_name + "_get_default_depth(struct se_portal_group *se_tpg)\n"
|
||||
buf += "{\n"
|
||||
buf += " return 1;\n"
|
||||
buf += "}\n\n"
|
||||
bufi += "u32 " + fabric_mod_name + "_get_default_depth(struct se_portal_group *);\n"
|
||||
|
||||
if re.search('get_pr_transport_id\)\(', fo):
|
||||
buf += "u32 " + fabric_mod_name + "_get_pr_transport_id(\n"
|
||||
buf += " struct se_portal_group *se_tpg,\n"
|
||||
buf += " struct se_node_acl *se_nacl,\n"
|
||||
buf += " struct t10_pr_registration *pr_reg,\n"
|
||||
buf += " int *format_code,\n"
|
||||
buf += " unsigned char *buf)\n"
|
||||
buf += "{\n"
|
||||
buf += " struct " + fabric_mod_name + "_tpg *tpg = container_of(se_tpg,\n"
|
||||
buf += " struct " + fabric_mod_name + "_tpg, se_tpg);\n"
|
||||
buf += " struct " + fabric_mod_name + "_" + fabric_mod_port + " *" + fabric_mod_port + " = tpg->" + fabric_mod_port + ";\n"
|
||||
buf += " int ret = 0;\n\n"
|
||||
buf += " switch (" + fabric_mod_port + "->" + fabric_mod_port + "_proto_id) {\n"
|
||||
if proto_ident == "FC":
|
||||
buf += " case SCSI_PROTOCOL_FCP:\n"
|
||||
buf += " default:\n"
|
||||
buf += " ret = fc_get_pr_transport_id(se_tpg, se_nacl, pr_reg,\n"
|
||||
buf += " format_code, buf);\n"
|
||||
buf += " break;\n"
|
||||
elif proto_ident == "SAS":
|
||||
buf += " case SCSI_PROTOCOL_SAS:\n"
|
||||
buf += " default:\n"
|
||||
buf += " ret = sas_get_pr_transport_id(se_tpg, se_nacl, pr_reg,\n"
|
||||
buf += " format_code, buf);\n"
|
||||
buf += " break;\n"
|
||||
elif proto_ident == "iSCSI":
|
||||
buf += " case SCSI_PROTOCOL_ISCSI:\n"
|
||||
buf += " default:\n"
|
||||
buf += " ret = iscsi_get_pr_transport_id(se_tpg, se_nacl, pr_reg,\n"
|
||||
buf += " format_code, buf);\n"
|
||||
buf += " break;\n"
|
||||
|
||||
buf += " }\n\n"
|
||||
buf += " return ret;\n"
|
||||
buf += "}\n\n"
|
||||
bufi += "u32 " + fabric_mod_name + "_get_pr_transport_id(struct se_portal_group *,\n"
|
||||
bufi += " struct se_node_acl *, struct t10_pr_registration *,\n"
|
||||
bufi += " int *, unsigned char *);\n"
|
||||
|
||||
if re.search('get_pr_transport_id_len\)\(', fo):
|
||||
buf += "u32 " + fabric_mod_name + "_get_pr_transport_id_len(\n"
|
||||
buf += " struct se_portal_group *se_tpg,\n"
|
||||
buf += " struct se_node_acl *se_nacl,\n"
|
||||
buf += " struct t10_pr_registration *pr_reg,\n"
|
||||
buf += " int *format_code)\n"
|
||||
buf += "{\n"
|
||||
buf += " struct " + fabric_mod_name + "_tpg *tpg = container_of(se_tpg,\n"
|
||||
buf += " struct " + fabric_mod_name + "_tpg, se_tpg);\n"
|
||||
buf += " struct " + fabric_mod_name + "_" + fabric_mod_port + " *" + fabric_mod_port + " = tpg->" + fabric_mod_port + ";\n"
|
||||
buf += " int ret = 0;\n\n"
|
||||
buf += " switch (" + fabric_mod_port + "->" + fabric_mod_port + "_proto_id) {\n"
|
||||
if proto_ident == "FC":
|
||||
buf += " case SCSI_PROTOCOL_FCP:\n"
|
||||
buf += " default:\n"
|
||||
buf += " ret = fc_get_pr_transport_id_len(se_tpg, se_nacl, pr_reg,\n"
|
||||
buf += " format_code);\n"
|
||||
buf += " break;\n"
|
||||
elif proto_ident == "SAS":
|
||||
buf += " case SCSI_PROTOCOL_SAS:\n"
|
||||
buf += " default:\n"
|
||||
buf += " ret = sas_get_pr_transport_id_len(se_tpg, se_nacl, pr_reg,\n"
|
||||
buf += " format_code);\n"
|
||||
buf += " break;\n"
|
||||
elif proto_ident == "iSCSI":
|
||||
buf += " case SCSI_PROTOCOL_ISCSI:\n"
|
||||
buf += " default:\n"
|
||||
buf += " ret = iscsi_get_pr_transport_id_len(se_tpg, se_nacl, pr_reg,\n"
|
||||
buf += " format_code);\n"
|
||||
buf += " break;\n"
|
||||
|
||||
|
||||
buf += " }\n\n"
|
||||
buf += " return ret;\n"
|
||||
buf += "}\n\n"
|
||||
bufi += "u32 " + fabric_mod_name + "_get_pr_transport_id_len(struct se_portal_group *,\n"
|
||||
bufi += " struct se_node_acl *, struct t10_pr_registration *,\n"
|
||||
bufi += " int *);\n"
|
||||
|
||||
if re.search('parse_pr_out_transport_id\)\(', fo):
|
||||
buf += "char *" + fabric_mod_name + "_parse_pr_out_transport_id(\n"
|
||||
buf += " struct se_portal_group *se_tpg,\n"
|
||||
buf += " const char *buf,\n"
|
||||
buf += " u32 *out_tid_len,\n"
|
||||
buf += " char **port_nexus_ptr)\n"
|
||||
buf += "{\n"
|
||||
buf += " struct " + fabric_mod_name + "_tpg *tpg = container_of(se_tpg,\n"
|
||||
buf += " struct " + fabric_mod_name + "_tpg, se_tpg);\n"
|
||||
buf += " struct " + fabric_mod_name + "_" + fabric_mod_port + " *" + fabric_mod_port + " = tpg->" + fabric_mod_port + ";\n"
|
||||
buf += " char *tid = NULL;\n\n"
|
||||
buf += " switch (" + fabric_mod_port + "->" + fabric_mod_port + "_proto_id) {\n"
|
||||
if proto_ident == "FC":
|
||||
buf += " case SCSI_PROTOCOL_FCP:\n"
|
||||
buf += " default:\n"
|
||||
buf += " tid = fc_parse_pr_out_transport_id(se_tpg, buf, out_tid_len,\n"
|
||||
buf += " port_nexus_ptr);\n"
|
||||
elif proto_ident == "SAS":
|
||||
buf += " case SCSI_PROTOCOL_SAS:\n"
|
||||
buf += " default:\n"
|
||||
buf += " tid = sas_parse_pr_out_transport_id(se_tpg, buf, out_tid_len,\n"
|
||||
buf += " port_nexus_ptr);\n"
|
||||
elif proto_ident == "iSCSI":
|
||||
buf += " case SCSI_PROTOCOL_ISCSI:\n"
|
||||
buf += " default:\n"
|
||||
buf += " tid = iscsi_parse_pr_out_transport_id(se_tpg, buf, out_tid_len,\n"
|
||||
buf += " port_nexus_ptr);\n"
|
||||
|
||||
buf += " }\n\n"
|
||||
buf += " return tid;\n"
|
||||
buf += "}\n\n"
|
||||
bufi += "char *" + fabric_mod_name + "_parse_pr_out_transport_id(struct se_portal_group *,\n"
|
||||
bufi += " const char *, u32 *, char **);\n"
|
||||
|
||||
if re.search('alloc_fabric_acl\)\(', fo):
|
||||
buf += "struct se_node_acl *" + fabric_mod_name + "_alloc_fabric_acl(struct se_portal_group *se_tpg)\n"
|
||||
buf += "{\n"
|
||||
buf += " struct " + fabric_mod_name + "_nacl *nacl;\n\n"
|
||||
buf += " nacl = kzalloc(sizeof(struct " + fabric_mod_name + "_nacl), GFP_KERNEL);\n"
|
||||
buf += " if (!nacl) {\n"
|
||||
buf += " printk(KERN_ERR \"Unable to allocate struct " + fabric_mod_name + "_nacl\\n\");\n"
|
||||
buf += " return NULL;\n"
|
||||
buf += " }\n\n"
|
||||
buf += " return &nacl->se_node_acl;\n"
|
||||
buf += "}\n\n"
|
||||
bufi += "struct se_node_acl *" + fabric_mod_name + "_alloc_fabric_acl(struct se_portal_group *);\n"
|
||||
|
||||
if re.search('release_fabric_acl\)\(', fo):
|
||||
buf += "void " + fabric_mod_name + "_release_fabric_acl(\n"
|
||||
buf += " struct se_portal_group *se_tpg,\n"
|
||||
buf += " struct se_node_acl *se_nacl)\n"
|
||||
buf += "{\n"
|
||||
buf += " struct " + fabric_mod_name + "_nacl *nacl = container_of(se_nacl,\n"
|
||||
buf += " struct " + fabric_mod_name + "_nacl, se_node_acl);\n"
|
||||
buf += " kfree(nacl);\n"
|
||||
buf += "}\n\n"
|
||||
bufi += "void " + fabric_mod_name + "_release_fabric_acl(struct se_portal_group *,\n"
|
||||
bufi += " struct se_node_acl *);\n"
|
||||
|
||||
if re.search('tpg_get_inst_index\)\(', fo):
|
||||
buf += "u32 " + fabric_mod_name + "_tpg_get_inst_index(struct se_portal_group *se_tpg)\n"
|
||||
buf += "{\n"
|
||||
|
@ -787,13 +519,6 @@ def tcm_mod_dump_fabric_ops(proto_ident, fabric_mod_dir_var, fabric_mod_name):
|
|||
buf += "}\n\n"
|
||||
bufi += "void " + fabric_mod_name + "_set_default_node_attrs(struct se_node_acl *);\n"
|
||||
|
||||
if re.search('get_task_tag\)\(', fo):
|
||||
buf += "u32 " + fabric_mod_name + "_get_task_tag(struct se_cmd *se_cmd)\n"
|
||||
buf += "{\n"
|
||||
buf += " return 0;\n"
|
||||
buf += "}\n\n"
|
||||
bufi += "u32 " + fabric_mod_name + "_get_task_tag(struct se_cmd *);\n"
|
||||
|
||||
if re.search('get_cmd_state\)\(', fo):
|
||||
buf += "int " + fabric_mod_name + "_get_cmd_state(struct se_cmd *se_cmd)\n"
|
||||
buf += "{\n"
|
||||
|
|
|
@ -13,8 +13,8 @@ fabric skeleton, by simply using:
|
|||
This script will create a new drivers/target/$TCM_NEW_MOD/, and will do the following
|
||||
|
||||
*) Generate new API callers for drivers/target/target_core_fabric_configs.c logic
|
||||
->make_nodeacl(), ->drop_nodeacl(), ->make_tpg(), ->drop_tpg()
|
||||
->make_wwn(), ->drop_wwn(). These are created into $TCM_NEW_MOD/$TCM_NEW_MOD_configfs.c
|
||||
->make_tpg(), ->drop_tpg(), ->make_wwn(), ->drop_wwn(). These are created
|
||||
into $TCM_NEW_MOD/$TCM_NEW_MOD_configfs.c
|
||||
*) Generate basic infrastructure for loading/unloading LKMs and TCM/ConfigFS fabric module
|
||||
using a skeleton struct target_core_fabric_ops API template.
|
||||
*) Based on user defined T10 Proto_Ident for the new fabric module being built,
|
||||
|
|
|
@ -152,7 +152,7 @@ overall shared memory region, not the entry. The data in/out buffers
|
|||
are accessible via tht req.iov[] array. iov_cnt contains the number of
|
||||
entries in iov[] needed to describe either the Data-In or Data-Out
|
||||
buffers. For bidirectional commands, iov_cnt specifies how many iovec
|
||||
entries cover the Data-Out area, and iov_bidi_count specifies how many
|
||||
entries cover the Data-Out area, and iov_bidi_cnt specifies how many
|
||||
iovec entries immediately after that in iov[] cover the Data-In
|
||||
area. Just like other fields, iov.iov_base is an offset from the start
|
||||
of the region.
|
||||
|
|
|
@ -406,7 +406,7 @@ Protocol: 2.00+
|
|||
- If 0, the protected-mode code is loaded at 0x10000.
|
||||
- If 1, the protected-mode code is loaded at 0x100000.
|
||||
|
||||
Bit 1 (kernel internal): ALSR_FLAG
|
||||
Bit 1 (kernel internal): KASLR_FLAG
|
||||
- Used internally by the compressed kernel to communicate
|
||||
KASLR status to kernel proper.
|
||||
If 1, KASLR enabled.
|
||||
|
|
|
@ -1,14 +1,14 @@
|
|||
This file documents some of the kernel entries in
|
||||
arch/x86/kernel/entry_64.S. A lot of this explanation is adapted from
|
||||
arch/x86/entry/entry_64.S. A lot of this explanation is adapted from
|
||||
an email from Ingo Molnar:
|
||||
|
||||
http://lkml.kernel.org/r/<20110529191055.GC9835%40elte.hu>
|
||||
|
||||
The x86 architecture has quite a few different ways to jump into
|
||||
kernel code. Most of these entry points are registered in
|
||||
arch/x86/kernel/traps.c and implemented in arch/x86/kernel/entry_64.S
|
||||
for 64-bit, arch/x86/kernel/entry_32.S for 32-bit and finally
|
||||
arch/x86/ia32/ia32entry.S which implements the 32-bit compatibility
|
||||
arch/x86/kernel/traps.c and implemented in arch/x86/entry/entry_64.S
|
||||
for 64-bit, arch/x86/entry/entry_32.S for 32-bit and finally
|
||||
arch/x86/entry/entry_64_compat.S which implements the 32-bit compatibility
|
||||
syscall entry points and thus provides for 32-bit processes the
|
||||
ability to execute syscalls when running on 64-bit kernels.
|
||||
|
||||
|
|
49
MAINTAINERS
49
MAINTAINERS
|
@ -1614,6 +1614,7 @@ M: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
|
|||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
F: arch/arm/boot/dts/vexpress*
|
||||
F: arch/arm64/boot/dts/arm/vexpress*
|
||||
F: arch/arm/mach-vexpress/
|
||||
F: */*/vexpress*
|
||||
F: */*/*/vexpress*
|
||||
|
@ -2562,19 +2563,31 @@ F: arch/powerpc/include/uapi/asm/spu*.h
|
|||
F: arch/powerpc/oprofile/*cell*
|
||||
F: arch/powerpc/platforms/cell/
|
||||
|
||||
CEPH DISTRIBUTED FILE SYSTEM CLIENT
|
||||
CEPH COMMON CODE (LIBCEPH)
|
||||
M: Ilya Dryomov <idryomov@gmail.com>
|
||||
M: "Yan, Zheng" <zyan@redhat.com>
|
||||
M: Sage Weil <sage@redhat.com>
|
||||
L: ceph-devel@vger.kernel.org
|
||||
W: http://ceph.com/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client.git
|
||||
T: git git://github.com/ceph/ceph-client.git
|
||||
S: Supported
|
||||
F: Documentation/filesystems/ceph.txt
|
||||
F: fs/ceph/
|
||||
F: net/ceph/
|
||||
F: include/linux/ceph/
|
||||
F: include/linux/crush/
|
||||
|
||||
CEPH DISTRIBUTED FILE SYSTEM CLIENT (CEPH)
|
||||
M: "Yan, Zheng" <zyan@redhat.com>
|
||||
M: Sage Weil <sage@redhat.com>
|
||||
M: Ilya Dryomov <idryomov@gmail.com>
|
||||
L: ceph-devel@vger.kernel.org
|
||||
W: http://ceph.com/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client.git
|
||||
T: git git://github.com/ceph/ceph-client.git
|
||||
S: Supported
|
||||
F: Documentation/filesystems/ceph.txt
|
||||
F: fs/ceph/
|
||||
|
||||
CERTIFIED WIRELESS USB (WUSB) SUBSYSTEM:
|
||||
L: linux-usb@vger.kernel.org
|
||||
S: Orphan
|
||||
|
@ -4430,9 +4443,11 @@ FUSE: FILESYSTEM IN USERSPACE
|
|||
M: Miklos Szeredi <miklos@szeredi.hu>
|
||||
L: fuse-devel@lists.sourceforge.net
|
||||
W: http://fuse.sourceforge.net/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/fuse.git
|
||||
S: Maintained
|
||||
F: fs/fuse/
|
||||
F: include/uapi/linux/fuse.h
|
||||
F: Documentation/filesystems/fuse.txt
|
||||
|
||||
FUTURE DOMAIN TMC-16x0 SCSI DRIVER (16-bit)
|
||||
M: Rik Faith <faith@cs.unc.edu>
|
||||
|
@ -5468,6 +5483,13 @@ F: include/linux/mei_cl_bus.h
|
|||
F: drivers/misc/mei/*
|
||||
F: Documentation/misc-devices/mei/*
|
||||
|
||||
INTEL PMC IPC DRIVER
|
||||
M: Zha Qipeng<qipeng.zha@intel.com>
|
||||
L: platform-driver-x86@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/platform/x86/intel_pmc_ipc.c
|
||||
F: arch/x86/include/asm/intel_pmc_ipc.h
|
||||
|
||||
IOC3 ETHERNET DRIVER
|
||||
M: Ralf Baechle <ralf@linux-mips.org>
|
||||
L: linux-mips@linux-mips.org
|
||||
|
@ -6138,6 +6160,7 @@ L: linux-nvdimm@lists.01.org
|
|||
Q: https://patchwork.kernel.org/project/linux-nvdimm/list/
|
||||
S: Supported
|
||||
F: drivers/nvdimm/pmem.c
|
||||
F: include/linux/pmem.h
|
||||
|
||||
LINUX FOR IBM pSERIES (RS/6000)
|
||||
M: Paul Mackerras <paulus@au.ibm.com>
|
||||
|
@ -6152,7 +6175,7 @@ M: Michael Ellerman <mpe@ellerman.id.au>
|
|||
W: http://www.penguinppc.org/
|
||||
L: linuxppc-dev@lists.ozlabs.org
|
||||
Q: http://patchwork.ozlabs.org/project/linuxppc-dev/list/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/benh/powerpc.git
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git
|
||||
S: Supported
|
||||
F: Documentation/powerpc/
|
||||
F: arch/powerpc/
|
||||
|
@ -6996,6 +7019,7 @@ F: include/uapi/linux/netfilter/
|
|||
F: net/*/netfilter.c
|
||||
F: net/*/netfilter/
|
||||
F: net/netfilter/
|
||||
F: net/bridge/br_netfilter*.c
|
||||
|
||||
NETLABEL
|
||||
M: Paul Moore <paul@paul-moore.com>
|
||||
|
@ -7210,15 +7234,25 @@ F: drivers/power/bq27x00_battery.c
|
|||
F: drivers/power/isp1704_charger.c
|
||||
F: drivers/power/rx51_battery.c
|
||||
|
||||
NTB DRIVER
|
||||
NTB DRIVER CORE
|
||||
M: Jon Mason <jdmason@kudzu.us>
|
||||
M: Dave Jiang <dave.jiang@intel.com>
|
||||
M: Allen Hubbe <Allen.Hubbe@emc.com>
|
||||
S: Supported
|
||||
W: https://github.com/jonmason/ntb/wiki
|
||||
T: git git://github.com/jonmason/ntb.git
|
||||
F: drivers/ntb/
|
||||
F: drivers/net/ntb_netdev.c
|
||||
F: include/linux/ntb.h
|
||||
F: include/linux/ntb_transport.h
|
||||
|
||||
NTB INTEL DRIVER
|
||||
M: Jon Mason <jdmason@kudzu.us>
|
||||
M: Dave Jiang <dave.jiang@intel.com>
|
||||
S: Supported
|
||||
W: https://github.com/jonmason/ntb/wiki
|
||||
T: git git://github.com/jonmason/ntb.git
|
||||
F: drivers/ntb/hw/intel/
|
||||
|
||||
NTFS FILESYSTEM
|
||||
M: Anton Altaparmakov <anton@tuxera.com>
|
||||
|
@ -7362,7 +7396,6 @@ M: Ohad Ben-Cohen <ohad@wizery.com>
|
|||
L: linux-omap@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/hwspinlock/omap_hwspinlock.c
|
||||
F: arch/arm/mach-omap2/hwspinlock.c
|
||||
|
||||
OMAP MMC SUPPORT
|
||||
M: Jarkko Lavinen <jarkko.lavinen@nokia.com>
|
||||
|
@ -8348,10 +8381,12 @@ RADOS BLOCK DEVICE (RBD)
|
|||
M: Ilya Dryomov <idryomov@gmail.com>
|
||||
M: Sage Weil <sage@redhat.com>
|
||||
M: Alex Elder <elder@kernel.org>
|
||||
M: ceph-devel@vger.kernel.org
|
||||
L: ceph-devel@vger.kernel.org
|
||||
W: http://ceph.com/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/sage/ceph-client.git
|
||||
T: git git://github.com/ceph/ceph-client.git
|
||||
S: Supported
|
||||
F: Documentation/ABI/testing/sysfs-bus-rbd
|
||||
F: drivers/block/rbd.c
|
||||
F: drivers/block/rbd_types.h
|
||||
|
||||
|
|
20
Makefile
20
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 4
|
||||
PATCHLEVEL = 1
|
||||
PATCHLEVEL = 2
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION =
|
||||
EXTRAVERSION = -rc2
|
||||
NAME = Hurr durr I'ma sheep
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
@ -335,15 +335,6 @@ endif
|
|||
export KBUILD_MODULES KBUILD_BUILTIN
|
||||
export KBUILD_CHECKSRC KBUILD_SRC KBUILD_EXTMOD
|
||||
|
||||
ifneq ($(CC),)
|
||||
ifeq ($(shell $(CC) -v 2>&1 | grep -c "clang version"), 1)
|
||||
COMPILER := clang
|
||||
else
|
||||
COMPILER := gcc
|
||||
endif
|
||||
export COMPILER
|
||||
endif
|
||||
|
||||
# We need some generic definitions (do not try to remake the file).
|
||||
scripts/Kbuild.include: ;
|
||||
include scripts/Kbuild.include
|
||||
|
@ -670,6 +661,13 @@ endif
|
|||
endif
|
||||
KBUILD_CFLAGS += $(stackp-flag)
|
||||
|
||||
ifeq ($(shell $(CC) -v 2>&1 | grep -c "clang version"), 1)
|
||||
COMPILER := clang
|
||||
else
|
||||
COMPILER := gcc
|
||||
endif
|
||||
export COMPILER
|
||||
|
||||
ifeq ($(COMPILER),clang)
|
||||
KBUILD_CPPFLAGS += $(call cc-option,-Qunused-arguments,)
|
||||
KBUILD_CPPFLAGS += $(call cc-option,-Wno-unknown-warning-option,)
|
||||
|
|
|
@ -71,15 +71,12 @@ static void print_task_path_n_nm(struct task_struct *tsk, char *buf)
|
|||
mmput(mm);
|
||||
|
||||
if (exe_file) {
|
||||
path = exe_file->f_path;
|
||||
path_get(&exe_file->f_path);
|
||||
path_nm = file_path(exe_file, buf, 255);
|
||||
fput(exe_file);
|
||||
path_nm = d_path(&path, buf, 255);
|
||||
path_put(&path);
|
||||
}
|
||||
|
||||
done:
|
||||
pr_info("Path: %s\n", path_nm);
|
||||
pr_info("Path: %s\n", !IS_ERR(path_nm) ? path_nm : "?");
|
||||
}
|
||||
|
||||
static void show_faulting_vma(unsigned long address, char *buf)
|
||||
|
@ -103,8 +100,7 @@ static void show_faulting_vma(unsigned long address, char *buf)
|
|||
if (vma && (vma->vm_start <= address)) {
|
||||
struct file *file = vma->vm_file;
|
||||
if (file) {
|
||||
struct path *path = &file->f_path;
|
||||
nm = d_path(path, buf, PAGE_SIZE - 1);
|
||||
nm = file_path(file, buf, PAGE_SIZE - 1);
|
||||
inode = file_inode(vma->vm_file);
|
||||
dev = inode->i_sb->s_dev;
|
||||
ino = inode->i_ino;
|
||||
|
|
|
@ -1693,6 +1693,12 @@ config HIGHMEM
|
|||
config HIGHPTE
|
||||
bool "Allocate 2nd-level pagetables from highmem"
|
||||
depends on HIGHMEM
|
||||
help
|
||||
The VM uses one page of physical memory for each page table.
|
||||
For systems with a lot of processes, this can use a lot of
|
||||
precious low memory, eventually leading to low memory being
|
||||
consumed by page tables. Setting this option will allow
|
||||
user-space 2nd level page tables to reside in high memory.
|
||||
|
||||
config HW_PERF_EVENTS
|
||||
bool "Enable hardware performance counter support for perf events"
|
||||
|
|
|
@ -1635,7 +1635,7 @@ config PID_IN_CONTEXTIDR
|
|||
|
||||
config DEBUG_SET_MODULE_RONX
|
||||
bool "Set loadable kernel module data as NX and text as RO"
|
||||
depends on MODULES
|
||||
depends on MODULES && MMU
|
||||
---help---
|
||||
This option helps catch unintended modifications to loadable
|
||||
kernel module's text and read-only data. It also prevents execution
|
||||
|
|
|
@ -80,3 +80,7 @@
|
|||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
||||
&rtc {
|
||||
system-power-controller;
|
||||
};
|
||||
|
|
|
@ -132,6 +132,12 @@
|
|||
};
|
||||
};
|
||||
|
||||
emif: emif@4c000000 {
|
||||
compatible = "ti,emif-am4372";
|
||||
reg = <0x4c000000 0x1000000>;
|
||||
ti,hwmods = "emif";
|
||||
};
|
||||
|
||||
edma: edma@49000000 {
|
||||
compatible = "ti,edma3";
|
||||
ti,hwmods = "tpcc", "tptc0", "tptc1", "tptc2";
|
||||
|
@ -941,6 +947,7 @@
|
|||
ti,hwmods = "dss_rfbi";
|
||||
clocks = <&disp_clk>;
|
||||
clock-names = "fck";
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -605,6 +605,10 @@
|
|||
phy-supply = <&ldousb_reg>;
|
||||
};
|
||||
|
||||
&usb2_phy2 {
|
||||
phy-supply = <&ldousb_reg>;
|
||||
};
|
||||
|
||||
&usb1 {
|
||||
dr_mode = "host";
|
||||
pinctrl-names = "default";
|
||||
|
|
|
@ -305,7 +305,7 @@
|
|||
spi0_pins: spi0-pins {
|
||||
marvell,pins = "mpp36", "mpp37",
|
||||
"mpp38", "mpp39";
|
||||
marvell,function = "spi";
|
||||
marvell,function = "spi0";
|
||||
};
|
||||
|
||||
uart2_pins: uart2-pins {
|
||||
|
|
|
@ -1148,7 +1148,7 @@
|
|||
usb2: gadget@fff78000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "atmel,at91sam9rl-udc";
|
||||
compatible = "atmel,at91sam9g45-udc";
|
||||
reg = <0x00600000 0x80000
|
||||
0xfff78000 0x400>;
|
||||
interrupts = <27 IRQ_TYPE_LEVEL_HIGH 0>;
|
||||
|
|
|
@ -1108,7 +1108,7 @@
|
|||
usb2: gadget@f803c000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "atmel,at91sam9rl-udc";
|
||||
compatible = "atmel,at91sam9g45-udc";
|
||||
reg = <0x00500000 0x80000
|
||||
0xf803c000 0x400>;
|
||||
interrupts = <23 IRQ_TYPE_LEVEL_HIGH 0>;
|
||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -686,7 +686,8 @@
|
|||
|
||||
&dcan1 {
|
||||
status = "ok";
|
||||
pinctrl-names = "default", "sleep";
|
||||
pinctrl-0 = <&dcan1_pins_default>;
|
||||
pinctrl-names = "default", "sleep", "active";
|
||||
pinctrl-0 = <&dcan1_pins_sleep>;
|
||||
pinctrl-1 = <&dcan1_pins_sleep>;
|
||||
pinctrl-2 = <&dcan1_pins_default>;
|
||||
};
|
||||
|
|
|
@ -587,9 +587,10 @@
|
|||
|
||||
&dcan1 {
|
||||
status = "ok";
|
||||
pinctrl-names = "default", "sleep";
|
||||
pinctrl-0 = <&dcan1_pins_default>;
|
||||
pinctrl-names = "default", "sleep", "active";
|
||||
pinctrl-0 = <&dcan1_pins_sleep>;
|
||||
pinctrl-1 = <&dcan1_pins_sleep>;
|
||||
pinctrl-2 = <&dcan1_pins_default>;
|
||||
};
|
||||
|
||||
&qspi {
|
||||
|
|
|
@ -1321,7 +1321,7 @@
|
|||
usb0: gadget@00500000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "atmel,at91sam9rl-udc";
|
||||
compatible = "atmel,sama5d3-udc";
|
||||
reg = <0x00500000 0x100000
|
||||
0xf8030000 0x4000>;
|
||||
interrupts = <33 IRQ_TYPE_LEVEL_HIGH 2>;
|
||||
|
|
|
@ -127,7 +127,7 @@
|
|||
usb0: gadget@00400000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "atmel,at91sam9rl-udc";
|
||||
compatible = "atmel,sama5d3-udc";
|
||||
reg = <0x00400000 0x100000
|
||||
0xfc02c000 0x4000>;
|
||||
interrupts = <47 IRQ_TYPE_LEVEL_HIGH 2>;
|
||||
|
|
|
@ -150,6 +150,16 @@
|
|||
interface-type = "ace";
|
||||
reg = <0x5000 0x1000>;
|
||||
};
|
||||
|
||||
pmu@9000 {
|
||||
compatible = "arm,cci-400-pmu,r0";
|
||||
reg = <0x9000 0x5000>;
|
||||
interrupts = <0 105 4>,
|
||||
<0 101 4>,
|
||||
<0 102 4>,
|
||||
<0 103 4>,
|
||||
<0 104 4>;
|
||||
};
|
||||
};
|
||||
|
||||
memory-controller@7ffd0000 {
|
||||
|
@ -187,11 +197,22 @@
|
|||
<1 10 0xf08>;
|
||||
};
|
||||
|
||||
pmu {
|
||||
pmu_a15 {
|
||||
compatible = "arm,cortex-a15-pmu";
|
||||
interrupts = <0 68 4>,
|
||||
<0 69 4>;
|
||||
interrupt-affinity = <&cpu0>, <&cpu1>;
|
||||
interrupt-affinity = <&cpu0>,
|
||||
<&cpu1>;
|
||||
};
|
||||
|
||||
pmu_a7 {
|
||||
compatible = "arm,cortex-a7-pmu";
|
||||
interrupts = <0 128 4>,
|
||||
<0 129 4>,
|
||||
<0 130 4>;
|
||||
interrupt-affinity = <&cpu2>,
|
||||
<&cpu3>,
|
||||
<&cpu4>;
|
||||
};
|
||||
|
||||
oscclk6a: oscclk6a {
|
||||
|
|
|
@ -169,6 +169,7 @@ CONFIG_MTD_BLOCK=y
|
|||
CONFIG_MTD_M25P80=y
|
||||
CONFIG_MTD_NAND=y
|
||||
CONFIG_MTD_NAND_ATMEL=y
|
||||
CONFIG_MTD_NAND_BRCMNAND=y
|
||||
CONFIG_MTD_NAND_DAVINCI=y
|
||||
CONFIG_MTD_SPI_NOR=y
|
||||
CONFIG_MTD_UBI=y
|
||||
|
@ -352,7 +353,6 @@ CONFIG_POWER_RESET_AS3722=y
|
|||
CONFIG_POWER_RESET_GPIO=y
|
||||
CONFIG_POWER_RESET_GPIO_RESTART=y
|
||||
CONFIG_POWER_RESET_KEYSTONE=y
|
||||
CONFIG_POWER_RESET_SUN6I=y
|
||||
CONFIG_POWER_RESET_RMOBILE=y
|
||||
CONFIG_SENSORS_LM90=y
|
||||
CONFIG_SENSORS_LM95245=y
|
||||
|
|
|
@ -2,6 +2,7 @@ CONFIG_NO_HZ=y
|
|||
CONFIG_HIGH_RES_TIMERS=y
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_PERF_EVENTS=y
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_ARCH_SUNXI=y
|
||||
CONFIG_SMP=y
|
||||
CONFIG_NR_CPUS=8
|
||||
|
@ -77,7 +78,6 @@ CONFIG_SPI_SUN6I=y
|
|||
CONFIG_GPIO_SYSFS=y
|
||||
CONFIG_POWER_SUPPLY=y
|
||||
CONFIG_POWER_RESET=y
|
||||
CONFIG_POWER_RESET_SUN6I=y
|
||||
CONFIG_THERMAL=y
|
||||
CONFIG_CPU_THERMAL=y
|
||||
CONFIG_WATCHDOG=y
|
||||
|
@ -87,6 +87,10 @@ CONFIG_REGULATOR=y
|
|||
CONFIG_REGULATOR_FIXED_VOLTAGE=y
|
||||
CONFIG_REGULATOR_AXP20X=y
|
||||
CONFIG_REGULATOR_GPIO=y
|
||||
CONFIG_FB=y
|
||||
CONFIG_FB_SIMPLE=y
|
||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||
CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY=y
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_EHCI_HCD=y
|
||||
CONFIG_USB_EHCI_HCD_PLATFORM=y
|
||||
|
|
|
@ -140,16 +140,11 @@ static inline u32 __raw_readl(const volatile void __iomem *addr)
|
|||
* The _caller variety takes a __builtin_return_address(0) value for
|
||||
* /proc/vmalloc to use - and should only be used in non-inline functions.
|
||||
*/
|
||||
extern void __iomem *__arm_ioremap_pfn_caller(unsigned long, unsigned long,
|
||||
size_t, unsigned int, void *);
|
||||
extern void __iomem *__arm_ioremap_caller(phys_addr_t, size_t, unsigned int,
|
||||
void *);
|
||||
|
||||
extern void __iomem *__arm_ioremap_pfn(unsigned long, unsigned long, size_t, unsigned int);
|
||||
extern void __iomem *__arm_ioremap(phys_addr_t, size_t, unsigned int);
|
||||
extern void __iomem *__arm_ioremap_exec(phys_addr_t, size_t, bool cached);
|
||||
extern void __iounmap(volatile void __iomem *addr);
|
||||
extern void __arm_iounmap(volatile void __iomem *addr);
|
||||
|
||||
extern void __iomem * (*arch_ioremap_caller)(phys_addr_t, size_t,
|
||||
unsigned int, void *);
|
||||
|
@ -321,21 +316,24 @@ extern void _memset_io(volatile void __iomem *, int, size_t);
|
|||
static inline void memset_io(volatile void __iomem *dst, unsigned c,
|
||||
size_t count)
|
||||
{
|
||||
memset((void __force *)dst, c, count);
|
||||
extern void mmioset(void *, unsigned int, size_t);
|
||||
mmioset((void __force *)dst, c, count);
|
||||
}
|
||||
#define memset_io(dst,c,count) memset_io(dst,c,count)
|
||||
|
||||
static inline void memcpy_fromio(void *to, const volatile void __iomem *from,
|
||||
size_t count)
|
||||
{
|
||||
memcpy(to, (const void __force *)from, count);
|
||||
extern void mmiocpy(void *, const void *, size_t);
|
||||
mmiocpy(to, (const void __force *)from, count);
|
||||
}
|
||||
#define memcpy_fromio(to,from,count) memcpy_fromio(to,from,count)
|
||||
|
||||
static inline void memcpy_toio(volatile void __iomem *to, const void *from,
|
||||
size_t count)
|
||||
{
|
||||
memcpy((void __force *)to, from, count);
|
||||
extern void mmiocpy(void *, const void *, size_t);
|
||||
mmiocpy((void __force *)to, from, count);
|
||||
}
|
||||
#define memcpy_toio(to,from,count) memcpy_toio(to,from,count)
|
||||
|
||||
|
@ -348,18 +346,61 @@ static inline void memcpy_toio(volatile void __iomem *to, const void *from,
|
|||
#endif /* readl */
|
||||
|
||||
/*
|
||||
* ioremap and friends.
|
||||
* ioremap() and friends.
|
||||
*
|
||||
* ioremap takes a PCI memory address, as specified in
|
||||
* Documentation/io-mapping.txt.
|
||||
* ioremap() takes a resource address, and size. Due to the ARM memory
|
||||
* types, it is important to use the correct ioremap() function as each
|
||||
* mapping has specific properties.
|
||||
*
|
||||
* Function Memory type Cacheability Cache hint
|
||||
* ioremap() Device n/a n/a
|
||||
* ioremap_nocache() Device n/a n/a
|
||||
* ioremap_cache() Normal Writeback Read allocate
|
||||
* ioremap_wc() Normal Non-cacheable n/a
|
||||
* ioremap_wt() Normal Non-cacheable n/a
|
||||
*
|
||||
* All device mappings have the following properties:
|
||||
* - no access speculation
|
||||
* - no repetition (eg, on return from an exception)
|
||||
* - number, order and size of accesses are maintained
|
||||
* - unaligned accesses are "unpredictable"
|
||||
* - writes may be delayed before they hit the endpoint device
|
||||
*
|
||||
* ioremap_nocache() is the same as ioremap() as there are too many device
|
||||
* drivers using this for device registers, and documentation which tells
|
||||
* people to use it for such for this to be any different. This is not a
|
||||
* safe fallback for memory-like mappings, or memory regions where the
|
||||
* compiler may generate unaligned accesses - eg, via inlining its own
|
||||
* memcpy.
|
||||
*
|
||||
* All normal memory mappings have the following properties:
|
||||
* - reads can be repeated with no side effects
|
||||
* - repeated reads return the last value written
|
||||
* - reads can fetch additional locations without side effects
|
||||
* - writes can be repeated (in certain cases) with no side effects
|
||||
* - writes can be merged before accessing the target
|
||||
* - unaligned accesses can be supported
|
||||
* - ordering is not guaranteed without explicit dependencies or barrier
|
||||
* instructions
|
||||
* - writes may be delayed before they hit the endpoint memory
|
||||
*
|
||||
* The cache hint is only a performance hint: CPUs may alias these hints.
|
||||
* Eg, a CPU not implementing read allocate but implementing write allocate
|
||||
* will provide a write allocate mapping instead.
|
||||
*/
|
||||
#define ioremap(cookie,size) __arm_ioremap((cookie), (size), MT_DEVICE)
|
||||
#define ioremap_nocache(cookie,size) __arm_ioremap((cookie), (size), MT_DEVICE)
|
||||
#define ioremap_cache(cookie,size) __arm_ioremap((cookie), (size), MT_DEVICE_CACHED)
|
||||
#define ioremap_wc(cookie,size) __arm_ioremap((cookie), (size), MT_DEVICE_WC)
|
||||
#define ioremap_wt(cookie,size) __arm_ioremap((cookie), (size), MT_DEVICE)
|
||||
#define iounmap __arm_iounmap
|
||||
void __iomem *ioremap(resource_size_t res_cookie, size_t size);
|
||||
#define ioremap ioremap
|
||||
#define ioremap_nocache ioremap
|
||||
|
||||
void __iomem *ioremap_cache(resource_size_t res_cookie, size_t size);
|
||||
#define ioremap_cache ioremap_cache
|
||||
|
||||
void __iomem *ioremap_wc(resource_size_t res_cookie, size_t size);
|
||||
#define ioremap_wc ioremap_wc
|
||||
#define ioremap_wt ioremap_wc
|
||||
|
||||
void iounmap(volatile void __iomem *iomem_cookie);
|
||||
#define iounmap iounmap
|
||||
|
||||
/*
|
||||
* io{read,write}{16,32}be() macros
|
||||
|
|
|
@ -275,7 +275,7 @@ static inline void *phys_to_virt(phys_addr_t x)
|
|||
*/
|
||||
#define __pa(x) __virt_to_phys((unsigned long)(x))
|
||||
#define __va(x) ((void *)__phys_to_virt((phys_addr_t)(x)))
|
||||
#define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT)
|
||||
#define pfn_to_kaddr(pfn) __va((phys_addr_t)(pfn) << PAGE_SHIFT)
|
||||
|
||||
extern phys_addr_t (*arch_virt_to_idmap)(unsigned long x);
|
||||
|
||||
|
|
|
@ -129,7 +129,36 @@
|
|||
|
||||
/*
|
||||
* These are the memory types, defined to be compatible with
|
||||
* pre-ARMv6 CPUs cacheable and bufferable bits: XXCB
|
||||
* pre-ARMv6 CPUs cacheable and bufferable bits: n/a,n/a,C,B
|
||||
* ARMv6+ without TEX remapping, they are a table index.
|
||||
* ARMv6+ with TEX remapping, they correspond to n/a,TEX(0),C,B
|
||||
*
|
||||
* MT type Pre-ARMv6 ARMv6+ type / cacheable status
|
||||
* UNCACHED Uncached Strongly ordered
|
||||
* BUFFERABLE Bufferable Normal memory / non-cacheable
|
||||
* WRITETHROUGH Writethrough Normal memory / write through
|
||||
* WRITEBACK Writeback Normal memory / write back, read alloc
|
||||
* MINICACHE Minicache N/A
|
||||
* WRITEALLOC Writeback Normal memory / write back, write alloc
|
||||
* DEV_SHARED Uncached Device memory (shared)
|
||||
* DEV_NONSHARED Uncached Device memory (non-shared)
|
||||
* DEV_WC Bufferable Normal memory / non-cacheable
|
||||
* DEV_CACHED Writeback Normal memory / write back, read alloc
|
||||
* VECTORS Variable Normal memory / variable
|
||||
*
|
||||
* All normal memory mappings have the following properties:
|
||||
* - reads can be repeated with no side effects
|
||||
* - repeated reads return the last value written
|
||||
* - reads can fetch additional locations without side effects
|
||||
* - writes can be repeated (in certain cases) with no side effects
|
||||
* - writes can be merged before accessing the target
|
||||
* - unaligned accesses can be supported
|
||||
*
|
||||
* All device mappings have the following properties:
|
||||
* - no access speculation
|
||||
* - no repetition (eg, on return from an exception)
|
||||
* - number, order and size of accesses are maintained
|
||||
* - unaligned accesses are "unpredictable"
|
||||
*/
|
||||
#define L_PTE_MT_UNCACHED (_AT(pteval_t, 0x00) << 2) /* 0000 */
|
||||
#define L_PTE_MT_BUFFERABLE (_AT(pteval_t, 0x01) << 2) /* 0001 */
|
||||
|
|
|
@ -50,6 +50,9 @@ extern void __aeabi_ulcmp(void);
|
|||
|
||||
extern void fpundefinstr(void);
|
||||
|
||||
void mmioset(void *, unsigned int, size_t);
|
||||
void mmiocpy(void *, const void *, size_t);
|
||||
|
||||
/* platform dependent support */
|
||||
EXPORT_SYMBOL(arm_delay_ops);
|
||||
|
||||
|
@ -88,6 +91,9 @@ EXPORT_SYMBOL(memmove);
|
|||
EXPORT_SYMBOL(memchr);
|
||||
EXPORT_SYMBOL(__memzero);
|
||||
|
||||
EXPORT_SYMBOL(mmioset);
|
||||
EXPORT_SYMBOL(mmiocpy);
|
||||
|
||||
#ifdef CONFIG_MMU
|
||||
EXPORT_SYMBOL(copy_page);
|
||||
|
||||
|
|
|
@ -410,7 +410,7 @@ ENDPROC(__fiq_abt)
|
|||
zero_fp
|
||||
|
||||
.if \trace
|
||||
#ifdef CONFIG_IRQSOFF_TRACER
|
||||
#ifdef CONFIG_TRACE_IRQFLAGS
|
||||
bl trace_hardirqs_off
|
||||
#endif
|
||||
ct_user_exit save = 0
|
||||
|
|
|
@ -578,7 +578,7 @@ void handle_IPI(int ipinr, struct pt_regs *regs)
|
|||
struct pt_regs *old_regs = set_irq_regs(regs);
|
||||
|
||||
if ((unsigned)ipinr < NR_IPI) {
|
||||
trace_ipi_entry(ipi_types[ipinr]);
|
||||
trace_ipi_entry_rcuidle(ipi_types[ipinr]);
|
||||
__inc_irq_stat(cpu, ipi_irqs[ipinr]);
|
||||
}
|
||||
|
||||
|
@ -637,7 +637,7 @@ void handle_IPI(int ipinr, struct pt_regs *regs)
|
|||
}
|
||||
|
||||
if ((unsigned)ipinr < NR_IPI)
|
||||
trace_ipi_exit(ipi_types[ipinr]);
|
||||
trace_ipi_exit_rcuidle(ipi_types[ipinr]);
|
||||
set_irq_regs(old_regs);
|
||||
}
|
||||
|
||||
|
|
|
@ -61,8 +61,10 @@
|
|||
|
||||
/* Prototype: void *memcpy(void *dest, const void *src, size_t n); */
|
||||
|
||||
ENTRY(mmiocpy)
|
||||
ENTRY(memcpy)
|
||||
|
||||
#include "copy_template.S"
|
||||
|
||||
ENDPROC(memcpy)
|
||||
ENDPROC(mmiocpy)
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
.text
|
||||
.align 5
|
||||
|
||||
ENTRY(mmioset)
|
||||
ENTRY(memset)
|
||||
UNWIND( .fnstart )
|
||||
ands r3, r0, #3 @ 1 unaligned?
|
||||
|
@ -133,3 +134,4 @@ UNWIND( .fnstart )
|
|||
b 1b
|
||||
UNWIND( .fnend )
|
||||
ENDPROC(memset)
|
||||
ENDPROC(mmioset)
|
||||
|
|
|
@ -19,7 +19,6 @@ config ARCH_BCM_IPROC
|
|||
select ARCH_REQUIRE_GPIOLIB
|
||||
select ARM_AMBA
|
||||
select PINCTRL
|
||||
select MTD_NAND_BRCMNAND
|
||||
help
|
||||
This enables support for systems based on Broadcom IPROC architected SoCs.
|
||||
The IPROC complex contains one or more ARM CPUs along with common
|
||||
|
|
|
@ -14,73 +14,73 @@
|
|||
/*
|
||||
* Dove Low Interrupt Controller
|
||||
*/
|
||||
#define IRQ_DOVE_BRIDGE 0
|
||||
#define IRQ_DOVE_H2C 1
|
||||
#define IRQ_DOVE_C2H 2
|
||||
#define IRQ_DOVE_NAND 3
|
||||
#define IRQ_DOVE_PDMA 4
|
||||
#define IRQ_DOVE_SPI1 5
|
||||
#define IRQ_DOVE_SPI0 6
|
||||
#define IRQ_DOVE_UART_0 7
|
||||
#define IRQ_DOVE_UART_1 8
|
||||
#define IRQ_DOVE_UART_2 9
|
||||
#define IRQ_DOVE_UART_3 10
|
||||
#define IRQ_DOVE_I2C 11
|
||||
#define IRQ_DOVE_GPIO_0_7 12
|
||||
#define IRQ_DOVE_GPIO_8_15 13
|
||||
#define IRQ_DOVE_GPIO_16_23 14
|
||||
#define IRQ_DOVE_PCIE0_ERR 15
|
||||
#define IRQ_DOVE_PCIE0 16
|
||||
#define IRQ_DOVE_PCIE1_ERR 17
|
||||
#define IRQ_DOVE_PCIE1 18
|
||||
#define IRQ_DOVE_I2S0 19
|
||||
#define IRQ_DOVE_I2S0_ERR 20
|
||||
#define IRQ_DOVE_I2S1 21
|
||||
#define IRQ_DOVE_I2S1_ERR 22
|
||||
#define IRQ_DOVE_USB_ERR 23
|
||||
#define IRQ_DOVE_USB0 24
|
||||
#define IRQ_DOVE_USB1 25
|
||||
#define IRQ_DOVE_GE00_RX 26
|
||||
#define IRQ_DOVE_GE00_TX 27
|
||||
#define IRQ_DOVE_GE00_MISC 28
|
||||
#define IRQ_DOVE_GE00_SUM 29
|
||||
#define IRQ_DOVE_GE00_ERR 30
|
||||
#define IRQ_DOVE_CRYPTO 31
|
||||
#define IRQ_DOVE_BRIDGE (1 + 0)
|
||||
#define IRQ_DOVE_H2C (1 + 1)
|
||||
#define IRQ_DOVE_C2H (1 + 2)
|
||||
#define IRQ_DOVE_NAND (1 + 3)
|
||||
#define IRQ_DOVE_PDMA (1 + 4)
|
||||
#define IRQ_DOVE_SPI1 (1 + 5)
|
||||
#define IRQ_DOVE_SPI0 (1 + 6)
|
||||
#define IRQ_DOVE_UART_0 (1 + 7)
|
||||
#define IRQ_DOVE_UART_1 (1 + 8)
|
||||
#define IRQ_DOVE_UART_2 (1 + 9)
|
||||
#define IRQ_DOVE_UART_3 (1 + 10)
|
||||
#define IRQ_DOVE_I2C (1 + 11)
|
||||
#define IRQ_DOVE_GPIO_0_7 (1 + 12)
|
||||
#define IRQ_DOVE_GPIO_8_15 (1 + 13)
|
||||
#define IRQ_DOVE_GPIO_16_23 (1 + 14)
|
||||
#define IRQ_DOVE_PCIE0_ERR (1 + 15)
|
||||
#define IRQ_DOVE_PCIE0 (1 + 16)
|
||||
#define IRQ_DOVE_PCIE1_ERR (1 + 17)
|
||||
#define IRQ_DOVE_PCIE1 (1 + 18)
|
||||
#define IRQ_DOVE_I2S0 (1 + 19)
|
||||
#define IRQ_DOVE_I2S0_ERR (1 + 20)
|
||||
#define IRQ_DOVE_I2S1 (1 + 21)
|
||||
#define IRQ_DOVE_I2S1_ERR (1 + 22)
|
||||
#define IRQ_DOVE_USB_ERR (1 + 23)
|
||||
#define IRQ_DOVE_USB0 (1 + 24)
|
||||
#define IRQ_DOVE_USB1 (1 + 25)
|
||||
#define IRQ_DOVE_GE00_RX (1 + 26)
|
||||
#define IRQ_DOVE_GE00_TX (1 + 27)
|
||||
#define IRQ_DOVE_GE00_MISC (1 + 28)
|
||||
#define IRQ_DOVE_GE00_SUM (1 + 29)
|
||||
#define IRQ_DOVE_GE00_ERR (1 + 30)
|
||||
#define IRQ_DOVE_CRYPTO (1 + 31)
|
||||
|
||||
/*
|
||||
* Dove High Interrupt Controller
|
||||
*/
|
||||
#define IRQ_DOVE_AC97 32
|
||||
#define IRQ_DOVE_PMU 33
|
||||
#define IRQ_DOVE_CAM 34
|
||||
#define IRQ_DOVE_SDIO0 35
|
||||
#define IRQ_DOVE_SDIO1 36
|
||||
#define IRQ_DOVE_SDIO0_WAKEUP 37
|
||||
#define IRQ_DOVE_SDIO1_WAKEUP 38
|
||||
#define IRQ_DOVE_XOR_00 39
|
||||
#define IRQ_DOVE_XOR_01 40
|
||||
#define IRQ_DOVE_XOR0_ERR 41
|
||||
#define IRQ_DOVE_XOR_10 42
|
||||
#define IRQ_DOVE_XOR_11 43
|
||||
#define IRQ_DOVE_XOR1_ERR 44
|
||||
#define IRQ_DOVE_LCD_DCON 45
|
||||
#define IRQ_DOVE_LCD1 46
|
||||
#define IRQ_DOVE_LCD0 47
|
||||
#define IRQ_DOVE_GPU 48
|
||||
#define IRQ_DOVE_PERFORM_MNTR 49
|
||||
#define IRQ_DOVE_VPRO_DMA1 51
|
||||
#define IRQ_DOVE_SSP_TIMER 54
|
||||
#define IRQ_DOVE_SSP 55
|
||||
#define IRQ_DOVE_MC_L2_ERR 56
|
||||
#define IRQ_DOVE_CRYPTO_ERR 59
|
||||
#define IRQ_DOVE_GPIO_24_31 60
|
||||
#define IRQ_DOVE_HIGH_GPIO 61
|
||||
#define IRQ_DOVE_SATA 62
|
||||
#define IRQ_DOVE_AC97 (1 + 32)
|
||||
#define IRQ_DOVE_PMU (1 + 33)
|
||||
#define IRQ_DOVE_CAM (1 + 34)
|
||||
#define IRQ_DOVE_SDIO0 (1 + 35)
|
||||
#define IRQ_DOVE_SDIO1 (1 + 36)
|
||||
#define IRQ_DOVE_SDIO0_WAKEUP (1 + 37)
|
||||
#define IRQ_DOVE_SDIO1_WAKEUP (1 + 38)
|
||||
#define IRQ_DOVE_XOR_00 (1 + 39)
|
||||
#define IRQ_DOVE_XOR_01 (1 + 40)
|
||||
#define IRQ_DOVE_XOR0_ERR (1 + 41)
|
||||
#define IRQ_DOVE_XOR_10 (1 + 42)
|
||||
#define IRQ_DOVE_XOR_11 (1 + 43)
|
||||
#define IRQ_DOVE_XOR1_ERR (1 + 44)
|
||||
#define IRQ_DOVE_LCD_DCON (1 + 45)
|
||||
#define IRQ_DOVE_LCD1 (1 + 46)
|
||||
#define IRQ_DOVE_LCD0 (1 + 47)
|
||||
#define IRQ_DOVE_GPU (1 + 48)
|
||||
#define IRQ_DOVE_PERFORM_MNTR (1 + 49)
|
||||
#define IRQ_DOVE_VPRO_DMA1 (1 + 51)
|
||||
#define IRQ_DOVE_SSP_TIMER (1 + 54)
|
||||
#define IRQ_DOVE_SSP (1 + 55)
|
||||
#define IRQ_DOVE_MC_L2_ERR (1 + 56)
|
||||
#define IRQ_DOVE_CRYPTO_ERR (1 + 59)
|
||||
#define IRQ_DOVE_GPIO_24_31 (1 + 60)
|
||||
#define IRQ_DOVE_HIGH_GPIO (1 + 61)
|
||||
#define IRQ_DOVE_SATA (1 + 62)
|
||||
|
||||
/*
|
||||
* DOVE General Purpose Pins
|
||||
*/
|
||||
#define IRQ_DOVE_GPIO_START 64
|
||||
#define IRQ_DOVE_GPIO_START 65
|
||||
#define NR_GPIO_IRQS 64
|
||||
|
||||
/*
|
||||
|
|
|
@ -126,14 +126,14 @@ __exception_irq_entry dove_legacy_handle_irq(struct pt_regs *regs)
|
|||
stat = readl_relaxed(dove_irq_base + IRQ_CAUSE_LOW_OFF);
|
||||
stat &= readl_relaxed(dove_irq_base + IRQ_MASK_LOW_OFF);
|
||||
if (stat) {
|
||||
unsigned int hwirq = __fls(stat);
|
||||
unsigned int hwirq = 1 + __fls(stat);
|
||||
handle_IRQ(hwirq, regs);
|
||||
return;
|
||||
}
|
||||
stat = readl_relaxed(dove_irq_base + IRQ_CAUSE_HIGH_OFF);
|
||||
stat &= readl_relaxed(dove_irq_base + IRQ_MASK_HIGH_OFF);
|
||||
if (stat) {
|
||||
unsigned int hwirq = 32 + __fls(stat);
|
||||
unsigned int hwirq = 33 + __fls(stat);
|
||||
handle_IRQ(hwirq, regs);
|
||||
return;
|
||||
}
|
||||
|
@ -144,8 +144,8 @@ void __init dove_init_irq(void)
|
|||
{
|
||||
int i;
|
||||
|
||||
orion_irq_init(0, IRQ_VIRT_BASE + IRQ_MASK_LOW_OFF);
|
||||
orion_irq_init(32, IRQ_VIRT_BASE + IRQ_MASK_HIGH_OFF);
|
||||
orion_irq_init(1, IRQ_VIRT_BASE + IRQ_MASK_LOW_OFF);
|
||||
orion_irq_init(33, IRQ_VIRT_BASE + IRQ_MASK_HIGH_OFF);
|
||||
|
||||
#ifdef CONFIG_MULTI_IRQ_HANDLER
|
||||
set_handle_irq(dove_legacy_handle_irq);
|
||||
|
|
|
@ -43,6 +43,9 @@ static void mvebu_armada_xp_gp_pm_enter(void __iomem *sdram_reg, u32 srcmd)
|
|||
for (i = 0; i < ARMADA_XP_GP_PIC_NR_GPIOS; i++)
|
||||
ackcmd |= BIT(pic_raw_gpios[i]);
|
||||
|
||||
srcmd = cpu_to_le32(srcmd);
|
||||
ackcmd = cpu_to_le32(ackcmd);
|
||||
|
||||
/*
|
||||
* Wait a while, the PIC needs quite a bit of time between the
|
||||
* two GPIO commands.
|
||||
|
|
|
@ -274,8 +274,5 @@ obj-y += $(nand-m) $(nand-y)
|
|||
|
||||
smsc911x-$(CONFIG_SMSC911X) := gpmc-smsc911x.o
|
||||
obj-y += $(smsc911x-m) $(smsc911x-y)
|
||||
ifneq ($(CONFIG_HWSPINLOCK_OMAP),)
|
||||
obj-y += hwspinlock.o
|
||||
endif
|
||||
|
||||
obj-y += common-board-devices.o twl-common.o dss-common.o
|
||||
|
|
|
@ -117,7 +117,6 @@ static void omap2_show_dma_caps(void)
|
|||
u8 revision = dma_read(REVISION, 0) & 0xff;
|
||||
printk(KERN_INFO "OMAP DMA hardware revision %d.%d\n",
|
||||
revision >> 4, revision & 0xf);
|
||||
return;
|
||||
}
|
||||
|
||||
static unsigned configure_dma_errata(void)
|
||||
|
|
|
@ -1,60 +0,0 @@
|
|||
/*
|
||||
* OMAP hardware spinlock device initialization
|
||||
*
|
||||
* Copyright (C) 2010 Texas Instruments Incorporated - http://www.ti.com
|
||||
*
|
||||
* Contact: Simon Que <sque@ti.com>
|
||||
* Hari Kanigeri <h-kanigeri2@ti.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* version 2 as published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/hwspinlock.h>
|
||||
|
||||
#include "soc.h"
|
||||
#include "omap_hwmod.h"
|
||||
#include "omap_device.h"
|
||||
|
||||
static struct hwspinlock_pdata omap_hwspinlock_pdata __initdata = {
|
||||
.base_id = 0,
|
||||
};
|
||||
|
||||
static int __init hwspinlocks_init(void)
|
||||
{
|
||||
int retval = 0;
|
||||
struct omap_hwmod *oh;
|
||||
struct platform_device *pdev;
|
||||
const char *oh_name = "spinlock";
|
||||
const char *dev_name = "omap_hwspinlock";
|
||||
|
||||
/*
|
||||
* Hwmod lookup will fail in case our platform doesn't support the
|
||||
* hardware spinlock module, so it is safe to run this initcall
|
||||
* on all omaps
|
||||
*/
|
||||
oh = omap_hwmod_lookup(oh_name);
|
||||
if (oh == NULL)
|
||||
return -EINVAL;
|
||||
|
||||
pdev = omap_device_build(dev_name, 0, oh, &omap_hwspinlock_pdata,
|
||||
sizeof(struct hwspinlock_pdata));
|
||||
if (IS_ERR(pdev)) {
|
||||
pr_err("Can't build omap_device for %s:%s\n", dev_name,
|
||||
oh_name);
|
||||
retval = PTR_ERR(pdev);
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
/* early board code might need to reserve specific hwspinlock instances */
|
||||
omap_postcore_initcall(hwspinlocks_init);
|
|
@ -4,6 +4,7 @@ menuconfig ARCH_SIRF
|
|||
select ARCH_REQUIRE_GPIOLIB
|
||||
select GENERIC_IRQ_CHIP
|
||||
select NO_IOPORT_MAP
|
||||
select REGMAP
|
||||
select PINCTRL
|
||||
select PINCTRL_SIRF
|
||||
help
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* RTC I/O Bridge interfaces for CSR SiRFprimaII
|
||||
* RTC I/O Bridge interfaces for CSR SiRFprimaII/atlas7
|
||||
* ARM access the registers of SYSRTC, GPSRTC and PWRC through this module
|
||||
*
|
||||
* Copyright (c) 2011 Cambridge Silicon Radio Limited, a CSR plc group company.
|
||||
|
@ -10,6 +10,7 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/regmap.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_device.h>
|
||||
|
@ -66,6 +67,7 @@ u32 sirfsoc_rtc_iobrg_readl(u32 addr)
|
|||
{
|
||||
unsigned long flags, val;
|
||||
|
||||
/* TODO: add hwspinlock to sync with M3 */
|
||||
spin_lock_irqsave(&rtciobrg_lock, flags);
|
||||
|
||||
val = __sirfsoc_rtc_iobrg_readl(addr);
|
||||
|
@ -90,6 +92,7 @@ void sirfsoc_rtc_iobrg_writel(u32 val, u32 addr)
|
|||
{
|
||||
unsigned long flags;
|
||||
|
||||
/* TODO: add hwspinlock to sync with M3 */
|
||||
spin_lock_irqsave(&rtciobrg_lock, flags);
|
||||
|
||||
sirfsoc_rtc_iobrg_pre_writel(val, addr);
|
||||
|
@ -102,6 +105,45 @@ void sirfsoc_rtc_iobrg_writel(u32 val, u32 addr)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(sirfsoc_rtc_iobrg_writel);
|
||||
|
||||
|
||||
static int regmap_iobg_regwrite(void *context, unsigned int reg,
|
||||
unsigned int val)
|
||||
{
|
||||
sirfsoc_rtc_iobrg_writel(val, reg);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int regmap_iobg_regread(void *context, unsigned int reg,
|
||||
unsigned int *val)
|
||||
{
|
||||
*val = (u32)sirfsoc_rtc_iobrg_readl(reg);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct regmap_bus regmap_iobg = {
|
||||
.reg_write = regmap_iobg_regwrite,
|
||||
.reg_read = regmap_iobg_regread,
|
||||
};
|
||||
|
||||
/**
|
||||
* devm_regmap_init_iobg(): Initialise managed register map
|
||||
*
|
||||
* @iobg: Device that will be interacted with
|
||||
* @config: Configuration for register map
|
||||
*
|
||||
* The return value will be an ERR_PTR() on error or a valid pointer
|
||||
* to a struct regmap. The regmap will be automatically freed by the
|
||||
* device management code.
|
||||
*/
|
||||
struct regmap *devm_regmap_init_iobg(struct device *dev,
|
||||
const struct regmap_config *config)
|
||||
{
|
||||
const struct regmap_bus *bus = ®map_iobg;
|
||||
|
||||
return devm_regmap_init(dev, bus, dev, config);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devm_regmap_init_iobg);
|
||||
|
||||
static const struct of_device_id rtciobrg_ids[] = {
|
||||
{ .compatible = "sirf,prima2-rtciobg" },
|
||||
{}
|
||||
|
@ -132,7 +174,7 @@ static int __init sirfsoc_rtciobrg_init(void)
|
|||
}
|
||||
postcore_initcall(sirfsoc_rtciobrg_init);
|
||||
|
||||
MODULE_AUTHOR("Zhiwu Song <zhiwu.song@csr.com>, "
|
||||
"Barry Song <baohua.song@csr.com>");
|
||||
MODULE_AUTHOR("Zhiwu Song <zhiwu.song@csr.com>");
|
||||
MODULE_AUTHOR("Barry Song <baohua.song@csr.com>");
|
||||
MODULE_DESCRIPTION("CSR SiRFprimaII rtc io bridge");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
|
|
@ -35,7 +35,7 @@ config MACH_SUN7I
|
|||
select SUN5I_HSTIMER
|
||||
|
||||
config MACH_SUN8I
|
||||
bool "Allwinner A23 (sun8i) SoCs support"
|
||||
bool "Allwinner sun8i Family SoCs support"
|
||||
default ARCH_SUNXI
|
||||
select ARM_GIC
|
||||
select MFD_SUN6I_PRCM
|
||||
|
|
|
@ -67,10 +67,13 @@ MACHINE_END
|
|||
|
||||
static const char * const sun8i_board_dt_compat[] = {
|
||||
"allwinner,sun8i-a23",
|
||||
"allwinner,sun8i-a33",
|
||||
"allwinner,sun8i-h3",
|
||||
NULL,
|
||||
};
|
||||
|
||||
DT_MACHINE_START(SUN8I_DT, "Allwinner sun8i (A23) Family")
|
||||
DT_MACHINE_START(SUN8I_DT, "Allwinner sun8i Family")
|
||||
.init_time = sun6i_timer_init,
|
||||
.dt_compat = sun8i_board_dt_compat,
|
||||
.init_late = sunxi_dt_cpufreq_init,
|
||||
MACHINE_END
|
||||
|
|
|
@ -255,7 +255,7 @@ remap_area_supersections(unsigned long virt, unsigned long pfn,
|
|||
}
|
||||
#endif
|
||||
|
||||
void __iomem * __arm_ioremap_pfn_caller(unsigned long pfn,
|
||||
static void __iomem * __arm_ioremap_pfn_caller(unsigned long pfn,
|
||||
unsigned long offset, size_t size, unsigned int mtype, void *caller)
|
||||
{
|
||||
const struct mem_type *type;
|
||||
|
@ -363,7 +363,7 @@ __arm_ioremap_pfn(unsigned long pfn, unsigned long offset, size_t size,
|
|||
unsigned int mtype)
|
||||
{
|
||||
return __arm_ioremap_pfn_caller(pfn, offset, size, mtype,
|
||||
__builtin_return_address(0));
|
||||
__builtin_return_address(0));
|
||||
}
|
||||
EXPORT_SYMBOL(__arm_ioremap_pfn);
|
||||
|
||||
|
@ -371,13 +371,26 @@ void __iomem * (*arch_ioremap_caller)(phys_addr_t, size_t,
|
|||
unsigned int, void *) =
|
||||
__arm_ioremap_caller;
|
||||
|
||||
void __iomem *
|
||||
__arm_ioremap(phys_addr_t phys_addr, size_t size, unsigned int mtype)
|
||||
void __iomem *ioremap(resource_size_t res_cookie, size_t size)
|
||||
{
|
||||
return arch_ioremap_caller(phys_addr, size, mtype,
|
||||
__builtin_return_address(0));
|
||||
return arch_ioremap_caller(res_cookie, size, MT_DEVICE,
|
||||
__builtin_return_address(0));
|
||||
}
|
||||
EXPORT_SYMBOL(__arm_ioremap);
|
||||
EXPORT_SYMBOL(ioremap);
|
||||
|
||||
void __iomem *ioremap_cache(resource_size_t res_cookie, size_t size)
|
||||
{
|
||||
return arch_ioremap_caller(res_cookie, size, MT_DEVICE_CACHED,
|
||||
__builtin_return_address(0));
|
||||
}
|
||||
EXPORT_SYMBOL(ioremap_cache);
|
||||
|
||||
void __iomem *ioremap_wc(resource_size_t res_cookie, size_t size)
|
||||
{
|
||||
return arch_ioremap_caller(res_cookie, size, MT_DEVICE_WC,
|
||||
__builtin_return_address(0));
|
||||
}
|
||||
EXPORT_SYMBOL(ioremap_wc);
|
||||
|
||||
/*
|
||||
* Remap an arbitrary physical address space into the kernel virtual
|
||||
|
@ -431,11 +444,11 @@ void __iounmap(volatile void __iomem *io_addr)
|
|||
|
||||
void (*arch_iounmap)(volatile void __iomem *) = __iounmap;
|
||||
|
||||
void __arm_iounmap(volatile void __iomem *io_addr)
|
||||
void iounmap(volatile void __iomem *cookie)
|
||||
{
|
||||
arch_iounmap(io_addr);
|
||||
arch_iounmap(cookie);
|
||||
}
|
||||
EXPORT_SYMBOL(__arm_iounmap);
|
||||
EXPORT_SYMBOL(iounmap);
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
static int pci_ioremap_mem_type = MT_DEVICE;
|
||||
|
|
|
@ -1072,6 +1072,7 @@ void __init sanity_check_meminfo(void)
|
|||
int highmem = 0;
|
||||
phys_addr_t vmalloc_limit = __pa(vmalloc_min - 1) + 1;
|
||||
struct memblock_region *reg;
|
||||
bool should_use_highmem = false;
|
||||
|
||||
for_each_memblock(memory, reg) {
|
||||
phys_addr_t block_start = reg->base;
|
||||
|
@ -1090,6 +1091,7 @@ void __init sanity_check_meminfo(void)
|
|||
pr_notice("Ignoring RAM at %pa-%pa (!CONFIG_HIGHMEM)\n",
|
||||
&block_start, &block_end);
|
||||
memblock_remove(reg->base, reg->size);
|
||||
should_use_highmem = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -1100,6 +1102,7 @@ void __init sanity_check_meminfo(void)
|
|||
&block_start, &block_end, &vmalloc_limit);
|
||||
memblock_remove(vmalloc_limit, overlap_size);
|
||||
block_end = vmalloc_limit;
|
||||
should_use_highmem = true;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1134,6 +1137,9 @@ void __init sanity_check_meminfo(void)
|
|||
}
|
||||
}
|
||||
|
||||
if (should_use_highmem)
|
||||
pr_notice("Consider using a HIGHMEM enabled kernel.\n");
|
||||
|
||||
high_memory = __va(arm_lowmem_limit - 1) + 1;
|
||||
|
||||
/*
|
||||
|
@ -1494,6 +1500,7 @@ void __init paging_init(const struct machine_desc *mdesc)
|
|||
build_mem_type_table();
|
||||
prepare_page_table();
|
||||
map_lowmem();
|
||||
memblock_set_current_limit(arm_lowmem_limit);
|
||||
dma_contiguous_remap();
|
||||
devicemaps_init(mdesc);
|
||||
kmap_init();
|
||||
|
|
|
@ -351,30 +351,43 @@ void __iomem *__arm_ioremap_pfn(unsigned long pfn, unsigned long offset,
|
|||
}
|
||||
EXPORT_SYMBOL(__arm_ioremap_pfn);
|
||||
|
||||
void __iomem *__arm_ioremap_pfn_caller(unsigned long pfn, unsigned long offset,
|
||||
size_t size, unsigned int mtype, void *caller)
|
||||
{
|
||||
return __arm_ioremap_pfn(pfn, offset, size, mtype);
|
||||
}
|
||||
|
||||
void __iomem *__arm_ioremap(phys_addr_t phys_addr, size_t size,
|
||||
unsigned int mtype)
|
||||
{
|
||||
return (void __iomem *)phys_addr;
|
||||
}
|
||||
EXPORT_SYMBOL(__arm_ioremap);
|
||||
|
||||
void __iomem * (*arch_ioremap_caller)(phys_addr_t, size_t, unsigned int, void *);
|
||||
|
||||
void __iomem *__arm_ioremap_caller(phys_addr_t phys_addr, size_t size,
|
||||
unsigned int mtype, void *caller)
|
||||
{
|
||||
return __arm_ioremap(phys_addr, size, mtype);
|
||||
return (void __iomem *)phys_addr;
|
||||
}
|
||||
|
||||
void __iomem * (*arch_ioremap_caller)(phys_addr_t, size_t, unsigned int, void *);
|
||||
|
||||
void __iomem *ioremap(resource_size_t res_cookie, size_t size)
|
||||
{
|
||||
return __arm_ioremap_caller(res_cookie, size, MT_DEVICE,
|
||||
__builtin_return_address(0));
|
||||
}
|
||||
EXPORT_SYMBOL(ioremap);
|
||||
|
||||
void __iomem *ioremap_cache(resource_size_t res_cookie, size_t size)
|
||||
{
|
||||
return __arm_ioremap_caller(res_cookie, size, MT_DEVICE_CACHED,
|
||||
__builtin_return_address(0));
|
||||
}
|
||||
EXPORT_SYMBOL(ioremap_cache);
|
||||
|
||||
void __iomem *ioremap_wc(resource_size_t res_cookie, size_t size)
|
||||
{
|
||||
return __arm_ioremap_caller(res_cookie, size, MT_DEVICE_WC,
|
||||
__builtin_return_address(0));
|
||||
}
|
||||
EXPORT_SYMBOL(ioremap_wc);
|
||||
|
||||
void __iounmap(volatile void __iomem *addr)
|
||||
{
|
||||
}
|
||||
EXPORT_SYMBOL(__iounmap);
|
||||
|
||||
void (*arch_iounmap)(volatile void __iomem *);
|
||||
|
||||
void __arm_iounmap(volatile void __iomem *addr)
|
||||
void iounmap(volatile void __iomem *addr)
|
||||
{
|
||||
}
|
||||
EXPORT_SYMBOL(__arm_iounmap);
|
||||
EXPORT_SYMBOL(iounmap);
|
||||
|
|
|
@ -45,13 +45,11 @@
|
|||
* it does.
|
||||
*/
|
||||
|
||||
#define _GNU_SOURCE
|
||||
|
||||
#include <byteswap.h>
|
||||
#include <elf.h>
|
||||
#include <errno.h>
|
||||
#include <error.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdarg.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -82,11 +80,25 @@
|
|||
#define EF_ARM_ABI_FLOAT_HARD 0x400
|
||||
#endif
|
||||
|
||||
static int failed;
|
||||
static const char *argv0;
|
||||
static const char *outfile;
|
||||
|
||||
static void fail(const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
failed = 1;
|
||||
fprintf(stderr, "%s: ", argv0);
|
||||
va_start(ap, fmt);
|
||||
vfprintf(stderr, fmt, ap);
|
||||
va_end(ap);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
static void cleanup(void)
|
||||
{
|
||||
if (error_message_count > 0 && outfile != NULL)
|
||||
if (failed && outfile != NULL)
|
||||
unlink(outfile);
|
||||
}
|
||||
|
||||
|
@ -119,68 +131,66 @@ int main(int argc, char **argv)
|
|||
int infd;
|
||||
|
||||
atexit(cleanup);
|
||||
argv0 = argv[0];
|
||||
|
||||
if (argc != 3)
|
||||
error(EXIT_FAILURE, 0, "Usage: %s [infile] [outfile]", argv[0]);
|
||||
fail("Usage: %s [infile] [outfile]\n", argv[0]);
|
||||
|
||||
infile = argv[1];
|
||||
outfile = argv[2];
|
||||
|
||||
infd = open(infile, O_RDONLY);
|
||||
if (infd < 0)
|
||||
error(EXIT_FAILURE, errno, "Cannot open %s", infile);
|
||||
fail("Cannot open %s: %s\n", infile, strerror(errno));
|
||||
|
||||
if (fstat(infd, &stat) != 0)
|
||||
error(EXIT_FAILURE, errno, "Failed stat for %s", infile);
|
||||
fail("Failed stat for %s: %s\n", infile, strerror(errno));
|
||||
|
||||
inbuf = mmap(NULL, stat.st_size, PROT_READ, MAP_PRIVATE, infd, 0);
|
||||
if (inbuf == MAP_FAILED)
|
||||
error(EXIT_FAILURE, errno, "Failed to map %s", infile);
|
||||
fail("Failed to map %s: %s\n", infile, strerror(errno));
|
||||
|
||||
close(infd);
|
||||
|
||||
inhdr = inbuf;
|
||||
|
||||
if (memcmp(&inhdr->e_ident, ELFMAG, SELFMAG) != 0)
|
||||
error(EXIT_FAILURE, 0, "Not an ELF file");
|
||||
fail("Not an ELF file\n");
|
||||
|
||||
if (inhdr->e_ident[EI_CLASS] != ELFCLASS32)
|
||||
error(EXIT_FAILURE, 0, "Unsupported ELF class");
|
||||
fail("Unsupported ELF class\n");
|
||||
|
||||
swap = inhdr->e_ident[EI_DATA] != HOST_ORDER;
|
||||
|
||||
if (read_elf_half(inhdr->e_type, swap) != ET_DYN)
|
||||
error(EXIT_FAILURE, 0, "Not a shared object");
|
||||
fail("Not a shared object\n");
|
||||
|
||||
if (read_elf_half(inhdr->e_machine, swap) != EM_ARM) {
|
||||
error(EXIT_FAILURE, 0, "Unsupported architecture %#x",
|
||||
inhdr->e_machine);
|
||||
}
|
||||
if (read_elf_half(inhdr->e_machine, swap) != EM_ARM)
|
||||
fail("Unsupported architecture %#x\n", inhdr->e_machine);
|
||||
|
||||
e_flags = read_elf_word(inhdr->e_flags, swap);
|
||||
|
||||
if (EF_ARM_EABI_VERSION(e_flags) != EF_ARM_EABI_VER5) {
|
||||
error(EXIT_FAILURE, 0, "Unsupported EABI version %#x",
|
||||
EF_ARM_EABI_VERSION(e_flags));
|
||||
fail("Unsupported EABI version %#x\n",
|
||||
EF_ARM_EABI_VERSION(e_flags));
|
||||
}
|
||||
|
||||
if (e_flags & EF_ARM_ABI_FLOAT_HARD)
|
||||
error(EXIT_FAILURE, 0,
|
||||
"Unexpected hard-float flag set in e_flags");
|
||||
fail("Unexpected hard-float flag set in e_flags\n");
|
||||
|
||||
clear_soft_float = !!(e_flags & EF_ARM_ABI_FLOAT_SOFT);
|
||||
|
||||
outfd = open(outfile, O_RDWR | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
|
||||
if (outfd < 0)
|
||||
error(EXIT_FAILURE, errno, "Cannot open %s", outfile);
|
||||
fail("Cannot open %s: %s\n", outfile, strerror(errno));
|
||||
|
||||
if (ftruncate(outfd, stat.st_size) != 0)
|
||||
error(EXIT_FAILURE, errno, "Cannot truncate %s", outfile);
|
||||
fail("Cannot truncate %s: %s\n", outfile, strerror(errno));
|
||||
|
||||
outbuf = mmap(NULL, stat.st_size, PROT_READ | PROT_WRITE, MAP_SHARED,
|
||||
outfd, 0);
|
||||
if (outbuf == MAP_FAILED)
|
||||
error(EXIT_FAILURE, errno, "Failed to map %s", outfile);
|
||||
fail("Failed to map %s: %s\n", outfile, strerror(errno));
|
||||
|
||||
close(outfd);
|
||||
|
||||
|
@ -195,7 +205,7 @@ int main(int argc, char **argv)
|
|||
}
|
||||
|
||||
if (msync(outbuf, stat.st_size, MS_SYNC) != 0)
|
||||
error(EXIT_FAILURE, errno, "Failed to sync %s", outfile);
|
||||
fail("Failed to sync %s: %s\n", outfile, strerror(errno));
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
|
|
@ -23,9 +23,9 @@ config ARM64
|
|||
select BUILDTIME_EXTABLE_SORT
|
||||
select CLONE_BACKWARDS
|
||||
select COMMON_CLK
|
||||
select EDAC_SUPPORT
|
||||
select CPU_PM if (SUSPEND || CPU_IDLE)
|
||||
select DCACHE_WORD_ACCESS
|
||||
select EDAC_SUPPORT
|
||||
select GENERIC_ALLOCATOR
|
||||
select GENERIC_CLOCKEVENTS
|
||||
select GENERIC_CLOCKEVENTS_BROADCAST if SMP
|
||||
|
|
|
@ -23,6 +23,16 @@
|
|||
device_type = "memory";
|
||||
reg = < 0x1 0x00000000 0x0 0x80000000 >; /* Updated by bootloader */
|
||||
};
|
||||
|
||||
gpio-keys {
|
||||
compatible = "gpio-keys";
|
||||
button@1 {
|
||||
label = "POWER";
|
||||
linux,code = <116>;
|
||||
linux,input-type = <0x1>;
|
||||
interrupts = <0x0 0x2d 0x1>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
&pcie0clk {
|
||||
|
|
|
@ -717,6 +717,19 @@
|
|||
phy-names = "sata-phy";
|
||||
};
|
||||
|
||||
sbgpio: sbgpio@17001000{
|
||||
compatible = "apm,xgene-gpio-sb";
|
||||
reg = <0x0 0x17001000 0x0 0x400>;
|
||||
#gpio-cells = <2>;
|
||||
gpio-controller;
|
||||
interrupts = <0x0 0x28 0x1>,
|
||||
<0x0 0x29 0x1>,
|
||||
<0x0 0x2a 0x1>,
|
||||
<0x0 0x2b 0x1>,
|
||||
<0x0 0x2c 0x1>,
|
||||
<0x0 0x2d 0x1>;
|
||||
};
|
||||
|
||||
rtc: rtc@10510000 {
|
||||
compatible = "apm,xgene-rtc";
|
||||
reg = <0x0 0x10510000 0x0 0x400>;
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
dtb-$(CONFIG_ARCH_VEXPRESS) += foundation-v8.dtb
|
||||
dtb-$(CONFIG_ARCH_VEXPRESS) += juno.dtb juno-r1.dtb
|
||||
dtb-$(CONFIG_ARCH_VEXPRESS) += rtsm_ve-aemv8a.dtb
|
||||
dtb-$(CONFIG_ARCH_VEXPRESS) += vexpress-v2f-1xv7-ca53x2.dtb
|
||||
|
||||
always := $(dtb-y)
|
||||
subdir-y := $(dts-dirs)
|
||||
|
|
|
@ -0,0 +1,191 @@
|
|||
/*
|
||||
* ARM Ltd. Versatile Express
|
||||
*
|
||||
* LogicTile Express 20MG
|
||||
* V2F-1XV7
|
||||
*
|
||||
* Cortex-A53 (2 cores) Soft Macrocell Model
|
||||
*
|
||||
* HBI-0247C
|
||||
*/
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
|
||||
/ {
|
||||
model = "V2F-1XV7 Cortex-A53x2 SMM";
|
||||
arm,hbi = <0x247>;
|
||||
arm,vexpress,site = <0xf>;
|
||||
compatible = "arm,vexpress,v2f-1xv7,ca53x2", "arm,vexpress,v2f-1xv7", "arm,vexpress";
|
||||
interrupt-parent = <&gic>;
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
|
||||
chosen {
|
||||
stdout-path = "serial0:38400n8";
|
||||
};
|
||||
|
||||
aliases {
|
||||
serial0 = &v2m_serial0;
|
||||
serial1 = &v2m_serial1;
|
||||
serial2 = &v2m_serial2;
|
||||
serial3 = &v2m_serial3;
|
||||
i2c0 = &v2m_i2c_dvi;
|
||||
i2c1 = &v2m_i2c_pcie;
|
||||
};
|
||||
|
||||
cpus {
|
||||
#address-cells = <2>;
|
||||
#size-cells = <0>;
|
||||
|
||||
cpu@0 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a53", "arm,armv8";
|
||||
reg = <0 0>;
|
||||
next-level-cache = <&L2_0>;
|
||||
};
|
||||
|
||||
cpu@1 {
|
||||
device_type = "cpu";
|
||||
compatible = "arm,cortex-a53", "arm,armv8";
|
||||
reg = <0 1>;
|
||||
next-level-cache = <&L2_0>;
|
||||
};
|
||||
|
||||
L2_0: l2-cache0 {
|
||||
compatible = "cache";
|
||||
};
|
||||
};
|
||||
|
||||
memory@80000000 {
|
||||
device_type = "memory";
|
||||
reg = <0 0x80000000 0 0x80000000>; /* 2GB @ 2GB */
|
||||
};
|
||||
|
||||
gic: interrupt-controller@2c001000 {
|
||||
compatible = "arm,gic-400";
|
||||
#interrupt-cells = <3>;
|
||||
#address-cells = <0>;
|
||||
interrupt-controller;
|
||||
reg = <0 0x2c001000 0 0x1000>,
|
||||
<0 0x2c002000 0 0x2000>,
|
||||
<0 0x2c004000 0 0x2000>,
|
||||
<0 0x2c006000 0 0x2000>;
|
||||
interrupts = <GIC_PPI 9 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_HIGH)>;
|
||||
};
|
||||
|
||||
timer {
|
||||
compatible = "arm,armv8-timer";
|
||||
interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>,
|
||||
<GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>,
|
||||
<GIC_PPI 11 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>,
|
||||
<GIC_PPI 10 (GIC_CPU_MASK_SIMPLE(2) | IRQ_TYPE_LEVEL_LOW)>;
|
||||
};
|
||||
|
||||
pmu {
|
||||
compatible = "arm,armv8-pmuv3";
|
||||
interrupts = <GIC_SPI 68 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 69 IRQ_TYPE_LEVEL_HIGH>;
|
||||
};
|
||||
|
||||
dcc {
|
||||
compatible = "arm,vexpress,config-bus";
|
||||
arm,vexpress,config-bridge = <&v2m_sysreg>;
|
||||
|
||||
smbclk: osc@4 {
|
||||
/* SMC clock */
|
||||
compatible = "arm,vexpress-osc";
|
||||
arm,vexpress-sysreg,func = <1 4>;
|
||||
freq-range = <40000000 40000000>;
|
||||
#clock-cells = <0>;
|
||||
clock-output-names = "smclk";
|
||||
};
|
||||
|
||||
volt@0 {
|
||||
/* VIO to expansion board above */
|
||||
compatible = "arm,vexpress-volt";
|
||||
arm,vexpress-sysreg,func = <2 0>;
|
||||
regulator-name = "VIO_UP";
|
||||
regulator-min-microvolt = <800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
volt@1 {
|
||||
/* 12V from power connector J6 */
|
||||
compatible = "arm,vexpress-volt";
|
||||
arm,vexpress-sysreg,func = <2 1>;
|
||||
regulator-name = "12";
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
temp@0 {
|
||||
/* FPGA temperature */
|
||||
compatible = "arm,vexpress-temp";
|
||||
arm,vexpress-sysreg,func = <4 0>;
|
||||
label = "FPGA";
|
||||
};
|
||||
};
|
||||
|
||||
smb {
|
||||
compatible = "simple-bus";
|
||||
|
||||
#address-cells = <2>;
|
||||
#size-cells = <1>;
|
||||
ranges = <0 0 0 0x08000000 0x04000000>,
|
||||
<1 0 0 0x14000000 0x04000000>,
|
||||
<2 0 0 0x18000000 0x04000000>,
|
||||
<3 0 0 0x1c000000 0x04000000>,
|
||||
<4 0 0 0x0c000000 0x04000000>,
|
||||
<5 0 0 0x10000000 0x04000000>;
|
||||
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-map-mask = <0 0 63>;
|
||||
interrupt-map = <0 0 0 &gic GIC_SPI 0 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 1 &gic GIC_SPI 1 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 2 &gic GIC_SPI 2 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 3 &gic GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 4 &gic GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 5 &gic GIC_SPI 5 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 6 &gic GIC_SPI 6 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 7 &gic GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 8 &gic GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 9 &gic GIC_SPI 9 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 10 &gic GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 11 &gic GIC_SPI 11 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 12 &gic GIC_SPI 12 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 13 &gic GIC_SPI 13 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 14 &gic GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 15 &gic GIC_SPI 15 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 16 &gic GIC_SPI 16 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 17 &gic GIC_SPI 17 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 18 &gic GIC_SPI 18 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 19 &gic GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 20 &gic GIC_SPI 20 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 21 &gic GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 22 &gic GIC_SPI 22 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 23 &gic GIC_SPI 23 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 24 &gic GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 25 &gic GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 26 &gic GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 27 &gic GIC_SPI 27 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 28 &gic GIC_SPI 28 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 29 &gic GIC_SPI 29 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 30 &gic GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 31 &gic GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 32 &gic GIC_SPI 32 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 33 &gic GIC_SPI 33 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 34 &gic GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 35 &gic GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 36 &gic GIC_SPI 36 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 37 &gic GIC_SPI 37 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 38 &gic GIC_SPI 38 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 39 &gic GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 40 &gic GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 41 &gic GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 42 &gic GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH>;
|
||||
|
||||
/include/ "../../../../arm/boot/dts/vexpress-v2m-rs1.dtsi"
|
||||
};
|
||||
};
|
|
@ -376,10 +376,19 @@
|
|||
gic0: interrupt-controller@8010,00000000 {
|
||||
compatible = "arm,gic-v3";
|
||||
#interrupt-cells = <3>;
|
||||
#address-cells = <2>;
|
||||
#size-cells = <2>;
|
||||
ranges;
|
||||
interrupt-controller;
|
||||
reg = <0x8010 0x00000000 0x0 0x010000>, /* GICD */
|
||||
<0x8010 0x80000000 0x0 0x600000>; /* GICR */
|
||||
interrupts = <1 9 0xf04>;
|
||||
|
||||
its: gic-its@8010,00020000 {
|
||||
compatible = "arm,gic-v3-its";
|
||||
msi-controller;
|
||||
reg = <0x8010 0x20000 0x0 0x200000>;
|
||||
};
|
||||
};
|
||||
|
||||
uaa0: serial@87e0,24000000 {
|
||||
|
|
|
@ -83,6 +83,7 @@ CONFIG_BLK_DEV_SD=y
|
|||
CONFIG_ATA=y
|
||||
CONFIG_SATA_AHCI=y
|
||||
CONFIG_SATA_AHCI_PLATFORM=y
|
||||
CONFIG_AHCI_CEVA=y
|
||||
CONFIG_AHCI_XGENE=y
|
||||
CONFIG_PATA_PLATFORM=y
|
||||
CONFIG_PATA_OF_PLATFORM=y
|
||||
|
|
|
@ -19,6 +19,14 @@
|
|||
#include <asm/psci.h>
|
||||
#include <asm/smp_plat.h>
|
||||
|
||||
/* Macros for consistency checks of the GICC subtable of MADT */
|
||||
#define ACPI_MADT_GICC_LENGTH \
|
||||
(acpi_gbl_FADT.header.revision < 6 ? 76 : 80)
|
||||
|
||||
#define BAD_MADT_GICC_ENTRY(entry, end) \
|
||||
(!(entry) || (unsigned long)(entry) + sizeof(*(entry)) > (end) || \
|
||||
(entry)->header.length != ACPI_MADT_GICC_LENGTH)
|
||||
|
||||
/* Basic configuration for ACPI */
|
||||
#ifdef CONFIG_ACPI
|
||||
/* ACPI table mapping after acpi_gbl_permanent_mmap is set */
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
#include <asm/cpuidle.h>
|
||||
#include <asm/cpu_ops.h>
|
||||
|
||||
int arm_cpuidle_init(unsigned int cpu)
|
||||
int __init arm_cpuidle_init(unsigned int cpu)
|
||||
{
|
||||
int ret = -EOPNOTSUPP;
|
||||
|
||||
|
|
|
@ -352,8 +352,8 @@ el1_inv:
|
|||
// TODO: add support for undefined instructions in kernel mode
|
||||
enable_dbg
|
||||
mov x0, sp
|
||||
mov x2, x1
|
||||
mov x1, #BAD_SYNC
|
||||
mrs x2, esr_el1
|
||||
b bad_mode
|
||||
ENDPROC(el1_sync)
|
||||
|
||||
|
@ -553,7 +553,7 @@ el0_inv:
|
|||
ct_user_exit
|
||||
mov x0, sp
|
||||
mov x1, #BAD_SYNC
|
||||
mrs x2, esr_el1
|
||||
mov x2, x25
|
||||
bl bad_mode
|
||||
b ret_to_user
|
||||
ENDPROC(el0_sync)
|
||||
|
|
|
@ -32,13 +32,11 @@
|
|||
|
||||
ENTRY(compat_sys_sigreturn_wrapper)
|
||||
mov x0, sp
|
||||
mov x27, #0 // prevent syscall restart handling (why)
|
||||
b compat_sys_sigreturn
|
||||
ENDPROC(compat_sys_sigreturn_wrapper)
|
||||
|
||||
ENTRY(compat_sys_rt_sigreturn_wrapper)
|
||||
mov x0, sp
|
||||
mov x27, #0 // prevent syscall restart handling (why)
|
||||
b compat_sys_rt_sigreturn
|
||||
ENDPROC(compat_sys_rt_sigreturn_wrapper)
|
||||
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
#include <asm/current.h>
|
||||
#include <asm/debug-monitors.h>
|
||||
#include <asm/hw_breakpoint.h>
|
||||
#include <asm/kdebug.h>
|
||||
#include <asm/traps.h>
|
||||
#include <asm/cputype.h>
|
||||
#include <asm/system_misc.h>
|
||||
|
|
|
@ -1318,7 +1318,7 @@ static int armpmu_device_probe(struct platform_device *pdev)
|
|||
/* Don't bother with PPIs; they're already affine */
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
if (irq >= 0 && irq_is_percpu(irq))
|
||||
return 0;
|
||||
goto out;
|
||||
|
||||
irqs = kcalloc(pdev->num_resources, sizeof(*irqs), GFP_KERNEL);
|
||||
if (!irqs)
|
||||
|
@ -1340,12 +1340,13 @@ static int armpmu_device_probe(struct platform_device *pdev)
|
|||
if (arch_find_n_match_cpu_physical_id(dn, cpu, NULL))
|
||||
break;
|
||||
|
||||
of_node_put(dn);
|
||||
if (cpu >= nr_cpu_ids) {
|
||||
pr_warn("Failed to find logical CPU for %s\n",
|
||||
dn->name);
|
||||
of_node_put(dn);
|
||||
break;
|
||||
}
|
||||
of_node_put(dn);
|
||||
|
||||
irqs[i] = cpu;
|
||||
}
|
||||
|
@ -1355,6 +1356,7 @@ static int armpmu_device_probe(struct platform_device *pdev)
|
|||
else
|
||||
kfree(irqs);
|
||||
|
||||
out:
|
||||
cpu_pmu->plat_device = pdev;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -396,13 +396,13 @@ acpi_map_gic_cpu_interface(struct acpi_madt_generic_interrupt *processor)
|
|||
{
|
||||
u64 hwid = processor->arm_mpidr;
|
||||
|
||||
if (hwid & ~MPIDR_HWID_BITMASK || hwid == INVALID_HWID) {
|
||||
pr_err("skipping CPU entry with invalid MPIDR 0x%llx\n", hwid);
|
||||
if (!(processor->flags & ACPI_MADT_ENABLED)) {
|
||||
pr_debug("skipping disabled CPU entry with 0x%llx MPIDR\n", hwid);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(processor->flags & ACPI_MADT_ENABLED)) {
|
||||
pr_err("skipping disabled CPU entry with 0x%llx MPIDR\n", hwid);
|
||||
if (hwid & ~MPIDR_HWID_BITMASK || hwid == INVALID_HWID) {
|
||||
pr_err("skipping CPU entry with invalid MPIDR 0x%llx\n", hwid);
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -438,7 +438,7 @@ acpi_parse_gic_cpu_interface(struct acpi_subtable_header *header,
|
|||
struct acpi_madt_generic_interrupt *processor;
|
||||
|
||||
processor = (struct acpi_madt_generic_interrupt *)header;
|
||||
if (BAD_MADT_ENTRY(processor, end))
|
||||
if (BAD_MADT_GICC_ENTRY(processor, end))
|
||||
return -EINVAL;
|
||||
|
||||
acpi_table_print_madt_entry(header);
|
||||
|
@ -693,7 +693,7 @@ void handle_IPI(int ipinr, struct pt_regs *regs)
|
|||
struct pt_regs *old_regs = set_irq_regs(regs);
|
||||
|
||||
if ((unsigned)ipinr < NR_IPI) {
|
||||
trace_ipi_entry(ipi_types[ipinr]);
|
||||
trace_ipi_entry_rcuidle(ipi_types[ipinr]);
|
||||
__inc_irq_stat(cpu, ipi_irqs[ipinr]);
|
||||
}
|
||||
|
||||
|
@ -736,7 +736,7 @@ void handle_IPI(int ipinr, struct pt_regs *regs)
|
|||
}
|
||||
|
||||
if ((unsigned)ipinr < NR_IPI)
|
||||
trace_ipi_exit(ipi_types[ipinr]);
|
||||
trace_ipi_exit_rcuidle(ipi_types[ipinr]);
|
||||
set_irq_regs(old_regs);
|
||||
}
|
||||
|
||||
|
|
|
@ -335,7 +335,7 @@ asmlinkage void __exception do_undefinstr(struct pt_regs *regs)
|
|||
if (call_undef_hook(regs) == 0)
|
||||
return;
|
||||
|
||||
if (show_unhandled_signals_ratelimited() && unhandled_signal(current, SIGILL)) {
|
||||
if (unhandled_signal(current, SIGILL) && show_unhandled_signals_ratelimited()) {
|
||||
pr_info("%s[%d]: undefined instruction: pc=%p\n",
|
||||
current->comm, task_pid_nr(current), pc);
|
||||
dump_instr(KERN_INFO, regs);
|
||||
|
|
|
@ -4,5 +4,3 @@ obj-y := dma-mapping.o extable.o fault.o init.o \
|
|||
context.o proc.o pageattr.o
|
||||
obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o
|
||||
obj-$(CONFIG_ARM64_PTDUMP) += dump.o
|
||||
|
||||
CFLAGS_mmu.o := -I$(srctree)/scripts/dtc/libfdt/
|
||||
|
|
|
@ -115,7 +115,7 @@ static void __do_user_fault(struct task_struct *tsk, unsigned long addr,
|
|||
{
|
||||
struct siginfo si;
|
||||
|
||||
if (show_unhandled_signals_ratelimited() && unhandled_signal(tsk, sig)) {
|
||||
if (unhandled_signal(tsk, sig) && show_unhandled_signals_ratelimited()) {
|
||||
pr_info("%s[%d]: unhandled %s (%d) at 0x%08lx, esr 0x%03x\n",
|
||||
tsk->comm, task_pid_nr(tsk), fault_name(esr), sig,
|
||||
addr, esr);
|
||||
|
|
|
@ -33,13 +33,13 @@
|
|||
|
||||
int pmd_huge(pmd_t pmd)
|
||||
{
|
||||
return !(pmd_val(pmd) & PMD_TABLE_BIT);
|
||||
return pmd_val(pmd) && !(pmd_val(pmd) & PMD_TABLE_BIT);
|
||||
}
|
||||
|
||||
int pud_huge(pud_t pud)
|
||||
{
|
||||
#ifndef __PAGETABLE_PMD_FOLDED
|
||||
return !(pud_val(pud) & PUD_TABLE_BIT);
|
||||
return pud_val(pud) && !(pud_val(pud) & PUD_TABLE_BIT);
|
||||
#else
|
||||
return 0;
|
||||
#endif
|
||||
|
|
|
@ -117,7 +117,7 @@ void split_pud(pud_t *old_pud, pmd_t *pmd)
|
|||
int i = 0;
|
||||
|
||||
do {
|
||||
set_pmd(pmd, __pmd(addr | prot));
|
||||
set_pmd(pmd, __pmd(addr | pgprot_val(prot)));
|
||||
addr += PMD_SIZE;
|
||||
} while (pmd++, i++, i < PTRS_PER_PMD);
|
||||
}
|
||||
|
|
|
@ -110,6 +110,10 @@
|
|||
/* Rd = Rn >> shift; signed */
|
||||
#define A64_ASR(sf, Rd, Rn, shift) A64_SBFM(sf, Rd, Rn, shift, (sf) ? 63 : 31)
|
||||
|
||||
/* Zero extend */
|
||||
#define A64_UXTH(sf, Rd, Rn) A64_UBFM(sf, Rd, Rn, 0, 15)
|
||||
#define A64_UXTW(sf, Rd, Rn) A64_UBFM(sf, Rd, Rn, 0, 31)
|
||||
|
||||
/* Move wide (immediate) */
|
||||
#define A64_MOVEW(sf, Rd, imm16, shift, type) \
|
||||
aarch64_insn_gen_movewide(Rd, imm16, shift, \
|
||||
|
|
|
@ -113,9 +113,9 @@ static inline void emit_a64_mov_i(const int is64, const int reg,
|
|||
static inline int bpf2a64_offset(int bpf_to, int bpf_from,
|
||||
const struct jit_ctx *ctx)
|
||||
{
|
||||
int to = ctx->offset[bpf_to + 1];
|
||||
int to = ctx->offset[bpf_to];
|
||||
/* -1 to account for the Branch instruction */
|
||||
int from = ctx->offset[bpf_from + 1] - 1;
|
||||
int from = ctx->offset[bpf_from] - 1;
|
||||
|
||||
return to - from;
|
||||
}
|
||||
|
@ -289,23 +289,41 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx)
|
|||
case BPF_ALU | BPF_END | BPF_FROM_BE:
|
||||
#ifdef CONFIG_CPU_BIG_ENDIAN
|
||||
if (BPF_SRC(code) == BPF_FROM_BE)
|
||||
break;
|
||||
goto emit_bswap_uxt;
|
||||
#else /* !CONFIG_CPU_BIG_ENDIAN */
|
||||
if (BPF_SRC(code) == BPF_FROM_LE)
|
||||
break;
|
||||
goto emit_bswap_uxt;
|
||||
#endif
|
||||
switch (imm) {
|
||||
case 16:
|
||||
emit(A64_REV16(is64, dst, dst), ctx);
|
||||
/* zero-extend 16 bits into 64 bits */
|
||||
emit(A64_UXTH(is64, dst, dst), ctx);
|
||||
break;
|
||||
case 32:
|
||||
emit(A64_REV32(is64, dst, dst), ctx);
|
||||
/* upper 32 bits already cleared */
|
||||
break;
|
||||
case 64:
|
||||
emit(A64_REV64(dst, dst), ctx);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
emit_bswap_uxt:
|
||||
switch (imm) {
|
||||
case 16:
|
||||
/* zero-extend 16 bits into 64 bits */
|
||||
emit(A64_UXTH(is64, dst, dst), ctx);
|
||||
break;
|
||||
case 32:
|
||||
/* zero-extend 32 bits into 64 bits */
|
||||
emit(A64_UXTW(is64, dst, dst), ctx);
|
||||
break;
|
||||
case 64:
|
||||
/* nop */
|
||||
break;
|
||||
}
|
||||
break;
|
||||
/* dst = imm */
|
||||
case BPF_ALU | BPF_MOV | BPF_K:
|
||||
case BPF_ALU64 | BPF_MOV | BPF_K:
|
||||
|
@ -640,10 +658,11 @@ static int build_body(struct jit_ctx *ctx)
|
|||
const struct bpf_insn *insn = &prog->insnsi[i];
|
||||
int ret;
|
||||
|
||||
ret = build_insn(insn, ctx);
|
||||
|
||||
if (ctx->image == NULL)
|
||||
ctx->offset[i] = ctx->idx;
|
||||
|
||||
ret = build_insn(insn, ctx);
|
||||
if (ret > 0) {
|
||||
i++;
|
||||
continue;
|
||||
|
|
|
@ -136,7 +136,7 @@ void decode_address(char *buf, unsigned long address)
|
|||
struct file *file = vma->vm_file;
|
||||
|
||||
if (file) {
|
||||
char *d_name = d_path(&file->f_path, _tmpbuf,
|
||||
char *d_name = file_path(file, _tmpbuf,
|
||||
sizeof(_tmpbuf));
|
||||
if (!IS_ERR(d_name))
|
||||
name = d_name;
|
||||
|
|
|
@ -1464,7 +1464,7 @@ static inline void handle_rx_packet(struct sync_port *port)
|
|||
if (port->write_ts_idx == NBR_IN_DESCR)
|
||||
port->write_ts_idx = 0;
|
||||
idx = port->write_ts_idx++;
|
||||
do_posix_clock_monotonic_gettime(&port->timestamp[idx]);
|
||||
ktime_get_ts(&port->timestamp[idx]);
|
||||
port->in_buffer_len += port->inbufchunk;
|
||||
}
|
||||
spin_unlock_irqrestore(&port->lock, flags);
|
||||
|
|
|
@ -215,10 +215,6 @@ put_kernel_page (struct page *page, unsigned long address, pgprot_t pgprot)
|
|||
pmd_t *pmd;
|
||||
pte_t *pte;
|
||||
|
||||
if (!PageReserved(page))
|
||||
printk(KERN_ERR "put_kernel_page: page at 0x%p not in reserved memory\n",
|
||||
page_address(page));
|
||||
|
||||
pgd = pgd_offset_k(address); /* note: this is NOT pgd_offset()! */
|
||||
|
||||
{
|
||||
|
|
|
@ -2231,7 +2231,7 @@ config MIPS_CMP
|
|||
|
||||
config MIPS_CPS
|
||||
bool "MIPS Coherent Processing System support"
|
||||
depends on SYS_SUPPORTS_MIPS_CPS && !64BIT
|
||||
depends on SYS_SUPPORTS_MIPS_CPS
|
||||
select MIPS_CM
|
||||
select MIPS_CPC
|
||||
select MIPS_CPS_PM if HOTPLUG_CPU
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Copyright (C) 2010 Loongson Inc. & Lemote Inc. &
|
||||
* Insititute of Computing Technology
|
||||
* Institute of Computing Technology
|
||||
* Author: Xiang Gao, gaoxiang@ict.ac.cn
|
||||
* Huacai Chen, chenhc@lemote.com
|
||||
* Xiaofu Meng, Shuangshuang Zhang
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
extern int smp_num_siblings;
|
||||
extern cpumask_t cpu_sibling_map[];
|
||||
extern cpumask_t cpu_core_map[];
|
||||
extern cpumask_t cpu_foreign_map;
|
||||
|
||||
#define raw_smp_processor_id() (current_thread_info()->cpu)
|
||||
|
||||
|
|
|
@ -600,7 +600,7 @@ int __compute_return_epc_for_insn(struct pt_regs *regs,
|
|||
break;
|
||||
|
||||
case blezl_op: /* not really i_format */
|
||||
if (NO_R6EMU)
|
||||
if (!insn.i_format.rt && NO_R6EMU)
|
||||
goto sigill_r6;
|
||||
case blez_op:
|
||||
/*
|
||||
|
@ -635,7 +635,7 @@ int __compute_return_epc_for_insn(struct pt_regs *regs,
|
|||
break;
|
||||
|
||||
case bgtzl_op:
|
||||
if (NO_R6EMU)
|
||||
if (!insn.i_format.rt && NO_R6EMU)
|
||||
goto sigill_r6;
|
||||
case bgtz_op:
|
||||
/*
|
||||
|
|
|
@ -60,7 +60,7 @@ LEAF(mips_cps_core_entry)
|
|||
nop
|
||||
|
||||
/* This is an NMI */
|
||||
la k0, nmi_handler
|
||||
PTR_LA k0, nmi_handler
|
||||
jr k0
|
||||
nop
|
||||
|
||||
|
@ -107,10 +107,10 @@ not_nmi:
|
|||
mul t1, t1, t0
|
||||
mul t1, t1, t2
|
||||
|
||||
li a0, KSEG0
|
||||
add a1, a0, t1
|
||||
li a0, CKSEG0
|
||||
PTR_ADD a1, a0, t1
|
||||
1: cache Index_Store_Tag_I, 0(a0)
|
||||
add a0, a0, t0
|
||||
PTR_ADD a0, a0, t0
|
||||
bne a0, a1, 1b
|
||||
nop
|
||||
icache_done:
|
||||
|
@ -134,12 +134,12 @@ icache_done:
|
|||
mul t1, t1, t0
|
||||
mul t1, t1, t2
|
||||
|
||||
li a0, KSEG0
|
||||
addu a1, a0, t1
|
||||
subu a1, a1, t0
|
||||
li a0, CKSEG0
|
||||
PTR_ADDU a1, a0, t1
|
||||
PTR_SUBU a1, a1, t0
|
||||
1: cache Index_Store_Tag_D, 0(a0)
|
||||
bne a0, a1, 1b
|
||||
add a0, a0, t0
|
||||
PTR_ADD a0, a0, t0
|
||||
dcache_done:
|
||||
|
||||
/* Set Kseg0 CCA to that in s0 */
|
||||
|
@ -152,11 +152,11 @@ dcache_done:
|
|||
|
||||
/* Enter the coherent domain */
|
||||
li t0, 0xff
|
||||
sw t0, GCR_CL_COHERENCE_OFS(v1)
|
||||
PTR_S t0, GCR_CL_COHERENCE_OFS(v1)
|
||||
ehb
|
||||
|
||||
/* Jump to kseg0 */
|
||||
la t0, 1f
|
||||
PTR_LA t0, 1f
|
||||
jr t0
|
||||
nop
|
||||
|
||||
|
@ -178,9 +178,9 @@ dcache_done:
|
|||
nop
|
||||
|
||||
/* Off we go! */
|
||||
lw t1, VPEBOOTCFG_PC(v0)
|
||||
lw gp, VPEBOOTCFG_GP(v0)
|
||||
lw sp, VPEBOOTCFG_SP(v0)
|
||||
PTR_L t1, VPEBOOTCFG_PC(v0)
|
||||
PTR_L gp, VPEBOOTCFG_GP(v0)
|
||||
PTR_L sp, VPEBOOTCFG_SP(v0)
|
||||
jr t1
|
||||
nop
|
||||
END(mips_cps_core_entry)
|
||||
|
@ -217,7 +217,7 @@ LEAF(excep_intex)
|
|||
|
||||
.org 0x480
|
||||
LEAF(excep_ejtag)
|
||||
la k0, ejtag_debug_handler
|
||||
PTR_LA k0, ejtag_debug_handler
|
||||
jr k0
|
||||
nop
|
||||
END(excep_ejtag)
|
||||
|
@ -229,7 +229,7 @@ LEAF(mips_cps_core_init)
|
|||
nop
|
||||
|
||||
.set push
|
||||
.set mips32r2
|
||||
.set mips64r2
|
||||
.set mt
|
||||
|
||||
/* Only allow 1 TC per VPE to execute... */
|
||||
|
@ -237,7 +237,7 @@ LEAF(mips_cps_core_init)
|
|||
|
||||
/* ...and for the moment only 1 VPE */
|
||||
dvpe
|
||||
la t1, 1f
|
||||
PTR_LA t1, 1f
|
||||
jr.hb t1
|
||||
nop
|
||||
|
||||
|
@ -250,25 +250,25 @@ LEAF(mips_cps_core_init)
|
|||
mfc0 t0, CP0_MVPCONF0
|
||||
srl t0, t0, MVPCONF0_PVPE_SHIFT
|
||||
andi t0, t0, (MVPCONF0_PVPE >> MVPCONF0_PVPE_SHIFT)
|
||||
addiu t7, t0, 1
|
||||
addiu ta3, t0, 1
|
||||
|
||||
/* If there's only 1, we're done */
|
||||
beqz t0, 2f
|
||||
nop
|
||||
|
||||
/* Loop through each VPE within this core */
|
||||
li t5, 1
|
||||
li ta1, 1
|
||||
|
||||
1: /* Operate on the appropriate TC */
|
||||
mtc0 t5, CP0_VPECONTROL
|
||||
mtc0 ta1, CP0_VPECONTROL
|
||||
ehb
|
||||
|
||||
/* Bind TC to VPE (1:1 TC:VPE mapping) */
|
||||
mttc0 t5, CP0_TCBIND
|
||||
mttc0 ta1, CP0_TCBIND
|
||||
|
||||
/* Set exclusive TC, non-active, master */
|
||||
li t0, VPECONF0_MVP
|
||||
sll t1, t5, VPECONF0_XTC_SHIFT
|
||||
sll t1, ta1, VPECONF0_XTC_SHIFT
|
||||
or t0, t0, t1
|
||||
mttc0 t0, CP0_VPECONF0
|
||||
|
||||
|
@ -280,8 +280,8 @@ LEAF(mips_cps_core_init)
|
|||
mttc0 t0, CP0_TCHALT
|
||||
|
||||
/* Next VPE */
|
||||
addiu t5, t5, 1
|
||||
slt t0, t5, t7
|
||||
addiu ta1, ta1, 1
|
||||
slt t0, ta1, ta3
|
||||
bnez t0, 1b
|
||||
nop
|
||||
|
||||
|
@ -298,19 +298,19 @@ LEAF(mips_cps_core_init)
|
|||
|
||||
LEAF(mips_cps_boot_vpes)
|
||||
/* Retrieve CM base address */
|
||||
la t0, mips_cm_base
|
||||
lw t0, 0(t0)
|
||||
PTR_LA t0, mips_cm_base
|
||||
PTR_L t0, 0(t0)
|
||||
|
||||
/* Calculate a pointer to this cores struct core_boot_config */
|
||||
lw t0, GCR_CL_ID_OFS(t0)
|
||||
PTR_L t0, GCR_CL_ID_OFS(t0)
|
||||
li t1, COREBOOTCFG_SIZE
|
||||
mul t0, t0, t1
|
||||
la t1, mips_cps_core_bootcfg
|
||||
lw t1, 0(t1)
|
||||
addu t0, t0, t1
|
||||
PTR_LA t1, mips_cps_core_bootcfg
|
||||
PTR_L t1, 0(t1)
|
||||
PTR_ADDU t0, t0, t1
|
||||
|
||||
/* Calculate this VPEs ID. If the core doesn't support MT use 0 */
|
||||
has_mt t6, 1f
|
||||
has_mt ta2, 1f
|
||||
li t9, 0
|
||||
|
||||
/* Find the number of VPEs present in the core */
|
||||
|
@ -334,24 +334,24 @@ LEAF(mips_cps_boot_vpes)
|
|||
1: /* Calculate a pointer to this VPEs struct vpe_boot_config */
|
||||
li t1, VPEBOOTCFG_SIZE
|
||||
mul v0, t9, t1
|
||||
lw t7, COREBOOTCFG_VPECONFIG(t0)
|
||||
addu v0, v0, t7
|
||||
PTR_L ta3, COREBOOTCFG_VPECONFIG(t0)
|
||||
PTR_ADDU v0, v0, ta3
|
||||
|
||||
#ifdef CONFIG_MIPS_MT
|
||||
|
||||
/* If the core doesn't support MT then return */
|
||||
bnez t6, 1f
|
||||
bnez ta2, 1f
|
||||
nop
|
||||
jr ra
|
||||
nop
|
||||
|
||||
.set push
|
||||
.set mips32r2
|
||||
.set mips64r2
|
||||
.set mt
|
||||
|
||||
1: /* Enter VPE configuration state */
|
||||
dvpe
|
||||
la t1, 1f
|
||||
PTR_LA t1, 1f
|
||||
jr.hb t1
|
||||
nop
|
||||
1: mfc0 t1, CP0_MVPCONTROL
|
||||
|
@ -360,12 +360,12 @@ LEAF(mips_cps_boot_vpes)
|
|||
ehb
|
||||
|
||||
/* Loop through each VPE */
|
||||
lw t6, COREBOOTCFG_VPEMASK(t0)
|
||||
move t8, t6
|
||||
li t5, 0
|
||||
PTR_L ta2, COREBOOTCFG_VPEMASK(t0)
|
||||
move t8, ta2
|
||||
li ta1, 0
|
||||
|
||||
/* Check whether the VPE should be running. If not, skip it */
|
||||
1: andi t0, t6, 1
|
||||
1: andi t0, ta2, 1
|
||||
beqz t0, 2f
|
||||
nop
|
||||
|
||||
|
@ -373,7 +373,7 @@ LEAF(mips_cps_boot_vpes)
|
|||
mfc0 t0, CP0_VPECONTROL
|
||||
ori t0, t0, VPECONTROL_TARGTC
|
||||
xori t0, t0, VPECONTROL_TARGTC
|
||||
or t0, t0, t5
|
||||
or t0, t0, ta1
|
||||
mtc0 t0, CP0_VPECONTROL
|
||||
ehb
|
||||
|
||||
|
@ -384,8 +384,8 @@ LEAF(mips_cps_boot_vpes)
|
|||
|
||||
/* Calculate a pointer to the VPEs struct vpe_boot_config */
|
||||
li t0, VPEBOOTCFG_SIZE
|
||||
mul t0, t0, t5
|
||||
addu t0, t0, t7
|
||||
mul t0, t0, ta1
|
||||
addu t0, t0, ta3
|
||||
|
||||
/* Set the TC restart PC */
|
||||
lw t1, VPEBOOTCFG_PC(t0)
|
||||
|
@ -423,9 +423,9 @@ LEAF(mips_cps_boot_vpes)
|
|||
mttc0 t0, CP0_VPECONF0
|
||||
|
||||
/* Next VPE */
|
||||
2: srl t6, t6, 1
|
||||
addiu t5, t5, 1
|
||||
bnez t6, 1b
|
||||
2: srl ta2, ta2, 1
|
||||
addiu ta1, ta1, 1
|
||||
bnez ta2, 1b
|
||||
nop
|
||||
|
||||
/* Leave VPE configuration state */
|
||||
|
@ -445,7 +445,7 @@ LEAF(mips_cps_boot_vpes)
|
|||
/* This VPE should be offline, halt the TC */
|
||||
li t0, TCHALT_H
|
||||
mtc0 t0, CP0_TCHALT
|
||||
la t0, 1f
|
||||
PTR_LA t0, 1f
|
||||
1: jr.hb t0
|
||||
nop
|
||||
|
||||
|
@ -466,10 +466,10 @@ LEAF(mips_cps_boot_vpes)
|
|||
.set noat
|
||||
lw $1, TI_CPU(gp)
|
||||
sll $1, $1, LONGLOG
|
||||
la \dest, __per_cpu_offset
|
||||
PTR_LA \dest, __per_cpu_offset
|
||||
addu $1, $1, \dest
|
||||
lw $1, 0($1)
|
||||
la \dest, cps_cpu_state
|
||||
PTR_LA \dest, cps_cpu_state
|
||||
addu \dest, \dest, $1
|
||||
.set pop
|
||||
.endm
|
||||
|
|
|
@ -73,10 +73,11 @@ NESTED(handle_sys, PT_SIZE, sp)
|
|||
.set noreorder
|
||||
.set nomacro
|
||||
|
||||
1: user_lw(t5, 16(t0)) # argument #5 from usp
|
||||
4: user_lw(t6, 20(t0)) # argument #6 from usp
|
||||
3: user_lw(t7, 24(t0)) # argument #7 from usp
|
||||
2: user_lw(t8, 28(t0)) # argument #8 from usp
|
||||
load_a4: user_lw(t5, 16(t0)) # argument #5 from usp
|
||||
load_a5: user_lw(t6, 20(t0)) # argument #6 from usp
|
||||
load_a6: user_lw(t7, 24(t0)) # argument #7 from usp
|
||||
load_a7: user_lw(t8, 28(t0)) # argument #8 from usp
|
||||
loads_done:
|
||||
|
||||
sw t5, 16(sp) # argument #5 to ksp
|
||||
sw t6, 20(sp) # argument #6 to ksp
|
||||
|
@ -85,10 +86,10 @@ NESTED(handle_sys, PT_SIZE, sp)
|
|||
.set pop
|
||||
|
||||
.section __ex_table,"a"
|
||||
PTR 1b,bad_stack
|
||||
PTR 2b,bad_stack
|
||||
PTR 3b,bad_stack
|
||||
PTR 4b,bad_stack
|
||||
PTR load_a4, bad_stack_a4
|
||||
PTR load_a5, bad_stack_a5
|
||||
PTR load_a6, bad_stack_a6
|
||||
PTR load_a7, bad_stack_a7
|
||||
.previous
|
||||
|
||||
lw t0, TI_FLAGS($28) # syscall tracing enabled?
|
||||
|
@ -153,8 +154,8 @@ syscall_trace_entry:
|
|||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
/*
|
||||
* The stackpointer for a call with more than 4 arguments is bad.
|
||||
* We probably should handle this case a bit more drastic.
|
||||
* Our open-coded access area sanity test for the stack pointer
|
||||
* failed. We probably should handle this case a bit more drastic.
|
||||
*/
|
||||
bad_stack:
|
||||
li v0, EFAULT
|
||||
|
@ -163,6 +164,22 @@ bad_stack:
|
|||
sw t0, PT_R7(sp)
|
||||
j o32_syscall_exit
|
||||
|
||||
bad_stack_a4:
|
||||
li t5, 0
|
||||
b load_a5
|
||||
|
||||
bad_stack_a5:
|
||||
li t6, 0
|
||||
b load_a6
|
||||
|
||||
bad_stack_a6:
|
||||
li t7, 0
|
||||
b load_a7
|
||||
|
||||
bad_stack_a7:
|
||||
li t8, 0
|
||||
b loads_done
|
||||
|
||||
/*
|
||||
* The system call does not exist in this kernel
|
||||
*/
|
||||
|
|
|
@ -69,16 +69,17 @@ NESTED(handle_sys, PT_SIZE, sp)
|
|||
daddu t1, t0, 32
|
||||
bltz t1, bad_stack
|
||||
|
||||
1: lw a4, 16(t0) # argument #5 from usp
|
||||
2: lw a5, 20(t0) # argument #6 from usp
|
||||
3: lw a6, 24(t0) # argument #7 from usp
|
||||
4: lw a7, 28(t0) # argument #8 from usp (for indirect syscalls)
|
||||
load_a4: lw a4, 16(t0) # argument #5 from usp
|
||||
load_a5: lw a5, 20(t0) # argument #6 from usp
|
||||
load_a6: lw a6, 24(t0) # argument #7 from usp
|
||||
load_a7: lw a7, 28(t0) # argument #8 from usp
|
||||
loads_done:
|
||||
|
||||
.section __ex_table,"a"
|
||||
PTR 1b, bad_stack
|
||||
PTR 2b, bad_stack
|
||||
PTR 3b, bad_stack
|
||||
PTR 4b, bad_stack
|
||||
PTR load_a4, bad_stack_a4
|
||||
PTR load_a5, bad_stack_a5
|
||||
PTR load_a6, bad_stack_a6
|
||||
PTR load_a7, bad_stack_a7
|
||||
.previous
|
||||
|
||||
li t1, _TIF_WORK_SYSCALL_ENTRY
|
||||
|
@ -167,6 +168,22 @@ bad_stack:
|
|||
sd t0, PT_R7(sp)
|
||||
j o32_syscall_exit
|
||||
|
||||
bad_stack_a4:
|
||||
li a4, 0
|
||||
b load_a5
|
||||
|
||||
bad_stack_a5:
|
||||
li a5, 0
|
||||
b load_a6
|
||||
|
||||
bad_stack_a6:
|
||||
li a6, 0
|
||||
b load_a7
|
||||
|
||||
bad_stack_a7:
|
||||
li a7, 0
|
||||
b loads_done
|
||||
|
||||
not_o32_scall:
|
||||
/*
|
||||
* This is not an o32 compatibility syscall, pass it on
|
||||
|
@ -383,7 +400,7 @@ EXPORT(sys32_call_table)
|
|||
PTR sys_connect /* 4170 */
|
||||
PTR sys_getpeername
|
||||
PTR sys_getsockname
|
||||
PTR sys_getsockopt
|
||||
PTR compat_sys_getsockopt
|
||||
PTR sys_listen
|
||||
PTR compat_sys_recv /* 4175 */
|
||||
PTR compat_sys_recvfrom
|
||||
|
|
|
@ -337,6 +337,11 @@ static void __init bootmem_init(void)
|
|||
min_low_pfn = start;
|
||||
if (end <= reserved_end)
|
||||
continue;
|
||||
#ifdef CONFIG_BLK_DEV_INITRD
|
||||
/* mapstart should be after initrd_end */
|
||||
if (initrd_end && end <= (unsigned long)PFN_UP(__pa(initrd_end)))
|
||||
continue;
|
||||
#endif
|
||||
if (start >= mapstart)
|
||||
continue;
|
||||
mapstart = max(reserved_end, start);
|
||||
|
@ -366,14 +371,6 @@ static void __init bootmem_init(void)
|
|||
max_low_pfn = PFN_DOWN(HIGHMEM_START);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BLK_DEV_INITRD
|
||||
/*
|
||||
* mapstart should be after initrd_end
|
||||
*/
|
||||
if (initrd_end)
|
||||
mapstart = max(mapstart, (unsigned long)PFN_UP(__pa(initrd_end)));
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Initialize the boot-time allocator with low memory only.
|
||||
*/
|
||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче