Lines Matching refs:ipa
22 #include "ipa.h"
75 * @ipa: IPA pointer
83 static void ipa_suspend_handler(struct ipa *ipa, enum ipa_irq_id irq_id)
89 if (!test_and_set_bit(IPA_FLAG_RESUMED, ipa->flags))
90 pm_wakeup_dev_event(&ipa->pdev->dev, 0, true);
93 ipa_interrupt_suspend_clear_all(ipa->interrupt);
98 * @ipa: IPA pointer
107 int ipa_setup(struct ipa *ipa)
111 struct device *dev = &ipa->pdev->dev;
115 ret = gsi_setup(&ipa->gsi, ipa->version == IPA_VERSION_3_5_1);
119 ipa->interrupt = ipa_interrupt_setup(ipa);
120 if (IS_ERR(ipa->interrupt)) {
121 ret = PTR_ERR(ipa->interrupt);
124 ipa_interrupt_add(ipa->interrupt, IPA_IRQ_TX_SUSPEND,
127 ipa_uc_setup(ipa);
133 ipa_endpoint_setup(ipa);
138 command_endpoint = ipa->name_map[IPA_ENDPOINT_AP_COMMAND_TX];
143 ret = ipa_mem_setup(ipa);
147 ret = ipa_table_setup(ipa);
154 exception_endpoint = ipa->name_map[IPA_ENDPOINT_AP_LAN_RX];
159 ipa_endpoint_default_route_set(ipa, exception_endpoint->endpoint_id);
162 ret = ipa_modem_setup(ipa);
166 ipa->setup_complete = true;
173 ipa_endpoint_default_route_clear(ipa);
176 ipa_table_teardown(ipa);
178 ipa_mem_teardown(ipa);
182 ipa_endpoint_teardown(ipa);
185 ipa_uc_teardown(ipa);
186 ipa_interrupt_remove(ipa->interrupt, IPA_IRQ_TX_SUSPEND);
187 ipa_interrupt_teardown(ipa->interrupt);
189 gsi_teardown(&ipa->gsi);
196 * @ipa: IPA pointer
198 static void ipa_teardown(struct ipa *ipa)
203 ipa_modem_teardown(ipa);
204 ipa_endpoint_default_route_clear(ipa);
205 exception_endpoint = ipa->name_map[IPA_ENDPOINT_AP_LAN_RX];
207 ipa_table_teardown(ipa);
208 ipa_mem_teardown(ipa);
209 command_endpoint = ipa->name_map[IPA_ENDPOINT_AP_COMMAND_TX];
211 ipa_endpoint_teardown(ipa);
212 (void)device_init_wakeup(&ipa->pdev->dev, false);
213 ipa_uc_teardown(ipa);
214 ipa_interrupt_remove(ipa->interrupt, IPA_IRQ_TX_SUSPEND);
215 ipa_interrupt_teardown(ipa->interrupt);
216 gsi_teardown(&ipa->gsi);
220 static void ipa_hardware_config_comp(struct ipa *ipa)
225 if (ipa->version == IPA_VERSION_3_5_1)
228 val = ioread32(ipa->reg_virt + IPA_REG_COMP_CFG_OFFSET);
230 if (ipa->version == IPA_VERSION_4_0) {
241 iowrite32(val, ipa->reg_virt + IPA_REG_COMP_CFG_OFFSET);
245 static void ipa_hardware_config_qsb(struct ipa *ipa)
251 if (ipa->version == IPA_VERSION_4_2)
255 iowrite32(val, ipa->reg_virt + IPA_REG_QSB_MAX_WRITES_OFFSET);
257 if (ipa->version == IPA_VERSION_3_5_1) {
262 if (ipa->version == IPA_VERSION_4_2)
269 iowrite32(val, ipa->reg_virt + IPA_REG_QSB_MAX_READS_OFFSET);
272 static void ipa_idle_indication_cfg(struct ipa *ipa,
284 offset = ipa_reg_idle_indication_cfg_offset(ipa->version);
285 iowrite32(val, ipa->reg_virt + offset);
290 * @ipa: IPA pointer
296 static void ipa_hardware_dcd_config(struct ipa *ipa)
299 ipa_idle_indication_cfg(ipa, 256, false);
302 static void ipa_hardware_dcd_deconfig(struct ipa *ipa)
305 ipa_idle_indication_cfg(ipa, 0, true);
310 * @ipa: IPA pointer
312 static void ipa_hardware_config(struct ipa *ipa)
318 val = ipa_reg_bcr_val(ipa->version);
319 iowrite32(val, ipa->reg_virt + IPA_REG_BCR_OFFSET);
321 if (ipa->version != IPA_VERSION_3_5_1) {
325 iowrite32(val, ipa->reg_virt + IPA_REG_CLKON_CFG_OFFSET);
328 val = ioread32(ipa->reg_virt + IPA_REG_TX_CFG_OFFSET);
330 iowrite32(val, ipa->reg_virt + IPA_REG_TX_CFG_OFFSET);
333 ipa_hardware_config_comp(ipa);
336 ipa_hardware_config_qsb(ipa);
339 val = ioread32(ipa->reg_virt + IPA_REG_COUNTER_CFG_OFFSET);
342 iowrite32(val, ipa->reg_virt + IPA_REG_COUNTER_CFG_OFFSET);
345 if (ipa->version == IPA_VERSION_4_2)
346 iowrite32(0, ipa->reg_virt + IPA_REG_FILT_ROUT_HASH_EN_OFFSET);
349 ipa_hardware_dcd_config(ipa);
354 * @ipa: IPA pointer
358 static void ipa_hardware_deconfig(struct ipa *ipa)
361 ipa_hardware_dcd_deconfig(ipa);
367 static int ipa_resource_group_count(struct ipa *ipa)
369 switch (ipa->version) {
385 static bool ipa_resource_limits_valid(struct ipa *ipa,
388 u32 group_count = ipa_resource_group_count(ipa);
421 static bool ipa_resource_limits_valid(struct ipa *ipa,
430 ipa_resource_config_common(struct ipa *ipa, u32 offset,
441 iowrite32(val, ipa->reg_virt + offset);
444 static void ipa_resource_config_src_01(struct ipa *ipa,
449 ipa_resource_config_common(ipa, offset,
453 static void ipa_resource_config_src_23(struct ipa *ipa,
458 ipa_resource_config_common(ipa, offset,
462 static void ipa_resource_config_dst_01(struct ipa *ipa,
467 ipa_resource_config_common(ipa, offset,
471 static void ipa_resource_config_dst_23(struct ipa *ipa,
476 ipa_resource_config_common(ipa, offset,
481 ipa_resource_config(struct ipa *ipa, const struct ipa_resource_data *data)
485 if (!ipa_resource_limits_valid(ipa, data))
489 ipa_resource_config_src_01(ipa, &data->resource_src[i]);
490 ipa_resource_config_src_23(ipa, &data->resource_src[i]);
494 ipa_resource_config_dst_01(ipa, &data->resource_dst[i]);
495 ipa_resource_config_dst_23(ipa, &data->resource_dst[i]);
501 static void ipa_resource_deconfig(struct ipa *ipa)
508 * @ipa: IPA pointer
513 static int ipa_config(struct ipa *ipa, const struct ipa_data *data)
521 ipa_clock_get(ipa);
523 ipa_hardware_config(ipa);
525 ret = ipa_endpoint_config(ipa);
529 ret = ipa_mem_config(ipa);
533 ipa_table_config(ipa);
536 ret = ipa_resource_config(ipa, data->resource_data);
540 ret = ipa_modem_config(ipa);
547 ipa_resource_deconfig(ipa);
549 ipa_table_deconfig(ipa);
550 ipa_mem_deconfig(ipa);
552 ipa_endpoint_deconfig(ipa);
554 ipa_hardware_deconfig(ipa);
555 ipa_clock_put(ipa);
562 * @ipa: IPA pointer
564 static void ipa_deconfig(struct ipa *ipa)
566 ipa_modem_deconfig(ipa);
567 ipa_resource_deconfig(ipa);
568 ipa_table_deconfig(ipa);
569 ipa_mem_deconfig(ipa);
570 ipa_endpoint_deconfig(ipa);
571 ipa_hardware_deconfig(ipa);
572 ipa_clock_put(ipa);
631 .compatible = "qcom,sdm845-ipa",
635 .compatible = "qcom,sc7180-ipa",
726 struct ipa *ipa;
769 ipa = kzalloc(sizeof(*ipa), GFP_KERNEL);
770 if (!ipa) {
775 ipa->pdev = pdev;
776 dev_set_drvdata(dev, ipa);
777 ipa->modem_rproc = rproc;
778 ipa->clock = clock;
779 ipa->version = data->version;
781 ret = ipa_reg_init(ipa);
785 ret = ipa_mem_init(ipa, data->mem_data);
790 prefetch = ipa->version != IPA_VERSION_3_5_1;
792 modem_alloc = ipa->version == IPA_VERSION_4_2;
794 ret = gsi_init(&ipa->gsi, pdev, prefetch, data->endpoint_count,
800 ipa->filter_map = ipa_endpoint_init(ipa, data->endpoint_count,
802 if (!ipa->filter_map) {
807 ret = ipa_table_init(ipa);
811 ret = ipa_modem_init(ipa, modem_init);
815 ret = ipa_config(ipa, data);
835 ret = ipa_setup(ipa);
842 ipa_deconfig(ipa);
844 ipa_modem_exit(ipa);
846 ipa_table_exit(ipa);
848 ipa_endpoint_exit(ipa);
850 gsi_exit(&ipa->gsi);
852 ipa_mem_exit(ipa);
854 ipa_reg_exit(ipa);
856 kfree(ipa);
867 struct ipa *ipa = dev_get_drvdata(&pdev->dev);
868 struct rproc *rproc = ipa->modem_rproc;
869 struct ipa_clock *clock = ipa->clock;
872 if (ipa->setup_complete) {
873 ret = ipa_modem_stop(ipa);
877 ipa_teardown(ipa);
880 ipa_deconfig(ipa);
881 ipa_modem_exit(ipa);
882 ipa_table_exit(ipa);
883 ipa_endpoint_exit(ipa);
884 gsi_exit(&ipa->gsi);
885 ipa_mem_exit(ipa);
886 ipa_reg_exit(ipa);
887 kfree(ipa);
906 struct ipa *ipa = dev_get_drvdata(dev);
912 __clear_bit(IPA_FLAG_RESUMED, ipa->flags);
914 ipa_endpoint_suspend(ipa);
916 ipa_clock_put(ipa);
933 struct ipa *ipa = dev_get_drvdata(dev);
938 ipa_clock_get(ipa);
940 ipa_endpoint_resume(ipa);
954 .name = "ipa",