Lines Matching +full:virtual +full:- +full:cpufreq

2  *  pcc-cpufreq.c - Processor Clocking Control firmware cpufreq interface
5 * Copyright (C) 2009 Hewlett-Packard Development Company, L.P.
31 #include <linux/cpufreq.h>
129 if (ioread16(&pcch_hdr->status) & CMD_COMPLETE) in pcc_cmd()
157 (pcch_virt_addr + pcc_cpu_data->input_offset)); in pcc_get_freq()
158 iowrite16(CMD_GET_FREQ, &pcch_hdr->command); in pcc_get_freq()
163 ioread32(pcch_virt_addr + pcc_cpu_data->output_offset); in pcc_get_freq()
165 /* Clear the input buffer - we are done with the current command */ in pcc_get_freq()
166 memset_io((pcch_virt_addr + pcc_cpu_data->input_offset), 0, BUF_SZ); in pcc_get_freq()
168 status = ioread16(&pcch_hdr->status); in pcc_get_freq()
174 iowrite16(0, &pcch_hdr->status); in pcc_get_freq()
175 curr_freq = (((ioread32(&pcch_hdr->nominal) * (output_buffer & 0xff)) in pcc_get_freq()
178 pr_debug("get: SUCCESS: (virtual) output_offset for cpu %d is " in pcc_get_freq()
180 cpu, (pcch_virt_addr + pcc_cpu_data->output_offset), in pcc_get_freq()
193 iowrite16(0, &pcch_hdr->status); in pcc_get_freq()
208 cpu = policy->cpu; in pcc_cpufreq_target()
212 "(virtual) input_offset is 0x%p\n", in pcc_cpufreq_target()
214 (pcch_virt_addr + pcc_cpu_data->input_offset)); in pcc_cpufreq_target()
216 freqs.old = policy->cur; in pcc_cpufreq_target()
222 / (ioread32(&pcch_hdr->nominal) * 1000)) << 8); in pcc_cpufreq_target()
224 (pcch_virt_addr + pcc_cpu_data->input_offset)); in pcc_cpufreq_target()
225 iowrite16(CMD_SET_FREQ, &pcch_hdr->command); in pcc_cpufreq_target()
229 /* Clear the input buffer - we are done with the current command */ in pcc_cpufreq_target()
230 memset_io((pcch_virt_addr + pcc_cpu_data->input_offset), 0, BUF_SZ); in pcc_cpufreq_target()
232 status = ioread16(&pcch_hdr->status); in pcc_cpufreq_target()
233 iowrite16(0, &pcch_hdr->status); in pcc_cpufreq_target()
241 return -EINVAL; in pcc_cpufreq_target()
262 return -ENODEV; in pcc_get_offset()
264 status = acpi_evaluate_object(pr->handle, "PCCP", NULL, &buffer); in pcc_get_offset()
266 return -ENODEV; in pcc_get_offset()
269 if (!pccp || pccp->type != ACPI_TYPE_PACKAGE) { in pcc_get_offset()
270 ret = -ENODEV; in pcc_get_offset()
274 offset = &(pccp->package.elements[0]); in pcc_get_offset()
275 if (!offset || offset->type != ACPI_TYPE_INTEGER) { in pcc_get_offset()
276 ret = -ENODEV; in pcc_get_offset()
280 pcc_cpu_data->input_offset = offset->integer.value; in pcc_get_offset()
282 offset = &(pccp->package.elements[1]); in pcc_get_offset()
283 if (!offset || offset->type != ACPI_TYPE_INTEGER) { in pcc_get_offset()
284 ret = -ENODEV; in pcc_get_offset()
288 pcc_cpu_data->output_offset = offset->integer.value; in pcc_get_offset()
290 memset_io((pcch_virt_addr + pcc_cpu_data->input_offset), 0, BUF_SZ); in pcc_get_offset()
291 memset_io((pcch_virt_addr + pcc_cpu_data->output_offset), 0, BUF_SZ); in pcc_get_offset()
295 cpu, pcc_cpu_data->input_offset, pcc_cpu_data->output_offset); in pcc_get_offset()
331 return -ENODEV; in pcc_cpufreq_do_osc()
334 return -ENODEV; in pcc_cpufreq_do_osc()
337 if (out_obj->type != ACPI_TYPE_BUFFER) { in pcc_cpufreq_do_osc()
338 ret = -ENODEV; in pcc_cpufreq_do_osc()
342 errors = *((u32 *)out_obj->buffer.pointer) & ~(1 << 0); in pcc_cpufreq_do_osc()
344 ret = -ENODEV; in pcc_cpufreq_do_osc()
348 supported = *((u32 *)(out_obj->buffer.pointer + 4)); in pcc_cpufreq_do_osc()
350 ret = -ENODEV; in pcc_cpufreq_do_osc()
360 return -ENODEV; in pcc_cpufreq_do_osc()
363 return -ENODEV; in pcc_cpufreq_do_osc()
366 if (out_obj->type != ACPI_TYPE_BUFFER) { in pcc_cpufreq_do_osc()
367 ret = -ENODEV; in pcc_cpufreq_do_osc()
371 errors = *((u32 *)out_obj->buffer.pointer) & ~(1 << 0); in pcc_cpufreq_do_osc()
373 ret = -ENODEV; in pcc_cpufreq_do_osc()
377 supported = *((u32 *)(out_obj->buffer.pointer + 4)); in pcc_cpufreq_do_osc()
379 ret = -ENODEV; in pcc_cpufreq_do_osc()
400 return -ENODEV; in pcc_cpufreq_evaluate()
403 return -ENODEV; in pcc_cpufreq_evaluate()
416 return -ENODEV; in pcc_cpufreq_evaluate()
419 if (out_obj->type != ACPI_TYPE_PACKAGE) { in pcc_cpufreq_evaluate()
420 ret = -ENODEV; in pcc_cpufreq_evaluate()
424 member = &out_obj->package.elements[0]; in pcc_cpufreq_evaluate()
425 if (member->type != ACPI_TYPE_BUFFER) { in pcc_cpufreq_evaluate()
426 ret = -ENODEV; in pcc_cpufreq_evaluate()
430 mem_resource = (struct pcc_memory_resource *)member->buffer.pointer; in pcc_cpufreq_evaluate()
437 mem_resource->descriptor, mem_resource->length, in pcc_cpufreq_evaluate()
438 mem_resource->space_id, mem_resource->resource_usage, in pcc_cpufreq_evaluate()
439 mem_resource->type_specific, mem_resource->granularity, in pcc_cpufreq_evaluate()
440 mem_resource->minimum, mem_resource->maximum, in pcc_cpufreq_evaluate()
441 mem_resource->translation_offset, in pcc_cpufreq_evaluate()
442 mem_resource->address_length); in pcc_cpufreq_evaluate()
444 if (mem_resource->space_id != ACPI_ADR_SPACE_SYSTEM_MEMORY) { in pcc_cpufreq_evaluate()
445 ret = -ENODEV; in pcc_cpufreq_evaluate()
449 pcch_virt_addr = ioremap(mem_resource->minimum, in pcc_cpufreq_evaluate()
450 mem_resource->address_length); in pcc_cpufreq_evaluate()
453 ret = -ENOMEM; in pcc_cpufreq_evaluate()
458 pr_debug("probe: PCCH header (virtual) addr: 0x%p\n", pcch_hdr); in pcc_cpufreq_evaluate()
463 mem_resource->minimum, ioread32(&pcch_hdr->signature), in pcc_cpufreq_evaluate()
464 ioread16(&pcch_hdr->length), ioread8(&pcch_hdr->major), in pcc_cpufreq_evaluate()
465 ioread8(&pcch_hdr->minor), ioread32(&pcch_hdr->features), in pcc_cpufreq_evaluate()
466 ioread16(&pcch_hdr->command), ioread16(&pcch_hdr->status), in pcc_cpufreq_evaluate()
467 ioread32(&pcch_hdr->latency)); in pcc_cpufreq_evaluate()
474 ioread32(&pcch_hdr->minimum_time), in pcc_cpufreq_evaluate()
475 ioread32(&pcch_hdr->maximum_time), in pcc_cpufreq_evaluate()
476 ioread32(&pcch_hdr->nominal), in pcc_cpufreq_evaluate()
477 ioread32(&pcch_hdr->throttled_frequency), in pcc_cpufreq_evaluate()
478 ioread32(&pcch_hdr->minimum_frequency)); in pcc_cpufreq_evaluate()
480 member = &out_obj->package.elements[1]; in pcc_cpufreq_evaluate()
481 if (member->type != ACPI_TYPE_BUFFER) { in pcc_cpufreq_evaluate()
482 ret = -ENODEV; in pcc_cpufreq_evaluate()
486 reg_resource = (struct pcc_register_resource *)member->buffer.pointer; in pcc_cpufreq_evaluate()
488 doorbell.space_id = reg_resource->space_id; in pcc_cpufreq_evaluate()
489 doorbell.bit_width = reg_resource->bit_width; in pcc_cpufreq_evaluate()
490 doorbell.bit_offset = reg_resource->bit_offset; in pcc_cpufreq_evaluate()
492 doorbell.address = reg_resource->address; in pcc_cpufreq_evaluate()
497 doorbell.access_width, reg_resource->address); in pcc_cpufreq_evaluate()
499 member = &out_obj->package.elements[2]; in pcc_cpufreq_evaluate()
500 if (member->type != ACPI_TYPE_INTEGER) { in pcc_cpufreq_evaluate()
501 ret = -ENODEV; in pcc_cpufreq_evaluate()
505 doorbell_preserve = member->integer.value; in pcc_cpufreq_evaluate()
507 member = &out_obj->package.elements[3]; in pcc_cpufreq_evaluate()
508 if (member->type != ACPI_TYPE_INTEGER) { in pcc_cpufreq_evaluate()
509 ret = -ENODEV; in pcc_cpufreq_evaluate()
513 doorbell_write = member->integer.value; in pcc_cpufreq_evaluate()
521 ret = -ENOMEM; in pcc_cpufreq_evaluate()
525 printk(KERN_DEBUG "pcc-cpufreq: (v%s) driver loaded with frequency" in pcc_cpufreq_evaluate()
527 ioread32(&pcch_hdr->minimum_frequency), in pcc_cpufreq_evaluate()
528 ioread32(&pcch_hdr->nominal)); in pcc_cpufreq_evaluate()
540 unsigned int cpu = policy->cpu; in pcc_cpufreq_cpu_init()
544 result = -1; in pcc_cpufreq_cpu_init()
554 policy->max = policy->cpuinfo.max_freq = in pcc_cpufreq_cpu_init()
555 ioread32(&pcch_hdr->nominal) * 1000; in pcc_cpufreq_cpu_init()
556 policy->min = policy->cpuinfo.min_freq = in pcc_cpufreq_cpu_init()
557 ioread32(&pcch_hdr->minimum_frequency) * 1000; in pcc_cpufreq_cpu_init()
559 pr_debug("init: policy->max is %d, policy->min is %d\n", in pcc_cpufreq_cpu_init()
560 policy->max, policy->min); in pcc_cpufreq_cpu_init()
571 .name = "pcc-cpufreq",
578 /* Skip initialization if another cpufreq driver is there. */ in pcc_cpufreq_probe()
580 return -ENODEV; in pcc_cpufreq_probe()
583 return -ENODEV; in pcc_cpufreq_probe()
616 .name = "pcc-cpufreq",
631 MODULE_ALIAS("platform:pcc-cpufreq");