Hello Paul Kocialkowski, The patch efeeaefe9be5: "drm: Add support for the LogiCVC display controller" from May 20, 2022, leads to the following Smatch static checker warning: drivers/gpu/drm/logicvc/logicvc_layer.c:320 logicvc_layer_buffer_find_setup() warn: impossible condition '(hoffset > (((((1))) << (16)) - 1)) => (0-u16max > u16max)' drivers/gpu/drm/logicvc/logicvc_layer.c 258 int logicvc_layer_buffer_find_setup(struct logicvc_drm *logicvc, 259 struct logicvc_layer *layer, 260 struct drm_plane_state *state, 261 struct logicvc_layer_buffer_setup *setup) 262 { 263 struct drm_device *drm_dev = &logicvc->drm_dev; 264 struct drm_framebuffer *fb = state->fb; 265 /* All the supported formats have a single data plane. */ 266 u32 layer_bytespp = fb->format->cpp[0]; 267 u32 layer_stride = layer_bytespp * logicvc->config.row_stride; 268 u32 base_offset = layer->config.base_offset * layer_stride; 269 u32 buffer_offset = layer->config.buffer_offset * layer_stride; 270 u8 buffer_sel = 0; 271 u16 voffset = 0; 272 u16 hoffset = 0; 273 phys_addr_t fb_addr; 274 u32 fb_offset; 275 u32 gap; 276 277 if (!logicvc->reserved_mem_base) { 278 drm_err(drm_dev, "No reserved memory base was registered!\n"); 279 return -ENOMEM; 280 } 281 282 fb_addr = drm_fb_cma_get_gem_addr(fb, state, 0); 283 if (fb_addr < logicvc->reserved_mem_base) { 284 drm_err(drm_dev, 285 "Framebuffer memory below reserved memory base!\n"); 286 return -EINVAL; 287 } 288 289 fb_offset = (u32) (fb_addr - logicvc->reserved_mem_base); 290 291 if (fb_offset < base_offset) { 292 drm_err(drm_dev, 293 "Framebuffer offset below layer base offset!\n"); 294 return -EINVAL; 295 } 296 297 gap = fb_offset - base_offset; 298 299 /* Use the possible video buffers selection. */ 300 if (gap && buffer_offset) { 301 buffer_sel = gap / buffer_offset; 302 if (buffer_sel > LOGICVC_BUFFER_SEL_MAX) 303 buffer_sel = LOGICVC_BUFFER_SEL_MAX; 304 305 gap -= buffer_sel * buffer_offset; 306 } 307 308 /* Use the vertical offset. */ 309 if (gap && layer_stride && logicvc->config.layers_configurable) { 310 voffset = gap / layer_stride; 311 if (voffset > LOGICVC_LAYER_VOFFSET_MAX) 312 voffset = LOGICVC_LAYER_VOFFSET_MAX; 313 314 gap -= voffset * layer_stride; 315 } 316 317 /* Use the horizontal offset. */ 318 if (gap && layer_bytespp && logicvc->config.layers_configurable) { 319 hoffset = gap / layer_bytespp; Can "gap / layer_bytespp" ever be more than USHRT_MAX? Because if so that won't fit into "hoffset" --> 320 if (hoffset > LOGICVC_DIMENSIONS_MAX) 321 hoffset = LOGICVC_DIMENSIONS_MAX; 322 323 gap -= hoffset * layer_bytespp; 324 } 325 326 if (gap) { 327 drm_err(drm_dev, 328 "Unable to find layer %d buffer setup for 0x%x byte gap\n", 329 layer->index, fb_offset - base_offset); 330 return -EINVAL; 331 } 332 333 drm_dbg_kms(drm_dev, "Found layer %d buffer setup for 0x%x byte gap:\n", 334 layer->index, fb_offset - base_offset); 335 336 drm_dbg_kms(drm_dev, "- buffer_sel = 0x%x chunks of 0x%x bytes\n", 337 buffer_sel, buffer_offset); 338 drm_dbg_kms(drm_dev, "- voffset = 0x%x chunks of 0x%x bytes\n", voffset, 339 layer_stride); 340 drm_dbg_kms(drm_dev, "- hoffset = 0x%x chunks of 0x%x bytes\n", hoffset, 341 layer_bytespp); 342 343 if (setup) { 344 setup->buffer_sel = buffer_sel; 345 setup->voffset = voffset; 346 setup->hoffset = hoffset; 347 } 348 349 return 0; 350 } regards, dan carpenter