[13/21] media: atomisp: Add ia_css_frame_pad_width() helper function
Commit Message
Factor the code to go from width to a properly aligned pitch out of
ia_css_frame_info_set_width().
This is a preparation patch to fix try_fmt() calls returning a bogus
bytesperline value.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
.../runtime/frame/interface/ia_css_frame.h | 2 +
.../atomisp/pci/runtime/frame/src/frame.c | 44 +++++++++++--------
2 files changed, 27 insertions(+), 19 deletions(-)
Comments
On Mon, May 29, 2023 at 1:38 PM Hans de Goede <hdegoede@redhat.com> wrote:
>
> Factor the code to go from width to a properly aligned pitch out of
> ia_css_frame_info_set_width().
>
> This is a preparation patch to fix try_fmt() calls returning a bogus
> bytesperline value.
...
> + /*
> + * frames with a U and V plane of 8 bits per pixel need to have
Frames
> + * all planes aligned, this means double the alignment for the
> + * Y plane if the horizontal decimation is 2.
> + */
> + if (format == IA_CSS_FRAME_FORMAT_YUV420 ||
> + format == IA_CSS_FRAME_FORMAT_YV12 ||
> + format == IA_CSS_FRAME_FORMAT_NV12 ||
> + format == IA_CSS_FRAME_FORMAT_NV21 ||
> + format == IA_CSS_FRAME_FORMAT_BINARY_8 ||
> + format == IA_CSS_FRAME_FORMAT_YUV_LINE)
> + return CEIL_MUL(width, 2 * HIVE_ISP_DDR_WORD_BYTES);
> + else if (format == IA_CSS_FRAME_FORMAT_NV12_TILEY)
> + return CEIL_MUL(width, NV12_TILEY_TILE_WIDTH);
> + else if (format == IA_CSS_FRAME_FORMAT_RAW ||
> + format == IA_CSS_FRAME_FORMAT_RAW_PACKED)
> + return CEIL_MUL(width, 2 * ISP_VEC_NELEMS);
> + else
All 'else':s can be dropped.
> + return CEIL_MUL(width, HIVE_ISP_DDR_WORD_BYTES);
> +}
Hi,
On 5/29/23 22:57, Andy Shevchenko wrote:
> On Mon, May 29, 2023 at 1:38 PM Hans de Goede <hdegoede@redhat.com> wrote:
>>
>> Factor the code to go from width to a properly aligned pitch out of
>> ia_css_frame_info_set_width().
>>
>> This is a preparation patch to fix try_fmt() calls returning a bogus
>> bytesperline value.
>
> ...
>
>> + /*
>> + * frames with a U and V plane of 8 bits per pixel need to have
>
> Frames
>
>> + * all planes aligned, this means double the alignment for the
>> + * Y plane if the horizontal decimation is 2.
>> + */
>> + if (format == IA_CSS_FRAME_FORMAT_YUV420 ||
>> + format == IA_CSS_FRAME_FORMAT_YV12 ||
>> + format == IA_CSS_FRAME_FORMAT_NV12 ||
>> + format == IA_CSS_FRAME_FORMAT_NV21 ||
>> + format == IA_CSS_FRAME_FORMAT_BINARY_8 ||
>> + format == IA_CSS_FRAME_FORMAT_YUV_LINE)
>> + return CEIL_MUL(width, 2 * HIVE_ISP_DDR_WORD_BYTES);
>
>> + else if (format == IA_CSS_FRAME_FORMAT_NV12_TILEY)
>> + return CEIL_MUL(width, NV12_TILEY_TILE_WIDTH);
>> + else if (format == IA_CSS_FRAME_FORMAT_RAW ||
>> + format == IA_CSS_FRAME_FORMAT_RAW_PACKED)
>> + return CEIL_MUL(width, 2 * ISP_VEC_NELEMS);
>> + else
>
> All 'else':s can be dropped.
Actually the whole function is really just a single switch-case,
so I've switched to that since that is even better IMHO.
Regards,
Hans
>
>> + return CEIL_MUL(width, HIVE_ISP_DDR_WORD_BYTES);
>> +}
>
@@ -138,4 +138,6 @@ bool ia_css_frame_is_same_type(
int ia_css_dma_configure_from_info(struct dma_port_config *config,
const struct ia_css_frame_info *info);
+unsigned int ia_css_frame_pad_width(unsigned int width, enum ia_css_frame_format format);
+
#endif /* __IA_CSS_FRAME_H__ */
@@ -269,6 +269,29 @@ int ia_css_frame_init_planes(struct ia_css_frame *frame)
return 0;
}
+unsigned int ia_css_frame_pad_width(unsigned int width, enum ia_css_frame_format format)
+{
+ /*
+ * frames with a U and V plane of 8 bits per pixel need to have
+ * all planes aligned, this means double the alignment for the
+ * Y plane if the horizontal decimation is 2.
+ */
+ if (format == IA_CSS_FRAME_FORMAT_YUV420 ||
+ format == IA_CSS_FRAME_FORMAT_YV12 ||
+ format == IA_CSS_FRAME_FORMAT_NV12 ||
+ format == IA_CSS_FRAME_FORMAT_NV21 ||
+ format == IA_CSS_FRAME_FORMAT_BINARY_8 ||
+ format == IA_CSS_FRAME_FORMAT_YUV_LINE)
+ return CEIL_MUL(width, 2 * HIVE_ISP_DDR_WORD_BYTES);
+ else if (format == IA_CSS_FRAME_FORMAT_NV12_TILEY)
+ return CEIL_MUL(width, NV12_TILEY_TILE_WIDTH);
+ else if (format == IA_CSS_FRAME_FORMAT_RAW ||
+ format == IA_CSS_FRAME_FORMAT_RAW_PACKED)
+ return CEIL_MUL(width, 2 * ISP_VEC_NELEMS);
+ else
+ return CEIL_MUL(width, HIVE_ISP_DDR_WORD_BYTES);
+}
+
void ia_css_frame_info_set_width(struct ia_css_frame_info *info,
unsigned int width,
unsigned int min_padded_width)
@@ -285,25 +308,8 @@ void ia_css_frame_info_set_width(struct ia_css_frame_info *info,
align = max(min_padded_width, width);
info->res.width = width;
- /* frames with a U and V plane of 8 bits per pixel need to have
- all planes aligned, this means double the alignment for the
- Y plane if the horizontal decimation is 2. */
- if (info->format == IA_CSS_FRAME_FORMAT_YUV420 ||
- info->format == IA_CSS_FRAME_FORMAT_YV12 ||
- info->format == IA_CSS_FRAME_FORMAT_NV12 ||
- info->format == IA_CSS_FRAME_FORMAT_NV21 ||
- info->format == IA_CSS_FRAME_FORMAT_BINARY_8 ||
- info->format == IA_CSS_FRAME_FORMAT_YUV_LINE)
- info->padded_width =
- CEIL_MUL(align, 2 * HIVE_ISP_DDR_WORD_BYTES);
- else if (info->format == IA_CSS_FRAME_FORMAT_NV12_TILEY)
- info->padded_width = CEIL_MUL(align, NV12_TILEY_TILE_WIDTH);
- else if (info->format == IA_CSS_FRAME_FORMAT_RAW ||
- info->format == IA_CSS_FRAME_FORMAT_RAW_PACKED)
- info->padded_width = CEIL_MUL(align, 2 * ISP_VEC_NELEMS);
- else {
- info->padded_width = CEIL_MUL(align, HIVE_ISP_DDR_WORD_BYTES);
- }
+ info->padded_width = ia_css_frame_pad_width(align, info->format);
+
IA_CSS_LEAVE_PRIVATE("");
}