Lines Matching full:pchan
233 static bool pcc_chan_plat_irq_can_be_shared(struct pcc_chan_info *pchan) in pcc_chan_plat_irq_can_be_shared() argument
235 return (pchan->plat_irq_flags & ACPI_PCCT_INTERRUPT_MODE) == in pcc_chan_plat_irq_can_be_shared()
239 static bool pcc_mbox_cmd_complete_check(struct pcc_chan_info *pchan) in pcc_mbox_cmd_complete_check() argument
244 if (!pchan->cmd_complete.gas) in pcc_mbox_cmd_complete_check()
247 ret = pcc_chan_reg_read(&pchan->cmd_complete, &val); in pcc_mbox_cmd_complete_check()
255 val &= pchan->cmd_complete.status_mask; in pcc_mbox_cmd_complete_check()
262 if (pchan->type == ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE) in pcc_mbox_cmd_complete_check()
268 static int pcc_mbox_error_check_and_clear(struct pcc_chan_info *pchan) in pcc_mbox_error_check_and_clear() argument
273 ret = pcc_chan_reg_read(&pchan->error, &val); in pcc_mbox_error_check_and_clear()
277 if (val & pchan->error.status_mask) { in pcc_mbox_error_check_and_clear()
278 val &= pchan->error.preserve_mask; in pcc_mbox_error_check_and_clear()
279 pcc_chan_reg_write(&pchan->error, val); in pcc_mbox_error_check_and_clear()
286 static void pcc_chan_acknowledge(struct pcc_chan_info *pchan) in pcc_chan_acknowledge() argument
290 if (pchan->type != ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE) in pcc_chan_acknowledge()
293 pcc_chan_reg_read_modify_write(&pchan->cmd_update); in pcc_chan_acknowledge()
295 pcc_hdr = pchan->chan.shmem; in pcc_chan_acknowledge()
303 pcc_chan_reg_read_modify_write(&pchan->db); in pcc_chan_acknowledge()
315 struct pcc_chan_info *pchan; in pcc_mbox_irq() local
318 pchan = chan->con_priv; in pcc_mbox_irq()
320 if (pcc_chan_reg_read_modify_write(&pchan->plat_irq_ack)) in pcc_mbox_irq()
323 if (pchan->type == ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE && in pcc_mbox_irq()
324 !pchan->chan_in_use) in pcc_mbox_irq()
327 if (!pcc_mbox_cmd_complete_check(pchan)) in pcc_mbox_irq()
330 if (pcc_mbox_error_check_and_clear(pchan)) in pcc_mbox_irq()
339 pchan->chan_in_use = false; in pcc_mbox_irq()
343 pcc_chan_acknowledge(pchan); in pcc_mbox_irq()
364 struct pcc_chan_info *pchan; in pcc_mbox_request_channel() local
371 pchan = chan_info + subspace_id; in pcc_mbox_request_channel()
372 chan = pchan->chan.mchan; in pcc_mbox_request_channel()
378 pcc_mchan = &pchan->chan; in pcc_mbox_request_channel()
398 * @pchan: Pointer to the PCC mailbox channel as returned by
401 void pcc_mbox_free_channel(struct pcc_mbox_chan *pchan) in pcc_mbox_free_channel() argument
403 struct mbox_chan *chan = pchan->mchan; in pcc_mbox_free_channel()
435 struct pcc_chan_info *pchan = chan->con_priv; in pcc_send_data() local
437 ret = pcc_chan_reg_read_modify_write(&pchan->cmd_update); in pcc_send_data()
441 ret = pcc_chan_reg_read_modify_write(&pchan->db); in pcc_send_data()
442 if (!ret && pchan->plat_irq > 0) in pcc_send_data()
443 pchan->chan_in_use = true; in pcc_send_data()
450 struct pcc_chan_info *pchan = chan->con_priv; in pcc_last_tx_done() local
452 return pcc_mbox_cmd_complete_check(pchan); in pcc_last_tx_done()
464 struct pcc_chan_info *pchan = chan->con_priv; in pcc_startup() local
472 pcc_chan_acknowledge(pchan); in pcc_startup()
474 if (pchan->plat_irq > 0) { in pcc_startup()
475 irqflags = pcc_chan_plat_irq_can_be_shared(pchan) ? in pcc_startup()
477 rc = devm_request_irq(chan->mbox->dev, pchan->plat_irq, pcc_mbox_irq, in pcc_startup()
481 pchan->plat_irq); in pcc_startup()
496 struct pcc_chan_info *pchan = chan->con_priv; in pcc_shutdown() local
498 if (pchan->plat_irq > 0) in pcc_shutdown()
499 devm_free_irq(chan->mbox->dev, pchan->plat_irq, chan); in pcc_shutdown()
558 * @pchan: Pointer to the PCC channel info structure.
567 static int pcc_parse_subspace_irq(struct pcc_chan_info *pchan, in pcc_parse_subspace_irq() argument
578 pchan->plat_irq = pcc_map_interrupt(pcct_ss->platform_interrupt, in pcc_parse_subspace_irq()
580 if (pchan->plat_irq <= 0) { in pcc_parse_subspace_irq()
585 pchan->plat_irq_flags = pcct_ss->flags; in pcc_parse_subspace_irq()
590 ret = pcc_chan_reg_init(&pchan->plat_irq_ack, in pcc_parse_subspace_irq()
600 ret = pcc_chan_reg_init(&pchan->plat_irq_ack, in pcc_parse_subspace_irq()
607 if (pcc_chan_plat_irq_can_be_shared(pchan) && in pcc_parse_subspace_irq()
608 !pchan->plat_irq_ack.gas) { in pcc_parse_subspace_irq()
619 * @pchan: Pointer to the PCC channel info structure.
624 static int pcc_parse_subspace_db_reg(struct pcc_chan_info *pchan, in pcc_parse_subspace_db_reg() argument
634 ret = pcc_chan_reg_init(&pchan->db, in pcc_parse_subspace_db_reg()
644 ret = pcc_chan_reg_init(&pchan->db, in pcc_parse_subspace_db_reg()
651 ret = pcc_chan_reg_init(&pchan->cmd_complete, in pcc_parse_subspace_db_reg()
658 ret = pcc_chan_reg_init(&pchan->cmd_update, in pcc_parse_subspace_db_reg()
666 ret = pcc_chan_reg_init(&pchan->error, in pcc_parse_subspace_db_reg()
678 * @pchan: Pointer to the PCC channel info structure.
682 static void pcc_parse_subspace_shmem(struct pcc_chan_info *pchan, in pcc_parse_subspace_shmem() argument
689 pchan->chan.shmem_base_addr = pcct_ss->base_address; in pcc_parse_subspace_shmem()
690 pchan->chan.shmem_size = pcct_ss->length; in pcc_parse_subspace_shmem()
691 pchan->chan.latency = pcct_ss->latency; in pcc_parse_subspace_shmem()
692 pchan->chan.max_access_rate = pcct_ss->max_access_rate; in pcc_parse_subspace_shmem()
693 pchan->chan.min_turnaround_time = pcct_ss->min_turnaround_time; in pcc_parse_subspace_shmem()
698 pchan->chan.shmem_base_addr = pcct_ext->base_address; in pcc_parse_subspace_shmem()
699 pchan->chan.shmem_size = pcct_ext->length; in pcc_parse_subspace_shmem()
700 pchan->chan.latency = pcct_ext->latency; in pcc_parse_subspace_shmem()
701 pchan->chan.max_access_rate = pcct_ext->max_access_rate; in pcc_parse_subspace_shmem()
702 pchan->chan.min_turnaround_time = pcct_ext->min_turnaround_time; in pcc_parse_subspace_shmem()
810 struct pcc_chan_info *pchan = chan_info + i; in pcc_mbox_probe() local
812 pcc_mbox_channels[i].con_priv = pchan; in pcc_mbox_probe()
813 pchan->chan.mchan = &pcc_mbox_channels[i]; in pcc_mbox_probe()
823 rc = pcc_parse_subspace_irq(pchan, pcct_entry); in pcc_mbox_probe()
827 rc = pcc_parse_subspace_db_reg(pchan, pcct_entry); in pcc_mbox_probe()
831 pcc_parse_subspace_shmem(pchan, pcct_entry); in pcc_mbox_probe()
833 pchan->type = pcct_entry->type; in pcc_mbox_probe()