irqchip updates for 5.2

- The huge (and terrifying) TI INTR/INTA set of drivers
 - Rewrite of the stm32mp1-exti driver as a platform driver
 - Update the IOMMU MSI mapping API to be RT friendly
 - A number of cleanups and other low impact fixes
 -----BEGIN PGP SIGNATURE-----
 
 iQJJBAABCgAzFiEEn9UcU+C1Yxj9lZw9I9DQutE9ekMFAlzMUswVHG1hcmMuenlu
 Z2llckBhcm0uY29tAAoJECPQ0LrRPXpDOUUQALpVvlxPA2jXmlYTZ9/1I4ehSv78
 SFHsLHybvbdt0+zZDQE6wIS/OWc8fi8LRHtUCkNOygWMk8Ae8D8IeC6VwbPxhbQa
 RNvIULOC7RqapcWXmF3pYz+tfJehLPSmfTG3yGczXyMHSF6ypHKxX8+RIr6ZCeqH
 U2XVa7ELhWxeTuA52oxEiGymPGBZTEcMGcgGzhRxmDE9GVRw5XWrnKsG0nNCklMK
 DSKPoUtmKny42LIfVAFgS2PD081IRRQZII/j/mbA/NG5KNNQutmkZLJgFywjeJxu
 AOhYHmBiqyEfQs5S02i0GXMUITBvWsi9dPgjnwd2aRsPQ8nzXx2mUH4FQz9fqmHt
 ZxGsE1rLYlB0BS2h1Ap4bpHDjsgx/MvPYdarkN966/T6DHM6UYfdx9wnkVtH3oLJ
 Lg4UT+MWbz2f70JJ1jy5NWMDLVEyL7ERoZLivhxouXqAuGK7x3BUFPXXwTbep7Me
 E+N45kYycryCUjrt12EQ7PX/1W7KXe9Z7UX63VUsGmCxaPDgZ5T/ofybD4vJEIQ0
 fyaOK9jxBuTeVokFecCMxacWfRtQ3trLljlEJY5/1NZMXEmLwFbo0sy7458zIoss
 aTV+bk+N+xrGERRpswjGhhdRxjM41EcoiuJs52L9EL1IB/50ye6ENOPtGIDfuWXT
 XEm5jXGM4TVTOkf/
 =vP2/
 -----END PGP SIGNATURE-----

Merge tag 'irqchip-5.2' of git://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms into irq/core

Pull irqchip updates from Marc Zyngier

- The huge (and terrifying) TI INTR/INTA set of drivers
- Rewrite of the stm32mp1-exti driver as a platform driver
- Update the IOMMU MSI mapping API to be RT friendly
- A number of cleanups and other low impact fixes
This commit is contained in:
Thomas Gleixner 2019-05-06 12:04:12 +02:00
commit fb4e059265
1057 changed files with 13788 additions and 10351 deletions

View File

@ -78,6 +78,8 @@ ForEachMacros:
- 'ata_qc_for_each_with_internal' - 'ata_qc_for_each_with_internal'
- 'ax25_for_each' - 'ax25_for_each'
- 'ax25_uid_for_each' - 'ax25_uid_for_each'
- '__bio_for_each_bvec'
- 'bio_for_each_bvec'
- 'bio_for_each_integrity_vec' - 'bio_for_each_integrity_vec'
- '__bio_for_each_segment' - '__bio_for_each_segment'
- 'bio_for_each_segment' - 'bio_for_each_segment'
@ -118,10 +120,12 @@ ForEachMacros:
- 'drm_for_each_legacy_plane' - 'drm_for_each_legacy_plane'
- 'drm_for_each_plane' - 'drm_for_each_plane'
- 'drm_for_each_plane_mask' - 'drm_for_each_plane_mask'
- 'drm_for_each_privobj'
- 'drm_mm_for_each_hole' - 'drm_mm_for_each_hole'
- 'drm_mm_for_each_node' - 'drm_mm_for_each_node'
- 'drm_mm_for_each_node_in_range' - 'drm_mm_for_each_node_in_range'
- 'drm_mm_for_each_node_safe' - 'drm_mm_for_each_node_safe'
- 'flow_action_for_each'
- 'for_each_active_drhd_unit' - 'for_each_active_drhd_unit'
- 'for_each_active_iommu' - 'for_each_active_iommu'
- 'for_each_available_child_of_node' - 'for_each_available_child_of_node'
@ -158,6 +162,9 @@ ForEachMacros:
- 'for_each_dss_dev' - 'for_each_dss_dev'
- 'for_each_efi_memory_desc' - 'for_each_efi_memory_desc'
- 'for_each_efi_memory_desc_in_map' - 'for_each_efi_memory_desc_in_map'
- 'for_each_element'
- 'for_each_element_extid'
- 'for_each_element_id'
- 'for_each_endpoint_of_node' - 'for_each_endpoint_of_node'
- 'for_each_evictable_lru' - 'for_each_evictable_lru'
- 'for_each_fib6_node_rt_rcu' - 'for_each_fib6_node_rt_rcu'
@ -195,6 +202,7 @@ ForEachMacros:
- 'for_each_net_rcu' - 'for_each_net_rcu'
- 'for_each_new_connector_in_state' - 'for_each_new_connector_in_state'
- 'for_each_new_crtc_in_state' - 'for_each_new_crtc_in_state'
- 'for_each_new_mst_mgr_in_state'
- 'for_each_new_plane_in_state' - 'for_each_new_plane_in_state'
- 'for_each_new_private_obj_in_state' - 'for_each_new_private_obj_in_state'
- 'for_each_node' - 'for_each_node'
@ -210,8 +218,10 @@ ForEachMacros:
- 'for_each_of_pci_range' - 'for_each_of_pci_range'
- 'for_each_old_connector_in_state' - 'for_each_old_connector_in_state'
- 'for_each_old_crtc_in_state' - 'for_each_old_crtc_in_state'
- 'for_each_old_mst_mgr_in_state'
- 'for_each_oldnew_connector_in_state' - 'for_each_oldnew_connector_in_state'
- 'for_each_oldnew_crtc_in_state' - 'for_each_oldnew_crtc_in_state'
- 'for_each_oldnew_mst_mgr_in_state'
- 'for_each_oldnew_plane_in_state' - 'for_each_oldnew_plane_in_state'
- 'for_each_oldnew_plane_in_state_reverse' - 'for_each_oldnew_plane_in_state_reverse'
- 'for_each_oldnew_private_obj_in_state' - 'for_each_oldnew_private_obj_in_state'
@ -243,6 +253,9 @@ ForEachMacros:
- 'for_each_sg_dma_page' - 'for_each_sg_dma_page'
- 'for_each_sg_page' - 'for_each_sg_page'
- 'for_each_sibling_event' - 'for_each_sibling_event'
- 'for_each_subelement'
- 'for_each_subelement_extid'
- 'for_each_subelement_id'
- '__for_each_thread' - '__for_each_thread'
- 'for_each_thread' - 'for_each_thread'
- 'for_each_zone' - 'for_each_zone'
@ -252,6 +265,8 @@ ForEachMacros:
- 'fwnode_for_each_child_node' - 'fwnode_for_each_child_node'
- 'fwnode_graph_for_each_endpoint' - 'fwnode_graph_for_each_endpoint'
- 'gadget_for_each_ep' - 'gadget_for_each_ep'
- 'genradix_for_each'
- 'genradix_for_each_from'
- 'hash_for_each' - 'hash_for_each'
- 'hash_for_each_possible' - 'hash_for_each_possible'
- 'hash_for_each_possible_rcu' - 'hash_for_each_possible_rcu'
@ -293,7 +308,11 @@ ForEachMacros:
- 'key_for_each' - 'key_for_each'
- 'key_for_each_safe' - 'key_for_each_safe'
- 'klp_for_each_func' - 'klp_for_each_func'
- 'klp_for_each_func_safe'
- 'klp_for_each_func_static'
- 'klp_for_each_object' - 'klp_for_each_object'
- 'klp_for_each_object_safe'
- 'klp_for_each_object_static'
- 'kvm_for_each_memslot' - 'kvm_for_each_memslot'
- 'kvm_for_each_vcpu' - 'kvm_for_each_vcpu'
- 'list_for_each' - 'list_for_each'
@ -324,6 +343,8 @@ ForEachMacros:
- 'media_device_for_each_intf' - 'media_device_for_each_intf'
- 'media_device_for_each_link' - 'media_device_for_each_link'
- 'media_device_for_each_pad' - 'media_device_for_each_pad'
- 'mp_bvec_for_each_page'
- 'mp_bvec_for_each_segment'
- 'nanddev_io_for_each_page' - 'nanddev_io_for_each_page'
- 'netdev_for_each_lower_dev' - 'netdev_for_each_lower_dev'
- 'netdev_for_each_lower_private' - 'netdev_for_each_lower_private'
@ -375,6 +396,7 @@ ForEachMacros:
- 'rht_for_each_rcu' - 'rht_for_each_rcu'
- 'rht_for_each_rcu_continue' - 'rht_for_each_rcu_continue'
- '__rq_for_each_bio' - '__rq_for_each_bio'
- 'rq_for_each_bvec'
- 'rq_for_each_segment' - 'rq_for_each_segment'
- 'scsi_for_each_prot_sg' - 'scsi_for_each_prot_sg'
- 'scsi_for_each_sg' - 'scsi_for_each_sg'
@ -410,6 +432,8 @@ ForEachMacros:
- 'v4l2_m2m_for_each_src_buf_safe' - 'v4l2_m2m_for_each_src_buf_safe'
- 'virtio_device_for_each_vq' - 'virtio_device_for_each_vq'
- 'xa_for_each' - 'xa_for_each'
- 'xa_for_each_marked'
- 'xa_for_each_start'
- 'xas_for_each' - 'xas_for_each'
- 'xas_for_each_conflict' - 'xas_for_each_conflict'
- 'xas_for_each_marked' - 'xas_for_each_marked'

View File

@ -156,6 +156,8 @@ Morten Welinder <welinder@darter.rentec.com>
Morten Welinder <welinder@troll.com> Morten Welinder <welinder@troll.com>
Mythri P K <mythripk@ti.com> Mythri P K <mythripk@ti.com>
Nguyen Anh Quynh <aquynh@gmail.com> Nguyen Anh Quynh <aquynh@gmail.com>
Nicolas Pitre <nico@fluxnic.net> <nicolas.pitre@linaro.org>
Nicolas Pitre <nico@fluxnic.net> <nico@linaro.org>
Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it> Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
Patrick Mochel <mochel@digitalimplant.org> Patrick Mochel <mochel@digitalimplant.org>
Paul Burton <paul.burton@mips.com> <paul.burton@imgtec.com> Paul Burton <paul.burton@mips.com> <paul.burton@imgtec.com>
@ -224,3 +226,5 @@ Yakir Yang <kuankuan.y@gmail.com> <ykk@rock-chips.com>
Yusuke Goda <goda.yusuke@renesas.com> Yusuke Goda <goda.yusuke@renesas.com>
Gustavo Padovan <gustavo@las.ic.unicamp.br> Gustavo Padovan <gustavo@las.ic.unicamp.br>
Gustavo Padovan <padovan@profusion.mobi> Gustavo Padovan <padovan@profusion.mobi>
Changbin Du <changbin.du@intel.com> <changbin.du@intel.com>
Changbin Du <changbin.du@intel.com> <changbin.du@gmail.com>

View File

@ -56,12 +56,12 @@ situation from a state where some tasks are stalled but the CPU is
still doing productive work. As such, time spent in this subset of the still doing productive work. As such, time spent in this subset of the
stall state is tracked separately and exported in the "full" averages. stall state is tracked separately and exported in the "full" averages.
The ratios are tracked as recent trends over ten, sixty, and three The ratios (in %) are tracked as recent trends over ten, sixty, and
hundred second windows, which gives insight into short term events as three hundred second windows, which gives insight into short term events
well as medium and long term trends. The total absolute stall time is as well as medium and long term trends. The total absolute stall time
tracked and exported as well, to allow detection of latency spikes (in us) is tracked and exported as well, to allow detection of latency
which wouldn't necessarily make a dent in the time averages, or to spikes which wouldn't necessarily make a dent in the time averages,
average trends over custom time frames. or to average trends over custom time frames.
Cgroup2 interface Cgroup2 interface
================= =================

View File

@ -148,16 +148,16 @@ The ``btf_type.size * 8`` must be equal to or greater than ``BTF_INT_BITS()``
for the type. The maximum value of ``BTF_INT_BITS()`` is 128. for the type. The maximum value of ``BTF_INT_BITS()`` is 128.
The ``BTF_INT_OFFSET()`` specifies the starting bit offset to calculate values The ``BTF_INT_OFFSET()`` specifies the starting bit offset to calculate values
for this int. For example, a bitfield struct member has: * btf member bit for this int. For example, a bitfield struct member has:
offset 100 from the start of the structure, * btf member pointing to an int * btf member bit offset 100 from the start of the structure,
type, * the int type has ``BTF_INT_OFFSET() = 2`` and ``BTF_INT_BITS() = 4`` * btf member pointing to an int type,
* the int type has ``BTF_INT_OFFSET() = 2`` and ``BTF_INT_BITS() = 4``
Then in the struct memory layout, this member will occupy ``4`` bits starting Then in the struct memory layout, this member will occupy ``4`` bits starting
from bits ``100 + 2 = 102``. from bits ``100 + 2 = 102``.
Alternatively, the bitfield struct member can be the following to access the Alternatively, the bitfield struct member can be the following to access the
same bits as the above: same bits as the above:
* btf member bit offset 102, * btf member bit offset 102,
* btf member pointing to an int type, * btf member pointing to an int type,
* the int type has ``BTF_INT_OFFSET() = 0`` and ``BTF_INT_BITS() = 4`` * the int type has ``BTF_INT_OFFSET() = 0`` and ``BTF_INT_BITS() = 4``

View File

@ -228,7 +228,7 @@ patternProperties:
- renesas,r9a06g032-smp - renesas,r9a06g032-smp
- rockchip,rk3036-smp - rockchip,rk3036-smp
- rockchip,rk3066-smp - rockchip,rk3066-smp
- socionext,milbeaut-m10v-smp - socionext,milbeaut-m10v-smp
- ste,dbx500-smp - ste,dbx500-smp
cpu-release-addr: cpu-release-addr:

View File

@ -24,7 +24,8 @@ relationship between the TI-SCI parent node to the child node.
Required properties: Required properties:
------------------- -------------------
- compatible: should be "ti,k2g-sci" - compatible: should be "ti,k2g-sci" for TI 66AK2G SoC
should be "ti,am654-sci" for for TI AM654 SoC
- mbox-names: - mbox-names:
"rx" - Mailbox corresponding to receive path "rx" - Mailbox corresponding to receive path
"tx" - Mailbox corresponding to transmit path "tx" - Mailbox corresponding to transmit path

View File

@ -26,7 +26,7 @@ Required node properties:
Optional node properties: Optional node properties:
- ti,mode: Operation mode (see above). - ti,mode: Operation mode (u8) (see above).
Example (operation mode 2): Example (operation mode 2):
@ -34,5 +34,5 @@ Example (operation mode 2):
adc128d818@1d { adc128d818@1d {
compatible = "ti,adc128d818"; compatible = "ti,adc128d818";
reg = <0x1d>; reg = <0x1d>;
ti,mode = <2>; ti,mode = /bits/ 8 <2>;
}; };

View File

@ -0,0 +1,66 @@
Texas Instruments K3 Interrupt Aggregator
=========================================
The Interrupt Aggregator (INTA) provides a centralized machine
which handles the termination of system events to that they can
be coherently processed by the host(s) in the system. A maximum
of 64 events can be mapped to a single interrupt.
Interrupt Aggregator
+-----------------------------------------+
| Intmap VINT |
| +--------------+ +------------+ |
m ------>| | vint | bit | | 0 |.....|63| vint0 |
. | +--------------+ +------------+ | +------+
. | . . | | HOST |
Globalevents ------>| . . |------>| IRQ |
. | . . | | CTRL |
. | . . | +------+
n ------>| +--------------+ +------------+ |
| | vint | bit | | 0 |.....|63| vintx |
| +--------------+ +------------+ |
| |
+-----------------------------------------+
Configuration of these Intmap registers that maps global events to vint is done
by a system controller (like the Device Memory and Security Controller on K3
AM654 SoC). Driver should request the system controller to get the range
of global events and vints assigned to the requesting host. Management
of these requested resources should be handled by driver and requests
system controller to map specific global event to vint, bit pair.
Communication between the host processor running an OS and the system
controller happens through a protocol called TI System Control Interface
(TISCI protocol). For more details refer:
Documentation/devicetree/bindings/arm/keystone/ti,sci.txt
TISCI Interrupt Aggregator Node:
-------------------------------
- compatible: Must be "ti,sci-inta".
- reg: Should contain registers location and length.
- interrupt-controller: Identifies the node as an interrupt controller
- msi-controller: Identifies the node as an MSI controller.
- interrupt-parent: phandle of irq parent.
- ti,sci: Phandle to TI-SCI compatible System controller node.
- ti,sci-dev-id: TISCI device ID of the Interrupt Aggregator.
- ti,sci-rm-range-vint: Array of TISCI subtype ids representing vints(inta
outputs) range within this INTA, assigned to the
requesting host context.
- ti,sci-rm-range-global-event: Array of TISCI subtype ids representing the
global events range reaching this IA and are assigned
to the requesting host context.
Example:
--------
main_udmass_inta: interrupt-controller@33d00000 {
compatible = "ti,sci-inta";
reg = <0x0 0x33d00000 0x0 0x100000>;
interrupt-controller;
msi-controller;
interrupt-parent = <&main_navss_intr>;
ti,sci = <&dmsc>;
ti,sci-dev-id = <179>;
ti,sci-rm-range-vint = <0x0>;
ti,sci-rm-range-global-event = <0x1>;
};

View File

@ -0,0 +1,82 @@
Texas Instruments K3 Interrupt Router
=====================================
The Interrupt Router (INTR) module provides a mechanism to mux M
interrupt inputs to N interrupt outputs, where all M inputs are selectable
to be driven per N output. An Interrupt Router can either handle edge triggered
or level triggered interrupts and that is fixed in hardware.
Interrupt Router
+----------------------+
| Inputs Outputs |
+-------+ | +------+ +-----+ |
| GPIO |----------->| | irq0 | | 0 | | Host IRQ
+-------+ | +------+ +-----+ | controller
| . . | +-------+
+-------+ | . . |----->| IRQ |
| INTA |----------->| . . | +-------+
+-------+ | . +-----+ |
| +------+ | N | |
| | irqM | +-----+ |
| +------+ |
| |
+----------------------+
There is one register per output (MUXCNTL_N) that controls the selection.
Configuration of these MUXCNTL_N registers is done by a system controller
(like the Device Memory and Security Controller on K3 AM654 SoC). System
controller will keep track of the used and unused registers within the Router.
Driver should request the system controller to get the range of GIC IRQs
assigned to the requesting hosts. It is the drivers responsibility to keep
track of Host IRQs.
Communication between the host processor running an OS and the system
controller happens through a protocol called TI System Control Interface
(TISCI protocol). For more details refer:
Documentation/devicetree/bindings/arm/keystone/ti,sci.txt
TISCI Interrupt Router Node:
----------------------------
Required Properties:
- compatible: Must be "ti,sci-intr".
- ti,intr-trigger-type: Should be one of the following:
1: If intr supports edge triggered interrupts.
4: If intr supports level triggered interrupts.
- interrupt-controller: Identifies the node as an interrupt controller
- #interrupt-cells: Specifies the number of cells needed to encode an
interrupt source. The value should be 2.
First cell should contain the TISCI device ID of source
Second cell should contain the interrupt source offset
within the device.
- ti,sci: Phandle to TI-SCI compatible System controller node.
- ti,sci-dst-id: TISCI device ID of the destination IRQ controller.
- ti,sci-rm-range-girq: Array of TISCI subtype ids representing the host irqs
assigned to this interrupt router. Each subtype id
corresponds to a range of host irqs.
For more details on TISCI IRQ resource management refer:
http://downloads.ti.com/tisci/esd/latest/2_tisci_msgs/rm/rm_irq.html
Example:
--------
The following example demonstrates both interrupt router node and the consumer
node(main gpio) on the AM654 SoC:
main_intr: interrupt-controller0 {
compatible = "ti,sci-intr";
ti,intr-trigger-type = <1>;
interrupt-controller;
interrupt-parent = <&gic500>;
#interrupt-cells = <2>;
ti,sci = <&dmsc>;
ti,sci-dst-id = <56>;
ti,sci-rm-range-girq = <0x1>;
};
main_gpio0: gpio@600000 {
...
interrupt-parent = <&main_intr>;
interrupts = <57 256>, <57 257>, <57 258>,
<57 259>, <57 260>, <57 261>;
...
};

View File

@ -12,10 +12,15 @@ Required properties:
Subnodes: Subnodes:
The integrated switch subnode should be specified according to the binding The integrated switch subnode should be specified according to the binding
described in dsa/dsa.txt. As the QCA8K switches do not have a N:N mapping of described in dsa/dsa.txt. If the QCA8K switch is connect to a SoC's external
port and PHY id, each subnode describing a port needs to have a valid phandle mdio-bus each subnode describing a port needs to have a valid phandle
referencing the internal PHY connected to it. The CPU port of this switch is referencing the internal PHY it is connected to. This is because there's no
always port 0. N:N mapping of port and PHY id.
Don't use mixed external and internal mdio-bus configurations, as this is
not supported by the hardware.
The CPU port of this switch is always port 0.
A CPU port node has the following optional node: A CPU port node has the following optional node:
@ -31,8 +36,9 @@ For QCA8K the 'fixed-link' sub-node supports only the following properties:
- 'full-duplex' (boolean, optional), to indicate that full duplex is - 'full-duplex' (boolean, optional), to indicate that full duplex is
used. When absent, half duplex is assumed. used. When absent, half duplex is assumed.
Example: Examples:
for the external mdio-bus configuration:
&mdio0 { &mdio0 {
phy_port1: phy@0 { phy_port1: phy@0 {
@ -55,12 +61,12 @@ Example:
reg = <4>; reg = <4>;
}; };
switch0@0 { switch@10 {
compatible = "qca,qca8337"; compatible = "qca,qca8337";
#address-cells = <1>; #address-cells = <1>;
#size-cells = <0>; #size-cells = <0>;
reg = <0>; reg = <0x10>;
ports { ports {
#address-cells = <1>; #address-cells = <1>;
@ -108,3 +114,56 @@ Example:
}; };
}; };
}; };
for the internal master mdio-bus configuration:
&mdio0 {
switch@10 {
compatible = "qca,qca8337";
#address-cells = <1>;
#size-cells = <0>;
reg = <0x10>;
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
label = "cpu";
ethernet = <&gmac1>;
phy-mode = "rgmii";
fixed-link {
speed = 1000;
full-duplex;
};
};
port@1 {
reg = <1>;
label = "lan1";
};
port@2 {
reg = <2>;
label = "lan2";
};
port@3 {
reg = <3>;
label = "lan3";
};
port@4 {
reg = <4>;
label = "lan4";
};
port@5 {
reg = <5>;
label = "wan";
};
};
};
};

View File

@ -16,6 +16,7 @@ Required properties:
* "mediatek,mt8127-uart" for MT8127 compatible UARTS * "mediatek,mt8127-uart" for MT8127 compatible UARTS
* "mediatek,mt8135-uart" for MT8135 compatible UARTS * "mediatek,mt8135-uart" for MT8135 compatible UARTS
* "mediatek,mt8173-uart" for MT8173 compatible UARTS * "mediatek,mt8173-uart" for MT8173 compatible UARTS
* "mediatek,mt8183-uart", "mediatek,mt6577-uart" for MT8183 compatible UARTS
* "mediatek,mt6577-uart" for MT6577 and all of the above * "mediatek,mt6577-uart" for MT6577 and all of the above
- reg: The base address of the UART register bank. - reg: The base address of the UART register bank.

View File

@ -12,11 +12,13 @@ CONTENTS
(4) Filesystem context security. (4) Filesystem context security.
(5) VFS filesystem context operations. (5) VFS filesystem context API.
(6) Parameter description. (6) Superblock creation helpers.
(7) Parameter helper functions. (7) Parameter description.
(8) Parameter helper functions.
======== ========
@ -41,12 +43,15 @@ The creation of new mounts is now to be done in a multistep process:
(7) Destroy the context. (7) Destroy the context.
To support this, the file_system_type struct gains a new field: To support this, the file_system_type struct gains two new fields:
int (*init_fs_context)(struct fs_context *fc); int (*init_fs_context)(struct fs_context *fc);
const struct fs_parameter_description *parameters;
which is invoked to set up the filesystem-specific parts of a filesystem The first is invoked to set up the filesystem-specific parts of a filesystem
context, including the additional space. context, including the additional space, and the second points to the
parameter description for validation at registration time and querying by a
future system call.
Note that security initialisation is done *after* the filesystem is called so Note that security initialisation is done *after* the filesystem is called so
that the namespaces may be adjusted first. that the namespaces may be adjusted first.
@ -73,9 +78,9 @@ context. This is represented by the fs_context structure:
void *s_fs_info; void *s_fs_info;
unsigned int sb_flags; unsigned int sb_flags;
unsigned int sb_flags_mask; unsigned int sb_flags_mask;
unsigned int s_iflags;
unsigned int lsm_flags;
enum fs_context_purpose purpose:8; enum fs_context_purpose purpose:8;
bool sloppy:1;
bool silent:1;
... ...
}; };
@ -141,6 +146,10 @@ The fs_context fields are as follows:
Which bits SB_* flags are to be set/cleared in super_block::s_flags. Which bits SB_* flags are to be set/cleared in super_block::s_flags.
(*) unsigned int s_iflags
These will be bitwise-OR'd with s->s_iflags when a superblock is created.
(*) enum fs_context_purpose (*) enum fs_context_purpose
This indicates the purpose for which the context is intended. The This indicates the purpose for which the context is intended. The
@ -150,17 +159,6 @@ The fs_context fields are as follows:
FS_CONTEXT_FOR_SUBMOUNT -- New automatic submount of extant mount FS_CONTEXT_FOR_SUBMOUNT -- New automatic submount of extant mount
FS_CONTEXT_FOR_RECONFIGURE -- Change an existing mount FS_CONTEXT_FOR_RECONFIGURE -- Change an existing mount
(*) bool sloppy
(*) bool silent
These are set if the sloppy or silent mount options are given.
[NOTE] sloppy is probably unnecessary when userspace passes over one
option at a time since the error can just be ignored if userspace deems it
to be unimportant.
[NOTE] silent is probably redundant with sb_flags & SB_SILENT.
The mount context is created by calling vfs_new_fs_context() or The mount context is created by calling vfs_new_fs_context() or
vfs_dup_fs_context() and is destroyed with put_fs_context(). Note that the vfs_dup_fs_context() and is destroyed with put_fs_context(). Note that the
structure is not refcounted. structure is not refcounted.
@ -342,28 +340,47 @@ number of operations used by the new mount code for this purpose:
It should return 0 on success or a negative error code on failure. It should return 0 on success or a negative error code on failure.
================================= ==========================
VFS FILESYSTEM CONTEXT OPERATIONS VFS FILESYSTEM CONTEXT API
================================= ==========================
There are four operations for creating a filesystem context and There are four operations for creating a filesystem context and one for
one for destroying a context: destroying a context:
(*) struct fs_context *vfs_new_fs_context(struct file_system_type *fs_type, (*) struct fs_context *fs_context_for_mount(
struct dentry *reference, struct file_system_type *fs_type,
unsigned int sb_flags, unsigned int sb_flags);
unsigned int sb_flags_mask,
enum fs_context_purpose purpose);
Create a filesystem context for a given filesystem type and purpose. This Allocate a filesystem context for the purpose of setting up a new mount,
allocates the filesystem context, sets the superblock flags, initialises whether that be with a new superblock or sharing an existing one. This
the security and calls fs_type->init_fs_context() to initialise the sets the superblock flags, initialises the security and calls
filesystem private data. fs_type->init_fs_context() to initialise the filesystem private data.
reference can be NULL or it may indicate the root dentry of a superblock fs_type specifies the filesystem type that will manage the context and
that is going to be reconfigured (FS_CONTEXT_FOR_RECONFIGURE) or sb_flags presets the superblock flags stored therein.
the automount point that triggered a submount (FS_CONTEXT_FOR_SUBMOUNT).
This is provided as a source of namespace information. (*) struct fs_context *fs_context_for_reconfigure(
struct dentry *dentry,
unsigned int sb_flags,
unsigned int sb_flags_mask);
Allocate a filesystem context for the purpose of reconfiguring an
existing superblock. dentry provides a reference to the superblock to be
configured. sb_flags and sb_flags_mask indicate which superblock flags
need changing and to what.
(*) struct fs_context *fs_context_for_submount(
struct file_system_type *fs_type,
struct dentry *reference);
Allocate a filesystem context for the purpose of creating a new mount for
an automount point or other derived superblock. fs_type specifies the
filesystem type that will manage the context and the reference dentry
supplies the parameters. Namespaces are propagated from the reference
dentry's superblock also.
Note that it's not a requirement that the reference dentry be of the same
filesystem type as fs_type.
(*) struct fs_context *vfs_dup_fs_context(struct fs_context *src_fc); (*) struct fs_context *vfs_dup_fs_context(struct fs_context *src_fc);
@ -390,20 +407,6 @@ context pointer or a negative error code.
For the remaining operations, if an error occurs, a negative error code will be For the remaining operations, if an error occurs, a negative error code will be
returned. returned.
(*) int vfs_get_tree(struct fs_context *fc);
Get or create the mountable root and superblock, using the parameters in
the filesystem context to select/configure the superblock. This invokes
the ->validate() op and then the ->get_tree() op.
[NOTE] ->validate() could perhaps be rolled into ->get_tree() and
->reconfigure().
(*) struct vfsmount *vfs_create_mount(struct fs_context *fc);
Create a mount given the parameters in the specified filesystem context.
Note that this does not attach the mount to anything.
(*) int vfs_parse_fs_param(struct fs_context *fc, (*) int vfs_parse_fs_param(struct fs_context *fc,
struct fs_parameter *param); struct fs_parameter *param);
@ -432,17 +435,80 @@ returned.
clear the pointer, but then becomes responsible for disposing of the clear the pointer, but then becomes responsible for disposing of the
object. object.
(*) int vfs_parse_fs_string(struct fs_context *fc, char *key, (*) int vfs_parse_fs_string(struct fs_context *fc, const char *key,
const char *value, size_t v_size); const char *value, size_t v_size);
A wrapper around vfs_parse_fs_param() that just passes a constant string. A wrapper around vfs_parse_fs_param() that copies the value string it is
passed.
(*) int generic_parse_monolithic(struct fs_context *fc, void *data); (*) int generic_parse_monolithic(struct fs_context *fc, void *data);
Parse a sys_mount() data page, assuming the form to be a text list Parse a sys_mount() data page, assuming the form to be a text list
consisting of key[=val] options separated by commas. Each item in the consisting of key[=val] options separated by commas. Each item in the
list is passed to vfs_mount_option(). This is the default when the list is passed to vfs_mount_option(). This is the default when the
->parse_monolithic() operation is NULL. ->parse_monolithic() method is NULL.
(*) int vfs_get_tree(struct fs_context *fc);
Get or create the mountable root and superblock, using the parameters in
the filesystem context to select/configure the superblock. This invokes
the ->get_tree() method.
(*) struct vfsmount *vfs_create_mount(struct fs_context *fc);
Create a mount given the parameters in the specified filesystem context.
Note that this does not attach the mount to anything.
===========================
SUPERBLOCK CREATION HELPERS
===========================
A number of VFS helpers are available for use by filesystems for the creation
or looking up of superblocks.
(*) struct super_block *
sget_fc(struct fs_context *fc,
int (*test)(struct super_block *sb, struct fs_context *fc),
int (*set)(struct super_block *sb, struct fs_context *fc));
This is the core routine. If test is non-NULL, it searches for an
existing superblock matching the criteria held in the fs_context, using
the test function to match them. If no match is found, a new superblock
is created and the set function is called to set it up.
Prior to the set function being called, fc->s_fs_info will be transferred
to sb->s_fs_info - and fc->s_fs_info will be cleared if set returns
success (ie. 0).
The following helpers all wrap sget_fc():
(*) int vfs_get_super(struct fs_context *fc,
enum vfs_get_super_keying keying,
int (*fill_super)(struct super_block *sb,
struct fs_context *fc))
This creates/looks up a deviceless superblock. The keying indicates how
many superblocks of this type may exist and in what manner they may be
shared:
(1) vfs_get_single_super
Only one such superblock may exist in the system. Any further
attempt to get a new superblock gets this one (and any parameter
differences are ignored).
(2) vfs_get_keyed_super
Multiple superblocks of this type may exist and they're keyed on
their s_fs_info pointer (for example this may refer to a
namespace).
(3) vfs_get_independent_super
Multiple independent superblocks of this type may exist. This
function never matches an existing one and always creates a new
one.
===================== =====================
@ -454,35 +520,22 @@ There's a core description struct that links everything together:
struct fs_parameter_description { struct fs_parameter_description {
const char name[16]; const char name[16];
u8 nr_params;
u8 nr_alt_keys;
u8 nr_enums;
bool ignore_unknown;
bool no_source;
const char *const *keys;
const struct constant_table *alt_keys;
const struct fs_parameter_spec *specs; const struct fs_parameter_spec *specs;
const struct fs_parameter_enum *enums; const struct fs_parameter_enum *enums;
}; };
For example: For example:
enum afs_param { enum {
Opt_autocell, Opt_autocell,
Opt_bar, Opt_bar,
Opt_dyn, Opt_dyn,
Opt_foo, Opt_foo,
Opt_source, Opt_source,
nr__afs_params
}; };
static const struct fs_parameter_description afs_fs_parameters = { static const struct fs_parameter_description afs_fs_parameters = {
.name = "kAFS", .name = "kAFS",
.nr_params = nr__afs_params,
.nr_alt_keys = ARRAY_SIZE(afs_param_alt_keys),
.nr_enums = ARRAY_SIZE(afs_param_enums),
.keys = afs_param_keys,
.alt_keys = afs_param_alt_keys,
.specs = afs_param_specs, .specs = afs_param_specs,
.enums = afs_param_enums, .enums = afs_param_enums,
}; };
@ -494,28 +547,24 @@ The members are as follows:
The name to be used in error messages generated by the parse helper The name to be used in error messages generated by the parse helper
functions. functions.
(2) u8 nr_params; (2) const struct fs_parameter_specification *specs;
The number of discrete parameter identifiers. This indicates the number Table of parameter specifications, terminated with a null entry, where the
of elements in the ->types[] array and also limits the values that may be entries are of type:
used in the values that the ->keys[] array maps to.
It is expected that, for example, two parameters that are related, say struct fs_parameter_spec {
"acl" and "noacl" with have the same ID, but will be flagged to indicate const char *name;
that one is the inverse of the other. The value can then be picked out u8 opt;
from the parse result. enum fs_parameter_type type:8;
unsigned short flags;
(3) const struct fs_parameter_specification *specs;
Table of parameter specifications, where the entries are of type:
struct fs_parameter_type {
enum fs_parameter_spec type:8;
u8 flags;
}; };
and the parameter identifier is the index to the array. 'type' indicates The 'name' field is a string to match exactly to the parameter key (no
the desired value type and must be one of: wildcards, patterns and no case-independence) and 'opt' is the value that
will be returned by the fs_parser() function in the case of a successful
match.
The 'type' field indicates the desired value type and must be one of:
TYPE NAME EXPECTED VALUE RESULT IN TYPE NAME EXPECTED VALUE RESULT IN
======================= ======================= ===================== ======================= ======================= =====================
@ -525,85 +574,65 @@ The members are as follows:
fs_param_is_u32_octal 32-bit octal int result->uint_32 fs_param_is_u32_octal 32-bit octal int result->uint_32
fs_param_is_u32_hex 32-bit hex int result->uint_32 fs_param_is_u32_hex 32-bit hex int result->uint_32
fs_param_is_s32 32-bit signed int result->int_32 fs_param_is_s32 32-bit signed int result->int_32
fs_param_is_u64 64-bit unsigned int result->uint_64
fs_param_is_enum Enum value name result->uint_32 fs_param_is_enum Enum value name result->uint_32
fs_param_is_string Arbitrary string param->string fs_param_is_string Arbitrary string param->string
fs_param_is_blob Binary blob param->blob fs_param_is_blob Binary blob param->blob
fs_param_is_blockdev Blockdev path * Needs lookup fs_param_is_blockdev Blockdev path * Needs lookup
fs_param_is_path Path * Needs lookup fs_param_is_path Path * Needs lookup
fs_param_is_fd File descriptor param->file fs_param_is_fd File descriptor result->int_32
And each parameter can be qualified with 'flags':
fs_param_v_optional The value is optional
fs_param_neg_with_no If key name is prefixed with "no", it is false
fs_param_neg_with_empty If value is "", it is false
fs_param_deprecated The parameter is deprecated.
For example:
static const struct fs_parameter_spec afs_param_specs[nr__afs_params] = {
[Opt_autocell] = { fs_param_is flag },
[Opt_bar] = { fs_param_is_enum },
[Opt_dyn] = { fs_param_is flag },
[Opt_foo] = { fs_param_is_bool, fs_param_neg_with_no },
[Opt_source] = { fs_param_is_string },
};
Note that if the value is of fs_param_is_bool type, fs_parse() will try Note that if the value is of fs_param_is_bool type, fs_parse() will try
to match any string value against "0", "1", "no", "yes", "false", "true". to match any string value against "0", "1", "no", "yes", "false", "true".
[!] NOTE that the table must be sorted according to primary key name so Each parameter can also be qualified with 'flags':
that ->keys[] is also sorted.
(4) const char *const *keys; fs_param_v_optional The value is optional
fs_param_neg_with_no result->negated set if key is prefixed with "no"
fs_param_neg_with_empty result->negated set if value is ""
fs_param_deprecated The parameter is deprecated.
Table of primary key names for the parameters. There must be one entry These are wrapped with a number of convenience wrappers:
per defined parameter. The table is optional if ->nr_params is 0. The
table is just an array of names e.g.:
static const char *const afs_param_keys[nr__afs_params] = { MACRO SPECIFIES
[Opt_autocell] = "autocell", ======================= ===============================================
[Opt_bar] = "bar", fsparam_flag() fs_param_is_flag
[Opt_dyn] = "dyn", fsparam_flag_no() fs_param_is_flag, fs_param_neg_with_no
[Opt_foo] = "foo", fsparam_bool() fs_param_is_bool
[Opt_source] = "source", fsparam_u32() fs_param_is_u32
fsparam_u32oct() fs_param_is_u32_octal
fsparam_u32hex() fs_param_is_u32_hex
fsparam_s32() fs_param_is_s32
fsparam_u64() fs_param_is_u64
fsparam_enum() fs_param_is_enum
fsparam_string() fs_param_is_string
fsparam_blob() fs_param_is_blob
fsparam_bdev() fs_param_is_blockdev
fsparam_path() fs_param_is_path
fsparam_fd() fs_param_is_fd
all of which take two arguments, name string and option number - for
example:
static const struct fs_parameter_spec afs_param_specs[] = {
fsparam_flag ("autocell", Opt_autocell),
fsparam_flag ("dyn", Opt_dyn),
fsparam_string ("source", Opt_source),
fsparam_flag_no ("foo", Opt_foo),
{}
}; };
[!] NOTE that the table must be sorted such that the table can be searched An addition macro, __fsparam() is provided that takes an additional pair
with bsearch() using strcmp(). This means that the Opt_* values must of arguments to specify the type and the flags for anything that doesn't
correspond to the entries in this table. match one of the above macros.
(5) const struct constant_table *alt_keys;
u8 nr_alt_keys;
Table of additional key names and their mappings to parameter ID plus the
number of elements in the table. This is optional. The table is just an
array of { name, integer } pairs, e.g.:
static const struct constant_table afs_param_keys[] = {
{ "baz", Opt_bar },
{ "dynamic", Opt_dyn },
};
[!] NOTE that the table must be sorted such that strcmp() can be used with
bsearch() to search the entries.
The parameter ID can also be fs_param_key_removed to indicate that a
deprecated parameter has been removed and that an error will be given.
This differs from fs_param_deprecated where the parameter may still have
an effect.
Further, the behaviour of the parameter may differ when an alternate name
is used (for instance with NFS, "v3", "v4.2", etc. are alternate names).
(6) const struct fs_parameter_enum *enums; (6) const struct fs_parameter_enum *enums;
u8 nr_enums;
Table of enum value names to integer mappings and the number of elements Table of enum value names to integer mappings, terminated with a null
stored therein. This is of type: entry. This is of type:
struct fs_parameter_enum { struct fs_parameter_enum {
u8 param_id; u8 opt;
char name[14]; char name[14];
u8 value; u8 value;
}; };
@ -621,11 +650,6 @@ The members are as follows:
try to look the value up in the enum table and the result will be stored try to look the value up in the enum table and the result will be stored
in the parse result. in the parse result.
(7) bool no_source;
If this is set, fs_parse() will ignore any "source" parameter and not
pass it to the filesystem.
The parser should be pointed to by the parser pointer in the file_system_type The parser should be pointed to by the parser pointer in the file_system_type
struct as this will provide validation on registration (if struct as this will provide validation on registration (if
CONFIG_VALIDATE_FS_PARSER=y) and will allow the description to be queried from CONFIG_VALIDATE_FS_PARSER=y) and will allow the description to be queried from
@ -650,9 +674,8 @@ process the parameters it is given.
int value; int value;
}; };
and it must be sorted such that it can be searched using bsearch() using If a match is found, the corresponding value is returned. If a match
strcmp(). If a match is found, the corresponding value is returned. If a isn't found, the not_found value is returned instead.
match isn't found, the not_found value is returned instead.
(*) bool validate_constant_table(const struct constant_table *tbl, (*) bool validate_constant_table(const struct constant_table *tbl,
size_t tbl_size, size_t tbl_size,
@ -665,36 +688,36 @@ process the parameters it is given.
should just be set to lie inside the low-to-high range. should just be set to lie inside the low-to-high range.
If all is good, true is returned. If the table is invalid, errors are If all is good, true is returned. If the table is invalid, errors are
logged to dmesg, the stack is dumped and false is returned. logged to dmesg and false is returned.
(*) bool fs_validate_description(const struct fs_parameter_description *desc);
This performs some validation checks on a parameter description. It
returns true if the description is good and false if it is not. It will
log errors to dmesg if validation fails.
(*) int fs_parse(struct fs_context *fc, (*) int fs_parse(struct fs_context *fc,
const struct fs_param_parser *parser, const struct fs_parameter_description *desc,
struct fs_parameter *param, struct fs_parameter *param,
struct fs_param_parse_result *result); struct fs_parse_result *result);
This is the main interpreter of parameters. It uses the parameter This is the main interpreter of parameters. It uses the parameter
description (parser) to look up the name of the parameter to use and to description to look up a parameter by key name and to convert that to an
convert that to a parameter ID (stored in result->key). option number (which it returns).
If successful, and if the parameter type indicates the result is a If successful, and if the parameter type indicates the result is a
boolean, integer or enum type, the value is converted by this function and boolean, integer or enum type, the value is converted by this function and
the result stored in result->{boolean,int_32,uint_32}. the result stored in result->{boolean,int_32,uint_32,uint_64}.
If a match isn't initially made, the key is prefixed with "no" and no If a match isn't initially made, the key is prefixed with "no" and no
value is present then an attempt will be made to look up the key with the value is present then an attempt will be made to look up the key with the
prefix removed. If this matches a parameter for which the type has flag prefix removed. If this matches a parameter for which the type has flag
fs_param_neg_with_no set, then a match will be made and the value will be fs_param_neg_with_no set, then a match will be made and result->negated
set to false/0/NULL. will be set to true.
If the parameter is successfully matched and, optionally, parsed If the parameter isn't matched, -ENOPARAM will be returned; if the
correctly, 1 is returned. If the parameter isn't matched and parameter is matched, but the value is erroneous, -EINVAL will be
parser->ignore_unknown is set, then 0 is returned. Otherwise -EINVAL is returned; otherwise the parameter's option number will be returned.
returned.
(*) bool fs_validate_description(const struct fs_parameter_description *desc);
This is validates the parameter description. It returns true if the
description is good and false if it is not.
(*) int fs_lookup_param(struct fs_context *fc, (*) int fs_lookup_param(struct fs_context *fc,
struct fs_parameter *value, struct fs_parameter *value,

View File

@ -36,6 +36,7 @@ Supported adapters:
* Intel Cannon Lake (PCH) * Intel Cannon Lake (PCH)
* Intel Cedar Fork (PCH) * Intel Cedar Fork (PCH)
* Intel Ice Lake (PCH) * Intel Ice Lake (PCH)
* Intel Comet Lake (PCH)
Datasheets: Publicly available at the Intel website Datasheets: Publicly available at the Intel website
On Intel Patsburg and later chipsets, both the normal host SMBus controller On Intel Patsburg and later chipsets, both the normal host SMBus controller

View File

@ -102,9 +102,11 @@ Byte sequences
dictionary which is empty, and that it will always be dictionary which is empty, and that it will always be
invalid at this place. invalid at this place.
17 : bitstream version. If the first byte is 17, the next byte 17 : bitstream version. If the first byte is 17, and compressed
gives the bitstream version (version 1 only). If the first byte stream length is at least 5 bytes (length of shortest possible
is not 17, the bitstream version is 0. versioned bitstream), the next byte gives the bitstream version
(version 1 only).
Otherwise, the bitstream version is 0.
18..21 : copy 0..3 literals 18..21 : copy 0..3 literals
state = (byte - 17) = 0..3 [ copy <state> literals ] state = (byte - 17) = 0..3 [ copy <state> literals ]

View File

@ -0,0 +1,126 @@
.. SPDX-License-Identifier: GPL-2.0
==================
BPF Flow Dissector
==================
Overview
========
Flow dissector is a routine that parses metadata out of the packets. It's
used in the various places in the networking subsystem (RFS, flow hash, etc).
BPF flow dissector is an attempt to reimplement C-based flow dissector logic
in BPF to gain all the benefits of BPF verifier (namely, limits on the
number of instructions and tail calls).
API
===
BPF flow dissector programs operate on an ``__sk_buff``. However, only the
limited set of fields is allowed: ``data``, ``data_end`` and ``flow_keys``.
``flow_keys`` is ``struct bpf_flow_keys`` and contains flow dissector input
and output arguments.
The inputs are:
* ``nhoff`` - initial offset of the networking header
* ``thoff`` - initial offset of the transport header, initialized to nhoff
* ``n_proto`` - L3 protocol type, parsed out of L2 header
Flow dissector BPF program should fill out the rest of the ``struct
bpf_flow_keys`` fields. Input arguments ``nhoff/thoff/n_proto`` should be
also adjusted accordingly.
The return code of the BPF program is either BPF_OK to indicate successful
dissection, or BPF_DROP to indicate parsing error.
__sk_buff->data
===============
In the VLAN-less case, this is what the initial state of the BPF flow
dissector looks like::
+------+------+------------+-----------+
| DMAC | SMAC | ETHER_TYPE | L3_HEADER |
+------+------+------------+-----------+
^
|
+-- flow dissector starts here
.. code:: c
skb->data + flow_keys->nhoff point to the first byte of L3_HEADER
flow_keys->thoff = nhoff
flow_keys->n_proto = ETHER_TYPE
In case of VLAN, flow dissector can be called with the two different states.
Pre-VLAN parsing::
+------+------+------+-----+-----------+-----------+
| DMAC | SMAC | TPID | TCI |ETHER_TYPE | L3_HEADER |
+------+------+------+-----+-----------+-----------+
^
|
+-- flow dissector starts here
.. code:: c
skb->data + flow_keys->nhoff point the to first byte of TCI
flow_keys->thoff = nhoff
flow_keys->n_proto = TPID
Please note that TPID can be 802.1AD and, hence, BPF program would
have to parse VLAN information twice for double tagged packets.
Post-VLAN parsing::
+------+------+------+-----+-----------+-----------+
| DMAC | SMAC | TPID | TCI |ETHER_TYPE | L3_HEADER |
+------+------+------+-----+-----------+-----------+
^
|
+-- flow dissector starts here
.. code:: c
skb->data + flow_keys->nhoff point the to first byte of L3_HEADER
flow_keys->thoff = nhoff
flow_keys->n_proto = ETHER_TYPE
In this case VLAN information has been processed before the flow dissector
and BPF flow dissector is not required to handle it.
The takeaway here is as follows: BPF flow dissector program can be called with
the optional VLAN header and should gracefully handle both cases: when single
or double VLAN is present and when it is not present. The same program
can be called for both cases and would have to be written carefully to
handle both cases.
Reference Implementation
========================
See ``tools/testing/selftests/bpf/progs/bpf_flow.c`` for the reference
implementation and ``tools/testing/selftests/bpf/flow_dissector_load.[hc]``
for the loader. bpftool can be used to load BPF flow dissector program as well.
The reference implementation is organized as follows:
* ``jmp_table`` map that contains sub-programs for each supported L3 protocol
* ``_dissect`` routine - entry point; it does input ``n_proto`` parsing and
does ``bpf_tail_call`` to the appropriate L3 handler
Since BPF at this point doesn't support looping (or any jumping back),
jmp_table is used instead to handle multiple levels of encapsulation (and
IPv6 options).
Current Limitations
===================
BPF flow dissector doesn't support exporting all the metadata that in-kernel
C-based implementation can export. Notable example is single VLAN (802.1Q)
and double VLAN (802.1AD) tags. Please refer to the ``struct bpf_flow_keys``
for a set of information that's currently can be exported from the BPF context.

View File

@ -9,6 +9,7 @@ Contents:
netdev-FAQ netdev-FAQ
af_xdp af_xdp
batman-adv batman-adv
bpf_flow_dissector
can can
can_ucan_protocol can_ucan_protocol
device_drivers/freescale/dpaa2/index device_drivers/freescale/dpaa2/index

View File

@ -50,7 +50,7 @@ the excellent reporting over at LWN.net or read the original code.
patchset patchset
[PATCH net-next v4 0/9] socket sendmsg MSG_ZEROCOPY [PATCH net-next v4 0/9] socket sendmsg MSG_ZEROCOPY
http://lkml.kernel.org/r/20170803202945.70750-1-willemdebruijn.kernel@gmail.com https://lkml.kernel.org/netdev/20170803202945.70750-1-willemdebruijn.kernel@gmail.com
Interface Interface

View File

@ -131,6 +131,19 @@ it to the maintainer to figure out what is the most recent and current
version that should be applied. If there is any doubt, the maintainer version that should be applied. If there is any doubt, the maintainer
will reply and ask what should be done. will reply and ask what should be done.
Q: I made changes to only a few patches in a patch series should I resend only those changed?
--------------------------------------------------------------------------------------------
A: No, please resend the entire patch series and make sure you do number your
patches such that it is clear this is the latest and greatest set of patches
that can be applied.
Q: I submitted multiple versions of a patch series and it looks like a version other than the last one has been accepted, what should I do?
-------------------------------------------------------------------------------------------------------------------------------------------
A: There is no revert possible, once it is pushed out, it stays like that.
Please send incremental versions on top of what has been merged in order to fix
the patches the way they would look like if your latest patch series was to be
merged.
Q: How can I tell what patches are queued up for backporting to the various stable releases? Q: How can I tell what patches are queued up for backporting to the various stable releases?
-------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------
A: Normally Greg Kroah-Hartman collects stable commits himself, but for A: Normally Greg Kroah-Hartman collects stable commits himself, but for

View File

@ -44,10 +44,10 @@ including the Netfilter hooks and the flowtable fastpath bypass.
/ \ / \ |Routing | / \ / \ / \ |Routing | / \
--> ingress ---> prerouting ---> |decision| | postrouting |--> neigh_xmit --> ingress ---> prerouting ---> |decision| | postrouting |--> neigh_xmit
\_________/ \__________/ ---------- \____________/ ^ \_________/ \__________/ ---------- \____________/ ^
| ^ | | ^ | | ^ | ^ |
flowtable | | ____\/___ | | flowtable | ____\/___ | |
| | | / \ | | | | / \ | |
__\/___ | --------->| forward |------------ | __\/___ | | forward |------------ |
|-----| | \_________/ | |-----| | \_________/ |
|-----| | 'flow offload' rule | |-----| | 'flow offload' rule |
|-----| | adds entry to | |-----| | adds entry to |

View File

@ -413,7 +413,7 @@ algorithm.
.. _F-RTO: https://tools.ietf.org/html/rfc5682 .. _F-RTO: https://tools.ietf.org/html/rfc5682
TCP Fast Path TCP Fast Path
============ =============
When kernel receives a TCP packet, it has two paths to handler the When kernel receives a TCP packet, it has two paths to handler the
packet, one is fast path, another is slow path. The comment in kernel packet, one is fast path, another is slow path. The comment in kernel
code provides a good explanation of them, I pasted them below:: code provides a good explanation of them, I pasted them below::
@ -681,6 +681,7 @@ The TCP stack receives an out of order duplicate packet, so it sends a
DSACK to the sender. DSACK to the sender.
* TcpExtTCPDSACKRecv * TcpExtTCPDSACKRecv
The TCP stack receives a DSACK, which indicates an acknowledged The TCP stack receives a DSACK, which indicates an acknowledged
duplicate packet is received. duplicate packet is received.
@ -690,7 +691,7 @@ The TCP stack receives a DSACK, which indicate an out of order
duplicate packet is received. duplicate packet is received.
invalid SACK and DSACK invalid SACK and DSACK
==================== ======================
When a SACK (or DSACK) block is invalid, a corresponding counter would When a SACK (or DSACK) block is invalid, a corresponding counter would
be updated. The validation method is base on the start/end sequence be updated. The validation method is base on the start/end sequence
number of the SACK block. For more details, please refer the comment number of the SACK block. For more details, please refer the comment
@ -704,11 +705,13 @@ explaination:
.. _Add counters for discarded SACK blocks: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=18f02545a9a16c9a89778b91a162ad16d510bb32 .. _Add counters for discarded SACK blocks: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=18f02545a9a16c9a89778b91a162ad16d510bb32
* TcpExtTCPSACKDiscard * TcpExtTCPSACKDiscard
This counter indicates how many SACK blocks are invalid. If the invalid This counter indicates how many SACK blocks are invalid. If the invalid
SACK block is caused by ACK recording, the TCP stack will only ignore SACK block is caused by ACK recording, the TCP stack will only ignore
it and won't update this counter. it and won't update this counter.
* TcpExtTCPDSACKIgnoredOld and TcpExtTCPDSACKIgnoredNoUndo * TcpExtTCPDSACKIgnoredOld and TcpExtTCPDSACKIgnoredNoUndo
When a DSACK block is invalid, one of these two counters would be When a DSACK block is invalid, one of these two counters would be
updated. Which counter will be updated depends on the undo_marker flag updated. Which counter will be updated depends on the undo_marker flag
of the TCP socket. If the undo_marker is not set, the TCP stack isn't of the TCP socket. If the undo_marker is not set, the TCP stack isn't
@ -719,7 +722,7 @@ will be updated. If the undo_marker is set, TcpExtTCPDSACKIgnoredOld
will be updated. As implied in its name, it might be an old packet. will be updated. As implied in its name, it might be an old packet.
SACK shift SACK shift
========= ==========
The linux networking stack stores data in sk_buff struct (skb for The linux networking stack stores data in sk_buff struct (skb for
short). If a SACK block acrosses multiple skb, the TCP stack will try short). If a SACK block acrosses multiple skb, the TCP stack will try
to re-arrange data in these skb. E.g. if a SACK block acknowledges seq to re-arrange data in these skb. E.g. if a SACK block acknowledges seq
@ -730,12 +733,15 @@ seq 14 to 20. All data in skb2 will be moved to skb1, and skb2 will be
discard, this operation is 'merge'. discard, this operation is 'merge'.
* TcpExtTCPSackShifted * TcpExtTCPSackShifted
A skb is shifted A skb is shifted
* TcpExtTCPSackMerged * TcpExtTCPSackMerged
A skb is merged A skb is merged
* TcpExtTCPSackShiftFallback * TcpExtTCPSackShiftFallback
A skb should be shifted or merged, but the TCP stack doesn't do it for A skb should be shifted or merged, but the TCP stack doesn't do it for
some reasons. some reasons.

View File

@ -5,25 +5,32 @@ The Definitive KVM (Kernel-based Virtual Machine) API Documentation
---------------------- ----------------------
The kvm API is a set of ioctls that are issued to control various aspects The kvm API is a set of ioctls that are issued to control various aspects
of a virtual machine. The ioctls belong to three classes of a virtual machine. The ioctls belong to three classes:
- System ioctls: These query and set global attributes which affect the - System ioctls: These query and set global attributes which affect the
whole kvm subsystem. In addition a system ioctl is used to create whole kvm subsystem. In addition a system ioctl is used to create
virtual machines virtual machines.
- VM ioctls: These query and set attributes that affect an entire virtual - VM ioctls: These query and set attributes that affect an entire virtual
machine, for example memory layout. In addition a VM ioctl is used to machine, for example memory layout. In addition a VM ioctl is used to
create virtual cpus (vcpus). create virtual cpus (vcpus) and devices.
Only run VM ioctls from the same process (address space) that was used VM ioctls must be issued from the same process (address space) that was
to create the VM. used to create the VM.
- vcpu ioctls: These query and set attributes that control the operation - vcpu ioctls: These query and set attributes that control the operation
of a single virtual cpu. of a single virtual cpu.
Only run vcpu ioctls from the same thread that was used to create the vcpu ioctls should be issued from the same thread that was used to create
vcpu. the vcpu, except for asynchronous vcpu ioctl that are marked as such in
the documentation. Otherwise, the first ioctl after switching threads
could see a performance impact.
- device ioctls: These query and set attributes that control the operation
of a single device.
device ioctls must be issued from the same process (address space) that
was used to create the VM.
2. File descriptors 2. File descriptors
------------------- -------------------
@ -32,17 +39,34 @@ The kvm API is centered around file descriptors. An initial
open("/dev/kvm") obtains a handle to the kvm subsystem; this handle open("/dev/kvm") obtains a handle to the kvm subsystem; this handle
can be used to issue system ioctls. A KVM_CREATE_VM ioctl on this can be used to issue system ioctls. A KVM_CREATE_VM ioctl on this
handle will create a VM file descriptor which can be used to issue VM handle will create a VM file descriptor which can be used to issue VM
ioctls. A KVM_CREATE_VCPU ioctl on a VM fd will create a virtual cpu ioctls. A KVM_CREATE_VCPU or KVM_CREATE_DEVICE ioctl on a VM fd will
and return a file descriptor pointing to it. Finally, ioctls on a vcpu create a virtual cpu or device and return a file descriptor pointing to
fd can be used to control the vcpu, including the important task of the new resource. Finally, ioctls on a vcpu or device fd can be used
actually running guest code. to control the vcpu or device. For vcpus, this includes the important
task of actually running guest code.
In general file descriptors can be migrated among processes by means In general file descriptors can be migrated among processes by means
of fork() and the SCM_RIGHTS facility of unix domain socket. These of fork() and the SCM_RIGHTS facility of unix domain socket. These
kinds of tricks are explicitly not supported by kvm. While they will kinds of tricks are explicitly not supported by kvm. While they will
not cause harm to the host, their actual behavior is not guaranteed by not cause harm to the host, their actual behavior is not guaranteed by
the API. The only supported use is one virtual machine per process, the API. See "General description" for details on the ioctl usage
and one vcpu per thread. model that is supported by KVM.
It is important to note that althought VM ioctls may only be issued from
the process that created the VM, a VM's lifecycle is associated with its
file descriptor, not its creator (process). In other words, the VM and
its resources, *including the associated address space*, are not freed
until the last reference to the VM's file descriptor has been released.
For example, if fork() is issued after ioctl(KVM_CREATE_VM), the VM will
not be freed until both the parent (original) process and its child have
put their references to the VM's file descriptor.
Because a VM's resources are not freed until the last reference to its
file descriptor is released, creating additional references to a VM via
via fork(), dup(), etc... without careful consideration is strongly
discouraged and may have unwanted side effects, e.g. memory allocated
by and on behalf of the VM's process may not be freed/unaccounted when
the VM is shut down.
It is important to note that althought VM ioctls may only be issued from It is important to note that althought VM ioctls may only be issued from
@ -515,11 +539,15 @@ c) KVM_INTERRUPT_SET_LEVEL
Note that any value for 'irq' other than the ones stated above is invalid Note that any value for 'irq' other than the ones stated above is invalid
and incurs unexpected behavior. and incurs unexpected behavior.
This is an asynchronous vcpu ioctl and can be invoked from any thread.
MIPS: MIPS:
Queues an external interrupt to be injected into the virtual CPU. A negative Queues an external interrupt to be injected into the virtual CPU. A negative
interrupt number dequeues the interrupt. interrupt number dequeues the interrupt.
This is an asynchronous vcpu ioctl and can be invoked from any thread.
4.17 KVM_DEBUG_GUEST 4.17 KVM_DEBUG_GUEST
@ -1086,14 +1114,12 @@ struct kvm_userspace_memory_region {
#define KVM_MEM_LOG_DIRTY_PAGES (1UL << 0) #define KVM_MEM_LOG_DIRTY_PAGES (1UL << 0)
#define KVM_MEM_READONLY (1UL << 1) #define KVM_MEM_READONLY (1UL << 1)
This ioctl allows the user to create or modify a guest physical memory This ioctl allows the user to create, modify or delete a guest physical
slot. When changing an existing slot, it may be moved in the guest memory slot. Bits 0-15 of "slot" specify the slot id and this value
physical memory space, or its flags may be modified. It may not be should be less than the maximum number of user memory slots supported per
resized. Slots may not overlap in guest physical address space. VM. The maximum allowed slots can be queried using KVM_CAP_NR_MEMSLOTS,
Bits 0-15 of "slot" specifies the slot id and this value should be if this capability is supported by the architecture. Slots may not
less than the maximum number of user memory slots supported per VM. overlap in guest physical address space.
The maximum allowed slots can be queried using KVM_CAP_NR_MEMSLOTS,
if this capability is supported by the architecture.
If KVM_CAP_MULTI_ADDRESS_SPACE is available, bits 16-31 of "slot" If KVM_CAP_MULTI_ADDRESS_SPACE is available, bits 16-31 of "slot"
specifies the address space which is being modified. They must be specifies the address space which is being modified. They must be
@ -1102,6 +1128,10 @@ KVM_CAP_MULTI_ADDRESS_SPACE capability. Slots in separate address spaces
are unrelated; the restriction on overlapping slots only applies within are unrelated; the restriction on overlapping slots only applies within
each address space. each address space.
Deleting a slot is done by passing zero for memory_size. When changing
an existing slot, it may be moved in the guest physical memory space,
or its flags may be modified, but it may not be resized.
Memory for the region is taken starting at the address denoted by the Memory for the region is taken starting at the address denoted by the
field userspace_addr, which must point at user addressable memory for field userspace_addr, which must point at user addressable memory for
the entire memory slot size. Any object may back this memory, including the entire memory slot size. Any object may back this memory, including
@ -2493,7 +2523,7 @@ KVM_S390_MCHK (vm, vcpu) - machine check interrupt; cr 14 bits in parm,
machine checks needing further payload are not machine checks needing further payload are not
supported by this ioctl) supported by this ioctl)
Note that the vcpu ioctl is asynchronous to vcpu execution. This is an asynchronous vcpu ioctl and can be invoked from any thread.
4.78 KVM_PPC_GET_HTAB_FD 4.78 KVM_PPC_GET_HTAB_FD
@ -3042,8 +3072,7 @@ KVM_S390_INT_EMERGENCY - sigp emergency; parameters in .emerg
KVM_S390_INT_EXTERNAL_CALL - sigp external call; parameters in .extcall KVM_S390_INT_EXTERNAL_CALL - sigp external call; parameters in .extcall
KVM_S390_MCHK - machine check interrupt; parameters in .mchk KVM_S390_MCHK - machine check interrupt; parameters in .mchk
This is an asynchronous vcpu ioctl and can be invoked from any thread.
Note that the vcpu ioctl is asynchronous to vcpu execution.
4.94 KVM_S390_GET_IRQ_STATE 4.94 KVM_S390_GET_IRQ_STATE

View File

@ -142,7 +142,7 @@ Shadow pages contain the following information:
If clear, this page corresponds to a guest page table denoted by the gfn If clear, this page corresponds to a guest page table denoted by the gfn
field. field.
role.quadrant: role.quadrant:
When role.cr4_pae=0, the guest uses 32-bit gptes while the host uses 64-bit When role.gpte_is_8_bytes=0, the guest uses 32-bit gptes while the host uses 64-bit
sptes. That means a guest page table contains more ptes than the host, sptes. That means a guest page table contains more ptes than the host,
so multiple shadow pages are needed to shadow one guest page. so multiple shadow pages are needed to shadow one guest page.
For first-level shadow pages, role.quadrant can be 0 or 1 and denotes the For first-level shadow pages, role.quadrant can be 0 or 1 and denotes the
@ -158,9 +158,9 @@ Shadow pages contain the following information:
The page is invalid and should not be used. It is a root page that is The page is invalid and should not be used. It is a root page that is
currently pinned (by a cpu hardware register pointing to it); once it is currently pinned (by a cpu hardware register pointing to it); once it is
unpinned it will be destroyed. unpinned it will be destroyed.
role.cr4_pae: role.gpte_is_8_bytes:
Contains the value of cr4.pae for which the page is valid (e.g. whether Reflects the size of the guest PTE for which the page is valid, i.e. '1'
32-bit or 64-bit gptes are in use). if 64-bit gptes are in use, '0' if 32-bit gptes are in use.
role.nxe: role.nxe:
Contains the value of efer.nxe for which the page is valid. Contains the value of efer.nxe for which the page is valid.
role.cr0_wp: role.cr0_wp:
@ -173,6 +173,9 @@ Shadow pages contain the following information:
Contains the value of cr4.smap && !cr0.wp for which the page is valid Contains the value of cr4.smap && !cr0.wp for which the page is valid
(pages for which this is true are different from other pages; see the (pages for which this is true are different from other pages; see the
treatment of cr0.wp=0 below). treatment of cr0.wp=0 below).
role.ept_sp:
This is a virtual flag to denote a shadowed nested EPT page. ept_sp
is true if "cr0_wp && smap_andnot_wp", an otherwise invalid combination.
role.smm: role.smm:
Is 1 if the page is valid in system management mode. This field Is 1 if the page is valid in system management mode. This field
determines which of the kvm_memslots array was used to build this determines which of the kvm_memslots array was used to build this

View File

@ -1893,14 +1893,15 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-nomadik.git
ARM/NUVOTON NPCM ARCHITECTURE ARM/NUVOTON NPCM ARCHITECTURE
M: Avi Fishman <avifishman70@gmail.com> M: Avi Fishman <avifishman70@gmail.com>
M: Tomer Maimon <tmaimon77@gmail.com> M: Tomer Maimon <tmaimon77@gmail.com>
M: Tali Perry <tali.perry1@gmail.com>
R: Patrick Venture <venture@google.com> R: Patrick Venture <venture@google.com>
R: Nancy Yuen <yuenn@google.com> R: Nancy Yuen <yuenn@google.com>
R: Brendan Higgins <brendanhiggins@google.com> R: Benjamin Fair <benjaminfair@google.com>
L: openbmc@lists.ozlabs.org (moderated for non-subscribers) L: openbmc@lists.ozlabs.org (moderated for non-subscribers)
S: Supported S: Supported
F: arch/arm/mach-npcm/ F: arch/arm/mach-npcm/
F: arch/arm/boot/dts/nuvoton-npcm* F: arch/arm/boot/dts/nuvoton-npcm*
F: include/dt-bindings/clock/nuvoton,npcm7xx-clks.h F: include/dt-bindings/clock/nuvoton,npcm7xx-clock.h
F: drivers/*/*npcm* F: drivers/*/*npcm*
F: Documentation/devicetree/bindings/*/*npcm* F: Documentation/devicetree/bindings/*/*npcm*
F: Documentation/devicetree/bindings/*/*/*npcm* F: Documentation/devicetree/bindings/*/*/*npcm*
@ -2356,7 +2357,7 @@ F: arch/arm/mm/cache-uniphier.c
F: arch/arm64/boot/dts/socionext/uniphier* F: arch/arm64/boot/dts/socionext/uniphier*
F: drivers/bus/uniphier-system-bus.c F: drivers/bus/uniphier-system-bus.c
F: drivers/clk/uniphier/ F: drivers/clk/uniphier/
F: drivers/dmaengine/uniphier-mdmac.c F: drivers/dma/uniphier-mdmac.c
F: drivers/gpio/gpio-uniphier.c F: drivers/gpio/gpio-uniphier.c
F: drivers/i2c/busses/i2c-uniphier* F: drivers/i2c/busses/i2c-uniphier*
F: drivers/irqchip/irq-uniphier-aidet.c F: drivers/irqchip/irq-uniphier-aidet.c
@ -4129,7 +4130,7 @@ F: drivers/cpuidle/*
F: include/linux/cpuidle.h F: include/linux/cpuidle.h
CRAMFS FILESYSTEM CRAMFS FILESYSTEM
M: Nicolas Pitre <nico@linaro.org> M: Nicolas Pitre <nico@fluxnic.net>
S: Maintained S: Maintained
F: Documentation/filesystems/cramfs.txt F: Documentation/filesystems/cramfs.txt
F: fs/cramfs/ F: fs/cramfs/
@ -5833,7 +5834,7 @@ L: netdev@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/ABI/testing/sysfs-bus-mdio F: Documentation/ABI/testing/sysfs-bus-mdio
F: Documentation/devicetree/bindings/net/mdio* F: Documentation/devicetree/bindings/net/mdio*
F: Documentation/networking/phy.txt F: Documentation/networking/phy.rst
F: drivers/net/phy/ F: drivers/net/phy/
F: drivers/of/of_mdio.c F: drivers/of/of_mdio.c
F: drivers/of/of_net.c F: drivers/of/of_net.c
@ -6408,7 +6409,6 @@ L: linux-kernel@vger.kernel.org
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git locking/core T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git locking/core
S: Maintained S: Maintained
F: kernel/futex.c F: kernel/futex.c
F: kernel/futex_compat.c
F: include/asm-generic/futex.h F: include/asm-generic/futex.h
F: include/linux/futex.h F: include/linux/futex.h
F: include/uapi/linux/futex.h F: include/uapi/linux/futex.h
@ -7516,7 +7516,7 @@ F: include/net/mac802154.h
F: include/net/af_ieee802154.h F: include/net/af_ieee802154.h
F: include/net/cfg802154.h F: include/net/cfg802154.h
F: include/net/ieee802154_netdev.h F: include/net/ieee802154_netdev.h
F: Documentation/networking/ieee802154.txt F: Documentation/networking/ieee802154.rst
IFE PROTOCOL IFE PROTOCOL
M: Yotam Gigi <yotam.gi@gmail.com> M: Yotam Gigi <yotam.gi@gmail.com>
@ -13982,7 +13982,7 @@ F: drivers/media/rc/serial_ir.c
SFC NETWORK DRIVER SFC NETWORK DRIVER
M: Solarflare linux maintainers <linux-net-drivers@solarflare.com> M: Solarflare linux maintainers <linux-net-drivers@solarflare.com>
M: Edward Cree <ecree@solarflare.com> M: Edward Cree <ecree@solarflare.com>
M: Bert Kenward <bkenward@solarflare.com> M: Martin Habets <mhabets@solarflare.com>
L: netdev@vger.kernel.org L: netdev@vger.kernel.org
S: Supported S: Supported
F: drivers/net/ethernet/sfc/ F: drivers/net/ethernet/sfc/
@ -15349,6 +15349,12 @@ F: Documentation/devicetree/bindings/reset/ti,sci-reset.txt
F: Documentation/devicetree/bindings/clock/ti,sci-clk.txt F: Documentation/devicetree/bindings/clock/ti,sci-clk.txt
F: drivers/clk/keystone/sci-clk.c F: drivers/clk/keystone/sci-clk.c
F: drivers/reset/reset-ti-sci.c F: drivers/reset/reset-ti-sci.c
F: Documentation/devicetree/bindings/interrupt-controller/ti,sci-intr.txt
F: Documentation/devicetree/bindings/interrupt-controller/ti,sci-inta.txt
F: drivers/irqchip/irq-ti-sci-intr.c
F: drivers/irqchip/irq-ti-sci-inta.c
F: include/linux/soc/ti/ti_sci_inta_msi.h
F: drivers/soc/ti/ti_sci_inta_msi.c
Texas Instruments ASoC drivers Texas Instruments ASoC drivers
M: Peter Ujfalusi <peter.ujfalusi@ti.com> M: Peter Ujfalusi <peter.ujfalusi@ti.com>
@ -16509,7 +16515,7 @@ F: drivers/char/virtio_console.c
F: include/linux/virtio_console.h F: include/linux/virtio_console.h
F: include/uapi/linux/virtio_console.h F: include/uapi/linux/virtio_console.h
VIRTIO CORE, NET AND BLOCK DRIVERS VIRTIO CORE AND NET DRIVERS
M: "Michael S. Tsirkin" <mst@redhat.com> M: "Michael S. Tsirkin" <mst@redhat.com>
M: Jason Wang <jasowang@redhat.com> M: Jason Wang <jasowang@redhat.com>
L: virtualization@lists.linux-foundation.org L: virtualization@lists.linux-foundation.org
@ -16524,6 +16530,19 @@ F: include/uapi/linux/virtio_*.h
F: drivers/crypto/virtio/ F: drivers/crypto/virtio/
F: mm/balloon_compaction.c F: mm/balloon_compaction.c
VIRTIO BLOCK AND SCSI DRIVERS
M: "Michael S. Tsirkin" <mst@redhat.com>
M: Jason Wang <jasowang@redhat.com>
R: Paolo Bonzini <pbonzini@redhat.com>
R: Stefan Hajnoczi <stefanha@redhat.com>
L: virtualization@lists.linux-foundation.org
S: Maintained
F: drivers/block/virtio_blk.c
F: drivers/scsi/virtio_scsi.c
F: include/uapi/linux/virtio_blk.h
F: include/uapi/linux/virtio_scsi.h
F: drivers/vhost/scsi.c
VIRTIO CRYPTO DRIVER VIRTIO CRYPTO DRIVER
M: Gonglei <arei.gonglei@huawei.com> M: Gonglei <arei.gonglei@huawei.com>
L: virtualization@lists.linux-foundation.org L: virtualization@lists.linux-foundation.org

View File

@ -2,7 +2,7 @@
VERSION = 5 VERSION = 5
PATCHLEVEL = 1 PATCHLEVEL = 1
SUBLEVEL = 0 SUBLEVEL = 0
EXTRAVERSION = -rc2 EXTRAVERSION = -rc5
NAME = Shy Crocodile NAME = Shy Crocodile
# *DOCUMENTATION* # *DOCUMENTATION*
@ -31,26 +31,12 @@ _all:
# descending is started. They are now explicitly listed as the # descending is started. They are now explicitly listed as the
# prepare rule. # prepare rule.
# Ugly workaround for Debian make-kpkg: ifneq ($(sub_make_done),1)
# make-kpkg directly includes the top Makefile of Linux kernel. In such a case,
# skip sub-make to support debian_* targets in ruleset/kernel_version.mk, but
# displays warning to discourage such abusage.
ifneq ($(word 2, $(MAKEFILE_LIST)),)
$(warning Do not include top Makefile of Linux Kernel)
sub-make-done := 1
MAKEFLAGS += -rR
endif
ifneq ($(sub-make-done),1)
# Do not use make's built-in rules and variables # Do not use make's built-in rules and variables
# (this increases performance and avoids hard-to-debug behaviour) # (this increases performance and avoids hard-to-debug behaviour)
MAKEFLAGS += -rR MAKEFLAGS += -rR
# 'MAKEFLAGS += -rR' does not become immediately effective for old
# GNU Make versions. Cancel implicit rules for this Makefile.
$(lastword $(MAKEFILE_LIST)): ;
# Avoid funny character set dependencies # Avoid funny character set dependencies
unexport LC_ALL unexport LC_ALL
LC_COLLATE=C LC_COLLATE=C
@ -153,6 +139,7 @@ $(if $(KBUILD_OUTPUT),, \
# 'sub-make' below. # 'sub-make' below.
MAKEFLAGS += --include-dir=$(CURDIR) MAKEFLAGS += --include-dir=$(CURDIR)
need-sub-make := 1
else else
# Do not print "Entering directory ..." at all for in-tree build. # Do not print "Entering directory ..." at all for in-tree build.
@ -160,6 +147,18 @@ MAKEFLAGS += --no-print-directory
endif # ifneq ($(KBUILD_OUTPUT),) endif # ifneq ($(KBUILD_OUTPUT),)
ifneq ($(filter 3.%,$(MAKE_VERSION)),)
# 'MAKEFLAGS += -rR' does not immediately become effective for GNU Make 3.x
# We need to invoke sub-make to avoid implicit rules in the top Makefile.
need-sub-make := 1
# Cancel implicit rules for this Makefile.
$(lastword $(MAKEFILE_LIST)): ;
endif
export sub_make_done := 1
ifeq ($(need-sub-make),1)
PHONY += $(MAKECMDGOALS) sub-make PHONY += $(MAKECMDGOALS) sub-make
$(filter-out _all sub-make $(CURDIR)/Makefile, $(MAKECMDGOALS)) _all: sub-make $(filter-out _all sub-make $(CURDIR)/Makefile, $(MAKECMDGOALS)) _all: sub-make
@ -167,12 +166,15 @@ $(filter-out _all sub-make $(CURDIR)/Makefile, $(MAKECMDGOALS)) _all: sub-make
# Invoke a second make in the output directory, passing relevant variables # Invoke a second make in the output directory, passing relevant variables
sub-make: sub-make:
$(Q)$(MAKE) sub-make-done=1 \ $(Q)$(MAKE) \
$(if $(KBUILD_OUTPUT),-C $(KBUILD_OUTPUT) KBUILD_SRC=$(CURDIR)) \ $(if $(KBUILD_OUTPUT),-C $(KBUILD_OUTPUT) KBUILD_SRC=$(CURDIR)) \
-f $(CURDIR)/Makefile $(filter-out _all sub-make,$(MAKECMDGOALS)) -f $(CURDIR)/Makefile $(filter-out _all sub-make,$(MAKECMDGOALS))
else # sub-make-done endif # need-sub-make
endif # sub_make_done
# We process the rest of the Makefile if this is the final invocation of make # We process the rest of the Makefile if this is the final invocation of make
ifeq ($(need-sub-make),)
# Do not print "Entering directory ...", # Do not print "Entering directory ...",
# but we want to display it when entering to the output directory # but we want to display it when entering to the output directory
@ -497,7 +499,8 @@ outputmakefile:
ifneq ($(KBUILD_SRC),) ifneq ($(KBUILD_SRC),)
$(Q)ln -fsn $(srctree) source $(Q)ln -fsn $(srctree) source
$(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile $(srctree) $(Q)$(CONFIG_SHELL) $(srctree)/scripts/mkmakefile $(srctree)
$(Q){ echo "# this is build directory, ignore it"; echo "*"; } > .gitignore $(Q)test -e .gitignore || \
{ echo "# this is build directory, ignore it"; echo "*"; } > .gitignore
endif endif
ifneq ($(shell $(CC) --version 2>&1 | head -n 1 | grep clang),) ifneq ($(shell $(CC) --version 2>&1 | head -n 1 | grep clang),)
@ -677,7 +680,7 @@ KBUILD_CFLAGS += $(call cc-disable-warning, format-overflow)
KBUILD_CFLAGS += $(call cc-disable-warning, int-in-bool-context) KBUILD_CFLAGS += $(call cc-disable-warning, int-in-bool-context)
ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE ifdef CONFIG_CC_OPTIMIZE_FOR_SIZE
KBUILD_CFLAGS += $(call cc-option,-Oz,-Os) KBUILD_CFLAGS += -Os
else else
KBUILD_CFLAGS += -O2 KBUILD_CFLAGS += -O2
endif endif
@ -950,9 +953,11 @@ mod_sign_cmd = true
endif endif
export mod_sign_cmd export mod_sign_cmd
HOST_LIBELF_LIBS = $(shell pkg-config libelf --libs 2>/dev/null || echo -lelf)
ifdef CONFIG_STACK_VALIDATION ifdef CONFIG_STACK_VALIDATION
has_libelf := $(call try-run,\ has_libelf := $(call try-run,\
echo "int main() {}" | $(HOSTCC) -xc -o /dev/null -lelf -,1,0) echo "int main() {}" | $(HOSTCC) -xc -o /dev/null $(HOST_LIBELF_LIBS) -,1,0)
ifeq ($(has_libelf),1) ifeq ($(has_libelf),1)
objtool_target := tools/objtool FORCE objtool_target := tools/objtool FORCE
else else
@ -1757,7 +1762,7 @@ existing-targets := $(wildcard $(sort $(targets)))
endif # ifeq ($(config-targets),1) endif # ifeq ($(config-targets),1)
endif # ifeq ($(mixed-targets),1) endif # ifeq ($(mixed-targets),1)
endif # sub-make-done endif # need-sub-make
PHONY += FORCE PHONY += FORCE
FORCE: FORCE:

View File

@ -6,6 +6,7 @@ generic-y += exec.h
generic-y += export.h generic-y += export.h
generic-y += fb.h generic-y += fb.h
generic-y += irq_work.h generic-y += irq_work.h
generic-y += kvm_para.h
generic-y += mcs_spinlock.h generic-y += mcs_spinlock.h
generic-y += mm-arch-hooks.h generic-y += mm-arch-hooks.h
generic-y += preempt.h generic-y += preempt.h

View File

@ -1,2 +0,0 @@
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#include <asm-generic/kvm_para.h>

View File

@ -11,6 +11,7 @@ generic-y += hardirq.h
generic-y += hw_irq.h generic-y += hw_irq.h
generic-y += irq_regs.h generic-y += irq_regs.h
generic-y += irq_work.h generic-y += irq_work.h
generic-y += kvm_para.h
generic-y += local.h generic-y += local.h
generic-y += local64.h generic-y += local64.h
generic-y += mcs_spinlock.h generic-y += mcs_spinlock.h

View File

@ -55,12 +55,11 @@ syscall_set_return_value(struct task_struct *task, struct pt_regs *regs,
*/ */
static inline void static inline void
syscall_get_arguments(struct task_struct *task, struct pt_regs *regs, syscall_get_arguments(struct task_struct *task, struct pt_regs *regs,
unsigned int i, unsigned int n, unsigned long *args) unsigned long *args)
{ {
unsigned long *inside_ptregs = &(regs->r0); unsigned long *inside_ptregs = &(regs->r0);
inside_ptregs -= i; unsigned int n = 6;
unsigned int i = 0;
BUG_ON((i + n) > 6);
while (n--) { while (n--) {
args[i++] = (*inside_ptregs); args[i++] = (*inside_ptregs);

View File

@ -1,2 +1 @@
generic-y += kvm_para.h
generic-y += ucontext.h generic-y += ucontext.h

View File

@ -596,6 +596,7 @@ config ARCH_DAVINCI
select HAVE_IDE select HAVE_IDE
select PM_GENERIC_DOMAINS if PM select PM_GENERIC_DOMAINS if PM
select PM_GENERIC_DOMAINS_OF if PM && OF select PM_GENERIC_DOMAINS_OF if PM && OF
select REGMAP_MMIO
select RESET_CONTROLLER select RESET_CONTROLLER
select SPARSE_IRQ select SPARSE_IRQ
select USE_OF select USE_OF

View File

@ -57,6 +57,24 @@
enable-active-high; enable-active-high;
}; };
/* TPS79501 */
v1_8d_reg: fixedregulator-v1_8d {
compatible = "regulator-fixed";
regulator-name = "v1_8d";
vin-supply = <&vbat>;
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <1800000>;
};
/* TPS79501 */
v3_3d_reg: fixedregulator-v3_3d {
compatible = "regulator-fixed";
regulator-name = "v3_3d";
vin-supply = <&vbat>;
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
};
matrix_keypad: matrix_keypad0 { matrix_keypad: matrix_keypad0 {
compatible = "gpio-matrix-keypad"; compatible = "gpio-matrix-keypad";
debounce-delay-ms = <5>; debounce-delay-ms = <5>;
@ -499,10 +517,10 @@
status = "okay"; status = "okay";
/* Regulators */ /* Regulators */
AVDD-supply = <&vaux2_reg>; AVDD-supply = <&v3_3d_reg>;
IOVDD-supply = <&vaux2_reg>; IOVDD-supply = <&v3_3d_reg>;
DRVDD-supply = <&vaux2_reg>; DRVDD-supply = <&v3_3d_reg>;
DVDD-supply = <&vbat>; DVDD-supply = <&v1_8d_reg>;
}; };
}; };

View File

@ -73,6 +73,24 @@
enable-active-high; enable-active-high;
}; };
/* TPS79518 */
v1_8d_reg: fixedregulator-v1_8d {
compatible = "regulator-fixed";
regulator-name = "v1_8d";
vin-supply = <&vbat>;
regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <1800000>;
};
/* TPS78633 */
v3_3d_reg: fixedregulator-v3_3d {
compatible = "regulator-fixed";
regulator-name = "v3_3d";
vin-supply = <&vbat>;
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
};
leds { leds {
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&user_leds_s0>; pinctrl-0 = <&user_leds_s0>;
@ -501,10 +519,10 @@
status = "okay"; status = "okay";
/* Regulators */ /* Regulators */
AVDD-supply = <&vaux2_reg>; AVDD-supply = <&v3_3d_reg>;
IOVDD-supply = <&vaux2_reg>; IOVDD-supply = <&v3_3d_reg>;
DRVDD-supply = <&vaux2_reg>; DRVDD-supply = <&v3_3d_reg>;
DVDD-supply = <&vbat>; DVDD-supply = <&v1_8d_reg>;
}; };
}; };

View File

@ -1762,7 +1762,7 @@
reg = <0xcc000 0x4>; reg = <0xcc000 0x4>;
reg-names = "rev"; reg-names = "rev";
/* Domains (P, C): per_pwrdm, l4ls_clkdm */ /* Domains (P, C): per_pwrdm, l4ls_clkdm */
clocks = <&l4ls_clkctrl AM3_D_CAN0_CLKCTRL 0>; clocks = <&l4ls_clkctrl AM3_L4LS_D_CAN0_CLKCTRL 0>;
clock-names = "fck"; clock-names = "fck";
#address-cells = <1>; #address-cells = <1>;
#size-cells = <1>; #size-cells = <1>;
@ -1785,7 +1785,7 @@
reg = <0xd0000 0x4>; reg = <0xd0000 0x4>;
reg-names = "rev"; reg-names = "rev";
/* Domains (P, C): per_pwrdm, l4ls_clkdm */ /* Domains (P, C): per_pwrdm, l4ls_clkdm */
clocks = <&l4ls_clkctrl AM3_D_CAN1_CLKCTRL 0>; clocks = <&l4ls_clkctrl AM3_L4LS_D_CAN1_CLKCTRL 0>;
clock-names = "fck"; clock-names = "fck";
#address-cells = <1>; #address-cells = <1>;
#size-cells = <1>; #size-cells = <1>;

View File

@ -93,7 +93,7 @@
}; };
&hdmi { &hdmi {
hpd-gpios = <&gpio 46 GPIO_ACTIVE_LOW>; hpd-gpios = <&gpio 46 GPIO_ACTIVE_HIGH>;
}; };
&pwm { &pwm {

View File

@ -114,9 +114,9 @@
reg = <2>; reg = <2>;
}; };
switch@0 { switch@10 {
compatible = "qca,qca8334"; compatible = "qca,qca8334";
reg = <0>; reg = <10>;
switch_ports: ports { switch_ports: ports {
#address-cells = <1>; #address-cells = <1>;
@ -125,7 +125,7 @@
ethphy0: port@0 { ethphy0: port@0 {
reg = <0>; reg = <0>;
label = "cpu"; label = "cpu";
phy-mode = "rgmii"; phy-mode = "rgmii-id";
ethernet = <&fec>; ethernet = <&fec>;
fixed-link { fixed-link {

View File

@ -264,7 +264,7 @@
pinctrl-2 = <&pinctrl_usdhc3_200mhz>; pinctrl-2 = <&pinctrl_usdhc3_200mhz>;
vmcc-supply = <&reg_sd3_vmmc>; vmcc-supply = <&reg_sd3_vmmc>;
cd-gpios = <&gpio1 1 GPIO_ACTIVE_LOW>; cd-gpios = <&gpio1 1 GPIO_ACTIVE_LOW>;
bus-witdh = <4>; bus-width = <4>;
no-1-8-v; no-1-8-v;
status = "okay"; status = "okay";
}; };
@ -275,7 +275,7 @@
pinctrl-1 = <&pinctrl_usdhc4_100mhz>; pinctrl-1 = <&pinctrl_usdhc4_100mhz>;
pinctrl-2 = <&pinctrl_usdhc4_200mhz>; pinctrl-2 = <&pinctrl_usdhc4_200mhz>;
vmcc-supply = <&reg_sd4_vmmc>; vmcc-supply = <&reg_sd4_vmmc>;
bus-witdh = <8>; bus-width = <8>;
no-1-8-v; no-1-8-v;
non-removable; non-removable;
status = "okay"; status = "okay";

View File

@ -91,6 +91,7 @@
pinctrl-0 = <&pinctrl_enet>; pinctrl-0 = <&pinctrl_enet>;
phy-handle = <&ethphy>; phy-handle = <&ethphy>;
phy-mode = "rgmii"; phy-mode = "rgmii";
phy-reset-duration = <10>; /* in msecs */
phy-reset-gpios = <&gpio3 23 GPIO_ACTIVE_LOW>; phy-reset-gpios = <&gpio3 23 GPIO_ACTIVE_LOW>;
phy-supply = <&vdd_eth_io_reg>; phy-supply = <&vdd_eth_io_reg>;
status = "disabled"; status = "disabled";

View File

@ -1,4 +1,4 @@
// SPDX-License-Identifier: GPL-2.0 /* SPDX-License-Identifier: GPL-2.0 */
/* /*
* Copyright (C) 2016 Freescale Semiconductor, Inc. * Copyright (C) 2016 Freescale Semiconductor, Inc.
* Copyright (C) 2017 NXP * Copyright (C) 2017 NXP

View File

@ -254,6 +254,7 @@
}; };
vccio_sd: LDO_REG5 { vccio_sd: LDO_REG5 {
regulator-boot-on;
regulator-min-microvolt = <1800000>; regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <3300000>; regulator-max-microvolt = <3300000>;
regulator-name = "vccio_sd"; regulator-name = "vccio_sd";
@ -430,7 +431,7 @@
bus-width = <4>; bus-width = <4>;
cap-mmc-highspeed; cap-mmc-highspeed;
cap-sd-highspeed; cap-sd-highspeed;
card-detect-delay = <200>; broken-cd;
disable-wp; /* wp not hooked up */ disable-wp; /* wp not hooked up */
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_cd &sdmmc_bus4>; pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_cd &sdmmc_bus4>;

View File

@ -25,8 +25,6 @@
gpio_keys: gpio-keys { gpio_keys: gpio-keys {
compatible = "gpio-keys"; compatible = "gpio-keys";
#address-cells = <1>;
#size-cells = <0>;
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&pwr_key_l>; pinctrl-0 = <&pwr_key_l>;

View File

@ -70,7 +70,7 @@
compatible = "arm,cortex-a12"; compatible = "arm,cortex-a12";
reg = <0x501>; reg = <0x501>;
resets = <&cru SRST_CORE1>; resets = <&cru SRST_CORE1>;
operating-points = <&cpu_opp_table>; operating-points-v2 = <&cpu_opp_table>;
#cooling-cells = <2>; /* min followed by max */ #cooling-cells = <2>; /* min followed by max */
clock-latency = <40000>; clock-latency = <40000>;
clocks = <&cru ARMCLK>; clocks = <&cru ARMCLK>;
@ -80,7 +80,7 @@
compatible = "arm,cortex-a12"; compatible = "arm,cortex-a12";
reg = <0x502>; reg = <0x502>;
resets = <&cru SRST_CORE2>; resets = <&cru SRST_CORE2>;
operating-points = <&cpu_opp_table>; operating-points-v2 = <&cpu_opp_table>;
#cooling-cells = <2>; /* min followed by max */ #cooling-cells = <2>; /* min followed by max */
clock-latency = <40000>; clock-latency = <40000>;
clocks = <&cru ARMCLK>; clocks = <&cru ARMCLK>;
@ -90,7 +90,7 @@
compatible = "arm,cortex-a12"; compatible = "arm,cortex-a12";
reg = <0x503>; reg = <0x503>;
resets = <&cru SRST_CORE3>; resets = <&cru SRST_CORE3>;
operating-points = <&cpu_opp_table>; operating-points-v2 = <&cpu_opp_table>;
#cooling-cells = <2>; /* min followed by max */ #cooling-cells = <2>; /* min followed by max */
clock-latency = <40000>; clock-latency = <40000>;
clocks = <&cru ARMCLK>; clocks = <&cru ARMCLK>;
@ -1119,8 +1119,6 @@
clock-names = "ref", "pclk"; clock-names = "ref", "pclk";
power-domains = <&power RK3288_PD_VIO>; power-domains = <&power RK3288_PD_VIO>;
rockchip,grf = <&grf>; rockchip,grf = <&grf>;
#address-cells = <1>;
#size-cells = <0>;
status = "disabled"; status = "disabled";
ports { ports {
@ -1282,27 +1280,27 @@
gpu_opp_table: gpu-opp-table { gpu_opp_table: gpu-opp-table {
compatible = "operating-points-v2"; compatible = "operating-points-v2";
opp@100000000 { opp-100000000 {
opp-hz = /bits/ 64 <100000000>; opp-hz = /bits/ 64 <100000000>;
opp-microvolt = <950000>; opp-microvolt = <950000>;
}; };
opp@200000000 { opp-200000000 {
opp-hz = /bits/ 64 <200000000>; opp-hz = /bits/ 64 <200000000>;
opp-microvolt = <950000>; opp-microvolt = <950000>;
}; };
opp@300000000 { opp-300000000 {
opp-hz = /bits/ 64 <300000000>; opp-hz = /bits/ 64 <300000000>;
opp-microvolt = <1000000>; opp-microvolt = <1000000>;
}; };
opp@400000000 { opp-400000000 {
opp-hz = /bits/ 64 <400000000>; opp-hz = /bits/ 64 <400000000>;
opp-microvolt = <1100000>; opp-microvolt = <1100000>;
}; };
opp@500000000 { opp-500000000 {
opp-hz = /bits/ 64 <500000000>; opp-hz = /bits/ 64 <500000000>;
opp-microvolt = <1200000>; opp-microvolt = <1200000>;
}; };
opp@600000000 { opp-600000000 {
opp-hz = /bits/ 64 <600000000>; opp-hz = /bits/ 64 <600000000>;
opp-microvolt = <1250000>; opp-microvolt = <1250000>;
}; };

View File

@ -518,7 +518,7 @@
#define PIN_PC9__GPIO PINMUX_PIN(PIN_PC9, 0, 0) #define PIN_PC9__GPIO PINMUX_PIN(PIN_PC9, 0, 0)
#define PIN_PC9__FIQ PINMUX_PIN(PIN_PC9, 1, 3) #define PIN_PC9__FIQ PINMUX_PIN(PIN_PC9, 1, 3)
#define PIN_PC9__GTSUCOMP PINMUX_PIN(PIN_PC9, 2, 1) #define PIN_PC9__GTSUCOMP PINMUX_PIN(PIN_PC9, 2, 1)
#define PIN_PC9__ISC_D0 PINMUX_PIN(PIN_PC9, 2, 1) #define PIN_PC9__ISC_D0 PINMUX_PIN(PIN_PC9, 3, 1)
#define PIN_PC9__TIOA4 PINMUX_PIN(PIN_PC9, 4, 2) #define PIN_PC9__TIOA4 PINMUX_PIN(PIN_PC9, 4, 2)
#define PIN_PC10 74 #define PIN_PC10 74
#define PIN_PC10__GPIO PINMUX_PIN(PIN_PC10, 0, 0) #define PIN_PC10__GPIO PINMUX_PIN(PIN_PC10, 0, 0)

View File

@ -170,6 +170,9 @@ CONFIG_IMX_SDMA=y
# CONFIG_IOMMU_SUPPORT is not set # CONFIG_IOMMU_SUPPORT is not set
CONFIG_IIO=y CONFIG_IIO=y
CONFIG_FSL_MX25_ADC=y CONFIG_FSL_MX25_ADC=y
CONFIG_PWM=y
CONFIG_PWM_IMX1=y
CONFIG_PWM_IMX27=y
CONFIG_EXT4_FS=y CONFIG_EXT4_FS=y
# CONFIG_DNOTIFY is not set # CONFIG_DNOTIFY is not set
CONFIG_VFAT_FS=y CONFIG_VFAT_FS=y

View File

@ -398,7 +398,7 @@ CONFIG_MAG3110=y
CONFIG_MPL3115=y CONFIG_MPL3115=y
CONFIG_PWM=y CONFIG_PWM=y
CONFIG_PWM_FSL_FTM=y CONFIG_PWM_FSL_FTM=y
CONFIG_PWM_IMX=y CONFIG_PWM_IMX27=y
CONFIG_NVMEM_IMX_OCOTP=y CONFIG_NVMEM_IMX_OCOTP=y
CONFIG_NVMEM_VF610_OCOTP=y CONFIG_NVMEM_VF610_OCOTP=y
CONFIG_TEE=y CONFIG_TEE=y

View File

@ -381,6 +381,17 @@ static inline int kvm_read_guest_lock(struct kvm *kvm,
return ret; return ret;
} }
static inline int kvm_write_guest_lock(struct kvm *kvm, gpa_t gpa,
const void *data, unsigned long len)
{
int srcu_idx = srcu_read_lock(&kvm->srcu);
int ret = kvm_write_guest(kvm, gpa, data, len);
srcu_read_unlock(&kvm->srcu, srcu_idx);
return ret;
}
static inline void *kvm_get_hyp_vector(void) static inline void *kvm_get_hyp_vector(void)
{ {
switch(read_cpuid_part()) { switch(read_cpuid_part()) {

View File

@ -75,6 +75,8 @@ static inline bool kvm_stage2_has_pud(struct kvm *kvm)
#define S2_PMD_MASK PMD_MASK #define S2_PMD_MASK PMD_MASK
#define S2_PMD_SIZE PMD_SIZE #define S2_PMD_SIZE PMD_SIZE
#define S2_PUD_MASK PUD_MASK
#define S2_PUD_SIZE PUD_SIZE
static inline bool kvm_stage2_has_pmd(struct kvm *kvm) static inline bool kvm_stage2_has_pmd(struct kvm *kvm)
{ {

View File

@ -55,53 +55,22 @@ static inline void syscall_set_return_value(struct task_struct *task,
static inline void syscall_get_arguments(struct task_struct *task, static inline void syscall_get_arguments(struct task_struct *task,
struct pt_regs *regs, struct pt_regs *regs,
unsigned int i, unsigned int n,
unsigned long *args) unsigned long *args)
{ {
if (n == 0) args[0] = regs->ARM_ORIG_r0;
return; args++;
if (i + n > SYSCALL_MAX_ARGS) { memcpy(args, &regs->ARM_r0 + 1, 5 * sizeof(args[0]));
unsigned long *args_bad = args + SYSCALL_MAX_ARGS - i;
unsigned int n_bad = n + i - SYSCALL_MAX_ARGS;
pr_warn("%s called with max args %d, handling only %d\n",
__func__, i + n, SYSCALL_MAX_ARGS);
memset(args_bad, 0, n_bad * sizeof(args[0]));
n = SYSCALL_MAX_ARGS - i;
}
if (i == 0) {
args[0] = regs->ARM_ORIG_r0;
args++;
i++;
n--;
}
memcpy(args, &regs->ARM_r0 + i, n * sizeof(args[0]));
} }
static inline void syscall_set_arguments(struct task_struct *task, static inline void syscall_set_arguments(struct task_struct *task,
struct pt_regs *regs, struct pt_regs *regs,
unsigned int i, unsigned int n,
const unsigned long *args) const unsigned long *args)
{ {
if (n == 0) regs->ARM_ORIG_r0 = args[0];
return; args++;
if (i + n > SYSCALL_MAX_ARGS) { memcpy(&regs->ARM_r0 + 1, args, 5 * sizeof(args[0]));
pr_warn("%s called with max args %d, handling only %d\n",
__func__, i + n, SYSCALL_MAX_ARGS);
n = SYSCALL_MAX_ARGS - i;
}
if (i == 0) {
regs->ARM_ORIG_r0 = args[0];
args++;
i++;
n--;
}
memcpy(&regs->ARM_r0 + i, args, n * sizeof(args[0]));
} }
static inline int syscall_get_arch(void) static inline int syscall_get_arch(void)

View File

@ -3,3 +3,4 @@
generated-y += unistd-common.h generated-y += unistd-common.h
generated-y += unistd-oabi.h generated-y += unistd-oabi.h
generated-y += unistd-eabi.h generated-y += unistd-eabi.h
generic-y += kvm_para.h

View File

@ -1,2 +0,0 @@
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#include <asm-generic/kvm_para.h>

View File

@ -591,13 +591,13 @@ static int __init at91_pm_backup_init(void)
np = of_find_compatible_node(NULL, NULL, "atmel,sama5d2-securam"); np = of_find_compatible_node(NULL, NULL, "atmel,sama5d2-securam");
if (!np) if (!np)
goto securam_fail; goto securam_fail_no_ref_dev;
pdev = of_find_device_by_node(np); pdev = of_find_device_by_node(np);
of_node_put(np); of_node_put(np);
if (!pdev) { if (!pdev) {
pr_warn("%s: failed to find securam device!\n", __func__); pr_warn("%s: failed to find securam device!\n", __func__);
goto securam_fail; goto securam_fail_no_ref_dev;
} }
sram_pool = gen_pool_get(&pdev->dev, NULL); sram_pool = gen_pool_get(&pdev->dev, NULL);
@ -620,6 +620,8 @@ static int __init at91_pm_backup_init(void)
return 0; return 0;
securam_fail: securam_fail:
put_device(&pdev->dev);
securam_fail_no_ref_dev:
iounmap(pm_data.sfrbu); iounmap(pm_data.sfrbu);
pm_data.sfrbu = NULL; pm_data.sfrbu = NULL;
return ret; return ret;

View File

@ -16,30 +16,23 @@
#include "cpuidle.h" #include "cpuidle.h"
#include "hardware.h" #include "hardware.h"
static atomic_t master = ATOMIC_INIT(0); static int num_idle_cpus = 0;
static DEFINE_SPINLOCK(master_lock); static DEFINE_SPINLOCK(cpuidle_lock);
static int imx6q_enter_wait(struct cpuidle_device *dev, static int imx6q_enter_wait(struct cpuidle_device *dev,
struct cpuidle_driver *drv, int index) struct cpuidle_driver *drv, int index)
{ {
if (atomic_inc_return(&master) == num_online_cpus()) { spin_lock(&cpuidle_lock);
/* if (++num_idle_cpus == num_online_cpus())
* With this lock, we prevent other cpu to exit and enter
* this function again and become the master.
*/
if (!spin_trylock(&master_lock))
goto idle;
imx6_set_lpm(WAIT_UNCLOCKED); imx6_set_lpm(WAIT_UNCLOCKED);
cpu_do_idle(); spin_unlock(&cpuidle_lock);
imx6_set_lpm(WAIT_CLOCKED);
spin_unlock(&master_lock);
goto done;
}
idle:
cpu_do_idle(); cpu_do_idle();
done:
atomic_dec(&master); spin_lock(&cpuidle_lock);
if (num_idle_cpus-- == num_online_cpus())
imx6_set_lpm(WAIT_CLOCKED);
spin_unlock(&cpuidle_lock);
return index; return index;
} }

View File

@ -59,6 +59,7 @@ static void __init imx51_m4if_setup(void)
return; return;
m4if_base = of_iomap(np, 0); m4if_base = of_iomap(np, 0);
of_node_put(np);
if (!m4if_base) { if (!m4if_base) {
pr_err("Unable to map M4IF registers\n"); pr_err("Unable to map M4IF registers\n");
return; return;

View File

@ -300,7 +300,7 @@ static struct resource iop13xx_adma_2_resources[] = {
} }
}; };
static u64 iop13xx_adma_dmamask = DMA_BIT_MASK(64); static u64 iop13xx_adma_dmamask = DMA_BIT_MASK(32);
static struct iop_adma_platform_data iop13xx_adma_0_data = { static struct iop_adma_platform_data iop13xx_adma_0_data = {
.hw_id = 0, .hw_id = 0,
.pool_size = PAGE_SIZE, .pool_size = PAGE_SIZE,
@ -324,7 +324,7 @@ static struct platform_device iop13xx_adma_0_channel = {
.resource = iop13xx_adma_0_resources, .resource = iop13xx_adma_0_resources,
.dev = { .dev = {
.dma_mask = &iop13xx_adma_dmamask, .dma_mask = &iop13xx_adma_dmamask,
.coherent_dma_mask = DMA_BIT_MASK(64), .coherent_dma_mask = DMA_BIT_MASK(32),
.platform_data = (void *) &iop13xx_adma_0_data, .platform_data = (void *) &iop13xx_adma_0_data,
}, },
}; };
@ -336,7 +336,7 @@ static struct platform_device iop13xx_adma_1_channel = {
.resource = iop13xx_adma_1_resources, .resource = iop13xx_adma_1_resources,
.dev = { .dev = {
.dma_mask = &iop13xx_adma_dmamask, .dma_mask = &iop13xx_adma_dmamask,
.coherent_dma_mask = DMA_BIT_MASK(64), .coherent_dma_mask = DMA_BIT_MASK(32),
.platform_data = (void *) &iop13xx_adma_1_data, .platform_data = (void *) &iop13xx_adma_1_data,
}, },
}; };
@ -348,7 +348,7 @@ static struct platform_device iop13xx_adma_2_channel = {
.resource = iop13xx_adma_2_resources, .resource = iop13xx_adma_2_resources,
.dev = { .dev = {
.dma_mask = &iop13xx_adma_dmamask, .dma_mask = &iop13xx_adma_dmamask,
.coherent_dma_mask = DMA_BIT_MASK(64), .coherent_dma_mask = DMA_BIT_MASK(32),
.platform_data = (void *) &iop13xx_adma_2_data, .platform_data = (void *) &iop13xx_adma_2_data,
}, },
}; };

View File

@ -152,7 +152,7 @@ static struct resource iop13xx_tpmi_3_resources[] = {
} }
}; };
u64 iop13xx_tpmi_mask = DMA_BIT_MASK(64); u64 iop13xx_tpmi_mask = DMA_BIT_MASK(32);
static struct platform_device iop13xx_tpmi_0_device = { static struct platform_device iop13xx_tpmi_0_device = {
.name = "iop-tpmi", .name = "iop-tpmi",
.id = 0, .id = 0,
@ -160,7 +160,7 @@ static struct platform_device iop13xx_tpmi_0_device = {
.resource = iop13xx_tpmi_0_resources, .resource = iop13xx_tpmi_0_resources,
.dev = { .dev = {
.dma_mask = &iop13xx_tpmi_mask, .dma_mask = &iop13xx_tpmi_mask,
.coherent_dma_mask = DMA_BIT_MASK(64), .coherent_dma_mask = DMA_BIT_MASK(32),
}, },
}; };
@ -171,7 +171,7 @@ static struct platform_device iop13xx_tpmi_1_device = {
.resource = iop13xx_tpmi_1_resources, .resource = iop13xx_tpmi_1_resources,
.dev = { .dev = {
.dma_mask = &iop13xx_tpmi_mask, .dma_mask = &iop13xx_tpmi_mask,
.coherent_dma_mask = DMA_BIT_MASK(64), .coherent_dma_mask = DMA_BIT_MASK(32),
}, },
}; };
@ -182,7 +182,7 @@ static struct platform_device iop13xx_tpmi_2_device = {
.resource = iop13xx_tpmi_2_resources, .resource = iop13xx_tpmi_2_resources,
.dev = { .dev = {
.dma_mask = &iop13xx_tpmi_mask, .dma_mask = &iop13xx_tpmi_mask,
.coherent_dma_mask = DMA_BIT_MASK(64), .coherent_dma_mask = DMA_BIT_MASK(32),
}, },
}; };
@ -193,7 +193,7 @@ static struct platform_device iop13xx_tpmi_3_device = {
.resource = iop13xx_tpmi_3_resources, .resource = iop13xx_tpmi_3_resources,
.dev = { .dev = {
.dma_mask = &iop13xx_tpmi_mask, .dma_mask = &iop13xx_tpmi_mask,
.coherent_dma_mask = DMA_BIT_MASK(64), .coherent_dma_mask = DMA_BIT_MASK(32),
}, },
}; };

View File

@ -65,6 +65,7 @@ static void m10v_smp_init(unsigned int max_cpus)
writel(KERNEL_UNBOOT_FLAG, m10v_smp_base + cpu * 4); writel(KERNEL_UNBOOT_FLAG, m10v_smp_base + cpu * 4);
} }
#ifdef CONFIG_HOTPLUG_CPU
static void m10v_cpu_die(unsigned int l_cpu) static void m10v_cpu_die(unsigned int l_cpu)
{ {
gic_cpu_if_down(0); gic_cpu_if_down(0);
@ -83,12 +84,15 @@ static int m10v_cpu_kill(unsigned int l_cpu)
return 1; return 1;
} }
#endif
static struct smp_operations m10v_smp_ops __initdata = { static struct smp_operations m10v_smp_ops __initdata = {
.smp_prepare_cpus = m10v_smp_init, .smp_prepare_cpus = m10v_smp_init,
.smp_boot_secondary = m10v_boot_secondary, .smp_boot_secondary = m10v_boot_secondary,
#ifdef CONFIG_HOTPLUG_CPU
.cpu_die = m10v_cpu_die, .cpu_die = m10v_cpu_die,
.cpu_kill = m10v_cpu_kill, .cpu_kill = m10v_cpu_kill,
#endif
}; };
CPU_METHOD_OF_DECLARE(m10v_smp, "socionext,milbeaut-m10v-smp", &m10v_smp_ops); CPU_METHOD_OF_DECLARE(m10v_smp, "socionext,milbeaut-m10v-smp", &m10v_smp_ops);

View File

@ -182,6 +182,7 @@ static struct resource latch1_resources[] = {
static struct bgpio_pdata latch1_pdata = { static struct bgpio_pdata latch1_pdata = {
.label = LATCH1_LABEL, .label = LATCH1_LABEL,
.base = -1,
.ngpio = LATCH1_NGPIO, .ngpio = LATCH1_NGPIO,
}; };
@ -219,6 +220,7 @@ static struct resource latch2_resources[] = {
static struct bgpio_pdata latch2_pdata = { static struct bgpio_pdata latch2_pdata = {
.label = LATCH2_LABEL, .label = LATCH2_LABEL,
.base = -1,
.ngpio = LATCH2_NGPIO, .ngpio = LATCH2_NGPIO,
}; };

View File

@ -250,8 +250,10 @@ static int __init omapdss_init_of(void)
if (!node) if (!node)
return 0; return 0;
if (!of_device_is_available(node)) if (!of_device_is_available(node)) {
of_node_put(node);
return 0; return 0;
}
pdev = of_find_device_by_node(node); pdev = of_find_device_by_node(node);

View File

@ -143,7 +143,7 @@ struct platform_device iop3xx_dma_0_channel = {
.resource = iop3xx_dma_0_resources, .resource = iop3xx_dma_0_resources,
.dev = { .dev = {
.dma_mask = &iop3xx_adma_dmamask, .dma_mask = &iop3xx_adma_dmamask,
.coherent_dma_mask = DMA_BIT_MASK(64), .coherent_dma_mask = DMA_BIT_MASK(32),
.platform_data = (void *) &iop3xx_dma_0_data, .platform_data = (void *) &iop3xx_dma_0_data,
}, },
}; };
@ -155,7 +155,7 @@ struct platform_device iop3xx_dma_1_channel = {
.resource = iop3xx_dma_1_resources, .resource = iop3xx_dma_1_resources,
.dev = { .dev = {
.dma_mask = &iop3xx_adma_dmamask, .dma_mask = &iop3xx_adma_dmamask,
.coherent_dma_mask = DMA_BIT_MASK(64), .coherent_dma_mask = DMA_BIT_MASK(32),
.platform_data = (void *) &iop3xx_dma_1_data, .platform_data = (void *) &iop3xx_dma_1_data,
}, },
}; };
@ -167,7 +167,7 @@ struct platform_device iop3xx_aau_channel = {
.resource = iop3xx_aau_resources, .resource = iop3xx_aau_resources,
.dev = { .dev = {
.dma_mask = &iop3xx_adma_dmamask, .dma_mask = &iop3xx_adma_dmamask,
.coherent_dma_mask = DMA_BIT_MASK(64), .coherent_dma_mask = DMA_BIT_MASK(32),
.platform_data = (void *) &iop3xx_aau_data, .platform_data = (void *) &iop3xx_aau_data,
}, },
}; };

View File

@ -622,7 +622,7 @@ static struct platform_device orion_xor0_shared = {
.resource = orion_xor0_shared_resources, .resource = orion_xor0_shared_resources,
.dev = { .dev = {
.dma_mask = &orion_xor_dmamask, .dma_mask = &orion_xor_dmamask,
.coherent_dma_mask = DMA_BIT_MASK(64), .coherent_dma_mask = DMA_BIT_MASK(32),
.platform_data = &orion_xor0_pdata, .platform_data = &orion_xor0_pdata,
}, },
}; };
@ -683,7 +683,7 @@ static struct platform_device orion_xor1_shared = {
.resource = orion_xor1_shared_resources, .resource = orion_xor1_shared_resources,
.dev = { .dev = {
.dma_mask = &orion_xor_dmamask, .dma_mask = &orion_xor_dmamask,
.coherent_dma_mask = DMA_BIT_MASK(64), .coherent_dma_mask = DMA_BIT_MASK(32),
.platform_data = &orion_xor1_pdata, .platform_data = &orion_xor1_pdata,
}, },
}; };

View File

@ -27,6 +27,7 @@ config ARCH_BCM2835
bool "Broadcom BCM2835 family" bool "Broadcom BCM2835 family"
select TIMER_OF select TIMER_OF
select GPIOLIB select GPIOLIB
select MFD_CORE
select PINCTRL select PINCTRL
select PINCTRL_BCM2835 select PINCTRL_BCM2835
select ARM_AMBA select ARM_AMBA
@ -81,6 +82,11 @@ config ARCH_EXYNOS
config ARCH_K3 config ARCH_K3
bool "Texas Instruments Inc. K3 multicore SoC architecture" bool "Texas Instruments Inc. K3 multicore SoC architecture"
select PM_GENERIC_DOMAINS if PM select PM_GENERIC_DOMAINS if PM
select MAILBOX
select TI_MESSAGE_MANAGER
select TI_SCI_PROTOCOL
select TI_SCI_INTR_IRQCHIP
select TI_SCI_INTA_IRQCHIP
help help
This enables support for Texas Instruments' K3 multicore SoC This enables support for Texas Instruments' K3 multicore SoC
architecture. architecture.

View File

@ -162,6 +162,7 @@
rx-fifo-depth = <16384>; rx-fifo-depth = <16384>;
snps,multicast-filter-bins = <256>; snps,multicast-filter-bins = <256>;
iommus = <&smmu 1>; iommus = <&smmu 1>;
altr,sysmgr-syscon = <&sysmgr 0x44 0>;
status = "disabled"; status = "disabled";
}; };
@ -179,6 +180,7 @@
rx-fifo-depth = <16384>; rx-fifo-depth = <16384>;
snps,multicast-filter-bins = <256>; snps,multicast-filter-bins = <256>;
iommus = <&smmu 2>; iommus = <&smmu 2>;
altr,sysmgr-syscon = <&sysmgr 0x48 0>;
status = "disabled"; status = "disabled";
}; };
@ -196,6 +198,7 @@
rx-fifo-depth = <16384>; rx-fifo-depth = <16384>;
snps,multicast-filter-bins = <256>; snps,multicast-filter-bins = <256>;
iommus = <&smmu 3>; iommus = <&smmu 3>;
altr,sysmgr-syscon = <&sysmgr 0x4c 0>;
status = "disabled"; status = "disabled";
}; };

View File

@ -321,7 +321,6 @@
nvidia,default-trim = <0x9>; nvidia,default-trim = <0x9>;
nvidia,dqs-trim = <63>; nvidia,dqs-trim = <63>;
mmc-hs400-1_8v; mmc-hs400-1_8v;
supports-cqe;
status = "disabled"; status = "disabled";
}; };

View File

@ -2,7 +2,7 @@
/* /*
* Device Tree Source for the RZ/G2E (R8A774C0) SoC * Device Tree Source for the RZ/G2E (R8A774C0) SoC
* *
* Copyright (C) 2018 Renesas Electronics Corp. * Copyright (C) 2018-2019 Renesas Electronics Corp.
*/ */
#include <dt-bindings/clock/r8a774c0-cpg-mssr.h> #include <dt-bindings/clock/r8a774c0-cpg-mssr.h>
@ -1150,9 +1150,8 @@
<&cpg CPG_CORE R8A774C0_CLK_S3D1C>, <&cpg CPG_CORE R8A774C0_CLK_S3D1C>,
<&scif_clk>; <&scif_clk>;
clock-names = "fck", "brg_int", "scif_clk"; clock-names = "fck", "brg_int", "scif_clk";
dmas = <&dmac1 0x5b>, <&dmac1 0x5a>, dmas = <&dmac0 0x5b>, <&dmac0 0x5a>;
<&dmac2 0x5b>, <&dmac2 0x5a>; dma-names = "tx", "rx";
dma-names = "tx", "rx", "tx", "rx";
power-domains = <&sysc R8A774C0_PD_ALWAYS_ON>; power-domains = <&sysc R8A774C0_PD_ALWAYS_ON>;
resets = <&cpg 202>; resets = <&cpg 202>;
status = "disabled"; status = "disabled";

View File

@ -2,7 +2,7 @@
/* /*
* Device Tree Source for the R-Car E3 (R8A77990) SoC * Device Tree Source for the R-Car E3 (R8A77990) SoC
* *
* Copyright (C) 2018 Renesas Electronics Corp. * Copyright (C) 2018-2019 Renesas Electronics Corp.
*/ */
#include <dt-bindings/clock/r8a77990-cpg-mssr.h> #include <dt-bindings/clock/r8a77990-cpg-mssr.h>
@ -1067,9 +1067,8 @@
<&cpg CPG_CORE R8A77990_CLK_S3D1C>, <&cpg CPG_CORE R8A77990_CLK_S3D1C>,
<&scif_clk>; <&scif_clk>;
clock-names = "fck", "brg_int", "scif_clk"; clock-names = "fck", "brg_int", "scif_clk";
dmas = <&dmac1 0x5b>, <&dmac1 0x5a>, dmas = <&dmac0 0x5b>, <&dmac0 0x5a>;
<&dmac2 0x5b>, <&dmac2 0x5a>; dma-names = "tx", "rx";
dma-names = "tx", "rx", "tx", "rx";
power-domains = <&sysc R8A77990_PD_ALWAYS_ON>; power-domains = <&sysc R8A77990_PD_ALWAYS_ON>;
resets = <&cpg 202>; resets = <&cpg 202>;
status = "disabled"; status = "disabled";

View File

@ -108,8 +108,8 @@
snps,reset-gpio = <&gpio1 RK_PC2 GPIO_ACTIVE_LOW>; snps,reset-gpio = <&gpio1 RK_PC2 GPIO_ACTIVE_LOW>;
snps,reset-active-low; snps,reset-active-low;
snps,reset-delays-us = <0 10000 50000>; snps,reset-delays-us = <0 10000 50000>;
tx_delay = <0x25>; tx_delay = <0x24>;
rx_delay = <0x11>; rx_delay = <0x18>;
status = "okay"; status = "okay";
}; };

View File

@ -46,8 +46,7 @@
vcc_host1_5v: vcc_otg_5v: vcc-host1-5v-regulator { vcc_host1_5v: vcc_otg_5v: vcc-host1-5v-regulator {
compatible = "regulator-fixed"; compatible = "regulator-fixed";
enable-active-high; gpio = <&gpio0 RK_PA2 GPIO_ACTIVE_LOW>;
gpio = <&gpio0 RK_PA2 GPIO_ACTIVE_HIGH>;
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&usb20_host_drv>; pinctrl-0 = <&usb20_host_drv>;
regulator-name = "vcc_host1_5v"; regulator-name = "vcc_host1_5v";

View File

@ -1445,11 +1445,11 @@
sdmmc0 { sdmmc0 {
sdmmc0_clk: sdmmc0-clk { sdmmc0_clk: sdmmc0-clk {
rockchip,pins = <1 RK_PA6 1 &pcfg_pull_none_4ma>; rockchip,pins = <1 RK_PA6 1 &pcfg_pull_none_8ma>;
}; };
sdmmc0_cmd: sdmmc0-cmd { sdmmc0_cmd: sdmmc0-cmd {
rockchip,pins = <1 RK_PA4 1 &pcfg_pull_up_4ma>; rockchip,pins = <1 RK_PA4 1 &pcfg_pull_up_8ma>;
}; };
sdmmc0_dectn: sdmmc0-dectn { sdmmc0_dectn: sdmmc0-dectn {
@ -1461,14 +1461,14 @@
}; };
sdmmc0_bus1: sdmmc0-bus1 { sdmmc0_bus1: sdmmc0-bus1 {
rockchip,pins = <1 RK_PA0 1 &pcfg_pull_up_4ma>; rockchip,pins = <1 RK_PA0 1 &pcfg_pull_up_8ma>;
}; };
sdmmc0_bus4: sdmmc0-bus4 { sdmmc0_bus4: sdmmc0-bus4 {
rockchip,pins = <1 RK_PA0 1 &pcfg_pull_up_4ma>, rockchip,pins = <1 RK_PA0 1 &pcfg_pull_up_8ma>,
<1 RK_PA1 1 &pcfg_pull_up_4ma>, <1 RK_PA1 1 &pcfg_pull_up_8ma>,
<1 RK_PA2 1 &pcfg_pull_up_4ma>, <1 RK_PA2 1 &pcfg_pull_up_8ma>,
<1 RK_PA3 1 &pcfg_pull_up_4ma>; <1 RK_PA3 1 &pcfg_pull_up_8ma>;
}; };
sdmmc0_gpio: sdmmc0-gpio { sdmmc0_gpio: sdmmc0-gpio {
@ -1642,50 +1642,50 @@
rgmiim1_pins: rgmiim1-pins { rgmiim1_pins: rgmiim1-pins {
rockchip,pins = rockchip,pins =
/* mac_txclk */ /* mac_txclk */
<1 RK_PB4 2 &pcfg_pull_none_12ma>, <1 RK_PB4 2 &pcfg_pull_none_8ma>,
/* mac_rxclk */ /* mac_rxclk */
<1 RK_PB5 2 &pcfg_pull_none_2ma>, <1 RK_PB5 2 &pcfg_pull_none_4ma>,
/* mac_mdio */ /* mac_mdio */
<1 RK_PC3 2 &pcfg_pull_none_2ma>, <1 RK_PC3 2 &pcfg_pull_none_4ma>,
/* mac_txen */ /* mac_txen */
<1 RK_PD1 2 &pcfg_pull_none_12ma>, <1 RK_PD1 2 &pcfg_pull_none_8ma>,
/* mac_clk */ /* mac_clk */
<1 RK_PC5 2 &pcfg_pull_none_2ma>, <1 RK_PC5 2 &pcfg_pull_none_4ma>,
/* mac_rxdv */ /* mac_rxdv */
<1 RK_PC6 2 &pcfg_pull_none_2ma>, <1 RK_PC6 2 &pcfg_pull_none_4ma>,
/* mac_mdc */ /* mac_mdc */
<1 RK_PC7 2 &pcfg_pull_none_2ma>, <1 RK_PC7 2 &pcfg_pull_none_4ma>,
/* mac_rxd1 */ /* mac_rxd1 */
<1 RK_PB2 2 &pcfg_pull_none_2ma>, <1 RK_PB2 2 &pcfg_pull_none_4ma>,
/* mac_rxd0 */ /* mac_rxd0 */
<1 RK_PB3 2 &pcfg_pull_none_2ma>, <1 RK_PB3 2 &pcfg_pull_none_4ma>,
/* mac_txd1 */ /* mac_txd1 */
<1 RK_PB0 2 &pcfg_pull_none_12ma>, <1 RK_PB0 2 &pcfg_pull_none_8ma>,
/* mac_txd0 */ /* mac_txd0 */
<1 RK_PB1 2 &pcfg_pull_none_12ma>, <1 RK_PB1 2 &pcfg_pull_none_8ma>,
/* mac_rxd3 */ /* mac_rxd3 */
<1 RK_PB6 2 &pcfg_pull_none_2ma>, <1 RK_PB6 2 &pcfg_pull_none_4ma>,
/* mac_rxd2 */ /* mac_rxd2 */
<1 RK_PB7 2 &pcfg_pull_none_2ma>, <1 RK_PB7 2 &pcfg_pull_none_4ma>,
/* mac_txd3 */ /* mac_txd3 */
<1 RK_PC0 2 &pcfg_pull_none_12ma>, <1 RK_PC0 2 &pcfg_pull_none_8ma>,
/* mac_txd2 */ /* mac_txd2 */
<1 RK_PC1 2 &pcfg_pull_none_12ma>, <1 RK_PC1 2 &pcfg_pull_none_8ma>,
/* mac_txclk */ /* mac_txclk */
<0 RK_PB0 1 &pcfg_pull_none>, <0 RK_PB0 1 &pcfg_pull_none_8ma>,
/* mac_txen */ /* mac_txen */
<0 RK_PB4 1 &pcfg_pull_none>, <0 RK_PB4 1 &pcfg_pull_none_8ma>,
/* mac_clk */ /* mac_clk */
<0 RK_PD0 1 &pcfg_pull_none>, <0 RK_PD0 1 &pcfg_pull_none_4ma>,
/* mac_txd1 */ /* mac_txd1 */
<0 RK_PC0 1 &pcfg_pull_none>, <0 RK_PC0 1 &pcfg_pull_none_8ma>,
/* mac_txd0 */ /* mac_txd0 */
<0 RK_PC1 1 &pcfg_pull_none>, <0 RK_PC1 1 &pcfg_pull_none_8ma>,
/* mac_txd3 */ /* mac_txd3 */
<0 RK_PC7 1 &pcfg_pull_none>, <0 RK_PC7 1 &pcfg_pull_none_8ma>,
/* mac_txd2 */ /* mac_txd2 */
<0 RK_PC6 1 &pcfg_pull_none>; <0 RK_PC6 1 &pcfg_pull_none_8ma>;
}; };
rmiim1_pins: rmiim1-pins { rmiim1_pins: rmiim1-pins {

View File

@ -158,6 +158,7 @@
}; };
&hdmi { &hdmi {
ddc-i2c-bus = <&i2c3>;
pinctrl-names = "default"; pinctrl-names = "default";
pinctrl-0 = <&hdmi_cec>; pinctrl-0 = <&hdmi_cec>;
status = "okay"; status = "okay";

View File

@ -30,8 +30,8 @@ do { \
" prfm pstl1strm, %2\n" \ " prfm pstl1strm, %2\n" \
"1: ldxr %w1, %2\n" \ "1: ldxr %w1, %2\n" \
insn "\n" \ insn "\n" \
"2: stlxr %w3, %w0, %2\n" \ "2: stlxr %w0, %w3, %2\n" \
" cbnz %w3, 1b\n" \ " cbnz %w0, 1b\n" \
" dmb ish\n" \ " dmb ish\n" \
"3:\n" \ "3:\n" \
" .pushsection .fixup,\"ax\"\n" \ " .pushsection .fixup,\"ax\"\n" \
@ -50,30 +50,30 @@ do { \
static inline int static inline int
arch_futex_atomic_op_inuser(int op, int oparg, int *oval, u32 __user *_uaddr) arch_futex_atomic_op_inuser(int op, int oparg, int *oval, u32 __user *_uaddr)
{ {
int oldval = 0, ret, tmp; int oldval, ret, tmp;
u32 __user *uaddr = __uaccess_mask_ptr(_uaddr); u32 __user *uaddr = __uaccess_mask_ptr(_uaddr);
pagefault_disable(); pagefault_disable();
switch (op) { switch (op) {
case FUTEX_OP_SET: case FUTEX_OP_SET:
__futex_atomic_op("mov %w0, %w4", __futex_atomic_op("mov %w3, %w4",
ret, oldval, uaddr, tmp, oparg); ret, oldval, uaddr, tmp, oparg);
break; break;
case FUTEX_OP_ADD: case FUTEX_OP_ADD:
__futex_atomic_op("add %w0, %w1, %w4", __futex_atomic_op("add %w3, %w1, %w4",
ret, oldval, uaddr, tmp, oparg); ret, oldval, uaddr, tmp, oparg);
break; break;
case FUTEX_OP_OR: case FUTEX_OP_OR:
__futex_atomic_op("orr %w0, %w1, %w4", __futex_atomic_op("orr %w3, %w1, %w4",
ret, oldval, uaddr, tmp, oparg); ret, oldval, uaddr, tmp, oparg);
break; break;
case FUTEX_OP_ANDN: case FUTEX_OP_ANDN:
__futex_atomic_op("and %w0, %w1, %w4", __futex_atomic_op("and %w3, %w1, %w4",
ret, oldval, uaddr, tmp, ~oparg); ret, oldval, uaddr, tmp, ~oparg);
break; break;
case FUTEX_OP_XOR: case FUTEX_OP_XOR:
__futex_atomic_op("eor %w0, %w1, %w4", __futex_atomic_op("eor %w3, %w1, %w4",
ret, oldval, uaddr, tmp, oparg); ret, oldval, uaddr, tmp, oparg);
break; break;
default: default:

View File

@ -445,6 +445,17 @@ static inline int kvm_read_guest_lock(struct kvm *kvm,
return ret; return ret;
} }
static inline int kvm_write_guest_lock(struct kvm *kvm, gpa_t gpa,
const void *data, unsigned long len)
{
int srcu_idx = srcu_read_lock(&kvm->srcu);
int ret = kvm_write_guest(kvm, gpa, data, len);
srcu_read_unlock(&kvm->srcu, srcu_idx);
return ret;
}
#ifdef CONFIG_KVM_INDIRECT_VECTORS #ifdef CONFIG_KVM_INDIRECT_VECTORS
/* /*
* EL2 vectors can be mapped and rerouted in a number of ways, * EL2 vectors can be mapped and rerouted in a number of ways,

View File

@ -73,4 +73,9 @@ static inline bool is_forbidden_offset_for_adrp(void *place)
struct plt_entry get_plt_entry(u64 dst, void *pc); struct plt_entry get_plt_entry(u64 dst, void *pc);
bool plt_entries_equal(const struct plt_entry *a, const struct plt_entry *b); bool plt_entries_equal(const struct plt_entry *a, const struct plt_entry *b);
static inline bool plt_entry_is_initialized(const struct plt_entry *e)
{
return e->adrp || e->add || e->br;
}
#endif /* __ASM_MODULE_H */ #endif /* __ASM_MODULE_H */

View File

@ -65,52 +65,22 @@ static inline void syscall_set_return_value(struct task_struct *task,
static inline void syscall_get_arguments(struct task_struct *task, static inline void syscall_get_arguments(struct task_struct *task,
struct pt_regs *regs, struct pt_regs *regs,
unsigned int i, unsigned int n,
unsigned long *args) unsigned long *args)
{ {
if (n == 0) args[0] = regs->orig_x0;
return; args++;
if (i + n > SYSCALL_MAX_ARGS) { memcpy(args, &regs->regs[1], 5 * sizeof(args[0]));
unsigned long *args_bad = args + SYSCALL_MAX_ARGS - i;
unsigned int n_bad = n + i - SYSCALL_MAX_ARGS;
pr_warning("%s called with max args %d, handling only %d\n",
__func__, i + n, SYSCALL_MAX_ARGS);
memset(args_bad, 0, n_bad * sizeof(args[0]));
}
if (i == 0) {
args[0] = regs->orig_x0;
args++;
i++;
n--;
}
memcpy(args, &regs->regs[i], n * sizeof(args[0]));
} }
static inline void syscall_set_arguments(struct task_struct *task, static inline void syscall_set_arguments(struct task_struct *task,
struct pt_regs *regs, struct pt_regs *regs,
unsigned int i, unsigned int n,
const unsigned long *args) const unsigned long *args)
{ {
if (n == 0) regs->orig_x0 = args[0];
return; args++;
if (i + n > SYSCALL_MAX_ARGS) { memcpy(&regs->regs[1], args, 5 * sizeof(args[0]));
pr_warning("%s called with max args %d, handling only %d\n",
__func__, i + n, SYSCALL_MAX_ARGS);
n = SYSCALL_MAX_ARGS - i;
}
if (i == 0) {
regs->orig_x0 = args[0];
args++;
i++;
n--;
}
memcpy(&regs->regs[i], args, n * sizeof(args[0]));
} }
/* /*

View File

@ -107,8 +107,7 @@ int ftrace_make_call(struct dyn_ftrace *rec, unsigned long addr)
trampoline = get_plt_entry(addr, mod->arch.ftrace_trampoline); trampoline = get_plt_entry(addr, mod->arch.ftrace_trampoline);
if (!plt_entries_equal(mod->arch.ftrace_trampoline, if (!plt_entries_equal(mod->arch.ftrace_trampoline,
&trampoline)) { &trampoline)) {
if (!plt_entries_equal(mod->arch.ftrace_trampoline, if (plt_entry_is_initialized(mod->arch.ftrace_trampoline)) {
&(struct plt_entry){})) {
pr_err("ftrace: far branches to multiple entry points unsupported inside a single module\n"); pr_err("ftrace: far branches to multiple entry points unsupported inside a single module\n");
return -EINVAL; return -EINVAL;
} }

View File

@ -94,6 +94,9 @@ static bool on_sdei_normal_stack(unsigned long sp, struct stack_info *info)
unsigned long low = (unsigned long)raw_cpu_read(sdei_stack_normal_ptr); unsigned long low = (unsigned long)raw_cpu_read(sdei_stack_normal_ptr);
unsigned long high = low + SDEI_STACK_SIZE; unsigned long high = low + SDEI_STACK_SIZE;
if (!low)
return false;
if (sp < low || sp >= high) if (sp < low || sp >= high)
return false; return false;
@ -111,6 +114,9 @@ static bool on_sdei_critical_stack(unsigned long sp, struct stack_info *info)
unsigned long low = (unsigned long)raw_cpu_read(sdei_stack_critical_ptr); unsigned long low = (unsigned long)raw_cpu_read(sdei_stack_critical_ptr);
unsigned long high = low + SDEI_STACK_SIZE; unsigned long high = low + SDEI_STACK_SIZE;
if (!low)
return false;
if (sp < low || sp >= high) if (sp < low || sp >= high)
return false; return false;

View File

@ -217,7 +217,7 @@ static void __init request_standard_resources(void)
num_standard_resources = memblock.memory.cnt; num_standard_resources = memblock.memory.cnt;
res_size = num_standard_resources * sizeof(*standard_resources); res_size = num_standard_resources * sizeof(*standard_resources);
standard_resources = memblock_alloc_low(res_size, SMP_CACHE_BYTES); standard_resources = memblock_alloc(res_size, SMP_CACHE_BYTES);
if (!standard_resources) if (!standard_resources)
panic("%s: Failed to allocate %zu bytes\n", __func__, res_size); panic("%s: Failed to allocate %zu bytes\n", __func__, res_size);

View File

@ -102,10 +102,16 @@ static void dump_instr(const char *lvl, struct pt_regs *regs)
void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk) void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk)
{ {
struct stackframe frame; struct stackframe frame;
int skip; int skip = 0;
pr_debug("%s(regs = %p tsk = %p)\n", __func__, regs, tsk); pr_debug("%s(regs = %p tsk = %p)\n", __func__, regs, tsk);
if (regs) {
if (user_mode(regs))
return;
skip = 1;
}
if (!tsk) if (!tsk)
tsk = current; tsk = current;
@ -126,7 +132,6 @@ void dump_backtrace(struct pt_regs *regs, struct task_struct *tsk)
frame.graph = 0; frame.graph = 0;
#endif #endif
skip = !!regs;
printk("Call trace:\n"); printk("Call trace:\n");
do { do {
/* skip until specified stack frame */ /* skip until specified stack frame */
@ -176,15 +181,13 @@ static int __die(const char *str, int err, struct pt_regs *regs)
return ret; return ret;
print_modules(); print_modules();
__show_regs(regs);
pr_emerg("Process %.*s (pid: %d, stack limit = 0x%p)\n", pr_emerg("Process %.*s (pid: %d, stack limit = 0x%p)\n",
TASK_COMM_LEN, tsk->comm, task_pid_nr(tsk), TASK_COMM_LEN, tsk->comm, task_pid_nr(tsk),
end_of_stack(tsk)); end_of_stack(tsk));
show_regs(regs);
if (!user_mode(regs)) { if (!user_mode(regs))
dump_backtrace(regs, tsk);
dump_instr(KERN_EMERG, regs); dump_instr(KERN_EMERG, regs);
}
return ret; return ret;
} }

View File

@ -123,6 +123,9 @@ int kvm_reset_vcpu(struct kvm_vcpu *vcpu)
int ret = -EINVAL; int ret = -EINVAL;
bool loaded; bool loaded;
/* Reset PMU outside of the non-preemptible section */
kvm_pmu_vcpu_reset(vcpu);
preempt_disable(); preempt_disable();
loaded = (vcpu->cpu != -1); loaded = (vcpu->cpu != -1);
if (loaded) if (loaded)
@ -170,9 +173,6 @@ int kvm_reset_vcpu(struct kvm_vcpu *vcpu)
vcpu->arch.reset_state.reset = false; vcpu->arch.reset_state.reset = false;
} }
/* Reset PMU */
kvm_pmu_vcpu_reset(vcpu);
/* Default workaround setup is enabled (if supported) */ /* Default workaround setup is enabled (if supported) */
if (kvm_arm_have_ssbd() == KVM_SSBD_KERNEL) if (kvm_arm_have_ssbd() == KVM_SSBD_KERNEL)
vcpu->arch.workaround_flags |= VCPU_WORKAROUND_2_FLAG; vcpu->arch.workaround_flags |= VCPU_WORKAROUND_2_FLAG;

View File

@ -19,6 +19,7 @@ generic-y += irq_work.h
generic-y += kdebug.h generic-y += kdebug.h
generic-y += kmap_types.h generic-y += kmap_types.h
generic-y += kprobes.h generic-y += kprobes.h
generic-y += kvm_para.h
generic-y += local.h generic-y += local.h
generic-y += mcs_spinlock.h generic-y += mcs_spinlock.h
generic-y += mm-arch-hooks.h generic-y += mm-arch-hooks.h

View File

@ -46,78 +46,27 @@ static inline void syscall_set_return_value(struct task_struct *task,
} }
static inline void syscall_get_arguments(struct task_struct *task, static inline void syscall_get_arguments(struct task_struct *task,
struct pt_regs *regs, unsigned int i, struct pt_regs *regs,
unsigned int n, unsigned long *args) unsigned long *args)
{ {
switch (i) { *args++ = regs->a4;
case 0: *args++ = regs->b4;
if (!n--) *args++ = regs->a6;
break; *args++ = regs->b6;
*args++ = regs->a4; *args++ = regs->a8;
case 1: *args = regs->b8;
if (!n--)
break;
*args++ = regs->b4;
case 2:
if (!n--)
break;
*args++ = regs->a6;
case 3:
if (!n--)
break;
*args++ = regs->b6;
case 4:
if (!n--)
break;
*args++ = regs->a8;
case 5:
if (!n--)
break;
*args++ = regs->b8;
case 6:
if (!n--)
break;
default:
BUG();
}
} }
static inline void syscall_set_arguments(struct task_struct *task, static inline void syscall_set_arguments(struct task_struct *task,
struct pt_regs *regs, struct pt_regs *regs,
unsigned int i, unsigned int n,
const unsigned long *args) const unsigned long *args)
{ {
switch (i) { regs->a4 = *args++;
case 0: regs->b4 = *args++;
if (!n--) regs->a6 = *args++;
break; regs->b6 = *args++;
regs->a4 = *args++; regs->a8 = *args++;
case 1: regs->a9 = *args;
if (!n--)
break;
regs->b4 = *args++;
case 2:
if (!n--)
break;
regs->a6 = *args++;
case 3:
if (!n--)
break;
regs->b6 = *args++;
case 4:
if (!n--)
break;
regs->a8 = *args++;
case 5:
if (!n--)
break;
regs->a9 = *args++;
case 6:
if (!n)
break;
default:
BUG();
}
} }
#endif /* __ASM_C6X_SYSCALLS_H */ #endif /* __ASM_C6X_SYSCALLS_H */

View File

@ -1,2 +1 @@
generic-y += kvm_para.h
generic-y += ucontext.h generic-y += ucontext.h

View File

@ -43,30 +43,20 @@ syscall_set_return_value(struct task_struct *task, struct pt_regs *regs,
static inline void static inline void
syscall_get_arguments(struct task_struct *task, struct pt_regs *regs, syscall_get_arguments(struct task_struct *task, struct pt_regs *regs,
unsigned int i, unsigned int n, unsigned long *args) unsigned long *args)
{ {
BUG_ON(i + n > 6); args[0] = regs->orig_a0;
if (i == 0) { args++;
args[0] = regs->orig_a0; memcpy(args, &regs->a1, 5 * sizeof(args[0]));
args++;
i++;
n--;
}
memcpy(args, &regs->a1 + i * sizeof(regs->a1), n * sizeof(args[0]));
} }
static inline void static inline void
syscall_set_arguments(struct task_struct *task, struct pt_regs *regs, syscall_set_arguments(struct task_struct *task, struct pt_regs *regs,
unsigned int i, unsigned int n, const unsigned long *args) const unsigned long *args)
{ {
BUG_ON(i + n > 6); regs->orig_a0 = args[0];
if (i == 0) { args++;
regs->orig_a0 = args[0]; memcpy(&regs->a1, args, 5 * sizeof(regs->a1));
args++;
i++;
n--;
}
memcpy(&regs->a1 + i * sizeof(regs->a1), args, n * sizeof(regs->a0));
} }
static inline int static inline int

View File

@ -23,6 +23,7 @@ generic-y += irq_work.h
generic-y += kdebug.h generic-y += kdebug.h
generic-y += kmap_types.h generic-y += kmap_types.h
generic-y += kprobes.h generic-y += kprobes.h
generic-y += kvm_para.h
generic-y += linkage.h generic-y += linkage.h
generic-y += local.h generic-y += local.h
generic-y += local64.h generic-y += local64.h

View File

@ -17,34 +17,14 @@ syscall_get_nr(struct task_struct *task, struct pt_regs *regs)
static inline void static inline void
syscall_get_arguments(struct task_struct *task, struct pt_regs *regs, syscall_get_arguments(struct task_struct *task, struct pt_regs *regs,
unsigned int i, unsigned int n, unsigned long *args) unsigned long *args)
{ {
BUG_ON(i + n > 6); *args++ = regs->er1;
*args++ = regs->er2;
while (n > 0) { *args++ = regs->er3;
switch (i) { *args++ = regs->er4;
case 0: *args++ = regs->er5;
*args++ = regs->er1; *args = regs->er6;
break;
case 1:
*args++ = regs->er2;
break;
case 2:
*args++ = regs->er3;
break;
case 3:
*args++ = regs->er4;
break;
case 4:
*args++ = regs->er5;
break;
case 5:
*args++ = regs->er6;
break;
}
i++;
n--;
}
} }

View File

@ -1,2 +1 @@
generic-y += kvm_para.h
generic-y += ucontext.h generic-y += ucontext.h

View File

@ -19,6 +19,7 @@ generic-y += irq_work.h
generic-y += kdebug.h generic-y += kdebug.h
generic-y += kmap_types.h generic-y += kmap_types.h
generic-y += kprobes.h generic-y += kprobes.h
generic-y += kvm_para.h
generic-y += local.h generic-y += local.h
generic-y += local64.h generic-y += local64.h
generic-y += mcs_spinlock.h generic-y += mcs_spinlock.h

View File

@ -37,10 +37,8 @@ static inline long syscall_get_nr(struct task_struct *task,
static inline void syscall_get_arguments(struct task_struct *task, static inline void syscall_get_arguments(struct task_struct *task,
struct pt_regs *regs, struct pt_regs *regs,
unsigned int i, unsigned int n,
unsigned long *args) unsigned long *args)
{ {
BUG_ON(i + n > 6); memcpy(args, &(&regs->r00)[0], 6 * sizeof(args[0]));
memcpy(args, &(&regs->r00)[i], n * sizeof(args[0]));
} }
#endif #endif

View File

@ -1,2 +0,0 @@
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
#include <asm-generic/kvm_para.h>

View File

@ -2,6 +2,7 @@ generated-y += syscall_table.h
generic-y += compat.h generic-y += compat.h
generic-y += exec.h generic-y += exec.h
generic-y += irq_work.h generic-y += irq_work.h
generic-y += kvm_para.h
generic-y += mcs_spinlock.h generic-y += mcs_spinlock.h
generic-y += mm-arch-hooks.h generic-y += mm-arch-hooks.h
generic-y += preempt.h generic-y += preempt.h

View File

@ -59,26 +59,19 @@ static inline void syscall_set_return_value(struct task_struct *task,
} }
extern void ia64_syscall_get_set_arguments(struct task_struct *task, extern void ia64_syscall_get_set_arguments(struct task_struct *task,
struct pt_regs *regs, unsigned int i, unsigned int n, struct pt_regs *regs, unsigned long *args, int rw);
unsigned long *args, int rw);
static inline void syscall_get_arguments(struct task_struct *task, static inline void syscall_get_arguments(struct task_struct *task,
struct pt_regs *regs, struct pt_regs *regs,
unsigned int i, unsigned int n,
unsigned long *args) unsigned long *args)
{ {
BUG_ON(i + n > 6); ia64_syscall_get_set_arguments(task, regs, args, 0);
ia64_syscall_get_set_arguments(task, regs, i, n, args, 0);
} }
static inline void syscall_set_arguments(struct task_struct *task, static inline void syscall_set_arguments(struct task_struct *task,
struct pt_regs *regs, struct pt_regs *regs,
unsigned int i, unsigned int n,
unsigned long *args) unsigned long *args)
{ {
BUG_ON(i + n > 6); ia64_syscall_get_set_arguments(task, regs, args, 1);
ia64_syscall_get_set_arguments(task, regs, i, n, args, 1);
} }
static inline int syscall_get_arch(void) static inline int syscall_get_arch(void)

View File

@ -1,2 +1 @@
generated-y += unistd_64.h generated-y += unistd_64.h
generic-y += kvm_para.h

View File

@ -2179,12 +2179,11 @@ static void syscall_get_set_args_cb(struct unw_frame_info *info, void *data)
} }
void ia64_syscall_get_set_arguments(struct task_struct *task, void ia64_syscall_get_set_arguments(struct task_struct *task,
struct pt_regs *regs, unsigned int i, unsigned int n, struct pt_regs *regs, unsigned long *args, int rw)
unsigned long *args, int rw)
{ {
struct syscall_get_set_args data = { struct syscall_get_set_args data = {
.i = i, .i = 0,
.n = n, .n = 6,
.args = args, .args = args,
.regs = regs, .regs = regs,
.rw = rw, .rw = rw,

View File

@ -13,6 +13,7 @@ generic-y += irq_work.h
generic-y += kdebug.h generic-y += kdebug.h
generic-y += kmap_types.h generic-y += kmap_types.h
generic-y += kprobes.h generic-y += kprobes.h
generic-y += kvm_para.h
generic-y += local.h generic-y += local.h
generic-y += local64.h generic-y += local64.h
generic-y += mcs_spinlock.h generic-y += mcs_spinlock.h

View File

@ -1,2 +1 @@
generated-y += unistd_32.h generated-y += unistd_32.h
generic-y += kvm_para.h

View File

@ -17,6 +17,7 @@ generic-y += irq_work.h
generic-y += kdebug.h generic-y += kdebug.h
generic-y += kmap_types.h generic-y += kmap_types.h
generic-y += kprobes.h generic-y += kprobes.h
generic-y += kvm_para.h
generic-y += linkage.h generic-y += linkage.h
generic-y += local.h generic-y += local.h
generic-y += local64.h generic-y += local64.h

View File

@ -82,18 +82,22 @@ static inline void microblaze_set_syscall_arg(struct pt_regs *regs,
static inline void syscall_get_arguments(struct task_struct *task, static inline void syscall_get_arguments(struct task_struct *task,
struct pt_regs *regs, struct pt_regs *regs,
unsigned int i, unsigned int n,
unsigned long *args) unsigned long *args)
{ {
unsigned int i = 0;
unsigned int n = 6;
while (n--) while (n--)
*args++ = microblaze_get_syscall_arg(regs, i++); *args++ = microblaze_get_syscall_arg(regs, i++);
} }
static inline void syscall_set_arguments(struct task_struct *task, static inline void syscall_set_arguments(struct task_struct *task,
struct pt_regs *regs, struct pt_regs *regs,
unsigned int i, unsigned int n,
const unsigned long *args) const unsigned long *args)
{ {
unsigned int i = 0;
unsigned int n = 6;
while (n--) while (n--)
microblaze_set_syscall_arg(regs, i++, *args++); microblaze_set_syscall_arg(regs, i++, *args++);
} }

Some files were not shown because too many files have changed in this diff Show More