Linux 6.15-rc5

-----BEGIN PGP SIGNATURE-----
 
 iQFSBAABCgA8FiEEq68RxlopcLEwq+PEeb4+QwBBGIYFAmgX1CgeHHRvcnZhbGRz
 QGxpbnV4LWZvdW5kYXRpb24ub3JnAAoJEHm+PkMAQRiGxiIH/A7LHlVatGEQgRFi
 0JALDgcuGTMtMU1qD43rv8Z1GXqTpCAlaBt9D1C9cUH/86MGyBTVRWgVy0wkaU2U
 8QSfFWQIbrdaIzelHtzmAv5IDtb+KrcX1iYGLcMb6ZYaWkv8/CMzMX1nkgxEr1QT
 37Xo3/F17yJumAdNQxdRhVLGy2d3X5rScecpufwh97sMwoddllMCDs2LIoeSAYpG
 376/wzni09G2fADa8MEKqcaMue4qcf0FOo/gOkT8YwFGSZLKa6uumlBLg04QoCt0
 foK2vfcci1q4H4ZbCu3uQESYGLQHY0f2ICDCwC3m25VF9a81TmlbC3MLum3vhmKe
 RtLDcXg=
 =xyaI
 -----END PGP SIGNATURE-----

BackMerge tag 'v6.15-rc5' into drm-next

Linux 6.15-rc5, requested by tzimmerman for fixes required in drm-next.

Signed-off-by: Dave Airlie <airlied@redhat.com>
This commit is contained in:
Dave Airlie 2025-05-06 16:39:25 +10:00
commit 5e0c679981
957 changed files with 12341 additions and 6251 deletions

View file

@ -92,6 +92,7 @@ ForEachMacros:
- '__rq_for_each_bio' - '__rq_for_each_bio'
- '__shost_for_each_device' - '__shost_for_each_device'
- '__sym_for_each' - '__sym_for_each'
- '_for_each_counter'
- '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'
@ -141,11 +142,14 @@ ForEachMacros:
- 'damon_for_each_target_safe' - 'damon_for_each_target_safe'
- 'damos_for_each_filter' - 'damos_for_each_filter'
- 'damos_for_each_filter_safe' - 'damos_for_each_filter_safe'
- 'damos_for_each_ops_filter'
- 'damos_for_each_ops_filter_safe'
- 'damos_for_each_quota_goal' - 'damos_for_each_quota_goal'
- 'damos_for_each_quota_goal_safe' - 'damos_for_each_quota_goal_safe'
- 'data__for_each_file' - 'data__for_each_file'
- 'data__for_each_file_new' - 'data__for_each_file_new'
- 'data__for_each_file_start' - 'data__for_each_file_start'
- 'def_for_each_cpu'
- 'device_for_each_child_node' - 'device_for_each_child_node'
- 'device_for_each_child_node_scoped' - 'device_for_each_child_node_scoped'
- 'dma_fence_array_for_each' - 'dma_fence_array_for_each'
@ -176,6 +180,7 @@ ForEachMacros:
- 'drm_for_each_privobj' - 'drm_for_each_privobj'
- 'drm_gem_for_each_gpuvm_bo' - 'drm_gem_for_each_gpuvm_bo'
- 'drm_gem_for_each_gpuvm_bo_safe' - 'drm_gem_for_each_gpuvm_bo_safe'
- 'drm_gpusvm_for_each_range'
- 'drm_gpuva_for_each_op' - 'drm_gpuva_for_each_op'
- 'drm_gpuva_for_each_op_from_reverse' - 'drm_gpuva_for_each_op_from_reverse'
- 'drm_gpuva_for_each_op_reverse' - 'drm_gpuva_for_each_op_reverse'
@ -216,8 +221,10 @@ ForEachMacros:
- 'for_each_active_dev_scope' - 'for_each_active_dev_scope'
- 'for_each_active_drhd_unit' - 'for_each_active_drhd_unit'
- 'for_each_active_iommu' - 'for_each_active_iommu'
- 'for_each_active_irq'
- 'for_each_active_route' - 'for_each_active_route'
- 'for_each_aggr_pgid' - 'for_each_aggr_pgid'
- 'for_each_alloc_capable_rdt_resource'
- 'for_each_and_bit' - 'for_each_and_bit'
- 'for_each_andnot_bit' - 'for_each_andnot_bit'
- 'for_each_available_child_of_node' - 'for_each_available_child_of_node'
@ -228,6 +235,7 @@ ForEachMacros:
- 'for_each_btf_ext_rec' - 'for_each_btf_ext_rec'
- 'for_each_btf_ext_sec' - 'for_each_btf_ext_sec'
- 'for_each_bvec' - 'for_each_bvec'
- 'for_each_capable_rdt_resource'
- 'for_each_card_auxs' - 'for_each_card_auxs'
- 'for_each_card_auxs_safe' - 'for_each_card_auxs_safe'
- 'for_each_card_components' - 'for_each_card_components'
@ -241,6 +249,7 @@ ForEachMacros:
- 'for_each_cgroup_storage_type' - 'for_each_cgroup_storage_type'
- 'for_each_child_of_node' - 'for_each_child_of_node'
- 'for_each_child_of_node_scoped' - 'for_each_child_of_node_scoped'
- 'for_each_child_of_node_with_prefix'
- 'for_each_clear_bit' - 'for_each_clear_bit'
- 'for_each_clear_bit_from' - 'for_each_clear_bit_from'
- 'for_each_clear_bitrange' - 'for_each_clear_bitrange'
@ -296,6 +305,7 @@ ForEachMacros:
- 'for_each_group_member_head' - 'for_each_group_member_head'
- 'for_each_hstate' - 'for_each_hstate'
- 'for_each_hwgpio' - 'for_each_hwgpio'
- 'for_each_hwgpio_in_range'
- 'for_each_if' - 'for_each_if'
- 'for_each_inject_fn' - 'for_each_inject_fn'
- 'for_each_insn' - 'for_each_insn'
@ -304,6 +314,7 @@ ForEachMacros:
- 'for_each_intid' - 'for_each_intid'
- 'for_each_iommu' - 'for_each_iommu'
- 'for_each_ip_tunnel_rcu' - 'for_each_ip_tunnel_rcu'
- 'for_each_irq_desc'
- 'for_each_irq_nr' - 'for_each_irq_nr'
- 'for_each_lang' - 'for_each_lang'
- 'for_each_link_ch_maps' - 'for_each_link_ch_maps'
@ -324,6 +335,8 @@ ForEachMacros:
- 'for_each_missing_reg' - 'for_each_missing_reg'
- 'for_each_mle_subelement' - 'for_each_mle_subelement'
- 'for_each_mod_mem_type' - 'for_each_mod_mem_type'
- 'for_each_mon_capable_rdt_resource'
- 'for_each_mp_bvec'
- 'for_each_net' - 'for_each_net'
- 'for_each_net_continue_reverse' - 'for_each_net_continue_reverse'
- 'for_each_net_rcu' - 'for_each_net_rcu'
@ -351,6 +364,7 @@ ForEachMacros:
- 'for_each_node_by_name' - 'for_each_node_by_name'
- 'for_each_node_by_type' - 'for_each_node_by_type'
- 'for_each_node_mask' - 'for_each_node_mask'
- 'for_each_node_numadist'
- 'for_each_node_state' - 'for_each_node_state'
- 'for_each_node_with_cpus' - 'for_each_node_with_cpus'
- 'for_each_node_with_property' - 'for_each_node_with_property'
@ -359,6 +373,8 @@ ForEachMacros:
- '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_cpu_node'
- 'for_each_of_graph_port'
- 'for_each_of_graph_port_endpoint'
- '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'
@ -372,9 +388,11 @@ ForEachMacros:
- 'for_each_oldnew_plane_in_state_reverse' - 'for_each_oldnew_plane_in_state_reverse'
- 'for_each_oldnew_private_obj_in_state' - 'for_each_oldnew_private_obj_in_state'
- 'for_each_online_cpu' - 'for_each_online_cpu'
- 'for_each_online_cpu_wrap'
- 'for_each_online_node' - 'for_each_online_node'
- 'for_each_online_pgdat' - 'for_each_online_pgdat'
- 'for_each_or_bit' - 'for_each_or_bit'
- 'for_each_page_ext'
- 'for_each_path' - 'for_each_path'
- 'for_each_pci_bridge' - 'for_each_pci_bridge'
- 'for_each_pci_dev' - 'for_each_pci_dev'
@ -382,8 +400,10 @@ ForEachMacros:
- 'for_each_physmem_range' - 'for_each_physmem_range'
- 'for_each_populated_zone' - 'for_each_populated_zone'
- 'for_each_possible_cpu' - 'for_each_possible_cpu'
- 'for_each_possible_cpu_wrap'
- 'for_each_present_blessed_reg' - 'for_each_present_blessed_reg'
- 'for_each_present_cpu' - 'for_each_present_cpu'
- 'for_each_present_section_nr'
- 'for_each_prime_number' - 'for_each_prime_number'
- 'for_each_prime_number_from' - 'for_each_prime_number_from'
- 'for_each_probe_cache_entry' - 'for_each_probe_cache_entry'
@ -396,6 +416,7 @@ ForEachMacros:
- 'for_each_prop_dlc_cpus' - 'for_each_prop_dlc_cpus'
- 'for_each_prop_dlc_platforms' - 'for_each_prop_dlc_platforms'
- 'for_each_property_of_node' - 'for_each_property_of_node'
- 'for_each_rdt_resource'
- 'for_each_reg' - 'for_each_reg'
- 'for_each_reg_filtered' - 'for_each_reg_filtered'
- 'for_each_reloc' - 'for_each_reloc'
@ -434,10 +455,10 @@ ForEachMacros:
- 'for_each_subelement_id' - 'for_each_subelement_id'
- 'for_each_sublist' - 'for_each_sublist'
- 'for_each_subsystem' - 'for_each_subsystem'
- 'for_each_suite'
- 'for_each_supported_activate_fn' - 'for_each_supported_activate_fn'
- 'for_each_supported_inject_fn' - 'for_each_supported_inject_fn'
- 'for_each_sym' - 'for_each_sym'
- 'for_each_test'
- 'for_each_thread' - 'for_each_thread'
- 'for_each_token' - 'for_each_token'
- 'for_each_unicast_dest_pgid' - 'for_each_unicast_dest_pgid'
@ -499,8 +520,10 @@ ForEachMacros:
- 'idr_for_each_entry_continue' - 'idr_for_each_entry_continue'
- 'idr_for_each_entry_continue_ul' - 'idr_for_each_entry_continue_ul'
- 'idr_for_each_entry_ul' - 'idr_for_each_entry_ul'
- 'iio_for_each_active_channel'
- 'in_dev_for_each_ifa_rcu' - 'in_dev_for_each_ifa_rcu'
- 'in_dev_for_each_ifa_rtnl' - 'in_dev_for_each_ifa_rtnl'
- 'in_dev_for_each_ifa_rtnl_net'
- 'inet_bind_bucket_for_each' - 'inet_bind_bucket_for_each'
- 'interval_tree_for_each_span' - 'interval_tree_for_each_span'
- 'intlist__for_each_entry' - 'intlist__for_each_entry'
@ -542,7 +565,6 @@ ForEachMacros:
- 'list_for_each_prev' - 'list_for_each_prev'
- 'list_for_each_prev_safe' - 'list_for_each_prev_safe'
- 'list_for_each_rcu' - 'list_for_each_rcu'
- 'list_for_each_reverse'
- 'list_for_each_safe' - 'list_for_each_safe'
- 'llist_for_each' - 'llist_for_each'
- 'llist_for_each_entry' - 'llist_for_each_entry'
@ -552,6 +574,7 @@ ForEachMacros:
- 'map__for_each_symbol' - 'map__for_each_symbol'
- 'map__for_each_symbol_by_name' - 'map__for_each_symbol_by_name'
- 'mas_for_each' - 'mas_for_each'
- 'mas_for_each_rev'
- 'mci_for_each_dimm' - 'mci_for_each_dimm'
- 'media_device_for_each_entity' - 'media_device_for_each_entity'
- 'media_device_for_each_intf' - 'media_device_for_each_intf'
@ -561,10 +584,15 @@ ForEachMacros:
- 'media_pipeline_for_each_entity' - 'media_pipeline_for_each_entity'
- 'media_pipeline_for_each_pad' - 'media_pipeline_for_each_pad'
- 'mlx5_lag_for_each_peer_mdev' - 'mlx5_lag_for_each_peer_mdev'
- 'mptcp_for_each_subflow'
- 'msi_domain_for_each_desc' - 'msi_domain_for_each_desc'
- 'msi_for_each_desc' - 'msi_for_each_desc'
- 'mt_for_each' - 'mt_for_each'
- 'nanddev_io_for_each_block'
- 'nanddev_io_for_each_page' - 'nanddev_io_for_each_page'
- 'neigh_for_each_in_bucket'
- 'neigh_for_each_in_bucket_rcu'
- 'neigh_for_each_in_bucket_safe'
- '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'
@ -604,11 +632,11 @@ ForEachMacros:
- 'perf_evlist__for_each_entry_safe' - 'perf_evlist__for_each_entry_safe'
- 'perf_evlist__for_each_evsel' - 'perf_evlist__for_each_evsel'
- 'perf_evlist__for_each_mmap' - 'perf_evlist__for_each_mmap'
- 'perf_evsel_for_each_per_thread_period_safe'
- 'perf_hpp_list__for_each_format' - 'perf_hpp_list__for_each_format'
- 'perf_hpp_list__for_each_format_safe' - 'perf_hpp_list__for_each_format_safe'
- 'perf_hpp_list__for_each_sort_list' - 'perf_hpp_list__for_each_sort_list'
- 'perf_hpp_list__for_each_sort_list_safe' - 'perf_hpp_list__for_each_sort_list_safe'
- 'perf_tool_event__for_each_event'
- 'plist_for_each' - 'plist_for_each'
- 'plist_for_each_continue' - 'plist_for_each_continue'
- 'plist_for_each_entry' - 'plist_for_each_entry'
@ -627,7 +655,6 @@ ForEachMacros:
- 'rdma_for_each_block' - 'rdma_for_each_block'
- 'rdma_for_each_port' - 'rdma_for_each_port'
- 'rdma_umem_for_each_dma_block' - 'rdma_umem_for_each_dma_block'
- 'resort_rb__for_each_entry'
- 'resource_list_for_each_entry' - 'resource_list_for_each_entry'
- 'resource_list_for_each_entry_safe' - 'resource_list_for_each_entry_safe'
- 'rhl_for_each_entry_rcu' - 'rhl_for_each_entry_rcu'
@ -658,6 +685,7 @@ ForEachMacros:
- 'shost_for_each_device' - 'shost_for_each_device'
- 'sk_for_each' - 'sk_for_each'
- 'sk_for_each_bound' - 'sk_for_each_bound'
- 'sk_for_each_bound_safe'
- 'sk_for_each_entry_offset_rcu' - 'sk_for_each_entry_offset_rcu'
- 'sk_for_each_from' - 'sk_for_each_from'
- 'sk_for_each_rcu' - 'sk_for_each_rcu'
@ -680,7 +708,11 @@ ForEachMacros:
- 'tb_property_for_each' - 'tb_property_for_each'
- 'tcf_act_for_each_action' - 'tcf_act_for_each_action'
- 'tcf_exts_for_each_action' - 'tcf_exts_for_each_action'
- 'test_suite__for_each_test_case'
- 'tool_pmu__for_each_event'
- 'ttm_bo_lru_for_each_reserved_guarded'
- 'ttm_resource_manager_for_each_res' - 'ttm_resource_manager_for_each_res'
- 'udp_lrpa_for_each_entry_rcu'
- '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'
@ -698,6 +730,7 @@ ForEachMacros:
- 'vkms_config_encoder_for_each_possible_crtc' - 'vkms_config_encoder_for_each_possible_crtc'
- 'vkms_config_plane_for_each_possible_crtc' - 'vkms_config_plane_for_each_possible_crtc'
- 'while_for_each_ftrace_op' - 'while_for_each_ftrace_op'
- 'workloads__for_each'
- 'xa_for_each' - 'xa_for_each'
- 'xa_for_each_marked' - 'xa_for_each_marked'
- 'xa_for_each_range' - 'xa_for_each_range'

View file

@ -322,6 +322,7 @@ Jayachandran C <c.jayachandran@gmail.com> <jchandra@broadcom.com>
Jayachandran C <c.jayachandran@gmail.com> <jchandra@digeo.com> Jayachandran C <c.jayachandran@gmail.com> <jchandra@digeo.com>
Jayachandran C <c.jayachandran@gmail.com> <jnair@caviumnetworks.com> Jayachandran C <c.jayachandran@gmail.com> <jnair@caviumnetworks.com>
<jean-philippe@linaro.org> <jean-philippe.brucker@arm.com> <jean-philippe@linaro.org> <jean-philippe.brucker@arm.com>
Jean-Michel Hautbois <jeanmichel.hautbois@yoseli.org> <jeanmichel.hautbois@ideasonboard.com>
Jean Tourrilhes <jt@hpl.hp.com> Jean Tourrilhes <jt@hpl.hp.com>
Jeevan Shriram <quic_jshriram@quicinc.com> <jshriram@codeaurora.org> Jeevan Shriram <quic_jshriram@quicinc.com> <jshriram@codeaurora.org>
Jeff Garzik <jgarzik@pretzel.yyz.us> Jeff Garzik <jgarzik@pretzel.yyz.us>
@ -438,6 +439,8 @@ Linus Lüssing <linus.luessing@c0d3.blue> <ll@simonwunderlich.de>
Li Yang <leoyang.li@nxp.com> <leoli@freescale.com> Li Yang <leoyang.li@nxp.com> <leoli@freescale.com>
Li Yang <leoyang.li@nxp.com> <leo@zh-kernel.org> Li Yang <leoyang.li@nxp.com> <leo@zh-kernel.org>
Lior David <quic_liord@quicinc.com> <liord@codeaurora.org> Lior David <quic_liord@quicinc.com> <liord@codeaurora.org>
Loic Poulain <loic.poulain@oss.qualcomm.com> <loic.poulain@linaro.org>
Loic Poulain <loic.poulain@oss.qualcomm.com> <loic.poulain@intel.com>
Lorenzo Pieralisi <lpieralisi@kernel.org> <lorenzo.pieralisi@arm.com> Lorenzo Pieralisi <lpieralisi@kernel.org> <lorenzo.pieralisi@arm.com>
Lorenzo Stoakes <lorenzo.stoakes@oracle.com> <lstoakes@gmail.com> Lorenzo Stoakes <lorenzo.stoakes@oracle.com> <lstoakes@gmail.com>
Luca Ceresoli <luca.ceresoli@bootlin.com> <luca@lucaceresoli.net> Luca Ceresoli <luca.ceresoli@bootlin.com> <luca@lucaceresoli.net>
@ -685,6 +688,8 @@ Simon Wunderlich <sw@simonwunderlich.de> <simon.wunderlich@saxnet.de>
Simon Wunderlich <sw@simonwunderlich.de> <simon@open-mesh.com> Simon Wunderlich <sw@simonwunderlich.de> <simon@open-mesh.com>
Simon Wunderlich <sw@simonwunderlich.de> <siwu@hrz.tu-chemnitz.de> Simon Wunderlich <sw@simonwunderlich.de> <siwu@hrz.tu-chemnitz.de>
Sricharan Ramabadhran <quic_srichara@quicinc.com> <sricharan@codeaurora.org> Sricharan Ramabadhran <quic_srichara@quicinc.com> <sricharan@codeaurora.org>
Srinivas Kandagatla <srini@kernel.org> <srinivas.kandagatla@st.com>
Srinivas Kandagatla <srini@kernel.org> <srinivas.kandagatla@linaro.org>
Srinivas Ramana <quic_sramana@quicinc.com> <sramana@codeaurora.org> Srinivas Ramana <quic_sramana@quicinc.com> <sramana@codeaurora.org>
Sriram R <quic_srirrama@quicinc.com> <srirrama@codeaurora.org> Sriram R <quic_srirrama@quicinc.com> <srirrama@codeaurora.org>
Sriram Yagnaraman <sriram.yagnaraman@ericsson.com> <sriram.yagnaraman@est.tech> Sriram Yagnaraman <sriram.yagnaraman@ericsson.com> <sriram.yagnaraman@est.tech>

View file

@ -2071,6 +2071,10 @@ S: 660 Harvard Ave. #7
S: Santa Clara, CA 95051 S: Santa Clara, CA 95051
S: USA S: USA
N: Joonsoo Kim
E: iamjoonsoo.kim@lge.com
D: Slab allocators
N: Kukjin Kim N: Kukjin Kim
E: kgene@kernel.org E: kgene@kernel.org
D: Samsung S3C, S5P and Exynos ARM architectures D: Samsung S3C, S5P and Exynos ARM architectures

View file

@ -77,7 +77,7 @@ Description:
What: /sys/block/<disk>/diskseq What: /sys/block/<disk>/diskseq
Date: February 2021 Date: February 2021
Contact: Matteo Croce <mcroce@microsoft.com> Contact: Matteo Croce <teknoraver@meta.com>
Description: Description:
The /sys/block/<disk>/diskseq files reports the disk The /sys/block/<disk>/diskseq files reports the disk
sequence number, which is a monotonically increasing sequence number, which is a monotonically increasing

View file

@ -1604,3 +1604,35 @@ Description:
prevent the UFS from frequently performing clock gating/ungating. prevent the UFS from frequently performing clock gating/ungating.
The attribute is read/write. The attribute is read/write.
What: /sys/bus/platform/drivers/ufshcd/*/device_lvl_exception_count
What: /sys/bus/platform/devices/*.ufs/device_lvl_exception_count
Date: March 2025
Contact: Bao D. Nguyen <quic_nguyenb@quicinc.com>
Description:
This attribute is applicable to ufs devices compliant to the
JEDEC specifications version 4.1 or later. The
device_lvl_exception_count is a counter indicating the number of
times the device level exceptions have occurred since the last
time this variable is reset. Writing a 0 value to this
attribute will reset the device_lvl_exception_count. If the
device_lvl_exception_count reads a positive value, the user
application should read the device_lvl_exception_id attribute to
know more information about the exception.
The attribute is read/write.
What: /sys/bus/platform/drivers/ufshcd/*/device_lvl_exception_id
What: /sys/bus/platform/devices/*.ufs/device_lvl_exception_id
Date: March 2025
Contact: Bao D. Nguyen <quic_nguyenb@quicinc.com>
Description:
Reading the device_lvl_exception_id returns the
qDeviceLevelExceptionID attribute of the ufs device JEDEC
specification version 4.1. The definition of the
qDeviceLevelExceptionID is the ufs device vendor specific
implementation. Refer to the device manufacturer datasheet for
more information on the meaning of the qDeviceLevelExceptionID
attribute value.
The attribute is read only.

View file

@ -1,7 +1,7 @@
What: /sys/kernel/reboot What: /sys/kernel/reboot
Date: November 2020 Date: November 2020
KernelVersion: 5.11 KernelVersion: 5.11
Contact: Matteo Croce <mcroce@microsoft.com> Contact: Matteo Croce <teknoraver@meta.com>
Description: Interface to set the kernel reboot behavior, similarly to Description: Interface to set the kernel reboot behavior, similarly to
what can be done via the reboot= cmdline option. what can be done via the reboot= cmdline option.
(see Documentation/admin-guide/kernel-parameters.txt) (see Documentation/admin-guide/kernel-parameters.txt)
@ -9,25 +9,25 @@ Description: Interface to set the kernel reboot behavior, similarly to
What: /sys/kernel/reboot/mode What: /sys/kernel/reboot/mode
Date: November 2020 Date: November 2020
KernelVersion: 5.11 KernelVersion: 5.11
Contact: Matteo Croce <mcroce@microsoft.com> Contact: Matteo Croce <teknoraver@meta.com>
Description: Reboot mode. Valid values are: cold warm hard soft gpio Description: Reboot mode. Valid values are: cold warm hard soft gpio
What: /sys/kernel/reboot/type What: /sys/kernel/reboot/type
Date: November 2020 Date: November 2020
KernelVersion: 5.11 KernelVersion: 5.11
Contact: Matteo Croce <mcroce@microsoft.com> Contact: Matteo Croce <teknoraver@meta.com>
Description: Reboot type. Valid values are: bios acpi kbd triple efi pci Description: Reboot type. Valid values are: bios acpi kbd triple efi pci
What: /sys/kernel/reboot/cpu What: /sys/kernel/reboot/cpu
Date: November 2020 Date: November 2020
KernelVersion: 5.11 KernelVersion: 5.11
Contact: Matteo Croce <mcroce@microsoft.com> Contact: Matteo Croce <teknoraver@meta.com>
Description: CPU number to use to reboot. Description: CPU number to use to reboot.
What: /sys/kernel/reboot/force What: /sys/kernel/reboot/force
Date: November 2020 Date: November 2020
KernelVersion: 5.11 KernelVersion: 5.11
Contact: Matteo Croce <mcroce@microsoft.com> Contact: Matteo Croce <teknoraver@meta.com>
Description: Don't wait for any other CPUs on reboot and Description: Don't wait for any other CPUs on reboot and
avoid anything that could hang. avoid anything that could hang.

View file

@ -124,6 +124,14 @@ When mounting an XFS filesystem, the following options are accepted.
controls the size of each buffer and so is also relevant to controls the size of each buffer and so is also relevant to
this case. this case.
lifetime (default) or nolifetime
Enable data placement based on write life time hints provided
by the user. This turns on co-allocation of data of similar
life times when statistically favorable to reduce garbage
collection cost.
These options are only available for zoned rt file systems.
logbsize=value logbsize=value
Set the size of each in-memory log buffer. The size may be Set the size of each in-memory log buffer. The size may be
specified in bytes, or in kilobytes with a "k" suffix. specified in bytes, or in kilobytes with a "k" suffix.
@ -143,6 +151,14 @@ When mounting an XFS filesystem, the following options are accepted.
optional, and the log section can be separate from the data optional, and the log section can be separate from the data
section or contained within it. section or contained within it.
max_open_zones=value
Specify the max number of zones to keep open for writing on a
zoned rt device. Many open zones aids file data separation
but may impact performance on HDDs.
If ``max_open_zones`` is not specified, the value is determined
by the capabilities and the size of the zoned rt device.
noalign noalign
Data allocations will not be aligned at stripe unit Data allocations will not be aligned at stripe unit
boundaries. This is only relevant to filesystems created boundaries. This is only relevant to filesystems created
@ -542,3 +558,24 @@ The interesting knobs for XFS workqueues are as follows:
nice Relative priority of scheduling the threads. These are the nice Relative priority of scheduling the threads. These are the
same nice levels that can be applied to userspace processes. same nice levels that can be applied to userspace processes.
============ =========== ============ ===========
Zoned Filesystems
=================
For zoned file systems, the following attributes are exposed in:
/sys/fs/xfs/<dev>/zoned/
max_open_zones (Min: 1 Default: Varies Max: UINTMAX)
This read-only attribute exposes the maximum number of open zones
available for data placement. The value is determined at mount time and
is limited by the capabilities of the backing zoned device, file system
size and the max_open_zones mount option.
zonegc_low_space (Min: 0 Default: 0 Max: 100)
Define a percentage for how much of the unused space that GC should keep
available for writing. A high value will reclaim more of the space
occupied by unused blocks, creating a larger buffer against write
bursts at the cost of increased write amplification. Regardless
of this value, garbage collection will always aim to free a minimum
amount of blocks to keep max_open_zones open for data placement purposes.

View file

@ -7,10 +7,10 @@ target architecture, specifically, is the 32-bit OpenRISC 1000 family (or1k).
For information about OpenRISC processors and ongoing development: For information about OpenRISC processors and ongoing development:
======= ============================= ======= ==============================
website https://openrisc.io website https://openrisc.io
email openrisc@lists.librecores.org email linux-openrisc@vger.kernel.org
======= ============================= ======= ==============================
--------------------------------------------------------------------- ---------------------------------------------------------------------
@ -27,11 +27,11 @@ Toolchain binaries can be obtained from openrisc.io or our github releases page.
Instructions for building the different toolchains can be found on openrisc.io Instructions for building the different toolchains can be found on openrisc.io
or Stafford's toolchain build and release scripts. or Stafford's toolchain build and release scripts.
========== ================================================= ========== ==========================================================
binaries https://github.com/openrisc/or1k-gcc/releases binaries https://github.com/stffrdhrn/or1k-toolchain-build/releases
toolchains https://openrisc.io/software toolchains https://openrisc.io/software
building https://github.com/stffrdhrn/or1k-toolchain-build building https://github.com/stffrdhrn/or1k-toolchain-build
========== ================================================= ========== ==========================================================
2) Building 2) Building

View file

@ -51,7 +51,7 @@ The following keys are defined:
* :c:macro:`RISCV_HWPROBE_KEY_MARCHID`: Contains the value of ``marchid``, as * :c:macro:`RISCV_HWPROBE_KEY_MARCHID`: Contains the value of ``marchid``, as
defined by the RISC-V privileged architecture specification. defined by the RISC-V privileged architecture specification.
* :c:macro:`RISCV_HWPROBE_KEY_MIMPLID`: Contains the value of ``mimplid``, as * :c:macro:`RISCV_HWPROBE_KEY_MIMPID`: Contains the value of ``mimpid``, as
defined by the RISC-V privileged architecture specification. defined by the RISC-V privileged architecture specification.
* :c:macro:`RISCV_HWPROBE_KEY_BASE_BEHAVIOR`: A bitmask containing the base * :c:macro:`RISCV_HWPROBE_KEY_BASE_BEHAVIOR`: A bitmask containing the base

View file

@ -382,6 +382,14 @@ In case of new BPF instructions, once the changes have been accepted
into the Linux kernel, please implement support into LLVM's BPF back into the Linux kernel, please implement support into LLVM's BPF back
end. See LLVM_ section below for further information. end. See LLVM_ section below for further information.
Q: What "BPF_INTERNAL" symbol namespace is for?
-----------------------------------------------
A: Symbols exported as BPF_INTERNAL can only be used by BPF infrastructure
like preload kernel modules with light skeleton. Most symbols outside
of BPF_INTERNAL are not expected to be used by code outside of BPF either.
Symbols may lack the designation because they predate the namespaces,
or due to an oversight.
Stable submission Stable submission
================= =================

View file

@ -7,7 +7,6 @@ $schema: http://devicetree.org/meta-schemas/core.yaml#
title: Ceva AHCI SATA Controller title: Ceva AHCI SATA Controller
maintainers: maintainers:
- Mubin Sayyed <mubin.sayyed@amd.com>
- Radhey Shyam Pandey <radhey.shyam.pandey@amd.com> - Radhey Shyam Pandey <radhey.shyam.pandey@amd.com>
description: | description: |

View file

@ -111,11 +111,27 @@ properties:
unevaluatedProperties: false unevaluatedProperties: false
port@1: port@1:
$ref: /schemas/graph.yaml#/properties/port $ref: /schemas/graph.yaml#/$defs/port-base
unevaluatedProperties: false
description: description:
DSI output port node to the panel or the next bridge DSI output port node to the panel or the next bridge
in the chain in the chain
properties:
endpoint:
$ref: /schemas/media/video-interfaces.yaml#
unevaluatedProperties: false
properties:
data-lanes:
description: array of physical DSI data lane indexes.
minItems: 1
items:
- const: 1
- const: 2
- const: 3
- const: 4
required: required:
- port@0 - port@0
- port@1 - port@1

View file

@ -12,7 +12,6 @@ description:
PS_MODE). Every pin can be configured as input/output. PS_MODE). Every pin can be configured as input/output.
maintainers: maintainers:
- Mubin Sayyed <mubin.sayyed@amd.com>
- Radhey Shyam Pandey <radhey.shyam.pandey@amd.com> - Radhey Shyam Pandey <radhey.shyam.pandey@amd.com>
properties: properties:

View file

@ -19,6 +19,7 @@ properties:
- fsl,imx8mp-irqsteer - fsl,imx8mp-irqsteer
- fsl,imx8qm-irqsteer - fsl,imx8qm-irqsteer
- fsl,imx8qxp-irqsteer - fsl,imx8qxp-irqsteer
- fsl,imx94-irqsteer
- const: fsl,imx-irqsteer - const: fsl,imx-irqsteer
reg: reg:

View file

@ -27,7 +27,7 @@ properties:
$ref: /schemas/types.yaml#/definitions/uint32-array $ref: /schemas/types.yaml#/definitions/uint32-array
items: items:
- minimum: 0 - minimum: 0
maximum: 7 maximum: 31
description: description:
Offset in bit within the address range specified by reg. Offset in bit within the address range specified by reg.
- minimum: 1 - minimum: 1

View file

@ -19,6 +19,7 @@ properties:
- enum: - enum:
- qcom,apq8064-qfprom - qcom,apq8064-qfprom
- qcom,apq8084-qfprom - qcom,apq8084-qfprom
- qcom,ipq5018-qfprom
- qcom,ipq5332-qfprom - qcom,ipq5332-qfprom
- qcom,ipq5424-qfprom - qcom,ipq5424-qfprom
- qcom,ipq6018-qfprom - qcom,ipq6018-qfprom
@ -28,6 +29,8 @@ properties:
- qcom,msm8226-qfprom - qcom,msm8226-qfprom
- qcom,msm8916-qfprom - qcom,msm8916-qfprom
- qcom,msm8917-qfprom - qcom,msm8917-qfprom
- qcom,msm8937-qfprom
- qcom,msm8960-qfprom
- qcom,msm8974-qfprom - qcom,msm8974-qfprom
- qcom,msm8976-qfprom - qcom,msm8976-qfprom
- qcom,msm8996-qfprom - qcom,msm8996-qfprom
@ -51,6 +54,7 @@ properties:
- qcom,sm8450-qfprom - qcom,sm8450-qfprom
- qcom,sm8550-qfprom - qcom,sm8550-qfprom
- qcom,sm8650-qfprom - qcom,sm8650-qfprom
- qcom,x1e80100-qfprom
- const: qcom,qfprom - const: qcom,qfprom
reg: reg:

View file

@ -14,6 +14,7 @@ properties:
enum: enum:
- rockchip,px30-otp - rockchip,px30-otp
- rockchip,rk3308-otp - rockchip,rk3308-otp
- rockchip,rk3576-otp
- rockchip,rk3588-otp - rockchip,rk3588-otp
reg: reg:
@ -62,12 +63,34 @@ allOf:
properties: properties:
clocks: clocks:
maxItems: 3 maxItems: 3
clock-names:
maxItems: 3
resets: resets:
maxItems: 1 maxItems: 1
reset-names: reset-names:
items: items:
- const: phy - const: phy
- if:
properties:
compatible:
contains:
enum:
- rockchip,rk3576-otp
then:
properties:
clocks:
maxItems: 3
clock-names:
maxItems: 3
resets:
minItems: 2
maxItems: 2
reset-names:
items:
- const: otp
- const: apb
- if: - if:
properties: properties:
compatible: compatible:
@ -78,6 +101,8 @@ allOf:
properties: properties:
clocks: clocks:
minItems: 4 minItems: 4
clock-names:
minItems: 4
resets: resets:
minItems: 3 minItems: 3
reset-names: reset-names:

View file

@ -9,15 +9,6 @@ title: Renesas R-Car Timer Pulse Unit PWM Controller
maintainers: maintainers:
- Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com> - Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
select:
properties:
compatible:
contains:
const: renesas,tpu
required:
- compatible
- '#pwm-cells'
properties: properties:
compatible: compatible:
items: items:

View file

@ -7,7 +7,6 @@ $schema: http://devicetree.org/meta-schemas/core.yaml#
title: Zynq UltraScale+ MPSoC and Versal reset title: Zynq UltraScale+ MPSoC and Versal reset
maintainers: maintainers:
- Mubin Sayyed <mubin.sayyed@amd.com>
- Radhey Shyam Pandey <radhey.shyam.pandey@amd.com> - Radhey Shyam Pandey <radhey.shyam.pandey@amd.com>
description: | description: |

View file

@ -7,7 +7,7 @@ $schema: http://devicetree.org/meta-schemas/core.yaml#
title: Freescale Layerscape Reset Registers Module title: Freescale Layerscape Reset Registers Module
maintainers: maintainers:
- Frank Li - Frank Li <Frank.Li@nxp.com>
description: description:
Reset Module includes chip reset, service processor control and Reset Control Reset Module includes chip reset, service processor control and Reset Control

View file

@ -56,19 +56,18 @@ properties:
enum: enum:
- snps,dw-apb-ssi - snps,dw-apb-ssi
- snps,dwc-ssi-1.01a - snps,dwc-ssi-1.01a
- description: Microsemi Ocelot/Jaguar2 SoC SPI Controller
items:
- enum:
- mscc,ocelot-spi
- mscc,jaguar2-spi
- const: snps,dw-apb-ssi
- description: Microchip Sparx5 SoC SPI Controller - description: Microchip Sparx5 SoC SPI Controller
const: microchip,sparx5-spi const: microchip,sparx5-spi
- description: Amazon Alpine SPI Controller - description: Amazon Alpine SPI Controller
const: amazon,alpine-dw-apb-ssi const: amazon,alpine-dw-apb-ssi
- description: Renesas RZ/N1 SPI Controller - description: Vendor controllers which use snps,dw-apb-ssi as fallback
items: items:
- const: renesas,rzn1-spi - enum:
- mscc,ocelot-spi
- mscc,jaguar2-spi
- renesas,rzn1-spi
- sophgo,sg2042-spi
- thead,th1520-spi
- const: snps,dw-apb-ssi - const: snps,dw-apb-ssi
- description: Intel Keem Bay SPI Controller - description: Intel Keem Bay SPI Controller
const: intel,keembay-ssi const: intel,keembay-ssi
@ -88,10 +87,6 @@ properties:
- renesas,r9a06g032-spi # RZ/N1D - renesas,r9a06g032-spi # RZ/N1D
- renesas,r9a06g033-spi # RZ/N1S - renesas,r9a06g033-spi # RZ/N1S
- const: renesas,rzn1-spi # RZ/N1 - const: renesas,rzn1-spi # RZ/N1
- description: T-HEAD TH1520 SoC SPI Controller
items:
- const: thead,th1520-spi
- const: snps,dw-apb-ssi
reg: reg:
minItems: 1 minItems: 1

View file

@ -18,9 +18,14 @@ description: |
properties: properties:
compatible: compatible:
enum: oneOf:
- nxp,imx95-sysctr-timer - enum:
- nxp,sysctr-timer - nxp,imx95-sysctr-timer
- nxp,sysctr-timer
- items:
- enum:
- nxp,imx94-sysctr-timer
- const: nxp,imx95-sysctr-timer
reg: reg:
maxItems: 1 maxItems: 1

View file

@ -1,56 +0,0 @@
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
%YAML 1.2
---
$id: http://devicetree.org/schemas/timer/renesas,tpu.yaml#
$schema: http://devicetree.org/meta-schemas/core.yaml#
title: Renesas H8/300 Timer Pulse Unit
maintainers:
- Yoshinori Sato <ysato@users.sourceforge.jp>
description:
The TPU is a 16bit timer/counter with configurable clock inputs and
programmable compare match.
This implementation supports only cascade mode.
select:
properties:
compatible:
contains:
const: renesas,tpu
'#pwm-cells': false
required:
- compatible
properties:
compatible:
const: renesas,tpu
reg:
items:
- description: First channel
- description: Second channel
clocks:
maxItems: 1
clock-names:
const: fck
required:
- compatible
- reg
- clocks
- clock-names
additionalProperties: false
examples:
- |
tpu: tpu@ffffe0 {
compatible = "renesas,tpu";
reg = <0xffffe0 16>, <0xfffff0 12>;
clocks = <&pclk>;
clock-names = "fck";
};

View file

@ -7,7 +7,6 @@ $schema: http://devicetree.org/meta-schemas/core.yaml#
title: Xilinx SuperSpeed DWC3 USB SoC controller title: Xilinx SuperSpeed DWC3 USB SoC controller
maintainers: maintainers:
- Mubin Sayyed <mubin.sayyed@amd.com>
- Radhey Shyam Pandey <radhey.shyam.pandey@amd.com> - Radhey Shyam Pandey <radhey.shyam.pandey@amd.com>
properties: properties:

View file

@ -17,7 +17,6 @@ description:
maintainers: maintainers:
- Michal Simek <michal.simek@amd.com> - Michal Simek <michal.simek@amd.com>
- Mubin Sayyed <mubin.sayyed@amd.com>
- Radhey Shyam Pandey <radhey.shyam.pandey@amd.com> - Radhey Shyam Pandey <radhey.shyam.pandey@amd.com>
properties: properties:

View file

@ -7,7 +7,6 @@ $schema: http://devicetree.org/meta-schemas/core.yaml#
title: Xilinx udc controller title: Xilinx udc controller
maintainers: maintainers:
- Mubin Sayyed <mubin.sayyed@amd.com>
- Radhey Shyam Pandey <radhey.shyam.pandey@amd.com> - Radhey Shyam Pandey <radhey.shyam.pandey@amd.com>
properties: properties:

View file

@ -89,8 +89,10 @@ definitions:
doc: Group of short_detected states doc: Group of short_detected states
- -
name: phy-upstream-type name: phy-upstream-type
enum-name: enum-name: phy-upstream
header: linux/ethtool.h
type: enum type: enum
name-prefix: phy-upstream
entries: [ mac, phy ] entries: [ mac, phy ]
- -
name: tcp-data-split name: tcp-data-split

View file

@ -123,12 +123,12 @@ attribute-sets:
operations: operations:
name-prefix: ovs-vport-cmd- name-prefix: ovs-vport-cmd-
fixed-header: ovs-header
list: list:
- -
name: new name: new
doc: Create a new OVS vport doc: Create a new OVS vport
attribute-set: vport attribute-set: vport
fixed-header: ovs-header
do: do:
request: request:
attributes: attributes:
@ -141,7 +141,6 @@ operations:
name: del name: del
doc: Delete existing OVS vport from a data path doc: Delete existing OVS vport from a data path
attribute-set: vport attribute-set: vport
fixed-header: ovs-header
do: do:
request: request:
attributes: attributes:
@ -152,7 +151,6 @@ operations:
name: get name: get
doc: Get / dump OVS vport configuration and state doc: Get / dump OVS vport configuration and state
attribute-set: vport attribute-set: vport
fixed-header: ovs-header
do: &vport-get-op do: &vport-get-op
request: request:
attributes: attributes:

View file

@ -1113,11 +1113,10 @@ attribute-sets:
- -
name: prop-list name: prop-list
type: nest type: nest
nested-attributes: link-attrs nested-attributes: prop-list-link-attrs
- -
name: alt-ifname name: alt-ifname
type: string type: string
multi-attr: true
- -
name: perm-address name: perm-address
type: binary type: binary
@ -1163,6 +1162,13 @@ attribute-sets:
- -
name: netns-immutable name: netns-immutable
type: u8 type: u8
-
name: prop-list-link-attrs
subset-of: link-attrs
attributes:
-
name: alt-ifname
multi-attr: true
- -
name: af-spec-attrs name: af-spec-attrs
attributes: attributes:
@ -1585,7 +1591,7 @@ attribute-sets:
name: nf-call-iptables name: nf-call-iptables
type: u8 type: u8
- -
name: nf-call-ip6-tables name: nf-call-ip6tables
type: u8 type: u8
- -
name: nf-call-arptables name: nf-call-arptables
@ -2077,7 +2083,7 @@ attribute-sets:
name: id name: id
type: u16 type: u16
- -
name: flag name: flags
type: binary type: binary
struct: ifla-vlan-flags struct: ifla-vlan-flags
- -
@ -2165,7 +2171,7 @@ attribute-sets:
type: binary type: binary
struct: ifla-cacheinfo struct: ifla-cacheinfo
- -
name: icmp6-stats name: icmp6stats
type: binary type: binary
struct: ifla-icmp6-stats struct: ifla-icmp6-stats
- -
@ -2179,9 +2185,10 @@ attribute-sets:
type: u32 type: u32
- -
name: mctp-attrs name: mctp-attrs
name-prefix: ifla-mctp-
attributes: attributes:
- -
name: mctp-net name: net
type: u32 type: u32
- -
name: phys-binding name: phys-binding
@ -2453,7 +2460,6 @@ operations:
- min-mtu - min-mtu
- max-mtu - max-mtu
- prop-list - prop-list
- alt-ifname
- perm-address - perm-address
- proto-down-reason - proto-down-reason
- parent-dev-name - parent-dev-name

View file

@ -13,25 +13,25 @@ definitions:
type: struct type: struct
members: members:
- -
name: family name: ndm-family
type: u8 type: u8
- -
name: pad name: ndm-pad
type: pad type: pad
len: 3 len: 3
- -
name: ifindex name: ndm-ifindex
type: s32 type: s32
- -
name: state name: ndm-state
type: u16 type: u16
enum: nud-state enum: nud-state
- -
name: flags name: ndm-flags
type: u8 type: u8
enum: ntf-flags enum: ntf-flags
- -
name: type name: ndm-type
type: u8 type: u8
enum: rtm-type enum: rtm-type
- -
@ -189,7 +189,7 @@ attribute-sets:
type: binary type: binary
display-hint: ipv4 display-hint: ipv4
- -
name: lladr name: lladdr
type: binary type: binary
display-hint: mac display-hint: mac
- -

View file

@ -154,7 +154,7 @@ suspending the device are satisfied) and to queue up a suspend request for the
device in that case. If there is no idle callback, or if the callback returns device in that case. If there is no idle callback, or if the callback returns
0, then the PM core will attempt to carry out a runtime suspend of the device, 0, then the PM core will attempt to carry out a runtime suspend of the device,
also respecting devices configured for autosuspend. In essence this means a also respecting devices configured for autosuspend. In essence this means a
call to __pm_runtime_autosuspend() (do note that drivers needs to update the call to pm_runtime_autosuspend() (do note that drivers needs to update the
device last busy mark, pm_runtime_mark_last_busy(), to control the delay under device last busy mark, pm_runtime_mark_last_busy(), to control the delay under
this circumstance). To prevent this (for example, if the callback routine has this circumstance). To prevent this (for example, if the callback routine has
started a delayed suspend), the routine must return a non-zero value. Negative started a delayed suspend), the routine must return a non-zero value. Negative

View file

@ -17,10 +17,10 @@ OpenRISC 1000系列或1k
关于OpenRISC处理器和正在进行中的开发的信息: 关于OpenRISC处理器和正在进行中的开发的信息:
======= ============================= ======= ==============================
网站 https://openrisc.io 网站 https://openrisc.io
邮箱 openrisc@lists.librecores.org 邮箱 linux-openrisc@vger.kernel.org
======= ============================= ======= ==============================
--------------------------------------------------------------------- ---------------------------------------------------------------------
@ -36,11 +36,11 @@ OpenRISC工具链和Linux的构建指南
工具链的构建指南可以在openrisc.io或Stafford的工具链构建和发布脚本 工具链的构建指南可以在openrisc.io或Stafford的工具链构建和发布脚本
中找到。 中找到。
====== ================================================= ====== ==========================================================
二进制 https://github.com/openrisc/or1k-gcc/releases 二进制 https://github.com/stffrdhrn/or1k-toolchain-build/releases
工具链 https://openrisc.io/software 工具链 https://openrisc.io/software
构建 https://github.com/stffrdhrn/or1k-toolchain-build 构建 https://github.com/stffrdhrn/or1k-toolchain-build
====== ================================================= ====== ==========================================================
2) 构建 2) 构建

View file

@ -17,10 +17,10 @@ OpenRISC 1000系列或1k
關於OpenRISC處理器和正在進行中的開發的信息: 關於OpenRISC處理器和正在進行中的開發的信息:
======= ============================= ======= ==============================
網站 https://openrisc.io 網站 https://openrisc.io
郵箱 openrisc@lists.librecores.org 郵箱 linux-openrisc@vger.kernel.org
======= ============================= ======= ==============================
--------------------------------------------------------------------- ---------------------------------------------------------------------
@ -36,11 +36,11 @@ OpenRISC工具鏈和Linux的構建指南
工具鏈的構建指南可以在openrisc.io或Stafford的工具鏈構建和發佈腳本 工具鏈的構建指南可以在openrisc.io或Stafford的工具鏈構建和發佈腳本
中找到。 中找到。
====== ================================================= ====== ==========================================================
二進制 https://github.com/openrisc/or1k-gcc/releases 二進制 https://github.com/stffrdhrn/or1k-toolchain-build/releases
工具鏈 https://openrisc.io/software 工具鏈 https://openrisc.io/software
構建 https://github.com/stffrdhrn/or1k-toolchain-build 構建 https://github.com/stffrdhrn/or1k-toolchain-build
====== ================================================= ====== ==========================================================
2) 構建 2) 構建

View file

@ -27,7 +27,7 @@ SYSCALL
======= =======
mseal syscall signature mseal syscall signature
----------------------- -----------------------
``int mseal(void \* addr, size_t len, unsigned long flags)`` ``int mseal(void *addr, size_t len, unsigned long flags)``
**addr**/**len**: virtual memory address range. **addr**/**len**: virtual memory address range.
The address range set by **addr**/**len** must meet: The address range set by **addr**/**len** must meet:

View file

@ -138,6 +138,10 @@ input data, the meaning of which depends on the subfeature being accessed.
The output buffer contains a single byte which signals success or failure (``0x00`` on failure) The output buffer contains a single byte which signals success or failure (``0x00`` on failure)
and 31 bytes of output data, the meaning if which depends on the subfeature being accessed. and 31 bytes of output data, the meaning if which depends on the subfeature being accessed.
.. note::
The ACPI control method responsible for handling the WMI method calls is not thread-safe.
This is a firmware bug that needs to be handled inside the driver itself.
WMI method Get_EC() WMI method Get_EC()
------------------- -------------------

View file

@ -3192,6 +3192,12 @@ M: Dinh Nguyen <dinguyen@kernel.org>
S: Maintained S: Maintained
F: drivers/clk/socfpga/ F: drivers/clk/socfpga/
ARM/SOCFPGA DWMAC GLUE LAYER
M: Maxime Chevallier <maxime.chevallier@bootlin.com>
S: Maintained
F: Documentation/devicetree/bindings/net/socfpga-dwmac.txt
F: drivers/net/ethernet/stmicro/stmmac/dwmac-socfpga.c
ARM/SOCFPGA EDAC BINDINGS ARM/SOCFPGA EDAC BINDINGS
M: Matthew Gerlach <matthew.gerlach@altera.com> M: Matthew Gerlach <matthew.gerlach@altera.com>
S: Maintained S: Maintained
@ -3868,8 +3874,9 @@ AUXILIARY BUS DRIVER
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
R: Dave Ertman <david.m.ertman@intel.com> R: Dave Ertman <david.m.ertman@intel.com>
R: Ira Weiny <ira.weiny@intel.com> R: Ira Weiny <ira.weiny@intel.com>
R: Leon Romanovsky <leon@kernel.org>
S: Supported S: Supported
T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/driver-core/driver-core.git
F: Documentation/driver-api/auxiliary_bus.rst F: Documentation/driver-api/auxiliary_bus.rst
F: drivers/base/auxiliary.c F: drivers/base/auxiliary.c
F: include/linux/auxiliary_bus.h F: include/linux/auxiliary_bus.h
@ -6336,6 +6343,7 @@ F: Documentation/process/cve.rst
CW1200 WLAN driver CW1200 WLAN driver
S: Orphan S: Orphan
L: linux-wireless@vger.kernel.org
F: drivers/net/wireless/st/ F: drivers/net/wireless/st/
F: include/linux/platform_data/net-cw1200.h F: include/linux/platform_data/net-cw1200.h
@ -7021,6 +7029,7 @@ L: rust-for-linux@vger.kernel.org
S: Supported S: Supported
W: https://rust-for-linux.com W: https://rust-for-linux.com
T: git https://github.com/Rust-for-Linux/linux.git alloc-next T: git https://github.com/Rust-for-Linux/linux.git alloc-next
F: rust/helpers/dma.c
F: rust/kernel/dma.rs F: rust/kernel/dma.rs
F: samples/rust/rust_dma.rs F: samples/rust/rust_dma.rs
@ -7226,7 +7235,7 @@ M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
M: "Rafael J. Wysocki" <rafael@kernel.org> M: "Rafael J. Wysocki" <rafael@kernel.org>
M: Danilo Krummrich <dakr@kernel.org> M: Danilo Krummrich <dakr@kernel.org>
S: Supported S: Supported
T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/driver-core/driver-core.git
F: Documentation/core-api/kobject.rst F: Documentation/core-api/kobject.rst
F: drivers/base/ F: drivers/base/
F: fs/debugfs/ F: fs/debugfs/
@ -10462,14 +10471,20 @@ S: Supported
F: drivers/infiniband/hw/hfi1 F: drivers/infiniband/hw/hfi1
HFS FILESYSTEM HFS FILESYSTEM
M: Viacheslav Dubeyko <slava@dubeyko.com>
M: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
M: Yangtao Li <frank.li@vivo.com>
L: linux-fsdevel@vger.kernel.org L: linux-fsdevel@vger.kernel.org
S: Orphan S: Maintained
F: Documentation/filesystems/hfs.rst F: Documentation/filesystems/hfs.rst
F: fs/hfs/ F: fs/hfs/
HFSPLUS FILESYSTEM HFSPLUS FILESYSTEM
M: Viacheslav Dubeyko <slava@dubeyko.com>
M: John Paul Adrian Glaubitz <glaubitz@physik.fu-berlin.de>
M: Yangtao Li <frank.li@vivo.com>
L: linux-fsdevel@vger.kernel.org L: linux-fsdevel@vger.kernel.org
S: Orphan S: Maintained
F: Documentation/filesystems/hfsplus.rst F: Documentation/filesystems/hfsplus.rst
F: fs/hfsplus/ F: fs/hfsplus/
@ -10963,6 +10978,7 @@ F: include/linux/platform_data/huawei-gaokun-ec.h
HUGETLB SUBSYSTEM HUGETLB SUBSYSTEM
M: Muchun Song <muchun.song@linux.dev> M: Muchun Song <muchun.song@linux.dev>
R: Oscar Salvador <osalvador@suse.de>
L: linux-mm@kvack.org L: linux-mm@kvack.org
S: Maintained S: Maintained
F: Documentation/ABI/testing/sysfs-kernel-mm-hugepages F: Documentation/ABI/testing/sysfs-kernel-mm-hugepages
@ -12816,6 +12832,7 @@ F: lib/Kconfig.kcsan
F: scripts/Makefile.kcsan F: scripts/Makefile.kcsan
KDUMP KDUMP
M: Andrew Morton <akpm@linux-foundation.org>
M: Baoquan He <bhe@redhat.com> M: Baoquan He <bhe@redhat.com>
R: Vivek Goyal <vgoyal@redhat.com> R: Vivek Goyal <vgoyal@redhat.com>
R: Dave Young <dyoung@redhat.com> R: Dave Young <dyoung@redhat.com>
@ -13112,11 +13129,13 @@ KERNFS
M: Greg Kroah-Hartman <gregkh@linuxfoundation.org> M: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
M: Tejun Heo <tj@kernel.org> M: Tejun Heo <tj@kernel.org>
S: Supported S: Supported
T: git git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/driver-core/driver-core.git
F: fs/kernfs/ F: fs/kernfs/
F: include/linux/kernfs.h F: include/linux/kernfs.h
KEXEC KEXEC
M: Andrew Morton <akpm@linux-foundation.org>
M: Baoquan He <bhe@redhat.com>
L: kexec@lists.infradead.org L: kexec@lists.infradead.org
W: http://kernel.org/pub/linux/utils/kernel/kexec/ W: http://kernel.org/pub/linux/utils/kernel/kexec/
F: include/linux/kexec.h F: include/linux/kexec.h
@ -14289,6 +14308,7 @@ S: Odd fixes
F: drivers/net/ethernet/marvell/sk* F: drivers/net/ethernet/marvell/sk*
MARVELL LIBERTAS WIRELESS DRIVER MARVELL LIBERTAS WIRELESS DRIVER
L: linux-wireless@vger.kernel.org
L: libertas-dev@lists.infradead.org L: libertas-dev@lists.infradead.org
S: Orphan S: Orphan
F: drivers/net/wireless/marvell/libertas/ F: drivers/net/wireless/marvell/libertas/
@ -15514,6 +15534,21 @@ F: mm/numa.c
F: mm/numa_emulation.c F: mm/numa_emulation.c
F: mm/numa_memblks.c F: mm/numa_memblks.c
MEMORY MANAGEMENT - PAGE ALLOCATOR
M: Andrew Morton <akpm@linux-foundation.org>
R: Vlastimil Babka <vbabka@suse.cz>
R: Suren Baghdasaryan <surenb@google.com>
R: Michal Hocko <mhocko@suse.com>
R: Brendan Jackman <jackmanb@google.com>
R: Johannes Weiner <hannes@cmpxchg.org>
R: Zi Yan <ziy@nvidia.com>
L: linux-mm@kvack.org
S: Maintained
F: mm/compaction.c
F: mm/page_alloc.c
F: include/linux/gfp.h
F: include/linux/compaction.h
MEMORY MANAGEMENT - SECRETMEM MEMORY MANAGEMENT - SECRETMEM
M: Andrew Morton <akpm@linux-foundation.org> M: Andrew Morton <akpm@linux-foundation.org>
M: Mike Rapoport <rppt@kernel.org> M: Mike Rapoport <rppt@kernel.org>
@ -15541,10 +15576,12 @@ M: Liam R. Howlett <Liam.Howlett@oracle.com>
M: Lorenzo Stoakes <lorenzo.stoakes@oracle.com> M: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
R: Vlastimil Babka <vbabka@suse.cz> R: Vlastimil Babka <vbabka@suse.cz>
R: Jann Horn <jannh@google.com> R: Jann Horn <jannh@google.com>
R: Pedro Falcato <pfalcato@suse.de>
L: linux-mm@kvack.org L: linux-mm@kvack.org
S: Maintained S: Maintained
W: http://www.linux-mm.org W: http://www.linux-mm.org
T: git git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm T: git git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
F: include/trace/events/mmap.h
F: mm/mlock.c F: mm/mlock.c
F: mm/mmap.c F: mm/mmap.c
F: mm/mprotect.c F: mm/mprotect.c
@ -15555,6 +15592,36 @@ F: mm/vma.h
F: mm/vma_internal.h F: mm/vma_internal.h
F: tools/testing/vma/ F: tools/testing/vma/
MEMORY MAPPING - LOCKING
M: Andrew Morton <akpm@linux-foundation.org>
M: Suren Baghdasaryan <surenb@google.com>
M: Liam R. Howlett <Liam.Howlett@oracle.com>
M: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
R: Vlastimil Babka <vbabka@suse.cz>
R: Shakeel Butt <shakeel.butt@linux.dev>
L: linux-mm@kvack.org
S: Maintained
W: http://www.linux-mm.org
T: git git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
F: Documentation/mm/process_addrs.rst
F: include/linux/mmap_lock.h
F: include/trace/events/mmap_lock.h
F: mm/mmap_lock.c
MEMORY MAPPING - MADVISE (MEMORY ADVICE)
M: Andrew Morton <akpm@linux-foundation.org>
M: Liam R. Howlett <Liam.Howlett@oracle.com>
M: Lorenzo Stoakes <lorenzo.stoakes@oracle.com>
M: David Hildenbrand <david@redhat.com>
R: Vlastimil Babka <vbabka@suse.cz>
R: Jann Horn <jannh@google.com>
L: linux-mm@kvack.org
S: Maintained
W: http://www.linux-mm.org
T: git git://git.kernel.org/pub/scm/linux/kernel/git/akpm/mm
F: include/uapi/asm-generic/mman-common.h
F: mm/madvise.c
MEMORY TECHNOLOGY DEVICES (MTD) MEMORY TECHNOLOGY DEVICES (MTD)
M: Miquel Raynal <miquel.raynal@bootlin.com> M: Miquel Raynal <miquel.raynal@bootlin.com>
M: Richard Weinberger <richard@nod.at> M: Richard Weinberger <richard@nod.at>
@ -16762,6 +16829,7 @@ F: Documentation/networking/net_cachelines/net_device.rst
F: drivers/connector/ F: drivers/connector/
F: drivers/net/ F: drivers/net/
F: drivers/ptp/ F: drivers/ptp/
F: drivers/s390/net/
F: include/dt-bindings/net/ F: include/dt-bindings/net/
F: include/linux/cn_proc.h F: include/linux/cn_proc.h
F: include/linux/etherdevice.h F: include/linux/etherdevice.h
@ -16771,6 +16839,7 @@ F: include/linux/fddidevice.h
F: include/linux/hippidevice.h F: include/linux/hippidevice.h
F: include/linux/if_* F: include/linux/if_*
F: include/linux/inetdevice.h F: include/linux/inetdevice.h
F: include/linux/ism.h
F: include/linux/netdev* F: include/linux/netdev*
F: include/linux/platform_data/wiznet.h F: include/linux/platform_data/wiznet.h
F: include/uapi/linux/cn_proc.h F: include/uapi/linux/cn_proc.h
@ -17374,7 +17443,7 @@ T: git git://git.infradead.org/nvme.git
F: drivers/nvme/target/ F: drivers/nvme/target/
NVMEM FRAMEWORK NVMEM FRAMEWORK
M: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> M: Srinivas Kandagatla <srini@kernel.org>
S: Maintained S: Maintained
T: git git://git.kernel.org/pub/scm/linux/kernel/git/srini/nvmem.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/srini/nvmem.git
F: Documentation/ABI/stable/sysfs-bus-nvmem F: Documentation/ABI/stable/sysfs-bus-nvmem
@ -18639,7 +18708,7 @@ F: drivers/pci/controller/pci-xgene-msi.c
PCI NATIVE HOST BRIDGE AND ENDPOINT DRIVERS PCI NATIVE HOST BRIDGE AND ENDPOINT DRIVERS
M: Lorenzo Pieralisi <lpieralisi@kernel.org> M: Lorenzo Pieralisi <lpieralisi@kernel.org>
M: Krzysztof Wilczyński <kw@linux.com> M: Krzysztof Wilczyński <kw@linux.com>
R: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org> M: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
R: Rob Herring <robh@kernel.org> R: Rob Herring <robh@kernel.org>
L: linux-pci@vger.kernel.org L: linux-pci@vger.kernel.org
S: Supported S: Supported
@ -18692,6 +18761,16 @@ F: include/asm-generic/pci*
F: include/linux/of_pci.h F: include/linux/of_pci.h
F: include/linux/pci* F: include/linux/pci*
F: include/uapi/linux/pci* F: include/uapi/linux/pci*
PCI SUBSYSTEM [RUST]
M: Danilo Krummrich <dakr@kernel.org>
R: Bjorn Helgaas <bhelgaas@google.com>
R: Krzysztof Wilczyński <kwilczynski@kernel.org>
L: linux-pci@vger.kernel.org
S: Maintained
C: irc://irc.oftc.net/linux-pci
T: git git://git.kernel.org/pub/scm/linux/kernel/git/pci/pci.git
F: rust/helpers/pci.c
F: rust/kernel/pci.rs F: rust/kernel/pci.rs
F: samples/rust/rust_driver_pci.rs F: samples/rust/rust_driver_pci.rs
@ -19579,7 +19658,7 @@ S: Supported
F: drivers/crypto/intel/qat/ F: drivers/crypto/intel/qat/
QCOM AUDIO (ASoC) DRIVERS QCOM AUDIO (ASoC) DRIVERS
M: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> M: Srinivas Kandagatla <srini@kernel.org>
L: linux-sound@vger.kernel.org L: linux-sound@vger.kernel.org
L: linux-arm-msm@vger.kernel.org L: linux-arm-msm@vger.kernel.org
S: Supported S: Supported
@ -19752,6 +19831,7 @@ F: drivers/media/tuners/qt1010*
QUALCOMM ATH12K WIRELESS DRIVER QUALCOMM ATH12K WIRELESS DRIVER
M: Jeff Johnson <jjohnson@kernel.org> M: Jeff Johnson <jjohnson@kernel.org>
L: linux-wireless@vger.kernel.org
L: ath12k@lists.infradead.org L: ath12k@lists.infradead.org
S: Supported S: Supported
W: https://wireless.wiki.kernel.org/en/users/Drivers/ath12k W: https://wireless.wiki.kernel.org/en/users/Drivers/ath12k
@ -19761,6 +19841,7 @@ N: ath12k
QUALCOMM ATHEROS ATH10K WIRELESS DRIVER QUALCOMM ATHEROS ATH10K WIRELESS DRIVER
M: Jeff Johnson <jjohnson@kernel.org> M: Jeff Johnson <jjohnson@kernel.org>
L: linux-wireless@vger.kernel.org
L: ath10k@lists.infradead.org L: ath10k@lists.infradead.org
S: Supported S: Supported
W: https://wireless.wiki.kernel.org/en/users/Drivers/ath10k W: https://wireless.wiki.kernel.org/en/users/Drivers/ath10k
@ -19770,6 +19851,7 @@ N: ath10k
QUALCOMM ATHEROS ATH11K WIRELESS DRIVER QUALCOMM ATHEROS ATH11K WIRELESS DRIVER
M: Jeff Johnson <jjohnson@kernel.org> M: Jeff Johnson <jjohnson@kernel.org>
L: linux-wireless@vger.kernel.org
L: ath11k@lists.infradead.org L: ath11k@lists.infradead.org
S: Supported S: Supported
W: https://wireless.wiki.kernel.org/en/users/Drivers/ath11k W: https://wireless.wiki.kernel.org/en/users/Drivers/ath11k
@ -19879,7 +19961,7 @@ F: Documentation/devicetree/bindings/net/qcom,ethqos.yaml
F: drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c F: drivers/net/ethernet/stmicro/stmmac/dwmac-qcom-ethqos.c
QUALCOMM FASTRPC DRIVER QUALCOMM FASTRPC DRIVER
M: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> M: Srinivas Kandagatla <srini@kernel.org>
M: Amol Maheshwari <amahesh@qti.qualcomm.com> M: Amol Maheshwari <amahesh@qti.qualcomm.com>
L: linux-arm-msm@vger.kernel.org L: linux-arm-msm@vger.kernel.org
L: dri-devel@lists.freedesktop.org L: dri-devel@lists.freedesktop.org
@ -21259,6 +21341,7 @@ L: linux-s390@vger.kernel.org
L: netdev@vger.kernel.org L: netdev@vger.kernel.org
S: Supported S: Supported
F: drivers/s390/net/ F: drivers/s390/net/
F: include/linux/ism.h
S390 PCI SUBSYSTEM S390 PCI SUBSYSTEM
M: Niklas Schnelle <schnelle@linux.ibm.com> M: Niklas Schnelle <schnelle@linux.ibm.com>
@ -21927,7 +22010,7 @@ S: Maintained
F: drivers/media/rc/serial_ir.c F: drivers/media/rc/serial_ir.c
SERIAL LOW-POWER INTER-CHIP MEDIA BUS (SLIMbus) SERIAL LOW-POWER INTER-CHIP MEDIA BUS (SLIMbus)
M: Srinivas Kandagatla <srinivas.kandagatla@linaro.org> M: Srinivas Kandagatla <srini@kernel.org>
L: linux-sound@vger.kernel.org L: linux-sound@vger.kernel.org
S: Maintained S: Maintained
F: Documentation/devicetree/bindings/slimbus/ F: Documentation/devicetree/bindings/slimbus/
@ -22143,6 +22226,7 @@ F: drivers/platform/x86/touchscreen_dmi.c
SILICON LABS WIRELESS DRIVERS (for WFxxx series) SILICON LABS WIRELESS DRIVERS (for WFxxx series)
M: Jérôme Pouiller <jerome.pouiller@silabs.com> M: Jérôme Pouiller <jerome.pouiller@silabs.com>
L: linux-wireless@vger.kernel.org
S: Supported S: Supported
F: Documentation/devicetree/bindings/net/wireless/silabs,wfx.yaml F: Documentation/devicetree/bindings/net/wireless/silabs,wfx.yaml
F: drivers/net/wireless/silabs/ F: drivers/net/wireless/silabs/
@ -22243,9 +22327,7 @@ F: drivers/nvmem/layouts/sl28vpd.c
SLAB ALLOCATOR SLAB ALLOCATOR
M: Christoph Lameter <cl@linux.com> M: Christoph Lameter <cl@linux.com>
M: Pekka Enberg <penberg@kernel.org>
M: David Rientjes <rientjes@google.com> M: David Rientjes <rientjes@google.com>
M: Joonsoo Kim <iamjoonsoo.kim@lge.com>
M: Andrew Morton <akpm@linux-foundation.org> M: Andrew Morton <akpm@linux-foundation.org>
M: Vlastimil Babka <vbabka@suse.cz> M: Vlastimil Babka <vbabka@suse.cz>
R: Roman Gushchin <roman.gushchin@linux.dev> R: Roman Gushchin <roman.gushchin@linux.dev>
@ -22660,9 +22742,15 @@ T: git git://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git
F: Documentation/devicetree/bindings/sound/ F: Documentation/devicetree/bindings/sound/
F: Documentation/sound/soc/ F: Documentation/sound/soc/
F: include/dt-bindings/sound/ F: include/dt-bindings/sound/
F: include/sound/cs-amp-lib.h
F: include/sound/cs35l*
F: include/sound/cs4271.h
F: include/sound/cs42l*
F: include/sound/madera-pdata.h
F: include/sound/soc* F: include/sound/soc*
F: include/sound/sof.h F: include/sound/sof.h
F: include/sound/sof/ F: include/sound/sof/
F: include/sound/wm*.h
F: include/trace/events/sof*.h F: include/trace/events/sof*.h
F: include/uapi/sound/asoc.h F: include/uapi/sound/asoc.h
F: sound/soc/ F: sound/soc/
@ -25132,9 +25220,13 @@ S: Maintained
F: drivers/usb/typec/mux/pi3usb30532.c F: drivers/usb/typec/mux/pi3usb30532.c
USB TYPEC PORT CONTROLLER DRIVERS USB TYPEC PORT CONTROLLER DRIVERS
M: Badhri Jagan Sridharan <badhri@google.com>
L: linux-usb@vger.kernel.org L: linux-usb@vger.kernel.org
S: Orphan S: Maintained
F: drivers/usb/typec/tcpm/ F: drivers/usb/typec/tcpm/tcpci.c
F: drivers/usb/typec/tcpm/tcpm.c
F: include/linux/usb/tcpci.h
F: include/linux/usb/tcpm.h
USB TYPEC TUSB1046 MUX DRIVER USB TYPEC TUSB1046 MUX DRIVER
M: Romain Gantois <romain.gantois@bootlin.com> M: Romain Gantois <romain.gantois@bootlin.com>

View file

@ -2,7 +2,7 @@
VERSION = 6 VERSION = 6
PATCHLEVEL = 15 PATCHLEVEL = 15
SUBLEVEL = 0 SUBLEVEL = 0
EXTRAVERSION = -rc2 EXTRAVERSION = -rc5
NAME = Baby Opossum Posse NAME = Baby Opossum Posse
# *DOCUMENTATION* # *DOCUMENTATION*
@ -477,7 +477,6 @@ export rust_common_flags := --edition=2021 \
-Wclippy::ignored_unit_patterns \ -Wclippy::ignored_unit_patterns \
-Wclippy::mut_mut \ -Wclippy::mut_mut \
-Wclippy::needless_bitwise_bool \ -Wclippy::needless_bitwise_bool \
-Wclippy::needless_continue \
-Aclippy::needless_lifetimes \ -Aclippy::needless_lifetimes \
-Wclippy::no_mangle_with_rust_abi \ -Wclippy::no_mangle_with_rust_abi \
-Wclippy::undocumented_unsafe_blocks \ -Wclippy::undocumented_unsafe_blocks \
@ -1053,10 +1052,6 @@ NOSTDINC_FLAGS += -nostdinc
# perform bounds checking. # perform bounds checking.
KBUILD_CFLAGS += $(call cc-option, -fstrict-flex-arrays=3) KBUILD_CFLAGS += $(call cc-option, -fstrict-flex-arrays=3)
#Currently, disable -Wstringop-overflow for GCC 11, globally.
KBUILD_CFLAGS-$(CONFIG_CC_NO_STRINGOP_OVERFLOW) += $(call cc-option, -Wno-stringop-overflow)
KBUILD_CFLAGS-$(CONFIG_CC_STRINGOP_OVERFLOW) += $(call cc-option, -Wstringop-overflow)
# disable invalid "can't wrap" optimizations for signed / pointers # disable invalid "can't wrap" optimizations for signed / pointers
KBUILD_CFLAGS += -fno-strict-overflow KBUILD_CFLAGS += -fno-strict-overflow

View file

@ -1588,4 +1588,9 @@ void kvm_set_vm_id_reg(struct kvm *kvm, u32 reg, u64 val);
#define kvm_has_s1poe(k) \ #define kvm_has_s1poe(k) \
(kvm_has_feat((k), ID_AA64MMFR3_EL1, S1POE, IMP)) (kvm_has_feat((k), ID_AA64MMFR3_EL1, S1POE, IMP))
static inline bool kvm_arch_has_irq_bypass(void)
{
return true;
}
#endif /* __ARM64_KVM_HOST_H__ */ #endif /* __ARM64_KVM_HOST_H__ */

View file

@ -94,17 +94,6 @@ static inline bool kaslr_requires_kpti(void)
return false; return false;
} }
/*
* Systems affected by Cavium erratum 24756 are incompatible
* with KPTI.
*/
if (IS_ENABLED(CONFIG_CAVIUM_ERRATUM_27456)) {
extern const struct midr_range cavium_erratum_27456_cpus[];
if (is_midr_in_range_list(cavium_erratum_27456_cpus))
return false;
}
return true; return true;
} }

View file

@ -335,7 +335,7 @@ static const struct midr_range cavium_erratum_23154_cpus[] = {
#endif #endif
#ifdef CONFIG_CAVIUM_ERRATUM_27456 #ifdef CONFIG_CAVIUM_ERRATUM_27456
const struct midr_range cavium_erratum_27456_cpus[] = { static const struct midr_range cavium_erratum_27456_cpus[] = {
/* Cavium ThunderX, T88 pass 1.x - 2.1 */ /* Cavium ThunderX, T88 pass 1.x - 2.1 */
MIDR_RANGE(MIDR_THUNDERX, 0, 0, 1, 1), MIDR_RANGE(MIDR_THUNDERX, 0, 0, 1, 1),
/* Cavium ThunderX, T81 pass 1.0 */ /* Cavium ThunderX, T81 pass 1.0 */

View file

@ -47,10 +47,6 @@ PROVIDE(__pi_id_aa64smfr0_override = id_aa64smfr0_override);
PROVIDE(__pi_id_aa64zfr0_override = id_aa64zfr0_override); PROVIDE(__pi_id_aa64zfr0_override = id_aa64zfr0_override);
PROVIDE(__pi_arm64_sw_feature_override = arm64_sw_feature_override); PROVIDE(__pi_arm64_sw_feature_override = arm64_sw_feature_override);
PROVIDE(__pi_arm64_use_ng_mappings = arm64_use_ng_mappings); PROVIDE(__pi_arm64_use_ng_mappings = arm64_use_ng_mappings);
#ifdef CONFIG_CAVIUM_ERRATUM_27456
PROVIDE(__pi_cavium_erratum_27456_cpus = cavium_erratum_27456_cpus);
PROVIDE(__pi_is_midr_in_range_list = is_midr_in_range_list);
#endif
PROVIDE(__pi__ctype = _ctype); PROVIDE(__pi__ctype = _ctype);
PROVIDE(__pi_memstart_offset_seed = memstart_offset_seed); PROVIDE(__pi_memstart_offset_seed = memstart_offset_seed);

View file

@ -207,6 +207,29 @@ static void __init map_fdt(u64 fdt)
dsb(ishst); dsb(ishst);
} }
/*
* PI version of the Cavium Eratum 27456 detection, which makes it
* impossible to use non-global mappings.
*/
static bool __init ng_mappings_allowed(void)
{
static const struct midr_range cavium_erratum_27456_cpus[] __initconst = {
/* Cavium ThunderX, T88 pass 1.x - 2.1 */
MIDR_RANGE(MIDR_THUNDERX, 0, 0, 1, 1),
/* Cavium ThunderX, T81 pass 1.0 */
MIDR_REV(MIDR_THUNDERX_81XX, 0, 0),
{},
};
for (const struct midr_range *r = cavium_erratum_27456_cpus; r->model; r++) {
if (midr_is_cpu_model_range(read_cpuid_id(), r->model,
r->rv_min, r->rv_max))
return false;
}
return true;
}
asmlinkage void __init early_map_kernel(u64 boot_status, void *fdt) asmlinkage void __init early_map_kernel(u64 boot_status, void *fdt)
{ {
static char const chosen_str[] __initconst = "/chosen"; static char const chosen_str[] __initconst = "/chosen";
@ -246,7 +269,7 @@ asmlinkage void __init early_map_kernel(u64 boot_status, void *fdt)
u64 kaslr_seed = kaslr_early_init(fdt, chosen); u64 kaslr_seed = kaslr_early_init(fdt, chosen);
if (kaslr_seed && kaslr_requires_kpti()) if (kaslr_seed && kaslr_requires_kpti())
arm64_use_ng_mappings = true; arm64_use_ng_mappings = ng_mappings_allowed();
kaslr_offset |= kaslr_seed & ~(MIN_KIMG_ALIGN - 1); kaslr_offset |= kaslr_seed & ~(MIN_KIMG_ALIGN - 1);
} }

View file

@ -879,10 +879,12 @@ static u8 spectre_bhb_loop_affected(void)
static const struct midr_range spectre_bhb_k132_list[] = { static const struct midr_range spectre_bhb_k132_list[] = {
MIDR_ALL_VERSIONS(MIDR_CORTEX_X3), MIDR_ALL_VERSIONS(MIDR_CORTEX_X3),
MIDR_ALL_VERSIONS(MIDR_NEOVERSE_V2), MIDR_ALL_VERSIONS(MIDR_NEOVERSE_V2),
{},
}; };
static const struct midr_range spectre_bhb_k38_list[] = { static const struct midr_range spectre_bhb_k38_list[] = {
MIDR_ALL_VERSIONS(MIDR_CORTEX_A715), MIDR_ALL_VERSIONS(MIDR_CORTEX_A715),
MIDR_ALL_VERSIONS(MIDR_CORTEX_A720), MIDR_ALL_VERSIONS(MIDR_CORTEX_A720),
{},
}; };
static const struct midr_range spectre_bhb_k32_list[] = { static const struct midr_range spectre_bhb_k32_list[] = {
MIDR_ALL_VERSIONS(MIDR_CORTEX_A78), MIDR_ALL_VERSIONS(MIDR_CORTEX_A78),

View file

@ -2743,11 +2743,6 @@ bool kvm_arch_irqchip_in_kernel(struct kvm *kvm)
return irqchip_in_kernel(kvm); return irqchip_in_kernel(kvm);
} }
bool kvm_arch_has_irq_bypass(void)
{
return true;
}
int kvm_arch_irq_bypass_add_producer(struct irq_bypass_consumer *cons, int kvm_arch_irq_bypass_add_producer(struct irq_bypass_consumer *cons,
struct irq_bypass_producer *prod) struct irq_bypass_producer *prod)
{ {

View file

@ -73,6 +73,7 @@ config LOONGARCH
select ARCH_SUPPORTS_RT select ARCH_SUPPORTS_RT
select ARCH_USE_BUILTIN_BSWAP select ARCH_USE_BUILTIN_BSWAP
select ARCH_USE_CMPXCHG_LOCKREF select ARCH_USE_CMPXCHG_LOCKREF
select ARCH_USE_MEMTEST
select ARCH_USE_QUEUED_RWLOCKS select ARCH_USE_QUEUED_RWLOCKS
select ARCH_USE_QUEUED_SPINLOCKS select ARCH_USE_QUEUED_SPINLOCKS
select ARCH_WANT_DEFAULT_BPF_JIT select ARCH_WANT_DEFAULT_BPF_JIT

View file

@ -22,22 +22,29 @@
struct sigcontext; struct sigcontext;
#define kernel_fpu_available() cpu_has_fpu #define kernel_fpu_available() cpu_has_fpu
extern void kernel_fpu_begin(void);
extern void kernel_fpu_end(void);
extern void _init_fpu(unsigned int); void kernel_fpu_begin(void);
extern void _save_fp(struct loongarch_fpu *); void kernel_fpu_end(void);
extern void _restore_fp(struct loongarch_fpu *);
extern void _save_lsx(struct loongarch_fpu *fpu); asmlinkage void _init_fpu(unsigned int);
extern void _restore_lsx(struct loongarch_fpu *fpu); asmlinkage void _save_fp(struct loongarch_fpu *);
extern void _init_lsx_upper(void); asmlinkage void _restore_fp(struct loongarch_fpu *);
extern void _restore_lsx_upper(struct loongarch_fpu *fpu); asmlinkage int _save_fp_context(void __user *fpregs, void __user *fcc, void __user *csr);
asmlinkage int _restore_fp_context(void __user *fpregs, void __user *fcc, void __user *csr);
extern void _save_lasx(struct loongarch_fpu *fpu); asmlinkage void _save_lsx(struct loongarch_fpu *fpu);
extern void _restore_lasx(struct loongarch_fpu *fpu); asmlinkage void _restore_lsx(struct loongarch_fpu *fpu);
extern void _init_lasx_upper(void); asmlinkage void _init_lsx_upper(void);
extern void _restore_lasx_upper(struct loongarch_fpu *fpu); asmlinkage void _restore_lsx_upper(struct loongarch_fpu *fpu);
asmlinkage int _save_lsx_context(void __user *fpregs, void __user *fcc, void __user *fcsr);
asmlinkage int _restore_lsx_context(void __user *fpregs, void __user *fcc, void __user *fcsr);
asmlinkage void _save_lasx(struct loongarch_fpu *fpu);
asmlinkage void _restore_lasx(struct loongarch_fpu *fpu);
asmlinkage void _init_lasx_upper(void);
asmlinkage void _restore_lasx_upper(struct loongarch_fpu *fpu);
asmlinkage int _save_lasx_context(void __user *fpregs, void __user *fcc, void __user *fcsr);
asmlinkage int _restore_lasx_context(void __user *fpregs, void __user *fcc, void __user *fcsr);
static inline void enable_lsx(void); static inline void enable_lsx(void);
static inline void disable_lsx(void); static inline void disable_lsx(void);

View file

@ -12,9 +12,13 @@
#include <asm/loongarch.h> #include <asm/loongarch.h>
#include <asm/processor.h> #include <asm/processor.h>
extern void _init_lbt(void); asmlinkage void _init_lbt(void);
extern void _save_lbt(struct loongarch_lbt *); asmlinkage void _save_lbt(struct loongarch_lbt *);
extern void _restore_lbt(struct loongarch_lbt *); asmlinkage void _restore_lbt(struct loongarch_lbt *);
asmlinkage int _save_lbt_context(void __user *regs, void __user *eflags);
asmlinkage int _restore_lbt_context(void __user *regs, void __user *eflags);
asmlinkage int _save_ftop_context(void __user *ftop);
asmlinkage int _restore_ftop_context(void __user *ftop);
static inline int is_lbt_enabled(void) static inline int is_lbt_enabled(void)
{ {

View file

@ -33,9 +33,9 @@ struct pt_regs {
unsigned long __last[]; unsigned long __last[];
} __aligned(8); } __aligned(8);
static inline int regs_irqs_disabled(struct pt_regs *regs) static __always_inline bool regs_irqs_disabled(struct pt_regs *regs)
{ {
return arch_irqs_disabled_flags(regs->csr_prmd); return !(regs->csr_prmd & CSR_PRMD_PIE);
} }
static inline unsigned long kernel_stack_pointer(struct pt_regs *regs) static inline unsigned long kernel_stack_pointer(struct pt_regs *regs)

View file

@ -21,10 +21,10 @@ obj-$(CONFIG_CPU_HAS_LBT) += lbt.o
obj-$(CONFIG_ARCH_STRICT_ALIGN) += unaligned.o obj-$(CONFIG_ARCH_STRICT_ALIGN) += unaligned.o
CFLAGS_module.o += $(call cc-option,-Wno-override-init,) CFLAGS_module.o += $(call cc-disable-warning, override-init)
CFLAGS_syscall.o += $(call cc-option,-Wno-override-init,) CFLAGS_syscall.o += $(call cc-disable-warning, override-init)
CFLAGS_traps.o += $(call cc-option,-Wno-override-init,) CFLAGS_traps.o += $(call cc-disable-warning, override-init)
CFLAGS_perf_event.o += $(call cc-option,-Wno-override-init,) CFLAGS_perf_event.o += $(call cc-disable-warning, override-init)
ifdef CONFIG_FUNCTION_TRACER ifdef CONFIG_FUNCTION_TRACER
ifndef CONFIG_DYNAMIC_FTRACE ifndef CONFIG_DYNAMIC_FTRACE

View file

@ -458,6 +458,7 @@ SYM_FUNC_START(_save_fp_context)
li.w a0, 0 # success li.w a0, 0 # success
jr ra jr ra
SYM_FUNC_END(_save_fp_context) SYM_FUNC_END(_save_fp_context)
EXPORT_SYMBOL_GPL(_save_fp_context)
/* /*
* a0: fpregs * a0: fpregs
@ -471,6 +472,7 @@ SYM_FUNC_START(_restore_fp_context)
li.w a0, 0 # success li.w a0, 0 # success
jr ra jr ra
SYM_FUNC_END(_restore_fp_context) SYM_FUNC_END(_restore_fp_context)
EXPORT_SYMBOL_GPL(_restore_fp_context)
/* /*
* a0: fpregs * a0: fpregs
@ -484,6 +486,7 @@ SYM_FUNC_START(_save_lsx_context)
li.w a0, 0 # success li.w a0, 0 # success
jr ra jr ra
SYM_FUNC_END(_save_lsx_context) SYM_FUNC_END(_save_lsx_context)
EXPORT_SYMBOL_GPL(_save_lsx_context)
/* /*
* a0: fpregs * a0: fpregs
@ -497,6 +500,7 @@ SYM_FUNC_START(_restore_lsx_context)
li.w a0, 0 # success li.w a0, 0 # success
jr ra jr ra
SYM_FUNC_END(_restore_lsx_context) SYM_FUNC_END(_restore_lsx_context)
EXPORT_SYMBOL_GPL(_restore_lsx_context)
/* /*
* a0: fpregs * a0: fpregs
@ -510,6 +514,7 @@ SYM_FUNC_START(_save_lasx_context)
li.w a0, 0 # success li.w a0, 0 # success
jr ra jr ra
SYM_FUNC_END(_save_lasx_context) SYM_FUNC_END(_save_lasx_context)
EXPORT_SYMBOL_GPL(_save_lasx_context)
/* /*
* a0: fpregs * a0: fpregs
@ -523,6 +528,7 @@ SYM_FUNC_START(_restore_lasx_context)
li.w a0, 0 # success li.w a0, 0 # success
jr ra jr ra
SYM_FUNC_END(_restore_lasx_context) SYM_FUNC_END(_restore_lasx_context)
EXPORT_SYMBOL_GPL(_restore_lasx_context)
.L_fpu_fault: .L_fpu_fault:
li.w a0, -EFAULT # failure li.w a0, -EFAULT # failure

View file

@ -90,6 +90,7 @@ SYM_FUNC_START(_save_lbt_context)
li.w a0, 0 # success li.w a0, 0 # success
jr ra jr ra
SYM_FUNC_END(_save_lbt_context) SYM_FUNC_END(_save_lbt_context)
EXPORT_SYMBOL_GPL(_save_lbt_context)
/* /*
* a0: scr * a0: scr
@ -110,6 +111,7 @@ SYM_FUNC_START(_restore_lbt_context)
li.w a0, 0 # success li.w a0, 0 # success
jr ra jr ra
SYM_FUNC_END(_restore_lbt_context) SYM_FUNC_END(_restore_lbt_context)
EXPORT_SYMBOL_GPL(_restore_lbt_context)
/* /*
* a0: ftop * a0: ftop
@ -120,6 +122,7 @@ SYM_FUNC_START(_save_ftop_context)
li.w a0, 0 # success li.w a0, 0 # success
jr ra jr ra
SYM_FUNC_END(_save_ftop_context) SYM_FUNC_END(_save_ftop_context)
EXPORT_SYMBOL_GPL(_save_ftop_context)
/* /*
* a0: ftop * a0: ftop
@ -150,6 +153,7 @@ SYM_FUNC_START(_restore_ftop_context)
li.w a0, 0 # success li.w a0, 0 # success
jr ra jr ra
SYM_FUNC_END(_restore_ftop_context) SYM_FUNC_END(_restore_ftop_context)
EXPORT_SYMBOL_GPL(_restore_ftop_context)
.L_lbt_fault: .L_lbt_fault:
li.w a0, -EFAULT # failure li.w a0, -EFAULT # failure

View file

@ -51,27 +51,6 @@
#define lock_lbt_owner() ({ preempt_disable(); pagefault_disable(); }) #define lock_lbt_owner() ({ preempt_disable(); pagefault_disable(); })
#define unlock_lbt_owner() ({ pagefault_enable(); preempt_enable(); }) #define unlock_lbt_owner() ({ pagefault_enable(); preempt_enable(); })
/* Assembly functions to move context to/from the FPU */
extern asmlinkage int
_save_fp_context(void __user *fpregs, void __user *fcc, void __user *csr);
extern asmlinkage int
_restore_fp_context(void __user *fpregs, void __user *fcc, void __user *csr);
extern asmlinkage int
_save_lsx_context(void __user *fpregs, void __user *fcc, void __user *fcsr);
extern asmlinkage int
_restore_lsx_context(void __user *fpregs, void __user *fcc, void __user *fcsr);
extern asmlinkage int
_save_lasx_context(void __user *fpregs, void __user *fcc, void __user *fcsr);
extern asmlinkage int
_restore_lasx_context(void __user *fpregs, void __user *fcc, void __user *fcsr);
#ifdef CONFIG_CPU_HAS_LBT
extern asmlinkage int _save_lbt_context(void __user *regs, void __user *eflags);
extern asmlinkage int _restore_lbt_context(void __user *regs, void __user *eflags);
extern asmlinkage int _save_ftop_context(void __user *ftop);
extern asmlinkage int _restore_ftop_context(void __user *ftop);
#endif
struct rt_sigframe { struct rt_sigframe {
struct siginfo rs_info; struct siginfo rs_info;
struct ucontext rs_uctx; struct ucontext rs_uctx;

View file

@ -553,9 +553,10 @@ asmlinkage void noinstr do_ale(struct pt_regs *regs)
die_if_kernel("Kernel ale access", regs); die_if_kernel("Kernel ale access", regs);
force_sig_fault(SIGBUS, BUS_ADRALN, (void __user *)regs->csr_badvaddr); force_sig_fault(SIGBUS, BUS_ADRALN, (void __user *)regs->csr_badvaddr);
#else #else
bool pie = regs_irqs_disabled(regs);
unsigned int *pc; unsigned int *pc;
if (regs->csr_prmd & CSR_PRMD_PIE) if (!pie)
local_irq_enable(); local_irq_enable();
perf_sw_event(PERF_COUNT_SW_ALIGNMENT_FAULTS, 1, regs, regs->csr_badvaddr); perf_sw_event(PERF_COUNT_SW_ALIGNMENT_FAULTS, 1, regs, regs->csr_badvaddr);
@ -582,7 +583,7 @@ sigbus:
die_if_kernel("Kernel ale access", regs); die_if_kernel("Kernel ale access", regs);
force_sig_fault(SIGBUS, BUS_ADRALN, (void __user *)regs->csr_badvaddr); force_sig_fault(SIGBUS, BUS_ADRALN, (void __user *)regs->csr_badvaddr);
out: out:
if (regs->csr_prmd & CSR_PRMD_PIE) if (!pie)
local_irq_disable(); local_irq_disable();
#endif #endif
irqentry_exit(regs, state); irqentry_exit(regs, state);
@ -621,12 +622,13 @@ static void bug_handler(struct pt_regs *regs)
asmlinkage void noinstr do_bce(struct pt_regs *regs) asmlinkage void noinstr do_bce(struct pt_regs *regs)
{ {
bool user = user_mode(regs); bool user = user_mode(regs);
bool pie = regs_irqs_disabled(regs);
unsigned long era = exception_era(regs); unsigned long era = exception_era(regs);
u64 badv = 0, lower = 0, upper = ULONG_MAX; u64 badv = 0, lower = 0, upper = ULONG_MAX;
union loongarch_instruction insn; union loongarch_instruction insn;
irqentry_state_t state = irqentry_enter(regs); irqentry_state_t state = irqentry_enter(regs);
if (regs->csr_prmd & CSR_PRMD_PIE) if (!pie)
local_irq_enable(); local_irq_enable();
current->thread.trap_nr = read_csr_excode(); current->thread.trap_nr = read_csr_excode();
@ -692,7 +694,7 @@ asmlinkage void noinstr do_bce(struct pt_regs *regs)
force_sig_bnderr((void __user *)badv, (void __user *)lower, (void __user *)upper); force_sig_bnderr((void __user *)badv, (void __user *)lower, (void __user *)upper);
out: out:
if (regs->csr_prmd & CSR_PRMD_PIE) if (!pie)
local_irq_disable(); local_irq_disable();
irqentry_exit(regs, state); irqentry_exit(regs, state);
@ -710,11 +712,12 @@ bad_era:
asmlinkage void noinstr do_bp(struct pt_regs *regs) asmlinkage void noinstr do_bp(struct pt_regs *regs)
{ {
bool user = user_mode(regs); bool user = user_mode(regs);
bool pie = regs_irqs_disabled(regs);
unsigned int opcode, bcode; unsigned int opcode, bcode;
unsigned long era = exception_era(regs); unsigned long era = exception_era(regs);
irqentry_state_t state = irqentry_enter(regs); irqentry_state_t state = irqentry_enter(regs);
if (regs->csr_prmd & CSR_PRMD_PIE) if (!pie)
local_irq_enable(); local_irq_enable();
if (__get_inst(&opcode, (u32 *)era, user)) if (__get_inst(&opcode, (u32 *)era, user))
@ -780,7 +783,7 @@ asmlinkage void noinstr do_bp(struct pt_regs *regs)
} }
out: out:
if (regs->csr_prmd & CSR_PRMD_PIE) if (!pie)
local_irq_disable(); local_irq_disable();
irqentry_exit(regs, state); irqentry_exit(regs, state);
@ -1015,6 +1018,7 @@ static void init_restore_lbt(void)
asmlinkage void noinstr do_lbt(struct pt_regs *regs) asmlinkage void noinstr do_lbt(struct pt_regs *regs)
{ {
bool pie = regs_irqs_disabled(regs);
irqentry_state_t state = irqentry_enter(regs); irqentry_state_t state = irqentry_enter(regs);
/* /*
@ -1024,7 +1028,7 @@ asmlinkage void noinstr do_lbt(struct pt_regs *regs)
* (including the user using 'MOVGR2GCSR' to turn on TM, which * (including the user using 'MOVGR2GCSR' to turn on TM, which
* will not trigger the BTE), we need to check PRMD first. * will not trigger the BTE), we need to check PRMD first.
*/ */
if (regs->csr_prmd & CSR_PRMD_PIE) if (!pie)
local_irq_enable(); local_irq_enable();
if (!cpu_has_lbt) { if (!cpu_has_lbt) {
@ -1038,7 +1042,7 @@ asmlinkage void noinstr do_lbt(struct pt_regs *regs)
preempt_enable(); preempt_enable();
out: out:
if (regs->csr_prmd & CSR_PRMD_PIE) if (!pie)
local_irq_disable(); local_irq_disable();
irqentry_exit(regs, state); irqentry_exit(regs, state);

View file

@ -21,4 +21,4 @@ kvm-y += intc/eiointc.o
kvm-y += intc/pch_pic.o kvm-y += intc/pch_pic.o
kvm-y += irqfd.o kvm-y += irqfd.o
CFLAGS_exit.o += $(call cc-option,-Wno-override-init,) CFLAGS_exit.o += $(call cc-disable-warning, override-init)

View file

@ -111,7 +111,7 @@ static int send_ipi_data(struct kvm_vcpu *vcpu, gpa_t addr, uint64_t data)
ret = kvm_io_bus_read(vcpu, KVM_IOCSR_BUS, addr, sizeof(val), &val); ret = kvm_io_bus_read(vcpu, KVM_IOCSR_BUS, addr, sizeof(val), &val);
srcu_read_unlock(&vcpu->kvm->srcu, idx); srcu_read_unlock(&vcpu->kvm->srcu, idx);
if (unlikely(ret)) { if (unlikely(ret)) {
kvm_err("%s: : read date from addr %llx failed\n", __func__, addr); kvm_err("%s: : read data from addr %llx failed\n", __func__, addr);
return ret; return ret;
} }
/* Construct the mask by scanning the bit 27-30 */ /* Construct the mask by scanning the bit 27-30 */
@ -127,7 +127,7 @@ static int send_ipi_data(struct kvm_vcpu *vcpu, gpa_t addr, uint64_t data)
ret = kvm_io_bus_write(vcpu, KVM_IOCSR_BUS, addr, sizeof(val), &val); ret = kvm_io_bus_write(vcpu, KVM_IOCSR_BUS, addr, sizeof(val), &val);
srcu_read_unlock(&vcpu->kvm->srcu, idx); srcu_read_unlock(&vcpu->kvm->srcu, idx);
if (unlikely(ret)) if (unlikely(ret))
kvm_err("%s: : write date to addr %llx failed\n", __func__, addr); kvm_err("%s: : write data to addr %llx failed\n", __func__, addr);
return ret; return ret;
} }

View file

@ -296,10 +296,10 @@ int kvm_arch_enable_virtualization_cpu(void)
/* /*
* Enable virtualization features granting guest direct control of * Enable virtualization features granting guest direct control of
* certain features: * certain features:
* GCI=2: Trap on init or unimplement cache instruction. * GCI=2: Trap on init or unimplemented cache instruction.
* TORU=0: Trap on Root Unimplement. * TORU=0: Trap on Root Unimplement.
* CACTRL=1: Root control cache. * CACTRL=1: Root control cache.
* TOP=0: Trap on Previlege. * TOP=0: Trap on Privilege.
* TOE=0: Trap on Exception. * TOE=0: Trap on Exception.
* TIT=0: Trap on Timer. * TIT=0: Trap on Timer.
*/ */

View file

@ -294,6 +294,7 @@ static int kvm_pre_enter_guest(struct kvm_vcpu *vcpu)
vcpu->arch.aux_inuse &= ~KVM_LARCH_SWCSR_LATEST; vcpu->arch.aux_inuse &= ~KVM_LARCH_SWCSR_LATEST;
if (kvm_request_pending(vcpu) || xfer_to_guest_mode_work_pending()) { if (kvm_request_pending(vcpu) || xfer_to_guest_mode_work_pending()) {
kvm_lose_pmu(vcpu);
/* make sure the vcpu mode has been written */ /* make sure the vcpu mode has been written */
smp_store_mb(vcpu->mode, OUTSIDE_GUEST_MODE); smp_store_mb(vcpu->mode, OUTSIDE_GUEST_MODE);
local_irq_enable(); local_irq_enable();
@ -902,6 +903,13 @@ static int kvm_set_one_reg(struct kvm_vcpu *vcpu,
vcpu->arch.st.guest_addr = 0; vcpu->arch.st.guest_addr = 0;
memset(&vcpu->arch.irq_pending, 0, sizeof(vcpu->arch.irq_pending)); memset(&vcpu->arch.irq_pending, 0, sizeof(vcpu->arch.irq_pending));
memset(&vcpu->arch.irq_clear, 0, sizeof(vcpu->arch.irq_clear)); memset(&vcpu->arch.irq_clear, 0, sizeof(vcpu->arch.irq_clear));
/*
* When vCPU reset, clear the ESTAT and GINTC registers
* Other CSR registers are cleared with function _kvm_setcsr().
*/
kvm_write_sw_gcsr(vcpu->arch.csr, LOONGARCH_CSR_GINTC, 0);
kvm_write_sw_gcsr(vcpu->arch.csr, LOONGARCH_CSR_ESTAT, 0);
break; break;
default: default:
ret = -EINVAL; ret = -EINVAL;

View file

@ -47,7 +47,7 @@ pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr,
pmd = pmd_offset(pud, addr); pmd = pmd_offset(pud, addr);
} }
} }
return (pte_t *) pmd; return pmd_none(pmdp_get(pmd)) ? NULL : (pte_t *) pmd;
} }
uint64_t pmd_to_entrylo(unsigned long pmd_val) uint64_t pmd_to_entrylo(unsigned long pmd_val)

View file

@ -65,9 +65,6 @@ void __init paging_init(void)
{ {
unsigned long max_zone_pfns[MAX_NR_ZONES]; unsigned long max_zone_pfns[MAX_NR_ZONES];
#ifdef CONFIG_ZONE_DMA
max_zone_pfns[ZONE_DMA] = MAX_DMA_PFN;
#endif
#ifdef CONFIG_ZONE_DMA32 #ifdef CONFIG_ZONE_DMA32
max_zone_pfns[ZONE_DMA32] = MAX_DMA32_PFN; max_zone_pfns[ZONE_DMA32] = MAX_DMA32_PFN;
#endif #endif

View file

@ -23,6 +23,9 @@
*/ */
extern void local_dcache_page_flush(struct page *page); extern void local_dcache_page_flush(struct page *page);
extern void local_icache_page_inv(struct page *page); extern void local_icache_page_inv(struct page *page);
extern void local_dcache_range_flush(unsigned long start, unsigned long end);
extern void local_dcache_range_inv(unsigned long start, unsigned long end);
extern void local_icache_range_inv(unsigned long start, unsigned long end);
/* /*
* Data cache flushing always happen on the local cpu. Instruction cache * Data cache flushing always happen on the local cpu. Instruction cache
@ -38,6 +41,20 @@ extern void local_icache_page_inv(struct page *page);
extern void smp_icache_page_inv(struct page *page); extern void smp_icache_page_inv(struct page *page);
#endif /* CONFIG_SMP */ #endif /* CONFIG_SMP */
/*
* Even if the actual block size is larger than L1_CACHE_BYTES, paddr
* can be incremented by L1_CACHE_BYTES. When paddr is written to the
* invalidate register, the entire cache line encompassing this address
* is invalidated. Each subsequent reference to the same cache line will
* not affect the invalidation process.
*/
#define local_dcache_block_flush(addr) \
local_dcache_range_flush(addr, addr + L1_CACHE_BYTES)
#define local_dcache_block_inv(addr) \
local_dcache_range_inv(addr, addr + L1_CACHE_BYTES)
#define local_icache_block_inv(addr) \
local_icache_range_inv(addr, addr + L1_CACHE_BYTES)
/* /*
* Synchronizes caches. Whenever a cpu writes executable code to memory, this * Synchronizes caches. Whenever a cpu writes executable code to memory, this
* should be called to make sure the processor sees the newly written code. * should be called to make sure the processor sees the newly written code.

View file

@ -15,16 +15,21 @@
#ifndef __ASM_OPENRISC_CPUINFO_H #ifndef __ASM_OPENRISC_CPUINFO_H
#define __ASM_OPENRISC_CPUINFO_H #define __ASM_OPENRISC_CPUINFO_H
#include <asm/spr.h>
#include <asm/spr_defs.h>
struct cache_desc {
u32 size;
u32 sets;
u32 block_size;
u32 ways;
};
struct cpuinfo_or1k { struct cpuinfo_or1k {
u32 clock_frequency; u32 clock_frequency;
u32 icache_size; struct cache_desc icache;
u32 icache_block_size; struct cache_desc dcache;
u32 icache_ways;
u32 dcache_size;
u32 dcache_block_size;
u32 dcache_ways;
u16 coreid; u16 coreid;
}; };
@ -32,4 +37,9 @@ struct cpuinfo_or1k {
extern struct cpuinfo_or1k cpuinfo_or1k[NR_CPUS]; extern struct cpuinfo_or1k cpuinfo_or1k[NR_CPUS];
extern void setup_cpuinfo(void); extern void setup_cpuinfo(void);
/*
* Check if the cache component exists.
*/
extern bool cpu_cache_is_present(const unsigned int cache_type);
#endif /* __ASM_OPENRISC_CPUINFO_H */ #endif /* __ASM_OPENRISC_CPUINFO_H */

View file

@ -7,7 +7,7 @@ extra-y := vmlinux.lds
obj-y := head.o setup.o or32_ksyms.o process.o dma.o \ obj-y := head.o setup.o or32_ksyms.o process.o dma.o \
traps.o time.o irq.o entry.o ptrace.o signal.o \ traps.o time.o irq.o entry.o ptrace.o signal.o \
sys_call_table.o unwinder.o sys_call_table.o unwinder.o cacheinfo.o
obj-$(CONFIG_SMP) += smp.o sync-timer.o obj-$(CONFIG_SMP) += smp.o sync-timer.o
obj-$(CONFIG_STACKTRACE) += stacktrace.o obj-$(CONFIG_STACKTRACE) += stacktrace.o

View file

@ -0,0 +1,104 @@
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* OpenRISC cacheinfo support
*
* Based on work done for MIPS and LoongArch. All original copyrights
* apply as per the original source declaration.
*
* OpenRISC implementation:
* Copyright (C) 2025 Sahil Siddiq <sahilcdq@proton.me>
*/
#include <linux/cacheinfo.h>
#include <asm/cpuinfo.h>
#include <asm/spr.h>
#include <asm/spr_defs.h>
static inline void ci_leaf_init(struct cacheinfo *this_leaf, enum cache_type type,
unsigned int level, struct cache_desc *cache, int cpu)
{
this_leaf->type = type;
this_leaf->level = level;
this_leaf->coherency_line_size = cache->block_size;
this_leaf->number_of_sets = cache->sets;
this_leaf->ways_of_associativity = cache->ways;
this_leaf->size = cache->size;
cpumask_set_cpu(cpu, &this_leaf->shared_cpu_map);
}
int init_cache_level(unsigned int cpu)
{
struct cpuinfo_or1k *cpuinfo = &cpuinfo_or1k[smp_processor_id()];
struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu);
int leaves = 0, levels = 0;
unsigned long upr = mfspr(SPR_UPR);
unsigned long iccfgr, dccfgr;
if (!(upr & SPR_UPR_UP)) {
printk(KERN_INFO
"-- no UPR register... unable to detect configuration\n");
return -ENOENT;
}
if (cpu_cache_is_present(SPR_UPR_DCP)) {
dccfgr = mfspr(SPR_DCCFGR);
cpuinfo->dcache.ways = 1 << (dccfgr & SPR_DCCFGR_NCW);
cpuinfo->dcache.sets = 1 << ((dccfgr & SPR_DCCFGR_NCS) >> 3);
cpuinfo->dcache.block_size = 16 << ((dccfgr & SPR_DCCFGR_CBS) >> 7);
cpuinfo->dcache.size =
cpuinfo->dcache.sets * cpuinfo->dcache.ways * cpuinfo->dcache.block_size;
leaves += 1;
printk(KERN_INFO
"-- dcache: %d bytes total, %d bytes/line, %d set(s), %d way(s)\n",
cpuinfo->dcache.size, cpuinfo->dcache.block_size,
cpuinfo->dcache.sets, cpuinfo->dcache.ways);
} else
printk(KERN_INFO "-- dcache disabled\n");
if (cpu_cache_is_present(SPR_UPR_ICP)) {
iccfgr = mfspr(SPR_ICCFGR);
cpuinfo->icache.ways = 1 << (iccfgr & SPR_ICCFGR_NCW);
cpuinfo->icache.sets = 1 << ((iccfgr & SPR_ICCFGR_NCS) >> 3);
cpuinfo->icache.block_size = 16 << ((iccfgr & SPR_ICCFGR_CBS) >> 7);
cpuinfo->icache.size =
cpuinfo->icache.sets * cpuinfo->icache.ways * cpuinfo->icache.block_size;
leaves += 1;
printk(KERN_INFO
"-- icache: %d bytes total, %d bytes/line, %d set(s), %d way(s)\n",
cpuinfo->icache.size, cpuinfo->icache.block_size,
cpuinfo->icache.sets, cpuinfo->icache.ways);
} else
printk(KERN_INFO "-- icache disabled\n");
if (!leaves)
return -ENOENT;
levels = 1;
this_cpu_ci->num_leaves = leaves;
this_cpu_ci->num_levels = levels;
return 0;
}
int populate_cache_leaves(unsigned int cpu)
{
struct cpuinfo_or1k *cpuinfo = &cpuinfo_or1k[smp_processor_id()];
struct cpu_cacheinfo *this_cpu_ci = get_cpu_cacheinfo(cpu);
struct cacheinfo *this_leaf = this_cpu_ci->info_list;
int level = 1;
if (cpu_cache_is_present(SPR_UPR_DCP)) {
ci_leaf_init(this_leaf, CACHE_TYPE_DATA, level, &cpuinfo->dcache, cpu);
this_leaf->attributes = ((mfspr(SPR_DCCFGR) & SPR_DCCFGR_CWS) >> 8) ?
CACHE_WRITE_BACK : CACHE_WRITE_THROUGH;
this_leaf++;
}
if (cpu_cache_is_present(SPR_UPR_ICP))
ci_leaf_init(this_leaf, CACHE_TYPE_INST, level, &cpuinfo->icache, cpu);
this_cpu_ci->cpu_map_populated = true;
return 0;
}

View file

@ -17,6 +17,7 @@
#include <linux/pagewalk.h> #include <linux/pagewalk.h>
#include <asm/cpuinfo.h> #include <asm/cpuinfo.h>
#include <asm/cacheflush.h>
#include <asm/spr_defs.h> #include <asm/spr_defs.h>
#include <asm/tlbflush.h> #include <asm/tlbflush.h>
@ -24,9 +25,6 @@ static int
page_set_nocache(pte_t *pte, unsigned long addr, page_set_nocache(pte_t *pte, unsigned long addr,
unsigned long next, struct mm_walk *walk) unsigned long next, struct mm_walk *walk)
{ {
unsigned long cl;
struct cpuinfo_or1k *cpuinfo = &cpuinfo_or1k[smp_processor_id()];
pte_val(*pte) |= _PAGE_CI; pte_val(*pte) |= _PAGE_CI;
/* /*
@ -36,8 +34,7 @@ page_set_nocache(pte_t *pte, unsigned long addr,
flush_tlb_kernel_range(addr, addr + PAGE_SIZE); flush_tlb_kernel_range(addr, addr + PAGE_SIZE);
/* Flush page out of dcache */ /* Flush page out of dcache */
for (cl = __pa(addr); cl < __pa(next); cl += cpuinfo->dcache_block_size) local_dcache_range_flush(__pa(addr), __pa(next));
mtspr(SPR_DCBFR, cl);
return 0; return 0;
} }
@ -98,21 +95,14 @@ void arch_dma_clear_uncached(void *cpu_addr, size_t size)
void arch_sync_dma_for_device(phys_addr_t addr, size_t size, void arch_sync_dma_for_device(phys_addr_t addr, size_t size,
enum dma_data_direction dir) enum dma_data_direction dir)
{ {
unsigned long cl;
struct cpuinfo_or1k *cpuinfo = &cpuinfo_or1k[smp_processor_id()];
switch (dir) { switch (dir) {
case DMA_TO_DEVICE: case DMA_TO_DEVICE:
/* Flush the dcache for the requested range */ /* Flush the dcache for the requested range */
for (cl = addr; cl < addr + size; local_dcache_range_flush(addr, addr + size);
cl += cpuinfo->dcache_block_size)
mtspr(SPR_DCBFR, cl);
break; break;
case DMA_FROM_DEVICE: case DMA_FROM_DEVICE:
/* Invalidate the dcache for the requested range */ /* Invalidate the dcache for the requested range */
for (cl = addr; cl < addr + size; local_dcache_range_inv(addr, addr + size);
cl += cpuinfo->dcache_block_size)
mtspr(SPR_DCBIR, cl);
break; break;
default: default:
/* /*

View file

@ -113,21 +113,6 @@ static void print_cpuinfo(void)
return; return;
} }
if (upr & SPR_UPR_DCP)
printk(KERN_INFO
"-- dcache: %4d bytes total, %2d bytes/line, %d way(s)\n",
cpuinfo->dcache_size, cpuinfo->dcache_block_size,
cpuinfo->dcache_ways);
else
printk(KERN_INFO "-- dcache disabled\n");
if (upr & SPR_UPR_ICP)
printk(KERN_INFO
"-- icache: %4d bytes total, %2d bytes/line, %d way(s)\n",
cpuinfo->icache_size, cpuinfo->icache_block_size,
cpuinfo->icache_ways);
else
printk(KERN_INFO "-- icache disabled\n");
if (upr & SPR_UPR_DMP) if (upr & SPR_UPR_DMP)
printk(KERN_INFO "-- dmmu: %4d entries, %lu way(s)\n", printk(KERN_INFO "-- dmmu: %4d entries, %lu way(s)\n",
1 << ((mfspr(SPR_DMMUCFGR) & SPR_DMMUCFGR_NTS) >> 2), 1 << ((mfspr(SPR_DMMUCFGR) & SPR_DMMUCFGR_NTS) >> 2),
@ -155,8 +140,6 @@ static void print_cpuinfo(void)
void __init setup_cpuinfo(void) void __init setup_cpuinfo(void)
{ {
struct device_node *cpu; struct device_node *cpu;
unsigned long iccfgr, dccfgr;
unsigned long cache_set_size;
int cpu_id = smp_processor_id(); int cpu_id = smp_processor_id();
struct cpuinfo_or1k *cpuinfo = &cpuinfo_or1k[cpu_id]; struct cpuinfo_or1k *cpuinfo = &cpuinfo_or1k[cpu_id];
@ -164,20 +147,6 @@ void __init setup_cpuinfo(void)
if (!cpu) if (!cpu)
panic("Couldn't find CPU%d in device tree...\n", cpu_id); panic("Couldn't find CPU%d in device tree...\n", cpu_id);
iccfgr = mfspr(SPR_ICCFGR);
cpuinfo->icache_ways = 1 << (iccfgr & SPR_ICCFGR_NCW);
cache_set_size = 1 << ((iccfgr & SPR_ICCFGR_NCS) >> 3);
cpuinfo->icache_block_size = 16 << ((iccfgr & SPR_ICCFGR_CBS) >> 7);
cpuinfo->icache_size =
cache_set_size * cpuinfo->icache_ways * cpuinfo->icache_block_size;
dccfgr = mfspr(SPR_DCCFGR);
cpuinfo->dcache_ways = 1 << (dccfgr & SPR_DCCFGR_NCW);
cache_set_size = 1 << ((dccfgr & SPR_DCCFGR_NCS) >> 3);
cpuinfo->dcache_block_size = 16 << ((dccfgr & SPR_DCCFGR_CBS) >> 7);
cpuinfo->dcache_size =
cache_set_size * cpuinfo->dcache_ways * cpuinfo->dcache_block_size;
if (of_property_read_u32(cpu, "clock-frequency", if (of_property_read_u32(cpu, "clock-frequency",
&cpuinfo->clock_frequency)) { &cpuinfo->clock_frequency)) {
printk(KERN_WARNING printk(KERN_WARNING
@ -294,14 +263,14 @@ static int show_cpuinfo(struct seq_file *m, void *v)
unsigned int vr, cpucfgr; unsigned int vr, cpucfgr;
unsigned int avr; unsigned int avr;
unsigned int version; unsigned int version;
#ifdef CONFIG_SMP
struct cpuinfo_or1k *cpuinfo = v; struct cpuinfo_or1k *cpuinfo = v;
seq_printf(m, "processor\t\t: %d\n", cpuinfo->coreid);
#endif
vr = mfspr(SPR_VR); vr = mfspr(SPR_VR);
cpucfgr = mfspr(SPR_CPUCFGR); cpucfgr = mfspr(SPR_CPUCFGR);
#ifdef CONFIG_SMP
seq_printf(m, "processor\t\t: %d\n", cpuinfo->coreid);
#endif
if (vr & SPR_VR_UVRP) { if (vr & SPR_VR_UVRP) {
vr = mfspr(SPR_VR2); vr = mfspr(SPR_VR2);
version = vr & SPR_VR2_VER; version = vr & SPR_VR2_VER;
@ -320,14 +289,6 @@ static int show_cpuinfo(struct seq_file *m, void *v)
seq_printf(m, "revision\t\t: %d\n", vr & SPR_VR_REV); seq_printf(m, "revision\t\t: %d\n", vr & SPR_VR_REV);
} }
seq_printf(m, "frequency\t\t: %ld\n", loops_per_jiffy * HZ); seq_printf(m, "frequency\t\t: %ld\n", loops_per_jiffy * HZ);
seq_printf(m, "dcache size\t\t: %d bytes\n", cpuinfo->dcache_size);
seq_printf(m, "dcache block size\t: %d bytes\n",
cpuinfo->dcache_block_size);
seq_printf(m, "dcache ways\t\t: %d\n", cpuinfo->dcache_ways);
seq_printf(m, "icache size\t\t: %d bytes\n", cpuinfo->icache_size);
seq_printf(m, "icache block size\t: %d bytes\n",
cpuinfo->icache_block_size);
seq_printf(m, "icache ways\t\t: %d\n", cpuinfo->icache_ways);
seq_printf(m, "immu\t\t\t: %d entries, %lu ways\n", seq_printf(m, "immu\t\t\t: %d entries, %lu ways\n",
1 << ((mfspr(SPR_DMMUCFGR) & SPR_DMMUCFGR_NTS) >> 2), 1 << ((mfspr(SPR_DMMUCFGR) & SPR_DMMUCFGR_NTS) >> 2),
1 + (mfspr(SPR_DMMUCFGR) & SPR_DMMUCFGR_NTW)); 1 + (mfspr(SPR_DMMUCFGR) & SPR_DMMUCFGR_NTW));

View file

@ -14,31 +14,70 @@
#include <asm/spr_defs.h> #include <asm/spr_defs.h>
#include <asm/cache.h> #include <asm/cache.h>
#include <asm/cacheflush.h> #include <asm/cacheflush.h>
#include <asm/cpuinfo.h>
#include <asm/tlbflush.h> #include <asm/tlbflush.h>
static __always_inline void cache_loop(struct page *page, const unsigned int reg) /*
* Check if the cache component exists.
*/
bool cpu_cache_is_present(const unsigned int cache_type)
{
unsigned long upr = mfspr(SPR_UPR);
unsigned long mask = SPR_UPR_UP | cache_type;
return !((upr & mask) ^ mask);
}
static __always_inline void cache_loop(unsigned long paddr, unsigned long end,
const unsigned short reg, const unsigned int cache_type)
{
if (!cpu_cache_is_present(cache_type))
return;
while (paddr < end) {
mtspr(reg, paddr);
paddr += L1_CACHE_BYTES;
}
}
static __always_inline void cache_loop_page(struct page *page, const unsigned short reg,
const unsigned int cache_type)
{ {
unsigned long paddr = page_to_pfn(page) << PAGE_SHIFT; unsigned long paddr = page_to_pfn(page) << PAGE_SHIFT;
unsigned long line = paddr & ~(L1_CACHE_BYTES - 1); unsigned long end = paddr + PAGE_SIZE;
while (line < paddr + PAGE_SIZE) { paddr &= ~(L1_CACHE_BYTES - 1);
mtspr(reg, line);
line += L1_CACHE_BYTES; cache_loop(paddr, end, reg, cache_type);
}
} }
void local_dcache_page_flush(struct page *page) void local_dcache_page_flush(struct page *page)
{ {
cache_loop(page, SPR_DCBFR); cache_loop_page(page, SPR_DCBFR, SPR_UPR_DCP);
} }
EXPORT_SYMBOL(local_dcache_page_flush); EXPORT_SYMBOL(local_dcache_page_flush);
void local_icache_page_inv(struct page *page) void local_icache_page_inv(struct page *page)
{ {
cache_loop(page, SPR_ICBIR); cache_loop_page(page, SPR_ICBIR, SPR_UPR_ICP);
} }
EXPORT_SYMBOL(local_icache_page_inv); EXPORT_SYMBOL(local_icache_page_inv);
void local_dcache_range_flush(unsigned long start, unsigned long end)
{
cache_loop(start, end, SPR_DCBFR, SPR_UPR_DCP);
}
void local_dcache_range_inv(unsigned long start, unsigned long end)
{
cache_loop(start, end, SPR_DCBIR, SPR_UPR_DCP);
}
void local_icache_range_inv(unsigned long start, unsigned long end)
{
cache_loop(start, end, SPR_ICBIR, SPR_UPR_ICP);
}
void update_cache(struct vm_area_struct *vma, unsigned long address, void update_cache(struct vm_area_struct *vma, unsigned long address,
pte_t *pte) pte_t *pte)
{ {
@ -58,4 +97,3 @@ void update_cache(struct vm_area_struct *vma, unsigned long address,
sync_icache_dcache(folio_page(folio, nr)); sync_icache_dcache(folio_page(folio, nr));
} }
} }

View file

@ -35,6 +35,7 @@
#include <asm/fixmap.h> #include <asm/fixmap.h>
#include <asm/tlbflush.h> #include <asm/tlbflush.h>
#include <asm/sections.h> #include <asm/sections.h>
#include <asm/cacheflush.h>
int mem_init_done; int mem_init_done;
@ -176,8 +177,8 @@ void __init paging_init(void)
barrier(); barrier();
/* Invalidate instruction caches after code modification */ /* Invalidate instruction caches after code modification */
mtspr(SPR_ICBIR, 0x900); local_icache_block_inv(0x900);
mtspr(SPR_ICBIR, 0xa00); local_icache_block_inv(0xa00);
/* New TLB miss handlers and kernel page tables are in now place. /* New TLB miss handlers and kernel page tables are in now place.
* Make sure that page flags get updated for all pages in TLB by * Make sure that page flags get updated for all pages in TLB by

View file

@ -97,9 +97,19 @@ handle_fpe(struct pt_regs *regs)
memcpy(regs->fr, frcopy, sizeof regs->fr); memcpy(regs->fr, frcopy, sizeof regs->fr);
if (signalcode != 0) { if (signalcode != 0) {
force_sig_fault(signalcode >> 24, signalcode & 0xffffff, int sig = signalcode >> 24;
(void __user *) regs->iaoq[0]);
return -1; if (sig == SIGFPE) {
/*
* Clear floating point trap bit to avoid trapping
* again on the first floating-point instruction in
* the userspace signal handler.
*/
regs->fr[0] &= ~(1ULL << 38);
}
force_sig_fault(sig, signalcode & 0xffffff,
(void __user *) regs->iaoq[0]);
return -1;
} }
return signalcode ? -1 : 0; return signalcode ? -1 : 0;

View file

@ -234,10 +234,8 @@ fi
# suppress some warnings in recent ld versions # suppress some warnings in recent ld versions
nowarn="-z noexecstack" nowarn="-z noexecstack"
if ! ld_is_lld; then if "${CROSS}ld" -v --no-warn-rwx-segments >/dev/null 2>&1; then
if [ "$LD_VERSION" -ge "$(echo 2.39 | ld_version)" ]; then nowarn="$nowarn --no-warn-rwx-segments"
nowarn="$nowarn --no-warn-rwx-segments"
fi
fi fi
platformo=$object/"$platform".o platformo=$object/"$platform".o

View file

@ -258,10 +258,6 @@ static unsigned long get_stubs_size(const Elf64_Ehdr *hdr,
break; break;
} }
} }
if (i == hdr->e_shnum) {
pr_err("%s: doesn't contain __patchable_function_entries.\n", me->name);
return -ENOEXEC;
}
#endif #endif
pr_debug("Looks like a total of %lu stubs, max\n", relocs); pr_debug("Looks like a total of %lu stubs, max\n", relocs);

View file

@ -976,7 +976,7 @@ int __meminit radix__vmemmap_create_mapping(unsigned long start,
return 0; return 0;
} }
#ifdef CONFIG_ARCH_WANT_OPTIMIZE_DAX_VMEMMAP
bool vmemmap_can_optimize(struct vmem_altmap *altmap, struct dev_pagemap *pgmap) bool vmemmap_can_optimize(struct vmem_altmap *altmap, struct dev_pagemap *pgmap)
{ {
if (radix_enabled()) if (radix_enabled())
@ -984,6 +984,7 @@ bool vmemmap_can_optimize(struct vmem_altmap *altmap, struct dev_pagemap *pgmap)
return false; return false;
} }
#endif
int __meminit vmemmap_check_pmd(pmd_t *pmdp, int node, int __meminit vmemmap_check_pmd(pmd_t *pmdp, int node,
unsigned long addr, unsigned long next) unsigned long addr, unsigned long next)
@ -1120,6 +1121,19 @@ int __meminit radix__vmemmap_populate(unsigned long start, unsigned long end, in
pmd_t *pmd; pmd_t *pmd;
pte_t *pte; pte_t *pte;
/*
* Make sure we align the start vmemmap addr so that we calculate
* the correct start_pfn in altmap boundary check to decided whether
* we should use altmap or RAM based backing memory allocation. Also
* the address need to be aligned for set_pte operation.
* If the start addr is already PMD_SIZE aligned we will try to use
* a pmd mapping. We don't want to be too aggressive here beacause
* that will cause more allocations in RAM. So only if the namespace
* vmemmap start addr is PMD_SIZE aligned we will use PMD mapping.
*/
start = ALIGN_DOWN(start, PAGE_SIZE);
for (addr = start; addr < end; addr = next) { for (addr = start; addr < end; addr = next) {
next = pmd_addr_end(addr, end); next = pmd_addr_end(addr, end);
@ -1145,8 +1159,8 @@ int __meminit radix__vmemmap_populate(unsigned long start, unsigned long end, in
* in altmap block allocation failures, in which case * in altmap block allocation failures, in which case
* we fallback to RAM for vmemmap allocation. * we fallback to RAM for vmemmap allocation.
*/ */
if (altmap && (!IS_ALIGNED(addr, PMD_SIZE) || if (!IS_ALIGNED(addr, PMD_SIZE) || (altmap &&
altmap_cross_boundary(altmap, addr, PMD_SIZE))) { altmap_cross_boundary(altmap, addr, PMD_SIZE))) {
/* /*
* make sure we don't create altmap mappings * make sure we don't create altmap mappings
* covering things outside the device. * covering things outside the device.

View file

@ -17,7 +17,7 @@ config PPC_POWERNV
select MMU_NOTIFIER select MMU_NOTIFIER
select FORCE_SMP select FORCE_SMP
select ARCH_SUPPORTS_PER_VMA_LOCK select ARCH_SUPPORTS_PER_VMA_LOCK
select PPC_RADIX_BROADCAST_TLBIE select PPC_RADIX_BROADCAST_TLBIE if PPC_RADIX_MMU
default y default y
config OPAL_PRD config OPAL_PRD

View file

@ -23,7 +23,7 @@ config PPC_PSERIES
select FORCE_SMP select FORCE_SMP
select SWIOTLB select SWIOTLB
select ARCH_SUPPORTS_PER_VMA_LOCK select ARCH_SUPPORTS_PER_VMA_LOCK
select PPC_RADIX_BROADCAST_TLBIE select PPC_RADIX_BROADCAST_TLBIE if PPC_RADIX_MMU
default y default y
config PARAVIRT config PARAVIRT

View file

@ -115,24 +115,19 @@
\old_c \old_c
.endm .endm
#define _ALTERNATIVE_CFG(old_c, ...) \ #define __ALTERNATIVE_CFG(old_c, ...) ALTERNATIVE_CFG old_c
ALTERNATIVE_CFG old_c #define __ALTERNATIVE_CFG_2(old_c, ...) ALTERNATIVE_CFG old_c
#define _ALTERNATIVE_CFG_2(old_c, ...) \
ALTERNATIVE_CFG old_c
#else /* !__ASSEMBLY__ */ #else /* !__ASSEMBLY__ */
#define __ALTERNATIVE_CFG(old_c) \ #define __ALTERNATIVE_CFG(old_c, ...) old_c "\n"
old_c "\n" #define __ALTERNATIVE_CFG_2(old_c, ...) old_c "\n"
#define _ALTERNATIVE_CFG(old_c, ...) \
__ALTERNATIVE_CFG(old_c)
#define _ALTERNATIVE_CFG_2(old_c, ...) \
__ALTERNATIVE_CFG(old_c)
#endif /* __ASSEMBLY__ */ #endif /* __ASSEMBLY__ */
#define _ALTERNATIVE_CFG(old_c, ...) __ALTERNATIVE_CFG(old_c)
#define _ALTERNATIVE_CFG_2(old_c, ...) __ALTERNATIVE_CFG_2(old_c)
#endif /* CONFIG_RISCV_ALTERNATIVE */ #endif /* CONFIG_RISCV_ALTERNATIVE */
/* /*

View file

@ -34,11 +34,6 @@ static inline void flush_dcache_page(struct page *page)
flush_dcache_folio(page_folio(page)); flush_dcache_folio(page_folio(page));
} }
/*
* RISC-V doesn't have an instruction to flush parts of the instruction cache,
* so instead we just flush the whole thing.
*/
#define flush_icache_range(start, end) flush_icache_all()
#define flush_icache_user_page(vma, pg, addr, len) \ #define flush_icache_user_page(vma, pg, addr, len) \
do { \ do { \
if (vma->vm_flags & VM_EXEC) \ if (vma->vm_flags & VM_EXEC) \
@ -78,6 +73,16 @@ void flush_icache_mm(struct mm_struct *mm, bool local);
#endif /* CONFIG_SMP */ #endif /* CONFIG_SMP */
/*
* RISC-V doesn't have an instruction to flush parts of the instruction cache,
* so instead we just flush the whole thing.
*/
#define flush_icache_range flush_icache_range
static inline void flush_icache_range(unsigned long start, unsigned long end)
{
flush_icache_all();
}
extern unsigned int riscv_cbom_block_size; extern unsigned int riscv_cbom_block_size;
extern unsigned int riscv_cboz_block_size; extern unsigned int riscv_cboz_block_size;
void riscv_init_cbo_blocksizes(void); void riscv_init_cbo_blocksizes(void);

View file

@ -19,16 +19,9 @@
#ifndef __ASSEMBLY__ #ifndef __ASSEMBLY__
void arch_kgdb_breakpoint(void);
extern unsigned long kgdb_compiled_break; extern unsigned long kgdb_compiled_break;
static inline void arch_kgdb_breakpoint(void)
{
asm(".global kgdb_compiled_break\n"
".option norvc\n"
"kgdb_compiled_break: ebreak\n"
".option rvc\n");
}
#endif /* !__ASSEMBLY__ */ #endif /* !__ASSEMBLY__ */
#define DBG_REG_ZERO "zero" #define DBG_REG_ZERO "zero"

View file

@ -62,8 +62,11 @@ static inline void syscall_get_arguments(struct task_struct *task,
unsigned long *args) unsigned long *args)
{ {
args[0] = regs->orig_a0; args[0] = regs->orig_a0;
args++; args[1] = regs->a1;
memcpy(args, &regs->a1, 5 * sizeof(args[0])); args[2] = regs->a2;
args[3] = regs->a3;
args[4] = regs->a4;
args[5] = regs->a5;
} }
static inline int syscall_get_arch(struct task_struct *task) static inline int syscall_get_arch(struct task_struct *task)

View file

@ -9,8 +9,8 @@ CFLAGS_REMOVE_patch.o = $(CC_FLAGS_FTRACE)
CFLAGS_REMOVE_sbi.o = $(CC_FLAGS_FTRACE) CFLAGS_REMOVE_sbi.o = $(CC_FLAGS_FTRACE)
CFLAGS_REMOVE_return_address.o = $(CC_FLAGS_FTRACE) CFLAGS_REMOVE_return_address.o = $(CC_FLAGS_FTRACE)
endif endif
CFLAGS_syscall_table.o += $(call cc-option,-Wno-override-init,) CFLAGS_syscall_table.o += $(call cc-disable-warning, override-init)
CFLAGS_compat_syscall_table.o += $(call cc-option,-Wno-override-init,) CFLAGS_compat_syscall_table.o += $(call cc-disable-warning, override-init)
ifdef CONFIG_KEXEC_CORE ifdef CONFIG_KEXEC_CORE
AFLAGS_kexec_relocate.o := -mcmodel=medany $(call cc-option,-mno-relax) AFLAGS_kexec_relocate.o := -mcmodel=medany $(call cc-option,-mno-relax)

View file

@ -254,6 +254,12 @@ void kgdb_arch_set_pc(struct pt_regs *regs, unsigned long pc)
regs->epc = pc; regs->epc = pc;
} }
noinline void arch_kgdb_breakpoint(void)
{
asm(".global kgdb_compiled_break\n"
"kgdb_compiled_break: ebreak\n");
}
void kgdb_arch_handle_qxfer_pkt(char *remcom_in_buffer, void kgdb_arch_handle_qxfer_pkt(char *remcom_in_buffer,
char *remcom_out_buffer) char *remcom_out_buffer)
{ {

View file

@ -73,16 +73,17 @@ static bool duplicate_rela(const Elf_Rela *rela, int idx)
static void count_max_entries(Elf_Rela *relas, int num, static void count_max_entries(Elf_Rela *relas, int num,
unsigned int *plts, unsigned int *gots) unsigned int *plts, unsigned int *gots)
{ {
unsigned int type, i; for (int i = 0; i < num; i++) {
switch (ELF_R_TYPE(relas[i].r_info)) {
for (i = 0; i < num; i++) { case R_RISCV_CALL_PLT:
type = ELF_RISCV_R_TYPE(relas[i].r_info); case R_RISCV_PLT32:
if (type == R_RISCV_CALL_PLT) {
if (!duplicate_rela(relas, i)) if (!duplicate_rela(relas, i))
(*plts)++; (*plts)++;
} else if (type == R_RISCV_GOT_HI20) { break;
case R_RISCV_GOT_HI20:
if (!duplicate_rela(relas, i)) if (!duplicate_rela(relas, i))
(*gots)++; (*gots)++;
break;
} }
} }
} }

View file

@ -648,7 +648,7 @@ process_accumulated_relocations(struct module *me,
kfree(bucket_iter); kfree(bucket_iter);
} }
kfree(*relocation_hashtable); kvfree(*relocation_hashtable);
} }
static int add_relocation_to_accumulate(struct module *me, int type, static int add_relocation_to_accumulate(struct module *me, int type,
@ -752,9 +752,10 @@ initialize_relocation_hashtable(unsigned int num_relocations,
hashtable_size <<= should_double_size; hashtable_size <<= should_double_size;
*relocation_hashtable = kmalloc_array(hashtable_size, /* Number of relocations may be large, so kvmalloc it */
sizeof(**relocation_hashtable), *relocation_hashtable = kvmalloc_array(hashtable_size,
GFP_KERNEL); sizeof(**relocation_hashtable),
GFP_KERNEL);
if (!*relocation_hashtable) if (!*relocation_hashtable)
return 0; return 0;
@ -859,7 +860,7 @@ int apply_relocate_add(Elf_Shdr *sechdrs, const char *strtab,
} }
j++; j++;
if (j > sechdrs[relsec].sh_size / sizeof(*rel)) if (j == num_relocations)
j = 0; j = 0;
} while (j_idx != j); } while (j_idx != j);

View file

@ -167,6 +167,7 @@ void arch_uprobe_copy_ixol(struct page *page, unsigned long vaddr,
/* Initialize the slot */ /* Initialize the slot */
void *kaddr = kmap_atomic(page); void *kaddr = kmap_atomic(page);
void *dst = kaddr + (vaddr & ~PAGE_MASK); void *dst = kaddr + (vaddr & ~PAGE_MASK);
unsigned long start = (unsigned long)dst;
memcpy(dst, src, len); memcpy(dst, src, len);
@ -176,13 +177,6 @@ void arch_uprobe_copy_ixol(struct page *page, unsigned long vaddr,
*(uprobe_opcode_t *)dst = __BUG_INSN_32; *(uprobe_opcode_t *)dst = __BUG_INSN_32;
} }
flush_icache_range(start, start + len);
kunmap_atomic(kaddr); kunmap_atomic(kaddr);
/*
* We probably need flush_icache_user_page() but it needs vma.
* This should work on most of architectures by default. If
* architecture needs to do something different it can define
* its own version of the function.
*/
flush_dcache_page(page);
} }

View file

@ -66,6 +66,9 @@ static struct resource bss_res = { .name = "Kernel bss", };
static struct resource elfcorehdr_res = { .name = "ELF Core hdr", }; static struct resource elfcorehdr_res = { .name = "ELF Core hdr", };
#endif #endif
static int num_standard_resources;
static struct resource *standard_resources;
static int __init add_resource(struct resource *parent, static int __init add_resource(struct resource *parent,
struct resource *res) struct resource *res)
{ {
@ -139,7 +142,7 @@ static void __init init_resources(void)
struct resource *res = NULL; struct resource *res = NULL;
struct resource *mem_res = NULL; struct resource *mem_res = NULL;
size_t mem_res_sz = 0; size_t mem_res_sz = 0;
int num_resources = 0, res_idx = 0; int num_resources = 0, res_idx = 0, non_resv_res = 0;
int ret = 0; int ret = 0;
/* + 1 as memblock_alloc() might increase memblock.reserved.cnt */ /* + 1 as memblock_alloc() might increase memblock.reserved.cnt */
@ -193,6 +196,7 @@ static void __init init_resources(void)
/* Add /memory regions to the resource tree */ /* Add /memory regions to the resource tree */
for_each_mem_region(region) { for_each_mem_region(region) {
res = &mem_res[res_idx--]; res = &mem_res[res_idx--];
non_resv_res++;
if (unlikely(memblock_is_nomap(region))) { if (unlikely(memblock_is_nomap(region))) {
res->name = "Reserved"; res->name = "Reserved";
@ -210,6 +214,9 @@ static void __init init_resources(void)
goto error; goto error;
} }
num_standard_resources = non_resv_res;
standard_resources = &mem_res[res_idx + 1];
/* Clean-up any unused pre-allocated resources */ /* Clean-up any unused pre-allocated resources */
if (res_idx >= 0) if (res_idx >= 0)
memblock_free(mem_res, (res_idx + 1) * sizeof(*mem_res)); memblock_free(mem_res, (res_idx + 1) * sizeof(*mem_res));
@ -221,6 +228,33 @@ static void __init init_resources(void)
memblock_free(mem_res, mem_res_sz); memblock_free(mem_res, mem_res_sz);
} }
static int __init reserve_memblock_reserved_regions(void)
{
u64 i, j;
for (i = 0; i < num_standard_resources; i++) {
struct resource *mem = &standard_resources[i];
phys_addr_t r_start, r_end, mem_size = resource_size(mem);
if (!memblock_is_region_reserved(mem->start, mem_size))
continue;
for_each_reserved_mem_range(j, &r_start, &r_end) {
resource_size_t start, end;
start = max(PFN_PHYS(PFN_DOWN(r_start)), mem->start);
end = min(PFN_PHYS(PFN_UP(r_end)) - 1, mem->end);
if (start > mem->end || end < mem->start)
continue;
reserve_region_with_split(mem, start, end, "Reserved");
}
}
return 0;
}
arch_initcall(reserve_memblock_reserved_regions);
static void __init parse_dtb(void) static void __init parse_dtb(void)
{ {

View file

@ -439,29 +439,36 @@ static int __init check_unaligned_access_all_cpus(void)
{ {
int cpu; int cpu;
if (unaligned_scalar_speed_param == RISCV_HWPROBE_MISALIGNED_SCALAR_UNKNOWN && if (unaligned_scalar_speed_param != RISCV_HWPROBE_MISALIGNED_SCALAR_UNKNOWN) {
!check_unaligned_access_emulated_all_cpus()) { pr_info("scalar unaligned access speed set to '%s' (%lu) by command line\n",
check_unaligned_access_speed_all_cpus(); speed_str[unaligned_scalar_speed_param], unaligned_scalar_speed_param);
} else {
pr_info("scalar unaligned access speed set to '%s' by command line\n",
speed_str[unaligned_scalar_speed_param]);
for_each_online_cpu(cpu) for_each_online_cpu(cpu)
per_cpu(misaligned_access_speed, cpu) = unaligned_scalar_speed_param; per_cpu(misaligned_access_speed, cpu) = unaligned_scalar_speed_param;
} else if (!check_unaligned_access_emulated_all_cpus()) {
check_unaligned_access_speed_all_cpus();
}
if (unaligned_vector_speed_param != RISCV_HWPROBE_MISALIGNED_VECTOR_UNKNOWN) {
if (!has_vector() &&
unaligned_vector_speed_param != RISCV_HWPROBE_MISALIGNED_VECTOR_UNSUPPORTED) {
pr_warn("vector support is not available, ignoring unaligned_vector_speed=%s\n",
speed_str[unaligned_vector_speed_param]);
} else {
pr_info("vector unaligned access speed set to '%s' (%lu) by command line\n",
speed_str[unaligned_vector_speed_param], unaligned_vector_speed_param);
}
} }
if (!has_vector()) if (!has_vector())
unaligned_vector_speed_param = RISCV_HWPROBE_MISALIGNED_VECTOR_UNSUPPORTED; unaligned_vector_speed_param = RISCV_HWPROBE_MISALIGNED_VECTOR_UNSUPPORTED;
if (unaligned_vector_speed_param == RISCV_HWPROBE_MISALIGNED_VECTOR_UNKNOWN && if (unaligned_vector_speed_param != RISCV_HWPROBE_MISALIGNED_VECTOR_UNKNOWN) {
!check_vector_unaligned_access_emulated_all_cpus() &&
IS_ENABLED(CONFIG_RISCV_PROBE_VECTOR_UNALIGNED_ACCESS)) {
kthread_run(vec_check_unaligned_access_speed_all_cpus,
NULL, "vec_check_unaligned_access_speed_all_cpus");
} else {
pr_info("vector unaligned access speed set to '%s' by command line\n",
speed_str[unaligned_vector_speed_param]);
for_each_online_cpu(cpu) for_each_online_cpu(cpu)
per_cpu(vector_misaligned_access, cpu) = unaligned_vector_speed_param; per_cpu(vector_misaligned_access, cpu) = unaligned_vector_speed_param;
} else if (!check_vector_unaligned_access_emulated_all_cpus() &&
IS_ENABLED(CONFIG_RISCV_PROBE_VECTOR_UNALIGNED_ACCESS)) {
kthread_run(vec_check_unaligned_access_speed_all_cpus,
NULL, "vec_check_unaligned_access_speed_all_cpus");
} }
/* /*

View file

@ -59,7 +59,7 @@ KBUILD_CFLAGS += $(CONFIG_CC_IMPLICIT_FALLTHROUGH)
$(obj)/bzImage: asflags-y := $(SVGA_MODE) $(obj)/bzImage: asflags-y := $(SVGA_MODE)
quiet_cmd_image = BUILD $@ quiet_cmd_image = BUILD $@
cmd_image = cp $< $@; truncate -s %4K $@; cat $(obj)/vmlinux.bin >>$@ cmd_image = (dd if=$< bs=4k conv=sync status=none; cat $(filter-out $<,$(real-prereqs))) >$@
$(obj)/bzImage: $(obj)/setup.bin $(obj)/vmlinux.bin FORCE $(obj)/bzImage: $(obj)/setup.bin $(obj)/vmlinux.bin FORCE
$(call if_changed,image) $(call if_changed,image)

View file

@ -38,7 +38,7 @@ void arch_accept_memory(phys_addr_t start, phys_addr_t end)
if (early_is_tdx_guest()) { if (early_is_tdx_guest()) {
if (!tdx_accept_memory(start, end)) if (!tdx_accept_memory(start, end))
panic("TDX: Failed to accept memory\n"); panic("TDX: Failed to accept memory\n");
} else if (sev_snp_enabled()) { } else if (early_is_sevsnp_guest()) {
snp_accept_memory(start, end); snp_accept_memory(start, end);
} else { } else {
error("Cannot accept memory: unknown platform\n"); error("Cannot accept memory: unknown platform\n");

View file

@ -164,10 +164,7 @@ bool sev_snp_enabled(void)
static void __page_state_change(unsigned long paddr, enum psc_op op) static void __page_state_change(unsigned long paddr, enum psc_op op)
{ {
u64 val; u64 val, msr;
if (!sev_snp_enabled())
return;
/* /*
* If private -> shared then invalidate the page before requesting the * If private -> shared then invalidate the page before requesting the
@ -176,6 +173,9 @@ static void __page_state_change(unsigned long paddr, enum psc_op op)
if (op == SNP_PAGE_STATE_SHARED) if (op == SNP_PAGE_STATE_SHARED)
pvalidate_4k_page(paddr, paddr, false); pvalidate_4k_page(paddr, paddr, false);
/* Save the current GHCB MSR value */
msr = sev_es_rd_ghcb_msr();
/* Issue VMGEXIT to change the page state in RMP table. */ /* Issue VMGEXIT to change the page state in RMP table. */
sev_es_wr_ghcb_msr(GHCB_MSR_PSC_REQ_GFN(paddr >> PAGE_SHIFT, op)); sev_es_wr_ghcb_msr(GHCB_MSR_PSC_REQ_GFN(paddr >> PAGE_SHIFT, op));
VMGEXIT(); VMGEXIT();
@ -185,6 +185,9 @@ static void __page_state_change(unsigned long paddr, enum psc_op op)
if ((GHCB_RESP_CODE(val) != GHCB_MSR_PSC_RESP) || GHCB_MSR_PSC_RESP_VAL(val)) if ((GHCB_RESP_CODE(val) != GHCB_MSR_PSC_RESP) || GHCB_MSR_PSC_RESP_VAL(val))
sev_es_terminate(SEV_TERM_SET_LINUX, GHCB_TERM_PSC); sev_es_terminate(SEV_TERM_SET_LINUX, GHCB_TERM_PSC);
/* Restore the GHCB MSR value */
sev_es_wr_ghcb_msr(msr);
/* /*
* Now that page state is changed in the RMP table, validate it so that it is * Now that page state is changed in the RMP table, validate it so that it is
* consistent with the RMP entry. * consistent with the RMP entry.
@ -195,11 +198,17 @@ static void __page_state_change(unsigned long paddr, enum psc_op op)
void snp_set_page_private(unsigned long paddr) void snp_set_page_private(unsigned long paddr)
{ {
if (!sev_snp_enabled())
return;
__page_state_change(paddr, SNP_PAGE_STATE_PRIVATE); __page_state_change(paddr, SNP_PAGE_STATE_PRIVATE);
} }
void snp_set_page_shared(unsigned long paddr) void snp_set_page_shared(unsigned long paddr)
{ {
if (!sev_snp_enabled())
return;
__page_state_change(paddr, SNP_PAGE_STATE_SHARED); __page_state_change(paddr, SNP_PAGE_STATE_SHARED);
} }
@ -223,56 +232,10 @@ static bool early_setup_ghcb(void)
return true; return true;
} }
static phys_addr_t __snp_accept_memory(struct snp_psc_desc *desc,
phys_addr_t pa, phys_addr_t pa_end)
{
struct psc_hdr *hdr;
struct psc_entry *e;
unsigned int i;
hdr = &desc->hdr;
memset(hdr, 0, sizeof(*hdr));
e = desc->entries;
i = 0;
while (pa < pa_end && i < VMGEXIT_PSC_MAX_ENTRY) {
hdr->end_entry = i;
e->gfn = pa >> PAGE_SHIFT;
e->operation = SNP_PAGE_STATE_PRIVATE;
if (IS_ALIGNED(pa, PMD_SIZE) && (pa_end - pa) >= PMD_SIZE) {
e->pagesize = RMP_PG_SIZE_2M;
pa += PMD_SIZE;
} else {
e->pagesize = RMP_PG_SIZE_4K;
pa += PAGE_SIZE;
}
e++;
i++;
}
if (vmgexit_psc(boot_ghcb, desc))
sev_es_terminate(SEV_TERM_SET_LINUX, GHCB_TERM_PSC);
pvalidate_pages(desc);
return pa;
}
void snp_accept_memory(phys_addr_t start, phys_addr_t end) void snp_accept_memory(phys_addr_t start, phys_addr_t end)
{ {
struct snp_psc_desc desc = {}; for (phys_addr_t pa = start; pa < end; pa += PAGE_SIZE)
unsigned int i; __page_state_change(pa, SNP_PAGE_STATE_PRIVATE);
phys_addr_t pa;
if (!boot_ghcb && !early_setup_ghcb())
sev_es_terminate(SEV_TERM_SET_LINUX, GHCB_TERM_PSC);
pa = start;
while (pa < end)
pa = __snp_accept_memory(&desc, pa, end);
} }
void sev_es_shutdown_ghcb(void) void sev_es_shutdown_ghcb(void)
@ -682,3 +645,43 @@ void sev_prep_identity_maps(unsigned long top_level_pgt)
sev_verify_cbit(top_level_pgt); sev_verify_cbit(top_level_pgt);
} }
bool early_is_sevsnp_guest(void)
{
static bool sevsnp;
if (sevsnp)
return true;
if (!(sev_get_status() & MSR_AMD64_SEV_SNP_ENABLED))
return false;
sevsnp = true;
if (!snp_vmpl) {
unsigned int eax, ebx, ecx, edx;
/*
* CPUID Fn8000_001F_EAX[28] - SVSM support
*/
eax = 0x8000001f;
ecx = 0;
native_cpuid(&eax, &ebx, &ecx, &edx);
if (eax & BIT(28)) {
struct msr m;
/* Obtain the address of the calling area to use */
boot_rdmsr(MSR_SVSM_CAA, &m);
boot_svsm_caa = (void *)m.q;
boot_svsm_caa_pa = m.q;
/*
* The real VMPL level cannot be discovered, but the
* memory acceptance routines make no use of that so
* any non-zero value suffices here.
*/
snp_vmpl = U8_MAX;
}
}
return true;
}

View file

@ -12,11 +12,15 @@
bool sev_snp_enabled(void); bool sev_snp_enabled(void);
void snp_accept_memory(phys_addr_t start, phys_addr_t end); void snp_accept_memory(phys_addr_t start, phys_addr_t end);
u64 sev_get_status(void);
bool early_is_sevsnp_guest(void);
#else #else
static inline bool sev_snp_enabled(void) { return false; } static inline bool sev_snp_enabled(void) { return false; }
static inline void snp_accept_memory(phys_addr_t start, phys_addr_t end) { } static inline void snp_accept_memory(phys_addr_t start, phys_addr_t end) { }
static inline u64 sev_get_status(void) { return 0; }
static inline bool early_is_sevsnp_guest(void) { return false; }
#endif #endif

View file

@ -629,7 +629,7 @@ int x86_pmu_hw_config(struct perf_event *event)
if (event->attr.type == event->pmu->type) if (event->attr.type == event->pmu->type)
event->hw.config |= x86_pmu_get_event_config(event); event->hw.config |= x86_pmu_get_event_config(event);
if (!event->attr.freq && x86_pmu.limit_period) { if (is_sampling_event(event) && !event->attr.freq && x86_pmu.limit_period) {
s64 left = event->attr.sample_period; s64 left = event->attr.sample_period;
x86_pmu.limit_period(event, &left); x86_pmu.limit_period(event, &left);
if (left > event->attr.sample_period) if (left > event->attr.sample_period)
@ -754,7 +754,7 @@ void x86_pmu_enable_all(int added)
} }
} }
static inline int is_x86_event(struct perf_event *event) int is_x86_event(struct perf_event *event)
{ {
int i; int i;

View file

@ -3049,7 +3049,6 @@ static int handle_pmi_common(struct pt_regs *regs, u64 status)
struct cpu_hw_events *cpuc = this_cpu_ptr(&cpu_hw_events); struct cpu_hw_events *cpuc = this_cpu_ptr(&cpu_hw_events);
int bit; int bit;
int handled = 0; int handled = 0;
u64 intel_ctrl = hybrid(cpuc->pmu, intel_ctrl);
inc_irq_stat(apic_perf_irqs); inc_irq_stat(apic_perf_irqs);
@ -3093,7 +3092,6 @@ static int handle_pmi_common(struct pt_regs *regs, u64 status)
handled++; handled++;
x86_pmu_handle_guest_pebs(regs, &data); x86_pmu_handle_guest_pebs(regs, &data);
static_call(x86_pmu_drain_pebs)(regs, &data); static_call(x86_pmu_drain_pebs)(regs, &data);
status &= intel_ctrl | GLOBAL_STATUS_TRACE_TOPAPMI;
/* /*
* PMI throttle may be triggered, which stops the PEBS event. * PMI throttle may be triggered, which stops the PEBS event.
@ -3104,6 +3102,15 @@ static int handle_pmi_common(struct pt_regs *regs, u64 status)
*/ */
if (pebs_enabled != cpuc->pebs_enabled) if (pebs_enabled != cpuc->pebs_enabled)
wrmsrl(MSR_IA32_PEBS_ENABLE, cpuc->pebs_enabled); wrmsrl(MSR_IA32_PEBS_ENABLE, cpuc->pebs_enabled);
/*
* Above PEBS handler (PEBS counters snapshotting) has updated fixed
* counter 3 and perf metrics counts if they are in counter group,
* unnecessary to update again.
*/
if (cpuc->events[INTEL_PMC_IDX_FIXED_SLOTS] &&
is_pebs_counter_event_group(cpuc->events[INTEL_PMC_IDX_FIXED_SLOTS]))
status &= ~GLOBAL_STATUS_PERF_METRICS_OVF_BIT;
} }
/* /*
@ -3123,6 +3130,8 @@ static int handle_pmi_common(struct pt_regs *regs, u64 status)
static_call(intel_pmu_update_topdown_event)(NULL, NULL); static_call(intel_pmu_update_topdown_event)(NULL, NULL);
} }
status &= hybrid(cpuc->pmu, intel_ctrl);
/* /*
* Checkpointed counters can lead to 'spurious' PMIs because the * Checkpointed counters can lead to 'spurious' PMIs because the
* rollback caused by the PMI will have cleared the overflow status * rollback caused by the PMI will have cleared the overflow status
@ -4386,7 +4395,7 @@ static struct perf_guest_switch_msr *intel_guest_get_msrs(int *nr, void *data)
arr[pebs_enable] = (struct perf_guest_switch_msr){ arr[pebs_enable] = (struct perf_guest_switch_msr){
.msr = MSR_IA32_PEBS_ENABLE, .msr = MSR_IA32_PEBS_ENABLE,
.host = cpuc->pebs_enabled & ~cpuc->intel_ctrl_guest_mask, .host = cpuc->pebs_enabled & ~cpuc->intel_ctrl_guest_mask,
.guest = pebs_mask & ~cpuc->intel_ctrl_host_mask, .guest = pebs_mask & ~cpuc->intel_ctrl_host_mask & kvm_pmu->pebs_enable,
}; };
if (arr[pebs_enable].host) { if (arr[pebs_enable].host) {
@ -7305,8 +7314,17 @@ __init int intel_pmu_init(void)
name = "meteorlake_hybrid"; name = "meteorlake_hybrid";
break; break;
case INTEL_PANTHERLAKE_L:
pr_cont("Pantherlake Hybrid events, ");
name = "pantherlake_hybrid";
goto lnl_common;
case INTEL_LUNARLAKE_M: case INTEL_LUNARLAKE_M:
case INTEL_ARROWLAKE: case INTEL_ARROWLAKE:
pr_cont("Lunarlake Hybrid events, ");
name = "lunarlake_hybrid";
lnl_common:
intel_pmu_init_hybrid(hybrid_big_small); intel_pmu_init_hybrid(hybrid_big_small);
x86_pmu.pebs_latency_data = lnl_latency_data; x86_pmu.pebs_latency_data = lnl_latency_data;
@ -7328,8 +7346,6 @@ __init int intel_pmu_init(void)
intel_pmu_init_skt(&pmu->pmu); intel_pmu_init_skt(&pmu->pmu);
intel_pmu_pebs_data_source_lnl(); intel_pmu_pebs_data_source_lnl();
pr_cont("Lunarlake Hybrid events, ");
name = "lunarlake_hybrid";
break; break;
case INTEL_ARROWLAKE_H: case INTEL_ARROWLAKE_H:

View file

@ -1399,8 +1399,10 @@ static u64 pebs_update_adaptive_cfg(struct perf_event *event)
* + precise_ip < 2 for the non event IP * + precise_ip < 2 for the non event IP
* + For RTM TSX weight we need GPRs for the abort code. * + For RTM TSX weight we need GPRs for the abort code.
*/ */
gprs = (sample_type & PERF_SAMPLE_REGS_INTR) && gprs = ((sample_type & PERF_SAMPLE_REGS_INTR) &&
(attr->sample_regs_intr & PEBS_GP_REGS); (attr->sample_regs_intr & PEBS_GP_REGS)) ||
((sample_type & PERF_SAMPLE_REGS_USER) &&
(attr->sample_regs_user & PEBS_GP_REGS));
tsx_weight = (sample_type & PERF_SAMPLE_WEIGHT_TYPE) && tsx_weight = (sample_type & PERF_SAMPLE_WEIGHT_TYPE) &&
((attr->config & INTEL_ARCH_EVENT_MASK) == ((attr->config & INTEL_ARCH_EVENT_MASK) ==
@ -2123,7 +2125,7 @@ static void setup_pebs_adaptive_sample_data(struct perf_event *event,
regs->flags &= ~PERF_EFLAGS_EXACT; regs->flags &= ~PERF_EFLAGS_EXACT;
} }
if (sample_type & PERF_SAMPLE_REGS_INTR) if (sample_type & (PERF_SAMPLE_REGS_INTR | PERF_SAMPLE_REGS_USER))
adaptive_pebs_save_regs(regs, gprs); adaptive_pebs_save_regs(regs, gprs);
} }
@ -2377,8 +2379,25 @@ __intel_pmu_pebs_last_event(struct perf_event *event,
*/ */
intel_pmu_save_and_restart_reload(event, count); intel_pmu_save_and_restart_reload(event, count);
} }
} else } else {
intel_pmu_save_and_restart(event); /*
* For a non-precise event, it's possible the
* counters-snapshotting records a positive value for the
* overflowed event. Then the HW auto-reload mechanism
* reset the counter to 0 immediately, because the
* pebs_event_reset is cleared if the PERF_X86_EVENT_AUTO_RELOAD
* is not set. The counter backwards may be observed in a
* PMI handler.
*
* Since the event value has been updated when processing the
* counters-snapshotting record, only needs to set the new
* period for the counter.
*/
if (is_pebs_counter_event_group(event))
static_call(x86_pmu_set_period)(event);
else
intel_pmu_save_and_restart(event);
}
} }
static __always_inline void static __always_inline void

View file

@ -4891,28 +4891,28 @@ static struct uncore_event_desc snr_uncore_iio_freerunning_events[] = {
INTEL_UNCORE_EVENT_DESC(ioclk, "event=0xff,umask=0x10"), INTEL_UNCORE_EVENT_DESC(ioclk, "event=0xff,umask=0x10"),
/* Free-Running IIO BANDWIDTH IN Counters */ /* Free-Running IIO BANDWIDTH IN Counters */
INTEL_UNCORE_EVENT_DESC(bw_in_port0, "event=0xff,umask=0x20"), INTEL_UNCORE_EVENT_DESC(bw_in_port0, "event=0xff,umask=0x20"),
INTEL_UNCORE_EVENT_DESC(bw_in_port0.scale, "3.814697266e-6"), INTEL_UNCORE_EVENT_DESC(bw_in_port0.scale, "3.0517578125e-5"),
INTEL_UNCORE_EVENT_DESC(bw_in_port0.unit, "MiB"), INTEL_UNCORE_EVENT_DESC(bw_in_port0.unit, "MiB"),
INTEL_UNCORE_EVENT_DESC(bw_in_port1, "event=0xff,umask=0x21"), INTEL_UNCORE_EVENT_DESC(bw_in_port1, "event=0xff,umask=0x21"),
INTEL_UNCORE_EVENT_DESC(bw_in_port1.scale, "3.814697266e-6"), INTEL_UNCORE_EVENT_DESC(bw_in_port1.scale, "3.0517578125e-5"),
INTEL_UNCORE_EVENT_DESC(bw_in_port1.unit, "MiB"), INTEL_UNCORE_EVENT_DESC(bw_in_port1.unit, "MiB"),
INTEL_UNCORE_EVENT_DESC(bw_in_port2, "event=0xff,umask=0x22"), INTEL_UNCORE_EVENT_DESC(bw_in_port2, "event=0xff,umask=0x22"),
INTEL_UNCORE_EVENT_DESC(bw_in_port2.scale, "3.814697266e-6"), INTEL_UNCORE_EVENT_DESC(bw_in_port2.scale, "3.0517578125e-5"),
INTEL_UNCORE_EVENT_DESC(bw_in_port2.unit, "MiB"), INTEL_UNCORE_EVENT_DESC(bw_in_port2.unit, "MiB"),
INTEL_UNCORE_EVENT_DESC(bw_in_port3, "event=0xff,umask=0x23"), INTEL_UNCORE_EVENT_DESC(bw_in_port3, "event=0xff,umask=0x23"),
INTEL_UNCORE_EVENT_DESC(bw_in_port3.scale, "3.814697266e-6"), INTEL_UNCORE_EVENT_DESC(bw_in_port3.scale, "3.0517578125e-5"),
INTEL_UNCORE_EVENT_DESC(bw_in_port3.unit, "MiB"), INTEL_UNCORE_EVENT_DESC(bw_in_port3.unit, "MiB"),
INTEL_UNCORE_EVENT_DESC(bw_in_port4, "event=0xff,umask=0x24"), INTEL_UNCORE_EVENT_DESC(bw_in_port4, "event=0xff,umask=0x24"),
INTEL_UNCORE_EVENT_DESC(bw_in_port4.scale, "3.814697266e-6"), INTEL_UNCORE_EVENT_DESC(bw_in_port4.scale, "3.0517578125e-5"),
INTEL_UNCORE_EVENT_DESC(bw_in_port4.unit, "MiB"), INTEL_UNCORE_EVENT_DESC(bw_in_port4.unit, "MiB"),
INTEL_UNCORE_EVENT_DESC(bw_in_port5, "event=0xff,umask=0x25"), INTEL_UNCORE_EVENT_DESC(bw_in_port5, "event=0xff,umask=0x25"),
INTEL_UNCORE_EVENT_DESC(bw_in_port5.scale, "3.814697266e-6"), INTEL_UNCORE_EVENT_DESC(bw_in_port5.scale, "3.0517578125e-5"),
INTEL_UNCORE_EVENT_DESC(bw_in_port5.unit, "MiB"), INTEL_UNCORE_EVENT_DESC(bw_in_port5.unit, "MiB"),
INTEL_UNCORE_EVENT_DESC(bw_in_port6, "event=0xff,umask=0x26"), INTEL_UNCORE_EVENT_DESC(bw_in_port6, "event=0xff,umask=0x26"),
INTEL_UNCORE_EVENT_DESC(bw_in_port6.scale, "3.814697266e-6"), INTEL_UNCORE_EVENT_DESC(bw_in_port6.scale, "3.0517578125e-5"),
INTEL_UNCORE_EVENT_DESC(bw_in_port6.unit, "MiB"), INTEL_UNCORE_EVENT_DESC(bw_in_port6.unit, "MiB"),
INTEL_UNCORE_EVENT_DESC(bw_in_port7, "event=0xff,umask=0x27"), INTEL_UNCORE_EVENT_DESC(bw_in_port7, "event=0xff,umask=0x27"),
INTEL_UNCORE_EVENT_DESC(bw_in_port7.scale, "3.814697266e-6"), INTEL_UNCORE_EVENT_DESC(bw_in_port7.scale, "3.0517578125e-5"),
INTEL_UNCORE_EVENT_DESC(bw_in_port7.unit, "MiB"), INTEL_UNCORE_EVENT_DESC(bw_in_port7.unit, "MiB"),
{ /* end: all zeroes */ }, { /* end: all zeroes */ },
}; };
@ -5485,37 +5485,6 @@ static struct freerunning_counters icx_iio_freerunning[] = {
[ICX_IIO_MSR_BW_IN] = { 0xaa0, 0x1, 0x10, 8, 48, icx_iio_bw_freerunning_box_offsets }, [ICX_IIO_MSR_BW_IN] = { 0xaa0, 0x1, 0x10, 8, 48, icx_iio_bw_freerunning_box_offsets },
}; };
static struct uncore_event_desc icx_uncore_iio_freerunning_events[] = {
/* Free-Running IIO CLOCKS Counter */
INTEL_UNCORE_EVENT_DESC(ioclk, "event=0xff,umask=0x10"),
/* Free-Running IIO BANDWIDTH IN Counters */
INTEL_UNCORE_EVENT_DESC(bw_in_port0, "event=0xff,umask=0x20"),
INTEL_UNCORE_EVENT_DESC(bw_in_port0.scale, "3.814697266e-6"),
INTEL_UNCORE_EVENT_DESC(bw_in_port0.unit, "MiB"),
INTEL_UNCORE_EVENT_DESC(bw_in_port1, "event=0xff,umask=0x21"),
INTEL_UNCORE_EVENT_DESC(bw_in_port1.scale, "3.814697266e-6"),
INTEL_UNCORE_EVENT_DESC(bw_in_port1.unit, "MiB"),
INTEL_UNCORE_EVENT_DESC(bw_in_port2, "event=0xff,umask=0x22"),
INTEL_UNCORE_EVENT_DESC(bw_in_port2.scale, "3.814697266e-6"),
INTEL_UNCORE_EVENT_DESC(bw_in_port2.unit, "MiB"),
INTEL_UNCORE_EVENT_DESC(bw_in_port3, "event=0xff,umask=0x23"),
INTEL_UNCORE_EVENT_DESC(bw_in_port3.scale, "3.814697266e-6"),
INTEL_UNCORE_EVENT_DESC(bw_in_port3.unit, "MiB"),
INTEL_UNCORE_EVENT_DESC(bw_in_port4, "event=0xff,umask=0x24"),
INTEL_UNCORE_EVENT_DESC(bw_in_port4.scale, "3.814697266e-6"),
INTEL_UNCORE_EVENT_DESC(bw_in_port4.unit, "MiB"),
INTEL_UNCORE_EVENT_DESC(bw_in_port5, "event=0xff,umask=0x25"),
INTEL_UNCORE_EVENT_DESC(bw_in_port5.scale, "3.814697266e-6"),
INTEL_UNCORE_EVENT_DESC(bw_in_port5.unit, "MiB"),
INTEL_UNCORE_EVENT_DESC(bw_in_port6, "event=0xff,umask=0x26"),
INTEL_UNCORE_EVENT_DESC(bw_in_port6.scale, "3.814697266e-6"),
INTEL_UNCORE_EVENT_DESC(bw_in_port6.unit, "MiB"),
INTEL_UNCORE_EVENT_DESC(bw_in_port7, "event=0xff,umask=0x27"),
INTEL_UNCORE_EVENT_DESC(bw_in_port7.scale, "3.814697266e-6"),
INTEL_UNCORE_EVENT_DESC(bw_in_port7.unit, "MiB"),
{ /* end: all zeroes */ },
};
static struct intel_uncore_type icx_uncore_iio_free_running = { static struct intel_uncore_type icx_uncore_iio_free_running = {
.name = "iio_free_running", .name = "iio_free_running",
.num_counters = 9, .num_counters = 9,
@ -5523,7 +5492,7 @@ static struct intel_uncore_type icx_uncore_iio_free_running = {
.num_freerunning_types = ICX_IIO_FREERUNNING_TYPE_MAX, .num_freerunning_types = ICX_IIO_FREERUNNING_TYPE_MAX,
.freerunning = icx_iio_freerunning, .freerunning = icx_iio_freerunning,
.ops = &skx_uncore_iio_freerunning_ops, .ops = &skx_uncore_iio_freerunning_ops,
.event_descs = icx_uncore_iio_freerunning_events, .event_descs = snr_uncore_iio_freerunning_events,
.format_group = &skx_uncore_iio_freerunning_format_group, .format_group = &skx_uncore_iio_freerunning_format_group,
}; };
@ -6320,69 +6289,13 @@ static struct freerunning_counters spr_iio_freerunning[] = {
[SPR_IIO_MSR_BW_OUT] = { 0x3808, 0x1, 0x10, 8, 48 }, [SPR_IIO_MSR_BW_OUT] = { 0x3808, 0x1, 0x10, 8, 48 },
}; };
static struct uncore_event_desc spr_uncore_iio_freerunning_events[] = {
/* Free-Running IIO CLOCKS Counter */
INTEL_UNCORE_EVENT_DESC(ioclk, "event=0xff,umask=0x10"),
/* Free-Running IIO BANDWIDTH IN Counters */
INTEL_UNCORE_EVENT_DESC(bw_in_port0, "event=0xff,umask=0x20"),
INTEL_UNCORE_EVENT_DESC(bw_in_port0.scale, "3.814697266e-6"),
INTEL_UNCORE_EVENT_DESC(bw_in_port0.unit, "MiB"),
INTEL_UNCORE_EVENT_DESC(bw_in_port1, "event=0xff,umask=0x21"),
INTEL_UNCORE_EVENT_DESC(bw_in_port1.scale, "3.814697266e-6"),
INTEL_UNCORE_EVENT_DESC(bw_in_port1.unit, "MiB"),
INTEL_UNCORE_EVENT_DESC(bw_in_port2, "event=0xff,umask=0x22"),
INTEL_UNCORE_EVENT_DESC(bw_in_port2.scale, "3.814697266e-6"),
INTEL_UNCORE_EVENT_DESC(bw_in_port2.unit, "MiB"),
INTEL_UNCORE_EVENT_DESC(bw_in_port3, "event=0xff,umask=0x23"),
INTEL_UNCORE_EVENT_DESC(bw_in_port3.scale, "3.814697266e-6"),
INTEL_UNCORE_EVENT_DESC(bw_in_port3.unit, "MiB"),
INTEL_UNCORE_EVENT_DESC(bw_in_port4, "event=0xff,umask=0x24"),
INTEL_UNCORE_EVENT_DESC(bw_in_port4.scale, "3.814697266e-6"),
INTEL_UNCORE_EVENT_DESC(bw_in_port4.unit, "MiB"),
INTEL_UNCORE_EVENT_DESC(bw_in_port5, "event=0xff,umask=0x25"),
INTEL_UNCORE_EVENT_DESC(bw_in_port5.scale, "3.814697266e-6"),
INTEL_UNCORE_EVENT_DESC(bw_in_port5.unit, "MiB"),
INTEL_UNCORE_EVENT_DESC(bw_in_port6, "event=0xff,umask=0x26"),
INTEL_UNCORE_EVENT_DESC(bw_in_port6.scale, "3.814697266e-6"),
INTEL_UNCORE_EVENT_DESC(bw_in_port6.unit, "MiB"),
INTEL_UNCORE_EVENT_DESC(bw_in_port7, "event=0xff,umask=0x27"),
INTEL_UNCORE_EVENT_DESC(bw_in_port7.scale, "3.814697266e-6"),
INTEL_UNCORE_EVENT_DESC(bw_in_port7.unit, "MiB"),
/* Free-Running IIO BANDWIDTH OUT Counters */
INTEL_UNCORE_EVENT_DESC(bw_out_port0, "event=0xff,umask=0x30"),
INTEL_UNCORE_EVENT_DESC(bw_out_port0.scale, "3.814697266e-6"),
INTEL_UNCORE_EVENT_DESC(bw_out_port0.unit, "MiB"),
INTEL_UNCORE_EVENT_DESC(bw_out_port1, "event=0xff,umask=0x31"),
INTEL_UNCORE_EVENT_DESC(bw_out_port1.scale, "3.814697266e-6"),
INTEL_UNCORE_EVENT_DESC(bw_out_port1.unit, "MiB"),
INTEL_UNCORE_EVENT_DESC(bw_out_port2, "event=0xff,umask=0x32"),
INTEL_UNCORE_EVENT_DESC(bw_out_port2.scale, "3.814697266e-6"),
INTEL_UNCORE_EVENT_DESC(bw_out_port2.unit, "MiB"),
INTEL_UNCORE_EVENT_DESC(bw_out_port3, "event=0xff,umask=0x33"),
INTEL_UNCORE_EVENT_DESC(bw_out_port3.scale, "3.814697266e-6"),
INTEL_UNCORE_EVENT_DESC(bw_out_port3.unit, "MiB"),
INTEL_UNCORE_EVENT_DESC(bw_out_port4, "event=0xff,umask=0x34"),
INTEL_UNCORE_EVENT_DESC(bw_out_port4.scale, "3.814697266e-6"),
INTEL_UNCORE_EVENT_DESC(bw_out_port4.unit, "MiB"),
INTEL_UNCORE_EVENT_DESC(bw_out_port5, "event=0xff,umask=0x35"),
INTEL_UNCORE_EVENT_DESC(bw_out_port5.scale, "3.814697266e-6"),
INTEL_UNCORE_EVENT_DESC(bw_out_port5.unit, "MiB"),
INTEL_UNCORE_EVENT_DESC(bw_out_port6, "event=0xff,umask=0x36"),
INTEL_UNCORE_EVENT_DESC(bw_out_port6.scale, "3.814697266e-6"),
INTEL_UNCORE_EVENT_DESC(bw_out_port6.unit, "MiB"),
INTEL_UNCORE_EVENT_DESC(bw_out_port7, "event=0xff,umask=0x37"),
INTEL_UNCORE_EVENT_DESC(bw_out_port7.scale, "3.814697266e-6"),
INTEL_UNCORE_EVENT_DESC(bw_out_port7.unit, "MiB"),
{ /* end: all zeroes */ },
};
static struct intel_uncore_type spr_uncore_iio_free_running = { static struct intel_uncore_type spr_uncore_iio_free_running = {
.name = "iio_free_running", .name = "iio_free_running",
.num_counters = 17, .num_counters = 17,
.num_freerunning_types = SPR_IIO_FREERUNNING_TYPE_MAX, .num_freerunning_types = SPR_IIO_FREERUNNING_TYPE_MAX,
.freerunning = spr_iio_freerunning, .freerunning = spr_iio_freerunning,
.ops = &skx_uncore_iio_freerunning_ops, .ops = &skx_uncore_iio_freerunning_ops,
.event_descs = spr_uncore_iio_freerunning_events, .event_descs = snr_uncore_iio_freerunning_events,
.format_group = &skx_uncore_iio_freerunning_format_group, .format_group = &skx_uncore_iio_freerunning_format_group,
}; };

View file

@ -110,14 +110,21 @@ static inline bool is_topdown_event(struct perf_event *event)
return is_metric_event(event) || is_slots_event(event); return is_metric_event(event) || is_slots_event(event);
} }
int is_x86_event(struct perf_event *event);
static inline bool check_leader_group(struct perf_event *leader, int flags)
{
return is_x86_event(leader) ? !!(leader->hw.flags & flags) : false;
}
static inline bool is_branch_counters_group(struct perf_event *event) static inline bool is_branch_counters_group(struct perf_event *event)
{ {
return event->group_leader->hw.flags & PERF_X86_EVENT_BRANCH_COUNTERS; return check_leader_group(event->group_leader, PERF_X86_EVENT_BRANCH_COUNTERS);
} }
static inline bool is_pebs_counter_event_group(struct perf_event *event) static inline bool is_pebs_counter_event_group(struct perf_event *event)
{ {
return event->group_leader->hw.flags & PERF_X86_EVENT_PEBS_CNTR; return check_leader_group(event->group_leader, PERF_X86_EVENT_PEBS_CNTR);
} }
struct amd_nb { struct amd_nb {

View file

@ -126,6 +126,8 @@
#define INTEL_GRANITERAPIDS_X IFM(6, 0xAD) /* Redwood Cove */ #define INTEL_GRANITERAPIDS_X IFM(6, 0xAD) /* Redwood Cove */
#define INTEL_GRANITERAPIDS_D IFM(6, 0xAE) #define INTEL_GRANITERAPIDS_D IFM(6, 0xAE)
#define INTEL_BARTLETTLAKE IFM(6, 0xD7) /* Raptor Cove */
/* "Hybrid" Processors (P-Core/E-Core) */ /* "Hybrid" Processors (P-Core/E-Core) */
#define INTEL_LAKEFIELD IFM(6, 0x8A) /* Sunny Cove / Tremont */ #define INTEL_LAKEFIELD IFM(6, 0x8A) /* Sunny Cove / Tremont */

View file

@ -35,6 +35,7 @@
#include <asm/mtrr.h> #include <asm/mtrr.h>
#include <asm/msr-index.h> #include <asm/msr-index.h>
#include <asm/asm.h> #include <asm/asm.h>
#include <asm/irq_remapping.h>
#include <asm/kvm_page_track.h> #include <asm/kvm_page_track.h>
#include <asm/kvm_vcpu_regs.h> #include <asm/kvm_vcpu_regs.h>
#include <asm/reboot.h> #include <asm/reboot.h>
@ -2423,4 +2424,9 @@ int memslot_rmap_alloc(struct kvm_memory_slot *slot, unsigned long npages);
*/ */
#define KVM_EXIT_HYPERCALL_MBZ GENMASK_ULL(31, 1) #define KVM_EXIT_HYPERCALL_MBZ GENMASK_ULL(31, 1)
static inline bool kvm_arch_has_irq_bypass(void)
{
return enable_apicv && irq_remapping_cap(IRQ_POSTING_CAP);
}
#endif /* _ASM_X86_KVM_HOST_H */ #endif /* _ASM_X86_KVM_HOST_H */

View file

@ -6,6 +6,8 @@
#include <linux/mm.h> /* for struct page */ #include <linux/mm.h> /* for struct page */
#include <linux/pagemap.h> #include <linux/pagemap.h>
#include <asm/cpufeature.h>
#define __HAVE_ARCH_PTE_ALLOC_ONE #define __HAVE_ARCH_PTE_ALLOC_ONE
#define __HAVE_ARCH_PGD_FREE #define __HAVE_ARCH_PGD_FREE
#include <asm-generic/pgalloc.h> #include <asm-generic/pgalloc.h>
@ -29,16 +31,17 @@ static inline void paravirt_release_pud(unsigned long pfn) {}
static inline void paravirt_release_p4d(unsigned long pfn) {} static inline void paravirt_release_p4d(unsigned long pfn) {}
#endif #endif
#ifdef CONFIG_MITIGATION_PAGE_TABLE_ISOLATION
/* /*
* Instead of one PGD, we acquire two PGDs. Being order-1, it is * In case of Page Table Isolation active, we acquire two PGDs instead of one.
* both 8k in size and 8k-aligned. That lets us just flip bit 12 * Being order-1, it is both 8k in size and 8k-aligned. That lets us just
* in a pointer to swap between the two 4k halves. * flip bit 12 in a pointer to swap between the two 4k halves.
*/ */
#define PGD_ALLOCATION_ORDER 1 static inline unsigned int pgd_allocation_order(void)
#else {
#define PGD_ALLOCATION_ORDER 0 if (cpu_feature_enabled(X86_FEATURE_PTI))
#endif return 1;
return 0;
}
/* /*
* Allocate and free page tables. * Allocate and free page tables.

View file

@ -869,6 +869,16 @@ static void init_amd_zen1(struct cpuinfo_x86 *c)
pr_notice_once("AMD Zen1 DIV0 bug detected. Disable SMT for full protection.\n"); pr_notice_once("AMD Zen1 DIV0 bug detected. Disable SMT for full protection.\n");
setup_force_cpu_bug(X86_BUG_DIV0); setup_force_cpu_bug(X86_BUG_DIV0);
/*
* Turn off the Instructions Retired free counter on machines that are
* susceptible to erratum #1054 "Instructions Retired Performance
* Counter May Be Inaccurate".
*/
if (c->x86_model < 0x30) {
msr_clear_bit(MSR_K7_HWCR, MSR_K7_HWCR_IRPERF_EN_BIT);
clear_cpu_cap(c, X86_FEATURE_IRPERF);
}
} }
static bool cpu_has_zenbleed_microcode(void) static bool cpu_has_zenbleed_microcode(void)
@ -1052,13 +1062,8 @@ static void init_amd(struct cpuinfo_x86 *c)
if (!cpu_feature_enabled(X86_FEATURE_XENPV)) if (!cpu_feature_enabled(X86_FEATURE_XENPV))
set_cpu_bug(c, X86_BUG_SYSRET_SS_ATTRS); set_cpu_bug(c, X86_BUG_SYSRET_SS_ATTRS);
/* /* Enable the Instructions Retired free counter */
* Turn on the Instructions Retired free counter on machines not if (cpu_has(c, X86_FEATURE_IRPERF))
* susceptible to erratum #1054 "Instructions Retired Performance
* Counter May Be Inaccurate".
*/
if (cpu_has(c, X86_FEATURE_IRPERF) &&
(boot_cpu_has(X86_FEATURE_ZEN1) && c->x86_model > 0x2f))
msr_set_bit(MSR_K7_HWCR, MSR_K7_HWCR_IRPERF_EN_BIT); msr_set_bit(MSR_K7_HWCR, MSR_K7_HWCR_IRPERF_EN_BIT);
check_null_seg_clears_base(c); check_null_seg_clears_base(c);

View file

@ -199,6 +199,12 @@ static bool need_sha_check(u32 cur_rev)
case 0xa70c0: return cur_rev <= 0xa70C009; break; case 0xa70c0: return cur_rev <= 0xa70C009; break;
case 0xaa001: return cur_rev <= 0xaa00116; break; case 0xaa001: return cur_rev <= 0xaa00116; break;
case 0xaa002: return cur_rev <= 0xaa00218; break; case 0xaa002: return cur_rev <= 0xaa00218; break;
case 0xb0021: return cur_rev <= 0xb002146; break;
case 0xb1010: return cur_rev <= 0xb101046; break;
case 0xb2040: return cur_rev <= 0xb204031; break;
case 0xb4040: return cur_rev <= 0xb404031; break;
case 0xb6000: return cur_rev <= 0xb600031; break;
case 0xb7000: return cur_rev <= 0xb700031; break;
default: break; default: break;
} }
@ -214,8 +220,7 @@ static bool verify_sha256_digest(u32 patch_id, u32 cur_rev, const u8 *data, unsi
struct sha256_state s; struct sha256_state s;
int i; int i;
if (x86_family(bsp_cpuid_1_eax) < 0x17 || if (x86_family(bsp_cpuid_1_eax) < 0x17)
x86_family(bsp_cpuid_1_eax) > 0x19)
return true; return true;
if (!need_sha_check(cur_rev)) if (!need_sha_check(cur_rev))

View file

@ -1299,6 +1299,14 @@ void __init e820__memblock_setup(void)
memblock_add(entry->addr, entry->size); memblock_add(entry->addr, entry->size);
} }
/*
* 32-bit systems are limited to 4BG of memory even with HIGHMEM and
* to even less without it.
* Discard memory after max_pfn - the actual limit detected at runtime.
*/
if (IS_ENABLED(CONFIG_X86_32))
memblock_remove(PFN_PHYS(max_pfn), -1);
/* Throw away partial pages: */ /* Throw away partial pages: */
memblock_trim_memory(PAGE_SIZE); memblock_trim_memory(PAGE_SIZE);

View file

@ -46,7 +46,8 @@ bool __init pit_timer_init(void)
* VMMs otherwise steal CPU time just to pointlessly waggle * VMMs otherwise steal CPU time just to pointlessly waggle
* the (masked) IRQ. * the (masked) IRQ.
*/ */
clockevent_i8253_disable(); scoped_guard(irq)
clockevent_i8253_disable();
return false; return false;
} }
clockevent_i8253_init(true); clockevent_i8253_init(true);

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