Couple of DT fixes for STi platform issues discovered on V3.16-rc1.
The fixes included are: - Ethernet clocks were wrongly defined for STiH415/416 platforms - STiH416 B2020 revision E DTS file name contained uppercase, change to lowercase. -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) iQIcBAABAgAGBQJToq7NAAoJEMo4jShGhw+JnBoQANV2ErgXd0m9NelUcMs/gZrf rA8xJhSptDn+R5o9+N2RU1VzZP7oEQWxmGhjRgzpoT+pVg3n4odVLkot/msEvKQh n4yNF4jvJ7BhoGJTYPjNPkEmctI7A6sb8efs5FPEd7g+bMMBd14WrnXNQ33q7wNF fE1akzHXzji1v0lr66MVgKmM4m7RfyDEvkjmBahbJ6Nc2CPhmo47LrzWTnb/bPjm UDcLSXFGijGChQp/0UX89KdCYexfCJ3rnevrFiZvp0gGynGCXCWXTBKXUcYYv3sh ct5r5HJj7loyy4IaGAnqQ6mzbh3qH0w1nmk4cazwDbBKIkam0AnNysQaLSIUCMrX CkNXZUchmRi7KAauWlpknWR8Phmwl2KRi7DB3QnygPu7Yvc0UvEFtM3R3LGYmVqn gydQ20GxdcOXk6Jl2Z6oInLRiJE0mbzANZSiNBM9onmyFjMzpHymOYDEGattZ0lw w9+nUHOHUutXOkYuhORcNcgHZ8vPmu074PTzgom8YYLA1dpuqK+lACeG6d9G7u76 4U89hUx7OQ7+wBWc+24fwV2SVK5Lpd0ac2z/nXSR+yIhdBchAO/ajixiJy+WvqYB kzirRbe9lLVpWSPu9w/VgKJ7XdEev0VlfuI2cn9GfHmdRB/QZjqjpnLFzWU3XAW4 0Oe5B5Wye3XJ3OVHLGQw =gew5 -----END PGP SIGNATURE----- Merge tag 'sti-fixes-for-v3.16-rc1' of git://git.stlinux.com/devel/kernel/linux-sti into fixes Merge "STi: DT fixes for v3.16" from Maxime Coquelin: Couple of DT fixes for STi platform issues discovered on V3.16-rc1. The fixes included are: - Ethernet clocks were wrongly defined for STiH415/416 platforms - STiH416 B2020 revision E DTS file name contained uppercase, change to lowercase. * tag 'sti-fixes-for-v3.16-rc1' of git://git.stlinux.com/devel/kernel/linux-sti: (2963 commits) ARM: stih41x: Rename stih416-b2020-revE.dts to stih416-b2020e.dts ARM: STi: DT: Properly define sti-ethclk & stmmaceth for stih415/6 Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
Коммит
3b3dab5f1c
|
@ -22,7 +22,6 @@
|
|||
*.lst
|
||||
*.symtypes
|
||||
*.order
|
||||
modules.builtin
|
||||
*.elf
|
||||
*.bin
|
||||
*.gz
|
||||
|
@ -33,6 +32,8 @@ modules.builtin
|
|||
*.lzo
|
||||
*.patch
|
||||
*.gcno
|
||||
modules.builtin
|
||||
Module.symvers
|
||||
|
||||
#
|
||||
# Top-level generic files
|
||||
|
@ -44,7 +45,6 @@ modules.builtin
|
|||
/vmlinuz
|
||||
/System.map
|
||||
/Module.markers
|
||||
/Module.symvers
|
||||
|
||||
#
|
||||
# Debian directory (make deb-pkg)
|
||||
|
|
|
@ -169,6 +169,14 @@ Description:
|
|||
"unknown", "notpresent", "down", "lowerlayerdown", "testing",
|
||||
"dormant", "up".
|
||||
|
||||
What: /sys/class/net/<iface>/phys_port_id
|
||||
Date: July 2013
|
||||
KernelVersion: 3.12
|
||||
Contact: netdev@vger.kernel.org
|
||||
Description:
|
||||
Indicates the interface unique physical port identifier within
|
||||
the NIC, as a string.
|
||||
|
||||
What: /sys/class/net/<iface>/speed
|
||||
Date: October 2009
|
||||
KernelVersion: 2.6.33
|
||||
|
|
|
@ -0,0 +1,149 @@
|
|||
What: /sys/class/net/<iface>/cdc_ncm/min_tx_pkt
|
||||
Date: May 2014
|
||||
KernelVersion: 3.16
|
||||
Contact: Bjørn Mork <bjorn@mork.no>
|
||||
Description:
|
||||
The driver will pad NCM Transfer Blocks (NTBs) longer
|
||||
than this to tx_max, allowing the device to receive
|
||||
tx_max sized frames with no terminating short
|
||||
packet. NTBs shorter than this limit are transmitted
|
||||
as-is, without any padding, and are terminated with a
|
||||
short USB packet.
|
||||
|
||||
Padding to tx_max allows the driver to transmit NTBs
|
||||
back-to-back without any interleaving short USB
|
||||
packets. This reduces the number of short packet
|
||||
interrupts in the device, and represents a tradeoff
|
||||
between USB bus bandwidth and device DMA optimization.
|
||||
|
||||
Set to 0 to pad all frames. Set greater than tx_max to
|
||||
disable all padding.
|
||||
|
||||
What: /sys/class/net/<iface>/cdc_ncm/rx_max
|
||||
Date: May 2014
|
||||
KernelVersion: 3.16
|
||||
Contact: Bjørn Mork <bjorn@mork.no>
|
||||
Description:
|
||||
The maximum NTB size for RX. Cannot exceed the
|
||||
maximum value supported by the device. Must allow at
|
||||
least one max sized datagram plus headers.
|
||||
|
||||
The actual limits are device dependent. See
|
||||
dwNtbInMaxSize.
|
||||
|
||||
Note: Some devices will silently ignore changes to
|
||||
this value, resulting in oversized NTBs and
|
||||
corresponding framing errors.
|
||||
|
||||
What: /sys/class/net/<iface>/cdc_ncm/tx_max
|
||||
Date: May 2014
|
||||
KernelVersion: 3.16
|
||||
Contact: Bjørn Mork <bjorn@mork.no>
|
||||
Description:
|
||||
The maximum NTB size for TX. Cannot exceed the
|
||||
maximum value supported by the device. Must allow at
|
||||
least one max sized datagram plus headers.
|
||||
|
||||
The actual limits are device dependent. See
|
||||
dwNtbOutMaxSize.
|
||||
|
||||
What: /sys/class/net/<iface>/cdc_ncm/tx_timer_usecs
|
||||
Date: May 2014
|
||||
KernelVersion: 3.16
|
||||
Contact: Bjørn Mork <bjorn@mork.no>
|
||||
Description:
|
||||
Datagram aggregation timeout in µs. The driver will
|
||||
wait up to 3 times this timeout for more datagrams to
|
||||
aggregate before transmitting an NTB frame.
|
||||
|
||||
Valid range: 5 to 4000000
|
||||
|
||||
Set to 0 to disable aggregation.
|
||||
|
||||
The following read-only attributes all represent fields of the
|
||||
structure defined in section 6.2.1 "GetNtbParameters" of "Universal
|
||||
Serial Bus Communications Class Subclass Specifications for Network
|
||||
Control Model Devices" (CDC NCM), Revision 1.0 (Errata 1), November
|
||||
24, 2010 from USB Implementers Forum, Inc. The descriptions are
|
||||
quoted from table 6-3 of CDC NCM: "NTB Parameter Structure".
|
||||
|
||||
What: /sys/class/net/<iface>/cdc_ncm/bmNtbFormatsSupported
|
||||
Date: May 2014
|
||||
KernelVersion: 3.16
|
||||
Contact: Bjørn Mork <bjorn@mork.no>
|
||||
Description:
|
||||
Bit 0: 16-bit NTB supported (set to 1)
|
||||
Bit 1: 32-bit NTB supported
|
||||
Bits 2 – 15: reserved (reset to zero; must be ignored by host)
|
||||
|
||||
What: /sys/class/net/<iface>/cdc_ncm/dwNtbInMaxSize
|
||||
Date: May 2014
|
||||
KernelVersion: 3.16
|
||||
Contact: Bjørn Mork <bjorn@mork.no>
|
||||
Description:
|
||||
IN NTB Maximum Size in bytes
|
||||
|
||||
What: /sys/class/net/<iface>/cdc_ncm/wNdpInDivisor
|
||||
Date: May 2014
|
||||
KernelVersion: 3.16
|
||||
Contact: Bjørn Mork <bjorn@mork.no>
|
||||
Description:
|
||||
Divisor used for IN NTB Datagram payload alignment
|
||||
|
||||
What: /sys/class/net/<iface>/cdc_ncm/wNdpInPayloadRemainder
|
||||
Date: May 2014
|
||||
KernelVersion: 3.16
|
||||
Contact: Bjørn Mork <bjorn@mork.no>
|
||||
Description:
|
||||
Remainder used to align input datagram payload within
|
||||
the NTB: (Payload Offset) mod (wNdpInDivisor) =
|
||||
wNdpInPayloadRemainder
|
||||
|
||||
What: /sys/class/net/<iface>/cdc_ncm/wNdpInAlignment
|
||||
Date: May 2014
|
||||
KernelVersion: 3.16
|
||||
Contact: Bjørn Mork <bjorn@mork.no>
|
||||
Description:
|
||||
NDP alignment modulus for NTBs on the IN pipe. Shall
|
||||
be a power of 2, and shall be at least 4.
|
||||
|
||||
What: /sys/class/net/<iface>/cdc_ncm/dwNtbOutMaxSize
|
||||
Date: May 2014
|
||||
KernelVersion: 3.16
|
||||
Contact: Bjørn Mork <bjorn@mork.no>
|
||||
Description:
|
||||
OUT NTB Maximum Size
|
||||
|
||||
What: /sys/class/net/<iface>/cdc_ncm/wNdpOutDivisor
|
||||
Date: May 2014
|
||||
KernelVersion: 3.16
|
||||
Contact: Bjørn Mork <bjorn@mork.no>
|
||||
Description:
|
||||
OUT NTB Datagram alignment modulus
|
||||
|
||||
What: /sys/class/net/<iface>/cdc_ncm/wNdpOutPayloadRemainder
|
||||
Date: May 2014
|
||||
KernelVersion: 3.16
|
||||
Contact: Bjørn Mork <bjorn@mork.no>
|
||||
Description:
|
||||
Remainder used to align output datagram payload
|
||||
offsets within the NTB: Padding, shall be transmitted
|
||||
as zero by function, and ignored by host. (Payload
|
||||
Offset) mod (wNdpOutDivisor) = wNdpOutPayloadRemainder
|
||||
|
||||
What: /sys/class/net/<iface>/cdc_ncm/wNdpOutAlignment
|
||||
Date: May 2014
|
||||
KernelVersion: 3.16
|
||||
Contact: Bjørn Mork <bjorn@mork.no>
|
||||
Description:
|
||||
NDP alignment modulus for use in NTBs on the OUT
|
||||
pipe. Shall be a power of 2, and shall be at least 4.
|
||||
|
||||
What: /sys/class/net/<iface>/cdc_ncm/wNtbOutMaxDatagrams
|
||||
Date: May 2014
|
||||
KernelVersion: 3.16
|
||||
Contact: Bjørn Mork <bjorn@mork.no>
|
||||
Description:
|
||||
Maximum number of datagrams that the host may pack
|
||||
into a single OUT NTB. Zero means that the device
|
||||
imposes no limit.
|
|
@ -0,0 +1,79 @@
|
|||
What: /sys/class/<iface>/queues/rx-<queue>/rps_cpus
|
||||
Date: March 2010
|
||||
KernelVersion: 2.6.35
|
||||
Contact: netdev@vger.kernel.org
|
||||
Description:
|
||||
Mask of the CPU(s) currently enabled to participate into the
|
||||
Receive Packet Steering packet processing flow for this
|
||||
network device queue. Possible values depend on the number
|
||||
of available CPU(s) in the system.
|
||||
|
||||
What: /sys/class/<iface>/queues/rx-<queue>/rps_flow_cnt
|
||||
Date: April 2010
|
||||
KernelVersion: 2.6.35
|
||||
Contact: netdev@vger.kernel.org
|
||||
Description:
|
||||
Number of Receive Packet Steering flows being currently
|
||||
processed by this particular network device receive queue.
|
||||
|
||||
What: /sys/class/<iface>/queues/tx-<queue>/tx_timeout
|
||||
Date: November 2011
|
||||
KernelVersion: 3.3
|
||||
Contact: netdev@vger.kernel.org
|
||||
Description:
|
||||
Indicates the number of transmit timeout events seen by this
|
||||
network interface transmit queue.
|
||||
|
||||
What: /sys/class/<iface>/queues/tx-<queue>/xps_cpus
|
||||
Date: November 2010
|
||||
KernelVersion: 2.6.38
|
||||
Contact: netdev@vger.kernel.org
|
||||
Description:
|
||||
Mask of the CPU(s) currently enabled to participate into the
|
||||
Transmit Packet Steering packet processing flow for this
|
||||
network device transmit queue. Possible vaules depend on the
|
||||
number of available CPU(s) in the system.
|
||||
|
||||
What: /sys/class/<iface>/queues/tx-<queue>/byte_queue_limits/hold_time
|
||||
Date: November 2011
|
||||
KernelVersion: 3.3
|
||||
Contact: netdev@vger.kernel.org
|
||||
Description:
|
||||
Indicates the hold time in milliseconds to measure the slack
|
||||
of this particular network device transmit queue.
|
||||
Default value is 1000.
|
||||
|
||||
What: /sys/class/<iface>/queues/tx-<queue>/byte_queue_limits/inflight
|
||||
Date: November 2011
|
||||
KernelVersion: 3.3
|
||||
Contact: netdev@vger.kernel.org
|
||||
Description:
|
||||
Indicates the number of bytes (objects) in flight on this
|
||||
network device transmit queue.
|
||||
|
||||
What: /sys/class/<iface>/queues/tx-<queue>/byte_queue_limits/limit
|
||||
Date: November 2011
|
||||
KernelVersion: 3.3
|
||||
Contact: netdev@vger.kernel.org
|
||||
Description:
|
||||
Indicates the current limit of bytes allowed to be queued
|
||||
on this network device transmit queue. This value is clamped
|
||||
to be within the bounds defined by limit_max and limit_min.
|
||||
|
||||
What: /sys/class/<iface>/queues/tx-<queue>/byte_queue_limits/limit_max
|
||||
Date: November 2011
|
||||
KernelVersion: 3.3
|
||||
Contact: netdev@vger.kernel.org
|
||||
Description:
|
||||
Indicates the absolute maximum limit of bytes allowed to be
|
||||
queued on this network device transmit queue. See
|
||||
include/linux/dynamic_queue_limits.h for the default value.
|
||||
|
||||
What: /sys/class/<iface>/queues/tx-<queue>/byte_queue_limits/limit_min
|
||||
Date: November 2011
|
||||
KernelVersion: 3.3
|
||||
Contact: netdev@vger.kernel.org
|
||||
Description:
|
||||
Indicates the absolute minimum limit of bytes allowed to be
|
||||
queued on this network device transmit queue. Default value is
|
||||
0.
|
|
@ -0,0 +1,201 @@
|
|||
What: /sys/class/<iface>/statistics/collisions
|
||||
Date: April 2005
|
||||
KernelVersion: 2.6.12
|
||||
Contact: netdev@vger.kernel.org
|
||||
Description:
|
||||
Indicates the number of collisions seen by this network device.
|
||||
This value might not be relevant with all MAC layers.
|
||||
|
||||
What: /sys/class/<iface>/statistics/multicast
|
||||
Date: April 2005
|
||||
KernelVersion: 2.6.12
|
||||
Contact: netdev@vger.kernel.org
|
||||
Description:
|
||||
Indicates the number of multicast packets received by this
|
||||
network device.
|
||||
|
||||
What: /sys/class/<iface>/statistics/rx_bytes
|
||||
Date: April 2005
|
||||
KernelVersion: 2.6.12
|
||||
Contact: netdev@vger.kernel.org
|
||||
Description:
|
||||
Indicates the number of bytes received by this network device.
|
||||
See the network driver for the exact meaning of when this
|
||||
value is incremented.
|
||||
|
||||
What: /sys/class/<iface>/statistics/rx_compressed
|
||||
Date: April 2005
|
||||
KernelVersion: 2.6.12
|
||||
Contact: netdev@vger.kernel.org
|
||||
Description:
|
||||
Indicates the number of compressed packets received by this
|
||||
network device. This value might only be relevant for interfaces
|
||||
that support packet compression (e.g: PPP).
|
||||
|
||||
What: /sys/class/<iface>/statistics/rx_crc_errors
|
||||
Date: April 2005
|
||||
KernelVersion: 2.6.12
|
||||
Contact: netdev@vger.kernel.org
|
||||
Description:
|
||||
Indicates the number of packets received with a CRC (FCS) error
|
||||
by this network device. Note that the specific meaning might
|
||||
depend on the MAC layer used by the interface.
|
||||
|
||||
What: /sys/class/<iface>/statistics/rx_dropped
|
||||
Date: April 2005
|
||||
KernelVersion: 2.6.12
|
||||
Contact: netdev@vger.kernel.org
|
||||
Description:
|
||||
Indicates the number of packets received by the network device
|
||||
but dropped, that are not forwarded to the upper layers for
|
||||
packet processing. See the network driver for the exact
|
||||
meaning of this value.
|
||||
|
||||
What: /sys/class/<iface>/statistics/rx_fifo_errors
|
||||
Date: April 2005
|
||||
KernelVersion: 2.6.12
|
||||
Contact: netdev@vger.kernel.org
|
||||
Description:
|
||||
Indicates the number of receive FIFO errors seen by this
|
||||
network device. See the network driver for the exact
|
||||
meaning of this value.
|
||||
|
||||
What: /sys/class/<iface>/statistics/rx_frame_errors
|
||||
Date: April 2005
|
||||
KernelVersion: 2.6.12
|
||||
Contact: netdev@vger.kernel.org
|
||||
Description:
|
||||
Indicates the number of received frames with error, such as
|
||||
alignment errors. Note that the specific meaning depends on
|
||||
on the MAC layer protocol used. See the network driver for
|
||||
the exact meaning of this value.
|
||||
|
||||
What: /sys/class/<iface>/statistics/rx_length_errors
|
||||
Date: April 2005
|
||||
KernelVersion: 2.6.12
|
||||
Contact: netdev@vger.kernel.org
|
||||
Description:
|
||||
Indicates the number of received error packet with a length
|
||||
error, oversized or undersized. See the network driver for the
|
||||
exact meaning of this value.
|
||||
|
||||
What: /sys/class/<iface>/statistics/rx_missed_errors
|
||||
Date: April 2005
|
||||
KernelVersion: 2.6.12
|
||||
Contact: netdev@vger.kernel.org
|
||||
Description:
|
||||
Indicates the number of received packets that have been missed
|
||||
due to lack of capacity in the receive side. See the network
|
||||
driver for the exact meaning of this value.
|
||||
|
||||
What: /sys/class/<iface>/statistics/rx_over_errors
|
||||
Date: April 2005
|
||||
KernelVersion: 2.6.12
|
||||
Contact: netdev@vger.kernel.org
|
||||
Description:
|
||||
Indicates the number of received packets that are oversized
|
||||
compared to what the network device is configured to accept
|
||||
(e.g: larger than MTU). See the network driver for the exact
|
||||
meaning of this value.
|
||||
|
||||
What: /sys/class/<iface>/statistics/rx_packets
|
||||
Date: April 2005
|
||||
KernelVersion: 2.6.12
|
||||
Contact: netdev@vger.kernel.org
|
||||
Description:
|
||||
Indicates the total number of good packets received by this
|
||||
network device.
|
||||
|
||||
What: /sys/class/<iface>/statistics/tx_aborted_errors
|
||||
Date: April 2005
|
||||
KernelVersion: 2.6.12
|
||||
Contact: netdev@vger.kernel.org
|
||||
Description:
|
||||
Indicates the number of packets that have been aborted
|
||||
during transmission by a network device (e.g: because of
|
||||
a medium collision). See the network driver for the exact
|
||||
meaning of this value.
|
||||
|
||||
What: /sys/class/<iface>/statistics/tx_bytes
|
||||
Date: April 2005
|
||||
KernelVersion: 2.6.12
|
||||
Contact: netdev@vger.kernel.org
|
||||
Description:
|
||||
Indicates the number of bytes transmitted by a network
|
||||
device. See the network driver for the exact meaning of this
|
||||
value, in particular whether this accounts for all successfully
|
||||
transmitted packets or all packets that have been queued for
|
||||
transmission.
|
||||
|
||||
What: /sys/class/<iface>/statistics/tx_carrier_errors
|
||||
Date: April 2005
|
||||
KernelVersion: 2.6.12
|
||||
Contact: netdev@vger.kernel.org
|
||||
Description:
|
||||
Indicates the number of packets that could not be transmitted
|
||||
because of carrier errors (e.g: physical link down). See the
|
||||
network driver for the exact meaning of this value.
|
||||
|
||||
What: /sys/class/<iface>/statistics/tx_compressed
|
||||
Date: April 2005
|
||||
KernelVersion: 2.6.12
|
||||
Contact: netdev@vger.kernel.org
|
||||
Description:
|
||||
Indicates the number of transmitted compressed packets. Note
|
||||
this might only be relevant for devices that support
|
||||
compression (e.g: PPP).
|
||||
|
||||
What: /sys/class/<iface>/statistics/tx_dropped
|
||||
Date: April 2005
|
||||
KernelVersion: 2.6.12
|
||||
Contact: netdev@vger.kernel.org
|
||||
Description:
|
||||
Indicates the number of packets dropped during transmission.
|
||||
See the driver for the exact reasons as to why the packets were
|
||||
dropped.
|
||||
|
||||
What: /sys/class/<iface>/statistics/tx_errors
|
||||
Date: April 2005
|
||||
KernelVersion: 2.6.12
|
||||
Contact: netdev@vger.kernel.org
|
||||
Description:
|
||||
Indicates the number of packets in error during transmission by
|
||||
a network device. See the driver for the exact reasons as to
|
||||
why the packets were dropped.
|
||||
|
||||
What: /sys/class/<iface>/statistics/tx_fifo_errors
|
||||
Date: April 2005
|
||||
KernelVersion: 2.6.12
|
||||
Contact: netdev@vger.kernel.org
|
||||
Description:
|
||||
Indicates the number of packets having caused a transmit
|
||||
FIFO error. See the driver for the exact reasons as to why the
|
||||
packets were dropped.
|
||||
|
||||
What: /sys/class/<iface>/statistics/tx_heartbeat_errors
|
||||
Date: April 2005
|
||||
KernelVersion: 2.6.12
|
||||
Contact: netdev@vger.kernel.org
|
||||
Description:
|
||||
Indicates the number of packets transmitted that have been
|
||||
reported as heartbeat errors. See the driver for the exact
|
||||
reasons as to why the packets were dropped.
|
||||
|
||||
What: /sys/class/<iface>/statistics/tx_packets
|
||||
Date: April 2005
|
||||
KernelVersion: 2.6.12
|
||||
Contact: netdev@vger.kernel.org
|
||||
Description:
|
||||
Indicates the number of packets transmitted by a network
|
||||
device. See the driver for whether this reports the number of all
|
||||
attempted or successful transmissions.
|
||||
|
||||
What: /sys/class/<iface>/statistics/tx_window_errors
|
||||
Date: April 2005
|
||||
KernelVersion: 2.6.12
|
||||
Contact: netdev@vger.kernel.org
|
||||
Description:
|
||||
Indicates the number of packets not successfully transmitted
|
||||
due to a window collision. The specific meaning depends on the
|
||||
MAC layer used. On Ethernet this is usually used to report
|
||||
late collisions errors.
|
|
@ -100,6 +100,7 @@
|
|||
!Finclude/net/cfg80211.h wdev_priv
|
||||
!Finclude/net/cfg80211.h ieee80211_iface_limit
|
||||
!Finclude/net/cfg80211.h ieee80211_iface_combination
|
||||
!Finclude/net/cfg80211.h cfg80211_check_combinations
|
||||
</chapter>
|
||||
<chapter>
|
||||
<title>Actions and configuration</title>
|
||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -36,7 +36,7 @@
|
|||
#define DPI 72
|
||||
#define VFREQ 60 /* Hz */
|
||||
#define TIMING_NAME "Linux XGA"
|
||||
#define ESTABLISHED_TIMINGS_BITS 0x08 /* Bit 3 -> 1024x768 @60 Hz */
|
||||
#define ESTABLISHED_TIMING2_BITS 0x08 /* Bit 3 -> 1024x768 @60 Hz */
|
||||
#define HSYNC_POL 0
|
||||
#define VSYNC_POL 0
|
||||
#define CRC 0x55
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
#define DPI 72
|
||||
#define VFREQ 60 /* Hz */
|
||||
#define TIMING_NAME "Linux SXGA"
|
||||
#define ESTABLISHED_TIMINGS_BITS 0x00 /* none */
|
||||
/* No ESTABLISHED_TIMINGx_BITS */
|
||||
#define HSYNC_POL 1
|
||||
#define VSYNC_POL 1
|
||||
#define CRC 0xa0
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
#define DPI 72
|
||||
#define VFREQ 60 /* Hz */
|
||||
#define TIMING_NAME "Linux UXGA"
|
||||
#define ESTABLISHED_TIMINGS_BITS 0x00 /* none */
|
||||
/* No ESTABLISHED_TIMINGx_BITS */
|
||||
#define HSYNC_POL 1
|
||||
#define VSYNC_POL 1
|
||||
#define CRC 0x9d
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
#define DPI 96
|
||||
#define VFREQ 60 /* Hz */
|
||||
#define TIMING_NAME "Linux WSXGA"
|
||||
#define ESTABLISHED_TIMINGS_BITS 0x00 /* none */
|
||||
/* No ESTABLISHED_TIMINGx_BITS */
|
||||
#define HSYNC_POL 1
|
||||
#define VSYNC_POL 1
|
||||
#define CRC 0x26
|
||||
|
|
|
@ -36,7 +36,7 @@
|
|||
#define DPI 96
|
||||
#define VFREQ 60 /* Hz */
|
||||
#define TIMING_NAME "Linux FHD"
|
||||
#define ESTABLISHED_TIMINGS_BITS 0x00 /* none */
|
||||
/* No ESTABLISHED_TIMINGx_BITS */
|
||||
#define HSYNC_POL 1
|
||||
#define VSYNC_POL 1
|
||||
#define CRC 0x05
|
||||
|
|
|
@ -0,0 +1,41 @@
|
|||
/*
|
||||
800x600.S: EDID data set for standard 800x600 60 Hz monitor
|
||||
|
||||
Copyright (C) 2011 Carsten Emde <C.Emde@osadl.org>
|
||||
Copyright (C) 2014 Linaro Limited
|
||||
|
||||
This program is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
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.
|
||||
*/
|
||||
|
||||
/* EDID */
|
||||
#define VERSION 1
|
||||
#define REVISION 3
|
||||
|
||||
/* Display */
|
||||
#define CLOCK 40000 /* kHz */
|
||||
#define XPIX 800
|
||||
#define YPIX 600
|
||||
#define XY_RATIO XY_RATIO_4_3
|
||||
#define XBLANK 256
|
||||
#define YBLANK 28
|
||||
#define XOFFSET 40
|
||||
#define XPULSE 128
|
||||
#define YOFFSET (63+1)
|
||||
#define YPULSE (63+4)
|
||||
#define DPI 72
|
||||
#define VFREQ 60 /* Hz */
|
||||
#define TIMING_NAME "Linux SVGA"
|
||||
#define ESTABLISHED_TIMING1_BITS 0x01 /* Bit 0: 800x600 @ 60Hz */
|
||||
#define HSYNC_POL 1
|
||||
#define VSYNC_POL 1
|
||||
#define CRC 0xc2
|
||||
|
||||
#include "edid.S"
|
|
@ -18,7 +18,7 @@ CONFIG_DRM_LOAD_EDID_FIRMWARE was introduced. It allows to provide an
|
|||
individually prepared or corrected EDID data set in the /lib/firmware
|
||||
directory from where it is loaded via the firmware interface. The code
|
||||
(see drivers/gpu/drm/drm_edid_load.c) contains built-in data sets for
|
||||
commonly used screen resolutions (1024x768, 1280x1024, 1600x1200,
|
||||
commonly used screen resolutions (800x600, 1024x768, 1280x1024, 1600x1200,
|
||||
1680x1050, 1920x1080) as binary blobs, but the kernel source tree does
|
||||
not contain code to create these data. In order to elucidate the origin
|
||||
of the built-in binary EDID blobs and to facilitate the creation of
|
||||
|
|
|
@ -33,6 +33,17 @@
|
|||
#define XY_RATIO_5_4 0b10
|
||||
#define XY_RATIO_16_9 0b11
|
||||
|
||||
/* Provide defaults for the timing bits */
|
||||
#ifndef ESTABLISHED_TIMING1_BITS
|
||||
#define ESTABLISHED_TIMING1_BITS 0x00
|
||||
#endif
|
||||
#ifndef ESTABLISHED_TIMING2_BITS
|
||||
#define ESTABLISHED_TIMING2_BITS 0x00
|
||||
#endif
|
||||
#ifndef ESTABLISHED_TIMING3_BITS
|
||||
#define ESTABLISHED_TIMING3_BITS 0x00
|
||||
#endif
|
||||
|
||||
#define mfgname2id(v1,v2,v3) \
|
||||
((((v1-'@')&0x1f)<<10)+(((v2-'@')&0x1f)<<5)+((v3-'@')&0x1f))
|
||||
#define swap16(v1) ((v1>>8)+((v1&0xff)<<8))
|
||||
|
@ -139,7 +150,7 @@ white_x_y_msb: .byte 0x50,0x54
|
|||
Bit 2 640x480 @ 75 Hz
|
||||
Bit 1 800x600 @ 56 Hz
|
||||
Bit 0 800x600 @ 60 Hz */
|
||||
estbl_timing1: .byte 0x00
|
||||
estbl_timing1: .byte ESTABLISHED_TIMING1_BITS
|
||||
|
||||
/* Bit 7 800x600 @ 72 Hz
|
||||
Bit 6 800x600 @ 75 Hz
|
||||
|
@ -149,11 +160,11 @@ estbl_timing1: .byte 0x00
|
|||
Bit 2 1024x768 @ 72 Hz
|
||||
Bit 1 1024x768 @ 75 Hz
|
||||
Bit 0 1280x1024 @ 75 Hz */
|
||||
estbl_timing2: .byte ESTABLISHED_TIMINGS_BITS
|
||||
estbl_timing2: .byte ESTABLISHED_TIMING2_BITS
|
||||
|
||||
/* Bit 7 1152x870 @ 75 Hz (Apple Macintosh II)
|
||||
Bits 6-0 Other manufacturer-specific display mod */
|
||||
estbl_timing3: .byte 0x00
|
||||
estbl_timing3: .byte ESTABLISHED_TIMING3_BITS
|
||||
|
||||
/* Standard timing */
|
||||
/* X resolution, less 31, divided by 8 (256-2288 pixels) */
|
||||
|
|
|
@ -26,6 +26,7 @@ Contents:
|
|||
1.4 target/target_index or setpolicy?
|
||||
1.5 target/target_index
|
||||
1.6 setpolicy
|
||||
1.7 get_intermediate and target_intermediate
|
||||
2. Frequency Table Helpers
|
||||
|
||||
|
||||
|
@ -79,6 +80,10 @@ cpufreq_driver.attr - A pointer to a NULL-terminated list of
|
|||
"struct freq_attr" which allow to
|
||||
export values to sysfs.
|
||||
|
||||
cpufreq_driver.get_intermediate
|
||||
and target_intermediate Used to switch to stable frequency while
|
||||
changing CPU frequency.
|
||||
|
||||
|
||||
1.2 Per-CPU Initialization
|
||||
--------------------------
|
||||
|
@ -151,7 +156,7 @@ Some cpufreq-capable processors switch the frequency between certain
|
|||
limits on their own. These shall use the ->setpolicy call
|
||||
|
||||
|
||||
1.4. target/target_index
|
||||
1.5. target/target_index
|
||||
-------------
|
||||
|
||||
The target_index call has two arguments: struct cpufreq_policy *policy,
|
||||
|
@ -160,6 +165,9 @@ and unsigned int index (into the exposed frequency table).
|
|||
The CPUfreq driver must set the new frequency when called here. The
|
||||
actual frequency must be determined by freq_table[index].frequency.
|
||||
|
||||
It should always restore to earlier frequency (i.e. policy->restore_freq) in
|
||||
case of errors, even if we switched to intermediate frequency earlier.
|
||||
|
||||
Deprecated:
|
||||
----------
|
||||
The target call has three arguments: struct cpufreq_policy *policy,
|
||||
|
@ -179,7 +187,7 @@ Here again the frequency table helper might assist you - see section 2
|
|||
for details.
|
||||
|
||||
|
||||
1.5 setpolicy
|
||||
1.6 setpolicy
|
||||
---------------
|
||||
|
||||
The setpolicy call only takes a struct cpufreq_policy *policy as
|
||||
|
@ -190,6 +198,23 @@ setting when policy->policy is CPUFREQ_POLICY_PERFORMANCE, and a
|
|||
powersaving-oriented setting when CPUFREQ_POLICY_POWERSAVE. Also check
|
||||
the reference implementation in drivers/cpufreq/longrun.c
|
||||
|
||||
1.7 get_intermediate and target_intermediate
|
||||
--------------------------------------------
|
||||
|
||||
Only for drivers with target_index() and CPUFREQ_ASYNC_NOTIFICATION unset.
|
||||
|
||||
get_intermediate should return a stable intermediate frequency platform wants to
|
||||
switch to, and target_intermediate() should set CPU to to that frequency, before
|
||||
jumping to the frequency corresponding to 'index'. Core will take care of
|
||||
sending notifications and driver doesn't have to handle them in
|
||||
target_intermediate() or target_index().
|
||||
|
||||
Drivers can return '0' from get_intermediate() in case they don't wish to switch
|
||||
to intermediate frequency for some target frequency. In that case core will
|
||||
directly call ->target_index().
|
||||
|
||||
NOTE: ->target_index() should restore to policy->restore_freq in case of
|
||||
failures as core would send notifications for that.
|
||||
|
||||
|
||||
2. Frequency Table Helpers
|
||||
|
|
|
@ -20,12 +20,15 @@ Required properties:
|
|||
"allwinner,sun5i-a13-ahb-gates-clk" - for the AHB gates on A13
|
||||
"allwinner,sun5i-a10s-ahb-gates-clk" - for the AHB gates on A10s
|
||||
"allwinner,sun7i-a20-ahb-gates-clk" - for the AHB gates on A20
|
||||
"allwinner,sun6i-a31-ar100-clk" - for the AR100 on A31
|
||||
"allwinner,sun6i-a31-ahb1-mux-clk" - for the AHB1 multiplexer on A31
|
||||
"allwinner,sun6i-a31-ahb1-gates-clk" - for the AHB1 gates on A31
|
||||
"allwinner,sun4i-a10-apb0-clk" - for the APB0 clock
|
||||
"allwinner,sun6i-a31-apb0-clk" - for the APB0 clock on A31
|
||||
"allwinner,sun4i-a10-apb0-gates-clk" - for the APB0 gates on A10
|
||||
"allwinner,sun5i-a13-apb0-gates-clk" - for the APB0 gates on A13
|
||||
"allwinner,sun5i-a10s-apb0-gates-clk" - for the APB0 gates on A10s
|
||||
"allwinner,sun6i-a31-apb0-gates-clk" - for the APB0 gates on A31
|
||||
"allwinner,sun7i-a20-apb0-gates-clk" - for the APB0 gates on A20
|
||||
"allwinner,sun4i-a10-apb1-clk" - for the APB1 clock
|
||||
"allwinner,sun4i-a10-apb1-mux-clk" - for the APB1 clock muxing
|
||||
|
@ -41,6 +44,7 @@ Required properties:
|
|||
"allwinner,sun7i-a20-gmac-clk" - for the GMAC clock module on A20/A31
|
||||
"allwinner,sun4i-a10-usb-clk" - for usb gates + resets on A10 / A20
|
||||
"allwinner,sun5i-a13-usb-clk" - for usb gates + resets on A13
|
||||
"allwinner,sun6i-a31-usb-clk" - for usb gates + resets on A31
|
||||
|
||||
Required properties for all clocks:
|
||||
- reg : shall be the control register address for the clock.
|
||||
|
|
|
@ -14,18 +14,32 @@ a subtype of a DPLL [2], although a simplified one at that.
|
|||
[2] Documentation/devicetree/bindings/clock/ti/dpll.txt
|
||||
|
||||
Required properties:
|
||||
- compatible : shall be "ti,dra7-apll-clock"
|
||||
- compatible : shall be "ti,dra7-apll-clock" or "ti,omap2-apll-clock"
|
||||
- #clock-cells : from common clock binding; shall be set to 0.
|
||||
- clocks : link phandles of parent clocks (clk-ref and clk-bypass)
|
||||
- reg : address and length of the register set for controlling the APLL.
|
||||
It contains the information of registers in the following order:
|
||||
"control" - contains the control register base address
|
||||
"idlest" - contains the idlest register base address
|
||||
"control" - contains the control register offset
|
||||
"idlest" - contains the idlest register offset
|
||||
"autoidle" - contains the autoidle register offset (OMAP2 only)
|
||||
- ti,clock-frequency : static clock frequency for the clock (OMAP2 only)
|
||||
- ti,idlest-shift : bit-shift for the idlest field (OMAP2 only)
|
||||
- ti,bit-shift : bit-shift for enable and autoidle fields (OMAP2 only)
|
||||
|
||||
Examples:
|
||||
apll_pcie_ck: apll_pcie_ck@4a008200 {
|
||||
apll_pcie_ck: apll_pcie_ck {
|
||||
#clock-cells = <0>;
|
||||
clocks = <&apll_pcie_in_clk_mux>, <&dpll_pcie_ref_ck>;
|
||||
reg = <0x4a00821c 0x4>, <0x4a008220 0x4>;
|
||||
reg = <0x021c>, <0x0220>;
|
||||
compatible = "ti,dra7-apll-clock";
|
||||
};
|
||||
|
||||
apll96_ck: apll96_ck {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,omap2-apll-clock";
|
||||
clocks = <&sys_ck>;
|
||||
ti,bit-shift = <2>;
|
||||
ti,idlest-shift = <8>;
|
||||
ti,clock-frequency = <96000000>;
|
||||
reg = <0x0500>, <0x0530>, <0x0520>;
|
||||
};
|
||||
|
|
|
@ -24,12 +24,14 @@ Required properties:
|
|||
"ti,omap4-dpll-core-clock",
|
||||
"ti,omap4-dpll-m4xen-clock",
|
||||
"ti,omap4-dpll-j-type-clock",
|
||||
"ti,omap5-mpu-dpll-clock",
|
||||
"ti,am3-dpll-no-gate-clock",
|
||||
"ti,am3-dpll-j-type-clock",
|
||||
"ti,am3-dpll-no-gate-j-type-clock",
|
||||
"ti,am3-dpll-clock",
|
||||
"ti,am3-dpll-core-clock",
|
||||
"ti,am3-dpll-x2-clock",
|
||||
"ti,omap2-dpll-core-clock",
|
||||
|
||||
- #clock-cells : from common clock binding; shall be set to 0.
|
||||
- clocks : link phandles of parent clocks, first entry lists reference clock
|
||||
|
@ -41,6 +43,7 @@ Required properties:
|
|||
"mult-div1" - contains the multiplier / divider register base address
|
||||
"autoidle" - contains the autoidle register base address (optional)
|
||||
ti,am3-* dpll types do not have autoidle register
|
||||
ti,omap2-* dpll type does not support idlest / autoidle registers
|
||||
|
||||
Optional properties:
|
||||
- DPLL mode setting - defining any one or more of the following overrides
|
||||
|
@ -73,3 +76,10 @@ Examples:
|
|||
clocks = <&sys_clkin_ck>, <&sys_clkin_ck>;
|
||||
reg = <0x90>, <0x5c>, <0x68>;
|
||||
};
|
||||
|
||||
dpll_ck: dpll_ck {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,omap2-dpll-core-clock";
|
||||
clocks = <&sys_ck>, <&sys_ck>;
|
||||
reg = <0x0500>, <0x0540>;
|
||||
};
|
||||
|
|
|
@ -0,0 +1,96 @@
|
|||
Device Tree Clock bindings for ATL (Audio Tracking Logic) of DRA7 SoC.
|
||||
|
||||
The ATL IP is used to generate clock to be used to synchronize baseband and
|
||||
audio codec. A single ATL IP provides four ATL clock instances sharing the same
|
||||
functional clock but can be configured to provide different clocks.
|
||||
ATL can maintain a clock averages to some desired frequency based on the bws/aws
|
||||
signals - can compensate the drift between the two ws signal.
|
||||
|
||||
In order to provide the support for ATL and it's output clocks (which can be used
|
||||
internally within the SoC or external components) two sets of bindings is needed:
|
||||
|
||||
Clock tree binding:
|
||||
This binding uses the common clock binding[1].
|
||||
To be able to integrate the ATL clocks with DT clock tree.
|
||||
Provides ccf level representation of the ATL clocks to be used by drivers.
|
||||
Since the clock instances are part of a single IP this binding is used as a node
|
||||
for the DT clock tree, the IP driver is needed to handle the actual configuration
|
||||
of the IP.
|
||||
|
||||
[1] Documentation/devicetree/bindings/clock/clock-bindings.txt
|
||||
|
||||
Required properties:
|
||||
- compatible : shall be "ti,dra7-atl-clock"
|
||||
- #clock-cells : from common clock binding; shall be set to 0.
|
||||
- clocks : link phandles to functional clock of ATL
|
||||
|
||||
Binding for the IP driver:
|
||||
This binding is used to configure the IP driver which is going to handle the
|
||||
configuration of the IP for the ATL clock instances.
|
||||
|
||||
Required properties:
|
||||
- compatible : shall be "ti,dra7-atl"
|
||||
- reg : base address for the ATL IP
|
||||
- ti,provided-clocks : List of phandles to the clocks associated with the ATL
|
||||
- clocks : link phandles to functional clock of ATL
|
||||
- clock-names : Shall be set to "fck"
|
||||
- ti,hwmods : Shall be set to "atl"
|
||||
|
||||
Optional properties:
|
||||
Configuration of ATL instances:
|
||||
- atl{0/1/2/3} {
|
||||
- bws : Baseband word select signal selection
|
||||
- aws : Audio word select signal selection
|
||||
};
|
||||
|
||||
For valid word select signals, see the dt-bindings/clk/ti-dra7-atl.h include
|
||||
file.
|
||||
|
||||
Examples:
|
||||
/* clock bindings for atl provided clocks */
|
||||
atl_clkin0_ck: atl_clkin0_ck {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,dra7-atl-clock";
|
||||
clocks = <&atl_gfclk_mux>;
|
||||
};
|
||||
|
||||
atl_clkin1_ck: atl_clkin1_ck {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,dra7-atl-clock";
|
||||
clocks = <&atl_gfclk_mux>;
|
||||
};
|
||||
|
||||
atl_clkin2_ck: atl_clkin2_ck {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,dra7-atl-clock";
|
||||
clocks = <&atl_gfclk_mux>;
|
||||
};
|
||||
|
||||
atl_clkin3_ck: atl_clkin3_ck {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,dra7-atl-clock";
|
||||
clocks = <&atl_gfclk_mux>;
|
||||
};
|
||||
|
||||
/* binding for the IP */
|
||||
atl: atl@4843c000 {
|
||||
compatible = "ti,dra7-atl";
|
||||
reg = <0x4843c000 0x3ff>;
|
||||
ti,hwmods = "atl";
|
||||
ti,provided-clocks = <&atl_clkin0_ck>, <&atl_clkin1_ck>,
|
||||
<&atl_clkin2_ck>, <&atl_clkin3_ck>;
|
||||
clocks = <&atl_gfclk_mux>;
|
||||
clock-names = "fck";
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
#include <dt-bindings/clk/ti-dra7-atl.h>
|
||||
|
||||
&atl {
|
||||
status = "okay";
|
||||
|
||||
atl2 {
|
||||
bws = <DRA7_ATL_WS_MCASP2_FSX>;
|
||||
aws = <DRA7_ATL_WS_MCASP3_FSX>;
|
||||
};
|
||||
};
|
|
@ -25,6 +25,11 @@ Required properties:
|
|||
to map clockdomains properly
|
||||
"ti,hsdiv-gate-clock" - gate clock with OMAP36xx specific hardware handling,
|
||||
required for a hardware errata
|
||||
"ti,composite-gate-clock" - composite gate clock, to be part of composite
|
||||
clock
|
||||
"ti,composite-no-wait-gate-clock" - composite gate clock that does not wait
|
||||
for clock to be active before returning
|
||||
from clk_enable()
|
||||
- #clock-cells : from common clock binding; shall be set to 0
|
||||
- clocks : link to phandle of parent clock
|
||||
- reg : offset for register controlling adjustable gate, not needed for
|
||||
|
@ -41,7 +46,7 @@ Examples:
|
|||
#clock-cells = <0>;
|
||||
compatible = "ti,gate-clock";
|
||||
clocks = <&core_96m_fck>;
|
||||
reg = <0x48004a00 0x4>;
|
||||
reg = <0x0a00>;
|
||||
ti,bit-shift = <25>;
|
||||
};
|
||||
|
||||
|
@ -57,7 +62,7 @@ Examples:
|
|||
#clock-cells = <0>;
|
||||
compatible = "ti,dss-gate-clock";
|
||||
clocks = <&dpll4_m4x2_ck>;
|
||||
reg = <0x48004e00 0x4>;
|
||||
reg = <0x0e00>;
|
||||
ti,bit-shift = <0>;
|
||||
};
|
||||
|
||||
|
@ -65,7 +70,7 @@ Examples:
|
|||
#clock-cells = <0>;
|
||||
compatible = "ti,am35xx-gate-clock";
|
||||
clocks = <&ipss_ick>;
|
||||
reg = <0x4800259c 0x4>;
|
||||
reg = <0x059c>;
|
||||
ti,bit-shift = <1>;
|
||||
};
|
||||
|
||||
|
@ -80,6 +85,22 @@ Examples:
|
|||
compatible = "ti,hsdiv-gate-clock";
|
||||
clocks = <&dpll4_m2x2_mul_ck>;
|
||||
ti,bit-shift = <0x1b>;
|
||||
reg = <0x48004d00 0x4>;
|
||||
reg = <0x0d00>;
|
||||
ti,set-bit-to-disable;
|
||||
};
|
||||
|
||||
vlynq_gate_fck: vlynq_gate_fck {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,composite-gate-clock";
|
||||
clocks = <&core_ck>;
|
||||
ti,bit-shift = <3>;
|
||||
reg = <0x0200>;
|
||||
};
|
||||
|
||||
sys_clkout2_src_gate: sys_clkout2_src_gate {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,composite-no-wait-gate-clock";
|
||||
clocks = <&core_ck>;
|
||||
ti,bit-shift = <15>;
|
||||
reg = <0x0070>;
|
||||
};
|
||||
|
|
|
@ -21,6 +21,8 @@ Required properties:
|
|||
"ti,omap3-dss-interface-clock" - interface clock with DSS specific HW handling
|
||||
"ti,omap3-ssi-interface-clock" - interface clock with SSI specific HW handling
|
||||
"ti,am35xx-interface-clock" - interface clock with AM35xx specific HW handling
|
||||
"ti,omap2430-interface-clock" - interface clock with OMAP2430 specific HW
|
||||
handling
|
||||
- #clock-cells : from common clock binding; shall be set to 0
|
||||
- clocks : link to phandle of parent clock
|
||||
- reg : base address for the control register
|
||||
|
|
|
@ -136,6 +136,7 @@ of the following host1x client modules:
|
|||
- compatible: "nvidia,tegra<chip>-hdmi"
|
||||
- reg: Physical base address and length of the controller's registers.
|
||||
- interrupts: The interrupt outputs from the controller.
|
||||
- hdmi-supply: supply for the +5V HDMI connector pin
|
||||
- vdd-supply: regulator for supply voltage
|
||||
- pll-supply: regulator for PLL
|
||||
- clocks: Must contain an entry for each entry in clock-names.
|
||||
|
@ -180,6 +181,7 @@ of the following host1x client modules:
|
|||
See ../reset/reset.txt for details.
|
||||
- reset-names: Must include the following entries:
|
||||
- dsi
|
||||
- avdd-dsi-supply: phandle of a supply that powers the DSI controller
|
||||
- nvidia,mipi-calibrate: Should contain a phandle and a specifier specifying
|
||||
which pads are used by this DSI output and need to be calibrated. See also
|
||||
../mipi/nvidia,tegra114-mipi.txt.
|
||||
|
|
|
@ -1,7 +1,13 @@
|
|||
Binding for TI/National Semiconductor LP55xx Led Drivers
|
||||
|
||||
Required properties:
|
||||
- compatible: "national,lp5521" or "national,lp5523" or "ti,lp5562" or "ti,lp8501"
|
||||
- compatible: one of
|
||||
national,lp5521
|
||||
national,lp5523
|
||||
ti,lp55231
|
||||
ti,lp5562
|
||||
ti,lp8501
|
||||
|
||||
- reg: I2C slave address
|
||||
- clock-mode: Input clock mode, (0: automode, 1: internal, 2: external)
|
||||
|
||||
|
|
|
@ -13,6 +13,8 @@ LED sub-node properties:
|
|||
For the pwms and pwm-names property please refer to:
|
||||
Documentation/devicetree/bindings/pwm/pwm.txt
|
||||
- max-brightness : Maximum brightness possible for the LED
|
||||
- active-low : (optional) For PWMs where the LED is wired to supply
|
||||
rather than ground.
|
||||
- label : (optional)
|
||||
see Documentation/devicetree/bindings/leds/common.txt
|
||||
- linux,default-trigger : (optional)
|
||||
|
|
|
@ -5,7 +5,22 @@ to control the power resources, including power scripts. For now, the
|
|||
binding only supports the complete shutdown of the system after poweroff.
|
||||
|
||||
Required properties:
|
||||
- compatible : must be "ti,twl4030-power"
|
||||
- compatible : must be one of the following
|
||||
"ti,twl4030-power"
|
||||
"ti,twl4030-power-reset"
|
||||
"ti,twl4030-power-idle"
|
||||
"ti,twl4030-power-idle-osc-off"
|
||||
|
||||
The use of ti,twl4030-power-reset is recommended at least on
|
||||
3530 that needs a special configuration for warm reset to work.
|
||||
|
||||
When using ti,twl4030-power-idle, the TI recommended configuration
|
||||
for idle modes is loaded to the tlw4030 PMIC.
|
||||
|
||||
When using ti,twl4030-power-idle-osc-off, the TI recommended
|
||||
configuration is used with the external oscillator being shut
|
||||
down during off-idle. Note that this does not work on all boards
|
||||
depending on how the external oscillator is wired.
|
||||
|
||||
Optional properties:
|
||||
- ti,use_poweroff: With this flag, the chip will initiates an ACTIVE-to-OFF or
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
* AMD 10GbE PHY driver (amd-xgbe-phy)
|
||||
|
||||
Required properties:
|
||||
- compatible: Should be "amd,xgbe-phy-seattle-v1a" and
|
||||
"ethernet-phy-ieee802.3-c45"
|
||||
- reg: Address and length of the register sets for the device
|
||||
- SerDes Rx/Tx registers
|
||||
- SerDes integration registers (1/2)
|
||||
- SerDes integration registers (2/2)
|
||||
|
||||
Example:
|
||||
xgbe_phy@e1240800 {
|
||||
compatible = "amd,xgbe-phy-seattle-v1a", "ethernet-phy-ieee802.3-c45";
|
||||
reg = <0 0xe1240800 0 0x00400>,
|
||||
<0 0xe1250000 0 0x00060>,
|
||||
<0 0xe1250080 0 0x00004>;
|
||||
};
|
|
@ -0,0 +1,34 @@
|
|||
* AMD 10GbE driver (amd-xgbe)
|
||||
|
||||
Required properties:
|
||||
- compatible: Should be "amd,xgbe-seattle-v1a"
|
||||
- reg: Address and length of the register sets for the device
|
||||
- MAC registers
|
||||
- PCS registers
|
||||
- interrupt-parent: Should be the phandle for the interrupt controller
|
||||
that services interrupts for this device
|
||||
- interrupts: Should contain the amd-xgbe interrupt
|
||||
- clocks: Should be the DMA clock for the amd-xgbe device (used for
|
||||
calculating the correct Rx interrupt watchdog timer value on a DMA
|
||||
channel for coalescing)
|
||||
- clock-names: Should be the name of the DMA clock, "dma_clk"
|
||||
- phy-handle: See ethernet.txt file in the same directory
|
||||
- phy-mode: See ethernet.txt file in the same directory
|
||||
|
||||
Optional properties:
|
||||
- mac-address: mac address to be assigned to the device. Can be overridden
|
||||
by UEFI.
|
||||
|
||||
Example:
|
||||
xgbe@e0700000 {
|
||||
compatible = "amd,xgbe-seattle-v1a";
|
||||
reg = <0 0xe0700000 0 0x80000>,
|
||||
<0 0xe0780000 0 0x80000>;
|
||||
interrupt-parent = <&gic>;
|
||||
interrupts = <0 325 4>;
|
||||
clocks = <&xgbe_clk>;
|
||||
clock-names = "dma_clk";
|
||||
phy-handle = <&phy>;
|
||||
phy-mode = "xgmii";
|
||||
mac-address = [ 02 a1 a2 a3 a4 a5 ];
|
||||
};
|
|
@ -24,7 +24,7 @@ Optional properties:
|
|||
- fixed-link: When the GENET interface is connected to a MoCA hardware block or
|
||||
when operating in a RGMII to RGMII type of connection, or when the MDIO bus is
|
||||
voluntarily disabled, this property should be used to describe the "fixed link".
|
||||
See Documentation/devicetree/bindings/net/fsl-tsec-phy.txt for information on
|
||||
See Documentation/devicetree/bindings/net/fixed-link.txt for information on
|
||||
the property specifics
|
||||
|
||||
Required child nodes:
|
||||
|
|
|
@ -0,0 +1,29 @@
|
|||
* Broadcom BCM7xxx Ethernet Systemport Controller (SYSTEMPORT)
|
||||
|
||||
Required properties:
|
||||
- compatible: should be one of "brcm,systemport-v1.00" or "brcm,systemport"
|
||||
- reg: address and length of the register set for the device.
|
||||
- interrupts: interrupts for the device, first cell must be for the the rx
|
||||
interrupts, and the second cell should be for the transmit queues
|
||||
- local-mac-address: Ethernet MAC address (48 bits) of this adapter
|
||||
- phy-mode: Should be a string describing the PHY interface to the
|
||||
Ethernet switch/PHY, see Documentation/devicetree/bindings/net/ethernet.txt
|
||||
- fixed-link: see Documentation/devicetree/bindings/net/fixed-link.txt for
|
||||
the property specific details
|
||||
|
||||
Optional properties:
|
||||
- systemport,num-tier2-arb: number of tier 2 arbiters, an integer
|
||||
- systemport,num-tier1-arb: number of tier 1 arbiters, an integer
|
||||
- systemport,num-txq: number of HW transmit queues, an integer
|
||||
- systemport,num-rxq: number of HW receive queues, an integer
|
||||
|
||||
Example:
|
||||
ethernet@f04a0000 {
|
||||
compatible = "brcm,systemport-v1.00";
|
||||
reg = <0xf04a0000 0x4650>;
|
||||
local-mac-address = [ 00 11 22 33 44 55 ];
|
||||
fixed-link = <0 1 1000 0 0>;
|
||||
phy-mode = "gmii";
|
||||
interrupts = <0x0 0x16 0x0>,
|
||||
<0x0 0x17 0x0>;
|
||||
};
|
|
@ -0,0 +1,44 @@
|
|||
Xilinx Axi CAN/Zynq CANPS controller Device Tree Bindings
|
||||
---------------------------------------------------------
|
||||
|
||||
Required properties:
|
||||
- compatible : Should be "xlnx,zynq-can-1.0" for Zynq CAN
|
||||
controllers and "xlnx,axi-can-1.00.a" for Axi CAN
|
||||
controllers.
|
||||
- reg : Physical base address and size of the Axi CAN/Zynq
|
||||
CANPS registers map.
|
||||
- interrupts : Property with a value describing the interrupt
|
||||
number.
|
||||
- interrupt-parent : Must be core interrupt controller
|
||||
- clock-names : List of input clock names - "can_clk", "pclk"
|
||||
(For CANPS), "can_clk" , "s_axi_aclk"(For AXI CAN)
|
||||
(See clock bindings for details).
|
||||
- clocks : Clock phandles (see clock bindings for details).
|
||||
- tx-fifo-depth : Can Tx fifo depth.
|
||||
- rx-fifo-depth : Can Rx fifo depth.
|
||||
|
||||
|
||||
Example:
|
||||
|
||||
For Zynq CANPS Dts file:
|
||||
zynq_can_0: can@e0008000 {
|
||||
compatible = "xlnx,zynq-can-1.0";
|
||||
clocks = <&clkc 19>, <&clkc 36>;
|
||||
clock-names = "can_clk", "pclk";
|
||||
reg = <0xe0008000 0x1000>;
|
||||
interrupts = <0 28 4>;
|
||||
interrupt-parent = <&intc>;
|
||||
tx-fifo-depth = <0x40>;
|
||||
rx-fifo-depth = <0x40>;
|
||||
};
|
||||
For Axi CAN Dts file:
|
||||
axi_can_0: axi-can@40000000 {
|
||||
compatible = "xlnx,axi-can-1.00.a";
|
||||
clocks = <&clkc 0>, <&clkc 1>;
|
||||
clock-names = "can_clk","s_axi_aclk" ;
|
||||
reg = <0x40000000 0x10000>;
|
||||
interrupt-parent = <&intc>;
|
||||
interrupts = <0 59 1>;
|
||||
tx-fifo-depth = <0x40>;
|
||||
rx-fifo-depth = <0x40>;
|
||||
};
|
|
@ -2,7 +2,9 @@ TI CPSW Phy mode Selection Device Tree Bindings
|
|||
-----------------------------------------------
|
||||
|
||||
Required properties:
|
||||
- compatible : Should be "ti,am3352-cpsw-phy-sel"
|
||||
- compatible : Should be "ti,am3352-cpsw-phy-sel" for am335x platform and
|
||||
"ti,dra7xx-cpsw-phy-sel" for dra7xx platform
|
||||
"ti,am43xx-cpsw-phy-sel" for am43xx platform
|
||||
- reg : physical base address and size of the cpsw
|
||||
registers map
|
||||
- reg-names : names of the register map given in "reg" node
|
||||
|
|
|
@ -0,0 +1,42 @@
|
|||
Fixed link Device Tree binding
|
||||
------------------------------
|
||||
|
||||
Some Ethernet MACs have a "fixed link", and are not connected to a
|
||||
normal MDIO-managed PHY device. For those situations, a Device Tree
|
||||
binding allows to describe a "fixed link".
|
||||
|
||||
Such a fixed link situation is described by creating a 'fixed-link'
|
||||
sub-node of the Ethernet MAC device node, with the following
|
||||
properties:
|
||||
|
||||
* 'speed' (integer, mandatory), to indicate the link speed. Accepted
|
||||
values are 10, 100 and 1000
|
||||
* 'full-duplex' (boolean, optional), to indicate that full duplex is
|
||||
used. When absent, half duplex is assumed.
|
||||
* 'pause' (boolean, optional), to indicate that pause should be
|
||||
enabled.
|
||||
* 'asym-pause' (boolean, optional), to indicate that asym_pause should
|
||||
be enabled.
|
||||
|
||||
Old, deprecated 'fixed-link' binding:
|
||||
|
||||
* A 'fixed-link' property in the Ethernet MAC node, with 5 cells, of the
|
||||
form <a b c d e> with the following accepted values:
|
||||
- a: emulated PHY ID, choose any but but unique to the all specified
|
||||
fixed-links, from 0 to 31
|
||||
- b: duplex configuration: 0 for half duplex, 1 for full duplex
|
||||
- c: link speed in Mbits/sec, accepted values are: 10, 100 and 1000
|
||||
- d: pause configuration: 0 for no pause, 1 for pause
|
||||
- e: asymmetric pause configuration: 0 for no asymmetric pause, 1 for
|
||||
asymmetric pause
|
||||
|
||||
Example:
|
||||
|
||||
ethernet@0 {
|
||||
...
|
||||
fixed-link {
|
||||
speed = <1000>;
|
||||
full-duplex;
|
||||
};
|
||||
...
|
||||
};
|
|
@ -42,10 +42,7 @@ Properties:
|
|||
interrupt. For TSEC and eTSEC devices, the first interrupt is
|
||||
transmit, the second is receive, and the third is error.
|
||||
- phy-handle : See ethernet.txt file in the same directory.
|
||||
- fixed-link : <a b c d e> where a is emulated phy id - choose any,
|
||||
but unique to the all specified fixed-links, b is duplex - 0 half,
|
||||
1 full, c is link speed - d#10/d#100/d#1000, d is pause - 0 no
|
||||
pause, 1 pause, e is asym_pause - 0 no asym_pause, 1 asym_pause.
|
||||
- fixed-link : See fixed-link.txt in the same directory.
|
||||
- phy-connection-type : See ethernet.txt file in the same directory.
|
||||
This property is only really needed if the connection is of type
|
||||
"rgmii-id", as all other connection types are detected by hardware.
|
||||
|
|
|
@ -0,0 +1,36 @@
|
|||
Hisilicon hix5hd2 gmac controller
|
||||
|
||||
Required properties:
|
||||
- compatible: should be "hisilicon,hix5hd2-gmac".
|
||||
- reg: specifies base physical address(s) and size of the device registers.
|
||||
The first region is the MAC register base and size.
|
||||
The second region is external interface control register.
|
||||
- interrupts: should contain the MAC interrupt.
|
||||
- #address-cells: must be <1>.
|
||||
- #size-cells: must be <0>.
|
||||
- phy-mode: see ethernet.txt [1].
|
||||
- phy-handle: see ethernet.txt [1].
|
||||
- mac-address: see ethernet.txt [1].
|
||||
- clocks: clock phandle and specifier pair.
|
||||
|
||||
- PHY subnode: inherits from phy binding [2]
|
||||
|
||||
[1] Documentation/devicetree/bindings/net/ethernet.txt
|
||||
[2] Documentation/devicetree/bindings/net/phy.txt
|
||||
|
||||
Example:
|
||||
gmac0: ethernet@f9840000 {
|
||||
compatible = "hisilicon,hix5hd2-gmac";
|
||||
reg = <0xf9840000 0x1000>,<0xf984300c 0x4>;
|
||||
interrupts = <0 71 4>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
phy-mode = "mii";
|
||||
phy-handle = <&phy2>;
|
||||
mac-address = [00 00 00 00 00 00];
|
||||
clocks = <&clock HIX5HD2_MAC0_CLK>;
|
||||
|
||||
phy2: ethernet-phy@2 {
|
||||
reg = <2>;
|
||||
};
|
||||
};
|
|
@ -0,0 +1,23 @@
|
|||
* AT86RF230 IEEE 802.15.4 *
|
||||
|
||||
Required properties:
|
||||
- compatible: should be "atmel,at86rf230", "atmel,at86rf231",
|
||||
"atmel,at86rf233" or "atmel,at86rf212"
|
||||
- spi-max-frequency: maximal bus speed, should be set to 7500000 depends
|
||||
sync or async operation mode
|
||||
- reg: the chipselect index
|
||||
- interrupts: the interrupt generated by the device
|
||||
|
||||
Optional properties:
|
||||
- reset-gpio: GPIO spec for the rstn pin
|
||||
- sleep-gpio: GPIO spec for the slp_tr pin
|
||||
|
||||
Example:
|
||||
|
||||
at86rf231@0 {
|
||||
compatible = "atmel,at86rf231";
|
||||
spi-max-frequency = <7500000>;
|
||||
reg = <0>;
|
||||
interrupts = <19 1>;
|
||||
interrupt-parent = <&gpio3>;
|
||||
};
|
|
@ -1,9 +1,18 @@
|
|||
Micrel KS8851 Ethernet mac
|
||||
Micrel KS8851 Ethernet mac (MLL)
|
||||
|
||||
Required properties:
|
||||
- compatible = "micrel,ks8851-ml" of parallel interface
|
||||
- compatible = "micrel,ks8851-mll" of parallel interface
|
||||
- reg : 2 physical address and size of registers for data and command
|
||||
- interrupts : interrupt connection
|
||||
|
||||
Micrel KS8851 Ethernet mac (SPI)
|
||||
|
||||
Required properties:
|
||||
- compatible = "micrel,ks8851" or the deprecated "ks8851"
|
||||
- reg : chip select number
|
||||
- interrupts : interrupt connection
|
||||
|
||||
Optional properties:
|
||||
- vdd-supply: supply for Ethernet mac
|
||||
- vdd-supply: analog 3.3V supply for Ethernet mac
|
||||
- vdd-io-supply: digital 1.8V IO supply for Ethernet mac
|
||||
- reset-gpios: reset_n input pin
|
||||
|
|
|
@ -1,49 +0,0 @@
|
|||
Micrel KSZ9021 Gigabit Ethernet PHY
|
||||
|
||||
Some boards require special tuning values, particularly when it comes to
|
||||
clock delays. You can specify clock delay values by adding
|
||||
micrel-specific properties to an Ethernet OF device node.
|
||||
|
||||
All skew control options are specified in picoseconds. The minimum
|
||||
value is 0, and the maximum value is 3000.
|
||||
|
||||
Optional properties:
|
||||
- rxc-skew-ps : Skew control of RXC pad
|
||||
- rxdv-skew-ps : Skew control of RX CTL pad
|
||||
- txc-skew-ps : Skew control of TXC pad
|
||||
- txen-skew-ps : Skew control of TX_CTL pad
|
||||
- rxd0-skew-ps : Skew control of RX data 0 pad
|
||||
- rxd1-skew-ps : Skew control of RX data 1 pad
|
||||
- rxd2-skew-ps : Skew control of RX data 2 pad
|
||||
- rxd3-skew-ps : Skew control of RX data 3 pad
|
||||
- txd0-skew-ps : Skew control of TX data 0 pad
|
||||
- txd1-skew-ps : Skew control of TX data 1 pad
|
||||
- txd2-skew-ps : Skew control of TX data 2 pad
|
||||
- txd3-skew-ps : Skew control of TX data 3 pad
|
||||
|
||||
Examples:
|
||||
|
||||
/* Attach to an Ethernet device with autodetected PHY */
|
||||
&enet {
|
||||
rxc-skew-ps = <3000>;
|
||||
rxdv-skew-ps = <0>;
|
||||
txc-skew-ps = <3000>;
|
||||
txen-skew-ps = <0>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
/* Attach to an explicitly-specified PHY */
|
||||
mdio {
|
||||
phy0: ethernet-phy@0 {
|
||||
rxc-skew-ps = <3000>;
|
||||
rxdv-skew-ps = <0>;
|
||||
txc-skew-ps = <3000>;
|
||||
txen-skew-ps = <0>;
|
||||
reg = <0>;
|
||||
};
|
||||
};
|
||||
ethernet@70000 {
|
||||
status = "okay";
|
||||
phy = <&phy0>;
|
||||
phy-mode = "rgmii-id";
|
||||
};
|
|
@ -0,0 +1,83 @@
|
|||
Micrel KSZ9021/KSZ9031 Gigabit Ethernet PHY
|
||||
|
||||
Some boards require special tuning values, particularly when it comes to
|
||||
clock delays. You can specify clock delay values by adding
|
||||
micrel-specific properties to an Ethernet OF device node.
|
||||
|
||||
Note that these settings are applied after any phy-specific fixup from
|
||||
phy_fixup_list (see phy_init_hw() from drivers/net/phy/phy_device.c),
|
||||
and therefore may overwrite them.
|
||||
|
||||
KSZ9021:
|
||||
|
||||
All skew control options are specified in picoseconds. The minimum
|
||||
value is 0, the maximum value is 3000, and it is incremented by 200ps
|
||||
steps.
|
||||
|
||||
Optional properties:
|
||||
|
||||
- rxc-skew-ps : Skew control of RXC pad
|
||||
- rxdv-skew-ps : Skew control of RX CTL pad
|
||||
- txc-skew-ps : Skew control of TXC pad
|
||||
- txen-skew-ps : Skew control of TX CTL pad
|
||||
- rxd0-skew-ps : Skew control of RX data 0 pad
|
||||
- rxd1-skew-ps : Skew control of RX data 1 pad
|
||||
- rxd2-skew-ps : Skew control of RX data 2 pad
|
||||
- rxd3-skew-ps : Skew control of RX data 3 pad
|
||||
- txd0-skew-ps : Skew control of TX data 0 pad
|
||||
- txd1-skew-ps : Skew control of TX data 1 pad
|
||||
- txd2-skew-ps : Skew control of TX data 2 pad
|
||||
- txd3-skew-ps : Skew control of TX data 3 pad
|
||||
|
||||
KSZ9031:
|
||||
|
||||
All skew control options are specified in picoseconds. The minimum
|
||||
value is 0, and the maximum is property-dependent. The increment
|
||||
step is 60ps.
|
||||
|
||||
Optional properties:
|
||||
|
||||
Maximum value of 1860:
|
||||
|
||||
- rxc-skew-ps : Skew control of RX clock pad
|
||||
- txc-skew-ps : Skew control of TX clock pad
|
||||
|
||||
Maximum value of 900:
|
||||
|
||||
- rxdv-skew-ps : Skew control of RX CTL pad
|
||||
- txen-skew-ps : Skew control of TX CTL pad
|
||||
- rxd0-skew-ps : Skew control of RX data 0 pad
|
||||
- rxd1-skew-ps : Skew control of RX data 1 pad
|
||||
- rxd2-skew-ps : Skew control of RX data 2 pad
|
||||
- rxd3-skew-ps : Skew control of RX data 3 pad
|
||||
- txd0-skew-ps : Skew control of TX data 0 pad
|
||||
- txd1-skew-ps : Skew control of TX data 1 pad
|
||||
- txd2-skew-ps : Skew control of TX data 2 pad
|
||||
- txd3-skew-ps : Skew control of TX data 3 pad
|
||||
|
||||
Examples:
|
||||
|
||||
/* Attach to an Ethernet device with autodetected PHY */
|
||||
&enet {
|
||||
rxc-skew-ps = <3000>;
|
||||
rxdv-skew-ps = <0>;
|
||||
txc-skew-ps = <3000>;
|
||||
txen-skew-ps = <0>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
/* Attach to an explicitly-specified PHY */
|
||||
mdio {
|
||||
phy0: ethernet-phy@0 {
|
||||
rxc-skew-ps = <3000>;
|
||||
rxdv-skew-ps = <0>;
|
||||
txc-skew-ps = <3000>;
|
||||
txen-skew-ps = <0>;
|
||||
reg = <0>;
|
||||
};
|
||||
};
|
||||
ethernet@70000 {
|
||||
status = "okay";
|
||||
phy = <&phy0>;
|
||||
phy-mode = "rgmii-id";
|
||||
};
|
|
@ -0,0 +1,35 @@
|
|||
* NXP Semiconductors PN544 NFC Controller
|
||||
|
||||
Required properties:
|
||||
- compatible: Should be "nxp,pn544-i2c".
|
||||
- clock-frequency: I²C work frequency.
|
||||
- reg: address on the bus
|
||||
- interrupt-parent: phandle for the interrupt gpio controller
|
||||
- interrupts: GPIO interrupt to which the chip is connected
|
||||
- enable-gpios: Output GPIO pin used for enabling/disabling the PN544
|
||||
- firmware-gpios: Output GPIO pin used to enter firmware download mode
|
||||
|
||||
Optional SoC Specific Properties:
|
||||
- pinctrl-names: Contains only one value - "default".
|
||||
- pintctrl-0: Specifies the pin control groups used for this controller.
|
||||
|
||||
Example (for ARM-based BeagleBone with PN544 on I2C2):
|
||||
|
||||
&i2c2 {
|
||||
|
||||
status = "okay";
|
||||
|
||||
pn544: pn544@28 {
|
||||
|
||||
compatible = "nxp,pn544-i2c";
|
||||
|
||||
reg = <0x28>;
|
||||
clock-frequency = <400000>;
|
||||
|
||||
interrupt-parent = <&gpio1>;
|
||||
interrupts = <17 GPIO_ACTIVE_HIGH>;
|
||||
|
||||
enable-gpios = <&gpio3 21 GPIO_ACTIVE_HIGH>;
|
||||
firmware-gpios = <&gpio3 19 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
};
|
|
@ -0,0 +1,33 @@
|
|||
* STMicroelectronics SAS. ST21NFCA NFC Controller
|
||||
|
||||
Required properties:
|
||||
- compatible: Should be "st,st21nfca_i2c".
|
||||
- clock-frequency: I²C work frequency.
|
||||
- reg: address on the bus
|
||||
- interrupt-parent: phandle for the interrupt gpio controller
|
||||
- interrupts: GPIO interrupt to which the chip is connected
|
||||
- enable-gpios: Output GPIO pin used for enabling/disabling the ST21NFCA
|
||||
|
||||
Optional SoC Specific Properties:
|
||||
- pinctrl-names: Contains only one value - "default".
|
||||
- pintctrl-0: Specifies the pin control groups used for this controller.
|
||||
|
||||
Example (for ARM-based BeagleBoard xM with ST21NFCA on I2C2):
|
||||
|
||||
&i2c2 {
|
||||
|
||||
status = "okay";
|
||||
|
||||
st21nfca: st21nfca@1 {
|
||||
|
||||
compatible = "st,st21nfca_i2c";
|
||||
|
||||
reg = <0x01>;
|
||||
clock-frequency = <400000>;
|
||||
|
||||
interrupt-parent = <&gpio5>;
|
||||
interrupts = <2 IRQ_TYPE_LEVEL_LOW>;
|
||||
|
||||
enable-gpios = <&gpio5 29 GPIO_ACTIVE_HIGH>;
|
||||
};
|
||||
};
|
|
@ -12,6 +12,7 @@ Required properties:
|
|||
Optional SoC Specific Properties:
|
||||
- pinctrl-names: Contains only one value - "default".
|
||||
- pintctrl-0: Specifies the pin control groups used for this controller.
|
||||
- autosuspend-delay: Specify autosuspend delay in milliseconds.
|
||||
|
||||
Example (for ARM-based BeagleBone with TRF7970A on SPI1):
|
||||
|
||||
|
@ -29,6 +30,7 @@ Example (for ARM-based BeagleBone with TRF7970A on SPI1):
|
|||
ti,enable-gpios = <&gpio2 2 GPIO_ACTIVE_LOW>,
|
||||
<&gpio2 5 GPIO_ACTIVE_LOW>;
|
||||
vin-supply = <&ldo3_reg>;
|
||||
autosuspend-delay = <30000>;
|
||||
status = "okay";
|
||||
};
|
||||
};
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
* VIA Rhine 10/100 Network Controller
|
||||
|
||||
Required properties:
|
||||
- compatible : Should be "via,vt8500-rhine" for integrated
|
||||
Rhine controllers found in VIA VT8500, WonderMedia WM8950
|
||||
and similar. These are listed as 1106:3106 rev. 0x84 on the
|
||||
virtual PCI bus under vendor-provided kernels
|
||||
- reg : Address and length of the io space
|
||||
- interrupts : Should contain the controller interrupt line
|
||||
|
||||
Examples:
|
||||
|
||||
ethernet@d8004000 {
|
||||
compatible = "via,vt8500-rhine";
|
||||
reg = <0xd8004000 0x100>;
|
||||
interrupts = <10>;
|
||||
};
|
|
@ -0,0 +1,7 @@
|
|||
AU Optronics Corporation 13.3" WXGA (1366x768) TFT LCD panel
|
||||
|
||||
Required properties:
|
||||
- compatible: should be "auo,b133xtn01"
|
||||
|
||||
This binding is compatible with the simple-panel binding, which is specified
|
||||
in simple-panel.txt in this directory.
|
|
@ -0,0 +1,7 @@
|
|||
Emerging Display Technology Corp. 5.7" VGA TFT LCD panel
|
||||
|
||||
Required properties:
|
||||
- compatible: should be "edt,et057090dhu"
|
||||
|
||||
This binding is compatible with the simple-panel binding, which is specified
|
||||
in simple-panel.txt in this directory.
|
|
@ -0,0 +1,10 @@
|
|||
Emerging Display Technology Corp. ET070080DH6 7.0" WVGA TFT LCD panel
|
||||
|
||||
Required properties:
|
||||
- compatible: should be "edt,et070080dh6"
|
||||
|
||||
This panel is the same as ETM0700G0DH6 except for the touchscreen.
|
||||
ET070080DH6 is the model with resistive touch.
|
||||
|
||||
This binding is compatible with the simple-panel binding, which is specified
|
||||
in simple-panel.txt in this directory.
|
|
@ -0,0 +1,10 @@
|
|||
Emerging Display Technology Corp. ETM0700G0DH6 7.0" WVGA TFT LCD panel
|
||||
|
||||
Required properties:
|
||||
- compatible: should be "edt,etm0700g0dh6"
|
||||
|
||||
This panel is the same as ET070080DH6 except for the touchscreen.
|
||||
ETM0700G0DH6 is the model with capacitive multitouch.
|
||||
|
||||
This binding is compatible with the simple-panel binding, which is specified
|
||||
in simple-panel.txt in this directory.
|
|
@ -1,15 +1,7 @@
|
|||
* Synopsys Designware PCIe interface
|
||||
|
||||
Required properties:
|
||||
- compatible: should contain "snps,dw-pcie" to identify the
|
||||
core, plus an identifier for the specific instance, such
|
||||
as "samsung,exynos5440-pcie" or "fsl,imx6q-pcie".
|
||||
- reg: base addresses and lengths of the pcie controller,
|
||||
the phy controller, additional register for the phy controller.
|
||||
- interrupts: interrupt values for level interrupt,
|
||||
pulse interrupt, special interrupt.
|
||||
- clocks: from common clock binding: handle to pci clock.
|
||||
- clock-names: from common clock binding: should be "pcie" and "pcie_bus".
|
||||
- compatible: should contain "snps,dw-pcie" to identify the core.
|
||||
- #address-cells: set to <3>
|
||||
- #size-cells: set to <2>
|
||||
- device_type: set to "pci"
|
||||
|
@ -19,65 +11,11 @@ Required properties:
|
|||
to define the mapping of the PCIe interface to interrupt
|
||||
numbers.
|
||||
- num-lanes: number of lanes to use
|
||||
- clocks: Must contain an entry for each entry in clock-names.
|
||||
See ../clocks/clock-bindings.txt for details.
|
||||
- clock-names: Must include the following entries:
|
||||
- "pcie"
|
||||
- "pcie_bus"
|
||||
|
||||
Optional properties:
|
||||
- reset-gpio: gpio pin number of power good signal
|
||||
|
||||
Optional properties for fsl,imx6q-pcie
|
||||
- power-on-gpio: gpio pin number of power-enable signal
|
||||
- wake-up-gpio: gpio pin number of incoming wakeup signal
|
||||
- disable-gpio: gpio pin number of outgoing rfkill/endpoint disable signal
|
||||
|
||||
Example:
|
||||
|
||||
SoC specific DT Entry:
|
||||
|
||||
pcie@290000 {
|
||||
compatible = "samsung,exynos5440-pcie", "snps,dw-pcie";
|
||||
reg = <0x290000 0x1000
|
||||
0x270000 0x1000
|
||||
0x271000 0x40>;
|
||||
interrupts = <0 20 0>, <0 21 0>, <0 22 0>;
|
||||
clocks = <&clock 28>, <&clock 27>;
|
||||
clock-names = "pcie", "pcie_bus";
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
device_type = "pci";
|
||||
ranges = <0x00000800 0 0x40000000 0x40000000 0 0x00001000 /* configuration space */
|
||||
0x81000000 0 0 0x40001000 0 0x00010000 /* downstream I/O */
|
||||
0x82000000 0 0x40011000 0x40011000 0 0x1ffef000>; /* non-prefetchable memory */
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-map-mask = <0 0 0 0>;
|
||||
interrupt-map = <0x0 0 &gic 53>;
|
||||
num-lanes = <4>;
|
||||
};
|
||||
|
||||
pcie@2a0000 {
|
||||
compatible = "samsung,exynos5440-pcie", "snps,dw-pcie";
|
||||
reg = <0x2a0000 0x1000
|
||||
0x272000 0x1000
|
||||
0x271040 0x40>;
|
||||
interrupts = <0 23 0>, <0 24 0>, <0 25 0>;
|
||||
clocks = <&clock 29>, <&clock 27>;
|
||||
clock-names = "pcie", "pcie_bus";
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
device_type = "pci";
|
||||
ranges = <0x00000800 0 0x60000000 0x60000000 0 0x00001000 /* configuration space */
|
||||
0x81000000 0 0 0x60001000 0 0x00010000 /* downstream I/O */
|
||||
0x82000000 0 0x60011000 0x60011000 0 0x1ffef000>; /* non-prefetchable memory */
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-map-mask = <0 0 0 0>;
|
||||
interrupt-map = <0x0 0 &gic 56>;
|
||||
num-lanes = <4>;
|
||||
};
|
||||
|
||||
Board specific DT Entry:
|
||||
|
||||
pcie@290000 {
|
||||
reset-gpio = <&pin_ctrl 5 0>;
|
||||
};
|
||||
|
||||
pcie@2a0000 {
|
||||
reset-gpio = <&pin_ctrl 22 0>;
|
||||
};
|
||||
|
|
|
@ -0,0 +1,38 @@
|
|||
* Freescale i.MX6 PCIe interface
|
||||
|
||||
This PCIe host controller is based on the Synopsis Designware PCIe IP
|
||||
and thus inherits all the common properties defined in designware-pcie.txt.
|
||||
|
||||
Required properties:
|
||||
- compatible: "fsl,imx6q-pcie"
|
||||
- reg: base addresse and length of the pcie controller
|
||||
- interrupts: A list of interrupt outputs of the controller. Must contain an
|
||||
entry for each entry in the interrupt-names property.
|
||||
- interrupt-names: Must include the following entries:
|
||||
- "msi": The interrupt that is asserted when an MSI is received
|
||||
- clock-names: Must include the following additional entries:
|
||||
- "pcie_phy"
|
||||
|
||||
Example:
|
||||
|
||||
pcie@0x01000000 {
|
||||
compatible = "fsl,imx6q-pcie", "snps,dw-pcie";
|
||||
reg = <0x01ffc000 0x4000>;
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
device_type = "pci";
|
||||
ranges = <0x00000800 0 0x01f00000 0x01f00000 0 0x00080000
|
||||
0x81000000 0 0 0x01f80000 0 0x00010000
|
||||
0x82000000 0 0x01000000 0x01000000 0 0x00f00000>;
|
||||
num-lanes = <1>;
|
||||
interrupts = <GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "msi";
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-map-mask = <0 0 0 0x7>;
|
||||
interrupt-map = <0 0 0 1 &intc GIC_SPI 123 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 0 2 &intc GIC_SPI 122 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 0 3 &intc GIC_SPI 121 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 0 0 4 &intc GIC_SPI 120 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clks 144>, <&clks 206>, <&clks 189>;
|
||||
clock-names = "pcie", "pcie_bus", "pcie_phy";
|
||||
};
|
|
@ -0,0 +1,65 @@
|
|||
* Samsung Exynos 5440 PCIe interface
|
||||
|
||||
This PCIe host controller is based on the Synopsis Designware PCIe IP
|
||||
and thus inherits all the common properties defined in designware-pcie.txt.
|
||||
|
||||
Required properties:
|
||||
- compatible: "samsung,exynos5440-pcie"
|
||||
- reg: base addresses and lengths of the pcie controller,
|
||||
the phy controller, additional register for the phy controller.
|
||||
- interrupts: A list of interrupt outputs for level interrupt,
|
||||
pulse interrupt, special interrupt.
|
||||
|
||||
Example:
|
||||
|
||||
SoC specific DT Entry:
|
||||
|
||||
pcie@290000 {
|
||||
compatible = "samsung,exynos5440-pcie", "snps,dw-pcie";
|
||||
reg = <0x290000 0x1000
|
||||
0x270000 0x1000
|
||||
0x271000 0x40>;
|
||||
interrupts = <0 20 0>, <0 21 0>, <0 22 0>;
|
||||
clocks = <&clock 28>, <&clock 27>;
|
||||
clock-names = "pcie", "pcie_bus";
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
device_type = "pci";
|
||||
ranges = <0x00000800 0 0x40000000 0x40000000 0 0x00001000 /* configuration space */
|
||||
0x81000000 0 0 0x40001000 0 0x00010000 /* downstream I/O */
|
||||
0x82000000 0 0x40011000 0x40011000 0 0x1ffef000>; /* non-prefetchable memory */
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-map-mask = <0 0 0 0>;
|
||||
interrupt-map = <0 0 0 0 &gic GIC_SPI 21 IRQ_TYPE_LEVEL_HIGH>;
|
||||
num-lanes = <4>;
|
||||
};
|
||||
|
||||
pcie@2a0000 {
|
||||
compatible = "samsung,exynos5440-pcie", "snps,dw-pcie";
|
||||
reg = <0x2a0000 0x1000
|
||||
0x272000 0x1000
|
||||
0x271040 0x40>;
|
||||
interrupts = <0 23 0>, <0 24 0>, <0 25 0>;
|
||||
clocks = <&clock 29>, <&clock 27>;
|
||||
clock-names = "pcie", "pcie_bus";
|
||||
#address-cells = <3>;
|
||||
#size-cells = <2>;
|
||||
device_type = "pci";
|
||||
ranges = <0x00000800 0 0x60000000 0x60000000 0 0x00001000 /* configuration space */
|
||||
0x81000000 0 0 0x60001000 0 0x00010000 /* downstream I/O */
|
||||
0x82000000 0 0x60011000 0x60011000 0 0x1ffef000>; /* non-prefetchable memory */
|
||||
#interrupt-cells = <1>;
|
||||
interrupt-map-mask = <0 0 0 0>;
|
||||
interrupt-map = <0 0 0 0 &gic GIC_SPI 24 IRQ_TYPE_LEVEL_HIGH>;
|
||||
num-lanes = <4>;
|
||||
};
|
||||
|
||||
Board specific DT Entry:
|
||||
|
||||
pcie@290000 {
|
||||
reset-gpio = <&pin_ctrl 5 0>;
|
||||
};
|
||||
|
||||
pcie@2a0000 {
|
||||
reset-gpio = <&pin_ctrl 22 0>;
|
||||
};
|
|
@ -0,0 +1,21 @@
|
|||
Broadcom Kona PWM controller device tree bindings
|
||||
|
||||
This controller has 6 channels.
|
||||
|
||||
Required Properties :
|
||||
- compatible: should contain "brcm,kona-pwm"
|
||||
- reg: physical base address and length of the controller's registers
|
||||
- clocks: phandle + clock specifier pair for the external clock
|
||||
- #pwm-cells: Should be 3. See pwm.txt in this directory for a
|
||||
description of the cells format.
|
||||
|
||||
Refer to clocks/clock-bindings.txt for generic clock consumer properties.
|
||||
|
||||
Example:
|
||||
|
||||
pwm: pwm@3e01a000 {
|
||||
compatible = "brcm,bcm11351-pwm", "brcm,kona-pwm";
|
||||
reg = <0x3e01a000 0xc4>;
|
||||
clocks = <&pwm_clk>;
|
||||
#pwm-cells = <3>;
|
||||
};
|
|
@ -1,11 +1,21 @@
|
|||
* Marvell Armada 370/XP thermal management
|
||||
* Marvell Armada 370/375/380/XP thermal management
|
||||
|
||||
Required properties:
|
||||
|
||||
- compatible: Should be set to one of the following:
|
||||
marvell,armada370-thermal
|
||||
marvell,armada375-thermal
|
||||
marvell,armada375-z1-thermal
|
||||
marvell,armada380-thermal
|
||||
marvell,armadaxp-thermal
|
||||
|
||||
Note: As the name suggests, "marvell,armada375-z1-thermal"
|
||||
applies for the SoC Z1 stepping only. On such stepping
|
||||
some quirks need to be done and the register offset differs
|
||||
from the one in the A0 stepping.
|
||||
The operating system may auto-detect the SoC stepping and
|
||||
update the compatible and register offsets at runtime.
|
||||
|
||||
- reg: Device's register space.
|
||||
Two entries are expected, see the examples below.
|
||||
The first one is required for the sensor register;
|
||||
|
|
|
@ -6,16 +6,35 @@
|
|||
"samsung,exynos4412-tmu"
|
||||
"samsung,exynos4210-tmu"
|
||||
"samsung,exynos5250-tmu"
|
||||
"samsung,exynos5260-tmu"
|
||||
"samsung,exynos5420-tmu" for TMU channel 0, 1 on Exynos5420
|
||||
"samsung,exynos5420-tmu-ext-triminfo" for TMU channels 2, 3 and 4
|
||||
Exynos5420 (Must pass triminfo base and triminfo clock)
|
||||
"samsung,exynos5440-tmu"
|
||||
- interrupt-parent : The phandle for the interrupt controller
|
||||
- reg : Address range of the thermal registers. For soc's which has multiple
|
||||
instances of TMU and some registers are shared across all TMU's like
|
||||
interrupt related then 2 set of register has to supplied. First set
|
||||
belongs to each instance of TMU and second set belongs to common TMU
|
||||
registers.
|
||||
belongs to register set of TMU instance and second set belongs to
|
||||
registers shared with the TMU instance.
|
||||
|
||||
NOTE: On Exynos5420, the TRIMINFO register is misplaced for TMU
|
||||
channels 2, 3 and 4
|
||||
Use "samsung,exynos5420-tmu-ext-triminfo" in cases, there is a misplaced
|
||||
register, also provide clock to access that base.
|
||||
|
||||
TRIMINFO at 0x1006c000 contains data for TMU channel 3
|
||||
TRIMINFO at 0x100a0000 contains data for TMU channel 4
|
||||
TRIMINFO at 0x10068000 contains data for TMU channel 2
|
||||
|
||||
- interrupts : Should contain interrupt for thermal system
|
||||
- clocks : The main clock for TMU device
|
||||
- clocks : The main clocks for TMU device
|
||||
-- 1. operational clock for TMU channel
|
||||
-- 2. optional clock to access the shared registers of TMU channel
|
||||
- clock-names : Thermal system clock name
|
||||
-- "tmu_apbif" operational clock for current TMU channel
|
||||
-- "tmu_triminfo_apbif" clock to access the shared triminfo register
|
||||
for current TMU channel
|
||||
- vtmu-supply: This entry is optional and provides the regulator node supplying
|
||||
voltage to TMU. If needed this entry can be placed inside
|
||||
board/platform specific dts file.
|
||||
|
@ -43,6 +62,31 @@ Example 2):
|
|||
clock-names = "tmu_apbif";
|
||||
};
|
||||
|
||||
Example 3): (In case of Exynos5420 "with misplaced TRIMINFO register")
|
||||
tmu_cpu2: tmu@10068000 {
|
||||
compatible = "samsung,exynos5420-tmu-ext-triminfo";
|
||||
reg = <0x10068000 0x100>, <0x1006c000 0x4>;
|
||||
interrupts = <0 184 0>;
|
||||
clocks = <&clock 318>, <&clock 318>;
|
||||
clock-names = "tmu_apbif", "tmu_triminfo_apbif";
|
||||
};
|
||||
|
||||
tmu_cpu3: tmu@1006c000 {
|
||||
compatible = "samsung,exynos5420-tmu-ext-triminfo";
|
||||
reg = <0x1006c000 0x100>, <0x100a0000 0x4>;
|
||||
interrupts = <0 185 0>;
|
||||
clocks = <&clock 318>, <&clock 319>;
|
||||
clock-names = "tmu_apbif", "tmu_triminfo_apbif";
|
||||
};
|
||||
|
||||
tmu_gpu: tmu@100a0000 {
|
||||
compatible = "samsung,exynos5420-tmu-ext-triminfo";
|
||||
reg = <0x100a0000 0x100>, <0x10068000 0x4>;
|
||||
interrupts = <0 215 0>;
|
||||
clocks = <&clock 319>, <&clock 318>;
|
||||
clock-names = "tmu_apbif", "tmu_triminfo_apbif";
|
||||
};
|
||||
|
||||
Note: For multi-instance tmu each instance should have an alias correctly
|
||||
numbered in "aliases" node.
|
||||
|
||||
|
|
|
@ -62,6 +62,10 @@ Optional properties for dp-controller:
|
|||
-hsync-active-high:
|
||||
HSYNC polarity configuration.
|
||||
High if defined, Low if not defined
|
||||
-samsung,hpd-gpio:
|
||||
Hotplug detect GPIO.
|
||||
Indicates which GPIO should be used for hotplug
|
||||
detection
|
||||
|
||||
Example:
|
||||
|
||||
|
|
|
@ -5,6 +5,7 @@ Required properties:
|
|||
1) "samsung,exynos5-hdmi" <DEPRECATED>
|
||||
2) "samsung,exynos4210-hdmi"
|
||||
3) "samsung,exynos4212-hdmi"
|
||||
4) "samsung,exynos5420-hdmi"
|
||||
- reg: physical base address of the hdmi and length of memory mapped
|
||||
region.
|
||||
- interrupts: interrupt number to the cpu.
|
||||
|
@ -27,6 +28,7 @@ Required properties:
|
|||
"hdmi", "sclk_hdmi", "sclk_pixel", "sclk_hdmiphy" and "mout_hdmi".
|
||||
- ddc: phandle to the hdmi ddc node
|
||||
- phy: phandle to the hdmi phy node
|
||||
- samsung,syscon-phandle: phandle for system controller node for PMU.
|
||||
|
||||
Example:
|
||||
|
||||
|
@ -37,4 +39,5 @@ Example:
|
|||
hpd-gpio = <&gpx3 7 1>;
|
||||
ddc = <&hdmi_ddc_node>;
|
||||
phy = <&hdmi_phy_node>;
|
||||
samsung,syscon-phandle = <&pmu_system_controller>;
|
||||
};
|
||||
|
|
|
@ -318,3 +318,8 @@ GPIO
|
|||
devm_gpiod_get_optional()
|
||||
devm_gpiod_get_index_optional()
|
||||
devm_gpiod_put()
|
||||
|
||||
MDIO
|
||||
devm_mdiobus_alloc()
|
||||
devm_mdiobus_alloc_size()
|
||||
devm_mdiobus_free()
|
||||
|
|
|
@ -196,8 +196,7 @@ prototypes:
|
|||
void (*invalidatepage) (struct page *, unsigned int, unsigned int);
|
||||
int (*releasepage) (struct page *, int);
|
||||
void (*freepage)(struct page *);
|
||||
int (*direct_IO)(int, struct kiocb *, const struct iovec *iov,
|
||||
loff_t offset, unsigned long nr_segs);
|
||||
int (*direct_IO)(int, struct kiocb *, struct iov_iter *iter, loff_t offset);
|
||||
int (*get_xip_mem)(struct address_space *, pgoff_t, int, void **,
|
||||
unsigned long *);
|
||||
int (*migratepage)(struct address_space *, struct page *, struct page *);
|
||||
|
@ -431,6 +430,8 @@ prototypes:
|
|||
ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
|
||||
ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);
|
||||
ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t);
|
||||
ssize_t (*read_iter) (struct kiocb *, struct iov_iter *);
|
||||
ssize_t (*write_iter) (struct kiocb *, struct iov_iter *);
|
||||
int (*iterate) (struct file *, struct dir_context *);
|
||||
unsigned int (*poll) (struct file *, struct poll_table_struct *);
|
||||
long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
|
||||
|
|
|
@ -589,8 +589,7 @@ struct address_space_operations {
|
|||
void (*invalidatepage) (struct page *, unsigned int, unsigned int);
|
||||
int (*releasepage) (struct page *, int);
|
||||
void (*freepage)(struct page *);
|
||||
ssize_t (*direct_IO)(int, struct kiocb *, const struct iovec *iov,
|
||||
loff_t offset, unsigned long nr_segs);
|
||||
ssize_t (*direct_IO)(int, struct kiocb *, struct iov_iter *iter, loff_t offset);
|
||||
struct page* (*get_xip_page)(struct address_space *, sector_t,
|
||||
int);
|
||||
/* migrate the contents of a page to the specified target */
|
||||
|
@ -807,6 +806,8 @@ struct file_operations {
|
|||
ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
|
||||
ssize_t (*aio_read) (struct kiocb *, const struct iovec *, unsigned long, loff_t);
|
||||
ssize_t (*aio_write) (struct kiocb *, const struct iovec *, unsigned long, loff_t);
|
||||
ssize_t (*read_iter) (struct kiocb *, struct iov_iter *);
|
||||
ssize_t (*write_iter) (struct kiocb *, struct iov_iter *);
|
||||
int (*iterate) (struct file *, struct dir_context *);
|
||||
unsigned int (*poll) (struct file *, struct poll_table_struct *);
|
||||
long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
|
||||
|
@ -837,11 +838,15 @@ otherwise noted.
|
|||
|
||||
read: called by read(2) and related system calls
|
||||
|
||||
aio_read: called by io_submit(2) and other asynchronous I/O operations
|
||||
aio_read: vectored, possibly asynchronous read
|
||||
|
||||
read_iter: possibly asynchronous read with iov_iter as destination
|
||||
|
||||
write: called by write(2) and related system calls
|
||||
|
||||
aio_write: called by io_submit(2) and other asynchronous I/O operations
|
||||
aio_write: vectored, possibly asynchronous write
|
||||
|
||||
write_iter: possibly asynchronous write with iov_iter as source
|
||||
|
||||
iterate: called when the VFS needs to read the directory contents
|
||||
|
||||
|
|
|
@ -0,0 +1,43 @@
|
|||
Kernel driver shtc1
|
||||
===================
|
||||
|
||||
Supported chips:
|
||||
* Sensirion SHTC1
|
||||
Prefix: 'shtc1'
|
||||
Addresses scanned: none
|
||||
Datasheet: http://www.sensirion.com/file/datasheet_shtc1
|
||||
|
||||
* Sensirion SHTW1
|
||||
Prefix: 'shtw1'
|
||||
Addresses scanned: none
|
||||
Datasheet: Not publicly available
|
||||
|
||||
Author:
|
||||
Johannes Winkelmann <johannes.winkelmann@sensirion.com>
|
||||
|
||||
Description
|
||||
-----------
|
||||
|
||||
This driver implements support for the Sensirion SHTC1 chip, a humidity and
|
||||
temperature sensor. Temperature is measured in degrees celsius, relative
|
||||
humidity is expressed as a percentage. Driver can be used as well for SHTW1
|
||||
chip, which has the same electrical interface.
|
||||
|
||||
The device communicates with the I2C protocol. All sensors are set to I2C
|
||||
address 0x70. See Documentation/i2c/instantiating-devices for methods to
|
||||
instantiate the device.
|
||||
|
||||
There are two options configurable by means of shtc1_platform_data:
|
||||
1. blocking (pull the I2C clock line down while performing the measurement) or
|
||||
non-blocking mode. Blocking mode will guarantee the fastest result but
|
||||
the I2C bus will be busy during that time. By default, non-blocking mode
|
||||
is used. Make sure clock-stretching works properly on your device if you
|
||||
want to use blocking mode.
|
||||
2. high or low accuracy. High accuracy is used by default and using it is
|
||||
strongly recommended.
|
||||
|
||||
sysfs-Interface
|
||||
---------------
|
||||
|
||||
temp1_input - temperature input
|
||||
humidity1_input - humidity input
|
|
@ -470,7 +470,7 @@ build.
|
|||
|
||||
Sometimes, an external module uses exported symbols from
|
||||
another external module. kbuild needs to have full knowledge of
|
||||
all symbols to avoid spliitting out warnings about undefined
|
||||
all symbols to avoid spitting out warnings about undefined
|
||||
symbols. Three solutions exist for this situation.
|
||||
|
||||
NOTE: The method with a top-level kbuild file is recommended
|
||||
|
|
|
@ -1,27 +1,37 @@
|
|||
Kernel Parameters
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
The following is a consolidated list of the kernel parameters as implemented
|
||||
(mostly) by the __setup() macro and sorted into English Dictionary order
|
||||
(defined as ignoring all punctuation and sorting digits before letters in a
|
||||
case insensitive manner), and with descriptions where known.
|
||||
The following is a consolidated list of the kernel parameters as
|
||||
implemented by the __setup(), core_param() and module_param() macros
|
||||
and sorted into English Dictionary order (defined as ignoring all
|
||||
punctuation and sorting digits before letters in a case insensitive
|
||||
manner), and with descriptions where known.
|
||||
|
||||
Module parameters for loadable modules are specified only as the
|
||||
parameter name with optional '=' and value as appropriate, such as:
|
||||
The kernel parses parameters from the kernel command line up to "--";
|
||||
if it doesn't recognize a parameter and it doesn't contain a '.', the
|
||||
parameter gets passed to init: parameters with '=' go into init's
|
||||
environment, others are passed as command line arguments to init.
|
||||
Everything after "--" is passed as an argument to init.
|
||||
|
||||
modprobe usbcore blinkenlights=1
|
||||
Module parameters can be specified in two ways: via the kernel command
|
||||
line with a module name prefix, or via modprobe, e.g.:
|
||||
|
||||
Module parameters for modules that are built into the kernel image
|
||||
are specified on the kernel command line with the module name plus
|
||||
'.' plus parameter name, with '=' and value if appropriate, such as:
|
||||
(kernel command line) usbcore.blinkenlights=1
|
||||
(modprobe command line) modprobe usbcore blinkenlights=1
|
||||
|
||||
usbcore.blinkenlights=1
|
||||
Parameters for modules which are built into the kernel need to be
|
||||
specified on the kernel command line. modprobe looks through the
|
||||
kernel command line (/proc/cmdline) and collects module parameters
|
||||
when it loads a module, so the kernel command line can be used for
|
||||
loadable modules too.
|
||||
|
||||
Hyphens (dashes) and underscores are equivalent in parameter names, so
|
||||
log_buf_len=1M print-fatal-signals=1
|
||||
can also be entered as
|
||||
log-buf-len=1M print_fatal_signals=1
|
||||
|
||||
Double-quotes can be used to protect spaces in values, e.g.:
|
||||
param="spaces in here"
|
||||
|
||||
This document may not be entirely up to date and comprehensive. The command
|
||||
"modinfo -p ${modulename}" shows a current list of all parameters of a loadable
|
||||
|
|
|
@ -22,8 +22,9 @@ Appendix B: The kprobes sysctl interface
|
|||
|
||||
Kprobes enables you to dynamically break into any kernel routine and
|
||||
collect debugging and performance information non-disruptively. You
|
||||
can trap at almost any kernel code address, specifying a handler
|
||||
can trap at almost any kernel code address(*), specifying a handler
|
||||
routine to be invoked when the breakpoint is hit.
|
||||
(*: some parts of the kernel code can not be trapped, see 1.5 Blacklist)
|
||||
|
||||
There are currently three types of probes: kprobes, jprobes, and
|
||||
kretprobes (also called return probes). A kprobe can be inserted
|
||||
|
@ -273,6 +274,19 @@ using one of the following techniques:
|
|||
or
|
||||
- Execute 'sysctl -w debug.kprobes_optimization=n'
|
||||
|
||||
1.5 Blacklist
|
||||
|
||||
Kprobes can probe most of the kernel except itself. This means
|
||||
that there are some functions where kprobes cannot probe. Probing
|
||||
(trapping) such functions can cause a recursive trap (e.g. double
|
||||
fault) or the nested probe handler may never be called.
|
||||
Kprobes manages such functions as a blacklist.
|
||||
If you want to add a function into the blacklist, you just need
|
||||
to (1) include linux/kprobes.h and (2) use NOKPROBE_SYMBOL() macro
|
||||
to specify a blacklisted function.
|
||||
Kprobes checks the given probe address against the blacklist and
|
||||
rejects registering it, if the given address is in the blacklist.
|
||||
|
||||
2. Architectures Supported
|
||||
|
||||
Kprobes, jprobes, and return probes are implemented on the following
|
||||
|
|
|
@ -1,139 +1,157 @@
|
|||
Generic Mutex Subsystem
|
||||
|
||||
started by Ingo Molnar <mingo@redhat.com>
|
||||
updated by Davidlohr Bueso <davidlohr@hp.com>
|
||||
|
||||
"Why on earth do we need a new mutex subsystem, and what's wrong
|
||||
with semaphores?"
|
||||
What are mutexes?
|
||||
-----------------
|
||||
|
||||
firstly, there's nothing wrong with semaphores. But if the simpler
|
||||
mutex semantics are sufficient for your code, then there are a couple
|
||||
of advantages of mutexes:
|
||||
In the Linux kernel, mutexes refer to a particular locking primitive
|
||||
that enforces serialization on shared memory systems, and not only to
|
||||
the generic term referring to 'mutual exclusion' found in academia
|
||||
or similar theoretical text books. Mutexes are sleeping locks which
|
||||
behave similarly to binary semaphores, and were introduced in 2006[1]
|
||||
as an alternative to these. This new data structure provided a number
|
||||
of advantages, including simpler interfaces, and at that time smaller
|
||||
code (see Disadvantages).
|
||||
|
||||
- 'struct mutex' is smaller on most architectures: E.g. on x86,
|
||||
'struct semaphore' is 20 bytes, 'struct mutex' is 16 bytes.
|
||||
A smaller structure size means less RAM footprint, and better
|
||||
CPU-cache utilization.
|
||||
[1] http://lwn.net/Articles/164802/
|
||||
|
||||
- tighter code. On x86 i get the following .text sizes when
|
||||
switching all mutex-alike semaphores in the kernel to the mutex
|
||||
subsystem:
|
||||
Implementation
|
||||
--------------
|
||||
|
||||
text data bss dec hex filename
|
||||
3280380 868188 396860 4545428 455b94 vmlinux-semaphore
|
||||
3255329 865296 396732 4517357 44eded vmlinux-mutex
|
||||
Mutexes are represented by 'struct mutex', defined in include/linux/mutex.h
|
||||
and implemented in kernel/locking/mutex.c. These locks use a three
|
||||
state atomic counter (->count) to represent the different possible
|
||||
transitions that can occur during the lifetime of a lock:
|
||||
|
||||
that's 25051 bytes of code saved, or a 0.76% win - off the hottest
|
||||
codepaths of the kernel. (The .data savings are 2892 bytes, or 0.33%)
|
||||
Smaller code means better icache footprint, which is one of the
|
||||
major optimization goals in the Linux kernel currently.
|
||||
1: unlocked
|
||||
0: locked, no waiters
|
||||
negative: locked, with potential waiters
|
||||
|
||||
- the mutex subsystem is slightly faster and has better scalability for
|
||||
contended workloads. On an 8-way x86 system, running a mutex-based
|
||||
kernel and testing creat+unlink+close (of separate, per-task files)
|
||||
in /tmp with 16 parallel tasks, the average number of ops/sec is:
|
||||
In its most basic form it also includes a wait-queue and a spinlock
|
||||
that serializes access to it. CONFIG_SMP systems can also include
|
||||
a pointer to the lock task owner (->owner) as well as a spinner MCS
|
||||
lock (->osq), both described below in (ii).
|
||||
|
||||
Semaphores: Mutexes:
|
||||
When acquiring a mutex, there are three possible paths that can be
|
||||
taken, depending on the state of the lock:
|
||||
|
||||
$ ./test-mutex V 16 10 $ ./test-mutex V 16 10
|
||||
8 CPUs, running 16 tasks. 8 CPUs, running 16 tasks.
|
||||
checking VFS performance. checking VFS performance.
|
||||
avg loops/sec: 34713 avg loops/sec: 84153
|
||||
CPU utilization: 63% CPU utilization: 22%
|
||||
(i) fastpath: tries to atomically acquire the lock by decrementing the
|
||||
counter. If it was already taken by another task it goes to the next
|
||||
possible path. This logic is architecture specific. On x86-64, the
|
||||
locking fastpath is 2 instructions:
|
||||
|
||||
i.e. in this workload, the mutex based kernel was 2.4 times faster
|
||||
than the semaphore based kernel, _and_ it also had 2.8 times less CPU
|
||||
utilization. (In terms of 'ops per CPU cycle', the semaphore kernel
|
||||
performed 551 ops/sec per 1% of CPU time used, while the mutex kernel
|
||||
performed 3825 ops/sec per 1% of CPU time used - it was 6.9 times
|
||||
more efficient.)
|
||||
|
||||
the scalability difference is visible even on a 2-way P4 HT box:
|
||||
|
||||
Semaphores: Mutexes:
|
||||
|
||||
$ ./test-mutex V 16 10 $ ./test-mutex V 16 10
|
||||
4 CPUs, running 16 tasks. 8 CPUs, running 16 tasks.
|
||||
checking VFS performance. checking VFS performance.
|
||||
avg loops/sec: 127659 avg loops/sec: 181082
|
||||
CPU utilization: 100% CPU utilization: 34%
|
||||
|
||||
(the straight performance advantage of mutexes is 41%, the per-cycle
|
||||
efficiency of mutexes is 4.1 times better.)
|
||||
|
||||
- there are no fastpath tradeoffs, the mutex fastpath is just as tight
|
||||
as the semaphore fastpath. On x86, the locking fastpath is 2
|
||||
instructions:
|
||||
|
||||
c0377ccb <mutex_lock>:
|
||||
c0377ccb: f0 ff 08 lock decl (%eax)
|
||||
c0377cce: 78 0e js c0377cde <.text..lock.mutex>
|
||||
c0377cd0: c3 ret
|
||||
0000000000000e10 <mutex_lock>:
|
||||
e21: f0 ff 0b lock decl (%rbx)
|
||||
e24: 79 08 jns e2e <mutex_lock+0x1e>
|
||||
|
||||
the unlocking fastpath is equally tight:
|
||||
|
||||
c0377cd1 <mutex_unlock>:
|
||||
c0377cd1: f0 ff 00 lock incl (%eax)
|
||||
c0377cd4: 7e 0f jle c0377ce5 <.text..lock.mutex+0x7>
|
||||
c0377cd6: c3 ret
|
||||
0000000000000bc0 <mutex_unlock>:
|
||||
bc8: f0 ff 07 lock incl (%rdi)
|
||||
bcb: 7f 0a jg bd7 <mutex_unlock+0x17>
|
||||
|
||||
- 'struct mutex' semantics are well-defined and are enforced if
|
||||
CONFIG_DEBUG_MUTEXES is turned on. Semaphores on the other hand have
|
||||
virtually no debugging code or instrumentation. The mutex subsystem
|
||||
checks and enforces the following rules:
|
||||
|
||||
* - only one task can hold the mutex at a time
|
||||
* - only the owner can unlock the mutex
|
||||
* - multiple unlocks are not permitted
|
||||
* - recursive locking is not permitted
|
||||
* - a mutex object must be initialized via the API
|
||||
* - a mutex object must not be initialized via memset or copying
|
||||
* - task may not exit with mutex held
|
||||
* - memory areas where held locks reside must not be freed
|
||||
* - held mutexes must not be reinitialized
|
||||
* - mutexes may not be used in hardware or software interrupt
|
||||
* contexts such as tasklets and timers
|
||||
(ii) midpath: aka optimistic spinning, tries to spin for acquisition
|
||||
while the lock owner is running and there are no other tasks ready
|
||||
to run that have higher priority (need_resched). The rationale is
|
||||
that if the lock owner is running, it is likely to release the lock
|
||||
soon. The mutex spinners are queued up using MCS lock so that only
|
||||
one spinner can compete for the mutex.
|
||||
|
||||
furthermore, there are also convenience features in the debugging
|
||||
code:
|
||||
The MCS lock (proposed by Mellor-Crummey and Scott) is a simple spinlock
|
||||
with the desirable properties of being fair and with each cpu trying
|
||||
to acquire the lock spinning on a local variable. It avoids expensive
|
||||
cacheline bouncing that common test-and-set spinlock implementations
|
||||
incur. An MCS-like lock is specially tailored for optimistic spinning
|
||||
for sleeping lock implementation. An important feature of the customized
|
||||
MCS lock is that it has the extra property that spinners are able to exit
|
||||
the MCS spinlock queue when they need to reschedule. This further helps
|
||||
avoid situations where MCS spinners that need to reschedule would continue
|
||||
waiting to spin on mutex owner, only to go directly to slowpath upon
|
||||
obtaining the MCS lock.
|
||||
|
||||
* - uses symbolic names of mutexes, whenever they are printed in debug output
|
||||
* - point-of-acquire tracking, symbolic lookup of function names
|
||||
* - list of all locks held in the system, printout of them
|
||||
* - owner tracking
|
||||
* - detects self-recursing locks and prints out all relevant info
|
||||
* - detects multi-task circular deadlocks and prints out all affected
|
||||
* locks and tasks (and only those tasks)
|
||||
|
||||
(iii) slowpath: last resort, if the lock is still unable to be acquired,
|
||||
the task is added to the wait-queue and sleeps until woken up by the
|
||||
unlock path. Under normal circumstances it blocks as TASK_UNINTERRUPTIBLE.
|
||||
|
||||
While formally kernel mutexes are sleepable locks, it is path (ii) that
|
||||
makes them more practically a hybrid type. By simply not interrupting a
|
||||
task and busy-waiting for a few cycles instead of immediately sleeping,
|
||||
the performance of this lock has been seen to significantly improve a
|
||||
number of workloads. Note that this technique is also used for rw-semaphores.
|
||||
|
||||
Semantics
|
||||
---------
|
||||
|
||||
The mutex subsystem checks and enforces the following rules:
|
||||
|
||||
- Only one task can hold the mutex at a time.
|
||||
- Only the owner can unlock the mutex.
|
||||
- Multiple unlocks are not permitted.
|
||||
- Recursive locking/unlocking is not permitted.
|
||||
- A mutex must only be initialized via the API (see below).
|
||||
- A task may not exit with a mutex held.
|
||||
- Memory areas where held locks reside must not be freed.
|
||||
- Held mutexes must not be reinitialized.
|
||||
- Mutexes may not be used in hardware or software interrupt
|
||||
contexts such as tasklets and timers.
|
||||
|
||||
These semantics are fully enforced when CONFIG DEBUG_MUTEXES is enabled.
|
||||
In addition, the mutex debugging code also implements a number of other
|
||||
features that make lock debugging easier and faster:
|
||||
|
||||
- Uses symbolic names of mutexes, whenever they are printed
|
||||
in debug output.
|
||||
- Point-of-acquire tracking, symbolic lookup of function names,
|
||||
list of all locks held in the system, printout of them.
|
||||
- Owner tracking.
|
||||
- Detects self-recursing locks and prints out all relevant info.
|
||||
- Detects multi-task circular deadlocks and prints out all affected
|
||||
locks and tasks (and only those tasks).
|
||||
|
||||
|
||||
Interfaces
|
||||
----------
|
||||
Statically define the mutex:
|
||||
DEFINE_MUTEX(name);
|
||||
|
||||
Dynamically initialize the mutex:
|
||||
mutex_init(mutex);
|
||||
|
||||
Acquire the mutex, uninterruptible:
|
||||
void mutex_lock(struct mutex *lock);
|
||||
void mutex_lock_nested(struct mutex *lock, unsigned int subclass);
|
||||
int mutex_trylock(struct mutex *lock);
|
||||
|
||||
Acquire the mutex, interruptible:
|
||||
int mutex_lock_interruptible_nested(struct mutex *lock,
|
||||
unsigned int subclass);
|
||||
int mutex_lock_interruptible(struct mutex *lock);
|
||||
|
||||
Acquire the mutex, interruptible, if dec to 0:
|
||||
int atomic_dec_and_mutex_lock(atomic_t *cnt, struct mutex *lock);
|
||||
|
||||
Unlock the mutex:
|
||||
void mutex_unlock(struct mutex *lock);
|
||||
|
||||
Test if the mutex is taken:
|
||||
int mutex_is_locked(struct mutex *lock);
|
||||
|
||||
Disadvantages
|
||||
-------------
|
||||
|
||||
The stricter mutex API means you cannot use mutexes the same way you
|
||||
can use semaphores: e.g. they cannot be used from an interrupt context,
|
||||
nor can they be unlocked from a different context that which acquired
|
||||
it. [ I'm not aware of any other (e.g. performance) disadvantages from
|
||||
using mutexes at the moment, please let me know if you find any. ]
|
||||
Unlike its original design and purpose, 'struct mutex' is larger than
|
||||
most locks in the kernel. E.g: on x86-64 it is 40 bytes, almost twice
|
||||
as large as 'struct semaphore' (24 bytes) and 8 bytes shy of the
|
||||
'struct rw_semaphore' variant. Larger structure sizes mean more CPU
|
||||
cache and memory footprint.
|
||||
|
||||
Implementation of mutexes
|
||||
-------------------------
|
||||
When to use mutexes
|
||||
-------------------
|
||||
|
||||
'struct mutex' is the new mutex type, defined in include/linux/mutex.h and
|
||||
implemented in kernel/locking/mutex.c. It is a counter-based mutex with a
|
||||
spinlock and a wait-list. The counter has 3 states: 1 for "unlocked", 0 for
|
||||
"locked" and negative numbers (usually -1) for "locked, potential waiters
|
||||
queued".
|
||||
|
||||
the APIs of 'struct mutex' have been streamlined:
|
||||
|
||||
DEFINE_MUTEX(name);
|
||||
|
||||
mutex_init(mutex);
|
||||
|
||||
void mutex_lock(struct mutex *lock);
|
||||
int mutex_lock_interruptible(struct mutex *lock);
|
||||
int mutex_trylock(struct mutex *lock);
|
||||
void mutex_unlock(struct mutex *lock);
|
||||
int mutex_is_locked(struct mutex *lock);
|
||||
void mutex_lock_nested(struct mutex *lock, unsigned int subclass);
|
||||
int mutex_lock_interruptible_nested(struct mutex *lock,
|
||||
unsigned int subclass);
|
||||
int atomic_dec_and_mutex_lock(atomic_t *cnt, struct mutex *lock);
|
||||
Unless the strict semantics of mutexes are unsuitable and/or the critical
|
||||
region prevents the lock from being shared, always prefer them to any other
|
||||
locking primitive.
|
||||
|
|
|
@ -585,13 +585,19 @@ mode
|
|||
balance-tlb or 5
|
||||
|
||||
Adaptive transmit load balancing: channel bonding that
|
||||
does not require any special switch support. The
|
||||
outgoing traffic is distributed according to the
|
||||
current load (computed relative to the speed) on each
|
||||
slave. Incoming traffic is received by the current
|
||||
slave. If the receiving slave fails, another slave
|
||||
takes over the MAC address of the failed receiving
|
||||
slave.
|
||||
does not require any special switch support.
|
||||
|
||||
In tlb_dynamic_lb=1 mode; the outgoing traffic is
|
||||
distributed according to the current load (computed
|
||||
relative to the speed) on each slave.
|
||||
|
||||
In tlb_dynamic_lb=0 mode; the load balancing based on
|
||||
current load is disabled and the load is distributed
|
||||
only using the hash distribution.
|
||||
|
||||
Incoming traffic is received by the current slave.
|
||||
If the receiving slave fails, another slave takes over
|
||||
the MAC address of the failed receiving slave.
|
||||
|
||||
Prerequisite:
|
||||
|
||||
|
@ -736,6 +742,28 @@ primary_reselect
|
|||
|
||||
This option was added for bonding version 3.6.0.
|
||||
|
||||
tlb_dynamic_lb
|
||||
|
||||
Specifies if dynamic shuffling of flows is enabled in tlb
|
||||
mode. The value has no effect on any other modes.
|
||||
|
||||
The default behavior of tlb mode is to shuffle active flows across
|
||||
slaves based on the load in that interval. This gives nice lb
|
||||
characteristics but can cause packet reordering. If re-ordering is
|
||||
a concern use this variable to disable flow shuffling and rely on
|
||||
load balancing provided solely by the hash distribution.
|
||||
xmit-hash-policy can be used to select the appropriate hashing for
|
||||
the setup.
|
||||
|
||||
The sysfs entry can be used to change the setting per bond device
|
||||
and the initial value is derived from the module parameter. The
|
||||
sysfs entry is allowed to be changed only if the bond device is
|
||||
down.
|
||||
|
||||
The default value is "1" that enables flow shuffling while value "0"
|
||||
disables it. This option was added in bonding driver 3.7.1
|
||||
|
||||
|
||||
updelay
|
||||
|
||||
Specifies the time, in milliseconds, to wait before enabling a
|
||||
|
@ -769,7 +797,7 @@ use_carrier
|
|||
xmit_hash_policy
|
||||
|
||||
Selects the transmit hash policy to use for slave selection in
|
||||
balance-xor and 802.3ad modes. Possible values are:
|
||||
balance-xor, 802.3ad, and tlb modes. Possible values are:
|
||||
|
||||
layer2
|
||||
|
||||
|
|
|
@ -469,6 +469,41 @@ solution for a couple of reasons:
|
|||
having this 'send only' use-case we may remove the receive list in the
|
||||
Kernel to save a little (really a very little!) CPU usage.
|
||||
|
||||
4.1.1.1 CAN filter usage optimisation
|
||||
|
||||
The CAN filters are processed in per-device filter lists at CAN frame
|
||||
reception time. To reduce the number of checks that need to be performed
|
||||
while walking through the filter lists the CAN core provides an optimized
|
||||
filter handling when the filter subscription focusses on a single CAN ID.
|
||||
|
||||
For the possible 2048 SFF CAN identifiers the identifier is used as an index
|
||||
to access the corresponding subscription list without any further checks.
|
||||
For the 2^29 possible EFF CAN identifiers a 10 bit XOR folding is used as
|
||||
hash function to retrieve the EFF table index.
|
||||
|
||||
To benefit from the optimized filters for single CAN identifiers the
|
||||
CAN_SFF_MASK or CAN_EFF_MASK have to be set into can_filter.mask together
|
||||
with set CAN_EFF_FLAG and CAN_RTR_FLAG bits. A set CAN_EFF_FLAG bit in the
|
||||
can_filter.mask makes clear that it matters whether a SFF or EFF CAN ID is
|
||||
subscribed. E.g. in the example from above
|
||||
|
||||
rfilter[0].can_id = 0x123;
|
||||
rfilter[0].can_mask = CAN_SFF_MASK;
|
||||
|
||||
both SFF frames with CAN ID 0x123 and EFF frames with 0xXXXXX123 can pass.
|
||||
|
||||
To filter for only 0x123 (SFF) and 0x12345678 (EFF) CAN identifiers the
|
||||
filter has to be defined in this way to benefit from the optimized filters:
|
||||
|
||||
struct can_filter rfilter[2];
|
||||
|
||||
rfilter[0].can_id = 0x123;
|
||||
rfilter[0].can_mask = (CAN_EFF_FLAG | CAN_RTR_FLAG | CAN_SFF_MASK);
|
||||
rfilter[1].can_id = 0x12345678 | CAN_EFF_FLAG;
|
||||
rfilter[1].can_mask = (CAN_EFF_FLAG | CAN_RTR_FLAG | CAN_EFF_MASK);
|
||||
|
||||
setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter, sizeof(rfilter));
|
||||
|
||||
4.1.2 RAW socket option CAN_RAW_ERR_FILTER
|
||||
|
||||
As described in chapter 3.4 the CAN interface driver can generate so
|
||||
|
|
|
@ -0,0 +1,339 @@
|
|||
cdc_mbim - Driver for CDC MBIM Mobile Broadband modems
|
||||
========================================================
|
||||
|
||||
The cdc_mbim driver supports USB devices conforming to the "Universal
|
||||
Serial Bus Communications Class Subclass Specification for Mobile
|
||||
Broadband Interface Model" [1], which is a further development of
|
||||
"Universal Serial Bus Communications Class Subclass Specifications for
|
||||
Network Control Model Devices" [2] optimized for Mobile Broadband
|
||||
devices, aka "3G/LTE modems".
|
||||
|
||||
|
||||
Command Line Parameters
|
||||
=======================
|
||||
|
||||
The cdc_mbim driver has no parameters of its own. But the probing
|
||||
behaviour for NCM 1.0 backwards compatible MBIM functions (an
|
||||
"NCM/MBIM function" as defined in section 3.2 of [1]) is affected
|
||||
by a cdc_ncm driver parameter:
|
||||
|
||||
prefer_mbim
|
||||
-----------
|
||||
Type: Boolean
|
||||
Valid Range: N/Y (0-1)
|
||||
Default Value: Y (MBIM is preferred)
|
||||
|
||||
This parameter sets the system policy for NCM/MBIM functions. Such
|
||||
functions will be handled by either the cdc_ncm driver or the cdc_mbim
|
||||
driver depending on the prefer_mbim setting. Setting prefer_mbim=N
|
||||
makes the cdc_mbim driver ignore these functions and lets the cdc_ncm
|
||||
driver handle them instead.
|
||||
|
||||
The parameter is writable, and can be changed at any time. A manual
|
||||
unbind/bind is required to make the change effective for NCM/MBIM
|
||||
functions bound to the "wrong" driver
|
||||
|
||||
|
||||
Basic usage
|
||||
===========
|
||||
|
||||
MBIM functions are inactive when unmanaged. The cdc_mbim driver only
|
||||
provides an userspace interface to the MBIM control channel, and will
|
||||
not participate in the management of the function. This implies that a
|
||||
userspace MBIM management application always is required to enable a
|
||||
MBIM function.
|
||||
|
||||
Such userspace applications includes, but are not limited to:
|
||||
- mbimcli (included with the libmbim [3] library), and
|
||||
- ModemManager [4]
|
||||
|
||||
Establishing a MBIM IP session reequires at least these actions by the
|
||||
management application:
|
||||
- open the control channel
|
||||
- configure network connection settings
|
||||
- connect to network
|
||||
- configure IP interface
|
||||
|
||||
Management application development
|
||||
----------------------------------
|
||||
The driver <-> userspace interfaces are described below. The MBIM
|
||||
control channel protocol is described in [1].
|
||||
|
||||
|
||||
MBIM control channel userspace ABI
|
||||
==================================
|
||||
|
||||
/dev/cdc-wdmX character device
|
||||
------------------------------
|
||||
The driver creates a two-way pipe to the MBIM function control channel
|
||||
using the cdc-wdm driver as a subdriver. The userspace end of the
|
||||
control channel pipe is a /dev/cdc-wdmX character device.
|
||||
|
||||
The cdc_mbim driver does not process or police messages on the control
|
||||
channel. The channel is fully delegated to the userspace management
|
||||
application. It is therefore up to this application to ensure that it
|
||||
complies with all the control channel requirements in [1].
|
||||
|
||||
The cdc-wdmX device is created as a child of the MBIM control
|
||||
interface USB device. The character device associated with a specific
|
||||
MBIM function can be looked up using sysfs. For example:
|
||||
|
||||
bjorn@nemi:~$ ls /sys/bus/usb/drivers/cdc_mbim/2-4:2.12/usbmisc
|
||||
cdc-wdm0
|
||||
|
||||
bjorn@nemi:~$ grep . /sys/bus/usb/drivers/cdc_mbim/2-4:2.12/usbmisc/cdc-wdm0/dev
|
||||
180:0
|
||||
|
||||
|
||||
USB configuration descriptors
|
||||
-----------------------------
|
||||
The wMaxControlMessage field of the CDC MBIM functional descriptor
|
||||
limits the maximum control message size. The managament application is
|
||||
responsible for negotiating a control message size complying with the
|
||||
requirements in section 9.3.1 of [1], taking this descriptor field
|
||||
into consideration.
|
||||
|
||||
The userspace application can access the CDC MBIM functional
|
||||
descriptor of a MBIM function using either of the two USB
|
||||
configuration descriptor kernel interfaces described in [6] or [7].
|
||||
|
||||
See also the ioctl documentation below.
|
||||
|
||||
|
||||
Fragmentation
|
||||
-------------
|
||||
The userspace application is responsible for all control message
|
||||
fragmentation and defragmentaion, as described in section 9.5 of [1].
|
||||
|
||||
|
||||
/dev/cdc-wdmX write()
|
||||
---------------------
|
||||
The MBIM control messages from the management application *must not*
|
||||
exceed the negotiated control message size.
|
||||
|
||||
|
||||
/dev/cdc-wdmX read()
|
||||
--------------------
|
||||
The management application *must* accept control messages of up the
|
||||
negotiated control message size.
|
||||
|
||||
|
||||
/dev/cdc-wdmX ioctl()
|
||||
--------------------
|
||||
IOCTL_WDM_MAX_COMMAND: Get Maximum Command Size
|
||||
This ioctl returns the wMaxControlMessage field of the CDC MBIM
|
||||
functional descriptor for MBIM devices. This is intended as a
|
||||
convenience, eliminating the need to parse the USB descriptors from
|
||||
userspace.
|
||||
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/ioctl.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/usb/cdc-wdm.h>
|
||||
int main()
|
||||
{
|
||||
__u16 max;
|
||||
int fd = open("/dev/cdc-wdm0", O_RDWR);
|
||||
if (!ioctl(fd, IOCTL_WDM_MAX_COMMAND, &max))
|
||||
printf("wMaxControlMessage is %d\n", max);
|
||||
}
|
||||
|
||||
|
||||
Custom device services
|
||||
----------------------
|
||||
The MBIM specification allows vendors to freely define additional
|
||||
services. This is fully supported by the cdc_mbim driver.
|
||||
|
||||
Support for new MBIM services, including vendor specified services, is
|
||||
implemented entirely in userspace, like the rest of the MBIM control
|
||||
protocol
|
||||
|
||||
New services should be registered in the MBIM Registry [5].
|
||||
|
||||
|
||||
|
||||
MBIM data channel userspace ABI
|
||||
===============================
|
||||
|
||||
wwanY network device
|
||||
--------------------
|
||||
The cdc_mbim driver represents the MBIM data channel as a single
|
||||
network device of the "wwan" type. This network device is initially
|
||||
mapped to MBIM IP session 0.
|
||||
|
||||
|
||||
Multiplexed IP sessions (IPS)
|
||||
-----------------------------
|
||||
MBIM allows multiplexing up to 256 IP sessions over a single USB data
|
||||
channel. The cdc_mbim driver models such IP sessions as 802.1q VLAN
|
||||
subdevices of the master wwanY device, mapping MBIM IP session Z to
|
||||
VLAN ID Z for all values of Z greater than 0.
|
||||
|
||||
The device maximum Z is given in the MBIM_DEVICE_CAPS_INFO structure
|
||||
described in section 10.5.1 of [1].
|
||||
|
||||
The userspace management application is responsible for adding new
|
||||
VLAN links prior to establishing MBIM IP sessions where the SessionId
|
||||
is greater than 0. These links can be added by using the normal VLAN
|
||||
kernel interfaces, either ioctl or netlink.
|
||||
|
||||
For example, adding a link for a MBIM IP session with SessionId 3:
|
||||
|
||||
ip link add link wwan0 name wwan0.3 type vlan id 3
|
||||
|
||||
The driver will automatically map the "wwan0.3" network device to MBIM
|
||||
IP session 3.
|
||||
|
||||
|
||||
Device Service Streams (DSS)
|
||||
----------------------------
|
||||
MBIM also allows up to 256 non-IP data streams to be multiplexed over
|
||||
the same shared USB data channel. The cdc_mbim driver models these
|
||||
sessions as another set of 802.1q VLAN subdevices of the master wwanY
|
||||
device, mapping MBIM DSS session A to VLAN ID (256 + A) for all values
|
||||
of A.
|
||||
|
||||
The device maximum A is given in the MBIM_DEVICE_SERVICES_INFO
|
||||
structure described in section 10.5.29 of [1].
|
||||
|
||||
The DSS VLAN subdevices are used as a practical interface between the
|
||||
shared MBIM data channel and a MBIM DSS aware userspace application.
|
||||
It is not intended to be presented as-is to an end user. The
|
||||
assumption is that an userspace application initiating a DSS session
|
||||
also takes care of the necessary framing of the DSS data, presenting
|
||||
the stream to the end user in an appropriate way for the stream type.
|
||||
|
||||
The network device ABI requires a dummy ethernet header for every DSS
|
||||
data frame being transported. The contents of this header is
|
||||
arbitrary, with the following exceptions:
|
||||
- TX frames using an IP protocol (0x0800 or 0x86dd) will be dropped
|
||||
- RX frames will have the protocol field set to ETH_P_802_3 (but will
|
||||
not be properly formatted 802.3 frames)
|
||||
- RX frames will have the destination address set to the hardware
|
||||
address of the master device
|
||||
|
||||
The DSS supporting userspace management application is responsible for
|
||||
adding the dummy ethernet header on TX and stripping it on RX.
|
||||
|
||||
This is a simple example using tools commonly available, exporting
|
||||
DssSessionId 5 as a pty character device pointed to by a /dev/nmea
|
||||
symlink:
|
||||
|
||||
ip link add link wwan0 name wwan0.dss5 type vlan id 261
|
||||
ip link set dev wwan0.dss5 up
|
||||
socat INTERFACE:wwan0.dss5,type=2 PTY:,echo=0,link=/dev/nmea
|
||||
|
||||
This is only an example, most suitable for testing out a DSS
|
||||
service. Userspace applications supporting specific MBIM DSS services
|
||||
are expected to use the tools and programming interfaces required by
|
||||
that service.
|
||||
|
||||
Note that adding VLAN links for DSS sessions is entirely optional. A
|
||||
management application may instead choose to bind a packet socket
|
||||
directly to the master network device, using the received VLAN tags to
|
||||
map frames to the correct DSS session and adding 18 byte VLAN ethernet
|
||||
headers with the appropriate tag on TX. In this case using a socket
|
||||
filter is recommended, matching only the DSS VLAN subset. This avoid
|
||||
unnecessary copying of unrelated IP session data to userspace. For
|
||||
example:
|
||||
|
||||
static struct sock_filter dssfilter[] = {
|
||||
/* use special negative offsets to get VLAN tag */
|
||||
BPF_STMT(BPF_LD|BPF_B|BPF_ABS, SKF_AD_OFF + SKF_AD_VLAN_TAG_PRESENT),
|
||||
BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, 1, 0, 6), /* true */
|
||||
|
||||
/* verify DSS VLAN range */
|
||||
BPF_STMT(BPF_LD|BPF_H|BPF_ABS, SKF_AD_OFF + SKF_AD_VLAN_TAG),
|
||||
BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 256, 0, 4), /* 256 is first DSS VLAN */
|
||||
BPF_JUMP(BPF_JMP|BPF_JGE|BPF_K, 512, 3, 0), /* 511 is last DSS VLAN */
|
||||
|
||||
/* verify ethertype */
|
||||
BPF_STMT(BPF_LD|BPF_H|BPF_ABS, 2 * ETH_ALEN),
|
||||
BPF_JUMP(BPF_JMP|BPF_JEQ|BPF_K, ETH_P_802_3, 0, 1),
|
||||
|
||||
BPF_STMT(BPF_RET|BPF_K, (u_int)-1), /* accept */
|
||||
BPF_STMT(BPF_RET|BPF_K, 0), /* ignore */
|
||||
};
|
||||
|
||||
|
||||
|
||||
Tagged IP session 0 VLAN
|
||||
------------------------
|
||||
As described above, MBIM IP session 0 is treated as special by the
|
||||
driver. It is initially mapped to untagged frames on the wwanY
|
||||
network device.
|
||||
|
||||
This mapping implies a few restrictions on multiplexed IPS and DSS
|
||||
sessions, which may not always be practical:
|
||||
- no IPS or DSS session can use a frame size greater than the MTU on
|
||||
IP session 0
|
||||
- no IPS or DSS session can be in the up state unless the network
|
||||
device representing IP session 0 also is up
|
||||
|
||||
These problems can be avoided by optionally making the driver map IP
|
||||
session 0 to a VLAN subdevice, similar to all other IP sessions. This
|
||||
behaviour is triggered by adding a VLAN link for the magic VLAN ID
|
||||
4094. The driver will then immediately start mapping MBIM IP session
|
||||
0 to this VLAN, and will drop untagged frames on the master wwanY
|
||||
device.
|
||||
|
||||
Tip: It might be less confusing to the end user to name this VLAN
|
||||
subdevice after the MBIM SessionID instead of the VLAN ID. For
|
||||
example:
|
||||
|
||||
ip link add link wwan0 name wwan0.0 type vlan id 4094
|
||||
|
||||
|
||||
VLAN mapping
|
||||
------------
|
||||
|
||||
Summarizing the cdc_mbim driver mapping described above, we have this
|
||||
relationship between VLAN tags on the wwanY network device and MBIM
|
||||
sessions on the shared USB data channel:
|
||||
|
||||
VLAN ID MBIM type MBIM SessionID Notes
|
||||
---------------------------------------------------------
|
||||
untagged IPS 0 a)
|
||||
1 - 255 IPS 1 - 255 <VLANID>
|
||||
256 - 511 DSS 0 - 255 <VLANID - 256>
|
||||
512 - 4093 b)
|
||||
4094 IPS 0 c)
|
||||
|
||||
a) if no VLAN ID 4094 link exists, else dropped
|
||||
b) unsupported VLAN range, unconditionally dropped
|
||||
c) if a VLAN ID 4094 link exists, else dropped
|
||||
|
||||
|
||||
|
||||
|
||||
References
|
||||
==========
|
||||
|
||||
[1] USB Implementers Forum, Inc. - "Universal Serial Bus
|
||||
Communications Class Subclass Specification for Mobile Broadband
|
||||
Interface Model", Revision 1.0 (Errata 1), May 1, 2013
|
||||
- http://www.usb.org/developers/docs/devclass_docs/
|
||||
|
||||
[2] USB Implementers Forum, Inc. - "Universal Serial Bus
|
||||
Communications Class Subclass Specifications for Network Control
|
||||
Model Devices", Revision 1.0 (Errata 1), November 24, 2010
|
||||
- http://www.usb.org/developers/docs/devclass_docs/
|
||||
|
||||
[3] libmbim - "a glib-based library for talking to WWAN modems and
|
||||
devices which speak the Mobile Interface Broadband Model (MBIM)
|
||||
protocol"
|
||||
- http://www.freedesktop.org/wiki/Software/libmbim/
|
||||
|
||||
[4] ModemManager - "a DBus-activated daemon which controls mobile
|
||||
broadband (2G/3G/4G) devices and connections"
|
||||
- http://www.freedesktop.org/wiki/Software/ModemManager/
|
||||
|
||||
[5] "MBIM (Mobile Broadband Interface Model) Registry"
|
||||
- http://compliance.usb.org/mbim/
|
||||
|
||||
[6] "/proc/bus/usb filesystem output"
|
||||
- Documentation/usb/proc_usb_info.txt
|
||||
|
||||
[7] "/sys/bus/usb/devices/.../descriptors"
|
||||
- Documentation/ABI/stable/sysfs-bus-usb
|
|
@ -281,6 +281,7 @@ Possible BPF extensions are shown in the following table:
|
|||
cpu raw_smp_processor_id()
|
||||
vlan_tci vlan_tx_tag_get(skb)
|
||||
vlan_pr vlan_tx_tag_present(skb)
|
||||
rand prandom_u32()
|
||||
|
||||
These extensions can also be prefixed with '#'.
|
||||
Examples for low-level BPF:
|
||||
|
@ -308,6 +309,18 @@ Examples for low-level BPF:
|
|||
ret #-1
|
||||
drop: ret #0
|
||||
|
||||
** icmp random packet sampling, 1 in 4
|
||||
ldh [12]
|
||||
jne #0x800, drop
|
||||
ldb [23]
|
||||
jneq #1, drop
|
||||
# get a random uint32 number
|
||||
ld rand
|
||||
mod #4
|
||||
jneq #1, drop
|
||||
ret #-1
|
||||
drop: ret #0
|
||||
|
||||
** SECCOMP filter example:
|
||||
|
||||
ld [4] /* offsetof(struct seccomp_data, arch) */
|
||||
|
@ -548,42 +561,43 @@ toolchain for developing and testing the kernel's JIT compiler.
|
|||
|
||||
BPF kernel internals
|
||||
--------------------
|
||||
Internally, for the kernel interpreter, a different BPF instruction set
|
||||
Internally, for the kernel interpreter, a different instruction set
|
||||
format with similar underlying principles from BPF described in previous
|
||||
paragraphs is being used. However, the instruction set format is modelled
|
||||
closer to the underlying architecture to mimic native instruction sets, so
|
||||
that a better performance can be achieved (more details later).
|
||||
that a better performance can be achieved (more details later). This new
|
||||
ISA is called 'eBPF' or 'internal BPF' interchangeably. (Note: eBPF which
|
||||
originates from [e]xtended BPF is not the same as BPF extensions! While
|
||||
eBPF is an ISA, BPF extensions date back to classic BPF's 'overloading'
|
||||
of BPF_LD | BPF_{B,H,W} | BPF_ABS instruction.)
|
||||
|
||||
It is designed to be JITed with one to one mapping, which can also open up
|
||||
the possibility for GCC/LLVM compilers to generate optimized BPF code through
|
||||
a BPF backend that performs almost as fast as natively compiled code.
|
||||
the possibility for GCC/LLVM compilers to generate optimized eBPF code through
|
||||
an eBPF backend that performs almost as fast as natively compiled code.
|
||||
|
||||
The new instruction set was originally designed with the possible goal in
|
||||
mind to write programs in "restricted C" and compile into BPF with a optional
|
||||
mind to write programs in "restricted C" and compile into eBPF with a optional
|
||||
GCC/LLVM backend, so that it can just-in-time map to modern 64-bit CPUs with
|
||||
minimal performance overhead over two steps, that is, C -> BPF -> native code.
|
||||
minimal performance overhead over two steps, that is, C -> eBPF -> native code.
|
||||
|
||||
Currently, the new format is being used for running user BPF programs, which
|
||||
includes seccomp BPF, classic socket filters, cls_bpf traffic classifier,
|
||||
team driver's classifier for its load-balancing mode, netfilter's xt_bpf
|
||||
extension, PTP dissector/classifier, and much more. They are all internally
|
||||
converted by the kernel into the new instruction set representation and run
|
||||
in the extended interpreter. For in-kernel handlers, this all works
|
||||
transparently by using sk_unattached_filter_create() for setting up the
|
||||
filter, resp. sk_unattached_filter_destroy() for destroying it. The macro
|
||||
SK_RUN_FILTER(filter, ctx) transparently invokes the right BPF function to
|
||||
run the filter. 'filter' is a pointer to struct sk_filter that we got from
|
||||
sk_unattached_filter_create(), and 'ctx' the given context (e.g. skb pointer).
|
||||
All constraints and restrictions from sk_chk_filter() apply before a
|
||||
conversion to the new layout is being done behind the scenes!
|
||||
in the eBPF interpreter. For in-kernel handlers, this all works transparently
|
||||
by using sk_unattached_filter_create() for setting up the filter, resp.
|
||||
sk_unattached_filter_destroy() for destroying it. The macro
|
||||
SK_RUN_FILTER(filter, ctx) transparently invokes eBPF interpreter or JITed
|
||||
code to run the filter. 'filter' is a pointer to struct sk_filter that we
|
||||
got from sk_unattached_filter_create(), and 'ctx' the given context (e.g.
|
||||
skb pointer). All constraints and restrictions from sk_chk_filter() apply
|
||||
before a conversion to the new layout is being done behind the scenes!
|
||||
|
||||
Currently, for JITing, the user BPF format is being used and current BPF JIT
|
||||
compilers reused whenever possible. In other words, we do not (yet!) perform
|
||||
a JIT compilation in the new layout, however, future work will successively
|
||||
migrate traditional JIT compilers into the new instruction format as well, so
|
||||
that they will profit from the very same benefits. Thus, when speaking about
|
||||
JIT in the following, a JIT compiler (TBD) for the new instruction format is
|
||||
meant in this context.
|
||||
Currently, the classic BPF format is being used for JITing on most of the
|
||||
architectures. Only x86-64 performs JIT compilation from eBPF instruction set,
|
||||
however, future work will migrate other JIT compilers as well, so that they
|
||||
will profit from the very same benefits.
|
||||
|
||||
Some core changes of the new internal format:
|
||||
|
||||
|
@ -592,35 +606,35 @@ Some core changes of the new internal format:
|
|||
The old format had two registers A and X, and a hidden frame pointer. The
|
||||
new layout extends this to be 10 internal registers and a read-only frame
|
||||
pointer. Since 64-bit CPUs are passing arguments to functions via registers
|
||||
the number of args from BPF program to in-kernel function is restricted
|
||||
the number of args from eBPF program to in-kernel function is restricted
|
||||
to 5 and one register is used to accept return value from an in-kernel
|
||||
function. Natively, x86_64 passes first 6 arguments in registers, aarch64/
|
||||
sparcv9/mips64 have 7 - 8 registers for arguments; x86_64 has 6 callee saved
|
||||
registers, and aarch64/sparcv9/mips64 have 11 or more callee saved registers.
|
||||
|
||||
Therefore, BPF calling convention is defined as:
|
||||
Therefore, eBPF calling convention is defined as:
|
||||
|
||||
* R0 - return value from in-kernel function
|
||||
* R1 - R5 - arguments from BPF program to in-kernel function
|
||||
* R0 - return value from in-kernel function, and exit value for eBPF program
|
||||
* R1 - R5 - arguments from eBPF program to in-kernel function
|
||||
* R6 - R9 - callee saved registers that in-kernel function will preserve
|
||||
* R10 - read-only frame pointer to access stack
|
||||
|
||||
Thus, all BPF registers map one to one to HW registers on x86_64, aarch64,
|
||||
etc, and BPF calling convention maps directly to ABIs used by the kernel on
|
||||
Thus, all eBPF registers map one to one to HW registers on x86_64, aarch64,
|
||||
etc, and eBPF calling convention maps directly to ABIs used by the kernel on
|
||||
64-bit architectures.
|
||||
|
||||
On 32-bit architectures JIT may map programs that use only 32-bit arithmetic
|
||||
and may let more complex programs to be interpreted.
|
||||
|
||||
R0 - R5 are scratch registers and BPF program needs spill/fill them if
|
||||
necessary across calls. Note that there is only one BPF program (== one BPF
|
||||
main routine) and it cannot call other BPF functions, it can only call
|
||||
predefined in-kernel functions, though.
|
||||
R0 - R5 are scratch registers and eBPF program needs spill/fill them if
|
||||
necessary across calls. Note that there is only one eBPF program (== one
|
||||
eBPF main routine) and it cannot call other eBPF functions, it can only
|
||||
call predefined in-kernel functions, though.
|
||||
|
||||
- Register width increases from 32-bit to 64-bit:
|
||||
|
||||
Still, the semantics of the original 32-bit ALU operations are preserved
|
||||
via 32-bit subregisters. All BPF registers are 64-bit with 32-bit lower
|
||||
via 32-bit subregisters. All eBPF registers are 64-bit with 32-bit lower
|
||||
subregisters that zero-extend into 64-bit if they are being written to.
|
||||
That behavior maps directly to x86_64 and arm64 subregister definition, but
|
||||
makes other JITs more difficult.
|
||||
|
@ -631,8 +645,8 @@ Some core changes of the new internal format:
|
|||
|
||||
Operation is 64-bit, because on 64-bit architectures, pointers are also
|
||||
64-bit wide, and we want to pass 64-bit values in/out of kernel functions,
|
||||
so 32-bit BPF registers would otherwise require to define register-pair
|
||||
ABI, thus, there won't be able to use a direct BPF register to HW register
|
||||
so 32-bit eBPF registers would otherwise require to define register-pair
|
||||
ABI, thus, there won't be able to use a direct eBPF register to HW register
|
||||
mapping and JIT would need to do combine/split/move operations for every
|
||||
register in and out of the function, which is complex, bug prone and slow.
|
||||
Another reason is the use of atomic 64-bit counters.
|
||||
|
@ -646,14 +660,145 @@ Some core changes of the new internal format:
|
|||
- Introduces bpf_call insn and register passing convention for zero overhead
|
||||
calls from/to other kernel functions:
|
||||
|
||||
After a kernel function call, R1 - R5 are reset to unreadable and R0 has a
|
||||
return type of the function. Since R6 - R9 are callee saved, their state is
|
||||
preserved across the call.
|
||||
Before an in-kernel function call, the internal BPF program needs to
|
||||
place function arguments into R1 to R5 registers to satisfy calling
|
||||
convention, then the interpreter will take them from registers and pass
|
||||
to in-kernel function. If R1 - R5 registers are mapped to CPU registers
|
||||
that are used for argument passing on given architecture, the JIT compiler
|
||||
doesn't need to emit extra moves. Function arguments will be in the correct
|
||||
registers and BPF_CALL instruction will be JITed as single 'call' HW
|
||||
instruction. This calling convention was picked to cover common call
|
||||
situations without performance penalty.
|
||||
|
||||
Also in the new design, BPF is limited to 4096 insns, which means that any
|
||||
After an in-kernel function call, R1 - R5 are reset to unreadable and R0 has
|
||||
a return value of the function. Since R6 - R9 are callee saved, their state
|
||||
is preserved across the call.
|
||||
|
||||
For example, consider three C functions:
|
||||
|
||||
u64 f1() { return (*_f2)(1); }
|
||||
u64 f2(u64 a) { return f3(a + 1, a); }
|
||||
u64 f3(u64 a, u64 b) { return a - b; }
|
||||
|
||||
GCC can compile f1, f3 into x86_64:
|
||||
|
||||
f1:
|
||||
movl $1, %edi
|
||||
movq _f2(%rip), %rax
|
||||
jmp *%rax
|
||||
f3:
|
||||
movq %rdi, %rax
|
||||
subq %rsi, %rax
|
||||
ret
|
||||
|
||||
Function f2 in eBPF may look like:
|
||||
|
||||
f2:
|
||||
bpf_mov R2, R1
|
||||
bpf_add R1, 1
|
||||
bpf_call f3
|
||||
bpf_exit
|
||||
|
||||
If f2 is JITed and the pointer stored to '_f2'. The calls f1 -> f2 -> f3 and
|
||||
returns will be seamless. Without JIT, __sk_run_filter() interpreter needs to
|
||||
be used to call into f2.
|
||||
|
||||
For practical reasons all eBPF programs have only one argument 'ctx' which is
|
||||
already placed into R1 (e.g. on __sk_run_filter() startup) and the programs
|
||||
can call kernel functions with up to 5 arguments. Calls with 6 or more arguments
|
||||
are currently not supported, but these restrictions can be lifted if necessary
|
||||
in the future.
|
||||
|
||||
On 64-bit architectures all register map to HW registers one to one. For
|
||||
example, x86_64 JIT compiler can map them as ...
|
||||
|
||||
R0 - rax
|
||||
R1 - rdi
|
||||
R2 - rsi
|
||||
R3 - rdx
|
||||
R4 - rcx
|
||||
R5 - r8
|
||||
R6 - rbx
|
||||
R7 - r13
|
||||
R8 - r14
|
||||
R9 - r15
|
||||
R10 - rbp
|
||||
|
||||
... since x86_64 ABI mandates rdi, rsi, rdx, rcx, r8, r9 for argument passing
|
||||
and rbx, r12 - r15 are callee saved.
|
||||
|
||||
Then the following internal BPF pseudo-program:
|
||||
|
||||
bpf_mov R6, R1 /* save ctx */
|
||||
bpf_mov R2, 2
|
||||
bpf_mov R3, 3
|
||||
bpf_mov R4, 4
|
||||
bpf_mov R5, 5
|
||||
bpf_call foo
|
||||
bpf_mov R7, R0 /* save foo() return value */
|
||||
bpf_mov R1, R6 /* restore ctx for next call */
|
||||
bpf_mov R2, 6
|
||||
bpf_mov R3, 7
|
||||
bpf_mov R4, 8
|
||||
bpf_mov R5, 9
|
||||
bpf_call bar
|
||||
bpf_add R0, R7
|
||||
bpf_exit
|
||||
|
||||
After JIT to x86_64 may look like:
|
||||
|
||||
push %rbp
|
||||
mov %rsp,%rbp
|
||||
sub $0x228,%rsp
|
||||
mov %rbx,-0x228(%rbp)
|
||||
mov %r13,-0x220(%rbp)
|
||||
mov %rdi,%rbx
|
||||
mov $0x2,%esi
|
||||
mov $0x3,%edx
|
||||
mov $0x4,%ecx
|
||||
mov $0x5,%r8d
|
||||
callq foo
|
||||
mov %rax,%r13
|
||||
mov %rbx,%rdi
|
||||
mov $0x2,%esi
|
||||
mov $0x3,%edx
|
||||
mov $0x4,%ecx
|
||||
mov $0x5,%r8d
|
||||
callq bar
|
||||
add %r13,%rax
|
||||
mov -0x228(%rbp),%rbx
|
||||
mov -0x220(%rbp),%r13
|
||||
leaveq
|
||||
retq
|
||||
|
||||
Which is in this example equivalent in C to:
|
||||
|
||||
u64 bpf_filter(u64 ctx)
|
||||
{
|
||||
return foo(ctx, 2, 3, 4, 5) + bar(ctx, 6, 7, 8, 9);
|
||||
}
|
||||
|
||||
In-kernel functions foo() and bar() with prototype: u64 (*)(u64 arg1, u64
|
||||
arg2, u64 arg3, u64 arg4, u64 arg5); will receive arguments in proper
|
||||
registers and place their return value into '%rax' which is R0 in eBPF.
|
||||
Prologue and epilogue are emitted by JIT and are implicit in the
|
||||
interpreter. R0-R5 are scratch registers, so eBPF program needs to preserve
|
||||
them across the calls as defined by calling convention.
|
||||
|
||||
For example the following program is invalid:
|
||||
|
||||
bpf_mov R1, 1
|
||||
bpf_call foo
|
||||
bpf_mov R0, R1
|
||||
bpf_exit
|
||||
|
||||
After the call the registers R1-R5 contain junk values and cannot be read.
|
||||
In the future an eBPF verifier can be used to validate internal BPF programs.
|
||||
|
||||
Also in the new design, eBPF is limited to 4096 insns, which means that any
|
||||
program will terminate quickly and will only call a fixed number of kernel
|
||||
functions. Original BPF and the new format are two operand instructions,
|
||||
which helps to do one-to-one mapping between BPF insn and x86 insn during JIT.
|
||||
which helps to do one-to-one mapping between eBPF insn and x86 insn during JIT.
|
||||
|
||||
The input context pointer for invoking the interpreter function is generic,
|
||||
its content is defined by a specific use case. For seccomp register R1 points
|
||||
|
@ -661,7 +806,26 @@ to seccomp_data, for converted BPF filters R1 points to a skb.
|
|||
|
||||
A program, that is translated internally consists of the following elements:
|
||||
|
||||
op:16, jt:8, jf:8, k:32 ==> op:8, a_reg:4, x_reg:4, off:16, imm:32
|
||||
op:16, jt:8, jf:8, k:32 ==> op:8, dst_reg:4, src_reg:4, off:16, imm:32
|
||||
|
||||
So far 87 internal BPF instructions were implemented. 8-bit 'op' opcode field
|
||||
has room for new instructions. Some of them may use 16/24/32 byte encoding. New
|
||||
instructions must be multiple of 8 bytes to preserve backward compatibility.
|
||||
|
||||
Internal BPF is a general purpose RISC instruction set. Not every register and
|
||||
every instruction are used during translation from original BPF to new format.
|
||||
For example, socket filters are not using 'exclusive add' instruction, but
|
||||
tracing filters may do to maintain counters of events, for example. Register R9
|
||||
is not used by socket filters either, but more complex filters may be running
|
||||
out of registers and would have to resort to spill/fill to stack.
|
||||
|
||||
Internal BPF can used as generic assembler for last step performance
|
||||
optimizations, socket filters and seccomp are using it as assembler. Tracing
|
||||
filters may use it as assembler to generate code from kernel. In kernel usage
|
||||
may not be bounded by security considerations, since generated internal BPF code
|
||||
may be optimizing internal code path and not being exposed to the user space.
|
||||
Safety of internal BPF can come from a verifier (TBD). In such use cases as
|
||||
described, it may be used as safe instruction set.
|
||||
|
||||
Just like the original BPF, the new format runs within a controlled environment,
|
||||
is deterministic and the kernel can easily prove that. The safety of the program
|
||||
|
@ -670,6 +834,181 @@ loops and other CFG validation; second step starts from the first insn and
|
|||
descends all possible paths. It simulates execution of every insn and observes
|
||||
the state change of registers and stack.
|
||||
|
||||
eBPF opcode encoding
|
||||
--------------------
|
||||
|
||||
eBPF is reusing most of the opcode encoding from classic to simplify conversion
|
||||
of classic BPF to eBPF. For arithmetic and jump instructions the 8-bit 'code'
|
||||
field is divided into three parts:
|
||||
|
||||
+----------------+--------+--------------------+
|
||||
| 4 bits | 1 bit | 3 bits |
|
||||
| operation code | source | instruction class |
|
||||
+----------------+--------+--------------------+
|
||||
(MSB) (LSB)
|
||||
|
||||
Three LSB bits store instruction class which is one of:
|
||||
|
||||
Classic BPF classes: eBPF classes:
|
||||
|
||||
BPF_LD 0x00 BPF_LD 0x00
|
||||
BPF_LDX 0x01 BPF_LDX 0x01
|
||||
BPF_ST 0x02 BPF_ST 0x02
|
||||
BPF_STX 0x03 BPF_STX 0x03
|
||||
BPF_ALU 0x04 BPF_ALU 0x04
|
||||
BPF_JMP 0x05 BPF_JMP 0x05
|
||||
BPF_RET 0x06 [ class 6 unused, for future if needed ]
|
||||
BPF_MISC 0x07 BPF_ALU64 0x07
|
||||
|
||||
When BPF_CLASS(code) == BPF_ALU or BPF_JMP, 4th bit encodes source operand ...
|
||||
|
||||
BPF_K 0x00
|
||||
BPF_X 0x08
|
||||
|
||||
* in classic BPF, this means:
|
||||
|
||||
BPF_SRC(code) == BPF_X - use register X as source operand
|
||||
BPF_SRC(code) == BPF_K - use 32-bit immediate as source operand
|
||||
|
||||
* in eBPF, this means:
|
||||
|
||||
BPF_SRC(code) == BPF_X - use 'src_reg' register as source operand
|
||||
BPF_SRC(code) == BPF_K - use 32-bit immediate as source operand
|
||||
|
||||
... and four MSB bits store operation code.
|
||||
|
||||
If BPF_CLASS(code) == BPF_ALU or BPF_ALU64 [ in eBPF ], BPF_OP(code) is one of:
|
||||
|
||||
BPF_ADD 0x00
|
||||
BPF_SUB 0x10
|
||||
BPF_MUL 0x20
|
||||
BPF_DIV 0x30
|
||||
BPF_OR 0x40
|
||||
BPF_AND 0x50
|
||||
BPF_LSH 0x60
|
||||
BPF_RSH 0x70
|
||||
BPF_NEG 0x80
|
||||
BPF_MOD 0x90
|
||||
BPF_XOR 0xa0
|
||||
BPF_MOV 0xb0 /* eBPF only: mov reg to reg */
|
||||
BPF_ARSH 0xc0 /* eBPF only: sign extending shift right */
|
||||
BPF_END 0xd0 /* eBPF only: endianness conversion */
|
||||
|
||||
If BPF_CLASS(code) == BPF_JMP, BPF_OP(code) is one of:
|
||||
|
||||
BPF_JA 0x00
|
||||
BPF_JEQ 0x10
|
||||
BPF_JGT 0x20
|
||||
BPF_JGE 0x30
|
||||
BPF_JSET 0x40
|
||||
BPF_JNE 0x50 /* eBPF only: jump != */
|
||||
BPF_JSGT 0x60 /* eBPF only: signed '>' */
|
||||
BPF_JSGE 0x70 /* eBPF only: signed '>=' */
|
||||
BPF_CALL 0x80 /* eBPF only: function call */
|
||||
BPF_EXIT 0x90 /* eBPF only: function return */
|
||||
|
||||
So BPF_ADD | BPF_X | BPF_ALU means 32-bit addition in both classic BPF
|
||||
and eBPF. There are only two registers in classic BPF, so it means A += X.
|
||||
In eBPF it means dst_reg = (u32) dst_reg + (u32) src_reg; similarly,
|
||||
BPF_XOR | BPF_K | BPF_ALU means A ^= imm32 in classic BPF and analogous
|
||||
src_reg = (u32) src_reg ^ (u32) imm32 in eBPF.
|
||||
|
||||
Classic BPF is using BPF_MISC class to represent A = X and X = A moves.
|
||||
eBPF is using BPF_MOV | BPF_X | BPF_ALU code instead. Since there are no
|
||||
BPF_MISC operations in eBPF, the class 7 is used as BPF_ALU64 to mean
|
||||
exactly the same operations as BPF_ALU, but with 64-bit wide operands
|
||||
instead. So BPF_ADD | BPF_X | BPF_ALU64 means 64-bit addition, i.e.:
|
||||
dst_reg = dst_reg + src_reg
|
||||
|
||||
Classic BPF wastes the whole BPF_RET class to represent a single 'ret'
|
||||
operation. Classic BPF_RET | BPF_K means copy imm32 into return register
|
||||
and perform function exit. eBPF is modeled to match CPU, so BPF_JMP | BPF_EXIT
|
||||
in eBPF means function exit only. The eBPF program needs to store return
|
||||
value into register R0 before doing a BPF_EXIT. Class 6 in eBPF is currently
|
||||
unused and reserved for future use.
|
||||
|
||||
For load and store instructions the 8-bit 'code' field is divided as:
|
||||
|
||||
+--------+--------+-------------------+
|
||||
| 3 bits | 2 bits | 3 bits |
|
||||
| mode | size | instruction class |
|
||||
+--------+--------+-------------------+
|
||||
(MSB) (LSB)
|
||||
|
||||
Size modifier is one of ...
|
||||
|
||||
BPF_W 0x00 /* word */
|
||||
BPF_H 0x08 /* half word */
|
||||
BPF_B 0x10 /* byte */
|
||||
BPF_DW 0x18 /* eBPF only, double word */
|
||||
|
||||
... which encodes size of load/store operation:
|
||||
|
||||
B - 1 byte
|
||||
H - 2 byte
|
||||
W - 4 byte
|
||||
DW - 8 byte (eBPF only)
|
||||
|
||||
Mode modifier is one of:
|
||||
|
||||
BPF_IMM 0x00 /* classic BPF only, reserved in eBPF */
|
||||
BPF_ABS 0x20
|
||||
BPF_IND 0x40
|
||||
BPF_MEM 0x60
|
||||
BPF_LEN 0x80 /* classic BPF only, reserved in eBPF */
|
||||
BPF_MSH 0xa0 /* classic BPF only, reserved in eBPF */
|
||||
BPF_XADD 0xc0 /* eBPF only, exclusive add */
|
||||
|
||||
eBPF has two non-generic instructions: (BPF_ABS | <size> | BPF_LD) and
|
||||
(BPF_IND | <size> | BPF_LD) which are used to access packet data.
|
||||
|
||||
They had to be carried over from classic to have strong performance of
|
||||
socket filters running in eBPF interpreter. These instructions can only
|
||||
be used when interpreter context is a pointer to 'struct sk_buff' and
|
||||
have seven implicit operands. Register R6 is an implicit input that must
|
||||
contain pointer to sk_buff. Register R0 is an implicit output which contains
|
||||
the data fetched from the packet. Registers R1-R5 are scratch registers
|
||||
and must not be used to store the data across BPF_ABS | BPF_LD or
|
||||
BPF_IND | BPF_LD instructions.
|
||||
|
||||
These instructions have implicit program exit condition as well. When
|
||||
eBPF program is trying to access the data beyond the packet boundary,
|
||||
the interpreter will abort the execution of the program. JIT compilers
|
||||
therefore must preserve this property. src_reg and imm32 fields are
|
||||
explicit inputs to these instructions.
|
||||
|
||||
For example:
|
||||
|
||||
BPF_IND | BPF_W | BPF_LD means:
|
||||
|
||||
R0 = ntohl(*(u32 *) (((struct sk_buff *) R6)->data + src_reg + imm32))
|
||||
and R1 - R5 were scratched.
|
||||
|
||||
Unlike classic BPF instruction set, eBPF has generic load/store operations:
|
||||
|
||||
BPF_MEM | <size> | BPF_STX: *(size *) (dst_reg + off) = src_reg
|
||||
BPF_MEM | <size> | BPF_ST: *(size *) (dst_reg + off) = imm32
|
||||
BPF_MEM | <size> | BPF_LDX: dst_reg = *(size *) (src_reg + off)
|
||||
BPF_XADD | BPF_W | BPF_STX: lock xadd *(u32 *)(dst_reg + off16) += src_reg
|
||||
BPF_XADD | BPF_DW | BPF_STX: lock xadd *(u64 *)(dst_reg + off16) += src_reg
|
||||
|
||||
Where size is one of: BPF_B or BPF_H or BPF_W or BPF_DW. Note that 1 and
|
||||
2 byte atomic increments are not supported.
|
||||
|
||||
Testing
|
||||
-------
|
||||
|
||||
Next to the BPF toolchain, the kernel also ships a test module that contains
|
||||
various test cases for classic and internal BPF that can be executed against
|
||||
the BPF interpreter and JIT compiler. It can be found in lib/test_bpf.c and
|
||||
enabled via Kconfig:
|
||||
|
||||
CONFIG_TEST_BPF=m
|
||||
|
||||
After the module has been built and installed, the test suite can be executed
|
||||
via insmod or modprobe against 'test_bpf' module. Results of the test cases
|
||||
including timings in nsec can be found in the kernel log (dmesg).
|
||||
|
||||
Misc
|
||||
----
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
Interaction of Suspend code (S3) with the CPU hotplug infrastructure
|
||||
|
||||
(C) 2011 Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
|
||||
(C) 2011 - 2014 Srivatsa S. Bhat <srivatsa.bhat@linux.vnet.ibm.com>
|
||||
|
||||
|
||||
I. How does the regular CPU hotplug code differ from how the Suspend-to-RAM
|
||||
|
|
|
@ -19,7 +19,8 @@ should instead register a static mapping that can be used to match PWM
|
|||
consumers to providers, as given in the following example:
|
||||
|
||||
static struct pwm_lookup board_pwm_lookup[] = {
|
||||
PWM_LOOKUP("tegra-pwm", 0, "pwm-backlight", NULL),
|
||||
PWM_LOOKUP("tegra-pwm", 0, "pwm-backlight", NULL,
|
||||
50000, PWM_POLARITY_NORMAL),
|
||||
};
|
||||
|
||||
static void __init board_init(void)
|
||||
|
@ -97,6 +98,13 @@ pwm_chip as argument which provides a description of the PWM chip, the
|
|||
number of PWM devices provided by the chip and the chip-specific
|
||||
implementation of the supported PWM operations to the framework.
|
||||
|
||||
When implementing polarity support in a PWM driver, make sure to respect the
|
||||
signal conventions in the PWM framework. By definition, normal polarity
|
||||
characterizes a signal starts high for the duration of the duty cycle and
|
||||
goes low for the remainder of the period. Conversely, a signal with inversed
|
||||
polarity starts low for the duration of the duty cycle and goes high for the
|
||||
remainder of the period.
|
||||
|
||||
Locking
|
||||
-------
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* parse_vdso.c: Linux reference vDSO parser
|
||||
* Written by Andrew Lutomirski, 2011.
|
||||
* Written by Andrew Lutomirski, 2011-2014.
|
||||
*
|
||||
* This code is meant to be linked in to various programs that run on Linux.
|
||||
* As such, it is available with as few restrictions as possible. This file
|
||||
|
@ -11,13 +11,14 @@
|
|||
* it starts a program. It works equally well in statically and dynamically
|
||||
* linked binaries.
|
||||
*
|
||||
* This code is tested on x86_64. In principle it should work on any 64-bit
|
||||
* This code is tested on x86. In principle it should work on any
|
||||
* architecture that has a vDSO.
|
||||
*/
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <limits.h>
|
||||
#include <elf.h>
|
||||
|
||||
/*
|
||||
|
@ -45,11 +46,18 @@ extern void *vdso_sym(const char *version, const char *name);
|
|||
|
||||
|
||||
/* And here's the code. */
|
||||
|
||||
#ifndef __x86_64__
|
||||
# error Not yet ported to non-x86_64 architectures
|
||||
#ifndef ELF_BITS
|
||||
# if ULONG_MAX > 0xffffffffUL
|
||||
# define ELF_BITS 64
|
||||
# else
|
||||
# define ELF_BITS 32
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#define ELF_BITS_XFORM2(bits, x) Elf##bits##_##x
|
||||
#define ELF_BITS_XFORM(bits, x) ELF_BITS_XFORM2(bits, x)
|
||||
#define ELF(x) ELF_BITS_XFORM(ELF_BITS, x)
|
||||
|
||||
static struct vdso_info
|
||||
{
|
||||
bool valid;
|
||||
|
@ -59,14 +67,14 @@ static struct vdso_info
|
|||
uintptr_t load_offset; /* load_addr - recorded vaddr */
|
||||
|
||||
/* Symbol table */
|
||||
Elf64_Sym *symtab;
|
||||
ELF(Sym) *symtab;
|
||||
const char *symstrings;
|
||||
Elf64_Word *bucket, *chain;
|
||||
Elf64_Word nbucket, nchain;
|
||||
ELF(Word) *bucket, *chain;
|
||||
ELF(Word) nbucket, nchain;
|
||||
|
||||
/* Version table */
|
||||
Elf64_Versym *versym;
|
||||
Elf64_Verdef *verdef;
|
||||
ELF(Versym) *versym;
|
||||
ELF(Verdef) *verdef;
|
||||
} vdso_info;
|
||||
|
||||
/* Straight from the ELF specification. */
|
||||
|
@ -92,9 +100,14 @@ void vdso_init_from_sysinfo_ehdr(uintptr_t base)
|
|||
|
||||
vdso_info.load_addr = base;
|
||||
|
||||
Elf64_Ehdr *hdr = (Elf64_Ehdr*)base;
|
||||
Elf64_Phdr *pt = (Elf64_Phdr*)(vdso_info.load_addr + hdr->e_phoff);
|
||||
Elf64_Dyn *dyn = 0;
|
||||
ELF(Ehdr) *hdr = (ELF(Ehdr)*)base;
|
||||
if (hdr->e_ident[EI_CLASS] !=
|
||||
(ELF_BITS == 32 ? ELFCLASS32 : ELFCLASS64)) {
|
||||
return; /* Wrong ELF class -- check ELF_BITS */
|
||||
}
|
||||
|
||||
ELF(Phdr) *pt = (ELF(Phdr)*)(vdso_info.load_addr + hdr->e_phoff);
|
||||
ELF(Dyn) *dyn = 0;
|
||||
|
||||
/*
|
||||
* We need two things from the segment table: the load offset
|
||||
|
@ -108,7 +121,7 @@ void vdso_init_from_sysinfo_ehdr(uintptr_t base)
|
|||
+ (uintptr_t)pt[i].p_offset
|
||||
- (uintptr_t)pt[i].p_vaddr;
|
||||
} else if (pt[i].p_type == PT_DYNAMIC) {
|
||||
dyn = (Elf64_Dyn*)(base + pt[i].p_offset);
|
||||
dyn = (ELF(Dyn)*)(base + pt[i].p_offset);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -118,7 +131,7 @@ void vdso_init_from_sysinfo_ehdr(uintptr_t base)
|
|||
/*
|
||||
* Fish out the useful bits of the dynamic table.
|
||||
*/
|
||||
Elf64_Word *hash = 0;
|
||||
ELF(Word) *hash = 0;
|
||||
vdso_info.symstrings = 0;
|
||||
vdso_info.symtab = 0;
|
||||
vdso_info.versym = 0;
|
||||
|
@ -131,22 +144,22 @@ void vdso_init_from_sysinfo_ehdr(uintptr_t base)
|
|||
+ vdso_info.load_offset);
|
||||
break;
|
||||
case DT_SYMTAB:
|
||||
vdso_info.symtab = (Elf64_Sym *)
|
||||
vdso_info.symtab = (ELF(Sym) *)
|
||||
((uintptr_t)dyn[i].d_un.d_ptr
|
||||
+ vdso_info.load_offset);
|
||||
break;
|
||||
case DT_HASH:
|
||||
hash = (Elf64_Word *)
|
||||
hash = (ELF(Word) *)
|
||||
((uintptr_t)dyn[i].d_un.d_ptr
|
||||
+ vdso_info.load_offset);
|
||||
break;
|
||||
case DT_VERSYM:
|
||||
vdso_info.versym = (Elf64_Versym *)
|
||||
vdso_info.versym = (ELF(Versym) *)
|
||||
((uintptr_t)dyn[i].d_un.d_ptr
|
||||
+ vdso_info.load_offset);
|
||||
break;
|
||||
case DT_VERDEF:
|
||||
vdso_info.verdef = (Elf64_Verdef *)
|
||||
vdso_info.verdef = (ELF(Verdef) *)
|
||||
((uintptr_t)dyn[i].d_un.d_ptr
|
||||
+ vdso_info.load_offset);
|
||||
break;
|
||||
|
@ -168,8 +181,8 @@ void vdso_init_from_sysinfo_ehdr(uintptr_t base)
|
|||
vdso_info.valid = true;
|
||||
}
|
||||
|
||||
static bool vdso_match_version(Elf64_Versym ver,
|
||||
const char *name, Elf64_Word hash)
|
||||
static bool vdso_match_version(ELF(Versym) ver,
|
||||
const char *name, ELF(Word) hash)
|
||||
{
|
||||
/*
|
||||
* This is a helper function to check if the version indexed by
|
||||
|
@ -188,7 +201,7 @@ static bool vdso_match_version(Elf64_Versym ver,
|
|||
|
||||
/* First step: find the version definition */
|
||||
ver &= 0x7fff; /* Apparently bit 15 means "hidden" */
|
||||
Elf64_Verdef *def = vdso_info.verdef;
|
||||
ELF(Verdef) *def = vdso_info.verdef;
|
||||
while(true) {
|
||||
if ((def->vd_flags & VER_FLG_BASE) == 0
|
||||
&& (def->vd_ndx & 0x7fff) == ver)
|
||||
|
@ -197,11 +210,11 @@ static bool vdso_match_version(Elf64_Versym ver,
|
|||
if (def->vd_next == 0)
|
||||
return false; /* No definition. */
|
||||
|
||||
def = (Elf64_Verdef *)((char *)def + def->vd_next);
|
||||
def = (ELF(Verdef) *)((char *)def + def->vd_next);
|
||||
}
|
||||
|
||||
/* Now figure out whether it matches. */
|
||||
Elf64_Verdaux *aux = (Elf64_Verdaux*)((char *)def + def->vd_aux);
|
||||
ELF(Verdaux) *aux = (ELF(Verdaux)*)((char *)def + def->vd_aux);
|
||||
return def->vd_hash == hash
|
||||
&& !strcmp(name, vdso_info.symstrings + aux->vda_name);
|
||||
}
|
||||
|
@ -213,10 +226,10 @@ void *vdso_sym(const char *version, const char *name)
|
|||
return 0;
|
||||
|
||||
ver_hash = elf_hash(version);
|
||||
Elf64_Word chain = vdso_info.bucket[elf_hash(name) % vdso_info.nbucket];
|
||||
ELF(Word) chain = vdso_info.bucket[elf_hash(name) % vdso_info.nbucket];
|
||||
|
||||
for (; chain != STN_UNDEF; chain = vdso_info.chain[chain]) {
|
||||
Elf64_Sym *sym = &vdso_info.symtab[chain];
|
||||
ELF(Sym) *sym = &vdso_info.symtab[chain];
|
||||
|
||||
/* Check for a defined global or weak function w/ right name. */
|
||||
if (ELF64_ST_TYPE(sym->st_info) != STT_FUNC)
|
||||
|
@ -243,7 +256,7 @@ void *vdso_sym(const char *version, const char *name)
|
|||
|
||||
void vdso_init_from_auxv(void *auxv)
|
||||
{
|
||||
Elf64_auxv_t *elf_auxv = auxv;
|
||||
ELF(auxv_t) *elf_auxv = auxv;
|
||||
for (int i = 0; elf_auxv[i].a_type != AT_NULL; i++)
|
||||
{
|
||||
if (elf_auxv[i].a_type == AT_SYSINFO_EHDR) {
|
||||
|
|
|
@ -0,0 +1,128 @@
|
|||
/*
|
||||
* vdso_test.c: Sample code to test parse_vdso.c on x86
|
||||
* Copyright (c) 2011-2014 Andy Lutomirski
|
||||
* Subject to the GNU General Public License, version 2
|
||||
*
|
||||
* You can amuse yourself by compiling with:
|
||||
* gcc -std=gnu99 -nostdlib
|
||||
* -Os -fno-asynchronous-unwind-tables -flto -lgcc_s
|
||||
* vdso_standalone_test_x86.c parse_vdso.c
|
||||
* to generate a small binary. On x86_64, you can omit -lgcc_s
|
||||
* if you want the binary to be completely standalone.
|
||||
*/
|
||||
|
||||
#include <sys/syscall.h>
|
||||
#include <sys/time.h>
|
||||
#include <unistd.h>
|
||||
#include <stdint.h>
|
||||
|
||||
extern void *vdso_sym(const char *version, const char *name);
|
||||
extern void vdso_init_from_sysinfo_ehdr(uintptr_t base);
|
||||
extern void vdso_init_from_auxv(void *auxv);
|
||||
|
||||
/* We need a libc functions... */
|
||||
int strcmp(const char *a, const char *b)
|
||||
{
|
||||
/* This implementation is buggy: it never returns -1. */
|
||||
while (*a || *b) {
|
||||
if (*a != *b)
|
||||
return 1;
|
||||
if (*a == 0 || *b == 0)
|
||||
return 1;
|
||||
a++;
|
||||
b++;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* ...and two syscalls. This is x86-specific. */
|
||||
static inline long x86_syscall3(long nr, long a0, long a1, long a2)
|
||||
{
|
||||
long ret;
|
||||
#ifdef __x86_64__
|
||||
asm volatile ("syscall" : "=a" (ret) : "a" (nr),
|
||||
"D" (a0), "S" (a1), "d" (a2) :
|
||||
"cc", "memory", "rcx",
|
||||
"r8", "r9", "r10", "r11" );
|
||||
#else
|
||||
asm volatile ("int $0x80" : "=a" (ret) : "a" (nr),
|
||||
"b" (a0), "c" (a1), "d" (a2) :
|
||||
"cc", "memory" );
|
||||
#endif
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline long linux_write(int fd, const void *data, size_t len)
|
||||
{
|
||||
return x86_syscall3(__NR_write, fd, (long)data, (long)len);
|
||||
}
|
||||
|
||||
static inline void linux_exit(int code)
|
||||
{
|
||||
x86_syscall3(__NR_exit, code, 0, 0);
|
||||
}
|
||||
|
||||
void to_base10(char *lastdig, uint64_t n)
|
||||
{
|
||||
while (n) {
|
||||
*lastdig = (n % 10) + '0';
|
||||
n /= 10;
|
||||
lastdig--;
|
||||
}
|
||||
}
|
||||
|
||||
__attribute__((externally_visible)) void c_main(void **stack)
|
||||
{
|
||||
/* Parse the stack */
|
||||
long argc = (long)*stack;
|
||||
stack += argc + 2;
|
||||
|
||||
/* Now we're pointing at the environment. Skip it. */
|
||||
while(*stack)
|
||||
stack++;
|
||||
stack++;
|
||||
|
||||
/* Now we're pointing at auxv. Initialize the vDSO parser. */
|
||||
vdso_init_from_auxv((void *)stack);
|
||||
|
||||
/* Find gettimeofday. */
|
||||
typedef long (*gtod_t)(struct timeval *tv, struct timezone *tz);
|
||||
gtod_t gtod = (gtod_t)vdso_sym("LINUX_2.6", "__vdso_gettimeofday");
|
||||
|
||||
if (!gtod)
|
||||
linux_exit(1);
|
||||
|
||||
struct timeval tv;
|
||||
long ret = gtod(&tv, 0);
|
||||
|
||||
if (ret == 0) {
|
||||
char buf[] = "The time is .000000\n";
|
||||
to_base10(buf + 31, tv.tv_sec);
|
||||
to_base10(buf + 38, tv.tv_usec);
|
||||
linux_write(1, buf, sizeof(buf) - 1);
|
||||
} else {
|
||||
linux_exit(ret);
|
||||
}
|
||||
|
||||
linux_exit(0);
|
||||
}
|
||||
|
||||
/*
|
||||
* This is the real entry point. It passes the initial stack into
|
||||
* the C entry point.
|
||||
*/
|
||||
asm (
|
||||
".text\n"
|
||||
".global _start\n"
|
||||
".type _start,@function\n"
|
||||
"_start:\n\t"
|
||||
#ifdef __x86_64__
|
||||
"mov %rsp,%rdi\n\t"
|
||||
"jmp c_main"
|
||||
#else
|
||||
"push %esp\n\t"
|
||||
"call c_main\n\t"
|
||||
"int $3"
|
||||
#endif
|
||||
);
|
|
@ -1,111 +1,52 @@
|
|||
/*
|
||||
* vdso_test.c: Sample code to test parse_vdso.c on x86_64
|
||||
* Copyright (c) 2011 Andy Lutomirski
|
||||
* vdso_test.c: Sample code to test parse_vdso.c
|
||||
* Copyright (c) 2014 Andy Lutomirski
|
||||
* Subject to the GNU General Public License, version 2
|
||||
*
|
||||
* You can amuse yourself by compiling with:
|
||||
* gcc -std=gnu99 -nostdlib
|
||||
* -Os -fno-asynchronous-unwind-tables -flto
|
||||
* vdso_test.c parse_vdso.c -o vdso_test
|
||||
* to generate a small binary with no dependencies at all.
|
||||
* Compile with:
|
||||
* gcc -std=gnu99 vdso_test.c parse_vdso.c
|
||||
*
|
||||
* Tested on x86, 32-bit and 64-bit. It may work on other architectures, too.
|
||||
*/
|
||||
|
||||
#include <sys/syscall.h>
|
||||
#include <sys/time.h>
|
||||
#include <unistd.h>
|
||||
#include <stdint.h>
|
||||
#include <elf.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/auxv.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
extern void *vdso_sym(const char *version, const char *name);
|
||||
extern void vdso_init_from_sysinfo_ehdr(uintptr_t base);
|
||||
extern void vdso_init_from_auxv(void *auxv);
|
||||
|
||||
/* We need a libc functions... */
|
||||
int strcmp(const char *a, const char *b)
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
/* This implementation is buggy: it never returns -1. */
|
||||
while (*a || *b) {
|
||||
if (*a != *b)
|
||||
return 1;
|
||||
if (*a == 0 || *b == 0)
|
||||
return 1;
|
||||
a++;
|
||||
b++;
|
||||
unsigned long sysinfo_ehdr = getauxval(AT_SYSINFO_EHDR);
|
||||
if (!sysinfo_ehdr) {
|
||||
printf("AT_SYSINFO_EHDR is not present!\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* ...and two syscalls. This is x86_64-specific. */
|
||||
static inline long linux_write(int fd, const void *data, size_t len)
|
||||
{
|
||||
|
||||
long ret;
|
||||
asm volatile ("syscall" : "=a" (ret) : "a" (__NR_write),
|
||||
"D" (fd), "S" (data), "d" (len) :
|
||||
"cc", "memory", "rcx",
|
||||
"r8", "r9", "r10", "r11" );
|
||||
return ret;
|
||||
}
|
||||
|
||||
static inline void linux_exit(int code)
|
||||
{
|
||||
asm volatile ("syscall" : : "a" (__NR_exit), "D" (code));
|
||||
}
|
||||
|
||||
void to_base10(char *lastdig, uint64_t n)
|
||||
{
|
||||
while (n) {
|
||||
*lastdig = (n % 10) + '0';
|
||||
n /= 10;
|
||||
lastdig--;
|
||||
}
|
||||
}
|
||||
|
||||
__attribute__((externally_visible)) void c_main(void **stack)
|
||||
{
|
||||
/* Parse the stack */
|
||||
long argc = (long)*stack;
|
||||
stack += argc + 2;
|
||||
|
||||
/* Now we're pointing at the environment. Skip it. */
|
||||
while(*stack)
|
||||
stack++;
|
||||
stack++;
|
||||
|
||||
/* Now we're pointing at auxv. Initialize the vDSO parser. */
|
||||
vdso_init_from_auxv((void *)stack);
|
||||
vdso_init_from_sysinfo_ehdr(getauxval(AT_SYSINFO_EHDR));
|
||||
|
||||
/* Find gettimeofday. */
|
||||
typedef long (*gtod_t)(struct timeval *tv, struct timezone *tz);
|
||||
gtod_t gtod = (gtod_t)vdso_sym("LINUX_2.6", "__vdso_gettimeofday");
|
||||
|
||||
if (!gtod)
|
||||
linux_exit(1);
|
||||
if (!gtod) {
|
||||
printf("Could not find __vdso_gettimeofday\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
struct timeval tv;
|
||||
long ret = gtod(&tv, 0);
|
||||
|
||||
if (ret == 0) {
|
||||
char buf[] = "The time is .000000\n";
|
||||
to_base10(buf + 31, tv.tv_sec);
|
||||
to_base10(buf + 38, tv.tv_usec);
|
||||
linux_write(1, buf, sizeof(buf) - 1);
|
||||
printf("The time is %lld.%06lld\n",
|
||||
(long long)tv.tv_sec, (long long)tv.tv_usec);
|
||||
} else {
|
||||
linux_exit(ret);
|
||||
printf("__vdso_gettimeofday failed\n");
|
||||
}
|
||||
|
||||
linux_exit(0);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* This is the real entry point. It passes the initial stack into
|
||||
* the C entry point.
|
||||
*/
|
||||
asm (
|
||||
".text\n"
|
||||
".global _start\n"
|
||||
".type _start,@function\n"
|
||||
"_start:\n\t"
|
||||
"mov %rsp,%rdi\n\t"
|
||||
"jmp c_main"
|
||||
);
|
||||
|
|
22
MAINTAINERS
22
MAINTAINERS
|
@ -604,6 +604,13 @@ L: amd64-microcode@amd64.org
|
|||
S: Maintained
|
||||
F: arch/x86/kernel/microcode_amd.c
|
||||
|
||||
AMD XGBE DRIVER
|
||||
M: Tom Lendacky <thomas.lendacky@amd.com>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/net/ethernet/amd/xgbe/
|
||||
F: drivers/net/phy/amd-xgbe-phy.c
|
||||
|
||||
AMS (Apple Motion Sensor) DRIVER
|
||||
M: Michael Hanselmann <linux-kernel@hansmi.ch>
|
||||
S: Supported
|
||||
|
@ -1894,7 +1901,7 @@ F: drivers/net/ethernet/broadcom/bnx2.*
|
|||
F: drivers/net/ethernet/broadcom/bnx2_*
|
||||
|
||||
BROADCOM BNX2X 10 GIGABIT ETHERNET DRIVER
|
||||
M: Ariel Elior <ariele@broadcom.com>
|
||||
M: Ariel Elior <ariel.elior@qlogic.com>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/net/ethernet/broadcom/bnx2x/
|
||||
|
@ -1974,6 +1981,12 @@ S: Maintained
|
|||
F: drivers/bcma/
|
||||
F: include/linux/bcma/
|
||||
|
||||
BROADCOM SYSTEMPORT ETHERNET DRIVER
|
||||
M: Florian Fainelli <f.fainelli@gmail.com>
|
||||
L: netdev@vger.kernel.org
|
||||
S: Supported
|
||||
F: drivers/net/ethernet/broadcom/bcmsysport.*
|
||||
|
||||
BROCADE BFA FC SCSI DRIVER
|
||||
M: Anil Gurumurthy <anil.gurumurthy@qlogic.com>
|
||||
M: Sudarsana Kalluru <sudarsana.kalluru@qlogic.com>
|
||||
|
@ -2230,9 +2243,8 @@ F: drivers/platform/chrome/
|
|||
CISCO VIC ETHERNET NIC DRIVER
|
||||
M: Christian Benvenuti <benve@cisco.com>
|
||||
M: Sujith Sankar <ssujith@cisco.com>
|
||||
M: Govindarajulu Varadarajan <govindarajulu90@gmail.com>
|
||||
M: Govindarajulu Varadarajan <_govind@gmx.com>
|
||||
M: Neel Patel <neepatel@cisco.com>
|
||||
M: Nishank Trivedi <nistrive@cisco.com>
|
||||
S: Supported
|
||||
F: drivers/net/ethernet/cisco/enic/
|
||||
|
||||
|
@ -2582,7 +2594,7 @@ S: Supported
|
|||
F: drivers/infiniband/hw/cxgb3/
|
||||
|
||||
CXGB4 ETHERNET DRIVER (CXGB4)
|
||||
M: Dimitris Michailidis <dm@chelsio.com>
|
||||
M: Hariprasad S <hariprasad@chelsio.com>
|
||||
L: netdev@vger.kernel.org
|
||||
W: http://www.chelsio.com
|
||||
S: Supported
|
||||
|
@ -2952,6 +2964,7 @@ L: dri-devel@lists.freedesktop.org
|
|||
T: git git://people.freedesktop.org/~airlied/linux
|
||||
S: Maintained
|
||||
F: drivers/gpu/drm/
|
||||
F: drivers/gpu/vga/
|
||||
F: include/drm/
|
||||
F: include/uapi/drm/
|
||||
|
||||
|
@ -6167,6 +6180,7 @@ F: include/uapi/linux/netdevice.h
|
|||
F: tools/net/
|
||||
F: tools/testing/selftests/net/
|
||||
F: lib/random32.c
|
||||
F: lib/test_bpf.c
|
||||
|
||||
NETWORKING [IPv4/IPv6]
|
||||
M: "David S. Miller" <davem@davemloft.net>
|
||||
|
|
93
Makefile
93
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 3
|
||||
PATCHLEVEL = 15
|
||||
PATCHLEVEL = 16
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION =
|
||||
EXTRAVERSION = -rc1
|
||||
NAME = Shuffling Zombie Juror
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
@ -105,10 +105,6 @@ ifeq ("$(origin O)", "command line")
|
|||
KBUILD_OUTPUT := $(O)
|
||||
endif
|
||||
|
||||
ifeq ("$(origin W)", "command line")
|
||||
export KBUILD_ENABLE_EXTRA_GCC_CHECKS := $(W)
|
||||
endif
|
||||
|
||||
# That's our default target when none is given on the command line
|
||||
PHONY := _all
|
||||
_all:
|
||||
|
@ -153,8 +149,18 @@ else
|
|||
_all: modules
|
||||
endif
|
||||
|
||||
srctree := $(if $(KBUILD_SRC),$(KBUILD_SRC),$(CURDIR))
|
||||
objtree := $(CURDIR)
|
||||
ifeq ($(KBUILD_SRC),)
|
||||
# building in the source tree
|
||||
srctree := .
|
||||
else
|
||||
ifeq ($(KBUILD_SRC)/,$(dir $(CURDIR)))
|
||||
# building in a subdirectory of the source tree
|
||||
srctree := ..
|
||||
else
|
||||
srctree := $(KBUILD_SRC)
|
||||
endif
|
||||
endif
|
||||
objtree := .
|
||||
src := $(srctree)
|
||||
obj := $(objtree)
|
||||
|
||||
|
@ -166,7 +172,7 @@ export srctree objtree VPATH
|
|||
# SUBARCH tells the usermode build what the underlying arch is. That is set
|
||||
# first, and if a usermode build is happening, the "ARCH=um" on the command
|
||||
# line overrides the setting of ARCH below. If a native build is happening,
|
||||
# then ARCH is assigned, getting whatever value it gets normally, and
|
||||
# then ARCH is assigned, getting whatever value it gets normally, and
|
||||
# SUBARCH is subsequently ignored.
|
||||
|
||||
SUBARCH := $(shell uname -m | sed -e s/i.86/x86/ -e s/x86_64/x86/ \
|
||||
|
@ -259,18 +265,18 @@ endif
|
|||
KBUILD_MODULES :=
|
||||
KBUILD_BUILTIN := 1
|
||||
|
||||
# If we have only "make modules", don't compile built-in objects.
|
||||
# When we're building modules with modversions, we need to consider
|
||||
# the built-in objects during the descend as well, in order to
|
||||
# make sure the checksums are up to date before we record them.
|
||||
# If we have only "make modules", don't compile built-in objects.
|
||||
# When we're building modules with modversions, we need to consider
|
||||
# the built-in objects during the descend as well, in order to
|
||||
# make sure the checksums are up to date before we record them.
|
||||
|
||||
ifeq ($(MAKECMDGOALS),modules)
|
||||
KBUILD_BUILTIN := $(if $(CONFIG_MODVERSIONS),1)
|
||||
endif
|
||||
|
||||
# If we have "make <whatever> modules", compile modules
|
||||
# in addition to whatever we do anyway.
|
||||
# Just "make" or "make all" shall build modules as well
|
||||
# If we have "make <whatever> modules", compile modules
|
||||
# in addition to whatever we do anyway.
|
||||
# Just "make" or "make all" shall build modules as well
|
||||
|
||||
ifneq ($(filter all _all modules,$(MAKECMDGOALS)),)
|
||||
KBUILD_MODULES := 1
|
||||
|
@ -294,7 +300,7 @@ export KBUILD_CHECKSRC KBUILD_SRC KBUILD_EXTMOD
|
|||
# cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $<
|
||||
#
|
||||
# If $(quiet) is empty, the whole command will be printed.
|
||||
# If it is set to "quiet_", only the short version will be printed.
|
||||
# If it is set to "quiet_", only the short version will be printed.
|
||||
# If it is set to "silent_", nothing will be printed at all, since
|
||||
# the variable $(silent_cmd_cc_o_c) doesn't exist.
|
||||
#
|
||||
|
@ -346,7 +352,6 @@ $(srctree)/scripts/Kbuild.include: ;
|
|||
include $(srctree)/scripts/Kbuild.include
|
||||
|
||||
# Make variables (CC, etc...)
|
||||
|
||||
AS = $(CROSS_COMPILE)as
|
||||
LD = $(CROSS_COMPILE)ld
|
||||
CC = $(CROSS_COMPILE)gcc
|
||||
|
@ -395,8 +400,8 @@ KBUILD_CPPFLAGS := -D__KERNEL__
|
|||
KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
|
||||
-fno-strict-aliasing -fno-common \
|
||||
-Werror-implicit-function-declaration \
|
||||
-Wno-format-security \
|
||||
$(call cc-option,-fno-delete-null-pointer-checks,)
|
||||
-Wno-format-security
|
||||
|
||||
KBUILD_AFLAGS_KERNEL :=
|
||||
KBUILD_CFLAGS_KERNEL :=
|
||||
KBUILD_AFLAGS := -D__ASSEMBLY__
|
||||
|
@ -504,8 +509,16 @@ ifeq ($(mixed-targets),1)
|
|||
# We're called with mixed targets (*config and build targets).
|
||||
# Handle them one by one.
|
||||
|
||||
%:: FORCE
|
||||
$(Q)$(MAKE) -C $(srctree) KBUILD_SRC= $@
|
||||
PHONY += $(MAKECMDGOALS) __build_one_by_one
|
||||
|
||||
$(filter-out __build_one_by_one, $(MAKECMDGOALS)): __build_one_by_one
|
||||
@:
|
||||
|
||||
__build_one_by_one:
|
||||
$(Q)set -e; \
|
||||
for i in $(MAKECMDGOALS); do \
|
||||
$(MAKE) -f $(srctree)/Makefile $$i; \
|
||||
done
|
||||
|
||||
else
|
||||
ifeq ($(config-targets),1)
|
||||
|
@ -520,11 +533,9 @@ include $(srctree)/arch/$(SRCARCH)/Makefile
|
|||
export KBUILD_DEFCONFIG KBUILD_KCONFIG
|
||||
|
||||
config: scripts_basic outputmakefile FORCE
|
||||
$(Q)mkdir -p include/linux include/config
|
||||
$(Q)$(MAKE) $(build)=scripts/kconfig $@
|
||||
|
||||
%config: scripts_basic outputmakefile FORCE
|
||||
$(Q)mkdir -p include/linux include/config
|
||||
$(Q)$(MAKE) $(build)=scripts/kconfig $@
|
||||
|
||||
else
|
||||
|
@ -594,14 +605,16 @@ endif # $(dot-config)
|
|||
# Defaults to vmlinux, but the arch makefile usually adds further targets
|
||||
all: vmlinux
|
||||
|
||||
include $(srctree)/arch/$(SRCARCH)/Makefile
|
||||
|
||||
KBUILD_CFLAGS += $(call cc-option,-fno-delete-null-pointer-checks,)
|
||||
|
||||
ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
|
||||
KBUILD_CFLAGS += -Os $(call cc-disable-warning,maybe-uninitialized,)
|
||||
else
|
||||
KBUILD_CFLAGS += -O2
|
||||
endif
|
||||
|
||||
include $(srctree)/arch/$(SRCARCH)/Makefile
|
||||
|
||||
ifdef CONFIG_READABLE_ASM
|
||||
# Disable optimizations that make assembler listings hard to read.
|
||||
# reorder blocks reorders the control in the function
|
||||
|
@ -731,6 +744,8 @@ ifeq ($(shell $(CONFIG_SHELL) $(srctree)/scripts/gcc-goto.sh $(CC)), y)
|
|||
KBUILD_CFLAGS += -DCC_HAVE_ASM_GOTO
|
||||
endif
|
||||
|
||||
include $(srctree)/scripts/Makefile.extrawarn
|
||||
|
||||
# Add user supplied CPPFLAGS, AFLAGS and CFLAGS as the last assignments
|
||||
KBUILD_CPPFLAGS += $(KCPPFLAGS)
|
||||
KBUILD_AFLAGS += $(KAFLAGS)
|
||||
|
@ -775,10 +790,10 @@ MODLIB = $(INSTALL_MOD_PATH)/lib/modules/$(KERNELRELEASE)
|
|||
export MODLIB
|
||||
|
||||
#
|
||||
# INSTALL_MOD_STRIP, if defined, will cause modules to be
|
||||
# stripped after they are installed. If INSTALL_MOD_STRIP is '1', then
|
||||
# the default option --strip-debug will be used. Otherwise,
|
||||
# INSTALL_MOD_STRIP value will be used as the options to the strip command.
|
||||
# INSTALL_MOD_STRIP, if defined, will cause modules to be
|
||||
# stripped after they are installed. If INSTALL_MOD_STRIP is '1', then
|
||||
# the default option --strip-debug will be used. Otherwise,
|
||||
# INSTALL_MOD_STRIP value will be used as the options to the strip command.
|
||||
|
||||
ifdef INSTALL_MOD_STRIP
|
||||
ifeq ($(INSTALL_MOD_STRIP),1)
|
||||
|
@ -863,7 +878,7 @@ ifdef CONFIG_BUILD_DOCSRC
|
|||
endif
|
||||
+$(call if_changed,link-vmlinux)
|
||||
|
||||
# The actual objects are generated when descending,
|
||||
# The actual objects are generated when descending,
|
||||
# make sure no implicit rule kicks in
|
||||
$(sort $(vmlinux-deps)): $(vmlinux-dirs) ;
|
||||
|
||||
|
@ -1021,11 +1036,11 @@ ifdef CONFIG_MODULES
|
|||
|
||||
all: modules
|
||||
|
||||
# Build modules
|
||||
# Build modules
|
||||
#
|
||||
# A module can be listed more than once in obj-m resulting in
|
||||
# duplicate lines in modules.order files. Those are removed
|
||||
# using awk while concatenating to the final file.
|
||||
# A module can be listed more than once in obj-m resulting in
|
||||
# duplicate lines in modules.order files. Those are removed
|
||||
# using awk while concatenating to the final file.
|
||||
|
||||
PHONY += modules
|
||||
modules: $(vmlinux-dirs) $(if $(KBUILD_BUILTIN),vmlinux) modules.builtin
|
||||
|
@ -1054,10 +1069,10 @@ _modinst_:
|
|||
@rm -rf $(MODLIB)/kernel
|
||||
@rm -f $(MODLIB)/source
|
||||
@mkdir -p $(MODLIB)/kernel
|
||||
@ln -s $(srctree) $(MODLIB)/source
|
||||
@ln -s `cd $(srctree) && /bin/pwd` $(MODLIB)/source
|
||||
@if [ ! $(objtree) -ef $(MODLIB)/build ]; then \
|
||||
rm -f $(MODLIB)/build ; \
|
||||
ln -s $(objtree) $(MODLIB)/build ; \
|
||||
ln -s $(CURDIR) $(MODLIB)/build ; \
|
||||
fi
|
||||
@cp -f $(objtree)/modules.order $(MODLIB)/
|
||||
@cp -f $(objtree)/modules.builtin $(MODLIB)/
|
||||
|
@ -1104,7 +1119,7 @@ CLEAN_DIRS += $(MODVERDIR)
|
|||
|
||||
# Directories & files removed with 'make mrproper'
|
||||
MRPROPER_DIRS += include/config usr/include include/generated \
|
||||
arch/*/include/generated .tmp_objdiff
|
||||
arch/*/include/generated .tmp_objdiff
|
||||
MRPROPER_FILES += .config .config.old .version .old_version $(version_h) \
|
||||
Module.symvers tags TAGS cscope* GPATH GTAGS GRTAGS GSYMS \
|
||||
signing_key.priv signing_key.x509 x509.genkey \
|
||||
|
@ -1478,7 +1493,7 @@ endif
|
|||
$(build)=$(build-dir) $(@:.ko=.o)
|
||||
$(Q)$(MAKE) -f $(srctree)/scripts/Makefile.modpost
|
||||
|
||||
# FIXME Should go into a make.lib or something
|
||||
# FIXME Should go into a make.lib or something
|
||||
# ===========================================================================
|
||||
|
||||
quiet_cmd_rmdirs = $(if $(wildcard $(rm-dirs)),CLEAN $(wildcard $(rm-dirs)))
|
||||
|
|
|
@ -357,7 +357,7 @@ dtb-$(CONFIG_ARCH_STI)+= stih407-b2120.dtb \
|
|||
stih415-b2020.dtb \
|
||||
stih416-b2000.dtb \
|
||||
stih416-b2020.dtb \
|
||||
stih416-b2020-revE.dtb
|
||||
stih416-b2020e.dtb
|
||||
dtb-$(CONFIG_MACH_SUN4I) += \
|
||||
sun4i-a10-a1000.dtb \
|
||||
sun4i-a10-cubieboard.dtb \
|
||||
|
|
|
@ -662,6 +662,8 @@
|
|||
mac: ethernet@4a100000 {
|
||||
compatible = "ti,cpsw";
|
||||
ti,hwmods = "cpgmac0";
|
||||
clocks = <&cpsw_125mhz_gclk>, <&cpsw_cpts_rft_clk>;
|
||||
clock-names = "fck", "cpts";
|
||||
cpdma_channels = <8>;
|
||||
ale_entries = <1024>;
|
||||
bd_ram_size = <0x2000>;
|
||||
|
|
|
@ -490,6 +490,8 @@
|
|||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
ti,hwmods = "cpgmac0";
|
||||
clocks = <&cpsw_125mhz_gclk>, <&cpsw_cpts_rft_clk>;
|
||||
clock-names = "fck", "cpts";
|
||||
status = "disabled";
|
||||
cpdma_channels = <8>;
|
||||
ale_entries = <1024>;
|
||||
|
|
|
@ -57,6 +57,10 @@
|
|||
ethernet@30000 {
|
||||
status = "okay";
|
||||
phy-mode = "sgmii";
|
||||
fixed-link {
|
||||
speed = <1000>;
|
||||
full-duplex;
|
||||
};
|
||||
};
|
||||
|
||||
pcie-controller {
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
clock-frequency = <0>;
|
||||
};
|
||||
|
||||
atlclkin3_ck: atlclkin3_ck {
|
||||
atl_clkin3_ck: atl_clkin3_ck {
|
||||
#clock-cells = <0>;
|
||||
compatible = "fixed-clock";
|
||||
clock-frequency = <0>;
|
||||
|
@ -277,7 +277,7 @@
|
|||
|
||||
dpll_mpu_ck: dpll_mpu_ck {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,omap4-dpll-clock";
|
||||
compatible = "ti,omap5-mpu-dpll-clock";
|
||||
clocks = <&sys_clkin1>, <&mpu_dpll_hs_clk_div>;
|
||||
reg = <0x0160>, <0x0164>, <0x016c>, <0x0168>;
|
||||
};
|
||||
|
@ -730,7 +730,7 @@
|
|||
mcasp1_ahclkr_mux: mcasp1_ahclkr_mux {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,mux-clock";
|
||||
clocks = <&abe_24m_fclk>, <&abe_sys_clk_div>, <&func_24m_clk>, <&atlclkin3_ck>, <&atl_clkin2_ck>, <&atl_clkin1_ck>, <&atl_clkin0_ck>, <&sys_clkin2>, <&ref_clkin0_ck>, <&ref_clkin1_ck>, <&ref_clkin2_ck>, <&ref_clkin3_ck>, <&mlb_clk>, <&mlbp_clk>;
|
||||
clocks = <&abe_24m_fclk>, <&abe_sys_clk_div>, <&func_24m_clk>, <&atl_clkin3_ck>, <&atl_clkin2_ck>, <&atl_clkin1_ck>, <&atl_clkin0_ck>, <&sys_clkin2>, <&ref_clkin0_ck>, <&ref_clkin1_ck>, <&ref_clkin2_ck>, <&ref_clkin3_ck>, <&mlb_clk>, <&mlbp_clk>;
|
||||
ti,bit-shift = <28>;
|
||||
reg = <0x0550>;
|
||||
};
|
||||
|
@ -738,7 +738,7 @@
|
|||
mcasp1_ahclkx_mux: mcasp1_ahclkx_mux {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,mux-clock";
|
||||
clocks = <&abe_24m_fclk>, <&abe_sys_clk_div>, <&func_24m_clk>, <&atlclkin3_ck>, <&atl_clkin2_ck>, <&atl_clkin1_ck>, <&atl_clkin0_ck>, <&sys_clkin2>, <&ref_clkin0_ck>, <&ref_clkin1_ck>, <&ref_clkin2_ck>, <&ref_clkin3_ck>, <&mlb_clk>, <&mlbp_clk>;
|
||||
clocks = <&abe_24m_fclk>, <&abe_sys_clk_div>, <&func_24m_clk>, <&atl_clkin3_ck>, <&atl_clkin2_ck>, <&atl_clkin1_ck>, <&atl_clkin0_ck>, <&sys_clkin2>, <&ref_clkin0_ck>, <&ref_clkin1_ck>, <&ref_clkin2_ck>, <&ref_clkin3_ck>, <&mlb_clk>, <&mlbp_clk>;
|
||||
ti,bit-shift = <24>;
|
||||
reg = <0x0550>;
|
||||
};
|
||||
|
@ -1639,7 +1639,7 @@
|
|||
mcasp2_ahclkr_mux: mcasp2_ahclkr_mux {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,mux-clock";
|
||||
clocks = <&abe_24m_fclk>, <&abe_sys_clk_div>, <&func_24m_clk>, <&atlclkin3_ck>, <&atl_clkin2_ck>, <&atl_clkin1_ck>, <&atl_clkin0_ck>, <&sys_clkin2>, <&ref_clkin0_ck>, <&ref_clkin1_ck>, <&ref_clkin2_ck>, <&ref_clkin3_ck>, <&mlb_clk>, <&mlbp_clk>;
|
||||
clocks = <&abe_24m_fclk>, <&abe_sys_clk_div>, <&func_24m_clk>, <&atl_clkin3_ck>, <&atl_clkin2_ck>, <&atl_clkin1_ck>, <&atl_clkin0_ck>, <&sys_clkin2>, <&ref_clkin0_ck>, <&ref_clkin1_ck>, <&ref_clkin2_ck>, <&ref_clkin3_ck>, <&mlb_clk>, <&mlbp_clk>;
|
||||
ti,bit-shift = <28>;
|
||||
reg = <0x1860>;
|
||||
};
|
||||
|
@ -1647,7 +1647,7 @@
|
|||
mcasp2_ahclkx_mux: mcasp2_ahclkx_mux {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,mux-clock";
|
||||
clocks = <&abe_24m_fclk>, <&abe_sys_clk_div>, <&func_24m_clk>, <&atlclkin3_ck>, <&atl_clkin2_ck>, <&atl_clkin1_ck>, <&atl_clkin0_ck>, <&sys_clkin2>, <&ref_clkin0_ck>, <&ref_clkin1_ck>, <&ref_clkin2_ck>, <&ref_clkin3_ck>, <&mlb_clk>, <&mlbp_clk>;
|
||||
clocks = <&abe_24m_fclk>, <&abe_sys_clk_div>, <&func_24m_clk>, <&atl_clkin3_ck>, <&atl_clkin2_ck>, <&atl_clkin1_ck>, <&atl_clkin0_ck>, <&sys_clkin2>, <&ref_clkin0_ck>, <&ref_clkin1_ck>, <&ref_clkin2_ck>, <&ref_clkin3_ck>, <&mlb_clk>, <&mlbp_clk>;
|
||||
ti,bit-shift = <24>;
|
||||
reg = <0x1860>;
|
||||
};
|
||||
|
@ -1663,7 +1663,7 @@
|
|||
mcasp3_ahclkx_mux: mcasp3_ahclkx_mux {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,mux-clock";
|
||||
clocks = <&abe_24m_fclk>, <&abe_sys_clk_div>, <&func_24m_clk>, <&atlclkin3_ck>, <&atl_clkin2_ck>, <&atl_clkin1_ck>, <&atl_clkin0_ck>, <&sys_clkin2>, <&ref_clkin0_ck>, <&ref_clkin1_ck>, <&ref_clkin2_ck>, <&ref_clkin3_ck>, <&mlb_clk>, <&mlbp_clk>;
|
||||
clocks = <&abe_24m_fclk>, <&abe_sys_clk_div>, <&func_24m_clk>, <&atl_clkin3_ck>, <&atl_clkin2_ck>, <&atl_clkin1_ck>, <&atl_clkin0_ck>, <&sys_clkin2>, <&ref_clkin0_ck>, <&ref_clkin1_ck>, <&ref_clkin2_ck>, <&ref_clkin3_ck>, <&mlb_clk>, <&mlbp_clk>;
|
||||
ti,bit-shift = <24>;
|
||||
reg = <0x1868>;
|
||||
};
|
||||
|
@ -1679,7 +1679,7 @@
|
|||
mcasp4_ahclkx_mux: mcasp4_ahclkx_mux {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,mux-clock";
|
||||
clocks = <&abe_24m_fclk>, <&abe_sys_clk_div>, <&func_24m_clk>, <&atlclkin3_ck>, <&atl_clkin2_ck>, <&atl_clkin1_ck>, <&atl_clkin0_ck>, <&sys_clkin2>, <&ref_clkin0_ck>, <&ref_clkin1_ck>, <&ref_clkin2_ck>, <&ref_clkin3_ck>, <&mlb_clk>, <&mlbp_clk>;
|
||||
clocks = <&abe_24m_fclk>, <&abe_sys_clk_div>, <&func_24m_clk>, <&atl_clkin3_ck>, <&atl_clkin2_ck>, <&atl_clkin1_ck>, <&atl_clkin0_ck>, <&sys_clkin2>, <&ref_clkin0_ck>, <&ref_clkin1_ck>, <&ref_clkin2_ck>, <&ref_clkin3_ck>, <&mlb_clk>, <&mlbp_clk>;
|
||||
ti,bit-shift = <24>;
|
||||
reg = <0x1898>;
|
||||
};
|
||||
|
@ -1695,7 +1695,7 @@
|
|||
mcasp5_ahclkx_mux: mcasp5_ahclkx_mux {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,mux-clock";
|
||||
clocks = <&abe_24m_fclk>, <&abe_sys_clk_div>, <&func_24m_clk>, <&atlclkin3_ck>, <&atl_clkin2_ck>, <&atl_clkin1_ck>, <&atl_clkin0_ck>, <&sys_clkin2>, <&ref_clkin0_ck>, <&ref_clkin1_ck>, <&ref_clkin2_ck>, <&ref_clkin3_ck>, <&mlb_clk>, <&mlbp_clk>;
|
||||
clocks = <&abe_24m_fclk>, <&abe_sys_clk_div>, <&func_24m_clk>, <&atl_clkin3_ck>, <&atl_clkin2_ck>, <&atl_clkin1_ck>, <&atl_clkin0_ck>, <&sys_clkin2>, <&ref_clkin0_ck>, <&ref_clkin1_ck>, <&ref_clkin2_ck>, <&ref_clkin3_ck>, <&mlb_clk>, <&mlbp_clk>;
|
||||
ti,bit-shift = <24>;
|
||||
reg = <0x1878>;
|
||||
};
|
||||
|
@ -1711,7 +1711,7 @@
|
|||
mcasp6_ahclkx_mux: mcasp6_ahclkx_mux {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,mux-clock";
|
||||
clocks = <&abe_24m_fclk>, <&abe_sys_clk_div>, <&func_24m_clk>, <&atlclkin3_ck>, <&atl_clkin2_ck>, <&atl_clkin1_ck>, <&atl_clkin0_ck>, <&sys_clkin2>, <&ref_clkin0_ck>, <&ref_clkin1_ck>, <&ref_clkin2_ck>, <&ref_clkin3_ck>, <&mlb_clk>, <&mlbp_clk>;
|
||||
clocks = <&abe_24m_fclk>, <&abe_sys_clk_div>, <&func_24m_clk>, <&atl_clkin3_ck>, <&atl_clkin2_ck>, <&atl_clkin1_ck>, <&atl_clkin0_ck>, <&sys_clkin2>, <&ref_clkin0_ck>, <&ref_clkin1_ck>, <&ref_clkin2_ck>, <&ref_clkin3_ck>, <&mlb_clk>, <&mlbp_clk>;
|
||||
ti,bit-shift = <24>;
|
||||
reg = <0x1904>;
|
||||
};
|
||||
|
@ -1727,7 +1727,7 @@
|
|||
mcasp7_ahclkx_mux: mcasp7_ahclkx_mux {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,mux-clock";
|
||||
clocks = <&abe_24m_fclk>, <&abe_sys_clk_div>, <&func_24m_clk>, <&atlclkin3_ck>, <&atl_clkin2_ck>, <&atl_clkin1_ck>, <&atl_clkin0_ck>, <&sys_clkin2>, <&ref_clkin0_ck>, <&ref_clkin1_ck>, <&ref_clkin2_ck>, <&ref_clkin3_ck>, <&mlb_clk>, <&mlbp_clk>;
|
||||
clocks = <&abe_24m_fclk>, <&abe_sys_clk_div>, <&func_24m_clk>, <&atl_clkin3_ck>, <&atl_clkin2_ck>, <&atl_clkin1_ck>, <&atl_clkin0_ck>, <&sys_clkin2>, <&ref_clkin0_ck>, <&ref_clkin1_ck>, <&ref_clkin2_ck>, <&ref_clkin3_ck>, <&mlb_clk>, <&mlbp_clk>;
|
||||
ti,bit-shift = <24>;
|
||||
reg = <0x1908>;
|
||||
};
|
||||
|
@ -1743,7 +1743,7 @@
|
|||
mcasp8_ahclk_mux: mcasp8_ahclk_mux {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,mux-clock";
|
||||
clocks = <&abe_24m_fclk>, <&abe_sys_clk_div>, <&func_24m_clk>, <&atlclkin3_ck>, <&atl_clkin2_ck>, <&atl_clkin1_ck>, <&atl_clkin0_ck>, <&sys_clkin2>, <&ref_clkin0_ck>, <&ref_clkin1_ck>, <&ref_clkin2_ck>, <&ref_clkin3_ck>, <&mlb_clk>, <&mlbp_clk>;
|
||||
clocks = <&abe_24m_fclk>, <&abe_sys_clk_div>, <&func_24m_clk>, <&atl_clkin3_ck>, <&atl_clkin2_ck>, <&atl_clkin1_ck>, <&atl_clkin0_ck>, <&sys_clkin2>, <&ref_clkin0_ck>, <&ref_clkin1_ck>, <&ref_clkin2_ck>, <&ref_clkin3_ck>, <&mlb_clk>, <&mlbp_clk>;
|
||||
ti,bit-shift = <22>;
|
||||
reg = <0x1890>;
|
||||
};
|
||||
|
|
|
@ -335,7 +335,7 @@
|
|||
|
||||
dpll_mpu_ck: dpll_mpu_ck {
|
||||
#clock-cells = <0>;
|
||||
compatible = "ti,omap4-dpll-clock";
|
||||
compatible = "ti,omap5-mpu-dpll-clock";
|
||||
clocks = <&sys_clkin>, <&mpu_dpll_hs_clk_div>;
|
||||
reg = <0x0160>, <0x0164>, <0x016c>, <0x0168>;
|
||||
};
|
||||
|
|
|
@ -169,8 +169,8 @@
|
|||
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_mii0>;
|
||||
clock-names = "stmmaceth";
|
||||
clocks = <&clk_s_a1_ls CLK_GMAC0_PHY>;
|
||||
clock-names = "stmmaceth", "sti-ethclk";
|
||||
clocks = <&clk_s_a1_ls CLK_ICN_IF_2>, <&clk_s_a1_ls CLK_GMAC0_PHY>;
|
||||
};
|
||||
|
||||
ethernet1: dwmac@fef08000 {
|
||||
|
@ -192,8 +192,8 @@
|
|||
reset-names = "stmmaceth";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_mii1>;
|
||||
clock-names = "stmmaceth";
|
||||
clocks = <&clk_s_a0_ls CLK_ETH1_PHY>;
|
||||
clock-names = "stmmaceth", "sti-ethclk";
|
||||
clocks = <&clk_s_a0_ls CLK_ICN_REG>, <&clk_s_a0_ls CLK_ETH1_PHY>;
|
||||
};
|
||||
|
||||
rc: rc@fe518000 {
|
||||
|
|
|
@ -175,8 +175,8 @@
|
|||
reset-names = "stmmaceth";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_mii0>;
|
||||
clock-names = "stmmaceth";
|
||||
clocks = <&clk_s_a1_ls CLK_GMAC0_PHY>;
|
||||
clock-names = "stmmaceth", "sti-ethclk";
|
||||
clocks = <&clk_s_a1_ls CLK_ICN_IF_2>, <&clk_s_a1_ls CLK_GMAC0_PHY>;
|
||||
};
|
||||
|
||||
ethernet1: dwmac@fef08000 {
|
||||
|
@ -197,8 +197,8 @@
|
|||
reset-names = "stmmaceth";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&pinctrl_mii1>;
|
||||
clock-names = "stmmaceth";
|
||||
clocks = <&clk_s_a0_ls CLK_ETH1_PHY>;
|
||||
clock-names = "stmmaceth", "sti-ethclk";
|
||||
clocks = <&clk_s_a0_ls CLK_ICN_REG>, <&clk_s_a0_ls CLK_ETH1_PHY>;
|
||||
};
|
||||
|
||||
rc: rc@fe518000 {
|
||||
|
|
|
@ -165,5 +165,11 @@
|
|||
reg = <0xd8100000 0x10000>;
|
||||
interrupts = <48>;
|
||||
};
|
||||
|
||||
ethernet@d8004000 {
|
||||
compatible = "via,vt8500-rhine";
|
||||
reg = <0xd8004000 0x100>;
|
||||
interrupts = <10>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
@ -218,5 +218,11 @@
|
|||
reg = <0xd8100000 0x10000>;
|
||||
interrupts = <48>;
|
||||
};
|
||||
|
||||
ethernet@d8004000 {
|
||||
compatible = "via,vt8500-rhine";
|
||||
reg = <0xd8004000 0x100>;
|
||||
interrupts = <10>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
@ -298,5 +298,11 @@
|
|||
bus-width = <4>;
|
||||
sdon-inverted;
|
||||
};
|
||||
|
||||
ethernet@d8004000 {
|
||||
compatible = "via,vt8500-rhine";
|
||||
reg = <0xd8004000 0x100>;
|
||||
interrupts = <10>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
@ -410,7 +410,7 @@ __hw_perf_event_init(struct perf_event *event)
|
|||
*/
|
||||
hwc->config_base |= (unsigned long)mapping;
|
||||
|
||||
if (!hwc->sample_period) {
|
||||
if (!is_sampling_event(event)) {
|
||||
/*
|
||||
* For non-sampling runs, limit the sample_period to half
|
||||
* of the counter width. That way, the new counter value
|
||||
|
|
|
@ -126,8 +126,8 @@ static int cpu_pmu_request_irq(struct arm_pmu *cpu_pmu, irq_handler_t handler)
|
|||
|
||||
irqs = min(pmu_device->num_resources, num_possible_cpus());
|
||||
if (irqs < 1) {
|
||||
pr_err("no irqs for PMUs defined\n");
|
||||
return -ENODEV;
|
||||
printk_once("perf/ARM: No irqs for PMU defined, sampling events not supported\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
irq = platform_get_irq(pmu_device, 0);
|
||||
|
@ -191,6 +191,10 @@ static void cpu_pmu_init(struct arm_pmu *cpu_pmu)
|
|||
/* Ensure the PMU has sane values out of reset. */
|
||||
if (cpu_pmu->reset)
|
||||
on_each_cpu(cpu_pmu->reset, cpu_pmu, 1);
|
||||
|
||||
/* If no interrupts available, set the corresponding capability flag */
|
||||
if (!platform_get_irq(cpu_pmu->plat_device, 0))
|
||||
cpu_pmu->pmu.capabilities |= PERF_PMU_CAP_NO_INTERRUPT;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -26,30 +26,30 @@
|
|||
#include <asm/topology.h>
|
||||
|
||||
/*
|
||||
* cpu power scale management
|
||||
* cpu capacity scale management
|
||||
*/
|
||||
|
||||
/*
|
||||
* cpu power table
|
||||
* cpu capacity table
|
||||
* This per cpu data structure describes the relative capacity of each core.
|
||||
* On a heteregenous system, cores don't have the same computation capacity
|
||||
* and we reflect that difference in the cpu_power field so the scheduler can
|
||||
* take this difference into account during load balance. A per cpu structure
|
||||
* is preferred because each CPU updates its own cpu_power field during the
|
||||
* load balance except for idle cores. One idle core is selected to run the
|
||||
* rebalance_domains for all idle cores and the cpu_power can be updated
|
||||
* during this sequence.
|
||||
* and we reflect that difference in the cpu_capacity field so the scheduler
|
||||
* can take this difference into account during load balance. A per cpu
|
||||
* structure is preferred because each CPU updates its own cpu_capacity field
|
||||
* during the load balance except for idle cores. One idle core is selected
|
||||
* to run the rebalance_domains for all idle cores and the cpu_capacity can be
|
||||
* updated during this sequence.
|
||||
*/
|
||||
static DEFINE_PER_CPU(unsigned long, cpu_scale);
|
||||
|
||||
unsigned long arch_scale_freq_power(struct sched_domain *sd, int cpu)
|
||||
unsigned long arch_scale_freq_capacity(struct sched_domain *sd, int cpu)
|
||||
{
|
||||
return per_cpu(cpu_scale, cpu);
|
||||
}
|
||||
|
||||
static void set_power_scale(unsigned int cpu, unsigned long power)
|
||||
static void set_capacity_scale(unsigned int cpu, unsigned long capacity)
|
||||
{
|
||||
per_cpu(cpu_scale, cpu) = power;
|
||||
per_cpu(cpu_scale, cpu) = capacity;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
|
@ -62,11 +62,11 @@ struct cpu_efficiency {
|
|||
* Table of relative efficiency of each processors
|
||||
* The efficiency value must fit in 20bit and the final
|
||||
* cpu_scale value must be in the range
|
||||
* 0 < cpu_scale < 3*SCHED_POWER_SCALE/2
|
||||
* 0 < cpu_scale < 3*SCHED_CAPACITY_SCALE/2
|
||||
* in order to return at most 1 when DIV_ROUND_CLOSEST
|
||||
* is used to compute the capacity of a CPU.
|
||||
* Processors that are not defined in the table,
|
||||
* use the default SCHED_POWER_SCALE value for cpu_scale.
|
||||
* use the default SCHED_CAPACITY_SCALE value for cpu_scale.
|
||||
*/
|
||||
static const struct cpu_efficiency table_efficiency[] = {
|
||||
{"arm,cortex-a15", 3891},
|
||||
|
@ -83,9 +83,9 @@ static unsigned long middle_capacity = 1;
|
|||
* Iterate all CPUs' descriptor in DT and compute the efficiency
|
||||
* (as per table_efficiency). Also calculate a middle efficiency
|
||||
* as close as possible to (max{eff_i} - min{eff_i}) / 2
|
||||
* This is later used to scale the cpu_power field such that an
|
||||
* 'average' CPU is of middle power. Also see the comments near
|
||||
* table_efficiency[] and update_cpu_power().
|
||||
* This is later used to scale the cpu_capacity field such that an
|
||||
* 'average' CPU is of middle capacity. Also see the comments near
|
||||
* table_efficiency[] and update_cpu_capacity().
|
||||
*/
|
||||
static void __init parse_dt_topology(void)
|
||||
{
|
||||
|
@ -141,15 +141,15 @@ static void __init parse_dt_topology(void)
|
|||
* cpu_scale because all CPUs have the same capacity. Otherwise, we
|
||||
* compute a middle_capacity factor that will ensure that the capacity
|
||||
* of an 'average' CPU of the system will be as close as possible to
|
||||
* SCHED_POWER_SCALE, which is the default value, but with the
|
||||
* SCHED_CAPACITY_SCALE, which is the default value, but with the
|
||||
* constraint explained near table_efficiency[].
|
||||
*/
|
||||
if (4*max_capacity < (3*(max_capacity + min_capacity)))
|
||||
middle_capacity = (min_capacity + max_capacity)
|
||||
>> (SCHED_POWER_SHIFT+1);
|
||||
>> (SCHED_CAPACITY_SHIFT+1);
|
||||
else
|
||||
middle_capacity = ((max_capacity / 3)
|
||||
>> (SCHED_POWER_SHIFT-1)) + 1;
|
||||
>> (SCHED_CAPACITY_SHIFT-1)) + 1;
|
||||
|
||||
}
|
||||
|
||||
|
@ -158,20 +158,20 @@ static void __init parse_dt_topology(void)
|
|||
* boot. The update of all CPUs is in O(n^2) for heteregeneous system but the
|
||||
* function returns directly for SMP system.
|
||||
*/
|
||||
static void update_cpu_power(unsigned int cpu)
|
||||
static void update_cpu_capacity(unsigned int cpu)
|
||||
{
|
||||
if (!cpu_capacity(cpu))
|
||||
return;
|
||||
|
||||
set_power_scale(cpu, cpu_capacity(cpu) / middle_capacity);
|
||||
set_capacity_scale(cpu, cpu_capacity(cpu) / middle_capacity);
|
||||
|
||||
printk(KERN_INFO "CPU%u: update cpu_power %lu\n",
|
||||
cpu, arch_scale_freq_power(NULL, cpu));
|
||||
printk(KERN_INFO "CPU%u: update cpu_capacity %lu\n",
|
||||
cpu, arch_scale_freq_capacity(NULL, cpu));
|
||||
}
|
||||
|
||||
#else
|
||||
static inline void parse_dt_topology(void) {}
|
||||
static inline void update_cpu_power(unsigned int cpuid) {}
|
||||
static inline void update_cpu_capacity(unsigned int cpuid) {}
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
@ -267,7 +267,7 @@ void store_cpu_topology(unsigned int cpuid)
|
|||
|
||||
update_siblings_masks(cpuid);
|
||||
|
||||
update_cpu_power(cpuid);
|
||||
update_cpu_capacity(cpuid);
|
||||
|
||||
printk(KERN_INFO "CPU%u: thread %d, cpu %d, socket %d, mpidr %x\n",
|
||||
cpuid, cpu_topology[cpuid].thread_id,
|
||||
|
@ -297,7 +297,7 @@ void __init init_cpu_topology(void)
|
|||
{
|
||||
unsigned int cpu;
|
||||
|
||||
/* init core mask and power*/
|
||||
/* init core mask and capacity */
|
||||
for_each_possible_cpu(cpu) {
|
||||
struct cputopo_arm *cpu_topo = &(cpu_topology[cpu]);
|
||||
|
||||
|
@ -307,7 +307,7 @@ void __init init_cpu_topology(void)
|
|||
cpumask_clear(&cpu_topo->core_sibling);
|
||||
cpumask_clear(&cpu_topo->thread_sibling);
|
||||
|
||||
set_power_scale(cpu, SCHED_POWER_SCALE);
|
||||
set_capacity_scale(cpu, SCHED_CAPACITY_SCALE);
|
||||
}
|
||||
smp_wmb();
|
||||
|
||||
|
|
|
@ -60,7 +60,8 @@
|
|||
|
||||
static struct pwm_lookup pwm_lookup[] = {
|
||||
/* LEDB -> PMU_STAT */
|
||||
PWM_LOOKUP("twl-pwmled", 1, "leds_pwm", "beagleboard::pmu_stat"),
|
||||
PWM_LOOKUP("twl-pwmled", 1, "leds_pwm", "beagleboard::pmu_stat",
|
||||
7812500, PWM_POLARITY_NORMAL),
|
||||
};
|
||||
|
||||
static struct led_pwm pwm_leds[] = {
|
||||
|
|
|
@ -208,3 +208,56 @@ void omap2xxx_clkt_vps_late_init(void)
|
|||
clk_put(c);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/clkdev.h>
|
||||
|
||||
static const struct clk_ops virt_prcm_set_ops = {
|
||||
.recalc_rate = &omap2_table_mpu_recalc,
|
||||
.set_rate = &omap2_select_table_rate,
|
||||
.round_rate = &omap2_round_to_table_rate,
|
||||
};
|
||||
|
||||
/**
|
||||
* omap2xxx_clkt_vps_init - initialize virt_prcm_set clock
|
||||
*
|
||||
* Does a manual init for the virtual prcm DVFS clock for OMAP2. This
|
||||
* function is called only from omap2 DT clock init, as the virtual
|
||||
* node is not modelled in the DT clock data.
|
||||
*/
|
||||
void omap2xxx_clkt_vps_init(void)
|
||||
{
|
||||
struct clk_init_data init = { NULL };
|
||||
struct clk_hw_omap *hw = NULL;
|
||||
struct clk *clk;
|
||||
const char *parent_name = "mpu_ck";
|
||||
struct clk_lookup *lookup = NULL;
|
||||
|
||||
omap2xxx_clkt_vps_late_init();
|
||||
omap2xxx_clkt_vps_check_bootloader_rates();
|
||||
|
||||
hw = kzalloc(sizeof(*hw), GFP_KERNEL);
|
||||
lookup = kzalloc(sizeof(*lookup), GFP_KERNEL);
|
||||
if (!hw || !lookup)
|
||||
goto cleanup;
|
||||
init.name = "virt_prcm_set";
|
||||
init.ops = &virt_prcm_set_ops;
|
||||
init.parent_names = &parent_name;
|
||||
init.num_parents = 1;
|
||||
|
||||
hw->hw.init = &init;
|
||||
|
||||
clk = clk_register(NULL, &hw->hw);
|
||||
|
||||
lookup->dev_id = NULL;
|
||||
lookup->con_id = "cpufreq_ck";
|
||||
lookup->clk = clk;
|
||||
|
||||
clkdev_add(lookup);
|
||||
return;
|
||||
cleanup:
|
||||
kfree(hw);
|
||||
kfree(lookup);
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -178,17 +178,6 @@ struct clksel {
|
|||
const struct clksel_rate *rates;
|
||||
};
|
||||
|
||||
struct clk_hw_omap_ops {
|
||||
void (*find_idlest)(struct clk_hw_omap *oclk,
|
||||
void __iomem **idlest_reg,
|
||||
u8 *idlest_bit, u8 *idlest_val);
|
||||
void (*find_companion)(struct clk_hw_omap *oclk,
|
||||
void __iomem **other_reg,
|
||||
u8 *other_bit);
|
||||
void (*allow_idle)(struct clk_hw_omap *oclk);
|
||||
void (*deny_idle)(struct clk_hw_omap *oclk);
|
||||
};
|
||||
|
||||
unsigned long omap_fixed_divisor_recalc(struct clk_hw *hw,
|
||||
unsigned long parent_rate);
|
||||
|
||||
|
@ -279,8 +268,6 @@ extern const struct clk_hw_omap_ops clkhwops_omap3430es2_hsotgusb_wait;
|
|||
extern const struct clk_hw_omap_ops clkhwops_am35xx_ipss_module_wait;
|
||||
extern const struct clk_hw_omap_ops clkhwops_apll54;
|
||||
extern const struct clk_hw_omap_ops clkhwops_apll96;
|
||||
extern const struct clk_hw_omap_ops clkhwops_omap2xxx_dpll;
|
||||
extern const struct clk_hw_omap_ops clkhwops_omap2430_i2chs_wait;
|
||||
|
||||
/* clksel_rate blocks shared between OMAP44xx and AM33xx */
|
||||
extern const struct clksel_rate div_1_0_rates[];
|
||||
|
|
|
@ -21,10 +21,6 @@ unsigned long omap2xxx_sys_clk_recalc(struct clk_hw *clk,
|
|||
unsigned long parent_rate);
|
||||
unsigned long omap2_osc_clk_recalc(struct clk_hw *clk,
|
||||
unsigned long parent_rate);
|
||||
unsigned long omap2_dpllcore_recalc(struct clk_hw *hw,
|
||||
unsigned long parent_rate);
|
||||
int omap2_reprogram_dpllcore(struct clk_hw *clk, unsigned long rate,
|
||||
unsigned long parent_rate);
|
||||
void omap2xxx_clkt_dpllcore_init(struct clk_hw *hw);
|
||||
unsigned long omap2_clk_apll54_recalc(struct clk_hw *hw,
|
||||
unsigned long parent_rate);
|
||||
|
|
|
@ -319,6 +319,15 @@ static int omap3_noncore_dpll_program(struct clk_hw_omap *clk, u16 freqsel)
|
|||
|
||||
/* Set DPLL multiplier, divider */
|
||||
v = omap2_clk_readl(clk, dd->mult_div1_reg);
|
||||
|
||||
/* Handle Duty Cycle Correction */
|
||||
if (dd->dcc_mask) {
|
||||
if (dd->last_rounded_rate >= dd->dcc_rate)
|
||||
v |= dd->dcc_mask; /* Enable DCC */
|
||||
else
|
||||
v &= ~dd->dcc_mask; /* Disable DCC */
|
||||
}
|
||||
|
||||
v &= ~(dd->mult_mask | dd->div1_mask);
|
||||
v |= dd->last_rounded_m << __ffs(dd->mult_mask);
|
||||
v |= (dd->last_rounded_n - 1) << __ffs(dd->div1_mask);
|
||||
|
|
|
@ -574,7 +574,8 @@ static struct platform_device backlight = {
|
|||
};
|
||||
|
||||
static struct pwm_lookup hx4700_pwm_lookup[] = {
|
||||
PWM_LOOKUP("pxa27x-pwm.1", 0, "pwm-backlight", NULL),
|
||||
PWM_LOOKUP("pxa27x-pwm.1", 0, "pwm-backlight", NULL,
|
||||
30923, PWM_POLARITY_NORMAL),
|
||||
};
|
||||
|
||||
/*
|
||||
|
|
|
@ -31,7 +31,7 @@
|
|||
#include <linux/gpio_keys.h>
|
||||
#include <linux/regulator/driver.h>
|
||||
#include <linux/pinctrl/machine.h>
|
||||
#include <linux/platform_data/pwm-renesas-tpu.h>
|
||||
#include <linux/pwm.h>
|
||||
#include <linux/pwm_backlight.h>
|
||||
#include <linux/regulator/fixed.h>
|
||||
#include <linux/regulator/gpio-regulator.h>
|
||||
|
@ -399,24 +399,16 @@ static struct resource pwm_resources[] = {
|
|||
},
|
||||
};
|
||||
|
||||
static struct tpu_pwm_platform_data pwm_device_data = {
|
||||
.channels[2] = {
|
||||
.polarity = PWM_POLARITY_INVERSED,
|
||||
}
|
||||
};
|
||||
|
||||
static struct platform_device pwm_device = {
|
||||
.name = "renesas-tpu-pwm",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &pwm_device_data,
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(pwm_resources),
|
||||
.resource = pwm_resources,
|
||||
};
|
||||
|
||||
static struct pwm_lookup pwm_lookup[] = {
|
||||
PWM_LOOKUP("renesas-tpu-pwm", 2, "pwm-backlight.0", NULL),
|
||||
PWM_LOOKUP("renesas-tpu-pwm", 2, "pwm-backlight.0", NULL,
|
||||
33333, PWM_POLARITY_INVERSED),
|
||||
};
|
||||
|
||||
/* LCDC and backlight */
|
||||
|
|
|
@ -23,9 +23,7 @@
|
|||
#include "board.h"
|
||||
|
||||
static struct rfkill_gpio_platform_data wifi_rfkill_platform_data = {
|
||||
.name = "wifi_rfkill",
|
||||
.reset_gpio = 25, /* PD1 */
|
||||
.shutdown_gpio = 85, /* PK5 */
|
||||
.name = "wifi_rfkill",
|
||||
.type = RFKILL_TYPE_WLAN,
|
||||
};
|
||||
|
||||
|
|
|
@ -136,7 +136,7 @@ static u16 saved_regs(struct jit_ctx *ctx)
|
|||
u16 ret = 0;
|
||||
|
||||
if ((ctx->skf->len > 1) ||
|
||||
(ctx->skf->insns[0].code == BPF_S_RET_A))
|
||||
(ctx->skf->insns[0].code == (BPF_RET | BPF_A)))
|
||||
ret |= 1 << r_A;
|
||||
|
||||
#ifdef CONFIG_FRAME_POINTER
|
||||
|
@ -164,18 +164,10 @@ static inline int mem_words_used(struct jit_ctx *ctx)
|
|||
static inline bool is_load_to_a(u16 inst)
|
||||
{
|
||||
switch (inst) {
|
||||
case BPF_S_LD_W_LEN:
|
||||
case BPF_S_LD_W_ABS:
|
||||
case BPF_S_LD_H_ABS:
|
||||
case BPF_S_LD_B_ABS:
|
||||
case BPF_S_ANC_CPU:
|
||||
case BPF_S_ANC_IFINDEX:
|
||||
case BPF_S_ANC_MARK:
|
||||
case BPF_S_ANC_PROTOCOL:
|
||||
case BPF_S_ANC_RXHASH:
|
||||
case BPF_S_ANC_VLAN_TAG:
|
||||
case BPF_S_ANC_VLAN_TAG_PRESENT:
|
||||
case BPF_S_ANC_QUEUE:
|
||||
case BPF_LD | BPF_W | BPF_LEN:
|
||||
case BPF_LD | BPF_W | BPF_ABS:
|
||||
case BPF_LD | BPF_H | BPF_ABS:
|
||||
case BPF_LD | BPF_B | BPF_ABS:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
|
@ -215,7 +207,7 @@ static void build_prologue(struct jit_ctx *ctx)
|
|||
emit(ARM_MOV_I(r_X, 0), ctx);
|
||||
|
||||
/* do not leak kernel data to userspace */
|
||||
if ((first_inst != BPF_S_RET_K) && !(is_load_to_a(first_inst)))
|
||||
if ((first_inst != (BPF_RET | BPF_K)) && !(is_load_to_a(first_inst)))
|
||||
emit(ARM_MOV_I(r_A, 0), ctx);
|
||||
|
||||
/* stack space for the BPF_MEM words */
|
||||
|
@ -480,36 +472,39 @@ static int build_body(struct jit_ctx *ctx)
|
|||
u32 k;
|
||||
|
||||
for (i = 0; i < prog->len; i++) {
|
||||
u16 code;
|
||||
|
||||
inst = &(prog->insns[i]);
|
||||
/* K as an immediate value operand */
|
||||
k = inst->k;
|
||||
code = bpf_anc_helper(inst);
|
||||
|
||||
/* compute offsets only in the fake pass */
|
||||
if (ctx->target == NULL)
|
||||
ctx->offsets[i] = ctx->idx * 4;
|
||||
|
||||
switch (inst->code) {
|
||||
case BPF_S_LD_IMM:
|
||||
switch (code) {
|
||||
case BPF_LD | BPF_IMM:
|
||||
emit_mov_i(r_A, k, ctx);
|
||||
break;
|
||||
case BPF_S_LD_W_LEN:
|
||||
case BPF_LD | BPF_W | BPF_LEN:
|
||||
ctx->seen |= SEEN_SKB;
|
||||
BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, len) != 4);
|
||||
emit(ARM_LDR_I(r_A, r_skb,
|
||||
offsetof(struct sk_buff, len)), ctx);
|
||||
break;
|
||||
case BPF_S_LD_MEM:
|
||||
case BPF_LD | BPF_MEM:
|
||||
/* A = scratch[k] */
|
||||
ctx->seen |= SEEN_MEM_WORD(k);
|
||||
emit(ARM_LDR_I(r_A, ARM_SP, SCRATCH_OFF(k)), ctx);
|
||||
break;
|
||||
case BPF_S_LD_W_ABS:
|
||||
case BPF_LD | BPF_W | BPF_ABS:
|
||||
load_order = 2;
|
||||
goto load;
|
||||
case BPF_S_LD_H_ABS:
|
||||
case BPF_LD | BPF_H | BPF_ABS:
|
||||
load_order = 1;
|
||||
goto load;
|
||||
case BPF_S_LD_B_ABS:
|
||||
case BPF_LD | BPF_B | BPF_ABS:
|
||||
load_order = 0;
|
||||
load:
|
||||
/* the interpreter will deal with the negative K */
|
||||
|
@ -552,31 +547,31 @@ load_common:
|
|||
emit_err_ret(ARM_COND_NE, ctx);
|
||||
emit(ARM_MOV_R(r_A, ARM_R0), ctx);
|
||||
break;
|
||||
case BPF_S_LD_W_IND:
|
||||
case BPF_LD | BPF_W | BPF_IND:
|
||||
load_order = 2;
|
||||
goto load_ind;
|
||||
case BPF_S_LD_H_IND:
|
||||
case BPF_LD | BPF_H | BPF_IND:
|
||||
load_order = 1;
|
||||
goto load_ind;
|
||||
case BPF_S_LD_B_IND:
|
||||
case BPF_LD | BPF_B | BPF_IND:
|
||||
load_order = 0;
|
||||
load_ind:
|
||||
OP_IMM3(ARM_ADD, r_off, r_X, k, ctx);
|
||||
goto load_common;
|
||||
case BPF_S_LDX_IMM:
|
||||
case BPF_LDX | BPF_IMM:
|
||||
ctx->seen |= SEEN_X;
|
||||
emit_mov_i(r_X, k, ctx);
|
||||
break;
|
||||
case BPF_S_LDX_W_LEN:
|
||||
case BPF_LDX | BPF_W | BPF_LEN:
|
||||
ctx->seen |= SEEN_X | SEEN_SKB;
|
||||
emit(ARM_LDR_I(r_X, r_skb,
|
||||
offsetof(struct sk_buff, len)), ctx);
|
||||
break;
|
||||
case BPF_S_LDX_MEM:
|
||||
case BPF_LDX | BPF_MEM:
|
||||
ctx->seen |= SEEN_X | SEEN_MEM_WORD(k);
|
||||
emit(ARM_LDR_I(r_X, ARM_SP, SCRATCH_OFF(k)), ctx);
|
||||
break;
|
||||
case BPF_S_LDX_B_MSH:
|
||||
case BPF_LDX | BPF_B | BPF_MSH:
|
||||
/* x = ((*(frame + k)) & 0xf) << 2; */
|
||||
ctx->seen |= SEEN_X | SEEN_DATA | SEEN_CALL;
|
||||
/* the interpreter should deal with the negative K */
|
||||
|
@ -606,113 +601,113 @@ load_ind:
|
|||
emit(ARM_AND_I(r_X, ARM_R0, 0x00f), ctx);
|
||||
emit(ARM_LSL_I(r_X, r_X, 2), ctx);
|
||||
break;
|
||||
case BPF_S_ST:
|
||||
case BPF_ST:
|
||||
ctx->seen |= SEEN_MEM_WORD(k);
|
||||
emit(ARM_STR_I(r_A, ARM_SP, SCRATCH_OFF(k)), ctx);
|
||||
break;
|
||||
case BPF_S_STX:
|
||||
case BPF_STX:
|
||||
update_on_xread(ctx);
|
||||
ctx->seen |= SEEN_MEM_WORD(k);
|
||||
emit(ARM_STR_I(r_X, ARM_SP, SCRATCH_OFF(k)), ctx);
|
||||
break;
|
||||
case BPF_S_ALU_ADD_K:
|
||||
case BPF_ALU | BPF_ADD | BPF_K:
|
||||
/* A += K */
|
||||
OP_IMM3(ARM_ADD, r_A, r_A, k, ctx);
|
||||
break;
|
||||
case BPF_S_ALU_ADD_X:
|
||||
case BPF_ALU | BPF_ADD | BPF_X:
|
||||
update_on_xread(ctx);
|
||||
emit(ARM_ADD_R(r_A, r_A, r_X), ctx);
|
||||
break;
|
||||
case BPF_S_ALU_SUB_K:
|
||||
case BPF_ALU | BPF_SUB | BPF_K:
|
||||
/* A -= K */
|
||||
OP_IMM3(ARM_SUB, r_A, r_A, k, ctx);
|
||||
break;
|
||||
case BPF_S_ALU_SUB_X:
|
||||
case BPF_ALU | BPF_SUB | BPF_X:
|
||||
update_on_xread(ctx);
|
||||
emit(ARM_SUB_R(r_A, r_A, r_X), ctx);
|
||||
break;
|
||||
case BPF_S_ALU_MUL_K:
|
||||
case BPF_ALU | BPF_MUL | BPF_K:
|
||||
/* A *= K */
|
||||
emit_mov_i(r_scratch, k, ctx);
|
||||
emit(ARM_MUL(r_A, r_A, r_scratch), ctx);
|
||||
break;
|
||||
case BPF_S_ALU_MUL_X:
|
||||
case BPF_ALU | BPF_MUL | BPF_X:
|
||||
update_on_xread(ctx);
|
||||
emit(ARM_MUL(r_A, r_A, r_X), ctx);
|
||||
break;
|
||||
case BPF_S_ALU_DIV_K:
|
||||
case BPF_ALU | BPF_DIV | BPF_K:
|
||||
if (k == 1)
|
||||
break;
|
||||
emit_mov_i(r_scratch, k, ctx);
|
||||
emit_udiv(r_A, r_A, r_scratch, ctx);
|
||||
break;
|
||||
case BPF_S_ALU_DIV_X:
|
||||
case BPF_ALU | BPF_DIV | BPF_X:
|
||||
update_on_xread(ctx);
|
||||
emit(ARM_CMP_I(r_X, 0), ctx);
|
||||
emit_err_ret(ARM_COND_EQ, ctx);
|
||||
emit_udiv(r_A, r_A, r_X, ctx);
|
||||
break;
|
||||
case BPF_S_ALU_OR_K:
|
||||
case BPF_ALU | BPF_OR | BPF_K:
|
||||
/* A |= K */
|
||||
OP_IMM3(ARM_ORR, r_A, r_A, k, ctx);
|
||||
break;
|
||||
case BPF_S_ALU_OR_X:
|
||||
case BPF_ALU | BPF_OR | BPF_X:
|
||||
update_on_xread(ctx);
|
||||
emit(ARM_ORR_R(r_A, r_A, r_X), ctx);
|
||||
break;
|
||||
case BPF_S_ALU_XOR_K:
|
||||
case BPF_ALU | BPF_XOR | BPF_K:
|
||||
/* A ^= K; */
|
||||
OP_IMM3(ARM_EOR, r_A, r_A, k, ctx);
|
||||
break;
|
||||
case BPF_S_ANC_ALU_XOR_X:
|
||||
case BPF_S_ALU_XOR_X:
|
||||
case BPF_ANC | SKF_AD_ALU_XOR_X:
|
||||
case BPF_ALU | BPF_XOR | BPF_X:
|
||||
/* A ^= X */
|
||||
update_on_xread(ctx);
|
||||
emit(ARM_EOR_R(r_A, r_A, r_X), ctx);
|
||||
break;
|
||||
case BPF_S_ALU_AND_K:
|
||||
case BPF_ALU | BPF_AND | BPF_K:
|
||||
/* A &= K */
|
||||
OP_IMM3(ARM_AND, r_A, r_A, k, ctx);
|
||||
break;
|
||||
case BPF_S_ALU_AND_X:
|
||||
case BPF_ALU | BPF_AND | BPF_X:
|
||||
update_on_xread(ctx);
|
||||
emit(ARM_AND_R(r_A, r_A, r_X), ctx);
|
||||
break;
|
||||
case BPF_S_ALU_LSH_K:
|
||||
case BPF_ALU | BPF_LSH | BPF_K:
|
||||
if (unlikely(k > 31))
|
||||
return -1;
|
||||
emit(ARM_LSL_I(r_A, r_A, k), ctx);
|
||||
break;
|
||||
case BPF_S_ALU_LSH_X:
|
||||
case BPF_ALU | BPF_LSH | BPF_X:
|
||||
update_on_xread(ctx);
|
||||
emit(ARM_LSL_R(r_A, r_A, r_X), ctx);
|
||||
break;
|
||||
case BPF_S_ALU_RSH_K:
|
||||
case BPF_ALU | BPF_RSH | BPF_K:
|
||||
if (unlikely(k > 31))
|
||||
return -1;
|
||||
emit(ARM_LSR_I(r_A, r_A, k), ctx);
|
||||
break;
|
||||
case BPF_S_ALU_RSH_X:
|
||||
case BPF_ALU | BPF_RSH | BPF_X:
|
||||
update_on_xread(ctx);
|
||||
emit(ARM_LSR_R(r_A, r_A, r_X), ctx);
|
||||
break;
|
||||
case BPF_S_ALU_NEG:
|
||||
case BPF_ALU | BPF_NEG:
|
||||
/* A = -A */
|
||||
emit(ARM_RSB_I(r_A, r_A, 0), ctx);
|
||||
break;
|
||||
case BPF_S_JMP_JA:
|
||||
case BPF_JMP | BPF_JA:
|
||||
/* pc += K */
|
||||
emit(ARM_B(b_imm(i + k + 1, ctx)), ctx);
|
||||
break;
|
||||
case BPF_S_JMP_JEQ_K:
|
||||
case BPF_JMP | BPF_JEQ | BPF_K:
|
||||
/* pc += (A == K) ? pc->jt : pc->jf */
|
||||
condt = ARM_COND_EQ;
|
||||
goto cmp_imm;
|
||||
case BPF_S_JMP_JGT_K:
|
||||
case BPF_JMP | BPF_JGT | BPF_K:
|
||||
/* pc += (A > K) ? pc->jt : pc->jf */
|
||||
condt = ARM_COND_HI;
|
||||
goto cmp_imm;
|
||||
case BPF_S_JMP_JGE_K:
|
||||
case BPF_JMP | BPF_JGE | BPF_K:
|
||||
/* pc += (A >= K) ? pc->jt : pc->jf */
|
||||
condt = ARM_COND_HS;
|
||||
cmp_imm:
|
||||
|
@ -731,22 +726,22 @@ cond_jump:
|
|||
_emit(condt ^ 1, ARM_B(b_imm(i + inst->jf + 1,
|
||||
ctx)), ctx);
|
||||
break;
|
||||
case BPF_S_JMP_JEQ_X:
|
||||
case BPF_JMP | BPF_JEQ | BPF_X:
|
||||
/* pc += (A == X) ? pc->jt : pc->jf */
|
||||
condt = ARM_COND_EQ;
|
||||
goto cmp_x;
|
||||
case BPF_S_JMP_JGT_X:
|
||||
case BPF_JMP | BPF_JGT | BPF_X:
|
||||
/* pc += (A > X) ? pc->jt : pc->jf */
|
||||
condt = ARM_COND_HI;
|
||||
goto cmp_x;
|
||||
case BPF_S_JMP_JGE_X:
|
||||
case BPF_JMP | BPF_JGE | BPF_X:
|
||||
/* pc += (A >= X) ? pc->jt : pc->jf */
|
||||
condt = ARM_COND_CS;
|
||||
cmp_x:
|
||||
update_on_xread(ctx);
|
||||
emit(ARM_CMP_R(r_A, r_X), ctx);
|
||||
goto cond_jump;
|
||||
case BPF_S_JMP_JSET_K:
|
||||
case BPF_JMP | BPF_JSET | BPF_K:
|
||||
/* pc += (A & K) ? pc->jt : pc->jf */
|
||||
condt = ARM_COND_NE;
|
||||
/* not set iff all zeroes iff Z==1 iff EQ */
|
||||
|
@ -759,16 +754,16 @@ cmp_x:
|
|||
emit(ARM_TST_I(r_A, imm12), ctx);
|
||||
}
|
||||
goto cond_jump;
|
||||
case BPF_S_JMP_JSET_X:
|
||||
case BPF_JMP | BPF_JSET | BPF_X:
|
||||
/* pc += (A & X) ? pc->jt : pc->jf */
|
||||
update_on_xread(ctx);
|
||||
condt = ARM_COND_NE;
|
||||
emit(ARM_TST_R(r_A, r_X), ctx);
|
||||
goto cond_jump;
|
||||
case BPF_S_RET_A:
|
||||
case BPF_RET | BPF_A:
|
||||
emit(ARM_MOV_R(ARM_R0, r_A), ctx);
|
||||
goto b_epilogue;
|
||||
case BPF_S_RET_K:
|
||||
case BPF_RET | BPF_K:
|
||||
if ((k == 0) && (ctx->ret0_fp_idx < 0))
|
||||
ctx->ret0_fp_idx = i;
|
||||
emit_mov_i(ARM_R0, k, ctx);
|
||||
|
@ -776,17 +771,17 @@ b_epilogue:
|
|||
if (i != ctx->skf->len - 1)
|
||||
emit(ARM_B(b_imm(prog->len, ctx)), ctx);
|
||||
break;
|
||||
case BPF_S_MISC_TAX:
|
||||
case BPF_MISC | BPF_TAX:
|
||||
/* X = A */
|
||||
ctx->seen |= SEEN_X;
|
||||
emit(ARM_MOV_R(r_X, r_A), ctx);
|
||||
break;
|
||||
case BPF_S_MISC_TXA:
|
||||
case BPF_MISC | BPF_TXA:
|
||||
/* A = X */
|
||||
update_on_xread(ctx);
|
||||
emit(ARM_MOV_R(r_A, r_X), ctx);
|
||||
break;
|
||||
case BPF_S_ANC_PROTOCOL:
|
||||
case BPF_ANC | SKF_AD_PROTOCOL:
|
||||
/* A = ntohs(skb->protocol) */
|
||||
ctx->seen |= SEEN_SKB;
|
||||
BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff,
|
||||
|
@ -795,7 +790,7 @@ b_epilogue:
|
|||
emit(ARM_LDRH_I(r_scratch, r_skb, off), ctx);
|
||||
emit_swap16(r_A, r_scratch, ctx);
|
||||
break;
|
||||
case BPF_S_ANC_CPU:
|
||||
case BPF_ANC | SKF_AD_CPU:
|
||||
/* r_scratch = current_thread_info() */
|
||||
OP_IMM3(ARM_BIC, r_scratch, ARM_SP, THREAD_SIZE - 1, ctx);
|
||||
/* A = current_thread_info()->cpu */
|
||||
|
@ -803,7 +798,7 @@ b_epilogue:
|
|||
off = offsetof(struct thread_info, cpu);
|
||||
emit(ARM_LDR_I(r_A, r_scratch, off), ctx);
|
||||
break;
|
||||
case BPF_S_ANC_IFINDEX:
|
||||
case BPF_ANC | SKF_AD_IFINDEX:
|
||||
/* A = skb->dev->ifindex */
|
||||
ctx->seen |= SEEN_SKB;
|
||||
off = offsetof(struct sk_buff, dev);
|
||||
|
@ -817,30 +812,30 @@ b_epilogue:
|
|||
off = offsetof(struct net_device, ifindex);
|
||||
emit(ARM_LDR_I(r_A, r_scratch, off), ctx);
|
||||
break;
|
||||
case BPF_S_ANC_MARK:
|
||||
case BPF_ANC | SKF_AD_MARK:
|
||||
ctx->seen |= SEEN_SKB;
|
||||
BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, mark) != 4);
|
||||
off = offsetof(struct sk_buff, mark);
|
||||
emit(ARM_LDR_I(r_A, r_skb, off), ctx);
|
||||
break;
|
||||
case BPF_S_ANC_RXHASH:
|
||||
case BPF_ANC | SKF_AD_RXHASH:
|
||||
ctx->seen |= SEEN_SKB;
|
||||
BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, hash) != 4);
|
||||
off = offsetof(struct sk_buff, hash);
|
||||
emit(ARM_LDR_I(r_A, r_skb, off), ctx);
|
||||
break;
|
||||
case BPF_S_ANC_VLAN_TAG:
|
||||
case BPF_S_ANC_VLAN_TAG_PRESENT:
|
||||
case BPF_ANC | SKF_AD_VLAN_TAG:
|
||||
case BPF_ANC | SKF_AD_VLAN_TAG_PRESENT:
|
||||
ctx->seen |= SEEN_SKB;
|
||||
BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, vlan_tci) != 2);
|
||||
off = offsetof(struct sk_buff, vlan_tci);
|
||||
emit(ARM_LDRH_I(r_A, r_skb, off), ctx);
|
||||
if (inst->code == BPF_S_ANC_VLAN_TAG)
|
||||
if (code == (BPF_ANC | SKF_AD_VLAN_TAG))
|
||||
OP_IMM3(ARM_AND, r_A, r_A, VLAN_VID_MASK, ctx);
|
||||
else
|
||||
OP_IMM3(ARM_AND, r_A, r_A, VLAN_TAG_PRESENT, ctx);
|
||||
break;
|
||||
case BPF_S_ANC_QUEUE:
|
||||
case BPF_ANC | SKF_AD_QUEUE:
|
||||
ctx->seen |= SEEN_SKB;
|
||||
BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff,
|
||||
queue_mapping) != 2);
|
||||
|
|
|
@ -124,8 +124,6 @@ void __init samsung_bl_set(struct samsung_bl_gpio_info *gpio_info,
|
|||
samsung_bl_data->pwm_period_ns = bl_data->pwm_period_ns;
|
||||
if (bl_data->enable_gpio >= 0)
|
||||
samsung_bl_data->enable_gpio = bl_data->enable_gpio;
|
||||
if (bl_data->enable_gpio_flags)
|
||||
samsung_bl_data->enable_gpio_flags = bl_data->enable_gpio_flags;
|
||||
if (bl_data->init)
|
||||
samsung_bl_data->init = bl_data->init;
|
||||
if (bl_data->notify)
|
||||
|
|
|
@ -53,7 +53,6 @@ CONFIG_IP_PNP=y
|
|||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
# CONFIG_FW_LOADER is not set
|
||||
CONFIG_MTD=y
|
||||
CONFIG_MTD_CHAR=y
|
||||
CONFIG_MTD_BLOCK=y
|
||||
CONFIG_MTD_CFI=y
|
||||
CONFIG_MTD_CFI_INTELEXT=y
|
||||
|
@ -63,6 +62,7 @@ CONFIG_MTD_COMPLEX_MAPPINGS=y
|
|||
CONFIG_MTD_PHYSMAP=y
|
||||
CONFIG_MTD_M25P80=y
|
||||
CONFIG_MTD_NAND=m
|
||||
CONFIG_MTD_SPI_NOR=y
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_SCSI=y
|
||||
# CONFIG_SCSI_PROC_FS is not set
|
||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче