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