fvp_pwrc.c 3.05 KB
Newer Older
1
/*
2
 * Copyright (c) 2013-2016, ARM Limited and Contributors. All rights reserved.
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 * Redistributions of source code must retain the above copyright notice, this
 * list of conditions and the following disclaimer.
 *
 * Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation
 * and/or other materials provided with the distribution.
 *
 * Neither the name of ARM nor the names of its contributors may be used
 * to endorse or promote products derived from this software without specific
 * prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#include <bakery_lock.h>
32
#include <mmio.h>
33
#include <plat_arm.h>
34
#include "../../fvp_def.h"
35
#include "../../fvp_private.h"
36
#include "fvp_pwrc.h"
37
38
39
40
41

/*
 * TODO: Someday there will be a generic power controller api. At the moment
 * each platform has its own pwrc so just exporting functions is fine.
 */
42
ARM_INSTANTIATE_LOCK
43

44
unsigned int fvp_pwrc_get_cpu_wkr(u_register_t mpidr)
45
{
46
	return PSYSR_WK(fvp_pwrc_read_psysr(mpidr));
47
48
}

49
unsigned int fvp_pwrc_read_psysr(u_register_t mpidr)
50
{
51
	unsigned int rc;
52
	arm_lock_get();
53
54
	mmio_write_32(PWRC_BASE + PSYSR_OFF, (unsigned int) mpidr);
	rc = mmio_read_32(PWRC_BASE + PSYSR_OFF);
55
	arm_lock_release();
56
57
58
	return rc;
}

59
void fvp_pwrc_write_pponr(u_register_t mpidr)
60
{
61
	arm_lock_get();
62
	mmio_write_32(PWRC_BASE + PPONR_OFF, (unsigned int) mpidr);
63
	arm_lock_release();
64
65
}

66
void fvp_pwrc_write_ppoffr(u_register_t mpidr)
67
{
68
	arm_lock_get();
69
	mmio_write_32(PWRC_BASE + PPOFFR_OFF, (unsigned int) mpidr);
70
	arm_lock_release();
71
72
}

73
void fvp_pwrc_set_wen(u_register_t mpidr)
74
{
75
	arm_lock_get();
76
77
	mmio_write_32(PWRC_BASE + PWKUPR_OFF,
		      (unsigned int) (PWKUPR_WEN | mpidr));
78
	arm_lock_release();
79
80
}

81
void fvp_pwrc_clr_wen(u_register_t mpidr)
82
{
83
	arm_lock_get();
84
85
	mmio_write_32(PWRC_BASE + PWKUPR_OFF,
		      (unsigned int) mpidr);
86
	arm_lock_release();
87
88
}

89
void fvp_pwrc_write_pcoffr(u_register_t mpidr)
90
{
91
	arm_lock_get();
92
	mmio_write_32(PWRC_BASE + PCOFFR_OFF, (unsigned int) mpidr);
93
	arm_lock_release();
94
95
96
}

/* Nothing else to do here apart from initializing the lock */
97
void plat_arm_pwrc_setup(void)
98
{
99
	arm_lock_init();
100
101
102
103
}