All of lore.kernel.org
 help / color / mirror / Atom feed
From: Aneesh V <aneesh@ti.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH v3 02/10] armv7: add miscellaneous utility macros
Date: Tue, 07 Jun 2011 17:44:19 +0530	[thread overview]
Message-ID: <4DEE161B.2050402@ti.com> (raw)
In-Reply-To: <20110607103923.7E1CC1B993A8@gemini.denx.de>

Dear Wolfgang,

On Tuesday 07 June 2011 04:09 PM, Wolfgang Denk wrote:
> Dear Aneesh V,
>
> In message<4DEDE8D9.7030306@ti.com>  you wrote:
>>
>> As I had mentioned in a previous mail, please note that the above
>> macros are not for the same use-case as clrsetbits*() or friends (I had
>> one macro that did something similar to clrsetbits*() and I intent to
>> remove that in the next revision)
>>
>> The above macros are for bit-field manipulation in a C integer variable
>> - nothing more.
>
> Why cannot we use the existing macros?
>
>> So, if I have to write 5 different fields in a register I first write
>> them into a variable and finally call writel() instead of making 5
>> clrsetbits*() calls.
>
> It does not make much difference to me if you call one macro or
> another 5 times.
>

No it makes a difference. It's 5 writes to a variable typically in an
ARM register + 1 IO access vs 5 IO accesses. It's logically not
equivalent.

Further if the 5 values are constants a smart compiler will fold the
five writes into one write to the ARM register + 1 IO access, which
won't happen if you used 5 clrsetbits*()

Let me give you a solid example:

Problem: We want to read-modify-write an IO register 'reg' affecting 3 
different fields: a, b, and c. The values to be written to the fields
are a_val, b_val, and c_val respectively:

Solution 1 - without any macros:

unsigned int r = readl(reg);
r = (r & ~a_mask) | ((a_val << a_shift) & a_mask)
r = (r & ~b_mask) | ((b_val << b_shift) & b_mask)
r = (r & ~c_mask) | ((c_val << c_shift) & c_mask)
writel(r, reg);

Solution2 - with my macros:

unsigned int r = readl(reg);
set_bit_field(r, a, a_val);
set_bit_field(r, b, b_val);
set_bit_field(r, c, c_val);
writel(r, reg);

Solution3 - with clrsetbits*():

clrsetbits_le32(reg, a_mask, a_val << a_shift);
clrsetbits_le32(reg, b_mask, b_val << b_shift);
clrsetbits_le32(reg, c_mask, c_val << c_shift);


Solution 3 is not acceptable to me because it's clearly not equivalent
to what I want to do. Writing the register 3 times instead of once may
have undesirable side-effects. Even if it worked, it's clearly not
efficient.

If you are forcing me to use solution 1, IMHO you are essentially
forcing me not to use a sub-routine for a task that is repeated many
times in my code, leaving my code to be more error prone and less
readable.

You accuse set_bit_field() of being cryptic. I would say the
implementation of clrsetbits_le32() is even more cryptic with so many
levels of indirection. I think that goes with any sub-routine/API.
You need to read the code/documentation once to know what it does.
After that you take it's functionality for granted and things become
easier for you. If better documentation can improve readability I am
happy to do that.

Also, If you don't like it as a generic API I am willing to make it a
static inline function in my code. But I need a utility function for
this need. If you think the implementation/documentation can be
improved I am willing to work on that too. But please suggest a
solution for this problem.

> It does mater to me to have several incompatible implementations doing
> essentially the same thing.

They are not doing the same thing as explained above.

>
>> There aren't any standard routines available for this need in
>> Linux or U-Boot. I think you had agreed on this fact sometime back.
>
> I agree in so far as I am not aware of any such macros in Linux
> either.  But my conclusion is a different one - it boils down to:
> Linux is way more complex than U-Boot, so if they don;t need this, we
> don't need it either.

I am surprised why Linux doesn't have a solution for this. Perhaps the
reason must be the confusion about the representation of a field that
we discussed below. I suspect there may be non-standard local
implementations in different modules.

Also, as somebody already mentioned, can't we do better than Linux?

>
>
>> No. It was not about code quality. The question was whether these
>> macros were generic enough to be used as the standard U-boot ones. The
>> key question is how do you represent bit fields. There are different
>> alternatives for this.
>>
>> a. bit range (say 5:3)
>> b. shift(3) and field width(3)
>> c. shift(3) and mask(0x38)
>
> d) Value and mask
>
>> We traditionally use (c) and we have auto-generated defines in this form.
>> So, my macros use this format. I was not sure if other SoCs follow the
>> same approach. That's why I suggested making them OMAP specific if you
>> think (c) is not the standard approach.
>
> Actually it does not matter.  See my previous message to Simon: you
> can cover all this with the existing macros, and without adding any
> significant overhead.
>
> So far, I did not see a single good argument why any new, nonstandard
> macros would be needed.

Please consider the above example and let me know if I missed any
solution using the existing standard macros.

best regards,
Aneesh

  reply	other threads:[~2011-06-07 12:14 UTC|newest]

Thread overview: 105+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-03-08 13:07 [U-Boot] [PATCH v2 00/10] armv7: cache maintenance operations Aneesh V
2011-03-08 13:07 ` [U-Boot] [PATCH v2 01/10] arm: make default implementation of cache_flush() weakly linked Aneesh V
2011-03-08 13:07 ` [U-Boot] [PATCH v2 02/10] armv7: add miscellaneous utility macros Aneesh V
2011-03-08 13:07 ` [U-Boot] [PATCH v2 03/10] armv7: cache maintenance operations for armv7 Aneesh V
2011-03-08 13:07 ` [U-Boot] [PATCH v2 04/10] armv7: replace CONFIG_L2_OFF with CONFIG_SYS_NO_L2CACHE Aneesh V
2011-03-08 13:07 ` [U-Boot] [PATCH v2 05/10] armv7: integrate cache maintenance support Aneesh V
2011-03-08 13:07 ` [U-Boot] [PATCH v2 06/10] arm: minor fixes for cache and mmu handling Aneesh V
2011-03-08 13:07 ` [U-Boot] [PATCH v2 07/10] armv7: add PL310 support to u-boot Aneesh V
2011-03-08 13:07 ` [U-Boot] [PATCH v2 08/10] armv7: adapt omap4 to the new cache maintenance framework Aneesh V
2011-03-08 13:07 ` [U-Boot] [PATCH v2 09/10] armv7: adapt omap3 " Aneesh V
2011-03-08 13:07 ` [U-Boot] [PATCH v2 10/10] armv7: adapt s5pc1xx " Aneesh V
2011-04-27  1:05 ` [U-Boot] [PATCH v2 00/10] armv7: cache maintenance operations Simon Glass
2011-05-05  4:48   ` Simon Glass
2011-05-10 10:25     ` Aneesh V
2011-05-12 12:11 ` [U-Boot] [PATCH v3 " Aneesh V
2011-05-12 12:11 ` [U-Boot] [PATCH v3 01/10] arm: make default implementation of cache_flush() weakly linked Aneesh V
2011-05-12 12:11 ` [U-Boot] [PATCH v3 02/10] armv7: add miscellaneous utility macros Aneesh V
2011-05-15 18:44   ` Wolfgang Denk
2011-05-15 22:15     ` Simon Glass
2011-05-16  2:23       ` Eric Cooper
2011-05-16 14:50         ` Simon Glass
2011-05-16 15:52           ` Wolfgang Denk
2011-05-16  5:51       ` Wolfgang Denk
2011-05-17  3:47         ` Simon Glass
2011-05-17  5:27           ` Wolfgang Denk
2011-05-17  8:44             ` Aneesh V
2011-05-17  9:27               ` Wolfgang Denk
2011-05-31  7:54                 ` V, Aneesh
2011-06-01  2:13                   ` Simon Glass
2011-06-01  6:01                     ` Aneesh V
2011-05-16 15:07     ` Aneesh V
2011-06-06 15:57       ` Aneesh V
2011-06-06 18:50         ` Wolfgang Denk
2011-06-07  9:01           ` Aneesh V
2011-06-07 10:39             ` Wolfgang Denk
2011-06-07 12:14               ` Aneesh V [this message]
2011-06-07 15:19                 ` Simon Glass
2011-06-07 15:40                 ` Wolfgang Denk
2011-06-08 11:53                   ` Aneesh V
2011-06-08 21:41                     ` Wolfgang Denk
2011-06-14  8:45                       ` Aneesh V
2011-06-14 10:51                         ` Wolfgang Denk
2011-06-14 11:39                           ` Aneesh V
2011-06-14 13:53                             ` Wolfgang Denk
2011-06-14 15:11                               ` Simon Glass
2011-06-14 18:54                                 ` Wolfgang Denk
2011-06-15 15:19                                   ` Simon Glass
2011-06-15  8:48                               ` Aneesh V
2011-06-15  9:20                                 ` Wolfgang Denk
2011-06-15 11:01                                   ` Aneesh V
2011-06-15 12:04                                     ` Wolfgang Denk
2011-06-15 12:42                                       ` Graeme Russ
2011-06-15 12:51                                         ` Wolfgang Denk
2011-06-15 13:03                                           ` Graeme Russ
2011-06-16 11:07                                           ` Graeme Russ
2011-06-16 11:46                                             ` Wolfgang Denk
2011-06-16 23:58                                               ` Graeme Russ
2011-06-16  5:39                                         ` Aneesh V
2011-06-16  6:19                                           ` Graeme Russ
2011-06-16  8:15                                             ` Wolfgang Denk
2011-06-16 11:10                                               ` Graeme Russ
2011-05-12 12:11 ` [U-Boot] [PATCH v3 03/10] armv7: cache maintenance operations for armv7 Aneesh V
2011-05-15 18:51   ` Wolfgang Denk
2011-05-17  9:17     ` Aneesh V
2011-05-17  9:31       ` Wolfgang Denk
2011-05-17  9:37         ` Aneesh V
2011-05-17  9:58         ` Aneesh V
2011-06-16 14:17           ` Simon Glass
2011-05-12 12:11 ` [U-Boot] [PATCH v3 04/10] armv7: replace CONFIG_L2_OFF with CONFIG_SYS_NO_L2CACHE Aneesh V
2011-05-15 18:53   ` Wolfgang Denk
2011-05-17  9:59     ` Aneesh V
2011-05-17 11:09       ` Wolfgang Denk
2011-06-06 11:39         ` Aneesh V
2011-06-15 10:13           ` Wolfgang Denk
2011-05-12 12:11 ` [U-Boot] [PATCH v3 05/10] armv7: integrate cache maintenance support Aneesh V
2011-05-15 18:55   ` Wolfgang Denk
2011-05-17 10:20     ` Aneesh V
2011-05-17 11:14       ` Wolfgang Denk
2011-05-17 12:06         ` Aneesh V
2011-05-17 12:28           ` Wolfgang Denk
2011-05-17 13:28             ` Aneesh V
2011-05-17 21:37               ` Wolfgang Denk
2011-05-12 12:11 ` [U-Boot] [PATCH v3 06/10] arm: minor fixes for cache and mmu handling Aneesh V
2011-05-12 12:11 ` [U-Boot] [PATCH v3 07/10] armv7: add PL310 support to u-boot Aneesh V
2011-05-12 12:11 ` [U-Boot] [PATCH v3 08/10] armv7: adapt omap4 to the new cache maintenance framework Aneesh V
2011-05-15 18:57   ` Wolfgang Denk
2011-05-12 12:11 ` [U-Boot] [PATCH v3 09/10] armv7: adapt omap3 " Aneesh V
2011-05-15 18:58   ` Wolfgang Denk
2011-05-12 12:11 ` [U-Boot] [PATCH v3 10/10] armv7: adapt s5pc1xx " Aneesh V
2011-05-15 18:59   ` Wolfgang Denk
2011-06-17  9:30 ` [U-Boot] [PATCH v4 0/9] armv7: cache maintenance operations Aneesh V
2011-06-22 17:41   ` Albert ARIBAUD
2011-06-23  5:57     ` V, Aneesh
2011-06-23 19:24     ` Paulraj, Sandeep
2011-06-28  1:44       ` Minkyu Kang
2011-06-28  5:41   ` Albert ARIBAUD
2011-06-17  9:30 ` [U-Boot] [PATCH v4 1/9] arm: make default implementation of cache_flush() weakly linked Aneesh V
2011-06-17  9:30 ` [U-Boot] [PATCH v4 2/9] armv7: cache maintenance operations for armv7 Aneesh V
2011-06-17  9:30 ` [U-Boot] [PATCH v4 3/9] armv7: rename cache related CONFIG flags Aneesh V
2011-06-17  9:30 ` [U-Boot] [PATCH v4 4/9] armv7: integrate cache maintenance support Aneesh V
2011-06-17  9:30 ` [U-Boot] [PATCH v4 5/9] arm: minor fixes for cache and mmu handling Aneesh V
2011-06-17  9:30 ` [U-Boot] [PATCH v4 6/9] armv7: add PL310 support to u-boot Aneesh V
2011-06-17  9:30 ` [U-Boot] [PATCH v4 7/9] armv7: adapt omap4 to the new cache maintenance framework Aneesh V
2011-06-17  9:30 ` [U-Boot] [PATCH v4 8/9] armv7: adapt omap3 " Aneesh V
2011-06-17  9:30 ` [U-Boot] [PATCH v4 9/9] armv7: adapt s5pc1xx " Aneesh V

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4DEE161B.2050402@ti.com \
    --to=aneesh@ti.com \
    --cc=u-boot@lists.denx.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.