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:
commit
fb4e059265
|
@ -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'
|
||||||
|
|
4
.mailmap
4
.mailmap
|
@ -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>
|
||||||
|
|
|
@ -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
|
||||||
=================
|
=================
|
||||||
|
|
|
@ -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``
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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>;
|
||||||
};
|
};
|
||||||
|
|
|
@ -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>;
|
||||||
|
};
|
|
@ -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>;
|
||||||
|
...
|
||||||
|
};
|
|
@ -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";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 ]
|
||||||
|
|
|
@ -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.
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 |
|
||||||
|
|
|
@ -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.
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
37
MAINTAINERS
37
MAINTAINERS
|
@ -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
|
||||||
|
|
49
Makefile
49
Makefile
|
@ -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:
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
|
||||||
#include <asm-generic/kvm_para.h>
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -1,2 +1 @@
|
||||||
generic-y += kvm_para.h
|
|
||||||
generic-y += ucontext.h
|
generic-y += ucontext.h
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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>;
|
||||||
|
|
|
@ -93,7 +93,7 @@
|
||||||
};
|
};
|
||||||
|
|
||||||
&hdmi {
|
&hdmi {
|
||||||
hpd-gpios = <&gpio 46 GPIO_ACTIVE_LOW>;
|
hpd-gpios = <&gpio 46 GPIO_ACTIVE_HIGH>;
|
||||||
};
|
};
|
||||||
|
|
||||||
&pwm {
|
&pwm {
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -264,7 +264,7 @@
|
||||||
pinctrl-2 = <&pinctrl_usdhc3_200mhz>;
|
pinctrl-2 = <&pinctrl_usdhc3_200mhz>;
|
||||||
vmcc-supply = <®_sd3_vmmc>;
|
vmcc-supply = <®_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 = <®_sd4_vmmc>;
|
vmcc-supply = <®_sd4_vmmc>;
|
||||||
bus-witdh = <8>;
|
bus-width = <8>;
|
||||||
no-1-8-v;
|
no-1-8-v;
|
||||||
non-removable;
|
non-removable;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
|
@ -91,6 +91,7 @@
|
||||||
pinctrl-0 = <&pinctrl_enet>;
|
pinctrl-0 = <&pinctrl_enet>;
|
||||||
phy-handle = <ðphy>;
|
phy-handle = <ðphy>;
|
||||||
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";
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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>;
|
||||||
|
|
|
@ -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>;
|
||||||
|
|
|
@ -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>;
|
||||||
};
|
};
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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()) {
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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, ®s->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, ®s->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(®s->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(®s->ARM_r0 + i, args, n * sizeof(args[0]));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int syscall_get_arch(void)
|
static inline int syscall_get_arch(void)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
|
||||||
#include <asm-generic/kvm_para.h>
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -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),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -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,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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";
|
||||||
|
|
|
@ -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";
|
||||||
|
|
|
@ -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";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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";
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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";
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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, ®s->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, ®s->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(®s->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(®s->regs[i], args, n * sizeof(args[0]));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -1,2 +1 @@
|
||||||
generic-y += kvm_para.h
|
|
||||||
generic-y += ucontext.h
|
generic-y += ucontext.h
|
||||||
|
|
|
@ -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, ®s->a1, 5 * sizeof(args[0]));
|
||||||
args++;
|
|
||||||
i++;
|
|
||||||
n--;
|
|
||||||
}
|
|
||||||
memcpy(args, ®s->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(®s->a1, args, 5 * sizeof(regs->a1));
|
||||||
args++;
|
|
||||||
i++;
|
|
||||||
n--;
|
|
||||||
}
|
|
||||||
memcpy(®s->a1 + i * sizeof(regs->a1), args, n * sizeof(regs->a0));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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--;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,2 +1 @@
|
||||||
generic-y += kvm_para.h
|
|
||||||
generic-y += ucontext.h
|
generic-y += ucontext.h
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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, &(®s->r00)[0], 6 * sizeof(args[0]));
|
||||||
memcpy(args, &(®s->r00)[i], n * sizeof(args[0]));
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
|
||||||
#include <asm-generic/kvm_para.h>
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -1,2 +1 @@
|
||||||
generated-y += unistd_64.h
|
generated-y += unistd_64.h
|
||||||
generic-y += kvm_para.h
|
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -1,2 +1 @@
|
||||||
generated-y += unistd_32.h
|
generated-y += unistd_32.h
|
||||||
generic-y += kvm_para.h
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
Loading…
Reference in New Issue