> On 23 Apr 2025, at 7:09 PM, Petr Mladek <pmla...@suse.com> wrote: > > On Tue 2025-04-22 10:43:59, Geert Uytterhoeven wrote: >> Hi Aditya, >> >> CC netdev >> >>> On Tue, 22 Apr 2025 at 10:30, Aditya Garg <gargadity...@live.com> wrote: >>> On 22-04-2025 01:37 pm, Geert Uytterhoeven wrote: >>>> On Tue, 8 Apr 2025 at 08:48, Aditya Garg <gargadity...@live.com> wrote: >>>>> From: Hector Martin <mar...@marcan.st> >>>>> >>>>> %p4cc is designed for DRM/V4L2 FourCCs with their specific quirks, but >>>>> it's useful to be able to print generic 4-character codes formatted as >>>>> an integer. Extend it to add format specifiers for printing generic >>>>> 32-bit FourCCs with various endian semantics: >>>>> >>>>> %p4ch Host byte order >>>>> %p4cn Network byte order >>>>> %p4cl Little-endian >>>>> %p4cb Big-endian >>>>> >>>>> The endianness determines how bytes are interpreted as a u32, and the >>>>> FourCC is then always printed MSByte-first (this is the opposite of >>>>> V4L/DRM FourCCs). This covers most practical cases, e.g. %p4cn would >>>>> allow printing LSByte-first FourCCs stored in host endian order >>>>> (other than the hex form being in character order, not the integer >>>>> value). >>>>> >>>>> Acked-by: Rasmus Villemoes <li...@rasmusvillemoes.dk> >>>>> Reviewed-by: Andy Shevchenko <andriy.shevche...@linux.intel.com> >>>>> Reviewed-by: Petr Mladek <pmla...@suse.com> >>>>> Tested-by: Petr Mladek <pmla...@suse.com> >>>>> Signed-off-by: Hector Martin <mar...@marcan.st> >>>>> Signed-off-by: Aditya Garg <gargadity...@live.com> >>>> >>>> Thanks for your patch, which is now commit 1938479b2720ebc0 >>>> ("lib/vsprintf: Add support for generic FourCCs by extending %p4cc") >>>> in drm-misc-next/ >>>> >>>>> --- a/Documentation/core-api/printk-formats.rst >>>>> +++ b/Documentation/core-api/printk-formats.rst >>>>> @@ -648,6 +648,38 @@ Examples:: >>>>> %p4cc Y10 little-endian (0x20303159) >>>>> %p4cc NV12 big-endian (0xb231564e) >>>>> >>>>> +Generic FourCC code >>>>> +------------------- >>>>> + >>>>> +:: >>>>> + %p4c[hnlb] gP00 (0x67503030) >>>>> + >>>>> +Print a generic FourCC code, as both ASCII characters and its numerical >>>>> +value as hexadecimal. >>>>> + >>>>> +The generic FourCC code is always printed in the big-endian format, >>>>> +the most significant byte first. This is the opposite of V4L/DRM FourCCs. >>>>> + >>>>> +The additional ``h``, ``n``, ``l``, and ``b`` specifiers define what >>>>> +endianness is used to load the stored bytes. The data might be >>>>> interpreted >>>>> +using the host byte order, network byte order, little-endian, or >>>>> big-endian. >>>>> + >>>>> +Passed by reference. >>>>> + >>>>> +Examples for a little-endian machine, given &(u32)0x67503030:: >>>>> + >>>>> + %p4ch gP00 (0x67503030) >>>>> + %p4cn 00Pg (0x30305067) >>>>> + %p4cl gP00 (0x67503030) >>>>> + %p4cb 00Pg (0x30305067) >>>>> + >>>>> +Examples for a big-endian machine, given &(u32)0x67503030:: >>>>> + >>>>> + %p4ch gP00 (0x67503030) >>>>> + %p4cn 00Pg (0x30305067) >>>> >>>> This doesn't look right to me, as network byte order is big endian? >>>> Note that I didn't check the code. >>> >>> Originally, it was %p4cr (reverse-endian), but on the request of the >>> maintainers, it was changed to %p4cn. >> >> Ah, I found it[1]: >> >> | so, it needs more information that this mimics htonl() / ntohl() for >> networking. >> >> IMHO this does not mimic htonl(), as htonl() is a no-op on big-endian. >> while %p4ch and %p4cl yield different results on big-endian. >> >>> So here network means reverse of host, not strictly big-endian. >> >> Please don't call it "network byte order" if that does not have the same >> meaning as in the network subsystem. >> >> Personally, I like "%p4r" (reverse) more... >> (and "%p4ch" might mean human-readable ;-) >> >> [1] https://lore.kernel.org/all/z8b6dwcrbv-8d...@smile.fi.intel.com > > I have to admit that I was always a bit confused by the meaning of the > new modifiers. And I did give up at some point and decided to do not > block the patch when it made sense to others. > > But I have to agree with Geert here. The current behavior of %p4ch > is confusing on big endian system. I would expect that it does not > revert the ordering. > > Well, I still think that people might find all 4 variants useful. > Andy does not like "r". What about "hR"? It is inspired by > the existing %pmR. > > I tried to implement it and the complexity of the code is similar: > > From f6aa2213cec9b9d25c0506e3112f32e90a18aa7f Mon Sep 17 00:00:00 2001 > From: Petr Mladek <pmla...@suse.com> > Date: Wed, 23 Apr 2025 15:02:10 +0200 > Subject: [PATCH] vsprintf: Use %p4chR instead of %p4cn for reading data in > reversed host ordering > > The generic FourCC format always prints the data using the big endian > order. It is generic because it allows to read the data using a custom > ordering. > > The current code uses "n" for reading data in the reverse host ordering. > It makes the 4 variants [hnbl] consistent with the generic printing > of IPv4 addresses. > > Unfortunately, it creates confusion on big endian systems. For example, > it shows the data &(u32)0x67503030 as > > %p4cn 00Pg (0x30305067) > > But people expect that the ordering stays the same. The network ordering > is a big-endian ordering. > > The problem is that the semantic is not the same. The modifiers affect > the output ordering of IPv4 addresses while they affect the reading order > in case of FourCC code. > > Avoid the confusion by replacing the "n" modifier with "hR", aka > reverse host ordering. > > Signed-off-by: Petr Mladek <pmla...@suse.com> > --- > Documentation/core-api/printk-formats.rst | 10 +++++----- > lib/tests/printf_kunit.c | 2 +- > lib/vsprintf.c | 11 ++++++++--- > 3 files changed, 14 insertions(+), 9 deletions(-) > > diff --git a/Documentation/core-api/printk-formats.rst > b/Documentation/core-api/printk-formats.rst > index 125fd0397510..f531873bb3c9 100644 > --- a/Documentation/core-api/printk-formats.rst > +++ b/Documentation/core-api/printk-formats.rst > @@ -652,7 +652,7 @@ Generic FourCC code > ------------------- > > :: > - %p4c[hnlb] gP00 (0x67503030) > + %p4c[h[R]lb] gP00 (0x67503030) > > Print a generic FourCC code, as both ASCII characters and its numerical > value as hexadecimal. > @@ -660,23 +660,23 @@ value as hexadecimal. > The generic FourCC code is always printed in the big-endian format, > the most significant byte first. This is the opposite of V4L/DRM FourCCs. > > -The additional ``h``, ``n``, ``l``, and ``b`` specifiers define what > +The additional ``h``, ``hR``, ``l``, and ``b`` specifiers define what > endianness is used to load the stored bytes. The data might be interpreted > -using the host byte order, network byte order, little-endian, or big-endian. > +using the host, reversed host byte order, little-endian, or big-endian. > > Passed by reference. > > Examples for a little-endian machine, given &(u32)0x67503030:: > > %p4ch gP00 (0x67503030) > - %p4cn 00Pg (0x30305067) > + %p4chR 00Pg (0x30305067) > %p4cl gP00 (0x67503030) > %p4cb 00Pg (0x30305067) > > Examples for a big-endian machine, given &(u32)0x67503030:: > > %p4ch gP00 (0x67503030) > - %p4cn 00Pg (0x30305067) > + %p4chR 00Pg (0x30305067) > %p4cl 00Pg (0x30305067) > %p4cb gP00 (0x67503030) > > diff --git a/lib/tests/printf_kunit.c b/lib/tests/printf_kunit.c > index b1fa0dcea52f..b8a4b5006f9c 100644 > --- a/lib/tests/printf_kunit.c > +++ b/lib/tests/printf_kunit.c > @@ -738,7 +738,7 @@ static void fourcc_pointer(struct kunit *kunittest) > > fourcc_pointer_test(kunittest, try_cc, ARRAY_SIZE(try_cc), "%p4cc"); > fourcc_pointer_test(kunittest, try_ch, ARRAY_SIZE(try_ch), "%p4ch"); > - fourcc_pointer_test(kunittest, try_cn, ARRAY_SIZE(try_cn), "%p4cn"); > + fourcc_pointer_test(kunittest, try_cn, ARRAY_SIZE(try_cn), "%p4chR");
Maybe rename try_cn to try_chR? In any case, it looks good to me. > fourcc_pointer_test(kunittest, try_cl, ARRAY_SIZE(try_cl), "%p4cl"); > fourcc_pointer_test(kunittest, try_cb, ARRAY_SIZE(try_cb), "%p4cb"); > } > diff --git a/lib/vsprintf.c b/lib/vsprintf.c > index 2c5de4216415..34587b2dbdb1 100644 > --- a/lib/vsprintf.c > +++ b/lib/vsprintf.c > @@ -1804,9 +1804,8 @@ char *fourcc_string(char *buf, char *end, const u32 > *fourcc, > orig = get_unaligned(fourcc); > switch (fmt[2]) { > case 'h': > - break; > - case 'n': > - orig = swab32(orig); > + if (fmt[3] == 'R') > + orig = swab32(orig); > break; > case 'l': > orig = (__force u32)cpu_to_le32(orig); > @@ -2396,6 +2395,12 @@ early_param("no_hash_pointers", > no_hash_pointers_enable); > * read the documentation (path below) first. > * - 'NF' For a netdev_features_t > * - '4cc' V4L2 or DRM FourCC code, with endianness and raw numerical value. > + * - '4c[h[R]lb]' For generic FourCC code with raw numerical value. Both are > + * displayed in the big-endian format. This is the opposite of V4L2 or > + * DRM FourCCs. > + * The additional specifiers define what endianness is used to load > + * the stored bytes. The data might be interpreted using the host, > + * reversed host byte order, little-endian, or big-endian. > * - 'h[CDN]' For a variable-length buffer, it prints it as a hex string with > * a certain separator (' ' by default): > * C colon > -- > 2.49.0 >