From: Javi Merino Date: Wed, 16 Nov 2011 11:21:24 +0000 (+0100) Subject: ARM: 7163/2: PL330: Only register usable channels X-Git-Tag: v3.2-rc4~2^2~14 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=2674dd0b1c07d8b8dfb4872fc7b41841f05cb957;p=profile%2Fivi%2Fkernel-x86-ivi.git ARM: 7163/2: PL330: Only register usable channels When the manager is running non-secure, the only channels that can issue interrupts are the ones that have a 1 in their corresponding bit in Configuration Register 3. The other ones will generate an abort when trying to signal the end of the transaction so they are useless in non-secure mode. Reference: <1320244259-10496-2-git-send-email-javi.merino@arm.com> Signed-off-by: Javi Merino Acked-by: Jassi Brar Signed-off-by: Russell King --- diff --git a/arch/arm/common/pl330.c b/arch/arm/common/pl330.c index 7129cfbdacd..f748a385693 100644 --- a/arch/arm/common/pl330.c +++ b/arch/arm/common/pl330.c @@ -1623,6 +1623,11 @@ static inline int _alloc_event(struct pl330_thread *thrd) return -1; } +static bool _chan_ns(const struct pl330_info *pi, int i) +{ + return pi->pcfg.irq_ns & (1 << i); +} + /* Upon success, returns IdentityToken for the * allocated channel, NULL otherwise. */ @@ -1647,7 +1652,8 @@ void *pl330_request_channel(const struct pl330_info *pi) for (i = 0; i < chans; i++) { thrd = &pl330->channels[i]; - if (thrd->free) { + if ((thrd->free) && (!_manager_ns(thrd) || + _chan_ns(pi, i))) { thrd->ev = _alloc_event(thrd); if (thrd->ev >= 0) { thrd->free = false;