xref: /wlan-dirver/qca-wifi-host-cmn/hif/src/ipcie/if_ipci.h (revision 8cfe6b10058a04cafb17eed051f2ddf11bee8931)
1 /*
2  * Copyright (c) 2020-2021 The Linux Foundation. All rights reserved.
3  * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved.
4  *
5  * Permission to use, copy, modify, and/or distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8 
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17 
18 #ifndef __ATH_IPCI_H__
19 #define __ATH_IPCI_H__
20 
21 #include <linux/version.h>
22 #include <linux/semaphore.h>
23 #include <linux/interrupt.h>
24 
25 #define ATH_DBG_DEFAULT   0
26 #define DRAM_SIZE               0x000a8000
27 #include "hif.h"
28 #include "cepci.h"
29 #include "ce_main.h"
30 #include "hif_runtime_pm.h"
31 
32 #ifdef FORCE_WAKE
33 /**
34  * struct hif_ipci_stats - Account for hif pci based statistics
35  * @mhi_force_wake_request_vote: vote for mhi
36  * @mhi_force_wake_failure: mhi force wake failure
37  * @mhi_force_wake_success: mhi force wake success
38  * @soc_force_wake_register_write_success: write to soc wake
39  * @soc_force_wake_failure: soc force wake failure
40  * @soc_force_wake_success: soc force wake success
41  * @mhi_force_wake_release_failure: mhi force wake release failure
42  * @mhi_force_wake_release_success: mhi force wake release success
43  * @soc_force_wake_release_success: soc force wake release
44  */
45 struct hif_ipci_stats {
46 	uint32_t mhi_force_wake_request_vote;
47 	uint32_t mhi_force_wake_failure;
48 	uint32_t mhi_force_wake_success;
49 	uint32_t soc_force_wake_register_write_success;
50 	uint32_t soc_force_wake_failure;
51 	uint32_t soc_force_wake_success;
52 	uint32_t mhi_force_wake_release_failure;
53 	uint32_t mhi_force_wake_release_success;
54 	uint32_t soc_force_wake_release_success;
55 };
56 
57 /* Register offset to wake the UMAC from power collapse */
58 #define PCIE_REG_WAKE_UMAC_OFFSET 0x3004
59 /* Register to wake the UMAC from power collapse */
60 #define PCIE_SOC_PCIE_REG_PCIE_SCRATCH_0_SOC_PCIE_REG (0x01E04000 + 0x40)
61 
62 /* Timeout duration to validate UMAC wake status */
63 #define FORCE_WAKE_DELAY_TIMEOUT_MS 500
64 
65 /* Validate UMAC status every 5ms */
66 #define FORCE_WAKE_DELAY_MS 5
67 #endif /* FORCE_WAKE */
68 
69 #ifdef FEATURE_HAL_DELAYED_REG_WRITE
70 #define EP_VOTE_POLL_TIME_US  50
71 #define EP_VOTE_POLL_TIME_CNT 3
72 #ifdef HAL_CONFIG_SLUB_DEBUG_ON
73 #define EP_WAKE_RESET_DELAY_TIMEOUT_MS 3
74 #else
75 #define EP_WAKE_RESET_DELAY_TIMEOUT_MS 10
76 #endif
77 #define EP_WAKE_DELAY_TIMEOUT_MS 10
78 #define EP_WAKE_RESET_DELAY_US 50
79 #define EP_WAKE_DELAY_US 200
80 #endif
81 
82 struct hif_ipci_softc {
83 	struct HIF_CE_state ce_sc;
84 	void __iomem *mem;      /* PCI address. */
85 
86 	struct device *dev;	/* For efficiency, should be first in struct */
87 	struct tasklet_struct intr_tq;  /* tasklet */
88 	int ce_msi_irq_num[CE_COUNT_MAX];
89 	bool use_register_windowing;
90 	uint32_t register_window;
91 	qdf_spinlock_t register_access_lock;
92 	qdf_spinlock_t irq_lock;
93 	bool grp_irqs_disabled;
94 
95 	void (*hif_ipci_get_soc_info)(struct hif_ipci_softc *sc,
96 				      struct device *dev);
97 #ifdef FEATURE_HAL_DELAYED_REG_WRITE
98 	uint32_t ep_awake_reset_fail;
99 	uint32_t prevent_l1_fail;
100 	uint32_t ep_awake_set_fail;
101 	bool prevent_l1;
102 #endif
103 #ifdef FORCE_WAKE
104 	struct hif_ipci_stats stats;
105 #endif
106 #ifdef HIF_CPU_PERF_AFFINE_MASK
107 	/* Stores the affinity hint mask for each CE IRQ */
108 	qdf_cpu_mask ce_irq_cpu_mask[CE_COUNT_MAX];
109 #endif
110 };
111 
112 int hif_configure_irq(struct hif_softc *sc);
113 
114 /*
115  * There may be some pending tx frames during platform suspend.
116  * Suspend operation should be delayed until those tx frames are
117  * transferred from the host to target. This macro specifies how
118  * long suspend thread has to sleep before checking pending tx
119  * frame count.
120  */
121 #define OL_ATH_TX_DRAIN_WAIT_DELAY     50       /* ms */
122 
123 #ifdef FORCE_WAKE
124 /**
125  * hif_print_ipci_stats() - Display HIF IPCI stats
126  * @ipci_scn: HIF ipci handle
127  *
128  * Return: None
129  */
130 void hif_print_ipci_stats(struct hif_ipci_softc *ipci_scn);
131 #else
132 static inline
133 void hif_print_ipci_stats(struct hif_ipci_softc *ipci_scn)
134 {
135 }
136 #endif /* FORCE_WAKE */
137 
138 #endif /* __IATH_PCI_H__ */
139