aboutsummaryrefslogtreecommitdiff
path: root/hw/occ.c
diff options
context:
space:
mode:
authorStewart Smith <stewart@linux.vnet.ibm.com>2014-11-26 10:27:13 +1100
committerStewart Smith <stewart@linux.vnet.ibm.com>2014-11-26 10:27:13 +1100
commit7e272ea547ea1bd02ae15eba52a7ae5f3de81283 (patch)
treef27dad7054dcb689fafc2e126044bfab2d07ff90 /hw/occ.c
parent69a08f542562d07cb7d8ecd6c289190d80dee163 (diff)
parent82b950bc00a61f0c18634ede0df09fd5fcbc8a59 (diff)
downloadskiboot-7e272ea547ea1bd02ae15eba52a7ae5f3de81283.zip
skiboot-7e272ea547ea1bd02ae15eba52a7ae5f3de81283.tar.gz
skiboot-7e272ea547ea1bd02ae15eba52a7ae5f3de81283.tar.bz2
Merge branch 'update-2.1.1.1'
Diffstat (limited to 'hw/occ.c')
-rw-r--r--hw/occ.c45
1 files changed, 33 insertions, 12 deletions
diff --git a/hw/occ.c b/hw/occ.c
index 74c9deb..5b3c3a6 100644
--- a/hw/occ.c
+++ b/hw/occ.c
@@ -127,8 +127,7 @@ static bool add_cpu_pstate_properties(s8 *pstate_nom)
struct dt_node *power_mgt;
u8 nr_pstates;
/* Arrays for device tree */
- u32 dt_id[MAX_PSTATES];
- u32 dt_freq[MAX_PSTATES];
+ u32 *dt_id, *dt_freq;
int i;
prlog(PR_DEBUG, "OCC: CPU pstate state device tree init\n");
@@ -163,18 +162,32 @@ static bool add_cpu_pstate_properties(s8 *pstate_nom)
return false;
}
- /* Setup arrays for device-tree */
- for( i=0; i < nr_pstates; i++) {
- dt_id[i] = occ_data->pstates[i].id;
- dt_freq[i] = occ_data->pstates[i].freq_khz/1000;
- }
-
power_mgt = dt_find_by_path(dt_root, "/ibm,opal/power-mgt");
if (!power_mgt) {
prerror("OCC: dt node /ibm,opal/power-mgt not found\n");
return false;
}
+ /* Setup arrays for device-tree */
+ /* Allocate memory */
+ dt_id = (u32 *) malloc(MAX_PSTATES * sizeof(u32));
+ if (!dt_id) {
+ printf("OCC: dt_id array alloc failure\n");
+ return false;
+ }
+
+ dt_freq = (u32 *) malloc(MAX_PSTATES * sizeof(u32));
+ if (!dt_freq) {
+ printf("OCC: dt_freq array alloc failure\n");
+ free(dt_id);
+ return false;
+ }
+
+ for( i=0; i < nr_pstates; i++) {
+ dt_id[i] = occ_data->pstates[i].id;
+ dt_freq[i] = occ_data->pstates[i].freq_khz/1000;
+ }
+
/* Add the device-tree entries */
dt_add_property(power_mgt, "ibm,pstate-ids", dt_id, nr_pstates * 4);
dt_add_property(power_mgt, "ibm,pstate-frequencies-mhz", dt_freq, nr_pstates * 4);
@@ -184,6 +197,9 @@ static bool add_cpu_pstate_properties(s8 *pstate_nom)
/* Return pstate to set for each core */
*pstate_nom = occ_data->pstate_nom;
+ /* Free memory */
+ free(dt_id);
+ free(dt_freq);
return true;
}
@@ -321,7 +337,7 @@ static void occ_do_load(u8 scope, u32 dbob_id __unused, u32 seq_id)
}
/* First queue up an OK response to the load message itself */
- rsp = fsp_mkmsg(FSP_RSP_LOAD_OCC, 0 | err);
+ rsp = fsp_mkmsg(FSP_RSP_LOAD_OCC | err, 0);
if (rsp)
rc = fsp_queue_msg(rsp, fsp_freemsg);
if (rc) {
@@ -383,7 +399,7 @@ static void occ_do_reset(u8 scope, u32 dbob_id, u32 seq_id)
}
/* First queue up an OK response to the reset message itself */
- rsp = fsp_mkmsg(FSP_RSP_RESET_OCC, 0 | err);
+ rsp = fsp_mkmsg(FSP_RSP_RESET_OCC | err, 0);
if (rsp)
rc = fsp_queue_msg(rsp, fsp_freemsg);
if (rc) {
@@ -396,8 +412,13 @@ static void occ_do_reset(u8 scope, u32 dbob_id, u32 seq_id)
if (err)
return;
- /* Call HBRT... */
- rc = host_services_occ_start();
+ /*
+ * Call HBRT to stop OCC and leave it stopped. FSP will send load/start
+ * request subsequently. Also after few runtime restarts (currently 3),
+ * FSP will request OCC to left in stopped state.
+ */
+
+ rc = host_services_occ_stop();
/* Handle fallback to preload */
if (rc == -ENOENT && chip->homer_base) {