Commit 2674dd0b authored by Javi Merino's avatar Javi Merino Committed by Russell King

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: default avatarJavi Merino <javi.merino@arm.com>
Acked-by: default avatarJassi Brar <jassisinghbrar@gmail.com>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent fa0ce403
...@@ -1623,6 +1623,11 @@ static inline int _alloc_event(struct pl330_thread *thrd) ...@@ -1623,6 +1623,11 @@ static inline int _alloc_event(struct pl330_thread *thrd)
return -1; 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 /* Upon success, returns IdentityToken for the
* allocated channel, NULL otherwise. * allocated channel, NULL otherwise.
*/ */
...@@ -1647,7 +1652,8 @@ void *pl330_request_channel(const struct pl330_info *pi) ...@@ -1647,7 +1652,8 @@ void *pl330_request_channel(const struct pl330_info *pi)
for (i = 0; i < chans; i++) { for (i = 0; i < chans; i++) {
thrd = &pl330->channels[i]; thrd = &pl330->channels[i];
if (thrd->free) { if ((thrd->free) && (!_manager_ns(thrd) ||
_chan_ns(pi, i))) {
thrd->ev = _alloc_event(thrd); thrd->ev = _alloc_event(thrd);
if (thrd->ev >= 0) { if (thrd->ev >= 0) {
thrd->free = false; thrd->free = false;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment