ret = regmap_read(data->regmap, offset, &rev); if (ret < 0) return ret;
data->rev = rev; return0;
}
/* Read CPUID function protocol */ staticint rmi_cpuid_read(struct sbrmi_data *data, struct apml_cpuid_msg *msg)
{ struct cpu_msr_indata input = {0}; struct cpu_msr_outdata output = {0}; int val = 0; int ret, hw_status;
u16 thread;
mutex_lock(&data->lock); /* cache the rev value to identify if protocol is supported or not */ if (!data->rev) {
ret = sbrmi_get_rev(data); if (ret < 0) goto exit_unlock;
} /* CPUID protocol for REV 0x10 is not supported*/ if (data->rev == 0x10) {
ret = -EOPNOTSUPP; goto exit_unlock;
}
thread = msg->cpu_in_out >> CPUID_MCA_THRD_INDEX;
/* Thread > 127, Thread128 CS register, 1'b1 needs to be set to 1 */ if (thread > 127) {
thread -= 128;
val = 1;
}
ret = regmap_write(data->regmap, SBRMI_THREAD128CS, val); if (ret < 0) goto exit_unlock;
mutex_lock(&data->lock); /* cache the rev value to identify if protocol is supported or not */ if (!data->rev) {
ret = sbrmi_get_rev(data); if (ret < 0) goto exit_unlock;
} /* MCA MSR protocol for REV 0x10 is not supported*/ if (data->rev == 0x10) {
ret = -EOPNOTSUPP; goto exit_unlock;
}
/* Thread > 127, Thread128 CS register, 1'b1 needs to be set to 1 */ if (thread > 127) {
thread -= 128;
val = 1;
}
ret = regmap_write(data->regmap, SBRMI_THREAD128CS, val); if (ret < 0) goto exit_unlock;
int rmi_mailbox_xfer(struct sbrmi_data *data, struct apml_mbox_msg *msg)
{ unsignedint bytes, ec; int i, ret; int sw_status;
u8 byte;
mutex_lock(&data->lock);
msg->fw_ret_code = 0;
/* Indicate firmware a command is to be serviced */
ret = regmap_write(data->regmap, SBRMI_INBNDMSG7, START_CMD); if (ret < 0) goto exit_unlock;
/* Write the command to SBRMI::InBndMsg_inst0 */
ret = regmap_write(data->regmap, SBRMI_INBNDMSG0, msg->cmd); if (ret < 0) goto exit_unlock;
/* *Forbothreadandwritetheinitiator(BMC)writes *CommandDataIn[31:0]toSBRMI::InBndMsg_inst[4:1] *SBRMI_x3C(MSB):SBRMI_x39(LSB)
*/ for (i = 0; i < AMD_SBI_MB_DATA_SIZE; i++) {
byte = (msg->mb_in_out >> i * 8) & 0xff;
ret = regmap_write(data->regmap, SBRMI_INBNDMSG1 + i, byte); if (ret < 0) goto exit_unlock;
}
/* *Write0x01toSBRMI::SoftwareInterrupttonotifyfirmwareto *performtherequestedreadorwritecommand
*/
ret = regmap_write(data->regmap, SBRMI_SW_INTERRUPT, TRIGGER_MAILBOX); if (ret < 0) goto exit_unlock;
/* *FirmwarewillwriteSBRMI::Status[SwAlertSts]=1togenerate *anALERT(ifenabled)toinitiator(BMC)toindicatecompletion *oftherequestedcommand
*/
ret = regmap_read_poll_timeout(data->regmap, SBRMI_STATUS, sw_status,
sw_status & SW_ALERT_MASK, 500, 2000000); if (ret) goto exit_unlock;
ret = regmap_read(data->regmap, SBRMI_OUTBNDMSG7, &ec); if (ret || ec) goto exit_clear_alert;
/* Clear the input value before updating the output data */
msg->mb_in_out = 0;
/* *Forareadoperation,theinitiator(BMC)readsthefirmware *responseCommandDataOut[31:0]fromSBRMI::OutBndMsg_inst[4:1] *{SBRMI_x34(MSB):SBRMI_x31(LSB)}.
*/ for (i = 0; i < AMD_SBI_MB_DATA_SIZE; i++) {
ret = regmap_read(data->regmap,
SBRMI_OUTBNDMSG1 + i, &bytes); if (ret < 0) break;
msg->mb_in_out |= bytes << i * 8;
}
exit_clear_alert: /* *BMCmustwrite1'b1toSBRMI::Status[SwAlertSts]toclearthe *ALERTtoinitiator
*/
ret = regmap_write(data->regmap, SBRMI_STATUS,
sw_status | SW_ALERT_MASK); if (ec) {
ret = -EPROTOTYPE;
msg->fw_ret_code = ec;
}
exit_unlock:
mutex_unlock(&data->lock); return ret;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.