forked from Minki/linux
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 <javi.merino@arm.com> Acked-by: Jassi Brar <jassisinghbrar@gmail.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
parent
fa0ce4035d
commit
2674dd0b1c
@ -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)
|
|||||||
|
|
||||||
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;
|
||||||
|
Loading…
Reference in New Issue
Block a user