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