Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in / Register
Toggle navigation
Menu
Open sidebar
adam.huang
Arm Trusted Firmware
Commits
52c96f2a
Commit
52c96f2a
authored
Nov 15, 2019
by
Sandrine Bailleux
Committed by
TrustedFirmware Code Review
Nov 15, 2019
Browse files
Merge "GIC-600: Fix power up sequence" into integration
parents
b27280a8
7a7fbb12
Changes
1
Hide whitespace changes
Inline
Side-by-side
drivers/arm/gic/v3/gic600.c
View file @
52c96f2a
/*
* Copyright (c) 2017, ARM Limited and Contributors. All rights reserved.
* Copyright (c) 2017
-2019
, ARM Limited and Contributors. All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
/*
* Driver for GIC600
-
specific features. This driver only overrides
APIs that are
* different to those generic ones in GICv3 driver.
* Driver for GIC
-
600
specific features. This driver only overrides
*
APIs that are
different to those generic ones in GICv3 driver.
*
* GIC600 supports independently power-gating redistributor interface.
* GIC
-
600 supports independently power-gating redistributor interface.
*/
#include <assert.h>
...
...
@@ -18,22 +18,28 @@
#include "gicv3_private.h"
/* GIC600
-
specific register offsets */
/* GIC
-
600
specific register offsets */
#define GICR_PWRR 0x24
/* GICR_PWRR fields */
#define PWRR_RDPD_SHIFT 0
#define PWRR_RDAG_SHIFT 1
#define PWRR_RDGPD_SHIFT 2
#define PWRR_RDGPO_SHIFT 3
#define PWRR_RDPD (1 << PWRR_RDPD_SHIFT)
#define PWRR_RDAG (1 << PWRR_RDAG_SHIFT)
#define PWRR_RDGPD (1 << PWRR_RDGPD_SHIFT)
#define PWRR_RDGPO (1 << PWRR_RDGPO_SHIFT)
/* Values to write to GICR_PWRR register to power redistributor */
/*
* Values to write to GICR_PWRR register to power redistributor
* for operating through the core (GICR_PWRR.RDAG = 0)
*/
#define PWRR_ON (0 << PWRR_RDPD_SHIFT)
#define PWRR_OFF (1 << PWRR_RDPD_SHIFT)
/* GIC600
-
specific accessor functions */
/* GIC
-
600
specific accessor functions */
static
void
gicr_write_pwrr
(
uintptr_t
base
,
unsigned
int
val
)
{
mmio_write_32
(
base
+
GICR_PWRR
,
val
);
...
...
@@ -44,39 +50,46 @@ static uint32_t gicr_read_pwrr(uintptr_t base)
return
mmio_read_32
(
base
+
GICR_PWRR
);
}
static
int
gicr_group_
powering_down
(
uint32_t
pwrr
)
static
void
gicr_
wait_
group_
not_in_transit
(
uintptr_t
base
)
{
/*
* Whether the redistributor group power down operation is in transit:
* i.e. it's intending to, but not finished yet.
*/
return
((
pwrr
&
PWRR_RDGPD
)
&&
!
(
pwrr
&
PWRR_RDGPO
));
/* Check group not transitioning: RDGPD == RDGPO */
while
(((
gicr_read_pwrr
(
base
)
&
PWRR_RDGPD
)
>>
PWRR_RDGPD_SHIFT
)
!=
((
gicr_read_pwrr
(
base
)
&
PWRR_RDGPO
)
>>
PWRR_RDGPO_SHIFT
))
;
}
static
void
gic600_pwr_on
(
uintptr_t
base
)
{
/* Power on redistributor
*/
gicr_w
r
it
e_pwrr
(
base
,
PWRR_ON
);
do
{
/* Wait until group not transitioning
*/
gicr_w
a
it
_group_not_in_transit
(
base
);
/* Wait until the power on state is reflected */
while
(
gicr_read_pwrr
(
base
)
&
PWRR_RDGPO
)
;
/* Power on redistributor */
gicr_write_pwrr
(
base
,
PWRR_ON
);
/*
* Wait until the power on state is reflected.
* If RDPD == 0 then powered on.
*/
}
while
((
gicr_read_pwrr
(
base
)
&
PWRR_RDPD
)
!=
PWRR_ON
);
}
static
void
gic600_pwr_off
(
uintptr_t
base
)
{
/* Wait until group not transitioning */
gicr_wait_group_not_in_transit
(
base
);
/* Power off redistributor */
gicr_write_pwrr
(
base
,
PWRR_OFF
);
/*
* If this is the last man, turning this redistributor frame off will
* result in the group itself being powered off
. In that case, wait as
* long as it's in transition, or has aborted
the transition altogether
* for any reason.
* result in the group itself being powered off
and RDGPD = 1.
*
In that case, wait as
long as it's in transition, or has aborted
*
the transition altogether
for any reason.
*/
if
(
gicr_read_pwrr
(
base
)
&
PWRR_RDGPD
)
{
while
(
gicr_group_powering_down
(
gicr_read_pwrr
(
base
)))
;
if
(
(
gicr_read_pwrr
(
base
)
&
PWRR_RDGPD
)
!=
0
)
{
/* Wait until group not transitioning */
gicr_wait_group_not_in_transit
(
base
)
;
}
}
...
...
@@ -91,7 +104,7 @@ void gicv3_distif_post_restore(unsigned int proc_num)
}
/*
* Power off GIC600 redistributor
* Power off GIC
-
600 redistributor
*/
void
gicv3_rdistif_off
(
unsigned
int
proc_num
)
{
...
...
@@ -109,7 +122,7 @@ void gicv3_rdistif_off(unsigned int proc_num)
}
/*
* Power on GIC600 redistributor
* Power on GIC
-
600 redistributor
*/
void
gicv3_rdistif_on
(
unsigned
int
proc_num
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment