Linux 5.0-rc4
-----BEGIN PGP SIGNATURE----- iQFSBAABCAA8FiEEq68RxlopcLEwq+PEeb4+QwBBGIYFAlxOPDQeHHRvcnZhbGRz QGxpbnV4LWZvdW5kYXRpb24ub3JnAAoJEHm+PkMAQRiGDSMH/iL9l5FKUuoajT2Q tYsbzbBQPYXe+NBizD+ci5evTIBnbZ1XJQ8OAS2Pge9oXh9+1HUD/eWIIkAXCVkA yhvMU585DPVx3TPAwOjKXHCXEgiRX/sj+rLQpssxgDpZ2BBepqmBOMbojQJ8UIHg e6JAZBlsoTlRX9+gg3Dy+kOuEg4ioJOTQHQ+0fS0WKL+N26GAVpssB/cqm9xYx1k gnVyOubxPrcI3KZXsJp164njnuiZwnvX3kTBfeDEPL6dg1PrJqnBu+cU5qKCkVWC k4/SIcxLdsFJsXAWYjbS9AMEowg44nTzMe1JhFY4UKor3GXn58VLnXzEuiwgCmAv TEXOfnc= =ajsU -----END PGP SIGNATURE----- gpgsig -----BEGIN PGP SIGNATURE----- iQFHBAABCgAxFiEEreZoqmdXGLWf4p/qJNaLcl1Uh9AFAlxQQWkTHGJyb29uaWVA a2VybmVsLm9yZwAKCRAk1otyXVSH0FgjB/9ibxx5hzkYSaHBhY80tTMyu245G6st PDKBp+HB387wa8wwcsbBtQrYWmj1aWDif5Bggm81sF2iPtNfi1uCtUWETmrlV+4q 3D/qY/8Ev2nrhZV7s2iUNVQhUCGt+ZKpNSukwcfSw0cfa0C3lOKAWOkWrYxerJaX ifxPKQ/X1qOjZ305STzfh4I11tGaxsTcFHPuPEV6wcnR44cH0nESgwi3pI6Iu2LJ Hp9DIhtpACwH+ODioWyPaJRbW8ZIfo7dz1h9QE+Vzrj4imJDwdoDpn1lxB4v9d+B GXxT2k4GB2bdw9S3oj37KKJIHcDyzfVOVypW3842scyAzvFvlMsiih9d =qU12 -----END PGP SIGNATURE----- Merge tag 'v5.0-rc4' into asoc-5.1 Linux 5.0-rc4
This commit is contained in:
commit
d7c26e63cf
|
@ -72,6 +72,10 @@ ForEachMacros:
|
||||||
- 'apei_estatus_for_each_section'
|
- 'apei_estatus_for_each_section'
|
||||||
- 'ata_for_each_dev'
|
- 'ata_for_each_dev'
|
||||||
- 'ata_for_each_link'
|
- 'ata_for_each_link'
|
||||||
|
- '__ata_qc_for_each'
|
||||||
|
- 'ata_qc_for_each'
|
||||||
|
- 'ata_qc_for_each_raw'
|
||||||
|
- 'ata_qc_for_each_with_internal'
|
||||||
- 'ax25_for_each'
|
- 'ax25_for_each'
|
||||||
- 'ax25_uid_for_each'
|
- 'ax25_uid_for_each'
|
||||||
- 'bio_for_each_integrity_vec'
|
- 'bio_for_each_integrity_vec'
|
||||||
|
@ -85,6 +89,7 @@ ForEachMacros:
|
||||||
- 'blk_queue_for_each_rl'
|
- 'blk_queue_for_each_rl'
|
||||||
- 'bond_for_each_slave'
|
- 'bond_for_each_slave'
|
||||||
- 'bond_for_each_slave_rcu'
|
- 'bond_for_each_slave_rcu'
|
||||||
|
- 'bpf_for_each_spilled_reg'
|
||||||
- 'btree_for_each_safe128'
|
- 'btree_for_each_safe128'
|
||||||
- 'btree_for_each_safe32'
|
- 'btree_for_each_safe32'
|
||||||
- 'btree_for_each_safe64'
|
- 'btree_for_each_safe64'
|
||||||
|
@ -103,6 +108,8 @@ ForEachMacros:
|
||||||
- 'drm_atomic_crtc_for_each_plane'
|
- 'drm_atomic_crtc_for_each_plane'
|
||||||
- 'drm_atomic_crtc_state_for_each_plane'
|
- 'drm_atomic_crtc_state_for_each_plane'
|
||||||
- 'drm_atomic_crtc_state_for_each_plane_state'
|
- 'drm_atomic_crtc_state_for_each_plane_state'
|
||||||
|
- 'drm_atomic_for_each_plane_damage'
|
||||||
|
- 'drm_connector_for_each_possible_encoder'
|
||||||
- 'drm_for_each_connector_iter'
|
- 'drm_for_each_connector_iter'
|
||||||
- 'drm_for_each_crtc'
|
- 'drm_for_each_crtc'
|
||||||
- 'drm_for_each_encoder'
|
- 'drm_for_each_encoder'
|
||||||
|
@ -121,11 +128,21 @@ ForEachMacros:
|
||||||
- 'for_each_bio'
|
- 'for_each_bio'
|
||||||
- 'for_each_board_func_rsrc'
|
- 'for_each_board_func_rsrc'
|
||||||
- 'for_each_bvec'
|
- 'for_each_bvec'
|
||||||
|
- 'for_each_card_components'
|
||||||
|
- 'for_each_card_links'
|
||||||
|
- 'for_each_card_links_safe'
|
||||||
|
- 'for_each_card_prelinks'
|
||||||
|
- 'for_each_card_rtds'
|
||||||
|
- 'for_each_card_rtds_safe'
|
||||||
|
- 'for_each_cgroup_storage_type'
|
||||||
- 'for_each_child_of_node'
|
- 'for_each_child_of_node'
|
||||||
- 'for_each_clear_bit'
|
- 'for_each_clear_bit'
|
||||||
- 'for_each_clear_bit_from'
|
- 'for_each_clear_bit_from'
|
||||||
- 'for_each_cmsghdr'
|
- 'for_each_cmsghdr'
|
||||||
- 'for_each_compatible_node'
|
- 'for_each_compatible_node'
|
||||||
|
- 'for_each_component_dais'
|
||||||
|
- 'for_each_component_dais_safe'
|
||||||
|
- 'for_each_comp_order'
|
||||||
- 'for_each_console'
|
- 'for_each_console'
|
||||||
- 'for_each_cpu'
|
- 'for_each_cpu'
|
||||||
- 'for_each_cpu_and'
|
- 'for_each_cpu_and'
|
||||||
|
@ -133,6 +150,10 @@ ForEachMacros:
|
||||||
- 'for_each_cpu_wrap'
|
- 'for_each_cpu_wrap'
|
||||||
- 'for_each_dev_addr'
|
- 'for_each_dev_addr'
|
||||||
- 'for_each_dma_cap_mask'
|
- 'for_each_dma_cap_mask'
|
||||||
|
- 'for_each_dpcm_be'
|
||||||
|
- 'for_each_dpcm_be_rollback'
|
||||||
|
- 'for_each_dpcm_be_safe'
|
||||||
|
- 'for_each_dpcm_fe'
|
||||||
- 'for_each_drhd_unit'
|
- 'for_each_drhd_unit'
|
||||||
- 'for_each_dss_dev'
|
- 'for_each_dss_dev'
|
||||||
- 'for_each_efi_memory_desc'
|
- 'for_each_efi_memory_desc'
|
||||||
|
@ -149,6 +170,7 @@ ForEachMacros:
|
||||||
- 'for_each_iommu'
|
- 'for_each_iommu'
|
||||||
- 'for_each_ip_tunnel_rcu'
|
- 'for_each_ip_tunnel_rcu'
|
||||||
- 'for_each_irq_nr'
|
- 'for_each_irq_nr'
|
||||||
|
- 'for_each_link_codecs'
|
||||||
- 'for_each_lru'
|
- 'for_each_lru'
|
||||||
- 'for_each_matching_node'
|
- 'for_each_matching_node'
|
||||||
- 'for_each_matching_node_and_match'
|
- 'for_each_matching_node_and_match'
|
||||||
|
@ -160,6 +182,7 @@ ForEachMacros:
|
||||||
- 'for_each_mem_range_rev'
|
- 'for_each_mem_range_rev'
|
||||||
- 'for_each_migratetype_order'
|
- 'for_each_migratetype_order'
|
||||||
- 'for_each_msi_entry'
|
- 'for_each_msi_entry'
|
||||||
|
- 'for_each_msi_entry_safe'
|
||||||
- 'for_each_net'
|
- 'for_each_net'
|
||||||
- 'for_each_netdev'
|
- 'for_each_netdev'
|
||||||
- 'for_each_netdev_continue'
|
- 'for_each_netdev_continue'
|
||||||
|
@ -183,12 +206,14 @@ ForEachMacros:
|
||||||
- 'for_each_node_with_property'
|
- 'for_each_node_with_property'
|
||||||
- 'for_each_of_allnodes'
|
- 'for_each_of_allnodes'
|
||||||
- 'for_each_of_allnodes_from'
|
- 'for_each_of_allnodes_from'
|
||||||
|
- 'for_each_of_cpu_node'
|
||||||
- '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_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_plane_in_state'
|
- 'for_each_oldnew_plane_in_state'
|
||||||
|
- 'for_each_oldnew_plane_in_state_reverse'
|
||||||
- 'for_each_oldnew_private_obj_in_state'
|
- 'for_each_oldnew_private_obj_in_state'
|
||||||
- 'for_each_old_plane_in_state'
|
- 'for_each_old_plane_in_state'
|
||||||
- 'for_each_old_private_obj_in_state'
|
- 'for_each_old_private_obj_in_state'
|
||||||
|
@ -206,14 +231,17 @@ ForEachMacros:
|
||||||
- 'for_each_process'
|
- 'for_each_process'
|
||||||
- 'for_each_process_thread'
|
- 'for_each_process_thread'
|
||||||
- 'for_each_property_of_node'
|
- 'for_each_property_of_node'
|
||||||
|
- 'for_each_registered_fb'
|
||||||
- 'for_each_reserved_mem_region'
|
- 'for_each_reserved_mem_region'
|
||||||
- 'for_each_resv_unavail_range'
|
- 'for_each_rtd_codec_dai'
|
||||||
|
- 'for_each_rtd_codec_dai_rollback'
|
||||||
- 'for_each_rtdcom'
|
- 'for_each_rtdcom'
|
||||||
- 'for_each_rtdcom_safe'
|
- 'for_each_rtdcom_safe'
|
||||||
- 'for_each_set_bit'
|
- 'for_each_set_bit'
|
||||||
- 'for_each_set_bit_from'
|
- 'for_each_set_bit_from'
|
||||||
- 'for_each_sg'
|
- 'for_each_sg'
|
||||||
- 'for_each_sg_page'
|
- 'for_each_sg_page'
|
||||||
|
- 'for_each_sibling_event'
|
||||||
- '__for_each_thread'
|
- '__for_each_thread'
|
||||||
- 'for_each_thread'
|
- 'for_each_thread'
|
||||||
- 'for_each_zone'
|
- 'for_each_zone'
|
||||||
|
@ -251,6 +279,8 @@ ForEachMacros:
|
||||||
- 'hlist_nulls_for_each_entry_from'
|
- 'hlist_nulls_for_each_entry_from'
|
||||||
- 'hlist_nulls_for_each_entry_rcu'
|
- 'hlist_nulls_for_each_entry_rcu'
|
||||||
- 'hlist_nulls_for_each_entry_safe'
|
- 'hlist_nulls_for_each_entry_safe'
|
||||||
|
- 'i3c_bus_for_each_i2cdev'
|
||||||
|
- 'i3c_bus_for_each_i3cdev'
|
||||||
- 'ide_host_for_each_port'
|
- 'ide_host_for_each_port'
|
||||||
- 'ide_port_for_each_dev'
|
- 'ide_port_for_each_dev'
|
||||||
- 'ide_port_for_each_present_dev'
|
- 'ide_port_for_each_present_dev'
|
||||||
|
@ -267,11 +297,14 @@ ForEachMacros:
|
||||||
- 'kvm_for_each_memslot'
|
- 'kvm_for_each_memslot'
|
||||||
- 'kvm_for_each_vcpu'
|
- 'kvm_for_each_vcpu'
|
||||||
- 'list_for_each'
|
- 'list_for_each'
|
||||||
|
- 'list_for_each_codec'
|
||||||
|
- 'list_for_each_codec_safe'
|
||||||
- 'list_for_each_entry'
|
- 'list_for_each_entry'
|
||||||
- 'list_for_each_entry_continue'
|
- 'list_for_each_entry_continue'
|
||||||
- 'list_for_each_entry_continue_rcu'
|
- 'list_for_each_entry_continue_rcu'
|
||||||
- 'list_for_each_entry_continue_reverse'
|
- 'list_for_each_entry_continue_reverse'
|
||||||
- 'list_for_each_entry_from'
|
- 'list_for_each_entry_from'
|
||||||
|
- 'list_for_each_entry_from_rcu'
|
||||||
- 'list_for_each_entry_from_reverse'
|
- 'list_for_each_entry_from_reverse'
|
||||||
- 'list_for_each_entry_lockless'
|
- 'list_for_each_entry_lockless'
|
||||||
- 'list_for_each_entry_rcu'
|
- 'list_for_each_entry_rcu'
|
||||||
|
@ -291,6 +324,7 @@ 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'
|
||||||
|
- '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'
|
||||||
- 'netdev_for_each_lower_private_rcu'
|
- 'netdev_for_each_lower_private_rcu'
|
||||||
|
@ -357,12 +391,14 @@ ForEachMacros:
|
||||||
- 'sk_nulls_for_each'
|
- 'sk_nulls_for_each'
|
||||||
- 'sk_nulls_for_each_from'
|
- 'sk_nulls_for_each_from'
|
||||||
- 'sk_nulls_for_each_rcu'
|
- 'sk_nulls_for_each_rcu'
|
||||||
|
- 'snd_array_for_each'
|
||||||
- 'snd_pcm_group_for_each_entry'
|
- 'snd_pcm_group_for_each_entry'
|
||||||
- 'snd_soc_dapm_widget_for_each_path'
|
- 'snd_soc_dapm_widget_for_each_path'
|
||||||
- 'snd_soc_dapm_widget_for_each_path_safe'
|
- 'snd_soc_dapm_widget_for_each_path_safe'
|
||||||
- 'snd_soc_dapm_widget_for_each_sink_path'
|
- 'snd_soc_dapm_widget_for_each_sink_path'
|
||||||
- 'snd_soc_dapm_widget_for_each_source_path'
|
- 'snd_soc_dapm_widget_for_each_source_path'
|
||||||
- 'tb_property_for_each'
|
- 'tb_property_for_each'
|
||||||
|
- 'tcf_exts_for_each_action'
|
||||||
- 'udp_portaddr_for_each_entry'
|
- 'udp_portaddr_for_each_entry'
|
||||||
- 'udp_portaddr_for_each_entry_rcu'
|
- 'udp_portaddr_for_each_entry_rcu'
|
||||||
- 'usb_hub_for_each_child'
|
- 'usb_hub_for_each_child'
|
||||||
|
@ -371,6 +407,11 @@ ForEachMacros:
|
||||||
- 'v4l2_m2m_for_each_dst_buf_safe'
|
- 'v4l2_m2m_for_each_dst_buf_safe'
|
||||||
- 'v4l2_m2m_for_each_src_buf'
|
- 'v4l2_m2m_for_each_src_buf'
|
||||||
- 'v4l2_m2m_for_each_src_buf_safe'
|
- 'v4l2_m2m_for_each_src_buf_safe'
|
||||||
|
- 'virtio_device_for_each_vq'
|
||||||
|
- 'xa_for_each'
|
||||||
|
- 'xas_for_each'
|
||||||
|
- 'xas_for_each_conflict'
|
||||||
|
- 'xas_for_each_marked'
|
||||||
- 'zorro_for_each_dev'
|
- 'zorro_for_each_dev'
|
||||||
|
|
||||||
#IncludeBlocks: Preserve # Unknown to clang-format-5.0
|
#IncludeBlocks: Preserve # Unknown to clang-format-5.0
|
||||||
|
|
|
@ -279,3 +279,12 @@ Description:
|
||||||
size in 512B sectors of the zones of the device, with
|
size in 512B sectors of the zones of the device, with
|
||||||
the eventual exception of the last zone of the device
|
the eventual exception of the last zone of the device
|
||||||
which may be smaller.
|
which may be smaller.
|
||||||
|
|
||||||
|
What: /sys/block/<disk>/queue/io_timeout
|
||||||
|
Date: November 2018
|
||||||
|
Contact: Weiping Zhang <zhangweiping@didiglobal.com>
|
||||||
|
Description:
|
||||||
|
io_timeout is the request timeout in milliseconds. If a request
|
||||||
|
does not complete in this time then the block driver timeout
|
||||||
|
handler is invoked. That timeout handler can decide to retry
|
||||||
|
the request, to fail it or to start a device recovery strategy.
|
||||||
|
|
|
@ -122,11 +122,18 @@ Description:
|
||||||
statistics (bd_count, bd_reads, bd_writes) in a format
|
statistics (bd_count, bd_reads, bd_writes) in a format
|
||||||
similar to block layer statistics file format.
|
similar to block layer statistics file format.
|
||||||
|
|
||||||
|
What: /sys/block/zram<id>/writeback_limit_enable
|
||||||
|
Date: November 2018
|
||||||
|
Contact: Minchan Kim <minchan@kernel.org>
|
||||||
|
Description:
|
||||||
|
The writeback_limit_enable file is read-write and specifies
|
||||||
|
eanbe of writeback_limit feature. "1" means eable the feature.
|
||||||
|
No limit "0" is the initial state.
|
||||||
|
|
||||||
What: /sys/block/zram<id>/writeback_limit
|
What: /sys/block/zram<id>/writeback_limit
|
||||||
Date: November 2018
|
Date: November 2018
|
||||||
Contact: Minchan Kim <minchan@kernel.org>
|
Contact: Minchan Kim <minchan@kernel.org>
|
||||||
Description:
|
Description:
|
||||||
The writeback_limit file is read-write and specifies the maximum
|
The writeback_limit file is read-write and specifies the maximum
|
||||||
amount of writeback ZRAM can do. The limit could be changed
|
amount of writeback ZRAM can do. The limit could be changed
|
||||||
in run time and "0" means disable the limit.
|
in run time.
|
||||||
No limit is the initial state.
|
|
||||||
|
|
|
@ -357,6 +357,13 @@ video playing/streaming, a very low drop rate may be more important
|
||||||
than maximum throughput. In these cases, consider setting the
|
than maximum throughput. In these cases, consider setting the
|
||||||
strict_guarantees parameter.
|
strict_guarantees parameter.
|
||||||
|
|
||||||
|
slice_idle_us
|
||||||
|
-------------
|
||||||
|
|
||||||
|
Controls the same tuning parameter as slice_idle, but in microseconds.
|
||||||
|
Either tunable can be used to set idling behavior. Afterwards, the
|
||||||
|
other tunable will reflect the newly set value in sysfs.
|
||||||
|
|
||||||
strict_guarantees
|
strict_guarantees
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
|
|
@ -88,7 +88,8 @@ shared_tags=[0/1]: Default: 0
|
||||||
|
|
||||||
zoned=[0/1]: Default: 0
|
zoned=[0/1]: Default: 0
|
||||||
0: Block device is exposed as a random-access block device.
|
0: Block device is exposed as a random-access block device.
|
||||||
1: Block device is exposed as a host-managed zoned block device.
|
1: Block device is exposed as a host-managed zoned block device. Requires
|
||||||
|
CONFIG_BLK_DEV_ZONED.
|
||||||
|
|
||||||
zone_size=[MB]: Default: 256
|
zone_size=[MB]: Default: 256
|
||||||
Per zone size when exposed as a zoned block device. Must be a power of two.
|
Per zone size when exposed as a zoned block device. Must be a power of two.
|
||||||
|
|
|
@ -67,6 +67,13 @@ If set to a value larger than 0, the kernel will put the process issuing
|
||||||
IO to sleep for this amount of microseconds before entering classic
|
IO to sleep for this amount of microseconds before entering classic
|
||||||
polling.
|
polling.
|
||||||
|
|
||||||
|
io_timeout (RW)
|
||||||
|
---------------
|
||||||
|
io_timeout is the request timeout in milliseconds. If a request does not
|
||||||
|
complete in this time then the block driver timeout handler is invoked.
|
||||||
|
That timeout handler can decide to retry the request, to fail it or to start
|
||||||
|
a device recovery strategy.
|
||||||
|
|
||||||
iostats (RW)
|
iostats (RW)
|
||||||
-------------
|
-------------
|
||||||
This file is used to control (on/off) the iostats accounting of the
|
This file is used to control (on/off) the iostats accounting of the
|
||||||
|
|
|
@ -156,22 +156,23 @@ Per-device statistics are exported as various nodes under /sys/block/zram<id>/
|
||||||
A brief description of exported device attributes. For more details please
|
A brief description of exported device attributes. For more details please
|
||||||
read Documentation/ABI/testing/sysfs-block-zram.
|
read Documentation/ABI/testing/sysfs-block-zram.
|
||||||
|
|
||||||
Name access description
|
Name access description
|
||||||
---- ------ -----------
|
---- ------ -----------
|
||||||
disksize RW show and set the device's disk size
|
disksize RW show and set the device's disk size
|
||||||
initstate RO shows the initialization state of the device
|
initstate RO shows the initialization state of the device
|
||||||
reset WO trigger device reset
|
reset WO trigger device reset
|
||||||
mem_used_max WO reset the `mem_used_max' counter (see later)
|
mem_used_max WO reset the `mem_used_max' counter (see later)
|
||||||
mem_limit WO specifies the maximum amount of memory ZRAM can use
|
mem_limit WO specifies the maximum amount of memory ZRAM can use
|
||||||
to store the compressed data
|
to store the compressed data
|
||||||
writeback_limit WO specifies the maximum amount of write IO zram can
|
writeback_limit WO specifies the maximum amount of write IO zram can
|
||||||
write out to backing device as 4KB unit
|
write out to backing device as 4KB unit
|
||||||
max_comp_streams RW the number of possible concurrent compress operations
|
writeback_limit_enable RW show and set writeback_limit feature
|
||||||
comp_algorithm RW show and change the compression algorithm
|
max_comp_streams RW the number of possible concurrent compress operations
|
||||||
compact WO trigger memory compaction
|
comp_algorithm RW show and change the compression algorithm
|
||||||
debug_stat RO this file is used for zram debugging purposes
|
compact WO trigger memory compaction
|
||||||
backing_dev RW set up backend storage for zram to write out
|
debug_stat RO this file is used for zram debugging purposes
|
||||||
idle WO mark allocated slot as idle
|
backing_dev RW set up backend storage for zram to write out
|
||||||
|
idle WO mark allocated slot as idle
|
||||||
|
|
||||||
|
|
||||||
User space is advised to use the following files to read the device statistics.
|
User space is advised to use the following files to read the device statistics.
|
||||||
|
@ -280,32 +281,51 @@ With the command, zram writeback idle pages from memory to the storage.
|
||||||
If there are lots of write IO with flash device, potentially, it has
|
If there are lots of write IO with flash device, potentially, it has
|
||||||
flash wearout problem so that admin needs to design write limitation
|
flash wearout problem so that admin needs to design write limitation
|
||||||
to guarantee storage health for entire product life.
|
to guarantee storage health for entire product life.
|
||||||
To overcome the concern, zram supports "writeback_limit".
|
|
||||||
The "writeback_limit"'s default value is 0 so that it doesn't limit
|
To overcome the concern, zram supports "writeback_limit" feature.
|
||||||
any writeback. If admin want to measure writeback count in a certain
|
The "writeback_limit_enable"'s default value is 0 so that it doesn't limit
|
||||||
period, he could know it via /sys/block/zram0/bd_stat's 3rd column.
|
any writeback. IOW, if admin want to apply writeback budget, he should
|
||||||
|
enable writeback_limit_enable via
|
||||||
|
|
||||||
|
$ echo 1 > /sys/block/zramX/writeback_limit_enable
|
||||||
|
|
||||||
|
Once writeback_limit_enable is set, zram doesn't allow any writeback
|
||||||
|
until admin set the budget via /sys/block/zramX/writeback_limit.
|
||||||
|
|
||||||
|
(If admin doesn't enable writeback_limit_enable, writeback_limit's value
|
||||||
|
assigned via /sys/block/zramX/writeback_limit is meaninless.)
|
||||||
|
|
||||||
If admin want to limit writeback as per-day 400M, he could do it
|
If admin want to limit writeback as per-day 400M, he could do it
|
||||||
like below.
|
like below.
|
||||||
|
|
||||||
MB_SHIFT=20
|
$ MB_SHIFT=20
|
||||||
4K_SHIFT=12
|
$ 4K_SHIFT=12
|
||||||
echo $((400<<MB_SHIFT>>4K_SHIFT)) > \
|
$ echo $((400<<MB_SHIFT>>4K_SHIFT)) > \
|
||||||
/sys/block/zram0/writeback_limit.
|
/sys/block/zram0/writeback_limit.
|
||||||
|
$ echo 1 > /sys/block/zram0/writeback_limit_enable
|
||||||
|
|
||||||
If admin want to allow further write again, he could do it like below
|
If admin want to allow further write again once the bugdet is exausted,
|
||||||
|
he could do it like below
|
||||||
|
|
||||||
echo 0 > /sys/block/zram0/writeback_limit
|
$ echo $((400<<MB_SHIFT>>4K_SHIFT)) > \
|
||||||
|
/sys/block/zram0/writeback_limit
|
||||||
|
|
||||||
If admin want to see remaining writeback budget since he set,
|
If admin want to see remaining writeback budget since he set,
|
||||||
|
|
||||||
cat /sys/block/zram0/writeback_limit
|
$ cat /sys/block/zramX/writeback_limit
|
||||||
|
|
||||||
|
If admin want to disable writeback limit, he could do
|
||||||
|
|
||||||
|
$ echo 0 > /sys/block/zramX/writeback_limit_enable
|
||||||
|
|
||||||
The writeback_limit count will reset whenever you reset zram(e.g.,
|
The writeback_limit count will reset whenever you reset zram(e.g.,
|
||||||
system reboot, echo 1 > /sys/block/zramX/reset) so keeping how many of
|
system reboot, echo 1 > /sys/block/zramX/reset) so keeping how many of
|
||||||
writeback happened until you reset the zram to allocate extra writeback
|
writeback happened until you reset the zram to allocate extra writeback
|
||||||
budget in next setting is user's job.
|
budget in next setting is user's job.
|
||||||
|
|
||||||
|
If admin want to measure writeback count in a certain period, he could
|
||||||
|
know it via /sys/block/zram0/bd_stat's 3rd column.
|
||||||
|
|
||||||
= memory tracking
|
= memory tracking
|
||||||
|
|
||||||
With CONFIG_ZRAM_MEMORY_TRACKING, user can know information of the
|
With CONFIG_ZRAM_MEMORY_TRACKING, user can know information of the
|
||||||
|
|
|
@ -157,12 +157,11 @@ Q: Does BPF have a stable ABI?
|
||||||
------------------------------
|
------------------------------
|
||||||
A: YES. BPF instructions, arguments to BPF programs, set of helper
|
A: YES. BPF instructions, arguments to BPF programs, set of helper
|
||||||
functions and their arguments, recognized return codes are all part
|
functions and their arguments, recognized return codes are all part
|
||||||
of ABI. However when tracing programs are using bpf_probe_read() helper
|
of ABI. However there is one specific exception to tracing programs
|
||||||
to walk kernel internal datastructures and compile with kernel
|
which are using helpers like bpf_probe_read() to walk kernel internal
|
||||||
internal headers these accesses can and will break with newer
|
data structures and compile with kernel internal headers. Both of these
|
||||||
kernels. The union bpf_attr -> kern_version is checked at load time
|
kernel internals are subject to change and can break with newer kernels
|
||||||
to prevent accidentally loading kprobe-based bpf programs written
|
such that the program needs to be adapted accordingly.
|
||||||
for a different kernel. Networking programs don't do kern_version check.
|
|
||||||
|
|
||||||
Q: How much stack space a BPF program uses?
|
Q: How much stack space a BPF program uses?
|
||||||
-------------------------------------------
|
-------------------------------------------
|
||||||
|
|
|
@ -108,12 +108,13 @@ some, but not all of the other indices changing.
|
||||||
|
|
||||||
Sometimes you need to ensure that a subsequent call to :c:func:`xa_store`
|
Sometimes you need to ensure that a subsequent call to :c:func:`xa_store`
|
||||||
will not need to allocate memory. The :c:func:`xa_reserve` function
|
will not need to allocate memory. The :c:func:`xa_reserve` function
|
||||||
will store a reserved entry at the indicated index. Users of the normal
|
will store a reserved entry at the indicated index. Users of the
|
||||||
API will see this entry as containing ``NULL``. If you do not need to
|
normal API will see this entry as containing ``NULL``. If you do
|
||||||
use the reserved entry, you can call :c:func:`xa_release` to remove the
|
not need to use the reserved entry, you can call :c:func:`xa_release`
|
||||||
unused entry. If another user has stored to the entry in the meantime,
|
to remove the unused entry. If another user has stored to the entry
|
||||||
:c:func:`xa_release` will do nothing; if instead you want the entry to
|
in the meantime, :c:func:`xa_release` will do nothing; if instead you
|
||||||
become ``NULL``, you should use :c:func:`xa_erase`.
|
want the entry to become ``NULL``, you should use :c:func:`xa_erase`.
|
||||||
|
Using :c:func:`xa_insert` on a reserved entry will fail.
|
||||||
|
|
||||||
If all entries in the array are ``NULL``, the :c:func:`xa_empty` function
|
If all entries in the array are ``NULL``, the :c:func:`xa_empty` function
|
||||||
will return ``true``.
|
will return ``true``.
|
||||||
|
@ -183,6 +184,8 @@ Takes xa_lock internally:
|
||||||
* :c:func:`xa_store_bh`
|
* :c:func:`xa_store_bh`
|
||||||
* :c:func:`xa_store_irq`
|
* :c:func:`xa_store_irq`
|
||||||
* :c:func:`xa_insert`
|
* :c:func:`xa_insert`
|
||||||
|
* :c:func:`xa_insert_bh`
|
||||||
|
* :c:func:`xa_insert_irq`
|
||||||
* :c:func:`xa_erase`
|
* :c:func:`xa_erase`
|
||||||
* :c:func:`xa_erase_bh`
|
* :c:func:`xa_erase_bh`
|
||||||
* :c:func:`xa_erase_irq`
|
* :c:func:`xa_erase_irq`
|
||||||
|
|
|
@ -235,4 +235,4 @@ cpus {
|
||||||
===========================================
|
===========================================
|
||||||
|
|
||||||
[1] ARM Linux Kernel documentation - CPUs bindings
|
[1] ARM Linux Kernel documentation - CPUs bindings
|
||||||
Documentation/devicetree/bindings/arm/cpus.txt
|
Documentation/devicetree/bindings/arm/cpus.yaml
|
||||||
|
|
|
@ -684,7 +684,7 @@ cpus {
|
||||||
===========================================
|
===========================================
|
||||||
|
|
||||||
[1] ARM Linux Kernel documentation - CPUs bindings
|
[1] ARM Linux Kernel documentation - CPUs bindings
|
||||||
Documentation/devicetree/bindings/arm/cpus.txt
|
Documentation/devicetree/bindings/arm/cpus.yaml
|
||||||
|
|
||||||
[2] ARM Linux Kernel documentation - PSCI bindings
|
[2] ARM Linux Kernel documentation - PSCI bindings
|
||||||
Documentation/devicetree/bindings/arm/psci.txt
|
Documentation/devicetree/bindings/arm/psci.txt
|
||||||
|
|
|
@ -4,7 +4,7 @@ SP810 System Controller
|
||||||
Required properties:
|
Required properties:
|
||||||
|
|
||||||
- compatible: standard compatible string for a Primecell peripheral,
|
- compatible: standard compatible string for a Primecell peripheral,
|
||||||
see Documentation/devicetree/bindings/arm/primecell.txt
|
see Documentation/devicetree/bindings/arm/primecell.yaml
|
||||||
for more details
|
for more details
|
||||||
should be: "arm,sp810", "arm,primecell"
|
should be: "arm,sp810", "arm,primecell"
|
||||||
|
|
||||||
|
|
|
@ -472,4 +472,4 @@ cpus {
|
||||||
|
|
||||||
===============================================================================
|
===============================================================================
|
||||||
[1] ARM Linux kernel documentation
|
[1] ARM Linux kernel documentation
|
||||||
Documentation/devicetree/bindings/arm/cpus.txt
|
Documentation/devicetree/bindings/arm/cpus.yaml
|
||||||
|
|
|
@ -18,4 +18,4 @@ Required Properties:
|
||||||
Each clock is assigned an identifier and client nodes use this identifier
|
Each clock is assigned an identifier and client nodes use this identifier
|
||||||
to specify the clock which they consume.
|
to specify the clock which they consume.
|
||||||
|
|
||||||
All these identifier could be found in <dt-bindings/clock/marvell-mmp2.h>.
|
All these identifiers could be found in <dt-bindings/clock/marvell,mmp2.h>.
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
* ARM PrimeCell Color LCD Controller PL110/PL111
|
* ARM PrimeCell Color LCD Controller PL110/PL111
|
||||||
|
|
||||||
See also Documentation/devicetree/bindings/arm/primecell.txt
|
See also Documentation/devicetree/bindings/arm/primecell.yaml
|
||||||
|
|
||||||
Required properties:
|
Required properties:
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,6 @@ Example:
|
||||||
reg = <0x04300000 0x20000>;
|
reg = <0x04300000 0x20000>;
|
||||||
reg-names = "kgsl_3d0_reg_memory";
|
reg-names = "kgsl_3d0_reg_memory";
|
||||||
interrupts = <GIC_SPI 80 0>;
|
interrupts = <GIC_SPI 80 0>;
|
||||||
interrupt-names = "kgsl_3d0_irq";
|
|
||||||
clock-names =
|
clock-names =
|
||||||
"core",
|
"core",
|
||||||
"iface",
|
"iface",
|
||||||
|
|
|
@ -14,8 +14,6 @@ Required properties:
|
||||||
|
|
||||||
"marvell,armada-8k-gpio" should be used for the Armada 7K and 8K
|
"marvell,armada-8k-gpio" should be used for the Armada 7K and 8K
|
||||||
SoCs (either from AP or CP), see
|
SoCs (either from AP or CP), see
|
||||||
Documentation/devicetree/bindings/arm/marvell/cp110-system-controller0.txt
|
|
||||||
and
|
|
||||||
Documentation/devicetree/bindings/arm/marvell/ap806-system-controller.txt
|
Documentation/devicetree/bindings/arm/marvell/ap806-system-controller.txt
|
||||||
for specific details about the offset property.
|
for specific details about the offset property.
|
||||||
|
|
||||||
|
|
|
@ -78,7 +78,7 @@ Sub-nodes:
|
||||||
PPI affinity can be expressed as a single "ppi-partitions" node,
|
PPI affinity can be expressed as a single "ppi-partitions" node,
|
||||||
containing a set of sub-nodes, each with the following property:
|
containing a set of sub-nodes, each with the following property:
|
||||||
- affinity: Should be a list of phandles to CPU nodes (as described in
|
- affinity: Should be a list of phandles to CPU nodes (as described in
|
||||||
Documentation/devicetree/bindings/arm/cpus.txt).
|
Documentation/devicetree/bindings/arm/cpus.yaml).
|
||||||
|
|
||||||
GICv3 has one or more Interrupt Translation Services (ITS) that are
|
GICv3 has one or more Interrupt Translation Services (ITS) that are
|
||||||
used to route Message Signalled Interrupts (MSI) to the CPUs.
|
used to route Message Signalled Interrupts (MSI) to the CPUs.
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
Altera SOCFPGA Reset Manager
|
Altera SOCFPGA Reset Manager
|
||||||
|
|
||||||
Required properties:
|
Required properties:
|
||||||
- compatible : "altr,rst-mgr"
|
- compatible : "altr,rst-mgr" for (Cyclone5/Arria5/Arria10)
|
||||||
|
"altr,stratix10-rst-mgr","altr,rst-mgr" for Stratix10 ARM64 SoC
|
||||||
- reg : Should contain 1 register ranges(address and length)
|
- reg : Should contain 1 register ranges(address and length)
|
||||||
- altr,modrst-offset : Should contain the offset of the first modrst register.
|
- altr,modrst-offset : Should contain the offset of the first modrst register.
|
||||||
- #reset-cells: 1
|
- #reset-cells: 1
|
||||||
|
|
|
@ -120,27 +120,30 @@ Example:
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
USB3 core reset
|
Peripheral core reset in glue layer
|
||||||
---------------
|
-----------------------------------
|
||||||
|
|
||||||
USB3 core reset belongs to USB3 glue layer. Before using the core reset,
|
Some peripheral core reset belongs to its own glue layer. Before using
|
||||||
it is necessary to control the clocks and resets to enable this layer.
|
this core reset, it is necessary to control the clocks and resets to enable
|
||||||
These clocks and resets should be described in each property.
|
this layer. These clocks and resets should be described in each property.
|
||||||
|
|
||||||
Required properties:
|
Required properties:
|
||||||
- compatible: Should be
|
- compatible: Should be
|
||||||
"socionext,uniphier-pro4-usb3-reset" - for Pro4 SoC
|
"socionext,uniphier-pro4-usb3-reset" - for Pro4 SoC USB3
|
||||||
"socionext,uniphier-pxs2-usb3-reset" - for PXs2 SoC
|
"socionext,uniphier-pxs2-usb3-reset" - for PXs2 SoC USB3
|
||||||
"socionext,uniphier-ld20-usb3-reset" - for LD20 SoC
|
"socionext,uniphier-ld20-usb3-reset" - for LD20 SoC USB3
|
||||||
"socionext,uniphier-pxs3-usb3-reset" - for PXs3 SoC
|
"socionext,uniphier-pxs3-usb3-reset" - for PXs3 SoC USB3
|
||||||
|
"socionext,uniphier-pro4-ahci-reset" - for Pro4 SoC AHCI
|
||||||
|
"socionext,uniphier-pxs2-ahci-reset" - for PXs2 SoC AHCI
|
||||||
|
"socionext,uniphier-pxs3-ahci-reset" - for PXs3 SoC AHCI
|
||||||
- #reset-cells: Should be 1.
|
- #reset-cells: Should be 1.
|
||||||
- reg: Specifies offset and length of the register set for the device.
|
- reg: Specifies offset and length of the register set for the device.
|
||||||
- clocks: A list of phandles to the clock gate for USB3 glue layer.
|
- clocks: A list of phandles to the clock gate for the glue layer.
|
||||||
According to the clock-names, appropriate clocks are required.
|
According to the clock-names, appropriate clocks are required.
|
||||||
- clock-names: Should contain
|
- clock-names: Should contain
|
||||||
"gio", "link" - for Pro4 SoC
|
"gio", "link" - for Pro4 SoC
|
||||||
"link" - for others
|
"link" - for others
|
||||||
- resets: A list of phandles to the reset control for USB3 glue layer.
|
- resets: A list of phandles to the reset control for the glue layer.
|
||||||
According to the reset-names, appropriate resets are required.
|
According to the reset-names, appropriate resets are required.
|
||||||
- reset-names: Should contain
|
- reset-names: Should contain
|
||||||
"gio", "link" - for Pro4 SoC
|
"gio", "link" - for Pro4 SoC
|
||||||
|
|
|
@ -55,7 +55,7 @@ of these nodes are defined by the individual bindings for the specific function
|
||||||
= EXAMPLE
|
= EXAMPLE
|
||||||
The following example represents the GLINK RPM node on a MSM8996 device, with
|
The following example represents the GLINK RPM node on a MSM8996 device, with
|
||||||
the function for the "rpm_request" channel defined, which is used for
|
the function for the "rpm_request" channel defined, which is used for
|
||||||
regualtors and root clocks.
|
regulators and root clocks.
|
||||||
|
|
||||||
apcs_glb: mailbox@9820000 {
|
apcs_glb: mailbox@9820000 {
|
||||||
compatible = "qcom,msm8996-apcs-hmss-global";
|
compatible = "qcom,msm8996-apcs-hmss-global";
|
||||||
|
|
|
@ -41,12 +41,12 @@ processor ID) and a string identifier.
|
||||||
- qcom,local-pid:
|
- qcom,local-pid:
|
||||||
Usage: required
|
Usage: required
|
||||||
Value type: <u32>
|
Value type: <u32>
|
||||||
Definition: specifies the identfier of the local endpoint of this edge
|
Definition: specifies the identifier of the local endpoint of this edge
|
||||||
|
|
||||||
- qcom,remote-pid:
|
- qcom,remote-pid:
|
||||||
Usage: required
|
Usage: required
|
||||||
Value type: <u32>
|
Value type: <u32>
|
||||||
Definition: specifies the identfier of the remote endpoint of this edge
|
Definition: specifies the identifier of the remote endpoint of this edge
|
||||||
|
|
||||||
= SUBNODES
|
= SUBNODES
|
||||||
Each SMP2P pair contain a set of inbound and outbound entries, these are
|
Each SMP2P pair contain a set of inbound and outbound entries, these are
|
||||||
|
|
|
@ -124,11 +124,11 @@ struct bus_attribute {
|
||||||
ssize_t (*store)(struct bus_type *, const char * buf, size_t count);
|
ssize_t (*store)(struct bus_type *, const char * buf, size_t count);
|
||||||
};
|
};
|
||||||
|
|
||||||
Bus drivers can export attributes using the BUS_ATTR macro that works
|
Bus drivers can export attributes using the BUS_ATTR_RW macro that works
|
||||||
similarly to the DEVICE_ATTR macro for devices. For example, a definition
|
similarly to the DEVICE_ATTR_RW macro for devices. For example, a
|
||||||
like this:
|
definition like this:
|
||||||
|
|
||||||
static BUS_ATTR(debug,0644,show_debug,store_debug);
|
static BUS_ATTR_RW(debug);
|
||||||
|
|
||||||
is equivalent to declaring:
|
is equivalent to declaring:
|
||||||
|
|
||||||
|
|
|
@ -163,6 +163,14 @@ C. Boot options
|
||||||
be preserved until there actually is some text is output to the console.
|
be preserved until there actually is some text is output to the console.
|
||||||
This option causes fbcon to bind immediately to the fbdev device.
|
This option causes fbcon to bind immediately to the fbdev device.
|
||||||
|
|
||||||
|
7. fbcon=logo-pos:<location>
|
||||||
|
|
||||||
|
The only possible 'location' is 'center' (without quotes), and when
|
||||||
|
given, the bootup logo is moved from the default top-left corner
|
||||||
|
location to the center of the framebuffer. If more than one logo is
|
||||||
|
displayed due to multiple CPUs, the collected line of logos is moved
|
||||||
|
as a whole.
|
||||||
|
|
||||||
C. Attaching, Detaching and Unloading
|
C. Attaching, Detaching and Unloading
|
||||||
|
|
||||||
Before going on to how to attach, detach and unload the framebuffer console, an
|
Before going on to how to attach, detach and unload the framebuffer console, an
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | TODO |
|
| arm: | TODO |
|
||||||
| arm64: | TODO |
|
| arm64: | TODO |
|
||||||
| c6x: | TODO |
|
| c6x: | TODO |
|
||||||
|
| csky: | TODO |
|
||||||
| h8300: | TODO |
|
| h8300: | TODO |
|
||||||
| hexagon: | TODO |
|
| hexagon: | TODO |
|
||||||
| ia64: | TODO |
|
| ia64: | TODO |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | ok |
|
| arm: | ok |
|
||||||
| arm64: | ok |
|
| arm64: | ok |
|
||||||
| c6x: | TODO |
|
| c6x: | TODO |
|
||||||
|
| csky: | TODO |
|
||||||
| h8300: | TODO |
|
| h8300: | TODO |
|
||||||
| hexagon: | TODO |
|
| hexagon: | TODO |
|
||||||
| ia64: | TODO |
|
| ia64: | TODO |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | ok |
|
| arm: | ok |
|
||||||
| arm64: | ok |
|
| arm64: | ok |
|
||||||
| c6x: | TODO |
|
| c6x: | TODO |
|
||||||
|
| csky: | ok |
|
||||||
| h8300: | TODO |
|
| h8300: | TODO |
|
||||||
| hexagon: | ok |
|
| hexagon: | ok |
|
||||||
| ia64: | ok |
|
| ia64: | ok |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | ok |
|
| arm: | ok |
|
||||||
| arm64: | ok |
|
| arm64: | ok |
|
||||||
| c6x: | TODO |
|
| c6x: | TODO |
|
||||||
|
| csky: | TODO |
|
||||||
| h8300: | TODO |
|
| h8300: | TODO |
|
||||||
| hexagon: | TODO |
|
| hexagon: | TODO |
|
||||||
| ia64: | TODO |
|
| ia64: | TODO |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | ok |
|
| arm: | ok |
|
||||||
| arm64: | ok |
|
| arm64: | ok |
|
||||||
| c6x: | ok |
|
| c6x: | ok |
|
||||||
|
| csky: | ok |
|
||||||
| h8300: | TODO |
|
| h8300: | TODO |
|
||||||
| hexagon: | ok |
|
| hexagon: | ok |
|
||||||
| ia64: | ok |
|
| ia64: | ok |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | TODO |
|
| arm: | TODO |
|
||||||
| arm64: | ok |
|
| arm64: | ok |
|
||||||
| c6x: | TODO |
|
| c6x: | TODO |
|
||||||
|
| csky: | TODO |
|
||||||
| h8300: | TODO |
|
| h8300: | TODO |
|
||||||
| hexagon: | TODO |
|
| hexagon: | TODO |
|
||||||
| ia64: | TODO |
|
| ia64: | TODO |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | ok |
|
| arm: | ok |
|
||||||
| arm64: | ok |
|
| arm64: | ok |
|
||||||
| c6x: | TODO |
|
| c6x: | TODO |
|
||||||
|
| csky: | TODO |
|
||||||
| h8300: | TODO |
|
| h8300: | TODO |
|
||||||
| hexagon: | TODO |
|
| hexagon: | TODO |
|
||||||
| ia64: | TODO |
|
| ia64: | TODO |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | ok |
|
| arm: | ok |
|
||||||
| arm64: | ok |
|
| arm64: | ok |
|
||||||
| c6x: | TODO |
|
| c6x: | TODO |
|
||||||
|
| csky: | TODO |
|
||||||
| h8300: | ok |
|
| h8300: | ok |
|
||||||
| hexagon: | ok |
|
| hexagon: | ok |
|
||||||
| ia64: | TODO |
|
| ia64: | TODO |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | TODO |
|
| arm: | TODO |
|
||||||
| arm64: | TODO |
|
| arm64: | TODO |
|
||||||
| c6x: | TODO |
|
| c6x: | TODO |
|
||||||
|
| csky: | TODO |
|
||||||
| h8300: | TODO |
|
| h8300: | TODO |
|
||||||
| hexagon: | TODO |
|
| hexagon: | TODO |
|
||||||
| ia64: | TODO |
|
| ia64: | TODO |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | ok |
|
| arm: | ok |
|
||||||
| arm64: | ok |
|
| arm64: | ok |
|
||||||
| c6x: | TODO |
|
| c6x: | TODO |
|
||||||
|
| csky: | TODO |
|
||||||
| h8300: | TODO |
|
| h8300: | TODO |
|
||||||
| hexagon: | TODO |
|
| hexagon: | TODO |
|
||||||
| ia64: | ok |
|
| ia64: | ok |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | ok |
|
| arm: | ok |
|
||||||
| arm64: | ok |
|
| arm64: | ok |
|
||||||
| c6x: | TODO |
|
| c6x: | TODO |
|
||||||
|
| csky: | TODO |
|
||||||
| h8300: | TODO |
|
| h8300: | TODO |
|
||||||
| hexagon: | TODO |
|
| hexagon: | TODO |
|
||||||
| ia64: | ok |
|
| ia64: | ok |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | ok |
|
| arm: | ok |
|
||||||
| arm64: | TODO |
|
| arm64: | TODO |
|
||||||
| c6x: | TODO |
|
| c6x: | TODO |
|
||||||
|
| csky: | TODO |
|
||||||
| h8300: | TODO |
|
| h8300: | TODO |
|
||||||
| hexagon: | TODO |
|
| hexagon: | TODO |
|
||||||
| ia64: | TODO |
|
| ia64: | TODO |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | ok |
|
| arm: | ok |
|
||||||
| arm64: | ok |
|
| arm64: | ok |
|
||||||
| c6x: | TODO |
|
| c6x: | TODO |
|
||||||
|
| csky: | TODO |
|
||||||
| h8300: | TODO |
|
| h8300: | TODO |
|
||||||
| hexagon: | TODO |
|
| hexagon: | TODO |
|
||||||
| ia64: | TODO |
|
| ia64: | TODO |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | ok |
|
| arm: | ok |
|
||||||
| arm64: | ok |
|
| arm64: | ok |
|
||||||
| c6x: | TODO |
|
| c6x: | TODO |
|
||||||
|
| csky: | TODO |
|
||||||
| h8300: | TODO |
|
| h8300: | TODO |
|
||||||
| hexagon: | TODO |
|
| hexagon: | TODO |
|
||||||
| ia64: | TODO |
|
| ia64: | TODO |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | TODO |
|
| arm: | TODO |
|
||||||
| arm64: | TODO |
|
| arm64: | TODO |
|
||||||
| c6x: | TODO |
|
| c6x: | TODO |
|
||||||
|
| csky: | TODO |
|
||||||
| h8300: | TODO |
|
| h8300: | TODO |
|
||||||
| hexagon: | TODO |
|
| hexagon: | TODO |
|
||||||
| ia64: | TODO |
|
| ia64: | TODO |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | ok |
|
| arm: | ok |
|
||||||
| arm64: | ok |
|
| arm64: | ok |
|
||||||
| c6x: | TODO |
|
| c6x: | TODO |
|
||||||
|
| csky: | ok |
|
||||||
| h8300: | TODO |
|
| h8300: | TODO |
|
||||||
| hexagon: | TODO |
|
| hexagon: | TODO |
|
||||||
| ia64: | TODO |
|
| ia64: | TODO |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | TODO |
|
| arm: | TODO |
|
||||||
| arm64: | ok |
|
| arm64: | ok |
|
||||||
| c6x: | TODO |
|
| c6x: | TODO |
|
||||||
|
| csky: | TODO |
|
||||||
| h8300: | TODO |
|
| h8300: | TODO |
|
||||||
| hexagon: | TODO |
|
| hexagon: | TODO |
|
||||||
| ia64: | TODO |
|
| ia64: | TODO |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | ok |
|
| arm: | ok |
|
||||||
| arm64: | ok |
|
| arm64: | ok |
|
||||||
| c6x: | TODO |
|
| c6x: | TODO |
|
||||||
|
| csky: | TODO |
|
||||||
| h8300: | TODO |
|
| h8300: | TODO |
|
||||||
| hexagon: | ok |
|
| hexagon: | ok |
|
||||||
| ia64: | TODO |
|
| ia64: | TODO |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | TODO |
|
| arm: | TODO |
|
||||||
| arm64: | ok |
|
| arm64: | ok |
|
||||||
| c6x: | TODO |
|
| c6x: | TODO |
|
||||||
|
| csky: | ok |
|
||||||
| h8300: | TODO |
|
| h8300: | TODO |
|
||||||
| hexagon: | TODO |
|
| hexagon: | TODO |
|
||||||
| ia64: | TODO |
|
| ia64: | TODO |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | TODO |
|
| arm: | TODO |
|
||||||
| arm64: | TODO |
|
| arm64: | TODO |
|
||||||
| c6x: | TODO |
|
| c6x: | TODO |
|
||||||
|
| csky: | TODO |
|
||||||
| h8300: | TODO |
|
| h8300: | TODO |
|
||||||
| hexagon: | TODO |
|
| hexagon: | TODO |
|
||||||
| ia64: | TODO |
|
| ia64: | TODO |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | ok |
|
| arm: | ok |
|
||||||
| arm64: | ok |
|
| arm64: | ok |
|
||||||
| c6x: | TODO |
|
| c6x: | TODO |
|
||||||
|
| csky: | TODO |
|
||||||
| h8300: | TODO |
|
| h8300: | TODO |
|
||||||
| hexagon: | TODO |
|
| hexagon: | TODO |
|
||||||
| ia64: | ok |
|
| ia64: | ok |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | ok |
|
| arm: | ok |
|
||||||
| arm64: | ok |
|
| arm64: | ok |
|
||||||
| c6x: | TODO |
|
| c6x: | TODO |
|
||||||
|
| csky: | TODO |
|
||||||
| h8300: | TODO |
|
| h8300: | TODO |
|
||||||
| hexagon: | ok |
|
| hexagon: | ok |
|
||||||
| ia64: | TODO |
|
| ia64: | TODO |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | ok |
|
| arm: | ok |
|
||||||
| arm64: | ok |
|
| arm64: | ok |
|
||||||
| c6x: | TODO |
|
| c6x: | TODO |
|
||||||
|
| csky: | TODO |
|
||||||
| h8300: | TODO |
|
| h8300: | TODO |
|
||||||
| hexagon: | TODO |
|
| hexagon: | TODO |
|
||||||
| ia64: | TODO |
|
| ia64: | TODO |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | ok |
|
| arm: | ok |
|
||||||
| arm64: | ok |
|
| arm64: | ok |
|
||||||
| c6x: | TODO |
|
| c6x: | TODO |
|
||||||
|
| csky: | TODO |
|
||||||
| h8300: | TODO |
|
| h8300: | TODO |
|
||||||
| hexagon: | TODO |
|
| hexagon: | TODO |
|
||||||
| ia64: | TODO |
|
| ia64: | TODO |
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
| arm: | ok |
|
| arm: | ok |
|
||||||
| arm64: | ok |
|
| arm64: | ok |
|
||||||
| c6x: | TODO |
|
| c6x: | TODO |
|
||||||
|
| csky: | TODO |
|
||||||
| h8300: | TODO |
|
| h8300: | TODO |
|
||||||
| hexagon: | TODO |
|
| hexagon: | TODO |
|
||||||
| ia64: | TODO |
|
| ia64: | TODO |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | .. |
|
| arm: | .. |
|
||||||
| arm64: | ok |
|
| arm64: | ok |
|
||||||
| c6x: | .. |
|
| c6x: | .. |
|
||||||
|
| csky: | .. |
|
||||||
| h8300: | .. |
|
| h8300: | .. |
|
||||||
| hexagon: | .. |
|
| hexagon: | .. |
|
||||||
| ia64: | TODO |
|
| ia64: | TODO |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | ok |
|
| arm: | ok |
|
||||||
| arm64: | ok |
|
| arm64: | ok |
|
||||||
| c6x: | TODO |
|
| c6x: | TODO |
|
||||||
|
| csky: | TODO |
|
||||||
| h8300: | TODO |
|
| h8300: | TODO |
|
||||||
| hexagon: | TODO |
|
| hexagon: | TODO |
|
||||||
| ia64: | TODO |
|
| ia64: | TODO |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | ok |
|
| arm: | ok |
|
||||||
| arm64: | ok |
|
| arm64: | ok |
|
||||||
| c6x: | TODO |
|
| c6x: | TODO |
|
||||||
|
| csky: | TODO |
|
||||||
| h8300: | TODO |
|
| h8300: | TODO |
|
||||||
| hexagon: | TODO |
|
| hexagon: | TODO |
|
||||||
| ia64: | TODO |
|
| ia64: | TODO |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | ok |
|
| arm: | ok |
|
||||||
| arm64: | ok |
|
| arm64: | ok |
|
||||||
| c6x: | ok |
|
| c6x: | ok |
|
||||||
|
| csky: | ok |
|
||||||
| h8300: | ok |
|
| h8300: | ok |
|
||||||
| hexagon: | ok |
|
| hexagon: | ok |
|
||||||
| ia64: | TODO |
|
| ia64: | TODO |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | ok |
|
| arm: | ok |
|
||||||
| arm64: | ok |
|
| arm64: | ok |
|
||||||
| c6x: | TODO |
|
| c6x: | TODO |
|
||||||
|
| csky: | TODO |
|
||||||
| h8300: | TODO |
|
| h8300: | TODO |
|
||||||
| hexagon: | TODO |
|
| hexagon: | TODO |
|
||||||
| ia64: | TODO |
|
| ia64: | TODO |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | ok |
|
| arm: | ok |
|
||||||
| arm64: | ok |
|
| arm64: | ok |
|
||||||
| c6x: | TODO |
|
| c6x: | TODO |
|
||||||
|
| csky: | TODO |
|
||||||
| h8300: | TODO |
|
| h8300: | TODO |
|
||||||
| hexagon: | TODO |
|
| hexagon: | TODO |
|
||||||
| ia64: | .. |
|
| ia64: | .. |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | TODO |
|
| arm: | TODO |
|
||||||
| arm64: | ok |
|
| arm64: | ok |
|
||||||
| c6x: | ok |
|
| c6x: | ok |
|
||||||
|
| csky: | ok |
|
||||||
| h8300: | ok |
|
| h8300: | ok |
|
||||||
| hexagon: | ok |
|
| hexagon: | ok |
|
||||||
| ia64: | ok |
|
| ia64: | ok |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | ok |
|
| arm: | ok |
|
||||||
| arm64: | ok |
|
| arm64: | ok |
|
||||||
| c6x: | TODO |
|
| c6x: | TODO |
|
||||||
|
| csky: | TODO |
|
||||||
| h8300: | TODO |
|
| h8300: | TODO |
|
||||||
| hexagon: | TODO |
|
| hexagon: | TODO |
|
||||||
| ia64: | ok |
|
| ia64: | ok |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | ok |
|
| arm: | ok |
|
||||||
| arm64: | ok |
|
| arm64: | ok |
|
||||||
| c6x: | TODO |
|
| c6x: | TODO |
|
||||||
|
| csky: | TODO |
|
||||||
| h8300: | TODO |
|
| h8300: | TODO |
|
||||||
| hexagon: | TODO |
|
| hexagon: | TODO |
|
||||||
| ia64: | TODO |
|
| ia64: | TODO |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | TODO |
|
| arm: | TODO |
|
||||||
| arm64: | TODO |
|
| arm64: | TODO |
|
||||||
| c6x: | TODO |
|
| c6x: | TODO |
|
||||||
|
| csky: | TODO |
|
||||||
| h8300: | TODO |
|
| h8300: | TODO |
|
||||||
| hexagon: | TODO |
|
| hexagon: | TODO |
|
||||||
| ia64: | ok |
|
| ia64: | ok |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | ok |
|
| arm: | ok |
|
||||||
| arm64: | ok |
|
| arm64: | ok |
|
||||||
| c6x: | .. |
|
| c6x: | .. |
|
||||||
|
| csky: | .. |
|
||||||
| h8300: | .. |
|
| h8300: | .. |
|
||||||
| hexagon: | .. |
|
| hexagon: | .. |
|
||||||
| ia64: | TODO |
|
| ia64: | TODO |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | TODO |
|
| arm: | TODO |
|
||||||
| arm64: | TODO |
|
| arm64: | TODO |
|
||||||
| c6x: | .. |
|
| c6x: | .. |
|
||||||
|
| csky: | TODO |
|
||||||
| h8300: | .. |
|
| h8300: | .. |
|
||||||
| hexagon: | TODO |
|
| hexagon: | TODO |
|
||||||
| ia64: | TODO |
|
| ia64: | TODO |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | TODO |
|
| arm: | TODO |
|
||||||
| arm64: | ok |
|
| arm64: | ok |
|
||||||
| c6x: | TODO |
|
| c6x: | TODO |
|
||||||
|
| csky: | TODO |
|
||||||
| h8300: | TODO |
|
| h8300: | TODO |
|
||||||
| hexagon: | TODO |
|
| hexagon: | TODO |
|
||||||
| ia64: | TODO |
|
| ia64: | TODO |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | TODO |
|
| arm: | TODO |
|
||||||
| arm64: | TODO |
|
| arm64: | TODO |
|
||||||
| c6x: | TODO |
|
| c6x: | TODO |
|
||||||
|
| csky: | TODO |
|
||||||
| h8300: | TODO |
|
| h8300: | TODO |
|
||||||
| hexagon: | TODO |
|
| hexagon: | TODO |
|
||||||
| ia64: | TODO |
|
| ia64: | TODO |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | .. |
|
| arm: | .. |
|
||||||
| arm64: | ok |
|
| arm64: | ok |
|
||||||
| c6x: | .. |
|
| c6x: | .. |
|
||||||
|
| csky: | .. |
|
||||||
| h8300: | .. |
|
| h8300: | .. |
|
||||||
| hexagon: | .. |
|
| hexagon: | .. |
|
||||||
| ia64: | ok |
|
| ia64: | ok |
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
| arm: | ok |
|
| arm: | ok |
|
||||||
| arm64: | ok |
|
| arm64: | ok |
|
||||||
| c6x: | TODO |
|
| c6x: | TODO |
|
||||||
|
| csky: | TODO |
|
||||||
| h8300: | TODO |
|
| h8300: | TODO |
|
||||||
| hexagon: | TODO |
|
| hexagon: | TODO |
|
||||||
| ia64: | TODO |
|
| ia64: | TODO |
|
||||||
|
|
|
@ -344,7 +344,9 @@ struct bus_attribute {
|
||||||
|
|
||||||
Declaring:
|
Declaring:
|
||||||
|
|
||||||
BUS_ATTR(_name, _mode, _show, _store)
|
static BUS_ATTR_RW(name);
|
||||||
|
static BUS_ATTR_RO(name);
|
||||||
|
static BUS_ATTR_WO(name);
|
||||||
|
|
||||||
Creation/Removal:
|
Creation/Removal:
|
||||||
|
|
||||||
|
|
|
@ -11,19 +11,19 @@ Contents:
|
||||||
batman-adv
|
batman-adv
|
||||||
can
|
can
|
||||||
can_ucan_protocol
|
can_ucan_protocol
|
||||||
dpaa2/index
|
device_drivers/freescale/dpaa2/index
|
||||||
e100
|
device_drivers/intel/e100
|
||||||
e1000
|
device_drivers/intel/e1000
|
||||||
e1000e
|
device_drivers/intel/e1000e
|
||||||
fm10k
|
device_drivers/intel/fm10k
|
||||||
igb
|
device_drivers/intel/igb
|
||||||
igbvf
|
device_drivers/intel/igbvf
|
||||||
ixgb
|
device_drivers/intel/ixgb
|
||||||
ixgbe
|
device_drivers/intel/ixgbe
|
||||||
ixgbevf
|
device_drivers/intel/ixgbevf
|
||||||
i40e
|
device_drivers/intel/i40e
|
||||||
iavf
|
device_drivers/intel/iavf
|
||||||
ice
|
device_drivers/intel/ice
|
||||||
kapi
|
kapi
|
||||||
z8530book
|
z8530book
|
||||||
msg_zerocopy
|
msg_zerocopy
|
||||||
|
|
|
@ -1000,51 +1000,6 @@ The kernel interface functions are as follows:
|
||||||
size should be set when the call is begun. tx_total_len may not be less
|
size should be set when the call is begun. tx_total_len may not be less
|
||||||
than zero.
|
than zero.
|
||||||
|
|
||||||
(*) Check to see the completion state of a call so that the caller can assess
|
|
||||||
whether it needs to be retried.
|
|
||||||
|
|
||||||
enum rxrpc_call_completion {
|
|
||||||
RXRPC_CALL_SUCCEEDED,
|
|
||||||
RXRPC_CALL_REMOTELY_ABORTED,
|
|
||||||
RXRPC_CALL_LOCALLY_ABORTED,
|
|
||||||
RXRPC_CALL_LOCAL_ERROR,
|
|
||||||
RXRPC_CALL_NETWORK_ERROR,
|
|
||||||
};
|
|
||||||
|
|
||||||
int rxrpc_kernel_check_call(struct socket *sock, struct rxrpc_call *call,
|
|
||||||
enum rxrpc_call_completion *_compl,
|
|
||||||
u32 *_abort_code);
|
|
||||||
|
|
||||||
On return, -EINPROGRESS will be returned if the call is still ongoing; if
|
|
||||||
it is finished, *_compl will be set to indicate the manner of completion,
|
|
||||||
*_abort_code will be set to any abort code that occurred. 0 will be
|
|
||||||
returned on a successful completion, -ECONNABORTED will be returned if the
|
|
||||||
client failed due to a remote abort and anything else will return an
|
|
||||||
appropriate error code.
|
|
||||||
|
|
||||||
The caller should look at this information to decide if it's worth
|
|
||||||
retrying the call.
|
|
||||||
|
|
||||||
(*) Retry a client call.
|
|
||||||
|
|
||||||
int rxrpc_kernel_retry_call(struct socket *sock,
|
|
||||||
struct rxrpc_call *call,
|
|
||||||
struct sockaddr_rxrpc *srx,
|
|
||||||
struct key *key);
|
|
||||||
|
|
||||||
This attempts to partially reinitialise a call and submit it again while
|
|
||||||
reusing the original call's Tx queue to avoid the need to repackage and
|
|
||||||
re-encrypt the data to be sent. call indicates the call to retry, srx the
|
|
||||||
new address to send it to and key the encryption key to use for signing or
|
|
||||||
encrypting the packets.
|
|
||||||
|
|
||||||
For this to work, the first Tx data packet must still be in the transmit
|
|
||||||
queue, and currently this is only permitted for local and network errors
|
|
||||||
and the call must not have been aborted. Any partially constructed Tx
|
|
||||||
packet is left as is and can continue being filled afterwards.
|
|
||||||
|
|
||||||
It returns 0 if the call was requeued and an error otherwise.
|
|
||||||
|
|
||||||
(*) Get call RTT.
|
(*) Get call RTT.
|
||||||
|
|
||||||
u64 rxrpc_kernel_get_rtt(struct socket *sock, struct rxrpc_call *call);
|
u64 rxrpc_kernel_get_rtt(struct socket *sock, struct rxrpc_call *call);
|
||||||
|
|
|
@ -336,7 +336,26 @@ time client replies ACK, this socket will get another chance to move
|
||||||
to the accept queue.
|
to the accept queue.
|
||||||
|
|
||||||
|
|
||||||
TCP Fast Open
|
* TcpEstabResets
|
||||||
|
Defined in `RFC1213 tcpEstabResets`_.
|
||||||
|
|
||||||
|
.. _RFC1213 tcpEstabResets: https://tools.ietf.org/html/rfc1213#page-48
|
||||||
|
|
||||||
|
* TcpAttemptFails
|
||||||
|
Defined in `RFC1213 tcpAttemptFails`_.
|
||||||
|
|
||||||
|
.. _RFC1213 tcpAttemptFails: https://tools.ietf.org/html/rfc1213#page-48
|
||||||
|
|
||||||
|
* TcpOutRsts
|
||||||
|
Defined in `RFC1213 tcpOutRsts`_. The RFC says this counter indicates
|
||||||
|
the 'segments sent containing the RST flag', but in linux kernel, this
|
||||||
|
couner indicates the segments kerenl tried to send. The sending
|
||||||
|
process might be failed due to some errors (e.g. memory alloc failed).
|
||||||
|
|
||||||
|
.. _RFC1213 tcpOutRsts: https://tools.ietf.org/html/rfc1213#page-52
|
||||||
|
|
||||||
|
|
||||||
|
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
|
||||||
|
@ -383,8 +402,6 @@ increase 1.
|
||||||
|
|
||||||
TCP abort
|
TCP abort
|
||||||
========
|
========
|
||||||
|
|
||||||
|
|
||||||
* TcpExtTCPAbortOnData
|
* TcpExtTCPAbortOnData
|
||||||
It means TCP layer has data in flight, but need to close the
|
It means TCP layer has data in flight, but need to close the
|
||||||
connection. So TCP layer sends a RST to the other side, indicate the
|
connection. So TCP layer sends a RST to the other side, indicate the
|
||||||
|
@ -545,7 +562,6 @@ packet yet, the sender would know packet 4 is out of order. The TCP
|
||||||
stack of kernel will increase TcpExtTCPSACKReorder for both of the
|
stack of kernel will increase TcpExtTCPSACKReorder for both of the
|
||||||
above scenarios.
|
above scenarios.
|
||||||
|
|
||||||
|
|
||||||
DSACK
|
DSACK
|
||||||
=====
|
=====
|
||||||
The DSACK is defined in `RFC2883`_. The receiver uses DSACK to report
|
The DSACK is defined in `RFC2883`_. The receiver uses DSACK to report
|
||||||
|
@ -566,13 +582,63 @@ 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 indicate an acknowledged
|
The TCP stack receives a DSACK, which indicates an acknowledged
|
||||||
duplicate packet is received.
|
duplicate packet is received.
|
||||||
|
|
||||||
* TcpExtTCPDSACKOfoRecv
|
* TcpExtTCPDSACKOfoRecv
|
||||||
The TCP stack receives a DSACK, which indicate an out of order
|
The TCP stack receives a DSACK, which indicate an out of order
|
||||||
duplicate packet is received.
|
duplicate packet is received.
|
||||||
|
|
||||||
|
invalid SACK and DSACK
|
||||||
|
====================
|
||||||
|
When a SACK (or DSACK) block is invalid, a corresponding counter would
|
||||||
|
be updated. The validation method is base on the start/end sequence
|
||||||
|
number of the SACK block. For more details, please refer the comment
|
||||||
|
of the function tcp_is_sackblock_valid in the kernel source code. A
|
||||||
|
SACK option could have up to 4 blocks, they are checked
|
||||||
|
individually. E.g., if 3 blocks of a SACk is invalid, the
|
||||||
|
corresponding counter would be updated 3 times. The comment of the
|
||||||
|
`Add counters for discarded SACK blocks`_ patch has additional
|
||||||
|
explaination:
|
||||||
|
|
||||||
|
.. _Add counters for discarded SACK blocks: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=18f02545a9a16c9a89778b91a162ad16d510bb32
|
||||||
|
|
||||||
|
* TcpExtTCPSACKDiscard
|
||||||
|
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
|
||||||
|
it and won't update this counter.
|
||||||
|
|
||||||
|
* TcpExtTCPDSACKIgnoredOld and TcpExtTCPDSACKIgnoredNoUndo
|
||||||
|
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
|
||||||
|
of the TCP socket. If the undo_marker is not set, the TCP stack isn't
|
||||||
|
likely to re-transmit any packets, and we still receive an invalid
|
||||||
|
DSACK block, the reason might be that the packet is duplicated in the
|
||||||
|
middle of the network. In such scenario, TcpExtTCPDSACKIgnoredNoUndo
|
||||||
|
will be updated. If the undo_marker is set, TcpExtTCPDSACKIgnoredOld
|
||||||
|
will be updated. As implied in its name, it might be an old packet.
|
||||||
|
|
||||||
|
SACK shift
|
||||||
|
=========
|
||||||
|
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
|
||||||
|
to re-arrange data in these skb. E.g. if a SACK block acknowledges seq
|
||||||
|
10 to 15, skb1 has seq 10 to 13, skb2 has seq 14 to 20. The seq 14 and
|
||||||
|
15 in skb2 would be moved to skb1. This operation is 'shift'. If a
|
||||||
|
SACK block acknowledges seq 10 to 20, skb1 has seq 10 to 13, skb2 has
|
||||||
|
seq 14 to 20. All data in skb2 will be moved to skb1, and skb2 will be
|
||||||
|
discard, this operation is 'merge'.
|
||||||
|
|
||||||
|
* TcpExtTCPSackShifted
|
||||||
|
A skb is shifted
|
||||||
|
|
||||||
|
* TcpExtTCPSackMerged
|
||||||
|
A skb is merged
|
||||||
|
|
||||||
|
* TcpExtTCPSackShiftFallback
|
||||||
|
A skb should be shifted or merged, but the TCP stack doesn't do it for
|
||||||
|
some reasons.
|
||||||
|
|
||||||
TCP out of order
|
TCP out of order
|
||||||
===============
|
===============
|
||||||
* TcpExtTCPOFOQueue
|
* TcpExtTCPOFOQueue
|
||||||
|
@ -662,6 +728,60 @@ unacknowledged number (more strict than `RFC 5961 section 5.2`_).
|
||||||
.. _RFC 5961 section 4.2: https://tools.ietf.org/html/rfc5961#page-9
|
.. _RFC 5961 section 4.2: https://tools.ietf.org/html/rfc5961#page-9
|
||||||
.. _RFC 5961 section 5.2: https://tools.ietf.org/html/rfc5961#page-11
|
.. _RFC 5961 section 5.2: https://tools.ietf.org/html/rfc5961#page-11
|
||||||
|
|
||||||
|
TCP receive window
|
||||||
|
=================
|
||||||
|
* TcpExtTCPWantZeroWindowAdv
|
||||||
|
Depending on current memory usage, the TCP stack tries to set receive
|
||||||
|
window to zero. But the receive window might still be a no-zero
|
||||||
|
value. For example, if the previous window size is 10, and the TCP
|
||||||
|
stack receives 3 bytes, the current window size would be 7 even if the
|
||||||
|
window size calculated by the memory usage is zero.
|
||||||
|
|
||||||
|
* TcpExtTCPToZeroWindowAdv
|
||||||
|
The TCP receive window is set to zero from a no-zero value.
|
||||||
|
|
||||||
|
* TcpExtTCPFromZeroWindowAdv
|
||||||
|
The TCP receive window is set to no-zero value from zero.
|
||||||
|
|
||||||
|
|
||||||
|
Delayed ACK
|
||||||
|
==========
|
||||||
|
The TCP Delayed ACK is a technique which is used for reducing the
|
||||||
|
packet count in the network. For more details, please refer the
|
||||||
|
`Delayed ACK wiki`_
|
||||||
|
|
||||||
|
.. _Delayed ACK wiki: https://en.wikipedia.org/wiki/TCP_delayed_acknowledgment
|
||||||
|
|
||||||
|
* TcpExtDelayedACKs
|
||||||
|
A delayed ACK timer expires. The TCP stack will send a pure ACK packet
|
||||||
|
and exit the delayed ACK mode.
|
||||||
|
|
||||||
|
* TcpExtDelayedACKLocked
|
||||||
|
A delayed ACK timer expires, but the TCP stack can't send an ACK
|
||||||
|
immediately due to the socket is locked by a userspace program. The
|
||||||
|
TCP stack will send a pure ACK later (after the userspace program
|
||||||
|
unlock the socket). When the TCP stack sends the pure ACK later, the
|
||||||
|
TCP stack will also update TcpExtDelayedACKs and exit the delayed ACK
|
||||||
|
mode.
|
||||||
|
|
||||||
|
* TcpExtDelayedACKLost
|
||||||
|
It will be updated when the TCP stack receives a packet which has been
|
||||||
|
ACKed. A Delayed ACK loss might cause this issue, but it would also be
|
||||||
|
triggered by other reasons, such as a packet is duplicated in the
|
||||||
|
network.
|
||||||
|
|
||||||
|
Tail Loss Probe (TLP)
|
||||||
|
===================
|
||||||
|
TLP is an algorithm which is used to detect TCP packet loss. For more
|
||||||
|
details, please refer the `TLP paper`_.
|
||||||
|
|
||||||
|
.. _TLP paper: https://tools.ietf.org/html/draft-dukkipati-tcpm-tcp-loss-probe-01
|
||||||
|
|
||||||
|
* TcpExtTCPLossProbes
|
||||||
|
A TLP probe packet is sent.
|
||||||
|
|
||||||
|
* TcpExtTCPLossProbeRecovery
|
||||||
|
A packet loss is detected and recovered by TLP.
|
||||||
|
|
||||||
examples
|
examples
|
||||||
=======
|
=======
|
||||||
|
|
|
@ -417,7 +417,7 @@ is again deprecated and ts[2] holds a hardware timestamp if set.
|
||||||
|
|
||||||
Hardware time stamping must also be initialized for each device driver
|
Hardware time stamping must also be initialized for each device driver
|
||||||
that is expected to do hardware time stamping. The parameter is defined in
|
that is expected to do hardware time stamping. The parameter is defined in
|
||||||
/include/linux/net_tstamp.h as:
|
include/uapi/linux/net_tstamp.h as:
|
||||||
|
|
||||||
struct hwtstamp_config {
|
struct hwtstamp_config {
|
||||||
int flags; /* no flags defined right now, must be zero */
|
int flags; /* no flags defined right now, must be zero */
|
||||||
|
@ -487,7 +487,7 @@ enum {
|
||||||
HWTSTAMP_FILTER_PTP_V1_L4_EVENT,
|
HWTSTAMP_FILTER_PTP_V1_L4_EVENT,
|
||||||
|
|
||||||
/* for the complete list of values, please check
|
/* for the complete list of values, please check
|
||||||
* the include file /include/linux/net_tstamp.h
|
* the include file include/uapi/linux/net_tstamp.h
|
||||||
*/
|
*/
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -165,7 +165,7 @@ Do some work...
|
||||||
The same can also be done from an application program.
|
The same can also be done from an application program.
|
||||||
|
|
||||||
Disable specific CPU's specific idle state from cpuidle sysfs (see
|
Disable specific CPU's specific idle state from cpuidle sysfs (see
|
||||||
Documentation/cpuidle/sysfs.txt):
|
Documentation/admin-guide/pm/cpuidle.rst):
|
||||||
# echo 1 > /sys/devices/system/cpu/cpu$cpu/cpuidle/state$state/disable
|
# echo 1 > /sys/devices/system/cpu/cpu$cpu/cpuidle/state$state/disable
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -242,6 +242,6 @@ References
|
||||||
==========
|
==========
|
||||||
|
|
||||||
.. [white-paper] http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2013/12/AMD_Memory_Encryption_Whitepaper_v7-Public.pdf
|
.. [white-paper] http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2013/12/AMD_Memory_Encryption_Whitepaper_v7-Public.pdf
|
||||||
.. [api-spec] http://support.amd.com/TechDocs/55766_SEV-KM%20API_Specification.pdf
|
.. [api-spec] http://support.amd.com/TechDocs/55766_SEV-KM_API_Specification.pdf
|
||||||
.. [amd-apm] http://support.amd.com/TechDocs/24593.pdf (section 15.34)
|
.. [amd-apm] http://support.amd.com/TechDocs/24593.pdf (section 15.34)
|
||||||
.. [kvm-forum] http://www.linux-kvm.org/images/7/74/02x08A-Thomas_Lendacky-AMDs_Virtualizatoin_Memory_Encryption_Technology.pdf
|
.. [kvm-forum] http://www.linux-kvm.org/images/7/74/02x08A-Thomas_Lendacky-AMDs_Virtualizatoin_Memory_Encryption_Technology.pdf
|
||||||
|
|
|
@ -9,7 +9,7 @@ Fenghua Yu <fenghua.yu@intel.com>
|
||||||
Tony Luck <tony.luck@intel.com>
|
Tony Luck <tony.luck@intel.com>
|
||||||
Vikas Shivappa <vikas.shivappa@intel.com>
|
Vikas Shivappa <vikas.shivappa@intel.com>
|
||||||
|
|
||||||
This feature is enabled by the CONFIG_RESCTRL and the X86 /proc/cpuinfo
|
This feature is enabled by the CONFIG_X86_RESCTRL and the x86 /proc/cpuinfo
|
||||||
flag bits:
|
flag bits:
|
||||||
RDT (Resource Director Technology) Allocation - "rdt_a"
|
RDT (Resource Director Technology) Allocation - "rdt_a"
|
||||||
CAT (Cache Allocation Technology) - "cat_l3", "cat_l2"
|
CAT (Cache Allocation Technology) - "cat_l3", "cat_l2"
|
||||||
|
|
68
MAINTAINERS
68
MAINTAINERS
|
@ -3052,8 +3052,8 @@ F: include/linux/bcm963xx_nvram.h
|
||||||
F: include/linux/bcm963xx_tag.h
|
F: include/linux/bcm963xx_tag.h
|
||||||
|
|
||||||
BROADCOM BNX2 GIGABIT ETHERNET DRIVER
|
BROADCOM BNX2 GIGABIT ETHERNET DRIVER
|
||||||
M: Rasesh Mody <rasesh.mody@cavium.com>
|
M: Rasesh Mody <rmody@marvell.com>
|
||||||
M: Dept-GELinuxNICDev@cavium.com
|
M: GR-Linux-NIC-Dev@marvell.com
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/net/ethernet/broadcom/bnx2.*
|
F: drivers/net/ethernet/broadcom/bnx2.*
|
||||||
|
@ -3072,9 +3072,9 @@ S: Supported
|
||||||
F: drivers/scsi/bnx2i/
|
F: drivers/scsi/bnx2i/
|
||||||
|
|
||||||
BROADCOM BNX2X 10 GIGABIT ETHERNET DRIVER
|
BROADCOM BNX2X 10 GIGABIT ETHERNET DRIVER
|
||||||
M: Ariel Elior <ariel.elior@cavium.com>
|
M: Ariel Elior <aelior@marvell.com>
|
||||||
M: Sudarsana Kalluru <sudarsana.kalluru@cavium.com>
|
M: Sudarsana Kalluru <skalluru@marvell.com>
|
||||||
M: everest-linux-l2@cavium.com
|
M: GR-everest-linux-l2@marvell.com
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/net/ethernet/broadcom/bnx2x/
|
F: drivers/net/ethernet/broadcom/bnx2x/
|
||||||
|
@ -3249,9 +3249,9 @@ S: Supported
|
||||||
F: drivers/scsi/bfa/
|
F: drivers/scsi/bfa/
|
||||||
|
|
||||||
BROCADE BNA 10 GIGABIT ETHERNET DRIVER
|
BROCADE BNA 10 GIGABIT ETHERNET DRIVER
|
||||||
M: Rasesh Mody <rasesh.mody@cavium.com>
|
M: Rasesh Mody <rmody@marvell.com>
|
||||||
M: Sudarsana Kalluru <sudarsana.kalluru@cavium.com>
|
M: Sudarsana Kalluru <skalluru@marvell.com>
|
||||||
M: Dept-GELinuxNICDev@cavium.com
|
M: GR-Linux-NIC-Dev@marvell.com
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/net/ethernet/brocade/bna/
|
F: drivers/net/ethernet/brocade/bna/
|
||||||
|
@ -3471,10 +3471,9 @@ F: drivers/i2c/busses/i2c-octeon*
|
||||||
F: drivers/i2c/busses/i2c-thunderx*
|
F: drivers/i2c/busses/i2c-thunderx*
|
||||||
|
|
||||||
CAVIUM LIQUIDIO NETWORK DRIVER
|
CAVIUM LIQUIDIO NETWORK DRIVER
|
||||||
M: Derek Chickles <derek.chickles@caviumnetworks.com>
|
M: Derek Chickles <dchickles@marvell.com>
|
||||||
M: Satanand Burla <satananda.burla@caviumnetworks.com>
|
M: Satanand Burla <sburla@marvell.com>
|
||||||
M: Felix Manlunas <felix.manlunas@caviumnetworks.com>
|
M: Felix Manlunas <fmanlunas@marvell.com>
|
||||||
M: Raghu Vatsavayi <raghu.vatsavayi@caviumnetworks.com>
|
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
W: http://www.cavium.com
|
W: http://www.cavium.com
|
||||||
S: Supported
|
S: Supported
|
||||||
|
@ -3951,7 +3950,7 @@ L: netdev@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/net/ethernet/ti/cpmac.c
|
F: drivers/net/ethernet/ti/cpmac.c
|
||||||
|
|
||||||
CPU FREQUENCY DRIVERS
|
CPU FREQUENCY SCALING FRAMEWORK
|
||||||
M: "Rafael J. Wysocki" <rjw@rjwysocki.net>
|
M: "Rafael J. Wysocki" <rjw@rjwysocki.net>
|
||||||
M: Viresh Kumar <viresh.kumar@linaro.org>
|
M: Viresh Kumar <viresh.kumar@linaro.org>
|
||||||
L: linux-pm@vger.kernel.org
|
L: linux-pm@vger.kernel.org
|
||||||
|
@ -3959,6 +3958,8 @@ S: Maintained
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git
|
||||||
T: git git://git.linaro.org/people/vireshk/linux.git (For ARM Updates)
|
T: git git://git.linaro.org/people/vireshk/linux.git (For ARM Updates)
|
||||||
B: https://bugzilla.kernel.org
|
B: https://bugzilla.kernel.org
|
||||||
|
F: Documentation/admin-guide/pm/cpufreq.rst
|
||||||
|
F: Documentation/admin-guide/pm/intel_pstate.rst
|
||||||
F: Documentation/cpu-freq/
|
F: Documentation/cpu-freq/
|
||||||
F: Documentation/devicetree/bindings/cpufreq/
|
F: Documentation/devicetree/bindings/cpufreq/
|
||||||
F: drivers/cpufreq/
|
F: drivers/cpufreq/
|
||||||
|
@ -3977,6 +3978,7 @@ F: drivers/cpufreq/arm_big_little.c
|
||||||
CPU POWER MONITORING SUBSYSTEM
|
CPU POWER MONITORING SUBSYSTEM
|
||||||
M: Thomas Renninger <trenn@suse.com>
|
M: Thomas Renninger <trenn@suse.com>
|
||||||
M: Shuah Khan <shuah@kernel.org>
|
M: Shuah Khan <shuah@kernel.org>
|
||||||
|
M: Shuah Khan <skhan@linuxfoundation.org>
|
||||||
L: linux-pm@vger.kernel.org
|
L: linux-pm@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: tools/power/cpupower/
|
F: tools/power/cpupower/
|
||||||
|
@ -4006,13 +4008,14 @@ S: Supported
|
||||||
F: drivers/cpuidle/cpuidle-exynos.c
|
F: drivers/cpuidle/cpuidle-exynos.c
|
||||||
F: arch/arm/mach-exynos/pm.c
|
F: arch/arm/mach-exynos/pm.c
|
||||||
|
|
||||||
CPUIDLE DRIVERS
|
CPU IDLE TIME MANAGEMENT FRAMEWORK
|
||||||
M: "Rafael J. Wysocki" <rjw@rjwysocki.net>
|
M: "Rafael J. Wysocki" <rjw@rjwysocki.net>
|
||||||
M: Daniel Lezcano <daniel.lezcano@linaro.org>
|
M: Daniel Lezcano <daniel.lezcano@linaro.org>
|
||||||
L: linux-pm@vger.kernel.org
|
L: linux-pm@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm.git
|
||||||
B: https://bugzilla.kernel.org
|
B: https://bugzilla.kernel.org
|
||||||
|
F: Documentation/admin-guide/pm/cpuidle.rst
|
||||||
F: drivers/cpuidle/*
|
F: drivers/cpuidle/*
|
||||||
F: include/linux/cpuidle.h
|
F: include/linux/cpuidle.h
|
||||||
|
|
||||||
|
@ -8256,6 +8259,7 @@ F: include/uapi/linux/sunrpc/
|
||||||
|
|
||||||
KERNEL SELFTEST FRAMEWORK
|
KERNEL SELFTEST FRAMEWORK
|
||||||
M: Shuah Khan <shuah@kernel.org>
|
M: Shuah Khan <shuah@kernel.org>
|
||||||
|
M: Shuah Khan <skhan@linuxfoundation.org>
|
||||||
L: linux-kselftest@vger.kernel.org
|
L: linux-kselftest@vger.kernel.org
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/shuah/linux-kselftest.git
|
||||||
Q: https://patchwork.kernel.org/project/linux-kselftest/list/
|
Q: https://patchwork.kernel.org/project/linux-kselftest/list/
|
||||||
|
@ -10686,9 +10690,9 @@ S: Maintained
|
||||||
F: drivers/net/netdevsim/*
|
F: drivers/net/netdevsim/*
|
||||||
|
|
||||||
NETXEN (1/10) GbE SUPPORT
|
NETXEN (1/10) GbE SUPPORT
|
||||||
M: Manish Chopra <manish.chopra@cavium.com>
|
M: Manish Chopra <manishc@marvell.com>
|
||||||
M: Rahul Verma <rahul.verma@cavium.com>
|
M: Rahul Verma <rahulv@marvell.com>
|
||||||
M: Dept-GELinuxNICDev@cavium.com
|
M: GR-Linux-NIC-Dev@marvell.com
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/net/ethernet/qlogic/netxen/
|
F: drivers/net/ethernet/qlogic/netxen/
|
||||||
|
@ -12472,8 +12476,8 @@ S: Supported
|
||||||
F: drivers/scsi/qedi/
|
F: drivers/scsi/qedi/
|
||||||
|
|
||||||
QLOGIC QL4xxx ETHERNET DRIVER
|
QLOGIC QL4xxx ETHERNET DRIVER
|
||||||
M: Ariel Elior <Ariel.Elior@cavium.com>
|
M: Ariel Elior <aelior@marvell.com>
|
||||||
M: everest-linux-l2@cavium.com
|
M: GR-everest-linux-l2@marvell.com
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/net/ethernet/qlogic/qed/
|
F: drivers/net/ethernet/qlogic/qed/
|
||||||
|
@ -12481,8 +12485,8 @@ F: include/linux/qed/
|
||||||
F: drivers/net/ethernet/qlogic/qede/
|
F: drivers/net/ethernet/qlogic/qede/
|
||||||
|
|
||||||
QLOGIC QL4xxx RDMA DRIVER
|
QLOGIC QL4xxx RDMA DRIVER
|
||||||
M: Michal Kalderon <Michal.Kalderon@cavium.com>
|
M: Michal Kalderon <mkalderon@marvell.com>
|
||||||
M: Ariel Elior <Ariel.Elior@cavium.com>
|
M: Ariel Elior <aelior@marvell.com>
|
||||||
L: linux-rdma@vger.kernel.org
|
L: linux-rdma@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/infiniband/hw/qedr/
|
F: drivers/infiniband/hw/qedr/
|
||||||
|
@ -12502,7 +12506,7 @@ F: Documentation/scsi/LICENSE.qla2xxx
|
||||||
F: drivers/scsi/qla2xxx/
|
F: drivers/scsi/qla2xxx/
|
||||||
|
|
||||||
QLOGIC QLA3XXX NETWORK DRIVER
|
QLOGIC QLA3XXX NETWORK DRIVER
|
||||||
M: Dept-GELinuxNICDev@cavium.com
|
M: GR-Linux-NIC-Dev@marvell.com
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: Documentation/networking/device_drivers/qlogic/LICENSE.qla3xxx
|
F: Documentation/networking/device_drivers/qlogic/LICENSE.qla3xxx
|
||||||
|
@ -12516,16 +12520,16 @@ F: Documentation/scsi/LICENSE.qla4xxx
|
||||||
F: drivers/scsi/qla4xxx/
|
F: drivers/scsi/qla4xxx/
|
||||||
|
|
||||||
QLOGIC QLCNIC (1/10)Gb ETHERNET DRIVER
|
QLOGIC QLCNIC (1/10)Gb ETHERNET DRIVER
|
||||||
M: Shahed Shaikh <Shahed.Shaikh@cavium.com>
|
M: Shahed Shaikh <shshaikh@marvell.com>
|
||||||
M: Manish Chopra <manish.chopra@cavium.com>
|
M: Manish Chopra <manishc@marvell.com>
|
||||||
M: Dept-GELinuxNICDev@cavium.com
|
M: GR-Linux-NIC-Dev@marvell.com
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/net/ethernet/qlogic/qlcnic/
|
F: drivers/net/ethernet/qlogic/qlcnic/
|
||||||
|
|
||||||
QLOGIC QLGE 10Gb ETHERNET DRIVER
|
QLOGIC QLGE 10Gb ETHERNET DRIVER
|
||||||
M: Manish Chopra <manish.chopra@cavium.com>
|
M: Manish Chopra <manishc@marvell.com>
|
||||||
M: Dept-GELinuxNICDev@cavium.com
|
M: GR-Linux-NIC-Dev@marvell.com
|
||||||
L: netdev@vger.kernel.org
|
L: netdev@vger.kernel.org
|
||||||
S: Supported
|
S: Supported
|
||||||
F: drivers/net/ethernet/qlogic/qlge/
|
F: drivers/net/ethernet/qlogic/qlge/
|
||||||
|
@ -13820,8 +13824,9 @@ F: drivers/media/mmc/siano/
|
||||||
|
|
||||||
SIFIVE DRIVERS
|
SIFIVE DRIVERS
|
||||||
M: Palmer Dabbelt <palmer@sifive.com>
|
M: Palmer Dabbelt <palmer@sifive.com>
|
||||||
|
M: Paul Walmsley <paul.walmsley@sifive.com>
|
||||||
L: linux-riscv@lists.infradead.org
|
L: linux-riscv@lists.infradead.org
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/palmer/riscv-linux.git
|
T: git git://github.com/sifive/riscv-linux.git
|
||||||
S: Supported
|
S: Supported
|
||||||
K: sifive
|
K: sifive
|
||||||
N: sifive
|
N: sifive
|
||||||
|
@ -14432,6 +14437,11 @@ M: Florian Schilhabel <florian.c.schilhabel@googlemail.com>.
|
||||||
S: Odd Fixes
|
S: Odd Fixes
|
||||||
F: drivers/staging/rtl8712/
|
F: drivers/staging/rtl8712/
|
||||||
|
|
||||||
|
STAGING - REALTEK RTL8188EU DRIVERS
|
||||||
|
M: Larry Finger <Larry.Finger@lwfinger.net>
|
||||||
|
S: Odd Fixes
|
||||||
|
F: drivers/staging/rtl8188eu/
|
||||||
|
|
||||||
STAGING - SILICON MOTION SM750 FRAME BUFFER DRIVER
|
STAGING - SILICON MOTION SM750 FRAME BUFFER DRIVER
|
||||||
M: Sudip Mukherjee <sudipm.mukherjee@gmail.com>
|
M: Sudip Mukherjee <sudipm.mukherjee@gmail.com>
|
||||||
M: Teddy Wang <teddy.wang@siliconmotion.com>
|
M: Teddy Wang <teddy.wang@siliconmotion.com>
|
||||||
|
@ -15802,7 +15812,6 @@ M: Alan Stern <stern@rowland.harvard.edu>
|
||||||
L: linux-usb@vger.kernel.org
|
L: linux-usb@vger.kernel.org
|
||||||
L: usb-storage@lists.one-eyed-alien.net
|
L: usb-storage@lists.one-eyed-alien.net
|
||||||
S: Maintained
|
S: Maintained
|
||||||
W: http://www.one-eyed-alien.net/~mdharm/linux-usb/
|
|
||||||
F: drivers/usb/storage/
|
F: drivers/usb/storage/
|
||||||
|
|
||||||
USB MIDI DRIVER
|
USB MIDI DRIVER
|
||||||
|
@ -15834,6 +15843,7 @@ F: drivers/usb/common/usb-otg-fsm.c
|
||||||
USB OVER IP DRIVER
|
USB OVER IP DRIVER
|
||||||
M: Valentina Manea <valentina.manea.m@gmail.com>
|
M: Valentina Manea <valentina.manea.m@gmail.com>
|
||||||
M: Shuah Khan <shuah@kernel.org>
|
M: Shuah Khan <shuah@kernel.org>
|
||||||
|
M: Shuah Khan <skhan@linuxfoundation.org>
|
||||||
L: linux-usb@vger.kernel.org
|
L: linux-usb@vger.kernel.org
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: Documentation/usb/usbip_protocol.txt
|
F: Documentation/usb/usbip_protocol.txt
|
||||||
|
|
10
Makefile
10
Makefile
|
@ -2,7 +2,7 @@
|
||||||
VERSION = 5
|
VERSION = 5
|
||||||
PATCHLEVEL = 0
|
PATCHLEVEL = 0
|
||||||
SUBLEVEL = 0
|
SUBLEVEL = 0
|
||||||
EXTRAVERSION = -rc1
|
EXTRAVERSION = -rc4
|
||||||
NAME = Shy Crocodile
|
NAME = Shy Crocodile
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
@ -955,6 +955,7 @@ ifdef CONFIG_STACK_VALIDATION
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
PHONY += prepare0
|
||||||
|
|
||||||
ifeq ($(KBUILD_EXTMOD),)
|
ifeq ($(KBUILD_EXTMOD),)
|
||||||
core-y += kernel/ certs/ mm/ fs/ ipc/ security/ crypto/ block/
|
core-y += kernel/ certs/ mm/ fs/ ipc/ security/ crypto/ block/
|
||||||
|
@ -1061,8 +1062,7 @@ scripts: scripts_basic scripts_dtc
|
||||||
# archprepare is used in arch Makefiles and when processed asm symlink,
|
# archprepare is used in arch Makefiles and when processed asm symlink,
|
||||||
# version.h and scripts_basic is processed / created.
|
# version.h and scripts_basic is processed / created.
|
||||||
|
|
||||||
# Listed in dependency order
|
PHONY += prepare archprepare prepare1 prepare2 prepare3
|
||||||
PHONY += prepare archprepare prepare0 prepare1 prepare2 prepare3
|
|
||||||
|
|
||||||
# prepare3 is used to check if we are building in a separate output directory,
|
# prepare3 is used to check if we are building in a separate output directory,
|
||||||
# and if so do:
|
# and if so do:
|
||||||
|
@ -1360,11 +1360,11 @@ mrproper: rm-dirs := $(wildcard $(MRPROPER_DIRS))
|
||||||
mrproper: rm-files := $(wildcard $(MRPROPER_FILES))
|
mrproper: rm-files := $(wildcard $(MRPROPER_FILES))
|
||||||
mrproper-dirs := $(addprefix _mrproper_,scripts)
|
mrproper-dirs := $(addprefix _mrproper_,scripts)
|
||||||
|
|
||||||
PHONY += $(mrproper-dirs) mrproper archmrproper
|
PHONY += $(mrproper-dirs) mrproper
|
||||||
$(mrproper-dirs):
|
$(mrproper-dirs):
|
||||||
$(Q)$(MAKE) $(clean)=$(patsubst _mrproper_%,%,$@)
|
$(Q)$(MAKE) $(clean)=$(patsubst _mrproper_%,%,$@)
|
||||||
|
|
||||||
mrproper: clean archmrproper $(mrproper-dirs)
|
mrproper: clean $(mrproper-dirs)
|
||||||
$(call cmd,rmdirs)
|
$(call cmd,rmdirs)
|
||||||
$(call cmd,rmfiles)
|
$(call cmd,rmfiles)
|
||||||
|
|
||||||
|
|
|
@ -3,23 +3,19 @@ generic-y += bugs.h
|
||||||
generic-y += compat.h
|
generic-y += compat.h
|
||||||
generic-y += device.h
|
generic-y += device.h
|
||||||
generic-y += div64.h
|
generic-y += div64.h
|
||||||
generic-y += dma-mapping.h
|
|
||||||
generic-y += emergency-restart.h
|
generic-y += emergency-restart.h
|
||||||
generic-y += extable.h
|
generic-y += extable.h
|
||||||
generic-y += fb.h
|
|
||||||
generic-y += ftrace.h
|
generic-y += ftrace.h
|
||||||
generic-y += hardirq.h
|
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 += kmap_types.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
|
||||||
generic-y += mm-arch-hooks.h
|
generic-y += mm-arch-hooks.h
|
||||||
generic-y += msi.h
|
generic-y += msi.h
|
||||||
generic-y += parport.h
|
generic-y += parport.h
|
||||||
generic-y += pci.h
|
|
||||||
generic-y += percpu.h
|
generic-y += percpu.h
|
||||||
generic-y += preempt.h
|
generic-y += preempt.h
|
||||||
generic-y += topology.h
|
generic-y += topology.h
|
||||||
|
|
|
@ -216,6 +216,14 @@ struct bcr_fp_arcv2 {
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct bcr_actionpoint {
|
||||||
|
#ifdef CONFIG_CPU_BIG_ENDIAN
|
||||||
|
unsigned int pad:21, min:1, num:2, ver:8;
|
||||||
|
#else
|
||||||
|
unsigned int ver:8, num:2, min:1, pad:21;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
#include <soc/arc/timers.h>
|
#include <soc/arc/timers.h>
|
||||||
|
|
||||||
struct bcr_bpu_arcompact {
|
struct bcr_bpu_arcompact {
|
||||||
|
@ -283,7 +291,7 @@ struct cpuinfo_arc_cache {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct cpuinfo_arc_bpu {
|
struct cpuinfo_arc_bpu {
|
||||||
unsigned int ver, full, num_cache, num_pred;
|
unsigned int ver, full, num_cache, num_pred, ret_stk;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct cpuinfo_arc_ccm {
|
struct cpuinfo_arc_ccm {
|
||||||
|
@ -302,7 +310,7 @@ struct cpuinfo_arc {
|
||||||
struct {
|
struct {
|
||||||
unsigned int swap:1, norm:1, minmax:1, barrel:1, crc:1, swape:1, pad1:2,
|
unsigned int swap:1, norm:1, minmax:1, barrel:1, crc:1, swape:1, pad1:2,
|
||||||
fpu_sp:1, fpu_dp:1, dual:1, dual_enb:1, pad2:4,
|
fpu_sp:1, fpu_dp:1, dual:1, dual_enb:1, pad2:4,
|
||||||
debug:1, ap:1, smart:1, rtt:1, pad3:4,
|
ap_num:4, ap_full:1, smart:1, rtt:1, pad3:1,
|
||||||
timer0:1, timer1:1, rtc:1, gfrc:1, pad4:4;
|
timer0:1, timer1:1, rtc:1, gfrc:1, pad4:4;
|
||||||
} extn;
|
} extn;
|
||||||
struct bcr_mpy extn_mpy;
|
struct bcr_mpy extn_mpy;
|
||||||
|
|
|
@ -340,7 +340,7 @@ static inline __attribute__ ((const)) int __fls(unsigned long x)
|
||||||
/*
|
/*
|
||||||
* __ffs: Similar to ffs, but zero based (0-31)
|
* __ffs: Similar to ffs, but zero based (0-31)
|
||||||
*/
|
*/
|
||||||
static inline __attribute__ ((const)) int __ffs(unsigned long word)
|
static inline __attribute__ ((const)) unsigned long __ffs(unsigned long word)
|
||||||
{
|
{
|
||||||
if (!word)
|
if (!word)
|
||||||
return word;
|
return word;
|
||||||
|
@ -400,9 +400,9 @@ static inline __attribute__ ((const)) int ffs(unsigned long x)
|
||||||
/*
|
/*
|
||||||
* __ffs: Similar to ffs, but zero based (0-31)
|
* __ffs: Similar to ffs, but zero based (0-31)
|
||||||
*/
|
*/
|
||||||
static inline __attribute__ ((const)) int __ffs(unsigned long x)
|
static inline __attribute__ ((const)) unsigned long __ffs(unsigned long x)
|
||||||
{
|
{
|
||||||
int n;
|
unsigned long n;
|
||||||
|
|
||||||
asm volatile(
|
asm volatile(
|
||||||
" ffs.f %0, %1 \n" /* 0:31; 31(Z) if src 0 */
|
" ffs.f %0, %1 \n" /* 0:31; 31(Z) if src 0 */
|
||||||
|
|
|
@ -103,7 +103,8 @@ static const char * const arc_pmu_ev_hw_map[] = {
|
||||||
|
|
||||||
/* counts condition */
|
/* counts condition */
|
||||||
[PERF_COUNT_HW_INSTRUCTIONS] = "iall",
|
[PERF_COUNT_HW_INSTRUCTIONS] = "iall",
|
||||||
[PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = "ijmp", /* Excludes ZOL jumps */
|
/* All jump instructions that are taken */
|
||||||
|
[PERF_COUNT_HW_BRANCH_INSTRUCTIONS] = "ijmptak",
|
||||||
[PERF_COUNT_ARC_BPOK] = "bpok", /* NP-NT, PT-T, PNT-NT */
|
[PERF_COUNT_ARC_BPOK] = "bpok", /* NP-NT, PT-T, PNT-NT */
|
||||||
#ifdef CONFIG_ISA_ARCV2
|
#ifdef CONFIG_ISA_ARCV2
|
||||||
[PERF_COUNT_HW_BRANCH_MISSES] = "bpmp",
|
[PERF_COUNT_HW_BRANCH_MISSES] = "bpmp",
|
||||||
|
|
|
@ -1,15 +1,10 @@
|
||||||
/*
|
// SPDX-License-Identifier: GPL-2.0+
|
||||||
* Linux performance counter support for ARC700 series
|
//
|
||||||
*
|
// Linux performance counter support for ARC CPUs.
|
||||||
* Copyright (C) 2013-2015 Synopsys, Inc. (www.synopsys.com)
|
// This code is inspired by the perf support of various other architectures.
|
||||||
*
|
//
|
||||||
* This code is inspired by the perf support of various other architectures.
|
// Copyright (C) 2013-2018 Synopsys, Inc. (www.synopsys.com)
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License version 2 as
|
|
||||||
* published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <linux/interrupt.h>
|
#include <linux/interrupt.h>
|
||||||
#include <linux/module.h>
|
#include <linux/module.h>
|
||||||
|
@ -19,12 +14,31 @@
|
||||||
#include <asm/arcregs.h>
|
#include <asm/arcregs.h>
|
||||||
#include <asm/stacktrace.h>
|
#include <asm/stacktrace.h>
|
||||||
|
|
||||||
|
/* HW holds 8 symbols + one for null terminator */
|
||||||
|
#define ARCPMU_EVENT_NAME_LEN 9
|
||||||
|
|
||||||
|
enum arc_pmu_attr_groups {
|
||||||
|
ARCPMU_ATTR_GR_EVENTS,
|
||||||
|
ARCPMU_ATTR_GR_FORMATS,
|
||||||
|
ARCPMU_NR_ATTR_GR
|
||||||
|
};
|
||||||
|
|
||||||
|
struct arc_pmu_raw_event_entry {
|
||||||
|
char name[ARCPMU_EVENT_NAME_LEN];
|
||||||
|
};
|
||||||
|
|
||||||
struct arc_pmu {
|
struct arc_pmu {
|
||||||
struct pmu pmu;
|
struct pmu pmu;
|
||||||
unsigned int irq;
|
unsigned int irq;
|
||||||
int n_counters;
|
int n_counters;
|
||||||
|
int n_events;
|
||||||
u64 max_period;
|
u64 max_period;
|
||||||
int ev_hw_idx[PERF_COUNT_ARC_HW_MAX];
|
int ev_hw_idx[PERF_COUNT_ARC_HW_MAX];
|
||||||
|
|
||||||
|
struct arc_pmu_raw_event_entry *raw_entry;
|
||||||
|
struct attribute **attrs;
|
||||||
|
struct perf_pmu_events_attr *attr;
|
||||||
|
const struct attribute_group *attr_groups[ARCPMU_NR_ATTR_GR + 1];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct arc_pmu_cpu {
|
struct arc_pmu_cpu {
|
||||||
|
@ -49,6 +63,7 @@ static int callchain_trace(unsigned int addr, void *data)
|
||||||
{
|
{
|
||||||
struct arc_callchain_trace *ctrl = data;
|
struct arc_callchain_trace *ctrl = data;
|
||||||
struct perf_callchain_entry_ctx *entry = ctrl->perf_stuff;
|
struct perf_callchain_entry_ctx *entry = ctrl->perf_stuff;
|
||||||
|
|
||||||
perf_callchain_store(entry, addr);
|
perf_callchain_store(entry, addr);
|
||||||
|
|
||||||
if (ctrl->depth++ < 3)
|
if (ctrl->depth++ < 3)
|
||||||
|
@ -57,8 +72,8 @@ static int callchain_trace(unsigned int addr, void *data)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void perf_callchain_kernel(struct perf_callchain_entry_ctx *entry,
|
||||||
perf_callchain_kernel(struct perf_callchain_entry_ctx *entry, struct pt_regs *regs)
|
struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
struct arc_callchain_trace ctrl = {
|
struct arc_callchain_trace ctrl = {
|
||||||
.depth = 0,
|
.depth = 0,
|
||||||
|
@ -68,8 +83,8 @@ perf_callchain_kernel(struct perf_callchain_entry_ctx *entry, struct pt_regs *re
|
||||||
arc_unwind_core(NULL, regs, callchain_trace, &ctrl);
|
arc_unwind_core(NULL, regs, callchain_trace, &ctrl);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void perf_callchain_user(struct perf_callchain_entry_ctx *entry,
|
||||||
perf_callchain_user(struct perf_callchain_entry_ctx *entry, struct pt_regs *regs)
|
struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* User stack can't be unwound trivially with kernel dwarf unwinder
|
* User stack can't be unwound trivially with kernel dwarf unwinder
|
||||||
|
@ -82,10 +97,10 @@ static struct arc_pmu *arc_pmu;
|
||||||
static DEFINE_PER_CPU(struct arc_pmu_cpu, arc_pmu_cpu);
|
static DEFINE_PER_CPU(struct arc_pmu_cpu, arc_pmu_cpu);
|
||||||
|
|
||||||
/* read counter #idx; note that counter# != event# on ARC! */
|
/* read counter #idx; note that counter# != event# on ARC! */
|
||||||
static uint64_t arc_pmu_read_counter(int idx)
|
static u64 arc_pmu_read_counter(int idx)
|
||||||
{
|
{
|
||||||
uint32_t tmp;
|
u32 tmp;
|
||||||
uint64_t result;
|
u64 result;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ARC supports making 'snapshots' of the counters, so we don't
|
* ARC supports making 'snapshots' of the counters, so we don't
|
||||||
|
@ -94,7 +109,7 @@ static uint64_t arc_pmu_read_counter(int idx)
|
||||||
write_aux_reg(ARC_REG_PCT_INDEX, idx);
|
write_aux_reg(ARC_REG_PCT_INDEX, idx);
|
||||||
tmp = read_aux_reg(ARC_REG_PCT_CONTROL);
|
tmp = read_aux_reg(ARC_REG_PCT_CONTROL);
|
||||||
write_aux_reg(ARC_REG_PCT_CONTROL, tmp | ARC_REG_PCT_CONTROL_SN);
|
write_aux_reg(ARC_REG_PCT_CONTROL, tmp | ARC_REG_PCT_CONTROL_SN);
|
||||||
result = (uint64_t) (read_aux_reg(ARC_REG_PCT_SNAPH)) << 32;
|
result = (u64) (read_aux_reg(ARC_REG_PCT_SNAPH)) << 32;
|
||||||
result |= read_aux_reg(ARC_REG_PCT_SNAPL);
|
result |= read_aux_reg(ARC_REG_PCT_SNAPL);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -103,9 +118,9 @@ static uint64_t arc_pmu_read_counter(int idx)
|
||||||
static void arc_perf_event_update(struct perf_event *event,
|
static void arc_perf_event_update(struct perf_event *event,
|
||||||
struct hw_perf_event *hwc, int idx)
|
struct hw_perf_event *hwc, int idx)
|
||||||
{
|
{
|
||||||
uint64_t prev_raw_count = local64_read(&hwc->prev_count);
|
u64 prev_raw_count = local64_read(&hwc->prev_count);
|
||||||
uint64_t new_raw_count = arc_pmu_read_counter(idx);
|
u64 new_raw_count = arc_pmu_read_counter(idx);
|
||||||
int64_t delta = new_raw_count - prev_raw_count;
|
s64 delta = new_raw_count - prev_raw_count;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We aren't afraid of hwc->prev_count changing beneath our feet
|
* We aren't afraid of hwc->prev_count changing beneath our feet
|
||||||
|
@ -155,7 +170,7 @@ static int arc_pmu_event_init(struct perf_event *event)
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!is_sampling_event(event)) {
|
if (!is_sampling_event(event)) {
|
||||||
hwc->sample_period = arc_pmu->max_period;
|
hwc->sample_period = arc_pmu->max_period;
|
||||||
hwc->last_period = hwc->sample_period;
|
hwc->last_period = hwc->sample_period;
|
||||||
local64_set(&hwc->period_left, hwc->sample_period);
|
local64_set(&hwc->period_left, hwc->sample_period);
|
||||||
}
|
}
|
||||||
|
@ -192,6 +207,18 @@ static int arc_pmu_event_init(struct perf_event *event)
|
||||||
pr_debug("init cache event with h/w %08x \'%s\'\n",
|
pr_debug("init cache event with h/w %08x \'%s\'\n",
|
||||||
(int)hwc->config, arc_pmu_ev_hw_map[ret]);
|
(int)hwc->config, arc_pmu_ev_hw_map[ret]);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
case PERF_TYPE_RAW:
|
||||||
|
if (event->attr.config >= arc_pmu->n_events)
|
||||||
|
return -ENOENT;
|
||||||
|
|
||||||
|
hwc->config |= event->attr.config;
|
||||||
|
pr_debug("init raw event with idx %lld \'%s\'\n",
|
||||||
|
event->attr.config,
|
||||||
|
arc_pmu->raw_entry[event->attr.config].name);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
|
@ -200,7 +227,7 @@ static int arc_pmu_event_init(struct perf_event *event)
|
||||||
/* starts all counters */
|
/* starts all counters */
|
||||||
static void arc_pmu_enable(struct pmu *pmu)
|
static void arc_pmu_enable(struct pmu *pmu)
|
||||||
{
|
{
|
||||||
uint32_t tmp;
|
u32 tmp;
|
||||||
tmp = read_aux_reg(ARC_REG_PCT_CONTROL);
|
tmp = read_aux_reg(ARC_REG_PCT_CONTROL);
|
||||||
write_aux_reg(ARC_REG_PCT_CONTROL, (tmp & 0xffff0000) | 0x1);
|
write_aux_reg(ARC_REG_PCT_CONTROL, (tmp & 0xffff0000) | 0x1);
|
||||||
}
|
}
|
||||||
|
@ -208,7 +235,7 @@ static void arc_pmu_enable(struct pmu *pmu)
|
||||||
/* stops all counters */
|
/* stops all counters */
|
||||||
static void arc_pmu_disable(struct pmu *pmu)
|
static void arc_pmu_disable(struct pmu *pmu)
|
||||||
{
|
{
|
||||||
uint32_t tmp;
|
u32 tmp;
|
||||||
tmp = read_aux_reg(ARC_REG_PCT_CONTROL);
|
tmp = read_aux_reg(ARC_REG_PCT_CONTROL);
|
||||||
write_aux_reg(ARC_REG_PCT_CONTROL, (tmp & 0xffff0000) | 0x0);
|
write_aux_reg(ARC_REG_PCT_CONTROL, (tmp & 0xffff0000) | 0x0);
|
||||||
}
|
}
|
||||||
|
@ -228,7 +255,7 @@ static int arc_pmu_event_set_period(struct perf_event *event)
|
||||||
local64_set(&hwc->period_left, left);
|
local64_set(&hwc->period_left, left);
|
||||||
hwc->last_period = period;
|
hwc->last_period = period;
|
||||||
overflow = 1;
|
overflow = 1;
|
||||||
} else if (unlikely(left <= 0)) {
|
} else if (unlikely(left <= 0)) {
|
||||||
/* left underflowed by less than period. */
|
/* left underflowed by less than period. */
|
||||||
left += period;
|
left += period;
|
||||||
local64_set(&hwc->period_left, left);
|
local64_set(&hwc->period_left, left);
|
||||||
|
@ -246,8 +273,8 @@ static int arc_pmu_event_set_period(struct perf_event *event)
|
||||||
write_aux_reg(ARC_REG_PCT_INDEX, idx);
|
write_aux_reg(ARC_REG_PCT_INDEX, idx);
|
||||||
|
|
||||||
/* Write value */
|
/* Write value */
|
||||||
write_aux_reg(ARC_REG_PCT_COUNTL, (u32)value);
|
write_aux_reg(ARC_REG_PCT_COUNTL, lower_32_bits(value));
|
||||||
write_aux_reg(ARC_REG_PCT_COUNTH, (value >> 32));
|
write_aux_reg(ARC_REG_PCT_COUNTH, upper_32_bits(value));
|
||||||
|
|
||||||
perf_event_update_userpage(event);
|
perf_event_update_userpage(event);
|
||||||
|
|
||||||
|
@ -277,7 +304,7 @@ static void arc_pmu_start(struct perf_event *event, int flags)
|
||||||
/* Enable interrupt for this counter */
|
/* Enable interrupt for this counter */
|
||||||
if (is_sampling_event(event))
|
if (is_sampling_event(event))
|
||||||
write_aux_reg(ARC_REG_PCT_INT_CTRL,
|
write_aux_reg(ARC_REG_PCT_INT_CTRL,
|
||||||
read_aux_reg(ARC_REG_PCT_INT_CTRL) | (1 << idx));
|
read_aux_reg(ARC_REG_PCT_INT_CTRL) | BIT(idx));
|
||||||
|
|
||||||
/* enable ARC pmu here */
|
/* enable ARC pmu here */
|
||||||
write_aux_reg(ARC_REG_PCT_INDEX, idx); /* counter # */
|
write_aux_reg(ARC_REG_PCT_INDEX, idx); /* counter # */
|
||||||
|
@ -295,9 +322,9 @@ static void arc_pmu_stop(struct perf_event *event, int flags)
|
||||||
* Reset interrupt flag by writing of 1. This is required
|
* Reset interrupt flag by writing of 1. This is required
|
||||||
* to make sure pending interrupt was not left.
|
* to make sure pending interrupt was not left.
|
||||||
*/
|
*/
|
||||||
write_aux_reg(ARC_REG_PCT_INT_ACT, 1 << idx);
|
write_aux_reg(ARC_REG_PCT_INT_ACT, BIT(idx));
|
||||||
write_aux_reg(ARC_REG_PCT_INT_CTRL,
|
write_aux_reg(ARC_REG_PCT_INT_CTRL,
|
||||||
read_aux_reg(ARC_REG_PCT_INT_CTRL) & ~(1 << idx));
|
read_aux_reg(ARC_REG_PCT_INT_CTRL) & ~BIT(idx));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(event->hw.state & PERF_HES_STOPPED)) {
|
if (!(event->hw.state & PERF_HES_STOPPED)) {
|
||||||
|
@ -349,9 +376,10 @@ static int arc_pmu_add(struct perf_event *event, int flags)
|
||||||
|
|
||||||
if (is_sampling_event(event)) {
|
if (is_sampling_event(event)) {
|
||||||
/* Mimic full counter overflow as other arches do */
|
/* Mimic full counter overflow as other arches do */
|
||||||
write_aux_reg(ARC_REG_PCT_INT_CNTL, (u32)arc_pmu->max_period);
|
write_aux_reg(ARC_REG_PCT_INT_CNTL,
|
||||||
|
lower_32_bits(arc_pmu->max_period));
|
||||||
write_aux_reg(ARC_REG_PCT_INT_CNTH,
|
write_aux_reg(ARC_REG_PCT_INT_CNTH,
|
||||||
(arc_pmu->max_period >> 32));
|
upper_32_bits(arc_pmu->max_period));
|
||||||
}
|
}
|
||||||
|
|
||||||
write_aux_reg(ARC_REG_PCT_CONFIG, 0);
|
write_aux_reg(ARC_REG_PCT_CONFIG, 0);
|
||||||
|
@ -392,7 +420,7 @@ static irqreturn_t arc_pmu_intr(int irq, void *dev)
|
||||||
idx = __ffs(active_ints);
|
idx = __ffs(active_ints);
|
||||||
|
|
||||||
/* Reset interrupt flag by writing of 1 */
|
/* Reset interrupt flag by writing of 1 */
|
||||||
write_aux_reg(ARC_REG_PCT_INT_ACT, 1 << idx);
|
write_aux_reg(ARC_REG_PCT_INT_ACT, BIT(idx));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* On reset of "interrupt active" bit corresponding
|
* On reset of "interrupt active" bit corresponding
|
||||||
|
@ -400,7 +428,7 @@ static irqreturn_t arc_pmu_intr(int irq, void *dev)
|
||||||
* Now we need to re-enable interrupt for the counter.
|
* Now we need to re-enable interrupt for the counter.
|
||||||
*/
|
*/
|
||||||
write_aux_reg(ARC_REG_PCT_INT_CTRL,
|
write_aux_reg(ARC_REG_PCT_INT_CTRL,
|
||||||
read_aux_reg(ARC_REG_PCT_INT_CTRL) | (1 << idx));
|
read_aux_reg(ARC_REG_PCT_INT_CTRL) | BIT(idx));
|
||||||
|
|
||||||
event = pmu_cpu->act_counter[idx];
|
event = pmu_cpu->act_counter[idx];
|
||||||
hwc = &event->hw;
|
hwc = &event->hw;
|
||||||
|
@ -414,7 +442,7 @@ static irqreturn_t arc_pmu_intr(int irq, void *dev)
|
||||||
arc_pmu_stop(event, 0);
|
arc_pmu_stop(event, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
active_ints &= ~(1U << idx);
|
active_ints &= ~BIT(idx);
|
||||||
} while (active_ints);
|
} while (active_ints);
|
||||||
|
|
||||||
done:
|
done:
|
||||||
|
@ -441,19 +469,108 @@ static void arc_cpu_pmu_irq_init(void *data)
|
||||||
write_aux_reg(ARC_REG_PCT_INT_ACT, 0xffffffff);
|
write_aux_reg(ARC_REG_PCT_INT_ACT, 0xffffffff);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Event field occupies the bottom 15 bits of our config field */
|
||||||
|
PMU_FORMAT_ATTR(event, "config:0-14");
|
||||||
|
static struct attribute *arc_pmu_format_attrs[] = {
|
||||||
|
&format_attr_event.attr,
|
||||||
|
NULL,
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct attribute_group arc_pmu_format_attr_gr = {
|
||||||
|
.name = "format",
|
||||||
|
.attrs = arc_pmu_format_attrs,
|
||||||
|
};
|
||||||
|
|
||||||
|
static ssize_t arc_pmu_events_sysfs_show(struct device *dev,
|
||||||
|
struct device_attribute *attr,
|
||||||
|
char *page)
|
||||||
|
{
|
||||||
|
struct perf_pmu_events_attr *pmu_attr;
|
||||||
|
|
||||||
|
pmu_attr = container_of(attr, struct perf_pmu_events_attr, attr);
|
||||||
|
return sprintf(page, "event=0x%04llx\n", pmu_attr->id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We don't add attrs here as we don't have pre-defined list of perf events.
|
||||||
|
* We will generate and add attrs dynamically in probe() after we read HW
|
||||||
|
* configuration.
|
||||||
|
*/
|
||||||
|
static struct attribute_group arc_pmu_events_attr_gr = {
|
||||||
|
.name = "events",
|
||||||
|
};
|
||||||
|
|
||||||
|
static void arc_pmu_add_raw_event_attr(int j, char *str)
|
||||||
|
{
|
||||||
|
memmove(arc_pmu->raw_entry[j].name, str, ARCPMU_EVENT_NAME_LEN - 1);
|
||||||
|
arc_pmu->attr[j].attr.attr.name = arc_pmu->raw_entry[j].name;
|
||||||
|
arc_pmu->attr[j].attr.attr.mode = VERIFY_OCTAL_PERMISSIONS(0444);
|
||||||
|
arc_pmu->attr[j].attr.show = arc_pmu_events_sysfs_show;
|
||||||
|
arc_pmu->attr[j].id = j;
|
||||||
|
arc_pmu->attrs[j] = &(arc_pmu->attr[j].attr.attr);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int arc_pmu_raw_alloc(struct device *dev)
|
||||||
|
{
|
||||||
|
arc_pmu->attr = devm_kmalloc_array(dev, arc_pmu->n_events + 1,
|
||||||
|
sizeof(*arc_pmu->attr), GFP_KERNEL | __GFP_ZERO);
|
||||||
|
if (!arc_pmu->attr)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
arc_pmu->attrs = devm_kmalloc_array(dev, arc_pmu->n_events + 1,
|
||||||
|
sizeof(*arc_pmu->attrs), GFP_KERNEL | __GFP_ZERO);
|
||||||
|
if (!arc_pmu->attrs)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
arc_pmu->raw_entry = devm_kmalloc_array(dev, arc_pmu->n_events,
|
||||||
|
sizeof(*arc_pmu->raw_entry), GFP_KERNEL | __GFP_ZERO);
|
||||||
|
if (!arc_pmu->raw_entry)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline bool event_in_hw_event_map(int i, char *name)
|
||||||
|
{
|
||||||
|
if (!arc_pmu_ev_hw_map[i])
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (!strlen(arc_pmu_ev_hw_map[i]))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (strcmp(arc_pmu_ev_hw_map[i], name))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void arc_pmu_map_hw_event(int j, char *str)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* See if HW condition has been mapped to a perf event_id */
|
||||||
|
for (i = 0; i < ARRAY_SIZE(arc_pmu_ev_hw_map); i++) {
|
||||||
|
if (event_in_hw_event_map(i, str)) {
|
||||||
|
pr_debug("mapping perf event %2d to h/w event \'%8s\' (idx %d)\n",
|
||||||
|
i, str, j);
|
||||||
|
arc_pmu->ev_hw_idx[i] = j;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static int arc_pmu_device_probe(struct platform_device *pdev)
|
static int arc_pmu_device_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct arc_reg_pct_build pct_bcr;
|
struct arc_reg_pct_build pct_bcr;
|
||||||
struct arc_reg_cc_build cc_bcr;
|
struct arc_reg_cc_build cc_bcr;
|
||||||
int i, j, has_interrupts;
|
int i, has_interrupts;
|
||||||
int counter_size; /* in bits */
|
int counter_size; /* in bits */
|
||||||
|
|
||||||
union cc_name {
|
union cc_name {
|
||||||
struct {
|
struct {
|
||||||
uint32_t word0, word1;
|
u32 word0, word1;
|
||||||
char sentinel;
|
char sentinel;
|
||||||
} indiv;
|
} indiv;
|
||||||
char str[9];
|
char str[ARCPMU_EVENT_NAME_LEN];
|
||||||
} cc_name;
|
} cc_name;
|
||||||
|
|
||||||
|
|
||||||
|
@ -463,15 +580,22 @@ static int arc_pmu_device_probe(struct platform_device *pdev)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
BUILD_BUG_ON(ARC_PERF_MAX_COUNTERS > 32);
|
BUILD_BUG_ON(ARC_PERF_MAX_COUNTERS > 32);
|
||||||
BUG_ON(pct_bcr.c > ARC_PERF_MAX_COUNTERS);
|
if (WARN_ON(pct_bcr.c > ARC_PERF_MAX_COUNTERS))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
READ_BCR(ARC_REG_CC_BUILD, cc_bcr);
|
READ_BCR(ARC_REG_CC_BUILD, cc_bcr);
|
||||||
BUG_ON(!cc_bcr.v); /* Counters exist but No countable conditions ? */
|
if (WARN(!cc_bcr.v, "Counters exist but No countable conditions?"))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
arc_pmu = devm_kzalloc(&pdev->dev, sizeof(struct arc_pmu), GFP_KERNEL);
|
arc_pmu = devm_kzalloc(&pdev->dev, sizeof(struct arc_pmu), GFP_KERNEL);
|
||||||
if (!arc_pmu)
|
if (!arc_pmu)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
|
arc_pmu->n_events = cc_bcr.c;
|
||||||
|
|
||||||
|
if (arc_pmu_raw_alloc(&pdev->dev))
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
has_interrupts = is_isa_arcv2() ? pct_bcr.i : 0;
|
has_interrupts = is_isa_arcv2() ? pct_bcr.i : 0;
|
||||||
|
|
||||||
arc_pmu->n_counters = pct_bcr.c;
|
arc_pmu->n_counters = pct_bcr.c;
|
||||||
|
@ -481,30 +605,26 @@ static int arc_pmu_device_probe(struct platform_device *pdev)
|
||||||
|
|
||||||
pr_info("ARC perf\t: %d counters (%d bits), %d conditions%s\n",
|
pr_info("ARC perf\t: %d counters (%d bits), %d conditions%s\n",
|
||||||
arc_pmu->n_counters, counter_size, cc_bcr.c,
|
arc_pmu->n_counters, counter_size, cc_bcr.c,
|
||||||
has_interrupts ? ", [overflow IRQ support]":"");
|
has_interrupts ? ", [overflow IRQ support]" : "");
|
||||||
|
|
||||||
cc_name.str[8] = 0;
|
cc_name.str[ARCPMU_EVENT_NAME_LEN - 1] = 0;
|
||||||
for (i = 0; i < PERF_COUNT_ARC_HW_MAX; i++)
|
for (i = 0; i < PERF_COUNT_ARC_HW_MAX; i++)
|
||||||
arc_pmu->ev_hw_idx[i] = -1;
|
arc_pmu->ev_hw_idx[i] = -1;
|
||||||
|
|
||||||
/* loop thru all available h/w condition indexes */
|
/* loop thru all available h/w condition indexes */
|
||||||
for (j = 0; j < cc_bcr.c; j++) {
|
for (i = 0; i < cc_bcr.c; i++) {
|
||||||
write_aux_reg(ARC_REG_CC_INDEX, j);
|
write_aux_reg(ARC_REG_CC_INDEX, i);
|
||||||
cc_name.indiv.word0 = read_aux_reg(ARC_REG_CC_NAME0);
|
cc_name.indiv.word0 = read_aux_reg(ARC_REG_CC_NAME0);
|
||||||
cc_name.indiv.word1 = read_aux_reg(ARC_REG_CC_NAME1);
|
cc_name.indiv.word1 = read_aux_reg(ARC_REG_CC_NAME1);
|
||||||
|
|
||||||
/* See if it has been mapped to a perf event_id */
|
arc_pmu_map_hw_event(i, cc_name.str);
|
||||||
for (i = 0; i < ARRAY_SIZE(arc_pmu_ev_hw_map); i++) {
|
arc_pmu_add_raw_event_attr(i, cc_name.str);
|
||||||
if (arc_pmu_ev_hw_map[i] &&
|
|
||||||
!strcmp(arc_pmu_ev_hw_map[i], cc_name.str) &&
|
|
||||||
strlen(arc_pmu_ev_hw_map[i])) {
|
|
||||||
pr_debug("mapping perf event %2d to h/w event \'%8s\' (idx %d)\n",
|
|
||||||
i, cc_name.str, j);
|
|
||||||
arc_pmu->ev_hw_idx[i] = j;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
arc_pmu_events_attr_gr.attrs = arc_pmu->attrs;
|
||||||
|
arc_pmu->attr_groups[ARCPMU_ATTR_GR_EVENTS] = &arc_pmu_events_attr_gr;
|
||||||
|
arc_pmu->attr_groups[ARCPMU_ATTR_GR_FORMATS] = &arc_pmu_format_attr_gr;
|
||||||
|
|
||||||
arc_pmu->pmu = (struct pmu) {
|
arc_pmu->pmu = (struct pmu) {
|
||||||
.pmu_enable = arc_pmu_enable,
|
.pmu_enable = arc_pmu_enable,
|
||||||
.pmu_disable = arc_pmu_disable,
|
.pmu_disable = arc_pmu_disable,
|
||||||
|
@ -514,6 +634,7 @@ static int arc_pmu_device_probe(struct platform_device *pdev)
|
||||||
.start = arc_pmu_start,
|
.start = arc_pmu_start,
|
||||||
.stop = arc_pmu_stop,
|
.stop = arc_pmu_stop,
|
||||||
.read = arc_pmu_read,
|
.read = arc_pmu_read,
|
||||||
|
.attr_groups = arc_pmu->attr_groups,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (has_interrupts) {
|
if (has_interrupts) {
|
||||||
|
@ -535,17 +656,19 @@ static int arc_pmu_device_probe(struct platform_device *pdev)
|
||||||
} else
|
} else
|
||||||
arc_pmu->pmu.capabilities |= PERF_PMU_CAP_NO_INTERRUPT;
|
arc_pmu->pmu.capabilities |= PERF_PMU_CAP_NO_INTERRUPT;
|
||||||
|
|
||||||
return perf_pmu_register(&arc_pmu->pmu, pdev->name, PERF_TYPE_RAW);
|
/*
|
||||||
|
* perf parser doesn't really like '-' symbol in events name, so let's
|
||||||
|
* use '_' in arc pct name as it goes to kernel PMU event prefix.
|
||||||
|
*/
|
||||||
|
return perf_pmu_register(&arc_pmu->pmu, "arc_pct", PERF_TYPE_RAW);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_OF
|
|
||||||
static const struct of_device_id arc_pmu_match[] = {
|
static const struct of_device_id arc_pmu_match[] = {
|
||||||
{ .compatible = "snps,arc700-pct" },
|
{ .compatible = "snps,arc700-pct" },
|
||||||
{ .compatible = "snps,archs-pct" },
|
{ .compatible = "snps,archs-pct" },
|
||||||
{},
|
{},
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(of, arc_pmu_match);
|
MODULE_DEVICE_TABLE(of, arc_pmu_match);
|
||||||
#endif
|
|
||||||
|
|
||||||
static struct platform_driver arc_pmu_driver = {
|
static struct platform_driver arc_pmu_driver = {
|
||||||
.driver = {
|
.driver = {
|
||||||
|
|
|
@ -123,6 +123,7 @@ static void read_arc_build_cfg_regs(void)
|
||||||
struct cpuinfo_arc *cpu = &cpuinfo_arc700[smp_processor_id()];
|
struct cpuinfo_arc *cpu = &cpuinfo_arc700[smp_processor_id()];
|
||||||
const struct id_to_str *tbl;
|
const struct id_to_str *tbl;
|
||||||
struct bcr_isa_arcv2 isa;
|
struct bcr_isa_arcv2 isa;
|
||||||
|
struct bcr_actionpoint ap;
|
||||||
|
|
||||||
FIX_PTR(cpu);
|
FIX_PTR(cpu);
|
||||||
|
|
||||||
|
@ -195,6 +196,7 @@ static void read_arc_build_cfg_regs(void)
|
||||||
cpu->bpu.full = bpu.ft;
|
cpu->bpu.full = bpu.ft;
|
||||||
cpu->bpu.num_cache = 256 << bpu.bce;
|
cpu->bpu.num_cache = 256 << bpu.bce;
|
||||||
cpu->bpu.num_pred = 2048 << bpu.pte;
|
cpu->bpu.num_pred = 2048 << bpu.pte;
|
||||||
|
cpu->bpu.ret_stk = 4 << bpu.rse;
|
||||||
|
|
||||||
if (cpu->core.family >= 0x54) {
|
if (cpu->core.family >= 0x54) {
|
||||||
unsigned int exec_ctrl;
|
unsigned int exec_ctrl;
|
||||||
|
@ -207,8 +209,11 @@ static void read_arc_build_cfg_regs(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
READ_BCR(ARC_REG_AP_BCR, bcr);
|
READ_BCR(ARC_REG_AP_BCR, ap);
|
||||||
cpu->extn.ap = bcr.ver ? 1 : 0;
|
if (ap.ver) {
|
||||||
|
cpu->extn.ap_num = 2 << ap.num;
|
||||||
|
cpu->extn.ap_full = !!ap.min;
|
||||||
|
}
|
||||||
|
|
||||||
READ_BCR(ARC_REG_SMART_BCR, bcr);
|
READ_BCR(ARC_REG_SMART_BCR, bcr);
|
||||||
cpu->extn.smart = bcr.ver ? 1 : 0;
|
cpu->extn.smart = bcr.ver ? 1 : 0;
|
||||||
|
@ -216,8 +221,6 @@ static void read_arc_build_cfg_regs(void)
|
||||||
READ_BCR(ARC_REG_RTT_BCR, bcr);
|
READ_BCR(ARC_REG_RTT_BCR, bcr);
|
||||||
cpu->extn.rtt = bcr.ver ? 1 : 0;
|
cpu->extn.rtt = bcr.ver ? 1 : 0;
|
||||||
|
|
||||||
cpu->extn.debug = cpu->extn.ap | cpu->extn.smart | cpu->extn.rtt;
|
|
||||||
|
|
||||||
READ_BCR(ARC_REG_ISA_CFG_BCR, isa);
|
READ_BCR(ARC_REG_ISA_CFG_BCR, isa);
|
||||||
|
|
||||||
/* some hacks for lack of feature BCR info in old ARC700 cores */
|
/* some hacks for lack of feature BCR info in old ARC700 cores */
|
||||||
|
@ -299,10 +302,10 @@ static char *arc_cpu_mumbojumbo(int cpu_id, char *buf, int len)
|
||||||
|
|
||||||
if (cpu->bpu.ver)
|
if (cpu->bpu.ver)
|
||||||
n += scnprintf(buf + n, len - n,
|
n += scnprintf(buf + n, len - n,
|
||||||
"BPU\t\t: %s%s match, cache:%d, Predict Table:%d",
|
"BPU\t\t: %s%s match, cache:%d, Predict Table:%d Return stk: %d",
|
||||||
IS_AVAIL1(cpu->bpu.full, "full"),
|
IS_AVAIL1(cpu->bpu.full, "full"),
|
||||||
IS_AVAIL1(!cpu->bpu.full, "partial"),
|
IS_AVAIL1(!cpu->bpu.full, "partial"),
|
||||||
cpu->bpu.num_cache, cpu->bpu.num_pred);
|
cpu->bpu.num_cache, cpu->bpu.num_pred, cpu->bpu.ret_stk);
|
||||||
|
|
||||||
if (is_isa_arcv2()) {
|
if (is_isa_arcv2()) {
|
||||||
struct bcr_lpb lpb;
|
struct bcr_lpb lpb;
|
||||||
|
@ -336,11 +339,17 @@ static char *arc_extn_mumbojumbo(int cpu_id, char *buf, int len)
|
||||||
IS_AVAIL1(cpu->extn.fpu_sp, "SP "),
|
IS_AVAIL1(cpu->extn.fpu_sp, "SP "),
|
||||||
IS_AVAIL1(cpu->extn.fpu_dp, "DP "));
|
IS_AVAIL1(cpu->extn.fpu_dp, "DP "));
|
||||||
|
|
||||||
if (cpu->extn.debug)
|
if (cpu->extn.ap_num | cpu->extn.smart | cpu->extn.rtt) {
|
||||||
n += scnprintf(buf + n, len - n, "DEBUG\t\t: %s%s%s\n",
|
n += scnprintf(buf + n, len - n, "DEBUG\t\t: %s%s",
|
||||||
IS_AVAIL1(cpu->extn.ap, "ActionPoint "),
|
|
||||||
IS_AVAIL1(cpu->extn.smart, "smaRT "),
|
IS_AVAIL1(cpu->extn.smart, "smaRT "),
|
||||||
IS_AVAIL1(cpu->extn.rtt, "RTT "));
|
IS_AVAIL1(cpu->extn.rtt, "RTT "));
|
||||||
|
if (cpu->extn.ap_num) {
|
||||||
|
n += scnprintf(buf + n, len - n, "ActionPoint %d/%s",
|
||||||
|
cpu->extn.ap_num,
|
||||||
|
cpu->extn.ap_full ? "full":"min");
|
||||||
|
}
|
||||||
|
n += scnprintf(buf + n, len - n, "\n");
|
||||||
|
}
|
||||||
|
|
||||||
if (cpu->dccm.sz || cpu->iccm.sz)
|
if (cpu->dccm.sz || cpu->iccm.sz)
|
||||||
n += scnprintf(buf + n, len - n, "Extn [CCM]\t: DCCM @ %x, %d KB / ICCM: @ %x, %d KB\n",
|
n += scnprintf(buf + n, len - n, "Extn [CCM]\t: DCCM @ %x, %d KB / ICCM: @ %x, %d KB\n",
|
||||||
|
|
|
@ -18,6 +18,8 @@
|
||||||
#include <asm/arcregs.h>
|
#include <asm/arcregs.h>
|
||||||
#include <asm/irqflags.h>
|
#include <asm/irqflags.h>
|
||||||
|
|
||||||
|
#define ARC_PATH_MAX 256
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Common routine to print scratch regs (r0-r12) or callee regs (r13-r25)
|
* Common routine to print scratch regs (r0-r12) or callee regs (r13-r25)
|
||||||
* -Prints 3 regs per line and a CR.
|
* -Prints 3 regs per line and a CR.
|
||||||
|
@ -58,11 +60,12 @@ static void show_callee_regs(struct callee_regs *cregs)
|
||||||
print_reg_file(&(cregs->r13), 13);
|
print_reg_file(&(cregs->r13), 13);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void print_task_path_n_nm(struct task_struct *tsk, char *buf)
|
static void print_task_path_n_nm(struct task_struct *tsk)
|
||||||
{
|
{
|
||||||
char *path_nm = NULL;
|
char *path_nm = NULL;
|
||||||
struct mm_struct *mm;
|
struct mm_struct *mm;
|
||||||
struct file *exe_file;
|
struct file *exe_file;
|
||||||
|
char buf[ARC_PATH_MAX];
|
||||||
|
|
||||||
mm = get_task_mm(tsk);
|
mm = get_task_mm(tsk);
|
||||||
if (!mm)
|
if (!mm)
|
||||||
|
@ -72,7 +75,7 @@ static void print_task_path_n_nm(struct task_struct *tsk, char *buf)
|
||||||
mmput(mm);
|
mmput(mm);
|
||||||
|
|
||||||
if (exe_file) {
|
if (exe_file) {
|
||||||
path_nm = file_path(exe_file, buf, 255);
|
path_nm = file_path(exe_file, buf, ARC_PATH_MAX-1);
|
||||||
fput(exe_file);
|
fput(exe_file);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -80,10 +83,9 @@ static void print_task_path_n_nm(struct task_struct *tsk, char *buf)
|
||||||
pr_info("Path: %s\n", !IS_ERR(path_nm) ? path_nm : "?");
|
pr_info("Path: %s\n", !IS_ERR(path_nm) ? path_nm : "?");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void show_faulting_vma(unsigned long address, char *buf)
|
static void show_faulting_vma(unsigned long address)
|
||||||
{
|
{
|
||||||
struct vm_area_struct *vma;
|
struct vm_area_struct *vma;
|
||||||
char *nm = buf;
|
|
||||||
struct mm_struct *active_mm = current->active_mm;
|
struct mm_struct *active_mm = current->active_mm;
|
||||||
|
|
||||||
/* can't use print_vma_addr() yet as it doesn't check for
|
/* can't use print_vma_addr() yet as it doesn't check for
|
||||||
|
@ -96,8 +98,11 @@ static void show_faulting_vma(unsigned long address, char *buf)
|
||||||
* if the container VMA is not found
|
* if the container VMA is not found
|
||||||
*/
|
*/
|
||||||
if (vma && (vma->vm_start <= address)) {
|
if (vma && (vma->vm_start <= address)) {
|
||||||
|
char buf[ARC_PATH_MAX];
|
||||||
|
char *nm = "?";
|
||||||
|
|
||||||
if (vma->vm_file) {
|
if (vma->vm_file) {
|
||||||
nm = file_path(vma->vm_file, buf, PAGE_SIZE - 1);
|
nm = file_path(vma->vm_file, buf, ARC_PATH_MAX-1);
|
||||||
if (IS_ERR(nm))
|
if (IS_ERR(nm))
|
||||||
nm = "?";
|
nm = "?";
|
||||||
}
|
}
|
||||||
|
@ -173,13 +178,14 @@ void show_regs(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
struct task_struct *tsk = current;
|
struct task_struct *tsk = current;
|
||||||
struct callee_regs *cregs;
|
struct callee_regs *cregs;
|
||||||
char *buf;
|
|
||||||
|
|
||||||
buf = (char *)__get_free_page(GFP_KERNEL);
|
/*
|
||||||
if (!buf)
|
* generic code calls us with preemption disabled, but some calls
|
||||||
return;
|
* here could sleep, so re-enable to avoid lockdep splat
|
||||||
|
*/
|
||||||
|
preempt_enable();
|
||||||
|
|
||||||
print_task_path_n_nm(tsk, buf);
|
print_task_path_n_nm(tsk);
|
||||||
show_regs_print_info(KERN_INFO);
|
show_regs_print_info(KERN_INFO);
|
||||||
|
|
||||||
show_ecr_verbose(regs);
|
show_ecr_verbose(regs);
|
||||||
|
@ -189,7 +195,7 @@ void show_regs(struct pt_regs *regs)
|
||||||
(void *)regs->blink, (void *)regs->ret);
|
(void *)regs->blink, (void *)regs->ret);
|
||||||
|
|
||||||
if (user_mode(regs))
|
if (user_mode(regs))
|
||||||
show_faulting_vma(regs->ret, buf); /* faulting code, not data */
|
show_faulting_vma(regs->ret); /* faulting code, not data */
|
||||||
|
|
||||||
pr_info("[STAT32]: 0x%08lx", regs->status32);
|
pr_info("[STAT32]: 0x%08lx", regs->status32);
|
||||||
|
|
||||||
|
@ -222,7 +228,7 @@ void show_regs(struct pt_regs *regs)
|
||||||
if (cregs)
|
if (cregs)
|
||||||
show_callee_regs(cregs);
|
show_callee_regs(cregs);
|
||||||
|
|
||||||
free_page((unsigned long)buf);
|
preempt_disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
void show_kernel_fault_diag(const char *str, struct pt_regs *regs,
|
void show_kernel_fault_diag(const char *str, struct pt_regs *regs,
|
||||||
|
|
|
@ -7,11 +7,39 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/linkage.h>
|
#include <linux/linkage.h>
|
||||||
|
#include <asm/cache.h>
|
||||||
|
|
||||||
#undef PREALLOC_NOT_AVAIL
|
/*
|
||||||
|
* The memset implementation below is optimized to use prefetchw and prealloc
|
||||||
|
* instruction in case of CPU with 64B L1 data cache line (L1_CACHE_SHIFT == 6)
|
||||||
|
* If you want to implement optimized memset for other possible L1 data cache
|
||||||
|
* line lengths (32B and 128B) you should rewrite code carefully checking
|
||||||
|
* we don't call any prefetchw/prealloc instruction for L1 cache lines which
|
||||||
|
* don't belongs to memset area.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if L1_CACHE_SHIFT == 6
|
||||||
|
|
||||||
|
.macro PREALLOC_INSTR reg, off
|
||||||
|
prealloc [\reg, \off]
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro PREFETCHW_INSTR reg, off
|
||||||
|
prefetchw [\reg, \off]
|
||||||
|
.endm
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
.macro PREALLOC_INSTR
|
||||||
|
.endm
|
||||||
|
|
||||||
|
.macro PREFETCHW_INSTR
|
||||||
|
.endm
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
ENTRY_CFI(memset)
|
ENTRY_CFI(memset)
|
||||||
prefetchw [r0] ; Prefetch the write location
|
PREFETCHW_INSTR r0, 0 ; Prefetch the first write location
|
||||||
mov.f 0, r2
|
mov.f 0, r2
|
||||||
;;; if size is zero
|
;;; if size is zero
|
||||||
jz.d [blink]
|
jz.d [blink]
|
||||||
|
@ -48,11 +76,8 @@ ENTRY_CFI(memset)
|
||||||
|
|
||||||
lpnz @.Lset64bytes
|
lpnz @.Lset64bytes
|
||||||
;; LOOP START
|
;; LOOP START
|
||||||
#ifdef PREALLOC_NOT_AVAIL
|
PREALLOC_INSTR r3, 64 ; alloc next line w/o fetching
|
||||||
prefetchw [r3, 64] ;Prefetch the next write location
|
|
||||||
#else
|
|
||||||
prealloc [r3, 64]
|
|
||||||
#endif
|
|
||||||
#ifdef CONFIG_ARC_HAS_LL64
|
#ifdef CONFIG_ARC_HAS_LL64
|
||||||
std.ab r4, [r3, 8]
|
std.ab r4, [r3, 8]
|
||||||
std.ab r4, [r3, 8]
|
std.ab r4, [r3, 8]
|
||||||
|
@ -85,7 +110,6 @@ ENTRY_CFI(memset)
|
||||||
lsr.f lp_count, r2, 5 ;Last remaining max 124 bytes
|
lsr.f lp_count, r2, 5 ;Last remaining max 124 bytes
|
||||||
lpnz .Lset32bytes
|
lpnz .Lset32bytes
|
||||||
;; LOOP START
|
;; LOOP START
|
||||||
prefetchw [r3, 32] ;Prefetch the next write location
|
|
||||||
#ifdef CONFIG_ARC_HAS_LL64
|
#ifdef CONFIG_ARC_HAS_LL64
|
||||||
std.ab r4, [r3, 8]
|
std.ab r4, [r3, 8]
|
||||||
std.ab r4, [r3, 8]
|
std.ab r4, [r3, 8]
|
||||||
|
|
|
@ -141,12 +141,17 @@ void do_page_fault(unsigned long address, struct pt_regs *regs)
|
||||||
*/
|
*/
|
||||||
fault = handle_mm_fault(vma, address, flags);
|
fault = handle_mm_fault(vma, address, flags);
|
||||||
|
|
||||||
/* If Pagefault was interrupted by SIGKILL, exit page fault "early" */
|
|
||||||
if (fatal_signal_pending(current)) {
|
if (fatal_signal_pending(current)) {
|
||||||
if ((fault & VM_FAULT_ERROR) && !(fault & VM_FAULT_RETRY))
|
|
||||||
up_read(&mm->mmap_sem);
|
/*
|
||||||
if (user_mode(regs))
|
* if fault retry, mmap_sem already relinquished by core mm
|
||||||
|
* so OK to return to user mode (with signal handled first)
|
||||||
|
*/
|
||||||
|
if (fault & VM_FAULT_RETRY) {
|
||||||
|
if (!user_mode(regs))
|
||||||
|
goto no_context;
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address);
|
perf_sw_event(PERF_COUNT_SW_PAGE_FAULTS, 1, regs, address);
|
||||||
|
|
|
@ -119,7 +119,8 @@ void __init setup_arch_memory(void)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
memblock_add_node(low_mem_start, low_mem_sz, 0);
|
memblock_add_node(low_mem_start, low_mem_sz, 0);
|
||||||
memblock_reserve(low_mem_start, __pa(_end) - low_mem_start);
|
memblock_reserve(CONFIG_LINUX_LINK_BASE,
|
||||||
|
__pa(_end) - CONFIG_LINUX_LINK_BASE);
|
||||||
|
|
||||||
#ifdef CONFIG_BLK_DEV_INITRD
|
#ifdef CONFIG_BLK_DEV_INITRD
|
||||||
if (phys_initrd_size) {
|
if (phys_initrd_size) {
|
||||||
|
|
|
@ -94,6 +94,28 @@ vbat: fixedregulator0 {
|
||||||
regulator-boot-on;
|
regulator-boot-on;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
baseboard_3v3: fixedregulator-3v3 {
|
||||||
|
/* TPS73701DCQ */
|
||||||
|
compatible = "regulator-fixed";
|
||||||
|
regulator-name = "baseboard_3v3";
|
||||||
|
regulator-min-microvolt = <3300000>;
|
||||||
|
regulator-max-microvolt = <3300000>;
|
||||||
|
vin-supply = <&vbat>;
|
||||||
|
regulator-always-on;
|
||||||
|
regulator-boot-on;
|
||||||
|
};
|
||||||
|
|
||||||
|
baseboard_1v8: fixedregulator-1v8 {
|
||||||
|
/* TPS73701DCQ */
|
||||||
|
compatible = "regulator-fixed";
|
||||||
|
regulator-name = "baseboard_1v8";
|
||||||
|
regulator-min-microvolt = <1800000>;
|
||||||
|
regulator-max-microvolt = <1800000>;
|
||||||
|
vin-supply = <&vbat>;
|
||||||
|
regulator-always-on;
|
||||||
|
regulator-boot-on;
|
||||||
|
};
|
||||||
|
|
||||||
backlight_lcd: backlight-regulator {
|
backlight_lcd: backlight-regulator {
|
||||||
compatible = "regulator-fixed";
|
compatible = "regulator-fixed";
|
||||||
regulator-name = "lcd_backlight_pwr";
|
regulator-name = "lcd_backlight_pwr";
|
||||||
|
@ -105,7 +127,7 @@ backlight_lcd: backlight-regulator {
|
||||||
|
|
||||||
sound {
|
sound {
|
||||||
compatible = "simple-audio-card";
|
compatible = "simple-audio-card";
|
||||||
simple-audio-card,name = "DA850/OMAP-L138 EVM";
|
simple-audio-card,name = "DA850-OMAPL138 EVM";
|
||||||
simple-audio-card,widgets =
|
simple-audio-card,widgets =
|
||||||
"Line", "Line In",
|
"Line", "Line In",
|
||||||
"Line", "Line Out";
|
"Line", "Line Out";
|
||||||
|
@ -210,10 +232,9 @@ tlv320aic3106: tlv320aic3106@18 {
|
||||||
|
|
||||||
/* Regulators */
|
/* Regulators */
|
||||||
IOVDD-supply = <&vdcdc2_reg>;
|
IOVDD-supply = <&vdcdc2_reg>;
|
||||||
/* Derived from VBAT: Baseboard 3.3V / 1.8V */
|
AVDD-supply = <&baseboard_3v3>;
|
||||||
AVDD-supply = <&vbat>;
|
DRVDD-supply = <&baseboard_3v3>;
|
||||||
DRVDD-supply = <&vbat>;
|
DVDD-supply = <&baseboard_1v8>;
|
||||||
DVDD-supply = <&vbat>;
|
|
||||||
};
|
};
|
||||||
tca6416: gpio@20 {
|
tca6416: gpio@20 {
|
||||||
compatible = "ti,tca6416";
|
compatible = "ti,tca6416";
|
||||||
|
|
|
@ -39,9 +39,39 @@ dsp_memory_region: dsp-memory@c3000000 {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
vcc_5vd: fixedregulator-vcc_5vd {
|
||||||
|
compatible = "regulator-fixed";
|
||||||
|
regulator-name = "vcc_5vd";
|
||||||
|
regulator-min-microvolt = <5000000>;
|
||||||
|
regulator-max-microvolt = <5000000>;
|
||||||
|
regulator-boot-on;
|
||||||
|
};
|
||||||
|
|
||||||
|
vcc_3v3d: fixedregulator-vcc_3v3d {
|
||||||
|
/* TPS650250 - VDCDC1 */
|
||||||
|
compatible = "regulator-fixed";
|
||||||
|
regulator-name = "vcc_3v3d";
|
||||||
|
regulator-min-microvolt = <3300000>;
|
||||||
|
regulator-max-microvolt = <3300000>;
|
||||||
|
vin-supply = <&vcc_5vd>;
|
||||||
|
regulator-always-on;
|
||||||
|
regulator-boot-on;
|
||||||
|
};
|
||||||
|
|
||||||
|
vcc_1v8d: fixedregulator-vcc_1v8d {
|
||||||
|
/* TPS650250 - VDCDC2 */
|
||||||
|
compatible = "regulator-fixed";
|
||||||
|
regulator-name = "vcc_1v8d";
|
||||||
|
regulator-min-microvolt = <1800000>;
|
||||||
|
regulator-max-microvolt = <1800000>;
|
||||||
|
vin-supply = <&vcc_5vd>;
|
||||||
|
regulator-always-on;
|
||||||
|
regulator-boot-on;
|
||||||
|
};
|
||||||
|
|
||||||
sound {
|
sound {
|
||||||
compatible = "simple-audio-card";
|
compatible = "simple-audio-card";
|
||||||
simple-audio-card,name = "DA850/OMAP-L138 LCDK";
|
simple-audio-card,name = "DA850-OMAPL138 LCDK";
|
||||||
simple-audio-card,widgets =
|
simple-audio-card,widgets =
|
||||||
"Line", "Line In",
|
"Line", "Line In",
|
||||||
"Line", "Line Out";
|
"Line", "Line Out";
|
||||||
|
@ -221,6 +251,12 @@ tlv320aic3106: tlv320aic3106@18 {
|
||||||
compatible = "ti,tlv320aic3106";
|
compatible = "ti,tlv320aic3106";
|
||||||
reg = <0x18>;
|
reg = <0x18>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
|
|
||||||
|
/* Regulators */
|
||||||
|
IOVDD-supply = <&vcc_3v3d>;
|
||||||
|
AVDD-supply = <&vcc_3v3d>;
|
||||||
|
DRVDD-supply = <&vcc_3v3d>;
|
||||||
|
DVDD-supply = <&vcc_1v8d>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -36,8 +36,8 @@ gpio_fan {
|
||||||
compatible = "gpio-fan";
|
compatible = "gpio-fan";
|
||||||
pinctrl-0 = <&pmx_fan_high_speed &pmx_fan_low_speed>;
|
pinctrl-0 = <&pmx_fan_high_speed &pmx_fan_low_speed>;
|
||||||
pinctrl-names = "default";
|
pinctrl-names = "default";
|
||||||
gpios = <&gpio1 14 GPIO_ACTIVE_LOW
|
gpios = <&gpio1 14 GPIO_ACTIVE_HIGH
|
||||||
&gpio1 13 GPIO_ACTIVE_LOW>;
|
&gpio1 13 GPIO_ACTIVE_HIGH>;
|
||||||
gpio-fan,speed-map = <0 0
|
gpio-fan,speed-map = <0 0
|
||||||
3000 1
|
3000 1
|
||||||
6000 2>;
|
6000 2>;
|
||||||
|
|
|
@ -1 +1,95 @@
|
||||||
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
|
#ifndef _ASM_ARM_XEN_PAGE_COHERENT_H
|
||||||
|
#define _ASM_ARM_XEN_PAGE_COHERENT_H
|
||||||
|
|
||||||
|
#include <linux/dma-mapping.h>
|
||||||
|
#include <asm/page.h>
|
||||||
#include <xen/arm/page-coherent.h>
|
#include <xen/arm/page-coherent.h>
|
||||||
|
|
||||||
|
static inline const struct dma_map_ops *xen_get_dma_ops(struct device *dev)
|
||||||
|
{
|
||||||
|
if (dev && dev->archdata.dev_dma_ops)
|
||||||
|
return dev->archdata.dev_dma_ops;
|
||||||
|
return get_arch_dma_ops(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void *xen_alloc_coherent_pages(struct device *hwdev, size_t size,
|
||||||
|
dma_addr_t *dma_handle, gfp_t flags, unsigned long attrs)
|
||||||
|
{
|
||||||
|
return xen_get_dma_ops(hwdev)->alloc(hwdev, size, dma_handle, flags, attrs);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void xen_free_coherent_pages(struct device *hwdev, size_t size,
|
||||||
|
void *cpu_addr, dma_addr_t dma_handle, unsigned long attrs)
|
||||||
|
{
|
||||||
|
xen_get_dma_ops(hwdev)->free(hwdev, size, cpu_addr, dma_handle, attrs);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void xen_dma_map_page(struct device *hwdev, struct page *page,
|
||||||
|
dma_addr_t dev_addr, unsigned long offset, size_t size,
|
||||||
|
enum dma_data_direction dir, unsigned long attrs)
|
||||||
|
{
|
||||||
|
unsigned long page_pfn = page_to_xen_pfn(page);
|
||||||
|
unsigned long dev_pfn = XEN_PFN_DOWN(dev_addr);
|
||||||
|
unsigned long compound_pages =
|
||||||
|
(1<<compound_order(page)) * XEN_PFN_PER_PAGE;
|
||||||
|
bool local = (page_pfn <= dev_pfn) &&
|
||||||
|
(dev_pfn - page_pfn < compound_pages);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Dom0 is mapped 1:1, while the Linux page can span across
|
||||||
|
* multiple Xen pages, it's not possible for it to contain a
|
||||||
|
* mix of local and foreign Xen pages. So if the first xen_pfn
|
||||||
|
* == mfn the page is local otherwise it's a foreign page
|
||||||
|
* grant-mapped in dom0. If the page is local we can safely
|
||||||
|
* call the native dma_ops function, otherwise we call the xen
|
||||||
|
* specific function.
|
||||||
|
*/
|
||||||
|
if (local)
|
||||||
|
xen_get_dma_ops(hwdev)->map_page(hwdev, page, offset, size, dir, attrs);
|
||||||
|
else
|
||||||
|
__xen_dma_map_page(hwdev, page, dev_addr, offset, size, dir, attrs);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void xen_dma_unmap_page(struct device *hwdev, dma_addr_t handle,
|
||||||
|
size_t size, enum dma_data_direction dir, unsigned long attrs)
|
||||||
|
{
|
||||||
|
unsigned long pfn = PFN_DOWN(handle);
|
||||||
|
/*
|
||||||
|
* Dom0 is mapped 1:1, while the Linux page can be spanned accross
|
||||||
|
* multiple Xen page, it's not possible to have a mix of local and
|
||||||
|
* foreign Xen page. Dom0 is mapped 1:1, so calling pfn_valid on a
|
||||||
|
* foreign mfn will always return false. If the page is local we can
|
||||||
|
* safely call the native dma_ops function, otherwise we call the xen
|
||||||
|
* specific function.
|
||||||
|
*/
|
||||||
|
if (pfn_valid(pfn)) {
|
||||||
|
if (xen_get_dma_ops(hwdev)->unmap_page)
|
||||||
|
xen_get_dma_ops(hwdev)->unmap_page(hwdev, handle, size, dir, attrs);
|
||||||
|
} else
|
||||||
|
__xen_dma_unmap_page(hwdev, handle, size, dir, attrs);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void xen_dma_sync_single_for_cpu(struct device *hwdev,
|
||||||
|
dma_addr_t handle, size_t size, enum dma_data_direction dir)
|
||||||
|
{
|
||||||
|
unsigned long pfn = PFN_DOWN(handle);
|
||||||
|
if (pfn_valid(pfn)) {
|
||||||
|
if (xen_get_dma_ops(hwdev)->sync_single_for_cpu)
|
||||||
|
xen_get_dma_ops(hwdev)->sync_single_for_cpu(hwdev, handle, size, dir);
|
||||||
|
} else
|
||||||
|
__xen_dma_sync_single_for_cpu(hwdev, handle, size, dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void xen_dma_sync_single_for_device(struct device *hwdev,
|
||||||
|
dma_addr_t handle, size_t size, enum dma_data_direction dir)
|
||||||
|
{
|
||||||
|
unsigned long pfn = PFN_DOWN(handle);
|
||||||
|
if (pfn_valid(pfn)) {
|
||||||
|
if (xen_get_dma_ops(hwdev)->sync_single_for_device)
|
||||||
|
xen_get_dma_ops(hwdev)->sync_single_for_device(hwdev, handle, size, dir);
|
||||||
|
} else
|
||||||
|
__xen_dma_sync_single_for_device(hwdev, handle, size, dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* _ASM_ARM_XEN_PAGE_COHERENT_H */
|
||||||
|
|
|
@ -208,9 +208,9 @@ static struct gpiod_lookup_table mmc_gpios_table = {
|
||||||
.dev_id = "da830-mmc.0",
|
.dev_id = "da830-mmc.0",
|
||||||
.table = {
|
.table = {
|
||||||
/* gpio chip 1 contains gpio range 32-63 */
|
/* gpio chip 1 contains gpio range 32-63 */
|
||||||
GPIO_LOOKUP("davinci_gpio.0", DA830_MMCSD_CD_PIN, "cd",
|
GPIO_LOOKUP("davinci_gpio", DA830_MMCSD_CD_PIN, "cd",
|
||||||
GPIO_ACTIVE_LOW),
|
GPIO_ACTIVE_LOW),
|
||||||
GPIO_LOOKUP("davinci_gpio.0", DA830_MMCSD_WP_PIN, "wp",
|
GPIO_LOOKUP("davinci_gpio", DA830_MMCSD_WP_PIN, "wp",
|
||||||
GPIO_ACTIVE_LOW),
|
GPIO_ACTIVE_LOW),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -805,9 +805,9 @@ static struct gpiod_lookup_table mmc_gpios_table = {
|
||||||
.dev_id = "da830-mmc.0",
|
.dev_id = "da830-mmc.0",
|
||||||
.table = {
|
.table = {
|
||||||
/* gpio chip 2 contains gpio range 64-95 */
|
/* gpio chip 2 contains gpio range 64-95 */
|
||||||
GPIO_LOOKUP("davinci_gpio.0", DA850_MMCSD_CD_PIN, "cd",
|
GPIO_LOOKUP("davinci_gpio", DA850_MMCSD_CD_PIN, "cd",
|
||||||
GPIO_ACTIVE_LOW),
|
GPIO_ACTIVE_LOW),
|
||||||
GPIO_LOOKUP("davinci_gpio.0", DA850_MMCSD_WP_PIN, "wp",
|
GPIO_LOOKUP("davinci_gpio", DA850_MMCSD_WP_PIN, "wp",
|
||||||
GPIO_ACTIVE_HIGH),
|
GPIO_ACTIVE_HIGH),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -117,9 +117,9 @@ static struct platform_device davinci_nand_device = {
|
||||||
static struct gpiod_lookup_table i2c_recovery_gpiod_table = {
|
static struct gpiod_lookup_table i2c_recovery_gpiod_table = {
|
||||||
.dev_id = "i2c_davinci.1",
|
.dev_id = "i2c_davinci.1",
|
||||||
.table = {
|
.table = {
|
||||||
GPIO_LOOKUP("davinci_gpio.0", DM355_I2C_SDA_PIN, "sda",
|
GPIO_LOOKUP("davinci_gpio", DM355_I2C_SDA_PIN, "sda",
|
||||||
GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN),
|
GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN),
|
||||||
GPIO_LOOKUP("davinci_gpio.0", DM355_I2C_SCL_PIN, "scl",
|
GPIO_LOOKUP("davinci_gpio", DM355_I2C_SCL_PIN, "scl",
|
||||||
GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN),
|
GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -660,9 +660,9 @@ static struct i2c_board_info __initdata i2c_info[] = {
|
||||||
static struct gpiod_lookup_table i2c_recovery_gpiod_table = {
|
static struct gpiod_lookup_table i2c_recovery_gpiod_table = {
|
||||||
.dev_id = "i2c_davinci.1",
|
.dev_id = "i2c_davinci.1",
|
||||||
.table = {
|
.table = {
|
||||||
GPIO_LOOKUP("davinci_gpio.0", DM644X_I2C_SDA_PIN, "sda",
|
GPIO_LOOKUP("davinci_gpio", DM644X_I2C_SDA_PIN, "sda",
|
||||||
GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN),
|
GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN),
|
||||||
GPIO_LOOKUP("davinci_gpio.0", DM644X_I2C_SCL_PIN, "scl",
|
GPIO_LOOKUP("davinci_gpio", DM644X_I2C_SCL_PIN, "scl",
|
||||||
GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN),
|
GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -134,9 +134,9 @@ static const short hawk_mmcsd0_pins[] = {
|
||||||
static struct gpiod_lookup_table mmc_gpios_table = {
|
static struct gpiod_lookup_table mmc_gpios_table = {
|
||||||
.dev_id = "da830-mmc.0",
|
.dev_id = "da830-mmc.0",
|
||||||
.table = {
|
.table = {
|
||||||
GPIO_LOOKUP("davinci_gpio.0", DA850_HAWK_MMCSD_CD_PIN, "cd",
|
GPIO_LOOKUP("davinci_gpio", DA850_HAWK_MMCSD_CD_PIN, "cd",
|
||||||
GPIO_ACTIVE_LOW),
|
GPIO_ACTIVE_LOW),
|
||||||
GPIO_LOOKUP("davinci_gpio.0", DA850_HAWK_MMCSD_WP_PIN, "wp",
|
GPIO_LOOKUP("davinci_gpio", DA850_HAWK_MMCSD_WP_PIN, "wp",
|
||||||
GPIO_ACTIVE_LOW),
|
GPIO_ACTIVE_LOW),
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -390,10 +390,14 @@ static int __ref impd1_probe(struct lm_device *dev)
|
||||||
char *mmciname;
|
char *mmciname;
|
||||||
|
|
||||||
lookup = devm_kzalloc(&dev->dev,
|
lookup = devm_kzalloc(&dev->dev,
|
||||||
sizeof(*lookup) + 3 * sizeof(struct gpiod_lookup),
|
struct_size(lookup, table, 3),
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
chipname = devm_kstrdup(&dev->dev, devname, GFP_KERNEL);
|
chipname = devm_kstrdup(&dev->dev, devname, GFP_KERNEL);
|
||||||
mmciname = kasprintf(GFP_KERNEL, "lm%x:00700", dev->id);
|
mmciname = devm_kasprintf(&dev->dev, GFP_KERNEL,
|
||||||
|
"lm%x:00700", dev->id);
|
||||||
|
if (!lookup || !chipname || !mmciname)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
lookup->dev_id = mmciname;
|
lookup->dev_id = mmciname;
|
||||||
/*
|
/*
|
||||||
* Offsets on GPIO block 1:
|
* Offsets on GPIO block 1:
|
||||||
|
|
|
@ -32,6 +32,8 @@ void __iomem *rst_manager_base_addr;
|
||||||
void __iomem *sdr_ctl_base_addr;
|
void __iomem *sdr_ctl_base_addr;
|
||||||
unsigned long socfpga_cpu1start_addr;
|
unsigned long socfpga_cpu1start_addr;
|
||||||
|
|
||||||
|
extern void __init socfpga_reset_init(void);
|
||||||
|
|
||||||
static void __init socfpga_sysmgr_init(void)
|
static void __init socfpga_sysmgr_init(void)
|
||||||
{
|
{
|
||||||
struct device_node *np;
|
struct device_node *np;
|
||||||
|
@ -64,6 +66,7 @@ static void __init socfpga_init_irq(void)
|
||||||
|
|
||||||
if (IS_ENABLED(CONFIG_EDAC_ALTERA_OCRAM))
|
if (IS_ENABLED(CONFIG_EDAC_ALTERA_OCRAM))
|
||||||
socfpga_init_ocram_ecc();
|
socfpga_init_ocram_ecc();
|
||||||
|
socfpga_reset_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __init socfpga_arria10_init_irq(void)
|
static void __init socfpga_arria10_init_irq(void)
|
||||||
|
@ -74,6 +77,7 @@ static void __init socfpga_arria10_init_irq(void)
|
||||||
socfpga_init_arria10_l2_ecc();
|
socfpga_init_arria10_l2_ecc();
|
||||||
if (IS_ENABLED(CONFIG_EDAC_ALTERA_OCRAM))
|
if (IS_ENABLED(CONFIG_EDAC_ALTERA_OCRAM))
|
||||||
socfpga_init_arria10_ocram_ecc();
|
socfpga_init_arria10_ocram_ecc();
|
||||||
|
socfpga_reset_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void socfpga_cyclone5_restart(enum reboot_mode mode, const char *cmd)
|
static void socfpga_cyclone5_restart(enum reboot_mode mode, const char *cmd)
|
||||||
|
|
|
@ -183,7 +183,7 @@ &cp0_pcie0 {
|
||||||
pinctrl-0 = <&cp0_pcie_pins>;
|
pinctrl-0 = <&cp0_pcie_pins>;
|
||||||
num-lanes = <4>;
|
num-lanes = <4>;
|
||||||
num-viewport = <8>;
|
num-viewport = <8>;
|
||||||
reset-gpio = <&cp0_gpio1 20 GPIO_ACTIVE_LOW>;
|
reset-gpios = <&cp0_gpio2 20 GPIO_ACTIVE_LOW>;
|
||||||
status = "okay";
|
status = "okay";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,23 @@ psci {
|
||||||
method = "smc";
|
method = "smc";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
reserved-memory {
|
||||||
|
#address-cells = <2>;
|
||||||
|
#size-cells = <2>;
|
||||||
|
ranges;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This area matches the mapping done with a
|
||||||
|
* mainline U-Boot, and should be updated by the
|
||||||
|
* bootloader.
|
||||||
|
*/
|
||||||
|
|
||||||
|
psci-area@4000000 {
|
||||||
|
reg = <0x0 0x4000000 0x0 0x200000>;
|
||||||
|
no-map;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
ap806 {
|
ap806 {
|
||||||
#address-cells = <2>;
|
#address-cells = <2>;
|
||||||
#size-cells = <2>;
|
#size-cells = <2>;
|
||||||
|
|
|
@ -506,11 +506,15 @@ CONFIG_SND_SOC_ROCKCHIP=m
|
||||||
CONFIG_SND_SOC_ROCKCHIP_SPDIF=m
|
CONFIG_SND_SOC_ROCKCHIP_SPDIF=m
|
||||||
CONFIG_SND_SOC_ROCKCHIP_RT5645=m
|
CONFIG_SND_SOC_ROCKCHIP_RT5645=m
|
||||||
CONFIG_SND_SOC_RK3399_GRU_SOUND=m
|
CONFIG_SND_SOC_RK3399_GRU_SOUND=m
|
||||||
|
CONFIG_SND_MESON_AXG_SOUND_CARD=m
|
||||||
CONFIG_SND_SOC_SAMSUNG=y
|
CONFIG_SND_SOC_SAMSUNG=y
|
||||||
CONFIG_SND_SOC_RCAR=m
|
CONFIG_SND_SOC_RCAR=m
|
||||||
CONFIG_SND_SOC_AK4613=m
|
CONFIG_SND_SOC_AK4613=m
|
||||||
CONFIG_SND_SIMPLE_CARD=m
|
CONFIG_SND_SIMPLE_CARD=m
|
||||||
CONFIG_SND_AUDIO_GRAPH_CARD=m
|
CONFIG_SND_AUDIO_GRAPH_CARD=m
|
||||||
|
CONFIG_SND_SOC_ES7134=m
|
||||||
|
CONFIG_SND_SOC_ES7241=m
|
||||||
|
CONFIG_SND_SOC_TAS571X=m
|
||||||
CONFIG_I2C_HID=m
|
CONFIG_I2C_HID=m
|
||||||
CONFIG_USB=y
|
CONFIG_USB=y
|
||||||
CONFIG_USB_OTG=y
|
CONFIG_USB_OTG=y
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#ifndef __ASM_PROTOTYPES_H
|
#ifndef __ASM_PROTOTYPES_H
|
||||||
#define __ASM_PROTOTYPES_H
|
#define __ASM_PROTOTYPES_H
|
||||||
/*
|
/*
|
||||||
* CONFIG_MODEVERIONS requires a C declaration to generate the appropriate CRC
|
* CONFIG_MODVERSIONS requires a C declaration to generate the appropriate CRC
|
||||||
* for each symbol. Since commit:
|
* for each symbol. Since commit:
|
||||||
*
|
*
|
||||||
* 4efca4ed05cbdfd1 ("kbuild: modversions for EXPORT_SYMBOL() for asm")
|
* 4efca4ed05cbdfd1 ("kbuild: modversions for EXPORT_SYMBOL() for asm")
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue