2 * Copyright (C) 2014 Linaro Ltd.
3 * Author: Ashwin Chaugule <ashwin.chaugule@linaro.org>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * PCC (Platform Communication Channel) is defined in the ACPI 5.0+
16 * specification. It is a mailbox like mechanism to allow clients
17 * such as CPPC (Collaborative Processor Performance Control), RAS
18 * (Reliability, Availability and Serviceability) and MPST (Memory
19 * Node Power State Table) to talk to the platform (e.g. BMC) through
20 * shared memory regions as defined in the PCC table entries. The PCC
21 * specification supports a Doorbell mechanism for the PCC clients
22 * to notify the platform about new data. This Doorbell information
23 * is also specified in each PCC table entry.
25 * Typical high level flow of operation is:
28 * * Client tries to acquire a channel lock.
29 * * After it is acquired it writes READ cmd in communication region cmd
31 * * Client issues mbox_send_message() which rings the PCC doorbell
32 * for its PCC channel.
33 * * If command completes, then client has control over channel and
34 * it can proceed with its reads.
35 * * Client releases lock.
38 * * Client tries to acquire channel lock.
39 * * Client writes to its communication region after it acquires a
41 * * Client writes WRITE cmd in communication region cmd address.
42 * * Client issues mbox_send_message() which rings the PCC doorbell
43 * for its PCC channel.
44 * * If command completes, then writes have succeded and it can release
47 * There is a Nominal latency defined for each channel which indicates
48 * how long to wait until a command completes. If command is not complete
49 * the client needs to retry or assume failure.
51 * For more details about PCC, please see the ACPI specification from
52 * http://www.uefi.org/ACPIv5.1 Section 14.
54 * This file implements PCC as a Mailbox controller and allows for PCC
55 * clients to be implemented as its Mailbox Client Channels.
58 #include <linux/acpi.h>
59 #include <linux/delay.h>
61 #include <linux/init.h>
62 #include <linux/interrupt.h>
63 #include <linux/list.h>
64 #include <linux/platform_device.h>
65 #include <linux/mailbox_controller.h>
66 #include <linux/mailbox_client.h>
67 #include <linux/io-64-nonatomic-lo-hi.h>
72 #define MAX_PCC_SUBSPACES 256
73 #define MBOX_IRQ_NAME "pcc-mbox"
75 static struct mbox_chan
*pcc_mbox_channels
;
77 /* Array of cached virtual address for doorbell registers */
78 static void __iomem
**pcc_doorbell_vaddr
;
79 /* Array of cached virtual address for doorbell ack registers */
80 static void __iomem
**pcc_doorbell_ack_vaddr
;
81 /* Array of doorbell interrupts */
82 static int *pcc_doorbell_irq
;
84 static struct mbox_controller pcc_mbox_ctrl
= {};
86 * get_pcc_channel - Given a PCC subspace idx, get
87 * the respective mbox_channel.
88 * @id: PCC subspace index.
90 * Return: ERR_PTR(errno) if error, else pointer
93 static struct mbox_chan
*get_pcc_channel(int id
)
95 if (id
< 0 || id
> pcc_mbox_ctrl
.num_chans
)
96 return ERR_PTR(-ENOENT
);
98 return &pcc_mbox_channels
[id
];
102 * PCC can be used with perf critical drivers such as CPPC
103 * So it makes sense to locally cache the virtual address and
104 * use it to read/write to PCC registers such as doorbell register
106 * The below read_register and write_registers are used to read and
107 * write from perf critical registers such as PCC doorbell register
109 static int read_register(void __iomem
*vaddr
, u64
*val
, unsigned int bit_width
)
127 pr_debug("Error: Cannot read register of %u bit width",
135 static int write_register(void __iomem
*vaddr
, u64 val
, unsigned int bit_width
)
153 pr_debug("Error: Cannot write register of %u bit width",
162 * pcc_map_interrupt - Map a PCC subspace GSI to a linux IRQ number
163 * @interrupt: GSI number.
164 * @flags: interrupt flags
166 * Returns: a valid linux IRQ number on success
167 * 0 or -EINVAL on failure
169 static int pcc_map_interrupt(u32 interrupt
, u32 flags
)
171 int trigger
, polarity
;
176 trigger
= (flags
& ACPI_PCCT_INTERRUPT_MODE
) ? ACPI_EDGE_SENSITIVE
177 : ACPI_LEVEL_SENSITIVE
;
179 polarity
= (flags
& ACPI_PCCT_INTERRUPT_POLARITY
) ? ACPI_ACTIVE_LOW
182 return acpi_register_gsi(NULL
, interrupt
, trigger
, polarity
);
186 * pcc_mbox_irq - PCC mailbox interrupt handler
188 static irqreturn_t
pcc_mbox_irq(int irq
, void *p
)
190 struct acpi_generic_address
*doorbell_ack
;
191 struct acpi_pcct_hw_reduced
*pcct_ss
;
192 struct mbox_chan
*chan
= p
;
193 u64 doorbell_ack_preserve
;
194 u64 doorbell_ack_write
;
195 u64 doorbell_ack_val
;
198 pcct_ss
= chan
->con_priv
;
200 mbox_chan_received_data(chan
, NULL
);
202 if (pcct_ss
->header
.type
== ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2
) {
203 struct acpi_pcct_hw_reduced_type2
*pcct2_ss
= chan
->con_priv
;
204 u32 id
= chan
- pcc_mbox_channels
;
206 doorbell_ack
= &pcct2_ss
->doorbell_ack_register
;
207 doorbell_ack_preserve
= pcct2_ss
->ack_preserve_mask
;
208 doorbell_ack_write
= pcct2_ss
->ack_write_mask
;
210 ret
= read_register(pcc_doorbell_ack_vaddr
[id
],
212 doorbell_ack
->bit_width
);
216 ret
= write_register(pcc_doorbell_ack_vaddr
[id
],
217 (doorbell_ack_val
& doorbell_ack_preserve
)
218 | doorbell_ack_write
,
219 doorbell_ack
->bit_width
);
228 * pcc_mbox_request_channel - PCC clients call this function to
229 * request a pointer to their PCC subspace, from which they
230 * can get the details of communicating with the remote.
231 * @cl: Pointer to Mailbox client, so we know where to bind the
233 * @subspace_id: The PCC Subspace index as parsed in the PCC client
234 * ACPI package. This is used to lookup the array of PCC
235 * subspaces as parsed by the PCC Mailbox controller.
237 * Return: Pointer to the Mailbox Channel if successful or
240 struct mbox_chan
*pcc_mbox_request_channel(struct mbox_client
*cl
,
243 struct device
*dev
= pcc_mbox_ctrl
.dev
;
244 struct mbox_chan
*chan
;
248 * Each PCC Subspace is a Mailbox Channel.
249 * The PCC Clients get their PCC Subspace ID
250 * from their own tables and pass it here.
251 * This returns a pointer to the PCC subspace
252 * for the Client to operate on.
254 chan
= get_pcc_channel(subspace_id
);
256 if (IS_ERR(chan
) || chan
->cl
) {
257 dev_err(dev
, "Channel not found for idx: %d\n", subspace_id
);
258 return ERR_PTR(-EBUSY
);
261 spin_lock_irqsave(&chan
->lock
, flags
);
264 chan
->active_req
= NULL
;
266 init_completion(&chan
->tx_complete
);
268 if (chan
->txdone_method
== TXDONE_BY_POLL
&& cl
->knows_txdone
)
269 chan
->txdone_method
|= TXDONE_BY_ACK
;
271 spin_unlock_irqrestore(&chan
->lock
, flags
);
273 if (pcc_doorbell_irq
[subspace_id
] > 0) {
276 rc
= devm_request_irq(dev
, pcc_doorbell_irq
[subspace_id
],
277 pcc_mbox_irq
, 0, MBOX_IRQ_NAME
, chan
);
279 dev_err(dev
, "failed to register PCC interrupt %d\n",
280 pcc_doorbell_irq
[subspace_id
]);
281 pcc_mbox_free_channel(chan
);
288 EXPORT_SYMBOL_GPL(pcc_mbox_request_channel
);
291 * pcc_mbox_free_channel - Clients call this to free their Channel.
293 * @chan: Pointer to the mailbox channel as returned by
294 * pcc_mbox_request_channel()
296 void pcc_mbox_free_channel(struct mbox_chan
*chan
)
298 u32 id
= chan
- pcc_mbox_channels
;
301 if (!chan
|| !chan
->cl
)
304 if (id
>= pcc_mbox_ctrl
.num_chans
) {
305 pr_debug("pcc_mbox_free_channel: Invalid mbox_chan passed\n");
309 if (pcc_doorbell_irq
[id
] > 0)
310 devm_free_irq(chan
->mbox
->dev
, pcc_doorbell_irq
[id
], chan
);
312 spin_lock_irqsave(&chan
->lock
, flags
);
314 chan
->active_req
= NULL
;
315 if (chan
->txdone_method
== (TXDONE_BY_POLL
| TXDONE_BY_ACK
))
316 chan
->txdone_method
= TXDONE_BY_POLL
;
318 spin_unlock_irqrestore(&chan
->lock
, flags
);
320 EXPORT_SYMBOL_GPL(pcc_mbox_free_channel
);
323 * pcc_send_data - Called from Mailbox Controller code. Used
324 * here only to ring the channel doorbell. The PCC client
325 * specific read/write is done in the client driver in
326 * order to maintain atomicity over PCC channel once
327 * OS has control over it. See above for flow of operations.
328 * @chan: Pointer to Mailbox channel over which to send data.
329 * @data: Client specific data written over channel. Used here
330 * only for debug after PCC transaction completes.
332 * Return: Err if something failed else 0 for success.
334 static int pcc_send_data(struct mbox_chan
*chan
, void *data
)
336 struct acpi_pcct_hw_reduced
*pcct_ss
= chan
->con_priv
;
337 struct acpi_generic_address
*doorbell
;
338 u64 doorbell_preserve
;
341 u32 id
= chan
- pcc_mbox_channels
;
344 if (id
>= pcc_mbox_ctrl
.num_chans
) {
345 pr_debug("pcc_send_data: Invalid mbox_chan passed\n");
349 doorbell
= &pcct_ss
->doorbell_register
;
350 doorbell_preserve
= pcct_ss
->preserve_mask
;
351 doorbell_write
= pcct_ss
->write_mask
;
353 /* Sync notification from OS to Platform. */
354 if (pcc_doorbell_vaddr
[id
]) {
355 ret
= read_register(pcc_doorbell_vaddr
[id
], &doorbell_val
,
356 doorbell
->bit_width
);
359 ret
= write_register(pcc_doorbell_vaddr
[id
],
360 (doorbell_val
& doorbell_preserve
) | doorbell_write
,
361 doorbell
->bit_width
);
363 ret
= acpi_read(&doorbell_val
, doorbell
);
366 ret
= acpi_write((doorbell_val
& doorbell_preserve
) | doorbell_write
,
372 static const struct mbox_chan_ops pcc_chan_ops
= {
373 .send_data
= pcc_send_data
,
377 * parse_pcc_subspace - Parse the PCC table and verify PCC subspace
378 * entries. There should be one entry per PCC client.
379 * @header: Pointer to the ACPI subtable header under the PCCT.
380 * @end: End of subtable entry.
382 * Return: 0 for Success, else errno.
384 * This gets called for each entry in the PCC table.
386 static int parse_pcc_subspace(struct acpi_subtable_header
*header
,
387 const unsigned long end
)
389 struct acpi_pcct_hw_reduced
*pcct_ss
;
391 if (pcc_mbox_ctrl
.num_chans
<= MAX_PCC_SUBSPACES
) {
392 pcct_ss
= (struct acpi_pcct_hw_reduced
*) header
;
394 if ((pcct_ss
->header
.type
!=
395 ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE
)
396 && (pcct_ss
->header
.type
!=
397 ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2
)) {
398 pr_err("Incorrect PCC Subspace type detected\n");
407 * pcc_parse_subspace_irq - Parse the PCC IRQ and PCC ACK register
408 * There should be one entry per PCC client.
409 * @id: PCC subspace index.
410 * @pcct_ss: Pointer to the ACPI subtable header under the PCCT.
412 * Return: 0 for Success, else errno.
414 * This gets called for each entry in the PCC table.
416 static int pcc_parse_subspace_irq(int id
,
417 struct acpi_pcct_hw_reduced
*pcct_ss
)
419 pcc_doorbell_irq
[id
] = pcc_map_interrupt(pcct_ss
->doorbell_interrupt
,
420 (u32
)pcct_ss
->flags
);
421 if (pcc_doorbell_irq
[id
] <= 0) {
422 pr_err("PCC GSI %d not registered\n",
423 pcct_ss
->doorbell_interrupt
);
427 if (pcct_ss
->header
.type
428 == ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2
) {
429 struct acpi_pcct_hw_reduced_type2
*pcct2_ss
= (void *)pcct_ss
;
431 pcc_doorbell_ack_vaddr
[id
] = acpi_os_ioremap(
432 pcct2_ss
->doorbell_ack_register
.address
,
433 pcct2_ss
->doorbell_ack_register
.bit_width
/ 8);
434 if (!pcc_doorbell_ack_vaddr
[id
]) {
435 pr_err("Failed to ioremap PCC ACK register\n");
444 * acpi_pcc_probe - Parse the ACPI tree for the PCCT.
446 * Return: 0 for Success, else errno.
448 static int __init
acpi_pcc_probe(void)
450 acpi_size pcct_tbl_header_size
;
451 struct acpi_table_header
*pcct_tbl
;
452 struct acpi_subtable_header
*pcct_entry
;
453 struct acpi_table_pcct
*acpi_pcct_tbl
;
456 acpi_status status
= AE_OK
;
458 /* Search for PCCT */
459 status
= acpi_get_table_with_size(ACPI_SIG_PCCT
, 0,
461 &pcct_tbl_header_size
);
463 if (ACPI_FAILURE(status
) || !pcct_tbl
) {
464 pr_warn("PCCT header not found.\n");
468 count
= acpi_table_parse_entries(ACPI_SIG_PCCT
,
469 sizeof(struct acpi_table_pcct
),
470 ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE
,
471 parse_pcc_subspace
, MAX_PCC_SUBSPACES
);
472 sum
+= (count
> 0) ? count
: 0;
474 count
= acpi_table_parse_entries(ACPI_SIG_PCCT
,
475 sizeof(struct acpi_table_pcct
),
476 ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2
,
477 parse_pcc_subspace
, MAX_PCC_SUBSPACES
);
478 sum
+= (count
> 0) ? count
: 0;
480 if (sum
== 0 || sum
>= MAX_PCC_SUBSPACES
) {
481 pr_err("Error parsing PCC subspaces from PCCT\n");
485 pcc_mbox_channels
= kzalloc(sizeof(struct mbox_chan
) *
487 if (!pcc_mbox_channels
) {
488 pr_err("Could not allocate space for PCC mbox channels\n");
492 pcc_doorbell_vaddr
= kcalloc(sum
, sizeof(void *), GFP_KERNEL
);
493 if (!pcc_doorbell_vaddr
) {
498 pcc_doorbell_ack_vaddr
= kcalloc(sum
, sizeof(void *), GFP_KERNEL
);
499 if (!pcc_doorbell_ack_vaddr
) {
501 goto err_free_db_vaddr
;
504 pcc_doorbell_irq
= kcalloc(sum
, sizeof(int), GFP_KERNEL
);
505 if (!pcc_doorbell_irq
) {
507 goto err_free_db_ack_vaddr
;
510 /* Point to the first PCC subspace entry */
511 pcct_entry
= (struct acpi_subtable_header
*) (
512 (unsigned long) pcct_tbl
+ sizeof(struct acpi_table_pcct
));
514 acpi_pcct_tbl
= (struct acpi_table_pcct
*) pcct_tbl
;
515 if (acpi_pcct_tbl
->flags
& ACPI_PCCT_DOORBELL
)
516 pcc_mbox_ctrl
.txdone_irq
= true;
518 for (i
= 0; i
< sum
; i
++) {
519 struct acpi_generic_address
*db_reg
;
520 struct acpi_pcct_hw_reduced
*pcct_ss
;
521 pcc_mbox_channels
[i
].con_priv
= pcct_entry
;
523 pcct_ss
= (struct acpi_pcct_hw_reduced
*) pcct_entry
;
525 if (pcc_mbox_ctrl
.txdone_irq
) {
526 rc
= pcc_parse_subspace_irq(i
, pcct_ss
);
531 /* If doorbell is in system memory cache the virt address */
532 db_reg
= &pcct_ss
->doorbell_register
;
533 if (db_reg
->space_id
== ACPI_ADR_SPACE_SYSTEM_MEMORY
)
534 pcc_doorbell_vaddr
[i
] = acpi_os_ioremap(db_reg
->address
,
535 db_reg
->bit_width
/8);
536 pcct_entry
= (struct acpi_subtable_header
*)
537 ((unsigned long) pcct_entry
+ pcct_entry
->length
);
540 pcc_mbox_ctrl
.num_chans
= sum
;
542 pr_info("Detected %d PCC Subspaces\n", pcc_mbox_ctrl
.num_chans
);
547 kfree(pcc_doorbell_irq
);
548 err_free_db_ack_vaddr
:
549 kfree(pcc_doorbell_ack_vaddr
);
551 kfree(pcc_doorbell_vaddr
);
553 kfree(pcc_mbox_channels
);
558 * pcc_mbox_probe - Called when we find a match for the
559 * PCCT platform device. This is purely used to represent
560 * the PCCT as a virtual device for registering with the
561 * generic Mailbox framework.
563 * @pdev: Pointer to platform device returned when a match
566 * Return: 0 for Success, else errno.
568 static int pcc_mbox_probe(struct platform_device
*pdev
)
572 pcc_mbox_ctrl
.chans
= pcc_mbox_channels
;
573 pcc_mbox_ctrl
.ops
= &pcc_chan_ops
;
574 pcc_mbox_ctrl
.dev
= &pdev
->dev
;
576 pr_info("Registering PCC driver as Mailbox controller\n");
577 ret
= mbox_controller_register(&pcc_mbox_ctrl
);
580 pr_err("Err registering PCC as Mailbox controller: %d\n", ret
);
587 struct platform_driver pcc_mbox_driver
= {
588 .probe
= pcc_mbox_probe
,
591 .owner
= THIS_MODULE
,
595 static int __init
pcc_init(void)
598 struct platform_device
*pcc_pdev
;
603 /* Check if PCC support is available. */
604 ret
= acpi_pcc_probe();
607 pr_debug("ACPI PCC probe failed.\n");
611 pcc_pdev
= platform_create_bundle(&pcc_mbox_driver
,
612 pcc_mbox_probe
, NULL
, 0, NULL
, 0);
614 if (IS_ERR(pcc_pdev
)) {
615 pr_debug("Err creating PCC platform bundle\n");
616 return PTR_ERR(pcc_pdev
);
623 * Make PCC init postcore so that users of this mailbox
624 * such as the ACPI Processor driver have it available
627 postcore_initcall(pcc_init
);