xref: /linux/drivers/net/wireless/intel/iwlwifi/pcie/utils.h (revision 2874e58196eff1fae8bb07903ca72fb16c1a2c4c)
1 // SPDX-License-Identifier: GPL-2.0 OR BSD-3-Clause
2 /*
3  * Copyright (C) 2025-2026 Intel Corporation
4  */
5 
6 #ifndef __iwl_pcie_utils_h__
7 #define __iwl_pcie_utils_h__
8 
9 #include "iwl-trans.h"
10 #include "internal.h"
11 
12 void iwl_trans_pcie_dump_regs(struct iwl_trans *trans, struct pci_dev *pdev);
13 
14 u32 iwl_pcie_read_direct32(struct iwl_trans *trans, u32 reg);
15 int iwl_pcie_poll_direct_bit(struct iwl_trans *trans,
16 			     u32 addr, u32 mask, int timeout);
17 int iwl_pcie_poll_prph_bit(struct iwl_trans *trans, u32 addr,
18 			   u32 bits, u32 mask, int timeout);
19 int iwl_pcie_poll_umac_prph_bit(struct iwl_trans *trans, u32 addr,
20 				u32 bits, u32 mask, int timeout);
21 int iwl_pcie_poll_umac_prph_bits_no_grab(struct iwl_trans *trans, u32 addr,
22 					 u32 bits, u32 mask, int timeout);
23 void iwl_pcie_write_prph64_no_grab(struct iwl_trans *trans, u32 ofs, u64 val);
24 void iwl_pcie_write_direct64(struct iwl_trans *trans, u64 reg, u64 value);
25 
26 static inline void iwl_pcie_write64(struct iwl_trans *trans, u64 ofs, u64 val)
27 {
28 	iwl_trans_pcie_write32(trans, ofs, lower_32_bits(val));
29 	iwl_trans_pcie_write32(trans, ofs + 4, upper_32_bits(val));
30 }
31 
32 static inline void iwl_pcie_write_umac_prph_no_grab(struct iwl_trans *trans,
33 						    u32 ofs, u32 val)
34 {
35 	iwl_pcie_write_prph_no_grab(trans, ofs + trans->mac_cfg->umac_prph_offset,
36 				    val);
37 }
38 
39 static inline void iwl_pcie_set_bits_mask(struct iwl_trans *trans,
40 					  u32 reg, u32 mask, u32 value)
41 {
42 	u32 v;
43 
44 #ifdef CONFIG_IWLWIFI_DEBUG
45 	WARN_ON_ONCE(value & ~mask);
46 #endif
47 
48 	v = iwl_trans_pcie_read32(trans, reg);
49 	v &= ~mask;
50 	v |= value;
51 	iwl_trans_pcie_write32(trans, reg, v);
52 }
53 
54 static inline void iwl_pcie_clear_bit(struct iwl_trans *trans,
55 				       u32 reg, u32 mask)
56 {
57 	iwl_pcie_set_bits_mask(trans, reg, mask, 0);
58 }
59 
60 static inline void iwl_pcie_set_bit(struct iwl_trans *trans,
61 				     u32 reg, u32 mask)
62 {
63 	iwl_pcie_set_bits_mask(trans, reg, mask, mask);
64 }
65 
66 #endif /* __iwl_pcie_utils_h__ */
67