Lines Matching refs:pchan

235 static bool pcc_chan_plat_irq_can_be_shared(struct pcc_chan_info *pchan)  in pcc_chan_plat_irq_can_be_shared()  argument
237 return (pchan->plat_irq_flags & ACPI_PCCT_INTERRUPT_MODE) == in pcc_chan_plat_irq_can_be_shared()
241 static bool pcc_mbox_cmd_complete_check(struct pcc_chan_info *pchan) in pcc_mbox_cmd_complete_check() argument
246 if (!pchan->cmd_complete.gas) in pcc_mbox_cmd_complete_check()
249 ret = pcc_chan_reg_read(&pchan->cmd_complete, &val); in pcc_mbox_cmd_complete_check()
257 val &= pchan->cmd_complete.status_mask; in pcc_mbox_cmd_complete_check()
264 if (pchan->type == ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE) in pcc_mbox_cmd_complete_check()
270 static int pcc_mbox_error_check_and_clear(struct pcc_chan_info *pchan) in pcc_mbox_error_check_and_clear() argument
275 ret = pcc_chan_reg_read(&pchan->error, &val); in pcc_mbox_error_check_and_clear()
279 val &= pchan->error.status_mask; in pcc_mbox_error_check_and_clear()
281 val &= ~pchan->error.status_mask; in pcc_mbox_error_check_and_clear()
282 pcc_chan_reg_write(&pchan->error, val); in pcc_mbox_error_check_and_clear()
289 static void pcc_chan_acknowledge(struct pcc_chan_info *pchan) in pcc_chan_acknowledge() argument
293 if (pchan->type != ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE) in pcc_chan_acknowledge()
296 pcc_chan_reg_read_modify_write(&pchan->cmd_update); in pcc_chan_acknowledge()
298 pcc_hdr = pchan->chan.shmem; in pcc_chan_acknowledge()
306 pcc_chan_reg_read_modify_write(&pchan->db); in pcc_chan_acknowledge()
318 struct pcc_chan_info *pchan; in pcc_mbox_irq() local
321 pchan = chan->con_priv; in pcc_mbox_irq()
323 if (pcc_chan_reg_read_modify_write(&pchan->plat_irq_ack)) in pcc_mbox_irq()
326 if (pchan->type == ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE && in pcc_mbox_irq()
327 !pchan->chan_in_use) in pcc_mbox_irq()
330 if (!pcc_mbox_cmd_complete_check(pchan)) in pcc_mbox_irq()
333 if (pcc_mbox_error_check_and_clear(pchan)) in pcc_mbox_irq()
342 pchan->chan_in_use = false; in pcc_mbox_irq()
345 pcc_chan_acknowledge(pchan); in pcc_mbox_irq()
366 struct pcc_chan_info *pchan; in pcc_mbox_request_channel() local
373 pchan = chan_info + subspace_id; in pcc_mbox_request_channel()
374 chan = pchan->chan.mchan; in pcc_mbox_request_channel()
384 pcc_mchan = &pchan->chan; in pcc_mbox_request_channel()
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()
457 struct pcc_chan_info *pchan = chan->con_priv; in pcc_startup() local
461 if (pchan->plat_irq > 0) { in pcc_startup()
462 irqflags = pcc_chan_plat_irq_can_be_shared(pchan) ? in pcc_startup()
464 rc = devm_request_irq(chan->mbox->dev, pchan->plat_irq, pcc_mbox_irq, in pcc_startup()
468 pchan->plat_irq); in pcc_startup()
483 struct pcc_chan_info *pchan = chan->con_priv; in pcc_shutdown() local
485 if (pchan->plat_irq > 0) in pcc_shutdown()
486 devm_free_irq(chan->mbox->dev, pchan->plat_irq, chan); in pcc_shutdown()
553 static int pcc_parse_subspace_irq(struct pcc_chan_info *pchan, in pcc_parse_subspace_irq() argument
564 pchan->plat_irq = pcc_map_interrupt(pcct_ss->platform_interrupt, in pcc_parse_subspace_irq()
566 if (pchan->plat_irq <= 0) { in pcc_parse_subspace_irq()
571 pchan->plat_irq_flags = pcct_ss->flags; in pcc_parse_subspace_irq()
576 ret = pcc_chan_reg_init(&pchan->plat_irq_ack, in pcc_parse_subspace_irq()
586 ret = pcc_chan_reg_init(&pchan->plat_irq_ack, in pcc_parse_subspace_irq()
593 if (pcc_chan_plat_irq_can_be_shared(pchan) && in pcc_parse_subspace_irq()
594 !pchan->plat_irq_ack.gas) { in pcc_parse_subspace_irq()
610 static int pcc_parse_subspace_db_reg(struct pcc_chan_info *pchan, in pcc_parse_subspace_db_reg() argument
620 ret = pcc_chan_reg_init(&pchan->db, in pcc_parse_subspace_db_reg()
630 ret = pcc_chan_reg_init(&pchan->db, in pcc_parse_subspace_db_reg()
637 ret = pcc_chan_reg_init(&pchan->cmd_complete, in pcc_parse_subspace_db_reg()
644 ret = pcc_chan_reg_init(&pchan->cmd_update, in pcc_parse_subspace_db_reg()
652 ret = pcc_chan_reg_init(&pchan->error, in pcc_parse_subspace_db_reg()
667 static void pcc_parse_subspace_shmem(struct pcc_chan_info *pchan, in pcc_parse_subspace_shmem() argument
674 pchan->chan.shmem_base_addr = pcct_ss->base_address; in pcc_parse_subspace_shmem()
675 pchan->chan.shmem_size = pcct_ss->length; in pcc_parse_subspace_shmem()
676 pchan->chan.latency = pcct_ss->latency; in pcc_parse_subspace_shmem()
677 pchan->chan.max_access_rate = pcct_ss->max_access_rate; in pcc_parse_subspace_shmem()
678 pchan->chan.min_turnaround_time = pcct_ss->min_turnaround_time; in pcc_parse_subspace_shmem()
683 pchan->chan.shmem_base_addr = pcct_ext->base_address; in pcc_parse_subspace_shmem()
684 pchan->chan.shmem_size = pcct_ext->length; in pcc_parse_subspace_shmem()
685 pchan->chan.latency = pcct_ext->latency; in pcc_parse_subspace_shmem()
686 pchan->chan.max_access_rate = pcct_ext->max_access_rate; in pcc_parse_subspace_shmem()
687 pchan->chan.min_turnaround_time = pcct_ext->min_turnaround_time; in pcc_parse_subspace_shmem()
790 struct pcc_chan_info *pchan = chan_info + i; in pcc_mbox_probe() local
792 pcc_mbox_channels[i].con_priv = pchan; in pcc_mbox_probe()
793 pchan->chan.mchan = &pcc_mbox_channels[i]; in pcc_mbox_probe()
803 rc = pcc_parse_subspace_irq(pchan, pcct_entry); in pcc_mbox_probe()
807 rc = pcc_parse_subspace_db_reg(pchan, pcct_entry); in pcc_mbox_probe()
811 pcc_parse_subspace_shmem(pchan, pcct_entry); in pcc_mbox_probe()
813 pchan->type = pcct_entry->type; in pcc_mbox_probe()