CC: [email protected] CC: [email protected] BCC: [email protected] CC: [email protected] TO: Neil Armstrong <[email protected]>
tree: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git master head: 30c8e80f79329617012f07b09b70114592092ea4 commit: e67f6037ae1be34b2b686bab72caa41d57714534 drm/meson: split out encoder from meson_dw_hdmi date: 6 months ago :::::: branch date: 20 hours ago :::::: commit date: 6 months ago config: arm-randconfig-c002-20220507 (https://download.01.org/0day-ci/archive/20220508/[email protected]/config) compiler: clang version 15.0.0 (https://github.com/llvm/llvm-project af4cf1c6b8ed0d8102fc5e69acdc2fcbbcdaa9a7) reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # install arm cross compiling tool for clang build # apt-get install binutils-arm-linux-gnueabi # https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=e67f6037ae1be34b2b686bab72caa41d57714534 git remote add linus https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git git fetch --no-tags linus master git checkout e67f6037ae1be34b2b686bab72caa41d57714534 # save the config file COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=arm clang-analyzer If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot <[email protected]> clang-analyzer warnings: (new ones prefixed by >>) ^ drivers/iio/pressure/icp10100.c:178:14: note: Assuming 'i' is < field 'response_word_nb' for (i = 0; i < cmd->response_word_nb; ++i) { ^~~~~~~~~~~~~~~~~~~~~~~~~ drivers/iio/pressure/icp10100.c:178:2: note: Loop condition is true. Entering loop body for (i = 0; i < cmd->response_word_nb; ++i) { ^ drivers/iio/pressure/icp10100.c:182:7: note: Assuming the condition is false if (crc != ptr[ICP10100_CRC8_WORD_LENGTH]) { ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/iio/pressure/icp10100.c:182:3: note: Taking false branch if (crc != ptr[ICP10100_CRC8_WORD_LENGTH]) { ^ drivers/iio/pressure/icp10100.c:178:14: note: Assuming 'i' is < field 'response_word_nb' for (i = 0; i < cmd->response_word_nb; ++i) { ^~~~~~~~~~~~~~~~~~~~~~~~~ drivers/iio/pressure/icp10100.c:178:2: note: Loop condition is true. Entering loop body for (i = 0; i < cmd->response_word_nb; ++i) { ^ drivers/iio/pressure/icp10100.c:182:7: note: Assuming the condition is false if (crc != ptr[ICP10100_CRC8_WORD_LENGTH]) { ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/iio/pressure/icp10100.c:182:3: note: Taking false branch if (crc != ptr[ICP10100_CRC8_WORD_LENGTH]) { ^ drivers/iio/pressure/icp10100.c:178:14: note: Assuming 'i' is >= field 'response_word_nb' for (i = 0; i < cmd->response_word_nb; ++i) { ^~~~~~~~~~~~~~~~~~~~~~~~~ drivers/iio/pressure/icp10100.c:178:2: note: Loop condition is false. Execution continues on line 191 for (i = 0; i < cmd->response_word_nb; ++i) { ^ drivers/iio/pressure/icp10100.c:191:2: note: Returning zero, which participates in a condition later return 0; ^~~~~~~~ drivers/iio/pressure/icp10100.c:259:8: note: Returning from 'icp10100_send_cmd' ret = icp10100_send_cmd(st, cmd, measures, sizeof(measures)); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/iio/pressure/icp10100.c:261:6: note: 'ret' is 0 if (ret) ^~~ drivers/iio/pressure/icp10100.c:261:2: note: Taking false branch if (ret) ^ drivers/iio/pressure/icp10100.c:266:17: note: 1st function call argument is an uninitialized value *temperature = be16_to_cpu(measures[2]); ^ include/linux/byteorder/generic.h:97:21: note: expanded from macro 'be16_to_cpu' #define be16_to_cpu __be16_to_cpu ^ include/uapi/linux/byteorder/little_endian.h:42:26: note: expanded from macro '__be16_to_cpu' #define __be16_to_cpu(x) __swab16((__force __u16)(__be16)(x)) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ include/uapi/linux/swab.h:102:28: note: expanded from macro '__swab16' #define __swab16(x) (__u16)__builtin_bswap16((__u16)(x)) ^ ~~~~~~~~~~ Suppressed 9 warnings (9 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 9 warnings generated. Suppressed 9 warnings (9 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 9 warnings generated. Suppressed 9 warnings (9 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 9 warnings generated. Suppressed 9 warnings (9 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 9 warnings generated. Suppressed 9 warnings (9 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 9 warnings generated. Suppressed 9 warnings (9 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 9 warnings generated. Suppressed 9 warnings (9 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 2 warnings generated. Suppressed 2 warnings (2 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 9 warnings generated. Suppressed 9 warnings (9 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 9 warnings generated. Suppressed 9 warnings (9 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 9 warnings generated. Suppressed 9 warnings (9 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 9 warnings generated. Suppressed 9 warnings (9 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 9 warnings generated. Suppressed 9 warnings (9 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 9 warnings generated. Suppressed 9 warnings (9 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 9 warnings generated. Suppressed 9 warnings (9 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 12 warnings generated. >> drivers/gpu/drm/meson/meson_encoder_hdmi.c:165:3: warning: Value stored to >> 'venc_freq' is never read [clang-analyzer-deadcode.DeadStores] venc_freq /= 2; ^ ~ drivers/gpu/drm/meson/meson_encoder_hdmi.c:165:3: note: Value stored to 'venc_freq' is never read venc_freq /= 2; ^ ~ >> drivers/gpu/drm/meson/meson_encoder_hdmi.c:289:20: warning: Value stored to >> 'priv' during its initialization is never read >> [clang-analyzer-deadcode.DeadStores] struct meson_drm *priv = encoder_hdmi->priv; ^~~~ ~~~~~~~~~~~~~~~~~~ drivers/gpu/drm/meson/meson_encoder_hdmi.c:289:20: note: Value stored to 'priv' during its initialization is never read struct meson_drm *priv = encoder_hdmi->priv; ^~~~ ~~~~~~~~~~~~~~~~~~ Suppressed 10 warnings (9 in non-user code, 1 with check filters). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 9 warnings generated. Suppressed 9 warnings (9 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 9 warnings generated. Suppressed 9 warnings (9 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 9 warnings generated. Suppressed 9 warnings (9 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 9 warnings generated. Suppressed 9 warnings (9 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 9 warnings generated. Suppressed 9 warnings (9 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 9 warnings generated. Suppressed 9 warnings (9 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 9 warnings generated. Suppressed 9 warnings (9 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 9 warnings generated. Suppressed 9 warnings (9 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 10 warnings generated. drivers/iio/adc/ltc2497.c:18:8: warning: Excessive padding in 'struct ltc2497_driverdata' (32 padding bytes, where 0 is optimal). Optimal fields order: buf, client, common_ddata, consider reordering the fields or adding explicit padding members [clang-analyzer-optin.performance.Padding] struct ltc2497_driverdata { ~~~~~~~^~~~~~~~~~~~~~~~~~~~ drivers/iio/adc/ltc2497.c:18:8: note: Excessive padding in 'struct ltc2497_driverdata' (32 padding bytes, where 0 is optimal). Optimal fields order: buf, client, common_ddata, consider reordering the fields or adding explicit padding members struct ltc2497_driverdata { ~~~~~~~^~~~~~~~~~~~~~~~~~~~ Suppressed 9 warnings (9 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 9 warnings generated. Suppressed 9 warnings (9 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 9 warnings generated. Suppressed 9 warnings (9 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 12 warnings generated. fs/xfs/libxfs/xfs_attr_leaf.c:2243:29: warning: Value stored to 'drop_leaf' during its initialization is never read [clang-analyzer-deadcode.DeadStores] struct xfs_attr_leafblock *drop_leaf = drop_blk->bp->b_addr; ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~ fs/xfs/libxfs/xfs_attr_leaf.c:2243:29: note: Value stored to 'drop_leaf' during its initialization is never read struct xfs_attr_leafblock *drop_leaf = drop_blk->bp->b_addr; ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~ fs/xfs/libxfs/xfs_attr_leaf.c:2244:29: warning: Value stored to 'save_leaf' during its initialization is never read [clang-analyzer-deadcode.DeadStores] struct xfs_attr_leafblock *save_leaf = save_blk->bp->b_addr; ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~ fs/xfs/libxfs/xfs_attr_leaf.c:2244:29: note: Value stored to 'save_leaf' during its initialization is never read struct xfs_attr_leafblock *save_leaf = save_blk->bp->b_addr; ^~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~ Suppressed 10 warnings (10 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 10 warnings generated. Suppressed 10 warnings (10 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 3 warnings generated. Suppressed 3 warnings (3 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 9 warnings generated. Suppressed 9 warnings (9 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 9 warnings generated. Suppressed 9 warnings (9 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 10 warnings generated. drivers/iio/accel/mma8452.c:252:2: warning: Value stored to 'ret' is never read [clang-analyzer-deadcode.DeadStores] ret = i2c_smbus_read_i2c_block_data(data->client, MMA8452_OUT_X, ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ drivers/iio/accel/mma8452.c:252:2: note: Value stored to 'ret' is never read ret = i2c_smbus_read_i2c_block_data(data->client, MMA8452_OUT_X, ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Suppressed 9 warnings (9 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 9 warnings generated. Suppressed 9 warnings (9 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 9 warnings generated. Suppressed 9 warnings (9 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 9 warnings generated. Suppressed 9 warnings (9 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 9 warnings generated. Suppressed 9 warnings (9 in non-user code). Use -header-filter=.* to display errors from all non-system headers. Use -system-headers to display errors from system headers as well. 10 warnings generated. vim +/venc_freq +165 drivers/gpu/drm/meson/meson_encoder_hdmi.c e67f6037ae1be3 Neil Armstrong 2021-10-20 102 e67f6037ae1be3 Neil Armstrong 2021-10-20 103 static enum drm_mode_status meson_encoder_hdmi_mode_valid(struct drm_bridge *bridge, e67f6037ae1be3 Neil Armstrong 2021-10-20 104 const struct drm_display_info *display_info, e67f6037ae1be3 Neil Armstrong 2021-10-20 105 const struct drm_display_mode *mode) e67f6037ae1be3 Neil Armstrong 2021-10-20 106 { e67f6037ae1be3 Neil Armstrong 2021-10-20 107 struct meson_encoder_hdmi *encoder_hdmi = bridge_to_meson_encoder_hdmi(bridge); e67f6037ae1be3 Neil Armstrong 2021-10-20 108 struct meson_drm *priv = encoder_hdmi->priv; e67f6037ae1be3 Neil Armstrong 2021-10-20 109 bool is_hdmi2_sink = display_info->hdmi.scdc.supported; e67f6037ae1be3 Neil Armstrong 2021-10-20 110 unsigned int phy_freq; e67f6037ae1be3 Neil Armstrong 2021-10-20 111 unsigned int vclk_freq; e67f6037ae1be3 Neil Armstrong 2021-10-20 112 unsigned int venc_freq; e67f6037ae1be3 Neil Armstrong 2021-10-20 113 unsigned int hdmi_freq; e67f6037ae1be3 Neil Armstrong 2021-10-20 114 int vic = drm_match_cea_mode(mode); e67f6037ae1be3 Neil Armstrong 2021-10-20 115 enum drm_mode_status status; e67f6037ae1be3 Neil Armstrong 2021-10-20 116 e67f6037ae1be3 Neil Armstrong 2021-10-20 117 dev_dbg(priv->dev, "Modeline " DRM_MODE_FMT "\n", DRM_MODE_ARG(mode)); e67f6037ae1be3 Neil Armstrong 2021-10-20 118 e67f6037ae1be3 Neil Armstrong 2021-10-20 119 /* If sink does not support 540MHz, reject the non-420 HDMI2 modes */ e67f6037ae1be3 Neil Armstrong 2021-10-20 120 if (display_info->max_tmds_clock && e67f6037ae1be3 Neil Armstrong 2021-10-20 121 mode->clock > display_info->max_tmds_clock && e67f6037ae1be3 Neil Armstrong 2021-10-20 122 !drm_mode_is_420_only(display_info, mode) && e67f6037ae1be3 Neil Armstrong 2021-10-20 123 !drm_mode_is_420_also(display_info, mode)) e67f6037ae1be3 Neil Armstrong 2021-10-20 124 return MODE_BAD; e67f6037ae1be3 Neil Armstrong 2021-10-20 125 e67f6037ae1be3 Neil Armstrong 2021-10-20 126 /* Check against non-VIC supported modes */ e67f6037ae1be3 Neil Armstrong 2021-10-20 127 if (!vic) { e67f6037ae1be3 Neil Armstrong 2021-10-20 128 status = meson_venc_hdmi_supported_mode(mode); e67f6037ae1be3 Neil Armstrong 2021-10-20 129 if (status != MODE_OK) e67f6037ae1be3 Neil Armstrong 2021-10-20 130 return status; e67f6037ae1be3 Neil Armstrong 2021-10-20 131 e67f6037ae1be3 Neil Armstrong 2021-10-20 132 return meson_vclk_dmt_supported_freq(priv, mode->clock); e67f6037ae1be3 Neil Armstrong 2021-10-20 133 /* Check against supported VIC modes */ e67f6037ae1be3 Neil Armstrong 2021-10-20 134 } else if (!meson_venc_hdmi_supported_vic(vic)) e67f6037ae1be3 Neil Armstrong 2021-10-20 135 return MODE_BAD; e67f6037ae1be3 Neil Armstrong 2021-10-20 136 e67f6037ae1be3 Neil Armstrong 2021-10-20 137 vclk_freq = mode->clock; e67f6037ae1be3 Neil Armstrong 2021-10-20 138 e67f6037ae1be3 Neil Armstrong 2021-10-20 139 /* For 420, pixel clock is half unlike venc clock */ e67f6037ae1be3 Neil Armstrong 2021-10-20 140 if (drm_mode_is_420_only(display_info, mode) || e67f6037ae1be3 Neil Armstrong 2021-10-20 141 (!is_hdmi2_sink && e67f6037ae1be3 Neil Armstrong 2021-10-20 142 drm_mode_is_420_also(display_info, mode))) e67f6037ae1be3 Neil Armstrong 2021-10-20 143 vclk_freq /= 2; e67f6037ae1be3 Neil Armstrong 2021-10-20 144 e67f6037ae1be3 Neil Armstrong 2021-10-20 145 /* TMDS clock is pixel_clock * 10 */ e67f6037ae1be3 Neil Armstrong 2021-10-20 146 phy_freq = vclk_freq * 10; e67f6037ae1be3 Neil Armstrong 2021-10-20 147 e67f6037ae1be3 Neil Armstrong 2021-10-20 148 /* 480i/576i needs global pixel doubling */ e67f6037ae1be3 Neil Armstrong 2021-10-20 149 if (mode->flags & DRM_MODE_FLAG_DBLCLK) e67f6037ae1be3 Neil Armstrong 2021-10-20 150 vclk_freq *= 2; e67f6037ae1be3 Neil Armstrong 2021-10-20 151 e67f6037ae1be3 Neil Armstrong 2021-10-20 152 venc_freq = vclk_freq; e67f6037ae1be3 Neil Armstrong 2021-10-20 153 hdmi_freq = vclk_freq; e67f6037ae1be3 Neil Armstrong 2021-10-20 154 e67f6037ae1be3 Neil Armstrong 2021-10-20 155 /* VENC double pixels for 1080i, 720p and YUV420 modes */ e67f6037ae1be3 Neil Armstrong 2021-10-20 156 if (meson_venc_hdmi_venc_repeat(vic) || e67f6037ae1be3 Neil Armstrong 2021-10-20 157 drm_mode_is_420_only(display_info, mode) || e67f6037ae1be3 Neil Armstrong 2021-10-20 158 (!is_hdmi2_sink && e67f6037ae1be3 Neil Armstrong 2021-10-20 159 drm_mode_is_420_also(display_info, mode))) e67f6037ae1be3 Neil Armstrong 2021-10-20 160 venc_freq *= 2; e67f6037ae1be3 Neil Armstrong 2021-10-20 161 e67f6037ae1be3 Neil Armstrong 2021-10-20 162 vclk_freq = max(venc_freq, hdmi_freq); e67f6037ae1be3 Neil Armstrong 2021-10-20 163 e67f6037ae1be3 Neil Armstrong 2021-10-20 164 if (mode->flags & DRM_MODE_FLAG_DBLCLK) e67f6037ae1be3 Neil Armstrong 2021-10-20 @165 venc_freq /= 2; e67f6037ae1be3 Neil Armstrong 2021-10-20 166 e67f6037ae1be3 Neil Armstrong 2021-10-20 167 dev_dbg(priv->dev, "%s: vclk:%d phy=%d venc=%d hdmi=%d\n", e67f6037ae1be3 Neil Armstrong 2021-10-20 168 __func__, phy_freq, vclk_freq, venc_freq, hdmi_freq); e67f6037ae1be3 Neil Armstrong 2021-10-20 169 e67f6037ae1be3 Neil Armstrong 2021-10-20 170 return meson_vclk_vic_supported_freq(priv, phy_freq, vclk_freq); e67f6037ae1be3 Neil Armstrong 2021-10-20 171 } e67f6037ae1be3 Neil Armstrong 2021-10-20 172 e67f6037ae1be3 Neil Armstrong 2021-10-20 173 static void meson_encoder_hdmi_atomic_enable(struct drm_bridge *bridge, e67f6037ae1be3 Neil Armstrong 2021-10-20 174 struct drm_bridge_state *bridge_state) e67f6037ae1be3 Neil Armstrong 2021-10-20 175 { e67f6037ae1be3 Neil Armstrong 2021-10-20 176 struct meson_encoder_hdmi *encoder_hdmi = bridge_to_meson_encoder_hdmi(bridge); e67f6037ae1be3 Neil Armstrong 2021-10-20 177 struct drm_atomic_state *state = bridge_state->base.state; e67f6037ae1be3 Neil Armstrong 2021-10-20 178 unsigned int ycrcb_map = VPU_HDMI_OUTPUT_CBYCR; e67f6037ae1be3 Neil Armstrong 2021-10-20 179 struct meson_drm *priv = encoder_hdmi->priv; e67f6037ae1be3 Neil Armstrong 2021-10-20 180 struct drm_connector_state *conn_state; e67f6037ae1be3 Neil Armstrong 2021-10-20 181 const struct drm_display_mode *mode; e67f6037ae1be3 Neil Armstrong 2021-10-20 182 struct drm_crtc_state *crtc_state; e67f6037ae1be3 Neil Armstrong 2021-10-20 183 struct drm_connector *connector; e67f6037ae1be3 Neil Armstrong 2021-10-20 184 bool yuv420_mode = false; e67f6037ae1be3 Neil Armstrong 2021-10-20 185 int vic; e67f6037ae1be3 Neil Armstrong 2021-10-20 186 e67f6037ae1be3 Neil Armstrong 2021-10-20 187 connector = drm_atomic_get_new_connector_for_encoder(state, bridge->encoder); e67f6037ae1be3 Neil Armstrong 2021-10-20 188 if (WARN_ON(!connector)) e67f6037ae1be3 Neil Armstrong 2021-10-20 189 return; e67f6037ae1be3 Neil Armstrong 2021-10-20 190 e67f6037ae1be3 Neil Armstrong 2021-10-20 191 conn_state = drm_atomic_get_new_connector_state(state, connector); e67f6037ae1be3 Neil Armstrong 2021-10-20 192 if (WARN_ON(!conn_state)) e67f6037ae1be3 Neil Armstrong 2021-10-20 193 return; e67f6037ae1be3 Neil Armstrong 2021-10-20 194 e67f6037ae1be3 Neil Armstrong 2021-10-20 195 crtc_state = drm_atomic_get_new_crtc_state(state, conn_state->crtc); e67f6037ae1be3 Neil Armstrong 2021-10-20 196 if (WARN_ON(!crtc_state)) e67f6037ae1be3 Neil Armstrong 2021-10-20 197 return; e67f6037ae1be3 Neil Armstrong 2021-10-20 198 e67f6037ae1be3 Neil Armstrong 2021-10-20 199 mode = &crtc_state->adjusted_mode; e67f6037ae1be3 Neil Armstrong 2021-10-20 200 e67f6037ae1be3 Neil Armstrong 2021-10-20 201 vic = drm_match_cea_mode(mode); e67f6037ae1be3 Neil Armstrong 2021-10-20 202 e67f6037ae1be3 Neil Armstrong 2021-10-20 203 dev_dbg(priv->dev, "\"%s\" vic %d\n", mode->name, vic); e67f6037ae1be3 Neil Armstrong 2021-10-20 204 e67f6037ae1be3 Neil Armstrong 2021-10-20 205 if (encoder_hdmi->output_bus_fmt == MEDIA_BUS_FMT_UYYVYY8_0_5X24) { e67f6037ae1be3 Neil Armstrong 2021-10-20 206 ycrcb_map = VPU_HDMI_OUTPUT_CRYCB; e67f6037ae1be3 Neil Armstrong 2021-10-20 207 yuv420_mode = true; e67f6037ae1be3 Neil Armstrong 2021-10-20 208 } e67f6037ae1be3 Neil Armstrong 2021-10-20 209 e67f6037ae1be3 Neil Armstrong 2021-10-20 210 /* VENC + VENC-DVI Mode setup */ e67f6037ae1be3 Neil Armstrong 2021-10-20 211 meson_venc_hdmi_mode_set(priv, vic, ycrcb_map, yuv420_mode, mode); e67f6037ae1be3 Neil Armstrong 2021-10-20 212 e67f6037ae1be3 Neil Armstrong 2021-10-20 213 /* VCLK Set clock */ e67f6037ae1be3 Neil Armstrong 2021-10-20 214 meson_encoder_hdmi_set_vclk(encoder_hdmi, mode); e67f6037ae1be3 Neil Armstrong 2021-10-20 215 e67f6037ae1be3 Neil Armstrong 2021-10-20 216 if (encoder_hdmi->output_bus_fmt == MEDIA_BUS_FMT_UYYVYY8_0_5X24) e67f6037ae1be3 Neil Armstrong 2021-10-20 217 /* Setup YUV420 to HDMI-TX, no 10bit diphering */ e67f6037ae1be3 Neil Armstrong 2021-10-20 218 writel_relaxed(2 | (2 << 2), e67f6037ae1be3 Neil Armstrong 2021-10-20 219 priv->io_base + _REG(VPU_HDMI_FMT_CTRL)); e67f6037ae1be3 Neil Armstrong 2021-10-20 220 else e67f6037ae1be3 Neil Armstrong 2021-10-20 221 /* Setup YUV444 to HDMI-TX, no 10bit diphering */ e67f6037ae1be3 Neil Armstrong 2021-10-20 222 writel_relaxed(0, priv->io_base + _REG(VPU_HDMI_FMT_CTRL)); e67f6037ae1be3 Neil Armstrong 2021-10-20 223 e67f6037ae1be3 Neil Armstrong 2021-10-20 224 dev_dbg(priv->dev, "%s\n", priv->venc.hdmi_use_enci ? "VENCI" : "VENCP"); e67f6037ae1be3 Neil Armstrong 2021-10-20 225 e67f6037ae1be3 Neil Armstrong 2021-10-20 226 if (priv->venc.hdmi_use_enci) e67f6037ae1be3 Neil Armstrong 2021-10-20 227 writel_relaxed(1, priv->io_base + _REG(ENCI_VIDEO_EN)); e67f6037ae1be3 Neil Armstrong 2021-10-20 228 else e67f6037ae1be3 Neil Armstrong 2021-10-20 229 writel_relaxed(1, priv->io_base + _REG(ENCP_VIDEO_EN)); e67f6037ae1be3 Neil Armstrong 2021-10-20 230 } e67f6037ae1be3 Neil Armstrong 2021-10-20 231 e67f6037ae1be3 Neil Armstrong 2021-10-20 232 static void meson_encoder_hdmi_atomic_disable(struct drm_bridge *bridge, e67f6037ae1be3 Neil Armstrong 2021-10-20 233 struct drm_bridge_state *bridge_state) e67f6037ae1be3 Neil Armstrong 2021-10-20 234 { e67f6037ae1be3 Neil Armstrong 2021-10-20 235 struct meson_encoder_hdmi *encoder_hdmi = bridge_to_meson_encoder_hdmi(bridge); e67f6037ae1be3 Neil Armstrong 2021-10-20 236 struct meson_drm *priv = encoder_hdmi->priv; e67f6037ae1be3 Neil Armstrong 2021-10-20 237 e67f6037ae1be3 Neil Armstrong 2021-10-20 238 writel_bits_relaxed(0x3, 0, e67f6037ae1be3 Neil Armstrong 2021-10-20 239 priv->io_base + _REG(VPU_HDMI_SETTING)); e67f6037ae1be3 Neil Armstrong 2021-10-20 240 e67f6037ae1be3 Neil Armstrong 2021-10-20 241 writel_relaxed(0, priv->io_base + _REG(ENCI_VIDEO_EN)); e67f6037ae1be3 Neil Armstrong 2021-10-20 242 writel_relaxed(0, priv->io_base + _REG(ENCP_VIDEO_EN)); e67f6037ae1be3 Neil Armstrong 2021-10-20 243 } e67f6037ae1be3 Neil Armstrong 2021-10-20 244 e67f6037ae1be3 Neil Armstrong 2021-10-20 245 static const u32 meson_encoder_hdmi_out_bus_fmts[] = { e67f6037ae1be3 Neil Armstrong 2021-10-20 246 MEDIA_BUS_FMT_YUV8_1X24, e67f6037ae1be3 Neil Armstrong 2021-10-20 247 MEDIA_BUS_FMT_UYYVYY8_0_5X24, e67f6037ae1be3 Neil Armstrong 2021-10-20 248 }; e67f6037ae1be3 Neil Armstrong 2021-10-20 249 e67f6037ae1be3 Neil Armstrong 2021-10-20 250 static u32 * e67f6037ae1be3 Neil Armstrong 2021-10-20 251 meson_encoder_hdmi_get_inp_bus_fmts(struct drm_bridge *bridge, e67f6037ae1be3 Neil Armstrong 2021-10-20 252 struct drm_bridge_state *bridge_state, e67f6037ae1be3 Neil Armstrong 2021-10-20 253 struct drm_crtc_state *crtc_state, e67f6037ae1be3 Neil Armstrong 2021-10-20 254 struct drm_connector_state *conn_state, e67f6037ae1be3 Neil Armstrong 2021-10-20 255 u32 output_fmt, e67f6037ae1be3 Neil Armstrong 2021-10-20 256 unsigned int *num_input_fmts) e67f6037ae1be3 Neil Armstrong 2021-10-20 257 { e67f6037ae1be3 Neil Armstrong 2021-10-20 258 u32 *input_fmts = NULL; e67f6037ae1be3 Neil Armstrong 2021-10-20 259 int i; e67f6037ae1be3 Neil Armstrong 2021-10-20 260 e67f6037ae1be3 Neil Armstrong 2021-10-20 261 *num_input_fmts = 0; e67f6037ae1be3 Neil Armstrong 2021-10-20 262 e67f6037ae1be3 Neil Armstrong 2021-10-20 263 for (i = 0 ; i < ARRAY_SIZE(meson_encoder_hdmi_out_bus_fmts) ; ++i) { e67f6037ae1be3 Neil Armstrong 2021-10-20 264 if (output_fmt == meson_encoder_hdmi_out_bus_fmts[i]) { e67f6037ae1be3 Neil Armstrong 2021-10-20 265 *num_input_fmts = 1; e67f6037ae1be3 Neil Armstrong 2021-10-20 266 input_fmts = kcalloc(*num_input_fmts, e67f6037ae1be3 Neil Armstrong 2021-10-20 267 sizeof(*input_fmts), e67f6037ae1be3 Neil Armstrong 2021-10-20 268 GFP_KERNEL); e67f6037ae1be3 Neil Armstrong 2021-10-20 269 if (!input_fmts) e67f6037ae1be3 Neil Armstrong 2021-10-20 270 return NULL; e67f6037ae1be3 Neil Armstrong 2021-10-20 271 e67f6037ae1be3 Neil Armstrong 2021-10-20 272 input_fmts[0] = output_fmt; e67f6037ae1be3 Neil Armstrong 2021-10-20 273 e67f6037ae1be3 Neil Armstrong 2021-10-20 274 break; e67f6037ae1be3 Neil Armstrong 2021-10-20 275 } e67f6037ae1be3 Neil Armstrong 2021-10-20 276 } e67f6037ae1be3 Neil Armstrong 2021-10-20 277 e67f6037ae1be3 Neil Armstrong 2021-10-20 278 return input_fmts; e67f6037ae1be3 Neil Armstrong 2021-10-20 279 } e67f6037ae1be3 Neil Armstrong 2021-10-20 280 e67f6037ae1be3 Neil Armstrong 2021-10-20 281 static int meson_encoder_hdmi_atomic_check(struct drm_bridge *bridge, e67f6037ae1be3 Neil Armstrong 2021-10-20 282 struct drm_bridge_state *bridge_state, e67f6037ae1be3 Neil Armstrong 2021-10-20 283 struct drm_crtc_state *crtc_state, e67f6037ae1be3 Neil Armstrong 2021-10-20 284 struct drm_connector_state *conn_state) e67f6037ae1be3 Neil Armstrong 2021-10-20 285 { e67f6037ae1be3 Neil Armstrong 2021-10-20 286 struct meson_encoder_hdmi *encoder_hdmi = bridge_to_meson_encoder_hdmi(bridge); e67f6037ae1be3 Neil Armstrong 2021-10-20 287 struct drm_connector_state *old_conn_state = e67f6037ae1be3 Neil Armstrong 2021-10-20 288 drm_atomic_get_old_connector_state(conn_state->state, conn_state->connector); e67f6037ae1be3 Neil Armstrong 2021-10-20 @289 struct meson_drm *priv = encoder_hdmi->priv; e67f6037ae1be3 Neil Armstrong 2021-10-20 290 e67f6037ae1be3 Neil Armstrong 2021-10-20 291 encoder_hdmi->output_bus_fmt = bridge_state->output_bus_cfg.format; e67f6037ae1be3 Neil Armstrong 2021-10-20 292 e67f6037ae1be3 Neil Armstrong 2021-10-20 293 dev_dbg(priv->dev, "output_bus_fmt %lx\n", encoder_hdmi->output_bus_fmt); e67f6037ae1be3 Neil Armstrong 2021-10-20 294 e67f6037ae1be3 Neil Armstrong 2021-10-20 295 if (!drm_connector_atomic_hdr_metadata_equal(old_conn_state, conn_state)) e67f6037ae1be3 Neil Armstrong 2021-10-20 296 crtc_state->mode_changed = true; e67f6037ae1be3 Neil Armstrong 2021-10-20 297 e67f6037ae1be3 Neil Armstrong 2021-10-20 298 return 0; e67f6037ae1be3 Neil Armstrong 2021-10-20 299 } e67f6037ae1be3 Neil Armstrong 2021-10-20 300 -- 0-DAY CI Kernel Test Service https://01.org/lkp _______________________________________________ kbuild mailing list -- [email protected] To unsubscribe send an email to [email protected]
