[bug report] drm: Add support for the LogiCVC display controller

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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



[Index of Archives]     [Linux DRI Users]     [Linux Intel Graphics]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [XFree86]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux