1 /*-
2  * SPDX-License-Identifier: BSD-2-Clause OR GPL-2.0
3  *
4  * This file is provided under a dual BSD/GPLv2 license.  When using or
5  * redistributing this file, you may do so under either license.
6  *
7  * GPL LICENSE SUMMARY
8  *
9  * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of version 2 of the GNU General Public License as
13  * published by the Free Software Foundation.
14  *
15  * This program is distributed in the hope that it will be useful, but
16  * WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18  * General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
23  * The full GNU General Public License is included in this distribution
24  * in the file called LICENSE.GPL.
25  *
26  * BSD LICENSE
27  *
28  * Copyright(c) 2008 - 2011 Intel Corporation. All rights reserved.
29  * All rights reserved.
30  *
31  * Redistribution and use in source and binary forms, with or without
32  * modification, are permitted provided that the following conditions
33  * are met:
34  *
35  *   * Redistributions of source code must retain the above copyright
36  *     notice, this list of conditions and the following disclaimer.
37  *   * Redistributions in binary form must reproduce the above copyright
38  *     notice, this list of conditions and the following disclaimer in
39  *     the documentation and/or other materials provided with the
40  *     distribution.
41  *
42  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
43  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
44  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
45  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
46  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
47  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
48  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
49  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
50  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
51  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
52  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
53  *
54  * $FreeBSD$
55  */
56 #ifndef _SCIC_SDS_CONTROLLER_REGISTERS_H_
57 #define _SCIC_SDS_CONTROLLER_REGISTERS_H_
58 
59 /**
60  * @file
61  *
62  * @brief This file contains macros used to perform the register reads/writes
63  *        to the SCU hardware.
64  */
65 
66 #ifdef __cplusplus
67 extern "C" {
68 #endif // __cplusplus
69 
70 #include <dev/isci/scil/scu_registers.h>
71 #include <dev/isci/scil/scic_sds_controller.h>
72 
73 /**
74  * @name SMU_REGISTER_ACCESS_MACROS
75  */
76 /*@{*/
77 #define scic_sds_controller_smu_register_read(controller, reg) \
78    smu_register_read( \
79       (controller), \
80       (controller)->smu_registers->reg \
81    )
82 
83 #define scic_sds_controller_smu_register_write(controller, reg, value) \
84    smu_register_write( \
85       (controller), \
86       (controller)->smu_registers->reg, \
87       (value) \
88    )
89 /*@}*/
90 
91 /**
92  * @name AFE_REGISTER_ACCESS_MACROS
93  */
94 /*@{*/
95 #define scu_afe_register_write(controller, reg, value) \
96    scu_register_write( \
97       (controller), \
98       (controller)->scu_registers->afe.reg, \
99       (value) \
100    )
101 
102 #define scu_afe_register_read(controller, reg) \
103    scu_register_read( \
104       (controller), \
105       (controller)->scu_registers->afe.reg \
106    )
107 /*@}*/
108 
109 /**
110  * @name SGPIO_PEG0_REGISTER_ACCESS_MACROS
111  */
112 /*@{*/
113 #define scu_sgpio_peg0_register_read(controller, reg) \
114    scu_register_read( \
115       (controller), \
116       (controller)->scu_registers->peg0.sgpio.reg \
117    )
118 
119 #define scu_sgpio_peg0_register_write(controller, reg, value) \
120    scu_register_write( \
121       (controller), \
122       (controller)->scu_registers->peg0.sgpio.reg, \
123       (value) \
124    )
125 /*@}*/
126 
127 /**
128  * @name VIIT_REGISTER_ACCESS_MACROS
129  */
130 /*@{*/
131 #define scu_controller_viit_register_write(controller, index, reg, value) \
132    scu_register_write( \
133       (controller), \
134       (controller)->scu_registers->peg0.viit[index].reg, \
135       value \
136    )
137 /*@}*/
138 
139 /**
140  * @name SCRATCH_RAM_REGISTER_ACCESS_MACROS
141  */
142 /*@{*/
143 // Scratch RAM access may be needed before the scu_registers pointer
144 //  has been initialized.  So instead, explicitly cast BAR1 to a
145 //  SCU_REGISTERS_T data structure.
146 
147 // Scratch RAM is stored in the Zoning Permission Table for OROM use.
148 #define scu_controller_scratch_ram_register_write(controller, index, value) \
149    scu_register_write( \
150       (controller), \
151       ((SCU_REGISTERS_T *)scic_cb_pci_get_bar(controller, PATSBURG_SCU_BAR))->peg0.zpt0.table[index], \
152       value \
153    )
154 
155 #define scu_controller_scratch_ram_register_read(controller, index) \
156    scu_register_read( \
157       (controller), \
158       ((SCU_REGISTERS_T *)scic_cb_pci_get_bar(controller, PATSBURG_SCU_BAR))->peg0.zpt0.table[index] \
159    )
160 
161 #define scu_controller_scratch_ram_register_write_ext(controller, index, value) \
162    scu_register_write( \
163       (controller), \
164       ((SCU_REGISTERS_T *)scic_cb_pci_get_bar(controller, PATSBURG_SCU_BAR))->peg0.zpt1.table[index], \
165       value \
166    )
167 
168 #define scu_controller_scratch_ram_register_read_ext(controller, index) \
169    scu_register_read( \
170       (controller), \
171       ((SCU_REGISTERS_T *)scic_cb_pci_get_bar(controller, PATSBURG_SCU_BAR))->peg0.zpt1.table[index] \
172    )
173 /*@}*/
174 
175 
176 //*****************************************************************************
177 //* SMU REGISTERS
178 //*****************************************************************************
179 
180 /**
181  * @name SMU_REGISTERS
182  */
183 /*@{*/
184 #define SMU_PCP_WRITE(controller, value) \
185     scic_sds_controller_smu_register_write( \
186        controller, post_context_port, value \
187     )
188 
189 #define SMU_TCR_READ(controller, value) \
190     scic_sds_controller_smu_register_read( \
191        controller, task_context_range \
192     )
193 
194 #define SMU_TCR_WRITE(controller, value) \
195     scic_sds_controller_smu_register_write( \
196        controller, task_context_range, value \
197     )
198 
199 #define SMU_HTTBAR_WRITE(controller, address) \
200 { \
201    scic_sds_controller_smu_register_write( \
202       controller, \
203       host_task_table_lower, \
204       sci_cb_physical_address_lower(address) \
205    );\
206    scic_sds_controller_smu_register_write( \
207       controller, \
208       host_task_table_upper, \
209       sci_cb_physical_address_upper(address) \
210    ); \
211 }
212 
213 #define SMU_CQBAR_WRITE(controller, address) \
214 { \
215    scic_sds_controller_smu_register_write( \
216       controller, \
217       completion_queue_lower, \
218       sci_cb_physical_address_lower(address) \
219    ); \
220    scic_sds_controller_smu_register_write( \
221       controller, \
222       completion_queue_upper, \
223       sci_cb_physical_address_upper(address) \
224    ); \
225 }
226 
227 #define SMU_CQGR_WRITE(controller, value) \
228     scic_sds_controller_smu_register_write( \
229        controller, completion_queue_get, value \
230     )
231 
232 #define SMU_CQGR_READ(controller, value) \
233     scic_sds_controller_smu_register_read( \
234        controller, completion_queue_get \
235     )
236 
237 #define SMU_CQPR_WRITE(controller, value) \
238     scic_sds_controller_smu_register_write( \
239        controller, completion_queue_put, value \
240     )
241 
242 #define SMU_RNCBAR_WRITE(controller, address) \
243 { \
244    scic_sds_controller_smu_register_write( \
245       controller, \
246       remote_node_context_lower, \
247       sci_cb_physical_address_lower(address) \
248    ); \
249    scic_sds_controller_smu_register_write( \
250       controller, \
251       remote_node_context_upper, \
252       sci_cb_physical_address_upper(address) \
253    ); \
254 }
255 
256 #define SMU_AMR_READ(controller) \
257    scic_sds_controller_smu_register_read( \
258       controller, address_modifier \
259    )
260 
261 #define SMU_IMR_READ(controller) \
262    scic_sds_controller_smu_register_read( \
263       controller, interrupt_mask \
264    )
265 
266 #define SMU_IMR_WRITE(controller, mask) \
267    scic_sds_controller_smu_register_write( \
268       controller, interrupt_mask, mask \
269    )
270 
271 #define SMU_ISR_READ(controller) \
272    scic_sds_controller_smu_register_read( \
273       controller, interrupt_status \
274    )
275 
276 #define SMU_ISR_WRITE(controller, status) \
277    scic_sds_controller_smu_register_write( \
278       controller, interrupt_status, status \
279    )
280 
281 #define SMU_ICC_READ(controller) \
282    scic_sds_controller_smu_register_read( \
283       controller, interrupt_coalesce_control \
284    )
285 
286 #define SMU_ICC_WRITE(controller, value) \
287    scic_sds_controller_smu_register_write( \
288       controller, interrupt_coalesce_control, value \
289    )
290 
291 #define SMU_CQC_WRITE(controller, value) \
292     scic_sds_controller_smu_register_write( \
293        controller, completion_queue_control, value \
294     )
295 
296 #define SMU_SMUSRCR_WRITE(controller, value) \
297    scic_sds_controller_smu_register_write( \
298       controller, soft_reset_control, value \
299    )
300 
301 #define SMU_TCA_WRITE(controller, index, value) \
302     scic_sds_controller_smu_register_write( \
303        controller, task_context_assignment[index], value \
304     )
305 
306 #define SMU_TCA_READ(controller, index) \
307     scic_sds_controller_smu_register_read( \
308        controller, task_context_assignment[index] \
309     )
310 
311 #define SMU_DCC_READ(controller) \
312    scic_sds_controller_smu_register_read( \
313       controller, device_context_capacity \
314    )
315 
316 #define SMU_DFC_READ(controller) \
317    scic_sds_controller_smu_register_read( \
318       controller, device_function_capacity \
319    )
320 
321 #define SMU_SMUCSR_READ(controller) \
322    scic_sds_controller_smu_register_read( \
323       controller, control_status \
324    )
325 
326 #define SMU_CGUCR_READ(controller) \
327    scic_sds_controller_smu_register_read( \
328       controller, clock_gating_control \
329    )
330 
331 #define SMU_CGUCR_WRITE(controller, value) \
332    scic_sds_controller_smu_register_write( \
333       controller, clock_gating_control, value \
334    )
335 
336 #define SMU_CQPR_READ(controller) \
337     scic_sds_controller_smu_register_read( \
338        controller, completion_queue_put \
339     )
340 
341 /*@}*/
342 
343 /**
344  * @name SCU_REGISTER_ACCESS_MACROS
345  */
346 /*@{*/
347 #define scic_sds_controller_scu_register_read(controller, reg) \
348    scu_register_read( \
349       (controller), \
350       (controller)->scu_registers->reg \
351    )
352 
353 #define scic_sds_controller_scu_register_write(controller, reg, value) \
354    scu_register_write( \
355       (controller), \
356       (controller)->scu_registers->reg, \
357       (value) \
358    )
359 /*@}*/
360 
361 
362 //****************************************************************************
363 //*  SCU SDMA REGISTERS
364 //****************************************************************************
365 
366 /**
367  * @name SCU_SDMA_REGISTER_ACCESS_MACROS
368  */
369 /*@{*/
370 #define scu_sdma_register_read(controller, reg) \
371    scu_register_read( \
372       (controller), \
373       (controller)->scu_registers->sdma.reg \
374    )
375 
376 #define scu_sdma_register_write(controller, reg, value) \
377    scu_register_write( \
378       (controller), \
379       (controller)->scu_registers->sdma.reg, \
380       (value) \
381    )
382 /*@}*/
383 
384 /**
385  * @name SCU_SDMA_REGISTERS
386  */
387 /*@{*/
388 #define SCU_PUFATHAR_WRITE(controller, address) \
389 { \
390    scu_sdma_register_write( \
391       controller, \
392       uf_address_table_lower, \
393       sci_cb_physical_address_lower(address) \
394    ); \
395    scu_sdma_register_write( \
396       controller, \
397       uf_address_table_upper, \
398       sci_cb_physical_address_upper(address) \
399    ); \
400 }
401 
402 #define SCU_UFHBAR_WRITE(controller, address) \
403 { \
404    scu_sdma_register_write( \
405       controller, \
406       uf_header_base_address_lower, \
407       sci_cb_physical_address_lower(address) \
408    ); \
409    scu_sdma_register_write( \
410       controller, \
411       uf_header_base_address_upper, \
412       sci_cb_physical_address_upper(address) \
413    ); \
414 }
415 
416 #define SCU_UFQC_READ(controller) \
417     scu_sdma_register_read( \
418        controller,  \
419        unsolicited_frame_queue_control \
420     )
421 
422 #define SCU_UFQC_WRITE(controller, value) \
423     scu_sdma_register_write( \
424        controller, \
425        unsolicited_frame_queue_control, \
426        value \
427     )
428 
429 #define SCU_UFQPP_READ(controller) \
430     scu_sdma_register_read( \
431        controller, \
432        unsolicited_frame_put_pointer \
433     )
434 
435 #define SCU_UFQPP_WRITE(controller, value) \
436    scu_sdma_register_write( \
437       controller, \
438       unsolicited_frame_put_pointer, \
439       value \
440    )
441 
442 #define SCU_UFQGP_WRITE(controller, value) \
443    scu_sdma_register_write( \
444       controller, \
445       unsolicited_frame_get_pointer, \
446       value \
447    )
448 
449 #define SCU_PDMACR_READ(controller) \
450    scu_sdma_register_read( \
451       controller, \
452       pdma_configuration \
453    )
454 
455 #define SCU_PDMACR_WRITE(controller, value) \
456    scu_sdma_register_write( \
457       controller, \
458       pdma_configuration, \
459       value \
460    )
461 
462 #define SCU_CDMACR_READ(controller) \
463    scu_sdma_register_read( \
464      controller, \
465      cdma_configuration \
466    )
467 
468 #define SCU_CDMACR_WRITE(controller, value) \
469    scu_sdma_register_write( \
470       controller, \
471       cdma_configuration, \
472       value \
473    )
474 /*@}*/
475 
476 //*****************************************************************************
477 //* SCU CRAM AND FBRAM Registers
478 //*****************************************************************************
479 /**
480  * @name SCU_CRAM_REGISTER_ACCESS_MACROS
481  */
482 /*@{*/
483 #define scu_cram_register_read(controller, reg) \
484    scu_register_read( \
485       (controller), \
486       (controller)->scu_registers->cram.reg \
487    )
488 
489 #define scu_cram_register_write(controller, reg, value) \
490    scu_register_write( \
491       (controller), \
492       (controller)->scu_registers->cram.reg, \
493       (value) \
494    )
495 /*@}*/
496 
497 /**
498  * @name SCU_FBRAM_REGISTER_ACCESS_MACROS
499  */
500 /*@{*/
501 #define scu_fbram_register_read(controller, reg) \
502    scu_register_read( \
503       (controller), \
504       (controller)->scu_registers->fbram.reg \
505    )
506 
507 #define scu_fbram_register_write(controller, reg, value) \
508    scu_register_write( \
509       (controller), \
510       (controller)->scu_registers->fbram.reg, \
511       (value) \
512    )
513 /*@}*/
514 
515 
516 /**
517  * @name SCU_CRAM_REGISTERS
518  */
519 /*@{*/
520 
521 // SRAM ECC CONTROL REGISTER BITS
522 #define SIGNLE_BIT_ERROR_CORRECTION_ENABLE 0x00000001
523 #define MULTI_BIT_ERROR_REPORTING_ENABLE   0x00000002
524 #define SINGLE_BIT_ERROR_REPORTING_ENABLE  0x00000004
525 
526 //SRAM ECC control register (SECR0)
527 #define SCU_SECR0_WRITE(controller, value) \
528     scu_cram_register_write( \
529       controller, \
530       sram_ecc_control_0, \
531       value \
532    )
533 /*@}*/
534 
535 /**
536  * @name SCU_FBRAM_REGISTERS
537  */
538 /*@{*/
539 
540 //SRAM ECC control register (SECR1)
541 #define SCU_SECR1_WRITE(controller, value) \
542     scu_fbram_register_write( \
543       controller, \
544       sram_ecc_control_1, \
545       value \
546    )
547 /*@}*/
548 
549 
550 //*****************************************************************************
551 //* SCU Port Task Scheduler Group Registers
552 //*****************************************************************************
553 
554 /**
555  * @name SCU_PTSG_REGISTER_ACCESS_MACROS
556  */
557 /*@{*/
558 #define scu_ptsg_register_read(controller, reg) \
559    scu_register_read( \
560       (controller), \
561       (controller)->scu_registers->peg0.ptsg.reg \
562    )
563 
564 #define scu_ptsg_register_write(controller, reg, value) \
565    scu_register_write( \
566       (controller), \
567       (controller)->scu_registers->peg0.ptsg.reg, \
568       (value) \
569    )
570 /*@}*/
571 
572 /**
573  * @name SCU_PTSG_REGISTERS
574  */
575 /*@{*/
576 #define SCU_PTSGCR_READ(controller) \
577     scu_ptsg_register_read( \
578        (controller), \
579        control \
580     )
581 
582 #define SCU_PTSGCR_WRITE(controller, value) \
583     scu_ptsg_register_write( \
584        (controller), \
585        control, \
586        value \
587     )
588 
589 #define SCU_PTSGRTC_READ(controller) \
590     scu_ptsg_register_read( \
591        controller, \
592        real_time_clock \
593     )
594 /*@}*/
595 
596 #ifdef __cplusplus
597 }
598 #endif // __cplusplus
599 
600 #endif // _SCIC_SDS_CONTROLLER_REGISTERS_H_
601