blob: b31497cb47e7fc27b7f2bcf60f84add8a4781850 [file] [log] [blame]
Karunakar Dasineni9b814ce2016-09-01 15:00:09 -07001/*
Mohit Khannad31b6662019-02-01 11:58:55 -08002 * Copyright (c) 2016-2019 The Linux Foundation. All rights reserved.
Karunakar Dasineni9b814ce2016-09-01 15:00:09 -07003 *
4 * Permission to use, copy, modify, and/or distribute this software for
5 * any purpose with or without fee is hereby granted, provided that the
6 * above copyright notice and this permission notice appear in all
7 * copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
10 * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
11 * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
12 * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
13 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
14 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
15 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16 * PERFORMANCE OF THIS SOFTWARE.
17 */
18
Karunakar Dasineni9b814ce2016-09-01 15:00:09 -070019/**
20 * hal_setup_link_idle_list - Setup scattered idle list using the
21 * buffer list provided
22 *
23 * @hal_soc: Opaque HAL SOC handle
24 * @scatter_bufs_base_paddr: Array of physical base addresses
25 * @scatter_bufs_base_vaddr: Array of virtual base addresses
26 * @num_scatter_bufs: Number of scatter buffers in the above lists
27 * @scatter_buf_size: Size of each scatter buffer
Pramod Simhaccb15fb2017-06-19 12:21:13 -070028 * @last_buf_end_offset: Offset to the last entry
29 * @num_entries: Total entries of all scatter bufs
Karunakar Dasineni9b814ce2016-09-01 15:00:09 -070030 *
31 */
Balamurugan Mahalingam5d806412018-07-30 18:04:15 +053032static void hal_setup_link_idle_list_generic(void *hal_soc,
Karunakar Dasineni9b814ce2016-09-01 15:00:09 -070033 qdf_dma_addr_t scatter_bufs_base_paddr[],
34 void *scatter_bufs_base_vaddr[], uint32_t num_scatter_bufs,
Pramod Simhaccb15fb2017-06-19 12:21:13 -070035 uint32_t scatter_buf_size, uint32_t last_buf_end_offset,
36 uint32_t num_entries)
Karunakar Dasineni9b814ce2016-09-01 15:00:09 -070037{
38 int i;
39 uint32_t *prev_buf_link_ptr = NULL;
40 struct hal_soc *soc = (struct hal_soc *)hal_soc;
Pramod Simhaccb15fb2017-06-19 12:21:13 -070041 uint32_t reg_scatter_buf_size, reg_tot_scatter_buf_size;
Mohit Khannad31b6662019-02-01 11:58:55 -080042 uint32_t val;
Karunakar Dasineni9b814ce2016-09-01 15:00:09 -070043
44 /* Link the scatter buffers */
45 for (i = 0; i < num_scatter_bufs; i++) {
46 if (i > 0) {
47 prev_buf_link_ptr[0] =
48 scatter_bufs_base_paddr[i] & 0xffffffff;
Pramod Simhaccb15fb2017-06-19 12:21:13 -070049 prev_buf_link_ptr[1] = HAL_SM(
50 HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB,
51 BASE_ADDRESS_39_32,
52 ((uint64_t)(scatter_bufs_base_paddr[i])
53 >> 32)) | HAL_SM(
54 HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB,
55 ADDRESS_MATCH_TAG,
56 ADDRESS_MATCH_TAG_VAL);
Karunakar Dasineni9b814ce2016-09-01 15:00:09 -070057 }
58 prev_buf_link_ptr = (uint32_t *)(scatter_bufs_base_vaddr[i] +
59 scatter_buf_size - WBM_IDLE_SCATTER_BUF_NEXT_PTR_SIZE);
60 }
61
Pramod Simhaccb15fb2017-06-19 12:21:13 -070062 /* TBD: Register programming partly based on MLD & the rest based on
63 * inputs from HW team. Not complete yet.
Karunakar Dasineni9b814ce2016-09-01 15:00:09 -070064 */
65
Pramod Simhaccb15fb2017-06-19 12:21:13 -070066 reg_scatter_buf_size = (scatter_buf_size -
67 WBM_IDLE_SCATTER_BUF_NEXT_PTR_SIZE)/64;
68 reg_tot_scatter_buf_size = ((scatter_buf_size -
69 WBM_IDLE_SCATTER_BUF_NEXT_PTR_SIZE) * num_scatter_bufs)/64;
70
71 HAL_REG_WRITE(soc,
72 HWIO_WBM_R0_IDLE_LIST_CONTROL_ADDR(
73 SEQ_WCSS_UMAC_WBM_REG_OFFSET),
74 HAL_SM(HWIO_WBM_R0_IDLE_LIST_CONTROL, SCATTER_BUFFER_SIZE,
75 reg_scatter_buf_size) |
76 HAL_SM(HWIO_WBM_R0_IDLE_LIST_CONTROL, LINK_DESC_IDLE_LIST_MODE,
77 0x1));
78
79 HAL_REG_WRITE(soc,
80 HWIO_WBM_R0_IDLE_LIST_SIZE_ADDR(
81 SEQ_WCSS_UMAC_WBM_REG_OFFSET),
82 HAL_SM(HWIO_WBM_R0_IDLE_LIST_SIZE,
83 SCATTER_RING_SIZE_OF_IDLE_LINK_DESC_LIST,
84 reg_tot_scatter_buf_size));
85
Karunakar Dasineni9b814ce2016-09-01 15:00:09 -070086 HAL_REG_WRITE(soc,
87 HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_LSB_ADDR(
88 SEQ_WCSS_UMAC_WBM_REG_OFFSET),
89 scatter_bufs_base_paddr[0] & 0xffffffff);
Pramod Simhaccb15fb2017-06-19 12:21:13 -070090
Karunakar Dasineni9b814ce2016-09-01 15:00:09 -070091 HAL_REG_WRITE(soc,
92 HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB_ADDR(
93 SEQ_WCSS_UMAC_WBM_REG_OFFSET),
94 ((uint64_t)(scatter_bufs_base_paddr[0]) >> 32) &
95 HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB_BASE_ADDRESS_39_32_BMSK);
Pramod Simhaccb15fb2017-06-19 12:21:13 -070096
97 HAL_REG_WRITE(soc,
98 HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB_ADDR(
99 SEQ_WCSS_UMAC_WBM_REG_OFFSET),
100 HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB,
101 BASE_ADDRESS_39_32, ((uint64_t)(scatter_bufs_base_paddr[0])
102 >> 32)) |
103 HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_LIST_BASE_MSB,
104 ADDRESS_MATCH_TAG, ADDRESS_MATCH_TAG_VAL));
105
Karunakar Dasineni9b814ce2016-09-01 15:00:09 -0700106 /* ADDRESS_MATCH_TAG field in the above register is expected to match
107 * with the upper bits of link pointer. The above write sets this field
108 * to zero and we are also setting the upper bits of link pointers to
109 * zero while setting up the link list of scatter buffers above
110 */
111
112 /* Setup head and tail pointers for the idle list */
113 HAL_REG_WRITE(soc,
114 HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX0_ADDR(
115 SEQ_WCSS_UMAC_WBM_REG_OFFSET),
Pramod Simhaccb15fb2017-06-19 12:21:13 -0700116 scatter_bufs_base_paddr[num_scatter_bufs-1] & 0xffffffff);
Karunakar Dasineni9b814ce2016-09-01 15:00:09 -0700117 HAL_REG_WRITE(soc,
118 HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX1_ADDR(
119 SEQ_WCSS_UMAC_WBM_REG_OFFSET),
120 HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX1,
121 BUFFER_ADDRESS_39_32,
Pramod Simhaccb15fb2017-06-19 12:21:13 -0700122 ((uint64_t)(scatter_bufs_base_paddr[num_scatter_bufs-1])
123 >> 32)) |
Karunakar Dasineni9b814ce2016-09-01 15:00:09 -0700124 HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX1,
Pramod Simhaccb15fb2017-06-19 12:21:13 -0700125 HEAD_POINTER_OFFSET, last_buf_end_offset >> 2));
Karunakar Dasineni9b814ce2016-09-01 15:00:09 -0700126
127 HAL_REG_WRITE(soc,
128 HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HEAD_INFO_IX0_ADDR(
129 SEQ_WCSS_UMAC_WBM_REG_OFFSET),
130 scatter_bufs_base_paddr[0] & 0xffffffff);
131
132 HAL_REG_WRITE(soc,
133 HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_TAIL_INFO_IX0_ADDR(
134 SEQ_WCSS_UMAC_WBM_REG_OFFSET),
Pramod Simhaccb15fb2017-06-19 12:21:13 -0700135 scatter_bufs_base_paddr[0] & 0xffffffff);
Karunakar Dasineni9b814ce2016-09-01 15:00:09 -0700136 HAL_REG_WRITE(soc,
137 HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_TAIL_INFO_IX1_ADDR(
138 SEQ_WCSS_UMAC_WBM_REG_OFFSET),
139 HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_TAIL_INFO_IX1,
140 BUFFER_ADDRESS_39_32,
Pramod Simhaccb15fb2017-06-19 12:21:13 -0700141 ((uint64_t)(scatter_bufs_base_paddr[0]) >>
Karunakar Dasineni9b814ce2016-09-01 15:00:09 -0700142 32)) | HAL_SM(HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_TAIL_INFO_IX1,
Pramod Simhaccb15fb2017-06-19 12:21:13 -0700143 TAIL_POINTER_OFFSET, 0));
144
145 HAL_REG_WRITE(soc,
146 HWIO_WBM_R0_SCATTERED_LINK_DESC_PTR_HP_ADDR(
147 SEQ_WCSS_UMAC_WBM_REG_OFFSET),
148 2*num_entries);
149
Mohit Khannad31b6662019-02-01 11:58:55 -0800150 /* Set RING_ID_DISABLE */
151 val = HAL_SM(HWIO_WBM_R0_WBM_IDLE_LINK_RING_MISC, RING_ID_DISABLE, 1);
152
153 /*
154 * SRNG_ENABLE bit is not available in HWK v1 (QCA8074v1). Hence
155 * check the presence of the bit before toggling it.
156 */
157#ifdef HWIO_WBM_R0_WBM_IDLE_LINK_RING_MISC_SRNG_ENABLE_BMSK
158 val |= HAL_SM(HWIO_WBM_R0_WBM_IDLE_LINK_RING_MISC, SRNG_ENABLE, 1);
159#endif
Pramod Simhaccb15fb2017-06-19 12:21:13 -0700160 HAL_REG_WRITE(soc,
Mohit Khannad31b6662019-02-01 11:58:55 -0800161 HWIO_WBM_R0_WBM_IDLE_LINK_RING_MISC_ADDR(SEQ_WCSS_UMAC_WBM_REG_OFFSET),
162 val);
Karunakar Dasineni9b814ce2016-09-01 15:00:09 -0700163}