/***************************************************************************** Gets called by probe_cpu. Cycles through the table values until we find what we are looking for. *****************************************************************************/ static void search_table(int index, picl_prophdl_t table_hdl) { picl_prophdl_t col_hdl; picl_prophdl_t row_hdl; picl_propinfo_t p_info; int val; char string_val[PICL_PROPNAMELEN_MAX]; for (val = picl_get_next_by_col(table_hdl, &row_hdl); val != PICL_ENDOFLIST; val = picl_get_next_by_col(row_hdl, &row_hdl)) { if (val == PICL_SUCCESS) { for (col_hdl = row_hdl; val != PICL_ENDOFLIST; val = picl_get_next_by_row(col_hdl, &col_hdl)) { if (val == PICL_SUCCESS) { val = picl_get_propinfo(col_hdl, &p_info); if (val == PICL_SUCCESS) { if (p_info.type == PICL_PTYPE_CHARSTRING) { val = picl_get_propval(col_hdl, &string_val, sizeof(string_val)); if (val == PICL_SUCCESS) { assign_string_value(index, string_val); } } } } } } } }
/* * return the first compatible value */ static int montoya_get_first_compatible_value(picl_nodehdl_t nodeh, char **outbuf) { int err; picl_prophdl_t proph; picl_propinfo_t pinfo; picl_prophdl_t tblh; picl_prophdl_t rowproph; char *pval; err = picl_get_propinfo_by_name(nodeh, OBP_PROP_COMPATIBLE, &pinfo, &proph); if (err != PICL_SUCCESS) return (err); if (pinfo.type == PICL_PTYPE_CHARSTRING) { pval = malloc(pinfo.size); if (pval == NULL) return (PICL_FAILURE); err = picl_get_propval(proph, pval, pinfo.size); if (err != PICL_SUCCESS) { free(pval); return (err); } *outbuf = pval; return (PICL_SUCCESS); } if (pinfo.type != PICL_PTYPE_TABLE) return (PICL_FAILURE); /* get first string from table */ err = picl_get_propval(proph, &tblh, pinfo.size); if (err != PICL_SUCCESS) return (err); err = picl_get_next_by_row(tblh, &rowproph); if (err != PICL_SUCCESS) return (err); err = picl_get_propinfo(rowproph, &pinfo); if (err != PICL_SUCCESS) return (err); pval = malloc(pinfo.size); if (pval == NULL) return (PICL_FAILURE); err = picl_get_propval(rowproph, pval, pinfo.size); if (err != PICL_SUCCESS) { free(pval); return (err); } *outbuf = pval; return (PICL_SUCCESS); }
static int change_locator_state(picl_nodehdl_t locator_node, locator_info_t *locator_info) { picl_prophdl_t state_prop; char state[PICL_PROPNAMELEN_MAX]; int err; char *new_state; err = picl_get_prop_by_name(locator_node, "State", &state_prop); if (err != PICL_SUCCESS) { (void) fprintf(stderr, gettext("picl_get_prop_by_name failed: %s\n"), picl_strerror(err)); return (err); } err = picl_get_propval(state_prop, state, sizeof (state)); if (err != PICL_SUCCESS) { (void) fprintf(stderr, gettext("picl_get_propval failed: %s\n"), picl_strerror(err)); return (err); } new_state = (locator_info->new_state) ? locator_info->on : locator_info->off; if (strcmp(state, new_state) != 0) { picl_propinfo_t prop_info; err = picl_get_propinfo(state_prop, &prop_info); if (err != PICL_SUCCESS) { (void) fprintf(stderr, gettext("picl_get_propinfo failed: %s\n"), picl_strerror(err)); return (err); } err = picl_set_propval(state_prop, new_state, prop_info.size); if (err != PICL_SUCCESS) { (void) fprintf(stderr, gettext("picl_set_propval failed: %s\n"), picl_strerror(err)); return (err); } } return (err); }
void prt_node_props(picl_nodehdl_t nodeh) { int ret; picl_prophdl_t proph; picl_propinfo_t pinfo; ret = picl_get_first_prop(nodeh, &proph); while (!ret) { ret = picl_get_propinfo(proph, &pinfo); if (!ret) { if (ret) { PRINTF("\t%s = ", pinfo.name); prt_prop_val(proph, &pinfo); PRINTF("\n"); } } ret = picl_get_next_prop(proph, &proph); } }
/***************************************************************************** Gets called by picl_walk_tree_by_class. Then it cycles through the properties until we find what we are looking for. Once we are done, we return PICL_WALK_TERMINATE to stop picl_walk_tree_by_class from traversing the tree. Note that PICL_PTYPE_UNSIGNED_INT and PICL_PTYPE_INT can either be 4-bytes or 8-bytes. *****************************************************************************/ static int probe_cpu(picl_nodehdl_t node_hdl, void* dummy_arg) { picl_prophdl_t p_hdl; picl_prophdl_t table_hdl; picl_propinfo_t p_info; long long long_long_val; unsigned int uint_val; int index; int int_val; int val; char string_val[PICL_PROPNAMELEN_MAX]; val = picl_get_first_prop(node_hdl, &p_hdl); while (val == PICL_SUCCESS) { called_cpu_probe = 1; val = picl_get_propinfo(p_hdl, &p_info); if (val == PICL_SUCCESS) { for (index = 0; index < NUM_ITEMS; index++) { if (strcasecmp(p_info.name, items[index]) == 0) { if (p_info.type == PICL_PTYPE_UNSIGNED_INT) { if (p_info.size == sizeof(uint_val)) { val = picl_get_propval(p_hdl, &uint_val, sizeof(uint_val)); if (val == PICL_SUCCESS) { long_long_val = uint_val; assign_value(index, long_long_val); } } else if (p_info.size == sizeof(long_long_val)) { val = picl_get_propval(p_hdl, &long_long_val, sizeof(long_long_val)); if (val == PICL_SUCCESS) { assign_value(index, long_long_val); } } } else if (p_info.type == PICL_PTYPE_INT) { if (p_info.size == sizeof(int_val)) { val = picl_get_propval(p_hdl, &int_val, sizeof(int_val)); if (val == PICL_SUCCESS) { long_long_val = int_val; assign_value(index, long_long_val); } } else if (p_info.size == sizeof(long_long_val)) { val = picl_get_propval(p_hdl, &long_long_val, sizeof(long_long_val)); if (val == PICL_SUCCESS) { assign_value(index, long_long_val); } } } else if (p_info.type == PICL_PTYPE_CHARSTRING) { val = picl_get_propval(p_hdl, &string_val, sizeof(string_val)); if (val == PICL_SUCCESS) { assign_string_value(index, string_val); } } else if (p_info.type == PICL_PTYPE_TABLE) { val = picl_get_propval(p_hdl, &table_hdl, p_info.size); if (val == PICL_SUCCESS) { search_table(index, table_hdl); } } break; } else if (index == NUM_ITEMS-1) { if (p_info.type == PICL_PTYPE_CHARSTRING) { val = picl_get_propval(p_hdl, &string_val, sizeof(string_val)); if (val == PICL_SUCCESS) { } } } } } val = picl_get_next_prop(p_hdl, &p_hdl); } return PICL_WALK_TERMINATE; }