Merge tag 'asoc-v4.13' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound into for-linus
ASoC: Updates for v4.13 The big news with this release is the of-graph card, this provides a replacement for simple-card that is much more flexibile and scalable, allowing many more systems to use a generic sound card than was possible before: - The of-graph card, finally merged after a long and dedicated effort by Morimoto-san. - New widget types intended mainly for use with DSPs. - New drivers for Allwinner V3s SoCs, Ensonic ES8316, several classes of x86 machine, Rockchip PDM controllers, STM32 I2S and S/PDIF controllers and ZTE AUD96P22 CODECs.
This commit is contained in:
@@ -59,20 +59,28 @@ button driver uses the following 3 modes in order not to trigger issues.
|
|||||||
If the userspace hasn't been prepared to ignore the unreliable "opened"
|
If the userspace hasn't been prepared to ignore the unreliable "opened"
|
||||||
events and the unreliable initial state notification, Linux users can use
|
events and the unreliable initial state notification, Linux users can use
|
||||||
the following kernel parameters to handle the possible issues:
|
the following kernel parameters to handle the possible issues:
|
||||||
A. button.lid_init_state=open:
|
A. button.lid_init_state=method:
|
||||||
|
When this option is specified, the ACPI button driver reports the
|
||||||
|
initial lid state using the returning value of the _LID control method
|
||||||
|
and whether the "opened"/"closed" events are paired fully relies on the
|
||||||
|
firmware implementation.
|
||||||
|
This option can be used to fix some platforms where the returning value
|
||||||
|
of the _LID control method is reliable but the initial lid state
|
||||||
|
notification is missing.
|
||||||
|
This option is the default behavior during the period the userspace
|
||||||
|
isn't ready to handle the buggy AML tables.
|
||||||
|
B. button.lid_init_state=open:
|
||||||
When this option is specified, the ACPI button driver always reports the
|
When this option is specified, the ACPI button driver always reports the
|
||||||
initial lid state as "opened" and whether the "opened"/"closed" events
|
initial lid state as "opened" and whether the "opened"/"closed" events
|
||||||
are paired fully relies on the firmware implementation.
|
are paired fully relies on the firmware implementation.
|
||||||
This may fix some platforms where the returning value of the _LID
|
This may fix some platforms where the returning value of the _LID
|
||||||
control method is not reliable and the initial lid state notification is
|
control method is not reliable and the initial lid state notification is
|
||||||
missing.
|
missing.
|
||||||
This option is the default behavior during the period the userspace
|
|
||||||
isn't ready to handle the buggy AML tables.
|
|
||||||
|
|
||||||
If the userspace has been prepared to ignore the unreliable "opened" events
|
If the userspace has been prepared to ignore the unreliable "opened" events
|
||||||
and the unreliable initial state notification, Linux users should always
|
and the unreliable initial state notification, Linux users should always
|
||||||
use the following kernel parameter:
|
use the following kernel parameter:
|
||||||
B. button.lid_init_state=ignore:
|
C. button.lid_init_state=ignore:
|
||||||
When this option is specified, the ACPI button driver never reports the
|
When this option is specified, the ACPI button driver never reports the
|
||||||
initial lid state and there is a compensation mechanism implemented to
|
initial lid state and there is a compensation mechanism implemented to
|
||||||
ensure that the reliable "closed" notifications can always be delievered
|
ensure that the reliable "closed" notifications can always be delievered
|
||||||
|
@@ -866,6 +866,15 @@
|
|||||||
|
|
||||||
dscc4.setup= [NET]
|
dscc4.setup= [NET]
|
||||||
|
|
||||||
|
dt_cpu_ftrs= [PPC]
|
||||||
|
Format: {"off" | "known"}
|
||||||
|
Control how the dt_cpu_ftrs device-tree binding is
|
||||||
|
used for CPU feature discovery and setup (if it
|
||||||
|
exists).
|
||||||
|
off: Do not use it, fall back to legacy cpu table.
|
||||||
|
known: Do not pass through unknown features to guests
|
||||||
|
or userspace, only those that the kernel is aware of.
|
||||||
|
|
||||||
dump_apple_properties [X86]
|
dump_apple_properties [X86]
|
||||||
Dump name and content of EFI device properties on
|
Dump name and content of EFI device properties on
|
||||||
x86 Macs. Useful for driver authors to determine
|
x86 Macs. Useful for driver authors to determine
|
||||||
@@ -3802,6 +3811,13 @@
|
|||||||
expediting. Set to zero to disable automatic
|
expediting. Set to zero to disable automatic
|
||||||
expediting.
|
expediting.
|
||||||
|
|
||||||
|
stack_guard_gap= [MM]
|
||||||
|
override the default stack gap protection. The value
|
||||||
|
is in page units and it defines how many pages prior
|
||||||
|
to (for stacks growing down) resp. after (for stacks
|
||||||
|
growing up) the main stack are reserved for no other
|
||||||
|
mapping. Default value is 256 pages.
|
||||||
|
|
||||||
stacktrace [FTRACE]
|
stacktrace [FTRACE]
|
||||||
Enabled the stack tracer on boot up.
|
Enabled the stack tracer on boot up.
|
||||||
|
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
.. |struct cpufreq_policy| replace:: :c:type:`struct cpufreq_policy <cpufreq_policy>`
|
.. |struct cpufreq_policy| replace:: :c:type:`struct cpufreq_policy <cpufreq_policy>`
|
||||||
|
.. |intel_pstate| replace:: :doc:`intel_pstate <intel_pstate>`
|
||||||
|
|
||||||
=======================
|
=======================
|
||||||
CPU Performance Scaling
|
CPU Performance Scaling
|
||||||
@@ -75,7 +76,7 @@ feedback registers, as that information is typically specific to the hardware
|
|||||||
interface it comes from and may not be easily represented in an abstract,
|
interface it comes from and may not be easily represented in an abstract,
|
||||||
platform-independent way. For this reason, ``CPUFreq`` allows scaling drivers
|
platform-independent way. For this reason, ``CPUFreq`` allows scaling drivers
|
||||||
to bypass the governor layer and implement their own performance scaling
|
to bypass the governor layer and implement their own performance scaling
|
||||||
algorithms. That is done by the ``intel_pstate`` scaling driver.
|
algorithms. That is done by the |intel_pstate| scaling driver.
|
||||||
|
|
||||||
|
|
||||||
``CPUFreq`` Policy Objects
|
``CPUFreq`` Policy Objects
|
||||||
@@ -174,13 +175,13 @@ necessary to restart the scaling governor so that it can take the new online CPU
|
|||||||
into account. That is achieved by invoking the governor's ``->stop`` and
|
into account. That is achieved by invoking the governor's ``->stop`` and
|
||||||
``->start()`` callbacks, in this order, for the entire policy.
|
``->start()`` callbacks, in this order, for the entire policy.
|
||||||
|
|
||||||
As mentioned before, the ``intel_pstate`` scaling driver bypasses the scaling
|
As mentioned before, the |intel_pstate| scaling driver bypasses the scaling
|
||||||
governor layer of ``CPUFreq`` and provides its own P-state selection algorithms.
|
governor layer of ``CPUFreq`` and provides its own P-state selection algorithms.
|
||||||
Consequently, if ``intel_pstate`` is used, scaling governors are not attached to
|
Consequently, if |intel_pstate| is used, scaling governors are not attached to
|
||||||
new policy objects. Instead, the driver's ``->setpolicy()`` callback is invoked
|
new policy objects. Instead, the driver's ``->setpolicy()`` callback is invoked
|
||||||
to register per-CPU utilization update callbacks for each policy. These
|
to register per-CPU utilization update callbacks for each policy. These
|
||||||
callbacks are invoked by the CPU scheduler in the same way as for scaling
|
callbacks are invoked by the CPU scheduler in the same way as for scaling
|
||||||
governors, but in the ``intel_pstate`` case they both determine the P-state to
|
governors, but in the |intel_pstate| case they both determine the P-state to
|
||||||
use and change the hardware configuration accordingly in one go from scheduler
|
use and change the hardware configuration accordingly in one go from scheduler
|
||||||
context.
|
context.
|
||||||
|
|
||||||
@@ -257,7 +258,7 @@ are the following:
|
|||||||
|
|
||||||
``scaling_available_governors``
|
``scaling_available_governors``
|
||||||
List of ``CPUFreq`` scaling governors present in the kernel that can
|
List of ``CPUFreq`` scaling governors present in the kernel that can
|
||||||
be attached to this policy or (if the ``intel_pstate`` scaling driver is
|
be attached to this policy or (if the |intel_pstate| scaling driver is
|
||||||
in use) list of scaling algorithms provided by the driver that can be
|
in use) list of scaling algorithms provided by the driver that can be
|
||||||
applied to this policy.
|
applied to this policy.
|
||||||
|
|
||||||
@@ -274,7 +275,7 @@ are the following:
|
|||||||
the CPU is actually running at (due to hardware design and other
|
the CPU is actually running at (due to hardware design and other
|
||||||
limitations).
|
limitations).
|
||||||
|
|
||||||
Some scaling drivers (e.g. ``intel_pstate``) attempt to provide
|
Some scaling drivers (e.g. |intel_pstate|) attempt to provide
|
||||||
information more precisely reflecting the current CPU frequency through
|
information more precisely reflecting the current CPU frequency through
|
||||||
this attribute, but that still may not be the exact current CPU
|
this attribute, but that still may not be the exact current CPU
|
||||||
frequency as seen by the hardware at the moment.
|
frequency as seen by the hardware at the moment.
|
||||||
@@ -284,13 +285,13 @@ are the following:
|
|||||||
|
|
||||||
``scaling_governor``
|
``scaling_governor``
|
||||||
The scaling governor currently attached to this policy or (if the
|
The scaling governor currently attached to this policy or (if the
|
||||||
``intel_pstate`` scaling driver is in use) the scaling algorithm
|
|intel_pstate| scaling driver is in use) the scaling algorithm
|
||||||
provided by the driver that is currently applied to this policy.
|
provided by the driver that is currently applied to this policy.
|
||||||
|
|
||||||
This attribute is read-write and writing to it will cause a new scaling
|
This attribute is read-write and writing to it will cause a new scaling
|
||||||
governor to be attached to this policy or a new scaling algorithm
|
governor to be attached to this policy or a new scaling algorithm
|
||||||
provided by the scaling driver to be applied to it (in the
|
provided by the scaling driver to be applied to it (in the
|
||||||
``intel_pstate`` case), as indicated by the string written to this
|
|intel_pstate| case), as indicated by the string written to this
|
||||||
attribute (which must be one of the names listed by the
|
attribute (which must be one of the names listed by the
|
||||||
``scaling_available_governors`` attribute described above).
|
``scaling_available_governors`` attribute described above).
|
||||||
|
|
||||||
@@ -619,7 +620,7 @@ This file is located under :file:`/sys/devices/system/cpu/cpufreq/` and controls
|
|||||||
the "boost" setting for the whole system. It is not present if the underlying
|
the "boost" setting for the whole system. It is not present if the underlying
|
||||||
scaling driver does not support the frequency boost mechanism (or supports it,
|
scaling driver does not support the frequency boost mechanism (or supports it,
|
||||||
but provides a driver-specific interface for controlling it, like
|
but provides a driver-specific interface for controlling it, like
|
||||||
``intel_pstate``).
|
|intel_pstate|).
|
||||||
|
|
||||||
If the value in this file is 1, the frequency boost mechanism is enabled. This
|
If the value in this file is 1, the frequency boost mechanism is enabled. This
|
||||||
means that either the hardware can be put into states in which it is able to
|
means that either the hardware can be put into states in which it is able to
|
||||||
|
@@ -6,6 +6,7 @@ Power Management
|
|||||||
:maxdepth: 2
|
:maxdepth: 2
|
||||||
|
|
||||||
cpufreq
|
cpufreq
|
||||||
|
intel_pstate
|
||||||
|
|
||||||
.. only:: subproject and html
|
.. only:: subproject and html
|
||||||
|
|
||||||
|
755
Documentation/admin-guide/pm/intel_pstate.rst
Normal file
755
Documentation/admin-guide/pm/intel_pstate.rst
Normal file
@@ -0,0 +1,755 @@
|
|||||||
|
===============================================
|
||||||
|
``intel_pstate`` CPU Performance Scaling Driver
|
||||||
|
===============================================
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
Copyright (c) 2017 Intel Corp., Rafael J. Wysocki <rafael.j.wysocki@intel.com>
|
||||||
|
|
||||||
|
|
||||||
|
General Information
|
||||||
|
===================
|
||||||
|
|
||||||
|
``intel_pstate`` is a part of the
|
||||||
|
:doc:`CPU performance scaling subsystem <cpufreq>` in the Linux kernel
|
||||||
|
(``CPUFreq``). It is a scaling driver for the Sandy Bridge and later
|
||||||
|
generations of Intel processors. Note, however, that some of those processors
|
||||||
|
may not be supported. [To understand ``intel_pstate`` it is necessary to know
|
||||||
|
how ``CPUFreq`` works in general, so this is the time to read :doc:`cpufreq` if
|
||||||
|
you have not done that yet.]
|
||||||
|
|
||||||
|
For the processors supported by ``intel_pstate``, the P-state concept is broader
|
||||||
|
than just an operating frequency or an operating performance point (see the
|
||||||
|
`LinuxCon Europe 2015 presentation by Kristen Accardi <LCEU2015_>`_ for more
|
||||||
|
information about that). For this reason, the representation of P-states used
|
||||||
|
by ``intel_pstate`` internally follows the hardware specification (for details
|
||||||
|
refer to `Intel® 64 and IA-32 Architectures Software Developer’s Manual
|
||||||
|
Volume 3: System Programming Guide <SDM_>`_). However, the ``CPUFreq`` core
|
||||||
|
uses frequencies for identifying operating performance points of CPUs and
|
||||||
|
frequencies are involved in the user space interface exposed by it, so
|
||||||
|
``intel_pstate`` maps its internal representation of P-states to frequencies too
|
||||||
|
(fortunately, that mapping is unambiguous). At the same time, it would not be
|
||||||
|
practical for ``intel_pstate`` to supply the ``CPUFreq`` core with a table of
|
||||||
|
available frequencies due to the possible size of it, so the driver does not do
|
||||||
|
that. Some functionality of the core is limited by that.
|
||||||
|
|
||||||
|
Since the hardware P-state selection interface used by ``intel_pstate`` is
|
||||||
|
available at the logical CPU level, the driver always works with individual
|
||||||
|
CPUs. Consequently, if ``intel_pstate`` is in use, every ``CPUFreq`` policy
|
||||||
|
object corresponds to one logical CPU and ``CPUFreq`` policies are effectively
|
||||||
|
equivalent to CPUs. In particular, this means that they become "inactive" every
|
||||||
|
time the corresponding CPU is taken offline and need to be re-initialized when
|
||||||
|
it goes back online.
|
||||||
|
|
||||||
|
``intel_pstate`` is not modular, so it cannot be unloaded, which means that the
|
||||||
|
only way to pass early-configuration-time parameters to it is via the kernel
|
||||||
|
command line. However, its configuration can be adjusted via ``sysfs`` to a
|
||||||
|
great extent. In some configurations it even is possible to unregister it via
|
||||||
|
``sysfs`` which allows another ``CPUFreq`` scaling driver to be loaded and
|
||||||
|
registered (see `below <status_attr_>`_).
|
||||||
|
|
||||||
|
|
||||||
|
Operation Modes
|
||||||
|
===============
|
||||||
|
|
||||||
|
``intel_pstate`` can operate in three different modes: in the active mode with
|
||||||
|
or without hardware-managed P-states support and in the passive mode. Which of
|
||||||
|
them will be in effect depends on what kernel command line options are used and
|
||||||
|
on the capabilities of the processor.
|
||||||
|
|
||||||
|
Active Mode
|
||||||
|
-----------
|
||||||
|
|
||||||
|
This is the default operation mode of ``intel_pstate``. If it works in this
|
||||||
|
mode, the ``scaling_driver`` policy attribute in ``sysfs`` for all ``CPUFreq``
|
||||||
|
policies contains the string "intel_pstate".
|
||||||
|
|
||||||
|
In this mode the driver bypasses the scaling governors layer of ``CPUFreq`` and
|
||||||
|
provides its own scaling algorithms for P-state selection. Those algorithms
|
||||||
|
can be applied to ``CPUFreq`` policies in the same way as generic scaling
|
||||||
|
governors (that is, through the ``scaling_governor`` policy attribute in
|
||||||
|
``sysfs``). [Note that different P-state selection algorithms may be chosen for
|
||||||
|
different policies, but that is not recommended.]
|
||||||
|
|
||||||
|
They are not generic scaling governors, but their names are the same as the
|
||||||
|
names of some of those governors. Moreover, confusingly enough, they generally
|
||||||
|
do not work in the same way as the generic governors they share the names with.
|
||||||
|
For example, the ``powersave`` P-state selection algorithm provided by
|
||||||
|
``intel_pstate`` is not a counterpart of the generic ``powersave`` governor
|
||||||
|
(roughly, it corresponds to the ``schedutil`` and ``ondemand`` governors).
|
||||||
|
|
||||||
|
There are two P-state selection algorithms provided by ``intel_pstate`` in the
|
||||||
|
active mode: ``powersave`` and ``performance``. The way they both operate
|
||||||
|
depends on whether or not the hardware-managed P-states (HWP) feature has been
|
||||||
|
enabled in the processor and possibly on the processor model.
|
||||||
|
|
||||||
|
Which of the P-state selection algorithms is used by default depends on the
|
||||||
|
:c:macro:`CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE` kernel configuration option.
|
||||||
|
Namely, if that option is set, the ``performance`` algorithm will be used by
|
||||||
|
default, and the other one will be used by default if it is not set.
|
||||||
|
|
||||||
|
Active Mode With HWP
|
||||||
|
~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
If the processor supports the HWP feature, it will be enabled during the
|
||||||
|
processor initialization and cannot be disabled after that. It is possible
|
||||||
|
to avoid enabling it by passing the ``intel_pstate=no_hwp`` argument to the
|
||||||
|
kernel in the command line.
|
||||||
|
|
||||||
|
If the HWP feature has been enabled, ``intel_pstate`` relies on the processor to
|
||||||
|
select P-states by itself, but still it can give hints to the processor's
|
||||||
|
internal P-state selection logic. What those hints are depends on which P-state
|
||||||
|
selection algorithm has been applied to the given policy (or to the CPU it
|
||||||
|
corresponds to).
|
||||||
|
|
||||||
|
Even though the P-state selection is carried out by the processor automatically,
|
||||||
|
``intel_pstate`` registers utilization update callbacks with the CPU scheduler
|
||||||
|
in this mode. However, they are not used for running a P-state selection
|
||||||
|
algorithm, but for periodic updates of the current CPU frequency information to
|
||||||
|
be made available from the ``scaling_cur_freq`` policy attribute in ``sysfs``.
|
||||||
|
|
||||||
|
HWP + ``performance``
|
||||||
|
.....................
|
||||||
|
|
||||||
|
In this configuration ``intel_pstate`` will write 0 to the processor's
|
||||||
|
Energy-Performance Preference (EPP) knob (if supported) or its
|
||||||
|
Energy-Performance Bias (EPB) knob (otherwise), which means that the processor's
|
||||||
|
internal P-state selection logic is expected to focus entirely on performance.
|
||||||
|
|
||||||
|
This will override the EPP/EPB setting coming from the ``sysfs`` interface
|
||||||
|
(see `Energy vs Performance Hints`_ below).
|
||||||
|
|
||||||
|
Also, in this configuration the range of P-states available to the processor's
|
||||||
|
internal P-state selection logic is always restricted to the upper boundary
|
||||||
|
(that is, the maximum P-state that the driver is allowed to use).
|
||||||
|
|
||||||
|
HWP + ``powersave``
|
||||||
|
...................
|
||||||
|
|
||||||
|
In this configuration ``intel_pstate`` will set the processor's
|
||||||
|
Energy-Performance Preference (EPP) knob (if supported) or its
|
||||||
|
Energy-Performance Bias (EPB) knob (otherwise) to whatever value it was
|
||||||
|
previously set to via ``sysfs`` (or whatever default value it was
|
||||||
|
set to by the platform firmware). This usually causes the processor's
|
||||||
|
internal P-state selection logic to be less performance-focused.
|
||||||
|
|
||||||
|
Active Mode Without HWP
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
This is the default operation mode for processors that do not support the HWP
|
||||||
|
feature. It also is used by default with the ``intel_pstate=no_hwp`` argument
|
||||||
|
in the kernel command line. However, in this mode ``intel_pstate`` may refuse
|
||||||
|
to work with the given processor if it does not recognize it. [Note that
|
||||||
|
``intel_pstate`` will never refuse to work with any processor with the HWP
|
||||||
|
feature enabled.]
|
||||||
|
|
||||||
|
In this mode ``intel_pstate`` registers utilization update callbacks with the
|
||||||
|
CPU scheduler in order to run a P-state selection algorithm, either
|
||||||
|
``powersave`` or ``performance``, depending on the ``scaling_cur_freq`` policy
|
||||||
|
setting in ``sysfs``. The current CPU frequency information to be made
|
||||||
|
available from the ``scaling_cur_freq`` policy attribute in ``sysfs`` is
|
||||||
|
periodically updated by those utilization update callbacks too.
|
||||||
|
|
||||||
|
``performance``
|
||||||
|
...............
|
||||||
|
|
||||||
|
Without HWP, this P-state selection algorithm is always the same regardless of
|
||||||
|
the processor model and platform configuration.
|
||||||
|
|
||||||
|
It selects the maximum P-state it is allowed to use, subject to limits set via
|
||||||
|
``sysfs``, every time the P-state selection computations are carried out by the
|
||||||
|
driver's utilization update callback for the given CPU (that does not happen
|
||||||
|
more often than every 10 ms), but the hardware configuration will not be changed
|
||||||
|
if the new P-state is the same as the current one.
|
||||||
|
|
||||||
|
This is the default P-state selection algorithm if the
|
||||||
|
:c:macro:`CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE` kernel configuration option
|
||||||
|
is set.
|
||||||
|
|
||||||
|
``powersave``
|
||||||
|
.............
|
||||||
|
|
||||||
|
Without HWP, this P-state selection algorithm generally depends on the
|
||||||
|
processor model and/or the system profile setting in the ACPI tables and there
|
||||||
|
are two variants of it.
|
||||||
|
|
||||||
|
One of them is used with processors from the Atom line and (regardless of the
|
||||||
|
processor model) on platforms with the system profile in the ACPI tables set to
|
||||||
|
"mobile" (laptops mostly), "tablet", "appliance PC", "desktop", or
|
||||||
|
"workstation". It is also used with processors supporting the HWP feature if
|
||||||
|
that feature has not been enabled (that is, with the ``intel_pstate=no_hwp``
|
||||||
|
argument in the kernel command line). It is similar to the algorithm
|
||||||
|
implemented by the generic ``schedutil`` scaling governor except that the
|
||||||
|
utilization metric used by it is based on numbers coming from feedback
|
||||||
|
registers of the CPU. It generally selects P-states proportional to the
|
||||||
|
current CPU utilization, so it is referred to as the "proportional" algorithm.
|
||||||
|
|
||||||
|
The second variant of the ``powersave`` P-state selection algorithm, used in all
|
||||||
|
of the other cases (generally, on processors from the Core line, so it is
|
||||||
|
referred to as the "Core" algorithm), is based on the values read from the APERF
|
||||||
|
and MPERF feedback registers and the previously requested target P-state.
|
||||||
|
It does not really take CPU utilization into account explicitly, but as a rule
|
||||||
|
it causes the CPU P-state to ramp up very quickly in response to increased
|
||||||
|
utilization which is generally desirable in server environments.
|
||||||
|
|
||||||
|
Regardless of the variant, this algorithm is run by the driver's utilization
|
||||||
|
update callback for the given CPU when it is invoked by the CPU scheduler, but
|
||||||
|
not more often than every 10 ms (that can be tweaked via ``debugfs`` in `this
|
||||||
|
particular case <Tuning Interface in debugfs_>`_). Like in the ``performance``
|
||||||
|
case, the hardware configuration is not touched if the new P-state turns out to
|
||||||
|
be the same as the current one.
|
||||||
|
|
||||||
|
This is the default P-state selection algorithm if the
|
||||||
|
:c:macro:`CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE` kernel configuration option
|
||||||
|
is not set.
|
||||||
|
|
||||||
|
Passive Mode
|
||||||
|
------------
|
||||||
|
|
||||||
|
This mode is used if the ``intel_pstate=passive`` argument is passed to the
|
||||||
|
kernel in the command line (it implies the ``intel_pstate=no_hwp`` setting too).
|
||||||
|
Like in the active mode without HWP support, in this mode ``intel_pstate`` may
|
||||||
|
refuse to work with the given processor if it does not recognize it.
|
||||||
|
|
||||||
|
If the driver works in this mode, the ``scaling_driver`` policy attribute in
|
||||||
|
``sysfs`` for all ``CPUFreq`` policies contains the string "intel_cpufreq".
|
||||||
|
Then, the driver behaves like a regular ``CPUFreq`` scaling driver. That is,
|
||||||
|
it is invoked by generic scaling governors when necessary to talk to the
|
||||||
|
hardware in order to change the P-state of a CPU (in particular, the
|
||||||
|
``schedutil`` governor can invoke it directly from scheduler context).
|
||||||
|
|
||||||
|
While in this mode, ``intel_pstate`` can be used with all of the (generic)
|
||||||
|
scaling governors listed by the ``scaling_available_governors`` policy attribute
|
||||||
|
in ``sysfs`` (and the P-state selection algorithms described above are not
|
||||||
|
used). Then, it is responsible for the configuration of policy objects
|
||||||
|
corresponding to CPUs and provides the ``CPUFreq`` core (and the scaling
|
||||||
|
governors attached to the policy objects) with accurate information on the
|
||||||
|
maximum and minimum operating frequencies supported by the hardware (including
|
||||||
|
the so-called "turbo" frequency ranges). In other words, in the passive mode
|
||||||
|
the entire range of available P-states is exposed by ``intel_pstate`` to the
|
||||||
|
``CPUFreq`` core. However, in this mode the driver does not register
|
||||||
|
utilization update callbacks with the CPU scheduler and the ``scaling_cur_freq``
|
||||||
|
information comes from the ``CPUFreq`` core (and is the last frequency selected
|
||||||
|
by the current scaling governor for the given policy).
|
||||||
|
|
||||||
|
|
||||||
|
.. _turbo:
|
||||||
|
|
||||||
|
Turbo P-states Support
|
||||||
|
======================
|
||||||
|
|
||||||
|
In the majority of cases, the entire range of P-states available to
|
||||||
|
``intel_pstate`` can be divided into two sub-ranges that correspond to
|
||||||
|
different types of processor behavior, above and below a boundary that
|
||||||
|
will be referred to as the "turbo threshold" in what follows.
|
||||||
|
|
||||||
|
The P-states above the turbo threshold are referred to as "turbo P-states" and
|
||||||
|
the whole sub-range of P-states they belong to is referred to as the "turbo
|
||||||
|
range". These names are related to the Turbo Boost technology allowing a
|
||||||
|
multicore processor to opportunistically increase the P-state of one or more
|
||||||
|
cores if there is enough power to do that and if that is not going to cause the
|
||||||
|
thermal envelope of the processor package to be exceeded.
|
||||||
|
|
||||||
|
Specifically, if software sets the P-state of a CPU core within the turbo range
|
||||||
|
(that is, above the turbo threshold), the processor is permitted to take over
|
||||||
|
performance scaling control for that core and put it into turbo P-states of its
|
||||||
|
choice going forward. However, that permission is interpreted differently by
|
||||||
|
different processor generations. Namely, the Sandy Bridge generation of
|
||||||
|
processors will never use any P-states above the last one set by software for
|
||||||
|
the given core, even if it is within the turbo range, whereas all of the later
|
||||||
|
processor generations will take it as a license to use any P-states from the
|
||||||
|
turbo range, even above the one set by software. In other words, on those
|
||||||
|
processors setting any P-state from the turbo range will enable the processor
|
||||||
|
to put the given core into all turbo P-states up to and including the maximum
|
||||||
|
supported one as it sees fit.
|
||||||
|
|
||||||
|
One important property of turbo P-states is that they are not sustainable. More
|
||||||
|
precisely, there is no guarantee that any CPUs will be able to stay in any of
|
||||||
|
those states indefinitely, because the power distribution within the processor
|
||||||
|
package may change over time or the thermal envelope it was designed for might
|
||||||
|
be exceeded if a turbo P-state was used for too long.
|
||||||
|
|
||||||
|
In turn, the P-states below the turbo threshold generally are sustainable. In
|
||||||
|
fact, if one of them is set by software, the processor is not expected to change
|
||||||
|
it to a lower one unless in a thermal stress or a power limit violation
|
||||||
|
situation (a higher P-state may still be used if it is set for another CPU in
|
||||||
|
the same package at the same time, for example).
|
||||||
|
|
||||||
|
Some processors allow multiple cores to be in turbo P-states at the same time,
|
||||||
|
but the maximum P-state that can be set for them generally depends on the number
|
||||||
|
of cores running concurrently. The maximum turbo P-state that can be set for 3
|
||||||
|
cores at the same time usually is lower than the analogous maximum P-state for
|
||||||
|
2 cores, which in turn usually is lower than the maximum turbo P-state that can
|
||||||
|
be set for 1 core. The one-core maximum turbo P-state is thus the maximum
|
||||||
|
supported one overall.
|
||||||
|
|
||||||
|
The maximum supported turbo P-state, the turbo threshold (the maximum supported
|
||||||
|
non-turbo P-state) and the minimum supported P-state are specific to the
|
||||||
|
processor model and can be determined by reading the processor's model-specific
|
||||||
|
registers (MSRs). Moreover, some processors support the Configurable TDP
|
||||||
|
(Thermal Design Power) feature and, when that feature is enabled, the turbo
|
||||||
|
threshold effectively becomes a configurable value that can be set by the
|
||||||
|
platform firmware.
|
||||||
|
|
||||||
|
Unlike ``_PSS`` objects in the ACPI tables, ``intel_pstate`` always exposes
|
||||||
|
the entire range of available P-states, including the whole turbo range, to the
|
||||||
|
``CPUFreq`` core and (in the passive mode) to generic scaling governors. This
|
||||||
|
generally causes turbo P-states to be set more often when ``intel_pstate`` is
|
||||||
|
used relative to ACPI-based CPU performance scaling (see `below <acpi-cpufreq_>`_
|
||||||
|
for more information).
|
||||||
|
|
||||||
|
Moreover, since ``intel_pstate`` always knows what the real turbo threshold is
|
||||||
|
(even if the Configurable TDP feature is enabled in the processor), its
|
||||||
|
``no_turbo`` attribute in ``sysfs`` (described `below <no_turbo_attr_>`_) should
|
||||||
|
work as expected in all cases (that is, if set to disable turbo P-states, it
|
||||||
|
always should prevent ``intel_pstate`` from using them).
|
||||||
|
|
||||||
|
|
||||||
|
Processor Support
|
||||||
|
=================
|
||||||
|
|
||||||
|
To handle a given processor ``intel_pstate`` requires a number of different
|
||||||
|
pieces of information on it to be known, including:
|
||||||
|
|
||||||
|
* The minimum supported P-state.
|
||||||
|
|
||||||
|
* The maximum supported `non-turbo P-state <turbo_>`_.
|
||||||
|
|
||||||
|
* Whether or not turbo P-states are supported at all.
|
||||||
|
|
||||||
|
* The maximum supported `one-core turbo P-state <turbo_>`_ (if turbo P-states
|
||||||
|
are supported).
|
||||||
|
|
||||||
|
* The scaling formula to translate the driver's internal representation
|
||||||
|
of P-states into frequencies and the other way around.
|
||||||
|
|
||||||
|
Generally, ways to obtain that information are specific to the processor model
|
||||||
|
or family. Although it often is possible to obtain all of it from the processor
|
||||||
|
itself (using model-specific registers), there are cases in which hardware
|
||||||
|
manuals need to be consulted to get to it too.
|
||||||
|
|
||||||
|
For this reason, there is a list of supported processors in ``intel_pstate`` and
|
||||||
|
the driver initialization will fail if the detected processor is not in that
|
||||||
|
list, unless it supports the `HWP feature <Active Mode_>`_. [The interface to
|
||||||
|
obtain all of the information listed above is the same for all of the processors
|
||||||
|
supporting the HWP feature, which is why they all are supported by
|
||||||
|
``intel_pstate``.]
|
||||||
|
|
||||||
|
|
||||||
|
User Space Interface in ``sysfs``
|
||||||
|
=================================
|
||||||
|
|
||||||
|
Global Attributes
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
``intel_pstate`` exposes several global attributes (files) in ``sysfs`` to
|
||||||
|
control its functionality at the system level. They are located in the
|
||||||
|
``/sys/devices/system/cpu/cpufreq/intel_pstate/`` directory and affect all
|
||||||
|
CPUs.
|
||||||
|
|
||||||
|
Some of them are not present if the ``intel_pstate=per_cpu_perf_limits``
|
||||||
|
argument is passed to the kernel in the command line.
|
||||||
|
|
||||||
|
``max_perf_pct``
|
||||||
|
Maximum P-state the driver is allowed to set in percent of the
|
||||||
|
maximum supported performance level (the highest supported `turbo
|
||||||
|
P-state <turbo_>`_).
|
||||||
|
|
||||||
|
This attribute will not be exposed if the
|
||||||
|
``intel_pstate=per_cpu_perf_limits`` argument is present in the kernel
|
||||||
|
command line.
|
||||||
|
|
||||||
|
``min_perf_pct``
|
||||||
|
Minimum P-state the driver is allowed to set in percent of the
|
||||||
|
maximum supported performance level (the highest supported `turbo
|
||||||
|
P-state <turbo_>`_).
|
||||||
|
|
||||||
|
This attribute will not be exposed if the
|
||||||
|
``intel_pstate=per_cpu_perf_limits`` argument is present in the kernel
|
||||||
|
command line.
|
||||||
|
|
||||||
|
``num_pstates``
|
||||||
|
Number of P-states supported by the processor (between 0 and 255
|
||||||
|
inclusive) including both turbo and non-turbo P-states (see
|
||||||
|
`Turbo P-states Support`_).
|
||||||
|
|
||||||
|
The value of this attribute is not affected by the ``no_turbo``
|
||||||
|
setting described `below <no_turbo_attr_>`_.
|
||||||
|
|
||||||
|
This attribute is read-only.
|
||||||
|
|
||||||
|
``turbo_pct``
|
||||||
|
Ratio of the `turbo range <turbo_>`_ size to the size of the entire
|
||||||
|
range of supported P-states, in percent.
|
||||||
|
|
||||||
|
This attribute is read-only.
|
||||||
|
|
||||||
|
.. _no_turbo_attr:
|
||||||
|
|
||||||
|
``no_turbo``
|
||||||
|
If set (equal to 1), the driver is not allowed to set any turbo P-states
|
||||||
|
(see `Turbo P-states Support`_). If unset (equalt to 0, which is the
|
||||||
|
default), turbo P-states can be set by the driver.
|
||||||
|
[Note that ``intel_pstate`` does not support the general ``boost``
|
||||||
|
attribute (supported by some other scaling drivers) which is replaced
|
||||||
|
by this one.]
|
||||||
|
|
||||||
|
This attrubute does not affect the maximum supported frequency value
|
||||||
|
supplied to the ``CPUFreq`` core and exposed via the policy interface,
|
||||||
|
but it affects the maximum possible value of per-policy P-state limits
|
||||||
|
(see `Interpretation of Policy Attributes`_ below for details).
|
||||||
|
|
||||||
|
.. _status_attr:
|
||||||
|
|
||||||
|
``status``
|
||||||
|
Operation mode of the driver: "active", "passive" or "off".
|
||||||
|
|
||||||
|
"active"
|
||||||
|
The driver is functional and in the `active mode
|
||||||
|
<Active Mode_>`_.
|
||||||
|
|
||||||
|
"passive"
|
||||||
|
The driver is functional and in the `passive mode
|
||||||
|
<Passive Mode_>`_.
|
||||||
|
|
||||||
|
"off"
|
||||||
|
The driver is not functional (it is not registered as a scaling
|
||||||
|
driver with the ``CPUFreq`` core).
|
||||||
|
|
||||||
|
This attribute can be written to in order to change the driver's
|
||||||
|
operation mode or to unregister it. The string written to it must be
|
||||||
|
one of the possible values of it and, if successful, the write will
|
||||||
|
cause the driver to switch over to the operation mode represented by
|
||||||
|
that string - or to be unregistered in the "off" case. [Actually,
|
||||||
|
switching over from the active mode to the passive mode or the other
|
||||||
|
way around causes the driver to be unregistered and registered again
|
||||||
|
with a different set of callbacks, so all of its settings (the global
|
||||||
|
as well as the per-policy ones) are then reset to their default
|
||||||
|
values, possibly depending on the target operation mode.]
|
||||||
|
|
||||||
|
That only is supported in some configurations, though (for example, if
|
||||||
|
the `HWP feature is enabled in the processor <Active Mode With HWP_>`_,
|
||||||
|
the operation mode of the driver cannot be changed), and if it is not
|
||||||
|
supported in the current configuration, writes to this attribute with
|
||||||
|
fail with an appropriate error.
|
||||||
|
|
||||||
|
Interpretation of Policy Attributes
|
||||||
|
-----------------------------------
|
||||||
|
|
||||||
|
The interpretation of some ``CPUFreq`` policy attributes described in
|
||||||
|
:doc:`cpufreq` is special with ``intel_pstate`` as the current scaling driver
|
||||||
|
and it generally depends on the driver's `operation mode <Operation Modes_>`_.
|
||||||
|
|
||||||
|
First of all, the values of the ``cpuinfo_max_freq``, ``cpuinfo_min_freq`` and
|
||||||
|
``scaling_cur_freq`` attributes are produced by applying a processor-specific
|
||||||
|
multiplier to the internal P-state representation used by ``intel_pstate``.
|
||||||
|
Also, the values of the ``scaling_max_freq`` and ``scaling_min_freq``
|
||||||
|
attributes are capped by the frequency corresponding to the maximum P-state that
|
||||||
|
the driver is allowed to set.
|
||||||
|
|
||||||
|
If the ``no_turbo`` `global attribute <no_turbo_attr_>`_ is set, the driver is
|
||||||
|
not allowed to use turbo P-states, so the maximum value of ``scaling_max_freq``
|
||||||
|
and ``scaling_min_freq`` is limited to the maximum non-turbo P-state frequency.
|
||||||
|
Accordingly, setting ``no_turbo`` causes ``scaling_max_freq`` and
|
||||||
|
``scaling_min_freq`` to go down to that value if they were above it before.
|
||||||
|
However, the old values of ``scaling_max_freq`` and ``scaling_min_freq`` will be
|
||||||
|
restored after unsetting ``no_turbo``, unless these attributes have been written
|
||||||
|
to after ``no_turbo`` was set.
|
||||||
|
|
||||||
|
If ``no_turbo`` is not set, the maximum possible value of ``scaling_max_freq``
|
||||||
|
and ``scaling_min_freq`` corresponds to the maximum supported turbo P-state,
|
||||||
|
which also is the value of ``cpuinfo_max_freq`` in either case.
|
||||||
|
|
||||||
|
Next, the following policy attributes have special meaning if
|
||||||
|
``intel_pstate`` works in the `active mode <Active Mode_>`_:
|
||||||
|
|
||||||
|
``scaling_available_governors``
|
||||||
|
List of P-state selection algorithms provided by ``intel_pstate``.
|
||||||
|
|
||||||
|
``scaling_governor``
|
||||||
|
P-state selection algorithm provided by ``intel_pstate`` currently in
|
||||||
|
use with the given policy.
|
||||||
|
|
||||||
|
``scaling_cur_freq``
|
||||||
|
Frequency of the average P-state of the CPU represented by the given
|
||||||
|
policy for the time interval between the last two invocations of the
|
||||||
|
driver's utilization update callback by the CPU scheduler for that CPU.
|
||||||
|
|
||||||
|
The meaning of these attributes in the `passive mode <Passive Mode_>`_ is the
|
||||||
|
same as for other scaling drivers.
|
||||||
|
|
||||||
|
Additionally, the value of the ``scaling_driver`` attribute for ``intel_pstate``
|
||||||
|
depends on the operation mode of the driver. Namely, it is either
|
||||||
|
"intel_pstate" (in the `active mode <Active Mode_>`_) or "intel_cpufreq" (in the
|
||||||
|
`passive mode <Passive Mode_>`_).
|
||||||
|
|
||||||
|
Coordination of P-State Limits
|
||||||
|
------------------------------
|
||||||
|
|
||||||
|
``intel_pstate`` allows P-state limits to be set in two ways: with the help of
|
||||||
|
the ``max_perf_pct`` and ``min_perf_pct`` `global attributes
|
||||||
|
<Global Attributes_>`_ or via the ``scaling_max_freq`` and ``scaling_min_freq``
|
||||||
|
``CPUFreq`` policy attributes. The coordination between those limits is based
|
||||||
|
on the following rules, regardless of the current operation mode of the driver:
|
||||||
|
|
||||||
|
1. All CPUs are affected by the global limits (that is, none of them can be
|
||||||
|
requested to run faster than the global maximum and none of them can be
|
||||||
|
requested to run slower than the global minimum).
|
||||||
|
|
||||||
|
2. Each individual CPU is affected by its own per-policy limits (that is, it
|
||||||
|
cannot be requested to run faster than its own per-policy maximum and it
|
||||||
|
cannot be requested to run slower than its own per-policy minimum).
|
||||||
|
|
||||||
|
3. The global and per-policy limits can be set independently.
|
||||||
|
|
||||||
|
If the `HWP feature is enabled in the processor <Active Mode With HWP_>`_, the
|
||||||
|
resulting effective values are written into its registers whenever the limits
|
||||||
|
change in order to request its internal P-state selection logic to always set
|
||||||
|
P-states within these limits. Otherwise, the limits are taken into account by
|
||||||
|
scaling governors (in the `passive mode <Passive Mode_>`_) and by the driver
|
||||||
|
every time before setting a new P-state for a CPU.
|
||||||
|
|
||||||
|
Additionally, if the ``intel_pstate=per_cpu_perf_limits`` command line argument
|
||||||
|
is passed to the kernel, ``max_perf_pct`` and ``min_perf_pct`` are not exposed
|
||||||
|
at all and the only way to set the limits is by using the policy attributes.
|
||||||
|
|
||||||
|
|
||||||
|
Energy vs Performance Hints
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
If ``intel_pstate`` works in the `active mode with the HWP feature enabled
|
||||||
|
<Active Mode With HWP_>`_ in the processor, additional attributes are present
|
||||||
|
in every ``CPUFreq`` policy directory in ``sysfs``. They are intended to allow
|
||||||
|
user space to help ``intel_pstate`` to adjust the processor's internal P-state
|
||||||
|
selection logic by focusing it on performance or on energy-efficiency, or
|
||||||
|
somewhere between the two extremes:
|
||||||
|
|
||||||
|
``energy_performance_preference``
|
||||||
|
Current value of the energy vs performance hint for the given policy
|
||||||
|
(or the CPU represented by it).
|
||||||
|
|
||||||
|
The hint can be changed by writing to this attribute.
|
||||||
|
|
||||||
|
``energy_performance_available_preferences``
|
||||||
|
List of strings that can be written to the
|
||||||
|
``energy_performance_preference`` attribute.
|
||||||
|
|
||||||
|
They represent different energy vs performance hints and should be
|
||||||
|
self-explanatory, except that ``default`` represents whatever hint
|
||||||
|
value was set by the platform firmware.
|
||||||
|
|
||||||
|
Strings written to the ``energy_performance_preference`` attribute are
|
||||||
|
internally translated to integer values written to the processor's
|
||||||
|
Energy-Performance Preference (EPP) knob (if supported) or its
|
||||||
|
Energy-Performance Bias (EPB) knob.
|
||||||
|
|
||||||
|
[Note that tasks may by migrated from one CPU to another by the scheduler's
|
||||||
|
load-balancing algorithm and if different energy vs performance hints are
|
||||||
|
set for those CPUs, that may lead to undesirable outcomes. To avoid such
|
||||||
|
issues it is better to set the same energy vs performance hint for all CPUs
|
||||||
|
or to pin every task potentially sensitive to them to a specific CPU.]
|
||||||
|
|
||||||
|
.. _acpi-cpufreq:
|
||||||
|
|
||||||
|
``intel_pstate`` vs ``acpi-cpufreq``
|
||||||
|
====================================
|
||||||
|
|
||||||
|
On the majority of systems supported by ``intel_pstate``, the ACPI tables
|
||||||
|
provided by the platform firmware contain ``_PSS`` objects returning information
|
||||||
|
that can be used for CPU performance scaling (refer to the `ACPI specification`_
|
||||||
|
for details on the ``_PSS`` objects and the format of the information returned
|
||||||
|
by them).
|
||||||
|
|
||||||
|
The information returned by the ACPI ``_PSS`` objects is used by the
|
||||||
|
``acpi-cpufreq`` scaling driver. On systems supported by ``intel_pstate``
|
||||||
|
the ``acpi-cpufreq`` driver uses the same hardware CPU performance scaling
|
||||||
|
interface, but the set of P-states it can use is limited by the ``_PSS``
|
||||||
|
output.
|
||||||
|
|
||||||
|
On those systems each ``_PSS`` object returns a list of P-states supported by
|
||||||
|
the corresponding CPU which basically is a subset of the P-states range that can
|
||||||
|
be used by ``intel_pstate`` on the same system, with one exception: the whole
|
||||||
|
`turbo range <turbo_>`_ is represented by one item in it (the topmost one). By
|
||||||
|
convention, the frequency returned by ``_PSS`` for that item is greater by 1 MHz
|
||||||
|
than the frequency of the highest non-turbo P-state listed by it, but the
|
||||||
|
corresponding P-state representation (following the hardware specification)
|
||||||
|
returned for it matches the maximum supported turbo P-state (or is the
|
||||||
|
special value 255 meaning essentially "go as high as you can get").
|
||||||
|
|
||||||
|
The list of P-states returned by ``_PSS`` is reflected by the table of
|
||||||
|
available frequencies supplied by ``acpi-cpufreq`` to the ``CPUFreq`` core and
|
||||||
|
scaling governors and the minimum and maximum supported frequencies reported by
|
||||||
|
it come from that list as well. In particular, given the special representation
|
||||||
|
of the turbo range described above, this means that the maximum supported
|
||||||
|
frequency reported by ``acpi-cpufreq`` is higher by 1 MHz than the frequency
|
||||||
|
of the highest supported non-turbo P-state listed by ``_PSS`` which, of course,
|
||||||
|
affects decisions made by the scaling governors, except for ``powersave`` and
|
||||||
|
``performance``.
|
||||||
|
|
||||||
|
For example, if a given governor attempts to select a frequency proportional to
|
||||||
|
estimated CPU load and maps the load of 100% to the maximum supported frequency
|
||||||
|
(possibly multiplied by a constant), then it will tend to choose P-states below
|
||||||
|
the turbo threshold if ``acpi-cpufreq`` is used as the scaling driver, because
|
||||||
|
in that case the turbo range corresponds to a small fraction of the frequency
|
||||||
|
band it can use (1 MHz vs 1 GHz or more). In consequence, it will only go to
|
||||||
|
the turbo range for the highest loads and the other loads above 50% that might
|
||||||
|
benefit from running at turbo frequencies will be given non-turbo P-states
|
||||||
|
instead.
|
||||||
|
|
||||||
|
One more issue related to that may appear on systems supporting the
|
||||||
|
`Configurable TDP feature <turbo_>`_ allowing the platform firmware to set the
|
||||||
|
turbo threshold. Namely, if that is not coordinated with the lists of P-states
|
||||||
|
returned by ``_PSS`` properly, there may be more than one item corresponding to
|
||||||
|
a turbo P-state in those lists and there may be a problem with avoiding the
|
||||||
|
turbo range (if desirable or necessary). Usually, to avoid using turbo
|
||||||
|
P-states overall, ``acpi-cpufreq`` simply avoids using the topmost state listed
|
||||||
|
by ``_PSS``, but that is not sufficient when there are other turbo P-states in
|
||||||
|
the list returned by it.
|
||||||
|
|
||||||
|
Apart from the above, ``acpi-cpufreq`` works like ``intel_pstate`` in the
|
||||||
|
`passive mode <Passive Mode_>`_, except that the number of P-states it can set
|
||||||
|
is limited to the ones listed by the ACPI ``_PSS`` objects.
|
||||||
|
|
||||||
|
|
||||||
|
Kernel Command Line Options for ``intel_pstate``
|
||||||
|
================================================
|
||||||
|
|
||||||
|
Several kernel command line options can be used to pass early-configuration-time
|
||||||
|
parameters to ``intel_pstate`` in order to enforce specific behavior of it. All
|
||||||
|
of them have to be prepended with the ``intel_pstate=`` prefix.
|
||||||
|
|
||||||
|
``disable``
|
||||||
|
Do not register ``intel_pstate`` as the scaling driver even if the
|
||||||
|
processor is supported by it.
|
||||||
|
|
||||||
|
``passive``
|
||||||
|
Register ``intel_pstate`` in the `passive mode <Passive Mode_>`_ to
|
||||||
|
start with.
|
||||||
|
|
||||||
|
This option implies the ``no_hwp`` one described below.
|
||||||
|
|
||||||
|
``force``
|
||||||
|
Register ``intel_pstate`` as the scaling driver instead of
|
||||||
|
``acpi-cpufreq`` even if the latter is preferred on the given system.
|
||||||
|
|
||||||
|
This may prevent some platform features (such as thermal controls and
|
||||||
|
power capping) that rely on the availability of ACPI P-states
|
||||||
|
information from functioning as expected, so it should be used with
|
||||||
|
caution.
|
||||||
|
|
||||||
|
This option does not work with processors that are not supported by
|
||||||
|
``intel_pstate`` and on platforms where the ``pcc-cpufreq`` scaling
|
||||||
|
driver is used instead of ``acpi-cpufreq``.
|
||||||
|
|
||||||
|
``no_hwp``
|
||||||
|
Do not enable the `hardware-managed P-states (HWP) feature
|
||||||
|
<Active Mode With HWP_>`_ even if it is supported by the processor.
|
||||||
|
|
||||||
|
``hwp_only``
|
||||||
|
Register ``intel_pstate`` as the scaling driver only if the
|
||||||
|
`hardware-managed P-states (HWP) feature <Active Mode With HWP_>`_ is
|
||||||
|
supported by the processor.
|
||||||
|
|
||||||
|
``support_acpi_ppc``
|
||||||
|
Take ACPI ``_PPC`` performance limits into account.
|
||||||
|
|
||||||
|
If the preferred power management profile in the FADT (Fixed ACPI
|
||||||
|
Description Table) is set to "Enterprise Server" or "Performance
|
||||||
|
Server", the ACPI ``_PPC`` limits are taken into account by default
|
||||||
|
and this option has no effect.
|
||||||
|
|
||||||
|
``per_cpu_perf_limits``
|
||||||
|
Use per-logical-CPU P-State limits (see `Coordination of P-state
|
||||||
|
Limits`_ for details).
|
||||||
|
|
||||||
|
|
||||||
|
Diagnostics and Tuning
|
||||||
|
======================
|
||||||
|
|
||||||
|
Trace Events
|
||||||
|
------------
|
||||||
|
|
||||||
|
There are two static trace events that can be used for ``intel_pstate``
|
||||||
|
diagnostics. One of them is the ``cpu_frequency`` trace event generally used
|
||||||
|
by ``CPUFreq``, and the other one is the ``pstate_sample`` trace event specific
|
||||||
|
to ``intel_pstate``. Both of them are triggered by ``intel_pstate`` only if
|
||||||
|
it works in the `active mode <Active Mode_>`_.
|
||||||
|
|
||||||
|
The following sequence of shell commands can be used to enable them and see
|
||||||
|
their output (if the kernel is generally configured to support event tracing)::
|
||||||
|
|
||||||
|
# cd /sys/kernel/debug/tracing/
|
||||||
|
# echo 1 > events/power/pstate_sample/enable
|
||||||
|
# echo 1 > events/power/cpu_frequency/enable
|
||||||
|
# cat trace
|
||||||
|
gnome-terminal--4510 [001] ..s. 1177.680733: pstate_sample: core_busy=107 scaled=94 from=26 to=26 mperf=1143818 aperf=1230607 tsc=29838618 freq=2474476
|
||||||
|
cat-5235 [002] ..s. 1177.681723: cpu_frequency: state=2900000 cpu_id=2
|
||||||
|
|
||||||
|
If ``intel_pstate`` works in the `passive mode <Passive Mode_>`_, the
|
||||||
|
``cpu_frequency`` trace event will be triggered either by the ``schedutil``
|
||||||
|
scaling governor (for the policies it is attached to), or by the ``CPUFreq``
|
||||||
|
core (for the policies with other scaling governors).
|
||||||
|
|
||||||
|
``ftrace``
|
||||||
|
----------
|
||||||
|
|
||||||
|
The ``ftrace`` interface can be used for low-level diagnostics of
|
||||||
|
``intel_pstate``. For example, to check how often the function to set a
|
||||||
|
P-state is called, the ``ftrace`` filter can be set to to
|
||||||
|
:c:func:`intel_pstate_set_pstate`::
|
||||||
|
|
||||||
|
# cd /sys/kernel/debug/tracing/
|
||||||
|
# cat available_filter_functions | grep -i pstate
|
||||||
|
intel_pstate_set_pstate
|
||||||
|
intel_pstate_cpu_init
|
||||||
|
...
|
||||||
|
# echo intel_pstate_set_pstate > set_ftrace_filter
|
||||||
|
# echo function > current_tracer
|
||||||
|
# cat trace | head -15
|
||||||
|
# tracer: function
|
||||||
|
#
|
||||||
|
# entries-in-buffer/entries-written: 80/80 #P:4
|
||||||
|
#
|
||||||
|
# _-----=> irqs-off
|
||||||
|
# / _----=> need-resched
|
||||||
|
# | / _---=> hardirq/softirq
|
||||||
|
# || / _--=> preempt-depth
|
||||||
|
# ||| / delay
|
||||||
|
# TASK-PID CPU# |||| TIMESTAMP FUNCTION
|
||||||
|
# | | | |||| | |
|
||||||
|
Xorg-3129 [000] ..s. 2537.644844: intel_pstate_set_pstate <-intel_pstate_timer_func
|
||||||
|
gnome-terminal--4510 [002] ..s. 2537.649844: intel_pstate_set_pstate <-intel_pstate_timer_func
|
||||||
|
gnome-shell-3409 [001] ..s. 2537.650850: intel_pstate_set_pstate <-intel_pstate_timer_func
|
||||||
|
<idle>-0 [000] ..s. 2537.654843: intel_pstate_set_pstate <-intel_pstate_timer_func
|
||||||
|
|
||||||
|
Tuning Interface in ``debugfs``
|
||||||
|
-------------------------------
|
||||||
|
|
||||||
|
The ``powersave`` algorithm provided by ``intel_pstate`` for `the Core line of
|
||||||
|
processors in the active mode <powersave_>`_ is based on a `PID controller`_
|
||||||
|
whose parameters were chosen to address a number of different use cases at the
|
||||||
|
same time. However, it still is possible to fine-tune it to a specific workload
|
||||||
|
and the ``debugfs`` interface under ``/sys/kernel/debug/pstate_snb/`` is
|
||||||
|
provided for this purpose. [Note that the ``pstate_snb`` directory will be
|
||||||
|
present only if the specific P-state selection algorithm matching the interface
|
||||||
|
in it actually is in use.]
|
||||||
|
|
||||||
|
The following files present in that directory can be used to modify the PID
|
||||||
|
controller parameters at run time:
|
||||||
|
|
||||||
|
| ``deadband``
|
||||||
|
| ``d_gain_pct``
|
||||||
|
| ``i_gain_pct``
|
||||||
|
| ``p_gain_pct``
|
||||||
|
| ``sample_rate_ms``
|
||||||
|
| ``setpoint``
|
||||||
|
|
||||||
|
Note, however, that achieving desirable results this way generally requires
|
||||||
|
expert-level understanding of the power vs performance tradeoff, so extra care
|
||||||
|
is recommended when attempting to do that.
|
||||||
|
|
||||||
|
|
||||||
|
.. _LCEU2015: http://events.linuxfoundation.org/sites/events/files/slides/LinuxConEurope_2015.pdf
|
||||||
|
.. _SDM: http://www.intel.com/content/www/us/en/architecture-and-technology/64-ia-32-architectures-software-developer-system-programming-manual-325384.html
|
||||||
|
.. _ACPI specification: http://www.uefi.org/sites/default/files/resources/ACPI_6_1.pdf
|
||||||
|
.. _PID controller: https://en.wikipedia.org/wiki/PID_controller
|
@@ -1,281 +0,0 @@
|
|||||||
Intel P-State driver
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
This driver provides an interface to control the P-State selection for the
|
|
||||||
SandyBridge+ Intel processors.
|
|
||||||
|
|
||||||
The following document explains P-States:
|
|
||||||
http://events.linuxfoundation.org/sites/events/files/slides/LinuxConEurope_2015.pdf
|
|
||||||
As stated in the document, P-State doesn’t exactly mean a frequency. However, for
|
|
||||||
the sake of the relationship with cpufreq, P-State and frequency are used
|
|
||||||
interchangeably.
|
|
||||||
|
|
||||||
Understanding the cpufreq core governors and policies are important before
|
|
||||||
discussing more details about the Intel P-State driver. Based on what callbacks
|
|
||||||
a cpufreq driver provides to the cpufreq core, it can support two types of
|
|
||||||
drivers:
|
|
||||||
- with target_index() callback: In this mode, the drivers using cpufreq core
|
|
||||||
simply provide the minimum and maximum frequency limits and an additional
|
|
||||||
interface target_index() to set the current frequency. The cpufreq subsystem
|
|
||||||
has a number of scaling governors ("performance", "powersave", "ondemand",
|
|
||||||
etc.). Depending on which governor is in use, cpufreq core will call for
|
|
||||||
transitions to a specific frequency using target_index() callback.
|
|
||||||
- setpolicy() callback: In this mode, drivers do not provide target_index()
|
|
||||||
callback, so cpufreq core can't request a transition to a specific frequency.
|
|
||||||
The driver provides minimum and maximum frequency limits and callbacks to set a
|
|
||||||
policy. The policy in cpufreq sysfs is referred to as the "scaling governor".
|
|
||||||
The cpufreq core can request the driver to operate in any of the two policies:
|
|
||||||
"performance" and "powersave". The driver decides which frequency to use based
|
|
||||||
on the above policy selection considering minimum and maximum frequency limits.
|
|
||||||
|
|
||||||
The Intel P-State driver falls under the latter category, which implements the
|
|
||||||
setpolicy() callback. This driver decides what P-State to use based on the
|
|
||||||
requested policy from the cpufreq core. If the processor is capable of
|
|
||||||
selecting its next P-State internally, then the driver will offload this
|
|
||||||
responsibility to the processor (aka HWP: Hardware P-States). If not, the
|
|
||||||
driver implements algorithms to select the next P-State.
|
|
||||||
|
|
||||||
Since these policies are implemented in the driver, they are not same as the
|
|
||||||
cpufreq scaling governors implementation, even if they have the same name in
|
|
||||||
the cpufreq sysfs (scaling_governors). For example the "performance" policy is
|
|
||||||
similar to cpufreq’s "performance" governor, but "powersave" is completely
|
|
||||||
different than the cpufreq "powersave" governor. The strategy here is similar
|
|
||||||
to cpufreq "ondemand", where the requested P-State is related to the system load.
|
|
||||||
|
|
||||||
Sysfs Interface
|
|
||||||
|
|
||||||
In addition to the frequency-controlling interfaces provided by the cpufreq
|
|
||||||
core, the driver provides its own sysfs files to control the P-State selection.
|
|
||||||
These files have been added to /sys/devices/system/cpu/intel_pstate/.
|
|
||||||
Any changes made to these files are applicable to all CPUs (even in a
|
|
||||||
multi-package system, Refer to later section on placing "Per-CPU limits").
|
|
||||||
|
|
||||||
max_perf_pct: Limits the maximum P-State that will be requested by
|
|
||||||
the driver. It states it as a percentage of the available performance. The
|
|
||||||
available (P-State) performance may be reduced by the no_turbo
|
|
||||||
setting described below.
|
|
||||||
|
|
||||||
min_perf_pct: Limits the minimum P-State that will be requested by
|
|
||||||
the driver. It states it as a percentage of the max (non-turbo)
|
|
||||||
performance level.
|
|
||||||
|
|
||||||
no_turbo: Limits the driver to selecting P-State below the turbo
|
|
||||||
frequency range.
|
|
||||||
|
|
||||||
turbo_pct: Displays the percentage of the total performance that
|
|
||||||
is supported by hardware that is in the turbo range. This number
|
|
||||||
is independent of whether turbo has been disabled or not.
|
|
||||||
|
|
||||||
num_pstates: Displays the number of P-States that are supported
|
|
||||||
by hardware. This number is independent of whether turbo has
|
|
||||||
been disabled or not.
|
|
||||||
|
|
||||||
For example, if a system has these parameters:
|
|
||||||
Max 1 core turbo ratio: 0x21 (Max 1 core ratio is the maximum P-State)
|
|
||||||
Max non turbo ratio: 0x17
|
|
||||||
Minimum ratio : 0x08 (Here the ratio is called max efficiency ratio)
|
|
||||||
|
|
||||||
Sysfs will show :
|
|
||||||
max_perf_pct:100, which corresponds to 1 core ratio
|
|
||||||
min_perf_pct:24, max_efficiency_ratio / max 1 Core ratio
|
|
||||||
no_turbo:0, turbo is not disabled
|
|
||||||
num_pstates:26 = (max 1 Core ratio - Max Efficiency Ratio + 1)
|
|
||||||
turbo_pct:39 = (max 1 core ratio - max non turbo ratio) / num_pstates
|
|
||||||
|
|
||||||
Refer to "Intel® 64 and IA-32 Architectures Software Developer’s Manual
|
|
||||||
Volume 3: System Programming Guide" to understand ratios.
|
|
||||||
|
|
||||||
There is one more sysfs attribute in /sys/devices/system/cpu/intel_pstate/
|
|
||||||
that can be used for controlling the operation mode of the driver:
|
|
||||||
|
|
||||||
status: Three settings are possible:
|
|
||||||
"off" - The driver is not in use at this time.
|
|
||||||
"active" - The driver works as a P-state governor (default).
|
|
||||||
"passive" - The driver works as a regular cpufreq one and collaborates
|
|
||||||
with the generic cpufreq governors (it sets P-states as
|
|
||||||
requested by those governors).
|
|
||||||
The current setting is returned by reads from this attribute. Writing one
|
|
||||||
of the above strings to it changes the operation mode as indicated by that
|
|
||||||
string, if possible. If HW-managed P-states (HWP) are enabled, it is not
|
|
||||||
possible to change the driver's operation mode and attempts to write to
|
|
||||||
this attribute will fail.
|
|
||||||
|
|
||||||
cpufreq sysfs for Intel P-State
|
|
||||||
|
|
||||||
Since this driver registers with cpufreq, cpufreq sysfs is also presented.
|
|
||||||
There are some important differences, which need to be considered.
|
|
||||||
|
|
||||||
scaling_cur_freq: This displays the real frequency which was used during
|
|
||||||
the last sample period instead of what is requested. Some other cpufreq driver,
|
|
||||||
like acpi-cpufreq, displays what is requested (Some changes are on the
|
|
||||||
way to fix this for acpi-cpufreq driver). The same is true for frequencies
|
|
||||||
displayed at /proc/cpuinfo.
|
|
||||||
|
|
||||||
scaling_governor: This displays current active policy. Since each CPU has a
|
|
||||||
cpufreq sysfs, it is possible to set a scaling governor to each CPU. But this
|
|
||||||
is not possible with Intel P-States, as there is one common policy for all
|
|
||||||
CPUs. Here, the last requested policy will be applicable to all CPUs. It is
|
|
||||||
suggested that one use the cpupower utility to change policy to all CPUs at the
|
|
||||||
same time.
|
|
||||||
|
|
||||||
scaling_setspeed: This attribute can never be used with Intel P-State.
|
|
||||||
|
|
||||||
scaling_max_freq/scaling_min_freq: This interface can be used similarly to
|
|
||||||
the max_perf_pct/min_perf_pct of Intel P-State sysfs. However since frequencies
|
|
||||||
are converted to nearest possible P-State, this is prone to rounding errors.
|
|
||||||
This method is not preferred to limit performance.
|
|
||||||
|
|
||||||
affected_cpus: Not used
|
|
||||||
related_cpus: Not used
|
|
||||||
|
|
||||||
For contemporary Intel processors, the frequency is controlled by the
|
|
||||||
processor itself and the P-State exposed to software is related to
|
|
||||||
performance levels. The idea that frequency can be set to a single
|
|
||||||
frequency is fictional for Intel Core processors. Even if the scaling
|
|
||||||
driver selects a single P-State, the actual frequency the processor
|
|
||||||
will run at is selected by the processor itself.
|
|
||||||
|
|
||||||
Per-CPU limits
|
|
||||||
|
|
||||||
The kernel command line option "intel_pstate=per_cpu_perf_limits" forces
|
|
||||||
the intel_pstate driver to use per-CPU performance limits. When it is set,
|
|
||||||
the sysfs control interface described above is subject to limitations.
|
|
||||||
- The following controls are not available for both read and write
|
|
||||||
/sys/devices/system/cpu/intel_pstate/max_perf_pct
|
|
||||||
/sys/devices/system/cpu/intel_pstate/min_perf_pct
|
|
||||||
- The following controls can be used to set performance limits, as far as the
|
|
||||||
architecture of the processor permits:
|
|
||||||
/sys/devices/system/cpu/cpu*/cpufreq/scaling_max_freq
|
|
||||||
/sys/devices/system/cpu/cpu*/cpufreq/scaling_min_freq
|
|
||||||
/sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
|
|
||||||
- User can still observe turbo percent and number of P-States from
|
|
||||||
/sys/devices/system/cpu/intel_pstate/turbo_pct
|
|
||||||
/sys/devices/system/cpu/intel_pstate/num_pstates
|
|
||||||
- User can read write system wide turbo status
|
|
||||||
/sys/devices/system/cpu/no_turbo
|
|
||||||
|
|
||||||
Support of energy performance hints
|
|
||||||
It is possible to provide hints to the HWP algorithms in the processor
|
|
||||||
to be more performance centric to more energy centric. When the driver
|
|
||||||
is using HWP, two additional cpufreq sysfs attributes are presented for
|
|
||||||
each logical CPU.
|
|
||||||
These attributes are:
|
|
||||||
- energy_performance_available_preferences
|
|
||||||
- energy_performance_preference
|
|
||||||
|
|
||||||
To get list of supported hints:
|
|
||||||
$ cat energy_performance_available_preferences
|
|
||||||
default performance balance_performance balance_power power
|
|
||||||
|
|
||||||
The current preference can be read or changed via cpufreq sysfs
|
|
||||||
attribute "energy_performance_preference". Reading from this attribute
|
|
||||||
will display current effective setting. User can write any of the valid
|
|
||||||
preference string to this attribute. User can always restore to power-on
|
|
||||||
default by writing "default".
|
|
||||||
|
|
||||||
Since threads can migrate to different CPUs, this is possible that the
|
|
||||||
new CPU may have different energy performance preference than the previous
|
|
||||||
one. To avoid such issues, either threads can be pinned to specific CPUs
|
|
||||||
or set the same energy performance preference value to all CPUs.
|
|
||||||
|
|
||||||
Tuning Intel P-State driver
|
|
||||||
|
|
||||||
When the performance can be tuned using PID (Proportional Integral
|
|
||||||
Derivative) controller, debugfs files are provided for adjusting performance.
|
|
||||||
They are presented under:
|
|
||||||
/sys/kernel/debug/pstate_snb/
|
|
||||||
|
|
||||||
The PID tunable parameters are:
|
|
||||||
deadband
|
|
||||||
d_gain_pct
|
|
||||||
i_gain_pct
|
|
||||||
p_gain_pct
|
|
||||||
sample_rate_ms
|
|
||||||
setpoint
|
|
||||||
|
|
||||||
To adjust these parameters, some understanding of driver implementation is
|
|
||||||
necessary. There are some tweeks described here, but be very careful. Adjusting
|
|
||||||
them requires expert level understanding of power and performance relationship.
|
|
||||||
These limits are only useful when the "powersave" policy is active.
|
|
||||||
|
|
||||||
-To make the system more responsive to load changes, sample_rate_ms can
|
|
||||||
be adjusted (current default is 10ms).
|
|
||||||
-To make the system use higher performance, even if the load is lower, setpoint
|
|
||||||
can be adjusted to a lower number. This will also lead to faster ramp up time
|
|
||||||
to reach the maximum P-State.
|
|
||||||
If there are no derivative and integral coefficients, The next P-State will be
|
|
||||||
equal to:
|
|
||||||
current P-State - ((setpoint - current cpu load) * p_gain_pct)
|
|
||||||
|
|
||||||
For example, if the current PID parameters are (Which are defaults for the core
|
|
||||||
processors like SandyBridge):
|
|
||||||
deadband = 0
|
|
||||||
d_gain_pct = 0
|
|
||||||
i_gain_pct = 0
|
|
||||||
p_gain_pct = 20
|
|
||||||
sample_rate_ms = 10
|
|
||||||
setpoint = 97
|
|
||||||
|
|
||||||
If the current P-State = 0x08 and current load = 100, this will result in the
|
|
||||||
next P-State = 0x08 - ((97 - 100) * 0.2) = 8.6 (rounded to 9). Here the P-State
|
|
||||||
goes up by only 1. If during next sample interval the current load doesn't
|
|
||||||
change and still 100, then P-State goes up by one again. This process will
|
|
||||||
continue as long as the load is more than the setpoint until the maximum P-State
|
|
||||||
is reached.
|
|
||||||
|
|
||||||
For the same load at setpoint = 60, this will result in the next P-State
|
|
||||||
= 0x08 - ((60 - 100) * 0.2) = 16
|
|
||||||
So by changing the setpoint from 97 to 60, there is an increase of the
|
|
||||||
next P-State from 9 to 16. So this will make processor execute at higher
|
|
||||||
P-State for the same CPU load. If the load continues to be more than the
|
|
||||||
setpoint during next sample intervals, then P-State will go up again till the
|
|
||||||
maximum P-State is reached. But the ramp up time to reach the maximum P-State
|
|
||||||
will be much faster when the setpoint is 60 compared to 97.
|
|
||||||
|
|
||||||
Debugging Intel P-State driver
|
|
||||||
|
|
||||||
Event tracing
|
|
||||||
To debug P-State transition, the Linux event tracing interface can be used.
|
|
||||||
There are two specific events, which can be enabled (Provided the kernel
|
|
||||||
configs related to event tracing are enabled).
|
|
||||||
|
|
||||||
# cd /sys/kernel/debug/tracing/
|
|
||||||
# echo 1 > events/power/pstate_sample/enable
|
|
||||||
# echo 1 > events/power/cpu_frequency/enable
|
|
||||||
# cat trace
|
|
||||||
gnome-terminal--4510 [001] ..s. 1177.680733: pstate_sample: core_busy=107
|
|
||||||
scaled=94 from=26 to=26 mperf=1143818 aperf=1230607 tsc=29838618
|
|
||||||
freq=2474476
|
|
||||||
cat-5235 [002] ..s. 1177.681723: cpu_frequency: state=2900000 cpu_id=2
|
|
||||||
|
|
||||||
|
|
||||||
Using ftrace
|
|
||||||
|
|
||||||
If function level tracing is required, the Linux ftrace interface can be used.
|
|
||||||
For example if we want to check how often a function to set a P-State is
|
|
||||||
called, we can set ftrace filter to intel_pstate_set_pstate.
|
|
||||||
|
|
||||||
# cd /sys/kernel/debug/tracing/
|
|
||||||
# cat available_filter_functions | grep -i pstate
|
|
||||||
intel_pstate_set_pstate
|
|
||||||
intel_pstate_cpu_init
|
|
||||||
...
|
|
||||||
|
|
||||||
# echo intel_pstate_set_pstate > set_ftrace_filter
|
|
||||||
# echo function > current_tracer
|
|
||||||
# cat trace | head -15
|
|
||||||
# tracer: function
|
|
||||||
#
|
|
||||||
# entries-in-buffer/entries-written: 80/80 #P:4
|
|
||||||
#
|
|
||||||
# _-----=> irqs-off
|
|
||||||
# / _----=> need-resched
|
|
||||||
# | / _---=> hardirq/softirq
|
|
||||||
# || / _--=> preempt-depth
|
|
||||||
# ||| / delay
|
|
||||||
# TASK-PID CPU# |||| TIMESTAMP FUNCTION
|
|
||||||
# | | | |||| | |
|
|
||||||
Xorg-3129 [000] ..s. 2537.644844: intel_pstate_set_pstate <-intel_pstate_timer_func
|
|
||||||
gnome-terminal--4510 [002] ..s. 2537.649844: intel_pstate_set_pstate <-intel_pstate_timer_func
|
|
||||||
gnome-shell-3409 [001] ..s. 2537.650850: intel_pstate_set_pstate <-intel_pstate_timer_func
|
|
||||||
<idle>-0 [000] ..s. 2537.654843: intel_pstate_set_pstate <-intel_pstate_timer_func
|
|
@@ -22,7 +22,8 @@ Required properties :
|
|||||||
- #clock-cells : must contain 1
|
- #clock-cells : must contain 1
|
||||||
- #reset-cells : must contain 1
|
- #reset-cells : must contain 1
|
||||||
|
|
||||||
For the PRCM CCUs on H3/A64, one more clock is needed:
|
For the PRCM CCUs on H3/A64, two more clocks are needed:
|
||||||
|
- "pll-periph": the SoC's peripheral PLL from the main CCU
|
||||||
- "iosc": the SoC's internal frequency oscillator
|
- "iosc": the SoC's internal frequency oscillator
|
||||||
|
|
||||||
Example for generic CCU:
|
Example for generic CCU:
|
||||||
@@ -39,8 +40,8 @@ Example for PRCM CCU:
|
|||||||
r_ccu: clock@01f01400 {
|
r_ccu: clock@01f01400 {
|
||||||
compatible = "allwinner,sun50i-a64-r-ccu";
|
compatible = "allwinner,sun50i-a64-r-ccu";
|
||||||
reg = <0x01f01400 0x100>;
|
reg = <0x01f01400 0x100>;
|
||||||
clocks = <&osc24M>, <&osc32k>, <&iosc>;
|
clocks = <&osc24M>, <&osc32k>, <&iosc>, <&ccu CLK_PLL_PERIPH0>;
|
||||||
clock-names = "hosc", "losc", "iosc";
|
clock-names = "hosc", "losc", "iosc", "pll-periph";
|
||||||
#clock-cells = <1>;
|
#clock-cells = <1>;
|
||||||
#reset-cells = <1>;
|
#reset-cells = <1>;
|
||||||
};
|
};
|
||||||
|
@@ -78,6 +78,7 @@ graph bindings specified in Documentation/devicetree/bindings/graph.txt.
|
|||||||
remote endpoint phandle should be a reference to a valid mipi_dsi_host device
|
remote endpoint phandle should be a reference to a valid mipi_dsi_host device
|
||||||
node.
|
node.
|
||||||
- Video port 1 for the HDMI output
|
- Video port 1 for the HDMI output
|
||||||
|
- Audio port 2 for the HDMI audio input
|
||||||
|
|
||||||
|
|
||||||
Example
|
Example
|
||||||
@@ -112,5 +113,12 @@ Example
|
|||||||
remote-endpoint = <&hdmi_connector_in>;
|
remote-endpoint = <&hdmi_connector_in>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
port@2 {
|
||||||
|
reg = <2>;
|
||||||
|
codec_endpoint: endpoint {
|
||||||
|
remote-endpoint = <&i2s0_cpu_endpoint>;
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@@ -25,7 +25,8 @@ Required properties:
|
|||||||
- clock-names: Shall contain "iahb" and "isfr" as defined in dw_hdmi.txt.
|
- clock-names: Shall contain "iahb" and "isfr" as defined in dw_hdmi.txt.
|
||||||
- ports: See dw_hdmi.txt. The DWC HDMI shall have one port numbered 0
|
- ports: See dw_hdmi.txt. The DWC HDMI shall have one port numbered 0
|
||||||
corresponding to the video input of the controller and one port numbered 1
|
corresponding to the video input of the controller and one port numbered 1
|
||||||
corresponding to its HDMI output. Each port shall have a single endpoint.
|
corresponding to its HDMI output, and one port numbered 2 corresponding to
|
||||||
|
sound input of the controller. Each port shall have a single endpoint.
|
||||||
|
|
||||||
Optional properties:
|
Optional properties:
|
||||||
|
|
||||||
@@ -59,6 +60,12 @@ Example:
|
|||||||
remote-endpoint = <&hdmi0_con>;
|
remote-endpoint = <&hdmi0_con>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
port@2 {
|
||||||
|
reg = <2>;
|
||||||
|
rcar_dw_hdmi0_sound_in: endpoint {
|
||||||
|
remote-endpoint = <&hdmi_sound_out>;
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -41,9 +41,9 @@ Required properties:
|
|||||||
Optional properties:
|
Optional properties:
|
||||||
|
|
||||||
In order to use the GPIO lines in PWM mode, some additional optional
|
In order to use the GPIO lines in PWM mode, some additional optional
|
||||||
properties are required. Only Armada 370 and XP support these properties.
|
properties are required.
|
||||||
|
|
||||||
- compatible: Must contain "marvell,armada-370-xp-gpio"
|
- compatible: Must contain "marvell,armada-370-gpio"
|
||||||
|
|
||||||
- reg: an additional register set is needed, for the GPIO Blink
|
- reg: an additional register set is needed, for the GPIO Blink
|
||||||
Counter on/off registers.
|
Counter on/off registers.
|
||||||
@@ -71,7 +71,7 @@ Example:
|
|||||||
};
|
};
|
||||||
|
|
||||||
gpio1: gpio@18140 {
|
gpio1: gpio@18140 {
|
||||||
compatible = "marvell,armada-370-xp-gpio";
|
compatible = "marvell,armada-370-gpio";
|
||||||
reg = <0x18140 0x40>, <0x181c8 0x08>;
|
reg = <0x18140 0x40>, <0x181c8 0x08>;
|
||||||
reg-names = "gpio", "pwm";
|
reg-names = "gpio", "pwm";
|
||||||
ngpios = <17>;
|
ngpios = <17>;
|
||||||
|
@@ -36,7 +36,7 @@ Optional properties:
|
|||||||
control gpios
|
control gpios
|
||||||
|
|
||||||
- threshold: allows setting the "click"-threshold in the range
|
- threshold: allows setting the "click"-threshold in the range
|
||||||
from 20 to 80.
|
from 0 to 80.
|
||||||
|
|
||||||
- gain: allows setting the sensitivity in the range from 0 to
|
- gain: allows setting the sensitivity in the range from 0 to
|
||||||
31. Note that lower values indicate higher
|
31. Note that lower values indicate higher
|
||||||
|
@@ -16,6 +16,11 @@ Required properties:
|
|||||||
- reg: Base address of PMIC on Hi6220 SoC.
|
- reg: Base address of PMIC on Hi6220 SoC.
|
||||||
- interrupt-controller: Hi655x has internal IRQs (has own IRQ domain).
|
- interrupt-controller: Hi655x has internal IRQs (has own IRQ domain).
|
||||||
- pmic-gpios: The GPIO used by PMIC IRQ.
|
- pmic-gpios: The GPIO used by PMIC IRQ.
|
||||||
|
- #clock-cells: From common clock binding; shall be set to 0
|
||||||
|
|
||||||
|
Optional properties:
|
||||||
|
- clock-output-names: From common clock binding to override the
|
||||||
|
default output clock name
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
pmic: pmic@f8000000 {
|
pmic: pmic@f8000000 {
|
||||||
@@ -24,4 +29,5 @@ Example:
|
|||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <2>;
|
#interrupt-cells = <2>;
|
||||||
pmic-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
|
pmic-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
|
||||||
|
#clock-cells = <0>;
|
||||||
}
|
}
|
||||||
|
@@ -31,7 +31,7 @@ Example:
|
|||||||
compatible = "st,stm32-timers";
|
compatible = "st,stm32-timers";
|
||||||
reg = <0x40010000 0x400>;
|
reg = <0x40010000 0x400>;
|
||||||
clocks = <&rcc 0 160>;
|
clocks = <&rcc 0 160>;
|
||||||
clock-names = "clk_int";
|
clock-names = "int";
|
||||||
|
|
||||||
pwm {
|
pwm {
|
||||||
compatible = "st,stm32-pwm";
|
compatible = "st,stm32-pwm";
|
||||||
|
@@ -18,6 +18,8 @@ Optional properties:
|
|||||||
"ext_clock" (External clock provided to the card).
|
"ext_clock" (External clock provided to the card).
|
||||||
- post-power-on-delay-ms : Delay in ms after powering the card and
|
- post-power-on-delay-ms : Delay in ms after powering the card and
|
||||||
de-asserting the reset-gpios (if any)
|
de-asserting the reset-gpios (if any)
|
||||||
|
- power-off-delay-us : Delay in us after asserting the reset-gpios (if any)
|
||||||
|
during power off of the card.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
|
@@ -34,7 +34,7 @@ Required properties:
|
|||||||
"brcm,bcm6328-switch"
|
"brcm,bcm6328-switch"
|
||||||
"brcm,bcm6368-switch" and the mandatory "brcm,bcm63xx-switch"
|
"brcm,bcm6368-switch" and the mandatory "brcm,bcm63xx-switch"
|
||||||
|
|
||||||
See Documentation/devicetree/bindings/dsa/dsa.txt for a list of additional
|
See Documentation/devicetree/bindings/net/dsa/dsa.txt for a list of additional
|
||||||
required and optional properties.
|
required and optional properties.
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
|
@@ -26,6 +26,10 @@ Optional properties:
|
|||||||
- interrupt-controller : Indicates the switch is itself an interrupt
|
- interrupt-controller : Indicates the switch is itself an interrupt
|
||||||
controller. This is used for the PHY interrupts.
|
controller. This is used for the PHY interrupts.
|
||||||
#interrupt-cells = <2> : Controller uses two cells, number and flag
|
#interrupt-cells = <2> : Controller uses two cells, number and flag
|
||||||
|
- eeprom-length : Set to the length of an EEPROM connected to the
|
||||||
|
switch. Must be set if the switch can not detect
|
||||||
|
the presence and/or size of a connected EEPROM,
|
||||||
|
otherwise optional.
|
||||||
- mdio : Container of PHY and devices on the switches MDIO
|
- mdio : Container of PHY and devices on the switches MDIO
|
||||||
bus.
|
bus.
|
||||||
- mdio? : Container of PHYs and devices on the external MDIO
|
- mdio? : Container of PHYs and devices on the external MDIO
|
||||||
|
@@ -15,6 +15,10 @@ Optional properties:
|
|||||||
- phy-reset-active-high : If present then the reset sequence using the GPIO
|
- phy-reset-active-high : If present then the reset sequence using the GPIO
|
||||||
specified in the "phy-reset-gpios" property is reversed (H=reset state,
|
specified in the "phy-reset-gpios" property is reversed (H=reset state,
|
||||||
L=operation state).
|
L=operation state).
|
||||||
|
- phy-reset-post-delay : Post reset delay in milliseconds. If present then
|
||||||
|
a delay of phy-reset-post-delay milliseconds will be observed after the
|
||||||
|
phy-reset-gpios has been toggled. Can be omitted thus no delay is
|
||||||
|
observed. Delay is in range of 1ms to 1000ms. Other delays are invalid.
|
||||||
- phy-supply : regulator that powers the Ethernet PHY.
|
- phy-supply : regulator that powers the Ethernet PHY.
|
||||||
- phy-handle : phandle to the PHY device connected to this device.
|
- phy-handle : phandle to the PHY device connected to this device.
|
||||||
- fixed-link : Assume a fixed link. See fixed-link.txt in the same directory.
|
- fixed-link : Assume a fixed link. See fixed-link.txt in the same directory.
|
||||||
|
@@ -27,6 +27,7 @@ Optional properties:
|
|||||||
of the device. On many systems this is wired high so the device goes
|
of the device. On many systems this is wired high so the device goes
|
||||||
out of reset at power-on, but if it is under program control, this
|
out of reset at power-on, but if it is under program control, this
|
||||||
optional GPIO can wake up in response to it.
|
optional GPIO can wake up in response to it.
|
||||||
|
- vdd33a-supply, vddvario-supply : 3.3V analog and IO logic power supplies
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
|
|
||||||
|
@@ -247,7 +247,6 @@ bias-bus-hold - latch weakly
|
|||||||
bias-pull-up - pull up the pin
|
bias-pull-up - pull up the pin
|
||||||
bias-pull-down - pull down the pin
|
bias-pull-down - pull down the pin
|
||||||
bias-pull-pin-default - use pin-default pull state
|
bias-pull-pin-default - use pin-default pull state
|
||||||
bi-directional - pin supports simultaneous input/output operations
|
|
||||||
drive-push-pull - drive actively high and low
|
drive-push-pull - drive actively high and low
|
||||||
drive-open-drain - drive with open drain
|
drive-open-drain - drive with open drain
|
||||||
drive-open-source - drive with open source
|
drive-open-source - drive with open source
|
||||||
@@ -260,7 +259,6 @@ input-debounce - debounce mode with debound time X
|
|||||||
power-source - select between different power supplies
|
power-source - select between different power supplies
|
||||||
low-power-enable - enable low power mode
|
low-power-enable - enable low power mode
|
||||||
low-power-disable - disable low power mode
|
low-power-disable - disable low power mode
|
||||||
output-enable - enable output on pin regardless of output value
|
|
||||||
output-low - set the pin to output mode with low level
|
output-low - set the pin to output mode with low level
|
||||||
output-high - set the pin to output mode with high level
|
output-high - set the pin to output mode with high level
|
||||||
slew-rate - set the slew rate
|
slew-rate - set the slew rate
|
||||||
|
129
Documentation/devicetree/bindings/sound/audio-graph-card.txt
Normal file
129
Documentation/devicetree/bindings/sound/audio-graph-card.txt
Normal file
@@ -0,0 +1,129 @@
|
|||||||
|
Audio Graph Card:
|
||||||
|
|
||||||
|
Audio Graph Card specifies audio DAI connections of SoC <-> codec.
|
||||||
|
It is based on common bindings for device graphs.
|
||||||
|
see ${LINUX}/Documentation/devicetree/bindings/graph.txt
|
||||||
|
|
||||||
|
Basically, Audio Graph Card property is same as Simple Card.
|
||||||
|
see ${LINUX}/Documentation/devicetree/bindings/sound/simple-card.txt
|
||||||
|
|
||||||
|
Below are same as Simple-Card.
|
||||||
|
|
||||||
|
- label
|
||||||
|
- widgets
|
||||||
|
- routing
|
||||||
|
- dai-format
|
||||||
|
- frame-master
|
||||||
|
- bitclock-master
|
||||||
|
- bitclock-inversion
|
||||||
|
- frame-inversion
|
||||||
|
- dai-tdm-slot-num
|
||||||
|
- dai-tdm-slot-width
|
||||||
|
- clocks / system-clock-frequency
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
|
||||||
|
- compatible : "audio-graph-card";
|
||||||
|
- dais : list of CPU DAI port{s}
|
||||||
|
|
||||||
|
Optional properties:
|
||||||
|
- pa-gpios: GPIO used to control external amplifier.
|
||||||
|
|
||||||
|
Example: Single DAI case
|
||||||
|
|
||||||
|
sound_card {
|
||||||
|
compatible = "audio-graph-card";
|
||||||
|
|
||||||
|
dais = <&cpu_port>;
|
||||||
|
};
|
||||||
|
|
||||||
|
dai-controller {
|
||||||
|
...
|
||||||
|
cpu_port: port {
|
||||||
|
cpu_endpoint: endpoint {
|
||||||
|
remote-endpoint = <&codec_endpoint>;
|
||||||
|
|
||||||
|
dai-format = "left_j";
|
||||||
|
...
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
audio-codec {
|
||||||
|
...
|
||||||
|
port {
|
||||||
|
codec_endpoint: endpoint {
|
||||||
|
remote-endpoint = <&cpu_endpoint>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
Example: Multi DAI case
|
||||||
|
|
||||||
|
sound-card {
|
||||||
|
compatible = "audio-graph-card";
|
||||||
|
|
||||||
|
label = "sound-card";
|
||||||
|
|
||||||
|
dais = <&cpu_port0
|
||||||
|
&cpu_port1
|
||||||
|
&cpu_port2>;
|
||||||
|
};
|
||||||
|
|
||||||
|
audio-codec@0 {
|
||||||
|
...
|
||||||
|
port {
|
||||||
|
codec0_endpoint: endpoint {
|
||||||
|
remote-endpoint = <&cpu_endpoint0>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
audio-codec@1 {
|
||||||
|
...
|
||||||
|
port {
|
||||||
|
codec1_endpoint: endpoint {
|
||||||
|
remote-endpoint = <&cpu_endpoint1>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
audio-codec@2 {
|
||||||
|
...
|
||||||
|
port {
|
||||||
|
codec2_endpoint: endpoint {
|
||||||
|
remote-endpoint = <&cpu_endpoint2>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
dai-controller {
|
||||||
|
...
|
||||||
|
ports {
|
||||||
|
cpu_port0: port@0 {
|
||||||
|
cpu_endpoint0: endpoint {
|
||||||
|
remote-endpoint = <&codec0_endpoint>;
|
||||||
|
|
||||||
|
dai-format = "left_j";
|
||||||
|
...
|
||||||
|
};
|
||||||
|
};
|
||||||
|
cpu_port1: port@1 {
|
||||||
|
cpu_endpoint1: endpoint {
|
||||||
|
remote-endpoint = <&codec1_endpoint>;
|
||||||
|
|
||||||
|
dai-format = "i2s";
|
||||||
|
...
|
||||||
|
};
|
||||||
|
};
|
||||||
|
cpu_port2: port@2 {
|
||||||
|
cpu_endpoint2: endpoint {
|
||||||
|
remote-endpoint = <&codec2_endpoint>;
|
||||||
|
|
||||||
|
dai-format = "i2s";
|
||||||
|
...
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
122
Documentation/devicetree/bindings/sound/audio-graph-scu-card.txt
Normal file
122
Documentation/devicetree/bindings/sound/audio-graph-scu-card.txt
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
Audio-Graph-SCU-Card:
|
||||||
|
|
||||||
|
Audio-Graph-SCU-Card is "Audio-Graph-Card" + "ALSA DPCM".
|
||||||
|
|
||||||
|
It is based on common bindings for device graphs.
|
||||||
|
see ${LINUX}/Documentation/devicetree/bindings/graph.txt
|
||||||
|
|
||||||
|
Basically, Audio-Graph-SCU-Card property is same as
|
||||||
|
Simple-Card / Simple-SCU-Card / Audio-Graph-Card.
|
||||||
|
see ${LINUX}/Documentation/devicetree/bindings/sound/simple-card.txt
|
||||||
|
${LINUX}/Documentation/devicetree/bindings/sound/simple-scu-card.txt
|
||||||
|
${LINUX}/Documentation/devicetree/bindings/sound/audio-graph-card.txt
|
||||||
|
|
||||||
|
Below are same as Simple-Card / Audio-Graph-Card.
|
||||||
|
|
||||||
|
- label
|
||||||
|
- dai-format
|
||||||
|
- frame-master
|
||||||
|
- bitclock-master
|
||||||
|
- bitclock-inversion
|
||||||
|
- frame-inversion
|
||||||
|
- dai-tdm-slot-num
|
||||||
|
- dai-tdm-slot-width
|
||||||
|
- clocks / system-clock-frequency
|
||||||
|
|
||||||
|
Below are same as Simple-SCU-Card.
|
||||||
|
|
||||||
|
- convert-rate
|
||||||
|
- convert-channels
|
||||||
|
- prefix
|
||||||
|
- routing
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
|
||||||
|
- compatible : "audio-graph-scu-card";
|
||||||
|
- dais : list of CPU DAI port{s}
|
||||||
|
|
||||||
|
Example 1. Sampling Rate Conversion
|
||||||
|
|
||||||
|
sound_card {
|
||||||
|
compatible = "audio-graph-scu-card";
|
||||||
|
|
||||||
|
label = "sound-card";
|
||||||
|
prefix = "codec";
|
||||||
|
routing = "codec Playback", "DAI0 Playback",
|
||||||
|
"codec Playback", "DAI1 Playback";
|
||||||
|
convert-rate = <48000>;
|
||||||
|
|
||||||
|
dais = <&cpu_port>;
|
||||||
|
};
|
||||||
|
|
||||||
|
audio-codec {
|
||||||
|
...
|
||||||
|
|
||||||
|
port {
|
||||||
|
codec_endpoint: endpoint {
|
||||||
|
remote-endpoint = <&cpu_endpoint>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
dai-controller {
|
||||||
|
...
|
||||||
|
cpu_port: port {
|
||||||
|
cpu_endpoint: endpoint {
|
||||||
|
remote-endpoint = <&codec_endpoint>;
|
||||||
|
|
||||||
|
dai-format = "left_j";
|
||||||
|
...
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
Example 2. 2 CPU 1 Codec (Mixing)
|
||||||
|
|
||||||
|
sound_card {
|
||||||
|
compatible = "audio-graph-scu-card";
|
||||||
|
|
||||||
|
label = "sound-card";
|
||||||
|
prefix = "codec";
|
||||||
|
routing = "codec Playback", "DAI0 Playback",
|
||||||
|
"codec Playback", "DAI1 Playback";
|
||||||
|
convert-rate = <48000>;
|
||||||
|
|
||||||
|
dais = <&cpu_port0
|
||||||
|
&cpu_port1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
audio-codec {
|
||||||
|
...
|
||||||
|
|
||||||
|
port {
|
||||||
|
codec_endpoint0: endpoint {
|
||||||
|
remote-endpoint = <&cpu_endpoint0>;
|
||||||
|
};
|
||||||
|
codec_endpoint1: endpoint {
|
||||||
|
remote-endpoint = <&cpu_endpoint1>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
dai-controller {
|
||||||
|
...
|
||||||
|
ports {
|
||||||
|
cpu_port0: port {
|
||||||
|
cpu_endpoint0: endpoint {
|
||||||
|
remote-endpoint = <&codec_endpoint0>;
|
||||||
|
|
||||||
|
dai-format = "left_j";
|
||||||
|
...
|
||||||
|
};
|
||||||
|
};
|
||||||
|
cpu_port1: port {
|
||||||
|
cpu_endpoint1: endpoint {
|
||||||
|
remote-endpoint = <&codec_endpoint1>;
|
||||||
|
|
||||||
|
dai-format = "left_j";
|
||||||
|
...
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
@@ -16,6 +16,9 @@ Required properties:
|
|||||||
(See Documentation/devicetree/bindings/interrupt-controller/interrupts.txt
|
(See Documentation/devicetree/bindings/interrupt-controller/interrupts.txt
|
||||||
for further information relating to interrupt properties)
|
for further information relating to interrupt properties)
|
||||||
|
|
||||||
|
- cirrus,boost-ind-nanohenry: Inductor value for boost converter. The value is
|
||||||
|
in nH and they can be values of 1000nH, 1200nH, 1500nH, and 2200nH.
|
||||||
|
|
||||||
Optional properties:
|
Optional properties:
|
||||||
- reset-gpios : gpio used to reset the amplifier
|
- reset-gpios : gpio used to reset the amplifier
|
||||||
|
|
||||||
|
@@ -69,6 +69,8 @@ Optional properties:
|
|||||||
- nuvoton,jack-insert-debounce: number from 0 to 7 that sets debounce time to 2^(n+2) ms
|
- nuvoton,jack-insert-debounce: number from 0 to 7 that sets debounce time to 2^(n+2) ms
|
||||||
- nuvoton,jack-eject-debounce: number from 0 to 7 that sets debounce time to 2^(n+2) ms
|
- nuvoton,jack-eject-debounce: number from 0 to 7 that sets debounce time to 2^(n+2) ms
|
||||||
|
|
||||||
|
- nuvoton,crosstalk-bypass: make crosstalk function bypass if set.
|
||||||
|
|
||||||
- clocks: list of phandle and clock specifier pairs according to common clock bindings for the
|
- clocks: list of phandle and clock specifier pairs according to common clock bindings for the
|
||||||
clocks described in clock-names
|
clocks described in clock-names
|
||||||
- clock-names: should include "mclk" for the MCLK master clock
|
- clock-names: should include "mclk" for the MCLK master clock
|
||||||
@@ -96,6 +98,7 @@ Example:
|
|||||||
nuvoton,short-key-debounce = <2>;
|
nuvoton,short-key-debounce = <2>;
|
||||||
nuvoton,jack-insert-debounce = <7>;
|
nuvoton,jack-insert-debounce = <7>;
|
||||||
nuvoton,jack-eject-debounce = <7>;
|
nuvoton,jack-eject-debounce = <7>;
|
||||||
|
nuvoton,crosstalk-bypass;
|
||||||
|
|
||||||
clock-names = "mclk";
|
clock-names = "mclk";
|
||||||
clocks = <&tegra_car TEGRA210_CLK_CLK_OUT_2>;
|
clocks = <&tegra_car TEGRA210_CLK_CLK_OUT_2>;
|
||||||
|
@@ -83,11 +83,11 @@ SRC can convert [xx]Hz to [yy]Hz. Then, it has below 2 modes
|
|||||||
** Asynchronous mode
|
** Asynchronous mode
|
||||||
------------------
|
------------------
|
||||||
|
|
||||||
You need to use "renesas,rsrc-card" sound card for it.
|
You need to use "simple-scu-audio-card" sound card for it.
|
||||||
example)
|
example)
|
||||||
|
|
||||||
sound {
|
sound {
|
||||||
compatible = "renesas,rsrc-card";
|
compatible = "simple-scu-audio-card";
|
||||||
...
|
...
|
||||||
/*
|
/*
|
||||||
* SRC Asynchronous mode setting
|
* SRC Asynchronous mode setting
|
||||||
@@ -97,12 +97,12 @@ example)
|
|||||||
* Inputed 48kHz data will be converted to
|
* Inputed 48kHz data will be converted to
|
||||||
* system specified Hz
|
* system specified Hz
|
||||||
*/
|
*/
|
||||||
convert-rate = <48000>;
|
simple-audio-card,convert-rate = <48000>;
|
||||||
...
|
...
|
||||||
cpu {
|
simple-audio-card,cpu {
|
||||||
sound-dai = <&rcar_sound>;
|
sound-dai = <&rcar_sound>;
|
||||||
};
|
};
|
||||||
codec {
|
simple-audio-card,codec {
|
||||||
...
|
...
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@@ -141,23 +141,23 @@ For more detail information, see below
|
|||||||
${LINUX}/sound/soc/sh/rcar/ctu.c
|
${LINUX}/sound/soc/sh/rcar/ctu.c
|
||||||
- comment of header
|
- comment of header
|
||||||
|
|
||||||
You need to use "renesas,rsrc-card" sound card for it.
|
You need to use "simple-scu-audio-card" sound card for it.
|
||||||
example)
|
example)
|
||||||
|
|
||||||
sound {
|
sound {
|
||||||
compatible = "renesas,rsrc-card";
|
compatible = "simple-scu-audio-card";
|
||||||
...
|
...
|
||||||
/*
|
/*
|
||||||
* CTU setting
|
* CTU setting
|
||||||
* All input data will be converted to 2ch
|
* All input data will be converted to 2ch
|
||||||
* as output data
|
* as output data
|
||||||
*/
|
*/
|
||||||
convert-channels = <2>;
|
simple-audio-card,convert-channels = <2>;
|
||||||
...
|
...
|
||||||
cpu {
|
simple-audio-card,cpu {
|
||||||
sound-dai = <&rcar_sound>;
|
sound-dai = <&rcar_sound>;
|
||||||
};
|
};
|
||||||
codec {
|
simple-audio-card,codec {
|
||||||
...
|
...
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@@ -190,22 +190,22 @@ and these sounds will be merged by MIX.
|
|||||||
aplay -D plughw:0,0 xxxx.wav &
|
aplay -D plughw:0,0 xxxx.wav &
|
||||||
aplay -D plughw:0,1 yyyy.wav
|
aplay -D plughw:0,1 yyyy.wav
|
||||||
|
|
||||||
You need to use "renesas,rsrc-card" sound card for it.
|
You need to use "simple-scu-audio-card" sound card for it.
|
||||||
Ex)
|
Ex)
|
||||||
[MEM] -> [SRC1] -> [CTU02] -+-> [MIX0] -> [DVC0] -> [SSI0]
|
[MEM] -> [SRC1] -> [CTU02] -+-> [MIX0] -> [DVC0] -> [SSI0]
|
||||||
|
|
|
|
||||||
[MEM] -> [SRC2] -> [CTU03] -+
|
[MEM] -> [SRC2] -> [CTU03] -+
|
||||||
|
|
||||||
sound {
|
sound {
|
||||||
compatible = "renesas,rsrc-card";
|
compatible = "simple-scu-audio-card";
|
||||||
...
|
...
|
||||||
cpu@0 {
|
simple-audio-card,cpu@0 {
|
||||||
sound-dai = <&rcar_sound 0>;
|
sound-dai = <&rcar_sound 0>;
|
||||||
};
|
};
|
||||||
cpu@1 {
|
simple-audio-card,cpu@1 {
|
||||||
sound-dai = <&rcar_sound 1>;
|
sound-dai = <&rcar_sound 1>;
|
||||||
};
|
};
|
||||||
codec {
|
simple-audio-card,codec {
|
||||||
...
|
...
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@@ -368,6 +368,10 @@ Required properties:
|
|||||||
see below for detail.
|
see below for detail.
|
||||||
- #sound-dai-cells : it must be 0 if your system is using single DAI
|
- #sound-dai-cells : it must be 0 if your system is using single DAI
|
||||||
it must be 1 if your system is using multi DAI
|
it must be 1 if your system is using multi DAI
|
||||||
|
- clocks : References to SSI/SRC/MIX/CTU/DVC/AUDIO_CLK clocks.
|
||||||
|
- clock-names : List of necessary clock names.
|
||||||
|
"ssi-all", "ssi.X", "src.X", "mix.X", "ctu.X",
|
||||||
|
"dvc.X", "clk_a", "clk_b", "clk_c", "clk_i"
|
||||||
|
|
||||||
Optional properties:
|
Optional properties:
|
||||||
- #clock-cells : it must be 0 if your system has audio_clkout
|
- #clock-cells : it must be 0 if your system has audio_clkout
|
||||||
@@ -375,6 +379,9 @@ Optional properties:
|
|||||||
- clock-frequency : for all audio_clkout0/1/2/3
|
- clock-frequency : for all audio_clkout0/1/2/3
|
||||||
- clkout-lr-asynchronous : boolean property. it indicates that audio_clkoutn
|
- clkout-lr-asynchronous : boolean property. it indicates that audio_clkoutn
|
||||||
is asynchronizes with lr-clock.
|
is asynchronizes with lr-clock.
|
||||||
|
- resets : References to SSI resets.
|
||||||
|
- reset-names : List of valid reset names.
|
||||||
|
"ssi-all", "ssi.X"
|
||||||
|
|
||||||
SSI subnode properties:
|
SSI subnode properties:
|
||||||
- interrupts : Should contain SSI interrupt for PIO transfer
|
- interrupts : Should contain SSI interrupt for PIO transfer
|
||||||
|
39
Documentation/devicetree/bindings/sound/rockchip,pdm.txt
Normal file
39
Documentation/devicetree/bindings/sound/rockchip,pdm.txt
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
* Rockchip PDM controller
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
|
||||||
|
- compatible: "rockchip,pdm"
|
||||||
|
- reg: physical base address of the controller and length of memory mapped
|
||||||
|
region.
|
||||||
|
- dmas: DMA specifiers for rx dma. See the DMA client binding,
|
||||||
|
Documentation/devicetree/bindings/dma/dma.txt
|
||||||
|
- dma-names: should include "rx".
|
||||||
|
- clocks: a list of phandle + clock-specifer pairs, one for each entry in clock-names.
|
||||||
|
- clock-names: should contain following:
|
||||||
|
- "pdm_hclk": clock for PDM BUS
|
||||||
|
- "pdm_clk" : clock for PDM controller
|
||||||
|
- pinctrl-names: Must contain a "default" entry.
|
||||||
|
- pinctrl-N: One property must exist for each entry in
|
||||||
|
pinctrl-names. See ../pinctrl/pinctrl-bindings.txt
|
||||||
|
for details of the property values.
|
||||||
|
|
||||||
|
Example for rk3328 PDM controller:
|
||||||
|
|
||||||
|
pdm: pdm@ff040000 {
|
||||||
|
compatible = "rockchip,pdm";
|
||||||
|
reg = <0x0 0xff040000 0x0 0x1000>;
|
||||||
|
clocks = <&clk_pdm>, <&clk_gates28 0>;
|
||||||
|
clock-names = "pdm_clk", "pdm_hclk";
|
||||||
|
dmas = <&pdma 16>;
|
||||||
|
#dma-cells = <1>;
|
||||||
|
dma-names = "rx";
|
||||||
|
pinctrl-names = "default", "sleep";
|
||||||
|
pinctrl-0 = <&pdmm0_clk
|
||||||
|
&pdmm0_fsync
|
||||||
|
&pdmm0_sdi0
|
||||||
|
&pdmm0_sdi1
|
||||||
|
&pdmm0_sdi2
|
||||||
|
&pdmm0_sdi3>;
|
||||||
|
pinctrl-1 = <&pdmm0_sleep>;
|
||||||
|
status = "disabled";
|
||||||
|
};
|
@@ -9,7 +9,9 @@ Required properties:
|
|||||||
- compatible: should be one of the following:
|
- compatible: should be one of the following:
|
||||||
- "rockchip,rk3066-spdif"
|
- "rockchip,rk3066-spdif"
|
||||||
- "rockchip,rk3188-spdif"
|
- "rockchip,rk3188-spdif"
|
||||||
|
- "rockchip,rk3228-spdif"
|
||||||
- "rockchip,rk3288-spdif"
|
- "rockchip,rk3288-spdif"
|
||||||
|
- "rockchip,rk3328-spdif"
|
||||||
- "rockchip,rk3366-spdif"
|
- "rockchip,rk3366-spdif"
|
||||||
- "rockchip,rk3368-spdif"
|
- "rockchip,rk3368-spdif"
|
||||||
- "rockchip,rk3399-spdif"
|
- "rockchip,rk3399-spdif"
|
||||||
|
@@ -5,11 +5,6 @@ Required properties:
|
|||||||
- compatible - "samsung,odroidxu3-audio" - for Odroid XU3 board,
|
- compatible - "samsung,odroidxu3-audio" - for Odroid XU3 board,
|
||||||
"samsung,odroidxu4-audio" - for Odroid XU4 board
|
"samsung,odroidxu4-audio" - for Odroid XU4 board
|
||||||
- model - the user-visible name of this sound complex
|
- model - the user-visible name of this sound complex
|
||||||
- 'cpu' subnode with a 'sound-dai' property containing the phandle of the I2S
|
|
||||||
controller
|
|
||||||
- 'codec' subnode with a 'sound-dai' property containing list of phandles
|
|
||||||
to the CODEC nodes, first entry must be corresponding to the MAX98090
|
|
||||||
CODEC and the second entry must be the phandle of the HDMI IP block node
|
|
||||||
- clocks - should contain entries matching clock names in the clock-names
|
- clocks - should contain entries matching clock names in the clock-names
|
||||||
property
|
property
|
||||||
- clock-names - should contain following entries:
|
- clock-names - should contain following entries:
|
||||||
@@ -32,12 +27,18 @@ Required properties:
|
|||||||
For Odroid XU4:
|
For Odroid XU4:
|
||||||
no entries
|
no entries
|
||||||
|
|
||||||
|
Required sub-nodes:
|
||||||
|
|
||||||
|
- 'cpu' subnode with a 'sound-dai' property containing the phandle of the I2S
|
||||||
|
controller
|
||||||
|
- 'codec' subnode with a 'sound-dai' property containing list of phandles
|
||||||
|
to the CODEC nodes, first entry must be corresponding to the MAX98090
|
||||||
|
CODEC and the second entry must be the phandle of the HDMI IP block node
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
|
|
||||||
sound {
|
sound {
|
||||||
compatible = "samsung,odroidxu3-audio";
|
compatible = "samsung,odroidxu3-audio";
|
||||||
samsung,cpu-dai = <&i2s0>;
|
|
||||||
samsung,codec-dai = <&max98090>;
|
|
||||||
model = "Odroid-XU3";
|
model = "Odroid-XU3";
|
||||||
samsung,audio-routing =
|
samsung,audio-routing =
|
||||||
"Headphone Jack", "HPL",
|
"Headphone Jack", "HPL",
|
||||||
|
@@ -1,35 +1,29 @@
|
|||||||
ASoC simple SCU Sound Card
|
ASoC Simple SCU Sound Card
|
||||||
|
|
||||||
Simple-Card specifies audio DAI connections of SoC <-> codec.
|
Simple SCU Sound Card is "Simple Sound Card" + "ALSA DPCM".
|
||||||
|
For example, you can use this driver if you want to exchange sampling rate convert,
|
||||||
|
Mixing, etc...
|
||||||
|
|
||||||
Required properties:
|
Required properties:
|
||||||
|
|
||||||
- compatible : "simple-scu-audio-card"
|
- compatible : "simple-scu-audio-card"
|
||||||
"renesas,rsrc-card"
|
"renesas,rsrc-card"
|
||||||
|
|
||||||
Optional properties:
|
Optional properties:
|
||||||
|
|
||||||
- simple-audio-card,name : User specified audio sound card name, one string
|
- simple-audio-card,name : see simple-audio-card.txt
|
||||||
property.
|
- simple-audio-card,cpu : see simple-audio-card.txt
|
||||||
- simple-audio-card,cpu : CPU sub-node
|
- simple-audio-card,codec : see simple-audio-card.txt
|
||||||
- simple-audio-card,codec : CODEC sub-node
|
|
||||||
|
|
||||||
Optional subnode properties:
|
Optional subnode properties:
|
||||||
|
|
||||||
- simple-audio-card,format : CPU/CODEC common audio format.
|
- simple-audio-card,format : see simple-audio-card.txt
|
||||||
"i2s", "right_j", "left_j" , "dsp_a"
|
- simple-audio-card,frame-master : see simple-audio-card.txt
|
||||||
"dsp_b", "ac97", "pdm", "msb", "lsb"
|
- simple-audio-card,bitclock-master : see simple-audio-card.txt
|
||||||
- simple-audio-card,frame-master : Indicates dai-link frame master.
|
- simple-audio-card,bitclock-inversion : see simple-audio-card.txt
|
||||||
phandle to a cpu or codec subnode.
|
- simple-audio-card,frame-inversion : see simple-audio-card.txt
|
||||||
- simple-audio-card,bitclock-master : Indicates dai-link bit clock master.
|
|
||||||
phandle to a cpu or codec subnode.
|
|
||||||
- simple-audio-card,bitclock-inversion : bool property. Add this if the
|
|
||||||
dai-link uses bit clock inversion.
|
|
||||||
- simple-audio-card,frame-inversion : bool property. Add this if the
|
|
||||||
dai-link uses frame clock inversion.
|
|
||||||
- simple-audio-card,convert-rate : platform specified sampling rate convert
|
- simple-audio-card,convert-rate : platform specified sampling rate convert
|
||||||
- simple-audio-card,convert-channels : platform specified converted channel size (2 - 8 ch)
|
- simple-audio-card,convert-channels : platform specified converted channel size (2 - 8 ch)
|
||||||
- simple-audio-card,prefix : see audio-routing
|
- simple-audio-card,prefix : see routing
|
||||||
- simple-audio-card,routing : A list of the connections between audio components.
|
- simple-audio-card,routing : A list of the connections between audio components.
|
||||||
Each entry is a pair of strings, the first being the connection's sink,
|
Each entry is a pair of strings, the first being the connection's sink,
|
||||||
the second being the connection's source. Valid names for sources.
|
the second being the connection's source. Valid names for sources.
|
||||||
@@ -38,32 +32,23 @@ Optional subnode properties:
|
|||||||
|
|
||||||
Required CPU/CODEC subnodes properties:
|
Required CPU/CODEC subnodes properties:
|
||||||
|
|
||||||
- sound-dai : phandle and port of CPU/CODEC
|
- sound-dai : see simple-audio-card.txt
|
||||||
|
|
||||||
Optional CPU/CODEC subnodes properties:
|
Optional CPU/CODEC subnodes properties:
|
||||||
|
|
||||||
- clocks / system-clock-frequency : specify subnode's clock if needed.
|
- clocks / system-clock-frequency : see simple-audio-card.txt
|
||||||
it can be specified via "clocks" if system has
|
|
||||||
clock node (= common clock), or "system-clock-frequency"
|
|
||||||
(if system doens't support common clock)
|
|
||||||
If a clock is specified, it is
|
|
||||||
enabled with clk_prepare_enable()
|
|
||||||
in dai startup() and disabled with
|
|
||||||
clk_disable_unprepare() in dai
|
|
||||||
shutdown().
|
|
||||||
|
|
||||||
Example 1. Sampling Rate Covert
|
Example 1. Sampling Rate Conversion
|
||||||
|
|
||||||
sound {
|
sound {
|
||||||
compatible = "simple-scu-audio-card";
|
compatible = "simple-scu-audio-card";
|
||||||
|
|
||||||
simple-audio-card,name = "rsnd-ak4643";
|
simple-audio-card,name = "rsnd-ak4643";
|
||||||
simple-audio-card,format = "left_j";
|
simple-audio-card,format = "left_j";
|
||||||
simple-audio-card,format = "left_j";
|
|
||||||
simple-audio-card,bitclock-master = <&sndcodec>;
|
simple-audio-card,bitclock-master = <&sndcodec>;
|
||||||
simple-audio-card,frame-master = <&sndcodec>;
|
simple-audio-card,frame-master = <&sndcodec>;
|
||||||
|
|
||||||
simple-audio-card,convert-rate = <48000>; /* see audio_clk_a */
|
simple-audio-card,convert-rate = <48000>;
|
||||||
|
|
||||||
simple-audio-card,prefix = "ak4642";
|
simple-audio-card,prefix = "ak4642";
|
||||||
simple-audio-card,routing = "ak4642 Playback", "DAI0 Playback",
|
simple-audio-card,routing = "ak4642 Playback", "DAI0 Playback",
|
||||||
@@ -79,20 +64,18 @@ sound {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
Example 2. 2 CPU 1 Codec
|
Example 2. 2 CPU 1 Codec (Mixing)
|
||||||
|
|
||||||
sound {
|
sound {
|
||||||
compatible = "renesas,rsrc-card";
|
compatible = "simple-scu-audio-card";
|
||||||
|
|
||||||
card-name = "rsnd-ak4643";
|
simple-audio-card,name = "rsnd-ak4643";
|
||||||
format = "left_j";
|
simple-audio-card,format = "left_j";
|
||||||
bitclock-master = <&dpcmcpu>;
|
simple-audio-card,bitclock-master = <&dpcmcpu>;
|
||||||
frame-master = <&dpcmcpu>;
|
simple-audio-card,frame-master = <&dpcmcpu>;
|
||||||
|
|
||||||
convert-rate = <48000>; /* see audio_clk_a */
|
simple-audio-card,prefix = "ak4642";
|
||||||
|
simple-audio-card,routing = "ak4642 Playback", "DAI0 Playback",
|
||||||
audio-prefix = "ak4642";
|
|
||||||
audio-routing = "ak4642 Playback", "DAI0 Playback",
|
|
||||||
"ak4642 Playback", "DAI1 Playback";
|
"ak4642 Playback", "DAI1 Playback";
|
||||||
|
|
||||||
dpcmcpu: cpu@0 {
|
dpcmcpu: cpu@0 {
|
||||||
|
62
Documentation/devicetree/bindings/sound/st,stm32-i2s.txt
Normal file
62
Documentation/devicetree/bindings/sound/st,stm32-i2s.txt
Normal file
@@ -0,0 +1,62 @@
|
|||||||
|
STMicroelectronics STM32 SPI/I2S Controller
|
||||||
|
|
||||||
|
The SPI/I2S block supports I2S/PCM protocols when configured on I2S mode.
|
||||||
|
Only some SPI instances support I2S.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
- compatible: Must be "st,stm32h7-i2s"
|
||||||
|
- reg: Offset and length of the device's register set.
|
||||||
|
- interrupts: Must contain the interrupt line id.
|
||||||
|
- clocks: Must contain phandle and clock specifier pairs for each entry
|
||||||
|
in clock-names.
|
||||||
|
- clock-names: Must contain "i2sclk", "pclk", "x8k" and "x11k".
|
||||||
|
"i2sclk": clock which feeds the internal clock generator
|
||||||
|
"pclk": clock which feeds the peripheral bus interface
|
||||||
|
"x8k": I2S parent clock for sampling rates multiple of 8kHz.
|
||||||
|
"x11k": I2S parent clock for sampling rates multiple of 11.025kHz.
|
||||||
|
- dmas: DMA specifiers for tx and rx dma.
|
||||||
|
See Documentation/devicetree/bindings/dma/stm32-dma.txt.
|
||||||
|
- dma-names: Identifier for each DMA request line. Must be "tx" and "rx".
|
||||||
|
- pinctrl-names: should contain only value "default"
|
||||||
|
- pinctrl-0: see Documentation/devicetree/bindings/pinctrl/pinctrl-stm32.txt
|
||||||
|
|
||||||
|
Optional properties:
|
||||||
|
- resets: Reference to a reset controller asserting the reset controller
|
||||||
|
|
||||||
|
The device node should contain one 'port' child node with one child 'endpoint'
|
||||||
|
node, according to the bindings defined in Documentation/devicetree/bindings/
|
||||||
|
graph.txt.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
sound_card {
|
||||||
|
compatible = "audio-graph-card";
|
||||||
|
dais = <&i2s2_port>;
|
||||||
|
};
|
||||||
|
|
||||||
|
i2s2: audio-controller@40003800 {
|
||||||
|
compatible = "st,stm32h7-i2s";
|
||||||
|
reg = <0x40003800 0x400>;
|
||||||
|
interrupts = <36>;
|
||||||
|
clocks = <&rcc PCLK1>, <&rcc SPI2_CK>, <&rcc PLL1_Q>, <&rcc PLL2_P>;
|
||||||
|
clock-names = "pclk", "i2sclk", "x8k", "x11k";
|
||||||
|
dmas = <&dmamux2 2 39 0x400 0x1>,
|
||||||
|
<&dmamux2 3 40 0x400 0x1>;
|
||||||
|
dma-names = "rx", "tx";
|
||||||
|
pinctrl-names = "default";
|
||||||
|
pinctrl-0 = <&pinctrl_i2s2>;
|
||||||
|
|
||||||
|
i2s2_port: port@0 {
|
||||||
|
cpu_endpoint: endpoint {
|
||||||
|
remote-endpoint = <&codec_endpoint>;
|
||||||
|
format = "i2s";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
audio-codec {
|
||||||
|
codec_port: port@0 {
|
||||||
|
codec_endpoint: endpoint {
|
||||||
|
remote-endpoint = <&cpu_endpoint>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
@@ -6,7 +6,7 @@ The SAI contains two independent audio sub-blocks. Each sub-block has
|
|||||||
its own clock generator and I/O lines controller.
|
its own clock generator and I/O lines controller.
|
||||||
|
|
||||||
Required properties:
|
Required properties:
|
||||||
- compatible: Should be "st,stm32f4-sai"
|
- compatible: Should be "st,stm32f4-sai" or "st,stm32h7-sai"
|
||||||
- reg: Base address and size of SAI common register set.
|
- reg: Base address and size of SAI common register set.
|
||||||
- clocks: Must contain phandle and clock specifier pairs for each entry
|
- clocks: Must contain phandle and clock specifier pairs for each entry
|
||||||
in clock-names.
|
in clock-names.
|
||||||
@@ -36,6 +36,10 @@ SAI subnodes required properties:
|
|||||||
- pinctrl-names: should contain only value "default"
|
- pinctrl-names: should contain only value "default"
|
||||||
- pinctrl-0: see Documentation/devicetree/bindings/pinctrl/pinctrl-stm32.txt
|
- pinctrl-0: see Documentation/devicetree/bindings/pinctrl/pinctrl-stm32.txt
|
||||||
|
|
||||||
|
The device node should contain one 'port' child node with one child 'endpoint'
|
||||||
|
node, according to the bindings defined in Documentation/devicetree/bindings/
|
||||||
|
graph.txt.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
sound_card {
|
sound_card {
|
||||||
compatible = "audio-graph-card";
|
compatible = "audio-graph-card";
|
||||||
@@ -43,38 +47,29 @@ sound_card {
|
|||||||
};
|
};
|
||||||
|
|
||||||
sai1: sai1@40015800 {
|
sai1: sai1@40015800 {
|
||||||
compatible = "st,stm32f4-sai";
|
compatible = "st,stm32h7-sai";
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
ranges;
|
ranges = <0 0x40015800 0x400>;
|
||||||
reg = <0x40015800 0x4>;
|
reg = <0x40015800 0x4>;
|
||||||
clocks = <&rcc 1 CLK_SAIQ_PDIV>, <&rcc 1 CLK_I2SQ_PDIV>;
|
clocks = <&rcc PLL1_Q>, <&rcc PLL2_P>;
|
||||||
clock-names = "x8k", "x11k";
|
clock-names = "x8k", "x11k";
|
||||||
interrupts = <87>;
|
interrupts = <87>;
|
||||||
|
|
||||||
sai1b: audio-controller@40015824 {
|
sai1a: audio-controller@40015804 {
|
||||||
#sound-dai-cells = <0>;
|
compatible = "st,stm32-sai-sub-a";
|
||||||
compatible = "st,stm32-sai-sub-b";
|
reg = <0x4 0x1C>;
|
||||||
reg = <0x40015824 0x1C>;
|
clocks = <&rcc SAI1_CK>;
|
||||||
clocks = <&rcc 1 CLK_SAI2>;
|
|
||||||
clock-names = "sai_ck";
|
clock-names = "sai_ck";
|
||||||
dmas = <&dma2 5 0 0x400 0x0>;
|
dmas = <&dmamux1 1 87 0x400 0x0>;
|
||||||
dma-names = "tx";
|
dma-names = "tx";
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&pinctrl_sai1b>;
|
pinctrl-0 = <&pinctrl_sai1a>;
|
||||||
|
|
||||||
ports {
|
sai1b_port: port {
|
||||||
#address-cells = <1>;
|
cpu_endpoint: endpoint {
|
||||||
#size-cells = <0>;
|
remote-endpoint = <&codec_endpoint>;
|
||||||
|
format = "i2s";
|
||||||
sai1b_port: port@0 {
|
|
||||||
reg = <0>;
|
|
||||||
cpu_endpoint: endpoint {
|
|
||||||
remote-endpoint = <&codec_endpoint>;
|
|
||||||
audio-graph-card,format = "i2s";
|
|
||||||
audio-graph-card,bitclock-master = <&codec_endpoint>;
|
|
||||||
audio-graph-card,frame-master = <&codec_endpoint>;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
56
Documentation/devicetree/bindings/sound/st,stm32-spdifrx.txt
Normal file
56
Documentation/devicetree/bindings/sound/st,stm32-spdifrx.txt
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
STMicroelectronics STM32 S/PDIF receiver (SPDIFRX).
|
||||||
|
|
||||||
|
The SPDIFRX peripheral, is designed to receive an S/PDIF flow compliant with
|
||||||
|
IEC-60958 and IEC-61937.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
- compatible: should be "st,stm32h7-spdifrx"
|
||||||
|
- reg: cpu DAI IP base address and size
|
||||||
|
- clocks: must contain an entry for kclk (used as S/PDIF signal reference)
|
||||||
|
- clock-names: must contain "kclk"
|
||||||
|
- interrupts: cpu DAI interrupt line
|
||||||
|
- dmas: DMA specifiers for audio data DMA and iec control flow DMA
|
||||||
|
See STM32 DMA bindings, Documentation/devicetree/bindings/dma/stm32-dma.txt
|
||||||
|
- dma-names: two dmas have to be defined, "rx" and "rx-ctrl"
|
||||||
|
|
||||||
|
Optional properties:
|
||||||
|
- resets: Reference to a reset controller asserting the SPDIFRX
|
||||||
|
|
||||||
|
The device node should contain one 'port' child node with one child 'endpoint'
|
||||||
|
node, according to the bindings defined in Documentation/devicetree/bindings/
|
||||||
|
graph.txt.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
spdifrx: spdifrx@40004000 {
|
||||||
|
compatible = "st,stm32h7-spdifrx";
|
||||||
|
reg = <0x40004000 0x400>;
|
||||||
|
clocks = <&rcc SPDIFRX_CK>;
|
||||||
|
clock-names = "kclk";
|
||||||
|
interrupts = <97>;
|
||||||
|
dmas = <&dmamux1 2 93 0x400 0x0>,
|
||||||
|
<&dmamux1 3 94 0x400 0x0>;
|
||||||
|
dma-names = "rx", "rx-ctrl";
|
||||||
|
pinctrl-0 = <&spdifrx_pins>;
|
||||||
|
pinctrl-names = "default";
|
||||||
|
|
||||||
|
spdifrx_port: port {
|
||||||
|
cpu_endpoint: endpoint {
|
||||||
|
remote-endpoint = <&codec_endpoint>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
spdif_in: spdif-in {
|
||||||
|
compatible = "linux,spdif-dir";
|
||||||
|
|
||||||
|
codec_port: port {
|
||||||
|
codec_endpoint: endpoint {
|
||||||
|
remote-endpoint = <&cpu_endpoint>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
soundcard {
|
||||||
|
compatible = "audio-graph-card";
|
||||||
|
dais = <&spdifrx_port>;
|
||||||
|
};
|
@@ -7,6 +7,7 @@ Required properties:
|
|||||||
- "allwinner,sun7i-a20-codec"
|
- "allwinner,sun7i-a20-codec"
|
||||||
- "allwinner,sun8i-a23-codec"
|
- "allwinner,sun8i-a23-codec"
|
||||||
- "allwinner,sun8i-h3-codec"
|
- "allwinner,sun8i-h3-codec"
|
||||||
|
- "allwinner,sun8i-v3s-codec"
|
||||||
- reg: must contain the registers location and length
|
- reg: must contain the registers location and length
|
||||||
- interrupts: must contain the codec interrupt
|
- interrupts: must contain the codec interrupt
|
||||||
- dmas: DMA channels for tx and rx dma. See the DMA client binding,
|
- dmas: DMA channels for tx and rx dma. See the DMA client binding,
|
||||||
@@ -25,6 +26,7 @@ Required properties for the following compatibles:
|
|||||||
- "allwinner,sun6i-a31-codec"
|
- "allwinner,sun6i-a31-codec"
|
||||||
- "allwinner,sun8i-a23-codec"
|
- "allwinner,sun8i-a23-codec"
|
||||||
- "allwinner,sun8i-h3-codec"
|
- "allwinner,sun8i-h3-codec"
|
||||||
|
- "allwinner,sun8i-v3s-codec"
|
||||||
- resets: phandle to the reset control for this device
|
- resets: phandle to the reset control for this device
|
||||||
- allwinner,audio-routing: A list of the connections between audio components.
|
- allwinner,audio-routing: A list of the connections between audio components.
|
||||||
Each entry is a pair of strings, the first being the
|
Each entry is a pair of strings, the first being the
|
||||||
@@ -34,15 +36,15 @@ Required properties for the following compatibles:
|
|||||||
Audio pins on the SoC:
|
Audio pins on the SoC:
|
||||||
"HP"
|
"HP"
|
||||||
"HPCOM"
|
"HPCOM"
|
||||||
"LINEIN"
|
"LINEIN" (not on sun8i-v3s)
|
||||||
"LINEOUT" (not on sun8i-a23)
|
"LINEOUT" (not on sun8i-a23 or sun8i-v3s)
|
||||||
"MIC1"
|
"MIC1"
|
||||||
"MIC2"
|
"MIC2" (not on sun8i-v3s)
|
||||||
"MIC3" (sun6i-a31 only)
|
"MIC3" (sun6i-a31 only)
|
||||||
|
|
||||||
Microphone biases from the SoC:
|
Microphone biases from the SoC:
|
||||||
"HBIAS"
|
"HBIAS"
|
||||||
"MBIAS"
|
"MBIAS" (not on sun8i-v3s)
|
||||||
|
|
||||||
Board connectors:
|
Board connectors:
|
||||||
"Headphone"
|
"Headphone"
|
||||||
@@ -55,6 +57,7 @@ Required properties for the following compatibles:
|
|||||||
Required properties for the following compatibles:
|
Required properties for the following compatibles:
|
||||||
- "allwinner,sun8i-a23-codec"
|
- "allwinner,sun8i-a23-codec"
|
||||||
- "allwinner,sun8i-h3-codec"
|
- "allwinner,sun8i-h3-codec"
|
||||||
|
- "allwinner,sun8i-v3s-codec"
|
||||||
- allwinner,codec-analog-controls: A phandle to the codec analog controls
|
- allwinner,codec-analog-controls: A phandle to the codec analog controls
|
||||||
block in the PRCM.
|
block in the PRCM.
|
||||||
|
|
||||||
|
@@ -4,6 +4,7 @@ Required properties:
|
|||||||
- compatible: must be one of the following compatibles:
|
- compatible: must be one of the following compatibles:
|
||||||
- "allwinner,sun8i-a23-codec-analog"
|
- "allwinner,sun8i-a23-codec-analog"
|
||||||
- "allwinner,sun8i-h3-codec-analog"
|
- "allwinner,sun8i-h3-codec-analog"
|
||||||
|
- "allwinner,sun8i-v3s-codec-analog"
|
||||||
|
|
||||||
Required properties if not a sub-node of the PRCM node:
|
Required properties if not a sub-node of the PRCM node:
|
||||||
- reg: must contain the registers location and length
|
- reg: must contain the registers location and length
|
||||||
|
24
Documentation/devicetree/bindings/sound/zte,zx-aud96p22.txt
Normal file
24
Documentation/devicetree/bindings/sound/zte,zx-aud96p22.txt
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
ZTE ZX AUD96P22 Audio Codec
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
- compatible: Must be "zte,zx-aud96p22"
|
||||||
|
- #sound-dai-cells: Should be 0
|
||||||
|
- reg: I2C bus slave address of AUD96P22
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
i2c0: i2c@1486000 {
|
||||||
|
compatible = "zte,zx296718-i2c";
|
||||||
|
reg = <0x01486000 0x1000>;
|
||||||
|
interrupts = <GIC_SPI 35 IRQ_TYPE_LEVEL_HIGH>;
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
clocks = <&audiocrm AUDIO_I2C0_WCLK>;
|
||||||
|
clock-frequency = <1600000>;
|
||||||
|
|
||||||
|
aud96p22: codec@22 {
|
||||||
|
compatible = "zte,zx-aud96p22";
|
||||||
|
#sound-dai-cells = <0>;
|
||||||
|
reg = <0x22>;
|
||||||
|
};
|
||||||
|
};
|
@@ -10,6 +10,7 @@ Required properties:
|
|||||||
- "rockchip,rk3288-usb", "rockchip,rk3066-usb", "snps,dwc2": for rk3288 Soc;
|
- "rockchip,rk3288-usb", "rockchip,rk3066-usb", "snps,dwc2": for rk3288 Soc;
|
||||||
- "lantiq,arx100-usb": The DWC2 USB controller instance in Lantiq ARX SoCs;
|
- "lantiq,arx100-usb": The DWC2 USB controller instance in Lantiq ARX SoCs;
|
||||||
- "lantiq,xrx200-usb": The DWC2 USB controller instance in Lantiq XRX SoCs;
|
- "lantiq,xrx200-usb": The DWC2 USB controller instance in Lantiq XRX SoCs;
|
||||||
|
- "amlogic,meson8-usb": The DWC2 USB controller instance in Amlogic Meson8 SoCs;
|
||||||
- "amlogic,meson8b-usb": The DWC2 USB controller instance in Amlogic Meson8b SoCs;
|
- "amlogic,meson8b-usb": The DWC2 USB controller instance in Amlogic Meson8b SoCs;
|
||||||
- "amlogic,meson-gxbb-usb": The DWC2 USB controller instance in Amlogic S905 SoCs;
|
- "amlogic,meson-gxbb-usb": The DWC2 USB controller instance in Amlogic S905 SoCs;
|
||||||
- "amcc,dwc-otg": The DWC2 USB controller instance in AMCC Canyonlands 460EX SoCs;
|
- "amcc,dwc-otg": The DWC2 USB controller instance in AMCC Canyonlands 460EX SoCs;
|
||||||
|
@@ -15,7 +15,7 @@ It has been tested with the following devices:
|
|||||||
The driver allows configuration of the touch screen via a set of sysfs files:
|
The driver allows configuration of the touch screen via a set of sysfs files:
|
||||||
|
|
||||||
/sys/class/input/eventX/device/device/threshold:
|
/sys/class/input/eventX/device/device/threshold:
|
||||||
allows setting the "click"-threshold in the range from 20 to 80.
|
allows setting the "click"-threshold in the range from 0 to 80.
|
||||||
|
|
||||||
/sys/class/input/eventX/device/device/gain:
|
/sys/class/input/eventX/device/device/gain:
|
||||||
allows setting the sensitivity in the range from 0 to 31. Note that
|
allows setting the sensitivity in the range from 0 to 31. Note that
|
||||||
|
194
Documentation/networking/dpaa.txt
Normal file
194
Documentation/networking/dpaa.txt
Normal file
@@ -0,0 +1,194 @@
|
|||||||
|
The QorIQ DPAA Ethernet Driver
|
||||||
|
==============================
|
||||||
|
|
||||||
|
Authors:
|
||||||
|
Madalin Bucur <madalin.bucur@nxp.com>
|
||||||
|
Camelia Groza <camelia.groza@nxp.com>
|
||||||
|
|
||||||
|
Contents
|
||||||
|
========
|
||||||
|
|
||||||
|
- DPAA Ethernet Overview
|
||||||
|
- DPAA Ethernet Supported SoCs
|
||||||
|
- Configuring DPAA Ethernet in your kernel
|
||||||
|
- DPAA Ethernet Frame Processing
|
||||||
|
- DPAA Ethernet Features
|
||||||
|
- Debugging
|
||||||
|
|
||||||
|
DPAA Ethernet Overview
|
||||||
|
======================
|
||||||
|
|
||||||
|
DPAA stands for Data Path Acceleration Architecture and it is a
|
||||||
|
set of networking acceleration IPs that are available on several
|
||||||
|
generations of SoCs, both on PowerPC and ARM64.
|
||||||
|
|
||||||
|
The Freescale DPAA architecture consists of a series of hardware blocks
|
||||||
|
that support Ethernet connectivity. The Ethernet driver depends upon the
|
||||||
|
following drivers in the Linux kernel:
|
||||||
|
|
||||||
|
- Peripheral Access Memory Unit (PAMU) (* needed only for PPC platforms)
|
||||||
|
drivers/iommu/fsl_*
|
||||||
|
- Frame Manager (FMan)
|
||||||
|
drivers/net/ethernet/freescale/fman
|
||||||
|
- Queue Manager (QMan), Buffer Manager (BMan)
|
||||||
|
drivers/soc/fsl/qbman
|
||||||
|
|
||||||
|
A simplified view of the dpaa_eth interfaces mapped to FMan MACs:
|
||||||
|
|
||||||
|
dpaa_eth /eth0\ ... /ethN\
|
||||||
|
driver | | | |
|
||||||
|
------------- ---- ----------- ---- -------------
|
||||||
|
-Ports / Tx Rx \ ... / Tx Rx \
|
||||||
|
FMan | | | |
|
||||||
|
-MACs | MAC0 | | MACN |
|
||||||
|
/ dtsec0 \ ... / dtsecN \ (or tgec)
|
||||||
|
/ \ / \(or memac)
|
||||||
|
--------- -------------- --- -------------- ---------
|
||||||
|
FMan, FMan Port, FMan SP, FMan MURAM drivers
|
||||||
|
---------------------------------------------------------
|
||||||
|
FMan HW blocks: MURAM, MACs, Ports, SP
|
||||||
|
---------------------------------------------------------
|
||||||
|
|
||||||
|
The dpaa_eth relation to the QMan, BMan and FMan:
|
||||||
|
________________________________
|
||||||
|
dpaa_eth / eth0 \
|
||||||
|
driver / \
|
||||||
|
--------- -^- -^- -^- --- ---------
|
||||||
|
QMan driver / \ / \ / \ \ / | BMan |
|
||||||
|
|Rx | |Rx | |Tx | |Tx | | driver |
|
||||||
|
--------- |Dfl| |Err| |Cnf| |FQs| | |
|
||||||
|
QMan HW |FQ | |FQ | |FQs| | | | |
|
||||||
|
/ \ / \ / \ \ / | |
|
||||||
|
--------- --- --- --- -v- ---------
|
||||||
|
| FMan QMI | |
|
||||||
|
| FMan HW FMan BMI | BMan HW |
|
||||||
|
----------------------- --------
|
||||||
|
|
||||||
|
where the acronyms used above (and in the code) are:
|
||||||
|
DPAA = Data Path Acceleration Architecture
|
||||||
|
FMan = DPAA Frame Manager
|
||||||
|
QMan = DPAA Queue Manager
|
||||||
|
BMan = DPAA Buffers Manager
|
||||||
|
QMI = QMan interface in FMan
|
||||||
|
BMI = BMan interface in FMan
|
||||||
|
FMan SP = FMan Storage Profiles
|
||||||
|
MURAM = Multi-user RAM in FMan
|
||||||
|
FQ = QMan Frame Queue
|
||||||
|
Rx Dfl FQ = default reception FQ
|
||||||
|
Rx Err FQ = Rx error frames FQ
|
||||||
|
Tx Cnf FQ = Tx confirmation FQs
|
||||||
|
Tx FQs = transmission frame queues
|
||||||
|
dtsec = datapath three speed Ethernet controller (10/100/1000 Mbps)
|
||||||
|
tgec = ten gigabit Ethernet controller (10 Gbps)
|
||||||
|
memac = multirate Ethernet MAC (10/100/1000/10000)
|
||||||
|
|
||||||
|
DPAA Ethernet Supported SoCs
|
||||||
|
============================
|
||||||
|
|
||||||
|
The DPAA drivers enable the Ethernet controllers present on the following SoCs:
|
||||||
|
|
||||||
|
# PPC
|
||||||
|
P1023
|
||||||
|
P2041
|
||||||
|
P3041
|
||||||
|
P4080
|
||||||
|
P5020
|
||||||
|
P5040
|
||||||
|
T1023
|
||||||
|
T1024
|
||||||
|
T1040
|
||||||
|
T1042
|
||||||
|
T2080
|
||||||
|
T4240
|
||||||
|
B4860
|
||||||
|
|
||||||
|
# ARM
|
||||||
|
LS1043A
|
||||||
|
LS1046A
|
||||||
|
|
||||||
|
Configuring DPAA Ethernet in your kernel
|
||||||
|
========================================
|
||||||
|
|
||||||
|
To enable the DPAA Ethernet driver, the following Kconfig options are required:
|
||||||
|
|
||||||
|
# common for arch/arm64 and arch/powerpc platforms
|
||||||
|
CONFIG_FSL_DPAA=y
|
||||||
|
CONFIG_FSL_FMAN=y
|
||||||
|
CONFIG_FSL_DPAA_ETH=y
|
||||||
|
CONFIG_FSL_XGMAC_MDIO=y
|
||||||
|
|
||||||
|
# for arch/powerpc only
|
||||||
|
CONFIG_FSL_PAMU=y
|
||||||
|
|
||||||
|
# common options needed for the PHYs used on the RDBs
|
||||||
|
CONFIG_VITESSE_PHY=y
|
||||||
|
CONFIG_REALTEK_PHY=y
|
||||||
|
CONFIG_AQUANTIA_PHY=y
|
||||||
|
|
||||||
|
DPAA Ethernet Frame Processing
|
||||||
|
==============================
|
||||||
|
|
||||||
|
On Rx, buffers for the incoming frames are retrieved from one of the three
|
||||||
|
existing buffers pools. The driver initializes and seeds these, each with
|
||||||
|
buffers of different sizes: 1KB, 2KB and 4KB.
|
||||||
|
|
||||||
|
On Tx, all transmitted frames are returned to the driver through Tx
|
||||||
|
confirmation frame queues. The driver is then responsible for freeing the
|
||||||
|
buffers. In order to do this properly, a backpointer is added to the buffer
|
||||||
|
before transmission that points to the skb. When the buffer returns to the
|
||||||
|
driver on a confirmation FQ, the skb can be correctly consumed.
|
||||||
|
|
||||||
|
DPAA Ethernet Features
|
||||||
|
======================
|
||||||
|
|
||||||
|
Currently the DPAA Ethernet driver enables the basic features required for
|
||||||
|
a Linux Ethernet driver. The support for advanced features will be added
|
||||||
|
gradually.
|
||||||
|
|
||||||
|
The driver has Rx and Tx checksum offloading for UDP and TCP. Currently the Rx
|
||||||
|
checksum offload feature is enabled by default and cannot be controlled through
|
||||||
|
ethtool.
|
||||||
|
|
||||||
|
The driver has support for multiple prioritized Tx traffic classes. Priorities
|
||||||
|
range from 0 (lowest) to 3 (highest). These are mapped to HW workqueues with
|
||||||
|
strict priority levels. Each traffic class contains NR_CPU TX queues. By
|
||||||
|
default, only one traffic class is enabled and the lowest priority Tx queues
|
||||||
|
are used. Higher priority traffic classes can be enabled with the mqprio
|
||||||
|
qdisc. For example, all four traffic classes are enabled on an interface with
|
||||||
|
the following command. Furthermore, skb priority levels are mapped to traffic
|
||||||
|
classes as follows:
|
||||||
|
|
||||||
|
* priorities 0 to 3 - traffic class 0 (low priority)
|
||||||
|
* priorities 4 to 7 - traffic class 1 (medium-low priority)
|
||||||
|
* priorities 8 to 11 - traffic class 2 (medium-high priority)
|
||||||
|
* priorities 12 to 15 - traffic class 3 (high priority)
|
||||||
|
|
||||||
|
tc qdisc add dev <int> root handle 1: \
|
||||||
|
mqprio num_tc 4 map 0 0 0 0 1 1 1 1 2 2 2 2 3 3 3 3 hw 1
|
||||||
|
|
||||||
|
Debugging
|
||||||
|
=========
|
||||||
|
|
||||||
|
The following statistics are exported for each interface through ethtool:
|
||||||
|
|
||||||
|
- interrupt count per CPU
|
||||||
|
- Rx packets count per CPU
|
||||||
|
- Tx packets count per CPU
|
||||||
|
- Tx confirmed packets count per CPU
|
||||||
|
- Tx S/G frames count per CPU
|
||||||
|
- Tx error count per CPU
|
||||||
|
- Rx error count per CPU
|
||||||
|
- Rx error count per type
|
||||||
|
- congestion related statistics:
|
||||||
|
- congestion status
|
||||||
|
- time spent in congestion
|
||||||
|
- number of time the device entered congestion
|
||||||
|
- dropped packets count per cause
|
||||||
|
|
||||||
|
The driver also exports the following information in sysfs:
|
||||||
|
|
||||||
|
- the FQ IDs for each FQ type
|
||||||
|
/sys/devices/platform/dpaa-ethernet.0/net/<int>/fqids
|
||||||
|
|
||||||
|
- the IDs of the buffer pools in use
|
||||||
|
/sys/devices/platform/dpaa-ethernet.0/net/<int>/bpids
|
@@ -122,7 +122,7 @@ associated flow of the packet. The hash is either provided by hardware
|
|||||||
or will be computed in the stack. Capable hardware can pass the hash in
|
or will be computed in the stack. Capable hardware can pass the hash in
|
||||||
the receive descriptor for the packet; this would usually be the same
|
the receive descriptor for the packet; this would usually be the same
|
||||||
hash used for RSS (e.g. computed Toeplitz hash). The hash is saved in
|
hash used for RSS (e.g. computed Toeplitz hash). The hash is saved in
|
||||||
skb->rx_hash and can be used elsewhere in the stack as a hash of the
|
skb->hash and can be used elsewhere in the stack as a hash of the
|
||||||
packet’s flow.
|
packet’s flow.
|
||||||
|
|
||||||
Each receive hardware queue has an associated list of CPUs to which
|
Each receive hardware queue has an associated list of CPUs to which
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
TCP protocol
|
TCP protocol
|
||||||
============
|
============
|
||||||
|
|
||||||
Last updated: 9 February 2008
|
Last updated: 3 June 2017
|
||||||
|
|
||||||
Contents
|
Contents
|
||||||
========
|
========
|
||||||
@@ -29,18 +29,19 @@ As of 2.6.13, Linux supports pluggable congestion control algorithms.
|
|||||||
A congestion control mechanism can be registered through functions in
|
A congestion control mechanism can be registered through functions in
|
||||||
tcp_cong.c. The functions used by the congestion control mechanism are
|
tcp_cong.c. The functions used by the congestion control mechanism are
|
||||||
registered via passing a tcp_congestion_ops struct to
|
registered via passing a tcp_congestion_ops struct to
|
||||||
tcp_register_congestion_control. As a minimum name, ssthresh,
|
tcp_register_congestion_control. As a minimum, the congestion control
|
||||||
cong_avoid must be valid.
|
mechanism must provide a valid name and must implement either ssthresh,
|
||||||
|
cong_avoid and undo_cwnd hooks or the "omnipotent" cong_control hook.
|
||||||
|
|
||||||
Private data for a congestion control mechanism is stored in tp->ca_priv.
|
Private data for a congestion control mechanism is stored in tp->ca_priv.
|
||||||
tcp_ca(tp) returns a pointer to this space. This is preallocated space - it
|
tcp_ca(tp) returns a pointer to this space. This is preallocated space - it
|
||||||
is important to check the size of your private data will fit this space, or
|
is important to check the size of your private data will fit this space, or
|
||||||
alternatively space could be allocated elsewhere and a pointer to it could
|
alternatively, space could be allocated elsewhere and a pointer to it could
|
||||||
be stored here.
|
be stored here.
|
||||||
|
|
||||||
There are three kinds of congestion control algorithms currently: The
|
There are three kinds of congestion control algorithms currently: The
|
||||||
simplest ones are derived from TCP reno (highspeed, scalable) and just
|
simplest ones are derived from TCP reno (highspeed, scalable) and just
|
||||||
provide an alternative the congestion window calculation. More complex
|
provide an alternative congestion window calculation. More complex
|
||||||
ones like BIC try to look at other events to provide better
|
ones like BIC try to look at other events to provide better
|
||||||
heuristics. There are also round trip time based algorithms like
|
heuristics. There are also round trip time based algorithms like
|
||||||
Vegas and Westwood+.
|
Vegas and Westwood+.
|
||||||
@@ -49,21 +50,15 @@ Good TCP congestion control is a complex problem because the algorithm
|
|||||||
needs to maintain fairness and performance. Please review current
|
needs to maintain fairness and performance. Please review current
|
||||||
research and RFC's before developing new modules.
|
research and RFC's before developing new modules.
|
||||||
|
|
||||||
The method that is used to determine which congestion control mechanism is
|
The default congestion control mechanism is chosen based on the
|
||||||
determined by the setting of the sysctl net.ipv4.tcp_congestion_control.
|
DEFAULT_TCP_CONG Kconfig parameter. If you really want a particular default
|
||||||
The default congestion control will be the last one registered (LIFO);
|
value then you can set it using sysctl net.ipv4.tcp_congestion_control. The
|
||||||
so if you built everything as modules, the default will be reno. If you
|
module will be autoloaded if needed and you will get the expected protocol. If
|
||||||
build with the defaults from Kconfig, then CUBIC will be builtin (not a
|
you ask for an unknown congestion method, then the sysctl attempt will fail.
|
||||||
module) and it will end up the default.
|
|
||||||
|
|
||||||
If you really want a particular default value then you will need
|
If you remove a TCP congestion control module, then you will get the next
|
||||||
to set it with the sysctl. If you use a sysctl, the module will be autoloaded
|
|
||||||
if needed and you will get the expected protocol. If you ask for an
|
|
||||||
unknown congestion method, then the sysctl attempt will fail.
|
|
||||||
|
|
||||||
If you remove a tcp congestion control module, then you will get the next
|
|
||||||
available one. Since reno cannot be built as a module, and cannot be
|
available one. Since reno cannot be built as a module, and cannot be
|
||||||
deleted, it will always be available.
|
removed, it will always be available.
|
||||||
|
|
||||||
How the new TCP output machine [nyi] works.
|
How the new TCP output machine [nyi] works.
|
||||||
===========================================
|
===========================================
|
||||||
|
@@ -105,6 +105,24 @@ Pre
|
|||||||
Special PRE widget (exec before all others)
|
Special PRE widget (exec before all others)
|
||||||
Post
|
Post
|
||||||
Special POST widget (exec after all others)
|
Special POST widget (exec after all others)
|
||||||
|
Buffer
|
||||||
|
Inter widget audio data buffer within a DSP.
|
||||||
|
Scheduler
|
||||||
|
DSP internal scheduler that schedules component/pipeline processing
|
||||||
|
work.
|
||||||
|
Effect
|
||||||
|
Widget that performs an audio processing effect.
|
||||||
|
SRC
|
||||||
|
Sample Rate Converter within DSP or CODEC
|
||||||
|
ASRC
|
||||||
|
Asynchronous Sample Rate Converter within DSP or CODEC
|
||||||
|
Encoder
|
||||||
|
Widget that encodes audio data from one format (usually PCM) to another
|
||||||
|
usually more compressed format.
|
||||||
|
Decoder
|
||||||
|
Widget that decodes audio data from a compressed format to an
|
||||||
|
uncompressed format like PCM.
|
||||||
|
|
||||||
|
|
||||||
(Widgets are defined in include/sound/soc-dapm.h)
|
(Widgets are defined in include/sound/soc-dapm.h)
|
||||||
|
|
||||||
|
35
MAINTAINERS
35
MAINTAINERS
@@ -1172,7 +1172,7 @@ N: clps711x
|
|||||||
|
|
||||||
ARM/CIRRUS LOGIC EP93XX ARM ARCHITECTURE
|
ARM/CIRRUS LOGIC EP93XX ARM ARCHITECTURE
|
||||||
M: Hartley Sweeten <hsweeten@visionengravers.com>
|
M: Hartley Sweeten <hsweeten@visionengravers.com>
|
||||||
M: Ryan Mallon <rmallon@gmail.com>
|
M: Alexander Sverdlin <alexander.sverdlin@gmail.com>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/arm/mach-ep93xx/
|
F: arch/arm/mach-ep93xx/
|
||||||
@@ -1489,13 +1489,15 @@ M: Gregory Clement <gregory.clement@free-electrons.com>
|
|||||||
M: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
|
M: Sebastian Hesselbarth <sebastian.hesselbarth@gmail.com>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/arm/mach-mvebu/
|
|
||||||
F: drivers/rtc/rtc-armada38x.c
|
|
||||||
F: arch/arm/boot/dts/armada*
|
F: arch/arm/boot/dts/armada*
|
||||||
F: arch/arm/boot/dts/kirkwood*
|
F: arch/arm/boot/dts/kirkwood*
|
||||||
|
F: arch/arm/configs/mvebu_*_defconfig
|
||||||
|
F: arch/arm/mach-mvebu/
|
||||||
F: arch/arm64/boot/dts/marvell/armada*
|
F: arch/arm64/boot/dts/marvell/armada*
|
||||||
F: drivers/cpufreq/mvebu-cpufreq.c
|
F: drivers/cpufreq/mvebu-cpufreq.c
|
||||||
F: arch/arm/configs/mvebu_*_defconfig
|
F: drivers/irqchip/irq-armada-370-xp.c
|
||||||
|
F: drivers/irqchip/irq-mvebu-*
|
||||||
|
F: drivers/rtc/rtc-armada38x.c
|
||||||
|
|
||||||
ARM/Marvell Berlin SoC support
|
ARM/Marvell Berlin SoC support
|
||||||
M: Jisheng Zhang <jszhang@marvell.com>
|
M: Jisheng Zhang <jszhang@marvell.com>
|
||||||
@@ -1721,7 +1723,6 @@ N: rockchip
|
|||||||
ARM/SAMSUNG EXYNOS ARM ARCHITECTURES
|
ARM/SAMSUNG EXYNOS ARM ARCHITECTURES
|
||||||
M: Kukjin Kim <kgene@kernel.org>
|
M: Kukjin Kim <kgene@kernel.org>
|
||||||
M: Krzysztof Kozlowski <krzk@kernel.org>
|
M: Krzysztof Kozlowski <krzk@kernel.org>
|
||||||
R: Javier Martinez Canillas <javier@osg.samsung.com>
|
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers)
|
L: linux-samsung-soc@vger.kernel.org (moderated for non-subscribers)
|
||||||
Q: https://patchwork.kernel.org/project/linux-samsung-soc/list/
|
Q: https://patchwork.kernel.org/project/linux-samsung-soc/list/
|
||||||
@@ -1829,7 +1830,6 @@ F: drivers/edac/altera_edac.
|
|||||||
ARM/STI ARCHITECTURE
|
ARM/STI ARCHITECTURE
|
||||||
M: Patrice Chotard <patrice.chotard@st.com>
|
M: Patrice Chotard <patrice.chotard@st.com>
|
||||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||||
L: kernel@stlinux.com
|
|
||||||
W: http://www.stlinux.com
|
W: http://www.stlinux.com
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: arch/arm/mach-sti/
|
F: arch/arm/mach-sti/
|
||||||
@@ -2964,7 +2964,7 @@ F: sound/pci/oxygen/
|
|||||||
|
|
||||||
C6X ARCHITECTURE
|
C6X ARCHITECTURE
|
||||||
M: Mark Salter <msalter@redhat.com>
|
M: Mark Salter <msalter@redhat.com>
|
||||||
M: Aurelien Jacquiot <a-jacquiot@ti.com>
|
M: Aurelien Jacquiot <jacquiot.aurelien@gmail.com>
|
||||||
L: linux-c6x-dev@linux-c6x.org
|
L: linux-c6x-dev@linux-c6x.org
|
||||||
W: http://www.linux-c6x.org/wiki/index.php/Main_Page
|
W: http://www.linux-c6x.org/wiki/index.php/Main_Page
|
||||||
S: Maintained
|
S: Maintained
|
||||||
@@ -5622,7 +5622,7 @@ F: scripts/get_maintainer.pl
|
|||||||
|
|
||||||
GENWQE (IBM Generic Workqueue Card)
|
GENWQE (IBM Generic Workqueue Card)
|
||||||
M: Frank Haverkamp <haver@linux.vnet.ibm.com>
|
M: Frank Haverkamp <haver@linux.vnet.ibm.com>
|
||||||
M: Gabriel Krisman Bertazi <krisman@linux.vnet.ibm.com>
|
M: Guilherme G. Piccoli <gpiccoli@linux.vnet.ibm.com>
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/misc/genwqe/
|
F: drivers/misc/genwqe/
|
||||||
|
|
||||||
@@ -5667,7 +5667,6 @@ F: tools/testing/selftests/gpio/
|
|||||||
|
|
||||||
GPIO SUBSYSTEM
|
GPIO SUBSYSTEM
|
||||||
M: Linus Walleij <linus.walleij@linaro.org>
|
M: Linus Walleij <linus.walleij@linaro.org>
|
||||||
M: Alexandre Courbot <gnurou@gmail.com>
|
|
||||||
L: linux-gpio@vger.kernel.org
|
L: linux-gpio@vger.kernel.org
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-gpio.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
@@ -7143,7 +7142,7 @@ S: Maintained
|
|||||||
F: drivers/media/platform/rcar_jpu.c
|
F: drivers/media/platform/rcar_jpu.c
|
||||||
|
|
||||||
JSM Neo PCI based serial card
|
JSM Neo PCI based serial card
|
||||||
M: Gabriel Krisman Bertazi <krisman@linux.vnet.ibm.com>
|
M: Guilherme G. Piccoli <gpiccoli@linux.vnet.ibm.com>
|
||||||
L: linux-serial@vger.kernel.org
|
L: linux-serial@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/tty/serial/jsm/
|
F: drivers/tty/serial/jsm/
|
||||||
@@ -7707,7 +7706,7 @@ F: drivers/platform/x86/hp_accel.c
|
|||||||
|
|
||||||
LIVE PATCHING
|
LIVE PATCHING
|
||||||
M: Josh Poimboeuf <jpoimboe@redhat.com>
|
M: Josh Poimboeuf <jpoimboe@redhat.com>
|
||||||
M: Jessica Yu <jeyu@redhat.com>
|
M: Jessica Yu <jeyu@kernel.org>
|
||||||
M: Jiri Kosina <jikos@kernel.org>
|
M: Jiri Kosina <jikos@kernel.org>
|
||||||
M: Miroslav Benes <mbenes@suse.cz>
|
M: Miroslav Benes <mbenes@suse.cz>
|
||||||
R: Petr Mladek <pmladek@suse.com>
|
R: Petr Mladek <pmladek@suse.com>
|
||||||
@@ -8508,7 +8507,7 @@ S: Odd Fixes
|
|||||||
F: drivers/media/radio/radio-miropcm20*
|
F: drivers/media/radio/radio-miropcm20*
|
||||||
|
|
||||||
MELLANOX MLX4 core VPI driver
|
MELLANOX MLX4 core VPI driver
|
||||||
M: Yishai Hadas <yishaih@mellanox.com>
|
M: Tariq Toukan <tariqt@mellanox.com>
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
L: linux-rdma@vger.kernel.org
|
L: linux-rdma@vger.kernel.org
|
||||||
W: http://www.mellanox.com
|
W: http://www.mellanox.com
|
||||||
@@ -8516,7 +8515,6 @@ Q: http://patchwork.ozlabs.org/project/netdev/list/
|
|||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/net/ethernet/mellanox/mlx4/
|
F: drivers/net/ethernet/mellanox/mlx4/
|
||||||
F: include/linux/mlx4/
|
F: include/linux/mlx4/
|
||||||
F: include/uapi/rdma/mlx4-abi.h
|
|
||||||
|
|
||||||
MELLANOX MLX4 IB driver
|
MELLANOX MLX4 IB driver
|
||||||
M: Yishai Hadas <yishaih@mellanox.com>
|
M: Yishai Hadas <yishaih@mellanox.com>
|
||||||
@@ -8526,6 +8524,7 @@ Q: http://patchwork.kernel.org/project/linux-rdma/list/
|
|||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/infiniband/hw/mlx4/
|
F: drivers/infiniband/hw/mlx4/
|
||||||
F: include/linux/mlx4/
|
F: include/linux/mlx4/
|
||||||
|
F: include/uapi/rdma/mlx4-abi.h
|
||||||
|
|
||||||
MELLANOX MLX5 core VPI driver
|
MELLANOX MLX5 core VPI driver
|
||||||
M: Saeed Mahameed <saeedm@mellanox.com>
|
M: Saeed Mahameed <saeedm@mellanox.com>
|
||||||
@@ -8538,7 +8537,6 @@ Q: http://patchwork.ozlabs.org/project/netdev/list/
|
|||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/net/ethernet/mellanox/mlx5/core/
|
F: drivers/net/ethernet/mellanox/mlx5/core/
|
||||||
F: include/linux/mlx5/
|
F: include/linux/mlx5/
|
||||||
F: include/uapi/rdma/mlx5-abi.h
|
|
||||||
|
|
||||||
MELLANOX MLX5 IB driver
|
MELLANOX MLX5 IB driver
|
||||||
M: Matan Barak <matanb@mellanox.com>
|
M: Matan Barak <matanb@mellanox.com>
|
||||||
@@ -8549,6 +8547,7 @@ Q: http://patchwork.kernel.org/project/linux-rdma/list/
|
|||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/infiniband/hw/mlx5/
|
F: drivers/infiniband/hw/mlx5/
|
||||||
F: include/linux/mlx5/
|
F: include/linux/mlx5/
|
||||||
|
F: include/uapi/rdma/mlx5-abi.h
|
||||||
|
|
||||||
MELEXIS MLX90614 DRIVER
|
MELEXIS MLX90614 DRIVER
|
||||||
M: Crt Mori <cmo@melexis.com>
|
M: Crt Mori <cmo@melexis.com>
|
||||||
@@ -8588,7 +8587,7 @@ S: Maintained
|
|||||||
F: drivers/media/dvb-frontends/mn88473*
|
F: drivers/media/dvb-frontends/mn88473*
|
||||||
|
|
||||||
MODULE SUPPORT
|
MODULE SUPPORT
|
||||||
M: Jessica Yu <jeyu@redhat.com>
|
M: Jessica Yu <jeyu@kernel.org>
|
||||||
M: Rusty Russell <rusty@rustcorp.com.au>
|
M: Rusty Russell <rusty@rustcorp.com.au>
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jeyu/linux.git modules-next
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jeyu/linux.git modules-next
|
||||||
S: Maintained
|
S: Maintained
|
||||||
@@ -10450,7 +10449,7 @@ S: Orphan
|
|||||||
|
|
||||||
PXA RTC DRIVER
|
PXA RTC DRIVER
|
||||||
M: Robert Jarzmik <robert.jarzmik@free.fr>
|
M: Robert Jarzmik <robert.jarzmik@free.fr>
|
||||||
L: rtc-linux@googlegroups.com
|
L: linux-rtc@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
QAT DRIVER
|
QAT DRIVER
|
||||||
@@ -10757,7 +10756,7 @@ X: kernel/torture.c
|
|||||||
REAL TIME CLOCK (RTC) SUBSYSTEM
|
REAL TIME CLOCK (RTC) SUBSYSTEM
|
||||||
M: Alessandro Zummo <a.zummo@towertech.it>
|
M: Alessandro Zummo <a.zummo@towertech.it>
|
||||||
M: Alexandre Belloni <alexandre.belloni@free-electrons.com>
|
M: Alexandre Belloni <alexandre.belloni@free-electrons.com>
|
||||||
L: rtc-linux@googlegroups.com
|
L: linux-rtc@vger.kernel.org
|
||||||
Q: http://patchwork.ozlabs.org/project/rtc-linux/list/
|
Q: http://patchwork.ozlabs.org/project/rtc-linux/list/
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/abelloni/linux.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/abelloni/linux.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
@@ -11268,7 +11267,6 @@ F: drivers/media/rc/serial_ir.c
|
|||||||
|
|
||||||
STI CEC DRIVER
|
STI CEC DRIVER
|
||||||
M: Benjamin Gaignard <benjamin.gaignard@linaro.org>
|
M: Benjamin Gaignard <benjamin.gaignard@linaro.org>
|
||||||
L: kernel@stlinux.com
|
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/staging/media/st-cec/
|
F: drivers/staging/media/st-cec/
|
||||||
F: Documentation/devicetree/bindings/media/stih-cec.txt
|
F: Documentation/devicetree/bindings/media/stih-cec.txt
|
||||||
@@ -11778,6 +11776,7 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/nsekhar/linux-davinci.git
|
|||||||
S: Supported
|
S: Supported
|
||||||
F: arch/arm/mach-davinci/
|
F: arch/arm/mach-davinci/
|
||||||
F: drivers/i2c/busses/i2c-davinci.c
|
F: drivers/i2c/busses/i2c-davinci.c
|
||||||
|
F: arch/arm/boot/dts/da850*
|
||||||
|
|
||||||
TI DAVINCI SERIES MEDIA DRIVER
|
TI DAVINCI SERIES MEDIA DRIVER
|
||||||
M: "Lad, Prabhakar" <prabhakar.csengg@gmail.com>
|
M: "Lad, Prabhakar" <prabhakar.csengg@gmail.com>
|
||||||
|
4
Makefile
4
Makefile
@@ -1,7 +1,7 @@
|
|||||||
VERSION = 4
|
VERSION = 4
|
||||||
PATCHLEVEL = 12
|
PATCHLEVEL = 12
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc2
|
EXTRAVERSION =
|
||||||
NAME = Fearless Coyote
|
NAME = Fearless Coyote
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
@@ -1437,7 +1437,7 @@ help:
|
|||||||
@echo ' make V=0|1 [targets] 0 => quiet build (default), 1 => verbose build'
|
@echo ' make V=0|1 [targets] 0 => quiet build (default), 1 => verbose build'
|
||||||
@echo ' make V=2 [targets] 2 => give reason for rebuild of target'
|
@echo ' make V=2 [targets] 2 => give reason for rebuild of target'
|
||||||
@echo ' make O=dir [targets] Locate all output files in "dir", including .config'
|
@echo ' make O=dir [targets] Locate all output files in "dir", including .config'
|
||||||
@echo ' make C=1 [targets] Check all c source with $$CHECK (sparse by default)'
|
@echo ' make C=1 [targets] Check re-compiled c source with $$CHECK (sparse by default)'
|
||||||
@echo ' make C=2 [targets] Force check of all c source with $$CHECK'
|
@echo ' make C=2 [targets] Force check of all c source with $$CHECK'
|
||||||
@echo ' make RECORDMCOUNT_WARN=1 [targets] Warn about ignored mcount sections'
|
@echo ' make RECORDMCOUNT_WARN=1 [targets] Warn about ignored mcount sections'
|
||||||
@echo ' make W=n [targets] Enable extra gcc checks, n=1,2,3 where'
|
@echo ' make W=n [targets] Enable extra gcc checks, n=1,2,3 where'
|
||||||
|
@@ -86,8 +86,6 @@ struct task_struct;
|
|||||||
#define TSK_K_BLINK(tsk) TSK_K_REG(tsk, 4)
|
#define TSK_K_BLINK(tsk) TSK_K_REG(tsk, 4)
|
||||||
#define TSK_K_FP(tsk) TSK_K_REG(tsk, 0)
|
#define TSK_K_FP(tsk) TSK_K_REG(tsk, 0)
|
||||||
|
|
||||||
#define thread_saved_pc(tsk) TSK_K_BLINK(tsk)
|
|
||||||
|
|
||||||
extern void start_thread(struct pt_regs * regs, unsigned long pc,
|
extern void start_thread(struct pt_regs * regs, unsigned long pc,
|
||||||
unsigned long usp);
|
unsigned long usp);
|
||||||
|
|
||||||
|
@@ -65,7 +65,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr,
|
|||||||
|
|
||||||
vma = find_vma(mm, addr);
|
vma = find_vma(mm, addr);
|
||||||
if (TASK_SIZE - len >= addr &&
|
if (TASK_SIZE - len >= addr &&
|
||||||
(!vma || addr + len <= vma->vm_start))
|
(!vma || addr + len <= vm_start_gap(vma)))
|
||||||
return addr;
|
return addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1416,6 +1416,7 @@ choice
|
|||||||
config VMSPLIT_3G
|
config VMSPLIT_3G
|
||||||
bool "3G/1G user/kernel split"
|
bool "3G/1G user/kernel split"
|
||||||
config VMSPLIT_3G_OPT
|
config VMSPLIT_3G_OPT
|
||||||
|
depends on !ARM_LPAE
|
||||||
bool "3G/1G user/kernel split (for full 1G low memory)"
|
bool "3G/1G user/kernel split (for full 1G low memory)"
|
||||||
config VMSPLIT_2G
|
config VMSPLIT_2G
|
||||||
bool "2G/2G user/kernel split"
|
bool "2G/2G user/kernel split"
|
||||||
|
@@ -17,14 +17,13 @@
|
|||||||
@ there.
|
@ there.
|
||||||
.inst 'M' | ('Z' << 8) | (0x1310 << 16) @ tstne r0, #0x4d000
|
.inst 'M' | ('Z' << 8) | (0x1310 << 16) @ tstne r0, #0x4d000
|
||||||
#else
|
#else
|
||||||
mov r0, r0
|
AR_CLASS( mov r0, r0 )
|
||||||
|
M_CLASS( nop.w )
|
||||||
#endif
|
#endif
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
.macro __EFI_HEADER
|
.macro __EFI_HEADER
|
||||||
#ifdef CONFIG_EFI_STUB
|
#ifdef CONFIG_EFI_STUB
|
||||||
b __efi_start
|
|
||||||
|
|
||||||
.set start_offset, __efi_start - start
|
.set start_offset, __efi_start - start
|
||||||
.org start + 0x3c
|
.org start + 0x3c
|
||||||
@
|
@
|
||||||
|
@@ -130,19 +130,22 @@ start:
|
|||||||
.rept 7
|
.rept 7
|
||||||
__nop
|
__nop
|
||||||
.endr
|
.endr
|
||||||
ARM( mov r0, r0 )
|
#ifndef CONFIG_THUMB2_KERNEL
|
||||||
ARM( b 1f )
|
mov r0, r0
|
||||||
THUMB( badr r12, 1f )
|
#else
|
||||||
THUMB( bx r12 )
|
AR_CLASS( sub pc, pc, #3 ) @ A/R: switch to Thumb2 mode
|
||||||
|
M_CLASS( nop.w ) @ M: already in Thumb2 mode
|
||||||
|
.thumb
|
||||||
|
#endif
|
||||||
|
W(b) 1f
|
||||||
|
|
||||||
.word _magic_sig @ Magic numbers to help the loader
|
.word _magic_sig @ Magic numbers to help the loader
|
||||||
.word _magic_start @ absolute load/run zImage address
|
.word _magic_start @ absolute load/run zImage address
|
||||||
.word _magic_end @ zImage end address
|
.word _magic_end @ zImage end address
|
||||||
.word 0x04030201 @ endianness flag
|
.word 0x04030201 @ endianness flag
|
||||||
|
|
||||||
THUMB( .thumb )
|
__EFI_HEADER
|
||||||
1: __EFI_HEADER
|
1:
|
||||||
|
|
||||||
ARM_BE8( setend be ) @ go BE8 if compiled for BE8
|
ARM_BE8( setend be ) @ go BE8 if compiled for BE8
|
||||||
AR_CLASS( mrs r9, cpsr )
|
AR_CLASS( mrs r9, cpsr )
|
||||||
#ifdef CONFIG_ARM_VIRT_EXT
|
#ifdef CONFIG_ARM_VIRT_EXT
|
||||||
|
@@ -220,7 +220,7 @@
|
|||||||
|
|
||||||
mmc1_pins: pinmux_mmc1_pins {
|
mmc1_pins: pinmux_mmc1_pins {
|
||||||
pinctrl-single,pins = <
|
pinctrl-single,pins = <
|
||||||
AM33XX_IOPAD(0x960, PIN_INPUT | MUX_MODE7) /* spi0_cs1.gpio0_6 */
|
AM33XX_IOPAD(0x96c, PIN_INPUT | MUX_MODE7) /* uart0_rtsn.gpio1_9 */
|
||||||
>;
|
>;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -280,10 +280,6 @@
|
|||||||
AM33XX_IOPAD(0x834, PIN_INPUT_PULLUP | MUX_MODE7) /* nKbdReset - gpmc_ad13.gpio1_13 */
|
AM33XX_IOPAD(0x834, PIN_INPUT_PULLUP | MUX_MODE7) /* nKbdReset - gpmc_ad13.gpio1_13 */
|
||||||
AM33XX_IOPAD(0x838, PIN_INPUT_PULLUP | MUX_MODE7) /* nDispReset - gpmc_ad14.gpio1_14 */
|
AM33XX_IOPAD(0x838, PIN_INPUT_PULLUP | MUX_MODE7) /* nDispReset - gpmc_ad14.gpio1_14 */
|
||||||
AM33XX_IOPAD(0x844, PIN_INPUT_PULLUP | MUX_MODE7) /* USB1_enPower - gpmc_a1.gpio1_17 */
|
AM33XX_IOPAD(0x844, PIN_INPUT_PULLUP | MUX_MODE7) /* USB1_enPower - gpmc_a1.gpio1_17 */
|
||||||
/* AVR Programming - SPI Bus (bit bang) - Screen and Keyboard */
|
|
||||||
AM33XX_IOPAD(0x954, PIN_INPUT_PULLUP | MUX_MODE7) /* Kbd/Disp/BattMOSI spi0_d0.gpio0_3 */
|
|
||||||
AM33XX_IOPAD(0x958, PIN_INPUT_PULLUP | MUX_MODE7) /* Kbd/Disp/BattMISO spi0_d1.gpio0_4 */
|
|
||||||
AM33XX_IOPAD(0x950, PIN_INPUT_PULLUP | MUX_MODE7) /* Kbd/Disp/BattSCLK spi0_clk.gpio0_2 */
|
|
||||||
/* PDI Bus - Battery system */
|
/* PDI Bus - Battery system */
|
||||||
AM33XX_IOPAD(0x840, PIN_INPUT_PULLUP | MUX_MODE7) /* nBattReset gpmc_a0.gpio1_16 */
|
AM33XX_IOPAD(0x840, PIN_INPUT_PULLUP | MUX_MODE7) /* nBattReset gpmc_a0.gpio1_16 */
|
||||||
AM33XX_IOPAD(0x83c, PIN_INPUT_PULLUP | MUX_MODE7) /* BattPDIData gpmc_ad15.gpio1_15 */
|
AM33XX_IOPAD(0x83c, PIN_INPUT_PULLUP | MUX_MODE7) /* BattPDIData gpmc_ad15.gpio1_15 */
|
||||||
@@ -384,7 +380,7 @@
|
|||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&mmc1_pins>;
|
pinctrl-0 = <&mmc1_pins>;
|
||||||
bus-width = <4>;
|
bus-width = <4>;
|
||||||
cd-gpios = <&gpio0 6 GPIO_ACTIVE_LOW>;
|
cd-gpios = <&gpio1 9 GPIO_ACTIVE_LOW>;
|
||||||
vmmc-supply = <&vmmcsd_fixed>;
|
vmmc-supply = <&vmmcsd_fixed>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -3,6 +3,11 @@
|
|||||||
#include <dt-bindings/clock/bcm2835-aux.h>
|
#include <dt-bindings/clock/bcm2835-aux.h>
|
||||||
#include <dt-bindings/gpio/gpio.h>
|
#include <dt-bindings/gpio/gpio.h>
|
||||||
|
|
||||||
|
/* firmware-provided startup stubs live here, where the secondary CPUs are
|
||||||
|
* spinning.
|
||||||
|
*/
|
||||||
|
/memreserve/ 0x00000000 0x00001000;
|
||||||
|
|
||||||
/* This include file covers the common peripherals and configuration between
|
/* This include file covers the common peripherals and configuration between
|
||||||
* bcm2835 and bcm2836 implementations, leaving the CPU configuration to
|
* bcm2835 and bcm2836 implementations, leaving the CPU configuration to
|
||||||
* bcm2835.dtsi and bcm2836.dtsi.
|
* bcm2835.dtsi and bcm2836.dtsi.
|
||||||
|
@@ -120,10 +120,16 @@
|
|||||||
|
|
||||||
ethphy0: ethernet-phy@2 {
|
ethphy0: ethernet-phy@2 {
|
||||||
reg = <2>;
|
reg = <2>;
|
||||||
|
micrel,led-mode = <1>;
|
||||||
|
clocks = <&clks IMX6UL_CLK_ENET_REF>;
|
||||||
|
clock-names = "rmii-ref";
|
||||||
};
|
};
|
||||||
|
|
||||||
ethphy1: ethernet-phy@1 {
|
ethphy1: ethernet-phy@1 {
|
||||||
reg = <1>;
|
reg = <1>;
|
||||||
|
micrel,led-mode = <1>;
|
||||||
|
clocks = <&clks IMX6UL_CLK_ENET2_REF>;
|
||||||
|
clock-names = "rmii-ref";
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
@@ -137,8 +137,8 @@ netcp: netcp@26000000 {
|
|||||||
/* NetCP address range */
|
/* NetCP address range */
|
||||||
ranges = <0 0x26000000 0x1000000>;
|
ranges = <0 0x26000000 0x1000000>;
|
||||||
|
|
||||||
clocks = <&clkpa>, <&clkcpgmac>, <&chipclk12>, <&clkosr>;
|
clocks = <&clkpa>, <&clkcpgmac>, <&chipclk12>;
|
||||||
clock-names = "pa_clk", "ethss_clk", "cpts", "osr_clk";
|
clock-names = "pa_clk", "ethss_clk", "cpts";
|
||||||
dma-coherent;
|
dma-coherent;
|
||||||
|
|
||||||
ti,navigator-dmas = <&dma_gbe 0>,
|
ti,navigator-dmas = <&dma_gbe 0>,
|
||||||
|
@@ -232,6 +232,14 @@
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
osr: sram@70000000 {
|
||||||
|
compatible = "mmio-sram";
|
||||||
|
reg = <0x70000000 0x10000>;
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
clocks = <&clkosr>;
|
||||||
|
};
|
||||||
|
|
||||||
dspgpio0: keystone_dsp_gpio@02620240 {
|
dspgpio0: keystone_dsp_gpio@02620240 {
|
||||||
compatible = "ti,keystone-dsp-gpio";
|
compatible = "ti,keystone-dsp-gpio";
|
||||||
gpio-controller;
|
gpio-controller;
|
||||||
|
@@ -558,10 +558,11 @@
|
|||||||
};
|
};
|
||||||
|
|
||||||
r_ccu: clock@1f01400 {
|
r_ccu: clock@1f01400 {
|
||||||
compatible = "allwinner,sun50i-a64-r-ccu";
|
compatible = "allwinner,sun8i-h3-r-ccu";
|
||||||
reg = <0x01f01400 0x100>;
|
reg = <0x01f01400 0x100>;
|
||||||
clocks = <&osc24M>, <&osc32k>, <&iosc>;
|
clocks = <&osc24M>, <&osc32k>, <&iosc>,
|
||||||
clock-names = "hosc", "losc", "iosc";
|
<&ccu 9>;
|
||||||
|
clock-names = "hosc", "losc", "iosc", "pll-periph";
|
||||||
#clock-cells = <1>;
|
#clock-cells = <1>;
|
||||||
#reset-cells = <1>;
|
#reset-cells = <1>;
|
||||||
};
|
};
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
#include <versatile-ab.dts>
|
#include "versatile-ab.dts"
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
model = "ARM Versatile PB";
|
model = "ARM Versatile PB";
|
||||||
|
@@ -235,7 +235,7 @@ int mcpm_cpu_power_up(unsigned int cpu, unsigned int cluster)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef void (*phys_reset_t)(unsigned long);
|
typedef typeof(cpu_reset) phys_reset_t;
|
||||||
|
|
||||||
void mcpm_cpu_power_down(void)
|
void mcpm_cpu_power_down(void)
|
||||||
{
|
{
|
||||||
@@ -300,7 +300,7 @@ void mcpm_cpu_power_down(void)
|
|||||||
* on the CPU.
|
* on the CPU.
|
||||||
*/
|
*/
|
||||||
phys_reset = (phys_reset_t)(unsigned long)__pa_symbol(cpu_reset);
|
phys_reset = (phys_reset_t)(unsigned long)__pa_symbol(cpu_reset);
|
||||||
phys_reset(__pa_symbol(mcpm_entry_point));
|
phys_reset(__pa_symbol(mcpm_entry_point), false);
|
||||||
|
|
||||||
/* should never get here */
|
/* should never get here */
|
||||||
BUG();
|
BUG();
|
||||||
@@ -389,7 +389,7 @@ static int __init nocache_trampoline(unsigned long _arg)
|
|||||||
__mcpm_cpu_down(cpu, cluster);
|
__mcpm_cpu_down(cpu, cluster);
|
||||||
|
|
||||||
phys_reset = (phys_reset_t)(unsigned long)__pa_symbol(cpu_reset);
|
phys_reset = (phys_reset_t)(unsigned long)__pa_symbol(cpu_reset);
|
||||||
phys_reset(__pa_symbol(mcpm_entry_point));
|
phys_reset(__pa_symbol(mcpm_entry_point), false);
|
||||||
BUG();
|
BUG();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -19,7 +19,8 @@ struct dev_archdata {
|
|||||||
#ifdef CONFIG_XEN
|
#ifdef CONFIG_XEN
|
||||||
const struct dma_map_ops *dev_dma_ops;
|
const struct dma_map_ops *dev_dma_ops;
|
||||||
#endif
|
#endif
|
||||||
bool dma_coherent;
|
unsigned int dma_coherent:1;
|
||||||
|
unsigned int dma_ops_setup:1;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct omap_device;
|
struct omap_device;
|
||||||
|
@@ -66,6 +66,7 @@ typedef pte_t *pte_addr_t;
|
|||||||
#define pgprot_noncached(prot) (prot)
|
#define pgprot_noncached(prot) (prot)
|
||||||
#define pgprot_writecombine(prot) (prot)
|
#define pgprot_writecombine(prot) (prot)
|
||||||
#define pgprot_dmacoherent(prot) (prot)
|
#define pgprot_dmacoherent(prot) (prot)
|
||||||
|
#define pgprot_device(prot) (prot)
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -315,7 +315,7 @@ static void __init cacheid_init(void)
|
|||||||
if (arch >= CPU_ARCH_ARMv6) {
|
if (arch >= CPU_ARCH_ARMv6) {
|
||||||
unsigned int cachetype = read_cpuid_cachetype();
|
unsigned int cachetype = read_cpuid_cachetype();
|
||||||
|
|
||||||
if ((arch == CPU_ARCH_ARMv7M) && !cachetype) {
|
if ((arch == CPU_ARCH_ARMv7M) && !(cachetype & 0xf000f)) {
|
||||||
cacheid = 0;
|
cacheid = 0;
|
||||||
} else if ((cachetype & (7 << 29)) == 4 << 29) {
|
} else if ((cachetype & (7 << 29)) == 4 << 29) {
|
||||||
/* ARMv7 register format */
|
/* ARMv7 register format */
|
||||||
|
@@ -104,7 +104,6 @@ __do_hyp_init:
|
|||||||
@ - Write permission implies XN: disabled
|
@ - Write permission implies XN: disabled
|
||||||
@ - Instruction cache: enabled
|
@ - Instruction cache: enabled
|
||||||
@ - Data/Unified cache: enabled
|
@ - Data/Unified cache: enabled
|
||||||
@ - Memory alignment checks: enabled
|
|
||||||
@ - MMU: enabled (this code must be run from an identity mapping)
|
@ - MMU: enabled (this code must be run from an identity mapping)
|
||||||
mrc p15, 4, r0, c1, c0, 0 @ HSCR
|
mrc p15, 4, r0, c1, c0, 0 @ HSCR
|
||||||
ldr r2, =HSCTLR_MASK
|
ldr r2, =HSCTLR_MASK
|
||||||
@@ -112,8 +111,8 @@ __do_hyp_init:
|
|||||||
mrc p15, 0, r1, c1, c0, 0 @ SCTLR
|
mrc p15, 0, r1, c1, c0, 0 @ SCTLR
|
||||||
ldr r2, =(HSCTLR_EE | HSCTLR_FI | HSCTLR_I | HSCTLR_C)
|
ldr r2, =(HSCTLR_EE | HSCTLR_FI | HSCTLR_I | HSCTLR_C)
|
||||||
and r1, r1, r2
|
and r1, r1, r2
|
||||||
ARM( ldr r2, =(HSCTLR_M | HSCTLR_A) )
|
ARM( ldr r2, =(HSCTLR_M) )
|
||||||
THUMB( ldr r2, =(HSCTLR_M | HSCTLR_A | HSCTLR_TE) )
|
THUMB( ldr r2, =(HSCTLR_M | HSCTLR_TE) )
|
||||||
orr r1, r1, r2
|
orr r1, r1, r2
|
||||||
orr r0, r0, r1
|
orr r0, r0, r1
|
||||||
mcr p15, 4, r0, c1, c0, 0 @ HSCR
|
mcr p15, 4, r0, c1, c0, 0 @ HSCR
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
menuconfig ARCH_AT91
|
menuconfig ARCH_AT91
|
||||||
bool "Atmel SoCs"
|
bool "Atmel SoCs"
|
||||||
depends on ARCH_MULTI_V4T || ARCH_MULTI_V5 || ARCH_MULTI_V7
|
depends on ARCH_MULTI_V4T || ARCH_MULTI_V5 || ARCH_MULTI_V7
|
||||||
|
select ARM_CPU_SUSPEND if PM
|
||||||
select COMMON_CLK_AT91
|
select COMMON_CLK_AT91
|
||||||
select GPIOLIB
|
select GPIOLIB
|
||||||
select PINCTRL
|
select PINCTRL
|
||||||
|
@@ -153,7 +153,8 @@ int __init davinci_pm_init(void)
|
|||||||
davinci_sram_suspend = sram_alloc(davinci_cpu_suspend_sz, NULL);
|
davinci_sram_suspend = sram_alloc(davinci_cpu_suspend_sz, NULL);
|
||||||
if (!davinci_sram_suspend) {
|
if (!davinci_sram_suspend) {
|
||||||
pr_err("PM: cannot allocate SRAM memory\n");
|
pr_err("PM: cannot allocate SRAM memory\n");
|
||||||
return -ENOMEM;
|
ret = -ENOMEM;
|
||||||
|
goto no_sram_mem;
|
||||||
}
|
}
|
||||||
|
|
||||||
davinci_sram_push(davinci_sram_suspend, davinci_cpu_suspend,
|
davinci_sram_push(davinci_sram_suspend, davinci_cpu_suspend,
|
||||||
@@ -161,6 +162,10 @@ int __init davinci_pm_init(void)
|
|||||||
|
|
||||||
suspend_set_ops(&davinci_pm_ops);
|
suspend_set_ops(&davinci_pm_ops);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
no_sram_mem:
|
||||||
|
iounmap(pm_config.ddrpsc_reg_base);
|
||||||
no_ddrpsc_mem:
|
no_ddrpsc_mem:
|
||||||
iounmap(pm_config.ddrpll_reg_base);
|
iounmap(pm_config.ddrpll_reg_base);
|
||||||
no_ddrpll_mem:
|
no_ddrpll_mem:
|
||||||
|
@@ -2311,7 +2311,14 @@ int arm_iommu_attach_device(struct device *dev,
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(arm_iommu_attach_device);
|
EXPORT_SYMBOL_GPL(arm_iommu_attach_device);
|
||||||
|
|
||||||
static void __arm_iommu_detach_device(struct device *dev)
|
/**
|
||||||
|
* arm_iommu_detach_device
|
||||||
|
* @dev: valid struct device pointer
|
||||||
|
*
|
||||||
|
* Detaches the provided device from a previously attached map.
|
||||||
|
* This voids the dma operations (dma_map_ops pointer)
|
||||||
|
*/
|
||||||
|
void arm_iommu_detach_device(struct device *dev)
|
||||||
{
|
{
|
||||||
struct dma_iommu_mapping *mapping;
|
struct dma_iommu_mapping *mapping;
|
||||||
|
|
||||||
@@ -2324,22 +2331,10 @@ static void __arm_iommu_detach_device(struct device *dev)
|
|||||||
iommu_detach_device(mapping->domain, dev);
|
iommu_detach_device(mapping->domain, dev);
|
||||||
kref_put(&mapping->kref, release_iommu_mapping);
|
kref_put(&mapping->kref, release_iommu_mapping);
|
||||||
to_dma_iommu_mapping(dev) = NULL;
|
to_dma_iommu_mapping(dev) = NULL;
|
||||||
|
set_dma_ops(dev, NULL);
|
||||||
|
|
||||||
pr_debug("Detached IOMMU controller from %s device.\n", dev_name(dev));
|
pr_debug("Detached IOMMU controller from %s device.\n", dev_name(dev));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* arm_iommu_detach_device
|
|
||||||
* @dev: valid struct device pointer
|
|
||||||
*
|
|
||||||
* Detaches the provided device from a previously attached map.
|
|
||||||
* This voids the dma operations (dma_map_ops pointer)
|
|
||||||
*/
|
|
||||||
void arm_iommu_detach_device(struct device *dev)
|
|
||||||
{
|
|
||||||
__arm_iommu_detach_device(dev);
|
|
||||||
set_dma_ops(dev, NULL);
|
|
||||||
}
|
|
||||||
EXPORT_SYMBOL_GPL(arm_iommu_detach_device);
|
EXPORT_SYMBOL_GPL(arm_iommu_detach_device);
|
||||||
|
|
||||||
static const struct dma_map_ops *arm_get_iommu_dma_map_ops(bool coherent)
|
static const struct dma_map_ops *arm_get_iommu_dma_map_ops(bool coherent)
|
||||||
@@ -2379,7 +2374,7 @@ static void arm_teardown_iommu_dma_ops(struct device *dev)
|
|||||||
if (!mapping)
|
if (!mapping)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
__arm_iommu_detach_device(dev);
|
arm_iommu_detach_device(dev);
|
||||||
arm_iommu_release_mapping(mapping);
|
arm_iommu_release_mapping(mapping);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2430,9 +2425,13 @@ void arch_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,
|
|||||||
dev->dma_ops = xen_dma_ops;
|
dev->dma_ops = xen_dma_ops;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
dev->archdata.dma_ops_setup = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void arch_teardown_dma_ops(struct device *dev)
|
void arch_teardown_dma_ops(struct device *dev)
|
||||||
{
|
{
|
||||||
|
if (!dev->archdata.dma_ops_setup)
|
||||||
|
return;
|
||||||
|
|
||||||
arm_teardown_iommu_dma_ops(dev);
|
arm_teardown_iommu_dma_ops(dev);
|
||||||
}
|
}
|
||||||
|
@@ -90,7 +90,7 @@ arch_get_unmapped_area(struct file *filp, unsigned long addr,
|
|||||||
|
|
||||||
vma = find_vma(mm, addr);
|
vma = find_vma(mm, addr);
|
||||||
if (TASK_SIZE - len >= addr &&
|
if (TASK_SIZE - len >= addr &&
|
||||||
(!vma || addr + len <= vma->vm_start))
|
(!vma || addr + len <= vm_start_gap(vma)))
|
||||||
return addr;
|
return addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -141,7 +141,7 @@ arch_get_unmapped_area_topdown(struct file *filp, const unsigned long addr0,
|
|||||||
addr = PAGE_ALIGN(addr);
|
addr = PAGE_ALIGN(addr);
|
||||||
vma = find_vma(mm, addr);
|
vma = find_vma(mm, addr);
|
||||||
if (TASK_SIZE - len >= addr &&
|
if (TASK_SIZE - len >= addr &&
|
||||||
(!vma || addr + len <= vma->vm_start))
|
(!vma || addr + len <= vm_start_gap(vma)))
|
||||||
return addr;
|
return addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1218,15 +1218,15 @@ void __init adjust_lowmem_bounds(void)
|
|||||||
|
|
||||||
high_memory = __va(arm_lowmem_limit - 1) + 1;
|
high_memory = __va(arm_lowmem_limit - 1) + 1;
|
||||||
|
|
||||||
|
if (!memblock_limit)
|
||||||
|
memblock_limit = arm_lowmem_limit;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Round the memblock limit down to a pmd size. This
|
* Round the memblock limit down to a pmd size. This
|
||||||
* helps to ensure that we will allocate memory from the
|
* helps to ensure that we will allocate memory from the
|
||||||
* last full pmd, which should be mapped.
|
* last full pmd, which should be mapped.
|
||||||
*/
|
*/
|
||||||
if (memblock_limit)
|
memblock_limit = round_down(memblock_limit, PMD_SIZE);
|
||||||
memblock_limit = round_down(memblock_limit, PMD_SIZE);
|
|
||||||
if (!memblock_limit)
|
|
||||||
memblock_limit = arm_lowmem_limit;
|
|
||||||
|
|
||||||
if (!IS_ENABLED(CONFIG_HIGHMEM) || cache_is_vipt_aliasing()) {
|
if (!IS_ENABLED(CONFIG_HIGHMEM) || cache_is_vipt_aliasing()) {
|
||||||
if (memblock_end_of_DRAM() > arm_lowmem_limit) {
|
if (memblock_end_of_DRAM() > arm_lowmem_limit) {
|
||||||
|
@@ -1084,10 +1084,6 @@ config SYSVIPC_COMPAT
|
|||||||
def_bool y
|
def_bool y
|
||||||
depends on COMPAT && SYSVIPC
|
depends on COMPAT && SYSVIPC
|
||||||
|
|
||||||
config KEYS_COMPAT
|
|
||||||
def_bool y
|
|
||||||
depends on COMPAT && KEYS
|
|
||||||
|
|
||||||
endmenu
|
endmenu
|
||||||
|
|
||||||
menu "Power management options"
|
menu "Power management options"
|
||||||
|
@@ -406,8 +406,9 @@
|
|||||||
r_ccu: clock@1f01400 {
|
r_ccu: clock@1f01400 {
|
||||||
compatible = "allwinner,sun50i-a64-r-ccu";
|
compatible = "allwinner,sun50i-a64-r-ccu";
|
||||||
reg = <0x01f01400 0x100>;
|
reg = <0x01f01400 0x100>;
|
||||||
clocks = <&osc24M>, <&osc32k>, <&iosc>;
|
clocks = <&osc24M>, <&osc32k>, <&iosc>,
|
||||||
clock-names = "hosc", "losc", "iosc";
|
<&ccu 11>;
|
||||||
|
clock-names = "hosc", "losc", "iosc", "pll-periph";
|
||||||
#clock-cells = <1>;
|
#clock-cells = <1>;
|
||||||
#reset-cells = <1>;
|
#reset-cells = <1>;
|
||||||
};
|
};
|
||||||
|
@@ -40,7 +40,7 @@
|
|||||||
* OTHER DEALINGS IN THE SOFTWARE.
|
* OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "sunxi-h3-h5.dtsi"
|
#include <arm/sunxi-h3-h5.dtsi>
|
||||||
|
|
||||||
/ {
|
/ {
|
||||||
cpus {
|
cpus {
|
||||||
|
@@ -1 +0,0 @@
|
|||||||
../../../../arm/boot/dts/sunxi-h3-h5.dtsi
|
|
@@ -81,6 +81,45 @@
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
reg_sys_5v: regulator@0 {
|
||||||
|
compatible = "regulator-fixed";
|
||||||
|
regulator-name = "SYS_5V";
|
||||||
|
regulator-min-microvolt = <5000000>;
|
||||||
|
regulator-max-microvolt = <5000000>;
|
||||||
|
regulator-boot-on;
|
||||||
|
regulator-always-on;
|
||||||
|
};
|
||||||
|
|
||||||
|
reg_vdd_3v3: regulator@1 {
|
||||||
|
compatible = "regulator-fixed";
|
||||||
|
regulator-name = "VDD_3V3";
|
||||||
|
regulator-min-microvolt = <3300000>;
|
||||||
|
regulator-max-microvolt = <3300000>;
|
||||||
|
regulator-boot-on;
|
||||||
|
regulator-always-on;
|
||||||
|
vin-supply = <®_sys_5v>;
|
||||||
|
};
|
||||||
|
|
||||||
|
reg_5v_hub: regulator@2 {
|
||||||
|
compatible = "regulator-fixed";
|
||||||
|
regulator-name = "5V_HUB";
|
||||||
|
regulator-min-microvolt = <5000000>;
|
||||||
|
regulator-max-microvolt = <5000000>;
|
||||||
|
regulator-boot-on;
|
||||||
|
gpio = <&gpio0 7 0>;
|
||||||
|
regulator-always-on;
|
||||||
|
vin-supply = <®_sys_5v>;
|
||||||
|
};
|
||||||
|
|
||||||
|
wl1835_pwrseq: wl1835-pwrseq {
|
||||||
|
compatible = "mmc-pwrseq-simple";
|
||||||
|
/* WLAN_EN GPIO */
|
||||||
|
reset-gpios = <&gpio0 5 GPIO_ACTIVE_LOW>;
|
||||||
|
clocks = <&pmic>;
|
||||||
|
clock-names = "ext_clock";
|
||||||
|
power-off-delay-us = <10>;
|
||||||
|
};
|
||||||
|
|
||||||
soc {
|
soc {
|
||||||
spi0: spi@f7106000 {
|
spi0: spi@f7106000 {
|
||||||
status = "ok";
|
status = "ok";
|
||||||
@@ -256,11 +295,31 @@
|
|||||||
|
|
||||||
/* GPIO blocks 16 thru 19 do not appear to be routed to pins */
|
/* GPIO blocks 16 thru 19 do not appear to be routed to pins */
|
||||||
|
|
||||||
dwmmc_2: dwmmc2@f723f000 {
|
dwmmc_0: dwmmc0@f723d000 {
|
||||||
ti,non-removable;
|
cap-mmc-highspeed;
|
||||||
non-removable;
|
non-removable;
|
||||||
/* WL_EN */
|
bus-width = <0x8>;
|
||||||
vmmc-supply = <&wlan_en_reg>;
|
vmmc-supply = <&ldo19>;
|
||||||
|
};
|
||||||
|
|
||||||
|
dwmmc_1: dwmmc1@f723e000 {
|
||||||
|
card-detect-delay = <200>;
|
||||||
|
cap-sd-highspeed;
|
||||||
|
sd-uhs-sdr12;
|
||||||
|
sd-uhs-sdr25;
|
||||||
|
sd-uhs-sdr50;
|
||||||
|
vqmmc-supply = <&ldo7>;
|
||||||
|
vmmc-supply = <&ldo10>;
|
||||||
|
bus-width = <0x4>;
|
||||||
|
disable-wp;
|
||||||
|
cd-gpios = <&gpio1 0 1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
dwmmc_2: dwmmc2@f723f000 {
|
||||||
|
bus-width = <0x4>;
|
||||||
|
non-removable;
|
||||||
|
vmmc-supply = <®_vdd_3v3>;
|
||||||
|
mmc-pwrseq = <&wl1835_pwrseq>;
|
||||||
|
|
||||||
#address-cells = <0x1>;
|
#address-cells = <0x1>;
|
||||||
#size-cells = <0x0>;
|
#size-cells = <0x0>;
|
||||||
@@ -272,18 +331,6 @@
|
|||||||
interrupts = <3 IRQ_TYPE_EDGE_RISING>;
|
interrupts = <3 IRQ_TYPE_EDGE_RISING>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
wlan_en_reg: regulator@1 {
|
|
||||||
compatible = "regulator-fixed";
|
|
||||||
regulator-name = "wlan-en-regulator";
|
|
||||||
regulator-min-microvolt = <1800000>;
|
|
||||||
regulator-max-microvolt = <1800000>;
|
|
||||||
/* WLAN_EN GPIO */
|
|
||||||
gpio = <&gpio0 5 0>;
|
|
||||||
/* WLAN card specific delay */
|
|
||||||
startup-delay-us = <70000>;
|
|
||||||
enable-active-high;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
leds {
|
leds {
|
||||||
@@ -330,6 +377,7 @@
|
|||||||
pmic: pmic@f8000000 {
|
pmic: pmic@f8000000 {
|
||||||
compatible = "hisilicon,hi655x-pmic";
|
compatible = "hisilicon,hi655x-pmic";
|
||||||
reg = <0x0 0xf8000000 0x0 0x1000>;
|
reg = <0x0 0xf8000000 0x0 0x1000>;
|
||||||
|
#clock-cells = <0>;
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#interrupt-cells = <2>;
|
#interrupt-cells = <2>;
|
||||||
pmic-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
|
pmic-gpios = <&gpio1 2 GPIO_ACTIVE_HIGH>;
|
||||||
|
@@ -725,20 +725,10 @@
|
|||||||
status = "disabled";
|
status = "disabled";
|
||||||
};
|
};
|
||||||
|
|
||||||
fixed_5v_hub: regulator@0 {
|
|
||||||
compatible = "regulator-fixed";
|
|
||||||
regulator-name = "fixed_5v_hub";
|
|
||||||
regulator-min-microvolt = <5000000>;
|
|
||||||
regulator-max-microvolt = <5000000>;
|
|
||||||
regulator-boot-on;
|
|
||||||
gpio = <&gpio0 7 0>;
|
|
||||||
regulator-always-on;
|
|
||||||
};
|
|
||||||
|
|
||||||
usb_phy: usbphy {
|
usb_phy: usbphy {
|
||||||
compatible = "hisilicon,hi6220-usb-phy";
|
compatible = "hisilicon,hi6220-usb-phy";
|
||||||
#phy-cells = <0>;
|
#phy-cells = <0>;
|
||||||
phy-supply = <&fixed_5v_hub>;
|
phy-supply = <®_5v_hub>;
|
||||||
hisilicon,peripheral-syscon = <&sys_ctrl>;
|
hisilicon,peripheral-syscon = <&sys_ctrl>;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -766,17 +756,12 @@
|
|||||||
|
|
||||||
dwmmc_0: dwmmc0@f723d000 {
|
dwmmc_0: dwmmc0@f723d000 {
|
||||||
compatible = "hisilicon,hi6220-dw-mshc";
|
compatible = "hisilicon,hi6220-dw-mshc";
|
||||||
num-slots = <0x1>;
|
|
||||||
cap-mmc-highspeed;
|
|
||||||
non-removable;
|
|
||||||
reg = <0x0 0xf723d000 0x0 0x1000>;
|
reg = <0x0 0xf723d000 0x0 0x1000>;
|
||||||
interrupts = <0x0 0x48 0x4>;
|
interrupts = <0x0 0x48 0x4>;
|
||||||
clocks = <&sys_ctrl 2>, <&sys_ctrl 1>;
|
clocks = <&sys_ctrl 2>, <&sys_ctrl 1>;
|
||||||
clock-names = "ciu", "biu";
|
clock-names = "ciu", "biu";
|
||||||
resets = <&sys_ctrl PERIPH_RSTDIS0_MMC0>;
|
resets = <&sys_ctrl PERIPH_RSTDIS0_MMC0>;
|
||||||
reset-names = "reset";
|
reset-names = "reset";
|
||||||
bus-width = <0x8>;
|
|
||||||
vmmc-supply = <&ldo19>;
|
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
pinctrl-0 = <&emmc_pmx_func &emmc_clk_cfg_func
|
pinctrl-0 = <&emmc_pmx_func &emmc_clk_cfg_func
|
||||||
&emmc_cfg_func &emmc_rst_cfg_func>;
|
&emmc_cfg_func &emmc_rst_cfg_func>;
|
||||||
@@ -784,13 +769,7 @@
|
|||||||
|
|
||||||
dwmmc_1: dwmmc1@f723e000 {
|
dwmmc_1: dwmmc1@f723e000 {
|
||||||
compatible = "hisilicon,hi6220-dw-mshc";
|
compatible = "hisilicon,hi6220-dw-mshc";
|
||||||
num-slots = <0x1>;
|
|
||||||
card-detect-delay = <200>;
|
|
||||||
hisilicon,peripheral-syscon = <&ao_ctrl>;
|
hisilicon,peripheral-syscon = <&ao_ctrl>;
|
||||||
cap-sd-highspeed;
|
|
||||||
sd-uhs-sdr12;
|
|
||||||
sd-uhs-sdr25;
|
|
||||||
sd-uhs-sdr50;
|
|
||||||
reg = <0x0 0xf723e000 0x0 0x1000>;
|
reg = <0x0 0xf723e000 0x0 0x1000>;
|
||||||
interrupts = <0x0 0x49 0x4>;
|
interrupts = <0x0 0x49 0x4>;
|
||||||
#address-cells = <0x1>;
|
#address-cells = <0x1>;
|
||||||
@@ -799,11 +778,6 @@
|
|||||||
clock-names = "ciu", "biu";
|
clock-names = "ciu", "biu";
|
||||||
resets = <&sys_ctrl PERIPH_RSTDIS0_MMC1>;
|
resets = <&sys_ctrl PERIPH_RSTDIS0_MMC1>;
|
||||||
reset-names = "reset";
|
reset-names = "reset";
|
||||||
vqmmc-supply = <&ldo7>;
|
|
||||||
vmmc-supply = <&ldo10>;
|
|
||||||
bus-width = <0x4>;
|
|
||||||
disable-wp;
|
|
||||||
cd-gpios = <&gpio1 0 1>;
|
|
||||||
pinctrl-names = "default", "idle";
|
pinctrl-names = "default", "idle";
|
||||||
pinctrl-0 = <&sd_pmx_func &sd_clk_cfg_func &sd_cfg_func>;
|
pinctrl-0 = <&sd_pmx_func &sd_clk_cfg_func &sd_cfg_func>;
|
||||||
pinctrl-1 = <&sd_pmx_idle &sd_clk_cfg_idle &sd_cfg_idle>;
|
pinctrl-1 = <&sd_pmx_idle &sd_clk_cfg_idle &sd_cfg_idle>;
|
||||||
@@ -811,15 +785,12 @@
|
|||||||
|
|
||||||
dwmmc_2: dwmmc2@f723f000 {
|
dwmmc_2: dwmmc2@f723f000 {
|
||||||
compatible = "hisilicon,hi6220-dw-mshc";
|
compatible = "hisilicon,hi6220-dw-mshc";
|
||||||
num-slots = <0x1>;
|
|
||||||
reg = <0x0 0xf723f000 0x0 0x1000>;
|
reg = <0x0 0xf723f000 0x0 0x1000>;
|
||||||
interrupts = <0x0 0x4a 0x4>;
|
interrupts = <0x0 0x4a 0x4>;
|
||||||
clocks = <&sys_ctrl HI6220_MMC2_CIUCLK>, <&sys_ctrl HI6220_MMC2_CLK>;
|
clocks = <&sys_ctrl HI6220_MMC2_CIUCLK>, <&sys_ctrl HI6220_MMC2_CLK>;
|
||||||
clock-names = "ciu", "biu";
|
clock-names = "ciu", "biu";
|
||||||
resets = <&sys_ctrl PERIPH_RSTDIS0_MMC2>;
|
resets = <&sys_ctrl PERIPH_RSTDIS0_MMC2>;
|
||||||
reset-names = "reset";
|
reset-names = "reset";
|
||||||
bus-width = <0x4>;
|
|
||||||
broken-cd;
|
|
||||||
pinctrl-names = "default", "idle";
|
pinctrl-names = "default", "idle";
|
||||||
pinctrl-0 = <&sdio_pmx_func &sdio_clk_cfg_func &sdio_cfg_func>;
|
pinctrl-0 = <&sdio_pmx_func &sdio_clk_cfg_func &sdio_cfg_func>;
|
||||||
pinctrl-1 = <&sdio_pmx_idle &sdio_clk_cfg_idle &sdio_cfg_idle>;
|
pinctrl-1 = <&sdio_pmx_idle &sdio_clk_cfg_idle &sdio_cfg_idle>;
|
||||||
|
@@ -231,8 +231,7 @@
|
|||||||
cpm_crypto: crypto@800000 {
|
cpm_crypto: crypto@800000 {
|
||||||
compatible = "inside-secure,safexcel-eip197";
|
compatible = "inside-secure,safexcel-eip197";
|
||||||
reg = <0x800000 0x200000>;
|
reg = <0x800000 0x200000>;
|
||||||
interrupts = <GIC_SPI 34 (IRQ_TYPE_EDGE_RISING
|
interrupts = <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
| IRQ_TYPE_LEVEL_HIGH)>,
|
|
||||||
<GIC_SPI 54 IRQ_TYPE_LEVEL_HIGH>,
|
<GIC_SPI 54 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
<GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>,
|
<GIC_SPI 55 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
<GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>,
|
<GIC_SPI 56 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
@@ -221,8 +221,7 @@
|
|||||||
cps_crypto: crypto@800000 {
|
cps_crypto: crypto@800000 {
|
||||||
compatible = "inside-secure,safexcel-eip197";
|
compatible = "inside-secure,safexcel-eip197";
|
||||||
reg = <0x800000 0x200000>;
|
reg = <0x800000 0x200000>;
|
||||||
interrupts = <GIC_SPI 34 (IRQ_TYPE_EDGE_RISING
|
interrupts = <GIC_SPI 34 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
| IRQ_TYPE_LEVEL_HIGH)>,
|
|
||||||
<GIC_SPI 278 IRQ_TYPE_LEVEL_HIGH>,
|
<GIC_SPI 278 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
<GIC_SPI 279 IRQ_TYPE_LEVEL_HIGH>,
|
<GIC_SPI 279 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
<GIC_SPI 280 IRQ_TYPE_LEVEL_HIGH>,
|
<GIC_SPI 280 IRQ_TYPE_LEVEL_HIGH>,
|
||||||
|
@@ -68,6 +68,7 @@ CONFIG_PCIE_QCOM=y
|
|||||||
CONFIG_PCIE_ARMADA_8K=y
|
CONFIG_PCIE_ARMADA_8K=y
|
||||||
CONFIG_PCI_AARDVARK=y
|
CONFIG_PCI_AARDVARK=y
|
||||||
CONFIG_PCIE_RCAR=y
|
CONFIG_PCIE_RCAR=y
|
||||||
|
CONFIG_PCIE_ROCKCHIP=m
|
||||||
CONFIG_PCI_HOST_GENERIC=y
|
CONFIG_PCI_HOST_GENERIC=y
|
||||||
CONFIG_PCI_XGENE=y
|
CONFIG_PCI_XGENE=y
|
||||||
CONFIG_ARM64_VA_BITS_48=y
|
CONFIG_ARM64_VA_BITS_48=y
|
||||||
@@ -208,6 +209,8 @@ CONFIG_BRCMFMAC=m
|
|||||||
CONFIG_WL18XX=m
|
CONFIG_WL18XX=m
|
||||||
CONFIG_WLCORE_SDIO=m
|
CONFIG_WLCORE_SDIO=m
|
||||||
CONFIG_INPUT_EVDEV=y
|
CONFIG_INPUT_EVDEV=y
|
||||||
|
CONFIG_KEYBOARD_ADC=m
|
||||||
|
CONFIG_KEYBOARD_CROS_EC=y
|
||||||
CONFIG_KEYBOARD_GPIO=y
|
CONFIG_KEYBOARD_GPIO=y
|
||||||
CONFIG_INPUT_MISC=y
|
CONFIG_INPUT_MISC=y
|
||||||
CONFIG_INPUT_PM8941_PWRKEY=y
|
CONFIG_INPUT_PM8941_PWRKEY=y
|
||||||
@@ -263,6 +266,7 @@ CONFIG_SPI_MESON_SPIFC=m
|
|||||||
CONFIG_SPI_ORION=y
|
CONFIG_SPI_ORION=y
|
||||||
CONFIG_SPI_PL022=y
|
CONFIG_SPI_PL022=y
|
||||||
CONFIG_SPI_QUP=y
|
CONFIG_SPI_QUP=y
|
||||||
|
CONFIG_SPI_ROCKCHIP=y
|
||||||
CONFIG_SPI_S3C64XX=y
|
CONFIG_SPI_S3C64XX=y
|
||||||
CONFIG_SPI_SPIDEV=m
|
CONFIG_SPI_SPIDEV=m
|
||||||
CONFIG_SPMI=y
|
CONFIG_SPMI=y
|
||||||
@@ -292,6 +296,7 @@ CONFIG_THERMAL_GOV_POWER_ALLOCATOR=y
|
|||||||
CONFIG_CPU_THERMAL=y
|
CONFIG_CPU_THERMAL=y
|
||||||
CONFIG_THERMAL_EMULATION=y
|
CONFIG_THERMAL_EMULATION=y
|
||||||
CONFIG_EXYNOS_THERMAL=y
|
CONFIG_EXYNOS_THERMAL=y
|
||||||
|
CONFIG_ROCKCHIP_THERMAL=m
|
||||||
CONFIG_WATCHDOG=y
|
CONFIG_WATCHDOG=y
|
||||||
CONFIG_S3C2410_WATCHDOG=y
|
CONFIG_S3C2410_WATCHDOG=y
|
||||||
CONFIG_MESON_GXBB_WATCHDOG=m
|
CONFIG_MESON_GXBB_WATCHDOG=m
|
||||||
@@ -300,12 +305,14 @@ CONFIG_RENESAS_WDT=y
|
|||||||
CONFIG_BCM2835_WDT=y
|
CONFIG_BCM2835_WDT=y
|
||||||
CONFIG_MFD_CROS_EC=y
|
CONFIG_MFD_CROS_EC=y
|
||||||
CONFIG_MFD_CROS_EC_I2C=y
|
CONFIG_MFD_CROS_EC_I2C=y
|
||||||
|
CONFIG_MFD_CROS_EC_SPI=y
|
||||||
CONFIG_MFD_EXYNOS_LPASS=m
|
CONFIG_MFD_EXYNOS_LPASS=m
|
||||||
CONFIG_MFD_HI655X_PMIC=y
|
CONFIG_MFD_HI655X_PMIC=y
|
||||||
CONFIG_MFD_MAX77620=y
|
CONFIG_MFD_MAX77620=y
|
||||||
CONFIG_MFD_SPMI_PMIC=y
|
CONFIG_MFD_SPMI_PMIC=y
|
||||||
CONFIG_MFD_RK808=y
|
CONFIG_MFD_RK808=y
|
||||||
CONFIG_MFD_SEC_CORE=y
|
CONFIG_MFD_SEC_CORE=y
|
||||||
|
CONFIG_REGULATOR_FAN53555=y
|
||||||
CONFIG_REGULATOR_FIXED_VOLTAGE=y
|
CONFIG_REGULATOR_FIXED_VOLTAGE=y
|
||||||
CONFIG_REGULATOR_GPIO=y
|
CONFIG_REGULATOR_GPIO=y
|
||||||
CONFIG_REGULATOR_HI655X=y
|
CONFIG_REGULATOR_HI655X=y
|
||||||
@@ -473,8 +480,10 @@ CONFIG_ARCH_TEGRA_186_SOC=y
|
|||||||
CONFIG_EXTCON_USB_GPIO=y
|
CONFIG_EXTCON_USB_GPIO=y
|
||||||
CONFIG_IIO=y
|
CONFIG_IIO=y
|
||||||
CONFIG_EXYNOS_ADC=y
|
CONFIG_EXYNOS_ADC=y
|
||||||
|
CONFIG_ROCKCHIP_SARADC=m
|
||||||
CONFIG_PWM=y
|
CONFIG_PWM=y
|
||||||
CONFIG_PWM_BCM2835=m
|
CONFIG_PWM_BCM2835=m
|
||||||
|
CONFIG_PWM_CROS_EC=m
|
||||||
CONFIG_PWM_MESON=m
|
CONFIG_PWM_MESON=m
|
||||||
CONFIG_PWM_ROCKCHIP=y
|
CONFIG_PWM_ROCKCHIP=y
|
||||||
CONFIG_PWM_SAMSUNG=y
|
CONFIG_PWM_SAMSUNG=y
|
||||||
@@ -484,6 +493,7 @@ CONFIG_PHY_HI6220_USB=y
|
|||||||
CONFIG_PHY_SUN4I_USB=y
|
CONFIG_PHY_SUN4I_USB=y
|
||||||
CONFIG_PHY_ROCKCHIP_INNO_USB2=y
|
CONFIG_PHY_ROCKCHIP_INNO_USB2=y
|
||||||
CONFIG_PHY_ROCKCHIP_EMMC=y
|
CONFIG_PHY_ROCKCHIP_EMMC=y
|
||||||
|
CONFIG_PHY_ROCKCHIP_PCIE=m
|
||||||
CONFIG_PHY_XGENE=y
|
CONFIG_PHY_XGENE=y
|
||||||
CONFIG_PHY_TEGRA_XUSB=y
|
CONFIG_PHY_TEGRA_XUSB=y
|
||||||
CONFIG_ARM_SCPI_PROTOCOL=y
|
CONFIG_ARM_SCPI_PROTOCOL=y
|
||||||
|
@@ -23,9 +23,9 @@
|
|||||||
#define ACPI_MADT_GICC_LENGTH \
|
#define ACPI_MADT_GICC_LENGTH \
|
||||||
(acpi_gbl_FADT.header.revision < 6 ? 76 : 80)
|
(acpi_gbl_FADT.header.revision < 6 ? 76 : 80)
|
||||||
|
|
||||||
#define BAD_MADT_GICC_ENTRY(entry, end) \
|
#define BAD_MADT_GICC_ENTRY(entry, end) \
|
||||||
(!(entry) || (unsigned long)(entry) + sizeof(*(entry)) > (end) || \
|
(!(entry) || (entry)->header.length != ACPI_MADT_GICC_LENGTH || \
|
||||||
(entry)->header.length != ACPI_MADT_GICC_LENGTH)
|
(unsigned long)(entry) + ACPI_MADT_GICC_LENGTH > (end))
|
||||||
|
|
||||||
/* Basic configuration for ACPI */
|
/* Basic configuration for ACPI */
|
||||||
#ifdef CONFIG_ACPI
|
#ifdef CONFIG_ACPI
|
||||||
|
@@ -286,6 +286,10 @@
|
|||||||
#define SCTLR_ELx_A (1 << 1)
|
#define SCTLR_ELx_A (1 << 1)
|
||||||
#define SCTLR_ELx_M 1
|
#define SCTLR_ELx_M 1
|
||||||
|
|
||||||
|
#define SCTLR_EL2_RES1 ((1 << 4) | (1 << 5) | (1 << 11) | (1 << 16) | \
|
||||||
|
(1 << 16) | (1 << 18) | (1 << 22) | (1 << 23) | \
|
||||||
|
(1 << 28) | (1 << 29))
|
||||||
|
|
||||||
#define SCTLR_ELx_FLAGS (SCTLR_ELx_M | SCTLR_ELx_A | SCTLR_ELx_C | \
|
#define SCTLR_ELx_FLAGS (SCTLR_ELx_M | SCTLR_ELx_A | SCTLR_ELx_C | \
|
||||||
SCTLR_ELx_SA | SCTLR_ELx_I)
|
SCTLR_ELx_SA | SCTLR_ELx_I)
|
||||||
|
|
||||||
|
@@ -191,8 +191,10 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)
|
|||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
root_ops = kzalloc_node(sizeof(*root_ops), GFP_KERNEL, node);
|
root_ops = kzalloc_node(sizeof(*root_ops), GFP_KERNEL, node);
|
||||||
if (!root_ops)
|
if (!root_ops) {
|
||||||
|
kfree(ri);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
ri->cfg = pci_acpi_setup_ecam_mapping(root);
|
ri->cfg = pci_acpi_setup_ecam_mapping(root);
|
||||||
if (!ri->cfg) {
|
if (!ri->cfg) {
|
||||||
|
@@ -221,10 +221,11 @@ void update_vsyscall(struct timekeeper *tk)
|
|||||||
/* tkr_mono.cycle_last == tkr_raw.cycle_last */
|
/* tkr_mono.cycle_last == tkr_raw.cycle_last */
|
||||||
vdso_data->cs_cycle_last = tk->tkr_mono.cycle_last;
|
vdso_data->cs_cycle_last = tk->tkr_mono.cycle_last;
|
||||||
vdso_data->raw_time_sec = tk->raw_time.tv_sec;
|
vdso_data->raw_time_sec = tk->raw_time.tv_sec;
|
||||||
vdso_data->raw_time_nsec = tk->raw_time.tv_nsec;
|
vdso_data->raw_time_nsec = (tk->raw_time.tv_nsec <<
|
||||||
|
tk->tkr_raw.shift) +
|
||||||
|
tk->tkr_raw.xtime_nsec;
|
||||||
vdso_data->xtime_clock_sec = tk->xtime_sec;
|
vdso_data->xtime_clock_sec = tk->xtime_sec;
|
||||||
vdso_data->xtime_clock_nsec = tk->tkr_mono.xtime_nsec;
|
vdso_data->xtime_clock_nsec = tk->tkr_mono.xtime_nsec;
|
||||||
/* tkr_raw.xtime_nsec == 0 */
|
|
||||||
vdso_data->cs_mono_mult = tk->tkr_mono.mult;
|
vdso_data->cs_mono_mult = tk->tkr_mono.mult;
|
||||||
vdso_data->cs_raw_mult = tk->tkr_raw.mult;
|
vdso_data->cs_raw_mult = tk->tkr_raw.mult;
|
||||||
/* tkr_mono.shift == tkr_raw.shift */
|
/* tkr_mono.shift == tkr_raw.shift */
|
||||||
|
@@ -256,7 +256,6 @@ monotonic_raw:
|
|||||||
seqcnt_check fail=monotonic_raw
|
seqcnt_check fail=monotonic_raw
|
||||||
|
|
||||||
/* All computations are done with left-shifted nsecs. */
|
/* All computations are done with left-shifted nsecs. */
|
||||||
lsl x14, x14, x12
|
|
||||||
get_nsec_per_sec res=x9
|
get_nsec_per_sec res=x9
|
||||||
lsl x9, x9, x12
|
lsl x9, x9, x12
|
||||||
|
|
||||||
|
@@ -106,10 +106,13 @@ __do_hyp_init:
|
|||||||
tlbi alle2
|
tlbi alle2
|
||||||
dsb sy
|
dsb sy
|
||||||
|
|
||||||
mrs x4, sctlr_el2
|
/*
|
||||||
and x4, x4, #SCTLR_ELx_EE // preserve endianness of EL2
|
* Preserve all the RES1 bits while setting the default flags,
|
||||||
ldr x5, =SCTLR_ELx_FLAGS
|
* as well as the EE bit on BE. Drop the A flag since the compiler
|
||||||
orr x4, x4, x5
|
* is allowed to generate unaligned accesses.
|
||||||
|
*/
|
||||||
|
ldr x4, =(SCTLR_EL2_RES1 | (SCTLR_ELx_FLAGS & ~SCTLR_ELx_A))
|
||||||
|
CPU_BE( orr x4, x4, #SCTLR_ELx_EE)
|
||||||
msr sctlr_el2, x4
|
msr sctlr_el2, x4
|
||||||
isb
|
isb
|
||||||
|
|
||||||
|
@@ -65,8 +65,8 @@ static bool access_gic_ctlr(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
|
|||||||
* Here set VMCR.CTLR in ICC_CTLR_EL1 layout.
|
* Here set VMCR.CTLR in ICC_CTLR_EL1 layout.
|
||||||
* The vgic_set_vmcr() will convert to ICH_VMCR layout.
|
* The vgic_set_vmcr() will convert to ICH_VMCR layout.
|
||||||
*/
|
*/
|
||||||
vmcr.ctlr = val & ICC_CTLR_EL1_CBPR_MASK;
|
vmcr.cbpr = (val & ICC_CTLR_EL1_CBPR_MASK) >> ICC_CTLR_EL1_CBPR_SHIFT;
|
||||||
vmcr.ctlr |= val & ICC_CTLR_EL1_EOImode_MASK;
|
vmcr.eoim = (val & ICC_CTLR_EL1_EOImode_MASK) >> ICC_CTLR_EL1_EOImode_SHIFT;
|
||||||
vgic_set_vmcr(vcpu, &vmcr);
|
vgic_set_vmcr(vcpu, &vmcr);
|
||||||
} else {
|
} else {
|
||||||
val = 0;
|
val = 0;
|
||||||
@@ -83,8 +83,8 @@ static bool access_gic_ctlr(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
|
|||||||
* The VMCR.CTLR value is in ICC_CTLR_EL1 layout.
|
* The VMCR.CTLR value is in ICC_CTLR_EL1 layout.
|
||||||
* Extract it directly using ICC_CTLR_EL1 reg definitions.
|
* Extract it directly using ICC_CTLR_EL1 reg definitions.
|
||||||
*/
|
*/
|
||||||
val |= vmcr.ctlr & ICC_CTLR_EL1_CBPR_MASK;
|
val |= (vmcr.cbpr << ICC_CTLR_EL1_CBPR_SHIFT) & ICC_CTLR_EL1_CBPR_MASK;
|
||||||
val |= vmcr.ctlr & ICC_CTLR_EL1_EOImode_MASK;
|
val |= (vmcr.eoim << ICC_CTLR_EL1_EOImode_SHIFT) & ICC_CTLR_EL1_EOImode_MASK;
|
||||||
|
|
||||||
p->regval = val;
|
p->regval = val;
|
||||||
}
|
}
|
||||||
@@ -135,7 +135,7 @@ static bool access_gic_bpr1(struct kvm_vcpu *vcpu, struct sys_reg_params *p,
|
|||||||
p->regval = 0;
|
p->regval = 0;
|
||||||
|
|
||||||
vgic_get_vmcr(vcpu, &vmcr);
|
vgic_get_vmcr(vcpu, &vmcr);
|
||||||
if (!((vmcr.ctlr & ICH_VMCR_CBPR_MASK) >> ICH_VMCR_CBPR_SHIFT)) {
|
if (!vmcr.cbpr) {
|
||||||
if (p->is_write) {
|
if (p->is_write) {
|
||||||
vmcr.abpr = (p->regval & ICC_BPR1_EL1_MASK) >>
|
vmcr.abpr = (p->regval & ICC_BPR1_EL1_MASK) >>
|
||||||
ICC_BPR1_EL1_SHIFT;
|
ICC_BPR1_EL1_SHIFT;
|
||||||
|
@@ -36,6 +36,7 @@ int bpf_jit_enable __read_mostly;
|
|||||||
#define TMP_REG_1 (MAX_BPF_JIT_REG + 0)
|
#define TMP_REG_1 (MAX_BPF_JIT_REG + 0)
|
||||||
#define TMP_REG_2 (MAX_BPF_JIT_REG + 1)
|
#define TMP_REG_2 (MAX_BPF_JIT_REG + 1)
|
||||||
#define TCALL_CNT (MAX_BPF_JIT_REG + 2)
|
#define TCALL_CNT (MAX_BPF_JIT_REG + 2)
|
||||||
|
#define TMP_REG_3 (MAX_BPF_JIT_REG + 3)
|
||||||
|
|
||||||
/* Map BPF registers to A64 registers */
|
/* Map BPF registers to A64 registers */
|
||||||
static const int bpf2a64[] = {
|
static const int bpf2a64[] = {
|
||||||
@@ -57,6 +58,7 @@ static const int bpf2a64[] = {
|
|||||||
/* temporary registers for internal BPF JIT */
|
/* temporary registers for internal BPF JIT */
|
||||||
[TMP_REG_1] = A64_R(10),
|
[TMP_REG_1] = A64_R(10),
|
||||||
[TMP_REG_2] = A64_R(11),
|
[TMP_REG_2] = A64_R(11),
|
||||||
|
[TMP_REG_3] = A64_R(12),
|
||||||
/* tail_call_cnt */
|
/* tail_call_cnt */
|
||||||
[TCALL_CNT] = A64_R(26),
|
[TCALL_CNT] = A64_R(26),
|
||||||
/* temporary register for blinding constants */
|
/* temporary register for blinding constants */
|
||||||
@@ -319,6 +321,7 @@ static int build_insn(const struct bpf_insn *insn, struct jit_ctx *ctx)
|
|||||||
const u8 src = bpf2a64[insn->src_reg];
|
const u8 src = bpf2a64[insn->src_reg];
|
||||||
const u8 tmp = bpf2a64[TMP_REG_1];
|
const u8 tmp = bpf2a64[TMP_REG_1];
|
||||||
const u8 tmp2 = bpf2a64[TMP_REG_2];
|
const u8 tmp2 = bpf2a64[TMP_REG_2];
|
||||||
|
const u8 tmp3 = bpf2a64[TMP_REG_3];
|
||||||
const s16 off = insn->off;
|
const s16 off = insn->off;
|
||||||
const s32 imm = insn->imm;
|
const s32 imm = insn->imm;
|
||||||
const int i = insn - ctx->prog->insnsi;
|
const int i = insn - ctx->prog->insnsi;
|
||||||
@@ -689,10 +692,10 @@ emit_cond_jmp:
|
|||||||
emit(A64_PRFM(tmp, PST, L1, STRM), ctx);
|
emit(A64_PRFM(tmp, PST, L1, STRM), ctx);
|
||||||
emit(A64_LDXR(isdw, tmp2, tmp), ctx);
|
emit(A64_LDXR(isdw, tmp2, tmp), ctx);
|
||||||
emit(A64_ADD(isdw, tmp2, tmp2, src), ctx);
|
emit(A64_ADD(isdw, tmp2, tmp2, src), ctx);
|
||||||
emit(A64_STXR(isdw, tmp2, tmp, tmp2), ctx);
|
emit(A64_STXR(isdw, tmp2, tmp, tmp3), ctx);
|
||||||
jmp_offset = -3;
|
jmp_offset = -3;
|
||||||
check_imm19(jmp_offset);
|
check_imm19(jmp_offset);
|
||||||
emit(A64_CBNZ(0, tmp2, jmp_offset), ctx);
|
emit(A64_CBNZ(0, tmp3, jmp_offset), ctx);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
/* R0 = ntohx(*(size *)(((struct sk_buff *)R6)->data + imm)) */
|
/* R0 = ntohx(*(size *)(((struct sk_buff *)R6)->data + imm)) */
|
||||||
|
@@ -75,11 +75,6 @@ static inline void release_thread(struct task_struct *dead_task)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Return saved PC of a blocked thread.
|
|
||||||
*/
|
|
||||||
#define thread_saved_pc(tsk) (tsk->thread.pc)
|
|
||||||
|
|
||||||
unsigned long get_wchan(struct task_struct *p);
|
unsigned long get_wchan(struct task_struct *p);
|
||||||
|
|
||||||
#define KSTK_EIP(tsk) \
|
#define KSTK_EIP(tsk) \
|
||||||
|
@@ -95,11 +95,6 @@ static inline void release_thread(struct task_struct *dead_task)
|
|||||||
#define copy_segments(tsk, mm) do { } while (0)
|
#define copy_segments(tsk, mm) do { } while (0)
|
||||||
#define release_segments(mm) do { } while (0)
|
#define release_segments(mm) do { } while (0)
|
||||||
|
|
||||||
/*
|
|
||||||
* saved PC of a blocked thread.
|
|
||||||
*/
|
|
||||||
#define thread_saved_pc(tsk) (task_pt_regs(tsk)->pc)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* saved kernel SP and DP of a blocked thread.
|
* saved kernel SP and DP of a blocked thread.
|
||||||
*/
|
*/
|
||||||
|
@@ -69,14 +69,6 @@ void hard_reset_now (void)
|
|||||||
while(1) /* waiting for RETRIBUTION! */ ;
|
while(1) /* waiting for RETRIBUTION! */ ;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Return saved PC of a blocked thread.
|
|
||||||
*/
|
|
||||||
unsigned long thread_saved_pc(struct task_struct *t)
|
|
||||||
{
|
|
||||||
return task_pt_regs(t)->irp;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* setup the child's kernel stack with a pt_regs and switch_stack on it.
|
/* setup the child's kernel stack with a pt_regs and switch_stack on it.
|
||||||
* it will be un-nested during _resume and _ret_from_sys_call when the
|
* it will be un-nested during _resume and _ret_from_sys_call when the
|
||||||
* new thread is scheduled.
|
* new thread is scheduled.
|
||||||
|
@@ -84,14 +84,6 @@ hard_reset_now(void)
|
|||||||
; /* Wait for reset. */
|
; /* Wait for reset. */
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Return saved PC of a blocked thread.
|
|
||||||
*/
|
|
||||||
unsigned long thread_saved_pc(struct task_struct *t)
|
|
||||||
{
|
|
||||||
return task_pt_regs(t)->erp;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Setup the child's kernel stack with a pt_regs and call switch_stack() on it.
|
* Setup the child's kernel stack with a pt_regs and call switch_stack() on it.
|
||||||
* It will be unnested during _resume and _ret_from_sys_call when the new thread
|
* It will be unnested during _resume and _ret_from_sys_call when the new thread
|
||||||
|
@@ -52,8 +52,6 @@ unsigned long get_wchan(struct task_struct *p);
|
|||||||
|
|
||||||
#define KSTK_ESP(tsk) ((tsk) == current ? rdusp() : (tsk)->thread.usp)
|
#define KSTK_ESP(tsk) ((tsk) == current ? rdusp() : (tsk)->thread.usp)
|
||||||
|
|
||||||
extern unsigned long thread_saved_pc(struct task_struct *tsk);
|
|
||||||
|
|
||||||
/* Free all resources held by a thread. */
|
/* Free all resources held by a thread. */
|
||||||
static inline void release_thread(struct task_struct *dead_task)
|
static inline void release_thread(struct task_struct *dead_task)
|
||||||
{
|
{
|
||||||
|
@@ -96,11 +96,6 @@ extern asmlinkage void *restore_user_regs(const struct user_context *target, ...
|
|||||||
#define release_segments(mm) do { } while (0)
|
#define release_segments(mm) do { } while (0)
|
||||||
#define forget_segments() do { } while (0)
|
#define forget_segments() do { } while (0)
|
||||||
|
|
||||||
/*
|
|
||||||
* Return saved PC of a blocked thread.
|
|
||||||
*/
|
|
||||||
extern unsigned long thread_saved_pc(struct task_struct *tsk);
|
|
||||||
|
|
||||||
unsigned long get_wchan(struct task_struct *p);
|
unsigned long get_wchan(struct task_struct *p);
|
||||||
|
|
||||||
#define KSTK_EIP(tsk) ((tsk)->thread.frame0->pc)
|
#define KSTK_EIP(tsk) ((tsk)->thread.frame0->pc)
|
||||||
|
@@ -16,5 +16,11 @@ static inline cycles_t get_cycles(void)
|
|||||||
#define vxtime_lock() do {} while (0)
|
#define vxtime_lock() do {} while (0)
|
||||||
#define vxtime_unlock() do {} while (0)
|
#define vxtime_unlock() do {} while (0)
|
||||||
|
|
||||||
|
/* This attribute is used in include/linux/jiffies.h alongside with
|
||||||
|
* __cacheline_aligned_in_smp. It is assumed that __cacheline_aligned_in_smp
|
||||||
|
* for frv does not contain another section specification.
|
||||||
|
*/
|
||||||
|
#define __jiffy_arch_data __attribute__((__section__(".data")))
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -198,15 +198,6 @@ unsigned long get_wchan(struct task_struct *p)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long thread_saved_pc(struct task_struct *tsk)
|
|
||||||
{
|
|
||||||
/* Check whether the thread is blocked in resume() */
|
|
||||||
if (in_sched_functions(tsk->thread.pc))
|
|
||||||
return ((unsigned long *)tsk->thread.fp)[2];
|
|
||||||
else
|
|
||||||
return tsk->thread.pc;
|
|
||||||
}
|
|
||||||
|
|
||||||
int elf_check_arch(const struct elf32_hdr *hdr)
|
int elf_check_arch(const struct elf32_hdr *hdr)
|
||||||
{
|
{
|
||||||
unsigned long hsr0 = __get_HSR(0);
|
unsigned long hsr0 = __get_HSR(0);
|
||||||
|
@@ -75,7 +75,7 @@ unsigned long arch_get_unmapped_area(struct file *filp, unsigned long addr, unsi
|
|||||||
addr = PAGE_ALIGN(addr);
|
addr = PAGE_ALIGN(addr);
|
||||||
vma = find_vma(current->mm, addr);
|
vma = find_vma(current->mm, addr);
|
||||||
if (TASK_SIZE - len >= addr &&
|
if (TASK_SIZE - len >= addr &&
|
||||||
(!vma || addr + len <= vma->vm_start))
|
(!vma || addr + len <= vm_start_gap(vma)))
|
||||||
goto success;
|
goto success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -110,10 +110,6 @@ static inline void release_thread(struct task_struct *dead_task)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Return saved PC of a blocked thread.
|
|
||||||
*/
|
|
||||||
unsigned long thread_saved_pc(struct task_struct *tsk);
|
|
||||||
unsigned long get_wchan(struct task_struct *p);
|
unsigned long get_wchan(struct task_struct *p);
|
||||||
|
|
||||||
#define KSTK_EIP(tsk) \
|
#define KSTK_EIP(tsk) \
|
||||||
|
@@ -129,11 +129,6 @@ int copy_thread(unsigned long clone_flags,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned long thread_saved_pc(struct task_struct *tsk)
|
|
||||||
{
|
|
||||||
return ((struct pt_regs *)tsk->thread.esp0)->pc;
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned long get_wchan(struct task_struct *p)
|
unsigned long get_wchan(struct task_struct *p)
|
||||||
{
|
{
|
||||||
unsigned long fp, pc;
|
unsigned long fp, pc;
|
||||||
|
@@ -33,9 +33,6 @@
|
|||||||
/* task_struct, defined elsewhere, is the "process descriptor" */
|
/* task_struct, defined elsewhere, is the "process descriptor" */
|
||||||
struct task_struct;
|
struct task_struct;
|
||||||
|
|
||||||
/* this is defined in arch/process.c */
|
|
||||||
extern unsigned long thread_saved_pc(struct task_struct *tsk);
|
|
||||||
|
|
||||||
extern void start_thread(struct pt_regs *, unsigned long, unsigned long);
|
extern void start_thread(struct pt_regs *, unsigned long, unsigned long);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -60,14 +60,6 @@ void arch_cpu_idle(void)
|
|||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Return saved PC of a blocked thread
|
|
||||||
*/
|
|
||||||
unsigned long thread_saved_pc(struct task_struct *tsk)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Copy architecture-specific thread state
|
* Copy architecture-specific thread state
|
||||||
*/
|
*/
|
||||||
|
@@ -37,15 +37,14 @@ __kernel_size_t __clear_user_hexagon(void __user *dest, unsigned long count)
|
|||||||
long uncleared;
|
long uncleared;
|
||||||
|
|
||||||
while (count > PAGE_SIZE) {
|
while (count > PAGE_SIZE) {
|
||||||
uncleared = __copy_to_user_hexagon(dest, &empty_zero_page,
|
uncleared = raw_copy_to_user(dest, &empty_zero_page, PAGE_SIZE);
|
||||||
PAGE_SIZE);
|
|
||||||
if (uncleared)
|
if (uncleared)
|
||||||
return count - (PAGE_SIZE - uncleared);
|
return count - (PAGE_SIZE - uncleared);
|
||||||
count -= PAGE_SIZE;
|
count -= PAGE_SIZE;
|
||||||
dest += PAGE_SIZE;
|
dest += PAGE_SIZE;
|
||||||
}
|
}
|
||||||
if (count)
|
if (count)
|
||||||
count = __copy_to_user_hexagon(dest, &empty_zero_page, count);
|
count = raw_copy_to_user(dest, &empty_zero_page, count);
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
@@ -601,23 +601,6 @@ ia64_set_unat (__u64 *unat, void *spill_addr, unsigned long nat)
|
|||||||
*unat = (*unat & ~mask) | (nat << bit);
|
*unat = (*unat & ~mask) | (nat << bit);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Return saved PC of a blocked thread.
|
|
||||||
* Note that the only way T can block is through a call to schedule() -> switch_to().
|
|
||||||
*/
|
|
||||||
static inline unsigned long
|
|
||||||
thread_saved_pc (struct task_struct *t)
|
|
||||||
{
|
|
||||||
struct unw_frame_info info;
|
|
||||||
unsigned long ip;
|
|
||||||
|
|
||||||
unw_init_from_blocked_task(&info, t);
|
|
||||||
if (unw_unwind(&info) < 0)
|
|
||||||
return 0;
|
|
||||||
unw_get_ip(&info, &ip);
|
|
||||||
return ip;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get the current instruction/program counter value.
|
* Get the current instruction/program counter value.
|
||||||
*/
|
*/
|
||||||
|
@@ -122,8 +122,6 @@ extern void release_thread(struct task_struct *);
|
|||||||
extern void copy_segments(struct task_struct *p, struct mm_struct * mm);
|
extern void copy_segments(struct task_struct *p, struct mm_struct * mm);
|
||||||
extern void release_segments(struct mm_struct * mm);
|
extern void release_segments(struct mm_struct * mm);
|
||||||
|
|
||||||
extern unsigned long thread_saved_pc(struct task_struct *);
|
|
||||||
|
|
||||||
/* Copy and release all segment info associated with a VM */
|
/* Copy and release all segment info associated with a VM */
|
||||||
#define copy_segments(p, mm) do { } while (0)
|
#define copy_segments(p, mm) do { } while (0)
|
||||||
#define release_segments(mm) do { } while (0)
|
#define release_segments(mm) do { } while (0)
|
||||||
|
@@ -39,14 +39,6 @@
|
|||||||
|
|
||||||
#include <linux/err.h>
|
#include <linux/err.h>
|
||||||
|
|
||||||
/*
|
|
||||||
* Return saved PC of a blocked thread.
|
|
||||||
*/
|
|
||||||
unsigned long thread_saved_pc(struct task_struct *tsk)
|
|
||||||
{
|
|
||||||
return tsk->thread.lr;
|
|
||||||
}
|
|
||||||
|
|
||||||
void (*pm_power_off)(void) = NULL;
|
void (*pm_power_off)(void) = NULL;
|
||||||
EXPORT_SYMBOL(pm_power_off);
|
EXPORT_SYMBOL(pm_power_off);
|
||||||
|
|
||||||
|
@@ -130,8 +130,6 @@ static inline void release_thread(struct task_struct *dead_task)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
extern unsigned long thread_saved_pc(struct task_struct *tsk);
|
|
||||||
|
|
||||||
unsigned long get_wchan(struct task_struct *p);
|
unsigned long get_wchan(struct task_struct *p);
|
||||||
|
|
||||||
#define KSTK_EIP(tsk) \
|
#define KSTK_EIP(tsk) \
|
||||||
|
@@ -40,20 +40,6 @@
|
|||||||
asmlinkage void ret_from_fork(void);
|
asmlinkage void ret_from_fork(void);
|
||||||
asmlinkage void ret_from_kernel_thread(void);
|
asmlinkage void ret_from_kernel_thread(void);
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Return saved PC from a blocked thread
|
|
||||||
*/
|
|
||||||
unsigned long thread_saved_pc(struct task_struct *tsk)
|
|
||||||
{
|
|
||||||
struct switch_stack *sw = (struct switch_stack *)tsk->thread.ksp;
|
|
||||||
/* Check whether the thread is blocked in resume() */
|
|
||||||
if (in_sched_functions(sw->retpc))
|
|
||||||
return ((unsigned long *)sw->a6)[1];
|
|
||||||
else
|
|
||||||
return sw->retpc;
|
|
||||||
}
|
|
||||||
|
|
||||||
void arch_cpu_idle(void)
|
void arch_cpu_idle(void)
|
||||||
{
|
{
|
||||||
#if defined(MACH_ATARI_ONLY)
|
#if defined(MACH_ATARI_ONLY)
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user