in meta-facebook/yv35-cl/src/ipmi/plat_ipmi.c [759:808]
void pal_OEM_1S_GET_GPIO(ipmi_msg *msg)
{
if (msg->data_len != 0) { // only input enable status
msg->completion_code = CC_INVALID_LENGTH;
return;
}
uint8_t gpio_value, gpio_cnt, data_len;
uint8_t eight_bit_value = 0;
gpio_cnt = gpio_ind_to_num_table_cnt +
(8 - (gpio_ind_to_num_table_cnt %
8)); // Bump up the gpio_ind_to_num_table_cnt to multiple of 8.
data_len = gpio_cnt / 8;
msg->data_len = data_len;
for (uint8_t i = 0; i < gpio_cnt; i++) {
gpio_value =
(i >= gpio_ind_to_num_table_cnt) ? 0 : gpio_get(gpio_ind_to_num_table[i]);
switch (i % 8) {
case 0:
eight_bit_value = gpio_value;
break;
case 1:
eight_bit_value = eight_bit_value | (gpio_value << 1);
break;
case 2:
eight_bit_value = eight_bit_value | (gpio_value << 2);
break;
case 3:
eight_bit_value = eight_bit_value | (gpio_value << 3);
break;
case 4:
eight_bit_value = eight_bit_value | (gpio_value << 4);
break;
case 5:
eight_bit_value = eight_bit_value | (gpio_value << 5);
break;
case 6:
eight_bit_value = eight_bit_value | (gpio_value << 6);
break;
case 7:
eight_bit_value = eight_bit_value | (gpio_value << 7);
break;
}
msg->data[i / 8] = eight_bit_value;
}
msg->completion_code = CC_SUCCESS;
return;
}