On 03/04/2020 11.11, Sakari Ailus wrote:
Add a printk modifier %ppf (for pixel format) for printing V4L2 and DRM pixel formats denoted by 4ccs. The 4cc encoding is the same for both so the same implementation can be used.
This seems quite niche to me, I'm not sure that belongs in vsprintf.c. What's wrong with having a
char *fourcc_string(char *buf, u32 x)
that formats x into buf and returns buf, so it can be used in a
char buf[8]; pr_debug("bla: %s\n", fourcc_string(buf, x))
Or, for that matter, since it's for debugging, why not just print x with 0x%08x?
At the very least, the "case '4'" in pointer() should be guarded by appropriate CONFIG_*.
Good that Documentation/ gets updated, but test_printf needs updating as well.
Suggested-by: Mauro Carvalho Chehab mchehab@kernel.org Signed-off-by: Sakari Ailus sakari.ailus@linux.intel.com
since v1:
Improve documentation (add -BE suffix, refer to "FourCC".
Use '%p4cc' conversion specifier instead of '%ppf'.
Cute. Remember to update the commit log (which still says %ppf).
Fix 31st bit handling in printing FourCC codes.
Use string() correctly, to allow e.g. proper field width handling.
Remove loop, use put_unaligned_le32() instead.
Documentation/core-api/printk-formats.rst | 12 +++++++++++ lib/vsprintf.c | 25 +++++++++++++++++++++++ 2 files changed, 37 insertions(+)
diff --git a/Documentation/core-api/printk-formats.rst b/Documentation/core-api/printk-formats.rst index 8ebe46b1af39..550568520ab6 100644 --- a/Documentation/core-api/printk-formats.rst +++ b/Documentation/core-api/printk-formats.rst @@ -545,6 +545,18 @@ For printing netdev_features_t.
Passed by reference.
+V4L2 and DRM FourCC code (pixel format) +---------------------------------------
+::
- %p4cc
+Print a FourCC code used by V4L2 or DRM. The "-BE" suffix is added on big endian +formats.
+Passed by reference.
Maybe it's obvious to anyone in that business, but perhaps make it more clear the 4cc is stored in a u32 (and not, e.g., a __le32 or some other integer), that obviously matters when the code treats the pointer as a u32*.
- put_unaligned_le32(*fourcc & ~BIT(31), s);
- if (*fourcc & BIT(31))
strscpy(s + sizeof(*fourcc), FOURCC_STRING_BE,
sizeof(FOURCC_STRING_BE));
put_unaligned_le32(0x0045422d, s + 4) probably generates smaller code, and is more in line with building the first part of the string with put_unaligned_le32().
Rasmus