dhd_pcie.h 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693
  1. /*
  2. * Linux DHD Bus Module for PCIE
  3. *
  4. * Portions of this code are copyright (c) 2020 Cypress Semiconductor Corporation
  5. *
  6. * Copyright (C) 1999-2020, Broadcom Corporation
  7. *
  8. * Unless you and Broadcom execute a separate written software license
  9. * agreement governing use of this software, this software is licensed to you
  10. * under the terms of the GNU General Public License version 2 (the "GPL"),
  11. * available at http://www.broadcom.com/licenses/GPLv2.php, with the
  12. * following added to such license:
  13. *
  14. * As a special exception, the copyright holders of this software give you
  15. * permission to link this software with independent modules, and to copy and
  16. * distribute the resulting executable under terms of your choice, provided that
  17. * you also meet, for each linked independent module, the terms and conditions of
  18. * the license of that module. An independent module is a module which is not
  19. * derived from this software. The special exception does not apply to any
  20. * modifications of the software.
  21. *
  22. * Notwithstanding the above, under no circumstances may you combine this
  23. * software in any way with any other Broadcom software provided under a license
  24. * other than the GPL, without Broadcom's express prior written consent.
  25. *
  26. *
  27. * <<Broadcom-WL-IPTag/Open:>>
  28. *
  29. * $Id: dhd_pcie.h 698652 2017-05-10 10:39:24Z $
  30. */
  31. #ifndef dhd_pcie_h
  32. #define dhd_pcie_h
  33. #include <bcmpcie.h>
  34. #include <hnd_cons.h>
  35. #ifdef SUPPORT_LINKDOWN_RECOVERY
  36. #ifdef CONFIG_ARCH_MSM
  37. #ifdef CONFIG_PCI_MSM
  38. #include <linux/msm_pcie.h>
  39. #else
  40. #include <mach/msm_pcie.h>
  41. #endif /* CONFIG_PCI_MSM */
  42. #endif /* CONFIG_ARCH_MSM */
  43. #ifdef EXYNOS_PCIE_LINKDOWN_RECOVERY
  44. #if defined(CONFIG_SOC_EXYNOS8890) || defined(CONFIG_SOC_EXYNOS8895) || \
  45. defined(CONFIG_SOC_EXYNOS9810) || defined(CONFIG_SOC_EXYNOS9820)
  46. #include <linux/exynos-pci-noti.h>
  47. extern int exynos_pcie_register_event(struct exynos_pcie_register_event *reg);
  48. extern int exynos_pcie_deregister_event(struct exynos_pcie_register_event *reg);
  49. #endif /* CONFIG_SOC_EXYNOS8890 || CONFIG_SOC_EXYNOS8895
  50. * CONFIG_SOC_EXYNOS9810 || CONFIG_SOC_EXYNOS9820
  51. */
  52. #endif /* EXYNOS_PCIE_LINKDOWN_RECOVERY */
  53. #endif /* SUPPORT_LINKDOWN_RECOVERY */
  54. #ifdef DHD_PCIE_RUNTIMEPM
  55. #include <linux/mutex.h>
  56. #include <linux/wait.h>
  57. #define DEFAULT_DHD_RUNTIME_MS 100
  58. #ifndef CUSTOM_DHD_RUNTIME_MS
  59. #define CUSTOM_DHD_RUNTIME_MS DEFAULT_DHD_RUNTIME_MS
  60. #endif /* CUSTOM_DHD_RUNTIME_MS */
  61. #ifndef MAX_IDLE_COUNT
  62. #define MAX_IDLE_COUNT 16
  63. #endif /* MAX_IDLE_COUNT */
  64. #ifndef MAX_RESUME_WAIT
  65. #define MAX_RESUME_WAIT 100
  66. #endif /* MAX_RESUME_WAIT */
  67. #endif /* DHD_PCIE_RUNTIMEPM */
  68. /* defines */
  69. #define PCIE_SHARED_VERSION PCIE_SHARED_VERSION_7
  70. #define PCMSGBUF_HDRLEN 0
  71. #define DONGLE_REG_MAP_SIZE (32 * 1024)
  72. #define DONGLE_TCM_MAP_SIZE (4096 * 1024)
  73. #define DONGLE_MIN_MEMSIZE (128 *1024)
  74. #ifdef DHD_DEBUG
  75. #define DHD_PCIE_SUCCESS 0
  76. #define DHD_PCIE_FAILURE 1
  77. #endif /* DHD_DEBUG */
  78. #define REMAP_ENAB(bus) ((bus)->remap)
  79. #define REMAP_ISADDR(bus, a) (((a) >= ((bus)->orig_ramsize)) && ((a) < ((bus)->ramsize)))
  80. #ifdef SUPPORT_LINKDOWN_RECOVERY
  81. #ifdef CONFIG_ARCH_MSM
  82. #define struct_pcie_notify struct msm_pcie_notify
  83. #define struct_pcie_register_event struct msm_pcie_register_event
  84. #endif /* CONFIG_ARCH_MSM */
  85. #ifdef EXYNOS_PCIE_LINKDOWN_RECOVERY
  86. #if defined(CONFIG_SOC_EXYNOS8890) || defined(CONFIG_SOC_EXYNOS8895) || \
  87. defined(CONFIG_SOC_EXYNOS9810) || defined(CONFIG_SOC_EXYNOS9820)
  88. #define struct_pcie_notify struct exynos_pcie_notify
  89. #define struct_pcie_register_event struct exynos_pcie_register_event
  90. #endif /* CONFIG_SOC_EXYNOS8890 || CONFIG_SOC_EXYNOS8895
  91. * CONFIG_SOC_EXYNOS9810 || CONFIG_SOC_EXYNOS9820
  92. */
  93. #endif /* EXYNOS_PCIE_LINKDOWN_RECOVERY */
  94. #endif /* SUPPORT_LINKDOWN_RECOVERY */
  95. #define MAX_DHD_TX_FLOWS 320
  96. /* user defined data structures */
  97. /* Device console log buffer state */
  98. #define CONSOLE_LINE_MAX 192u
  99. #define CONSOLE_BUFFER_MAX (8 * 1024)
  100. #ifdef IDLE_TX_FLOW_MGMT
  101. #define IDLE_FLOW_LIST_TIMEOUT 5000
  102. #define IDLE_FLOW_RING_TIMEOUT 5000
  103. #endif /* IDLE_TX_FLOW_MGMT */
  104. /* HWA enabled and inited */
  105. #define HWA_ACTIVE(dhd) (((dhd)->hwa_enable) && ((dhd)->hwa_inited))
  106. /* implicit DMA for h2d wr and d2h rd indice from Host memory to TCM */
  107. #define IDMA_ENAB(dhd) ((dhd)->idma_enable)
  108. #define IDMA_ACTIVE(dhd) (((dhd)->idma_enable) && ((dhd)->idma_inited))
  109. #define IDMA_CAPABLE(bus) (((bus)->sih->buscorerev == 19) || ((bus)->sih->buscorerev >= 23))
  110. /* IFRM (Implicit Flow Ring Manager enable and inited */
  111. #define IFRM_ENAB(dhd) ((dhd)->ifrm_enable)
  112. #define IFRM_ACTIVE(dhd) (((dhd)->ifrm_enable) && ((dhd)->ifrm_inited))
  113. /* DAR registers use for h2d doorbell */
  114. #define DAR_ENAB(dhd) ((dhd)->dar_enable)
  115. #define DAR_ACTIVE(dhd) (((dhd)->dar_enable) && ((dhd)->dar_inited))
  116. /* DAR WAR for revs < 64 */
  117. #define DAR_PWRREQ(bus) (((bus)->_dar_war) && DAR_ACTIVE((bus)->dhd))
  118. /* PCIE CTO Prevention and Recovery */
  119. #define PCIECTO_ENAB(bus) ((bus)->cto_enable)
  120. /* Implicit DMA index usage :
  121. * Index 0 for h2d write index transfer
  122. * Index 1 for d2h read index transfer
  123. */
  124. #define IDMA_IDX0 0
  125. #define IDMA_IDX1 1
  126. #define IDMA_IDX2 2
  127. #define IDMA_IDX3 3
  128. #define DMA_TYPE_SHIFT 4
  129. #define DMA_TYPE_IDMA 1
  130. #define DHDPCIE_CONFIG_HDR_SIZE 16
  131. #define DHDPCIE_CONFIG_CHECK_DELAY_MS 10 /* 10ms */
  132. #define DHDPCIE_CONFIG_CHECK_RETRY_COUNT 20
  133. #define DHDPCIE_DONGLE_PWR_TOGGLE_DELAY 1000 /* 1ms in units of us */
  134. #define DHDPCIE_PM_D3_DELAY 200000 /* 200ms in units of us */
  135. #define DHDPCIE_PM_D2_DELAY 200 /* 200us */
  136. typedef struct dhd_console {
  137. uint count; /* Poll interval msec counter */
  138. uint log_addr; /* Log struct address (fixed) */
  139. hnd_log_t log; /* Log struct (host copy) */
  140. uint bufsize; /* Size of log buffer */
  141. uint8 *buf; /* Log buffer (host copy) */
  142. uint last; /* Last buffer read index */
  143. } dhd_console_t;
  144. typedef struct ring_sh_info {
  145. uint32 ring_mem_addr;
  146. uint32 ring_state_w;
  147. uint32 ring_state_r;
  148. } ring_sh_info_t;
  149. #define DEVICE_WAKE_NONE 0
  150. #define DEVICE_WAKE_OOB 1
  151. #define DEVICE_WAKE_INB 2
  152. #define INBAND_DW_ENAB(bus) ((bus)->dw_option == DEVICE_WAKE_INB)
  153. #define OOB_DW_ENAB(bus) ((bus)->dw_option == DEVICE_WAKE_OOB)
  154. #define NO_DW_ENAB(bus) ((bus)->dw_option == DEVICE_WAKE_NONE)
  155. #define PCIE_RELOAD_WAR_ENAB(buscorerev) \
  156. ((buscorerev == 66) || (buscorerev == 67) || (buscorerev == 68) || (buscorerev == 70))
  157. /*
  158. * HW JIRA - CRWLPCIEGEN2-672
  159. * Producer Index Feature which is used by F1 gets reset on F0 FLR
  160. * fixed in REV68
  161. */
  162. #define PCIE_ENUM_RESET_WAR_ENAB(buscorerev) \
  163. ((buscorerev == 66) || (buscorerev == 67))
  164. struct dhd_bus;
  165. struct dhd_pcie_rev {
  166. uint8 fw_rev;
  167. void (*handle_mb_data)(struct dhd_bus *);
  168. };
  169. typedef struct dhdpcie_config_save
  170. {
  171. uint32 header[DHDPCIE_CONFIG_HDR_SIZE];
  172. /* pmcsr save */
  173. uint32 pmcsr;
  174. /* express save */
  175. uint32 exp_dev_ctrl_stat;
  176. uint32 exp_link_ctrl_stat;
  177. uint32 exp_dev_ctrl_stat2;
  178. uint32 exp_link_ctrl_stat2;
  179. /* msi save */
  180. uint32 msi_cap;
  181. uint32 msi_addr0;
  182. uint32 msi_addr1;
  183. uint32 msi_data;
  184. /* l1pm save */
  185. uint32 l1pm0;
  186. uint32 l1pm1;
  187. /* ltr save */
  188. uint32 ltr;
  189. /* aer save */
  190. uint32 aer_caps_ctrl; /* 0x18 */
  191. uint32 aer_severity; /* 0x0C */
  192. uint32 aer_umask; /* 0x08 */
  193. uint32 aer_cmask; /* 0x14 */
  194. uint32 aer_root_cmd; /* 0x2c */
  195. /* BAR0 and BAR1 windows */
  196. uint32 bar0_win;
  197. uint32 bar1_win;
  198. } dhdpcie_config_save_t;
  199. /* The level of bus communication with the dongle */
  200. enum dhd_bus_low_power_state {
  201. DHD_BUS_NO_LOW_POWER_STATE, /* Not in low power state */
  202. DHD_BUS_D3_INFORM_SENT, /* D3 INFORM sent */
  203. DHD_BUS_D3_ACK_RECIEVED, /* D3 ACK recieved */
  204. };
  205. /** Instantiated once for each hardware (dongle) instance that this DHD manages */
  206. typedef struct dhd_bus {
  207. dhd_pub_t *dhd; /**< pointer to per hardware (dongle) unique instance */
  208. struct pci_dev *rc_dev; /* pci RC device handle */
  209. struct pci_dev *dev; /* pci device handle */
  210. dll_t flowring_active_list; /* constructed list of tx flowring queues */
  211. #ifdef IDLE_TX_FLOW_MGMT
  212. uint64 active_list_last_process_ts;
  213. /* stores the timestamp of active list processing */
  214. #endif /* IDLE_TX_FLOW_MGMT */
  215. si_t *sih; /* Handle for SI calls */
  216. char *vars; /* Variables (from CIS and/or other) */
  217. uint varsz; /* Size of variables buffer */
  218. uint32 sbaddr; /* Current SB window pointer (-1, invalid) */
  219. sbpcieregs_t *reg; /* Registers for PCIE core */
  220. uint armrev; /* CPU core revision */
  221. uint coreid; /* CPU core id */
  222. uint ramrev; /* SOCRAM core revision */
  223. uint32 ramsize; /* Size of RAM in SOCRAM (bytes) */
  224. uint32 orig_ramsize; /* Size of RAM in SOCRAM (bytes) */
  225. bool ramsize_adjusted; /* flag to note adjustment, so that
  226. * adjustment routine and file io
  227. * are avoided on D3 cold -> D0
  228. */
  229. uint32 srmemsize; /* Size of SRMEM */
  230. uint32 bus; /* gSPI or SDIO bus */
  231. uint32 intstatus; /* Intstatus bits (events) pending */
  232. bool dpc_sched; /* Indicates DPC schedule (intrpt rcvd) */
  233. bool fcstate; /* State of dongle flow-control */
  234. uint16 cl_devid; /* cached devid for dhdsdio_probe_attach() */
  235. char *fw_path; /* module_param: path to firmware image */
  236. char *nv_path; /* module_param: path to nvram vars file */
  237. struct pktq txq; /* Queue length used for flow-control */
  238. bool intr; /* Use interrupts */
  239. bool ipend; /* Device interrupt is pending */
  240. bool intdis; /* Interrupts disabled by isr */
  241. uint intrcount; /* Count of device interrupt callbacks */
  242. uint lastintrs; /* Count as of last watchdog timer */
  243. dhd_console_t console; /* Console output polling support */
  244. uint console_addr; /* Console address from shared struct */
  245. bool alp_only; /* Don't use HT clock (ALP only) */
  246. bool remap; /* Contiguous 1MB RAM: 512K socram + 512K devram
  247. * Available with socram rev 16
  248. * Remap region not DMA-able
  249. */
  250. uint32 resetinstr;
  251. uint32 dongle_ram_base;
  252. ulong shared_addr;
  253. pciedev_shared_t *pcie_sh;
  254. uint32 dma_rxoffset;
  255. volatile char *regs; /* pci device memory va */
  256. volatile char *tcm; /* pci device memory va */
  257. osl_t *osh;
  258. uint32 nvram_csm; /* Nvram checksum */
  259. uint16 pollrate;
  260. uint16 polltick;
  261. volatile uint32 *pcie_mb_intr_addr;
  262. volatile uint32 *pcie_mb_intr_2_addr;
  263. void *pcie_mb_intr_osh;
  264. bool sleep_allowed;
  265. wake_counts_t wake_counts;
  266. /* version 3 shared struct related info start */
  267. ring_sh_info_t ring_sh[BCMPCIE_COMMON_MSGRINGS + MAX_DHD_TX_FLOWS];
  268. uint8 h2d_ring_count;
  269. uint8 d2h_ring_count;
  270. uint32 ringmem_ptr;
  271. uint32 ring_state_ptr;
  272. uint32 d2h_dma_scratch_buffer_mem_addr;
  273. uint32 h2d_mb_data_ptr_addr;
  274. uint32 d2h_mb_data_ptr_addr;
  275. /* version 3 shared struct related info end */
  276. uint32 def_intmask;
  277. uint32 d2h_mb_mask;
  278. uint32 pcie_mailbox_mask;
  279. uint32 pcie_mailbox_int;
  280. bool ltrsleep_on_unload;
  281. uint wait_for_d3_ack;
  282. uint16 max_tx_flowrings;
  283. uint16 max_submission_rings;
  284. uint16 max_completion_rings;
  285. uint16 max_cmn_rings;
  286. uint32 rw_index_sz;
  287. bool db1_for_mb;
  288. dhd_timeout_t doorbell_timer;
  289. bool device_wake_state;
  290. bool irq_registered;
  291. bool d2h_intr_method;
  292. #ifdef SUPPORT_LINKDOWN_RECOVERY
  293. #if defined(CONFIG_ARCH_MSM) || (defined(EXYNOS_PCIE_LINKDOWN_RECOVERY) && \
  294. defined(CONFIG_SOC_EXYNOS8890) || defined(CONFIG_SOC_EXYNOS8895) || \
  295. defined(CONFIG_SOC_EXYNOS9810) || defined(CONFIG_SOC_EXYNOS9820))
  296. #ifdef CONFIG_ARCH_MSM
  297. uint8 no_cfg_restore;
  298. #endif /* CONFIG_ARCH_MSM */
  299. struct_pcie_register_event pcie_event;
  300. #endif /* CONFIG_ARCH_MSM || (EXYNOS_PCIE_LINKDOWN_RECOVERY &&
  301. * (CONFIG_SOC_EXYNOS8890 || CONFIG_SOC_EXYNOS8895 ||
  302. * CONFIG_SOC_EXYNOS9810 || CONFIG_SOC_EXYNOS9820 ))
  303. */
  304. bool read_shm_fail;
  305. #endif /* SUPPORT_LINKDOWN_RECOVERY */
  306. int32 idletime; /* Control for activity timeout */
  307. #ifdef DHD_PCIE_RUNTIMEPM
  308. int32 idlecount; /* Activity timeout counter */
  309. int32 bus_wake; /* For wake up the bus */
  310. bool runtime_resume_done; /* For check runtime suspend end */
  311. struct mutex pm_lock; /* Synchronize for system PM & runtime PM */
  312. wait_queue_head_t rpm_queue; /* wait-queue for bus wake up */
  313. #endif /* DHD_PCIE_RUNTIMEPM */
  314. uint32 d3_inform_cnt;
  315. uint32 d0_inform_cnt;
  316. uint32 d0_inform_in_use_cnt;
  317. uint8 force_suspend;
  318. uint8 is_linkdown;
  319. uint8 no_bus_init;
  320. #ifdef IDLE_TX_FLOW_MGMT
  321. bool enable_idle_flowring_mgmt;
  322. #endif /* IDLE_TX_FLOW_MGMT */
  323. struct dhd_pcie_rev api;
  324. bool use_mailbox;
  325. bool use_d0_inform;
  326. void *bus_lock;
  327. void *backplane_access_lock;
  328. enum dhd_bus_low_power_state bus_low_power_state;
  329. uint32 hostready_count; /* Number of hostready issued */
  330. #if defined(BCMPCIE_OOB_HOST_WAKE)
  331. bool oob_presuspend;
  332. #endif // endif
  333. dhdpcie_config_save_t saved_config;
  334. ulong resume_intr_enable_count;
  335. ulong dpc_intr_enable_count;
  336. ulong isr_intr_disable_count;
  337. ulong suspend_intr_disable_count;
  338. ulong dpc_return_busdown_count;
  339. ulong non_ours_irq_count;
  340. #ifdef BCMPCIE_OOB_HOST_WAKE
  341. ulong oob_intr_count;
  342. ulong oob_intr_enable_count;
  343. ulong oob_intr_disable_count;
  344. uint64 last_oob_irq_time;
  345. uint64 last_oob_irq_enable_time;
  346. uint64 last_oob_irq_disable_time;
  347. #endif /* BCMPCIE_OOB_HOST_WAKE */
  348. uint64 isr_entry_time;
  349. uint64 isr_exit_time;
  350. uint64 dpc_sched_time;
  351. uint64 dpc_entry_time;
  352. uint64 dpc_exit_time;
  353. uint64 resched_dpc_time;
  354. uint64 last_d3_inform_time;
  355. uint64 last_process_ctrlbuf_time;
  356. uint64 last_process_flowring_time;
  357. uint64 last_process_txcpl_time;
  358. uint64 last_process_rxcpl_time;
  359. uint64 last_process_infocpl_time;
  360. uint64 last_process_edl_time;
  361. uint64 last_suspend_start_time;
  362. uint64 last_suspend_end_time;
  363. uint64 last_resume_start_time;
  364. uint64 last_resume_end_time;
  365. uint64 last_non_ours_irq_time;
  366. uint8 hwa_enab_bmap;
  367. bool idma_enabled;
  368. bool ifrm_enabled;
  369. bool dar_enabled;
  370. uint32 dmaxfer_complete;
  371. uint8 dw_option;
  372. #ifdef DHD_PCIE_RUNTIMEPM
  373. bool chk_pm; /* To avoid counting of wake up from Runtime PM */
  374. #endif /* DHD_PCIE_RUNTIMEPM */
  375. bool _dar_war;
  376. uint8 dma_chan;
  377. bool cto_enable; /* enable PCIE CTO Prevention and recovery */
  378. uint32 cto_threshold; /* PCIE CTO timeout threshold */
  379. bool cto_triggered; /* CTO is triggered */
  380. int pwr_req_ref;
  381. bool flr_force_fail; /* user intends to simulate flr force fail */
  382. bool intr_enabled; /* ready to receive interrupts from dongle */
  383. bool force_bt_quiesce; /* send bt_quiesce command to BT driver. */
  384. #if defined(DHD_H2D_LOG_TIME_SYNC)
  385. ulong dhd_rte_time_sync_count; /* OSL_SYSUPTIME_US() */
  386. #endif /* DHD_H2D_LOG_TIME_SYNC */
  387. bool rc_ep_aspm_cap; /* RC and EP ASPM capable */
  388. bool rc_ep_l1ss_cap; /* EC and EP L1SS capable */
  389. uint16 hp2p_txcpl_max_items;
  390. uint16 hp2p_rxcpl_max_items;
  391. /* PCIE coherent status */
  392. uint32 coherent_state;
  393. } dhd_bus_t;
  394. #ifdef DHD_MSI_SUPPORT
  395. extern uint enable_msi;
  396. #endif /* DHD_MSI_SUPPORT */
  397. enum {
  398. PCIE_INTX = 0,
  399. PCIE_MSI = 1
  400. };
  401. /* function declarations */
  402. extern uint32* dhdpcie_bus_reg_map(osl_t *osh, ulong addr, int size);
  403. extern int dhdpcie_bus_register(void);
  404. extern void dhdpcie_bus_unregister(void);
  405. extern bool dhdpcie_chipmatch(uint16 vendor, uint16 device);
  406. extern int dhdpcie_bus_attach(osl_t *osh, dhd_bus_t **bus_ptr,
  407. volatile char *regs, volatile char *tcm, void *pci_dev);
  408. extern uint32 dhdpcie_bus_cfg_read_dword(struct dhd_bus *bus, uint32 addr, uint32 size);
  409. extern void dhdpcie_bus_cfg_write_dword(struct dhd_bus *bus, uint32 addr, uint32 size, uint32 data);
  410. extern void dhdpcie_bus_intr_enable(struct dhd_bus *bus);
  411. extern void dhdpcie_bus_intr_disable(struct dhd_bus *bus);
  412. extern int dhpcie_bus_mask_interrupt(dhd_bus_t *bus);
  413. extern void dhdpcie_bus_release(struct dhd_bus *bus);
  414. extern int32 dhdpcie_bus_isr(struct dhd_bus *bus);
  415. extern void dhdpcie_free_irq(dhd_bus_t *bus);
  416. extern void dhdpcie_bus_ringbell_fast(struct dhd_bus *bus, uint32 value);
  417. extern void dhdpcie_bus_ringbell_2_fast(struct dhd_bus *bus, uint32 value, bool devwake);
  418. extern void dhdpcie_dongle_reset(dhd_bus_t *bus);
  419. #ifdef DHD_PCIE_NATIVE_RUNTIMEPM
  420. extern int dhdpcie_bus_suspend(struct dhd_bus *bus, bool state, bool byint);
  421. #else
  422. extern int dhdpcie_bus_suspend(struct dhd_bus *bus, bool state);
  423. #endif /* DHD_PCIE_NATIVE_RUNTIMEPM */
  424. extern int dhdpcie_pci_suspend_resume(struct dhd_bus *bus, bool state);
  425. extern uint32 dhdpcie_force_alp(struct dhd_bus *bus, bool enable);
  426. extern uint32 dhdpcie_set_l1_entry_time(struct dhd_bus *bus, int force_l1_entry_time);
  427. extern bool dhdpcie_tcm_valid(dhd_bus_t *bus);
  428. extern void dhdpcie_pme_active(osl_t *osh, bool enable);
  429. extern bool dhdpcie_pme_cap(osl_t *osh);
  430. extern uint32 dhdpcie_lcreg(osl_t *osh, uint32 mask, uint32 val);
  431. extern void dhdpcie_set_pmu_min_res_mask(struct dhd_bus *bus, uint min_res_mask);
  432. extern uint8 dhdpcie_clkreq(osl_t *osh, uint32 mask, uint32 val);
  433. extern int dhdpcie_disable_irq(dhd_bus_t *bus);
  434. extern int dhdpcie_disable_irq_nosync(dhd_bus_t *bus);
  435. extern int dhdpcie_enable_irq(dhd_bus_t *bus);
  436. extern void dhd_bus_dump_dar_registers(struct dhd_bus *bus);
  437. extern uint32 dhdpcie_rc_config_read(dhd_bus_t *bus, uint offset);
  438. extern uint32 dhdpcie_rc_access_cap(dhd_bus_t *bus, int cap, uint offset, bool is_ext,
  439. bool is_write, uint32 writeval);
  440. extern uint32 dhdpcie_ep_access_cap(dhd_bus_t *bus, int cap, uint offset, bool is_ext,
  441. bool is_write, uint32 writeval);
  442. extern uint32 dhd_debug_get_rc_linkcap(dhd_bus_t *bus);
  443. extern int dhdpcie_start_host_pcieclock(dhd_bus_t *bus);
  444. extern int dhdpcie_stop_host_pcieclock(dhd_bus_t *bus);
  445. extern int dhdpcie_disable_device(dhd_bus_t *bus);
  446. extern int dhdpcie_alloc_resource(dhd_bus_t *bus);
  447. extern void dhdpcie_free_resource(dhd_bus_t *bus);
  448. extern void dhdpcie_dump_resource(dhd_bus_t *bus);
  449. extern int dhdpcie_bus_request_irq(struct dhd_bus *bus);
  450. void dhdpcie_os_setbar1win(dhd_bus_t *bus, uint32 addr);
  451. void dhdpcie_os_wtcm8(dhd_bus_t *bus, ulong offset, uint8 data);
  452. uint8 dhdpcie_os_rtcm8(dhd_bus_t *bus, ulong offset);
  453. void dhdpcie_os_wtcm16(dhd_bus_t *bus, ulong offset, uint16 data);
  454. uint16 dhdpcie_os_rtcm16(dhd_bus_t *bus, ulong offset);
  455. void dhdpcie_os_wtcm32(dhd_bus_t *bus, ulong offset, uint32 data);
  456. uint32 dhdpcie_os_rtcm32(dhd_bus_t *bus, ulong offset);
  457. #ifdef DHD_SUPPORT_64BIT
  458. void dhdpcie_os_wtcm64(dhd_bus_t *bus, ulong offset, uint64 data);
  459. uint64 dhdpcie_os_rtcm64(dhd_bus_t *bus, ulong offset);
  460. #endif // endif
  461. extern int dhdpcie_enable_device(dhd_bus_t *bus);
  462. #ifdef BCMPCIE_OOB_HOST_WAKE
  463. extern int dhdpcie_oob_intr_register(dhd_bus_t *bus);
  464. extern void dhdpcie_oob_intr_unregister(dhd_bus_t *bus);
  465. extern void dhdpcie_oob_intr_set(dhd_bus_t *bus, bool enable);
  466. extern int dhdpcie_get_oob_irq_num(struct dhd_bus *bus);
  467. extern int dhdpcie_get_oob_irq_status(struct dhd_bus *bus);
  468. extern int dhdpcie_get_oob_irq_level(void);
  469. #endif /* BCMPCIE_OOB_HOST_WAKE */
  470. #if defined(CONFIG_ARCH_EXYNOS)
  471. #define SAMSUNG_PCIE_VENDOR_ID 0x144d
  472. #if defined(CONFIG_MACH_UNIVERSAL5433)
  473. #define SAMSUNG_PCIE_DEVICE_ID 0xa5e3
  474. #define SAMSUNG_PCIE_CH_NUM
  475. #elif defined(CONFIG_MACH_UNIVERSAL7420) || defined(CONFIG_SOC_EXYNOS7420)
  476. #define SAMSUNG_PCIE_DEVICE_ID 0xa575
  477. #define SAMSUNG_PCIE_CH_NUM 1
  478. #elif defined(CONFIG_SOC_EXYNOS8890)
  479. #define SAMSUNG_PCIE_DEVICE_ID 0xa544
  480. #define SAMSUNG_PCIE_CH_NUM 0
  481. #elif defined(CONFIG_SOC_EXYNOS8895) || defined(CONFIG_SOC_EXYNOS9810) || \
  482. defined(CONFIG_SOC_EXYNOS9820)
  483. #define SAMSUNG_PCIE_DEVICE_ID 0xecec
  484. #define SAMSUNG_PCIE_CH_NUM 0
  485. #else
  486. #error "Not supported platform"
  487. #endif /* CONFIG_SOC_EXYNOSXXXX & CONFIG_MACH_UNIVERSALXXXX */
  488. #endif /* CONFIG_ARCH_EXYNOS */
  489. #if defined(CONFIG_ARCH_MSM)
  490. #define MSM_PCIE_VENDOR_ID 0x17cb
  491. #if defined(CONFIG_ARCH_APQ8084)
  492. #define MSM_PCIE_DEVICE_ID 0x0101
  493. #elif defined(CONFIG_ARCH_MSM8994)
  494. #define MSM_PCIE_DEVICE_ID 0x0300
  495. #elif defined(CONFIG_ARCH_MSM8996)
  496. #define MSM_PCIE_DEVICE_ID 0x0104
  497. #elif defined(CONFIG_ARCH_MSM8998)
  498. #define MSM_PCIE_DEVICE_ID 0x0105
  499. #elif defined(CONFIG_ARCH_SDM845) || defined(CONFIG_ARCH_SM8150)
  500. #define MSM_PCIE_DEVICE_ID 0x0106
  501. #else
  502. #error "Not supported platform"
  503. #endif // endif
  504. #endif /* CONFIG_ARCH_MSM */
  505. #if defined(CONFIG_X86)
  506. #define X86_PCIE_VENDOR_ID 0x8086
  507. #define X86_PCIE_DEVICE_ID 0x9c1a
  508. #endif /* CONFIG_X86 */
  509. #if defined(CONFIG_ARCH_TEGRA)
  510. #define TEGRA_PCIE_VENDOR_ID 0x14e4
  511. #define TEGRA_PCIE_DEVICE_ID 0x4347
  512. #endif /* CONFIG_ARCH_TEGRA */
  513. #if defined(BOARD_HIKEY)
  514. #define HIKEY_PCIE_VENDOR_ID 0x19e5
  515. #define HIKEY_PCIE_DEVICE_ID 0x3660
  516. #endif /* BOARD_HIKEY */
  517. #define DUMMY_PCIE_VENDOR_ID 0xffff
  518. #define DUMMY_PCIE_DEVICE_ID 0xffff
  519. #if defined(CONFIG_ARCH_EXYNOS)
  520. #define PCIE_RC_VENDOR_ID SAMSUNG_PCIE_VENDOR_ID
  521. #define PCIE_RC_DEVICE_ID SAMSUNG_PCIE_DEVICE_ID
  522. #elif defined(CONFIG_ARCH_MSM)
  523. #define PCIE_RC_VENDOR_ID MSM_PCIE_VENDOR_ID
  524. #define PCIE_RC_DEVICE_ID MSM_PCIE_DEVICE_ID
  525. #elif defined(CONFIG_X86)
  526. #define PCIE_RC_VENDOR_ID X86_PCIE_VENDOR_ID
  527. #define PCIE_RC_DEVICE_ID X86_PCIE_DEVICE_ID
  528. #elif defined(CONFIG_ARCH_TEGRA)
  529. #define PCIE_RC_VENDOR_ID TEGRA_PCIE_VENDOR_ID
  530. #define PCIE_RC_DEVICE_ID TEGRA_PCIE_DEVICE_ID
  531. #elif defined(BOARD_HIKEY)
  532. #define PCIE_RC_VENDOR_ID HIKEY_PCIE_VENDOR_ID
  533. #define PCIE_RC_DEVICE_ID HIKEY_PCIE_DEVICE_ID
  534. #else
  535. /* Use dummy vendor and device IDs */
  536. #define PCIE_RC_VENDOR_ID DUMMY_PCIE_VENDOR_ID
  537. #define PCIE_RC_DEVICE_ID DUMMY_PCIE_DEVICE_ID
  538. #endif /* CONFIG_ARCH_EXYNOS */
  539. #define DHD_REGULAR_RING 0
  540. #define DHD_HP2P_RING 1
  541. #ifdef USE_EXYNOS_PCIE_RC_PMPATCH
  542. #ifdef CONFIG_MACH_UNIVERSAL5433
  543. extern int exynos_pcie_pm_suspend(void);
  544. extern int exynos_pcie_pm_resume(void);
  545. #else
  546. extern int exynos_pcie_pm_suspend(int ch_num);
  547. extern int exynos_pcie_pm_resume(int ch_num);
  548. #endif /* CONFIG_MACH_UNIVERSAL5433 */
  549. #endif /* USE_EXYNOS_PCIE_RC_PMPATCH */
  550. #ifdef CONFIG_ARCH_TEGRA
  551. extern int tegra_pcie_pm_suspend(void);
  552. extern int tegra_pcie_pm_resume(void);
  553. #endif /* CONFIG_ARCH_TEGRA */
  554. extern int dhd_buzzz_dump_dngl(dhd_bus_t *bus);
  555. #ifdef IDLE_TX_FLOW_MGMT
  556. extern int dhd_bus_flow_ring_resume_request(struct dhd_bus *bus, void *arg);
  557. extern void dhd_bus_flow_ring_resume_response(struct dhd_bus *bus, uint16 flowid, int32 status);
  558. extern int dhd_bus_flow_ring_suspend_request(struct dhd_bus *bus, void *arg);
  559. extern void dhd_bus_flow_ring_suspend_response(struct dhd_bus *bus, uint16 flowid, uint32 status);
  560. extern void dhd_flow_ring_move_to_active_list_head(struct dhd_bus *bus,
  561. flow_ring_node_t *flow_ring_node);
  562. extern void dhd_flow_ring_add_to_active_list(struct dhd_bus *bus,
  563. flow_ring_node_t *flow_ring_node);
  564. extern void dhd_flow_ring_delete_from_active_list(struct dhd_bus *bus,
  565. flow_ring_node_t *flow_ring_node);
  566. extern void __dhd_flow_ring_delete_from_active_list(struct dhd_bus *bus,
  567. flow_ring_node_t *flow_ring_node);
  568. #endif /* IDLE_TX_FLOW_MGMT */
  569. extern int dhdpcie_send_mb_data(dhd_bus_t *bus, uint32 h2d_mb_data);
  570. #ifdef DHD_WAKE_STATUS
  571. int bcmpcie_get_total_wake(struct dhd_bus *bus);
  572. int bcmpcie_set_get_wake(struct dhd_bus *bus, int flag);
  573. #endif /* DHD_WAKE_STATUS */
  574. extern bool dhdpcie_bus_get_pcie_hostready_supported(dhd_bus_t *bus);
  575. extern void dhd_bus_hostready(struct dhd_bus *bus);
  576. extern void dhdpcie_bus_enab_pcie_dw(dhd_bus_t *bus, uint8 dw_option);
  577. extern int dhdpcie_irq_disabled(struct dhd_bus *bus);
  578. static INLINE bool dhdpcie_is_arm_halted(struct dhd_bus *bus) {return TRUE;}
  579. static INLINE int dhd_os_wifi_platform_set_power(uint32 value) {return BCME_OK; }
  580. static INLINE void
  581. dhdpcie_dongle_flr_or_pwr_toggle(dhd_bus_t *bus)
  582. { return; }
  583. int dhdpcie_config_check(dhd_bus_t *bus);
  584. int dhdpcie_config_restore(dhd_bus_t *bus, bool restore_pmcsr);
  585. int dhdpcie_config_save(dhd_bus_t *bus);
  586. int dhdpcie_set_pwr_state(dhd_bus_t *bus, uint state);
  587. extern bool dhdpcie_bus_get_pcie_hwa_supported(dhd_bus_t *bus);
  588. extern bool dhdpcie_bus_get_pcie_idma_supported(dhd_bus_t *bus);
  589. extern bool dhdpcie_bus_get_pcie_ifrm_supported(dhd_bus_t *bus);
  590. extern bool dhdpcie_bus_get_pcie_dar_supported(dhd_bus_t *bus);
  591. static INLINE uint32
  592. dhd_pcie_config_read(osl_t *osh, uint offset, uint size)
  593. {
  594. OSL_DELAY(100);
  595. return OSL_PCI_READ_CONFIG(osh, offset, size);
  596. }
  597. static INLINE uint32
  598. dhd_pcie_corereg_read(si_t *sih, uint val)
  599. {
  600. OSL_DELAY(100);
  601. si_corereg(sih, sih->buscoreidx, OFFSETOF(sbpcieregs_t, configaddr), ~0, val);
  602. return si_corereg(sih, sih->buscoreidx, OFFSETOF(sbpcieregs_t, configdata), 0, 0);
  603. }
  604. extern int dhdpcie_get_fwpath_otp(dhd_bus_t *bus, char *fw_path, char *nv_path,
  605. char *clm_path, char *txcap_path);
  606. extern int dhd_pcie_debug_info_dump(dhd_pub_t *dhd);
  607. extern void dhd_pcie_intr_count_dump(dhd_pub_t *dhd);
  608. extern void dhdpcie_bus_clear_intstatus(dhd_bus_t *bus);
  609. #ifdef DHD_HP2P
  610. extern uint16 dhd_bus_get_hp2p_ring_max_size(dhd_bus_t *bus, bool tx);
  611. #endif // endif
  612. #endif /* dhd_pcie_h */