Merge tag 'drm-intel-next-fixes-2022-05-24' of git://anongit.freedesktop.org/drm...
authorDave Airlie <airlied@redhat.com>
Wed, 25 May 2022 02:03:40 +0000 (12:03 +1000)
committerDave Airlie <airlied@redhat.com>
Wed, 25 May 2022 02:03:41 +0000 (12:03 +1000)
drm/i915 fixes for v5.19 merge window:
- Build, sparse, UB, and CFI fixes
- Variable scope fix
- Audio pipe logging fix
- ICL+ DSI NULL dereference fix

Signed-off-by: Dave Airlie <airlied@redhat.com>
From: Jani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/87sfozuj44.fsf@intel.com
drivers/gpu/drm/i915/display/intel_audio.c
drivers/gpu/drm/i915/display/intel_display_power.c
drivers/gpu/drm/i915/display/intel_dsi_vbt.c
drivers/gpu/drm/i915/gt/intel_gt_sysfs_pm.c
drivers/gpu/drm/i915/gt/uc/abi/guc_actions_abi.h
drivers/gpu/drm/i915/gt/uc/abi/guc_communication_ctb_abi.h
drivers/gpu/drm/i915/gt/uc/abi/guc_messages_abi.h
drivers/gpu/drm/i915/gt/uc/intel_guc_reg.h
drivers/gpu/drm/i915/i915_perf.c
drivers/gpu/drm/i915/i915_perf_types.h
drivers/gpu/drm/i915/i915_reg.h

index 1c87bf6..f0f0dfc 100644 (file)
@@ -827,7 +827,7 @@ void intel_audio_codec_enable(struct intel_encoder *encoder,
        drm_dbg_kms(&dev_priv->drm, "[CONNECTOR:%d:%s][ENCODER:%d:%s] Enable audio codec on pipe %c, %u bytes ELD\n",
                    connector->base.id, connector->name,
                    encoder->base.base.id, encoder->base.name,
-                   pipe, drm_eld_size(connector->eld));
+                   pipe_name(pipe), drm_eld_size(connector->eld));
 
        /* FIXME precompute the ELD in .compute_config() */
        if (!connector->eld[0])
@@ -888,7 +888,7 @@ void intel_audio_codec_disable(struct intel_encoder *encoder,
 
        drm_dbg_kms(&dev_priv->drm, "[CONNECTOR:%d:%s][ENCODER:%d:%s] Disable audio codec on pipe %c\n",
                    connector->base.id, connector->name,
-                   encoder->base.base.id, encoder->base.name, pipe);
+                   encoder->base.base.id, encoder->base.name, pipe_name(pipe));
 
        if (dev_priv->audio.funcs)
                dev_priv->audio.funcs->audio_codec_disable(encoder,
index 1d9bd58..949edc9 100644 (file)
@@ -2428,7 +2428,7 @@ intel_display_power_ddi_io_domain(struct drm_i915_private *i915, enum port port)
        if (drm_WARN_ON(&i915->drm, !domains) || domains->ddi_io == POWER_DOMAIN_INVALID)
                return POWER_DOMAIN_PORT_DDI_IO_A;
 
-       return domains->ddi_io + port - domains->port_start;
+       return domains->ddi_io + (int)(port - domains->port_start);
 }
 
 enum intel_display_power_domain
@@ -2439,7 +2439,7 @@ intel_display_power_ddi_lanes_domain(struct drm_i915_private *i915, enum port po
        if (drm_WARN_ON(&i915->drm, !domains) || domains->ddi_lanes == POWER_DOMAIN_INVALID)
                return POWER_DOMAIN_PORT_DDI_LANES_A;
 
-       return domains->ddi_lanes + port - domains->port_start;
+       return domains->ddi_lanes + (int)(port - domains->port_start);
 }
 
 static const struct intel_ddi_port_domains *
@@ -2465,7 +2465,7 @@ intel_display_power_legacy_aux_domain(struct drm_i915_private *i915, enum aux_ch
        if (drm_WARN_ON(&i915->drm, !domains) || domains->aux_legacy_usbc == POWER_DOMAIN_INVALID)
                return POWER_DOMAIN_AUX_A;
 
-       return domains->aux_legacy_usbc + aux_ch - domains->aux_ch_start;
+       return domains->aux_legacy_usbc + (int)(aux_ch - domains->aux_ch_start);
 }
 
 enum intel_display_power_domain
@@ -2476,5 +2476,5 @@ intel_display_power_tbt_aux_domain(struct drm_i915_private *i915, enum aux_ch au
        if (drm_WARN_ON(&i915->drm, !domains) || domains->aux_tbt == POWER_DOMAIN_INVALID)
                return POWER_DOMAIN_AUX_TBT1;
 
-       return domains->aux_tbt + aux_ch - domains->aux_ch_start;
+       return domains->aux_tbt + (int)(aux_ch - domains->aux_ch_start);
 }
index f370e9c..dd24aef 100644 (file)
@@ -125,9 +125,25 @@ struct i2c_adapter_lookup {
 #define  ICL_GPIO_DDPA_CTRLCLK_2       8
 #define  ICL_GPIO_DDPA_CTRLDATA_2      9
 
-static enum port intel_dsi_seq_port_to_port(u8 port)
+static enum port intel_dsi_seq_port_to_port(struct intel_dsi *intel_dsi,
+                                           u8 seq_port)
 {
-       return port ? PORT_C : PORT_A;
+       /*
+        * If single link DSI is being used on any port, the VBT sequence block
+        * send packet apparently always has 0 for the port. Just use the port
+        * we have configured, and ignore the sequence block port.
+        */
+       if (hweight8(intel_dsi->ports) == 1)
+               return ffs(intel_dsi->ports) - 1;
+
+       if (seq_port) {
+               if (intel_dsi->ports & PORT_B)
+                       return PORT_B;
+               else if (intel_dsi->ports & PORT_C)
+                       return PORT_C;
+       }
+
+       return PORT_A;
 }
 
 static const u8 *mipi_exec_send_packet(struct intel_dsi *intel_dsi,
@@ -149,15 +165,10 @@ static const u8 *mipi_exec_send_packet(struct intel_dsi *intel_dsi,
 
        seq_port = (flags >> MIPI_PORT_SHIFT) & 3;
 
-       /* For DSI single link on Port A & C, the seq_port value which is
-        * parsed from Sequence Block#53 of VBT has been set to 0
-        * Now, read/write of packets for the DSI single link on Port A and
-        * Port C will based on the DVO port from VBT block 2.
-        */
-       if (intel_dsi->ports == (1 << PORT_C))
-               port = PORT_C;
-       else
-               port = intel_dsi_seq_port_to_port(seq_port);
+       port = intel_dsi_seq_port_to_port(intel_dsi, seq_port);
+
+       if (drm_WARN_ON(&dev_priv->drm, !intel_dsi->dsi_hosts[port]))
+               goto out;
 
        dsi_device = intel_dsi->dsi_hosts[port]->device;
        if (!dsi_device) {
index 26cbfa6..f76b6cf 100644 (file)
@@ -17,7 +17,6 @@
 #include "intel_rc6.h"
 #include "intel_rps.h"
 
-#ifdef CONFIG_PM
 enum intel_gt_sysfs_op {
        INTEL_GT_SYSFS_MIN = 0,
        INTEL_GT_SYSFS_MAX,
@@ -92,6 +91,7 @@ sysfs_gt_attribute_r_func(struct device *dev, struct device_attribute *attr,
 #define sysfs_gt_attribute_r_max_func(d, a, f) \
                sysfs_gt_attribute_r_func(d, a, f, INTEL_GT_SYSFS_MAX)
 
+#ifdef CONFIG_PM
 static u32 get_residency(struct intel_gt *gt, i915_reg_t reg)
 {
        intel_wakeref_t wakeref;
@@ -457,22 +457,23 @@ static ssize_t vlv_rpe_freq_mhz_show(struct device *dev,
 }
 
 #define INTEL_GT_RPS_SYSFS_ATTR(_name, _mode, _show, _store) \
-       struct device_attribute dev_attr_gt_##_name = __ATTR(gt_##_name, _mode, _show, _store); \
-       struct device_attribute dev_attr_rps_##_name = __ATTR(rps_##_name, _mode, _show, _store)
+       static struct device_attribute dev_attr_gt_##_name = __ATTR(gt_##_name, _mode, _show, _store); \
+       static struct device_attribute dev_attr_rps_##_name = __ATTR(rps_##_name, _mode, _show, _store)
 
 #define INTEL_GT_RPS_SYSFS_ATTR_RO(_name)                              \
                INTEL_GT_RPS_SYSFS_ATTR(_name, 0444, _name##_show, NULL)
 #define INTEL_GT_RPS_SYSFS_ATTR_RW(_name)                              \
                INTEL_GT_RPS_SYSFS_ATTR(_name, 0644, _name##_show, _name##_store)
 
-static INTEL_GT_RPS_SYSFS_ATTR_RO(act_freq_mhz);
-static INTEL_GT_RPS_SYSFS_ATTR_RO(cur_freq_mhz);
-static INTEL_GT_RPS_SYSFS_ATTR_RW(boost_freq_mhz);
-static INTEL_GT_RPS_SYSFS_ATTR_RO(RP0_freq_mhz);
-static INTEL_GT_RPS_SYSFS_ATTR_RO(RP1_freq_mhz);
-static INTEL_GT_RPS_SYSFS_ATTR_RO(RPn_freq_mhz);
-static INTEL_GT_RPS_SYSFS_ATTR_RW(max_freq_mhz);
-static INTEL_GT_RPS_SYSFS_ATTR_RW(min_freq_mhz);
+/* The below macros generate static structures */
+INTEL_GT_RPS_SYSFS_ATTR_RO(act_freq_mhz);
+INTEL_GT_RPS_SYSFS_ATTR_RO(cur_freq_mhz);
+INTEL_GT_RPS_SYSFS_ATTR_RW(boost_freq_mhz);
+INTEL_GT_RPS_SYSFS_ATTR_RO(RP0_freq_mhz);
+INTEL_GT_RPS_SYSFS_ATTR_RO(RP1_freq_mhz);
+INTEL_GT_RPS_SYSFS_ATTR_RO(RPn_freq_mhz);
+INTEL_GT_RPS_SYSFS_ATTR_RW(max_freq_mhz);
+INTEL_GT_RPS_SYSFS_ATTR_RW(min_freq_mhz);
 
 static DEVICE_ATTR_RO(vlv_rpe_freq_mhz);
 
index be9ac47..4ef9990 100644 (file)
@@ -50,7 +50,7 @@
 
 #define HOST2GUC_SELF_CFG_REQUEST_MSG_LEN              (GUC_HXG_REQUEST_MSG_MIN_LEN + 3u)
 #define HOST2GUC_SELF_CFG_REQUEST_MSG_0_MBZ            GUC_HXG_REQUEST_MSG_0_DATA0
-#define HOST2GUC_SELF_CFG_REQUEST_MSG_1_KLV_KEY                (0xffff << 16)
+#define HOST2GUC_SELF_CFG_REQUEST_MSG_1_KLV_KEY                (0xffffU << 16)
 #define HOST2GUC_SELF_CFG_REQUEST_MSG_1_KLV_LEN                (0xffff << 0)
 #define HOST2GUC_SELF_CFG_REQUEST_MSG_2_VALUE32                GUC_HXG_REQUEST_MSG_n_DATAn
 #define HOST2GUC_SELF_CFG_REQUEST_MSG_3_VALUE64                GUC_HXG_REQUEST_MSG_n_DATAn
index c9086a6..df83c1c 100644 (file)
@@ -82,7 +82,7 @@ static_assert(sizeof(struct guc_ct_buffer_desc) == 64);
 #define GUC_CTB_HDR_LEN                                1u
 #define GUC_CTB_MSG_MIN_LEN                    GUC_CTB_HDR_LEN
 #define GUC_CTB_MSG_MAX_LEN                    256u
-#define GUC_CTB_MSG_0_FENCE                    (0xffff << 16)
+#define GUC_CTB_MSG_0_FENCE                    (0xffffU << 16)
 #define GUC_CTB_MSG_0_FORMAT                   (0xf << 12)
 #define   GUC_CTB_FORMAT_HXG                   0u
 #define GUC_CTB_MSG_0_RESERVED                 (0xf << 8)
index 29ac823..7d5ba4d 100644 (file)
@@ -40,7 +40,7 @@
  */
 
 #define GUC_HXG_MSG_MIN_LEN                    1u
-#define GUC_HXG_MSG_0_ORIGIN                   (0x1 << 31)
+#define GUC_HXG_MSG_0_ORIGIN                   (0x1U << 31)
 #define   GUC_HXG_ORIGIN_HOST                  0u
 #define   GUC_HXG_ORIGIN_GUC                   1u
 #define GUC_HXG_MSG_0_TYPE                     (0x7 << 28)
index 66027a4..ad570fa 100644 (file)
@@ -28,7 +28,7 @@
 #define   GS_MIA_HALT_REQUESTED                  (0x02 << GS_MIA_SHIFT)
 #define   GS_MIA_ISR_ENTRY               (0x04 << GS_MIA_SHIFT)
 #define   GS_AUTH_STATUS_SHIFT         30
-#define   GS_AUTH_STATUS_MASK            (0x03 << GS_AUTH_STATUS_SHIFT)
+#define   GS_AUTH_STATUS_MASK            (0x03U << GS_AUTH_STATUS_SHIFT)
 #define   GS_AUTH_STATUS_BAD             (0x01 << GS_AUTH_STATUS_SHIFT)
 #define   GS_AUTH_STATUS_GOOD            (0x02 << GS_AUTH_STATUS_SHIFT)
 
index 0a9c3fc..1577ab6 100644 (file)
@@ -4050,8 +4050,8 @@ addr_err:
        return ERR_PTR(err);
 }
 
-static ssize_t show_dynamic_id(struct device *dev,
-                              struct device_attribute *attr,
+static ssize_t show_dynamic_id(struct kobject *kobj,
+                              struct kobj_attribute *attr,
                               char *buf)
 {
        struct i915_oa_config *oa_config =
index 473a3c0..05cb9a3 100644 (file)
@@ -55,7 +55,7 @@ struct i915_oa_config {
 
        struct attribute_group sysfs_metric;
        struct attribute *attrs[2];
-       struct device_attribute sysfs_metric_id;
+       struct kobj_attribute sysfs_metric_id;
 
        struct kref ref;
        struct rcu_head rcu;
index 9ccb67e..4f5a51b 100644 (file)
@@ -7561,25 +7561,25 @@ enum skl_power_gate {
 #define _PORT_CLK_SEL_A                        0x46100
 #define _PORT_CLK_SEL_B                        0x46104
 #define PORT_CLK_SEL(port) _MMIO_PORT(port, _PORT_CLK_SEL_A, _PORT_CLK_SEL_B)
-#define  PORT_CLK_SEL_LCPLL_2700       (0 << 29)
-#define  PORT_CLK_SEL_LCPLL_1350       (1 << 29)
-#define  PORT_CLK_SEL_LCPLL_810                (2 << 29)
-#define  PORT_CLK_SEL_SPLL             (3 << 29)
-#define  PORT_CLK_SEL_WRPLL(pll)       (((pll) + 4) << 29)
-#define  PORT_CLK_SEL_WRPLL1           (4 << 29)
-#define  PORT_CLK_SEL_WRPLL2           (5 << 29)
-#define  PORT_CLK_SEL_NONE             (7 << 29)
-#define  PORT_CLK_SEL_MASK             (7 << 29)
+#define  PORT_CLK_SEL_MASK             REG_GENMASK(31, 29)
+#define  PORT_CLK_SEL_LCPLL_2700       REG_FIELD_PREP(PORT_CLK_SEL_MASK, 0)
+#define  PORT_CLK_SEL_LCPLL_1350       REG_FIELD_PREP(PORT_CLK_SEL_MASK, 1)
+#define  PORT_CLK_SEL_LCPLL_810                REG_FIELD_PREP(PORT_CLK_SEL_MASK, 2)
+#define  PORT_CLK_SEL_SPLL             REG_FIELD_PREP(PORT_CLK_SEL_MASK, 3)
+#define  PORT_CLK_SEL_WRPLL(pll)       REG_FIELD_PREP(PORT_CLK_SEL_MASK, 4 + (pll))
+#define  PORT_CLK_SEL_WRPLL1           REG_FIELD_PREP(PORT_CLK_SEL_MASK, 4)
+#define  PORT_CLK_SEL_WRPLL2           REG_FIELD_PREP(PORT_CLK_SEL_MASK, 5)
+#define  PORT_CLK_SEL_NONE             REG_FIELD_PREP(PORT_CLK_SEL_MASK, 7)
 
 /* On ICL+ this is the same as PORT_CLK_SEL, but all bits change. */
 #define DDI_CLK_SEL(port)              PORT_CLK_SEL(port)
-#define  DDI_CLK_SEL_NONE              (0x0 << 28)
-#define  DDI_CLK_SEL_MG                        (0x8 << 28)
-#define  DDI_CLK_SEL_TBT_162           (0xC << 28)
-#define  DDI_CLK_SEL_TBT_270           (0xD << 28)
-#define  DDI_CLK_SEL_TBT_540           (0xE << 28)
-#define  DDI_CLK_SEL_TBT_810           (0xF << 28)
-#define  DDI_CLK_SEL_MASK              (0xF << 28)
+#define  DDI_CLK_SEL_MASK              REG_GENMASK(31, 28)
+#define  DDI_CLK_SEL_NONE              REG_FIELD_PREP(DDI_CLK_SEL_MASK, 0x0)
+#define  DDI_CLK_SEL_MG                        REG_FIELD_PREP(DDI_CLK_SEL_MASK, 0x8)
+#define  DDI_CLK_SEL_TBT_162           REG_FIELD_PREP(DDI_CLK_SEL_MASK, 0xC)
+#define  DDI_CLK_SEL_TBT_270           REG_FIELD_PREP(DDI_CLK_SEL_MASK, 0xD)
+#define  DDI_CLK_SEL_TBT_540           REG_FIELD_PREP(DDI_CLK_SEL_MASK, 0xE)
+#define  DDI_CLK_SEL_TBT_810           REG_FIELD_PREP(DDI_CLK_SEL_MASK, 0xF)
 
 /* Transcoder clock selection */
 #define _TRANS_CLK_SEL_A               0x46140