1 /* 2 * Copyright (C) 2014 Linaro Ltd. 3 * Author: Ashwin Chaugule <ashwin.chaugule@linaro.org> 4 * 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. 9 * 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. 14 * 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. 24 * 25 * Typical high level flow of operation is: 26 * 27 * PCC Reads: 28 * * Client tries to acquire a channel lock. 29 * * After it is acquired it writes READ cmd in communication region cmd 30 * address. 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. 36 * 37 * PCC Writes: 38 * * Client tries to acquire channel lock. 39 * * Client writes to its communication region after it acquires a 40 * channel lock. 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 45 * the channel lock. 46 * 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. 50 * 51 * For more details about PCC, please see the ACPI specification from 52 * http://www.uefi.org/ACPIv5.1 Section 14. 53 * 54 * This file implements PCC as a Mailbox controller and allows for PCC 55 * clients to be implemented as its Mailbox Client Channels. 56 */ 57 58 #include <linux/acpi.h> 59 #include <linux/delay.h> 60 #include <linux/io.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> 68 #include <acpi/pcc.h> 69 70 #include "mailbox.h" 71 72 #define MAX_PCC_SUBSPACES 256 73 #define MBOX_IRQ_NAME "pcc-mbox" 74 75 static struct mbox_chan *pcc_mbox_channels; 76 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; 83 84 static struct mbox_controller pcc_mbox_ctrl = {}; 85 /** 86 * get_pcc_channel - Given a PCC subspace idx, get 87 * the respective mbox_channel. 88 * @id: PCC subspace index. 89 * 90 * Return: ERR_PTR(errno) if error, else pointer 91 * to mbox channel. 92 */ 93 static struct mbox_chan *get_pcc_channel(int id) 94 { 95 if (id < 0 || id > pcc_mbox_ctrl.num_chans) 96 return ERR_PTR(-ENOENT); 97 98 return &pcc_mbox_channels[id]; 99 } 100 101 /* 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 105 * 106 * The below read_register and write_registers are used to read and 107 * write from perf critical registers such as PCC doorbell register 108 */ 109 static int read_register(void __iomem *vaddr, u64 *val, unsigned int bit_width) 110 { 111 int ret_val = 0; 112 113 switch (bit_width) { 114 case 8: 115 *val = readb(vaddr); 116 break; 117 case 16: 118 *val = readw(vaddr); 119 break; 120 case 32: 121 *val = readl(vaddr); 122 break; 123 case 64: 124 *val = readq(vaddr); 125 break; 126 default: 127 pr_debug("Error: Cannot read register of %u bit width", 128 bit_width); 129 ret_val = -EFAULT; 130 break; 131 } 132 return ret_val; 133 } 134 135 static int write_register(void __iomem *vaddr, u64 val, unsigned int bit_width) 136 { 137 int ret_val = 0; 138 139 switch (bit_width) { 140 case 8: 141 writeb(val, vaddr); 142 break; 143 case 16: 144 writew(val, vaddr); 145 break; 146 case 32: 147 writel(val, vaddr); 148 break; 149 case 64: 150 writeq(val, vaddr); 151 break; 152 default: 153 pr_debug("Error: Cannot write register of %u bit width", 154 bit_width); 155 ret_val = -EFAULT; 156 break; 157 } 158 return ret_val; 159 } 160 161 /** 162 * pcc_map_interrupt - Map a PCC subspace GSI to a linux IRQ number 163 * @interrupt: GSI number. 164 * @flags: interrupt flags 165 * 166 * Returns: a valid linux IRQ number on success 167 * 0 or -EINVAL on failure 168 */ 169 static int pcc_map_interrupt(u32 interrupt, u32 flags) 170 { 171 int trigger, polarity; 172 173 if (!interrupt) 174 return 0; 175 176 trigger = (flags & ACPI_PCCT_INTERRUPT_MODE) ? ACPI_EDGE_SENSITIVE 177 : ACPI_LEVEL_SENSITIVE; 178 179 polarity = (flags & ACPI_PCCT_INTERRUPT_POLARITY) ? ACPI_ACTIVE_LOW 180 : ACPI_ACTIVE_HIGH; 181 182 return acpi_register_gsi(NULL, interrupt, trigger, polarity); 183 } 184 185 /** 186 * pcc_mbox_irq - PCC mailbox interrupt handler 187 */ 188 static irqreturn_t pcc_mbox_irq(int irq, void *p) 189 { 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; 196 int ret; 197 198 pcct_ss = chan->con_priv; 199 200 mbox_chan_received_data(chan, NULL); 201 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; 205 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; 209 210 ret = read_register(pcc_doorbell_ack_vaddr[id], 211 &doorbell_ack_val, 212 doorbell_ack->bit_width); 213 if (ret) 214 return IRQ_NONE; 215 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); 220 if (ret) 221 return IRQ_NONE; 222 } 223 224 return IRQ_HANDLED; 225 } 226 227 /** 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 232 * Channel. 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. 236 * 237 * Return: Pointer to the Mailbox Channel if successful or 238 * ERR_PTR. 239 */ 240 struct mbox_chan *pcc_mbox_request_channel(struct mbox_client *cl, 241 int subspace_id) 242 { 243 struct device *dev = pcc_mbox_ctrl.dev; 244 struct mbox_chan *chan; 245 unsigned long flags; 246 247 /* 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. 253 */ 254 chan = get_pcc_channel(subspace_id); 255 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); 259 } 260 261 spin_lock_irqsave(&chan->lock, flags); 262 chan->msg_free = 0; 263 chan->msg_count = 0; 264 chan->active_req = NULL; 265 chan->cl = cl; 266 init_completion(&chan->tx_complete); 267 268 if (chan->txdone_method == TXDONE_BY_POLL && cl->knows_txdone) 269 chan->txdone_method |= TXDONE_BY_ACK; 270 271 spin_unlock_irqrestore(&chan->lock, flags); 272 273 if (pcc_doorbell_irq[subspace_id] > 0) { 274 int rc; 275 276 rc = devm_request_irq(dev, pcc_doorbell_irq[subspace_id], 277 pcc_mbox_irq, 0, MBOX_IRQ_NAME, chan); 278 if (unlikely(rc)) { 279 dev_err(dev, "failed to register PCC interrupt %d\n", 280 pcc_doorbell_irq[subspace_id]); 281 pcc_mbox_free_channel(chan); 282 chan = ERR_PTR(rc); 283 } 284 } 285 286 return chan; 287 } 288 EXPORT_SYMBOL_GPL(pcc_mbox_request_channel); 289 290 /** 291 * pcc_mbox_free_channel - Clients call this to free their Channel. 292 * 293 * @chan: Pointer to the mailbox channel as returned by 294 * pcc_mbox_request_channel() 295 */ 296 void pcc_mbox_free_channel(struct mbox_chan *chan) 297 { 298 u32 id = chan - pcc_mbox_channels; 299 unsigned long flags; 300 301 if (!chan || !chan->cl) 302 return; 303 304 if (id >= pcc_mbox_ctrl.num_chans) { 305 pr_debug("pcc_mbox_free_channel: Invalid mbox_chan passed\n"); 306 return; 307 } 308 309 if (pcc_doorbell_irq[id] > 0) 310 devm_free_irq(chan->mbox->dev, pcc_doorbell_irq[id], chan); 311 312 spin_lock_irqsave(&chan->lock, flags); 313 chan->cl = NULL; 314 chan->active_req = NULL; 315 if (chan->txdone_method == (TXDONE_BY_POLL | TXDONE_BY_ACK)) 316 chan->txdone_method = TXDONE_BY_POLL; 317 318 spin_unlock_irqrestore(&chan->lock, flags); 319 } 320 EXPORT_SYMBOL_GPL(pcc_mbox_free_channel); 321 322 /** 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. 331 * 332 * Return: Err if something failed else 0 for success. 333 */ 334 static int pcc_send_data(struct mbox_chan *chan, void *data) 335 { 336 struct acpi_pcct_hw_reduced *pcct_ss = chan->con_priv; 337 struct acpi_generic_address *doorbell; 338 u64 doorbell_preserve; 339 u64 doorbell_val; 340 u64 doorbell_write; 341 u32 id = chan - pcc_mbox_channels; 342 int ret = 0; 343 344 if (id >= pcc_mbox_ctrl.num_chans) { 345 pr_debug("pcc_send_data: Invalid mbox_chan passed\n"); 346 return -ENOENT; 347 } 348 349 doorbell = &pcct_ss->doorbell_register; 350 doorbell_preserve = pcct_ss->preserve_mask; 351 doorbell_write = pcct_ss->write_mask; 352 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); 357 if (ret) 358 return ret; 359 ret = write_register(pcc_doorbell_vaddr[id], 360 (doorbell_val & doorbell_preserve) | doorbell_write, 361 doorbell->bit_width); 362 } else { 363 ret = acpi_read(&doorbell_val, doorbell); 364 if (ret) 365 return ret; 366 ret = acpi_write((doorbell_val & doorbell_preserve) | doorbell_write, 367 doorbell); 368 } 369 return ret; 370 } 371 372 static const struct mbox_chan_ops pcc_chan_ops = { 373 .send_data = pcc_send_data, 374 }; 375 376 /** 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. 381 * 382 * Return: 0 for Success, else errno. 383 * 384 * This gets called for each entry in the PCC table. 385 */ 386 static int parse_pcc_subspace(struct acpi_subtable_header *header, 387 const unsigned long end) 388 { 389 struct acpi_pcct_hw_reduced *pcct_ss; 390 391 if (pcc_mbox_ctrl.num_chans <= MAX_PCC_SUBSPACES) { 392 pcct_ss = (struct acpi_pcct_hw_reduced *) header; 393 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"); 399 return -EINVAL; 400 } 401 } 402 403 return 0; 404 } 405 406 /** 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. 411 * 412 * Return: 0 for Success, else errno. 413 * 414 * This gets called for each entry in the PCC table. 415 */ 416 static int pcc_parse_subspace_irq(int id, 417 struct acpi_pcct_hw_reduced *pcct_ss) 418 { 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); 424 return -EINVAL; 425 } 426 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; 430 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"); 436 return -ENOMEM; 437 } 438 } 439 440 return 0; 441 } 442 443 /** 444 * acpi_pcc_probe - Parse the ACPI tree for the PCCT. 445 * 446 * Return: 0 for Success, else errno. 447 */ 448 static int __init acpi_pcc_probe(void) 449 { 450 struct acpi_table_header *pcct_tbl; 451 struct acpi_subtable_header *pcct_entry; 452 struct acpi_table_pcct *acpi_pcct_tbl; 453 int count, i, rc; 454 int sum = 0; 455 acpi_status status = AE_OK; 456 457 /* Search for PCCT */ 458 status = acpi_get_table(ACPI_SIG_PCCT, 0, &pcct_tbl); 459 460 if (ACPI_FAILURE(status) || !pcct_tbl) { 461 pr_warn("PCCT header not found.\n"); 462 return -ENODEV; 463 } 464 465 count = acpi_table_parse_entries(ACPI_SIG_PCCT, 466 sizeof(struct acpi_table_pcct), 467 ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE, 468 parse_pcc_subspace, MAX_PCC_SUBSPACES); 469 sum += (count > 0) ? count : 0; 470 471 count = acpi_table_parse_entries(ACPI_SIG_PCCT, 472 sizeof(struct acpi_table_pcct), 473 ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2, 474 parse_pcc_subspace, MAX_PCC_SUBSPACES); 475 sum += (count > 0) ? count : 0; 476 477 if (sum == 0 || sum >= MAX_PCC_SUBSPACES) { 478 pr_err("Error parsing PCC subspaces from PCCT\n"); 479 return -EINVAL; 480 } 481 482 pcc_mbox_channels = kzalloc(sizeof(struct mbox_chan) * 483 sum, GFP_KERNEL); 484 if (!pcc_mbox_channels) { 485 pr_err("Could not allocate space for PCC mbox channels\n"); 486 return -ENOMEM; 487 } 488 489 pcc_doorbell_vaddr = kcalloc(sum, sizeof(void *), GFP_KERNEL); 490 if (!pcc_doorbell_vaddr) { 491 rc = -ENOMEM; 492 goto err_free_mbox; 493 } 494 495 pcc_doorbell_ack_vaddr = kcalloc(sum, sizeof(void *), GFP_KERNEL); 496 if (!pcc_doorbell_ack_vaddr) { 497 rc = -ENOMEM; 498 goto err_free_db_vaddr; 499 } 500 501 pcc_doorbell_irq = kcalloc(sum, sizeof(int), GFP_KERNEL); 502 if (!pcc_doorbell_irq) { 503 rc = -ENOMEM; 504 goto err_free_db_ack_vaddr; 505 } 506 507 /* Point to the first PCC subspace entry */ 508 pcct_entry = (struct acpi_subtable_header *) ( 509 (unsigned long) pcct_tbl + sizeof(struct acpi_table_pcct)); 510 511 acpi_pcct_tbl = (struct acpi_table_pcct *) pcct_tbl; 512 if (acpi_pcct_tbl->flags & ACPI_PCCT_DOORBELL) 513 pcc_mbox_ctrl.txdone_irq = true; 514 515 for (i = 0; i < sum; i++) { 516 struct acpi_generic_address *db_reg; 517 struct acpi_pcct_hw_reduced *pcct_ss; 518 pcc_mbox_channels[i].con_priv = pcct_entry; 519 520 pcct_ss = (struct acpi_pcct_hw_reduced *) pcct_entry; 521 522 if (pcc_mbox_ctrl.txdone_irq) { 523 rc = pcc_parse_subspace_irq(i, pcct_ss); 524 if (rc < 0) 525 goto err; 526 } 527 528 /* If doorbell is in system memory cache the virt address */ 529 db_reg = &pcct_ss->doorbell_register; 530 if (db_reg->space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) 531 pcc_doorbell_vaddr[i] = acpi_os_ioremap(db_reg->address, 532 db_reg->bit_width/8); 533 pcct_entry = (struct acpi_subtable_header *) 534 ((unsigned long) pcct_entry + pcct_entry->length); 535 } 536 537 pcc_mbox_ctrl.num_chans = sum; 538 539 pr_info("Detected %d PCC Subspaces\n", pcc_mbox_ctrl.num_chans); 540 541 return 0; 542 543 err: 544 kfree(pcc_doorbell_irq); 545 err_free_db_ack_vaddr: 546 kfree(pcc_doorbell_ack_vaddr); 547 err_free_db_vaddr: 548 kfree(pcc_doorbell_vaddr); 549 err_free_mbox: 550 kfree(pcc_mbox_channels); 551 return rc; 552 } 553 554 /** 555 * pcc_mbox_probe - Called when we find a match for the 556 * PCCT platform device. This is purely used to represent 557 * the PCCT as a virtual device for registering with the 558 * generic Mailbox framework. 559 * 560 * @pdev: Pointer to platform device returned when a match 561 * is found. 562 * 563 * Return: 0 for Success, else errno. 564 */ 565 static int pcc_mbox_probe(struct platform_device *pdev) 566 { 567 int ret = 0; 568 569 pcc_mbox_ctrl.chans = pcc_mbox_channels; 570 pcc_mbox_ctrl.ops = &pcc_chan_ops; 571 pcc_mbox_ctrl.dev = &pdev->dev; 572 573 pr_info("Registering PCC driver as Mailbox controller\n"); 574 ret = mbox_controller_register(&pcc_mbox_ctrl); 575 576 if (ret) { 577 pr_err("Err registering PCC as Mailbox controller: %d\n", ret); 578 ret = -ENODEV; 579 } 580 581 return ret; 582 } 583 584 struct platform_driver pcc_mbox_driver = { 585 .probe = pcc_mbox_probe, 586 .driver = { 587 .name = "PCCT", 588 .owner = THIS_MODULE, 589 }, 590 }; 591 592 static int __init pcc_init(void) 593 { 594 int ret; 595 struct platform_device *pcc_pdev; 596 597 if (acpi_disabled) 598 return -ENODEV; 599 600 /* Check if PCC support is available. */ 601 ret = acpi_pcc_probe(); 602 603 if (ret) { 604 pr_debug("ACPI PCC probe failed.\n"); 605 return -ENODEV; 606 } 607 608 pcc_pdev = platform_create_bundle(&pcc_mbox_driver, 609 pcc_mbox_probe, NULL, 0, NULL, 0); 610 611 if (IS_ERR(pcc_pdev)) { 612 pr_debug("Err creating PCC platform bundle\n"); 613 return PTR_ERR(pcc_pdev); 614 } 615 616 return 0; 617 } 618 619 /* 620 * Make PCC init postcore so that users of this mailbox 621 * such as the ACPI Processor driver have it available 622 * at their init. 623 */ 624 postcore_initcall(pcc_init); 625