Merge tag 'regulator-v4.8' of git://git.kernel.org/pub/scm/linux/kernel/git/broonie...
[sfrench/cifs-2.6.git] / drivers / acpi / cppc_acpi.c
1 /*
2  * CPPC (Collaborative Processor Performance Control) methods used by CPUfreq drivers.
3  *
4  * (C) Copyright 2014, 2015 Linaro Ltd.
5  * Author: Ashwin Chaugule <ashwin.chaugule@linaro.org>
6  *
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.
11  *
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.
17  *
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:
21  *
22  * - OS makes a CPU performance request. (Can provide min and max bounds)
23  *
24  * - Platform (such as BMC) is free to optimize request within requested bounds
25  *   depending on power/thermal budgets etc.
26  *
27  * - Platform conveys its decision back to OS
28  *
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.
33  *
34  * Finer details about the PCC and CPPC spec are available in the ACPI v5.1 and
35  * above specifications.
36  */
37
38 #define pr_fmt(fmt)     "ACPI CPPC: " fmt
39
40 #include <linux/cpufreq.h>
41 #include <linux/delay.h>
42 #include <linux/ktime.h>
43
44 #include <acpi/cppc_acpi.h>
45 /*
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.
50  */
51 static DEFINE_SPINLOCK(pcc_lock);
52
53 /*
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.
59  */
60 static DEFINE_PER_CPU(struct cpc_desc *, cpc_desc_ptr);
61
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;
70
71 /* pcc mapped address + header size + offset within PCC subspace */
72 #define GET_PCC_VADDR(offs) (pcc_comm_addr + 0x8 + (offs))
73
74 /*
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.
78  */
79 #define NUM_RETRIES 500
80
81 static int check_pcc_chan(void)
82 {
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);
86
87         /* Retry in case the remote processor was too slow to catch up. */
88         while (!ktime_after(ktime_get(), next_deadline)) {
89                 /*
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
93                  */
94                 if (readw_relaxed(&generic_comm_base->status) & PCC_CMD_COMPLETE) {
95                         ret = 0;
96                         break;
97                 }
98                 /*
99                  * Reducing the bus traffic in case this loop takes longer than
100                  * a few retries.
101                  */
102                 udelay(3);
103         }
104
105         return ret;
106 }
107
108 static int send_pcc_cmd(u16 cmd)
109 {
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;
116
117         /*
118          * For CMD_WRITE we know for a fact the caller should have checked
119          * the channel before writing to PCC space
120          */
121         if (cmd == CMD_READ) {
122                 ret = check_pcc_chan();
123                 if (ret)
124                         return ret;
125         }
126
127         /*
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"
131          */
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);
136         }
137
138         /*
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."
142          *
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
148          */
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;
155                         }
156                         last_mpar_reset = ktime_get();
157                         mpar_count = pcc_mpar;
158                 }
159                 mpar_count--;
160         }
161
162         /* Write to the shared comm region. */
163         writew_relaxed(cmd, &generic_comm_base->command);
164
165         /* Flip CMD COMPLETE bit */
166         writew_relaxed(0, &generic_comm_base->status);
167
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;
174         }
175
176         /*
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.
182          *
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
187          */
188         if (cmd == CMD_READ || pcc_mrtt) {
189                 ret = check_pcc_chan();
190                 if (pcc_mrtt)
191                         last_cmd_cmpl_time = ktime_get();
192         }
193
194         mbox_client_txdone(pcc_channel, ret);
195         return ret;
196 }
197
198 static void cppc_chan_tx_done(struct mbox_client *cl, void *msg, int ret)
199 {
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);
206 }
207
208 struct mbox_client cppc_mbox_cl = {
209         .tx_done = cppc_chan_tx_done,
210         .knows_txdone = true,
211 };
212
213 static int acpi_get_psd(struct cpc_desc *cpc_ptr, acpi_handle handle)
214 {
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;
222
223         status = acpi_evaluate_object_typed(handle, "_PSD", NULL, &buffer,
224                         ACPI_TYPE_PACKAGE);
225         if (ACPI_FAILURE(status))
226                 return -ENODEV;
227
228         psd = buffer.pointer;
229         if (!psd || psd->package.count != 1) {
230                 pr_debug("Invalid _PSD data\n");
231                 goto end;
232         }
233
234         pdomain = &(cpc_ptr->domain_info);
235
236         state.length = sizeof(struct acpi_psd_package);
237         state.pointer = pdomain;
238
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;
244         }
245
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;
249         }
250
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;
254         }
255
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;
261         }
262
263         result = 0;
264 end:
265         kfree(buffer.pointer);
266         return result;
267 }
268
269 /**
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.
272  *
273  *      Return: 0 for success or negative value for err.
274  */
275 int acpi_get_psd_map(struct cpudata **all_cpu_data)
276 {
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;
285
286         if (!zalloc_cpumask_var(&covered_cpus, GFP_KERNEL))
287                 return -ENOMEM;
288
289         /*
290          * Now that we have _PSD data from all CPUs, lets setup P-state
291          * domain info.
292          */
293         for_each_possible_cpu(i) {
294                 pr = all_cpu_data[i];
295                 if (!pr)
296                         continue;
297
298                 if (cpumask_test_cpu(i, covered_cpus))
299                         continue;
300
301                 cpc_ptr = per_cpu(cpc_desc_ptr, i);
302                 if (!cpc_ptr) {
303                         retval = -EFAULT;
304                         goto err_ret;
305                 }
306
307                 pdomain = &(cpc_ptr->domain_info);
308                 cpumask_set_cpu(i, pr->shared_cpu_map);
309                 cpumask_set_cpu(i, covered_cpus);
310                 if (pdomain->num_processors <= 1)
311                         continue;
312
313                 /* Validate the Domain info */
314                 count_target = pdomain->num_processors;
315                 if (pdomain->coord_type == DOMAIN_COORD_TYPE_SW_ALL)
316                         pr->shared_type = CPUFREQ_SHARED_TYPE_ALL;
317                 else if (pdomain->coord_type == DOMAIN_COORD_TYPE_HW_ALL)
318                         pr->shared_type = CPUFREQ_SHARED_TYPE_HW;
319                 else if (pdomain->coord_type == DOMAIN_COORD_TYPE_SW_ANY)
320                         pr->shared_type = CPUFREQ_SHARED_TYPE_ANY;
321
322                 for_each_possible_cpu(j) {
323                         if (i == j)
324                                 continue;
325
326                         match_cpc_ptr = per_cpu(cpc_desc_ptr, j);
327                         if (!match_cpc_ptr) {
328                                 retval = -EFAULT;
329                                 goto err_ret;
330                         }
331
332                         match_pdomain = &(match_cpc_ptr->domain_info);
333                         if (match_pdomain->domain != pdomain->domain)
334                                 continue;
335
336                         /* Here i and j are in the same domain */
337                         if (match_pdomain->num_processors != count_target) {
338                                 retval = -EFAULT;
339                                 goto err_ret;
340                         }
341
342                         if (pdomain->coord_type != match_pdomain->coord_type) {
343                                 retval = -EFAULT;
344                                 goto err_ret;
345                         }
346
347                         cpumask_set_cpu(j, covered_cpus);
348                         cpumask_set_cpu(j, pr->shared_cpu_map);
349                 }
350
351                 for_each_possible_cpu(j) {
352                         if (i == j)
353                                 continue;
354
355                         match_pr = all_cpu_data[j];
356                         if (!match_pr)
357                                 continue;
358
359                         match_cpc_ptr = per_cpu(cpc_desc_ptr, j);
360                         if (!match_cpc_ptr) {
361                                 retval = -EFAULT;
362                                 goto err_ret;
363                         }
364
365                         match_pdomain = &(match_cpc_ptr->domain_info);
366                         if (match_pdomain->domain != pdomain->domain)
367                                 continue;
368
369                         match_pr->shared_type = pr->shared_type;
370                         cpumask_copy(match_pr->shared_cpu_map,
371                                      pr->shared_cpu_map);
372                 }
373         }
374
375 err_ret:
376         for_each_possible_cpu(i) {
377                 pr = all_cpu_data[i];
378                 if (!pr)
379                         continue;
380
381                 /* Assume no coordination on any error parsing domain info */
382                 if (retval) {
383                         cpumask_clear(pr->shared_cpu_map);
384                         cpumask_set_cpu(i, pr->shared_cpu_map);
385                         pr->shared_type = CPUFREQ_SHARED_TYPE_ALL;
386                 }
387         }
388
389         free_cpumask_var(covered_cpus);
390         return retval;
391 }
392 EXPORT_SYMBOL_GPL(acpi_get_psd_map);
393
394 static int register_pcc_channel(int pcc_subspace_idx)
395 {
396         struct acpi_pcct_hw_reduced *cppc_ss;
397         unsigned int len;
398         u64 usecs_lat;
399
400         if (pcc_subspace_idx >= 0) {
401                 pcc_channel = pcc_mbox_request_channel(&cppc_mbox_cl,
402                                 pcc_subspace_idx);
403
404                 if (IS_ERR(pcc_channel)) {
405                         pr_err("Failed to find PCC communication channel\n");
406                         return -ENODEV;
407                 }
408
409                 /*
410                  * The PCC mailbox controller driver should
411                  * have parsed the PCCT (global table of all
412                  * PCC channels) and stored pointers to the
413                  * subspace communication region in con_priv.
414                  */
415                 cppc_ss = pcc_channel->con_priv;
416
417                 if (!cppc_ss) {
418                         pr_err("No PCC subspace found for CPPC\n");
419                         return -ENODEV;
420                 }
421
422                 /*
423                  * This is the shared communication region
424                  * for the OS and Platform to communicate over.
425                  */
426                 comm_base_addr = cppc_ss->base_address;
427                 len = cppc_ss->length;
428
429                 /*
430                  * cppc_ss->latency is just a Nominal value. In reality
431                  * the remote processor could be much slower to reply.
432                  * So add an arbitrary amount of wait on top of Nominal.
433                  */
434                 usecs_lat = NUM_RETRIES * cppc_ss->latency;
435                 deadline = ns_to_ktime(usecs_lat * NSEC_PER_USEC);
436                 pcc_mrtt = cppc_ss->min_turnaround_time;
437                 pcc_mpar = cppc_ss->max_access_rate;
438
439                 pcc_comm_addr = acpi_os_ioremap(comm_base_addr, len);
440                 if (!pcc_comm_addr) {
441                         pr_err("Failed to ioremap PCC comm region mem\n");
442                         return -ENOMEM;
443                 }
444
445                 /* Set flag so that we dont come here for each CPU. */
446                 pcc_channel_acquired = true;
447         }
448
449         return 0;
450 }
451
452 /*
453  * An example CPC table looks like the following.
454  *
455  *      Name(_CPC, Package()
456  *                      {
457  *                      17,
458  *                      NumEntries
459  *                      1,
460  *                      // Revision
461  *                      ResourceTemplate(){Register(PCC, 32, 0, 0x120, 2)},
462  *                      // Highest Performance
463  *                      ResourceTemplate(){Register(PCC, 32, 0, 0x124, 2)},
464  *                      // Nominal Performance
465  *                      ResourceTemplate(){Register(PCC, 32, 0, 0x128, 2)},
466  *                      // Lowest Nonlinear Performance
467  *                      ResourceTemplate(){Register(PCC, 32, 0, 0x12C, 2)},
468  *                      // Lowest Performance
469  *                      ResourceTemplate(){Register(PCC, 32, 0, 0x130, 2)},
470  *                      // Guaranteed Performance Register
471  *                      ResourceTemplate(){Register(PCC, 32, 0, 0x110, 2)},
472  *                      // Desired Performance Register
473  *                      ResourceTemplate(){Register(SystemMemory, 0, 0, 0, 0)},
474  *                      ..
475  *                      ..
476  *                      ..
477  *
478  *              }
479  * Each Register() encodes how to access that specific register.
480  * e.g. a sample PCC entry has the following encoding:
481  *
482  *      Register (
483  *              PCC,
484  *              AddressSpaceKeyword
485  *              8,
486  *              //RegisterBitWidth
487  *              8,
488  *              //RegisterBitOffset
489  *              0x30,
490  *              //RegisterAddress
491  *              9
492  *              //AccessSize (subspace ID)
493  *              0
494  *              )
495  *      }
496  */
497
498 /**
499  * acpi_cppc_processor_probe - Search for per CPU _CPC objects.
500  * @pr: Ptr to acpi_processor containing this CPUs logical Id.
501  *
502  *      Return: 0 for success or negative value for err.
503  */
504 int acpi_cppc_processor_probe(struct acpi_processor *pr)
505 {
506         struct acpi_buffer output = {ACPI_ALLOCATE_BUFFER, NULL};
507         union acpi_object *out_obj, *cpc_obj;
508         struct cpc_desc *cpc_ptr;
509         struct cpc_reg *gas_t;
510         acpi_handle handle = pr->handle;
511         unsigned int num_ent, i, cpc_rev;
512         acpi_status status;
513         int ret = -EFAULT;
514
515         /* Parse the ACPI _CPC table for this cpu. */
516         status = acpi_evaluate_object_typed(handle, "_CPC", NULL, &output,
517                         ACPI_TYPE_PACKAGE);
518         if (ACPI_FAILURE(status)) {
519                 ret = -ENODEV;
520                 goto out_buf_free;
521         }
522
523         out_obj = (union acpi_object *) output.pointer;
524
525         cpc_ptr = kzalloc(sizeof(struct cpc_desc), GFP_KERNEL);
526         if (!cpc_ptr) {
527                 ret = -ENOMEM;
528                 goto out_buf_free;
529         }
530
531         /* First entry is NumEntries. */
532         cpc_obj = &out_obj->package.elements[0];
533         if (cpc_obj->type == ACPI_TYPE_INTEGER) {
534                 num_ent = cpc_obj->integer.value;
535         } else {
536                 pr_debug("Unexpected entry type(%d) for NumEntries\n",
537                                 cpc_obj->type);
538                 goto out_free;
539         }
540
541         /* Only support CPPCv2. Bail otherwise. */
542         if (num_ent != CPPC_NUM_ENT) {
543                 pr_debug("Firmware exports %d entries. Expected: %d\n",
544                                 num_ent, CPPC_NUM_ENT);
545                 goto out_free;
546         }
547
548         /* Second entry should be revision. */
549         cpc_obj = &out_obj->package.elements[1];
550         if (cpc_obj->type == ACPI_TYPE_INTEGER) {
551                 cpc_rev = cpc_obj->integer.value;
552         } else {
553                 pr_debug("Unexpected entry type(%d) for Revision\n",
554                                 cpc_obj->type);
555                 goto out_free;
556         }
557
558         if (cpc_rev != CPPC_REV) {
559                 pr_debug("Firmware exports revision:%d. Expected:%d\n",
560                                 cpc_rev, CPPC_REV);
561                 goto out_free;
562         }
563
564         /* Iterate through remaining entries in _CPC */
565         for (i = 2; i < num_ent; i++) {
566                 cpc_obj = &out_obj->package.elements[i];
567
568                 if (cpc_obj->type == ACPI_TYPE_INTEGER) {
569                         cpc_ptr->cpc_regs[i-2].type = ACPI_TYPE_INTEGER;
570                         cpc_ptr->cpc_regs[i-2].cpc_entry.int_value = cpc_obj->integer.value;
571                 } else if (cpc_obj->type == ACPI_TYPE_BUFFER) {
572                         gas_t = (struct cpc_reg *)
573                                 cpc_obj->buffer.pointer;
574
575                         /*
576                          * The PCC Subspace index is encoded inside
577                          * the CPC table entries. The same PCC index
578                          * will be used for all the PCC entries,
579                          * so extract it only once.
580                          */
581                         if (gas_t->space_id == ACPI_ADR_SPACE_PLATFORM_COMM) {
582                                 if (pcc_subspace_idx < 0)
583                                         pcc_subspace_idx = gas_t->access_width;
584                                 else if (pcc_subspace_idx != gas_t->access_width) {
585                                         pr_debug("Mismatched PCC ids.\n");
586                                         goto out_free;
587                                 }
588                         } else if (gas_t->space_id != ACPI_ADR_SPACE_SYSTEM_MEMORY) {
589                                 /* Support only PCC and SYS MEM type regs */
590                                 pr_debug("Unsupported register type: %d\n", gas_t->space_id);
591                                 goto out_free;
592                         }
593
594                         cpc_ptr->cpc_regs[i-2].type = ACPI_TYPE_BUFFER;
595                         memcpy(&cpc_ptr->cpc_regs[i-2].cpc_entry.reg, gas_t, sizeof(*gas_t));
596                 } else {
597                         pr_debug("Err in entry:%d in CPC table of CPU:%d \n", i, pr->id);
598                         goto out_free;
599                 }
600         }
601         /* Store CPU Logical ID */
602         cpc_ptr->cpu_id = pr->id;
603
604         /* Parse PSD data for this CPU */
605         ret = acpi_get_psd(cpc_ptr, handle);
606         if (ret)
607                 goto out_free;
608
609         /* Register PCC channel once for all CPUs. */
610         if (!pcc_channel_acquired) {
611                 ret = register_pcc_channel(pcc_subspace_idx);
612                 if (ret)
613                         goto out_free;
614         }
615
616         /* Plug PSD data into this CPUs CPC descriptor. */
617         per_cpu(cpc_desc_ptr, pr->id) = cpc_ptr;
618
619         /* Everything looks okay */
620         pr_debug("Parsed CPC struct for CPU: %d\n", pr->id);
621
622         kfree(output.pointer);
623         return 0;
624
625 out_free:
626         kfree(cpc_ptr);
627
628 out_buf_free:
629         kfree(output.pointer);
630         return ret;
631 }
632 EXPORT_SYMBOL_GPL(acpi_cppc_processor_probe);
633
634 /**
635  * acpi_cppc_processor_exit - Cleanup CPC structs.
636  * @pr: Ptr to acpi_processor containing this CPUs logical Id.
637  *
638  * Return: Void
639  */
640 void acpi_cppc_processor_exit(struct acpi_processor *pr)
641 {
642         struct cpc_desc *cpc_ptr;
643         cpc_ptr = per_cpu(cpc_desc_ptr, pr->id);
644         kfree(cpc_ptr);
645 }
646 EXPORT_SYMBOL_GPL(acpi_cppc_processor_exit);
647
648 /*
649  * Since cpc_read and cpc_write are called while holding pcc_lock, it should be
650  * as fast as possible. We have already mapped the PCC subspace during init, so
651  * we can directly write to it.
652  */
653
654 static int cpc_read(struct cpc_reg *reg, u64 *val)
655 {
656         int ret_val = 0;
657
658         *val = 0;
659         if (reg->space_id == ACPI_ADR_SPACE_PLATFORM_COMM) {
660                 void __iomem *vaddr = GET_PCC_VADDR(reg->address);
661
662                 switch (reg->bit_width) {
663                 case 8:
664                         *val = readb_relaxed(vaddr);
665                         break;
666                 case 16:
667                         *val = readw_relaxed(vaddr);
668                         break;
669                 case 32:
670                         *val = readl_relaxed(vaddr);
671                         break;
672                 case 64:
673                         *val = readq_relaxed(vaddr);
674                         break;
675                 default:
676                         pr_debug("Error: Cannot read %u bit width from PCC\n",
677                                 reg->bit_width);
678                         ret_val = -EFAULT;
679                 }
680         } else
681                 ret_val = acpi_os_read_memory((acpi_physical_address)reg->address,
682                                         val, reg->bit_width);
683         return ret_val;
684 }
685
686 static int cpc_write(struct cpc_reg *reg, u64 val)
687 {
688         int ret_val = 0;
689
690         if (reg->space_id == ACPI_ADR_SPACE_PLATFORM_COMM) {
691                 void __iomem *vaddr = GET_PCC_VADDR(reg->address);
692
693                 switch (reg->bit_width) {
694                 case 8:
695                         writeb_relaxed(val, vaddr);
696                         break;
697                 case 16:
698                         writew_relaxed(val, vaddr);
699                         break;
700                 case 32:
701                         writel_relaxed(val, vaddr);
702                         break;
703                 case 64:
704                         writeq_relaxed(val, vaddr);
705                         break;
706                 default:
707                         pr_debug("Error: Cannot write %u bit width to PCC\n",
708                                 reg->bit_width);
709                         ret_val = -EFAULT;
710                         break;
711                 }
712         } else
713                 ret_val = acpi_os_write_memory((acpi_physical_address)reg->address,
714                                 val, reg->bit_width);
715         return ret_val;
716 }
717
718 /**
719  * cppc_get_perf_caps - Get a CPUs performance capabilities.
720  * @cpunum: CPU from which to get capabilities info.
721  * @perf_caps: ptr to cppc_perf_caps. See cppc_acpi.h
722  *
723  * Return: 0 for success with perf_caps populated else -ERRNO.
724  */
725 int cppc_get_perf_caps(int cpunum, struct cppc_perf_caps *perf_caps)
726 {
727         struct cpc_desc *cpc_desc = per_cpu(cpc_desc_ptr, cpunum);
728         struct cpc_register_resource *highest_reg, *lowest_reg, *ref_perf,
729                                                                  *nom_perf;
730         u64 high, low, ref, nom;
731         int ret = 0;
732
733         if (!cpc_desc) {
734                 pr_debug("No CPC descriptor for CPU:%d\n", cpunum);
735                 return -ENODEV;
736         }
737
738         highest_reg = &cpc_desc->cpc_regs[HIGHEST_PERF];
739         lowest_reg = &cpc_desc->cpc_regs[LOWEST_PERF];
740         ref_perf = &cpc_desc->cpc_regs[REFERENCE_PERF];
741         nom_perf = &cpc_desc->cpc_regs[NOMINAL_PERF];
742
743         spin_lock(&pcc_lock);
744
745         /* Are any of the regs PCC ?*/
746         if ((highest_reg->cpc_entry.reg.space_id == ACPI_ADR_SPACE_PLATFORM_COMM) ||
747                         (lowest_reg->cpc_entry.reg.space_id == ACPI_ADR_SPACE_PLATFORM_COMM) ||
748                         (ref_perf->cpc_entry.reg.space_id == ACPI_ADR_SPACE_PLATFORM_COMM) ||
749                         (nom_perf->cpc_entry.reg.space_id == ACPI_ADR_SPACE_PLATFORM_COMM)) {
750                 /* Ring doorbell once to update PCC subspace */
751                 if (send_pcc_cmd(CMD_READ) < 0) {
752                         ret = -EIO;
753                         goto out_err;
754                 }
755         }
756
757         cpc_read(&highest_reg->cpc_entry.reg, &high);
758         perf_caps->highest_perf = high;
759
760         cpc_read(&lowest_reg->cpc_entry.reg, &low);
761         perf_caps->lowest_perf = low;
762
763         cpc_read(&ref_perf->cpc_entry.reg, &ref);
764         perf_caps->reference_perf = ref;
765
766         cpc_read(&nom_perf->cpc_entry.reg, &nom);
767         perf_caps->nominal_perf = nom;
768
769         if (!ref)
770                 perf_caps->reference_perf = perf_caps->nominal_perf;
771
772         if (!high || !low || !nom)
773                 ret = -EFAULT;
774
775 out_err:
776         spin_unlock(&pcc_lock);
777         return ret;
778 }
779 EXPORT_SYMBOL_GPL(cppc_get_perf_caps);
780
781 /**
782  * cppc_get_perf_ctrs - Read a CPUs performance feedback counters.
783  * @cpunum: CPU from which to read counters.
784  * @perf_fb_ctrs: ptr to cppc_perf_fb_ctrs. See cppc_acpi.h
785  *
786  * Return: 0 for success with perf_fb_ctrs populated else -ERRNO.
787  */
788 int cppc_get_perf_ctrs(int cpunum, struct cppc_perf_fb_ctrs *perf_fb_ctrs)
789 {
790         struct cpc_desc *cpc_desc = per_cpu(cpc_desc_ptr, cpunum);
791         struct cpc_register_resource *delivered_reg, *reference_reg;
792         u64 delivered, reference;
793         int ret = 0;
794
795         if (!cpc_desc) {
796                 pr_debug("No CPC descriptor for CPU:%d\n", cpunum);
797                 return -ENODEV;
798         }
799
800         delivered_reg = &cpc_desc->cpc_regs[DELIVERED_CTR];
801         reference_reg = &cpc_desc->cpc_regs[REFERENCE_CTR];
802
803         spin_lock(&pcc_lock);
804
805         /* Are any of the regs PCC ?*/
806         if ((delivered_reg->cpc_entry.reg.space_id == ACPI_ADR_SPACE_PLATFORM_COMM) ||
807                         (reference_reg->cpc_entry.reg.space_id == ACPI_ADR_SPACE_PLATFORM_COMM)) {
808                 /* Ring doorbell once to update PCC subspace */
809                 if (send_pcc_cmd(CMD_READ) < 0) {
810                         ret = -EIO;
811                         goto out_err;
812                 }
813         }
814
815         cpc_read(&delivered_reg->cpc_entry.reg, &delivered);
816         cpc_read(&reference_reg->cpc_entry.reg, &reference);
817
818         if (!delivered || !reference) {
819                 ret = -EFAULT;
820                 goto out_err;
821         }
822
823         perf_fb_ctrs->delivered = delivered;
824         perf_fb_ctrs->reference = reference;
825
826         perf_fb_ctrs->delivered -= perf_fb_ctrs->prev_delivered;
827         perf_fb_ctrs->reference -= perf_fb_ctrs->prev_reference;
828
829         perf_fb_ctrs->prev_delivered = delivered;
830         perf_fb_ctrs->prev_reference = reference;
831
832 out_err:
833         spin_unlock(&pcc_lock);
834         return ret;
835 }
836 EXPORT_SYMBOL_GPL(cppc_get_perf_ctrs);
837
838 /**
839  * cppc_set_perf - Set a CPUs performance controls.
840  * @cpu: CPU for which to set performance controls.
841  * @perf_ctrls: ptr to cppc_perf_ctrls. See cppc_acpi.h
842  *
843  * Return: 0 for success, -ERRNO otherwise.
844  */
845 int cppc_set_perf(int cpu, struct cppc_perf_ctrls *perf_ctrls)
846 {
847         struct cpc_desc *cpc_desc = per_cpu(cpc_desc_ptr, cpu);
848         struct cpc_register_resource *desired_reg;
849         int ret = 0;
850
851         if (!cpc_desc) {
852                 pr_debug("No CPC descriptor for CPU:%d\n", cpu);
853                 return -ENODEV;
854         }
855
856         desired_reg = &cpc_desc->cpc_regs[DESIRED_PERF];
857
858         spin_lock(&pcc_lock);
859
860         /* If this is PCC reg, check if channel is free before writing */
861         if (desired_reg->cpc_entry.reg.space_id == ACPI_ADR_SPACE_PLATFORM_COMM) {
862                 ret = check_pcc_chan();
863                 if (ret)
864                         goto busy_channel;
865         }
866
867         /*
868          * Skip writing MIN/MAX until Linux knows how to come up with
869          * useful values.
870          */
871         cpc_write(&desired_reg->cpc_entry.reg, perf_ctrls->desired_perf);
872
873         /* Is this a PCC reg ?*/
874         if (desired_reg->cpc_entry.reg.space_id == ACPI_ADR_SPACE_PLATFORM_COMM) {
875                 /* Ring doorbell so Remote can get our perf request. */
876                 if (send_pcc_cmd(CMD_WRITE) < 0)
877                         ret = -EIO;
878         }
879 busy_channel:
880         spin_unlock(&pcc_lock);
881
882         return ret;
883 }
884 EXPORT_SYMBOL_GPL(cppc_set_perf);