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
9acdafbc
Commit
9acdafbc
authored
8 years ago
by
danh-arm
Committed by
GitHub
8 years ago
Browse files
Options
Download
Plain Diff
Merge pull request #793 from jeenu-arm/gic-changes
GIC driver changes for extended power management
parents
9e75fddc
74a9578c
master
v2.5
v2.5-rc1
v2.5-rc0
v2.4
v2.4-rc2
v2.4-rc1
v2.4-rc0
v2.3
v2.3-rc2
v2.3-rc1
v2.3-rc0
v2.2
v2.2-rc2
v2.2-rc1
v2.2-rc0
v2.1
v2.1-rc1
v2.1-rc0
v2.0
v2.0-rc0
v1.6
v1.6-rc1
v1.6-rc0
v1.5
v1.5-rc3
v1.5-rc2
v1.5-rc1
v1.5-rc0
v1.4
v1.4-rc0
arm_cca_v0.2
arm_cca_v0.1
No related merge requests found
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
drivers/arm/gic/v3/gicv3_main.c
+23
-0
drivers/arm/gic/v3/gicv3_main.c
include/drivers/arm/gicv3.h
+2
-0
include/drivers/arm/gicv3.h
include/plat/arm/common/plat_arm.h
+2
-0
include/plat/arm/common/plat_arm.h
plat/arm/board/fvp/fvp_pm.c
+20
-16
plat/arm/board/fvp/fvp_pm.c
plat/arm/common/arm_gicv2.c
+14
-0
plat/arm/common/arm_gicv2.c
plat/arm/common/arm_gicv3.c
+15
-0
plat/arm/common/arm_gicv3.c
plat/arm/common/arm_gicv3_legacy.c
+14
-0
plat/arm/common/arm_gicv3_legacy.c
with
90 additions
and
16 deletions
+90
-16
drivers/arm/gic/v3/gicv3_main.c
View file @
9acdafbc
...
...
@@ -40,6 +40,13 @@
static
const
gicv3_driver_data_t
*
driver_data
;
static
unsigned
int
gicv2_compat
;
/*
* Redistributor power operations are weakly bound so that they can be
* overridden
*/
#pragma weak gicv3_rdistif_off
#pragma weak gicv3_rdistif_on
/*******************************************************************************
* This function initialises the ARM GICv3 driver in EL3 with provided platform
* inputs.
...
...
@@ -188,6 +195,9 @@ void gicv3_rdistif_init(unsigned int proc_num)
assert
(
IS_IN_EL3
());
/* Power on redistributor */
gicv3_rdistif_on
(
proc_num
);
gicr_base
=
driver_data
->
rdistif_base_addrs
[
proc_num
];
/* Set the default attribute of all SGIs and PPIs */
...
...
@@ -210,6 +220,19 @@ void gicv3_rdistif_init(unsigned int proc_num)
}
}
/*******************************************************************************
* Functions to perform power operations on GIC Redistributor
******************************************************************************/
void
gicv3_rdistif_off
(
unsigned
int
proc_num
)
{
return
;
}
void
gicv3_rdistif_on
(
unsigned
int
proc_num
)
{
return
;
}
/*******************************************************************************
* This function enables the GIC CPU interface of the calling CPU using only
* system register accesses.
...
...
This diff is collapsed.
Click to expand it.
include/drivers/arm/gicv3.h
View file @
9acdafbc
...
...
@@ -259,6 +259,8 @@ typedef struct gicv3_driver_data {
void
gicv3_driver_init
(
const
gicv3_driver_data_t
*
plat_driver_data
);
void
gicv3_distif_init
(
void
);
void
gicv3_rdistif_init
(
unsigned
int
proc_num
);
void
gicv3_rdistif_on
(
unsigned
int
proc_num
);
void
gicv3_rdistif_off
(
unsigned
int
proc_num
);
void
gicv3_cpuif_enable
(
unsigned
int
proc_num
);
void
gicv3_cpuif_disable
(
unsigned
int
proc_num
);
unsigned
int
gicv3_get_pending_interrupt_type
(
void
);
...
...
This diff is collapsed.
Click to expand it.
include/plat/arm/common/plat_arm.h
View file @
9acdafbc
...
...
@@ -194,6 +194,8 @@ void plat_arm_gic_driver_init(void);
void
plat_arm_gic_init
(
void
);
void
plat_arm_gic_cpuif_enable
(
void
);
void
plat_arm_gic_cpuif_disable
(
void
);
void
plat_arm_gic_redistif_on
(
void
);
void
plat_arm_gic_redistif_off
(
void
);
void
plat_arm_gic_pcpu_init
(
void
);
void
plat_arm_security_setup
(
void
);
void
plat_arm_pwrc_setup
(
void
);
...
...
This diff is collapsed.
Click to expand it.
plat/arm/board/fvp/fvp_pm.c
View file @
9acdafbc
...
...
@@ -64,19 +64,6 @@ const unsigned int arm_pm_idle_states[] = {
};
#endif
/*******************************************************************************
* Function which implements the common FVP specific operations to power down a
* cpu in response to a CPU_OFF or CPU_SUSPEND request.
******************************************************************************/
static
void
fvp_cpu_pwrdwn_common
(
void
)
{
/* Prevent interrupts from spuriously waking up this cpu */
plat_arm_gic_cpuif_disable
();
/* Program the power controller to power off this cpu. */
fvp_pwrc_write_ppoffr
(
read_mpidr_el1
());
}
/*******************************************************************************
* Function which implements the common FVP specific operations to power down a
* cluster in response to a CPU_OFF or CPU_SUSPEND request.
...
...
@@ -180,7 +167,15 @@ void fvp_pwr_domain_off(const psci_power_state_t *target_state)
* suspended. Perform at least the cpu specific actions followed
* by the cluster specific operations if applicable.
*/
fvp_cpu_pwrdwn_common
();
/* Prevent interrupts from spuriously waking up this cpu */
plat_arm_gic_cpuif_disable
();
/* Turn redistributor off */
plat_arm_gic_redistif_off
();
/* Program the power controller to power off this cpu. */
fvp_pwrc_write_ppoffr
(
read_mpidr_el1
());
if
(
target_state
->
pwr_domain_state
[
ARM_PWR_LVL1
]
==
ARM_LOCAL_STATE_OFF
)
...
...
@@ -213,8 +208,17 @@ void fvp_pwr_domain_suspend(const psci_power_state_t *target_state)
/* Program the power controller to enable wakeup interrupts. */
fvp_pwrc_set_wen
(
mpidr
);
/* Perform the common cpu specific operations */
fvp_cpu_pwrdwn_common
();
/* Prevent interrupts from spuriously waking up this cpu */
plat_arm_gic_cpuif_disable
();
/*
* The Redistributor is not powered off as it can potentially prevent
* wake up events reaching the CPUIF and/or might lead to losing
* register context.
*/
/* Program the power controller to power off this cpu. */
fvp_pwrc_write_ppoffr
(
read_mpidr_el1
());
/* Perform the common cluster specific operations */
if
(
target_state
->
pwr_domain_state
[
ARM_PWR_LVL1
]
==
...
...
This diff is collapsed.
Click to expand it.
plat/arm/common/arm_gicv2.c
View file @
9acdafbc
...
...
@@ -97,3 +97,17 @@ void plat_arm_gic_pcpu_init(void)
{
gicv2_pcpu_distif_init
();
}
/******************************************************************************
* Stubs for Redistributor power management. Although GICv2 doesn't have
* Redistributor interface, these are provided for the sake of uniform GIC API
*****************************************************************************/
void
plat_arm_gic_redistif_on
(
void
)
{
return
;
}
void
plat_arm_gic_redistif_off
(
void
)
{
return
;
}
This diff is collapsed.
Click to expand it.
plat/arm/common/arm_gicv3.c
View file @
9acdafbc
...
...
@@ -43,6 +43,8 @@
#pragma weak plat_arm_gic_cpuif_enable
#pragma weak plat_arm_gic_cpuif_disable
#pragma weak plat_arm_gic_pcpu_init
#pragma weak plat_arm_gic_redistif_on
#pragma weak plat_arm_gic_redistif_off
/* The GICv3 driver only needs to be initialized in EL3 */
static
uintptr_t
rdistif_base_addrs
[
PLATFORM_CORE_COUNT
];
...
...
@@ -115,3 +117,16 @@ void plat_arm_gic_pcpu_init(void)
{
gicv3_rdistif_init
(
plat_my_core_pos
());
}
/******************************************************************************
* ARM common helpers to power GIC redistributor interface
*****************************************************************************/
void
plat_arm_gic_redistif_on
(
void
)
{
gicv3_rdistif_on
(
plat_my_core_pos
());
}
void
plat_arm_gic_redistif_off
(
void
)
{
gicv3_rdistif_off
(
plat_my_core_pos
());
}
This diff is collapsed.
Click to expand it.
plat/arm/common/arm_gicv3_legacy.c
View file @
9acdafbc
...
...
@@ -94,3 +94,17 @@ void plat_arm_gic_pcpu_init(void)
{
arm_gic_pcpu_distif_setup
();
}
/******************************************************************************
* Stubs for Redistributor power management. Although legacy configuration isn't
* supported, these are provided for the sake of uniform GIC API
*****************************************************************************/
void
plat_arm_gic_redistif_on
(
void
)
{
return
;
}
void
plat_arm_gic_redistif_off
(
void
)
{
return
;
}
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