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()
309 static void *write_response(struct pcc_chan_info *pchan) in write_response() argument
315 memcpy_fromio(&pcc_header, pchan->chan.shmem, in write_response()
319 buffer = pchan->chan.rx_alloc(pchan->chan.mchan->cl, data_len); in write_response()
321 memcpy_fromio(buffer, pchan->chan.shmem, data_len); in write_response()
334 struct pcc_chan_info *pchan; in pcc_mbox_irq() local
339 pchan = chan->con_priv; in pcc_mbox_irq()
341 if (pcc_chan_reg_read_modify_write(&pchan->plat_irq_ack)) in pcc_mbox_irq()
344 if (pchan->type == ACPI_PCCT_TYPE_EXT_PCC_MASTER_SUBSPACE && in pcc_mbox_irq()
345 !pchan->chan_in_use) in pcc_mbox_irq()
348 if (!pcc_mbox_cmd_complete_check(pchan)) in pcc_mbox_irq()
351 if (pcc_mbox_error_check_and_clear(pchan)) in pcc_mbox_irq()
360 pchan->chan_in_use = false; in pcc_mbox_irq()
362 if (pchan->chan.rx_alloc) in pcc_mbox_irq()
363 handle = write_response(pchan); in pcc_mbox_irq()
373 pcc_chan_acknowledge(pchan); in pcc_mbox_irq()
394 struct pcc_chan_info *pchan; in pcc_mbox_request_channel() local
401 pchan = chan_info + subspace_id; in pcc_mbox_request_channel()
402 chan = pchan->chan.mchan; in pcc_mbox_request_channel()
412 pcc_mchan = &pchan->chan; in pcc_mbox_request_channel()
427 if (pchan->type == ACPI_PCCT_TYPE_EXT_PCC_SLAVE_SUBSPACE) in pcc_mbox_request_channel()
428 pcc_chan_reg_read_modify_write(&pchan->cmd_update); in pcc_mbox_request_channel()
444 void pcc_mbox_free_channel(struct pcc_mbox_chan *pchan) in pcc_mbox_free_channel() argument
446 struct mbox_chan *chan = pchan->mchan; in pcc_mbox_free_channel()
465 struct pcc_chan_info *pchan = chan->con_priv; in pcc_write_to_buffer() local
466 struct pcc_mbox_chan *pcc_mbox_chan = &pchan->chan; in pcc_write_to_buffer()
469 if (!pchan->chan.manage_writes) in pcc_write_to_buffer()
478 pcc_chan_reg_read(&pchan->cmd_complete, &val); in pcc_write_to_buffer()
508 struct pcc_chan_info *pchan = chan->con_priv; in pcc_send_data() local
514 ret = pcc_chan_reg_read_modify_write(&pchan->cmd_update); in pcc_send_data()
518 ret = pcc_chan_reg_read_modify_write(&pchan->db); in pcc_send_data()
520 if (!ret && pchan->plat_irq > 0) in pcc_send_data()
521 pchan->chan_in_use = true; in pcc_send_data()
529 struct pcc_chan_info *pchan = chan->con_priv; in pcc_last_tx_done() local
532 pcc_chan_reg_read(&pchan->cmd_complete, &val); in pcc_last_tx_done()
550 struct pcc_chan_info *pchan = chan->con_priv; in pcc_startup() local
554 if (pchan->plat_irq > 0) { in pcc_startup()
555 irqflags = pcc_chan_plat_irq_can_be_shared(pchan) ? in pcc_startup()
557 rc = devm_request_irq(chan->mbox->dev, pchan->plat_irq, pcc_mbox_irq, in pcc_startup()
561 pchan->plat_irq); in pcc_startup()
576 struct pcc_chan_info *pchan = chan->con_priv; in pcc_shutdown() local
578 if (pchan->plat_irq > 0) in pcc_shutdown()
579 devm_free_irq(chan->mbox->dev, pchan->plat_irq, chan); in pcc_shutdown()
647 static int pcc_parse_subspace_irq(struct pcc_chan_info *pchan, in pcc_parse_subspace_irq() argument
658 pchan->plat_irq = pcc_map_interrupt(pcct_ss->platform_interrupt, in pcc_parse_subspace_irq()
660 if (pchan->plat_irq <= 0) { in pcc_parse_subspace_irq()
665 pchan->plat_irq_flags = pcct_ss->flags; in pcc_parse_subspace_irq()
670 ret = pcc_chan_reg_init(&pchan->plat_irq_ack, in pcc_parse_subspace_irq()
680 ret = pcc_chan_reg_init(&pchan->plat_irq_ack, in pcc_parse_subspace_irq()
687 if (pcc_chan_plat_irq_can_be_shared(pchan) && in pcc_parse_subspace_irq()
688 !pchan->plat_irq_ack.gas) { in pcc_parse_subspace_irq()
704 static int pcc_parse_subspace_db_reg(struct pcc_chan_info *pchan, in pcc_parse_subspace_db_reg() argument
714 ret = pcc_chan_reg_init(&pchan->db, in pcc_parse_subspace_db_reg()
724 ret = pcc_chan_reg_init(&pchan->db, in pcc_parse_subspace_db_reg()
731 ret = pcc_chan_reg_init(&pchan->cmd_complete, in pcc_parse_subspace_db_reg()
738 ret = pcc_chan_reg_init(&pchan->cmd_update, in pcc_parse_subspace_db_reg()
746 ret = pcc_chan_reg_init(&pchan->error, in pcc_parse_subspace_db_reg()
761 static void pcc_parse_subspace_shmem(struct pcc_chan_info *pchan, in pcc_parse_subspace_shmem() argument
768 pchan->chan.shmem_base_addr = pcct_ss->base_address; in pcc_parse_subspace_shmem()
769 pchan->chan.shmem_size = pcct_ss->length; in pcc_parse_subspace_shmem()
770 pchan->chan.latency = pcct_ss->latency; in pcc_parse_subspace_shmem()
771 pchan->chan.max_access_rate = pcct_ss->max_access_rate; in pcc_parse_subspace_shmem()
772 pchan->chan.min_turnaround_time = pcct_ss->min_turnaround_time; in pcc_parse_subspace_shmem()
777 pchan->chan.shmem_base_addr = pcct_ext->base_address; in pcc_parse_subspace_shmem()
778 pchan->chan.shmem_size = pcct_ext->length; in pcc_parse_subspace_shmem()
779 pchan->chan.latency = pcct_ext->latency; in pcc_parse_subspace_shmem()
780 pchan->chan.max_access_rate = pcct_ext->max_access_rate; in pcc_parse_subspace_shmem()
781 pchan->chan.min_turnaround_time = pcct_ext->min_turnaround_time; in pcc_parse_subspace_shmem()
884 struct pcc_chan_info *pchan = chan_info + i; in pcc_mbox_probe() local
886 pcc_mbox_channels[i].con_priv = pchan; in pcc_mbox_probe()
887 pchan->chan.mchan = &pcc_mbox_channels[i]; in pcc_mbox_probe()
897 rc = pcc_parse_subspace_irq(pchan, pcct_entry); in pcc_mbox_probe()
901 rc = pcc_parse_subspace_db_reg(pchan, pcct_entry); in pcc_mbox_probe()
905 pcc_parse_subspace_shmem(pchan, pcct_entry); in pcc_mbox_probe()
907 pchan->type = pcct_entry->type; in pcc_mbox_probe()