> Subject:        [PATCH] vexpress: Setup IRQ affinity to A7s for TC2
> Date:   Wed, 9 Jan 2013 14:20:19 +0000
> From:   Punit Agrawal <punit.agra...@arm.com><mailto:punit.agra...@arm.com>
> To:     t...@linaro.org<mailto:t...@linaro.org> 
> <t...@linaro.org><mailto:t...@linaro.org>
> CC:     linaro-...@linaro.org<mailto:linaro-...@linaro.org> 
> <linaro-...@linaro.org><mailto:linaro-...@linaro.org>, Punit Agrawal 
> <punit.agra...@arm.com><mailto:punit.agra...@arm.com>
> 
> 
> 
> On TC2, to maximise power savings, it helps to affine the IRQs to the A7s. Now
> that the cpu to parts mapping is available via /proc/cpuinfo, this patch
> introduces a script to parse this file and build a mask of particular CPU type
> and change the IRQ affinity to this mask.
> 
> The patch also makes the necessary changes to platform specific init script to
> call above script and affine the IRQs to the A7s.
> 
> Lastly, it changes the makefile to include the new script in the target.
> 
> Change-Id: I2fd2840acd4602d9145c7c2f2e839e5dda09ff99
> Signed-off-by: Punit Agrawal 
> <punit.agra...@arm.com><mailto:punit.agra...@arm.com>
> ---
> 
> Hi Tixy,
> 
> I am not quite sure where to send this patch to get it included in Linaro. But
> you seem to have a few patches in this repo, so maybe you can apply this one.


Yes, I can do that. It looks like it copes OK for devices without any
A7's but will give it a test to check that first :-)

We also need to consider how this behaves with the big.LITTLE switcher,
I'll have to ask about that.

> Let me know if you have any feedback on this as well. I would be happy to
> incorporate that as long as the intent of the patches carries through.

One question, what happens if I offline all the A7's at run time? Will
the system stop responding to interrupts, prevent the last A7 being
offlined or migrate the IRQs to the A15s? Guess I can try it out when I
test it, but this might not be until tomorrow now.

---
Tixy

> Thanks,
> Punit
> 
>  device.mk                    |    3 ++-
>  init.arm-versatileexpress.rc |    6 ++++++
>  set_irq_affinity.sh          |   45 
> ++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 53 insertions(+), 1 deletion(-)
>  create mode 100755 set_irq_affinity.sh
> 
> diff --git a/device.mk b/device.mk
> index 6e6c6dd..9ca73e3 100644
> --- a/device.mk
> +++ b/device.mk
> @@ -9,7 +9,8 @@ PRODUCT_COPY_FILES += \
>      device/linaro/vexpress/init.v2p-aarch64.rc:root/init.v2p-aarch64.rc \
>      
> device/linaro/vexpress/ueventd.v2p-aarch64.rc:root/ueventd.v2p-aarch64.rc \
>      device/linaro/vexpress/init.vexpress.sh:system/etc/init.vexpress.sh \
> -    device/linaro/vexpress/initlogo.rle:root/initlogo.rle
> +    device/linaro/vexpress/initlogo.rle:root/initlogo.rle \
> +    device/linaro/vexpress/set_irq_affinity.sh:root/set_irq_affinity.sh
> 
>  PRODUCT_CHARACTERISTICS := tablet,nosdcard
> 
> diff --git a/init.arm-versatileexpress.rc b/init.arm-versatileexpress.rc
> index a71e491..d710f36 100644
> --- a/init.arm-versatileexpress.rc
> +++ b/init.arm-versatileexpress.rc
> @@ -33,6 +33,12 @@ on boot
>      chown system system /sys/class/graphics/fb0/fit_to_screen
>      chown system system /sys/class/graphics/fb1/overlays
> 
> +# setup IRQ affinity to the A7s
> +service setirqaffinity /set_irq_affinity 0xc07
> +    class main
> +    user root
> +    oneshot
> +
>  service faketsd /system/bin/faketsd
>      class main
>      user bluetooth
> diff --git a/set_irq_affinity.sh b/set_irq_affinity.sh
> new file mode 100755
> index 0000000..4a09d61
> --- /dev/null
> +++ b/set_irq_affinity.sh
> @@ -0,0 +1,45 @@
> +#!/system/bin/sh
> +
> +# This script sets the default affinity to the processors with the given 
> part id.
> +#   - part id is in hex (as seen in /proc/cpuinfo)
> +
> +function build_mask_from_part_id {
> +    local IFS
> +    local mask
> +    local ref_part_id
> +
> +    ref_part_id=$1
> +    IFS=$'\n'
> +
> +    for line in `cat /proc/cpuinfo`
> +    do
> +       IFS=':'
> +       set -A tokens $line
> +
> +       if [ "${line#'processor'}" != "$line" ]
> +       then
> +           cpu="${tokens[1]##' '}"
> +       elif [ "${line#'CPU part'}" != "$line" ]
> +       then
> +           part_id="${tokens[1]##' '}"
> +
> +           if [ "$part_id" == "$ref_part_id" ]
> +           then
> +               (( mask |= 1 << $cpu ))
> +           fi
> +       fi
> +    done
> +    echo $(printf "%x" $mask)
> +}
> +
> +ref_part_id=$(echo $1 | tr '[A-Z]' '[a-z]')
> +mask=$(build_mask_from_part_id $ref_part_id)
> +[ -z "$mask" ] && exit
> +
> +echo $mask > /proc/irq/default_smp_affinity
> +
> +for i in `ls /proc/irq`
> +do
> +    affinity_file="/proc/irq/$i/smp_affinity"
> +    [ -e $affinity_file ] && echo $mask > $affinity_file
> +done
> --
> 1.7.9.5


_______________________________________________
linaro-dev mailing list
linaro-dev@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/linaro-dev

Reply via email to