Hi Angelo,
Thanks for the reviews.
On Wed, 2023-06-14 at 10:43 +0200, AngeloGioacchino Del Regno wrote:
OK, Thanks for your advice. I'll take this. >> mtk_gem = mtk_drm_gem_create(dev, args->size, false);> if (IS_ERR(mtk_gem))> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_plane.c b/drivers/gpu/drm/mediatek/mtk_drm_plane.c> index 31f9420aff6f..1cd41454d545 100644> --- a/drivers/gpu/drm/mediatek/mtk_drm_plane.c> +++ b/drivers/gpu/drm/mediatek/mtk_drm_plane.c> @@ -145,6 +145,7 @@ static void mtk_plane_update_new_state(struct drm_plane_state *new_state,> dma_addr_t addr;> dma_addr_t hdr_addr = 0;> unsigned int hdr_pitch = 0;> +int offset;...but offset can never be negative, can it?in that case, this should be unsigned int. src.x1 and src.y1 are 'int', so they can be negative. But I'm not sure does anyone would set the negative to them. I think using 'unsigned int' for offset would be very big after multiply with negative src.x1 or src.y1. So I just use 'int' here to avoid that case. Do you think I should use 'unsigned int' for offset and add the boundary checking for addr? Regard, Jason-JH.Lin >> gem = fb->obj[0];> mtk_gem = to_mtk_gem_obj(gem);> @@ -154,8 +155,10 @@ static void mtk_plane_update_new_state(struct drm_plane_state *new_state,> modifier = fb->modifier;>> if (modifier == DRM_FORMAT_MOD_LINEAR) {> -addr += (new_state->src.x1 >> 16) * fb->format->cpp[0];> -addr += (new_state->src.y1 >> 16) * pitch;> +offset = (new_state->src.x1 >> 16) * fb->format->cpp[0];> +addr += offset;> +offset = (new_state->src.y1 >> 16) * pitch;> +addr += offset;> } else {> int width_in_blocks = ALIGN(fb->width, AFBC_DATA_BLOCK_WIDTH)> / AFBC_DATA_BLOCK_WIDTH;> @@ -163,21 +166,22 @@ static void mtk_plane_update_new_state(struct drm_plane_state *new_state,> / AFBC_DATA_BLOCK_HEIGHT;> int x_offset_in_blocks = (new_state->src.x1 >> 16) / AFBC_DATA_BLOCK_WIDTH;> int y_offset_in_blocks = (new_state->src.y1 >> 16) / AFBC_DATA_BLOCK_HEIGHT;> -int hdr_size;> +int hdr_size, hdr_offset;>> hdr_pitch = width_in_blocks * AFBC_HEADER_BLOCK_SIZE;> pitch = width_in_blocks * AFBC_DATA_BLOCK_WIDTH *> AFBC_DATA_BLOCK_HEIGHT * fb->format->cpp[0];>> hdr_size = ALIGN(hdr_pitch * height_in_blocks, AFBC_HEADER_ALIGNMENT);> +hdr_offset = hdr_pitch * y_offset_in_blocks +> +AFBC_HEADER_BLOCK_SIZE * x_offset_in_blocks;> +hdr_addr = addr + hdr_offset;>> -hdr_addr = addr + hdr_pitch * y_offset_in_blocks +> - AFBC_HEADER_BLOCK_SIZE * x_offset_in_blocks;> /* The data plane is offset by 1 additional block. */> -addr = addr + hdr_size +> - pitch * y_offset_in_blocks +> - AFBC_DATA_BLOCK_WIDTH * AFBC_DATA_BLOCK_HEIGHT *> - fb->format->cpp[0] * (x_offset_in_blocks + 1);> +offset = pitch * y_offset_in_blocks +> + AFBC_DATA_BLOCK_WIDTH * AFBC_DATA_BLOCK_HEIGHT *> + fb->format->cpp[0] * (x_offset_in_blocks + 1);> +addr = addr + hdr_size + offset;> }>> mtk_plane_state->pending.enable = true; ************* MEDIATEK Confidentiality Notice ******************** The information contained in this e-mail message (including any attachments) may be confidential, proprietary, privileged, or otherwise exempt from disclosure under applicable laws. It is intended to be conveyed only to the designated recipient(s). Any use, dissemination, distribution, printing, retaining or copying of this e-mail (including its attachments) by unintended recipient(s) is strictly prohibited and may be unlawful. If you are not an intended recipient of this e-mail, or believe that you have received this e-mail in error, please notify the sender immediately (by replying to this e-mail), delete any and all copies of this e-mail (including any attachments) from your system, and do not disclose the content of this e-mail to any other person. Thank you! |