in cpuidle-pseries.c [164:212]
static int __init parse_cede_parameters(void)
{
struct xcede_latency_payload *payload;
u32 total_xcede_records_size;
u8 xcede_record_size;
u16 payload_size;
int ret, i;
ret = rtas_call(rtas_token("ibm,get-system-parameter"), 3, 1,
NULL, CEDE_LATENCY_TOKEN, __pa(&xcede_latency_parameter),
sizeof(xcede_latency_parameter));
if (ret) {
pr_err("xcede: Error parsing CEDE_LATENCY_TOKEN\n");
return ret;
}
payload_size = be16_to_cpu(xcede_latency_parameter.payload_size);
payload = &xcede_latency_parameter.payload;
xcede_record_size = payload->record_size + 1;
if (xcede_record_size != sizeof(struct xcede_latency_record)) {
pr_err("xcede: Expected record-size %lu. Observed size %u.\n",
sizeof(struct xcede_latency_record), xcede_record_size);
return -EINVAL;
}
pr_info("xcede: xcede_record_size = %d\n", xcede_record_size);
/*
* Since the payload_size includes the last NULL byte and the
* xcede_record_size, the remaining bytes correspond to array of all
* cede_latency settings.
*/
total_xcede_records_size = payload_size - 2;
nr_xcede_records = total_xcede_records_size / xcede_record_size;
for (i = 0; i < nr_xcede_records; i++) {
struct xcede_latency_record *record = &payload->records[i];
u64 latency_ticks = be64_to_cpu(record->latency_ticks);
u8 wake_on_irqs = record->wake_on_irqs;
u8 hint = record->hint;
pr_info("xcede: Record %d : hint = %u, latency = 0x%llx tb ticks, Wake-on-irq = %u\n",
i, hint, latency_ticks, wake_on_irqs);
}
return 0;
}