示例#1
0
static ssize_t __erst_get_record_count(void)
{
	struct apei_exec_context ctx;
	int rc;

	erst_exec_ctx_init(&ctx);
	rc = apei_exec_run(&ctx, ACPI_ERST_GET_RECORD_COUNT);
	if (rc)
		return rc;
	return apei_exec_ctx_get_output(&ctx);
}
示例#2
0
static int erst_get_erange(struct erst_erange *range)
{
	struct apei_exec_context ctx;
	int rc;

	erst_exec_ctx_init(&ctx);
	rc = apei_exec_run(&ctx, ACPI_ERST_GET_ERROR_RANGE);
	if (rc)
		return rc;
	range->base = apei_exec_ctx_get_output(&ctx);
	rc = apei_exec_run(&ctx, ACPI_ERST_GET_ERROR_LENGTH);
	if (rc)
		return rc;
	range->size = apei_exec_ctx_get_output(&ctx);
	rc = apei_exec_run(&ctx, ACPI_ERST_GET_ERROR_ATTRIBUTES);
	if (rc)
		return rc;
	range->attr = apei_exec_ctx_get_output(&ctx);

	return 0;
}
示例#3
0
static int __erst_get_next_record_id(u64 *record_id)
{
    struct apei_exec_context ctx;
    int rc;

    erst_exec_ctx_init(&ctx);
    rc = apei_exec_run(&ctx, ACPI_ERST_GET_RECORD_ID);
    if (rc)
        return rc;
    *record_id = apei_exec_ctx_get_output(&ctx);

    return 0;
}
示例#4
0
static int __erst_read_from_storage(u64 record_id, u64 offset)
{
    struct apei_exec_context ctx;
    u64 timeout = FIRMWARE_TIMEOUT;
    u64 val;
    int rc;

    erst_exec_ctx_init(&ctx);
    rc = apei_exec_run(&ctx, ACPI_ERST_BEGIN_READ);
    if (rc)
        return rc;
    apei_exec_ctx_set_input(&ctx, offset);
    rc = apei_exec_run(&ctx, ACPI_ERST_SET_RECORD_OFFSET);
    if (rc)
        return rc;
    apei_exec_ctx_set_input(&ctx, record_id);
    rc = apei_exec_run(&ctx, ACPI_ERST_SET_RECORD_ID);
    if (rc)
        return rc;
    rc = apei_exec_run(&ctx, ACPI_ERST_EXECUTE_OPERATION);
    if (rc)
        return rc;
    for (;;) {
        rc = apei_exec_run(&ctx, ACPI_ERST_CHECK_BUSY_STATUS);
        if (rc)
            return rc;
        val = apei_exec_ctx_get_output(&ctx);
        if (!val)
            break;
        if (erst_timedout(&timeout, SPIN_UNIT))
            return -EIO;
    };
    rc = apei_exec_run(&ctx, ACPI_ERST_GET_COMMAND_STATUS);
    if (rc)
        return rc;
    val = apei_exec_ctx_get_output(&ctx);
    rc = apei_exec_run(&ctx, ACPI_ERST_END);
    if (rc)
        return rc;

    return erst_errno(val);
}