1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * Copyright (C) 2014 Linaro Ltd. 4 * Author: Ashwin Chaugule <ashwin.chaugule@linaro.org> 5 * 6 * PCC (Platform Communication Channel) is defined in the ACPI 5.0+ 7 * specification. It is a mailbox like mechanism to allow clients 8 * such as CPPC (Collaborative Processor Performance Control), RAS 9 * (Reliability, Availability and Serviceability) and MPST (Memory 10 * Node Power State Table) to talk to the platform (e.g. BMC) through 11 * shared memory regions as defined in the PCC table entries. The PCC 12 * specification supports a Doorbell mechanism for the PCC clients 13 * to notify the platform about new data. This Doorbell information 14 * is also specified in each PCC table entry. 15 * 16 * Typical high level flow of operation is: 17 * 18 * PCC Reads: 19 * * Client tries to acquire a channel lock. 20 * * After it is acquired it writes READ cmd in communication region cmd 21 * address. 22 * * Client issues mbox_send_message() which rings the PCC doorbell 23 * for its PCC channel. 24 * * If command completes, then client has control over channel and 25 * it can proceed with its reads. 26 * * Client releases lock. 27 * 28 * PCC Writes: 29 * * Client tries to acquire channel lock. 30 * * Client writes to its communication region after it acquires a 31 * channel lock. 32 * * Client writes WRITE cmd in communication region cmd address. 33 * * Client issues mbox_send_message() which rings the PCC doorbell 34 * for its PCC channel. 35 * * If command completes, then writes have succeeded and it can release 36 * the channel lock. 37 * 38 * There is a Nominal latency defined for each channel which indicates 39 * how long to wait until a command completes. If command is not complete 40 * the client needs to retry or assume failure. 41 * 42 * For more details about PCC, please see the ACPI specification from 43 * http://www.uefi.org/ACPIv5.1 Section 14. 44 * 45 * This file implements PCC as a Mailbox controller and allows for PCC 46 * clients to be implemented as its Mailbox Client Channels. 47 */ 48 49 #include <linux/acpi.h> 50 #include <linux/delay.h> 51 #include <linux/io.h> 52 #include <linux/init.h> 53 #include <linux/interrupt.h> 54 #include <linux/list.h> 55 #include <linux/log2.h> 56 #include <linux/platform_device.h> 57 #include <linux/mailbox_controller.h> 58 #include <linux/mailbox_client.h> 59 #include <linux/io-64-nonatomic-lo-hi.h> 60 #include <acpi/pcc.h> 61 62 #define MBOX_IRQ_NAME "pcc-mbox" 63 64 /** 65 * struct pcc_chan_reg - PCC register bundle 66 * 67 * @vaddr: cached virtual address for this register 68 * @gas: pointer to the generic address structure for this register 69 * @preserve_mask: bitmask to preserve when writing to this register 70 * @set_mask: bitmask to set when writing to this register 71 * @status_mask: bitmask to determine and/or update the status for this register 72 */ 73 struct pcc_chan_reg { 74 void __iomem *vaddr; 75 struct acpi_generic_address *gas; 76 u64 preserve_mask; 77 u64 set_mask; 78 u64 status_mask; 79 }; 80 81 /** 82 * struct pcc_chan_info - PCC channel specific information 83 * 84 * @chan: PCC channel information with Shared Memory Region info 85 * @db: PCC register bundle for the doorbell register 86 * @plat_irq_ack: PCC register bundle for the platform interrupt acknowledge 87 * register 88 * @cmd_complete: PCC register bundle for the command complete check register 89 * @cmd_update: PCC register bundle for the command complete update register 90 * @error: PCC register bundle for the error status register 91 * @plat_irq: platform interrupt 92 * @type: PCC subspace type 93 * @plat_irq_flags: platform interrupt flags 94 * @chan_in_use: lockless flag used by type 3 initiator subspaces to filter 95 * platform interrupts. Only one transfer can occur at a time, but 96 * the interrupt handler may sample the flag on another CPU, so all 97 * accesses must use READ_ONCE() or WRITE_ONCE(). Other subspace 98 * types do not test it. 99 */ 100 struct pcc_chan_info { 101 struct pcc_mbox_chan chan; 102 struct pcc_chan_reg db; 103 struct pcc_chan_reg plat_irq_ack; 104 struct pcc_chan_reg cmd_complete; 105 struct pcc_chan_reg cmd_update; 106 struct pcc_chan_reg error; 107 int plat_irq; 108 u8 type; 109 unsigned int plat_irq_flags; 110 bool chan_in_use; 111 }; 112 113 #define to_pcc_chan_info(c) container_of(c, struct pcc_chan_info, chan) 114 static struct pcc_chan_info *chan_info; 115 static int pcc_chan_count; 116 117 /* 118 * PCC can be used with perf critical drivers such as CPPC 119 * So it makes sense to locally cache the virtual address and 120 * use it to read/write to PCC registers such as doorbell register 121 * 122 * The below read_register and write_registers are used to read and 123 * write from perf critical registers such as PCC doorbell register 124 */ 125 static void read_register(void __iomem *vaddr, u64 *val, unsigned int bit_width) 126 { 127 switch (bit_width) { 128 case 8: 129 *val = readb(vaddr); 130 break; 131 case 16: 132 *val = readw(vaddr); 133 break; 134 case 32: 135 *val = readl(vaddr); 136 break; 137 case 64: 138 *val = readq(vaddr); 139 break; 140 } 141 } 142 143 static void write_register(void __iomem *vaddr, u64 val, unsigned int bit_width) 144 { 145 switch (bit_width) { 146 case 8: 147 writeb(val, vaddr); 148 break; 149 case 16: 150 writew(val, vaddr); 151 break; 152 case 32: 153 writel(val, vaddr); 154 break; 155 case 64: 156 writeq(val, vaddr); 157 break; 158 } 159 } 160 161 static int pcc_chan_reg_read(struct pcc_chan_reg *reg, u64 *val) 162 { 163 int ret = 0; 164 165 if (!reg->gas) { 166 *val = 0; 167 return 0; 168 } 169 170 if (reg->vaddr) 171 read_register(reg->vaddr, val, reg->gas->bit_width); 172 else 173 ret = acpi_read(val, reg->gas); 174 175 return ret; 176 } 177 178 static int pcc_chan_reg_write(struct pcc_chan_reg *reg, u64 val) 179 { 180 int ret = 0; 181 182 if (!reg->gas) 183 return 0; 184 185 if (reg->vaddr) 186 write_register(reg->vaddr, val, reg->gas->bit_width); 187 else 188 ret = acpi_write(val, reg->gas); 189 190 return ret; 191 } 192 193 static int pcc_chan_reg_read_modify_write(struct pcc_chan_reg *reg) 194 { 195 int ret = 0; 196 u64 val; 197 198 ret = pcc_chan_reg_read(reg, &val); 199 if (ret) 200 return ret; 201 202 val &= reg->preserve_mask; 203 val |= reg->set_mask; 204 205 return pcc_chan_reg_write(reg, val); 206 } 207 208 /** 209 * pcc_map_interrupt - Map a PCC subspace GSI to a linux IRQ number 210 * @interrupt: GSI number. 211 * @flags: interrupt flags 212 * 213 * Returns: a valid linux IRQ number on success 214 * 0 or -EINVAL on failure 215 */ 216 static int pcc_map_interrupt(u32 interrupt, u32 flags) 217 { 218 int trigger, polarity; 219 220 if (!interrupt) 221 return 0; 222 223 trigger = (flags & ACPI_PCCT_INTERRUPT_MODE) ? ACPI_EDGE_SENSITIVE 224 : ACPI_LEVEL_SENSITIVE; 225 226 polarity = (flags & ACPI_PCCT_INTERRUPT_POLARITY) ? ACPI_ACTIVE_LOW 227 : ACPI_ACTIVE_HIGH; 228 229 return acpi_register_gsi(NULL, interrupt, trigger, polarity); 230 } 231 232 static bool pcc_chan_plat_irq_can_be_shared(struct pcc_chan_info *pchan) 233 { 234 return (pchan->plat_irq_flags & ACPI_PCCT_INTERRUPT_MODE) == 235 ACPI_LEVEL_SENSITIVE; 236 } 237 238 static bool pcc_mbox_cmd_complete_check(struct pcc_chan_info *pchan) 239 { 240 u64 val; 241 int ret; 242 243 if (!pchan->cmd_complete.gas) 244 return true; 245 246 ret = pcc_chan_reg_read(&pchan->cmd_complete, &val); 247 if (ret) 248 return false; 249 250 /* 251 * Judge if the channel respond the interrupt based on the value of 252 * command complete. 253 */ 254 val &= pchan->cmd_complete.status_mask; 255 256 /* 257 * If this is PCC slave subspace channel, and the command complete 258 * bit 0 indicates that Platform is sending a notification and OSPM 259 * needs to respond this interrupt to process this command. 260 */ 261 if (pchan->type == ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE) 262 return !val; 263 264 return !!val; 265 } 266 267 static int pcc_mbox_error_check_and_clear(struct pcc_chan_info *pchan) 268 { 269 u64 val; 270 int ret; 271 272 ret = pcc_chan_reg_read(&pchan->error, &val); 273 if (ret) 274 return ret; 275 276 if (val & pchan->error.status_mask) { 277 val &= pchan->error.preserve_mask; 278 pcc_chan_reg_write(&pchan->error, val); 279 return -EIO; 280 } 281 282 return 0; 283 } 284 285 static void pcc_chan_acknowledge(struct pcc_chan_info *pchan) 286 { 287 struct acpi_pcct_ext_pcc_shared_memory __iomem *pcc_hdr; 288 289 if (pchan->type != ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE) 290 return; 291 292 pcc_chan_reg_read_modify_write(&pchan->cmd_update); 293 294 pcc_hdr = pchan->chan.shmem; 295 296 /* 297 * The PCC slave subspace channel needs to set the command 298 * complete bit after processing message. If the PCC_ACK_FLAG 299 * is set, it should also ring the doorbell. 300 */ 301 if (ioread32(&pcc_hdr->flags) & PCC_CMD_COMPLETION_NOTIFY) 302 pcc_chan_reg_read_modify_write(&pchan->db); 303 } 304 305 /** 306 * pcc_mbox_irq - PCC mailbox interrupt handler 307 * @irq: interrupt number 308 * @p: data/cookie passed from the caller to identify the channel 309 * 310 * Returns: IRQ_HANDLED if interrupt is handled or IRQ_NONE if not 311 */ 312 static irqreturn_t pcc_mbox_irq(int irq, void *p) 313 { 314 struct pcc_chan_info *pchan; 315 struct mbox_chan *chan = p; 316 317 pchan = chan->con_priv; 318 319 if (pcc_chan_reg_read_modify_write(&pchan->plat_irq_ack)) 320 return IRQ_NONE; 321 322 /* 323 * Initiator subspaces use this flag to filter shared interrupts. Use 324 * READ_ONCE() to sample the lockless flag written by pcc_send_data() 325 * on another CPU. 326 */ 327 if (pchan->type == ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE && 328 !READ_ONCE(pchan->chan_in_use)) 329 return IRQ_NONE; 330 331 if (!pcc_mbox_cmd_complete_check(pchan)) 332 return IRQ_NONE; 333 334 if (pcc_mbox_error_check_and_clear(pchan)) 335 return IRQ_NONE; 336 337 /* 338 * Clear this flag after updating the interrupt ack register and before 339 * notifying the client and mailbox core. mbox_chan_txdone() may submit 340 * the next queued transfer and set the flag again. Use WRITE_ONCE() for 341 * the lockless update observed by the send and interrupt paths. 342 */ 343 WRITE_ONCE(pchan->chan_in_use, false); 344 mbox_chan_received_data(chan, NULL); 345 mbox_chan_txdone(chan, 0); 346 347 pcc_chan_acknowledge(pchan); 348 349 return IRQ_HANDLED; 350 } 351 352 static int pcc_mbox_validate_signature(struct pcc_mbox_chan *pcc_mchan, 353 int subspace_id) 354 { 355 u32 expected_signature = PCC_SIGNATURE | subspace_id; 356 u32 signature; 357 358 if (pcc_mchan->shmem_size < sizeof(signature)) { 359 pr_err("PCC subspace %d shared memory is too small\n", 360 subspace_id); 361 return -EINVAL; 362 } 363 364 signature = ioread32(pcc_mchan->shmem); 365 if (signature != expected_signature) 366 pr_warn("PCC subspace %d invalid signature %#x expected %#x\n", 367 subspace_id, signature, expected_signature); 368 369 return 0; 370 } 371 372 /** 373 * pcc_mbox_request_channel - PCC clients call this function to 374 * request a pointer to their PCC subspace, from which they 375 * can get the details of communicating with the remote. 376 * @cl: Pointer to Mailbox client, so we know where to bind the 377 * Channel. 378 * @subspace_id: The PCC Subspace index as parsed in the PCC client 379 * ACPI package. This is used to lookup the array of PCC 380 * subspaces as parsed by the PCC Mailbox controller. 381 * 382 * Return: Pointer to the PCC Mailbox Channel if successful or ERR_PTR. 383 */ 384 struct pcc_mbox_chan * 385 pcc_mbox_request_channel(struct mbox_client *cl, int subspace_id) 386 { 387 struct pcc_mbox_chan *pcc_mchan; 388 struct pcc_chan_info *pchan; 389 struct mbox_chan *chan; 390 int rc; 391 392 if (subspace_id < 0 || subspace_id >= pcc_chan_count) 393 return ERR_PTR(-ENOENT); 394 395 pchan = chan_info + subspace_id; 396 chan = pchan->chan.mchan; 397 if (IS_ERR(chan) || chan->cl) { 398 pr_err("Channel not found for idx: %d\n", subspace_id); 399 return ERR_PTR(-EBUSY); 400 } 401 402 pcc_mchan = &pchan->chan; 403 pcc_mchan->shmem = acpi_os_ioremap(pcc_mchan->shmem_base_addr, 404 pcc_mchan->shmem_size); 405 if (!pcc_mchan->shmem) 406 return ERR_PTR(-ENXIO); 407 408 rc = pcc_mbox_validate_signature(pcc_mchan, subspace_id); 409 if (rc) 410 goto err_unmap_shmem; 411 412 rc = mbox_bind_client(chan, cl); 413 if (rc) 414 goto err_unmap_shmem; 415 416 return pcc_mchan; 417 418 err_unmap_shmem: 419 iounmap(pcc_mchan->shmem); 420 pcc_mchan->shmem = NULL; 421 return ERR_PTR(rc); 422 } 423 EXPORT_SYMBOL_GPL(pcc_mbox_request_channel); 424 425 /** 426 * pcc_mbox_free_channel - Clients call this to free their Channel. 427 * 428 * @pchan: Pointer to the PCC mailbox channel as returned by 429 * pcc_mbox_request_channel() 430 */ 431 void pcc_mbox_free_channel(struct pcc_mbox_chan *pchan) 432 { 433 struct mbox_chan *chan = pchan->mchan; 434 struct pcc_chan_info *pchan_info; 435 struct pcc_mbox_chan *pcc_mbox_chan; 436 437 if (!chan || !chan->cl) 438 return; 439 pchan_info = chan->con_priv; 440 pcc_mbox_chan = &pchan_info->chan; 441 if (pcc_mbox_chan->shmem) { 442 iounmap(pcc_mbox_chan->shmem); 443 pcc_mbox_chan->shmem = NULL; 444 } 445 446 mbox_free_channel(chan); 447 } 448 EXPORT_SYMBOL_GPL(pcc_mbox_free_channel); 449 450 /** 451 * pcc_send_data - Called from Mailbox Controller code. Used 452 * here only to ring the channel doorbell. The PCC client 453 * specific read/write is done in the client driver in 454 * order to maintain atomicity over PCC channel once 455 * OS has control over it. See above for flow of operations. 456 * @chan: Pointer to Mailbox channel over which to send data. 457 * @data: Client specific data written over channel. Used here 458 * only for debug after PCC transaction completes. 459 * 460 * Return: Err if something failed else 0 for success. 461 */ 462 static int pcc_send_data(struct mbox_chan *chan, void *data) 463 { 464 int ret; 465 struct pcc_chan_info *pchan = chan->con_priv; 466 467 ret = pcc_chan_reg_read_modify_write(&pchan->cmd_update); 468 if (ret) 469 return ret; 470 471 /* 472 * Set chan_in_use before ringing the doorbell so a fast completion 473 * interrupt is not mistaken for a shared interrupt from another 474 * subspace. Use WRITE_ONCE() for the lockless flag update. The 475 * ordered I/O accessor used to ring the doorbell orders this store 476 * before the platform is notified. 477 */ 478 if (pchan->plat_irq > 0) 479 WRITE_ONCE(pchan->chan_in_use, true); 480 ret = pcc_chan_reg_read_modify_write(&pchan->db); 481 if (ret && pchan->plat_irq > 0) 482 WRITE_ONCE(pchan->chan_in_use, false); 483 484 return ret; 485 } 486 487 static bool pcc_last_tx_done(struct mbox_chan *chan) 488 { 489 struct pcc_chan_info *pchan = chan->con_priv; 490 491 if (!(chan->txdone_method & MBOX_TXDONE_BY_POLL)) 492 return false; 493 494 if (!pcc_mbox_cmd_complete_check(pchan)) 495 return false; 496 497 mbox_chan_received_data(chan, NULL); 498 499 return true; 500 } 501 502 /** 503 * pcc_startup - Called from Mailbox Controller code. Used here 504 * to request the interrupt. 505 * @chan: Pointer to Mailbox channel to startup. 506 * 507 * Return: Err if something failed else 0 for success. 508 */ 509 static int pcc_startup(struct mbox_chan *chan) 510 { 511 struct pcc_chan_info *pchan = chan->con_priv; 512 unsigned long irqflags; 513 int rc; 514 515 /* 516 * Clear and acknowledge any pending interrupts on responder channel 517 * before enabling the interrupt 518 */ 519 pcc_chan_acknowledge(pchan); 520 521 if (pchan->plat_irq > 0) { 522 irqflags = pcc_chan_plat_irq_can_be_shared(pchan) ? 523 IRQF_SHARED : 0; 524 rc = devm_request_irq(chan->mbox->dev, pchan->plat_irq, pcc_mbox_irq, 525 irqflags, MBOX_IRQ_NAME, chan); 526 if (unlikely(rc)) { 527 dev_err(chan->mbox->dev, "failed to register PCC interrupt %d\n", 528 pchan->plat_irq); 529 return rc; 530 } 531 } 532 533 return 0; 534 } 535 536 /** 537 * pcc_shutdown - Called from Mailbox Controller code. Used here 538 * to free the interrupt. 539 * @chan: Pointer to Mailbox channel to shutdown. 540 */ 541 static void pcc_shutdown(struct mbox_chan *chan) 542 { 543 struct pcc_chan_info *pchan = chan->con_priv; 544 545 if (pchan->plat_irq > 0) 546 devm_free_irq(chan->mbox->dev, pchan->plat_irq, chan); 547 } 548 549 static const struct mbox_chan_ops pcc_chan_ops = { 550 .send_data = pcc_send_data, 551 .startup = pcc_startup, 552 .shutdown = pcc_shutdown, 553 .last_tx_done = pcc_last_tx_done, 554 }; 555 556 /** 557 * parse_pcc_subspace - Count PCC subspaces defined 558 * @header: Pointer to the ACPI subtable header under the PCCT. 559 * @end: End of subtable entry. 560 * 561 * Return: If we find a PCC subspace entry of a valid type, return 0. 562 * Otherwise, return -EINVAL. 563 * 564 * This gets called for each entry in the PCC table. 565 */ 566 static int parse_pcc_subspace(union acpi_subtable_headers *header, 567 const unsigned long end) 568 { 569 struct acpi_pcct_subspace *ss = (struct acpi_pcct_subspace *) header; 570 571 if (ss->header.type < ACPI_PCCT_TYPE_RESERVED) 572 return 0; 573 574 return -EINVAL; 575 } 576 577 static int 578 pcc_chan_reg_init(struct pcc_chan_reg *reg, struct acpi_generic_address *gas, 579 u64 preserve_mask, u64 set_mask, u64 status_mask, char *name) 580 { 581 if (gas->space_id == ACPI_ADR_SPACE_SYSTEM_MEMORY) { 582 if (!(gas->bit_width >= 8 && gas->bit_width <= 64 && 583 is_power_of_2(gas->bit_width))) { 584 pr_err("Error: Cannot access register of %u bit width", 585 gas->bit_width); 586 return -EFAULT; 587 } 588 589 reg->vaddr = acpi_os_ioremap(gas->address, gas->bit_width / 8); 590 if (!reg->vaddr) { 591 pr_err("Failed to ioremap PCC %s register\n", name); 592 return -ENOMEM; 593 } 594 } 595 reg->gas = gas; 596 reg->preserve_mask = preserve_mask; 597 reg->set_mask = set_mask; 598 reg->status_mask = status_mask; 599 return 0; 600 } 601 602 /** 603 * pcc_parse_subspace_irq - Parse the PCC IRQ and PCC ACK register 604 * 605 * @pchan: Pointer to the PCC channel info structure. 606 * @pcct_entry: Pointer to the ACPI subtable header. 607 * 608 * Return: 0 for Success, else errno. 609 * 610 * There should be one entry per PCC channel. This gets called for each 611 * entry in the PCC table. This uses PCCY Type1 structure for all applicable 612 * types(Type 1-4) to fetch irq 613 */ 614 static int pcc_parse_subspace_irq(struct pcc_chan_info *pchan, 615 struct acpi_subtable_header *pcct_entry) 616 { 617 int ret = 0; 618 struct acpi_pcct_hw_reduced *pcct_ss; 619 620 if (pcct_entry->type < ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE || 621 pcct_entry->type > ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE) 622 return 0; 623 624 pcct_ss = (struct acpi_pcct_hw_reduced *)pcct_entry; 625 pchan->plat_irq = pcc_map_interrupt(pcct_ss->platform_interrupt, 626 (u32)pcct_ss->flags); 627 if (pchan->plat_irq <= 0) { 628 pr_err("PCC GSI %d not registered\n", 629 pcct_ss->platform_interrupt); 630 return -EINVAL; 631 } 632 pchan->plat_irq_flags = pcct_ss->flags; 633 634 if (pcct_ss->header.type == ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2) { 635 struct acpi_pcct_hw_reduced_type2 *pcct2_ss = (void *)pcct_ss; 636 637 ret = pcc_chan_reg_init(&pchan->plat_irq_ack, 638 &pcct2_ss->platform_ack_register, 639 pcct2_ss->ack_preserve_mask, 640 pcct2_ss->ack_write_mask, 0, 641 "PLAT IRQ ACK"); 642 643 } else if (pcct_ss->header.type == ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE || 644 pcct_ss->header.type == ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE) { 645 struct acpi_pcct_ext_pcc_master *pcct_ext = (void *)pcct_ss; 646 647 ret = pcc_chan_reg_init(&pchan->plat_irq_ack, 648 &pcct_ext->platform_ack_register, 649 pcct_ext->ack_preserve_mask, 650 pcct_ext->ack_set_mask, 0, 651 "PLAT IRQ ACK"); 652 } 653 654 if (pcc_chan_plat_irq_can_be_shared(pchan) && 655 !pchan->plat_irq_ack.gas) { 656 pr_err("PCC subspace has level IRQ with no ACK register\n"); 657 return -EINVAL; 658 } 659 660 return ret; 661 } 662 663 /** 664 * pcc_parse_subspace_db_reg - Parse the PCC doorbell register 665 * 666 * @pchan: Pointer to the PCC channel info structure. 667 * @pcct_entry: Pointer to the ACPI subtable header. 668 * 669 * Return: 0 for Success, else errno. 670 */ 671 static int pcc_parse_subspace_db_reg(struct pcc_chan_info *pchan, 672 struct acpi_subtable_header *pcct_entry) 673 { 674 int ret = 0; 675 676 if (pcct_entry->type <= ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2) { 677 struct acpi_pcct_subspace *pcct_ss; 678 679 pcct_ss = (struct acpi_pcct_subspace *)pcct_entry; 680 681 ret = pcc_chan_reg_init(&pchan->db, 682 &pcct_ss->doorbell_register, 683 pcct_ss->preserve_mask, 684 pcct_ss->write_mask, 0, "Doorbell"); 685 686 } else { 687 struct acpi_pcct_ext_pcc_master *pcct_ext; 688 689 pcct_ext = (struct acpi_pcct_ext_pcc_master *)pcct_entry; 690 691 ret = pcc_chan_reg_init(&pchan->db, 692 &pcct_ext->doorbell_register, 693 pcct_ext->preserve_mask, 694 pcct_ext->write_mask, 0, "Doorbell"); 695 if (ret) 696 return ret; 697 698 ret = pcc_chan_reg_init(&pchan->cmd_complete, 699 &pcct_ext->cmd_complete_register, 700 0, 0, pcct_ext->cmd_complete_mask, 701 "Command Complete Check"); 702 if (ret) 703 return ret; 704 705 ret = pcc_chan_reg_init(&pchan->cmd_update, 706 &pcct_ext->cmd_update_register, 707 pcct_ext->cmd_update_preserve_mask, 708 pcct_ext->cmd_update_set_mask, 0, 709 "Command Complete Update"); 710 if (ret) 711 return ret; 712 713 ret = pcc_chan_reg_init(&pchan->error, 714 &pcct_ext->error_status_register, 715 ~pcct_ext->error_status_mask, 0, 716 pcct_ext->error_status_mask, 717 "Error Status"); 718 } 719 return ret; 720 } 721 722 /** 723 * pcc_parse_subspace_shmem - Parse the PCC Shared Memory Region information 724 * 725 * @pchan: Pointer to the PCC channel info structure. 726 * @pcct_entry: Pointer to the ACPI subtable header. 727 * 728 */ 729 static void pcc_parse_subspace_shmem(struct pcc_chan_info *pchan, 730 struct acpi_subtable_header *pcct_entry) 731 { 732 if (pcct_entry->type <= ACPI_PCCT_TYPE_HW_REDUCED_SUBSPACE_TYPE2) { 733 struct acpi_pcct_subspace *pcct_ss = 734 (struct acpi_pcct_subspace *)pcct_entry; 735 736 pchan->chan.shmem_base_addr = pcct_ss->base_address; 737 pchan->chan.shmem_size = pcct_ss->length; 738 pchan->chan.latency = pcct_ss->latency; 739 pchan->chan.max_access_rate = pcct_ss->max_access_rate; 740 pchan->chan.min_turnaround_time = pcct_ss->min_turnaround_time; 741 } else { 742 struct acpi_pcct_ext_pcc_master *pcct_ext = 743 (struct acpi_pcct_ext_pcc_master *)pcct_entry; 744 745 pchan->chan.shmem_base_addr = pcct_ext->base_address; 746 pchan->chan.shmem_size = pcct_ext->length; 747 pchan->chan.latency = pcct_ext->latency; 748 pchan->chan.max_access_rate = pcct_ext->max_access_rate; 749 pchan->chan.min_turnaround_time = pcct_ext->min_turnaround_time; 750 } 751 } 752 753 /** 754 * acpi_pcc_probe - Parse the ACPI tree for the PCCT. 755 * 756 * Return: 0 for Success, else errno. 757 */ 758 static int __init acpi_pcc_probe(void) 759 { 760 int count, i, rc = 0; 761 acpi_status status; 762 struct acpi_table_header *pcct_tbl; 763 struct acpi_subtable_proc proc[ACPI_PCCT_TYPE_RESERVED]; 764 765 status = acpi_get_table(ACPI_SIG_PCCT, 0, &pcct_tbl); 766 if (ACPI_FAILURE(status) || !pcct_tbl) 767 return -ENODEV; 768 769 /* Set up the subtable handlers */ 770 for (i = ACPI_PCCT_TYPE_GENERIC_SUBSPACE; 771 i < ACPI_PCCT_TYPE_RESERVED; i++) { 772 proc[i].id = i; 773 proc[i].count = 0; 774 proc[i].handler = parse_pcc_subspace; 775 } 776 777 count = acpi_table_parse_entries_array(ACPI_SIG_PCCT, 778 sizeof(struct acpi_table_pcct), proc, 779 ACPI_PCCT_TYPE_RESERVED, MAX_PCC_SUBSPACES); 780 if (count <= 0 || count > MAX_PCC_SUBSPACES) { 781 if (count < 0) 782 pr_warn("Error parsing PCC subspaces from PCCT\n"); 783 else 784 pr_warn("Invalid PCCT: %d PCC subspaces\n", count); 785 786 rc = -EINVAL; 787 } else { 788 pcc_chan_count = count; 789 } 790 791 acpi_put_table(pcct_tbl); 792 793 return rc; 794 } 795 796 /** 797 * pcc_mbox_probe - Called when we find a match for the 798 * PCCT platform device. This is purely used to represent 799 * the PCCT as a virtual device for registering with the 800 * generic Mailbox framework. 801 * 802 * @pdev: Pointer to platform device returned when a match 803 * is found. 804 * 805 * Return: 0 for Success, else errno. 806 */ 807 static int pcc_mbox_probe(struct platform_device *pdev) 808 { 809 struct device *dev = &pdev->dev; 810 struct mbox_controller *pcc_mbox_ctrl; 811 struct mbox_chan *pcc_mbox_channels; 812 struct acpi_table_header *pcct_tbl; 813 struct acpi_subtable_header *pcct_entry; 814 struct acpi_table_pcct *acpi_pcct_tbl; 815 acpi_status status = AE_OK; 816 int i, rc, count = pcc_chan_count; 817 818 /* Search for PCCT */ 819 status = acpi_get_table(ACPI_SIG_PCCT, 0, &pcct_tbl); 820 821 if (ACPI_FAILURE(status) || !pcct_tbl) 822 return -ENODEV; 823 824 pcc_mbox_channels = devm_kcalloc(dev, count, sizeof(*pcc_mbox_channels), 825 GFP_KERNEL); 826 if (!pcc_mbox_channels) { 827 rc = -ENOMEM; 828 goto err; 829 } 830 831 chan_info = devm_kcalloc(dev, count, sizeof(*chan_info), GFP_KERNEL); 832 if (!chan_info) { 833 rc = -ENOMEM; 834 goto err; 835 } 836 837 pcc_mbox_ctrl = devm_kzalloc(dev, sizeof(*pcc_mbox_ctrl), GFP_KERNEL); 838 if (!pcc_mbox_ctrl) { 839 rc = -ENOMEM; 840 goto err; 841 } 842 843 /* Point to the first PCC subspace entry */ 844 pcct_entry = (struct acpi_subtable_header *) ( 845 (unsigned long) pcct_tbl + sizeof(struct acpi_table_pcct)); 846 847 acpi_pcct_tbl = (struct acpi_table_pcct *) pcct_tbl; 848 if (acpi_pcct_tbl->flags & ACPI_PCCT_DOORBELL) { 849 pcc_mbox_ctrl->txdone_irq = true; 850 pcc_mbox_ctrl->txdone_poll = false; 851 } else { 852 pcc_mbox_ctrl->txdone_irq = false; 853 pcc_mbox_ctrl->txdone_poll = true; 854 } 855 856 for (i = 0; i < count; i++) { 857 struct pcc_chan_info *pchan = chan_info + i; 858 859 pcc_mbox_channels[i].con_priv = pchan; 860 pchan->chan.mchan = &pcc_mbox_channels[i]; 861 862 if (pcct_entry->type == ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE && 863 !pcc_mbox_ctrl->txdone_irq) { 864 pr_err("Platform Interrupt flag must be set to 1"); 865 rc = -EINVAL; 866 goto err; 867 } 868 869 if (pcc_mbox_ctrl->txdone_irq) { 870 rc = pcc_parse_subspace_irq(pchan, pcct_entry); 871 if (rc < 0) 872 goto err; 873 } 874 rc = pcc_parse_subspace_db_reg(pchan, pcct_entry); 875 if (rc < 0) 876 goto err; 877 878 pcc_parse_subspace_shmem(pchan, pcct_entry); 879 880 pchan->type = pcct_entry->type; 881 pcct_entry = (struct acpi_subtable_header *) 882 ((unsigned long) pcct_entry + pcct_entry->length); 883 } 884 885 pcc_mbox_ctrl->num_chans = count; 886 887 pr_info("Detected %d PCC Subspaces\n", pcc_mbox_ctrl->num_chans); 888 889 pcc_mbox_ctrl->chans = pcc_mbox_channels; 890 pcc_mbox_ctrl->ops = &pcc_chan_ops; 891 pcc_mbox_ctrl->dev = dev; 892 893 pr_info("Registering PCC driver as Mailbox controller\n"); 894 rc = mbox_controller_register(pcc_mbox_ctrl); 895 if (rc) 896 pr_err("Err registering PCC as Mailbox controller: %d\n", rc); 897 else 898 return 0; 899 err: 900 acpi_put_table(pcct_tbl); 901 return rc; 902 } 903 904 static struct platform_driver pcc_mbox_driver = { 905 .probe = pcc_mbox_probe, 906 .driver = { 907 .name = "PCCT", 908 }, 909 }; 910 911 static int __init pcc_init(void) 912 { 913 int ret; 914 struct platform_device *pcc_pdev; 915 916 if (acpi_disabled) 917 return -ENODEV; 918 919 /* Check if PCC support is available. */ 920 ret = acpi_pcc_probe(); 921 922 if (ret) { 923 pr_debug("ACPI PCC probe failed.\n"); 924 return -ENODEV; 925 } 926 927 pcc_pdev = platform_create_bundle(&pcc_mbox_driver, 928 pcc_mbox_probe, NULL, 0, NULL, 0); 929 930 if (IS_ERR(pcc_pdev)) { 931 pr_debug("Err creating PCC platform bundle\n"); 932 pcc_chan_count = 0; 933 return PTR_ERR(pcc_pdev); 934 } 935 936 return 0; 937 } 938 939 /* 940 * Make PCC init postcore so that users of this mailbox 941 * such as the ACPI Processor driver have it available 942 * at their init. 943 */ 944 postcore_initcall(pcc_init); 945