in meta-facebook/yv35-bb/src/ipmi/plat_ipmi.c [584:633]
void pal_OEM_1S_GET_SET_GPIO(ipmi_msg *msg)
{
uint8_t completion_code = CC_INVALID_LENGTH;
uint8_t gpio_num = gpio_ind_to_num_table[msg->data[1]];
do {
if (msg->data[0] == 0) { // Get GPIO output status
if (msg->data_len != 2) {
break;
}
msg->data[0] = gpio_num;
msg->data[1] = gpio_get(gpio_num);
completion_code = CC_SUCCESS;
} else if (msg->data[0] == 1) { // Set GPIO output status
if (msg->data_len != 3) {
break;
}
msg->data[0] = gpio_num;
gpio_conf(gpio_num, GPIO_OUTPUT);
gpio_set(gpio_num, msg->data[2]);
msg->data[1] = gpio_get(gpio_num);
completion_code = CC_SUCCESS;
} else if (msg->data[0] == 2) { // Get GPIO direction status
if (msg->data_len != 2) {
break;
}
msg->data[0] = gpio_num;
completion_code = CC_NOT_SUPP_IN_CURR_STATE;
} else if (msg->data[0] == 3) { // Set GPIO direction status
if (msg->data_len != 3) {
break;
}
if (msg->data[2]) {
gpio_conf(gpio_num, GPIO_OUTPUT);
} else {
gpio_conf(gpio_num, GPIO_INPUT);
}
msg->data[0] = gpio_num;
msg->data[1] = msg->data[2];
completion_code = CC_SUCCESS;
}
} while (0);
msg->data_len = 2; // Return GPIO number, status
msg->completion_code = completion_code;
return;
}