diff options
author | Stewart Smith <stewart@linux.vnet.ibm.com> | 2014-11-26 10:27:13 +1100 |
---|---|---|
committer | Stewart Smith <stewart@linux.vnet.ibm.com> | 2014-11-26 10:27:13 +1100 |
commit | 7e272ea547ea1bd02ae15eba52a7ae5f3de81283 (patch) | |
tree | f27dad7054dcb689fafc2e126044bfab2d07ff90 /hw/occ.c | |
parent | 69a08f542562d07cb7d8ecd6c289190d80dee163 (diff) | |
parent | 82b950bc00a61f0c18634ede0df09fd5fcbc8a59 (diff) | |
download | skiboot-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.c | 45 |
1 files changed, 33 insertions, 12 deletions
@@ -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) { |