Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
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
5 years ago
by
Sandrine Bailleux
Committed by
TrustedFirmware Code Review
5 years ago
Browse files
Options
Download
Plain Diff
Merge "GIC-600: Fix power up sequence" into integration
parents
b27280a8
7a7fbb12
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
drivers/arm/gic/v3/gic600.c
+39
-26
drivers/arm/gic/v3/gic600.c
with
39 additions
and
26 deletions
+39
-26
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
)
{
...
...
This diff is collapsed.
Click to expand it.
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
Menu
Projects
Groups
Snippets
Help