6.6.16-rc1 review
Subsystems (5)
Greg Kroah-Hartman
maintainerPATCH 133/322 block: prevent an integer overflow in bvec_try_merge_hw_page
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christoph Hellwig <[email protected]>
[ Upstream commit 3f034c374ad55773c12dd8f3c1607328e17c0072 ]
Reordered a check to avoid a possible overflow when adding len to bv_len.
--- block/bio.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
block/bio.c +1 -1
@@ -944,7 +944,7 @@ bool bvec_try_merge_hw_page(struct request_queue *q, struct bio_vec *bv,if ((addr1 | mask) != (addr2 | mask))return false; -if (bv->bv_len + len >queue_max_segment_size (q)) +if (len >queue_max_segment_size (q) - bv->bv_len)return false;return bvec_try_merge_page (bv, page, len, offset, same_page); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 134/322 md: Whenassemble the array, consult the superblock of the freshest device
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Lyakas <[email protected]>
[ Upstream commit dc1cc22ed58f11d58d8553c5ec5f11cbfc3e3039 ]
Upon assembling the array, both kernel and mdadm allow the devices to have event counter difference of 1, and still consider them as up-to-date. However, a device whose event count is behind by 1, may in fact not be up-to-date, and array resync with such a device may cause data corruption.
To avoid this, consult the superblock of the freshest device about the status of a device, whose event counter is behind by 1.
--- drivers/md/md.c | 54 ++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 44 insertions(+), 10 deletions(-)
drivers/md/md.c +44 -10
@@ -1122,6 +1122,7 @@ struct super_type {struct md_rdev *refdev, int minor_version);int (*validate_super)(struct mddev *mddev, +struct md_rdev *freshest,struct md_rdev *rdev);void (*sync_super)(struct mddev *mddev,struct md_rdev *rdev);
@@ -1259,8 +1260,9 @@ static int super_90_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor/* * validate_super for 0.90.0 +* note: we are not using "freshest" for 0.9 superblock */ -static int super_90_validate (struct mddev *mddev,struct md_rdev *rdev) +static int super_90_validate (struct mddev *mddev,struct md_rdev *freshest,struct md_rdev *rdev) {mdp_disk_t *desc;mdp_super_t *sb =page_address (rdev->sb_page);
@@ -1772,7 +1774,7 @@ static int super_1_load(struct md_rdev *rdev, struct md_rdev *refdev, int minor_return ret; } -static int super_1_validate (struct mddev *mddev,struct md_rdev *rdev) +static int super_1_validate (struct mddev *mddev,struct md_rdev *freshest,struct md_rdev *rdev) {struct mdp_superblock_1 *sb =page_address (rdev->sb_page);__u64 ev1 =le64_to_cpu (sb->events);
@@ -1868,13 +1870,15 @@ static int super_1_validate(struct mddev *mddev, struct md_rdev *rdev) } }else if (mddev->pers ==NULL ) {/* Insist of good event counter while assembling, except for -* spares (which don't need an event count) */ - ++ev1; +* spares (which don't need an event count). +* Similar to mdadm, we allow event counter difference of 1 +* from the freshest device. +*/ if (rdev->desc_nr >=0 && rdev->desc_nr <le32_to_cpu (sb->max_dev) && (le16_to_cpu (sb->dev_roles[rdev->desc_nr]) <MD_DISK_ROLE_MAX ||le16_to_cpu (sb->dev_roles[rdev->desc_nr]) ==MD_DISK_ROLE_JOURNAL )) -if (ev1 < mddev->events) +if (ev1 +1 < mddev->events)return -EINVAL ; }else if (mddev->bitmap) {/* If adding to array with a bitmap, then we can accept an
@@ -1895,8 +1899,38 @@ static int super_1_validate(struct mddev *mddev, struct md_rdev *rdev) rdev->desc_nr >= le32_to_cpu(sb->max_dev)) { role =MD_DISK_ROLE_SPARE ; rdev->desc_nr =-1 ; - } else + } else if (mddev->pers == NULL && freshest && ev1 < mddev->events) { +/* +* If we are assembling, and our event counter is smaller than the +* highest event counter, we cannot trust our superblock about the role. +* It could happen that our rdev was marked as Faulty, and all other +* superblocks were updated with +1 event counter. +* Then, before the next superblock update, which typically happens when +* remove_and_add_spares() removes the device from the array, there was +* a crash or reboot. +* If we allow current rdev without consulting the freshest superblock, +* we could cause data corruption. +* Note that in this case our event counter is smaller by 1 than the +* highest, otherwise, this rdev would not be allowed into array; +* both kernel and mdadm allow event counter difference of 1. +*/ +struct mdp_superblock_1 *freshest_sb =page_address (freshest->sb_page); +u32 freshest_max_dev =le32_to_cpu (freshest_sb->max_dev); + +if (rdev->desc_nr >= freshest_max_dev) { +/* this is unexpected, better not proceed */ +pr_warn ("md: %s: rdev[%pg]: desc_nr(%d) >= freshest(%pg)->sb->max_dev(%u)\n" , +mdname (mddev), rdev->bdev, rdev->desc_nr, + freshest->bdev, freshest_max_dev); +return -EUCLEAN ; + } + + role =le16_to_cpu (freshest_sb->dev_roles[rdev->desc_nr]); +pr_debug ("md: %s: rdev[%pg]: role=%d(0x%x) according to freshest %pg\n" , +mdname (mddev), rdev->bdev, role, role, freshest->bdev); + } else { role =le16_to_cpu (sb->dev_roles[rdev->desc_nr]); + }switch (role) {case MD_DISK_ROLE_SPARE :/* spare */ break ;
@@ -2804,7 +2838,7 @@ static int add_bound_rdev(struct md_rdev *rdev)* and should be added immediately. */ super_types[mddev->major_version]. -validate_super (mddev, rdev); +validate_super (mddev,NULL /*freshest*/ , rdev);if (add_journal)mddev_suspend (mddev); err = mddev->pers->hot_add_disk (mddev, rdev);
@@ -3742,7 +3776,7 @@ static int analyze_sbs(struct mddev *mddev) } super_types[mddev->major_version]. -validate_super (mddev, freshest); +validate_super (mddev,NULL /*freshest*/ , freshest); i =0 ;rdev_for_each_safe (rdev, tmp, mddev) {
@@ -3757,7 +3791,7 @@ static int analyze_sbs(struct mddev *mddev) }if (rdev != freshest) {if (super_types[mddev->major_version]. -validate_super (mddev, rdev)) { +validate_super (mddev, freshest, rdev)) {pr_warn ("md: kicking non-fresh %pg from array!\n" , rdev->bdev);md_kick_rdev_from_array (rdev);
@@ -6809,7 +6843,7 @@ int md_add_new_disk(struct mddev *mddev, struct mdu_disk_info_s *info) rdev->saved_raid_disk = rdev->raid_disk; }else super_types[mddev->major_version]. -validate_super (mddev, rdev); +validate_super (mddev,NULL /*freshest*/ , rdev);if ((info->state & (1 <<MD_DISK_SYNC )) && rdev->raid_disk != info->raid_disk) {/* This was a hot-add request, but events doesn't
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 135/322 arm64: dts: qcom: msm8996: Fix in-ports is a required property
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mao Jinlong <[email protected]>
[ Upstream commit 9a6fc510a6a3ec150cb7450aec1e5f257e6fc77b ]
Add the inport of funnel@3023000 to fix 'in-ports' is a required property warning.
--- arch/arm64/boot/dts/qcom/msm8996.dtsi | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)
arch/arm64/boot/dts/qcom/msm8996.dtsi +21 -0
@@ -443,6 +443,19 @@ reg = <0x0 0x80000000 0x0 0x0>; }; + etm { + compatible = "qcom,coresight-remote-etm"; + + out-ports { + port { + modem_etm_out_funnel_in2: endpoint { + remote-endpoint = + <&funnel_in2_in_modem_etm>; + }; + }; + }; + }; + psci { compatible = "arm,psci-1.0"; method = "smc";
@@ -2643,6 +2656,14 @@ clocks = <&rpmcc RPM_QDSS_CLK>, <&rpmcc RPM_QDSS_A_CLK>; clock-names = "apb_pclk", "atclk"; + in-ports { + port { + funnel_in2_in_modem_etm: endpoint { + remote-endpoint = + <&modem_etm_out_funnel_in2>; + }; + }; + }; out-ports { port {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 136/322 arm64: dts: qcom: msm8998: Fix out-ports is a required property
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mao Jinlong <[email protected]>
[ Upstream commit ae5ee3562a2519214b12228545e88a203dd68bbd ]
out-ports is a required property for coresight ETM. Add out-ports for ETM nodes to fix the warning.
--- arch/arm64/boot/dts/qcom/msm8998.dtsi | 32 +++++++++++++++++---------- 1 file changed, 20 insertions(+), 12 deletions(-)
arch/arm64/boot/dts/qcom/msm8998.dtsi +20 -12
@@ -2034,9 +2034,11 @@ cpu = <&CPU4>; - port { - etm4_out: endpoint { - remote-endpoint = <&apss_funnel_in4>; + out-ports { + port { + etm4_out: endpoint { + remote-endpoint = <&apss_funnel_in4>; + }; }; }; };
@@ -2051,9 +2053,11 @@ cpu = <&CPU5>; - port { - etm5_out: endpoint { - remote-endpoint = <&apss_funnel_in5>; + out-ports { + port { + etm5_out: endpoint { + remote-endpoint = <&apss_funnel_in5>; + }; }; }; };
@@ -2068,9 +2072,11 @@ cpu = <&CPU6>; - port { - etm6_out: endpoint { - remote-endpoint = <&apss_funnel_in6>; + out-ports { + port { + etm6_out: endpoint { + remote-endpoint = <&apss_funnel_in6>; + }; }; }; };
@@ -2085,9 +2091,11 @@ cpu = <&CPU7>; - port { - etm7_out: endpoint { - remote-endpoint = <&apss_funnel_in7>; + out-ports { + port { + etm7_out: endpoint { + remote-endpoint = <&apss_funnel_in7>; + }; }; }; };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 137/322 arm64: dts: qcom: Fix coresight warnings in in-ports and out-ports
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mao Jinlong <[email protected]>
[ Upstream commit bdb6339fd46b8702ea7411b0b414587b86a40562 ]
When a node is only one in port or one out port, address-cells and size-cells are not required in in-ports and out-ports. And the number and reg of the port need to be removed.
--- arch/arm64/boot/dts/qcom/sdm845.dtsi | 5 +---- arch/arm64/boot/dts/qcom/sm8150.dtsi | 5 +---- arch/arm64/boot/dts/qcom/sm8250.dtsi | 24 ++++-------------------- 3 files changed, 6 insertions(+), 28 deletions(-)
arch/arm64/boot/dts/qcom/sdm845.dtsi +1 -4
@@ -3555,11 +3555,8 @@ }; in-ports { - #address-cells = <1>; - #size-cells = <0>; - port@1 { - reg = <1>; + port { etf_in: endpoint { remote-endpoint = <&merge_funnel_out>;
arch/arm64/boot/dts/qcom/sm8150.dtsi +1 -4
@@ -2973,11 +2973,8 @@ }; in-ports { - #address-cells = <1>; - #size-cells = <0>; - port@1 { - reg = <1>; + port { replicator1_in: endpoint { remote-endpoint = <&replicator_out1>; };
arch/arm64/boot/dts/qcom/sm8250.dtsi +4 -20
@@ -2830,11 +2830,8 @@ clock-names = "apb_pclk"; out-ports { - #address-cells = <1>; - #size-cells = <0>; - port@0 { - reg = <0>; + port { tpda_out_funnel_qatb: endpoint { remote-endpoint = <&funnel_qatb_in_tpda>; };
@@ -2877,11 +2874,7 @@ }; in-ports { - #address-cells = <1>; - #size-cells = <0>; - - port@0 { - reg = <0>; + port { funnel_qatb_in_tpda: endpoint { remote-endpoint = <&tpda_out_funnel_qatb>; };
@@ -3090,11 +3083,8 @@ }; in-ports { - #address-cells = <1>; - #size-cells = <0>; - port@0 { - reg = <0>; + port { etf_in_funnel_swao_out: endpoint { remote-endpoint = <&funnel_swao_out_etf>; };
@@ -3178,8 +3168,6 @@ clock-names = "apb_pclk"; out-ports { - #address-cells = <1>; - #size-cells = <0>; port { tpdm_mm_out_tpda9: endpoint { remote-endpoint = <&tpda_9_in_tpdm_mm>;
@@ -3445,11 +3433,7 @@ }; in-ports { - #address-cells = <1>; - #size-cells = <0>; - - port@0 { - reg = <0>; + port { funnel_apss_merg_in_funnel_apss: endpoint { remote-endpoint = <&funnel_apss_out_funnel_apss_merg>; };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 138/322 ice: fix pre-shifted bit usage
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jesse Brandeburg <[email protected]>
[ Upstream commit 7173be21ae29ef50ada42fd4464056a9d3f55bb3 ]
While converting to FIELD_PREP() and FIELD_GET(), it was noticed that some of the RSS defines had *included* the shift in their definitions. This is completely outside of normal, such that a developer could easily make a mistake and shift at the usage site (like when using FIELD_PREP()).
Rename the defines and set them to the "pre-shifted values" so they match the template the driver normally uses for masks and the member bits of the mask, which also allows the driver to use FIELD_PREP correctly with these values. Use GENMASK() for this changed MASK value.
Do the same for the VLAN EMODE defines as well.
--- drivers/net/ethernet/intel/ice/ice_adminq_cmd.h | 10 +++++----- drivers/net/ethernet/intel/ice/ice_lib.c | 3 ++- .../net/ethernet/intel/ice/ice_vsi_vlan_lib.c | 16 +++++++++++----- 3 files changed, 18 insertions(+), 11 deletions(-)
drivers/net/ethernet/intel/ice/ice_adminq_cmd.h +5 -5
@@ -421,10 +421,10 @@ struct ice_aqc_vsi_props {#define ICE_AQ_VSI_INNER_VLAN_INSERT_PVID BIT(2)#define ICE_AQ_VSI_INNER_VLAN_EMODE_S 3#define ICE_AQ_VSI_INNER_VLAN_EMODE_M (0x3 << ICE_AQ_VSI_INNER_VLAN_EMODE_S) -#define ICE_AQ_VSI_INNER_VLAN_EMODE_STR_BOTH (0x0 << ICE_AQ_VSI_INNER_VLAN_EMODE_S) -#define ICE_AQ_VSI_INNER_VLAN_EMODE_STR_UP (0x1 << ICE_AQ_VSI_INNER_VLAN_EMODE_S) -#define ICE_AQ_VSI_INNER_VLAN_EMODE_STR (0x2 << ICE_AQ_VSI_INNER_VLAN_EMODE_S) -#define ICE_AQ_VSI_INNER_VLAN_EMODE_NOTHING (0x3 << ICE_AQ_VSI_INNER_VLAN_EMODE_S) +#define ICE_AQ_VSI_INNER_VLAN_EMODE_STR_BOTH 0x0U +#define ICE_AQ_VSI_INNER_VLAN_EMODE_STR_UP 0x1U +#define ICE_AQ_VSI_INNER_VLAN_EMODE_STR 0x2U +#define ICE_AQ_VSI_INNER_VLAN_EMODE_NOTHING 0x3Uu8 inner_vlan_reserved2[3 ];/* ingress egress up sections */ __le32 ingress_table;/* bitmap, 3 bits per up */
@@ -490,7 +490,7 @@ struct ice_aqc_vsi_props {#define ICE_AQ_VSI_Q_OPT_RSS_GBL_LUT_S 2#define ICE_AQ_VSI_Q_OPT_RSS_GBL_LUT_M (0xF << ICE_AQ_VSI_Q_OPT_RSS_GBL_LUT_S)#define ICE_AQ_VSI_Q_OPT_RSS_HASH_S 6 -#define ICE_AQ_VSI_Q_OPT_RSS_HASH_M (0x3 << ICE_AQ_VSI_Q_OPT_RSS_HASH_S) +#define ICE_AQ_VSI_Q_OPT_RSS_HASH_M GENMASK(7, 6)#define ICE_AQ_VSI_Q_OPT_RSS_HASH_TPLZ 0x0U#define ICE_AQ_VSI_Q_OPT_RSS_HASH_SYM_TPLZ 0x1U#define ICE_AQ_VSI_Q_OPT_RSS_HASH_XOR 0x2U
drivers/net/ethernet/intel/ice/ice_lib.c +2 -1
@@ -979,7 +979,8 @@ static void ice_set_dflt_vsi_ctx(struct ice_hw *hw, struct ice_vsi_ctx *ctxt)*/ if (ice_is_dvm_ena (hw)) { ctxt->info.inner_vlan_flags |= -ICE_AQ_VSI_INNER_VLAN_EMODE_NOTHING ; +FIELD_PREP (ICE_AQ_VSI_INNER_VLAN_EMODE_M , +ICE_AQ_VSI_INNER_VLAN_EMODE_NOTHING ); ctxt->info.outer_vlan_flags = (ICE_AQ_VSI_OUTER_VLAN_TX_MODE_ALL << ICE_AQ_VSI_OUTER_VLAN_TX_MODE_S) &
drivers/net/ethernet/intel/ice/ice_vsi_vlan_lib.c +11 -5
@@ -131,6 +131,7 @@ static int ice_vsi_manage_vlan_stripping(struct ice_vsi *vsi, bool ena) {struct ice_hw *hw = &vsi->back->hw;struct ice_vsi_ctx *ctxt; +u8 *ivf;int err;/* do not allow modifying VLAN stripping when a port VLAN is configured
@@ -143,19 +144,24 @@ static int ice_vsi_manage_vlan_stripping(struct ice_vsi *vsi, bool ena)if (!ctxt)return -ENOMEM ; + ivf = &ctxt->info.inner_vlan_flags; +/* Here we are configuring what the VSI should do with the VLAN tag in * the Rx packet. We can either leave the tag in the packet or put it in * the Rx descriptor. */ -if (ena) +if (ena) {/* Strip VLAN tag from Rx packet and put it in the desc */ - ctxt->info.inner_vlan_flags =ICE_AQ_VSI_INNER_VLAN_EMODE_STR_BOTH ; -else + *ivf =FIELD_PREP (ICE_AQ_VSI_INNER_VLAN_EMODE_M , +ICE_AQ_VSI_INNER_VLAN_EMODE_STR_BOTH ); + }else {/* Disable stripping. Leave tag in packet */ - ctxt->info.inner_vlan_flags =ICE_AQ_VSI_INNER_VLAN_EMODE_NOTHING ; + *ivf =FIELD_PREP (ICE_AQ_VSI_INNER_VLAN_EMODE_M , +ICE_AQ_VSI_INNER_VLAN_EMODE_NOTHING ); + }/* Allow all packets untagged/tagged */ - ctxt->info.inner_vlan_flags |=ICE_AQ_VSI_INNER_VLAN_TX_MODE_ALL ; + *ivf |=ICE_AQ_VSI_INNER_VLAN_TX_MODE_ALL ; ctxt->info.valid_sections =cpu_to_le16 (ICE_AQ_VSI_PROP_VLAN_VALID );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 139/322 arm64: dts: amlogic: fix format for s4 uart node
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xianwei Zhao <[email protected]>
[ Upstream commit eb54ef36282f670c704ed5af8593da62bebba80d ]
Aliases use lowercase letters and place status in end.
--- arch/arm64/boot/dts/amlogic/meson-s4-s805x2-aq222.dts | 4 ++-- arch/arm64/boot/dts/amlogic/meson-s4.dtsi | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-)
arch/arm64/boot/dts/amlogic/meson-s4-s805x2-aq222.dts +2 -2
@@ -15,7 +15,7 @@ #size-cells = <2>; aliases { - serial0 = &uart_B; + serial0 = &uart_b; }; memory@0 {
@@ -25,6 +25,6 @@ }; -&uart_B { +&uart_b { status = "okay"; };
arch/arm64/boot/dts/amlogic/meson-s4.dtsi +2 -2
@@ -118,14 +118,14 @@ <10 11 12 13 14 15 16 17 18 19 20 21>; }; - uart_B: serial@7a000 { + uart_b: serial@7a000 { compatible = "amlogic,meson-s4-uart", "amlogic,meson-ao-uart"; reg = <0x0 0x7a000 0x0 0x18>; interrupts = <GIC_SPI 169 IRQ_TYPE_EDGE_RISING>; - status = "disabled"; clocks = <&xtal>, <&xtal>, <&xtal>; clock-names = "xtal", "pclk", "baud"; + status = "disabled"; }; reset: reset-controller@2000 {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 140/322 wifi: rtl8xxxu: Add additional USB IDs for RTL8192EU devices
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zenm Chen <[email protected]>
[ Upstream commit 4e87ca403e2008b9e182239e1abbf6876a55eb33 ]
Add additional USB IDs found in the vendor driver from
https://github.com/Mange/rtl8192eu-linux-driver to support more RTL8192EU devices.
--- .../net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
drivers/net/wireless/realtek/rtl8xxxu/rtl8xxxu_core.c +12 -0
@@ -7959,6 +7959,18 @@ static const struct usb_device_id dev_table[] = { .driver_info = (unsigned long)&rtl8192eu_fops}, {USB_DEVICE_AND_INTERFACE_INFO(USB_VENDOR_ID_REALTEK, 0x818c, 0xff, 0xff, 0xff), .driver_info = (unsigned long)&rtl8192eu_fops}, +/* D-Link DWA-131 rev C1 */ +{USB_DEVICE_AND_INTERFACE_INFO(0x2001, 0x3312, 0xff, 0xff, 0xff), + .driver_info = (unsigned long)&rtl8192eu_fops}, +/* TP-Link TL-WN8200ND V2 */ +{USB_DEVICE_AND_INTERFACE_INFO(0x2357, 0x0126, 0xff, 0xff, 0xff), + .driver_info = (unsigned long)&rtl8192eu_fops}, +/* Mercusys MW300UM */ +{USB_DEVICE_AND_INTERFACE_INFO(0x2c4e, 0x0100, 0xff, 0xff, 0xff), + .driver_info = (unsigned long)&rtl8192eu_fops}, +/* Mercusys MW300UH */ +{USB_DEVICE_AND_INTERFACE_INFO(0x2c4e, 0x0104, 0xff, 0xff, 0xff), + .driver_info = (unsigned long)&rtl8192eu_fops}, #endif { } };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 141/322 wifi: rtw89: coex: Fix wrong Wi-Fi role info and FDDT parameter members
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ching-Te Ku <[email protected]>
[ Upstream commit acc55d7dd4de525ac07e43e90ea3cc630677ec8a ]
The Wi-Fi firmware 29.29.X should use version 2 role info format. FDDT mechanism version 5 use the same cell members to judge traffic situation, don't need to add another new format.
--- drivers/net/wireless/realtek/rtw89/coex.c | 4 ++-- drivers/net/wireless/realtek/rtw89/core.h | 12 +++--------- 2 files changed, 5 insertions(+), 11 deletions(-)
drivers/net/wireless/realtek/rtw89/coex.c +2 -2
@@ -131,7 +131,7 @@ static const struct rtw89_btc_ver rtw89_btc_ver_defs[] = { .fcxbtcrpt = 105, .fcxtdma = 3, .fcxslots = 1, .fcxcysta = 5, .fcxstep = 3, .fcxnullsta = 2, .fcxmreg = 2, .fcxgpiodbg = 1, .fcxbtver = 1, .fcxbtscan = 2, .fcxbtafh = 2, .fcxbtdevinfo = 1, - .fwlrole = 1, .frptmap = 3, .fcxctrl = 1, + .fwlrole = 2, .frptmap = 3, .fcxctrl = 1, .info_buf = 1800, .max_role_num = 6, }, {RTL8852C, RTW89_FW_VER_CODE(0, 27, 57, 0),
@@ -159,7 +159,7 @@ static const struct rtw89_btc_ver rtw89_btc_ver_defs[] = { .fcxbtcrpt = 105, .fcxtdma = 3, .fcxslots = 1, .fcxcysta = 5, .fcxstep = 3, .fcxnullsta = 2, .fcxmreg = 2, .fcxgpiodbg = 1, .fcxbtver = 1, .fcxbtscan = 2, .fcxbtafh = 2, .fcxbtdevinfo = 1, - .fwlrole = 1, .frptmap = 3, .fcxctrl = 1, + .fwlrole = 2, .frptmap = 3, .fcxctrl = 1, .info_buf = 1800, .max_role_num = 6, }, {RTL8852B, RTW89_FW_VER_CODE(0, 29, 14, 0),
drivers/net/wireless/realtek/rtw89/core.h +3 -9
@@ -2230,12 +2230,6 @@ struct rtw89_btc_fbtc_fddt_cell_status {u8 state_phase;/* [0:3] train state, [4:7] train phase */ } __packed; -struct rtw89_btc_fbtc_fddt_cell_status_v5 { -s8 wl_tx_pwr; -s8 bt_tx_pwr; -s8 bt_rx_gain; -} __packed; -struct rtw89_btc_fbtc_cysta_v3 {/* statistics for cycles */ u8 fver;u8 rsvd;
@@ -2299,9 +2293,9 @@ struct rtw89_btc_fbtc_cysta_v5 { /* statistics for cycles */struct rtw89_btc_fbtc_cycle_a2dp_empty_info a2dp_ept;struct rtw89_btc_fbtc_a2dp_trx_stat_v4 a2dp_trx[BTC_CYCLE_SLOT_MAX ];struct rtw89_btc_fbtc_cycle_fddt_info_v5 fddt_trx[BTC_CYCLE_SLOT_MAX ]; -struct rtw89_btc_fbtc_fddt_cell_status_v5 fddt_cells[FDD_TRAIN_WL_DIRECTION ] - [FDD_TRAIN_WL_RSSI_LEVEL ] - [FDD_TRAIN_BT_RSSI_LEVEL ]; +struct rtw89_btc_fbtc_fddt_cell_status fddt_cells[FDD_TRAIN_WL_DIRECTION ] + [FDD_TRAIN_WL_RSSI_LEVEL ] + [FDD_TRAIN_BT_RSSI_LEVEL ];__le32 except_map; } __packed;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 142/322 libbpf: Fix NULL pointer dereference in bpf_object__collect_prog_relos
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mingyi Zhang <[email protected]>
[ Upstream commit fc3a5534e2a8855427403113cbeb54af5837bbe0 ]
An issue occurred while reading an ELF file in libbpf.c during fuzzing:
Program received signal SIGSEGV, Segmentation fault.
0x0000000000958e97 in bpf_object.collect_prog_relos () at libbpf.c:4206
4206 in libbpf.c
(gdb) bt
#0 0x0000000000958e97 in bpf_object.collect_prog_relos () at libbpf.c:4206
#1 0x000000000094f9d6 in bpf_object.collect_relos () at libbpf.c:6706
#2 0x000000000092bef3 in bpf_object_open () at libbpf.c:7437
#3 0x000000000092c046 in bpf_object.open_mem () at libbpf.c:7497
#4 0x0000000000924afa in LLVMFuzzerTestOneInput () at fuzz/bpf-object-fuzzer.c:16
#5 0x000000000060be11 in testblitz_engine::fuzzer::Fuzzer::run_one ()
#6 0x000000000087ad92 in tracing::span::Span::in_scope ()
#7 0x00000000006078aa in testblitz_engine::fuzzer::util::walkdir ()
#8 0x00000000005f3217 in testblitz_engine::entrypoint::main::{{closure}} ()
#9 0x00000000005f2601 in main ()
(gdb)scn_data was null at this code(tools/lib/bpf/src/libbpf.c):
if (rel->r_offset % BPF_INSN_SZ || rel->r_offset >= scn_data->d_size) {The scn_data is derived from the code above:
scn = elf_sec_by_idx(obj, sec_idx); scn_data = elf_sec_data(obj, scn); relo_sec_name = elf_sec_str(obj, shdr->sh_name); sec_name = elf_sec_name(obj, scn); if (!relo_sec_name || !sec_name)// don't check whether scn_data is NULL return -EINVAL;
In certain special scenarios, such as reading a malformed ELF file, it is possible that scn_data may be a null pointer
--- tools/lib/bpf/libbpf.c | 2 ++ 1 file changed, 2 insertions(+)
tools/lib/bpf/libbpf.c +2 -0
@@ -4251,6 +4251,8 @@ bpf_object__collect_prog_relos(struct bpf_object *obj, Elf64_Shdr *shdr, Elf_Dat scn =elf_sec_by_idx (obj, sec_idx); scn_data =elf_sec_data (obj, scn); +if (!scn_data) +return -LIBBPF_ERRNO__FORMAT ; relo_sec_name =elf_sec_str (obj, shdr->sh_name); sec_name =elf_sec_name (obj, scn);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 143/322 wifi: rtlwifi: rtl8723{be,ae}: using calculate_bit_shift()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Su Hui <[email protected]>
[ Upstream commit 5c16618bc06a41ad68fd8499a21d35ef57ca06c2 ]
Using calculate_bit_shift() to replace rtl8723_phy_calculate_bit_shift(). And fix an undefined bitwise shift behavior problem.
--- drivers/net/wireless/realtek/rtlwifi/rtl8723ae/phy.c | 6 +++--- drivers/net/wireless/realtek/rtlwifi/rtl8723be/phy.c | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-)
drivers/net/wireless/realtek/rtlwifi/rtl8723ae/phy.c +3 -3
@@ -49,7 +49,7 @@ u32 rtl8723e_phy_query_rf_reg(struct ieee80211_hw *hw, rfpath, regaddr); } - bitshift =rtl8723_phy_calculate_bit_shift (bitmask); + bitshift =calculate_bit_shift (bitmask); readback_value = (original_value & bitmask) >> bitshift;spin_unlock (&rtlpriv->locks.rf_lock);
@@ -80,7 +80,7 @@ void rtl8723e_phy_set_rf_reg(struct ieee80211_hw *hw, original_value =rtl8723_phy_rf_serial_read (hw, rfpath, regaddr); - bitshift =rtl8723_phy_calculate_bit_shift (bitmask); + bitshift =calculate_bit_shift (bitmask); data = ((original_value & (~bitmask)) | (data << bitshift));
@@ -89,7 +89,7 @@ void rtl8723e_phy_set_rf_reg(struct ieee80211_hw *hw,rtl8723_phy_rf_serial_write (hw, rfpath, regaddr, data); }else {if (bitmask !=RFREG_OFFSET_MASK ) { - bitshift =rtl8723_phy_calculate_bit_shift (bitmask); + bitshift =calculate_bit_shift (bitmask); data = ((original_value & (~bitmask)) | (data << bitshift));
drivers/net/wireless/realtek/rtlwifi/rtl8723be/phy.c +2 -2
@@ -41,7 +41,7 @@ u32 rtl8723be_phy_query_rf_reg(struct ieee80211_hw *hw, enum radio_path rfpath,spin_lock (&rtlpriv->locks.rf_lock); original_value =rtl8723_phy_rf_serial_read (hw, rfpath, regaddr); - bitshift =rtl8723_phy_calculate_bit_shift (bitmask); + bitshift =calculate_bit_shift (bitmask); readback_value = (original_value & bitmask) >> bitshift;spin_unlock (&rtlpriv->locks.rf_lock);
@@ -68,7 +68,7 @@ void rtl8723be_phy_set_rf_reg(struct ieee80211_hw *hw, enum radio_path path,if (bitmask !=RFREG_OFFSET_MASK ) { original_value =rtl8723_phy_rf_serial_read (hw, path, regaddr); - bitshift =rtl8723_phy_calculate_bit_shift (bitmask); + bitshift =calculate_bit_shift (bitmask); data = ((original_value & (~bitmask)) | (data << bitshift)); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 144/322 wifi: cfg80211: free beacon_ies when overridden from hidden BSS
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Benjamin Berg <[email protected]>
[ Upstream commit 32af9a9e1069e55bc02741fb00ac9d0ca1a2eaef ]
This is a more of a cosmetic fix. The branch will only be taken if proberesp_ies is set, which implies that beacon_ies is not set unless we are connected to an AP that just did a channel switch. And, in that case we should have found the BSS in the internal storage to begin with.
--- net/wireless/scan.c | 4 ++++ 1 file changed, 4 insertions(+)
net/wireless/scan.c +4 -0
@@ -1829,8 +1829,12 @@ __cfg80211_bss_update(struct cfg80211_registered_device *rdev,list_add (&new->hidden_list, &hidden->hidden_list); hidden->refcount++; + + ies = (void *)rcu_dereference (new->pub.beacon_ies);rcu_assign_pointer (new->pub.beacon_ies, hidden->pub.beacon_ies); +if (ies) +kfree_rcu (ies, rcu_head); } }else {/*
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 145/322 Bluetooth: qca: Set both WIDEBAND_SPEECH and LE_STATES quirks for QCA2066
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zijun Hu <[email protected]>
[ Upstream commit 5d192b697c7417254cdd9edc3d5e9e0364eb9045 ]
Set both WIDEBAND_SPEECH_SUPPORTED and VALID_LE_STATES quirks for QCA2066.
--- drivers/bluetooth/hci_qca.c | 1 + 1 file changed, 1 insertion(+)
drivers/bluetooth/hci_qca.c +1 -0
@@ -2035,6 +2035,7 @@ static const struct qca_device_data qca_soc_data_wcn3998 __maybe_unused = {static const struct qca_device_data qca_soc_data_qca6390__maybe_unused = { .soc_type =QCA_QCA6390 , .num_vregs =0 , + .capabilities =QCA_CAP_WIDEBAND_SPEECH |QCA_CAP_VALID_LE_STATES , };static const struct qca_device_data qca_soc_data_wcn6750__maybe_unused = {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 146/322 Bluetooth: ISO: Avoid creating child socket if PA sync is terminating
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Iulia Tanasescu <[email protected]>
[ Upstream commit 9f150019f176078144b02c4b9b9dbe7fd5a2fcc3 ]
When a PA sync socket is closed, the associated hcon is also unlinked and cleaned up. If there are no other hcons marked with the HCI_CONN_PA_SYNC flag, HCI_OP_LE_PA_TERM_SYNC is sent to controller.
Between the time of the command and the moment PA sync is terminated in controller, residual BIGInfo reports might continue to come. This causes a new PA sync hcon to be added, and a new socket to be notified to user space.
This commit fixs this by adding a flag on a Broadcast listening socket to mark when the PA sync child has been closed.
This flag is checked when BIGInfo reports are indicated in iso_connect_ind, to avoid recreating a hcon and socket if residual reports arrive before PA sync is terminated.
--- net/bluetooth/iso.c | 51 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 48 insertions(+), 3 deletions(-)
net/bluetooth/iso.c +48 -3
@@ -52,6 +52,7 @@ static void iso_sock_kill(struct sock *sk);enum {BT_SK_BIG_SYNC ,BT_SK_PA_SYNC , +BT_SK_PA_SYNC_TERM , };struct iso_pinfo {
@@ -80,6 +81,11 @@ static bool iso_match_sid(struct sock *sk, void *data);static bool iso_match_sync_handle (struct sock *sk,void *data);static void iso_sock_disconn (struct sock *sk); +typedef bool (*iso_sock_match_t )(struct sock *sk,void *data); + +static struct sock *iso_get_sock_listen (bdaddr_t *src,bdaddr_t *dst, +iso_sock_match_t match,void *data); +/* ---- ISO timers ---- */ #define ISO_CONN_TIMEOUT (HZ * 40)#define ISO_DISCONN_TIMEOUT (HZ * 2)
@@ -188,10 +194,21 @@ static void iso_chan_del(struct sock *sk, int err)sock_set_flag (sk,SOCK_ZAPPED ); } +static bool iso_match_conn_sync_handle (struct sock *sk,void *data) +{ +struct hci_conn *hcon = data; + +if (test_bit (BT_SK_PA_SYNC , &iso_pi (sk)->flags)) +return false; + +return hcon->sync_handle ==iso_pi (sk)->sync_handle; +} +static void iso_conn_del (struct hci_conn *hcon,int err) {struct iso_conn *conn = hcon->iso_data;struct sock *sk; +struct sock *parent;if (!conn)return ;
@@ -207,6 +224,25 @@ static void iso_conn_del(struct hci_conn *hcon, int err)if (sk) {lock_sock (sk); + +/* While a PA sync hcon is in the process of closing, +* mark parent socket with a flag, so that any residual +* BIGInfo adv reports that arrive before PA sync is +* terminated are not processed anymore. +*/ +if (test_bit (BT_SK_PA_SYNC , &iso_pi (sk)->flags)) { + parent =iso_get_sock_listen (&hcon->src, + &hcon->dst, + iso_match_conn_sync_handle, + hcon); + +if (parent) { +set_bit (BT_SK_PA_SYNC_TERM , + &iso_pi (parent)->flags); +sock_put (parent); + } + } +iso_sock_clear_timer (sk);iso_chan_del (sk, err);release_sock (sk);
@@ -543,8 +579,6 @@ static struct sock *__iso_get_sock_listen_by_sid(bdaddr_t *ba, bdaddr_t *bc,return NULL ; } -typedef bool (*iso_sock_match_t )(struct sock *sk,void *data); -/* Find socket listening: * source bdaddr (Unicast) * destination bdaddr (Broadcast only)
@@ -1756,9 +1790,20 @@ int iso_connect_ind(struct hci_dev *hdev, bdaddr_t *bdaddr, __u8 *flags)/* Try to get PA sync listening socket, if it exists */ sk =iso_get_sock_listen (&hdev->bdaddr, bdaddr, iso_match_pa_sync_flag,NULL ); -if (!sk) + +if (!sk) { sk =iso_get_sock_listen (&hdev->bdaddr, bdaddr, iso_match_sync_handle, ev2); + +/* If PA Sync is in process of terminating, +* do not handle any more BIGInfo adv reports. +*/ + +if (sk &&test_bit (BT_SK_PA_SYNC_TERM , + &iso_pi (sk)->flags)) +return lm; + } +if (sk) {int err;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 147/322 Bluetooth: hci_sync: fix BR/EDR wakeup bug
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: clancy shang <[email protected]>
[ Upstream commit d4b70ba1eab450eff9c5ef536f07c01d424b7eda ]
when Bluetooth set the event mask and enter suspend, the controller has hci mode change event coming, it cause controller can not enter sleep mode. so it should to set the hci mode change event mask before enter suspend.
--- net/bluetooth/hci_sync.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
net/bluetooth/hci_sync.c +6 -4
@@ -3800,12 +3800,14 @@ static int hci_set_event_mask_sync(struct hci_dev *hdev)if (lmp_bredr_capable (hdev)) { events[4 ] |=0x01 ;/* Flow Specification Complete */ -/* Don't set Disconnect Complete when suspended as that -* would wakeup the host when disconnecting due to -* suspend. +/* Don't set Disconnect Complete and mode change when +* suspended as that would wakeup the host when disconnecting +* due to suspend. */ -if (hdev->suspended) +if (hdev->suspended) { events[0 ] &=0xef ; + events[2 ] &=0xf7 ; + } }else {/* Use a different default for LE-only devices */ memset (events,0 ,sizeof (events));
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 148/322 Bluetooth: L2CAP: Fix possible multiple reject send
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Frédéric Danis <[email protected]>
[ Upstream commit 96a3398b467ab8aada3df2f3a79f4b7835d068b8 ]
In case of an incomplete command or a command with a null identifier 2 reject packets will be sent, one with the identifier and one with 0. Consuming the data of the command will prevent it.
This allows to send a reject packet for each corrupted command in a multi-command packet.
--- net/bluetooth/l2cap_core.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/bluetooth/l2cap_core.c +2 -1
@@ -6526,7 +6526,8 @@ static inline void l2cap_sig_channel(struct l2cap_conn *conn,if (len > skb->len || !cmd->ident) {BT_DBG ("corrupted command" );l2cap_sig_send_rej (conn, cmd->ident); -break ; +skb_pull (skb, len > skb->len ? skb->len : len); +continue ; } err =l2cap_bredr_sig_cmd (conn, cmd, len, skb->data);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 149/322 net/smc: disable SEID on non-s390 archs where virtual ISM may be used
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wen Gu <[email protected]>
[ Upstream commit c6b8b8eb49904018e22e4e4b1fa502e57dc747d9 ]
The system EID (SEID) is an internal EID used by SMC-D to represent the s390 physical machine that OS is executing on. On s390 architecture, it predefined by fixed string and part of cpuid and is enabled regardless of whether underlay device is virtual ISM or platform firmware ISM.
However on non-s390 architectures where SMC-D can be used with virtual ISM devices, there is no similar information to identify physical machines, especially in virtualization scenarios. So in such cases, SEID is forcibly disabled and the user-defined UEID will be used to represent the communicable space.
--- net/smc/smc_clc.c | 14 ++++++++++++++ 1 file changed, 14 insertions(+)
net/smc/smc_clc.c +14 -0
@@ -155,10 +155,12 @@ static int smc_clc_ueid_remove(char *ueid) rc =0 ; } } +#if IS_ENABLED (CONFIG_S390 )if (!rc && !smc_clc_eid_table.ueid_cnt) { smc_clc_eid_table.seid_enabled =1 ; rc = -EAGAIN ;/* indicate success and enabling of seid */ } +#endif write_unlock (&smc_clc_eid_table.lock);return rc; }
@@ -273,22 +275,30 @@ int smc_nl_dump_seid(struct sk_buff *skb, struct netlink_callback *cb)int smc_nl_enable_seid (struct sk_buff *skb,struct genl_info *info) { +#if IS_ENABLED (CONFIG_S390 )write_lock (&smc_clc_eid_table.lock); smc_clc_eid_table.seid_enabled =1 ;write_unlock (&smc_clc_eid_table.lock);return 0 ; +#else +return -EOPNOTSUPP ; +#endif }int smc_nl_disable_seid (struct sk_buff *skb,struct genl_info *info) {int rc =0 ; +#if IS_ENABLED (CONFIG_S390 )write_lock (&smc_clc_eid_table.lock);if (!smc_clc_eid_table.ueid_cnt) rc = -ENOENT ;else smc_clc_eid_table.seid_enabled =0 ;write_unlock (&smc_clc_eid_table.lock); +#else + rc = -EOPNOTSUPP ; +#endif return rc; }
@@ -1269,7 +1279,11 @@ void __init smc_clc_init(void)INIT_LIST_HEAD (&smc_clc_eid_table.list);rwlock_init (&smc_clc_eid_table.lock); smc_clc_eid_table.ueid_cnt =0 ; +#if IS_ENABLED (CONFIG_S390 ) smc_clc_eid_table.seid_enabled =1 ; +#else + smc_clc_eid_table.seid_enabled =0 ; +#endif }void smc_clc_exit (void )
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 150/322 bridge: cfm: fix enum typo in br_cc_ccm_tx_parse
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lin Ma <[email protected]>
[ Upstream commit c2b2ee36250d967c21890cb801e24af4b6a9eaa5 ]
It appears that there is a typo in the code where the nlattr array is being parsed with policy br_cfm_cc_ccm_tx_policy, but the instance is being accessed via IFLA_BRIDGE_CFM_CC_RDI_INSTANCE, which is associated with the policy br_cfm_cc_rdi_policy.
This problem was introduced by commit 2be665c3940d ("bridge: cfm: Netlink SET configuration Interface.").
Though it seems like a harmless typo since these two enum owns the exact same value (1 here), it is quite misleading hence fix it by using the correct enum IFLA_BRIDGE_CFM_CC_CCM_TX_INSTANCE here.
--- net/bridge/br_cfm_netlink.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/bridge/br_cfm_netlink.c +1 -1
@@ -362,7 +362,7 @@ static int br_cc_ccm_tx_parse(struct net_bridge *br, struct nlattr *attr,memset (&tx_info,0 ,sizeof (tx_info)); - instance =nla_get_u32 (tb[IFLA_BRIDGE_CFM_CC_RDI_INSTANCE ]); + instance =nla_get_u32 (tb[IFLA_BRIDGE_CFM_CC_CCM_TX_INSTANCE ]);nla_memcpy (&tx_info.dmac.addr, tb[IFLA_BRIDGE_CFM_CC_CCM_TX_DMAC ],sizeof (tx_info.dmac.addr));
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 151/322 arm64: dts: sprd: Add clock reference for pll2 on UMS512
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chunyan Zhang <[email protected]>
[ Upstream commit 829e3e70fe72edc084fbfc4964669594ebe427ce ]
Fix below dtbs_check warning:
'clocks' is a dependency of 'clock-names'
--- arch/arm64/boot/dts/sprd/ums512.dtsi | 1 + 1 file changed, 1 insertion(+)
arch/arm64/boot/dts/sprd/ums512.dtsi +1 -0
@@ -291,6 +291,7 @@ pll2: clock-controller@0 { compatible = "sprd,ums512-gc-pll"; reg = <0x0 0x100>; + clocks = <&ext_26m>; clock-names = "ext-26m"; #clock-cells = <1>; };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 152/322 arm64: dts: sprd: Change UMS512 idle-state nodename to match bindings
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chunyan Zhang <[email protected]>
[ Upstream commit 1cff7243334f851b7dddf450abdaa6223a7a28e3 ]
Fix below dtbs_check warning:
idle-states: 'core-pd' does not match any of the regexes: '^(cpu|cluster)-', 'pinctrl-[0-9]+'
--- arch/arm64/boot/dts/sprd/ums512.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/sprd/ums512.dtsi +1 -1
@@ -113,7 +113,7 @@ idle-states { entry-method = "psci"; - CORE_PD: core-pd { + CORE_PD: cpu-pd { compatible = "arm,idle-state"; entry-latency-us = <4000>; exit-latency-us = <4000>;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 153/322 i40e: Fix VF disable behavior to block all traffic
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrii Staikov <[email protected]>
[ Upstream commit 31deb12e85c35ddd2c037f0107d05d8674cab2c0 ]
Currently, if a VF is disabled using the
'ip link set dev $ETHX vf $VF_NUM state disable' command, the VF is still able to receive traffic.
Fix the behavior of the 'ip link set dev $ETHX vf $VF_NUM state disable' to completely shutdown the VF's queues making it entirely disabled and not able to receive or send any traffic.
Modify the behavior of the 'ip link set $ETHX vf $VF_NUM state enable' command to make a VF do reinitialization bringing the queues back up.
--- .../ethernet/intel/i40e/i40e_virtchnl_pf.c | 32 +++++++++++++++++++ .../ethernet/intel/i40e/i40e_virtchnl_pf.h | 1 + 2 files changed, 33 insertions(+)
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c +32 -0
@@ -2605,6 +2605,14 @@ static int i40e_vc_enable_queues_msg(struct i40e_vf *vf, u8 *msg)int aq_ret =0 ;int i; +if (vf->is_disabled_from_host) { + aq_ret = -EPERM ; +dev_info (&pf->pdev->dev, +"Admin has disabled VF %d, will not enable queues\n" , + vf->vf_id); + goto error_param; + } +if (!test_bit (I40E_VF_STATE_ACTIVE , &vf->vf_states)) { aq_ret = -EINVAL ; goto error_param;
@@ -4732,9 +4740,12 @@ int i40e_ndo_set_vf_link_state(struct net_device *netdev, int vf_id, int link)struct i40e_link_status *ls = &pf->hw.phy.link_info;struct virtchnl_pf_event pfe;struct i40e_hw *hw = &pf->hw; +struct i40e_vsi *vsi; +unsigned long q_map;struct i40e_vf *vf;int abs_vf_id;int ret =0 ; +int tmp;if (test_and_set_bit (__I40E_VIRTCHNL_OP_PENDING, pf->state)) {dev_warn (&pf->pdev->dev,"Unable to configure VFs, other operation is pending.\n" );
@@ -4757,17 +4768,38 @@ int i40e_ndo_set_vf_link_state(struct net_device *netdev, int vf_id, int link)switch (link) {case IFLA_VF_LINK_STATE_AUTO : vf->link_forced = false; + vf->is_disabled_from_host = false; +/* reset needed to reinit VF resources */ +i40e_vc_reset_vf (vf, true);i40e_set_vf_link_state (vf, &pfe, ls);break ;case IFLA_VF_LINK_STATE_ENABLE : vf->link_forced = true; vf->link_up = true; + vf->is_disabled_from_host = false; +/* reset needed to reinit VF resources */ +i40e_vc_reset_vf (vf, true);i40e_set_vf_link_state (vf, &pfe, ls);break ;case IFLA_VF_LINK_STATE_DISABLE : vf->link_forced = true; vf->link_up = false;i40e_set_vf_link_state (vf, &pfe, ls); + + vsi = pf->vsi[vf->lan_vsi_idx]; + q_map =BIT (vsi->num_queue_pairs) -1 ; + + vf->is_disabled_from_host = true; + +/* Try to stop both Tx&Rx rings even if one of the calls fails +* to ensure we stop the rings even in case of errors. +* If any of them returns with an error then the first +* error that occurred will be returned. +*/ + tmp =i40e_ctrl_vf_tx_rings (vsi, q_map, false); + ret =i40e_ctrl_vf_rx_rings (vsi, q_map, false); + + ret = tmp ? tmp : ret;break ;default : ret = -EINVAL ;
drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.h +1 -0
@@ -98,6 +98,7 @@ struct i40e_vf {bool link_forced;bool link_up;/* only valid if VF link is forced */ bool spoofchk; +bool is_disabled_from_host;/* PF ctrl of VF enable/disable */ u16 num_vlan;/* ADq related variables */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 154/322 octeontx2-af: Fix max NPC MCAM entry check while validating ref_entry
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Suman Ghosh <[email protected]>
[ Upstream commit 4ebb1f95e0c3c3e0eec5bb21aa43097580c4b6e4 ]
As of today, the last MCAM entry was not getting allocated because of a <= check with the max_bmap count. This patch modifies that and if the requested entry is greater than the available entries then set it to the max value.
--- drivers/net/ethernet/marvell/octeontx2/af/rvu_npc.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-)
drivers/net/ethernet/marvell/octeontx2/af/rvu_npc.c +6 -7
@@ -2678,18 +2678,17 @@ int rvu_mbox_handler_npc_mcam_alloc_entry(struct rvu *rvu, rsp->entry =NPC_MCAM_ENTRY_INVALID ; rsp->free_count =0 ; -/* Check if ref_entry is within range */ -if (req->priority && req->ref_entry >= mcam->bmap_entries) { -dev_err (rvu->dev,"%s: reference entry %d is out of range\n" , - __func__, req->ref_entry); -return NPC_MCAM_INVALID_REQ ; - } +/* Check if ref_entry is greater that the range +* then set it to max value. +*/ +if (req->ref_entry > mcam->bmap_entries) + req->ref_entry = mcam->bmap_entries;/* ref_entry can't be '0' if requested priority is high. * Can't be last entry if requested priority is low. */ if ((!req->ref_entry && req->priority ==NPC_MCAM_HIGHER_PRIO ) || - ((req->ref_entry == (mcam->bmap_entries -1 )) && + ((req->ref_entry == mcam->bmap_entries) && req->priority ==NPC_MCAM_LOWER_PRIO ))return NPC_MCAM_INVALID_REQ ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 155/322 net: kcm: fix direct access to bv_len
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mina Almasry <[email protected]>
[ Upstream commit b15a4cfe100b9acd097d3ae7052448bd1cdc2a3b ]
Minor fix for kcm: code wanting to access the fields inside an skb frag should use the skb_frag_*() helpers, instead of accessing the fields directly.
--- net/kcm/kcmsock.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/kcm/kcmsock.c +1 -1
@@ -634,7 +634,7 @@ static int kcm_write_msgs(struct kcm_sock *kcm) msize =0 ;for (i =0 ; i <skb_shinfo (skb)->nr_frags; i++) - msize +=skb_shinfo (skb)->frags[i].bv_len; + msize +=skb_frag_size (&skb_shinfo (skb)->frags[i]); iov_iter_bvec(&msg.msg_iter, ITER_SOURCE, skb_shinfo(skb)->frags, skb_shinfo(skb)->nr_frags,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 156/322 net: dsa: qca8k: put MDIO bus OF node on qca8k_mdio_register() failure
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vladimir Oltean <[email protected]>
[ Upstream commit 68e1010cda7967cfca9c8650ee1f4efcae54ab90 ]
of_get_child_by_name() gives us an OF node with an elevated refcount, which should be dropped when we're done with it. This is so that, if (of_node_check_flag(node, OF_DYNAMIC)) is true, the node's memory can eventually be freed.
There are 2 distinct paths to be considered in qca8k_mdio_register():
- devm_of_mdiobus_register() succeeds: since commit 3b73a7b8ec38 ("net:
mdio_bus: add refcounting for fwnodes to mdiobus"), the MDIO core treats this well.
- devm_of_mdiobus_register() or anything up to that point fails: it is the duty of the qca8k driver to release the OF node.
This change addresses the second case by making sure that the OF node reference is not leaked.
The "mdio" node may be NULL, but of_node_put(NULL) is safe.
--- drivers/net/dsa/qca/qca8k-8xxx.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-)
drivers/net/dsa/qca/qca8k-8xxx.c +16 -5
@@ -949,10 +949,15 @@ qca8k_mdio_register(struct qca8k_priv *priv)struct dsa_switch *ds = priv->ds;struct device_node *mdio;struct mii_bus *bus; +int err; + + mdio =of_get_child_by_name (priv->dev->of_node,"mdio" ); bus =devm_mdiobus_alloc (ds->dev); -if (!bus) -return -ENOMEM ; +if (!bus) { + err = -ENOMEM ; + goto out_put_node; + } bus->priv = (void *)priv; snprintf(bus->id, MII_BUS_ID_SIZE, "qca8k-%d.%d",
@@ -962,12 +967,12 @@ qca8k_mdio_register(struct qca8k_priv *priv) ds->slave_mii_bus = bus;/* Check if the devicetree declare the port:phy mapping */ - mdio =of_get_child_by_name (priv->dev->of_node,"mdio" );if (of_device_is_available (mdio)) { bus->name ="qca8k slave mii" ; bus->read = qca8k_internal_mdio_read; bus->write = qca8k_internal_mdio_write; -return devm_of_mdiobus_register (priv->dev, bus, mdio); + err =devm_of_mdiobus_register (priv->dev, bus, mdio); + goto out_put_node; }/* If a mapping can't be found the legacy mapping is used,
@@ -976,7 +981,13 @@ qca8k_mdio_register(struct qca8k_priv *priv) bus->name ="qca8k-legacy slave mii" ; bus->read = qca8k_legacy_mdio_read; bus->write = qca8k_legacy_mdio_write; -return devm_mdiobus_register (priv->dev, bus); + + err =devm_mdiobus_register (priv->dev, bus); + +out_put_node: +of_node_put (mdio); + +return err; } static int
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 157/322 f2fs: fix to check return value of f2fs_reserve_new_block()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit 956fa1ddc132e028f3b7d4cf17e6bfc8cb36c7fd ]
Let's check return value of f2fs_reserve_new_block() in do_recover_data() rather than letting it fails silently.
Also refactoring check condition on return value of f2fs_reserve_new_block() as below:
- trigger f2fs_bug_on() only for ENOSPC case;
- use do-while statement to avoid redundant codes;
--- fs/f2fs/recovery.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-)
fs/f2fs/recovery.c +17 -6
@@ -712,7 +712,16 @@ static int do_recover_data(struct f2fs_sb_info *sbi, struct inode *inode,*/ if (dest ==NEW_ADDR ) {f2fs_truncate_data_blocks_range (&dn,1 ); -f2fs_reserve_new_block (&dn); +do { + err =f2fs_reserve_new_block (&dn); +if (err == -ENOSPC ) { +f2fs_bug_on (sbi,1 ); +break ; + } + }while (err && +IS_ENABLED (CONFIG_F2FS_FAULT_INJECTION )); +if (err) + goto err;continue ; }
@@ -720,12 +729,14 @@ static int do_recover_data(struct f2fs_sb_info *sbi, struct inode *inode,if (f2fs_is_valid_blkaddr (sbi, dest,META_POR )) {if (src ==NULL_ADDR ) { - err =f2fs_reserve_new_block (&dn); -while (err && -IS_ENABLED (CONFIG_F2FS_FAULT_INJECTION )) +do { err =f2fs_reserve_new_block (&dn); -/* We should not get -ENOSPC */ -f2fs_bug_on (sbi, err); +if (err == -ENOSPC ) { +f2fs_bug_on (sbi,1 ); +break ; + } + }while (err && +IS_ENABLED (CONFIG_F2FS_FAULT_INJECTION ));if (err) goto err; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 158/322 ALSA: hda: Refer to correct stream index at loops
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
[ Upstream commit 26257869672fd4a06a60c2da841e15fb2cb47bbe ]
In a couple of loops over the all streams, we check the bitmap against the loop counter. A more correct reference would be, however, the index of each stream, instead.
This patch corrects the check of bitmaps to the stream index.
Note that this change doesn't fix anything for now; all existing drivers set up the stream indices properly, hence the loop count is always equal with the stream index. That said, this change is only for consistency.
--- sound/hda/hdac_stream.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-)
sound/hda/hdac_stream.c +3 -6
@@ -660,17 +660,15 @@ void snd_hdac_stream_timecounter_init(struct hdac_stream *azx_dev,struct hdac_stream *s;bool inited = false;u64 cycle_last =0 ; -int i =0 ;list_for_each_entry (s, &bus->stream_list, list) { -if (streams & (1 << i)) { +if ((streams & (1 << s->index))) {azx_timecounter_init (s, inited, cycle_last);if (!inited) { inited = true; cycle_last = s->tc.cycle_last; } } - i++; }snd_pcm_gettime (runtime, &runtime->trigger_tstamp);
@@ -715,14 +713,13 @@ void snd_hdac_stream_sync(struct hdac_stream *azx_dev, bool start, unsigned int streams) {struct hdac_bus *bus = azx_dev->bus; -int i, nwait, timeout; +int nwait, timeout;struct hdac_stream *s;for (timeout =5000 ; timeout; timeout--) { nwait =0 ; - i =0 ;list_for_each_entry (s, &bus->stream_list, list) { -if (!(streams & (1 << i++))) +if (!(streams & (1 << s->index)))continue ;if (start) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 159/322 ASoC: doc: Fix undefined SND_SOC_DAPM_NOPM argument
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cristian Ciocaltea <[email protected]>
[ Upstream commit 67c7666fe808c3a7af3cc6f9d0a3dd3acfd26115 ]
The virtual widget example makes use of an undefined SND_SOC_DAPM_NOPM argument passed to SND_SOC_DAPM_MIXER(). Replace with the correct SND_SOC_NOPM definition.
--- Documentation/sound/soc/dapm.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
Documentation/sound/soc/dapm.rst +1 -1
@@ -234,7 +234,7 @@ corresponding soft power control. In this case it is necessary to create a virtual widget - a widget with no control bits e.g. :: - SND_SOC_DAPM_MIXER("AC97 Mixer", SND_SOC_DAPM_NOPM, 0, 0, NULL, 0), + SND_SOC_DAPM_MIXER("AC97 Mixer", SND_SOC_NOPM, 0, 0, NULL, 0), This can be used to merge to signal paths together in software.
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 160/322 fast_dput(): handle underflows gracefully
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
[ Upstream commit 504e08cebe1d4e1efe25f915234f646e74a364a8 ]
If refcount is less than 1, we should just warn, unlock dentry and return true, so that the caller doesn't try to do anything else.
Taking care of that leaves the rest of "lockref_put_return() has failed" case equivalent to "decrement refcount and rejoin the normal slow path after the point where we grab ->d_lock".
NOTE: lockref_put_return() is strictly a fastpath thing - unlike the rest of lockref primitives, it does not contain a fallback. Caller (and it looks like fast_dput() is the only legitimate one in the entire kernel) has to do that itself. Reasons for lockref_put_return() failures:
* ->d_lock held by somebody
* refcount <= 0
* ... or an architecture not supporting lockref use of
cmpxchg - sparc, anything non-SMP, config with spinlock debugging...
We could add a fallback, but it would be a clumsy API - we'd have to distinguish between:
(1) refcount > 1 - decremented, lock not held on return
(2) refcount < 1 - left alone, probably no sense to hold the lock
(3) refcount is 1, no cmphxcg - decremented, lock held on return
(4) refcount is 1, cmphxcg supported - decremented, lock *NOT* held on return.
We want to return with no lock held in case (4); that's the whole point of that thing. We very much do not want to have the fallback in case (3) return without a lock, since the caller might have to retake it in that case.
So it wouldn't be more convenient than doing the fallback in the caller and it would be very easy to screw up, especially since the test coverage would suck - no way to test (3) and (4) on the same kernel build.
--- fs/dcache.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
fs/dcache.c +4 -3
@@ -787,12 +787,12 @@ static inline bool fast_dput(struct dentry *dentry)*/ if (unlikely (ret <0 )) {spin_lock (&dentry->d_lock); -if (dentry->d_lockref.count >1 ) { - dentry->d_lockref.count--; +if (WARN_ON_ONCE (dentry->d_lockref.count <=0 )) {spin_unlock (&dentry->d_lock);return true; } -return false; + dentry->d_lockref.count--; + goto locked; }/*
@@ -850,6 +850,7 @@ static inline bool fast_dput(struct dentry *dentry)* else could have killed it and marked it dead. Either way, we * don't need to do anything else. */ +locked:if (dentry->d_lockref.count) {spin_unlock (&dentry->d_lock);return true;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 161/322 reiserfs: Avoid touching renamed directory if parent does not change
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jan Kara <[email protected]>
[ Upstream commit 49db9b1b86a82448dfaf3fcfefcf678dee56c8ed ]
The VFS will not be locking moved directory if its parent does not change. Change reiserfs rename code to avoid touching renamed directory if its parent does not change as without locking that can corrupt the filesystem.
--- fs/reiserfs/namei.c | 54 ++++++++++++++++++++++++--------------------- 1 file changed, 29 insertions(+), 25 deletions(-)
fs/reiserfs/namei.c +29 -25
@@ -1324,8 +1324,8 @@ static int reiserfs_rename(struct mnt_idmap *idmap,struct inode *old_inode, *new_dentry_inode;struct reiserfs_transaction_handle th;int jbegin_count; -umode_t old_inode_mode;unsigned long savelink =1 ; +bool update_dir_parent = false;if (flags & ~RENAME_NOREPLACE )return -EINVAL ;
@@ -1375,8 +1375,7 @@ static int reiserfs_rename(struct mnt_idmap *idmap,return -ENOENT ; } - old_inode_mode = old_inode->i_mode; -if (S_ISDIR (old_inode_mode)) { +if (S_ISDIR (old_inode->i_mode)) {/* * make sure that directory being renamed has correct ".." * and that its new parent directory has not too many links
@@ -1389,24 +1388,28 @@ static int reiserfs_rename(struct mnt_idmap *idmap, } } -/* -* directory is renamed, its parent directory will be changed, -* so find ".." entry -*/ - dot_dot_de.de_gen_number_bit_string =NULL ; - retval = -reiserfs_find_entry (old_inode,".." ,2 , &dot_dot_entry_path, +if (old_dir != new_dir) { +/* +* directory is renamed, its parent directory will be +* changed, so find ".." entry +*/ + dot_dot_de.de_gen_number_bit_string =NULL ; + retval = +reiserfs_find_entry (old_inode,".." ,2 , + &dot_dot_entry_path, &dot_dot_de); -pathrelse (&dot_dot_entry_path); -if (retval !=NAME_FOUND ) { -reiserfs_write_unlock (old_dir->i_sb); -return -EIO ; - } +pathrelse (&dot_dot_entry_path); +if (retval !=NAME_FOUND ) { +reiserfs_write_unlock (old_dir->i_sb); +return -EIO ; + } -/* inode number of .. must equal old_dir->i_ino */ -if (dot_dot_de.de_objectid != old_dir->i_ino) { -reiserfs_write_unlock (old_dir->i_sb); -return -EIO ; +/* inode number of .. must equal old_dir->i_ino */ +if (dot_dot_de.de_objectid != old_dir->i_ino) { +reiserfs_write_unlock (old_dir->i_sb); +return -EIO ; + } + update_dir_parent = true; } }
@@ -1486,7 +1489,7 @@ static int reiserfs_rename(struct mnt_idmap *idmap,reiserfs_prepare_for_journal (old_inode->i_sb, new_de.de_bh,1 ); - if (S_ISDIR(old_inode->i_mode)) { + if (update_dir_parent) { if ((retval = search_by_entry_key(new_dir->i_sb, &dot_dot_de.de_entry_key,
@@ -1534,14 +1537,14 @@ static int reiserfs_rename(struct mnt_idmap *idmap, new_de.de_bh);reiserfs_restore_prepared_buffer (old_inode->i_sb, old_de.de_bh); -if (S_ISDIR (old_inode_mode)) +if (update_dir_parent)reiserfs_restore_prepared_buffer (old_inode-> i_sb, dot_dot_de. de_bh);continue ; } -if (S_ISDIR (old_inode_mode)) { +if (update_dir_parent) {if (item_moved (&dot_dot_ih, &dot_dot_entry_path) || !entry_points_to_object (".." ,2 , &dot_dot_de, old_dir)) {
@@ -1559,7 +1562,7 @@ static int reiserfs_rename(struct mnt_idmap *idmap, } } -RFALSE (S_ISDIR (old_inode_mode) && +RFALSE (update_dir_parent && !buffer_journal_prepared (dot_dot_de.de_bh),"" );break ;
@@ -1592,11 +1595,12 @@ static int reiserfs_rename(struct mnt_idmap *idmap, savelink = new_dentry_inode->i_nlink; } -if (S_ISDIR (old_inode_mode)) { +if (update_dir_parent) {/* adjust ".." of renamed directory */ set_ino_in_dir_entry (&dot_dot_de,INODE_PKEY (new_dir));journal_mark_dirty (&th, dot_dot_de.de_bh); - + } +if (S_ISDIR (old_inode->i_mode)) {/* * there (in new_dir) was no directory, so it got new link * (".." of renamed directory)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 162/322 RDMA/IPoIB: Fix error code return in ipoib_mcast_join
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jack Wang <[email protected]>
[ Upstream commit 753fff78f430704548f45eda52d6d55371a52c0f ]
Return the error code in case of ib_sa_join_multicast fail.
--- drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 1 + 1 file changed, 1 insertion(+)
drivers/infiniband/ulp/ipoib/ipoib_multicast.c +1 -0
@@ -546,6 +546,7 @@ static int ipoib_mcast_join(struct net_device *dev, struct ipoib_mcast *mcast)spin_unlock_irq (&priv->lock);complete (&mcast->done);spin_lock_irq (&priv->lock); +return ret; }return 0 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 163/322 drm/panel-edp: Add override_edid_mode quirk for generic edp
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hsin-Yi Wang <[email protected]>
[ Upstream commit 9f7843b515811aea6c56527eb195b622e9c01f12 ]
Generic edp gets mode from edid. However, some panels report incorrect mode in this way, resulting in glitches on panel. Introduce a new quirk additional_mode to the generic edid to pick a correct hardcoded mode.
--- drivers/gpu/drm/panel/panel-edp.c | 48 +++++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 3 deletions(-)
drivers/gpu/drm/panel/panel-edp.c +45 -3
@@ -203,6 +203,9 @@ struct edp_panel_entry {/** @name: Name of this panel (for printing to logs). */ const char *name; + +/** @override_edid_mode: Override the mode obtained by edid. */ +const struct drm_display_mode *override_edid_mode; };struct panel_edp {
@@ -301,6 +304,24 @@ static unsigned int panel_edp_get_display_modes(struct panel_edp *panel,return num; } +static int panel_edp_override_edid_mode (struct panel_edp *panel, +struct drm_connector *connector, +const struct drm_display_mode *override_mode) +{ +struct drm_display_mode *mode; + + mode =drm_mode_duplicate (connector->dev, override_mode); +if (!mode) { +dev_err (panel->base.dev,"failed to add additional mode\n" ); +return 0 ; + } + + mode->type |=DRM_MODE_TYPE_DRIVER |DRM_MODE_TYPE_PREFERRED ; +drm_mode_set_name (mode); +drm_mode_probed_add (connector, mode); +return 1 ; +} +static int panel_edp_get_non_edid_modes (struct panel_edp *panel,struct drm_connector *connector) {
@@ -568,6 +589,9 @@ static int panel_edp_get_modes(struct drm_panel *panel, {struct panel_edp *p =to_panel_edp (panel);int num =0 ; +bool has_override_edid_mode = p->detected_panel && + p->detected_panel !=ERR_PTR (-EINVAL ) && + p->detected_panel->override_edid_mode;/* probe EDID if a DDC bus is available */ if (p->ddc) {
@@ -575,9 +599,18 @@ static int panel_edp_get_modes(struct drm_panel *panel,if (!p->edid) p->edid =drm_get_edid (connector, p->ddc); - -if (p->edid) - num +=drm_add_edid_modes (connector, p->edid); +if (p->edid) { +if (has_override_edid_mode) { +/* +* override_edid_mode is specified. Use +* override_edid_mode instead of from edid. +*/ + num +=panel_edp_override_edid_mode (p, connector, + p->detected_panel->override_edid_mode); + }else { + num +=drm_add_edid_modes (connector, p->edid); + } + }pm_runtime_mark_last_busy (panel->dev);pm_runtime_put_autosuspend (panel->dev);
@@ -1830,6 +1863,15 @@ static const struct panel_delay delay_200_500_e200 = { .delay = _delay \ } +#define EDP_PANEL_ENTRY2 (vend_chr_0, vend_chr_1, vend_chr_2, product_id, _delay, _name, _mode) \ +{ \ + .name = _name, \ + .panel_id = drm_edid_encode_panel_id(vend_chr_0, vend_chr_1, vend_chr_2, \ + product_id), \ + .delay = _delay, \ + .override_edid_mode = _mode \ +} +/* * This table is used to figure out power sequencing delays for panels that * are detected by EDID. Entries here may point to entries in the
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 164/322 drm/bridge: anx7625: Fix Set HPD irq detect window to 2ms
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xin Ji <[email protected]>
[ Upstream commit e3af7053de3f685c96158373bc234b2feca1f160 ]
Polling firmware HPD GPIO status, set HPD irq detect window to 2ms after firmware HPD GPIO initial done
--- drivers/gpu/drm/bridge/analogix/anx7625.c | 51 ++++++++++++++++------- drivers/gpu/drm/bridge/analogix/anx7625.h | 4 ++ 2 files changed, 40 insertions(+), 15 deletions(-)
drivers/gpu/drm/bridge/analogix/anx7625.c +36 -15
@@ -1298,10 +1298,32 @@ static void anx7625_config(struct anx7625_data *ctx) XTAL_FRQ_SEL, XTAL_FRQ_27M); } +static int anx7625_hpd_timer_config (struct anx7625_data *ctx) +{ +int ret; + +/* Set irq detect window to 2ms */ + ret =anx7625_reg_write (ctx, ctx->i2c.tx_p2_client, +HPD_DET_TIMER_BIT0_7 ,HPD_TIME &0xFF ); + ret |=anx7625_reg_write (ctx, ctx->i2c.tx_p2_client, +HPD_DET_TIMER_BIT8_15 , + (HPD_TIME >>8 ) &0xFF ); + ret |=anx7625_reg_write (ctx, ctx->i2c.tx_p2_client, +HPD_DET_TIMER_BIT16_23 , + (HPD_TIME >>16 ) &0xFF ); + +return ret; +} + +static int anx7625_read_hpd_gpio_config_status (struct anx7625_data *ctx) +{ +return anx7625_reg_read (ctx, ctx->i2c.rx_p0_client,GPIO_CTRL_2 ); +} +static void anx7625_disable_pd_protocol (struct anx7625_data *ctx) {struct device *dev = ctx->dev; -int ret; +int ret, val;/* Reset main ocm */ ret =anx7625_reg_write (ctx, ctx->i2c.rx_p0_client,0x88 ,0x40 );
@@ -1315,6 +1337,19 @@ static void anx7625_disable_pd_protocol(struct anx7625_data *ctx)DRM_DEV_DEBUG_DRIVER (dev,"disable PD feature fail.\n" ); else DRM_DEV_DEBUG_DRIVER(dev, "disable PD feature succeeded.\n"); + +/* +* Make sure the HPD GPIO already be configured after OCM release before +* setting HPD detect window register. Here we poll the status register +* at maximum 40ms, then config HPD irq detect window register +*/ +readx_poll_timeout (anx7625_read_hpd_gpio_config_status, + ctx, val, + ((val &HPD_SOURCE ) || (val <0 )), +2000 ,2000 *20 ); + +/* Set HPD irq detect window to 2ms */ +anx7625_hpd_timer_config (ctx); }static int anx7625_ocm_loading_check (struct anx7625_data *ctx)
@@ -1437,20 +1472,6 @@ static void anx7625_start_dp_work(struct anx7625_data *ctx)static int anx7625_read_hpd_status_p0 (struct anx7625_data *ctx) { -int ret; - -/* Set irq detect window to 2ms */ - ret =anx7625_reg_write (ctx, ctx->i2c.tx_p2_client, -HPD_DET_TIMER_BIT0_7 ,HPD_TIME &0xFF ); - ret |=anx7625_reg_write (ctx, ctx->i2c.tx_p2_client, -HPD_DET_TIMER_BIT8_15 , - (HPD_TIME >>8 ) &0xFF ); - ret |=anx7625_reg_write (ctx, ctx->i2c.tx_p2_client, -HPD_DET_TIMER_BIT16_23 , - (HPD_TIME >>16 ) &0xFF ); -if (ret <0 ) -return ret; -return anx7625_reg_read (ctx, ctx->i2c.rx_p0_client,SYSTEM_STSTUS ); }
drivers/gpu/drm/bridge/analogix/anx7625.h +4 -0
@@ -259,6 +259,10 @@#define AP_MIPI_RX_EN BIT(5)/* 1: MIPI RX input in 0: no RX in */ #define AP_DISABLE_PD BIT(6)#define AP_DISABLE_DISPLAY BIT(7) + +#define GPIO_CTRL_2 0x49 +#define HPD_SOURCE BIT(6) +/***************************************************************/ /* Register definition of device address 0x84 */ #define MIPI_PHY_CONTROL_3 0x03
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 165/322 drm/amd/display: Fix tiled display misalignment
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Meenakshikumar Somasundaram <[email protected]>
[ Upstream commit c4b8394e76adba4f50a3c2696c75b214a291e24a ]
[Why]
When otg workaround is applied during clock update, otgs of tiled display went out of sync.
[How]
To call dc_trigger_sync() after clock update to sync otgs again.
--- drivers/gpu/drm/amd/display/dc/core/dc.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/gpu/drm/amd/display/dc/core/dc.c +4 -0
@@ -1948,6 +1948,10 @@ static enum dc_status dc_commit_state_no_check(struct dc *dc, struct dc_state *cwait_for_no_pipes_pending (dc, context);/* pplib is notified if disp_num changed */ dc->hwss.optimize_bandwidth (dc, context); +/* Need to do otg sync again as otg could be out of sync due to otg +* workaround applied during clock update +*/ +dc_trigger_sync (dc, context); }if (dc->hwss.update_dsc_pg)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 166/322 f2fs: fix write pointers on zoned device after roll forward
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jaegeuk Kim <[email protected]>
[ Upstream commit 9dad4d964291295ef48243d4e03972b85138bc9f ]
1. do roll forward recovery
2. update current segments pointers
3. fix the entire zones' write pointers
4. do checkpoint
--- fs/f2fs/recovery.c | 2 ++ 1 file changed, 2 insertions(+)
fs/f2fs/recovery.c +2 -0
@@ -917,6 +917,8 @@ int f2fs_recover_fsync_data(struct f2fs_sb_info *sbi, bool check_only)if (!err && fix_curseg_write_pointer && !f2fs_readonly (sbi->sb) &&f2fs_sb_has_blkzoned (sbi)) { err =f2fs_fix_curseg_write_pointer (sbi); +if (!err) + err =f2fs_check_write_pointer (sbi); ret = err; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 167/322 ASoC: amd: Add new dmi entries for acp5x platform
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Venkata Prasad Potturu <[email protected]>
[ Upstream commit c3ab23a10771bbe06300e5374efa809789c65455 ]
Add sys_vendor and product_name dmi entries for acp5x platform.
--- sound/soc/amd/acp-config.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-)
sound/soc/amd/acp-config.c +14 -1
@@ -3,7 +3,7 @@// This file is provided under a dual BSD/GPLv2 license. When using or // redistributing this file, you may do so under either license. // -// Copyright(c) 2021 Advanced Micro Devices, Inc. +// Copyright(c) 2021, 2023 Advanced Micro Devices, Inc. // // Authors: Ajit Kumar Pandey <[email protected]> //
@@ -47,6 +47,19 @@ static const struct config_entry config_table[] = { {} }, }, + { + .flags = FLAG_AMD_LEGACY, + .device = ACP_PCI_DEV_ID, + .dmi_table = (const struct dmi_system_id []) { + { + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Valve" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Jupiter" ), + }, + }, + {} + }, + }, { .flags = FLAG_AMD_SOF, .device = ACP_PCI_DEV_ID,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 168/322 drm/amd/display: Fix MST PBN/X.Y value calculations
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ilya Bakoulin <[email protected]>
[ Upstream commit 94bbf802efd0a8f13147d6664af6e653637340a8 ]
Changing PBN calculation to be more in line with spec. We don't need to inflate PBN_NATIVE value by the 1.006 margin, since that is already taken care of in the get_pbn_per_slot function.
--- drivers/gpu/drm/amd/display/dc/link/link_dpms.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-)
drivers/gpu/drm/amd/display/dc/link/link_dpms.c +8 -5
@@ -1059,18 +1059,21 @@ static struct fixed31_32 get_pbn_from_bw_in_kbps(uint64_t kbps)uint32_t denominator =1 ;/* -* margin 5300ppm + 300ppm ~ 0.6% as per spec, factor is 1.006 +* The 1.006 factor (margin 5300ppm + 300ppm ~ 0.6% as per spec) is not +* required when determining PBN/time slot utilization on the link between +* us and the branch, since that overhead is already accounted for in +* the get_pbn_per_slot function. +* * The unit of 54/64Mbytes/sec is an arbitrary unit chosen based on * common multiplier to render an integer PBN for all link rate/lane * counts combinations * calculate -* peak_kbps *= (1006/1000) * peak_kbps *= (64/54) -* peak_kbps *= 8 convert to bytes +* peak_kbps /= (8 * 1000) convert to bytes */ - numerator =64 *PEAK_FACTOR_X1000 ; - denominator =54 *8 *1000 *1000 ; + numerator =64 ; + denominator =54 *8 *1000 ; kbps *= numerator; peak_kbps =dc_fixpt_from_fraction (kbps, denominator);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 169/322 drm/drm_file: fix use of uninitialized variable
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit 1d3062fad9c7313fff9970a88e0538a24480ffb8 ]
smatch reports:
drivers/gpu/drm/drm_file.c:967 drm_show_memory_stats() error: uninitialized symbol 'supported_status'.
'supported_status' is only set in one code path. I'm not familiar with the code to say if that path will always be ran in real life, but whether that is the case or not, I think it is good to initialize 'supported_status' to 0 to silence the warning (and possibly fix a bug).
--- drivers/gpu/drm/drm_file.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/drm_file.c +1 -1
@@ -958,7 +958,7 @@ void drm_show_memory_stats(struct drm_printer *p, struct drm_file *file) {struct drm_gem_object *obj;struct drm_memory_stats status = {}; -enum drm_gem_object_status supported_status; +enum drm_gem_object_status supported_status =0 ;int id;spin_lock (&file->table_lock);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 170/322 drm/framebuffer: Fix use of uninitialized variable
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit f9af8f0c1dc567a5a6a6318ff324c45d80d4a60f ]
smatch reports:
drivers/gpu/drm/drm_framebuffer.c:654 drm_mode_getfb2_ioctl() error: uninitialized symbol 'ret'.
'ret' is possibly not set when there are no errors, causing the error above. I can't say if that ever happens in real-life, but in any case I think it is good to initialize 'ret' to 0.
--- drivers/gpu/drm/drm_framebuffer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/drm_framebuffer.c +1 -1
@@ -570,7 +570,7 @@ int drm_mode_getfb2_ioctl(struct drm_device *dev,struct drm_mode_fb_cmd2 *r = data;struct drm_framebuffer *fb;unsigned int i; -int ret; +int ret =0 ;if (!drm_core_check_feature (dev,DRIVER_MODESET ))return -EINVAL ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 171/322 drm/mipi-dsi: Fix detach call without attach
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit 90d50b8d85834e73536fdccd5aa913b30494fef0 ]
It's been reported that DSI host driver's detach can be called without the attach ever happening:
https://lore.kernel.org/all/[email protected]/
After reading the code, I think this is what happens:
We have a DSI host defined in the device tree and a DSI peripheral under that host (i.e. an i2c device using the DSI as data bus doesn't exhibit this behavior).
The host driver calls mipi_dsi_host_register(), which causes (via a few functions) mipi_dsi_device_add() to be called for the DSI peripheral. So now we have a DSI device under the host, but attach hasn't been called.
Normally the probing of the devices continues, and eventually the DSI peripheral's driver will call mipi_dsi_attach(), attaching the peripheral.
However, if the host driver's probe encounters an error after calling mipi_dsi_host_register(), and before the peripheral has called mipi_dsi_attach(), the host driver will do cleanups and return an error from its probe function. The cleanups include calling mipi_dsi_host_unregister().
mipi_dsi_host_unregister() will call two functions for all its DSI peripheral devices: mipi_dsi_detach() and mipi_dsi_device_unregister(). The latter makes sense, as the device exists, but the former may be wrong as attach has not necessarily been done.
To fix this, track the attached state of the peripheral, and only detach from mipi_dsi_host_unregister() if the peripheral was attached.
Note that I have only tested this with a board with an i2c DSI peripheral, not with a "pure" DSI peripheral.
However, slightly related, the unregister machinery still seems broken. E.g. if the DSI host driver is unbound, it'll detach and unregister the DSI peripherals. After that, when the DSI peripheral driver unbound it'll call detach either directly or using the devm variant, leading to a crash. And probably the driver will crash if it happens, for some reason, to try to send a message via the DSI bus.
But that's another topic.
--- drivers/gpu/drm/drm_mipi_dsi.c | 17 +++++++++++++++-- include/drm/drm_mipi_dsi.h | 2 ++ 2 files changed, 17 insertions(+), 2 deletions(-)
drivers/gpu/drm/drm_mipi_dsi.c +15 -2
@@ -347,7 +347,8 @@ static int mipi_dsi_remove_device_fn(struct device *dev, void *priv) {struct mipi_dsi_device *dsi =to_mipi_dsi_device (dev); -mipi_dsi_detach (dsi); +if (dsi->attached) +mipi_dsi_detach (dsi);mipi_dsi_device_unregister (dsi);return 0 ;
@@ -370,11 +371,18 @@ EXPORT_SYMBOL(mipi_dsi_host_unregister);int mipi_dsi_attach (struct mipi_dsi_device *dsi) {const struct mipi_dsi_host_ops *ops = dsi->host->ops; +int ret;if (!ops || !ops->attach)return -ENOSYS ; -return ops->attach (dsi->host, dsi); + ret = ops->attach (dsi->host, dsi); +if (ret) +return ret; + + dsi->attached = true; + +return 0 ; }EXPORT_SYMBOL (mipi_dsi_attach);
@@ -386,9 +394,14 @@ int mipi_dsi_detach(struct mipi_dsi_device *dsi) {const struct mipi_dsi_host_ops *ops = dsi->host->ops; +if (WARN_ON (!dsi->attached)) +return -EINVAL ; +if (!ops || !ops->detach)return -ENOSYS ; + dsi->attached = false; +return ops->detach (dsi->host, dsi); }EXPORT_SYMBOL (mipi_dsi_detach);
include/drm/drm_mipi_dsi.h +2 -0
@@ -168,6 +168,7 @@ struct mipi_dsi_device_info {* struct mipi_dsi_device - DSI peripheral device * @host: DSI host for this peripheral * @dev: driver model device node for this peripheral +* @attached: the DSI device has been successfully attached * @name: DSI peripheral chip type * @channel: virtual channel assigned to the peripheral * @format: pixel format for video mode
@@ -184,6 +185,7 @@ struct mipi_dsi_device_info {struct mipi_dsi_device {struct mipi_dsi_host *host;struct device dev; +bool attached;char name[DSI_DEV_NAME_SIZE ];unsigned int channel;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 172/322 media: stk1160: Fixed high volume of stk1160_dbg messages
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ghanshyam Agrawal <[email protected]>
[ Upstream commit b3695e86d25aafbe175dd51f6aaf6f68d341d590 ]
The function stk1160_dbg gets called too many times, which causes the output to get flooded with messages. Since stk1160_dbg uses printk, it is now replaced with printk_ratelimited.
--- drivers/media/usb/stk1160/stk1160-video.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/media/usb/stk1160/stk1160-video.c +2 -3
@@ -107,8 +107,7 @@ void stk1160_copy_video(struct stk1160 *dev, u8 *src, int len)/* * TODO: These stk1160_dbg are very spammy! -* We should 1) check why we are getting them -* and 2) add ratelimit. +* We should check why we are getting them. * * UPDATE: One of the reasons (the only one?) for getting these * is incorrect standard (mismatch between expected and configured).
@@ -151,7 +150,7 @@ void stk1160_copy_video(struct stk1160 *dev, u8 *src, int len)/* Let the bug hunt begin! sanity checks! */ if (lencopy <0 ) { -stk1160_dbg ("copy skipped: negative lencopy\n" ); +printk_ratelimited (KERN_DEBUG "copy skipped: negative lencopy\n" );return ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 173/322 media: rockchip: rga: fix swizzling for RGB formats
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Tretter <[email protected]>
[ Upstream commit 9e7dc39260edac180c206bb6149595a40eabae3e ]
When using 32 bit RGB formats, the RGA on the rk3568 produces wrong colors as the wrong color channels are read or written. The reason is that the format description for the channel swizzeling is wrong and the wrong bits are configured. For example, when converting ARGB32 to NV12, the alpha channel is used as blue channel.. This doesn't happen if the color format is the same on both sides.
Fix the color_swap settings of the formats to correctly handle 32 bit RGB formats.
For RGA_COLOR_FMT_XBGR8888, the RGA_COLOR_ALPHA_SWAP bit doesn't have an effect. Thus, it isn't possible to handle the V4L2_PIX_FMT_XRGB32. Thus, it is removed from the list of supported formats.
--- drivers/media/platform/rockchip/rga/rga.c | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-)
drivers/media/platform/rockchip/rga/rga.c +3 -12
@@ -184,25 +184,16 @@ static int rga_setup_ctrls(struct rga_ctx *ctx)static struct rga_fmt formats[] = { { .fourcc =V4L2_PIX_FMT_ARGB32 , - .color_swap =RGA_COLOR_RB_SWAP , + .color_swap =RGA_COLOR_ALPHA_SWAP , .hw_format =RGA_COLOR_FMT_ABGR8888 , .depth =32 , .uv_factor =1 , .y_div =1 , .x_div =1 , }, - { - .fourcc =V4L2_PIX_FMT_XRGB32 , - .color_swap =RGA_COLOR_RB_SWAP , - .hw_format =RGA_COLOR_FMT_XBGR8888 , - .depth =32 , - .uv_factor =1 , - .y_div =1 , - .x_div =1 , - }, { .fourcc =V4L2_PIX_FMT_ABGR32 , - .color_swap =RGA_COLOR_ALPHA_SWAP , + .color_swap =RGA_COLOR_RB_SWAP , .hw_format =RGA_COLOR_FMT_ABGR8888 , .depth =32 , .uv_factor =1 ,
@@ -211,7 +202,7 @@ static struct rga_fmt formats[] = { }, { .fourcc = V4L2_PIX_FMT_XBGR32, - .color_swap = RGA_COLOR_ALPHA_SWAP, + .color_swap = RGA_COLOR_RB_SWAP, .hw_format = RGA_COLOR_FMT_XBGR8888, .depth = 32, .uv_factor = 1,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 174/322 PCI: add INTEL_HDA_ARL to pci_ids.h
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pierre-Louis Bossart <[email protected]>
[ Upstream commit 5ec42bf04d72fd6d0a6855810cc779e0ee31dfd7 ]
The PCI ID insertion follows the increasing order in the table, but this hardware follows MTL (MeteorLake).
--- include/linux/pci_ids.h | 1 + 1 file changed, 1 insertion(+)
include/linux/pci_ids.h +1 -0
@@ -3064,6 +3064,7 @@#define PCI_DEVICE_ID_INTEL_82443GX_0 0x71a0#define PCI_DEVICE_ID_INTEL_82443GX_2 0x71a2#define PCI_DEVICE_ID_INTEL_82372FB_1 0x7601 +#define PCI_DEVICE_ID_INTEL_HDA_ARL 0x7728#define PCI_DEVICE_ID_INTEL_HDA_RPL_S 0x7a50#define PCI_DEVICE_ID_INTEL_HDA_ADL_S 0x7ad0#define PCI_DEVICE_ID_INTEL_HDA_MTL 0x7e28
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 175/322 ALSA: hda: Intel: add HDA_ARL PCI ID support
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pierre-Louis Bossart <[email protected]>
[ Upstream commit a31014ebad617868c246d3985ff80d891f03711e ]
Yet another PCI ID.
--- sound/pci/hda/hda_intel.c | 2 ++ 1 file changed, 2 insertions(+)
sound/pci/hda/hda_intel.c +2 -0
@@ -2504,6 +2504,8 @@ static const struct pci_device_id azx_ids[] = { { PCI_DEVICE_DATA(INTEL, HDA_LNL_P, AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE) },/* Arrow Lake-S */ { PCI_DEVICE_DATA(INTEL, HDA_ARL_S, AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE) }, +/* Arrow Lake */ + { PCI_DEVICE_DATA(INTEL, HDA_ARL, AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE) },/* Apollolake (Broxton-P) */ { PCI_DEVICE_DATA(INTEL, HDA_APL, AZX_DRIVER_SKL | AZX_DCAPS_INTEL_BROXTON) },/* Gemini-Lake */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 176/322 ALSA: hda: intel-dspcfg: add filters for ARL-S and ARL
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pierre-Louis Bossart <[email protected]>
[ Upstream commit 7a9d6bbe8a663c817080be55d9fecf19a4a8fd8f ]
Same usual filters, SOF is required for DMIC and/or SoundWire support.
--- sound/hda/intel-dsp-config.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
sound/hda/intel-dsp-config.c +10 -0
@@ -521,6 +521,16 @@ static const struct config_entry config_table[] = { .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE, .device = PCI_DEVICE_ID_INTEL_HDA_MTL, }, + /* ArrowLake-S */ + { + .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE, + .device = PCI_DEVICE_ID_INTEL_HDA_ARL_S, + }, + /* ArrowLake */ + { + .flags = FLAG_SOF | FLAG_SOF_ONLY_IF_DMIC_OR_SOUNDWIRE, + .device = PCI_DEVICE_ID_INTEL_HDA_ARL, + }, #endif /* Lunar Lake */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 177/322 drm/msm/dp: Add DisplayPort controller for SM8650
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Neil Armstrong <[email protected]>
[ Upstream commit 1b2d98bdd7b7c64265732f5f0dace4c52c9ba8a8 ]
The Qualcomm SM8650 platform comes with a DisplayPort controller with a different base offset than the previous SM8550 SoC, add support for this in the DisplayPort driver.
Patchwork: https://patchwork.freedesktop.org/patch/571132/
--- drivers/gpu/drm/msm/dp/dp_display.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/gpu/drm/msm/dp/dp_display.c +6 -0
@@ -171,6 +171,11 @@ static const struct msm_dp_desc sm8350_dp_descs[] = { {} }; +static const struct msm_dp_desc sm8650_dp_descs[] = { + { .io_start =0x0af54000 , .id =MSM_DP_CONTROLLER_0 , .connector_type = DRM_MODE_CONNECTOR_DisplayPort }, + {} +}; +static const struct of_device_id dp_dt_match[] = { { .compatible ="qcom,sc7180-dp" , .data = &sc7180_dp_descs }, { .compatible ="qcom,sc7280-dp" , .data = &sc7280_dp_descs },
@@ -181,6 +186,7 @@ static const struct of_device_id dp_dt_match[] = { { .compatible = "qcom,sc8280xp-edp", .data = &sc8280xp_edp_descs }, { .compatible = "qcom,sdm845-dp", .data = &sc7180_dp_descs }, { .compatible = "qcom,sm8350-dp", .data = &sm8350_dp_descs }, + { .compatible = "qcom,sm8650-dp", .data = &sm8650_dp_descs }, {} };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 178/322 media: uvcvideo: Fix power line control for a Chicony camera
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ricardo Ribalda <[email protected]>
[ Upstream commit dba3e701917a4cce92920f8ccb9fa4d4ee5ac07e ]
The device does not implement the control properly.
Fixes v4l2-compliance error:
info: checking control 'Power Line Frequency' (0x00980918)
fail: v4l2-test-controls.cpp(552): could not set valid menu item 3
--- drivers/media/usb/uvc/uvc_driver.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/media/usb/uvc/uvc_driver.c +9 -0
@@ -2592,6 +2592,15 @@ static const struct usb_device_id uvc_ids[] = { .bInterfaceSubClass = 1, .bInterfaceProtocol = 0, .driver_info = (kernel_ulong_t)&uvc_ctrl_power_line_limited }, +/* Chicony Electronics Co., Ltd Integrated Camera */ + { .match_flags = USB_DEVICE_ID_MATCH_DEVICE + | USB_DEVICE_ID_MATCH_INT_INFO, + .idVendor = 0x04f2, + .idProduct = 0xb67c, + .bInterfaceClass = USB_CLASS_VIDEO, + .bInterfaceSubClass = 1, + .bInterfaceProtocol = UVC_PC_PROTOCOL_15, + .driver_info = (kernel_ulong_t)&uvc_ctrl_power_line_uvc11 },/* Chicony EasyCamera */ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_INFO,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 179/322 media: uvcvideo: Fix power line control for SunplusIT camera
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ricardo Ribalda <[email protected]>
[ Upstream commit 6180056b0e0c097dad5d1569dcd661eaf509ea43 ]
The device does not implement the power line frequency control correctly. It is a UVC 1.5 device, but implements the control as a UVC 1.1 device.
Add the corresponding control mapping override.
Bus 003 Device 002: ID 2b7e:b752 SunplusIT Inc HD Camera Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.01
bDeviceClass 239 Miscellaneous Device
bDeviceSubClass 2
bDeviceProtocol 1 Interface Association
bMaxPacketSize0 64
idVendor 0x2b7e
idProduct 0xb752
bcdDevice 0.04
iManufacturer 1 SunplusIT Inc iProduct 2 HD Camera iSerial 3 01.00.00 bNumConfigurations 1
--- drivers/media/usb/uvc/uvc_driver.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/media/usb/uvc/uvc_driver.c +9 -0
@@ -3003,6 +3003,15 @@ static const struct usb_device_id uvc_ids[] = { .bInterfaceSubClass = 1, .bInterfaceProtocol = 0, .driver_info = UVC_INFO_QUIRK(UVC_QUIRK_FORCE_BPP) }, +/* SunplusIT Inc HD Camera */ + { .match_flags = USB_DEVICE_ID_MATCH_DEVICE + | USB_DEVICE_ID_MATCH_INT_INFO, + .idVendor = 0x2b7e, + .idProduct = 0xb752, + .bInterfaceClass = USB_CLASS_VIDEO, + .bInterfaceSubClass = 1, + .bInterfaceProtocol = UVC_PC_PROTOCOL_15, + .driver_info = (kernel_ulong_t)&uvc_ctrl_power_line_uvc11 },/* Lenovo Integrated Camera */ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_INFO,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 180/322 media: rkisp1: Drop IRQF_SHARED
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit 85d2a31fe4d9be1555f621ead7a520d8791e0f74 ]
In all known platforms the ISP has dedicated IRQ lines, but for some reason the driver uses IRQF_SHARED.
Supporting IRQF_SHARED properly requires handling interrupts even when our device is disabled, and the driver does not handle this. To avoid adding such code, and to be sure the driver won't accidentally be used in a platform with shared interrupts, let's drop the IRQF_SHARED flag.
--- drivers/media/platform/rockchip/rkisp1/rkisp1-dev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/media/platform/rockchip/rkisp1/rkisp1-dev.c +1 -1
@@ -542,7 +542,7 @@ static int rkisp1_probe(struct platform_device *pdev)if (irq <0 )return irq; - ret =devm_request_irq (dev, irq, info->isrs[i].isr,IRQF_SHARED , + ret =devm_request_irq (dev, irq, info->isrs[i].isr,0 ,dev_driver_string (dev), dev);if (ret) {dev_err (dev,"request irq failed: %d\n" , ret);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 181/322 media: rkisp1: Fix IRQ handler return values
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit 3eb7910e1b16a2c136be26a8380f21469225b2f6 ]
The IRQ handler rkisp1_isr() calls sub-handlers, all of which returns an irqreturn_t value, but rkisp1_isr() ignores those values and always returns IRQ_HANDLED.
Fix this by collecting the return values, and returning IRQ_HANDLED or IRQ_NONE as appropriate.
--- .../media/platform/rockchip/rkisp1/rkisp1-dev.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-)
drivers/media/platform/rockchip/rkisp1/rkisp1-dev.c +12 -4
@@ -442,17 +442,25 @@ static int rkisp1_entities_register(struct rkisp1_device *rkisp1)static irqreturn_t rkisp1_isr (int irq,void *ctx) { +irqreturn_t ret =IRQ_NONE ; +/* * Call rkisp1_capture_isr() first to handle the frame that * potentially completed using the current frame_sequence number before * it is potentially incremented by rkisp1_isp_isr() in the vertical * sync. */ -rkisp1_capture_isr (irq, ctx); -rkisp1_isp_isr (irq, ctx); -rkisp1_csi_isr (irq, ctx); -return IRQ_HANDLED ; +if (rkisp1_capture_isr (irq, ctx) ==IRQ_HANDLED ) + ret =IRQ_HANDLED ; + +if (rkisp1_isp_isr (irq, ctx) ==IRQ_HANDLED ) + ret =IRQ_HANDLED ; + +if (rkisp1_csi_isr (irq, ctx) ==IRQ_HANDLED ) + ret =IRQ_HANDLED ; + +return ret; }static const char *const px30_isp_clks[] = {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 182/322 media: rkisp1: Store IRQ lines
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit 0753874617de883c6d4da903142f334f76a75d70 ]
Store the IRQ lines used by the driver for easy access. These are needed in future patches which fix IRQ race issues.
--- .../platform/rockchip/rkisp1/rkisp1-common.h | 11 ++++++++++- .../media/platform/rockchip/rkisp1/rkisp1-dev.c | 17 +++++++++++++---- 2 files changed, 23 insertions(+), 5 deletions(-)
drivers/media/platform/rockchip/rkisp1/rkisp1-common.h +10 -1
@@ -61,6 +61,14 @@ struct dentry; RKISP1_CIF_ISP_EXP_END | \ RKISP1_CIF_ISP_HIST_MEASURE_RDY) +/* IRQ lines */ +enum rkisp1_irq_line { +RKISP1_IRQ_ISP =0 , +RKISP1_IRQ_MI , +RKISP1_IRQ_MIPI , +RKISP1_NUM_IRQS , +}; +/* enum for the resizer pads */ enum rkisp1_rsz_pad {RKISP1_RSZ_PAD_SINK ,
@@ -441,7 +449,6 @@ struct rkisp1_debug {* struct rkisp1_device - ISP platform device * * @base_addr: base register address -* @irq: the irq number * @dev: a pointer to the struct device * @clk_size: number of clocks * @clks: array of clocks
@@ -459,6 +466,7 @@ struct rkisp1_debug {* @stream_lock: serializes {start/stop}_streaming callbacks between the capture devices. * @debug: debug params to be exposed on debugfs * @info: version-specific ISP information +* @irqs: IRQ line numbers */ struct rkisp1_device {void __iomem *base_addr;
@@ -479,6 +487,7 @@ struct rkisp1_device {struct mutex stream_lock;/* serialize {start/stop}_streaming cb between capture devices */ struct rkisp1_debug debug;const struct rkisp1_info *info; +int irqs[RKISP1_NUM_IRQS ]; };/*
drivers/media/platform/rockchip/rkisp1/rkisp1-dev.c +13 -4
@@ -114,6 +114,7 @@struct rkisp1_isr_data {const char *name;irqreturn_t (*isr)(int irq,void *ctx); +u32 line_mask; };/* ----------------------------------------------------------------------------
@@ -471,9 +472,9 @@ static const char * const px30_isp_clks[] = { };static const struct rkisp1_isr_data px30_isp_isrs[] = { - {"isp" , rkisp1_isp_isr }, - {"mi" , rkisp1_capture_isr }, - {"mipi" , rkisp1_csi_isr }, + {"isp" , rkisp1_isp_isr,BIT (RKISP1_IRQ_ISP ) }, + {"mi" , rkisp1_capture_isr,BIT (RKISP1_IRQ_MI ) }, + {"mipi" , rkisp1_csi_isr,BIT (RKISP1_IRQ_MIPI ) }, };static const struct rkisp1_info px30_isp_info = {
@@ -492,7 +493,7 @@ static const char * const rk3399_isp_clks[] = { };static const struct rkisp1_isr_data rk3399_isp_isrs[] = { - {NULL , rkisp1_isr }, + {NULL , rkisp1_isr,BIT (RKISP1_IRQ_ISP ) |BIT (RKISP1_IRQ_MI ) |BIT (RKISP1_IRQ_MIPI ) }, };static const struct rkisp1_info rk3399_isp_info = {
@@ -543,6 +544,9 @@ static int rkisp1_probe(struct platform_device *pdev)if (IS_ERR (rkisp1->base_addr))return PTR_ERR (rkisp1->base_addr); +for (unsigned int il =0 ; il <ARRAY_SIZE (rkisp1->irqs); ++il) + rkisp1->irqs[il] =-1 ; +for (i =0 ; i < info->isr_size; i++) { irq = info->isrs[i].name ? platform_get_irq_byname(pdev, info->isrs[i].name)
@@ -550,6 +554,11 @@ static int rkisp1_probe(struct platform_device *pdev)if (irq <0 )return irq; +for (unsigned int il =0 ; il <ARRAY_SIZE (rkisp1->irqs); ++il) { +if (info->isrs[i].line_mask &BIT (il)) + rkisp1->irqs[il] = irq; + } + ret =devm_request_irq (dev, irq, info->isrs[i].isr,0 ,dev_driver_string (dev), dev);if (ret) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 183/322 media: rkisp1: Fix IRQ disable race issue
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomi Valkeinen <[email protected]>
[ Upstream commit 870565f063a58576e8a4529f122cac4325c6b395 ]
In rkisp1_isp_stop() and rkisp1_csi_disable() the driver masks the interrupts and then apparently assumes that the interrupt handler won't be running, and proceeds in the stop procedure. This is not the case, as the interrupt handler can already be running, which would lead to the ISP being disabled while the interrupt handler handling a captured frame.
This brings up two issues: 1) the ISP could be powered off while the interrupt handler is still running and accessing registers, leading to board lockup, and 2) the interrupt handler code and the code that disables the streaming might do things that conflict.
It is not clear to me if 2) causes a real issue, but 1) can be seen with a suitable delay (or printk in my case) in the interrupt handler, leading to board lockup.
--- .../platform/rockchip/rkisp1/rkisp1-csi.c | 14 ++++++++++++- .../platform/rockchip/rkisp1/rkisp1-isp.c | 20 ++++++++++++++++--- 2 files changed, 30 insertions(+), 4 deletions(-)
drivers/media/platform/rockchip/rkisp1/rkisp1-csi.c +13 -1
@@ -141,8 +141,20 @@ static void rkisp1_csi_disable(struct rkisp1_csi *csi)struct rkisp1_device *rkisp1 = csi->rkisp1;u32 val; -/* Mask and clear interrupts. */ +/* Mask MIPI interrupts. */ rkisp1_write (rkisp1,RKISP1_CIF_MIPI_IMSC ,0 ); + +/* Flush posted writes */ +rkisp1_read (rkisp1,RKISP1_CIF_MIPI_IMSC ); + +/* +* Wait until the IRQ handler has ended. The IRQ handler may get called +* even after this, but it will return immediately as the MIPI +* interrupts have been masked. +*/ +synchronize_irq (rkisp1->irqs[RKISP1_IRQ_MIPI ]); + +/* Clear MIPI interrupt status */ rkisp1_write (rkisp1,RKISP1_CIF_MIPI_ICR , ~0 ); val =rkisp1_read (rkisp1,RKISP1_CIF_MIPI_CTRL );
drivers/media/platform/rockchip/rkisp1/rkisp1-isp.c +17 -3
@@ -281,11 +281,25 @@ static void rkisp1_isp_stop(struct rkisp1_isp *isp)* ISP(mi) stop in mi frame end -> Stop ISP(mipi) -> * Stop ISP(isp) ->wait for ISP isp off */ -/* stop and clear MI and ISP interrupts */ -rkisp1_write (rkisp1,RKISP1_CIF_ISP_IMSC ,0 ); -rkisp1_write (rkisp1,RKISP1_CIF_ISP_ICR , ~0 ); +/* Mask MI and ISP interrupts */ +rkisp1_write (rkisp1,RKISP1_CIF_ISP_IMSC ,0 );rkisp1_write (rkisp1,RKISP1_CIF_MI_IMSC ,0 ); + +/* Flush posted writes */ +rkisp1_read (rkisp1,RKISP1_CIF_MI_IMSC ); + +/* +* Wait until the IRQ handler has ended. The IRQ handler may get called +* even after this, but it will return immediately as the MI and ISP +* interrupts have been masked. +*/ +synchronize_irq (rkisp1->irqs[RKISP1_IRQ_ISP ]); +if (rkisp1->irqs[RKISP1_IRQ_ISP ] != rkisp1->irqs[RKISP1_IRQ_MI ]) +synchronize_irq (rkisp1->irqs[RKISP1_IRQ_MI ]); + +/* Clear MI and ISP interrupt status */ +rkisp1_write (rkisp1,RKISP1_CIF_ISP_ICR , ~0 );rkisp1_write (rkisp1,RKISP1_CIF_MI_ICR , ~0 );/* stop ISP */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 184/322 media: rkisp1: resizer: Stop manual allocation of v4l2_subdev_state
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Laurent Pinchart <[email protected]>
[ Upstream commit efa28efd9cba015f8c3d88123527c3c3cfcd13d0 ]
Supported media bus codes on the resizer sink pad are identical to the ISP source pad. The .enum_mbus_code() handler thus delegates the enumeration to the ISP's operation. This is problematic for two reasons:
- Format enumeration on the ISP source pad is dependent on the format configured on the ISP sink pad for the same subdev state (TRY or ACTIVE), while format enumeration on the resizer sink pad should return all formats supported by the resizer subdev, regardless of the ISP configuration.
- Delegating the operation involves creating a fake v4l2_subdev_state on the stack to pass to the ISP .enum_mbus_code() handler. This gets in the way of evolution of both the ISP enumeration handler and, more generally, the V4L2 subdev state infrastructure.
Fix those two issues by implementing format enumeration manually for the resizer.
--- .../platform/rockchip/rkisp1/rkisp1-resizer.c | 38 ++++++++++++------- 1 file changed, 24 insertions(+), 14 deletions(-)
drivers/media/platform/rockchip/rkisp1/rkisp1-resizer.c +24 -14
@@ -363,12 +363,8 @@ static int rkisp1_rsz_enum_mbus_code(struct v4l2_subdev *sd, {struct rkisp1_resizer *rsz = container_of(sd, struct rkisp1_resizer, sd); -struct v4l2_subdev_pad_config dummy_cfg; -struct v4l2_subdev_state pad_state = { - .pads = &dummy_cfg - }; -u32 pad = code->pad; -int ret; +unsigned int index = code->index; +unsigned int i;if (code->pad ==RKISP1_RSZ_PAD_SRC ) {/* supported mbus codes on the src are the same as in the capture */
@@ -388,15 +384,29 @@ static int rkisp1_rsz_enum_mbus_code(struct v4l2_subdev *sd,return 0 ; } -/* supported mbus codes on the sink pad are the same as isp src pad */ - code->pad =RKISP1_ISP_PAD_SOURCE_VIDEO ; - ret =v4l2_subdev_call (&rsz->rkisp1->isp.sd, pad, enum_mbus_code, - &pad_state, code); +/* +* Supported mbus codes on the sink pad are the same as on the ISP +* source pad. +*/ +for (i =0 ; ; i++) { +const struct rkisp1_mbus_info *fmt = +rkisp1_mbus_info_get_by_index (i); -/* restore pad */ - code->pad = pad; - code->flags =0 ; -return ret; +if (!fmt) +break ; + +if (!(fmt->direction &RKISP1_ISP_SD_SRC )) +continue ; + +if (!index) { + code->code = fmt->mbus_code; +return 0 ; + } + + index--; + } + +return -EINVAL ; } static int rkisp1_rsz_init_config(struct v4l2_subdev *sd,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 185/322 hwmon: (nct6775) Fix fan speed set failure in automatic mode
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xing Tong Wu <[email protected]>
[ Upstream commit 8b3800256abad20e91c2698607f9b28591407b19 ]
Setting the fan speed is only valid in manual mode; it is not possible to set the fan's speed in automatic mode.
Return error when attempting to set the fan speed in automatic mode.
--- drivers/hwmon/nct6775-core.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/hwmon/nct6775-core.c +7 -0
@@ -2553,6 +2553,13 @@ store_pwm(struct device *dev, struct device_attribute *attr, const char *buf,int err;u16 reg; +/* +* The fan control mode should be set to manual if the user wants to adjust +* the fan speed. Otherwise, it will fail to set. +*/ +if (index ==0 && data->pwm_enable[nr] > manual) +return -EBUSY ; + err =kstrtoul (buf,10 , &val);if (err <0 )return err;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 186/322 hwmon: (hp-wmi-sensors) Fix failure to load on EliteDesk 800 G6
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Seo <[email protected]>
[ Upstream commit c9ba592580947b81f33f514320aeef02ddc001fd ]
The EliteDesk 800 G6 stores a raw WMI string within the ACPI object in its BIOS corresponding to one instance of HPBIOS_PlatformEvents.Name. This is evidently a valid way of representing a WMI data item as far as the Microsoft ACPI-WMI mapper is concerned, but is preventing the driver from loading.
This seems quite rare, but add support for such strings. Treating this as a quirk pretty much means adding that support anyway.
Also clean up an oversight in update_numeric_sensor_from_wobj() in which the result of hp_wmi_strdup() was being used without error checking.
--- drivers/hwmon/hp-wmi-sensors.c | 127 ++++++++++++++++++++++++++++----- 1 file changed, 111 insertions(+), 16 deletions(-)
drivers/hwmon/hp-wmi-sensors.c +111 -16
@@ -17,6 +17,8 @@* Available: https://github.com/linuxhw/ACPI * [4] P. Rohár, "bmfdec - Decompile binary MOF file (BMF) from WMI buffer", * 2017. [Online]. Available: https://github.com/pali/bmfdec +* [5] Microsoft Corporation, "Driver-Defined WMI Data Items", 2017. [Online]. +* Available: https://learn.microsoft.com/en-us/windows-hardware/drivers/kernel/driver-defined-wmi-data-items */ #include <linux/acpi.h>
@@ -24,6 +26,7 @@#include <linux/hwmon.h> #include <linux/jiffies.h> #include <linux/mutex.h> +#include <linux/nls.h> #include <linux/units.h> #include <linux/wmi.h>
@@ -395,6 +398,50 @@ struct hp_wmi_sensors {struct mutex lock;/* Lock polling WMI and driver state changes. */ }; +static bool is_raw_wmi_string (const u8 *pointer,u32 length) +{ +const u16 *ptr; +u16 len; + +/* WMI strings are length-prefixed UTF-16 [5]. */ +if (length <=sizeof (*ptr)) +return false; + + length -=sizeof (*ptr); + ptr = (const u16 *)pointer; + len = *ptr; + +return len <= length && !(len &1 ); +} + +static char *convert_raw_wmi_string (const u8 *buf) +{ +const wchar_t *src; +unsigned int cps; +unsigned int len; +char *dst; +int i; + + src = (const wchar_t *)buf; + +/* Count UTF-16 code points. Exclude trailing null padding. */ + cps = *src /sizeof (*src); +while (cps && !src[cps]) + cps--; + +/* Each code point becomes up to 3 UTF-8 characters. */ + len =min (cps *3 ,HP_WMI_MAX_STR_SIZE -1 ); + + dst =kmalloc ((len +1 ) *sizeof (*dst),GFP_KERNEL ); +if (!dst) +return NULL ; + + i =utf16s_to_utf8s (++src, cps,UTF16_LITTLE_ENDIAN , dst, len); + dst[i] ='\0' ; + +return dst; +} +/* hp_wmi_strdup - devm_kstrdup, but length-limited */ static char *hp_wmi_strdup (struct device *dev,const char *src) {
@@ -412,6 +459,23 @@ static char *hp_wmi_strdup(struct device *dev, const char *src)return dst; } +/* hp_wmi_wstrdup - hp_wmi_strdup, but for a raw WMI string */ +static char *hp_wmi_wstrdup (struct device *dev,const u8 *buf) +{ +char *src; +char *dst; + + src =convert_raw_wmi_string (buf); +if (!src) +return NULL ; + + dst =hp_wmi_strdup (dev,strim (src));/* Note: Copy is trimmed. */ + +kfree (src); + +return dst; +} +/* * hp_wmi_get_wobj - poll WMI for a WMI object instance * @guid: WMI object GUID
@@ -462,8 +526,14 @@ static int check_wobj(const union acpi_object *wobj,for (prop =0 ; prop <= last_prop; prop++) { type = elements[prop].type; valid_type = property_map[prop]; -if (type != valid_type) +if (type != valid_type) { +if (type ==ACPI_TYPE_BUFFER && + valid_type ==ACPI_TYPE_STRING && +is_raw_wmi_string (elements[prop].buffer.pointer, + elements[prop].buffer.length)) +continue ;return -EINVAL ; + } }return 0 ;
@@ -480,7 +550,9 @@ static int extract_acpi_value(struct device *dev,break ;case ACPI_TYPE_STRING : - *out_string =hp_wmi_strdup (dev,strim (element->string.pointer)); + *out_string = element->type ==ACPI_TYPE_BUFFER ? +hp_wmi_wstrdup (dev, element->buffer.pointer) : +hp_wmi_strdup (dev,strim (element->string.pointer));if (!*out_string)return -ENOMEM ;break ;
@@ -861,7 +933,9 @@ update_numeric_sensor_from_wobj(struct device *dev, {const union acpi_object *elements;const union acpi_object *element; -const char *string; +const char *new_string; +char *trimmed; +char *string;bool is_new;int offset;u8 size;
@@ -885,11 +959,21 @@ update_numeric_sensor_from_wobj(struct device *dev, offset = is_new ? size -1 :-2 ; element = &elements[HP_WMI_PROPERTY_CURRENT_STATE + offset]; - string =strim (element->string.pointer); - -if (strcmp (string, nsensor->current_state)) { -devm_kfree (dev, nsensor->current_state); - nsensor->current_state =hp_wmi_strdup (dev, string); + string = element->type ==ACPI_TYPE_BUFFER ? +convert_raw_wmi_string (element->buffer.pointer) : + element->string.pointer; + +if (string) { + trimmed =strim (string); +if (strcmp (trimmed, nsensor->current_state)) { + new_string =hp_wmi_strdup (dev, trimmed); +if (new_string) { +devm_kfree (dev, nsensor->current_state); + nsensor->current_state = new_string; + } + } +if (element->type ==ACPI_TYPE_BUFFER ) +kfree (string); }/* Old variant: -2 (not -1) because it lacks the Size property. */
@@ -996,11 +1080,15 @@ static int check_event_wobj(const union acpi_object *wobj) HP_WMI_EVENT_PROPERTY_STATUS); } -static int populate_event_from_wobj (struct hp_wmi_event *event, +static int populate_event_from_wobj (struct device *dev, +struct hp_wmi_event *event,union acpi_object *wobj) {int prop =HP_WMI_EVENT_PROPERTY_NAME ;union acpi_object *element; +acpi_object_type type; +char *string; +u32 value;int err; err =check_event_wobj (wobj);
@@ -1009,20 +1097,24 @@ static int populate_event_from_wobj(struct hp_wmi_event *event, element = wobj->package.elements; -/* Extracted strings are NOT device-managed copies. */ -for (; prop <=HP_WMI_EVENT_PROPERTY_CATEGORY ; prop++, element++) { + type = hp_wmi_event_property_map[prop]; + + err =extract_acpi_value (dev, element, type, &value, &string); +if (err) +return err; +switch (prop) {case HP_WMI_EVENT_PROPERTY_NAME : - event->name =strim (element->string.pointer); + event->name = string;break ;case HP_WMI_EVENT_PROPERTY_DESCRIPTION : - event->description =strim (element->string.pointer); + event->description = string;break ;case HP_WMI_EVENT_PROPERTY_CATEGORY : - event->category = element->integer.value; + event->category = value;break ;default :
@@ -1511,8 +1603,8 @@ static void hp_wmi_notify(u32 value, void *context)struct acpi_buffer out = {ACPI_ALLOCATE_BUFFER ,NULL };struct hp_wmi_sensors *state = context;struct device *dev = &state->wdev->dev; +struct hp_wmi_event event = {};struct hp_wmi_info *fan_info; -struct hp_wmi_event event;union acpi_object *wobj;acpi_status err;int event_type;
@@ -1546,7 +1638,7 @@ static void hp_wmi_notify(u32 value, void *context) wobj = out.pointer; - err =populate_event_from_wobj (&event, wobj); + err =populate_event_from_wobj (dev, &event, wobj);if (err) {dev_warn (dev,"Bad event data (ACPI type %d)\n" , wobj->type); goto out_free_wobj;
@@ -1577,6 +1669,9 @@ static void hp_wmi_notify(u32 value, void *context) out_free_wobj:kfree (wobj); +devm_kfree (dev, event.name); +devm_kfree (dev, event.description); + out_unlock:mutex_unlock (&state->lock); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 187/322 f2fs: fix to tag gcing flag on page during block migration
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chao Yu <[email protected]>
[ Upstream commit 4961acdd65c956e97c1a000c82d91a8c1cdbe44b ]
It needs to add missing gcing flag on page during block migration, in order to garantee migrated data be persisted during checkpoint, otherwise out-of-order persistency between data and node may cause data corruption after SPOR.
Similar issue was fixed by commit 2d1fe8a86bf5 ("f2fs: fix to tag gcing flag on page during file defragment").
--- fs/f2fs/compress.c | 4 +++- fs/f2fs/file.c | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-)
fs/f2fs/compress.c +3 -1
@@ -1029,8 +1029,10 @@ static void set_cluster_dirty(struct compress_ctx *cc)int i;for (i =0 ; i < cc->cluster_size; i++) -if (cc->rpages[i]) +if (cc->rpages[i]) {set_page_dirty (cc->rpages[i]); +set_page_private_gcing (cc->rpages[i]); + } } static int prepare_compress_overwrite(struct compress_ctx *cc,
fs/f2fs/file.c +2 -0
@@ -1317,6 +1317,7 @@ static int __clone_blkaddrs(struct inode *src_inode, struct inode *dst_inode, }memcpy_page (pdst,0 , psrc,0 ,PAGE_SIZE );set_page_dirty (pdst); +set_page_private_gcing (pdst);f2fs_put_page (pdst,1 );f2fs_put_page (psrc,1 );
@@ -4059,6 +4060,7 @@ static int redirty_blocks(struct inode *inode, pgoff_t page_idx, int len)f2fs_bug_on (F2FS_I_SB (inode), !page);set_page_dirty (page); +set_page_private_gcing (page);f2fs_put_page (page,1 );f2fs_put_page (page,0 ); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 188/322 drm/exynos: Call drm_atomic_helper_shutdown() at shutdown/unbind time
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Douglas Anderson <[email protected]>
[ Upstream commit 16ac5b21b31b439f03cdf44c153c5f5af94fb3eb ]
Based on grepping through the source code this driver appears to be missing a call to drm_atomic_helper_shutdown() at system shutdown time and at driver unbind time. Among other things, this means that if a panel is in use that it won't be cleanly powered off at system shutdown time.
The fact that we should call drm_atomic_helper_shutdown() in the case of OS shutdown/restart and at driver remove (or unbind) time comes straight out of the kernel doc "driver instance overview" in drm_drv.c.
A few notes about this fix:
- When adding drm_atomic_helper_shutdown() to the unbind path, I added it after drm_kms_helper_poll_fini() since that's when other drivers seemed to have it.
- Technically with a previous patch, ("drm/atomic-helper:
drm_atomic_helper_shutdown(NULL) should be a noop"), we don't actually need to check to see if our "drm" pointer is NULL before calling drm_atomic_helper_shutdown(). We'll leave the "if" test in, though, so that this patch can land without any dependencies. It could potentially be removed later.
- This patch also makes sure to set the drvdata to NULL in the case of bind errors to make sure that shutdown can't access freed data.
--- drivers/gpu/drm/exynos/exynos_drm_drv.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
drivers/gpu/drm/exynos/exynos_drm_drv.c +11 -0
@@ -300,6 +300,7 @@ static int exynos_drm_bind(struct device *dev)drm_mode_config_cleanup (drm);exynos_drm_cleanup_dma (drm);kfree (private); +dev_set_drvdata (dev,NULL ); err_free_drm:drm_dev_put (drm);
@@ -313,6 +314,7 @@ static void exynos_drm_unbind(struct device *dev)drm_dev_unregister (drm);drm_kms_helper_poll_fini (drm); +drm_atomic_helper_shutdown (drm);component_unbind_all (drm->dev, drm);drm_mode_config_cleanup (drm);
@@ -350,9 +352,18 @@ static int exynos_drm_platform_remove(struct platform_device *pdev)return 0 ; } +static void exynos_drm_platform_shutdown (struct platform_device *pdev) +{ +struct drm_device *drm =platform_get_drvdata (pdev); + +if (drm) +drm_atomic_helper_shutdown (drm); +} +static struct platform_driver exynos_drm_platform_driver = { .probe = exynos_drm_platform_probe, .remove = exynos_drm_platform_remove, + .shutdown = exynos_drm_platform_shutdown, .driver = { .name ="exynos-drm" , .pm = &exynos_drm_pm_ops,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 189/322 IB/ipoib: Fix mcast list locking
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Vacek <[email protected]>
[ Upstream commit 4f973e211b3b1c6d36f7c6a19239d258856749f9 ]
Releasing the priv->lock while iterating the priv->multicast_list in ipoib_mcast_join_task() opens a window for ipoib_mcast_dev_flush() to remove the items while in the middle of iteration. If the mcast is removed while the lock was dropped, the for loop spins forever resulting in a hard lockup (as was reported on RHEL 4.18.0-372.75.1.el8_6 kernel):
Task A (kworker/u72:2 below) | Task B (kworker/u72:0 below)
-----------------------------------+-----------------------------------
ipoib_mcast_join_task(work) | ipoib_ib_dev_flush_light(work)
spin_lock_irq(&priv->lock) | __ipoib_ib_dev_flush(priv, ...)
list_for_each_entry(mcast, | ipoib_mcast_dev_flush(dev = priv->dev)
&priv->multicast_list, list) |
ipoib_mcast_join(dev, mcast) |
spin_unlock_irq(&priv->lock) |
| spin_lock_irqsave(&priv->lock, flags)
| list_for_each_entry_safe(mcast, tmcast,
| &priv->multicast_list, list)
| list_del(&mcast->list);
| list_add_tail(&mcast->list, &remove_list)
| spin_unlock_irqrestore(&priv->lock, flags)
spin_lock_irq(&priv->lock) |
| ipoib_mcast_remove_list(&remove_list)
(Here, `mcast` is no longer on the | list_for_each_entry_safe(mcast, tmcast,
`priv->multicast_list` and we keep | remove_list, list)
spinning on the `remove_list` of | >>> wait_for_completion(&mcast->done)
the other thread which is blocked |
and the list is still valid on |it's stack.)
Fix this by keeping the lock held and changing to GFP_ATOMIC to prevent eventual sleeps.
Unfortunately we could not reproduce the lockup and confirm this fix but based on the code review I think this fix should address such lockups.
crash> bc 31
PID: 747 TASK: ff1c6a1a007e8000 CPU: 31 COMMAND: "kworker/u72:2"
--
[exception RIP: ipoib_mcast_join_task+0x1b1]
RIP: ffffffffc0944ac1 RSP: ff646f199a8c7e00 RFLAGS: 00000002
RAX: 0000000000000000 RBX: ff1c6a1a04dc82f8 RCX: 0000000000000000
work (&priv->mcast_task{,.work})
RDX: ff1c6a192d60ac68 RSI: 0000000000000286 RDI: ff1c6a1a04dc8000
&mcast->list
RBP: ff646f199a8c7e90 R8: ff1c699980019420 R9: ff1c6a1920c9a000
R10: ff646f199a8c7e00 R11: ff1c6a191a7d9800 R12: ff1c6a192d60ac00
mcast
R13: ff1c6a1d82200000 R14: ff1c6a1a04dc8000 R15: ff1c6a1a04dc82d8
dev priv (&priv->lock) &priv->multicast_list (aka head)
ORIG_RAX: ffffffffffffffff CS: 0010 SS: 0018--- drivers/infiniband/ulp/ipoib/ipoib_multicast.c | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-)
drivers/infiniband/ulp/ipoib/ipoib_multicast.c +1 -5
@@ -531,21 +531,17 @@ static int ipoib_mcast_join(struct net_device *dev, struct ipoib_mcast *mcast)if (test_bit (IPOIB_MCAST_FLAG_SENDONLY , &mcast->flags)) rec.join_state =SENDONLY_FULLMEMBER_JOIN ; } -spin_unlock_irq (&priv->lock); multicast =ib_sa_join_multicast (&ipoib_sa_client, priv->ca, priv->port, - &rec, comp_mask,GFP_KERNEL , + &rec, comp_mask,GFP_ATOMIC , ipoib_mcast_join_complete, mcast); -spin_lock_irq (&priv->lock);if (IS_ERR (multicast)) { ret =PTR_ERR (multicast);ipoib_warn (priv,"ib_sa_join_multicast failed, status %d\n" , ret);/* Requeue this join task with a backoff delay */ __ipoib_mcast_schedule_join_thread (priv, mcast,1 );clear_bit (IPOIB_MCAST_FLAG_BUSY , &mcast->flags); -spin_unlock_irq (&priv->lock);complete (&mcast->done); -spin_lock_irq (&priv->lock);return ret; }return 0 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 190/322 media: amphion: remove mutext lock in condition of wait_event
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ming Qian <[email protected]>
[ Upstream commit f9c8ddce2fe3b767582f299d03fc8fb85943568c ]
mutext_lock should not be called in condition of wait_event, otherwise, when CONFIG_DEBUG_ATOMIC_SLEEP is enabled, we may meet the following warning:
do not call blocking ops when !TASK_RUNNING; state=2
WARNING: CPU: 5 PID: 741 at kernel/sched/core.c:9859 __might_sleep+0x80/0xa4 Hardware name: Freescale i.MX8QM MEK (DT) pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--) pc : __might_sleep+0x80/0xa4 lr : __might_sleep+0x80/0xa4 sp : ffffffc0123738a0 x29: ffffffc0123738a0 x28: ffffffc009194c48 x27: ffffffc00bbc1050 x26: ffffff8814b282f0 x25: ffffff8814b280d0 x24: ffffff8814b28080 x23: 0000000000000001 x22: 0000000000000032 x21: ffffffc00bbc1000 x20: 000000000000011b x19: ffffffc009324670 x18: 00000000fffffffd x17: 30303c5b20746120 x16: 74657320323d6574 x15: 617473203b474e49 x14: 00058b5b8b9aa1f1 x13: ffffffc00903cda0 x12: 00000000d744fcc9 x11: 000000000000001c x10: 00000000000009a0 x9 : ffffffc0090201f4 x8 : ffffff8828245000 x7 : 0000000000000001 x6 : 0000000000000001 x5 : 00000000410fd080 x4 : 0000000000000002 x3 : ffffff8815aab4c8 x2 : 0000000000000000 x1 : 0000000000000000 x0 : ffffff8828244600 Call trace: __might_sleep+0x80/0xa4 mutex_lock+0x2c/0x80 sync_session_response+0x110/0x310 vpu_session_send_cmd+0x18c/0x244 vpu_session_start+0x38/0x70 vdec_start_session+0x1b4/0x3e0 vpu_vb2_start_streaming+0xa0/0x1c4 vb2_start_streaming+0x74/0x160 vb2_core_qbuf+0x488/0x650 vb2_qbuf+0x9c/0x100 v4l2_m2m_qbuf+0x7c/0x224 v4l2_m2m_ioctl_qbuf+0x20/0x2c v4l_qbuf+0x50/0x6c __video_do_ioctl+0x174/0x3f0 video_usercopy+0x210/0x7cc video_ioctl2+0x20/0x30 v4l2_ioctl+0x48/0x6c
we need to refine check_is_responsed() to remove the mutext_lock, each cmd has a monotonically increasing id, and cmds are executed sequentially, so we can check the id of the last reponsed cmd, then determine whether a command has been responded or not.
--- drivers/media/platform/amphion/vpu.h | 3 ++- drivers/media/platform/amphion/vpu_cmds.c | 28 ++++++++--------------- drivers/media/platform/amphion/vpu_v4l2.c | 1 + 3 files changed, 12 insertions(+), 20 deletions(-)
drivers/media/platform/amphion/vpu.h +2 -1
@@ -154,7 +154,6 @@ struct vpu_core {struct vpu_mbox tx_type;struct vpu_mbox tx_data;struct vpu_mbox rx; -unsigned long cmd_seq;wait_queue_head_t ack_wq;struct completion cmp;
@@ -253,6 +252,8 @@ struct vpu_inst {struct list_head cmd_q;void *pending; +unsigned long cmd_seq; +atomic_long_t last_response_cmd;struct vpu_inst_ops *ops;const struct vpu_format *formats;
drivers/media/platform/amphion/vpu_cmds.c +9 -19
@@ -32,6 +32,7 @@ struct vpu_cmd_t {struct vpu_cmd_request *request;struct vpu_rpc_event *pkt;unsigned long key; +atomic_long_t *last_response_cmd; };static struct vpu_cmd_request vpu_cmd_requests[] = {
@@ -115,6 +116,8 @@ static void vpu_free_cmd(struct vpu_cmd_t *cmd) {if (!cmd)return ; +if (cmd->last_response_cmd) +atomic_long_set (cmd->last_response_cmd, cmd->key);vfree (cmd->pkt);vfree (cmd); }
@@ -172,7 +175,8 @@ static int vpu_request_cmd(struct vpu_inst *inst, u32 id, void *data,return -ENOMEM ;mutex_lock (&core->cmd_lock); - cmd->key = core->cmd_seq++; + cmd->key = ++inst->cmd_seq; + cmd->last_response_cmd = &inst->last_response_cmd;if (key) *key = cmd->key;if (sync)
@@ -246,26 +250,12 @@ void vpu_clear_request(struct vpu_inst *inst)static bool check_is_responsed (struct vpu_inst *inst,unsigned long key) { -struct vpu_core *core = inst->core; -struct vpu_cmd_t *cmd; -bool flag = true; +unsigned long last_response =atomic_long_read (&inst->last_response_cmd); -mutex_lock (&core->cmd_lock); - cmd = inst->pending; -if (cmd && key == cmd->key) { - flag = false; - goto exit; - } -list_for_each_entry (cmd, &inst->cmd_q, list) { -if (key == cmd->key) { - flag = false; -break ; - } - } -exit: -mutex_unlock (&core->cmd_lock); +if (key <= last_response && (last_response - key) < (ULONG_MAX >>1 )) +return true; -return flag; +return false; }static int sync_session_response (struct vpu_inst *inst,unsigned long key,long timeout,int try)
drivers/media/platform/amphion/vpu_v4l2.c +1 -0
@@ -716,6 +716,7 @@ int vpu_v4l2_open(struct file *file, struct vpu_inst *inst) func = &vpu->decoder;atomic_set (&inst->ref_count,0 ); +atomic_long_set (&inst->last_response_cmd,0 );vpu_inst_get (inst); inst->vpu = vpu; inst->core =vpu_request_core (vpu, inst->type);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 191/322 media: ddbridge: fix an error code problem in ddb_probe
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Su Hui <[email protected]>
[ Upstream commit 09b4195021be69af1e1936cca995712a6d0f2562 ]
Error code is assigned to 'stat', return 'stat' rather than '-1'.
--- drivers/media/pci/ddbridge/ddbridge-main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/media/pci/ddbridge/ddbridge-main.c +1 -1
@@ -238,7 +238,7 @@ static int ddb_probe(struct pci_dev *pdev,ddb_unmap (dev);pci_set_drvdata (pdev,NULL );pci_disable_device (pdev); -return -1 ; +return stat; }/****************************************************************************/
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 192/322 media: i2c: imx335: Fix hblank min/max values
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kieran Bingham <[email protected]>
[ Upstream commit d7b95ad7a8d56248dfc34f861e445fad7a4004f4 ]
The V4L2_CID_HBLANK control is marked as readonly and can only be a single value.
Set the minimum and maximum value to match the mode value.
--- drivers/media/i2c/imx335.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/media/i2c/imx335.c +2 -2
@@ -971,8 +971,8 @@ static int imx335_init_controls(struct imx335 *imx335) imx335->hblank_ctrl =v4l2_ctrl_new_std (ctrl_hdlr, &imx335_ctrl_ops,V4L2_CID_HBLANK , -IMX335_REG_MIN , -IMX335_REG_MAX , + mode->hblank, + mode->hblank,1 , mode->hblank);if (imx335->hblank_ctrl) imx335->hblank_ctrl->flags |=V4L2_CTRL_FLAG_READ_ONLY ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 193/322 drm/amd/display: For prefetch mode > 0, extend prefetch if possible
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alvin Lee <[email protected]>
[ Upstream commit dd4e4bb28843393065eed279e869fac248d03f0f ]
[Description]
For mode programming we want to extend the prefetch as much as possible (up to oto, or as long as we can for equ) if we're not already applying the 60us prefetch requirement. This is to avoid intermittent underflow issues during prefetch.
The prefetch extension is applied under the following scenarios:
1. We're in prefetch mode 1 (i.e. we don't support MCLK switch in blank)
2. We're using subvp or drr methods of p-state switch, in which case we we don't care if prefetch takes up more of the blanking time
Mode programming typically chooses the smallest prefetch time possible (i.e. highest bandwidth during prefetch) presumably to create margin between p-states / c-states that happen in vblank and prefetch. Therefore we only apply this prefetch extension when p-state in vblank is not required (UCLK p-states take up the most vblank time).
--- .../dc/dml/dcn32/display_mode_vba_32.c | 3 ++ .../dc/dml/dcn32/display_mode_vba_util_32.c | 33 +++++++++++++++---- .../dc/dml/dcn32/display_mode_vba_util_32.h | 1 + 3 files changed, 31 insertions(+), 6 deletions(-)
drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_32.c +3 -0
@@ -813,6 +813,8 @@ static void DISPCLKDPPCLKDCFCLKDeepSleepPrefetchParametersWatermarksAndPerforman (v->DRAMSpeedPerState[mode_lib->vba.VoltageLevel] <=MEM_STROBE_FREQ_MHZ || v->DCFCLKPerState[mode_lib->vba.VoltageLevel] <=DCFCLK_FREQ_EXTRA_PREFETCH_REQ_MHZ ) ? mode_lib->vba.ip.min_prefetch_in_strobe_us :0 , + mode_lib->vba.PrefetchModePerState[mode_lib->vba.VoltageLevel][mode_lib->vba.maxMpcComb] >0 || mode_lib->vba.DRAMClockChangeRequirementFinal == false, +/* Output */ &v->DSTXAfterScaler[k], &v->DSTYAfterScaler[k],
@@ -3317,6 +3319,7 @@ void dml32_ModeSupportAndSystemConfigurationFull(struct display_mode_lib *mode_l v->SwathHeightCThisState[k], v->TWait, (v->DRAMSpeedPerState[i] <=MEM_STROBE_FREQ_MHZ || v->DCFCLKState[i][j] <=DCFCLK_FREQ_EXTRA_PREFETCH_REQ_MHZ ) ? mode_lib->vba.ip.min_prefetch_in_strobe_us :0 , + mode_lib->vba.PrefetchModePerState[i][j] >0 || mode_lib->vba.DRAMClockChangeRequirementFinal == false,/* Output */ &v->dummy_vars.dml32_ModeSupportAndSystemConfigurationFull.DSTXAfterScaler[k],
drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_util_32.c +27 -6
@@ -3423,6 +3423,7 @@ bool dml32_CalculatePrefetchSchedule(unsigned int SwathHeightC, double TWait, double TPreReq, + bool ExtendPrefetchIfPossible,/* Output */ double *DSTXAfterScaler, double *DSTYAfterScaler,
@@ -3892,12 +3893,32 @@ bool dml32_CalculatePrefetchSchedule(/* Clamp to oto for bandwidth calculation */ LinesForPrefetchBandwidth = dst_y_prefetch_oto; }else { - *DestinationLinesForPrefetch = dst_y_prefetch_equ; - TimeForFetchingMetaPTE = Tvm_equ; - TimeForFetchingRowInVBlank = Tr0_equ; - *PrefetchBandwidth = prefetch_bw_equ; -/* Clamp to equ for bandwidth calculation */ - LinesForPrefetchBandwidth = dst_y_prefetch_equ; +/* For mode programming we want to extend the prefetch as much as possible +* (up to oto, or as long as we can for equ) if we're not already applying +* the 60us prefetch requirement. This is to avoid intermittent underflow +* issues during prefetch. +* +* The prefetch extension is applied under the following scenarios: +* 1. We're in prefetch mode > 0 (i.e. we don't support MCLK switch in blank) +* 2. We're using subvp or drr methods of p-state switch, in which case we +* we don't care if prefetch takes up more of the blanking time +* +* Mode programming typically chooses the smallest prefetch time possible +* (i.e. highest bandwidth during prefetch) presumably to create margin between +* p-states / c-states that happen in vblank and prefetch. Therefore we only +* apply this prefetch extension when p-state in vblank is not required (UCLK +* p-states take up the most vblank time). +*/ +if (ExtendPrefetchIfPossible && TPreReq ==0 && VStartup < MaxVStartup) { + MyError = true; + }else { + *DestinationLinesForPrefetch = dst_y_prefetch_equ; + TimeForFetchingMetaPTE = Tvm_equ; + TimeForFetchingRowInVBlank = Tr0_equ; + *PrefetchBandwidth = prefetch_bw_equ; +/* Clamp to equ for bandwidth calculation */ + LinesForPrefetchBandwidth = dst_y_prefetch_equ; + } } *DestinationLinesToRequestVMInVBlank =dml_ceil (4.0 * TimeForFetchingMetaPTE / LineTime,1.0 ) /4.0 ;
drivers/gpu/drm/amd/display/dc/dml/dcn32/display_mode_vba_util_32.h +1 -0
@@ -747,6 +747,7 @@ bool dml32_CalculatePrefetchSchedule(unsigned int SwathHeightC, double TWait, double TPreReq, + bool ExtendPrefetchIfPossible,/* Output */ double *DSTXAfterScaler, double *DSTYAfterScaler,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 194/322 drm/amd/display: Force p-state disallow if leaving no plane config
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alvin Lee <[email protected]>
[ Upstream commit 9a902a9073c287353e25913c0761bfed49d75a88 ]
[Description]
- When we're in a no plane config, DCN is always asserting P-State allow
- This creates a scenario where the P-State blackout can start just as VUPDATE takes place and transitions the DCN config to a one where one or more HUBP's are active which can result in underflow
- To fix this issue, force p-state disallow and unforce after the transition from no planes case -> one or more planes active
--- .../drm/amd/display/dc/dcn20/dcn20_hwseq.c | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+)
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c +20 -0
@@ -1792,6 +1792,8 @@ void dcn20_program_front_end_for_ctx(int i;struct dce_hwseq *hws = dc->hwseq;DC_LOGGER_INIT (dc->ctx->logger); +unsigned int prev_hubp_count =0 ; +unsigned int hubp_count =0 ;/* Carry over GSL groups in case the context is changing. */ for (i =0 ; i < dc->res_pool->pipe_count; i++) {
@@ -1815,6 +1817,20 @@ void dcn20_program_front_end_for_ctx( } } +for (i =0 ; i < dc->res_pool->pipe_count; i++) { +if (dc->current_state->res_ctx.pipe_ctx[i].plane_state) + prev_hubp_count++; +if (context->res_ctx.pipe_ctx[i].plane_state) + hubp_count++; + } + +if (prev_hubp_count ==0 && hubp_count >0 ) { +if (dc->res_pool->hubbub->funcs->force_pstate_change_control) + dc->res_pool->hubbub->funcs->force_pstate_change_control ( + dc->res_pool->hubbub, true, false); +udelay (500 ); + } +/* Set pipe update flags and lock pipes */ for (i =0 ; i < dc->res_pool->pipe_count; i++) dcn20_detect_pipe_changes(&dc->current_state->res_ctx.pipe_ctx[i],
@@ -1962,6 +1978,10 @@ void dcn20_post_unlock_program_front_end( } } +if (dc->res_pool->hubbub->funcs->force_pstate_change_control) + dc->res_pool->hubbub->funcs->force_pstate_change_control ( + dc->res_pool->hubbub, false, false); +for (i =0 ; i < dc->res_pool->pipe_count; i++) {struct pipe_ctx *pipe = &context->res_ctx.pipe_ctx[i];
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 195/322 drm/amdkfd: fix mes set shader debugger process management
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonathan Kim <[email protected]>
[ Upstream commit bd33bb1409b494558a2935f7bbc7842def957fcd ]
MES provides the driver a call to explicitly flush stale process memory within the MES to avoid a race condition that results in a fatal memory violation.
When SET_SHADER_DEBUGGER is called, the driver passes a memory address that represents a process context address MES uses to keep track of future per-process calls.
Normally, MES will purge its process context list when the last queue has been removed. The driver, however, can call SET_SHADER_DEBUGGER regardless of whether a queue has been added or not.
If SET_SHADER_DEBUGGER has been called with no queues as the last call prior to process termination, the passed process context address will still reside within MES.
On a new process call to SET_SHADER_DEBUGGER, the driver may end up passing an identical process context address value (based on per-process gpu memory address) to MES but is now pointing to a new allocated buffer object during KFD process creation. Since the MES is unaware of this, access of the passed address points to the stale object within MES and triggers a fatal memory violation.
The solution is for KFD to explicitly flush the process context address from MES on process termination.
Note that the flush call and the MES debugger calls use the same MES interface but are separated as KFD calls to avoid conflicting with each other.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c | 31 +++++++++++++++++++ drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h | 10 +++--- .../amd/amdkfd/kfd_process_queue_manager.c | 1 + drivers/gpu/drm/amd/include/mes_v11_api_def.h | 3 +- 4 files changed, 40 insertions(+), 5 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_mes.c +31 -0
@@ -885,6 +885,11 @@ int amdgpu_mes_set_shader_debugger(struct amdgpu_device *adev, op_input.op =MES_MISC_OP_SET_SHADER_DEBUGGER ; op_input.set_shader_debugger.process_context_addr = process_context_addr; op_input.set_shader_debugger.flags.u32all = flags; + +/* use amdgpu mes_flush_shader_debugger instead */ +if (op_input.set_shader_debugger.flags.process_ctx_flush) +return -EINVAL ; + op_input.set_shader_debugger.spi_gdbg_per_vmid_cntl = spi_gdbg_per_vmid_cntl;memcpy (op_input.set_shader_debugger.tcp_watch_cntl, tcp_watch_cntl,sizeof (op_input.set_shader_debugger.tcp_watch_cntl));
@@ -904,6 +909,32 @@ int amdgpu_mes_set_shader_debugger(struct amdgpu_device *adev,return r; } +int amdgpu_mes_flush_shader_debugger (struct amdgpu_device *adev, +uint64_t process_context_addr) +{ +struct mes_misc_op_input op_input = {0 }; +int r; + +if (!adev->mes.funcs->misc_op) { +DRM_ERROR ("mes flush shader debugger is not supported!\n" ); +return -EINVAL ; + } + + op_input.op =MES_MISC_OP_SET_SHADER_DEBUGGER ; + op_input.set_shader_debugger.process_context_addr = process_context_addr; + op_input.set_shader_debugger.flags.process_ctx_flush = true; + +amdgpu_mes_lock (&adev->mes); + + r = adev->mes.funcs->misc_op (&adev->mes, &op_input); +if (r) +DRM_ERROR ("failed to set_shader_debugger\n" ); + +amdgpu_mes_unlock (&adev->mes); + +return r; +} + static void amdgpu_mes_ring_to_queue_props(struct amdgpu_device *adev, struct amdgpu_ring *ring,
drivers/gpu/drm/amd/amdgpu/amdgpu_mes.h +6 -4
@@ -291,9 +291,10 @@ struct mes_misc_op_input {uint64_t process_context_addr;union {struct { -uint64_t single_memop :1 ; -uint64_t single_alu_op :1 ; -uint64_t reserved:30 ; +uint32_t single_memop :1 ; +uint32_t single_alu_op :1 ; +uint32_t reserved:29 ; +uint32_t process_ctx_flush:1 ; };uint32_t u32all; } flags;
@@ -369,7 +370,8 @@ int amdgpu_mes_set_shader_debugger(struct amdgpu_device *adev,const uint32_t *tcp_watch_cntl, uint32_t flags, bool trap_en); - +int amdgpu_mes_flush_shader_debugger (struct amdgpu_device *adev, +uint64_t process_context_addr); int amdgpu_mes_add_ring(struct amdgpu_device *adev, int gang_id, int queue_type, int idx, struct amdgpu_mes_ctx_data *ctx_data,
drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c +1 -0
@@ -87,6 +87,7 @@ void kfd_process_dequeue_from_device(struct kfd_process_device *pdd)return ; dev->dqm->ops.process_termination (dev->dqm, &pdd->qpd); +amdgpu_mes_flush_shader_debugger (dev->adev, pdd->proc_ctx_gpu_addr); pdd->already_dequeued = true; }
drivers/gpu/drm/amd/include/mes_v11_api_def.h +2 -1
@@ -571,7 +571,8 @@ struct SET_SHADER_DEBUGGER {struct {uint32_t single_memop :1 ;/* SQ_DEBUG.single_memop */ uint32_t single_alu_op :1 ;/* SQ_DEBUG.single_alu_op */ -uint32_t reserved :30 ; +uint32_t reserved :29 ; +uint32_t process_ctx_flush :1 ; };uint32_t u32all; } flags;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 196/322 drm/msm/dpu: enable writeback on SM8350
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit c2949a49dfe960e952400029e14751dceff79d38 ]
Enable WB2 hardware block, enabling writeback support on this platform.
Patchwork: https://patchwork.freedesktop.org/patch/570188/
--- .../drm/msm/disp/dpu1/catalog/dpu_7_0_sm8350.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_7_0_sm8350.h +18 -0
@@ -31,6 +31,7 @@ static const struct dpu_mdp_cfg sm8350_mdp = { [DPU_CLK_CTRL_DMA1] = { .reg_off = 0x2b4, .bit_off = 8 }, [DPU_CLK_CTRL_DMA2] = { .reg_off = 0x2bc, .bit_off = 8 }, [DPU_CLK_CTRL_DMA3] = { .reg_off = 0x2c4, .bit_off = 8 }, + [DPU_CLK_CTRL_WB2] = { .reg_off = 0x2bc, .bit_off = 16 }, [DPU_CLK_CTRL_REG_DMA] = { .reg_off = 0x2bc, .bit_off = 20 }, }, };
@@ -304,6 +305,21 @@ static const struct dpu_dsc_cfg sm8350_dsc[] = { }, }; +static const struct dpu_wb_cfg sm8350_wb[] = { + { + .name ="wb_2" , .id =WB_2 , + .base =0x65000 , .len =0x2c8 , + .features =WB_SM8250_MASK , + .format_list = wb2_formats, + .num_formats =ARRAY_SIZE (wb2_formats), + .clk_ctrl =DPU_CLK_CTRL_WB2 , + .xin_id =6 , + .vbif_idx =VBIF_RT , + .maxlinewidth =4096 , + .intr_wb_done =DPU_IRQ_IDX (MDP_SSPP_TOP0_INTR ,4 ), + }, +}; +static const struct dpu_intf_cfg sm8350_intf[] = { { .name ="intf_0" , .id =INTF_0 ,
@@ -401,6 +417,8 @@ const struct dpu_mdss_cfg dpu_sm8350_cfg = { .dsc = sm8350_dsc, .merge_3d_count = ARRAY_SIZE(sm8350_merge_3d), .merge_3d = sm8350_merge_3d, + .wb_count = ARRAY_SIZE(sm8350_wb), + .wb = sm8350_wb, .intf_count = ARRAY_SIZE(sm8350_intf), .intf = sm8350_intf, .vbif_count = ARRAY_SIZE(sdm845_vbif),
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 197/322 drm/msm/dpu: enable writeback on SM8450
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Baryshkov <[email protected]>
[ Upstream commit eaa647cdbf2e357b4a14903f2f1e47ed9c4f8df3 ]
Enable WB2 hardware block, enabling writeback support on this platform.
Patchwork: https://patchwork.freedesktop.org/patch/570187/
--- .../drm/msm/disp/dpu1/catalog/dpu_8_1_sm8450.h | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+)
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_1_sm8450.h +18 -0
@@ -32,6 +32,7 @@ static const struct dpu_mdp_cfg sm8450_mdp = { [DPU_CLK_CTRL_DMA1] = { .reg_off = 0x2b4, .bit_off = 8 }, [DPU_CLK_CTRL_DMA2] = { .reg_off = 0x2bc, .bit_off = 8 }, [DPU_CLK_CTRL_DMA3] = { .reg_off = 0x2c4, .bit_off = 8 }, + [DPU_CLK_CTRL_WB2] = { .reg_off = 0x2bc, .bit_off = 16 }, [DPU_CLK_CTRL_REG_DMA] = { .reg_off = 0x2bc, .bit_off = 20 }, }, };
@@ -326,6 +327,21 @@ static const struct dpu_dsc_cfg sm8450_dsc[] = { }, }; +static const struct dpu_wb_cfg sm8450_wb[] = { + { + .name ="wb_2" , .id =WB_2 , + .base =0x65000 , .len =0x2c8 , + .features =WB_SM8250_MASK , + .format_list = wb2_formats, + .num_formats =ARRAY_SIZE (wb2_formats), + .clk_ctrl =DPU_CLK_CTRL_WB2 , + .xin_id =6 , + .vbif_idx =VBIF_RT , + .maxlinewidth =4096 , + .intr_wb_done =DPU_IRQ_IDX (MDP_SSPP_TOP0_INTR ,4 ), + }, +}; +static const struct dpu_intf_cfg sm8450_intf[] = { { .name ="intf_0" , .id =INTF_0 ,
@@ -423,6 +439,8 @@ const struct dpu_mdss_cfg dpu_sm8450_cfg = { .dsc = sm8450_dsc, .merge_3d_count = ARRAY_SIZE(sm8450_merge_3d), .merge_3d = sm8450_merge_3d, + .wb_count = ARRAY_SIZE(sm8450_wb), + .wb = sm8450_wb, .intf_count = ARRAY_SIZE(sm8450_intf), .intf = sm8450_intf, .vbif_count = ARRAY_SIZE(sdm845_vbif),
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 198/322 drm/msm/dpu: Ratelimit framedone timeout msgs
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rob Clark <[email protected]>
[ Upstream commit 2b72e50c62de60ad2d6bcd86aa38d4ccbdd633f2 ]
When we start getting these, we get a *lot*. So ratelimit it to not flood dmesg.
Patchwork: https://patchwork.freedesktop.org/patch/571584/
--- drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c | 5 ++++- drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h | 1 + 2 files changed, 5 insertions(+), 1 deletion(-)
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder.c +4 -1
@@ -39,6 +39,9 @@#define DPU_ERROR_ENC (e, fmt, ...) DPU_ERROR("enc%d " fmt,\ (e) ? (e)->base.base.id : -1, ##__VA_ARGS__) +#define DPU_ERROR_ENC_RATELIMITED (e, fmt, ...) DPU_ERROR_RATELIMITED("enc%d " fmt,\ + (e) ? (e)->base.base.id : -1, ##__VA_ARGS__) +/* * Two to anticipate panels that can do cmd/vid dynamic switching * plan is to create all possible physical encoder types, and switch between
@@ -2327,7 +2330,7 @@ static void dpu_encoder_frame_done_timeout(struct timer_list *t)return ; } -DPU_ERROR_ENC (dpu_enc,"frame done timeout\n" ); +DPU_ERROR_ENC_RATELIMITED (dpu_enc,"frame done timeout\n" ); event =DPU_ENCODER_FRAME_EVENT_ERROR ;trace_dpu_enc_frame_done_timeout (DRMID (drm_enc), event);
drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h +1 -0
@@ -51,6 +51,7 @@ } while (0)#define DPU_ERROR (fmt, ...) pr_err("[dpu error]" fmt, ##__VA_ARGS__) +#define DPU_ERROR_RATELIMITED (fmt, ...) pr_err_ratelimited("[dpu error]" fmt, ##__VA_ARGS__)/** * ktime_compare_safe - compare two ktime structures
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 199/322 drm/msm/dpu: fix writeback programming for YUV cases
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Abhinav Kumar <[email protected]>
[ Upstream commit 79caf2f2202b9eaad3a5a726e4b33807f67d0f1b ]
For YUV cases, setting the required format bits was missed out in the register programming. Lets fix it now in preparation of adding YUV formats support for writeback.
changes in v2:
- dropped the fixes tag as its not a fix but adding new functionality
Patchwork: https://patchwork.freedesktop.org/patch/571814/
--- drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_wb.c +3 -0
@@ -86,6 +86,9 @@ static void dpu_hw_wb_setup_format(struct dpu_hw_wb *ctx, dst_format |=BIT (14 );/* DST_ALPHA_X */ } +if (DPU_FORMAT_IS_YUV (fmt)) + dst_format |=BIT (15 ); + pattern = (fmt->element[3 ] <<24 ) | (fmt->element[2 ] <<16 ) | (fmt->element[1] << 8) |
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 200/322 drm/amdgpu: fix ftrace event amdgpu_bo_move always move on same heap
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wang, Beyond <[email protected]>
[ Upstream commit 94aeb4117343d072e3a35b9595bcbfc0058ee724 ]
Issue: during evict or validate happened on amdgpu_bo, the 'from' and 'to' is always same in ftrace event of amdgpu_bo_move
where calling the 'trace_amdgpu_bo_move', the comment says move_notify is called before move happens, but actually it is called after move happens, here the new_mem is same as bo->resource
Fix: move trace_amdgpu_bo_move from move_notify to amdgpu_bo_move
--- drivers/gpu/drm/amd/amdgpu/amdgpu_object.c | 13 +------------ drivers/gpu/drm/amd/amdgpu/amdgpu_object.h | 4 +--- drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c | 5 +++-- 3 files changed, 5 insertions(+), 17 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_object.c +1 -12
@@ -1250,19 +1250,15 @@ int amdgpu_bo_get_metadata(struct amdgpu_bo *bo, void *buffer,* amdgpu_bo_move_notify - notification about a memory move * @bo: pointer to a buffer object * @evict: if this move is evicting the buffer from the graphics address space -* @new_mem: new information of the bufer object * * Marks the corresponding &amdgpu_bo buffer object as invalid, also performs * bookkeeping. * TTM driver callback which is called when ttm moves a buffer. */ -void amdgpu_bo_move_notify (struct ttm_buffer_object *bo, -bool evict, -struct ttm_resource *new_mem) +void amdgpu_bo_move_notify (struct ttm_buffer_object *bo,bool evict) {struct amdgpu_device *adev =amdgpu_ttm_adev (bo->bdev);struct amdgpu_bo *abo; -struct ttm_resource *old_mem = bo->resource;if (!amdgpu_bo_is_amdgpu_bo (bo))return ;
@@ -1279,13 +1275,6 @@ void amdgpu_bo_move_notify(struct ttm_buffer_object *bo,/* remember the eviction */ if (evict)atomic64_inc (&adev->num_evictions); - -/* update statistics */ -if (!new_mem) -return ; - -/* move_notify is called before move happens */ -trace_amdgpu_bo_move (abo, new_mem->mem_type, old_mem->mem_type); } void amdgpu_bo_get_memory(struct amdgpu_bo *bo,
drivers/gpu/drm/amd/amdgpu/amdgpu_object.h +1 -3
@@ -344,9 +344,7 @@ int amdgpu_bo_set_metadata (struct amdgpu_bo *bo, void *metadata,int amdgpu_bo_get_metadata (struct amdgpu_bo *bo,void *buffer,size_t buffer_size,uint32_t *metadata_size,uint64_t *flags); -void amdgpu_bo_move_notify (struct ttm_buffer_object *bo, -bool evict, -struct ttm_resource *new_mem); +void amdgpu_bo_move_notify (struct ttm_buffer_object *bo,bool evict);void amdgpu_bo_release_notify (struct ttm_buffer_object *bo);vm_fault_t amdgpu_bo_fault_reserve_notify (struct ttm_buffer_object *bo); void amdgpu_bo_fence(struct amdgpu_bo *bo, struct dma_fence *fence,
drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c +3 -2
@@ -545,10 +545,11 @@ static int amdgpu_bo_move(struct ttm_buffer_object *bo, bool evict,return r; } +trace_amdgpu_bo_move (abo, new_mem->mem_type, old_mem->mem_type); out:/* update statistics */ atomic64_add (bo->base.size, &adev->num_bytes_moved); -amdgpu_bo_move_notify (bo, evict, new_mem); +amdgpu_bo_move_notify (bo, evict);return 0 ; }
@@ -1555,7 +1556,7 @@ static int amdgpu_ttm_access_memory(struct ttm_buffer_object *bo,static void amdgpu_bo_delete_mem_notify (struct ttm_buffer_object *bo) { -amdgpu_bo_move_notify (bo, false,NULL ); +amdgpu_bo_move_notify (bo, false); }static struct ttm_device_funcs amdgpu_bo_driver = {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 201/322 clk: hi3620: Fix memory leak in hi3620_mmc_clk_init()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuan-Wei Chiu <[email protected]>
[ Upstream commit bfbea9e5667cfa9552c3d88f023386f017f6c308 ]
In cases where kcalloc() fails for the 'clk_data->clks' allocation, the code path does not handle the failure gracefully, potentially leading to a memory leak. This fix ensures proper cleanup by freeing the allocated memory for 'clk_data' before returning.
--- drivers/clk/hisilicon/clk-hi3620.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/clk/hisilicon/clk-hi3620.c +3 -1
@@ -466,8 +466,10 @@ static void __init hi3620_mmc_clk_init(struct device_node *node)return ; clk_data->clks =kcalloc (num,sizeof (*clk_data->clks),GFP_KERNEL ); -if (!clk_data->clks) +if (!clk_data->clks) { +kfree (clk_data);return ; + }for (i =0 ; i < num; i++) {struct hisi_mmc_clock *mmc_clk = &hi3620_mmc_clks[i];
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 202/322 clk: mmp: pxa168: Fix memory leak in pxa168_clk_init()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuan-Wei Chiu <[email protected]>
[ Upstream commit 2fbabea626b6467eb4e6c4cb7a16523da12e43b4 ]
In cases where mapping of mpmu/apmu/apbc registers fails, the code path does not handle the failure gracefully, potentially leading to a memory leak. This fix ensures proper cleanup by freeing the allocated memory for 'pxa_unit' before returning.
--- drivers/clk/mmp/clk-of-pxa168.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/clk/mmp/clk-of-pxa168.c +3 -0
@@ -308,18 +308,21 @@ static void __init pxa168_clk_init(struct device_node *np) pxa_unit->mpmu_base =of_iomap (np,0 );if (!pxa_unit->mpmu_base) {pr_err ("failed to map mpmu registers\n" ); +kfree (pxa_unit);return ; } pxa_unit->apmu_base =of_iomap (np,1 );if (!pxa_unit->apmu_base) {pr_err ("failed to map apmu registers\n" ); +kfree (pxa_unit);return ; } pxa_unit->apbc_base =of_iomap (np,2 );if (!pxa_unit->apbc_base) {pr_err ("failed to map apbc registers\n" ); +kfree (pxa_unit);return ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 203/322 watchdog: starfive: add lock annotations to fix context imbalances
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ben Dooks <[email protected]>
[ Upstream commit f77999887235f8c378af343df11a6bcedda5b284 ]
Add the necessary __acquires() and __releases() to the functions that take and release the wdt lock to avoid the following sparse warnings:
drivers/watchdog/starfive-wdt.c:204:13: warning: context imbalance in 'starfive_wdt_unlock' - wrong count at exit drivers/watchdog/starfive-wdt.c:212:9: warning: context imbalance in 'starfive_wdt_lock' - unexpected unlock
--- drivers/watchdog/starfive-wdt.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/watchdog/starfive-wdt.c +2 -0
@@ -202,12 +202,14 @@ static u32 starfive_wdt_ticks_to_sec(struct starfive_wdt *wdt, u32 ticks)/* Write unlock-key to unlock. Write other value to lock. */ static void starfive_wdt_unlock (struct starfive_wdt *wdt) + __acquires(&wdt->lock) {spin_lock (&wdt->lock);writel (wdt->variant->unlock_key, wdt->base + wdt->variant->unlock); }static void starfive_wdt_lock (struct starfive_wdt *wdt) + __releases(&wdt->lock) {writel (~wdt->variant->unlock_key, wdt->base + wdt->variant->unlock);spin_unlock (&wdt->lock);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 204/322 watchdog: it87_wdt: Keep WDTCTRL bit 3 unmodified for IT8784/IT8786
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Werner Fischer <[email protected]>
[ Upstream commit d12971849d71781c1e4ffd1117d4878ce233d319 ]
WDTCTRL bit 3 sets the mode choice for the clock input of IT8784/IT8786. Some motherboards require this bit to be set to 1 (= PCICLK mode), otherwise the watchdog functionality gets broken. The BIOS of those motherboards sets WDTCTRL bit 3 already to 1.
Instead of setting all bits of WDTCTRL to 0 by writing 0x00 to it, keep bit 3 of it unchanged for IT8784/IT8786 chips. In this way, bit 3 keeps the status as set by the BIOS of the motherboard.
Watchdog tests have been successful with this patch with the following systems:
IT8784: Thomas-Krenn LES plus v2 (YANLING YL-KBRL2 V2)
IT8786: Thomas-Krenn LES plus v3 (YANLING YL-CLU L2)
IT8786: Thomas-Krenn LES network 6L v2 (YANLING YL-CLU6L)
--- drivers/watchdog/it87_wdt.c | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-)
drivers/watchdog/it87_wdt.c +13 -1
@@ -255,6 +255,7 @@ static struct watchdog_device wdt_dev = {static int __init it87_wdt_init (void ) {u8 chip_rev; +u8 ctrl;int rc; rc =superio_enter ();
@@ -313,7 +314,18 @@ static int __init it87_wdt_init(void)superio_select (GPIO );superio_outb (WDT_TOV1 ,WDTCFG ); -superio_outb (0x00 ,WDTCTRL ); + +switch (chip_type) { +case IT8784_ID : +case IT8786_ID : + ctrl =superio_inb (WDTCTRL ); + ctrl &=0x08 ; +superio_outb (ctrl,WDTCTRL ); +break ; +default : +superio_outb (0x00 ,WDTCTRL ); + } +superio_exit ();if (timeout <1 || timeout > max_units *60 ) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 205/322 accel/habanalabs: add support for Gaudi2C device
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oded Gabbay <[email protected]>
[ Upstream commit 42422993cf28d456778ee9168d73758ec037cd51 ]
Gaudi2 with PCI revision ID with the value of '3' represents Gaudi2C device and should be detected and initialized as Gaudi2.
--- drivers/accel/habanalabs/common/device.c | 3 +++ drivers/accel/habanalabs/common/habanalabs.h | 2 ++ drivers/accel/habanalabs/common/habanalabs_drv.c | 3 +++ drivers/accel/habanalabs/common/mmu/mmu.c | 1 + drivers/accel/habanalabs/common/sysfs.c | 3 +++ drivers/accel/habanalabs/include/hw_ip/pci/pci_general.h | 1 + 6 files changed, 13 insertions(+)
drivers/accel/habanalabs/common/device.c +3 -0
@@ -808,6 +808,9 @@ static int device_early_init(struct hl_device *hdev)gaudi2_set_asic_funcs (hdev);strscpy (hdev->asic_name,"GAUDI2B" ,sizeof (hdev->asic_name));break ; +case ASIC_GAUDI2C : +gaudi2_set_asic_funcs (hdev); +strscpy (hdev->asic_name,"GAUDI2C" ,sizeof (hdev->asic_name));break ;default : dev_err(hdev->dev, "Unrecognized ASIC type %d\n",
drivers/accel/habanalabs/common/habanalabs.h +2 -0
@@ -1220,6 +1220,7 @@ struct hl_dec {* @ASIC_GAUDI_SEC: Gaudi secured device (HL-2000). * @ASIC_GAUDI2: Gaudi2 device. * @ASIC_GAUDI2B: Gaudi2B device. +* @ASIC_GAUDI2C: Gaudi2C device. */ enum hl_asic_type {ASIC_INVALID ,
@@ -1228,6 +1229,7 @@ enum hl_asic_type {ASIC_GAUDI_SEC ,ASIC_GAUDI2 ,ASIC_GAUDI2B , + ASIC_GAUDI2C, };struct hl_cs_parser ;
drivers/accel/habanalabs/common/habanalabs_drv.c +3 -0
@@ -101,6 +101,9 @@ static enum hl_asic_type get_asic_type(struct hl_device *hdev)case REV_ID_B : asic_type =ASIC_GAUDI2B ;break ; +case REV_ID_C : + asic_type =ASIC_GAUDI2C ; +break ;default :break ; }
drivers/accel/habanalabs/common/mmu/mmu.c +1 -0
@@ -596,6 +596,7 @@ int hl_mmu_if_set_funcs(struct hl_device *hdev)break ;case ASIC_GAUDI2 :case ASIC_GAUDI2B : +case ASIC_GAUDI2C :/* MMUs in Gaudi2 are always host resident */ hl_mmu_v2_hr_set_funcs (hdev, &hdev->mmu_func[MMU_HR_PGT ]);break ;
drivers/accel/habanalabs/common/sysfs.c +3 -0
@@ -251,6 +251,9 @@ static ssize_t device_type_show(struct device *dev,case ASIC_GAUDI2B : str ="GAUDI2B" ;break ; +case ASIC_GAUDI2C : + str ="GAUDI2C" ; +break ;default :dev_err (hdev->dev,"Unrecognized ASIC type %d\n" , hdev->asic_type);
drivers/accel/habanalabs/include/hw_ip/pci/pci_general.h +1 -0
@@ -25,6 +25,7 @@ enum hl_revision_id {REV_ID_INVALID =0x00 ,REV_ID_A =0x01 ,REV_ID_B =0x02 , +REV_ID_C =0x03 };#endif /* INCLUDE_PCI_GENERAL_H_ */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 206/322 drm/amd/display: make flip_timestamp_in_us a 64-bit variable
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Josip Pavic <[email protected]>
[ Upstream commit 6fb12518ca58412dc51054e2a7400afb41328d85 ]
[Why]
This variable currently overflows after about 71 minutes. This doesn't cause any known functional issues but it does make debugging more difficult.
[How]
Make it a 64-bit variable.
--- drivers/gpu/drm/amd/display/dc/dc_hw_types.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/display/dc/dc_hw_types.h +1 -1
@@ -244,7 +244,7 @@ enum pixel_format {#define DC_MAX_DIRTY_RECTS 3struct dc_flip_addrs {struct dc_plane_address address; -unsigned int flip_timestamp_in_us; +unsigned long long flip_timestamp_in_us;bool flip_immediate;/* TODO: add flip duration for FreeSync */ bool triplebuffer_flips;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 207/322 drm/amd/display: Only clear symclk otg flag for HDMI
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alvin Lee <[email protected]>
[ Upstream commit dff45f03f508c92cd8eb2050e27b726726b8ae0b ]
[Description]
There is a corner case where the symclk otg flag is cleared when disabling the phantom pipe for subvp (because the phantom and main pipe share the same link). This is undesired because we need the maintain the correct symclk otg flag state for the main pipe.
For now only clear the flag only for HDMI signal type, since it's only set for HDMI signal type (phantom is virtual). The ideal solution is to not clear it if the stream is phantom but currently there's a bug that doesn't allow us to do this. Once this issue is fixed the proper fix can be implemented.
--- drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c | 3 ++- drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c | 3 ++- drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c | 3 ++- drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.c | 3 ++- 4 files changed, 8 insertions(+), 4 deletions(-)
drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c +2 -1
@@ -2124,7 +2124,8 @@ static void dce110_reset_hw_ctx_wrap(BREAK_TO_DEBUGGER (); } pipe_ctx_old->stream_res.tg->funcs->disable_crtc (pipe_ctx_old->stream_res.tg); - pipe_ctx_old->stream->link->phy_state.symclk_ref_cnts.otg =0 ; +if (dc_is_hdmi_tmds_signal (pipe_ctx_old->stream->signal)) + pipe_ctx_old->stream->link->phy_state.symclk_ref_cnts.otg =0 ; pipe_ctx_old->plane_res.mi->funcs->free_mem_input ( pipe_ctx_old->plane_res.mi, dc->current_state->stream_count);
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c +2 -1
@@ -1054,7 +1054,8 @@ static void dcn10_reset_back_end_for_pipe(if (pipe_ctx->stream_res.tg->funcs->set_drr) pipe_ctx->stream_res.tg->funcs->set_drr ( pipe_ctx->stream_res.tg,NULL ); - pipe_ctx->stream->link->phy_state.symclk_ref_cnts.otg =0 ; +if (dc_is_hdmi_tmds_signal (pipe_ctx->stream->signal)) + pipe_ctx->stream->link->phy_state.symclk_ref_cnts.otg =0 ; }for (i =0 ; i < dc->res_pool->pipe_count; i++)
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c +2 -1
@@ -2533,7 +2533,8 @@ static void dcn20_reset_back_end_for_pipe(* the case where the same symclk is shared across multiple otg * instances */ - link->phy_state.symclk_ref_cnts.otg =0 ; +if (dc_is_hdmi_tmds_signal (pipe_ctx->stream->signal)) + link->phy_state.symclk_ref_cnts.otg =0 ;if (link->phy_state.symclk_state ==SYMCLK_ON_TX_OFF ) { link_hwss->disable_link_output (link, &pipe_ctx->link_res, pipe_ctx->stream->signal);
drivers/gpu/drm/amd/display/dc/dcn31/dcn31_hwseq.c +2 -1
@@ -523,7 +523,8 @@ static void dcn31_reset_back_end_for_pipe(if (pipe_ctx->stream_res.tg->funcs->set_odm_bypass) pipe_ctx->stream_res.tg->funcs->set_odm_bypass ( pipe_ctx->stream_res.tg, &pipe_ctx->stream->timing); - pipe_ctx->stream->link->phy_state.symclk_ref_cnts.otg =0 ; +if (dc_is_hdmi_tmds_signal (pipe_ctx->stream->signal)) + pipe_ctx->stream->link->phy_state.symclk_ref_cnts.otg =0 ;if (pipe_ctx->stream_res.tg->funcs->set_drr) pipe_ctx->stream_res.tg->funcs->set_drr(
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 208/322 clk: imx: clk-imx8qxp: fix LVDS bypass, pixel and phy clocks
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexander Stein <[email protected]>
[ Upstream commit 3f5f63adeea7e7aa715e101ffe4b4ac9705f9664 ]
To be compatible with SCU firmware based on 1.15 a different clock routing for LVDS is needed.
--- drivers/clk/imx/clk-imx8qxp.c | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-)
drivers/clk/imx/clk-imx8qxp.c +20 -4
@@ -66,6 +66,22 @@ static const char * const lcd_pxl_sels[] = { "lcd_pxl_bypass_div_clk", }; +static const char *const lvds0_sels[] = { +"clk_dummy" , +"clk_dummy" , +"clk_dummy" , +"clk_dummy" , +"mipi0_lvds_bypass_clk" , +}; + +static const char *const lvds1_sels[] = { +"clk_dummy" , +"clk_dummy" , +"clk_dummy" , +"clk_dummy" , +"mipi1_lvds_bypass_clk" , +}; +static const char *const mipi_sels[] = {"clk_dummy" ,"clk_dummy" ,
@@ -200,9 +216,9 @@ static int imx8qxp_clk_probe(struct platform_device *pdev)/* MIPI-LVDS SS */ imx_clk_scu ("mipi0_bypass_clk" ,IMX_SC_R_MIPI_0 ,IMX_SC_PM_CLK_BYPASS );imx_clk_scu ("mipi0_pixel_clk" ,IMX_SC_R_MIPI_0 ,IMX_SC_PM_CLK_PER ); -imx_clk_scu ("mipi0_lvds_pixel_clk" ,IMX_SC_R_LVDS_0 ,IMX_SC_PM_CLK_MISC2 );imx_clk_scu ("mipi0_lvds_bypass_clk" ,IMX_SC_R_LVDS_0 ,IMX_SC_PM_CLK_BYPASS ); -imx_clk_scu ("mipi0_lvds_phy_clk" ,IMX_SC_R_LVDS_0 ,IMX_SC_PM_CLK_MISC3 ); +imx_clk_scu2 ("mipi0_lvds_pixel_clk" , lvds0_sels,ARRAY_SIZE (lvds0_sels),IMX_SC_R_LVDS_0 ,IMX_SC_PM_CLK_MISC2 ); +imx_clk_scu2 ("mipi0_lvds_phy_clk" , lvds0_sels,ARRAY_SIZE (lvds0_sels),IMX_SC_R_LVDS_0 ,IMX_SC_PM_CLK_MISC3 );imx_clk_scu2 ("mipi0_dsi_tx_esc_clk" , mipi_sels,ARRAY_SIZE (mipi_sels),IMX_SC_R_MIPI_0 ,IMX_SC_PM_CLK_MST_BUS );imx_clk_scu2 ("mipi0_dsi_rx_esc_clk" , mipi_sels,ARRAY_SIZE (mipi_sels),IMX_SC_R_MIPI_0 ,IMX_SC_PM_CLK_SLV_BUS );imx_clk_scu2 ("mipi0_dsi_phy_clk" , mipi_sels,ARRAY_SIZE (mipi_sels),IMX_SC_R_MIPI_0 ,IMX_SC_PM_CLK_PHY );
@@ -212,9 +228,9 @@ static int imx8qxp_clk_probe(struct platform_device *pdev)imx_clk_scu ("mipi1_bypass_clk" ,IMX_SC_R_MIPI_1 ,IMX_SC_PM_CLK_BYPASS );imx_clk_scu ("mipi1_pixel_clk" ,IMX_SC_R_MIPI_1 ,IMX_SC_PM_CLK_PER ); -imx_clk_scu ("mipi1_lvds_pixel_clk" ,IMX_SC_R_LVDS_1 ,IMX_SC_PM_CLK_MISC2 );imx_clk_scu ("mipi1_lvds_bypass_clk" ,IMX_SC_R_LVDS_1 ,IMX_SC_PM_CLK_BYPASS ); -imx_clk_scu ("mipi1_lvds_phy_clk" ,IMX_SC_R_LVDS_1 ,IMX_SC_PM_CLK_MISC3 ); +imx_clk_scu2 ("mipi1_lvds_pixel_clk" , lvds1_sels,ARRAY_SIZE (lvds1_sels),IMX_SC_R_LVDS_1 ,IMX_SC_PM_CLK_MISC2 ); +imx_clk_scu2 ("mipi1_lvds_phy_clk" , lvds1_sels,ARRAY_SIZE (lvds1_sels),IMX_SC_R_LVDS_1 ,IMX_SC_PM_CLK_MISC3 );imx_clk_scu2 ("mipi1_dsi_tx_esc_clk" , mipi_sels,ARRAY_SIZE (mipi_sels),IMX_SC_R_MIPI_1 ,IMX_SC_PM_CLK_MST_BUS );imx_clk_scu2 ("mipi1_dsi_rx_esc_clk" , mipi_sels,ARRAY_SIZE (mipi_sels),IMX_SC_R_MIPI_1 ,IMX_SC_PM_CLK_SLV_BUS );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 209/322 drm/amdgpu: Fix ecc irq enable/disable unpaired
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stanley.Yang <[email protected]>
[ Upstream commit a32c6f7f5737cc7e31cd7ad5133f0d96fca12ea6 ]
The ecc_irq is disabled while GPU mode2 reset suspending process, but not be enabled during GPU mode2 reset resume process.
Changed from V1:
only do sdma/gfx ras_late_init in aldebaran_mode2_restore_ip delete amdgpu_ras_late_resume function
Changed from V2:
check umc ras supported before put ecc_irq
--- drivers/gpu/drm/amd/amdgpu/aldebaran.c | 26 +++++++++++++++++++++++++- drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c | 4 ++++ drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c | 5 +++++ drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c | 4 ++++ 4 files changed, 38 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/amdgpu/aldebaran.c +25 -1
@@ -333,6 +333,7 @@ aldebaran_mode2_restore_hwcontext(struct amdgpu_reset_control *reset_ctl, {struct list_head *reset_device_list = reset_context->reset_device_list;struct amdgpu_device *tmp_adev =NULL ; +struct amdgpu_ras *con;int r;if (reset_device_list ==NULL )
@@ -358,7 +359,30 @@ aldebaran_mode2_restore_hwcontext(struct amdgpu_reset_control *reset_ctl,*/ amdgpu_register_gpu_instance (tmp_adev); -/* Resume RAS */ +/* Resume RAS, ecc_irq */ + con =amdgpu_ras_get_context (tmp_adev); +if (!amdgpu_sriov_vf (tmp_adev) && con) { +if (tmp_adev->sdma.ras && + tmp_adev->sdma.ras->ras_block.ras_late_init) { + r = tmp_adev->sdma.ras->ras_block.ras_late_init (tmp_adev, + &tmp_adev->sdma.ras->ras_block.ras_comm); +if (r) { +dev_err (tmp_adev->dev,"SDMA failed to execute ras_late_init! ret:%d\n" , r); + goto end; + } + } + +if (tmp_adev->gfx.ras && + tmp_adev->gfx.ras->ras_block.ras_late_init) { + r = tmp_adev->gfx.ras->ras_block.ras_late_init (tmp_adev, + &tmp_adev->gfx.ras->ras_block.ras_comm); +if (r) { +dev_err (tmp_adev->dev,"GFX failed to execute ras_late_init! ret:%d\n" , r); + goto end; + } + } + } +amdgpu_ras_resume (tmp_adev);/* Update PSP FW topology after reset */
drivers/gpu/drm/amd/amdgpu/gmc_v10_0.c +4 -0
@@ -1141,6 +1141,10 @@ static int gmc_v10_0_hw_fini(void *handle)amdgpu_irq_put (adev, &adev->gmc.vm_fault,0 ); +if (adev->gmc.ecc_irq.funcs && +amdgpu_ras_is_supported (adev,AMDGPU_RAS_BLOCK__UMC )) +amdgpu_irq_put (adev, &adev->gmc.ecc_irq,0 ); +return 0 ; }
drivers/gpu/drm/amd/amdgpu/gmc_v11_0.c +5 -0
@@ -974,6 +974,11 @@ static int gmc_v11_0_hw_fini(void *handle) }amdgpu_irq_put (adev, &adev->gmc.vm_fault,0 ); + +if (adev->gmc.ecc_irq.funcs && +amdgpu_ras_is_supported (adev,AMDGPU_RAS_BLOCK__UMC )) +amdgpu_irq_put (adev, &adev->gmc.ecc_irq,0 ); +gmc_v11_0_gart_disable (adev);return 0 ;
drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c +4 -0
@@ -2413,6 +2413,10 @@ static int gmc_v9_0_hw_fini(void *handle)amdgpu_irq_put (adev, &adev->gmc.vm_fault,0 ); +if (adev->gmc.ecc_irq.funcs && +amdgpu_ras_is_supported (adev,AMDGPU_RAS_BLOCK__UMC )) +amdgpu_irq_put (adev, &adev->gmc.ecc_irq,0 ); +return 0 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 210/322 drm/amd/display: Fix minor issues in BW Allocation Phase2
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Meenakshikumar Somasundaram <[email protected]>
[ Upstream commit aa5dc05340eb97486a631ce6bccb8d020bf6b56b ]
[Why]
Fix minor issues in BW Allocation Phase2.
[How]
- In set_usb4_req_bw_req(), link->dpia_bw_alloc_config.response_ready flag should be reset before writing DPCD REQUEST_BW.
- Fix the granularity for value of 2 in get_bw_granularity().
- Removed bandwidth allocation support display fw boot option as the fw would read feature enable status from bios.
- Clean up DPIA_EST_BW_CHANGED and DPIA_BW_REQ_SUCCESS cases in dpia_handle_bw_alloc_response().
- Removed allocate_usb4_bw and deallocate_usb4_bw.
- Optimized loop in get_lowest_dpia_index().
- Updated link_dp_dpia_allocate_usb4_bandwidth_for_stream() and set_usb4_req_bw_req() to always issue request bw.
--- .../dc/link/protocols/link_dp_dpia_bw.c | 221 ++++++++---------- .../dc/link/protocols/link_dp_dpia_bw.h | 4 +- 2 files changed, 101 insertions(+), 124 deletions(-)
drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_dpia_bw.c +99 -122
@@ -50,6 +50,7 @@ static bool get_bw_alloc_proceed_flag(struct dc_link *tmp) && tmp->hpd_status && tmp->dpia_bw_alloc_config.bw_alloc_enabled); } +static void reset_bw_alloc_struct (struct dc_link *link) { link->dpia_bw_alloc_config.bw_alloc_enabled = false;
@@ -59,6 +60,11 @@ static void reset_bw_alloc_struct(struct dc_link *link) link->dpia_bw_alloc_config.bw_granularity =0 ; link->dpia_bw_alloc_config.response_ready = false; } + +#define BW_GRANULARITY_0 4 // 0.25 Gbps +#define BW_GRANULARITY_1 2 // 0.5 Gbps +#define BW_GRANULARITY_2 1 // 1 Gbps +static uint8_t get_bw_granularity (struct dc_link *link) {uint8_t bw_granularity =0 ;
@@ -71,16 +77,20 @@ static uint8_t get_bw_granularity(struct dc_link *link)switch (bw_granularity &0x3 ) {case 0 : - bw_granularity =4 ; + bw_granularity =BW_GRANULARITY_0 ;break ;case 1 : + bw_granularity =BW_GRANULARITY_1 ; +break ; +case 2 :default : - bw_granularity =2 ; + bw_granularity =BW_GRANULARITY_2 ;break ; }return bw_granularity; } +static int get_estimated_bw (struct dc_link *link) {uint8_t bw_estimated_bw =0 ;
@@ -93,31 +103,7 @@ static int get_estimated_bw(struct dc_link *link)return bw_estimated_bw * (Kbps_TO_Gbps / link->dpia_bw_alloc_config.bw_granularity); } -static bool allocate_usb4_bw (int *stream_allocated_bw,int bw_needed,struct dc_link *link) -{ -if (bw_needed >0 ) - *stream_allocated_bw += bw_needed; - -return true; -} -static bool deallocate_usb4_bw (int *stream_allocated_bw,int bw_to_dealloc,struct dc_link *link) -{ -bool ret = false; - -if (*stream_allocated_bw >0 ) { - *stream_allocated_bw -= bw_to_dealloc; - ret = true; - }else { -//Do nothing for now - ret = true; - } -// Unplug so reset values -if (!link->hpd_status) -reset_bw_alloc_struct (link); - -return ret; -}/* * Read all New BW alloc configuration ex: estimated_bw, allocated_bw, * granuality, Driver_ID, CM_Group, & populate the BW allocation structs
@@ -128,7 +114,12 @@ static void init_usb4_bw_struct(struct dc_link *link)// Init the known values link->dpia_bw_alloc_config.bw_granularity =get_bw_granularity (link); link->dpia_bw_alloc_config.estimated_bw =get_estimated_bw (link); + +DC_LOG_DEBUG ("%s: bw_granularity(%d), estimated_bw(%d)\n" , + __func__, link->dpia_bw_alloc_config.bw_granularity, + link->dpia_bw_alloc_config.estimated_bw); } +static uint8_t get_lowest_dpia_index (struct dc_link *link) {const struct dc *dc_struct = link->dc;
@@ -141,12 +132,15 @@ static uint8_t get_lowest_dpia_index(struct dc_link *link) dc_struct->links[i]->ep_type != DISPLAY_ENDPOINT_USB4_DPIA) continue; -if (idx > dc_struct->links[i]->link_index) +if (idx > dc_struct->links[i]->link_index) { idx = dc_struct->links[i]->link_index; +break ; + } }return idx; } +/* * Get the Max Available BW or Max Estimated BW for each Host Router *
@@ -186,6 +180,7 @@ static int get_host_router_total_bw(struct dc_link *link, uint8_t type)return total_bw; } +/* * Cleanup function for when the dpia is unplugged to reset struct * and perform any required clean up
@@ -194,42 +189,50 @@ static int get_host_router_total_bw(struct dc_link *link, uint8_t type)* * return: none */ -static bool dpia_bw_alloc_unplug (struct dc_link *link) +static void dpia_bw_alloc_unplug (struct dc_link *link) { -if (!link) -return true; - -return deallocate_usb4_bw (&link->dpia_bw_alloc_config.sink_allocated_bw, - link->dpia_bw_alloc_config.sink_allocated_bw, link); +if (link) { +DC_LOG_DEBUG ("%s: resetting bw alloc config for link(%d)\n" , + __func__, link->link_index); + link->dpia_bw_alloc_config.sink_allocated_bw =0 ; +reset_bw_alloc_struct (link); + } } +static void set_usb4_req_bw_req (struct dc_link *link,int req_bw) {uint8_t requested_bw;uint32_t temp; -// 1. Add check for this corner case #1 -if (req_bw > link->dpia_bw_alloc_config.estimated_bw) +/* Error check whether request bw greater than allocated */ +if (req_bw > link->dpia_bw_alloc_config.estimated_bw) { +DC_LOG_ERROR ("%s: Request bw greater than estimated bw for link(%d)\n" , + __func__, link->link_index); req_bw = link->dpia_bw_alloc_config.estimated_bw; + } temp = req_bw * link->dpia_bw_alloc_config.bw_granularity; requested_bw = temp / Kbps_TO_Gbps; -// Always make sure to add more to account for floating points +/* Always make sure to add more to account for floating points */ if (temp % Kbps_TO_Gbps) ++requested_bw; -// 2. Add check for this corner case #2 +/* Error check whether requested and allocated are equal */ req_bw = requested_bw * (Kbps_TO_Gbps / link->dpia_bw_alloc_config.bw_granularity); -if (req_bw == link->dpia_bw_alloc_config.sink_allocated_bw) -return ; +if (req_bw == link->dpia_bw_alloc_config.sink_allocated_bw) { +DC_LOG_ERROR ("%s: Request bw equals to allocated bw for link(%d)\n" , + __func__, link->link_index); + } -if (core_link_write_dpcd ( + link->dpia_bw_alloc_config.response_ready = false;// Reset flag +core_link_write_dpcd ( link,REQUESTED_BW , &requested_bw, -sizeof (uint8_t )) ==DC_OK ) - link->dpia_bw_alloc_config.response_ready = false;// Reset flag +sizeof (uint8_t )); } +/* * Return the response_ready flag from dc_link struct *
@@ -241,6 +244,7 @@ static bool get_cm_response_ready_flag(struct dc_link *link) {return link->dpia_bw_alloc_config.response_ready; } +// ------------------------------------------------------------------ // PUBLIC FUNCTIONS // ------------------------------------------------------------------
@@ -277,27 +281,27 @@ bool link_dp_dpia_set_dptx_usb4_bw_alloc_support(struct dc_link *link) DPTX_BW_ALLOCATION_MODE_CONTROL, &response, sizeof(uint8_t)) != DC_OK) { - DC_LOG_DEBUG("%s: **** FAILURE Enabling DPtx BW Allocation Mode Support ***\n", - __func__); + DC_LOG_DEBUG("%s: FAILURE Enabling DPtx BW Allocation Mode Support for link(%d)\n", + __func__, link->link_index); } else {// SUCCESS Enabled DPtx BW Allocation Mode Support - link->dpia_bw_alloc_config.bw_alloc_enabled = true; -DC_LOG_DEBUG ("%s: **** SUCCESS Enabling DPtx BW Allocation Mode Support ***\n" , - __func__); +DC_LOG_DEBUG ("%s: SUCCESS Enabling DPtx BW Allocation Mode Support for link(%d)\n" , + __func__, link->link_index); ret = true;init_usb4_bw_struct (link); + link->dpia_bw_alloc_config.bw_alloc_enabled = true; } } out:return ret; } +void dpia_handle_bw_alloc_response (struct dc_link *link,uint8_t bw,uint8_t result) {int bw_needed =0 ;int estimated =0 ; -int host_router_total_estimated_bw =0 ;if (!get_bw_alloc_proceed_flag ((link)))return ;
@@ -306,14 +310,22 @@ void dpia_handle_bw_alloc_response(struct dc_link *link, uint8_t bw, uint8_t rescase DPIA_BW_REQ_FAILED : -DC_LOG_DEBUG ("%s: *** *** BW REQ FAILURE for DP-TX Request *** ***\n" , __func__); +/* +* Ideally, we shouldn't run into this case as we always validate available +* bandwidth and request within that limit +*/ + estimated = bw * (Kbps_TO_Gbps / link->dpia_bw_alloc_config.bw_granularity); -// Update the new Estimated BW value updated by CM - link->dpia_bw_alloc_config.estimated_bw = - bw * (Kbps_TO_Gbps / link->dpia_bw_alloc_config.bw_granularity); +DC_LOG_ERROR ("%s: BW REQ FAILURE for DP-TX Request for link(%d)\n" , + __func__, link->link_index); +DC_LOG_ERROR ("%s: current estimated_bw(%d), new estimated_bw(%d)\n" , + __func__, link->dpia_bw_alloc_config.estimated_bw, estimated); +/* Update the new Estimated BW value updated by CM */ + link->dpia_bw_alloc_config.estimated_bw = estimated; + +/* Allocate the previously requested bandwidth */ set_usb4_req_bw_req (link, link->dpia_bw_alloc_config.estimated_bw); - link->dpia_bw_alloc_config.response_ready = false;/* * If FAIL then it is either:
@@ -326,68 +338,34 @@ void dpia_handle_bw_alloc_response(struct dc_link *link, uint8_t bw, uint8_t rescase DPIA_BW_REQ_SUCCESS : -DC_LOG_DEBUG ("%s: *** BW REQ SUCCESS for DP-TX Request ***\n" , __func__); - -// 1. SUCCESS 1st time before any Pruning is done -// 2. SUCCESS after prev. FAIL before any Pruning is done -// 3. SUCCESS after Pruning is done but before enabling link - bw_needed = bw * (Kbps_TO_Gbps / link->dpia_bw_alloc_config.bw_granularity); -// 1. -if (!link->dpia_bw_alloc_config.sink_allocated_bw) { - -allocate_usb4_bw (&link->dpia_bw_alloc_config.sink_allocated_bw, bw_needed, link); - link->dpia_bw_alloc_config.sink_verified_bw = - link->dpia_bw_alloc_config.sink_allocated_bw; +DC_LOG_DEBUG ("%s: BW REQ SUCCESS for DP-TX Request for link(%d)\n" , + __func__, link->link_index); +DC_LOG_DEBUG ("%s: current allocated_bw(%d), new allocated_bw(%d)\n" , + __func__, link->dpia_bw_alloc_config.sink_allocated_bw, bw_needed); -// SUCCESS from first attempt -if (link->dpia_bw_alloc_config.sink_allocated_bw > - link->dpia_bw_alloc_config.sink_max_bw) - link->dpia_bw_alloc_config.sink_verified_bw = - link->dpia_bw_alloc_config.sink_max_bw; - } -// 3. -else if (link->dpia_bw_alloc_config.sink_allocated_bw) { - -// Find out how much do we need to de-alloc -if (link->dpia_bw_alloc_config.sink_allocated_bw > bw_needed) -deallocate_usb4_bw (&link->dpia_bw_alloc_config.sink_allocated_bw, - link->dpia_bw_alloc_config.sink_allocated_bw - bw_needed, link); -else -allocate_usb4_bw (&link->dpia_bw_alloc_config.sink_allocated_bw, - bw_needed - link->dpia_bw_alloc_config.sink_allocated_bw, link); - } - -// 4. If this is the 2nd sink then any unused bw will be reallocated to master DPIA -// => check if estimated_bw changed + link->dpia_bw_alloc_config.sink_allocated_bw = bw_needed; link->dpia_bw_alloc_config.response_ready = true;break ;case DPIA_EST_BW_CHANGED : -DC_LOG_DEBUG ("%s: *** ESTIMATED BW CHANGED for DP-TX Request ***\n" , __func__); - estimated = bw * (Kbps_TO_Gbps / link->dpia_bw_alloc_config.bw_granularity); - host_router_total_estimated_bw =get_host_router_total_bw (link,HOST_ROUTER_BW_ESTIMATED ); -// 1. If due to unplug of other sink -if (estimated == host_router_total_estimated_bw) { -// First update the estimated & max_bw fields -if (link->dpia_bw_alloc_config.estimated_bw < estimated) - link->dpia_bw_alloc_config.estimated_bw = estimated; - } -// 2. If due to realloc bw btw 2 dpia due to plug OR realloc unused Bw -else { -// We lost estimated bw usually due to plug event of other dpia - link->dpia_bw_alloc_config.estimated_bw = estimated; - } +DC_LOG_DEBUG ("%s: ESTIMATED BW CHANGED for link(%d)\n" , + __func__, link->link_index); +DC_LOG_DEBUG ("%s: current estimated_bw(%d), new estimated_bw(%d)\n" , + __func__, link->dpia_bw_alloc_config.estimated_bw, estimated); + + link->dpia_bw_alloc_config.estimated_bw = estimated;break ;case DPIA_BW_ALLOC_CAPS_CHANGED : -DC_LOG_DEBUG ("%s: *** BW ALLOC CAPABILITY CHANGED for DP-TX Request ***\n" , __func__); +DC_LOG_ERROR ("%s: BW ALLOC CAPABILITY CHANGED to Disabled for link(%d)\n" , + __func__, link->link_index); link->dpia_bw_alloc_config.bw_alloc_enabled = false;break ; }
@@ -409,11 +387,11 @@ int dpia_handle_usb4_bandwidth_allocation_for_link(struct dc_link *link, int peaset_usb4_req_bw_req (link, link->dpia_bw_alloc_config.sink_max_bw);do { -if (!(timeout >0 )) +if (timeout >0 ) timeout--;else break ; -fsleep (10 *1000 ); +msleep (10 ); }while (!get_cm_response_ready_flag (link));if (!timeout)
@@ -428,37 +406,36 @@ int dpia_handle_usb4_bandwidth_allocation_for_link(struct dc_link *link, int pea out:return ret; } -int link_dp_dpia_allocate_usb4_bandwidth_for_stream (struct dc_link *link,int req_bw) + +bool link_dp_dpia_allocate_usb4_bandwidth_for_stream (struct dc_link *link,int req_bw) { -int ret =0 ; +bool ret = false;uint8_t timeout =10 ; +DC_LOG_DEBUG ("%s: ENTER: link(%d), hpd_status(%d), current allocated_bw(%d), req_bw(%d)\n" , + __func__, link->link_index, link->hpd_status, + link->dpia_bw_alloc_config.sink_allocated_bw, req_bw); +if (!get_bw_alloc_proceed_flag (link)) goto out; -/* -* Sometimes stream uses same timing parameters as the already -* allocated max sink bw so no need to re-alloc -*/ -if (req_bw != link->dpia_bw_alloc_config.sink_allocated_bw) { -set_usb4_req_bw_req (link, req_bw); -do { -if (!(timeout >0 )) - timeout--; -else -break ; -udelay (10 *1000 ); - }while (!get_cm_response_ready_flag (link)); +set_usb4_req_bw_req (link, req_bw); +do { +if (timeout >0 ) + timeout--; +else +break ; +msleep (10 ); + }while (!get_cm_response_ready_flag (link)); -if (!timeout) - ret =0 ;// ERROR TIMEOUT waiting for response for allocating bw -else if (link->dpia_bw_alloc_config.sink_allocated_bw >0 ) - ret =get_host_router_total_bw (link,HOST_ROUTER_BW_ALLOCATED ); - } +if (timeout) + ret = true; out: +DC_LOG_DEBUG ("%s: EXIT: timeout(%d), ret(%d)\n" , __func__, timeout, ret);return ret; } +bool dpia_validate_usb4_bw (struct dc_link **link,int *bw_needed_per_dpia,const unsigned int num_dpias) {bool ret = true;
drivers/gpu/drm/amd/display/dc/link/protocols/link_dp_dpia_bw.h +2 -2
@@ -59,9 +59,9 @@ bool link_dp_dpia_set_dptx_usb4_bw_alloc_support(struct dc_link *link);* @link: pointer to the dc_link struct instance * @req_bw: Bw requested by the stream * -* return: allocated bw else return 0 +* return: true if allocated successfully */ -int link_dp_dpia_allocate_usb4_bandwidth_for_stream (struct dc_link *link,int req_bw); +bool link_dp_dpia_allocate_usb4_bandwidth_for_stream (struct dc_link *link,int req_bw);/* * Handle the USB4 BW Allocation related functionality here:
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 211/322 drm/amdgpu: Let KFD sync with VM fences
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Kuehling <[email protected]>
[ Upstream commit ec9ba4821fa52b5efdbc4cdf0a77497990655231 ]
Change the rules for amdgpu_sync_resv to let KFD synchronize with VM fences on page table reservations. This fixes intermittent memory corruption after evictions when using amdgpu_vm_handle_moved to update page tables for VM mappings managed through render nodes.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_sync.c +2 -1
@@ -191,7 +191,8 @@ static bool amdgpu_sync_test_fence(struct amdgpu_device *adev,/* Never sync to VM updates either. */ if (fence_owner ==AMDGPU_FENCE_OWNER_VM && - owner !=AMDGPU_FENCE_OWNER_UNDEFINED ) + owner !=AMDGPU_FENCE_OWNER_UNDEFINED && + owner !=AMDGPU_FENCE_OWNER_KFD )return false;/* Ignore fences depending on the sync mode */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 212/322 Re-revert "drm/amd/display: Enable Replay for static screen use cases"
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ivan Lipski <[email protected]>
[ Upstream commit d6398866a6b47e92319ef6efdb0126a4fbb7796a ]
This reverts commit 44e60b14d5a72f91fd0bdeae8da59ae37a3ca8e5.
Since, it causes a regression in which eDP displays with PSR support, but no Replay support (Sink support <= 0x03), fail to enable PSR and consequently all IGT amd_psr tests fail. So, revert this until a more suitable fix can be found.
This got brought back accidently with the backmerge.
--- .../gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 22 ------------------- .../amd/display/amdgpu_dm/amdgpu_dm_crtc.c | 9 +------- drivers/gpu/drm/amd/include/amd_shared.h | 2 -- 3 files changed, 1 insertion(+), 32 deletions(-)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +0 -22
@@ -65,7 +65,6 @@#include "amdgpu_dm_debugfs.h" #endif #include "amdgpu_dm_psr.h" -#include "amdgpu_dm_replay.h" #include "ivsrcid/ivsrcid_vislands30.h"
@@ -4338,7 +4337,6 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev)enum dc_connection_type new_connection_type = dc_connection_none;const struct dc_plane_cap *plane;bool psr_feature_enabled = false; -bool replay_feature_enabled = false;int max_overlay = dm->dc->caps.max_slave_planes; dm->display_indexes_num = dm->dc->caps.max_streams;
@@ -4448,20 +4446,6 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev) } } -if (!(amdgpu_dc_debug_mask &DC_DISABLE_REPLAY )) { -switch (adev->ip_versions[DCE_HWIP ][0 ]) { -case IP_VERSION (3 ,1 ,4 ): -case IP_VERSION (3 ,1 ,5 ): -case IP_VERSION (3 ,1 ,6 ): -case IP_VERSION (3 ,2 ,0 ): -case IP_VERSION (3 ,2 ,1 ): - replay_feature_enabled = true; -break ; -default : - replay_feature_enabled = amdgpu_dc_feature_mask &DC_REPLAY_MASK ; -break ; - } - }/* loops over all connectors on the board */ for (i =0 ; i < link_cnt; i++) {struct dc_link *link =NULL ;
@@ -4510,12 +4494,6 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev)amdgpu_dm_update_connector_after_detect (aconnector);setup_backlight_device (dm, aconnector); -/* -* Disable psr if replay can be enabled -*/ -if (replay_feature_enabled &&amdgpu_dm_setup_replay (link, aconnector)) - psr_feature_enabled = false; -if (psr_feature_enabled)amdgpu_dm_set_psr_caps (link);
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_crtc.c +1 -8
@@ -29,7 +29,6 @@#include "dc.h" #include "amdgpu.h" #include "amdgpu_dm_psr.h" -#include "amdgpu_dm_replay.h" #include "amdgpu_dm_crtc.h" #include "amdgpu_dm_plane.h" #include "amdgpu_dm_trace.h"
@@ -124,12 +123,7 @@ static void vblank_control_worker(struct work_struct *work)* fill_dc_dirty_rects(). */ if (vblank_work->stream && vblank_work->stream->link) { -/* -* Prioritize replay, instead of psr -*/ -if (vblank_work->stream->link->replay_settings.replay_feature_enabled) -amdgpu_dm_replay_enable (vblank_work->stream, false); -else if (vblank_work->enable) { +if (vblank_work->enable) {if (vblank_work->stream->link->psr_settings.psr_version <DC_PSR_VERSION_SU_1 && vblank_work->stream->link->psr_settings.psr_allow_active)amdgpu_dm_psr_disable (vblank_work->stream);
@@ -138,7 +132,6 @@ static void vblank_control_worker(struct work_struct *work)#ifdef CONFIG_DRM_AMD_SECURE_DISPLAY !amdgpu_dm_crc_window_is_activated(&vblank_work->acrtc->base) && #endif - vblank_work->stream->link->panel_config.psr.disallow_replay && vblank_work->acrtc->dm_irq_params.allow_psr_entry) {amdgpu_dm_psr_enable (vblank_work->stream); }
drivers/gpu/drm/amd/include/amd_shared.h +0 -2
@@ -240,7 +240,6 @@ enum DC_FEATURE_MASK {DC_DISABLE_LTTPR_DP2_0 = (1 <<6 ),//0x40, disabled by default DC_PSR_ALLOW_SMU_OPT = (1 <<7 ),//0x80, disabled by default DC_PSR_ALLOW_MULTI_DISP_OPT = (1 << 8), //0x100, disabled by default - DC_REPLAY_MASK = (1 << 9), //0x200, disabled by default for dcn < 3.1.4 }; enum DC_DEBUG_MASK {
@@ -251,7 +250,6 @@ enum DC_DEBUG_MASK {DC_DISABLE_PSR =0x10 ,DC_FORCE_SUBVP_MCLK_SWITCH =0x20 ,DC_DISABLE_MPO =0x40 , -DC_DISABLE_REPLAY =0x50 , DC_ENABLE_DPIA_TRACE = 0x80, };
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 213/322 drm/amdgpu: Fix *fw from request_firmware() not released in amdgpu_ucode_request()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinivasan Shanmugam <[email protected]>
[ Upstream commit 13a1851f923d9a7a78a477497295c2dfd16ad4a4 ]
Fixes the below:drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c:1404 amdgpu_ucode_request() warn: '*fw' from request_firmware() not released on lines: 1404.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_ucode.c +5 -1
@@ -1326,9 +1326,13 @@ int amdgpu_ucode_request(struct amdgpu_device *adev, const struct firmware **fw,if (err)return -ENODEV ; + err =amdgpu_ucode_validate (*fw); -if (err) +if (err) {dev_dbg (adev->dev,"\"%s\" failed to validate\n" , fw_name); +release_firmware (*fw); + *fw =NULL ; + }return err; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 214/322 drm/amdgpu: Drop fence check in to_amdgpu_amdkfd_fence()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinivasan Shanmugam <[email protected]>
[ Upstream commit bf2ad4fb8adca89374b54b225d494e0b1956dbea ]
Return value of container_of(...) can't be null, so null check is not required for 'fence'. Hence drop its NULL check.
Fixes the below:drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_fence.c:93 to_amdgpu_amdkfd_fence() warn: can 'fence' even be NULL?
--- drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_fence.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_fence.c +1 -1
@@ -90,7 +90,7 @@ struct amdgpu_amdkfd_fence *to_amdgpu_amdkfd_fence(struct dma_fence *f)return NULL ; fence = container_of(f, struct amdgpu_amdkfd_fence, base); -if (fence && f->ops == &amdkfd_fence_ops) +if (f->ops == &amdkfd_fence_ops)return fence;return NULL ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 215/322 drm/amdkfd: Fix iterator used outside loop in kfd_add_peer_prop()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinivasan Shanmugam <[email protected]>
[ Upstream commit b1a428b45dc7e47c7acc2ad0d08d8a6dda910c4c ]
Fix the following about iterator use:drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_topology.c:1456 kfd_add_peer_prop() warn: iterator used outside loop: 'iolink3'
--- drivers/gpu/drm/amd/amdkfd/kfd_topology.c | 24 ++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-)
drivers/gpu/drm/amd/amdkfd/kfd_topology.c +13 -11
@@ -1452,17 +1452,19 @@ static int kfd_add_peer_prop(struct kfd_topology_device *kdev,/* CPU->CPU link*/ cpu_dev =kfd_topology_device_by_proximity_domain (iolink1->node_to);if (cpu_dev) { -list_for_each_entry (iolink3, &cpu_dev->io_link_props, list) -if (iolink3->node_to == iolink2->node_to) -break ; - - props->weight += iolink3->weight; - props->min_latency += iolink3->min_latency; - props->max_latency += iolink3->max_latency; - props->min_bandwidth =min (props->min_bandwidth, - iolink3->min_bandwidth); - props->max_bandwidth =min (props->max_bandwidth, - iolink3->max_bandwidth); +list_for_each_entry (iolink3, &cpu_dev->io_link_props, list) { +if (iolink3->node_to != iolink2->node_to) +continue ; + + props->weight += iolink3->weight; + props->min_latency += iolink3->min_latency; + props->max_latency += iolink3->max_latency; + props->min_bandwidth =min (props->min_bandwidth, + iolink3->min_bandwidth); + props->max_bandwidth =min (props->max_bandwidth, + iolink3->max_bandwidth); +break ; + } }else {WARN (1 ,"CPU node not found" ); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 216/322 drm/amdgpu: apply the RV2 system aperture fix to RN/CZN as well
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
[ Upstream commit 16783d8ef08448815e149e40c82fc1e1fc41ddbf ]
These chips needs the same fix. This was previously not seen on then since the AGP aperture expanded the system aperture, but this showed up again when AGP was disabled.
--- drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c | 4 +++- drivers/gpu/drm/amd/amdgpu/gfxhub_v1_2.c | 4 +++- drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c | 4 +++- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 8 ++++++-- 4 files changed, 15 insertions(+), 5 deletions(-)
drivers/gpu/drm/amd/amdgpu/gfxhub_v1_0.c +3 -1
@@ -102,7 +102,9 @@ static void gfxhub_v1_0_init_system_aperture_regs(struct amdgpu_device *adev)WREG32_SOC15_RLC (GC ,0 , mmMC_VM_SYSTEM_APERTURE_LOW_ADDR,min (adev->gmc.fb_start, adev->gmc.agp_start) >>18 ); -if (adev->apu_flags &AMD_APU_IS_RAVEN2 ) +if (adev->apu_flags & (AMD_APU_IS_RAVEN2 | +AMD_APU_IS_RENOIR | +AMD_APU_IS_GREEN_SARDINE ))/* * Raven2 has a HW issue that it is unable to use the * vram which is out of MC_VM_SYSTEM_APERTURE_HIGH_ADDR.
drivers/gpu/drm/amd/amdgpu/gfxhub_v1_2.c +3 -1
@@ -139,7 +139,9 @@ gfxhub_v1_2_xcc_init_system_aperture_regs(struct amdgpu_device *adev,WREG32_SOC15_RLC (GC ,GET_INST (GC , i), regMC_VM_SYSTEM_APERTURE_LOW_ADDR,min (adev->gmc.fb_start, adev->gmc.agp_start) >>18 ); -if (adev->apu_flags &AMD_APU_IS_RAVEN2 ) +if (adev->apu_flags & (AMD_APU_IS_RAVEN2 | +AMD_APU_IS_RENOIR | +AMD_APU_IS_GREEN_SARDINE ))/* * Raven2 has a HW issue that it is unable to use the * vram which is out of MC_VM_SYSTEM_APERTURE_HIGH_ADDR.
drivers/gpu/drm/amd/amdgpu/mmhub_v1_0.c +3 -1
@@ -96,7 +96,9 @@ static void mmhub_v1_0_init_system_aperture_regs(struct amdgpu_device *adev)WREG32_SOC15 (MMHUB ,0 , mmMC_VM_SYSTEM_APERTURE_LOW_ADDR,min (adev->gmc.fb_start, adev->gmc.agp_start) >>18 ); -if (adev->apu_flags &AMD_APU_IS_RAVEN2 ) +if (adev->apu_flags & (AMD_APU_IS_RAVEN2 | +AMD_APU_IS_RENOIR | +AMD_APU_IS_GREEN_SARDINE ))/* * Raven2 has a HW issue that it is unable to use the vram which * is out of MC_VM_SYSTEM_APERTURE_HIGH_ADDR. So here is the
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +6 -2
@@ -1247,7 +1247,9 @@ static void mmhub_read_system_context(struct amdgpu_device *adev, struct dc_phy_/* AGP aperture is disabled */ if (agp_bot == agp_top) { logical_addr_low = adev->gmc.fb_start >>18 ; -if (adev->apu_flags &AMD_APU_IS_RAVEN2 ) +if (adev->apu_flags & (AMD_APU_IS_RAVEN2 | +AMD_APU_IS_RENOIR | +AMD_APU_IS_GREEN_SARDINE ))/* * Raven2 has a HW issue that it is unable to use the vram which * is out of MC_VM_SYSTEM_APERTURE_HIGH_ADDR. So here is the
@@ -1259,7 +1261,9 @@ static void mmhub_read_system_context(struct amdgpu_device *adev, struct dc_phy_ logical_addr_high = adev->gmc.fb_end >>18 ; }else { logical_addr_low =min (adev->gmc.fb_start, adev->gmc.agp_start) >>18 ; -if (adev->apu_flags &AMD_APU_IS_RAVEN2 ) +if (adev->apu_flags & (AMD_APU_IS_RAVEN2 | +AMD_APU_IS_RENOIR | +AMD_APU_IS_GREEN_SARDINE ))/* * Raven2 has a HW issue that it is unable to use the vram which * is out of MC_VM_SYSTEM_APERTURE_HIGH_ADDR. So here is the
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 217/322 ALSA: hda/conexant: Fix headset auto detect fail in cx8070 and SN6140
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: bo liu <[email protected]>
[ Upstream commit 7aeb259086487417f0fecf66e325bee133e8813a ]
When OMTP headset plugin the headset jack of CX8070 and SN6160 sound cards, the headset type detection circuit will recognize the headset type as CTIA. At this point, plugout and plugin the headset will get the correct headset type as OMTP.
The reason for the failure of headset type recognition is that the sound card creation will enable the VREF voltage of the headset mic, which interferes with the headset type automatic detection circuit. Plugout and plugin the headset will restart the headset detection and get the correct headset type.
The patch is disable the VREF voltage when the headset is not present, and will enable the VREF voltage when the headset is present.
--- sound/pci/hda/patch_conexant.c | 115 ++++++++++++++++++++++++++++++++- 1 file changed, 113 insertions(+), 2 deletions(-)
sound/pci/hda/patch_conexant.c +113 -2
@@ -21,6 +21,12 @@#include "hda_jack.h" #include "hda_generic.h" +enum { +CX_HEADSET_NOPRESENT =0 , +CX_HEADSET_PARTPRESENT , +CX_HEADSET_ALLPRESENT , +}; +struct conexant_spec {struct hda_gen_spec gen;
@@ -42,7 +48,8 @@ struct conexant_spec {unsigned int gpio_led;unsigned int gpio_mute_led_mask;unsigned int gpio_mic_led_mask; - +unsigned int headset_present_flag; +bool is_cx8070_sn6140; };
@@ -164,6 +171,27 @@ static void cxt_init_gpio_led(struct hda_codec *codec) } } +static void cx_fixup_headset_recog (struct hda_codec *codec) +{ +unsigned int mic_persent; + +/* fix some headset type recognize fail issue, such as EDIFIER headset */ +/* set micbiasd output current comparator threshold from 66% to 55%. */ +snd_hda_codec_write (codec,0x1c ,0 ,0x320 ,0x010 ); +/* set OFF voltage for DFET from -1.2V to -0.8V, set headset micbias registor +* value adjustment trim from 2.2K ohms to 2.0K ohms. +*/ +snd_hda_codec_write (codec,0x1c ,0 ,0x3b0 ,0xe10 ); +/* fix reboot headset type recognize fail issue */ + mic_persent =snd_hda_codec_read (codec,0x19 ,0 ,AC_VERB_GET_PIN_SENSE ,0x0 ); +if (mic_persent &AC_PINSENSE_PRESENCE ) +/* enable headset mic VREF */ +snd_hda_codec_write (codec,0x19 ,0 ,AC_VERB_SET_PIN_WIDGET_CONTROL ,0x24 ); +else +/* disable headset mic VREF */ +snd_hda_codec_write (codec,0x19 ,0 ,AC_VERB_SET_PIN_WIDGET_CONTROL ,0x20 ); +} +static int cx_auto_init (struct hda_codec *codec) {struct conexant_spec *spec = codec->spec;
@@ -174,6 +202,9 @@ static int cx_auto_init(struct hda_codec *codec)cxt_init_gpio_led (codec);snd_hda_apply_fixup (codec,HDA_FIXUP_ACT_INIT ); +if (spec->is_cx8070_sn6140) +cx_fixup_headset_recog (codec); +return 0 ; }
@@ -192,6 +223,77 @@ static void cx_auto_free(struct hda_codec *codec)snd_hda_gen_free (codec); } +static void cx_process_headset_plugin (struct hda_codec *codec) +{ +unsigned int val; +unsigned int count =0 ; + +/* Wait headset detect done. */ +do { + val =snd_hda_codec_read (codec,0x1c ,0 ,0xca0 ,0x0 ); +if (val &0x080 ) { +codec_dbg (codec,"headset type detect done!\n" ); +break ; + } +msleep (20 ); + count++; + }while (count <3 ); + val =snd_hda_codec_read (codec,0x1c ,0 ,0xcb0 ,0x0 ); +if (val &0x800 ) { +codec_dbg (codec,"headset plugin, type is CTIA\n" ); +snd_hda_codec_write (codec,0x19 ,0 ,AC_VERB_SET_PIN_WIDGET_CONTROL ,0x24 ); + }else if (val &0x400 ) { +codec_dbg (codec,"headset plugin, type is OMTP\n" ); +snd_hda_codec_write (codec,0x19 ,0 ,AC_VERB_SET_PIN_WIDGET_CONTROL ,0x24 ); + }else { +codec_dbg (codec,"headphone plugin\n" ); + } +} + +static void cx_update_headset_mic_vref (struct hda_codec *codec,unsigned int res) +{ +unsigned int phone_present, mic_persent, phone_tag, mic_tag; +struct conexant_spec *spec = codec->spec; + +/* In cx8070 and sn6140, the node 16 can only be config to headphone or disabled, +* the node 19 can only be config to microphone or disabled. +* Check hp&mic tag to process headset pulgin&plugout. +*/ + phone_tag =snd_hda_codec_read (codec,0x16 ,0 ,AC_VERB_GET_UNSOLICITED_RESPONSE ,0x0 ); + mic_tag =snd_hda_codec_read (codec,0x19 ,0 ,AC_VERB_GET_UNSOLICITED_RESPONSE ,0x0 ); +if ((phone_tag & (res >>AC_UNSOL_RES_TAG_SHIFT )) || + (mic_tag & (res >>AC_UNSOL_RES_TAG_SHIFT ))) { + phone_present =snd_hda_codec_read (codec,0x16 ,0 ,AC_VERB_GET_PIN_SENSE ,0x0 ); +if (!(phone_present &AC_PINSENSE_PRESENCE )) {/* headphone plugout */ + spec->headset_present_flag =CX_HEADSET_NOPRESENT ; +snd_hda_codec_write (codec,0x19 ,0 ,AC_VERB_SET_PIN_WIDGET_CONTROL ,0x20 ); +return ; + } +if (spec->headset_present_flag ==CX_HEADSET_NOPRESENT ) { + spec->headset_present_flag =CX_HEADSET_PARTPRESENT ; + }else if (spec->headset_present_flag ==CX_HEADSET_PARTPRESENT ) { + mic_persent =snd_hda_codec_read (codec,0x19 ,0 , +AC_VERB_GET_PIN_SENSE ,0x0 ); +/* headset is present */ +if ((phone_present &AC_PINSENSE_PRESENCE ) && + (mic_persent &AC_PINSENSE_PRESENCE )) { +cx_process_headset_plugin (codec); + spec->headset_present_flag =CX_HEADSET_ALLPRESENT ; + } + } + } +} + +static void cx_jack_unsol_event (struct hda_codec *codec,unsigned int res) +{ +struct conexant_spec *spec = codec->spec; + +if (spec->is_cx8070_sn6140) +cx_update_headset_mic_vref (codec, res); + +snd_hda_jack_unsol_event (codec, res); +} +#ifdef CONFIG_PM static int cx_auto_suspend (struct hda_codec *codec) {
@@ -205,7 +307,7 @@ static const struct hda_codec_ops cx_auto_patch_ops = { .build_pcms = snd_hda_gen_build_pcms, .init = cx_auto_init, .free = cx_auto_free, - .unsol_event = snd_hda_jack_unsol_event, + .unsol_event = cx_jack_unsol_event, #ifdef CONFIG_PM .suspend = cx_auto_suspend, .check_power_status = snd_hda_gen_check_power_status,
@@ -1042,6 +1144,15 @@ static int patch_conexant_auto(struct hda_codec *codec) codec->spec = spec; codec->patch_ops = cx_auto_patch_ops; +/* init cx8070/sn6140 flag and reset headset_present_flag */ +switch (codec->core.vendor_id) { +case 0x14f11f86 : +case 0x14f11f87 : + spec->is_cx8070_sn6140 = true; + spec->headset_present_flag =CX_HEADSET_NOPRESENT ; +break ; + } +cx_auto_parse_eapd (codec); spec->gen.own_eapd_ctl =1 ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 218/322 pinctrl: baytrail: Fix types of config value in byt_pin_config_set()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
[ Upstream commit 1a856a22e6036c5f0d6da7568b4550270f989038 ]
When unpacked, the config value is split to two of different types. Fix the types accordingly.
--- drivers/pinctrl/intel/pinctrl-baytrail.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/pinctrl/intel/pinctrl-baytrail.c +2 -1
@@ -921,13 +921,14 @@ static int byt_pin_config_set(struct pinctrl_dev *pctl_dev, unsigned int num_configs) {struct intel_pinctrl *vg =pinctrl_dev_get_drvdata (pctl_dev); -unsigned int param, arg;void __iomem *conf_reg =byt_gpio_reg (vg, offset,BYT_CONF0_REG );void __iomem *val_reg =byt_gpio_reg (vg, offset,BYT_VAL_REG );void __iomem *db_reg =byt_gpio_reg (vg, offset,BYT_DEBOUNCE_REG );u32 conf, val, db_pulse, debounce; +enum pin_config_param param;unsigned long flags;int i, ret =0 ; +u32 arg;raw_spin_lock_irqsave (&byt_lock, flags);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 219/322 leds: trigger: panic: Dont register panic notifier if creating the trigger failed
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiner Kallweit <[email protected]>
[ Upstream commit afacb21834bb02785ddb0c3ec197208803b74faa ]
It doesn't make sense to register the panic notifier if creating the panic trigger failed.
--- drivers/leds/trigger/ledtrig-panic.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/leds/trigger/ledtrig-panic.c +4 -1
@@ -64,10 +64,13 @@ static long led_panic_blink(int state)static int __init ledtrig_panic_init (void ) { +led_trigger_register_simple ("panic" , &trigger); +if (!trigger) +return -ENOMEM ; +atomic_notifier_chain_register (&panic_notifier_list, &led_trigger_panic_nb); -led_trigger_register_simple ("panic" , &trigger); panic_blink = led_panic_blink;return 0 ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 220/322 um: Fix naming clash between UML and scheduler
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Anton Ivanov <[email protected]>
[ Upstream commit 541d4e4d435c8b9bfd29f70a1da4a2db97794e0a ]
__cant_sleep was already used and exported by the scheduler. The name had to be changed to a UML specific one.
--- arch/um/include/shared/kern_util.h | 2 +- arch/um/kernel/process.c | 2 +- arch/um/os-Linux/helper.c | 6 +++--- 3 files changed, 5 insertions(+), 5 deletions(-)
arch/um/include/shared/kern_util.h +1 -1
@@ -50,7 +50,7 @@ extern void do_uml_exitcalls(void);* Are we disallowed to sleep? Used to choose between GFP_KERNEL and * GFP_ATOMIC. */ -extern int __cant_sleep (void ); +extern int __uml_cant_sleep (void );extern int get_current_pid (void );extern int copy_from_user_proc (void *to,void *from,int size);extern char *uml_strdup (const char *string);
arch/um/kernel/process.c +1 -1
@@ -220,7 +220,7 @@ void arch_cpu_idle(void)um_idle_sleep (); } -int __cant_sleep (void ) { +int __uml_cant_sleep (void ) {return in_atomic () ||irqs_disabled () ||in_interrupt ();/* Is in_interrupt() really needed? */ }
arch/um/os-Linux/helper.c +3 -3
@@ -46,7 +46,7 @@ int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv)unsigned long stack, sp;int pid, fds[2 ], ret, n; - stack =alloc_stack (0 ,__cant_sleep ()); + stack =alloc_stack (0 ,__uml_cant_sleep ());if (stack ==0 )return -ENOMEM ;
@@ -70,7 +70,7 @@ int run_helper(void (*pre_exec)(void *), void *pre_data, char **argv) data.pre_data = pre_data; data.argv = argv; data.fd = fds[1 ]; - data.buf =__cant_sleep () ?uml_kmalloc (PATH_MAX ,UM_GFP_ATOMIC ) : + data.buf =__uml_cant_sleep () ?uml_kmalloc (PATH_MAX ,UM_GFP_ATOMIC ) :uml_kmalloc (PATH_MAX ,UM_GFP_KERNEL ); pid =clone (helper_child, (void *) sp,CLONE_VM , &data);if (pid <0 ) {
@@ -121,7 +121,7 @@ int run_helper_thread(int (*proc)(void *), void *arg, unsigned int flags,unsigned long stack, sp;int pid, status, err; - stack =alloc_stack (0 ,__cant_sleep ()); + stack =alloc_stack (0 ,__uml_cant_sleep ());if (stack ==0 )return -ENOMEM ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 221/322 um: Dont use vfprintf() for os_info()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Benjamin Berg <[email protected]>
[ Upstream commit 236f9fe39b02c15fa5530b53e9cca48354394389 ]
The threads allocated inside the kernel have only a single page of stack. Unfortunately, the vfprintf function in standard glibc may use too much stack-space, overflowing it.
To make os_info safe to be used by helper threads, use the kernel vscnprintf function into a smallish buffer and write out the information to stderr.
--- arch/um/os-Linux/util.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-)
arch/um/os-Linux/util.c +17 -2
@@ -173,23 +173,38 @@ __uml_setup("quiet", quiet_cmd_param,"quiet\n" " Turns off information messages during boot.\n\n"); +/* +* The os_info/os_warn functions will be called by helper threads. These +* have a very limited stack size and using the libc formatting functions +* may overflow the stack. +* So pull in the kernel vscnprintf and use that instead with a fixed +* on-stack buffer. +*/ +int vscnprintf (char *buf,size_t size,const char *fmt,va_list args); +void os_info (const char *fmt, ...) { +char buf[256 ];va_list list; +int len;if (quiet_info)return ;va_start (list, fmt); -vfprintf (stderr, fmt, list); + len =vscnprintf (buf,sizeof (buf), fmt, list); +fwrite (buf, len,1 , stderr);va_end (list); }void os_warn (const char *fmt, ...) { +char buf[256 ];va_list list; +int len;va_start (list, fmt); -vfprintf (stderr, fmt, list); + len =vscnprintf (buf,sizeof (buf), fmt, list); +fwrite (buf, len,1 , stderr);va_end (list); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 222/322 um: net: Fix return type of uml_net_start_xmit()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nathan Chancellor <[email protected]>
[ Upstream commit 7d748f60a4b82b50bf25fad1bd42d33f049f76aa ]
With clang's kernel control flow integrity (kCFI, CONFIG_CFI_CLANG), indirect call targets are validated against the expected function pointer prototype to make sure the call target is valid to help mitigate ROP attacks. If they are not identical, there is a failure at run time, which manifests as either a kernel panic or thread getting killed. A warning in clang aims to catch these at compile time, which reveals:
arch/um/drivers/net_kern.c:353:21: warning: incompatible function pointer types initializing 'netdev_tx_t (*)(struct sk_buff *, struct net_device *)' (aka 'enum netdev_tx (*)(struct sk_buff *, struct net_device *)') with an expression of type 'int (struct sk_buff *, struct net_device *)' [-Wincompatible-function-pointer-types-strict]
353 | .ndo_start_xmit = uml_net_start_xmit,
| ^~~~~~~~~~~~~~~~~~
1 warning generated.
->ndo_start_xmit() in 'struct net_device_ops' expects a return type of 'netdev_tx_t', not 'int'. Adjust the return type of uml_net_start_xmit() to match the prototype's to resolve the warning. While UML does not currently implement support for kCFI, it could in the future, which means this warning becomes a fatal CFI failure at run time.
--- arch/um/drivers/net_kern.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/um/drivers/net_kern.c +1 -1
@@ -204,7 +204,7 @@ static int uml_net_close(struct net_device *dev)return 0 ; } -static int uml_net_start_xmit (struct sk_buff *skb,struct net_device *dev) +static netdev_tx_t uml_net_start_xmit (struct sk_buff *skb,struct net_device *dev) {struct uml_net_private *lp =netdev_priv (dev);unsigned long flags;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 223/322 um: time-travel: fix time corruption
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <[email protected]>
[ Upstream commit abe4eaa8618bb36c2b33e9cdde0499296a23448c ]
In 'basic' time-travel mode (without =inf-cpu or =ext), we still get timer interrupts. These can happen at arbitrary points in time, i.e. while in timer_read(), which pushes time forward just a little bit. Then, if we happen to get the interrupt after calculating the new time to push to, but before actually finishing that, the interrupt will set the time to a value that's incompatible with the forward, and we'll crash because time goes backwards when we do the forwarding.
Fix this by reading the time_travel_time, calculating the adjustment, and doing the adjustment all with interrupts disabled.
--- arch/um/kernel/time.c | 32 +++++++++++++++++++++++++++----- 1 file changed, 27 insertions(+), 5 deletions(-)
arch/um/kernel/time.c +27 -5
@@ -432,9 +432,29 @@ static void time_travel_update_time(unsigned long long next, bool idle)time_travel_del_event (&ne); } +static void time_travel_update_time_rel (unsigned long long offs) +{ +unsigned long flags; + +/* +* Disable interrupts before calculating the new time so +* that a real timer interrupt (signal) can't happen at +* a bad time e.g. after we read time_travel_time but +* before we've completed updating the time. +*/ +local_irq_save (flags); +time_travel_update_time (time_travel_time + offs, false); +local_irq_restore (flags); +} +void time_travel_ndelay (unsigned long nsec) { -time_travel_update_time (time_travel_time + nsec, false); +/* +* Not strictly needed to use _rel() version since this is +* only used in INFCPU/EXT modes, but it doesn't hurt and +* is more readable too. +*/ +time_travel_update_time_rel (nsec); }EXPORT_SYMBOL (time_travel_ndelay);
@@ -568,7 +588,11 @@ static void time_travel_set_start(void)#define time_travel_time 0#define time_travel_ext_waiting 0 -static inline void time_travel_update_time (unsigned long long ns,bool retearly) +static inline void time_travel_update_time (unsigned long long ns,bool idle) +{ +} + +static inline void time_travel_update_time_rel (unsigned long long offs) { }
@@ -720,9 +744,7 @@ static u64 timer_read(struct clocksource *cs)*/ if (!irqs_disabled () && !in_interrupt () && !in_softirq () && !time_travel_ext_waiting) -time_travel_update_time (time_travel_time + -TIMER_MULTIPLIER , - false); +time_travel_update_time_rel (TIMER_MULTIPLIER );return time_travel_time /TIMER_MULTIPLIER ; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 224/322 i3c: master: cdns: Update maximum prescaler value for i2c clock
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Harshit Shah <[email protected]>
[ Upstream commit 374c13f9080a1b9835a5ed3e7bea93cf8e2dc262 ]
As per the Cadence IP document fixed the I2C clock divider value limit from 16 bits instead of 10 bits. Without this change setting up the I2C clock to low frequencies will not work as the prescaler value might be greater than 10 bit number.
I3C clock divider value is 10 bits only. Updating the macro names for both.
--- drivers/i3c/master/i3c-master-cdns.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/i3c/master/i3c-master-cdns.c +4 -3
@@ -76,7 +76,8 @@#define PRESCL_CTRL0 0x14#define PRESCL_CTRL0_I2C (x) ((x) << 16)#define PRESCL_CTRL0_I3C (x) (x) -#define PRESCL_CTRL0_MAX GENMASK(9, 0) +#define PRESCL_CTRL0_I3C_MAX GENMASK(9, 0) +#define PRESCL_CTRL0_I2C_MAX GENMASK(15, 0)#define PRESCL_CTRL1 0x18#define PRESCL_CTRL1_PP_LOW_MASK GENMASK(15, 8)
@@ -1233,7 +1234,7 @@ static int cdns_i3c_master_bus_init(struct i3c_master_controller *m)return -EINVAL ; pres =DIV_ROUND_UP (sysclk_rate, (bus->scl_rate.i3c *4 )) -1 ; -if (pres >PRESCL_CTRL0_MAX ) +if (pres >PRESCL_CTRL0_I3C_MAX )return -ERANGE ; bus->scl_rate.i3c = sysclk_rate / ((pres +1 ) *4 );
@@ -1246,7 +1247,7 @@ static int cdns_i3c_master_bus_init(struct i3c_master_controller *m) max_i2cfreq = bus->scl_rate.i2c; pres = (sysclk_rate / (max_i2cfreq *5 )) -1 ; -if (pres >PRESCL_CTRL0_MAX ) +if (pres >PRESCL_CTRL0_I2C_MAX )return -ERANGE ; bus->scl_rate.i2c = sysclk_rate / ((pres +1 ) *5 );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 225/322 riscv: Make XIP bootable again
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Frederik Haxel <[email protected]>
[ Upstream commit 66f1e68093979816a23412a3fad066f5bcbc0360 ]
Currently, the XIP kernel seems to fail to boot due to missing XIP_FIXUP and a wrong page_offset value. A superfluous XIP_FIXUP has also been removed.
--- arch/riscv/kernel/head.S | 1 + arch/riscv/mm/init.c | 8 ++++++-- 2 files changed, 7 insertions(+), 2 deletions(-)
arch/riscv/kernel/head.S +1 -0
@@ -88,6 +88,7 @@ relocate_enable_mmu: /* Compute satp for kernel page tables, but don't load it yet */ srl a2, a0, PAGE_SHIFT la a1, satp_mode + XIP_FIXUP_OFFSET a1 REG_L a1, 0(a1) or a2, a2, a1
arch/riscv/mm/init.c +6 -2
@@ -172,6 +172,9 @@ void __init mem_init(void)/* Limit the memory size via mem. */ static phys_addr_t memory_limit; +#ifdef CONFIG_XIP_KERNEL +#define memory_limit (*(phys_addr_t *)XIP_FIXUP(&memory_limit)) +#endif /* CONFIG_XIP_KERNEL */ static int __init early_mem (char *p) {
@@ -950,7 +953,7 @@ static void __init create_fdt_early_page_table(uintptr_t fix_fdt_va,* setup_vm_final installs the linear mapping. For 32-bit kernel, as the * kernel is mapped in the linear mapping, that makes no difference. */ - dtb_early_va =kernel_mapping_pa_to_va (XIP_FIXUP (dtb_pa)); + dtb_early_va =kernel_mapping_pa_to_va (dtb_pa);#endif dtb_early_pa = dtb_pa;
@@ -1053,9 +1056,9 @@ asmlinkage void __init setup_vm(uintptr_t dtb_pa)#endif kernel_map.virt_addr =KERNEL_LINK_ADDR + kernel_map.virt_offset; - kernel_map.page_offset =_AC (CONFIG_PAGE_OFFSET ,UL );#ifdef CONFIG_XIP_KERNEL + kernel_map.page_offset =PAGE_OFFSET_L3 ; kernel_map.xiprom = (uintptr_t )CONFIG_XIP_PHYS_ADDR ; kernel_map.xiprom_sz = (uintptr_t )(&_exiprom) - (uintptr_t )(&_xiprom);
@@ -1065,6 +1068,7 @@ asmlinkage void __init setup_vm(uintptr_t dtb_pa) kernel_map.va_kernel_xip_pa_offset = kernel_map.virt_addr - kernel_map.xiprom;#else + kernel_map.page_offset =_AC (CONFIG_PAGE_OFFSET ,UL ); kernel_map.phys_addr = (uintptr_t )(&_start); kernel_map.size = (uintptr_t )(&_end) - kernel_map.phys_addr;#endif
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 226/322 xen/gntdev: Fix the abuse of underlying struct page in DMA-buf import
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oleksandr Tyshchenko <[email protected]>
[ Upstream commit 2d2db7d40254d5fb53b11ebd703cd1ed0c5de7a1 ]
DO NOT access the underlying struct page of an sg table exported by DMA-buf in dmabuf_imp_to_refs(), this is not allowed. Please see drivers/dma-buf/dma-buf.c:mangle_sg_table() for details.
Fortunately, here (for special Xen device) we can avoid using pages and calculate gfns directly from dma addresses provided by the sg table.
--- drivers/xen/gntdev-dmabuf.c | 50 ++++++++++++++++++------------------- 1 file changed, 25 insertions(+), 25 deletions(-)
drivers/xen/gntdev-dmabuf.c +25 -25
@@ -11,6 +11,7 @@#include <linux/kernel.h> #include <linux/errno.h> #include <linux/dma-buf.h> +#include <linux/dma-direct.h> #include <linux/slab.h> #include <linux/types.h> #include <linux/uaccess.h>
@@ -50,7 +51,7 @@ struct gntdev_dmabuf {/* Number of pages this buffer has. */ int nr_pages; -/* Pages of this buffer. */ +/* Pages of this buffer (only for dma-buf export). */ struct page **pages; };
@@ -484,7 +485,7 @@ static int dmabuf_exp_from_refs(struct gntdev_priv *priv, int flags,/* DMA buffer import support. */ static int -dmabuf_imp_grant_foreign_access (struct page **pages,u32 *refs, +dmabuf_imp_grant_foreign_access (unsigned long *gfns,u32 *refs,int count,int domid) {grant_ref_t priv_gref_head;
@@ -507,7 +508,7 @@ dmabuf_imp_grant_foreign_access(struct page **pages, u32 *refs, }gnttab_grant_foreign_access_ref (cur_ref, domid, -xen_page_to_gfn (pages[i]),0 ); + gfns[i],0 ); refs[i] = cur_ref; }
@@ -529,7 +530,6 @@ static void dmabuf_imp_end_foreign_access(u32 *refs, int count)static void dmabuf_imp_free_storage (struct gntdev_dmabuf *gntdev_dmabuf) { -kfree (gntdev_dmabuf->pages);kfree (gntdev_dmabuf->u.imp.refs);kfree (gntdev_dmabuf); }
@@ -549,12 +549,6 @@ static struct gntdev_dmabuf *dmabuf_imp_alloc_storage(int count)if (!gntdev_dmabuf->u.imp.refs) goto fail; - gntdev_dmabuf->pages =kcalloc (count, -sizeof (gntdev_dmabuf->pages[0 ]), -GFP_KERNEL ); -if (!gntdev_dmabuf->pages) - goto fail; - gntdev_dmabuf->nr_pages = count;for (i =0 ; i < count; i++)
@@ -576,7 +570,8 @@ dmabuf_imp_to_refs(struct gntdev_dmabuf_priv *priv, struct device *dev,struct dma_buf *dma_buf;struct dma_buf_attachment *attach;struct sg_table *sgt; -struct sg_page_iter sg_iter; +struct sg_dma_page_iter sg_iter; +unsigned long *gfns;int i; dma_buf =dma_buf_get (fd);
@@ -624,26 +619,31 @@ dmabuf_imp_to_refs(struct gntdev_dmabuf_priv *priv, struct device *dev, gntdev_dmabuf->u.imp.sgt = sgt; -/* Now convert sgt to array of pages and check for page validity. */ + gfns =kcalloc (count,sizeof (*gfns),GFP_KERNEL ); +if (!gfns) { + ret =ERR_PTR (-ENOMEM ); + goto fail_unmap; + } + +/* +* Now convert sgt to array of gfns without accessing underlying pages. +* It is not allowed to access the underlying struct page of an sg table +* exported by DMA-buf, but since we deal with special Xen dma device here +* (not a normal physical one) look at the dma addresses in the sg table +* and then calculate gfns directly from them. +*/ i =0 ; -for_each_sgtable_page (sgt, &sg_iter,0 ) { -struct page *page =sg_page_iter_page (&sg_iter); -/* -* Check if page is valid: this can happen if we are given -* a page from VRAM or other resources which are not backed -* by a struct page. -*/ -if (!pfn_valid (page_to_pfn (page))) { - ret =ERR_PTR (-EINVAL ); - goto fail_unmap; - } +for_each_sgtable_dma_page (sgt, &sg_iter,0 ) { +dma_addr_t addr =sg_page_iter_dma_address (&sg_iter); +unsigned long pfn =bfn_to_pfn (XEN_PFN_DOWN (dma_to_phys (dev, addr))); - gntdev_dmabuf->pages[i++] = page; + gfns[i++] =pfn_to_gfn (pfn); } - ret =ERR_PTR (dmabuf_imp_grant_foreign_access (gntdev_dmabuf->pages, + ret =ERR_PTR (dmabuf_imp_grant_foreign_access (gfns, gntdev_dmabuf->u.imp.refs, count, domid)); +kfree (gfns);if (IS_ERR (ret)) goto fail_end_access;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 227/322 mfd: ti_am335x_tscadc: Fix TI SoC dependencies
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Robinson <[email protected]>
[ Upstream commit 284d16c456e5d4b143f375b8ccc4038ab3f4ee0f ]
The ti_am335x_tscadc is specific to some TI SoCs, update the dependencies for those SoCs and compile testing.
--- drivers/mfd/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/mfd/Kconfig +1 -0
@@ -1483,6 +1483,7 @@ config MFD_SYSCON config MFD_TI_AM335X_TSCADC tristate "TI ADC / Touch Screen chip support" + depends on ARCH_OMAP2PLUS || ARCH_K3 || COMPILE_TEST select MFD_CORE select REGMAP select REGMAP_MMIO
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 228/322 mailbox: arm_mhuv2: Fix a bug for mhuv2_sender_interrupt
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiaowu.ding <[email protected]>
[ Upstream commit ee01c0b4384d19ecc5dfa7db3fd4303f965c3eba ]
Message Handling Unit version is v2.1.
When arm_mhuv2 working with the data protocol transfer mode. We have split one mhu into two channels, and every channel include four channel windows, the two channels share one gic spi interrupt.
There is a problem with the sending scenario.
The first channel will take up 0-3 channel windows, and the second channel take up 4-7 channel windows. When the first channel send the data, and the receiver will clear all the four channels status. Although we only enabled the interrupt on the last channel window with register CH_INT_EN,the register CHCOMB_INT_ST0 will be 0xf, not be 0x8. Currently we just clear the last channel windows int status with the data proctol mode.So after that,the CHCOMB_INT_ST0 status will be 0x7, not be the 0x0.
Then the second channel send the data, the receiver read the data, clear all the four channel windows status, trigger the sender interrupt. But currently the CHCOMB_INT_ST0 register will be 0xf7, get_irq_chan_comb function will always return the first channel.
So this patch clear all channel windows int status to avoid this interrupt confusion.
--- drivers/mailbox/arm_mhuv2.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/mailbox/arm_mhuv2.c +2 -1
@@ -553,7 +553,8 @@ static irqreturn_t mhuv2_sender_interrupt(int irq, void *data) priv = chan->con_priv;if (!IS_PROTOCOL_DOORBELL (priv)) { -writel_relaxed (1 , &mhu->send->ch_wn[priv->ch_wn_idx + priv->windows -1 ].int_clr); +for (i =0 ; i < priv->windows; i++) +writel_relaxed (1 , &mhu->send->ch_wn[priv->ch_wn_idx + i].int_clr);if (chan->cl) {mbox_chan_txdone (chan,0 );
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 229/322 PCI: Only override AMD USB controller if required
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guilherme G. Piccoli <[email protected]>
[ Upstream commit e585a37e5061f6d5060517aed1ca4ccb2e56a34c ]
By running a Van Gogh device (Steam Deck), the following message was noticed in the kernel log:
pci 0000:04:00.3: PCI class overridden (0x0c03fe -> 0x0c03fe) so dwc3 driver can claim this instead of xhci
Effectively this means the quirk executed but changed nothing, since the class of this device was already the proper one (likely adjusted by newer firmware versions).
Check and perform the override only if necessary.
--- drivers/pci/quirks.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
drivers/pci/quirks.c +7 -4
@@ -702,10 +702,13 @@ static void quirk_amd_dwc_class(struct pci_dev *pdev) {u32 class = pdev->class; -/* Use "USB Device (not host controller)" class */ - pdev->class =PCI_CLASS_SERIAL_USB_DEVICE ; -pci_info (pdev,"PCI class overridden (%#08x -> %#08x) so dwc3 driver can claim this instead of xhci\n" , - class, pdev->class); +if (class !=PCI_CLASS_SERIAL_USB_DEVICE ) { +/* Use "USB Device (not host controller)" class */ + pdev->class =PCI_CLASS_SERIAL_USB_DEVICE ; +pci_info (pdev, +"PCI class overridden (%#08x -> %#08x) so dwc3 driver can claim this instead of xhci\n" , + class, pdev->class); + } }DECLARE_PCI_FIXUP_HEADER (PCI_VENDOR_ID_AMD ,PCI_DEVICE_ID_AMD_NL_USB , quirk_amd_dwc_class);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 230/322 PCI: switchtec: Fix stdev_release() crash after surprise hot remove
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Stodden <[email protected]>
[ Upstream commit df25461119d987b8c81d232cfe4411e91dcabe66 ]
A PCI device hot removal may occur while stdev->cdev is held open. The call to stdev_release() then happens during close or exit, at a point way past switchtec_pci_remove(). Otherwise the last ref would vanish with the trailing put_device(), just before return.
At that later point in time, the devm cleanup has already removed the stdev->mmio_mrpc mapping. Also, the stdev->pdev reference was not a counted one. Therefore, in DMA mode, the iowrite32() in stdev_release() will cause a fatal page fault, and the subsequent dma_free_coherent(), if reached, would pass a stale &stdev->pdev->dev pointer.
Fix by moving MRPC DMA shutdown into switchtec_pci_remove(), after stdev_kill(). Counting the stdev->pdev ref is now optional, but may prevent future accidents.
Reproducible via the script at
https://lore.kernel.org/r/[email protected]
--- drivers/pci/switch/switchtec.c | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-)
drivers/pci/switch/switchtec.c +17 -8
@@ -1308,13 +1308,6 @@ static void stdev_release(struct device *dev) {struct switchtec_dev *stdev =to_stdev (dev); -if (stdev->dma_mrpc) { -iowrite32 (0 , &stdev->mmio_mrpc->dma_en); -flush_wc_buf (stdev); -writeq (0 , &stdev->mmio_mrpc->dma_addr); -dma_free_coherent (&stdev->pdev->dev,sizeof (*stdev->dma_mrpc), - stdev->dma_mrpc, stdev->dma_mrpc_dma_addr); - }kfree (stdev); }
@@ -1358,7 +1351,7 @@ static struct switchtec_dev *stdev_create(struct pci_dev *pdev)return ERR_PTR (-ENOMEM ); stdev->alive = true; - stdev->pdev = pdev; + stdev->pdev =pci_dev_get (pdev);INIT_LIST_HEAD (&stdev->mrpc_queue);mutex_init (&stdev->mrpc_mutex); stdev->mrpc_busy =0 ;
@@ -1391,6 +1384,7 @@ static struct switchtec_dev *stdev_create(struct pci_dev *pdev)return stdev; err_put: +pci_dev_put (stdev->pdev);put_device (&stdev->dev);return ERR_PTR (rc); }
@@ -1644,6 +1638,18 @@ static int switchtec_init_pci(struct switchtec_dev *stdev,return 0 ; } +static void switchtec_exit_pci (struct switchtec_dev *stdev) +{ +if (stdev->dma_mrpc) { +iowrite32 (0 , &stdev->mmio_mrpc->dma_en); +flush_wc_buf (stdev); +writeq (0 , &stdev->mmio_mrpc->dma_addr); +dma_free_coherent (&stdev->pdev->dev,sizeof (*stdev->dma_mrpc), + stdev->dma_mrpc, stdev->dma_mrpc_dma_addr); + stdev->dma_mrpc =NULL ; + } +} +static int switchtec_pci_probe (struct pci_dev *pdev,const struct pci_device_id *id) {
@@ -1703,6 +1709,9 @@ static void switchtec_pci_remove(struct pci_dev *pdev)ida_free (&switchtec_minor_ida,MINOR (stdev->dev.devt));dev_info (&stdev->dev,"unregistered.\n" );stdev_kill (stdev); +switchtec_exit_pci (stdev); +pci_dev_put (stdev->pdev); + stdev->pdev =NULL ;put_device (&stdev->dev); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 231/322 perf cs-etm: Bump minimum OpenCSD version to ensure a bugfix is present
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Clark <[email protected]>
[ Upstream commit 2dbba30fd69b604802a9535b74bddb5bcca23793 ]
Since commit d927ef5004ef ("perf cs-etm: Add exception level consistency check"), the exception that was added to Perf will be triggered unless the following bugfix from OpenCSD is present:
- _Version 1.2.1_:
- __Bugfix__:
ETM4x / ETE - output of context elements to client can in some circumstances be delayed until after subsequent atoms have been processed leading to incorrect memory decode access via the client callbacks. Fixed to flush context elements immediately they are committed.
Rather than remove the assert and silently fail, just increase the minimum version requirement to avoid hard to debug issues and regressions.
--- tools/build/feature/test-libopencsd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
tools/build/feature/test-libopencsd.c +2 -2
@@ -4,9 +4,9 @@/* * Check OpenCSD library version is sufficient to provide required features */ -#define OCSD_MIN_VER ((1 << 16) | (1 << 8) | (1)) +#define OCSD_MIN_VER ((1 << 16) | (2 << 8) | (1))#if !defined(OCSD_VER_NUM ) || (OCSD_VER_NUM <OCSD_MIN_VER ) -#error "OpenCSD >= 1.1.1 is required" +#error "OpenCSD >= 1.2.1 is required"#endif int main (void )
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 232/322 xhci: fix possible null pointer deref during xhci urb enqueue
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mathias Nyman <[email protected]>
[ Upstream commit e2e2aacf042f52854c92775b7800ba668e0bdfe4 ]
There is a short gap between urb being submitted and actually added to the endpoint queue (linked). If the device is disconnected during this time then usb core is not yet aware of the pending urb, and device may be freed just before xhci_urq_enqueue() continues, dereferencing the freed device.
Freeing the device is protected by the xhci spinlock, so make sure we take and keep the lock while checking that device exists, dereference it, and add the urb to the queue.
Remove the unnecessary URB check, usb core checks it before calling xhci_urb_enqueue()
--- drivers/usb/host/xhci.c | 40 +++++++++++++++++++++++----------------- 1 file changed, 23 insertions(+), 17 deletions(-)
drivers/usb/host/xhci.c +23 -17
@@ -1498,24 +1498,7 @@ static int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flagstruct urb_priv *urb_priv;int num_tds; -if (!urb) -return -EINVAL ; - ret =xhci_check_args (hcd, urb->dev, urb->ep, - true, true, __func__); -if (ret <=0 ) -return ret ? ret : -EINVAL ; - - slot_id = urb->dev->slot_id; ep_index =xhci_get_endpoint_index (&urb->ep->desc); - ep_state = &xhci->devs[slot_id]->eps[ep_index].ep_state; - -if (!HCD_HW_ACCESSIBLE (hcd)) -return -ESHUTDOWN ; - -if (xhci->devs[slot_id]->flags &VDEV_PORT_ERROR ) { -xhci_dbg (xhci,"Can't queue urb, port error, link inactive\n" ); -return -ENODEV ; - }if (usb_endpoint_xfer_isoc (&urb->ep->desc)) num_tds = urb->number_of_packets;
@@ -1554,12 +1537,35 @@ static int xhci_urb_enqueue(struct usb_hcd *hcd, struct urb *urb, gfp_t mem_flagspin_lock_irqsave (&xhci->lock, flags); + ret =xhci_check_args (hcd, urb->dev, urb->ep, + true, true, __func__); +if (ret <=0 ) { + ret = ret ? ret : -EINVAL ; + goto free_priv; + } + + slot_id = urb->dev->slot_id; + +if (!HCD_HW_ACCESSIBLE (hcd)) { + ret = -ESHUTDOWN ; + goto free_priv; + } + +if (xhci->devs[slot_id]->flags &VDEV_PORT_ERROR ) { +xhci_dbg (xhci,"Can't queue urb, port error, link inactive\n" ); + ret = -ENODEV ; + goto free_priv; + } +if (xhci->xhc_state &XHCI_STATE_DYING ) {xhci_dbg (xhci,"Ep 0x%x: URB %p submitted for non-responsive xHCI host.\n" , urb->ep->desc.bEndpointAddress, urb); ret = -ESHUTDOWN ; goto free_priv; } + + ep_state = &xhci->devs[slot_id]->eps[ep_index].ep_state; +if (*ep_state & (EP_GETTING_STREAMS |EP_GETTING_NO_STREAMS )) {xhci_warn (xhci,"WARN: Can't enqueue URB, ep in streams transition state %x\n" , *ep_state);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 233/322 extcon: fix possible name leak in extcon_dev_register()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yaxiong Tian <[email protected]>
[ Upstream commit e66523c72c9aae0ff0dae6859eb77b04de1e8e5f ]
In the error path after calling dev_set_name(), the device name is leaked. To fix this, moving dev_set_name() after the error path and before device_register.
--- drivers/extcon/extcon.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/extcon/extcon.c +1 -2
@@ -1280,8 +1280,6 @@ int extcon_dev_register(struct extcon_dev *edev) edev->id = ret; -dev_set_name (&edev->dev,"extcon%d" , edev->id); - ret =extcon_alloc_cables (edev);if (ret <0 ) goto err_alloc_cables;
@@ -1310,6 +1308,7 @@ int extcon_dev_register(struct extcon_dev *edev)RAW_INIT_NOTIFIER_HEAD (&edev->nh_all);dev_set_drvdata (&edev->dev, edev); +dev_set_name (&edev->dev,"extcon%d" , edev->id); edev->state =0 ; ret =device_register (&edev->dev);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 234/322 usb: hub: Replace hardcoded quirk value with BIT() macro
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hardik Gajjar <[email protected]>
[ Upstream commit 6666ea93d2c422ebeb8039d11e642552da682070 ]
This patch replaces the hardcoded quirk value in the macro with BIT().
--- drivers/usb/core/hub.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/usb/core/hub.c +2 -2
@@ -47,8 +47,8 @@#define USB_VENDOR_TEXAS_INSTRUMENTS 0x0451#define USB_PRODUCT_TUSB8041_USB3 0x8140#define USB_PRODUCT_TUSB8041_USB2 0x8142 -#define HUB_QUIRK_CHECK_PORT_AUTOSUSPEND 0x01 -#define HUB_QUIRK_DISABLE_AUTOSUSPEND 0x02 +#define HUB_QUIRK_CHECK_PORT_AUTOSUSPEND BIT(0) +#define HUB_QUIRK_DISABLE_AUTOSUSPEND BIT(1)#define USB_TP_TRANSMISSION_DELAY 40/* ns */ #define USB_TP_TRANSMISSION_DELAY_MAX 65535/* ns */
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 235/322 usb: hub: Add quirk to decrease IN-ep poll interval for Microchip USB491x hub
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hardik Gajjar <[email protected]>
[ Upstream commit 855d75cf8311fee156fabb5639bb53757ca83dd4 ]
There is a potential delay in notifying Linux USB drivers of downstream USB bus activity when connecting a high-speed or superSpeed device via the Microchip USB491x hub. This delay is due to the fixed bInterval value of 12 in the silicon of the Microchip USB491x hub.
Microchip requested to ignore the device descriptor and decrease that value to 9 as it was too late to modify that in silicon.
This patch speeds up the USB enummeration process that helps to pass Apple Carplay certifications and improve the User experience when utilizing the USB device via Microchip Multihost USB491x Hub.
A new hub quirk HUB_QUIRK_REDUCE_FRAME_INTR_BINTERVAL speeds up the notification process for Microchip USB491x hub by limiting the maximum bInterval value to 9.
--- drivers/usb/core/hub.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+)
drivers/usb/core/hub.c +29 -0
@@ -47,12 +47,18 @@#define USB_VENDOR_TEXAS_INSTRUMENTS 0x0451#define USB_PRODUCT_TUSB8041_USB3 0x8140#define USB_PRODUCT_TUSB8041_USB2 0x8142 +#define USB_VENDOR_MICROCHIP 0x0424 +#define USB_PRODUCT_USB4913 0x4913 +#define USB_PRODUCT_USB4914 0x4914 +#define USB_PRODUCT_USB4915 0x4915#define HUB_QUIRK_CHECK_PORT_AUTOSUSPEND BIT(0)#define HUB_QUIRK_DISABLE_AUTOSUSPEND BIT(1) +#define HUB_QUIRK_REDUCE_FRAME_INTR_BINTERVAL BIT(2)#define USB_TP_TRANSMISSION_DELAY 40/* ns */ #define USB_TP_TRANSMISSION_DELAY_MAX 65535/* ns */ #define USB_PING_RESPONSE_TIME 400/* ns */ +#define USB_REDUCE_FRAME_INTR_BINTERVAL 9/* Protect struct usb_device->state and ->children members * Note: Both are also protected by ->dev.sem, except that ->state can
@@ -1904,6 +1910,14 @@ static int hub_probe(struct usb_interface *intf, const struct usb_device_id *id)usb_autopm_get_interface_no_resume (intf); } +if ((id->driver_info &HUB_QUIRK_REDUCE_FRAME_INTR_BINTERVAL ) && + desc->endpoint[0 ].desc.bInterval >USB_REDUCE_FRAME_INTR_BINTERVAL ) { + desc->endpoint[0 ].desc.bInterval = +USB_REDUCE_FRAME_INTR_BINTERVAL ; +/* Tell the HCD about the interrupt ep's new bInterval */ +usb_set_interface (hdev,0 ,0 ); + } +if (hub_configure (hub, &desc->endpoint[0 ].desc) >=0 ) {onboard_hub_create_pdevs (hdev, &hub->onboard_hub_devs);
@@ -5891,6 +5905,21 @@ static const struct usb_device_id hub_id_table[] = { .idVendor = USB_VENDOR_TEXAS_INSTRUMENTS, .idProduct = USB_PRODUCT_TUSB8041_USB3, .driver_info = HUB_QUIRK_DISABLE_AUTOSUSPEND}, + { .match_flags = USB_DEVICE_ID_MATCH_VENDOR + | USB_DEVICE_ID_MATCH_PRODUCT, + .idVendor = USB_VENDOR_MICROCHIP, + .idProduct = USB_PRODUCT_USB4913, + .driver_info = HUB_QUIRK_REDUCE_FRAME_INTR_BINTERVAL}, + { .match_flags = USB_DEVICE_ID_MATCH_VENDOR + | USB_DEVICE_ID_MATCH_PRODUCT, + .idVendor = USB_VENDOR_MICROCHIP, + .idProduct = USB_PRODUCT_USB4914, + .driver_info = HUB_QUIRK_REDUCE_FRAME_INTR_BINTERVAL}, + { .match_flags = USB_DEVICE_ID_MATCH_VENDOR + | USB_DEVICE_ID_MATCH_PRODUCT, + .idVendor = USB_VENDOR_MICROCHIP, + .idProduct = USB_PRODUCT_USB4915, + .driver_info = HUB_QUIRK_REDUCE_FRAME_INTR_BINTERVAL}, { .match_flags = USB_DEVICE_ID_MATCH_DEV_CLASS, .bDeviceClass = USB_CLASS_HUB}, { .match_flags = USB_DEVICE_ID_MATCH_INT_CLASS,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 236/322 selftests/sgx: Fix linker script asserts
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jo Van Bulck <[email protected]>
[ Upstream commit 9fd552ee32c6c1e27c125016b87d295bea6faea7 ]
DEFINED only considers symbols, not section names. Hence, replace the check for .got.plt with the _GLOBAL_OFFSET_TABLE_ symbol and remove other (non-essential) asserts.
--- tools/testing/selftests/sgx/test_encl.lds | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-)
tools/testing/selftests/sgx/test_encl.lds +1 -5
@@ -34,8 +34,4 @@ SECTIONS } } -ASSERT(!DEFINED(.altinstructions), "ALTERNATIVES are not supported in enclaves") -ASSERT(!DEFINED(.altinstr_replacement), "ALTERNATIVES are not supported in enclaves") -ASSERT(!DEFINED(.discard.retpoline_safe), "RETPOLINE ALTERNATIVES are not supported in enclaves") -ASSERT(!DEFINED(.discard.nospec), "RETPOLINE ALTERNATIVES are not supported in enclaves") -ASSERT(!DEFINED(.got.plt), "Libcalls are not supported in enclaves") +ASSERT(!DEFINED(_GLOBAL_OFFSET_TABLE_), "Libcalls through GOT are not supported in enclaves")
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 237/322 tty: allow TIOCSLCKTRMIOS with CAP_CHECKPOINT_RESTORE
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Adrian Reber <[email protected]>
[ Upstream commit e0f25b8992345aa5f113da2815f5add98738c611 ]
The capability CAP_CHECKPOINT_RESTORE was introduced to allow non-root users to checkpoint and restore processes as non-root with CRIU.
This change extends CAP_CHECKPOINT_RESTORE to enable the CRIU option '--shell-job' as non-root. CRIU's man-page describes the '--shell-job' option like this:
Allow one to dump shell jobs. This implies the restored task will inherit session and process group ID from the criu itself. This option also allows to migrate a single external tty connection, to migrate applications like top.
TIOCSLCKTRMIOS can only be done if the process has CAP_SYS_ADMIN and this change extends it to CAP_SYS_ADMIN or CAP_CHECKPOINT_RESTORE.
With this change it is possible to checkpoint and restore processes which have a tty connection as non-root if CAP_CHECKPOINT_RESTORE is set.
--- drivers/tty/tty_ioctl.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/tty/tty_ioctl.c +2 -2
@@ -850,7 +850,7 @@ int tty_mode_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg) ret = -EFAULT ;return ret;case TIOCSLCKTRMIOS : -if (!capable (CAP_SYS_ADMIN )) +if (!checkpoint_restore_ns_capable (&init_user_ns))return -EPERM ;copy_termios_locked (real_tty, &kterm); if (user_termios_to_kernel_termios(&kterm,
@@ -867,7 +867,7 @@ int tty_mode_ioctl(struct tty_struct *tty, unsigned int cmd, unsigned long arg) ret = -EFAULT ;return ret;case TIOCSLCKTRMIOS : -if (!capable (CAP_SYS_ADMIN )) +if (!checkpoint_restore_ns_capable (&init_user_ns))return -EPERM ;copy_termios_locked (real_tty, &kterm); if (user_termios_to_kernel_termios_1(&kterm,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 238/322 fs/kernfs/dir: obey S_ISGID
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Max Kellermann <[email protected]>
[ Upstream commit 5133bee62f0ea5d4c316d503cc0040cac5637601 ]
Handling of S_ISGID is usually done by inode_init_owner() in all other filesystems, but kernfs doesn't use that function. In kernfs, struct kernfs_node is the primary data structure, and struct inode is only created from it on demand. Therefore, inode_init_owner() can't be used and we need to imitate its behavior.
S_ISGID support is useful for the cgroup filesystem; it allows subtrees managed by an unprivileged process to retain a certain owner gid, which then enables sharing access to the subtree with another unprivileged process.
--
v1 -> v2: minor coding style fix (comment)
--- fs/kernfs/dir.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
fs/kernfs/dir.c +12 -0
@@ -676,6 +676,18 @@ struct kernfs_node *kernfs_new_node(struct kernfs_node *parent, {struct kernfs_node *kn; +if (parent->mode &S_ISGID ) { +/* this code block imitates inode_init_owner() for +* kernfs +*/ + +if (parent->iattr) + gid = parent->iattr->ia_gid; + +if (flags &KERNFS_DIR ) + mode |=S_ISGID ; + } + kn =__kernfs_new_node (kernfs_root (parent), parent, name, mode, uid, gid, flags);if (kn) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 239/322 spmi: mediatek: Fix UAF on device remove
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yu-Che Cheng <[email protected]>
[ Upstream commit e821d50ab5b956ed0effa49faaf29912fd4106d9 ]
The pmif driver data that contains the clocks is allocated along with spmi_controller.
On device remove, spmi_controller will be freed first, and then devres , including the clocks, will be cleanup.
This leads to UAF because putting the clocks will access the clocks in the pmif driver data, which is already freed along with spmi_controller.
This can be reproduced by enabling DEBUG_TEST_DRIVER_REMOVE and building the kernel with KASAN.
Fix the UAF issue by using unmanaged clk_bulk_get() and putting the clocks before freeing spmi_controller.
--- drivers/spmi/spmi-mtk-pmif.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/spmi/spmi-mtk-pmif.c +5 -2
@@ -475,7 +475,7 @@ static int mtk_spmi_probe(struct platform_device *pdev)for (i =0 ; i < arb->nclks; i++) arb->clks[i].id = pmif_clock_names[i]; - err =devm_clk_bulk_get (&pdev->dev, arb->nclks, arb->clks); + err =clk_bulk_get (&pdev->dev, arb->nclks, arb->clks);if (err) {dev_err (&pdev->dev,"Failed to get clocks: %d\n" , err); goto err_put_ctrl;
@@ -484,7 +484,7 @@ static int mtk_spmi_probe(struct platform_device *pdev) err =clk_bulk_prepare_enable (arb->nclks, arb->clks);if (err) {dev_err (&pdev->dev,"Failed to enable clocks: %d\n" , err); - goto err_put_ctrl; + goto err_put_clks; } ctrl->cmd = pmif_arb_cmd;
@@ -510,6 +510,8 @@ static int mtk_spmi_probe(struct platform_device *pdev) err_domain_remove:clk_bulk_disable_unprepare (arb->nclks, arb->clks); +err_put_clks: +clk_bulk_put (arb->nclks, arb->clks); err_put_ctrl:spmi_controller_put (ctrl);return err;
@@ -521,6 +523,7 @@ static void mtk_spmi_remove(struct platform_device *pdev)struct pmif *arb =spmi_controller_get_drvdata (ctrl);clk_bulk_disable_unprepare (arb->nclks, arb->clks); +clk_bulk_put (arb->nclks, arb->clks);spmi_controller_remove (ctrl);spmi_controller_put (ctrl); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 240/322 PCI: Fix 64GT/s effective data rate calculation
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ilpo Järvinen <[email protected]>
[ Upstream commit ac4f1897fa5433a1b07a625503a91b6aa9d7e643 ]
Unlike the lower rates, the PCIe 64GT/s Data Rate uses 1b/1b encoding, not 128b/130b (PCIe r6.1 sec 1.2, Table 1-1). Correct the PCIE_SPEED2MBS_ENC() calculation to reflect that.
--- drivers/pci/pci.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pci/pci.h +1 -1
@@ -269,7 +269,7 @@ void pci_bus_put(struct pci_bus *bus);/* PCIe speed to Mb/s reduced by encoding overhead */ #define PCIE_SPEED2MBS_ENC (speed) \ - ((speed) == PCIE_SPEED_64_0GT ? 64000*128/130 : \ + ((speed) == PCIE_SPEED_64_0GT ? 64000*1/1 : \ (speed) == PCIE_SPEED_32_0GT ? 32000*128/130 : \ (speed) == PCIE_SPEED_16_0GT ? 16000*128/130 : \ (speed) == PCIE_SPEED_8_0GT ? 8000*128/130 : \
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 241/322 PCI/AER: Decode Requester ID when no error info found
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bjorn Helgaas <[email protected]>
[ Upstream commit 1291b716bbf969e101d517bfb8ba18d958f758b8 ]
When a device with AER detects an error, it logs error information in its own AER Error Status registers. It may send an Error Message to the Root Port (RCEC in the case of an RCiEP), which logs the fact that an Error Message was received (Root Error Status) and the Requester ID of the message source (Error Source Identification).
aer_print_port_info() prints the Requester ID from the Root Port Error Source in the usual Linux "bb:dd.f" format, but when find_source_device() finds no error details in the hierarchy below the Root Port, it printed the raw Requester ID without decoding it.
Decode the Requester ID in the usual Linux format so it matches other messages.
Sample message changes:
- pcieport 0000:00:1c.5: AER: Correctable error received: 0000:00:1c.5
- pcieport 0000:00:1c.5: AER: can't find device of ID00e5
+ pcieport 0000:00:1c.5: AER: Correctable error message received from 0000:00:1c.5
+ pcieport 0000:00:1c.5: AER: found no error details for 0000:00:1c.5
--- drivers/pci/pcie/aer.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/pci/pcie/aer.c +7 -2
@@ -740,7 +740,7 @@ static void aer_print_port_info(struct pci_dev *dev, struct aer_err_info *info)u8 bus = info->id >>8 ;u8 devfn = info->id &0xff ; - pci_info(dev, "%s%s error received: %04x:%02x:%02x.%d\n", + pci_info(dev, "%s%s error message received from %04x:%02x:%02x.%d\n", info->multi_error_valid ? "Multiple " : "", aer_error_severity_string[info->severity], pci_domain_nr(dev->bus), bus, PCI_SLOT(devfn),
@@ -928,7 +928,12 @@ static bool find_source_device(struct pci_dev *parent,pci_walk_bus (parent->subordinate, find_device_iter, e_info);if (!e_info->error_dev_num) { -pci_info (parent,"can't find device of ID%04x\n" , e_info->id); +u8 bus = e_info->id >>8 ; +u8 devfn = e_info->id &0xff ; + +pci_info (parent,"found no error details for %04x:%02x:%02x.%d\n" , +pci_domain_nr (parent->bus), bus,PCI_SLOT (devfn), +PCI_FUNC (devfn));return false; }return true;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 242/322 9p: Fix initialisation of netfs_inode for 9p
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Howells <[email protected]>
[ Upstream commit 9546ac78b232bac56ff975072b1965e0e755ebd4 ]
The 9p filesystem is calling netfs_inode_init() in v9fs_init_inode() - before the struct inode fields have been initialised from the obtained file stats (ie. after v9fs_stat2inode*() has been called), but netfslib wants to set a couple of its fields from i_size.
--- fs/9p/v9fs_vfs.h | 1 + fs/9p/vfs_inode.c | 6 +++--- fs/9p/vfs_inode_dotl.c | 1 + 3 files changed, 5 insertions(+), 3 deletions(-)
fs/9p/v9fs_vfs.h +1 -0
@@ -42,6 +42,7 @@ struct inode *v9fs_alloc_inode(struct super_block *sb);void v9fs_free_inode (struct inode *inode);struct inode *v9fs_get_inode (struct super_block *sb,umode_t mode,dev_t rdev); +void v9fs_set_netfs_context (struct inode *inode);int v9fs_init_inode (struct v9fs_session_info *v9ses,struct inode *inode,umode_t mode,dev_t rdev);void v9fs_evict_inode (struct inode *inode);
fs/9p/vfs_inode.c +3 -3
@@ -246,7 +246,7 @@ void v9fs_free_inode(struct inode *inode)/* * Set parameters for the netfs library */ -static void v9fs_set_netfs_context (struct inode *inode) +void v9fs_set_netfs_context (struct inode *inode) {struct v9fs_inode *v9inode =V9FS_I (inode);netfs_inode_init (&v9inode->netfs, &v9fs_req_ops);
@@ -326,8 +326,6 @@ int v9fs_init_inode(struct v9fs_session_info *v9ses, err = -EINVAL ; goto error; } - -v9fs_set_netfs_context (inode); error:return err;
@@ -359,6 +357,7 @@ struct inode *v9fs_get_inode(struct super_block *sb, umode_t mode, dev_t rdev)iput (inode);return ERR_PTR (err); } +v9fs_set_netfs_context (inode);return inode; }
@@ -464,6 +463,7 @@ static struct inode *v9fs_qid_iget(struct super_block *sb, goto error;v9fs_stat2inode (st, inode, sb,0 ); +v9fs_set_netfs_context (inode);v9fs_cache_inode_get_cookie (inode);unlock_new_inode (inode);return inode;
fs/9p/vfs_inode_dotl.c +1 -0
@@ -128,6 +128,7 @@ static struct inode *v9fs_qid_iget_dotl(struct super_block *sb, goto error;v9fs_stat2inode_dotl (st, inode,0 ); +v9fs_set_netfs_context (inode);v9fs_cache_inode_get_cookie (inode); retval =v9fs_get_acl (inode, fid);if (retval)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 243/322 usb: xhci-plat: fix usb disconnect issue after s4
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yinbo Zhu <[email protected]>
[ Upstream commit 6d6887c42e946f43bed2e64571a40c8476a1e4a9 ]
The xhci retaining bogus hardware states cause usb disconnect devices connected before hibernation(s4) and refer to the commit 'f3d478858be ("usb: ohci-platform: fix usb disconnect issue after s4")' which set flag "hibernated" as true when resume-from-hibernation and that the drivers will reset the hardware to get rid of any existing state and make sure resume from hibernation re-enumerates everything for xhci.
--- drivers/usb/host/xhci-plat.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-)
drivers/usb/host/xhci-plat.c +19 -4
@@ -433,7 +433,7 @@ void xhci_plat_remove(struct platform_device *dev) }EXPORT_SYMBOL_GPL (xhci_plat_remove); -static int __maybe_unused xhci_plat_suspend (struct device *dev) +static int xhci_plat_suspend (struct device *dev) {struct usb_hcd *hcd =dev_get_drvdata (dev);struct xhci_hcd *xhci =hcd_to_xhci (hcd);
@@ -461,7 +461,7 @@ static int __maybe_unused xhci_plat_suspend(struct device *dev)return 0 ; } -static int __maybe_unused xhci_plat_resume (struct device *dev) +static int xhci_plat_resume_common (struct device *dev,struct pm_message pmsg) {struct usb_hcd *hcd =dev_get_drvdata (dev);struct xhci_hcd *xhci =hcd_to_xhci (hcd);
@@ -483,7 +483,7 @@ static int __maybe_unused xhci_plat_resume(struct device *dev)if (ret) goto disable_clks; - ret =xhci_resume (xhci,PMSG_RESUME ); + ret =xhci_resume (xhci, pmsg);if (ret) goto disable_clks;
@@ -502,6 +502,16 @@ static int __maybe_unused xhci_plat_resume(struct device *dev)return ret; } +static int xhci_plat_resume (struct device *dev) +{ +return xhci_plat_resume_common (dev,PMSG_RESUME ); +} + +static int xhci_plat_restore (struct device *dev) +{ +return xhci_plat_resume_common (dev,PMSG_RESTORE ); +} +static int __maybe_unused xhci_plat_runtime_suspend (struct device *dev) {struct usb_hcd *hcd =dev_get_drvdata (dev);
@@ -524,7 +534,12 @@ static int __maybe_unused xhci_plat_runtime_resume(struct device *dev) }const struct dev_pm_ops xhci_plat_pm_ops = { - SET_SYSTEM_SLEEP_PM_OPS(xhci_plat_suspend, xhci_plat_resume) + .suspend =pm_sleep_ptr (xhci_plat_suspend), + .resume =pm_sleep_ptr (xhci_plat_resume), + .freeze =pm_sleep_ptr (xhci_plat_suspend), + .thaw =pm_sleep_ptr (xhci_plat_resume), + .poweroff =pm_sleep_ptr (xhci_plat_suspend), + .restore =pm_sleep_ptr (xhci_plat_restore), SET_RUNTIME_PM_OPS(xhci_plat_runtime_suspend, xhci_plat_runtime_resume,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 244/322 misc: lis3lv02d_i2c: Add missing setting of the reg_ctrl callback
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans de Goede <[email protected]>
[ Upstream commit b1b9f7a494400c0c39f8cd83de3aaa6111c55087 ]
The lis3lv02d_i2c driver was missing a line to set the lis3_dev's reg_ctrl callback.
lis3_reg_ctrl(on) is called from the init callback, but due to the missing reg_ctrl callback the regulators where never turned off again leading to the following oops/backtrace when detaching the driver:
[ 82.313527] ------------[ cut here ]------------ [ 82.313546] WARNING: CPU: 1 PID: 1724 at drivers/regulator/core.c:2396 _regulator_put+0x219/0x230 ... [ 82.313695] RIP: 0010:_regulator_put+0x219/0x230 ... [ 82.314767] Call Trace: [ 82.314770] <TASK> [ 82.314772] ? _regulator_put+0x219/0x230 [ 82.314777] ? __warn+0x81/0x170 [ 82.314784] ? _regulator_put+0x219/0x230 [ 82.314791] ? report_bug+0x18d/0x1c0 [ 82.314801] ? handle_bug+0x3c/0x80 [ 82.314806] ? exc_invalid_op+0x13/0x60 [ 82.314812] ? asm_exc_invalid_op+0x16/0x20 [ 82.314845] ? _regulator_put+0x219/0x230 [ 82.314857] regulator_bulk_free+0x39/0x60 [ 82.314865] i2c_device_remove+0x22/0xb0
Add the missing setting of the callback so that the regulators properly get turned off again when not used.
--- drivers/misc/lis3lv02d/lis3lv02d_i2c.c | 1 + 1 file changed, 1 insertion(+)
drivers/misc/lis3lv02d/lis3lv02d_i2c.c +1 -0
@@ -150,6 +150,7 @@ static int lis3lv02d_i2c_probe(struct i2c_client *client) lis3_dev.init = lis3_i2c_init; lis3_dev.read = lis3_i2c_read; lis3_dev.write = lis3_i2c_write; + lis3_dev.reg_ctrl = lis3_reg_ctrl; lis3_dev.irq = client->irq; lis3_dev.ac = lis3lv02d_axis_map; lis3_dev.pm_dev = &client->dev;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 245/322 libsubcmd: Fix memory leak in uniq()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit ad30469a841b50dbb541df4d6971d891f703c297 ]
uniq() will write one command name over another causing the overwritten string to be leaked. Fix by doing a pass that removes duplicates and a second that removes the holes.
--- tools/lib/subcmd/help.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-)
tools/lib/subcmd/help.c +14 -4
@@ -52,11 +52,21 @@ void uniq(struct cmdnames *cmds)if (!cmds->cnt)return ; -for (i = j =1 ; i < cmds->cnt; i++) -if (strcmp (cmds->names[i]->name, cmds->names[i-1 ]->name)) - cmds->names[j++] = cmds->names[i]; - +for (i =1 ; i < cmds->cnt; i++) { +if (!strcmp (cmds->names[i]->name, cmds->names[i-1 ]->name)) +zfree (&cmds->names[i -1 ]); + } +for (i =0 , j =0 ; i < cmds->cnt; i++) { +if (cmds->names[i]) { +if (i == j) + j++; +else + cmds->names[j++] = cmds->names[i]; + } + } cmds->cnt = j; +while (j < i) + cmds->names[j++] =NULL ; }void exclude_cmds (struct cmdnames *cmds,struct cmdnames *excludes)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 246/322 drm/amdkfd: Fix lock dependency warning
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Kuehling <[email protected]>
[ Upstream commit 47bf0f83fc86df1bf42b385a91aadb910137c5c9 ]
======================================================
WARNING: possible circular locking dependency detected
6.5.0-kfd-fkuehlin #276 Not tainted
------------------------------------------------------
kworker/8:2/2676 is trying to acquire lock:ffff9435aae95c88 ((work_completion)(&svm_bo->eviction_work)){+.+.}-{0:0}, at: __flush_work+0x52/0x550
but task is already holding lock:ffff9435cd8e1720 (&svms->lock){+.+.}-{3:3}, at: svm_range_deferred_list_work+0xe8/0x340 [amdgpu]
which lock already depends on the new lock.
the existing dependency chain (in reverse order) is:
-> #2 (&svms->lock){+.+.}-{3:3}:
__mutex_lock+0x97/0xd30
kfd_ioctl_alloc_memory_of_gpu+0x6d/0x3c0 [amdgpu]
kfd_ioctl+0x1b2/0x5d0 [amdgpu]
__x64_sys_ioctl+0x86/0xc0
do_syscall_64+0x39/0x80
entry_SYSCALL_64_after_hwframe+0x63/0xcd-> #1 (&mm->mmap_lock){++++}-{3:3}:
down_read+0x42/0x160
svm_range_evict_svm_bo_worker+0x8b/0x340 [amdgpu]
process_one_work+0x27a/0x540
worker_thread+0x53/0x3e0
kthread+0xeb/0x120
ret_from_fork+0x31/0x50
ret_from_fork_asm+0x11/0x20-> #0 ((work_completion)(&svm_bo->eviction_work)){+.+.}-{0:0}:
__lock_acquire+0x1426/0x2200
lock_acquire+0xc1/0x2b0
__flush_work+0x80/0x550
__cancel_work_timer+0x109/0x190
svm_range_bo_release+0xdc/0x1c0 [amdgpu]
svm_range_free+0x175/0x180 [amdgpu]
svm_range_deferred_list_work+0x15d/0x340 [amdgpu]
process_one_work+0x27a/0x540
worker_thread+0x53/0x3e0
kthread+0xeb/0x120
ret_from_fork+0x31/0x50
ret_from_fork_asm+0x11/0x20other info that might help us debug this:
Chain exists of: (work_completion)(&svm_bo->eviction_work) --> &mm->mmap_lock --> &svms->lock Possible unsafe locking scenario:
CPU0 CPU1
---- ----
lock(&svms->lock);
lock(&mm->mmap_lock);
lock(&svms->lock);lock((work_completion)(&svm_bo->eviction_work));
I believe this cannot really lead to a deadlock in practice, because svm_range_evict_svm_bo_worker only takes the mmap_read_lock if the BO refcount is non-0. That means it's impossible that svm_range_bo_release is running concurrently. However, there is no good way to annotate this.
To avoid the problem, take a BO reference in svm_range_schedule_evict_svm_bo instead of in the worker. That way it's impossible for a BO to get freed while eviction work is pending and the cancel_work_sync call in svm_range_bo_release can be eliminated.
v2: Use svm_bo_ref_unless_zero and explained why that's safe. Also removed redundant checks that are already done in amdkfd_fence_enable_signaling.
--- drivers/gpu/drm/amd/amdkfd/kfd_svm.c | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-)
drivers/gpu/drm/amd/amdkfd/kfd_svm.c +10 -16
@@ -391,14 +391,9 @@ static void svm_range_bo_release(struct kref *kref)spin_lock (&svm_bo->list_lock); }spin_unlock (&svm_bo->list_lock); -if (!dma_fence_is_signaled (&svm_bo->eviction_fence->base)) { -/* We're not in the eviction worker. -* Signal the fence and synchronize with any -* pending eviction work. -*/ +if (!dma_fence_is_signaled (&svm_bo->eviction_fence->base)) +/* We're not in the eviction worker. Signal the fence. */ dma_fence_signal (&svm_bo->eviction_fence->base); -cancel_work_sync (&svm_bo->eviction_work); - }dma_fence_put (&svm_bo->eviction_fence->base);amdgpu_bo_unref (&svm_bo->bo);kfree (svm_bo);
@@ -3424,13 +3419,14 @@ svm_range_trigger_migration(struct mm_struct *mm, struct svm_range *prange,int svm_range_schedule_evict_svm_bo (struct amdgpu_amdkfd_fence *fence) { -if (!fence) -return -EINVAL ; - -if (dma_fence_is_signaled (&fence->base)) -return 0 ; - -if (fence->svm_bo) { +/* Dereferencing fence->svm_bo is safe here because the fence hasn't +* signaled yet and we're under the protection of the fence->lock. +* After the fence is signaled in svm_range_bo_release, we cannot get +* here any more. +* +* Reference is dropped in svm_range_evict_svm_bo_worker. +*/ +if (svm_bo_ref_unless_zero (fence->svm_bo)) {WRITE_ONCE (fence->svm_bo->evicting,1 );schedule_work (&fence->svm_bo->eviction_work); }
@@ -3445,8 +3441,6 @@ static void svm_range_evict_svm_bo_worker(struct work_struct *work)int r =0 ; svm_bo = container_of(work, struct svm_range_bo, eviction_work); -if (!svm_bo_ref_unless_zero (svm_bo)) -return ;/* svm_bo was freed while eviction was pending */ if (mmget_not_zero (svm_bo->eviction_fence->mm)) { mm = svm_bo->eviction_fence->mm;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 247/322 drm/amdkfd: Fix lock dependency warning with srcu
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Philip Yang <[email protected]>
[ Upstream commit 2a9de42e8d3c82c6990d226198602be44f43f340 ]
======================================================
WARNING: possible circular locking dependency detected 6.5.0-kfd-yangp #2289 Not tainted
------------------------------------------------------
kworker/0:2/996 is trying to acquire lock:
(srcu){.+.+}-{0:0}, at: __synchronize_srcu+0x5/0x1a0but task is already holding lock:
((work_completion)(&svms->deferred_list_work)){+.+.}-{0:0}, at:
process_one_work+0x211/0x560which lock already depends on the new lock.
the existing dependency chain (in reverse order) is:
-> #3 ((work_completion)(&svms->deferred_list_work)){+.+.}-{0:0}:
__flush_work+0x88/0x4f0
svm_range_list_lock_and_flush_work+0x3d/0x110 [amdgpu]
svm_range_set_attr+0xd6/0x14c0 [amdgpu]
kfd_ioctl+0x1d1/0x630 [amdgpu]
__x64_sys_ioctl+0x88/0xc0-> #2 (&info->lock#2){+.+.}-{3:3}:
__mutex_lock+0x99/0xc70
amdgpu_amdkfd_gpuvm_restore_process_bos+0x54/0x740 [amdgpu]
restore_process_helper+0x22/0x80 [amdgpu]
restore_process_worker+0x2d/0xa0 [amdgpu]
process_one_work+0x29b/0x560
worker_thread+0x3d/0x3d0-> #1 ((work_completion)(&(&process->restore_work)->work)){+.+.}-{0:0}:
__flush_work+0x88/0x4f0
__cancel_work_timer+0x12c/0x1c0
kfd_process_notifier_release_internal+0x37/0x1f0 [amdgpu]
__mmu_notifier_release+0xad/0x240
exit_mmap+0x6a/0x3a0
mmput+0x6a/0x120
do_exit+0x322/0xb90
do_group_exit+0x37/0xa0
__x64_sys_exit_group+0x18/0x20
do_syscall_64+0x38/0x80-> #0 (srcu){.+.+}-{0:0}:
__lock_acquire+0x1521/0x2510
lock_sync+0x5f/0x90
__synchronize_srcu+0x4f/0x1a0
__mmu_notifier_release+0x128/0x240
exit_mmap+0x6a/0x3a0
mmput+0x6a/0x120
svm_range_deferred_list_work+0x19f/0x350 [amdgpu]
process_one_work+0x29b/0x560
worker_thread+0x3d/0x3d0other info that might help us debug this:
Chain exists of: srcu --> &info->lock#2 --> (work_completion)(&svms->deferred_list_work) Possible unsafe locking scenario:
CPU0 CPU1
---- ----
lock((work_completion)(&svms->deferred_list_work));
lock(&info->lock#2);
lock((work_completion)(&svms->deferred_list_work));
sync(srcu);--- drivers/gpu/drm/amd/amdkfd/kfd_svm.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/amdkfd/kfd_svm.c +4 -2
@@ -2343,8 +2343,10 @@ static void svm_range_deferred_list_work(struct work_struct *work)mutex_unlock (&svms->lock);mmap_write_unlock (mm); -/* Pairs with mmget in svm_range_add_list_work */ -mmput (mm); +/* Pairs with mmget in svm_range_add_list_work. If dropping the +* last mm refcount, schedule release work to avoid circular locking +*/ +mmput_async (mm);spin_lock (&svms->deferred_list_lock); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 248/322 =?UTF-8?q?virtio=5Fnet:=20Fix=20"=E2=80=98%d=E2=80=99=20directive?= =?UTF-8?q?=20writing=20between=201=20and=2011=20bytes=20into=20a=20region?= =?UTF-8?q?=20of=20size=2010"=20warnings?=
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhu Yanjun <[email protected]>
[ Upstream commit e3fe8d28c67bf6c291e920c6d04fa22afa14e6e4 ]
Fix the warnings when building virtio_net driver.
"drivers/net/virtio_net.c: In function ‘init_vqs’:drivers/net/virtio_net.c:4551:48: warning: ‘%d’ directive writing between 1 and 11 bytes into a region of size 10 [-Wformat-overflow=]
4551 | sprintf(vi->rq[i].name, "input.%d", i);
| ^~
In function ‘virtnet_find_vqs’,
inlined from ‘init_vqs’ at drivers/net/virtio_net.c:4645:8:drivers/net/virtio_net.c:4551:41: note: directive argument in the range [-2147483643, 65534]
4551 | sprintf(vi->rq[i].name, "input.%d", i);
| ^~~~~~~~~~drivers/net/virtio_net.c:4551:17: note: ‘sprintf’ output between 8 and 18 bytes into a destination of size 16
4551 | sprintf(vi->rq[i].name, "input.%d", i);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~drivers/net/virtio_net.c: In function ‘init_vqs’:drivers/net/virtio_net.c:4552:49: warning: ‘%d’ directive writing between 1 and 11 bytes into a region of size 9 [-Wformat-overflow=]
4552 | sprintf(vi->sq[i].name, "output.%d", i);
| ^~
In function ‘virtnet_find_vqs’,
inlined from ‘init_vqs’ at drivers/net/virtio_net.c:4645:8:drivers/net/virtio_net.c:4552:41: note: directive argument in the range [-2147483643, 65534]
4552 | sprintf(vi->sq[i].name, "output.%d", i);
| ^~~~~~~~~~~drivers/net/virtio_net.c:4552:17: note: ‘sprintf’ output between 9 and 19 bytes into a destination of size 16
4552 | sprintf(vi->sq[i].name, "output.%d", i);
"
--- drivers/net/virtio_net.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
drivers/net/virtio_net.c +5 -4
@@ -4096,10 +4096,11 @@ static int virtnet_find_vqs(struct virtnet_info *vi) {vq_callback_t **callbacks;struct virtqueue **vqs; -int ret = -ENOMEM ; -int i, total_vqs;const char **names; +int ret = -ENOMEM ; +int total_vqs;bool *ctx; +u16 i;/* We expect 1 RX virtqueue followed by 1 TX virtqueue, followed by * possible N-1 RX/TX queue pairs used in multiqueue mode, followed by
@@ -4136,8 +4137,8 @@ static int virtnet_find_vqs(struct virtnet_info *vi)for (i =0 ; i < vi->max_queue_pairs; i++) { callbacks[rxq2vq (i)] = skb_recv_done; callbacks[txq2vq (i)] = skb_xmit_done; -sprintf (vi->rq[i].name,"input.%d" , i); -sprintf (vi->sq[i].name,"output.%d" , i); +sprintf (vi->rq[i].name,"input.%u" , i); +sprintf (vi->sq[i].name,"output.%u" , i); names[rxq2vq (i)] = vi->rq[i].name; names[txq2vq (i)] = vi->sq[i].name;if (ctx)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 249/322 blk-mq: fix IO hang from sbitmap wakeup race
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ming Lei <[email protected]>
[ Upstream commit 5266caaf5660529e3da53004b8b7174cab6374ed ]
In blk_mq_mark_tag_wait(), __add_wait_queue() may be re-ordered with the following blk_mq_get_driver_tag() in case of getting driver tag failure.
Then in __sbitmap_queue_wake_up(), waitqueue_active() may not observe the added waiter in blk_mq_mark_tag_wait() and wake up nothing, meantime blk_mq_mark_tag_wait() can't get driver tag successfully.
This issue can be reproduced by running the following test in loop, and fio hang can be observed in < 30min when running it on my test VM in laptop.
modprobe -r scsi_debug
modprobe scsi_debug delay=0 dev_size_mb=4096 max_queue=1 host_max_queue=1 submit_queues=4 dev=ls -d /sys/bus/pseudo/drivers/scsi_debug/adapter*/host*/target*/*/block/* | head -1 | xargs basename fio --filename=/dev/"$dev" --direct=1 --rw=randrw --bs=4k --iodepth=1 \
--runtime=100 --numjobs=40 --time_based --name=test \
--ioengine=libaio
Fix the issue by adding one explicit barrier in blk_mq_mark_tag_wait(), which is just fine in case of running out of tag.
--- block/blk-mq.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+)
block/blk-mq.c +16 -0
@@ -1870,6 +1870,22 @@ static bool blk_mq_mark_tag_wait(struct blk_mq_hw_ctx *hctx, wait->flags &= ~WQ_FLAG_EXCLUSIVE ;__add_wait_queue (wq, wait); +/* +* Add one explicit barrier since blk_mq_get_driver_tag() may +* not imply barrier in case of failure. +* +* Order adding us to wait queue and allocating driver tag. +* +* The pair is the one implied in sbitmap_queue_wake_up() which +* orders clearing sbitmap tag bits and waitqueue_active() in +* __sbitmap_queue_wake_up(), since waitqueue_active() is lockless +* +* Otherwise, re-order of adding wait queue and getting driver tag +* may cause __sbitmap_queue_wake_up() to wake up nothing because +* the waitqueue_active() may not observe us in wait queue. +*/ +smp_mb (); +/* * It's possible that a tag was freed in the window between the * allocation failure and adding the hardware queue to the wait
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 250/322 ceph: reinitialize mds feature bit even when session in open
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Venky Shankar <[email protected]>
[ Upstream commit f48e0342a74d7770cdf1d11894bdc3b6d989b29e ]
Following along the same lines as per the user-space fix. Right now this isn't really an issue with the ceph kernel driver because of the feature bit laginess, however, that can change over time (when the new snaprealm info type is ported to the kernel driver) and depending on the MDS version that's being upgraded can cause message decoding issues - so, fix that early on.
--- fs/ceph/mds_client.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/ceph/mds_client.c +1 -1
@@ -4010,11 +4010,11 @@ static void handle_session(struct ceph_mds_session *session,if (session->s_state ==CEPH_MDS_SESSION_RECONNECTING )pr_info ("mds%d reconnect success\n" , session->s_mds); + session->s_features = features;if (session->s_state ==CEPH_MDS_SESSION_OPEN ) {pr_notice ("mds%d is already opened\n" , session->s_mds); }else { session->s_state =CEPH_MDS_SESSION_OPEN ; - session->s_features = features;renewed_caps (mdsc, session,0 );if (test_bit (CEPHFS_FEATURE_METRIC_COLLECT , &session->s_features))
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 251/322 ceph: fix deadlock or deadcode of misusing dget()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiubo Li <[email protected]>
[ Upstream commit b493ad718b1f0357394d2cdecbf00a44a36fa085 ]
The lock order is incorrect between denty and its parent, we should always make sure that the parent get the lock first.
But since this deadcode is never used and the parent dir will always be set from the callers, let's just remove it.
--- fs/ceph/caps.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-)
fs/ceph/caps.c +3 -6
@@ -4780,12 +4780,14 @@ int ceph_encode_dentry_release(void **p, struct dentry *dentry,struct inode *dir, int mds, int drop, int unless) { - struct dentry *parent = NULL; struct ceph_mds_request_release *rel = *p;struct ceph_dentry_info *di =ceph_dentry (dentry);int force =0 ;int ret; +/* This shouldn't happen */ +BUG_ON (!dir); +/* * force an record for the directory caps if we have a dentry lease. * this is racy (can't take i_ceph_lock and d_lock together), but it
@@ -4795,14 +4797,9 @@ int ceph_encode_dentry_release(void **p, struct dentry *dentry,spin_lock (&dentry->d_lock);if (di->lease_session && di->lease_session->s_mds == mds) force =1 ; -if (!dir) { - parent =dget (dentry->d_parent); - dir =d_inode (parent); - }spin_unlock (&dentry->d_lock); ret =ceph_encode_inode_release (p, dir, mds, drop, unless, force); -dput (parent);spin_lock (&dentry->d_lock);if (ret && di->lease_session && di->lease_session->s_mds == mds) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 252/322 ceph: fix invalid pointer access if get_quota_realm return ERR_PTR
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wenchao Hao <[email protected]>
[ Upstream commit 0f4cf64eabc6e16cfc2704f1960e82dc79d91c8d ]
This issue is reported by smatch that get_quota_realm() might return ERR_PTR but we did not handle it. It's not a immediate bug, while we still should address it to avoid potential bugs if get_quota_realm() is changed to return other ERR_PTR in future.
Set ceph_snap_realm's pointer in get_quota_realm()'s to address this issue, the pointer would be set to NULL if get_quota_realm() failed to get struct ceph_snap_realm, so no ERR_PTR would happen any more.
[ xiubli: minor code style clean up ]
--- fs/ceph/quota.c | 39 ++++++++++++++++++++++----------------- 1 file changed, 22 insertions(+), 17 deletions(-)
fs/ceph/quota.c +22 -17
@@ -194,10 +194,10 @@ void ceph_cleanup_quotarealms_inodes(struct ceph_mds_client *mdsc) }/* -* This function walks through the snaprealm for an inode and returns the -* ceph_snap_realm for the first snaprealm that has quotas set (max_files, +* This function walks through the snaprealm for an inode and set the +* realmp with the first snaprealm that has quotas set (max_files, * max_bytes, or any, depending on the 'which_quota' argument). If the root is -* reached, return the root ceph_snap_realm instead. +* reached, set the realmp with the root ceph_snap_realm instead. * * Note that the caller is responsible for calling ceph_put_snap_realm() on the * returned realm.
@@ -208,18 +208,19 @@ void ceph_cleanup_quotarealms_inodes(struct ceph_mds_client *mdsc)* this function will return -EAGAIN; otherwise, the snaprealms walk-through * will be restarted. */ -static struct ceph_snap_realm *get_quota_realm (struct ceph_mds_client *mdsc, -struct inode *inode, -enum quota_get_realm which_quota, -bool retry) +static int get_quota_realm (struct ceph_mds_client *mdsc,struct inode *inode, +enum quota_get_realm which_quota, +struct ceph_snap_realm **realmp,bool retry) {struct ceph_inode_info *ci =NULL ;struct ceph_snap_realm *realm, *next;struct inode *in;bool has_quota; +if (realmp) + *realmp =NULL ;if (ceph_snap (inode) !=CEPH_NOSNAP ) -return NULL ; +return 0 ; restart: realm =ceph_inode (inode)->i_snap_realm;
@@ -245,7 +246,7 @@ static struct ceph_snap_realm *get_quota_realm(struct ceph_mds_client *mdsc,break ;ceph_put_snap_realm (mdsc, realm);if (!retry) -return ERR_PTR (-EAGAIN ); +return -EAGAIN ; goto restart; }
@@ -254,8 +255,11 @@ static struct ceph_snap_realm *get_quota_realm(struct ceph_mds_client *mdsc,iput (in); next = realm->parent; -if (has_quota || !next) -return realm; +if (has_quota || !next) { +if (realmp) + *realmp = realm; +return 0 ; + }ceph_get_snap_realm (mdsc, next);ceph_put_snap_realm (mdsc, realm);
@@ -264,7 +268,7 @@ static struct ceph_snap_realm *get_quota_realm(struct ceph_mds_client *mdsc,if (realm)ceph_put_snap_realm (mdsc, realm); -return NULL ; +return 0 ; }bool ceph_quota_is_same_realm (struct inode *old,struct inode *new)
@@ -272,6 +276,7 @@ bool ceph_quota_is_same_realm(struct inode *old, struct inode *new)struct ceph_mds_client *mdsc =ceph_sb_to_mdsc (old->i_sb);struct ceph_snap_realm *old_realm, *new_realm;bool is_same; +int ret; restart:/*
@@ -281,9 +286,9 @@ bool ceph_quota_is_same_realm(struct inode *old, struct inode *new)* dropped and we can then restart the whole operation. */ down_read (&mdsc->snap_rwsem); - old_realm =get_quota_realm (mdsc, old,QUOTA_GET_ANY , true); - new_realm =get_quota_realm (mdsc, new,QUOTA_GET_ANY , false); -if (PTR_ERR (new_realm) == -EAGAIN ) { +get_quota_realm (mdsc, old,QUOTA_GET_ANY , &old_realm, true); + ret =get_quota_realm (mdsc, new,QUOTA_GET_ANY , &new_realm, false); +if (ret == -EAGAIN ) {up_read (&mdsc->snap_rwsem);if (old_realm)ceph_put_snap_realm (mdsc, old_realm);
@@ -485,8 +490,8 @@ bool ceph_quota_update_statfs(struct ceph_fs_client *fsc, struct kstatfs *buf)bool is_updated = false;down_read (&mdsc->snap_rwsem); - realm =get_quota_realm (mdsc,d_inode (fsc->sb->s_root), -QUOTA_GET_MAX_BYTES , true); +get_quota_realm (mdsc,d_inode (fsc->sb->s_root),QUOTA_GET_MAX_BYTES , + &realm, true);up_read (&mdsc->snap_rwsem);if (!realm)return false;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 253/322 drm/amdgpu: fix avg vs input power reporting on smu7
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Deucher <[email protected]>
[ Upstream commit 25852d4b97572ff62ffee574cb8bb4bc551af23a ]
Hawaii, Bonaire, Fiji, and Tonga support average power, the others support current power.
--- .../gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/pm/powerplay/hwmgr/smu7_hwmgr.c +16 -1
@@ -3999,6 +3999,7 @@ static int smu7_read_sensor(struct pp_hwmgr *hwmgr, int idx,uint32_t sclk, mclk, activity_percent;uint32_t offset, val_vid;struct smu7_hwmgr *data = (struct smu7_hwmgr *)(hwmgr->backend); +struct amdgpu_device *adev = hwmgr->adev;/* size must be at least 4 bytes for all sensors */ if (*size <4 )
@@ -4042,7 +4043,21 @@ static int smu7_read_sensor(struct pp_hwmgr *hwmgr, int idx, *size =4 ;return 0 ;case AMDGPU_PP_SENSOR_GPU_INPUT_POWER : -return smu7_get_gpu_power (hwmgr, (uint32_t *)value); +if ((adev->asic_type !=CHIP_HAWAII ) && + (adev->asic_type !=CHIP_BONAIRE ) && + (adev->asic_type !=CHIP_FIJI ) && + (adev->asic_type !=CHIP_TONGA )) +return smu7_get_gpu_power (hwmgr, (uint32_t *)value); +else +return -EOPNOTSUPP ; +case AMDGPU_PP_SENSOR_GPU_AVG_POWER : +if ((adev->asic_type !=CHIP_HAWAII ) && + (adev->asic_type !=CHIP_BONAIRE ) && + (adev->asic_type !=CHIP_FIJI ) && + (adev->asic_type !=CHIP_TONGA )) +return -EOPNOTSUPP ; +else +return smu7_get_gpu_power (hwmgr, (uint32_t *)value);case AMDGPU_PP_SENSOR_VDDGFX :if ((data->vr_config &VRCONF_VDDGFX_MASK ) == (VR_SVI2_PLANE_2 <<VRCONF_VDDGFX_SHIFT ))
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 254/322 drm/amd/powerplay: Fix kzalloc parameter ATOM_Tonga_PPM_Table in get_platform_power_management_table()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinivasan Shanmugam <[email protected]>
[ Upstream commit 6616b5e1999146b1304abe78232af810080c67e3 ]
In 'struct phm_ppm_table *ptr' allocation using kzalloc, an incorrect structure type is passed to sizeof() in kzalloc, larger structure types were used, thus using correct type 'struct phm_ppm_table' fixes the below:
drivers/gpu/drm/amd/amdgpu/../pm/powerplay/hwmgr/process_pptables_v1_0.c:203 get_platform_power_management_table() warn: struct type mismatch 'phm_ppm_table vs _ATOM_Tonga_PPM_Table'
--- drivers/gpu/drm/amd/pm/powerplay/hwmgr/process_pptables_v1_0.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/pm/powerplay/hwmgr/process_pptables_v1_0.c +1 -1
@@ -200,7 +200,7 @@ static int get_platform_power_management_table(struct pp_hwmgr *hwmgr, ATOM_Tonga_PPM_Table *atom_ppm_table) { - struct phm_ppm_table *ptr = kzalloc(sizeof(ATOM_Tonga_PPM_Table), GFP_KERNEL); + struct phm_ppm_table *ptr = kzalloc(sizeof(*ptr), GFP_KERNEL);struct phm_ppt_v1_information *pp_table_information = (struct phm_ppt_v1_information *)(hwmgr->pptable);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 255/322 drm/amdgpu: Fix with right return code -EIO in amdgpu_gmc_vram_checking()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinivasan Shanmugam <[email protected]>
[ Upstream commit fac4ebd79fed60e79cccafdad45a2bb8d3795044 ]
The amdgpu_gmc_vram_checking() function in emulation checks whether all of the memory range of shared system memory could be accessed by GPU, from this aspect, -EIO is returned for error scenarios.
Fixes the below:drivers/gpu/drm/amd/amdgpu/gmc_v6_0.c:919 gmc_v6_0_hw_init() warn: missing error code? 'r' drivers/gpu/drm/amd/amdgpu/gmc_v7_0.c:1103 gmc_v7_0_hw_init() warn: missing error code? 'r' drivers/gpu/drm/amd/amdgpu/gmc_v8_0.c:1223 gmc_v8_0_hw_init() warn: missing error code? 'r' drivers/gpu/drm/amd/amdgpu/gmc_v9_0.c:2344 gmc_v9_0_hw_init() warn: missing error code? 'r'
--- drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-)
drivers/gpu/drm/amd/amdgpu/amdgpu_gmc.c +14 -7
@@ -876,21 +876,28 @@ int amdgpu_gmc_vram_checking(struct amdgpu_device *adev)* seconds, so here, we just pick up three parts for emulation. */ ret =memcmp (vram_ptr, cptr,10 ); -if (ret) -return ret; +if (ret) { + ret = -EIO ; + goto release_buffer; + } ret =memcmp (vram_ptr + (size /2 ), cptr,10 ); -if (ret) -return ret; +if (ret) { + ret = -EIO ; + goto release_buffer; + } ret =memcmp (vram_ptr + size -10 , cptr,10 ); -if (ret) -return ret; +if (ret) { + ret = -EIO ; + goto release_buffer; + } +release_buffer:amdgpu_bo_free_kernel (&vram_bo, &vram_gpu, &vram_ptr); -return 0 ; +return ret; } static ssize_t current_memory_partition_show(
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 256/322 drm/amdgpu: Release adev->pm.fw before return in amdgpu_device_need_post()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinivasan Shanmugam <[email protected]>
[ Upstream commit 8a44fdd3cf91debbd09b43bd2519ad2b2486ccf4 ]
In function 'amdgpu_device_need_post(struct amdgpu_device *adev)' - 'adev->pm.fw' may not be released before return.
Using the function release_firmware() to release adev->pm.fw.
Thus fixing the below:drivers/gpu/drm/amd/amdgpu/amdgpu_device.c:1571 amdgpu_device_need_post() warn: 'adev->pm.fw' from request_firmware() not released on lines: 1554.
--- drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 1 + 1 file changed, 1 insertion(+)
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +1 -0
@@ -1218,6 +1218,7 @@ bool amdgpu_device_need_post(struct amdgpu_device *adev)return true; fw_ver = *((uint32_t *)adev->pm.fw->data +69 ); +release_firmware (adev->pm.fw);if (fw_ver <0x00160e00 )return true; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 257/322 drm/amdkfd: Fix node NULL check in svm_range_get_range_boundaries()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinivasan Shanmugam <[email protected]>
[ Upstream commit d7a254fad873775ce6c32b77796c81e81e6b7f2e ]
Range interval [start, last] is ordered by rb_tree, rb_prev, rb_next return value still needs NULL check, thus modified from "node" to "rb_node".
Fixes the below:drivers/gpu/drm/amd/amdgpu/../amdkfd/kfd_svm.c:2691 svm_range_get_range_boundaries() warn: can 'node' even be NULL?
--- drivers/gpu/drm/amd/amdkfd/kfd_svm.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/gpu/drm/amd/amdkfd/kfd_svm.c +5 -5
@@ -2657,6 +2657,7 @@ svm_range_get_range_boundaries(struct kfd_process *p, int64_t addr, {struct vm_area_struct *vma;struct interval_tree_node *node; +struct rb_node *rb_node;unsigned long start_limit, end_limit; vma =vma_lookup (p->mm, addr <<PAGE_SHIFT );
@@ -2676,16 +2677,15 @@ svm_range_get_range_boundaries(struct kfd_process *p, int64_t addr,if (node) { end_limit =min (end_limit, node->start);/* Last range that ends before the fault address */ - node =container_of (rb_prev (&node->rb), - struct interval_tree_node, rb); + rb_node =rb_prev (&node->rb); }else {/* Last range must end before addr because * there was no range after addr */ - node =container_of (rb_last (&p->svms.objects.rb_root), - struct interval_tree_node, rb); + rb_node =rb_last (&p->svms.objects.rb_root); } -if (node) { +if (rb_node) { + node = container_of(rb_node, struct interval_tree_node, rb);if (node->last >= addr) {WARN (1 ,"Overlap with prev node and page fault addr\n" );return -EFAULT ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 258/322 i2c: rk3x: Adjust mask/value offset for i2c2 on rv1126
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tim Lunn <[email protected]>
[ Upstream commit 92a85b7c6262f19c65a1c115cf15f411ba65a57c ]
Rockchip RV1126 is using old style i2c controller, the i2c2 bus uses a non-sequential offset in the grf register for the mask/value bits for this bus.
This patch fixes i2c2 bus on rv1126 SoCs.
--- drivers/i2c/busses/i2c-rk3x.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/i2c/busses/i2c-rk3x.c +6 -2
@@ -1295,8 +1295,12 @@ static int rk3x_i2c_probe(struct platform_device *pdev)return -EINVAL ; } -/* 27+i: write mask, 11+i: value */ - value =BIT (27 + bus_nr) |BIT (11 + bus_nr); +/* rv1126 i2c2 uses non-sequential write mask 20, value 4 */ +if (i2c->soc_data == &rv1126_soc_data && bus_nr ==2 ) + value =BIT (20 ) |BIT (4 ); +else +/* 27+i: write mask, 11+i: value */ + value =BIT (27 + bus_nr) |BIT (11 + bus_nr); ret =regmap_write (grf, i2c->soc_data->grf_offset, value);if (ret !=0 ) {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 259/322 perf: Fix the nr_addr_filters fix
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Zijlstra <[email protected]>
[ Upstream commit 388a1fb7da6aaa1970c7e2a7d7fcd983a87a8484 ]
Thomas reported that commit 652ffc2104ec ("perf/core: Fix narrow startup race when creating the perf nr_addr_filters sysfs file") made the entire attribute group vanish, instead of only the nr_addr_filters attribute.
Additionally a stray return.
Insufficient coffee was involved with both writing and merging the patch.
--- kernel/events/core.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
kernel/events/core.c +1 -3
@@ -11422,12 +11422,10 @@ static umode_t pmu_dev_is_visible(struct kobject *kobj, struct attribute *a, intstruct device *dev =kobj_to_dev (kobj);struct pmu *pmu =dev_get_drvdata (dev); -if (!pmu->nr_addr_filters) +if (n ==2 && !pmu->nr_addr_filters)return 0 ;return a->mode; - -return 0 ; }static struct attribute_group pmu_dev_attr_group = {
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 260/322 wifi: cfg80211: fix RCU dereference in __cfg80211_bss_update
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Edward Adam Davis <[email protected]>
[ Upstream commit 1184950e341c11b6f82bc5b59564411d9537ab27 ]
Replace rcu_dereference() with rcu_access_pointer() since we hold the lock here (and aren't in an RCU critical section).
--- net/wireless/scan.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/wireless/scan.c +1 -1
@@ -1830,7 +1830,7 @@ __cfg80211_bss_update(struct cfg80211_registered_device *rdev, &hidden->hidden_list); hidden->refcount++; - ies = (void *)rcu_dereference (new->pub.beacon_ies); + ies = (void *)rcu_access_pointer (new->pub.beacon_ies);rcu_assign_pointer (new->pub.beacon_ies, hidden->pub.beacon_ies);if (ies)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 261/322 drm: using mul_u32_u32() requires linux/math64.h
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stephen Rothwell <[email protected]>
[ Upstream commit 933a2a376fb3f22ba4774f74233571504ac56b02 ]
Some pending include file cleanups produced this error:
In file included from include/linux/kernel.h:27,
from drivers/gpu/ipu-v3/ipu-dp.c:7:
include/drm/drm_color_mgmt.h: In function 'drm_color_lut_extract':include/drm/drm_color_mgmt.h:45:46: error: implicit declaration of function 'mul_u32_u32' [-Werror=implicit-function-declaration]
45 | return DIV_ROUND_CLOSEST_ULL(mul_u32_u32(user_input, (1 << bit_precision) - 1),
| ^~~~~~~~~~~
--- include/drm/drm_color_mgmt.h | 1 + 1 file changed, 1 insertion(+)
include/drm/drm_color_mgmt.h +1 -0
@@ -24,6 +24,7 @@#define __DRM_COLOR_MGMT_H__#include <linux/ctype.h> +#include <linux/math64.h> #include <drm/drm_property.h> struct drm_crtc ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 262/322 drm/amdkfd: only flush mes process context if mes support is there
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonathan Kim <[email protected]>
[ Upstream commit 24149412dfc71f7f4a54868702e9145e396263d3 ]
Fix up on mes process context flush to prevent non-mes devices from spamming error messages or running into undefined behaviour during process termination.
--- drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c +2 -1
@@ -87,7 +87,8 @@ void kfd_process_dequeue_from_device(struct kfd_process_device *pdd)return ; dev->dqm->ops.process_termination (dev->dqm, &pdd->qpd); -amdgpu_mes_flush_shader_debugger (dev->adev, pdd->proc_ctx_gpu_addr); +if (dev->kfd->shared_resources.enable_mes) +amdgpu_mes_flush_shader_debugger (dev->adev, pdd->proc_ctx_gpu_addr); pdd->already_dequeued = true; }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 263/322 riscv: Fix build error on rv32 + XIP
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexandre Ghiti <[email protected]>
[ Upstream commit 66f962d8939fd2ac74de901d30d30310c8ddca79 ]
commit 66f1e6809397 ("riscv: Make XIP bootable again") restricted page offset to the sv39 page offset instead of the default sv57, which makes sense since probably the platforms that target XIP kernels do not support anything else than sv39 and we do not try to find out the largest address space supported on XIP kernels (ie set_satp_mode()).
But PAGE_OFFSET_L3 is not defined for rv32, so fix the build error by restoring the previous behaviour which picks CONFIG_PAGE_OFFSET for rv32.
--- arch/riscv/mm/init.c | 4 ++++ 1 file changed, 4 insertions(+)
arch/riscv/mm/init.c +4 -0
@@ -1058,7 +1058,11 @@ asmlinkage void __init setup_vm(uintptr_t dtb_pa) kernel_map.virt_addr =KERNEL_LINK_ADDR + kernel_map.virt_offset;#ifdef CONFIG_XIP_KERNEL +#ifdef CONFIG_64BIT kernel_map.page_offset =PAGE_OFFSET_L3 ; +#else + kernel_map.page_offset =_AC (CONFIG_PAGE_OFFSET ,UL ); +#endif kernel_map.xiprom = (uintptr_t )CONFIG_XIP_PHYS_ADDR ; kernel_map.xiprom_sz = (uintptr_t )(&_exiprom) - (uintptr_t )(&_xiprom);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 264/322 scsi: isci: Fix an error code problem in isci_io_request_build()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Su Hui <[email protected]>
[ Upstream commit 658365c6b0857e6a306436e315a8633937e3af42 ]
Clang static complains that Value stored to 'status' is never read. Return 'status' rather than 'SCI_SUCCESS'.
--- drivers/scsi/isci/request.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/isci/request.c +1 -1
@@ -3390,7 +3390,7 @@ static enum sci_status isci_io_request_build(struct isci_host *ihost,return SCI_FAILURE ; } -return SCI_SUCCESS ; +return status; }static struct isci_request *isci_request_from_tag (struct isci_host *ihost,u16 tag)
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 265/322 kunit: run test suites only after module initialization completes
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marco Pagani <[email protected]>
[ Upstream commit a1af6a2bfa0cb46d70b7df5352993e750da6c79b ]
Commit 2810c1e99867 ("kunit: Fix wild-memory-access bug in kunit_free_suite_set()") fixed a wild-memory-access bug that could have happened during the loading phase of test suites built and executed as loadable modules. However, it also introduced a problematic side effect that causes test suites modules to crash when they attempt to register fake devices.
When a module is loaded, it traverses the MODULE_STATE_UNFORMED and MODULE_STATE_COMING states before reaching the normal operating state MODULE_STATE_LIVE. Finally, when the module is removed, it moves to MODULE_STATE_GOING before being released. However, if the loading function load_module() fails between complete_formation() and do_init_module(), the module goes directly from MODULE_STATE_COMING to MODULE_STATE_GOING without passing through MODULE_STATE_LIVE.
This behavior was causing kunit_module_exit() to be called without having first executed kunit_module_init(). Since kunit_module_exit() is responsible for freeing the memory allocated by kunit_module_init() through kunit_filter_suites(), this behavior was resulting in a wild-memory-access bug.
Commit 2810c1e99867 ("kunit: Fix wild-memory-access bug in kunit_free_suite_set()") fixed this issue by running the tests when the module is still in MODULE_STATE_COMING. However, modules in that state are not fully initialized, lacking sysfs kobjects. Therefore, if a test module attempts to register a fake device, it will inevitably crash.
This patch proposes a different approach to fix the original wild-memory-access bug while restoring the normal module execution flow by making kunit_module_exit() able to detect if kunit_module_init() has previously initialized the tests suite set. In this way, test modules can once again register fake devices without crashing.
This behavior is achieved by checking whether mod->kunit_suites is a virtual or direct mapping address. If it is a virtual address, then kunit_module_init() has allocated the suite_set in kunit_filter_suites() using kmalloc_array(). On the contrary, if mod->kunit_suites is still pointing to the original address that was set when looking up the .kunit_test_suites section of the module, then the loading phase has failed and there's no memory to be freed.
v4:
- rebased on 6.8
- noted that kunit_filter_suites() must return a virtual address v3:
- add a comment to clarify why the start address is checked v2:
- add include <linux/mm.h>
--- lib/kunit/executor.c | 4 ++++ lib/kunit/test.c | 14 +++++++++++--- 2 files changed, 15 insertions(+), 3 deletions(-)
lib/kunit/executor.c +4 -0
@@ -144,6 +144,10 @@ void kunit_free_suite_set(struct kunit_suite_set suite_set)kfree (suite_set.start); } +/* +* Filter and reallocate test suites. Must return the filtered test suites set +* allocated at a valid virtual address or NULL in case of error. +*/ struct kunit_suite_set kunit_filter_suites(const struct kunit_suite_set *suite_set, const char *filter_glob,
lib/kunit/test.c +11 -3
@@ -16,6 +16,7 @@#include <linux/panic.h> #include <linux/sched/debug.h> #include <linux/sched.h> +#include <linux/mm.h> #include "debugfs.h" #include "hooks-impl.h"
@@ -807,12 +808,19 @@ static void kunit_module_exit(struct module *mod) };const char *action =kunit_action (); +/* +* Check if the start address is a valid virtual address to detect +* if the module load sequence has failed and the suite set has not +* been initialized and filtered. +*/ +if (!suite_set.start || !virt_addr_valid (suite_set.start)) +return ; +if (!action)__kunit_test_suites_exit (mod->kunit_suites, mod->num_kunit_suites); -if (suite_set.start) -kunit_free_suite_set (suite_set); +kunit_free_suite_set (suite_set); } static int kunit_module_notify(struct notifier_block *nb, unsigned long val,
@@ -822,12 +830,12 @@ static int kunit_module_notify(struct notifier_block *nb, unsigned long val,switch (val) {case MODULE_STATE_LIVE : +kunit_module_init (mod);break ;case MODULE_STATE_GOING :kunit_module_exit (mod);break ;case MODULE_STATE_COMING : -kunit_module_init (mod);break ;case MODULE_STATE_UNFORMED :break ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 266/322 regulator: ti-abb: dont use devm_platform_ioremap_resource_byname for shared interrupt register
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Romain Naour <[email protected]>
[ Upstream commit a67e1f0bd4564b485e0f0c3ed7f6bf17688be268 ]
We can't use devm_platform_ioremap_resource_byname() to remap the interrupt register that can be shared between regulator-abb-{ivahd,dspeve,gpu} drivers instances.
The combined helper introduce a call to devm_request_mem_region() that creates a new busy resource region on PRM_IRQSTATUS_MPU register (0x4ae06010). The first devm_request_mem_region() call succeeds for regulator-abb-ivahd but fails for the two other regulator-abb-dspeve and regulator-abb-gpu.
# cat /proc/iomem | grep -i 4ae06 4ae06010-4ae06013 : 4ae07e34.regulator-abb-ivahd int-address 4ae06014-4ae06017 : 4ae07ddc.regulator-abb-mpu int-address
regulator-abb-dspeve and regulator-abb-gpu are missing due to devm_request_mem_region() failure (EBUSY):
[ 1.326660] ti_abb 4ae07e30.regulator-abb-dspeve: can't request region for resource [mem 0x4ae06010-0x4ae06013] [ 1.326660] ti_abb: probe of 4ae07e30.regulator-abb-dspeve failed with error -16 [ 1.327239] ti_abb 4ae07de4.regulator-abb-gpu: can't request region for resource [mem 0x4ae06010-0x4ae06013] [ 1.327270] ti_abb: probe of 4ae07de4.regulator-abb-gpu failed with error -16
Quoted 1 line
From
arm/boot/dts/dra7.dtsi:
The abb_mpu is the only instance using its own interrupt register:
(0x4ae06014) PRM_IRQSTATUS_MPU_2, ABB_MPU_DONE_ST (bit 7)
The other tree instances (abb_ivahd, abb_dspeve, abb_gpu) share PRM_IRQSTATUS_MPU register (0x4ae06010) but use different bits ABB_IVA_DONE_ST (bit 30), ABB_DSPEVE_DONE_ST( bit 29) and ABB_GPU_DONE_ST (but 28).
The commit b36c6b1887ff ("regulator: ti-abb: Make use of the helper function devm_ioremap related") overlooked the following comment implicitly explaining why devm_ioremap() is used in this case:
/*
* We may have shared interrupt register offsets which are
* write-1-to-clear between domains ensuring exclusivity. */
Fixes and partially reverts commit b36c6b1887ff ("regulator: ti-abb:
Make use of the helper function devm_ioremap related").
Improve the existing comment to avoid further conversion to devm_platform_ioremap_resource_byname().
--- drivers/regulator/ti-abb-regulator.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-)
drivers/regulator/ti-abb-regulator.c +19 -3
@@ -734,9 +734,25 @@ static int ti_abb_probe(struct platform_device *pdev)return PTR_ERR (abb->setup_reg); } - abb->int_base =devm_platform_ioremap_resource_byname (pdev,"int-address" ); -if (IS_ERR (abb->int_base)) -return PTR_ERR (abb->int_base); + pname ="int-address" ; + res =platform_get_resource_byname (pdev,IORESOURCE_MEM , pname); +if (!res) { +dev_err (dev,"Missing '%s' IO resource\n" , pname); +return -ENODEV ; + } +/* +* The MPU interrupt status register (PRM_IRQSTATUS_MPU) is +* shared between regulator-abb-{ivahd,dspeve,gpu} driver +* instances. Therefore use devm_ioremap() rather than +* devm_platform_ioremap_resource_byname() to avoid busy +* resource region conflicts. +*/ + abb->int_base =devm_ioremap (dev, res->start, +resource_size (res)); +if (!abb->int_base) { +dev_err (dev,"Unable to map '%s'\n" , pname); +return -ENOMEM ; + }/* Map Optional resources */ pname ="efuse-address" ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 267/322 scsi: core: Move scsi_host_busy() out of host lock for waking up EH handler
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ming Lei <[email protected]>
[ Upstream commit 4373534a9850627a2695317944898eb1283a2db0 ]
Inside scsi_eh_wakeup(), scsi_host_busy() is called & checked with host lock every time for deciding if error handler kthread needs to be waken up.
This can be too heavy in case of recovery, such as:
- N hardware queues
- queue depth is M for each hardware queue
- each scsi_host_busy() iterates over (N * M) tag/requests
If recovery is triggered in case that all requests are in-flight, each scsi_eh_wakeup() is strictly serialized, when scsi_eh_wakeup() is called for the last in-flight request, scsi_host_busy() has been run for (N * M -
1) times, and request has been iterated for (N*M - 1) * (N * M) times.
If both N and M are big enough, hard lockup can be triggered on acquiring host lock, and it is observed on mpi3mr(128 hw queues, queue depth 8169).
Fix the issue by calling scsi_host_busy() outside the host lock. We don't need the host lock for getting busy count because host the lock never covers that.
[mkp: Drop unnecessary 'busy' variables pointed out by Bart]
--- drivers/scsi/scsi_error.c | 8 ++++---- drivers/scsi/scsi_lib.c | 2 +- drivers/scsi/scsi_priv.h | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-)
drivers/scsi/scsi_error.c +4 -4
@@ -61,11 +61,11 @@ static int scsi_eh_try_stu(struct scsi_cmnd *scmd);static enum scsi_disposition scsi_try_to_abort_cmd (const struct scsi_host_template *,struct scsi_cmnd *); -void scsi_eh_wakeup (struct Scsi_Host *shost) +void scsi_eh_wakeup (struct Scsi_Host *shost,unsigned int busy) {lockdep_assert_held (shost->host_lock); -if (scsi_host_busy (shost) == shost->host_failed) { +if (busy == shost->host_failed) {trace_scsi_eh_wakeup (shost);wake_up_process (shost->ehandler); SCSI_LOG_ERROR_RECOVERY(5, shost_printk(KERN_INFO, shost,
@@ -88,7 +88,7 @@ void scsi_schedule_eh(struct Scsi_Host *shost)if (scsi_host_set_state (shost,SHOST_RECOVERY ) ==0 ||scsi_host_set_state (shost,SHOST_CANCEL_RECOVERY ) ==0 ) { shost->host_eh_scheduled++; -scsi_eh_wakeup (shost); +scsi_eh_wakeup (shost,scsi_host_busy (shost)); }spin_unlock_irqrestore (shost->host_lock, flags);
@@ -286,7 +286,7 @@ static void scsi_eh_inc_host_failed(struct rcu_head *head)spin_lock_irqsave (shost->host_lock, flags); shost->host_failed++; -scsi_eh_wakeup (shost); +scsi_eh_wakeup (shost,scsi_host_busy (shost));spin_unlock_irqrestore (shost->host_lock, flags); }
drivers/scsi/scsi_lib.c +1 -1
@@ -280,7 +280,7 @@ static void scsi_dec_host_busy(struct Scsi_Host *shost, struct scsi_cmnd *cmd)if (unlikely (scsi_host_in_recovery (shost))) {spin_lock_irqsave (shost->host_lock, flags);if (shost->host_failed || shost->host_eh_scheduled) -scsi_eh_wakeup (shost); +scsi_eh_wakeup (shost,scsi_host_busy (shost));spin_unlock_irqrestore (shost->host_lock, flags); }rcu_read_unlock ();
drivers/scsi/scsi_priv.h +1 -1
@@ -92,7 +92,7 @@ extern void scmd_eh_abort_handler(struct work_struct *work);extern enum blk_eh_timer_return scsi_timeout (struct request *req);extern int scsi_error_handler (void *host);extern enum scsi_disposition scsi_decide_disposition (struct scsi_cmnd *cmd); -extern void scsi_eh_wakeup (struct Scsi_Host *shost); +extern void scsi_eh_wakeup (struct Scsi_Host *shost,unsigned int busy);extern void scsi_eh_scmd_add (struct scsi_cmnd *); void scsi_eh_ready_devs(struct Scsi_Host *shost, struct list_head *work_q,
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 268/322 HID: hidraw: fix a problem of memory leak in hidraw_release()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Su Hui <[email protected]>
[ Upstream commit a3bdcdd022c68942a774e8e63424cc11c85aab78 ]
'struct hidraw_list' is a circular queue whose head can be smaller than tail. Using 'list->tail != list->head' to release all memory that should be released.
--- drivers/hid/hidraw.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
drivers/hid/hidraw.c +5 -2
@@ -357,8 +357,11 @@ static int hidraw_release(struct inode * inode, struct file * file)down_write (&minors_rwsem);spin_lock_irqsave (&hidraw_table[minor]->list_lock, flags); -for (int i = list->tail; i < list->head; i++) -kfree (list->buffer[i].value); +while (list->tail != list->head) { +kfree (list->buffer[list->tail].value); + list->buffer[list->tail].value =NULL ; + list->tail = (list->tail +1 ) & (HIDRAW_BUFFER_SIZE -1 ); + }list_del (&list->node);spin_unlock_irqrestore (&hidraw_table[minor]->list_lock, flags);kfree (list);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 269/322 selftests: net: remove dependency on ebpf tests
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Abeni <[email protected]>
[ Upstream commit 98cb12eb52a780e682bea8372fdb2912c08132dd ]
Several net tests requires an XDP program build under the ebpf directory, and error out if such program is not available.
That makes running successful net test hard, let's duplicate into the net dir the [very small] program, re-using the existing rules to build it, and finally dropping the bogus dependency.
Stable-dep-of: 4acffb66630a ("selftests: net: explicitly wait for listener ready")
--- tools/testing/selftests/net/Makefile | 5 +++-- tools/testing/selftests/net/udpgro.sh | 4 ++-- tools/testing/selftests/net/udpgro_bench.sh | 4 ++-- tools/testing/selftests/net/udpgro_frglist.sh | 6 +++--- tools/testing/selftests/net/udpgro_fwd.sh | 2 +- tools/testing/selftests/net/veth.sh | 4 ++-- tools/testing/selftests/net/xdp_dummy.c | 13 +++++++++++++ 7 files changed, 26 insertions(+), 12 deletions(-) create mode 100644 tools/testing/selftests/net/xdp_dummy.c
tools/testing/selftests/net/Makefile +3 -2
@@ -84,6 +84,7 @@ TEST_PROGS += sctp_vrf.sh TEST_GEN_FILES += sctp_hello TEST_GEN_FILES += csum TEST_GEN_FILES += nat6to4.o +TEST_GEN_FILES += xdp_dummy.o TEST_GEN_FILES += ip_local_port_range TEST_GEN_FILES += bind_wildcard TEST_PROGS += test_vxlan_mdb.sh
@@ -100,7 +101,7 @@ $(OUTPUT)/tcp_mmap: LDLIBS += -lpthread -lcrypto $(OUTPUT)/tcp_inq: LDLIBS += -lpthread $(OUTPUT)/bind_bhash: LDLIBS += -lpthread -# Rules to generate bpf obj nat6to4.o +# Rules to generate bpf objs CLANG ?= clang SCRATCH_DIR := $(OUTPUT)/tools BUILD_DIR := $(SCRATCH_DIR)/build
@@ -135,7 +136,7 @@ endif CLANG_SYS_INCLUDES = $(call get_sys_includes,$(CLANG),$(CLANG_TARGET_ARCH)) -$(OUTPUT)/nat6to4.o: nat6to4.c $(BPFOBJ) | $(MAKE_DIRS) +$(OUTPUT)/nat6to4.o $(OUTPUT)/xdp_dummy.o: $(OUTPUT)/%.o : %.c $(BPFOBJ) | $(MAKE_DIRS) $(CLANG) -O2 --target=bpf -c $< $(CCINCLUDE) $(CLANG_SYS_INCLUDES) -o $@ $(BPFOBJ): $(wildcard $(BPFDIR)/*.[ch] $(BPFDIR)/Makefile) \
tools/testing/selftests/net/udpgro.sh +2 -2
@@ -5,7 +5,7 @@ readonly PEER_NS="ns-peer-$(mktemp -u XXXXXX)" -BPF_FILE="../bpf/xdp_dummy.bpf.o" +BPF_FILE="xdp_dummy.o" # set global exit status, but never reset nonzero one. check_err()
@@ -198,7 +198,7 @@ run_all() { } if [ ! -f ${BPF_FILE} ]; then - echo "Missing ${BPF_FILE}. Build bpf selftest first" + echo "Missing ${BPF_FILE}. Run 'make' first" exit -1 fi
tools/testing/selftests/net/udpgro_bench.sh +2 -2
@@ -5,7 +5,7 @@ readonly PEER_NS="ns-peer-$(mktemp -u XXXXXX)" -BPF_FILE="../bpf/xdp_dummy.bpf.o" +BPF_FILE="xdp_dummy.o" cleanup() { local -r jobs="$(jobs -p)"
@@ -83,7 +83,7 @@ run_all() { } if [ ! -f ${BPF_FILE} ]; then - echo "Missing ${BPF_FILE}. Build bpf selftest first" + echo "Missing ${BPF_FILE}. Run 'make' first" exit -1 fi
tools/testing/selftests/net/udpgro_frglist.sh +3 -3
@@ -5,7 +5,7 @@ readonly PEER_NS="ns-peer-$(mktemp -u XXXXXX)" -BPF_FILE="../bpf/xdp_dummy.bpf.o" +BPF_FILE="xdp_dummy.o" cleanup() { local -r jobs="$(jobs -p)"
@@ -84,12 +84,12 @@ run_all() { } if [ ! -f ${BPF_FILE} ]; then - echo "Missing ${BPF_FILE}. Build bpf selftest first" + echo "Missing ${BPF_FILE}. Run 'make' first" exit -1 fi if [ ! -f nat6to4.o ]; then - echo "Missing nat6to4 helper. Build bpf nat6to4.o selftest first" + echo "Missing nat6to4 helper. Run 'make' first" exit -1 fi
tools/testing/selftests/net/udpgro_fwd.sh +1 -1
@@ -1,7 +1,7 @@ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 -BPF_FILE="../bpf/xdp_dummy.bpf.o" +BPF_FILE="xdp_dummy.o" readonly BASE="ns-$(mktemp -u XXXXXX)" readonly SRC=2 readonly DST=1
tools/testing/selftests/net/veth.sh +2 -2
@@ -1,7 +1,7 @@ #!/bin/sh # SPDX-License-Identifier: GPL-2.0 -BPF_FILE="../bpf/xdp_dummy.bpf.o" +BPF_FILE="xdp_dummy.o" readonly STATS="$(mktemp -p /tmp ns-XXXXXX)" readonly BASE=`basename $STATS` readonly SRC=2
@@ -218,7 +218,7 @@ while getopts "hs:" option; do done if [ ! -f ${BPF_FILE} ]; then - echo "Missing ${BPF_FILE}. Build bpf selftest first" + echo "Missing ${BPF_FILE}. Run 'make' first" exit 1 fi
tools/testing/selftests/net/xdp_dummy.c new file +13 -0
@@ -0,0 +1,13 @@ +// SPDX-License-Identifier: GPL-2.0 + +#define KBUILD_MODNAME "xdp_dummy" +#include <linux/bpf.h> +#include <bpf/bpf_helpers.h> + +SEC("xdp") +int xdp_dummy_prog (struct xdp_md *ctx) +{ +return XDP_PASS ; +} + +char _license[] SEC("license") = "GPL";
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 270/322 selftests: net: explicitly wait for listener ready
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Abeni <[email protected]>
[ Upstream commit 4acffb66630a0e4800880baa61a54ef18047ccd3 ]
The UDP GRO forwarding test still hard-code an arbitrary pause to wait for the UDP listener becoming ready in background.
That causes sporadic failures depending on the host load.
Replace the sleep with the existing helper waiting for the desired port being exposed.
--- tools/testing/selftests/net/udpgro_fwd.sh | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
tools/testing/selftests/net/udpgro_fwd.sh +4 -2
@@ -1,6 +1,8 @@ #!/bin/bash # SPDX-License-Identifier: GPL-2.0 +source net_helper.sh + BPF_FILE="xdp_dummy.o" readonly BASE="ns-$(mktemp -u XXXXXX)" readonly SRC=2
@@ -119,7 +121,7 @@ run_test() { ip netns exec $NS_DST $ipt -A INPUT -p udp --dport 8000 ip netns exec $NS_DST ./udpgso_bench_rx -C 1000 -R 10 -n 10 -l 1300 $rx_args & local spid=$! - sleep 0.1 + wait_local_port_listen "$NS_DST" 8000 udp ip netns exec $NS_SRC ./udpgso_bench_tx $family -M 1 -s 13000 -S 1300 -D $dst local retc=$? wait $spid
@@ -168,7 +170,7 @@ run_bench() { ip netns exec $NS_DST bash -c "echo 2 > /sys/class/net/veth$DST/queues/rx-0/rps_cpus" ip netns exec $NS_DST taskset 0x2 ./udpgso_bench_rx -C 1000 -R 10 & local spid=$! - sleep 0.1 + wait_local_port_listen "$NS_DST" 8000 udp ip netns exec $NS_SRC taskset 0x1 ./udpgso_bench_tx $family -l 3 -S 1300 -D $dst local retc=$? wait $spid
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 271/322 gve: Fix skb truesize underestimation
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Praveen Kaligineedi <[email protected]>
[ Upstream commit 534326711000c318fe1523c77308450522baa499 ]
For a skb frag with a newly allocated copy page, the true size is incorrectly set to packet buffer size. It should be set to PAGE_SIZE instead.
--- drivers/net/ethernet/google/gve/gve_rx.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/net/ethernet/google/gve/gve_rx.c +4 -4
@@ -362,7 +362,7 @@ static enum pkt_hash_types gve_rss_type(__be16 pkt_flags)static struct sk_buff *gve_rx_add_frags (struct napi_struct *napi,struct gve_rx_slot_page_info *page_info, -u16 packet_buffer_size,u16 len, +unsigned int truesize,u16 len,struct gve_rx_ctx *ctx) {u32 offset = page_info->page_offset + page_info->pad;
@@ -395,10 +395,10 @@ static struct sk_buff *gve_rx_add_frags(struct napi_struct *napi,if (skb != ctx->skb_head) { ctx->skb_head->len += len; ctx->skb_head->data_len += len; - ctx->skb_head->truesize += packet_buffer_size; + ctx->skb_head->truesize += truesize; }skb_add_rx_frag (skb, num_frags, page_info->page, - offset, len, packet_buffer_size); + offset, len, truesize);return ctx->skb_head; }
@@ -492,7 +492,7 @@ static struct sk_buff *gve_rx_copy_to_pool(struct gve_rx_ring *rx,memcpy (alloc_page_info.page_address, src, page_info->pad + len); skb =gve_rx_add_frags (napi, &alloc_page_info, - rx->packet_buffer_size, +PAGE_SIZE , len, ctx);u64_stats_update_begin (&rx->statss);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 272/322 net: ethernet: mtk_eth_soc: set DMA coherent mask to get PPE working
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Golle <[email protected]>
[ Upstream commit cae1f1c36661f28c92a1db9113961a9ebd61dbaa ]
Set DMA coherent mask to 32-bit which makes PPE offloading engine start working on BPi-R4 which got 4 GiB of RAM.
--- drivers/net/ethernet/mediatek/mtk_eth_soc.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/net/ethernet/mediatek/mtk_eth_soc.c +4 -1
@@ -4757,7 +4757,10 @@ static int mtk_probe(struct platform_device *pdev) }if (MTK_HAS_CAPS (eth->soc->caps,MTK_36BIT_DMA )) { - err =dma_set_mask_and_coherent (&pdev->dev,DMA_BIT_MASK (36 )); + err =dma_set_mask (&pdev->dev,DMA_BIT_MASK (36 )); +if (!err) + err =dma_set_coherent_mask (&pdev->dev,DMA_BIT_MASK (32 )); +if (err) {dev_err (&pdev->dev,"Wrong DMA config\n" );return -EINVAL ;
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 273/322 net: phy: mediatek-ge-soc: sync driver with MediaTek SDK
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Golle <[email protected]>
[ Upstream commit ff63cc2e95065bea978d2db01f7e7356cca3d021 ]
Sync initialization and calibration routines with MediaTek's reference driver. Improves compliance and resolves link stability issues with CH340 IoT devices connected to MT798x built-in PHYs.
--- drivers/net/phy/mediatek-ge-soc.c | 147 ++++++++++++++++-------------- 1 file changed, 81 insertions(+), 66 deletions(-)
drivers/net/phy/mediatek-ge-soc.c +81 -66
@@ -489,7 +489,7 @@ static int tx_r50_fill_result(struct phy_device *phydev, u16 tx_r50_cal_val,u16 reg, val;if (phydev->drv->phy_id ==MTK_GPHY_ID_MT7988 ) - bias =-2 ; + bias =-1 ; val =clamp_val (bias + tx_r50_cal_val,0 ,63 );
@@ -705,6 +705,11 @@ static int tx_vcm_cal_sw(struct phy_device *phydev, u8 rg_txreserve_x)static void mt798x_phy_common_finetune (struct phy_device *phydev) {phy_select_page (phydev,MTK_PHY_PAGE_EXTENDED_52B5 ); +/* SlvDSPreadyTime = 24, MasDSPreadyTime = 24 */ +__phy_write (phydev,0x11 ,0xc71 ); +__phy_write (phydev,0x12 ,0xc ); +__phy_write (phydev,0x10 ,0x8fae ); +/* EnabRandUpdTrig = 1 */ __phy_write (phydev,0x11 ,0x2f00 );__phy_write (phydev,0x12 ,0xe );
@@ -715,15 +720,56 @@ static void mt798x_phy_common_finetune(struct phy_device *phydev)__phy_write (phydev,0x12 ,0x0 );__phy_write (phydev,0x10 ,0x83aa ); -/* TrFreeze = 0 */ +/* FfeUpdGainForce = 1(Enable), FfeUpdGainForceVal = 4 */ +__phy_write (phydev,0x11 ,0x240 ); +__phy_write (phydev,0x12 ,0x0 ); +__phy_write (phydev,0x10 ,0x9680 ); + +/* TrFreeze = 0 (mt7988 default) */ __phy_write (phydev,0x11 ,0x0 );__phy_write (phydev,0x12 ,0x0 );__phy_write (phydev,0x10 ,0x9686 ); +/* SSTrKp100 = 5 */ +/* SSTrKf100 = 6 */ +/* SSTrKp1000Mas = 5 */ +/* SSTrKf1000Mas = 6 */ /* SSTrKp1000Slv = 5 */ +/* SSTrKf1000Slv = 6 */ __phy_write (phydev,0x11 ,0xbaef );__phy_write (phydev,0x12 ,0x2e );__phy_write (phydev,0x10 ,0x968c ); +phy_restore_page (phydev,MTK_PHY_PAGE_STANDARD ,0 ); +} + +static void mt7981_phy_finetune (struct phy_device *phydev) +{ +u16 val[8 ] = {0x01ce ,0x01c1 , +0x020f ,0x0202 , +0x03d0 ,0x03c0 , +0x0013 ,0x0005 }; +int i, k; + +/* 100M eye finetune: +* Keep middle level of TX MLT3 shapper as default. +* Only change TX MLT3 overshoot level here. +*/ +for (k =0 , i =1 ; i <12 ; i++) { +if (i %3 ==0 ) +continue ; +phy_write_mmd (phydev,MDIO_MMD_VEND1 , i, val[k++]); + } + +phy_select_page (phydev,MTK_PHY_PAGE_EXTENDED_52B5 ); +/* ResetSyncOffset = 6 */ +__phy_write (phydev,0x11 ,0x600 ); +__phy_write (phydev,0x12 ,0x0 ); +__phy_write (phydev,0x10 ,0x8fc0 ); + +/* VgaDecRate = 1 */ +__phy_write (phydev,0x11 ,0x4c2a ); +__phy_write (phydev,0x12 ,0x3e ); +__phy_write (phydev,0x10 ,0x8fa4 );/* MrvlTrFix100Kp = 3, MrvlTrFix100Kf = 2, * MrvlTrFix1000Kp = 3, MrvlTrFix1000Kf = 2
@@ -738,7 +784,7 @@ static void mt798x_phy_common_finetune(struct phy_device *phydev)__phy_write (phydev,0x10 ,0x8ec0 );phy_restore_page (phydev,MTK_PHY_PAGE_STANDARD ,0 ); -/* TR_OPEN_LOOP_EN = 1, lpf_x_average = 9*/ +/* TR_OPEN_LOOP_EN = 1, lpf_x_average = 9 */ phy_modify_mmd (phydev,MDIO_MMD_VEND1 ,MTK_PHY_RG_DEV1E_REG234 ,MTK_PHY_TR_OPEN_LOOP_EN_MASK |MTK_PHY_LPF_X_AVERAGE_MASK ,BIT (0 ) |FIELD_PREP (MTK_PHY_LPF_X_AVERAGE_MASK ,0x9 ));
@@ -771,48 +817,6 @@ static void mt798x_phy_common_finetune(struct phy_device *phydev)phy_write_mmd (phydev,MDIO_MMD_VEND1 ,MTK_PHY_LDO_OUTPUT_V ,0x2222 ); } -static void mt7981_phy_finetune (struct phy_device *phydev) -{ -u16 val[8 ] = {0x01ce ,0x01c1 , -0x020f ,0x0202 , -0x03d0 ,0x03c0 , -0x0013 ,0x0005 }; -int i, k; - -/* 100M eye finetune: -* Keep middle level of TX MLT3 shapper as default. -* Only change TX MLT3 overshoot level here. -*/ -for (k =0 , i =1 ; i <12 ; i++) { -if (i %3 ==0 ) -continue ; -phy_write_mmd (phydev,MDIO_MMD_VEND1 , i, val[k++]); - } - -phy_select_page (phydev,MTK_PHY_PAGE_EXTENDED_52B5 ); -/* SlvDSPreadyTime = 24, MasDSPreadyTime = 24 */ -__phy_write (phydev,0x11 ,0xc71 ); -__phy_write (phydev,0x12 ,0xc ); -__phy_write (phydev,0x10 ,0x8fae ); - -/* ResetSyncOffset = 6 */ -__phy_write (phydev,0x11 ,0x600 ); -__phy_write (phydev,0x12 ,0x0 ); -__phy_write (phydev,0x10 ,0x8fc0 ); - -/* VgaDecRate = 1 */ -__phy_write (phydev,0x11 ,0x4c2a ); -__phy_write (phydev,0x12 ,0x3e ); -__phy_write (phydev,0x10 ,0x8fa4 ); - -/* FfeUpdGainForce = 4 */ -__phy_write (phydev,0x11 ,0x240 ); -__phy_write (phydev,0x12 ,0x0 ); -__phy_write (phydev,0x10 ,0x9680 ); - -phy_restore_page (phydev,MTK_PHY_PAGE_STANDARD ,0 ); -} -static void mt7988_phy_finetune (struct phy_device *phydev) {u16 val[12 ] = {0x0187 ,0x01cd ,0x01c8 ,0x0182 ,
@@ -827,17 +831,7 @@ static void mt7988_phy_finetune(struct phy_device *phydev)/* TCT finetune */ phy_write_mmd (phydev,MDIO_MMD_VEND1 ,MTK_PHY_RG_TX_FILTER ,0x5 ); -/* Disable TX power saving */ -phy_modify_mmd (phydev,MDIO_MMD_VEND1 ,MTK_PHY_RXADC_CTRL_RG7 , -MTK_PHY_DA_AD_BUF_BIAS_LP_MASK ,0x3 <<8 ); -phy_select_page (phydev,MTK_PHY_PAGE_EXTENDED_52B5 ); - -/* SlvDSPreadyTime = 24, MasDSPreadyTime = 12 */ -__phy_write (phydev,0x11 ,0x671 ); -__phy_write (phydev,0x12 ,0xc ); -__phy_write (phydev,0x10 ,0x8fae ); -/* ResetSyncOffset = 5 */ __phy_write (phydev,0x11 ,0x500 );__phy_write (phydev,0x12 ,0x0 );
@@ -845,13 +839,27 @@ static void mt7988_phy_finetune(struct phy_device *phydev)/* VgaDecRate is 1 at default on mt7988 */ -phy_restore_page (phydev,MTK_PHY_PAGE_STANDARD ,0 ); +/* MrvlTrFix100Kp = 6, MrvlTrFix100Kf = 7, +* MrvlTrFix1000Kp = 6, MrvlTrFix1000Kf = 7 +*/ +__phy_write (phydev,0x11 ,0xb90a ); +__phy_write (phydev,0x12 ,0x6f ); +__phy_write (phydev,0x10 ,0x8f82 ); + +/* RemAckCntLimitCtrl = 1 */ +__phy_write (phydev,0x11 ,0xfbba ); +__phy_write (phydev,0x12 ,0xc3 ); +__phy_write (phydev,0x10 ,0x87f8 ); -phy_select_page (phydev,MTK_PHY_PAGE_EXTENDED_2A30 ); -/* TxClkOffset = 2 */ -__phy_modify (phydev,MTK_PHY_ANARG_RG ,MTK_PHY_TCLKOFFSET_MASK , -FIELD_PREP (MTK_PHY_TCLKOFFSET_MASK ,0x2 ));phy_restore_page (phydev,MTK_PHY_PAGE_STANDARD ,0 ); + +/* TR_OPEN_LOOP_EN = 1, lpf_x_average = 10 */ +phy_modify_mmd (phydev,MDIO_MMD_VEND1 ,MTK_PHY_RG_DEV1E_REG234 , +MTK_PHY_TR_OPEN_LOOP_EN_MASK |MTK_PHY_LPF_X_AVERAGE_MASK , +BIT (0 ) |FIELD_PREP (MTK_PHY_LPF_X_AVERAGE_MASK ,0xa )); + +/* rg_tr_lpf_cnt_val = 1023 */ +phy_write_mmd (phydev,MDIO_MMD_VEND1 ,MTK_PHY_RG_LPF_CNT_VAL ,0x3ff ); }static void mt798x_phy_eee (struct phy_device *phydev)
@@ -884,11 +892,11 @@ static void mt798x_phy_eee(struct phy_device *phydev)MTK_PHY_LPI_SLV_SEND_TX_EN , FIELD_PREP(MTK_PHY_LPI_SLV_SEND_TX_TIMER_MASK, 0x120)); -phy_modify_mmd (phydev,MDIO_MMD_VEND1 ,MTK_PHY_RG_DEV1E_REG239 , -MTK_PHY_LPI_SEND_LOC_TIMER_MASK | -MTK_PHY_LPI_TXPCS_LOC_RCV , -FIELD_PREP (MTK_PHY_LPI_SEND_LOC_TIMER_MASK ,0x117 )); +/* Keep MTK_PHY_LPI_SEND_LOC_TIMER as 375 */ +phy_clear_bits_mmd (phydev,MDIO_MMD_VEND1 ,MTK_PHY_RG_DEV1E_REG239 , +MTK_PHY_LPI_TXPCS_LOC_RCV ); +/* This also fixes some IoT issues, such as CH340 */ phy_modify_mmd(phydev, MDIO_MMD_VEND1, MTK_PHY_RG_DEV1E_REG2C7, MTK_PHY_MAX_GAIN_MASK | MTK_PHY_MIN_GAIN_MASK, FIELD_PREP(MTK_PHY_MAX_GAIN_MASK, 0x8) |
@@ -922,7 +930,7 @@ static void mt798x_phy_eee(struct phy_device *phydev)__phy_write (phydev,0x12 ,0x0 );__phy_write (phydev,0x10 ,0x9690 ); -/* REG_EEE_st2TrKf1000 = 3 */ +/* REG_EEE_st2TrKf1000 = 2 */ __phy_write (phydev,0x11 ,0x114f );__phy_write (phydev,0x12 ,0x2 );__phy_write (phydev,0x10 ,0x969a );
@@ -947,7 +955,7 @@ static void mt798x_phy_eee(struct phy_device *phydev)__phy_write (phydev,0x12 ,0x0 );__phy_write (phydev,0x10 ,0x96b8 ); -/* REGEEE_wake_slv_tr_wait_dfesigdet_en = 1 */ +/* REGEEE_wake_slv_tr_wait_dfesigdet_en = 0 */ __phy_write (phydev,0x11 ,0x1463 );__phy_write (phydev,0x12 ,0x0 );__phy_write (phydev,0x10 ,0x96ca );
@@ -1459,6 +1467,13 @@ static int mt7988_phy_probe(struct phy_device *phydev)if (err)return err; +/* Disable TX power saving at probing to: +* 1. Meet common mode compliance test criteria +* 2. Make sure that TX-VCM calibration works fine +*/ +phy_modify_mmd (phydev,MDIO_MMD_VEND1 ,MTK_PHY_RXADC_CTRL_RG7 , +MTK_PHY_DA_AD_BUF_BIAS_LP_MASK ,0x3 <<8 ); +return mt798x_phy_calibration (phydev); }
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 274/322 selftests: net: add missing config for big tcp tests
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Abeni <[email protected]>
[ Upstream commit fcf67d82b8b878bdd95145382be43927bce07ec6 ]
The big_tcp test-case requires a few kernel knobs currently not specified in the net selftests config, causing the following failure:
# selftests: net: big_tcp.sh
# Error: Failed to load TC action module.
# We have an error talking to the kernel
...
# Testing for BIG TCP:
# CLI GSO | GW GRO | GW GSO | SER GRO
# ./big_tcp.sh: line 107: test: !=: unary operator expected
...
# on on on on : [FAIL_on_link1]
Add the missing configs
--- tools/testing/selftests/net/config | 5 +++++ 1 file changed, 5 insertions(+)
tools/testing/selftests/net/config +5 -0
@@ -29,7 +29,9 @@ CONFIG_NF_NAT=m CONFIG_IP6_NF_IPTABLES=m CONFIG_IP_NF_IPTABLES=m CONFIG_IP6_NF_NAT=m +CONFIG_IP6_NF_RAW=m CONFIG_IP_NF_NAT=m +CONFIG_IP_NF_RAW=m CONFIG_IPV6_GRE=m CONFIG_IPV6_SEG6_LWTUNNEL=y CONFIG_L2TP_ETH=m
@@ -45,6 +47,8 @@ CONFIG_NF_TABLES=m CONFIG_NF_TABLES_IPV6=y CONFIG_NF_TABLES_IPV4=y CONFIG_NFT_NAT=m +CONFIG_NETFILTER_XT_MATCH_LENGTH=m +CONFIG_NET_ACT_CT=m CONFIG_NET_ACT_GACT=m CONFIG_NET_CLS_BASIC=m CONFIG_NET_CLS_U32=m
@@ -55,6 +59,7 @@ CONFIG_NET_SCH_HTB=m CONFIG_NET_SCH_FQ=m CONFIG_NET_SCH_ETF=m CONFIG_NET_SCH_NETEM=y +CONFIG_NF_FLOW_TABLE=m CONFIG_PSAMPLE=m CONFIG_TCP_MD5SIG=y CONFIG_TEST_BLACKHOLE_DEV=m
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 275/322 selftests: net: add missing required classifier
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Abeni <[email protected]>
[ Upstream commit d3cb3b0088ca92082e2bebc40cc6894a632173e2 ]
the udpgro_fraglist self-test uses the BPF classifiers, but the current net self-test configuration does not include it, causing CI failures:
# selftests: net: udpgro_frglist.sh
# ipv6 # tcp - over veth touching data # -l 4 -6 -D 2001:db8::1 -t rx -4 -t # Error: TC classifier not found. # We have an error talking to the kernel # Error: TC classifier not found. # We have an error talking to the kernel
Add the missing knob.
--- tools/testing/selftests/net/config | 1 + 1 file changed, 1 insertion(+)
tools/testing/selftests/net/config +1 -0
@@ -51,6 +51,7 @@ CONFIG_NETFILTER_XT_MATCH_LENGTH=m CONFIG_NET_ACT_CT=m CONFIG_NET_ACT_GACT=m CONFIG_NET_CLS_BASIC=m +CONFIG_NET_CLS_BPF=m CONFIG_NET_CLS_U32=m CONFIG_NET_IPGRE_DEMUX=m CONFIG_NET_IPGRE=m
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 276/322 selftests: net: give more time for GRO aggregation
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Abeni <[email protected]>
[ Upstream commit 89abe628375301fedb68770644df845d49018d8b ]
The gro.sh test-case relay on the gro_flush_timeout to ensure that all the segments belonging to any given batch are properly aggregated.
The other end, the sender is a user-space program transmitting each packet with a separate write syscall. A busy host and/or stracing the sender program can make the relevant segments reach the GRO engine after the flush timeout triggers.
Give the GRO flush timeout more slack, to avoid sporadic self-tests failures.
--- tools/testing/selftests/net/setup_veth.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/net/setup_veth.sh +1 -1
@@ -8,7 +8,7 @@ setup_veth_ns() { local -r ns_mac="$4" [[ -e /var/run/netns/"${ns_name}" ]] || ip netns add "${ns_name}" - echo 100000 > "/sys/class/net/${ns_dev}/gro_flush_timeout" + echo 1000000 > "/sys/class/net/${ns_dev}/gro_flush_timeout" ip link set dev "${ns_dev}" netns "${ns_name}" mtu 65535 ip -netns "${ns_name}" link set dev "${ns_dev}" up
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 277/322 ip6_tunnel: make sure to pull inner header in __ip6_tnl_rcv()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 8d975c15c0cd744000ca386247432d57b21f9df0 ]
syzbot found __ip6_tnl_rcv() could access unitiliazed data [1].
Call pskb_inet_may_pull() to fix this, and initialize ipv6h variable after this call as it can change skb->head.
[1]
BUG: KMSAN: uninit-value in __INET_ECN_decapsulate include/net/inet_ecn.h:253 [inline] BUG: KMSAN: uninit-value in INET_ECN_decapsulate include/net/inet_ecn.h:275 [inline] BUG: KMSAN: uninit-value in IP6_ECN_decapsulate+0x7df/0x1e50 include/net/inet_ecn.h:321 __INET_ECN_decapsulate include/net/inet_ecn.h:253 [inline] INET_ECN_decapsulate include/net/inet_ecn.h:275 [inline] IP6_ECN_decapsulate+0x7df/0x1e50 include/net/inet_ecn.h:321 ip6ip6_dscp_ecn_decapsulate+0x178/0x1b0 net/ipv6/ip6_tunnel.c:727 __ip6_tnl_rcv+0xd4e/0x1590 net/ipv6/ip6_tunnel.c:845 ip6_tnl_rcv+0xce/0x100 net/ipv6/ip6_tunnel.c:888 gre_rcv+0x143f/0x1870 ip6_protocol_deliver_rcu+0xda6/0x2a60 net/ipv6/ip6_input.c:438 ip6_input_finish net/ipv6/ip6_input.c:483 [inline] NF_HOOK include/linux/netfilter.h:314 [inline] ip6_input+0x15d/0x430 net/ipv6/ip6_input.c:492 ip6_mc_input+0xa7e/0xc80 net/ipv6/ip6_input.c:586 dst_input include/net/dst.h:461 [inline] ip6_rcv_finish+0x5db/0x870 net/ipv6/ip6_input.c:79 NF_HOOK include/linux/netfilter.h:314 [inline] ipv6_rcv+0xda/0x390 net/ipv6/ip6_input.c:310 __netif_receive_skb_one_core net/core/dev.c:5532 [inline] __netif_receive_skb+0x1a6/0x5a0 net/core/dev.c:5646 netif_receive_skb_internal net/core/dev.c:5732 [inline] netif_receive_skb+0x58/0x660 net/core/dev.c:5791 tun_rx_batched+0x3ee/0x980 drivers/net/tun.c:1555 tun_get_user+0x53af/0x66d0 drivers/net/tun.c:2002 tun_chr_write_iter+0x3af/0x5d0 drivers/net/tun.c:2048 call_write_iter include/linux/fs.h:2084 [inline] new_sync_write fs/read_write.c:497 [inline] vfs_write+0x786/0x1200 fs/read_write.c:590 ksys_write+0x20f/0x4c0 fs/read_write.c:643 __do_sys_write fs/read_write.c:655 [inline] __se_sys_write fs/read_write.c:652 [inline] __x64_sys_write+0x93/0xd0 fs/read_write.c:652 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0x6d/0x140 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x63/0x6b
Uninit was created at:
slab_post_alloc_hook+0x129/0xa70 mm/slab.h:768 slab_alloc_node mm/slub.c:3478 [inline] kmem_cache_alloc_node+0x5e9/0xb10 mm/slub.c:3523 kmalloc_reserve+0x13d/0x4a0 net/core/skbuff.c:560 __alloc_skb+0x318/0x740 net/core/skbuff.c:651 alloc_skb include/linux/skbuff.h:1286 [inline] alloc_skb_with_frags+0xc8/0xbd0 net/core/skbuff.c:6334 sock_alloc_send_pskb+0xa80/0xbf0 net/core/sock.c:2787 tun_alloc_skb drivers/net/tun.c:1531 [inline] tun_get_user+0x1e8a/0x66d0 drivers/net/tun.c:1846 tun_chr_write_iter+0x3af/0x5d0 drivers/net/tun.c:2048 call_write_iter include/linux/fs.h:2084 [inline] new_sync_write fs/read_write.c:497 [inline] vfs_write+0x786/0x1200 fs/read_write.c:590 ksys_write+0x20f/0x4c0 fs/read_write.c:643 __do_sys_write fs/read_write.c:655 [inline] __se_sys_write fs/read_write.c:652 [inline] __x64_sys_write+0x93/0xd0 fs/read_write.c:652 do_syscall_x64 arch/x86/entry/common.c:52 [inline] do_syscall_64+0x6d/0x140 arch/x86/entry/common.c:83 entry_SYSCALL_64_after_hwframe+0x63/0x6b CPU: 0 PID: 5034 Comm: syz-executor331 Not tainted 6.7.0-syzkaller-00562-g9f8413c4a66f #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 11/17/2023
--- net/ipv6/ip6_tunnel.c | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-)
net/ipv6/ip6_tunnel.c +18 -3
@@ -796,8 +796,8 @@ static int __ip6_tnl_rcv(struct ip6_tnl *tunnel, struct sk_buff *skb, struct sk_buff *skb), bool log_ecn_err) { -const struct ipv6hdr *ipv6h =ipv6_hdr (skb); -int err; +const struct ipv6hdr *ipv6h; +int nh, err; if ((!(tpi->flags & TUNNEL_CSUM) && (tunnel->parms.i_flags & TUNNEL_CSUM)) ||
@@ -829,7 +829,6 @@ static int __ip6_tnl_rcv(struct ip6_tnl *tunnel, struct sk_buff *skb, goto drop; } - ipv6h =ipv6_hdr (skb); skb->protocol =eth_type_trans (skb, tunnel->dev);skb_postpull_rcsum (skb,eth_hdr (skb),ETH_HLEN ); }else {
@@ -837,7 +836,23 @@ static int __ip6_tnl_rcv(struct ip6_tnl *tunnel, struct sk_buff *skb,skb_reset_mac_header (skb); } +/* Save offset of outer header relative to skb->head, +* because we are going to reset the network header to the inner header +* and might change skb->head. +*/ + nh =skb_network_header (skb) - skb->head; +skb_reset_network_header (skb); + +if (!pskb_inet_may_pull (skb)) { +DEV_STATS_INC (tunnel->dev, rx_length_errors); +DEV_STATS_INC (tunnel->dev, rx_errors); + goto drop; + } + +/* Get the outer header. */ + ipv6h = (struct ipv6hdr *)(skb->head + nh); +memset (skb->cb,0 ,sizeof (struct inet6_skb_parm ));__skb_tunnel_rx (skb, tunnel->dev, tunnel->net);
Signature · 1 line
2.43.0
Greg Kroah-Hartman
maintainerPATCH 278/322 net: dsa: mt7530: fix 10M/100M speed on MT7988 switch
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Golle <[email protected]>
[ Upstream commit dfa988b4c7c3a48bde7c2713308920c7741fff29 ]
Setup PMCR port register for actual speed and duplex on internally connected PHYs of the MT7988 built-in switch. This fixes links with speeds other than 1000M.
--- drivers/net/dsa/mt7530.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/net/dsa/mt7530.c +1 -2
@@ -2848,8 +2848,7 @@ static void mt753x_phylink_mac_link_up(struct dsa_switch *ds, int port,/* MT753x MAC works in 1G full duplex mode for all up-clocked * variants. */ -if (interface ==PHY_INTERFACE_MODE_INTERNAL || - interface ==PHY_INTERFACE_MODE_TRGMII || +if (interface ==PHY_INTERFACE_MODE_TRGMII || (phy_interface_mode_is_8023z (interface))) { speed =SPEED_1000 ; duplex =DUPLEX_FULL ;
Signature · 1 line
2.43.0