x86/boot: Rename overlapping memcpy() to memmove()
[linux/fpc-iii.git] / drivers / acpi / cppc_acpi.c
blob8adac69dba3da52e5bd4ebb7f0780543fc17c51f
1 /*
2 * CPPC (Collaborative Processor Performance Control) methods used by CPUfreq drivers.
4 * (C) Copyright 2014, 2015 Linaro Ltd.
5 * Author: Ashwin Chaugule <ashwin.chaugule@linaro.org>
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; version 2
10 * of the License.
12 * CPPC describes a few methods for controlling CPU performance using
13 * information from a per CPU table called CPC. This table is described in
14 * the ACPI v5.0+ specification. The table consists of a list of
15 * registers which may be memory mapped or hardware registers and also may
16 * include some static integer values.
18 * CPU performance is on an abstract continuous scale as against a discretized
19 * P-state scale which is tied to CPU frequency only. In brief, the basic
20 * operation involves:
22 * - OS makes a CPU performance request. (Can provide min and max bounds)
24 * - Platform (such as BMC) is free to optimize request within requested bounds
25 * depending on power/thermal budgets etc.
27 * - Platform conveys its decision back to OS
29 * The communication between OS and platform occurs through another medium
30 * called (PCC) Platform Communication Channel. This is a generic mailbox like
31 * mechanism which includes doorbell semantics to indicate register updates.
32 * See drivers/mailbox/pcc.c for details on PCC.
34 * Finer details about the PCC and CPPC spec are available in the ACPI v5.1 and
35 * above specifications.
38 #define pr_fmt(fmt) "ACPI CPPC: " fmt
40 #include <linux/cpufreq.h>
41 #include <linux/delay.h>
42 #include <linux/ktime.h>
44 #include <acpi/cppc_acpi.h>
46 * Lock to provide mutually exclusive access to the PCC
47 * channel. e.g. When the remote updates the shared region
48 * with new data, the reader needs to be protected from
49 * other CPUs activity on the same channel.
51 static DEFINE_SPINLOCK(pcc_lock);
54 * The cpc_desc structure contains the ACPI register details
55 * as described in the per CPU _CPC tables. The details
56 * include the type of register (e.g. PCC, System IO, FFH etc.)
57 * and destination addresses which lets us READ/WRITE CPU performance
58 * information using the appropriate I/O methods.
60 static DEFINE_PER_CPU(struct cpc_desc *, cpc_desc_ptr);
62 /* This layer handles all the PCC specifics for CPPC. */
63 static struct mbox_chan *pcc_channel;
64 static void __iomem *pcc_comm_addr;
65 static u64 comm_base_addr;
66 static int pcc_subspace_idx = -1;
67 static bool pcc_channel_acquired;
68 static ktime_t deadline;
69 static unsigned int pcc_mpar, pcc_mrtt;
71 /* pcc mapped address + header size + offset within PCC subspace */
72 #define GET_PCC_VADDR(offs) (pcc_comm_addr + 0x8 + (offs))
75 * Arbitrary Retries in case the remote processor is slow to respond
76 * to PCC commands. Keeping it high enough to cover emulators where
77 * the processors run painfully slow.
79 #define NUM_RETRIES 500
81 static int check_pcc_chan(void)
83 int ret = -EIO;
84 struct acpi_pcct_shared_memory __iomem *generic_comm_base = pcc_comm_addr;
85 ktime_t next_deadline = ktime_add(ktime_get(), deadline);
87 /* Retry in case the remote processor was too slow to catch up. */
88 while (!ktime_after(ktime_get(), next_deadline)) {
90 * Per spec, prior to boot the PCC space wil be initialized by
91 * platform and should have set the command completion bit when
92 * PCC can be used by OSPM
94 if (readw_relaxed(&generic_comm_base->status) & PCC_CMD_COMPLETE) {
95 ret = 0;
96 break;
99 * Reducing the bus traffic in case this loop takes longer than
100 * a few retries.
102 udelay(3);
105 return ret;
108 static int send_pcc_cmd(u16 cmd)
110 int ret = -EIO;
111 struct acpi_pcct_shared_memory *generic_comm_base =
112 (struct acpi_pcct_shared_memory *) pcc_comm_addr;
113 static ktime_t last_cmd_cmpl_time, last_mpar_reset;
114 static int mpar_count;
115 unsigned int time_delta;
118 * For CMD_WRITE we know for a fact the caller should have checked
119 * the channel before writing to PCC space
121 if (cmd == CMD_READ) {
122 ret = check_pcc_chan();
123 if (ret)
124 return ret;
128 * Handle the Minimum Request Turnaround Time(MRTT)
129 * "The minimum amount of time that OSPM must wait after the completion
130 * of a command before issuing the next command, in microseconds"
132 if (pcc_mrtt) {
133 time_delta = ktime_us_delta(ktime_get(), last_cmd_cmpl_time);
134 if (pcc_mrtt > time_delta)
135 udelay(pcc_mrtt - time_delta);
139 * Handle the non-zero Maximum Periodic Access Rate(MPAR)
140 * "The maximum number of periodic requests that the subspace channel can
141 * support, reported in commands per minute. 0 indicates no limitation."
143 * This parameter should be ideally zero or large enough so that it can
144 * handle maximum number of requests that all the cores in the system can
145 * collectively generate. If it is not, we will follow the spec and just
146 * not send the request to the platform after hitting the MPAR limit in
147 * any 60s window
149 if (pcc_mpar) {
150 if (mpar_count == 0) {
151 time_delta = ktime_ms_delta(ktime_get(), last_mpar_reset);
152 if (time_delta < 60 * MSEC_PER_SEC) {
153 pr_debug("PCC cmd not sent due to MPAR limit");
154 return -EIO;
156 last_mpar_reset = ktime_get();
157 mpar_count = pcc_mpar;
159 mpar_count--;
162 /* Write to the shared comm region. */
163 writew_relaxed(cmd, &generic_comm_base->command);
165 /* Flip CMD COMPLETE bit */
166 writew_relaxed(0, &generic_comm_base->status);
168 /* Ring doorbell */
169 ret = mbox_send_message(pcc_channel, &cmd);
170 if (ret < 0) {
171 pr_err("Err sending PCC mbox message. cmd:%d, ret:%d\n",
172 cmd, ret);
173 return ret;
177 * For READs we need to ensure the cmd completed to ensure
178 * the ensuing read()s can proceed. For WRITEs we dont care
179 * because the actual write()s are done before coming here
180 * and the next READ or WRITE will check if the channel
181 * is busy/free at the entry of this call.
183 * If Minimum Request Turnaround Time is non-zero, we need
184 * to record the completion time of both READ and WRITE
185 * command for proper handling of MRTT, so we need to check
186 * for pcc_mrtt in addition to CMD_READ
188 if (cmd == CMD_READ || pcc_mrtt) {
189 ret = check_pcc_chan();
190 if (pcc_mrtt)
191 last_cmd_cmpl_time = ktime_get();
194 mbox_client_txdone(pcc_channel, ret);
195 return ret;
198 static void cppc_chan_tx_done(struct mbox_client *cl, void *msg, int ret)
200 if (ret < 0)
201 pr_debug("TX did not complete: CMD sent:%x, ret:%d\n",
202 *(u16 *)msg, ret);
203 else
204 pr_debug("TX completed. CMD sent:%x, ret:%d\n",
205 *(u16 *)msg, ret);
208 struct mbox_client cppc_mbox_cl = {
209 .tx_done = cppc_chan_tx_done,
210 .knows_txdone = true,
213 static int acpi_get_psd(struct cpc_desc *cpc_ptr, acpi_handle handle)
215 int result = -EFAULT;
216 acpi_status status = AE_OK;
217 struct acpi_buffer buffer = {ACPI_ALLOCATE_BUFFER, NULL};
218 struct acpi_buffer format = {sizeof("NNNNN"), "NNNNN"};
219 struct acpi_buffer state = {0, NULL};
220 union acpi_object *psd = NULL;
221 struct acpi_psd_package *pdomain;
223 status = acpi_evaluate_object_typed(handle, "_PSD", NULL, &buffer,
224 ACPI_TYPE_PACKAGE);
225 if (ACPI_FAILURE(status))
226 return -ENODEV;
228 psd = buffer.pointer;
229 if (!psd || psd->package.count != 1) {
230 pr_debug("Invalid _PSD data\n");
231 goto end;
234 pdomain = &(cpc_ptr->domain_info);
236 state.length = sizeof(struct acpi_psd_package);
237 state.pointer = pdomain;
239 status = acpi_extract_package(&(psd->package.elements[0]),
240 &format, &state);
241 if (ACPI_FAILURE(status)) {
242 pr_debug("Invalid _PSD data for CPU:%d\n", cpc_ptr->cpu_id);
243 goto end;
246 if (pdomain->num_entries != ACPI_PSD_REV0_ENTRIES) {
247 pr_debug("Unknown _PSD:num_entries for CPU:%d\n", cpc_ptr->cpu_id);
248 goto end;
251 if (pdomain->revision != ACPI_PSD_REV0_REVISION) {
252 pr_debug("Unknown _PSD:revision for CPU: %d\n", cpc_ptr->cpu_id);
253 goto end;
256 if (pdomain->coord_type != DOMAIN_COORD_TYPE_SW_ALL &&
257 pdomain->coord_type != DOMAIN_COORD_TYPE_SW_ANY &&
258 pdomain->coord_type != DOMAIN_COORD_TYPE_HW_ALL) {
259 pr_debug("Invalid _PSD:coord_type for CPU:%d\n", cpc_ptr->cpu_id);
260 goto end;
263 result = 0;
264 end:
265 kfree(buffer.pointer);
266 return result;
270 * acpi_get_psd_map - Map the CPUs in a common freq domain.
271 * @all_cpu_data: Ptrs to CPU specific CPPC data including PSD info.
273 * Return: 0 for success or negative value for err.
275 int acpi_get_psd_map(struct cpudata **all_cpu_data)
277 int count_target;
278 int retval = 0;
279 unsigned int i, j;
280 cpumask_var_t covered_cpus;
281 struct cpudata *pr, *match_pr;
282 struct acpi_psd_package *pdomain;
283 struct acpi_psd_package *match_pdomain;
284 struct cpc_desc *cpc_ptr, *match_cpc_ptr;
286 if (!zalloc_cpumask_var(&covered_cpus, GFP_KERNEL))
287 return -ENOMEM;
290 * Now that we have _PSD data from all CPUs, lets setup P-state
291 * domain info.
293 for_each_possible_cpu(i) {
294 pr = all_cpu_data[i];
295 if (!pr)
296 continue;
298 if (cpumask_test_cpu(i, covered_cpus))
299 continue;
301 cpc_ptr = per_cpu(cpc_desc_ptr, i);
302 if (!cpc_ptr)
303 continue;
305 pdomain = &(cpc_ptr->domain_info);
306 cpumask_set_cpu(i, pr->shared_cpu_map);
307 cpumask_set_cpu(i, covered_cpus);
308 if (pdomain->num_processors <= 1)
309 continue;
311 /* Validate the Domain info */
312 count_target = pdomain->num_processors;
313 if (pdomain->coord_type == DOMAIN_COORD_TYPE_SW_ALL)
314 pr->shared_type = CPUFREQ_SHARED_TYPE_ALL;
315 else if (pdomain->coord_type == DOMAIN_COORD_TYPE_HW_ALL)
316 pr->shared_type = CPUFREQ_SHARED_TYPE_HW;
317 else if (pdomain->coord_type == DOMAIN_COORD_TYPE_SW_ANY)
318 pr->shared_type = CPUFREQ_SHARED_TYPE_ANY;
320 for_each_possible_cpu(j) {
321 if (i == j)
322 continue;
324 match_cpc_ptr = per_cpu(cpc_desc_ptr, j);
325 if (!match_cpc_ptr)
326 continue;
328 match_pdomain = &(match_cpc_ptr->domain_info);
329 if (match_pdomain->domain != pdomain->domain)
330 continue;
332 /* Here i and j are in the same domain */
333 if (match_pdomain->num_processors != count_target) {
334 retval = -EFAULT;
335 goto err_ret;
338 if (pdomain->coord_type != match_pdomain->coord_type) {
339 retval = -EFAULT;
340 goto err_ret;
343 cpumask_set_cpu(j, covered_cpus);
344 cpumask_set_cpu(j, pr->shared_cpu_map);
347 for_each_possible_cpu(j) {
348 if (i == j)
349 continue;
351 match_pr = all_cpu_data[j];
352 if (!match_pr)
353 continue;
355 match_cpc_ptr = per_cpu(cpc_desc_ptr, j);
356 if (!match_cpc_ptr)
357 continue;
359 match_pdomain = &(match_cpc_ptr->domain_info);
360 if (match_pdomain->domain != pdomain->domain)
361 continue;
363 match_pr->shared_type = pr->shared_type;
364 cpumask_copy(match_pr->shared_cpu_map,
365 pr->shared_cpu_map);
369 err_ret:
370 for_each_possible_cpu(i) {
371 pr = all_cpu_data[i];
372 if (!pr)
373 continue;
375 /* Assume no coordination on any error parsing domain info */
376 if (retval) {
377 cpumask_clear(pr->shared_cpu_map);
378 cpumask_set_cpu(i, pr->shared_cpu_map);
379 pr->shared_type = CPUFREQ_SHARED_TYPE_ALL;
383 free_cpumask_var(covered_cpus);
384 return retval;
386 EXPORT_SYMBOL_GPL(acpi_get_psd_map);
388 static int register_pcc_channel(int pcc_subspace_idx)
390 struct acpi_pcct_hw_reduced *cppc_ss;
391 unsigned int len;
392 u64 usecs_lat;
394 if (pcc_subspace_idx >= 0) {
395 pcc_channel = pcc_mbox_request_channel(&cppc_mbox_cl,
396 pcc_subspace_idx);
398 if (IS_ERR(pcc_channel)) {
399 pr_err("Failed to find PCC communication channel\n");
400 return -ENODEV;
404 * The PCC mailbox controller driver should
405 * have parsed the PCCT (global table of all
406 * PCC channels) and stored pointers to the
407 * subspace communication region in con_priv.
409 cppc_ss = pcc_channel->con_priv;
411 if (!cppc_ss) {
412 pr_err("No PCC subspace found for CPPC\n");
413 return -ENODEV;
417 * This is the shared communication region
418 * for the OS and Platform to communicate over.
420 comm_base_addr = cppc_ss->base_address;
421 len = cppc_ss->length;
424 * cppc_ss->latency is just a Nominal value. In reality
425 * the remote processor could be much slower to reply.
426 * So add an arbitrary amount of wait on top of Nominal.
428 usecs_lat = NUM_RETRIES * cppc_ss->latency;
429 deadline = ns_to_ktime(usecs_lat * NSEC_PER_USEC);
430 pcc_mrtt = cppc_ss->min_turnaround_time;
431 pcc_mpar = cppc_ss->max_access_rate;
433 pcc_comm_addr = acpi_os_ioremap(comm_base_addr, len);
434 if (!pcc_comm_addr) {
435 pr_err("Failed to ioremap PCC comm region mem\n");
436 return -ENOMEM;
439 /* Set flag so that we dont come here for each CPU. */
440 pcc_channel_acquired = true;
443 return 0;
447 * An example CPC table looks like the following.
449 * Name(_CPC, Package()
451 * 17,
452 * NumEntries
453 * 1,
454 * // Revision
455 * ResourceTemplate(){Register(PCC, 32, 0, 0x120, 2)},
456 * // Highest Performance
457 * ResourceTemplate(){Register(PCC, 32, 0, 0x124, 2)},
458 * // Nominal Performance
459 * ResourceTemplate(){Register(PCC, 32, 0, 0x128, 2)},
460 * // Lowest Nonlinear Performance
461 * ResourceTemplate(){Register(PCC, 32, 0, 0x12C, 2)},
462 * // Lowest Performance
463 * ResourceTemplate(){Register(PCC, 32, 0, 0x130, 2)},
464 * // Guaranteed Performance Register
465 * ResourceTemplate(){Register(PCC, 32, 0, 0x110, 2)},
466 * // Desired Performance Register
467 * ResourceTemplate(){Register(SystemMemory, 0, 0, 0, 0)},
468 * ..
469 * ..
470 * ..
473 * Each Register() encodes how to access that specific register.
474 * e.g. a sample PCC entry has the following encoding:
476 * Register (
477 * PCC,
478 * AddressSpaceKeyword
479 * 8,
480 * //RegisterBitWidth
481 * 8,
482 * //RegisterBitOffset
483 * 0x30,
484 * //RegisterAddress
486 * //AccessSize (subspace ID)
493 * acpi_cppc_processor_probe - Search for per CPU _CPC objects.
494 * @pr: Ptr to acpi_processor containing this CPUs logical Id.
496 * Return: 0 for success or negative value for err.
498 int acpi_cppc_processor_probe(struct acpi_processor *pr)
500 struct acpi_buffer output = {ACPI_ALLOCATE_BUFFER, NULL};
501 union acpi_object *out_obj, *cpc_obj;
502 struct cpc_desc *cpc_ptr;
503 struct cpc_reg *gas_t;
504 acpi_handle handle = pr->handle;
505 unsigned int num_ent, i, cpc_rev;
506 acpi_status status;
507 int ret = -EFAULT;
509 /* Parse the ACPI _CPC table for this cpu. */
510 status = acpi_evaluate_object_typed(handle, "_CPC", NULL, &output,
511 ACPI_TYPE_PACKAGE);
512 if (ACPI_FAILURE(status)) {
513 ret = -ENODEV;
514 goto out_buf_free;
517 out_obj = (union acpi_object *) output.pointer;
519 cpc_ptr = kzalloc(sizeof(struct cpc_desc), GFP_KERNEL);
520 if (!cpc_ptr) {
521 ret = -ENOMEM;
522 goto out_buf_free;
525 /* First entry is NumEntries. */
526 cpc_obj = &out_obj->package.elements[0];
527 if (cpc_obj->type == ACPI_TYPE_INTEGER) {
528 num_ent = cpc_obj->integer.value;
529 } else {
530 pr_debug("Unexpected entry type(%d) for NumEntries\n",
531 cpc_obj->type);
532 goto out_free;
535 /* Only support CPPCv2. Bail otherwise. */
536 if (num_ent != CPPC_NUM_ENT) {
537 pr_debug("Firmware exports %d entries. Expected: %d\n",
538 num_ent, CPPC_NUM_ENT);
539 goto out_free;
542 /* Second entry should be revision. */
543 cpc_obj = &out_obj->package.elements[1];
544 if (cpc_obj->type == ACPI_TYPE_INTEGER) {
545 cpc_rev = cpc_obj->integer.value;
546 } else {
547 pr_debug("Unexpected entry type(%d) for Revision\n",
548 cpc_obj->type);
549 goto out_free;
552 if (cpc_rev != CPPC_REV) {
553 pr_debug("Firmware exports revision:%d. Expected:%d\n",
554 cpc_rev, CPPC_REV);
555 goto out_free;
558 /* Iterate through remaining entries in _CPC */
559 for (i = 2; i < num_ent; i++) {
560 cpc_obj = &out_obj->package.elements[i];
562 if (cpc_obj->type == ACPI_TYPE_INTEGER) {
563 cpc_ptr->cpc_regs[i-2].type = ACPI_TYPE_INTEGER;
564 cpc_ptr->cpc_regs[i-2].cpc_entry.int_value = cpc_obj->integer.value;
565 } else if (cpc_obj->type == ACPI_TYPE_BUFFER) {
566 gas_t = (struct cpc_reg *)
567 cpc_obj->buffer.pointer;
570 * The PCC Subspace index is encoded inside
571 * the CPC table entries. The same PCC index
572 * will be used for all the PCC entries,
573 * so extract it only once.
575 if (gas_t->space_id == ACPI_ADR_SPACE_PLATFORM_COMM) {
576 if (pcc_subspace_idx < 0)
577 pcc_subspace_idx = gas_t->access_width;
578 else if (pcc_subspace_idx != gas_t->access_width) {
579 pr_debug("Mismatched PCC ids.\n");
580 goto out_free;
582 } else if (gas_t->space_id != ACPI_ADR_SPACE_SYSTEM_MEMORY) {
583 /* Support only PCC and SYS MEM type regs */
584 pr_debug("Unsupported register type: %d\n", gas_t->space_id);
585 goto out_free;
588 cpc_ptr->cpc_regs[i-2].type = ACPI_TYPE_BUFFER;
589 memcpy(&cpc_ptr->cpc_regs[i-2].cpc_entry.reg, gas_t, sizeof(*gas_t));
590 } else {
591 pr_debug("Err in entry:%d in CPC table of CPU:%d \n", i, pr->id);
592 goto out_free;
595 /* Store CPU Logical ID */
596 cpc_ptr->cpu_id = pr->id;
598 /* Plug it into this CPUs CPC descriptor. */
599 per_cpu(cpc_desc_ptr, pr->id) = cpc_ptr;
601 /* Parse PSD data for this CPU */
602 ret = acpi_get_psd(cpc_ptr, handle);
603 if (ret)
604 goto out_free;
606 /* Register PCC channel once for all CPUs. */
607 if (!pcc_channel_acquired) {
608 ret = register_pcc_channel(pcc_subspace_idx);
609 if (ret)
610 goto out_free;
613 /* Everything looks okay */
614 pr_debug("Parsed CPC struct for CPU: %d\n", pr->id);
616 kfree(output.pointer);
617 return 0;
619 out_free:
620 kfree(cpc_ptr);
622 out_buf_free:
623 kfree(output.pointer);
624 return ret;
626 EXPORT_SYMBOL_GPL(acpi_cppc_processor_probe);
629 * acpi_cppc_processor_exit - Cleanup CPC structs.
630 * @pr: Ptr to acpi_processor containing this CPUs logical Id.
632 * Return: Void
634 void acpi_cppc_processor_exit(struct acpi_processor *pr)
636 struct cpc_desc *cpc_ptr;
637 cpc_ptr = per_cpu(cpc_desc_ptr, pr->id);
638 kfree(cpc_ptr);
640 EXPORT_SYMBOL_GPL(acpi_cppc_processor_exit);
643 * Since cpc_read and cpc_write are called while holding pcc_lock, it should be
644 * as fast as possible. We have already mapped the PCC subspace during init, so
645 * we can directly write to it.
648 static int cpc_read(struct cpc_reg *reg, u64 *val)
650 int ret_val = 0;
652 *val = 0;
653 if (reg->space_id == ACPI_ADR_SPACE_PLATFORM_COMM) {
654 void __iomem *vaddr = GET_PCC_VADDR(reg->address);
656 switch (reg->bit_width) {
657 case 8:
658 *val = readb_relaxed(vaddr);
659 break;
660 case 16:
661 *val = readw_relaxed(vaddr);
662 break;
663 case 32:
664 *val = readl_relaxed(vaddr);
665 break;
666 case 64:
667 *val = readq_relaxed(vaddr);
668 break;
669 default:
670 pr_debug("Error: Cannot read %u bit width from PCC\n",
671 reg->bit_width);
672 ret_val = -EFAULT;
674 } else
675 ret_val = acpi_os_read_memory((acpi_physical_address)reg->address,
676 val, reg->bit_width);
677 return ret_val;
680 static int cpc_write(struct cpc_reg *reg, u64 val)
682 int ret_val = 0;
684 if (reg->space_id == ACPI_ADR_SPACE_PLATFORM_COMM) {
685 void __iomem *vaddr = GET_PCC_VADDR(reg->address);
687 switch (reg->bit_width) {
688 case 8:
689 writeb_relaxed(val, vaddr);
690 break;
691 case 16:
692 writew_relaxed(val, vaddr);
693 break;
694 case 32:
695 writel_relaxed(val, vaddr);
696 break;
697 case 64:
698 writeq_relaxed(val, vaddr);
699 break;
700 default:
701 pr_debug("Error: Cannot write %u bit width to PCC\n",
702 reg->bit_width);
703 ret_val = -EFAULT;
704 break;
706 } else
707 ret_val = acpi_os_write_memory((acpi_physical_address)reg->address,
708 val, reg->bit_width);
709 return ret_val;
713 * cppc_get_perf_caps - Get a CPUs performance capabilities.
714 * @cpunum: CPU from which to get capabilities info.
715 * @perf_caps: ptr to cppc_perf_caps. See cppc_acpi.h
717 * Return: 0 for success with perf_caps populated else -ERRNO.
719 int cppc_get_perf_caps(int cpunum, struct cppc_perf_caps *perf_caps)
721 struct cpc_desc *cpc_desc = per_cpu(cpc_desc_ptr, cpunum);
722 struct cpc_register_resource *highest_reg, *lowest_reg, *ref_perf,
723 *nom_perf;
724 u64 high, low, ref, nom;
725 int ret = 0;
727 if (!cpc_desc) {
728 pr_debug("No CPC descriptor for CPU:%d\n", cpunum);
729 return -ENODEV;
732 highest_reg = &cpc_desc->cpc_regs[HIGHEST_PERF];
733 lowest_reg = &cpc_desc->cpc_regs[LOWEST_PERF];
734 ref_perf = &cpc_desc->cpc_regs[REFERENCE_PERF];
735 nom_perf = &cpc_desc->cpc_regs[NOMINAL_PERF];
737 spin_lock(&pcc_lock);
739 /* Are any of the regs PCC ?*/
740 if ((highest_reg->cpc_entry.reg.space_id == ACPI_ADR_SPACE_PLATFORM_COMM) ||
741 (lowest_reg->cpc_entry.reg.space_id == ACPI_ADR_SPACE_PLATFORM_COMM) ||
742 (ref_perf->cpc_entry.reg.space_id == ACPI_ADR_SPACE_PLATFORM_COMM) ||
743 (nom_perf->cpc_entry.reg.space_id == ACPI_ADR_SPACE_PLATFORM_COMM)) {
744 /* Ring doorbell once to update PCC subspace */
745 if (send_pcc_cmd(CMD_READ) < 0) {
746 ret = -EIO;
747 goto out_err;
751 cpc_read(&highest_reg->cpc_entry.reg, &high);
752 perf_caps->highest_perf = high;
754 cpc_read(&lowest_reg->cpc_entry.reg, &low);
755 perf_caps->lowest_perf = low;
757 cpc_read(&ref_perf->cpc_entry.reg, &ref);
758 perf_caps->reference_perf = ref;
760 cpc_read(&nom_perf->cpc_entry.reg, &nom);
761 perf_caps->nominal_perf = nom;
763 if (!ref)
764 perf_caps->reference_perf = perf_caps->nominal_perf;
766 if (!high || !low || !nom)
767 ret = -EFAULT;
769 out_err:
770 spin_unlock(&pcc_lock);
771 return ret;
773 EXPORT_SYMBOL_GPL(cppc_get_perf_caps);
776 * cppc_get_perf_ctrs - Read a CPUs performance feedback counters.
777 * @cpunum: CPU from which to read counters.
778 * @perf_fb_ctrs: ptr to cppc_perf_fb_ctrs. See cppc_acpi.h
780 * Return: 0 for success with perf_fb_ctrs populated else -ERRNO.
782 int cppc_get_perf_ctrs(int cpunum, struct cppc_perf_fb_ctrs *perf_fb_ctrs)
784 struct cpc_desc *cpc_desc = per_cpu(cpc_desc_ptr, cpunum);
785 struct cpc_register_resource *delivered_reg, *reference_reg;
786 u64 delivered, reference;
787 int ret = 0;
789 if (!cpc_desc) {
790 pr_debug("No CPC descriptor for CPU:%d\n", cpunum);
791 return -ENODEV;
794 delivered_reg = &cpc_desc->cpc_regs[DELIVERED_CTR];
795 reference_reg = &cpc_desc->cpc_regs[REFERENCE_CTR];
797 spin_lock(&pcc_lock);
799 /* Are any of the regs PCC ?*/
800 if ((delivered_reg->cpc_entry.reg.space_id == ACPI_ADR_SPACE_PLATFORM_COMM) ||
801 (reference_reg->cpc_entry.reg.space_id == ACPI_ADR_SPACE_PLATFORM_COMM)) {
802 /* Ring doorbell once to update PCC subspace */
803 if (send_pcc_cmd(CMD_READ) < 0) {
804 ret = -EIO;
805 goto out_err;
809 cpc_read(&delivered_reg->cpc_entry.reg, &delivered);
810 cpc_read(&reference_reg->cpc_entry.reg, &reference);
812 if (!delivered || !reference) {
813 ret = -EFAULT;
814 goto out_err;
817 perf_fb_ctrs->delivered = delivered;
818 perf_fb_ctrs->reference = reference;
820 perf_fb_ctrs->delivered -= perf_fb_ctrs->prev_delivered;
821 perf_fb_ctrs->reference -= perf_fb_ctrs->prev_reference;
823 perf_fb_ctrs->prev_delivered = delivered;
824 perf_fb_ctrs->prev_reference = reference;
826 out_err:
827 spin_unlock(&pcc_lock);
828 return ret;
830 EXPORT_SYMBOL_GPL(cppc_get_perf_ctrs);
833 * cppc_set_perf - Set a CPUs performance controls.
834 * @cpu: CPU for which to set performance controls.
835 * @perf_ctrls: ptr to cppc_perf_ctrls. See cppc_acpi.h
837 * Return: 0 for success, -ERRNO otherwise.
839 int cppc_set_perf(int cpu, struct cppc_perf_ctrls *perf_ctrls)
841 struct cpc_desc *cpc_desc = per_cpu(cpc_desc_ptr, cpu);
842 struct cpc_register_resource *desired_reg;
843 int ret = 0;
845 if (!cpc_desc) {
846 pr_debug("No CPC descriptor for CPU:%d\n", cpu);
847 return -ENODEV;
850 desired_reg = &cpc_desc->cpc_regs[DESIRED_PERF];
852 spin_lock(&pcc_lock);
854 /* If this is PCC reg, check if channel is free before writing */
855 if (desired_reg->cpc_entry.reg.space_id == ACPI_ADR_SPACE_PLATFORM_COMM) {
856 ret = check_pcc_chan();
857 if (ret)
858 goto busy_channel;
862 * Skip writing MIN/MAX until Linux knows how to come up with
863 * useful values.
865 cpc_write(&desired_reg->cpc_entry.reg, perf_ctrls->desired_perf);
867 /* Is this a PCC reg ?*/
868 if (desired_reg->cpc_entry.reg.space_id == ACPI_ADR_SPACE_PLATFORM_COMM) {
869 /* Ring doorbell so Remote can get our perf request. */
870 if (send_pcc_cmd(CMD_WRITE) < 0)
871 ret = -EIO;
873 busy_channel:
874 spin_unlock(&pcc_lock);
876 return ret;
878 EXPORT_SYMBOL_GPL(cppc_set_perf);