void pal_SENSOR_GET_SENSOR_READING()

in meta-facebook/yv35-cl/src/ipmi/plat_ipmi.c [576:641]


void pal_SENSOR_GET_SENSOR_READING(ipmi_msg *msg)
{
	uint8_t status, sensor_num;
	int reading;

	if (msg->data_len != 1) {
		msg->completion_code = CC_INVALID_LENGTH;
		return;
	}

	if (!enable_sensor_poll) {
		printf("Reading sensor cache while sensor polling disable\n");
		msg->completion_code = CC_CAN_NOT_RESPOND;
		return;
	}

	sensor_num = msg->data[0];
	status = get_sensor_reading(
		sensor_num, &reading,
		get_from_cache); // Fix to get_from_cache. As need real time reading, use OEM command to get_from_sensor.

	switch (status) {
	case SENSOR_READ_SUCCESS:
		msg->data[0] = reading & 0xff;
		// SDR sensor initialization bit6 enable scan, bit5 enable event
		// retunr data 1 bit 7 set to 0 to disable all event msg. bit 6 set to 0 disable sensor scan
		msg->data[1] =
			((full_sensor_table[SensorNum_SDR_map[sensor_num]].sensor_init & 0x60)
			 << 1);
		msg->data[2] =
			0xc0; // fix to threshold deassert status, BMC will compare with UCR/UNR itself
		msg->data_len = 3;
		msg->completion_code = CC_SUCCESS;
		break;
	case SENSOR_READ_ACUR_SUCCESS:
		msg->data[0] =
			(reading >> 8) & 0xff; // In accurate read case, scale reading to one byte
		// SDR sensor initialization bit6 enable scan, bit5 enable event
		// retunr data 1 bit 7 set to 0 to disable all event msg. bit 6 set to 0 disable sensor scan
		msg->data[1] =
			((full_sensor_table[SensorNum_SDR_map[sensor_num]].sensor_init & 0x60)
			 << 1);
		msg->data[2] =
			0xc0; // fix to threshold deassert status, BMC will compare with UCR/UNR itself
		msg->data_len = 3;
		msg->completion_code = CC_SUCCESS;
		break;
	case SENSOR_READ_4BYTE_ACUR_SUCCESS:
		msg->completion_code = CC_NOT_SUPP_IN_CURR_STATE;
		break;
	case SENSOR_FAIL_TO_ACCESS:
		msg->completion_code = CC_NODE_BUSY; // transection error
		break;
	case SENSOR_NOT_ACCESSIBLE:
		msg->completion_code = CC_NOT_SUPP_IN_CURR_STATE; // DC off
		break;
	case SENSOR_NOT_FOUND:
		msg->completion_code = CC_INVALID_DATA_FIELD; // request sensor number not found
		break;
	case SENSOR_UNSPECIFIED_ERROR:
	default:
		msg->completion_code = CC_UNSPECIFIED_ERROR; // unknown error
		break;
	}
	return;
}