From: junxiao.bi@windriver.com (Bi Junxiao)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH 2/6] ARM: gic: fix big endian support
Date: Wed, 23 Nov 2011 10:32:11 +0800 [thread overview]
Message-ID: <4ECC5B2B.6030300@windriver.com> (raw)
In-Reply-To: <20111122103308.GB2066@localhost.localdomain>
on 11/22/2011 06:33 PM Dave Martin wrote:
> On Tue, Nov 22, 2011 at 09:47:24AM +0800, Bi Junxiao wrote:
>
>> on 11/22/2011 03:11 AM Nicolas Pitre wrote:
>>
>>> On Tue, 15 Nov 2011, Junxiao Bi wrote:
>>>
>>>
>>>> The irq state from gic is in little-endian mode. We need do endian
>>>> conversion for it in big-endian machine. Usually byte swapping of
>>>> 32-bits word needs 4 assembler instructions for arm machine which
>>>> arch< 6. But since the high order half word of the irq state is
>>>> zero, there is a way that can use lesser instrunctions to improve
>>>> the performance since we only need a bytes swaping of half word.
>>>> That's what swab16_low_half and swab16_high_half do.
>>>>
>>>> Signed-off-by: Junxiao Bi<junxiao.bi@windriver.com>
>>>>
>>> Comments below.
>>>
>>>
>>>> ---
>>>> arch/arm/include/asm/assembler.h | 27 +++++++++++++++++++++++
>>>> arch/arm/include/asm/hardware/entry-macro-gic.S | 7 ++++++
>>>> 2 files changed, 34 insertions(+), 0 deletions(-)
>>>>
>>>> diff --git a/arch/arm/include/asm/assembler.h b/arch/arm/include/asm/assembler.h
>>>> index 29035e8..3ddee22 100644
>>>> --- a/arch/arm/include/asm/assembler.h
>>>> +++ b/arch/arm/include/asm/assembler.h
>>>> @@ -302,4 +302,31 @@
>>>> .size \name , . - \name
>>>> .endm
>>>>
>>>> +/*
>>>> + * swab16_low_half is used to swap the bytes order of the low order
>>>> + * half word, it assumes that the high order half word is zero.
>>>> + * swab16_high_half is used to swap the bytes order of the high order
>>>> + * half word, it assumes that the low order half word is zero.
>>>> + */
>>>> +#if __LINUX_ARM_ARCH__>= 6
>>>> + .macro swab16_low_half, reg
>>>> + rev \reg, \reg
>>>> + .endm
>>>> +
>>>> + .macro swab16_high_half, reg
>>>> + rev \reg, \reg
>>>> + .endm
>>>> +#else
>>>> + .macro swab16_low_half, reg
>>>> + mov \reg, \reg, ror #8
>>>> + orr \reg, \reg, \reg, lsr #16
>>>> + bic \reg, \reg, \reg, lsl #16
>>>> + .endm
>>>>
> Your v6 and<v6 implementations don't seem to produce the same result
> for swab16_low_half.
>
> If reg=0x0000AABB on>=v6 you transform it to 0xBBAA0000, but on<v6
> you translate it to 0x0000BBAA.
>
For swab16_low_half, it assumes that the high order half of the word is
zero. This mean 0x0000AABB is not a qualified number, but 0xAABB0000 is,
it can translate to 0x0000BBAA with this macro which is the same result
with "rev".
> Perhaps you meant to use the rev16 instruction instead of rev?
>
This macro is trying to swap bytes order of a 32-bit word. It make the
assumption about the high half for a more cheaper and less register
usage implementation than swab32. When I first develop this code,
test_for_ltirq is still in entry-macro-gic.S(now it is deleted), I can
not find a temporary register for swab32 which needs two registers in
it. So I introduced this macro. I am not sure whether there are other
cases like test_for_ltirq. Is this marco useful? If so I can make a
separate patch for it.
>
>>> I fail to see how this macro would be generally useful. Presuming that
>>> the top or bottom half has to be zero is not particularly practical.
>>>
>> We can use it to swap bytes order of a 16-bits number in 32-bits
>> register in which case the top or bottom half will be zero. For the
>> \irqstat register, as the original implementation assumes its top
>> half is zero, so I make the same assumption.
>>
>>>> + .macro swab16_high_half, reg
>>>> + swab16_low_half \reg
>>>> + mov \reg, \reg, lsl #16
>>>> + .endm
>>>>
>>> And this doesn't end up cheaper than a plain swab32.
>>>
>> This macro has an advantage that it only needs one register. For
>> swab32, it will need another temporary register besides the target
>> register.
>>
>>> Furthermore, you're using those macros 1) in the gic code, and 2) onli
>>> in the BE8 case. Both of those conditions are only possible on ARMv6
>>> and above anyway, so I'd simply open code a rev instruction inline.
>>>
>> This is not be8 specific. It will be needed for both be8 and be32.
>> So the machine with arch< 6 also needs to be supported.
>>
> I also thought the GIC doesn't get used with<v6? I thought the GIC was
> too new for that, but I'm not an expert on it.
>
I am also not sure about it. I didn't find a official document describe
this.
> Cheers
> ---Dave
>
>
>
next prev parent reply other threads:[~2011-11-23 2:32 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-11-15 2:06 [PATCH 1/6] ARM: fix be8 support for phys/virt address conversion Junxiao Bi
2011-11-15 2:06 ` [PATCH 2/6] ARM: gic: fix big endian support Junxiao Bi
2011-11-21 19:11 ` Nicolas Pitre
2011-11-22 1:47 ` Bi Junxiao
2011-11-22 4:10 ` Nicolas Pitre
2011-11-22 5:22 ` Bi Junxiao
2011-11-22 10:33 ` Dave Martin
2011-11-23 2:32 ` Bi Junxiao [this message]
2011-11-15 2:06 ` [PATCH 3/6] ARM: early_printk: pl01x: " Junxiao Bi
2011-11-15 2:06 ` [PATCH 4/6] ARM: add big endian support for peripheral access Junxiao Bi
2011-11-15 2:06 ` [PATCH 5/6] ARM: Atomic64: fix 64bit ops in BE mode Junxiao Bi
2011-11-21 19:24 ` Nicolas Pitre
2011-11-15 2:06 ` [PATCH 6/6] ARM: support kernel modules in BE8 mode Junxiao Bi
2011-11-21 19:29 ` Nicolas Pitre
2011-11-22 1:32 ` Bi Junxiao
2011-11-22 4:17 ` Nicolas Pitre
2011-11-22 5:27 ` Bi Junxiao
2011-11-22 10:47 ` Dave Martin
2011-11-23 3:30 ` Bi Junxiao
2011-11-21 5:44 ` [PATCH 1/6] ARM: fix be8 support for phys/virt address conversion Bi Junxiao
2011-11-21 18:32 ` Nicolas Pitre
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=4ECC5B2B.6030300@windriver.com \
--to=junxiao.bi@windriver.com \
--cc=linux-arm-kernel@lists.infradead.org \
/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.