hc
2024-03-25 edb30157bad0c0001c32b854271ace01d3b9a16a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
/** @file
  Register names for PCH SATA controllers
 
  Conventions:
 
  - Register definition format:
    Prefix_[GenerationName]_[ComponentName]_SubsystemName_RegisterSpace_RegisterName
  - Prefix:
    Definitions beginning with "R_" are registers
    Definitions beginning with "B_" are bits within registers
    Definitions beginning with "V_" are meaningful values within the bits
    Definitions beginning with "S_" are register size
    Definitions beginning with "N_" are the bit position
  - [GenerationName]:
    Three letter acronym of the generation is used .
    Register name without GenerationName applies to all generations.
  - [ComponentName]:
    This field indicates the component name that the register belongs to (e.g. PCH, SA etc.)
    Register name without ComponentName applies to all components.
    Register that is specific to -H denoted by "_PCH_H_" in component name.
    Register that is specific to -LP denoted by "_PCH_LP_" in component name.
  - SubsystemName:
    This field indicates the subsystem name of the component that the register belongs to
    (e.g. PCIE, USB, SATA, GPIO, PMC etc.).
  - RegisterSpace:
    MEM - MMIO space register of subsystem.
    IO  - IO space register of subsystem.
    PCR - Private configuration register of subsystem.
    CFG - PCI configuration space register of subsystem.
  - RegisterName:
    Full register name.
 
  Copyright (c) 2019 Intel Corporation. All rights reserved. <BR>
 
  SPDX-License-Identifier: BSD-2-Clause-Patent
**/
 
#ifndef _PCH_REGS_SATA_H_
#define _PCH_REGS_SATA_H_
 
//
//  SATA Controller Registers
//
#define PCI_DEVICE_NUMBER_PCH_SATA          23
#define PCI_FUNCTION_NUMBER_PCH_SATA        0
 
#define PCI_DEVICE_NUMBER_CDF_PCH_SATA_1    7
#define PCI_FUNCTION_NUMBER_CDF_PCH_SATA_1  0
 
#define PCI_DEVICE_NUMBER_CDF_PCH_SATA_2    8
#define PCI_FUNCTION_NUMBER_CDF_PCH_SATA_2  0
 
#define PCI_DEVICE_NUMBER_CDF_PCH_SATA_3    14
#define PCI_FUNCTION_NUMBER_CDF_PCH_SATA_3  0
 
//
//  PCH-LP SATA Device ID's
//
#define V_CNL_PCH_LP_SATA_CFG_DEVICE_ID_M_AHCI         0x9DD3  ///< SATA Controller (AHCI) - Mobile
#define V_CNL_PCH_LP_SATA_CFG_DEVICE_ID_M_RAID         0x9DD5  ///< SATA Controller (RAID 0/1/5/10) - NOT premium - Mobile
#define V_CNL_PCH_LP_SATA_CFG_DEVICE_ID_M_RAID_PREM    0x9DD7  ///< SATA Controller (RAID 0/1/5/10) - premium - Mobile
#define V_CNL_PCH_LP_SATA_CFG_DEVICE_ID_M_RAID_IBC     0x282A  ///< SATA Controller (RAID 0/1/5/10) - In-box compatible - Mobile
 
//
//  PCH-H SATA Device ID's
//
#define V_PCH_H_SATA_CFG_DEVICE_ID_D_RAID_ALTDIS   0x2822  ///< SATA Controller (RAID 0/1/5/10) - premium - Alternate ID
#define V_PCH_H_SATA_CFG_DEVICE_ID_D_RAID_RSTE     0x2826  ///< SATA Controller (RAID 0/1/5/10) - RSTe of Server SKU
 
//
//  PCH-H SATA Device ID's
//
#define V_CNL_PCH_H_SATA_CFG_DEVICE_ID_D_AHCI         0xA352  ///< SATA Controller (AHCI) Desktop/Server
#define V_CNL_PCH_H_SATA_CFG_DEVICE_ID_MH_AHCI        0xA353  ///< SATA Controller (AHCI) Mobile Halo
#define V_CNL_PCH_H_SATA_CFG_DEVICE_ID_D_RAID         0xA354  ///< SATA Controller (RAID 0/1/5/10) - NOT premium Desktop/Server
#define V_CNL_PCH_H_SATA_CFG_DEVICE_ID_MH_RAID        0xA355  ///< SATA Controller (RAID 0/1/5/10) - NOT premium Mobile Halo
#define V_CNL_PCH_H_SATA_CFG_DEVICE_ID_D_RAID_PREM    0xA356  ///< SATA Controller (RAID 0/1/5/10) - premium Desktop/Server
#define V_CNL_PCH_H_SATA_CFG_DEVICE_ID_MH_RAID_PREM   0xA357  ///< SATA Controller (RAID 0/1/5/10) - premium Mobile Halo
#define V_CNL_PCH_H_SATA_CFG_DEVICE_ID_D_OP_AHCI      0xA35E  ///< SATA Controller (AHCI) Optane Caching - Desktop
#define V_CNL_PCH_H_SATA_CFG_DEVICE_ID_D_RAID_IBC     0x2822  ///< SATA Controller (RAID 0/1/5/10) - In-box compatible
#define V_CNL_PCH_H_SATA_CFG_DEVICE_ID_D_RAID_IBC_RST 0x2826  ///< SATA Controller (RAID 0/1/5/10) - In-box compatible (RSTe)
#define V_CNL_PCH_H_SATA_CFG_DEVICE_ID_D_RAID_IBC_2   0x282A  ///< SATA Controller (RAID 0/1/5/10) - In-box compatible (Alternate)
 
 
//
//  SATA Controller common Registers
//
#define V_SATA_CFG_SUB_CLASS_CODE_AHCI      0x06
#define V_SATA_CFG_SUB_CLASS_CODE_RAID      0x04
#define R_SATA_CFG_AHCI_BAR                 0x24
#define B_SATA_CFG_AHCI_BAR_BA              0xFFFFF800
#define V_SATA_CFG_AHCI_BAR_LENGTH          0x800
#define N_SATA_CFG_AHCI_BAR_ALIGNMENT       11
#define V_SATA_CFG_AHCI_BAR_LENGTH_512K     0x80000
#define N_SATA_CFG_AHCI_BAR_ALIGNMENT_512K  19
#define B_SATA_CFG_AHCI_BAR_PF              BIT3
#define B_SATA_CFG_AHCI_BAR_TP              (BIT2 | BIT1)
#define B_SATA_CFG_AHCI_BAR_RTE             BIT0
#define R_SATA_CFG_PID                      0x70
#define B_SATA_CFG_PID_NEXT                 0xFF00
#define V_SATA_CFG_PID_NEXT_0               0xB000
#define V_SATA_CFG_PID_NEXT_1               0xA800
#define B_SATA_CFG_PID_CID                  0x00FF
#define R_SATA_CFG_PC                       0x72
#define S_SATA_CFG_PC                       2
#define B_SATA_CFG_PC_PME                   (BIT15 | BIT14 | BIT13 | BIT12 | BIT11)
#define V_SATA_CFG_PC_PME_0                 0x0000
#define V_SATA_CFG_PC_PME_1                 0x4000
#define B_SATA_CFG_PC_D2_SUP                BIT10
#define B_SATA_CFG_PC_D1_SUP                BIT9
#define B_SATA_CFG_PC_AUX_CUR               (BIT8 | BIT7 | BIT6)
#define B_SATA_CFG_PC_DSI                   BIT5
#define B_SATA_CFG_PC_PME_CLK               BIT3
#define B_SATA_CFG_PC_VER                   (BIT2 | BIT1 | BIT0)
#define R_SATA_CFG_PMCS                     0x74
#define B_SATA_CFG_PMCS_PMES                BIT15
#define B_SATA_CFG_PMCS_PMEE                BIT8
#define B_SATA_CFG_PMCS_NSFRST              BIT3
#define V_SATA_CFG_PMCS_NSFRST_1            0x01
#define V_SATA_CFG_PMCS_NSFRST_0            0x00
#define B_SATA_CFG_PMCS_PS                  (BIT1 | BIT0)
#define V_SATA_CFG_PMCS_PS_3                0x03
#define V_SATA_CFG_PMCS_PS_0                0x00
#define R_SATA_CFG_MID                      0x80
#define B_SATA_CFG_MID_NEXT                 0xFF00
#define B_SATA_CFG_MID_CID                  0x00FF
#define R_SATA_CFG_MC                       0x82
#define B_SATA_CFG_MC_C64                   BIT7
#define B_SATA_CFG_MC_MME                   (BIT6 | BIT5 | BIT4)
#define V_SATA_CFG_MC_MME_4                 0x04
#define V_SATA_CFG_MC_MME_2                 0x02
#define V_SATA_CFG_MC_MME_1                 0x01
#define V_SATA_CFG_MC_MME_0                 0x00
#define B_SATA_CFG_MC_MMC                   (BIT3 | BIT2 | BIT1)
#define V_SATA_CFG_MC_MMC_4                 0x04
#define V_SATA_CFG_MC_MMC_0                 0x00
#define B_SATA_CFG_MC_MSIE                  BIT0
#define V_SATA_CFG_MC_MSIE_1                0x01
#define V_SATA_CFG_MC_MSIE_0                0x00
#define R_SATA_CFG_MA                       0x84
#define B_SATA_CFG_MA                       0xFFFFFFFC
#define R_SATA_CFG_MD                       0x88
#define B_SATA_CFG_MD_MSIMD                 0xFFFF
 
#define R_SATA_CFG_MAP                      0x90
#define B_SATA_CFG_MAP_PCD                  0xFF
#define N_SATA_CFG_MAP_SPD                  16
#define B_SATA_CFG_MAP_SPD7                 BIT23
#define B_SATA_CFG_MAP_SPD6                 BIT22
#define B_SATA_CFG_MAP_SPD5                 BIT21
#define B_SATA_CFG_MAP_SPD4                 BIT20
#define B_SATA_CFG_MAP_SPD3                 BIT19
#define B_SATA_CFG_MAP_SPD2                 BIT18
#define B_SATA_CFG_MAP_SPD1                 BIT17
#define B_SATA_CFG_MAP_SPD0                 BIT16
#define B_SATA_CFG_MAP_PORT7_PCD            BIT7
#define B_SATA_CFG_MAP_PORT6_PCD            BIT6
#define B_SATA_CFG_MAP_PORT5_PCD            BIT5
#define B_SATA_CFG_MAP_PORT4_PCD            BIT4
#define B_SATA_CFG_MAP_PORT3_PCD            BIT3
#define B_SATA_CFG_MAP_PORT2_PCD            BIT2
#define B_SATA_CFG_MAP_PORT1_PCD            BIT1
#define B_SATA_CFG_MAP_PORT0_PCD            BIT0
#define R_SATA_CFG_PCS                      0x94
#define B_SATA_CFG_PCS_P7P                  BIT23
#define B_SATA_CFG_PCS_P6P                  BIT22
#define B_SATA_CFG_PCS_P5P                  BIT21
#define B_SATA_CFG_PCS_P4P                  BIT20
#define B_SATA_CFG_PCS_P3P                  BIT19
#define B_SATA_CFG_PCS_P2P                  BIT18
#define B_SATA_CFG_PCS_P1P                  BIT17
#define B_SATA_CFG_PCS_P0P                  BIT16
#define B_SATA_CFG_PCS_P7E                  BIT7
#define B_SATA_CFG_PCS_P6E                  BIT6
#define B_SATA_CFG_PCS_P5E                  BIT5
#define B_SATA_CFG_PCS_P4E                  BIT4
#define B_SATA_CFG_PCS_P3E                  BIT3
#define B_SATA_CFG_PCS_P2E                  BIT2
#define B_SATA_CFG_PCS_P1E                  BIT1
#define B_SATA_CFG_PCS_P0E                  BIT0
#define R_SATA_CFG_SATAGC                   0x9C
#define B_SATA_CFG_SATAGC_SMS_MASK          BIT16
#define N_SATA_CFG_SATAGC_SMS_MASK          16
#define V_SATA_CFG_SATAGC_SMS_AHCI          0x0
#define V_SATA_CFG_SATAGC_SMS_RAID          0x1
#define B_SATA_CFG_SATAGC_AIE               BIT7
#define B_SATA_CFG_SATAGC_AIES              BIT6
#define B_SATA_CFG_SATAGC_MSS               (BIT4 | BIT3)
#define V_SATA_CFG_SATAGC_MSS_8K            0x2
#define N_SATA_CFG_SATAGC_MSS               3
#define B_SATA_CFG_SATAGC_ASSEL             (BIT2 | BIT1 | BIT0)
 
#define V_SATA_CFG_SATAGC_ASSEL_2K          0x0
#define V_SATA_CFG_SATAGC_ASSEL_16K         0x1
#define V_SATA_CFG_SATAGC_ASSEL_32K         0x2
#define V_SATA_CFG_SATAGC_ASSEL_64K         0x3
#define V_SATA_CFG_SATAGC_ASSEL_128K        0x4
#define V_SATA_CFG_SATAGC_ASSEL_256K        0x5
#define V_SATA_CFG_SATAGC_ASSEL_512K        0x6
 
#define R_SATA_CFG_SIRI                     0xA0
#define R_SATA_CFG_STRD                     0xA4
#define R_SATA_CFG_SIR_0C                   0x0C
#define R_SATA_CFG_SIR_50                   0x50
#define R_SATA_CFG_SIR_54                   0x54
#define R_SATA_CFG_SIR_58                   0x58
#define R_SATA_CFG_SIR_5C                   0x5C
#define R_SATA_CFG_SIR_60                   0x60
#define R_SATA_CFG_SIR_64                   0x64
#define R_SATA_CFG_SIR_68                   0x68
#define R_SATA_CFG_SIR_6C                   0x6C
#define R_SATA_CFG_SIR_70                   0x70
#define R_SATA_CFG_SIR_80                   0x80
#define R_SATA_CFG_SIR_84                   0x84
#define R_SATA_CFG_SIR_8C                   0x8C
#define R_SATA_CFG_SIR_90                   0x90
#define R_SATA_CFG_SIR_98                   0x98
#define R_SATA_CFG_SIR_9C                   0x9C
#define R_SATA_CFG_SIR_A0                   0xA0
#define R_SATA_CFG_SIR_A4                   0xA4
#define R_SATA_CFG_SIR_A8                   0xA8
#define R_SATA_CFG_SIR_C8                   0xC8
#define R_SATA_CFG_SIR_CC                   0xCC
#define R_SATA_CFG_SIR_D0                   0xD0
#define R_SATA_CFG_SIR_D4                   0xD4
#define B_SATA_CFG_STRD_DTA                 0xFFFFFFFF
#define R_SATA_CFG_CR0                      0xA8
#define B_SATA_CFG_CR0_MAJREV               0x00F00000
#define B_SATA_CFG_CR0_MINREV               0x000F0000
#define B_SATA_CFG_CR0_NEXT                 0x0000FF00
#define B_SATA_CFG_CR0_CAP                  0x000000FF
#define R_SATA_CFG_CR1                      0xAC
#define B_SATA_CFG_CR1_BAROFST              0xFFF0
#define B_SATA_CFG_CR1_BARLOC               0x000F
#define R_SATA_CFG_FLR_CID                  0xB0
#define B_SATA_CFG_FLR_CID_NEXT             0xFF00
#define B_SATA_CFG_FLR_CID                  0x00FF
#define V_SATA_CFG_FLR_CID_1                0x0009
#define V_SATA_CFG_FLR_CID_0                0x0013
#define R_SATA_CFG_FLR_CLV                  0xB2
#define B_SATA_CFG_FLR_CLV_FLRC_FLRCSSEL_0  BIT9
#define B_SATA_CFG_FLR_CLV_TXPC_FLRCSSEL_0  BIT8
#define B_SATA_CFG_FLR_CLV_VSCID_FLRCSSEL_0 0x00FF
#define B_SATA_CFG_FLR_CLV_VSCID_FLRCSSEL_1 0x00FF
#define V_SATA_CFG_FLR_CLV_VSCID_FLRCSSEL   0x0006
#define R_SATA_CFG_FLRC                     0xB4
#define B_SATA_CFG_FLRC_TXP                 BIT8
#define B_SATA_CFG_FLRC_INITFLR             BIT0
#define R_SATA_CFG_SP                       0xC0
#define B_SATA_CFG_SP                       0xFFFFFFFF
#define R_SATA_CFG_MXID                     0xD0
#define N_SATA_CFG_MXID_NEXT                8
 
#define R_SATA_CFG_BFCS                     0xE0
#define B_SATA_CFG_BFCS_P7BFI               BIT17
#define B_SATA_CFG_BFCS_P6BFI               BIT16
#define B_SATA_CFG_BFCS_P5BFI               BIT15
#define B_SATA_CFG_BFCS_P4BFI               BIT14
#define B_SATA_CFG_BFCS_P3BFI               BIT13
#define B_SATA_CFG_BFCS_P2BFI               BIT12
#define B_SATA_CFG_BFCS_P2BFS               BIT11
#define B_SATA_CFG_BFCS_P2BFF               BIT10
#define B_SATA_CFG_BFCS_P1BFI               BIT9
#define B_SATA_CFG_BFCS_P0BFI               BIT8
#define B_SATA_CFG_BFCS_BIST_FIS_T          BIT7
#define B_SATA_CFG_BFCS_BIST_FIS_A          BIT6
#define B_SATA_CFG_BFCS_BIST_FIS_S          BIT5
#define B_SATA_CFG_BFCS_BIST_FIS_L          BIT4
#define B_SATA_CFG_BFCS_BIST_FIS_F          BIT3
#define B_SATA_CFG_BFCS_BIST_FIS_P          BIT2
#define R_SATA_CFG_BFTD1                    0xE4
#define B_SATA_CFG_BFTD1                    0xFFFFFFFF
#define R_SATA_CFG_BFTD2                    0xE8
#define B_SATA_CFG_BFTD2                    0xFFFFFFFF
 
#define R_SATA_CFG_VS_CAP                   0xA4
#define B_SATA_CFG_VS_CAP_NRMBE             BIT0                            ///< NVM Remap Memory BAR Enable
#define B_SATA_CFG_VS_CAP_MSL               0x1FFE                          ///< Memory Space Limit
#define N_SATA_CFG_VS_CAP_MSL               1
#define V_SATA_CFG_VS_CAP_MSL               0x1EF                           ///< Memory Space Limit Field Value
#define B_SATA_CFG_VS_CAP_NRMO              0xFFF0000                       ///< NVM Remapped Memory Offset
#define N_SATA_CFG_VS_CAP_NRMO              16
#define V_SATA_CFG_VS_CAP_NRMO              0x10                            ///< NVM Remapped Memory Offset Field Value
 
//
// RST PCIe Storage Remapping Registers
//
#define R_SATA_CFG_RST_PCIE_STORAGE_RCR                 0x800                           ///< Remap Capability Register
#define B_SATA_CFG_RST_PCIE_STORAGE_RCR_NRS             (BIT2|BIT1|BIT0)                ///< Number of Remapping Supported
#define B_SATA_CFG_RST_PCIE_STORAGE_RCR_NRS_CR1         BIT0                            ///< Number of Remapping Supported (RST PCIe Storage Cycle Router #1)
#define R_SATA_CFG_RST_PCIE_STORAGE_SPR                 0x80C                           ///< Scratch Pad Register
#define R_SATA_CFG_RST_PCIE_STORAGE_CR1_DCC             0x880                           ///< CR#1 Device Class Code
#define N_SATA_CFG_RST_PCIE_STORAGE_CR1_DCC_SCC         8
#define N_SATA_CFG_RST_PCIE_STORAGE_CR1_DCC_BCC         16
#define B_SATA_CFG_RST_PCIE_STORAGE_CR1_DCC_DT          BIT31                           ///< Device Type
#define V_SATA_CFG_RST_PCIE_STORAGE_REMAP_CONFIG_CR     0x80                            ///< Remapped Configuration for RST PCIe Storage Cycle Router #n
#define V_SATA_CFG_RST_PCIE_STORAGE_REMAP_RP_OFFSET     0x100                           ///< Remapped Root Port Offset Value
#define R_SATA_CFG_RST_PCIE_STORAGE_CCFG                0x1D0                           ///< Port Configuration Register
//
// AHCI BAR Area related Registers
//
#define R_SATA_MEM_AHCI_CAP                 0x0
#define B_SATA_MEM_AHCI_CAP_S64A            BIT31
#define B_SATA_MEM_AHCI_CAP_SCQA            BIT30
#define B_SATA_MEM_AHCI_CAP_SSNTF           BIT29
#define B_SATA_MEM_AHCI_CAP_SMPS            BIT28 ///< Supports Interlock Switch
#define B_SATA_MEM_AHCI_CAP_SSS             BIT27 ///< Supports Stagger Spin-up
#define B_SATA_MEM_AHCI_CAP_SALP            BIT26
#define B_SATA_MEM_AHCI_CAP_SAL             BIT25
#define B_SATA_MEM_AHCI_CAP_SCLO            BIT24 ///< Supports Command List Override
#define B_SATA_MEM_AHCI_CAP_ISS_MASK        (BIT23 | BIT22 | BIT21 | BIT20)
#define N_SATA_MEM_AHCI_CAP_ISS             20    ///< Interface Speed Support
#define V_SATA_MEM_AHCI_CAP_ISS_1_5_G       0x01
#define V_SATA_MEM_AHCI_CAP_ISS_3_0_G       0x02
#define V_SATA_MEM_AHCI_CAP_ISS_6_0_G       0x03
#define B_SATA_MEM_AHCI_CAP_SNZO            BIT19
#define B_SATA_MEM_AHCI_CAP_SAM             BIT18
#define B_SATA_MEM_AHCI_CAP_SPM             BIT17 ///< Supports Port Multiplier
#define B_SATA_MEM_AHCI_CAP_PMD             BIT15 ///< PIO Multiple DRQ Block
#define B_SATA_MEM_AHCI_CAP_SSC             BIT14
#define B_SATA_MEM_AHCI_CAP_PSC             BIT13
#define B_SATA_MEM_AHCI_CAP_NCS             0x1F00
#define B_SATA_MEM_AHCI_CAP_CCCS            BIT7
#define B_SATA_MEM_AHCI_CAP_EMS             BIT6
#define B_SATA_MEM_AHCI_CAP_SXS             BIT5  ///< External SATA is supported
#define B_SATA_MEM_AHCI_CAP_NPS             0x001F
 
#define R_SATA_MEM_AHCI_GHC                 0x04
#define B_SATA_MEM_AHCI_GHC_AE              BIT31
#define B_SATA_MEM_AHCI_GHC_MRSM            BIT2
#define B_SATA_MEM_AHCI_GHC_IE              BIT1
#define B_SATA_MEM_AHCI_GHC_HR              BIT0
 
#define R_SATA_MEM_AHCI_IS                  0x08
#define B_SATA_MEM_AHCI_IS_PORT7            BIT7
#define B_SATA_MEM_AHCI_IS_PORT6            BIT6
#define B_SATA_MEM_AHCI_IS_PORT5            BIT5
#define B_SATA_MEM_AHCI_IS_PORT4            BIT4
#define B_SATA_MEM_AHCI_IS_PORT3            BIT3
#define B_SATA_MEM_AHCI_IS_PORT2            BIT2
#define B_SATA_MEM_AHCI_IS_PORT1            BIT1
#define B_SATA_MEM_AHCI_IS_PORT0            BIT0
#define R_SATA_MEM_AHCI_PI                  0x0C
#define B_SATA_MEM_AHCI_PI_PORT_MASK        0xFF
#define B_SATA_MEM_PORT7_IMPLEMENTED        BIT7
#define B_SATA_MEM_PORT6_IMPLEMENTED        BIT6
#define B_SATA_MEM_PORT5_IMPLEMENTED        BIT5
#define B_SATA_MEM_PORT4_IMPLEMENTED        BIT4
#define B_SATA_MEM_PORT3_IMPLEMENTED        BIT3
#define B_SATA_MEM_PORT2_IMPLEMENTED        BIT2
#define B_SATA_MEM_PORT1_IMPLEMENTED        BIT1
#define B_SATA_MEM_PORT0_IMPLEMENTED        BIT0
#define R_SATA_MEM_AHCI_VS                  0x10
#define B_SATA_MEM_AHCI_VS_MJR              0xFFFF0000
#define B_SATA_MEM_AHCI_VS_MNR              0x0000FFFF
#define R_SATA_MEM_AHCI_EM_LOC              0x1C
#define B_SATA_MEM_AHCI_EM_LOC_OFST         0xFFFF0000
#define B_SATA_MEM_AHCI_EM_LOC_SZ           0x0000FFFF
#define R_SATA_MEM_AHCI_EM_CTRL             0x20
#define B_SATA_MEM_AHCI_EM_CTRL_ATTR_ALHD   BIT26
#define B_SATA_MEM_AHCI_EM_CTRL_ATTR_XMT    BIT25
#define B_SATA_MEM_AHCI_EM_CTRL_ATTR_SMB    BIT24
#define B_SATA_MEM_AHCI_EM_CTRL_SUPP_SGPIO  BIT19
#define B_SATA_MEM_AHCI_EM_CTRL_SUPP_SES2   BIT18
#define B_SATA_MEM_AHCI_EM_CTRL_SUPP_SAFTE  BIT17
#define B_SATA_MEM_AHCI_EM_CTRL_SUPP_LED    BIT16
#define B_SATA_MEM_AHCI_EM_CTRL_RST         BIT9
#define B_SATA_MEM_AHCI_EM_CTRL_CTL_TM      BIT8
#define B_SATA_MEM_AHCI_EM_CTRL_STS_MR      BIT0
#define R_SATA_MEM_AHCI_CAP2                0x24
#define B_SATA_MEM_AHCI_CAP2_DESO           BIT5
#define B_SATA_MEM_AHCI_CAP2_SADM           BIT4
#define B_SATA_MEM_AHCI_CAP2_SDS            BIT3
#define B_SATA_MEM_AHCI_CAP2_APST           BIT2  ///< Automatic Partial to Slumber Transitions
#define R_SATA_MEM_AHCI_VSP                 0xA0
#define B_SATA_MEM_AHCI_VSP_SLPD            BIT0
#define R_SATA_MEM_AHCI_SFM                 0xC8  ///< RST Feature Capabilities
#define B_SATA_MEM_AHCI_SFM_LEGACY          BIT12
#define B_SATA_MEM_AHCI_SFM_OUD             (BIT11 | BIT10)
#define N_SATA_MEM_AHCI_SFM_OUD             10
#define B_SATA_MEM_AHCI_SFM_SEREQ           BIT9
#define B_SATA_MEM_AHCI_SFM_IROES           BIT8
#define B_SATA_MEM_AHCI_SFM_LEDL            BIT7
#define B_SATA_MEM_AHCI_SFM_HDDLK           BIT6
#define B_SATA_MEM_AHCI_SFM_IRSTOROM        BIT5
#define B_SATA_MEM_AHCI_SFM_RSTE            BIT4
#define B_SATA_MEM_AHCI_SFM_R5E             BIT3
#define B_SATA_MEM_AHCI_SFM_R10E            BIT2
#define B_SATA_MEM_AHCI_SFM_R1E             BIT1
#define B_SATA_MEM_AHCI_SFM_R0E             BIT0
#define B_SATA_MEM_AHCI_SFM_LOWBYTES        0x1FF
#define R_SATA_MEM_AHCI_P0CLB               0x100
#define R_SATA_MEM_AHCI_P1CLB               0x180
#define R_SATA_MEM_AHCI_P2CLB               0x200
#define R_SATA_MEM_AHCI_P3CLB               0x280
#define R_SATA_MEM_AHCI_P4CLB               0x300
#define R_SATA_MEM_AHCI_P5CLB               0x380
#define R_SATA_MEM_AHCI_P6CLB               0x400
#define R_SATA_MEM_AHCI_P7CLB               0x480
#define B_SATA_MEM_AHCI_PXCLB               0xFFFFFC00
#define R_SATA_MEM_AHCI_P0CLBU              0x104
#define R_SATA_MEM_AHCI_P1CLBU              0x184
#define R_SATA_MEM_AHCI_P2CLBU              0x204
#define R_SATA_MEM_AHCI_P3CLBU              0x284
#define R_SATA_MEM_AHCI_P4CLBU              0x304
#define R_SATA_MEM_AHCI_P5CLBU              0x384
#define R_SATA_MEM_AHCI_P6CLBU              0x404
#define R_SATA_MEM_AHCI_P7CLBU              0x484
#define B_SATA_MEM_AHCI_PXCLBU              0xFFFFFFFF
#define R_SATA_MEM_AHCI_P0FB                0x108
#define R_SATA_MEM_AHCI_P1FB                0x188
#define R_SATA_MEM_AHCI_P2FB                0x208
#define R_SATA_MEM_AHCI_P3FB                0x288
#define R_SATA_MEM_AHCI_P4FB                0x308
#define R_SATA_MEM_AHCI_P5FB                0x388
#define R_SATA_MEM_AHCI_P6FB                0x408
#define R_SATA_MEM_AHCI_P7FB                0x488
#define B_SATA_MEM_AHCI_PXFB                0xFFFFFF00
#define R_SATA_MEM_AHCI_P0FBU               0x10C
#define R_SATA_MEM_AHCI_P1FBU               0x18C
#define R_SATA_MEM_AHCI_P2FBU               0x20C
#define R_SATA_MEM_AHCI_P3FBU               0x28C
#define R_SATA_MEM_AHCI_P4FBU               0x30C
#define R_SATA_MEM_AHCI_P5FBU               0x38C
#define R_SATA_MEM_AHCI_P6FBU               0x40C
#define R_SATA_MEM_AHCI_P7FBU               0x48C
#define B_SATA_MEM_AHCI_PXFBU               0xFFFFFFFF
#define R_SATA_MEM_AHCI_P0IS                0x110
#define R_SATA_MEM_AHCI_P1IS                0x190
#define R_SATA_MEM_AHCI_P2IS                0x210
#define R_SATA_MEM_AHCI_P3IS                0x290
#define R_SATA_MEM_AHCI_P4IS                0x310
#define R_SATA_MEM_AHCI_P5IS                0x390
#define R_SATA_MEM_AHCI_P6IS                0x410
#define R_SATA_MEM_AHCI_P7IS                0x490
#define B_SATA_MEM_AHCI_PXIS_CPDS           BIT31
#define B_SATA_MEM_AHCI_PXIS_TFES           BIT30
#define B_SATA_MEM_AHCI_PXIS_HBFS           BIT29
#define B_SATA_MEM_AHCI_PXIS_HBDS           BIT28
#define B_SATA_MEM_AHCI_PXIS_IFS            BIT27
#define B_SATA_MEM_AHCI_PXIS_INFS           BIT26
#define B_SATA_MEM_AHCI_PXIS_OFS            BIT24
#define B_SATA_MEM_AHCI_PXIS_IPMS           BIT23
#define B_SATA_MEM_AHCI_PXIS_PRCS           BIT22
#define B_SATA_MEM_AHCI_PXIS_DIS            BIT7
#define B_SATA_MEM_AHCI_PXIS_PCS            BIT6
#define B_SATA_MEM_AHCI_PXIS_DPS            BIT5
#define B_SATA_MEM_AHCI_PXIS_UFS            BIT4
#define B_SATA_MEM_AHCI_PXIS_SDBS           BIT3
#define B_SATA_MEM_AHCI_PXIS_DSS            BIT2
#define B_SATA_MEM_AHCI_PXIS_PSS            BIT1
#define B_SATA_MEM_AHCI_PXIS_DHRS           BIT0
#define R_SATA_MEM_AHCI_P0IE                0x114
#define R_SATA_MEM_AHCI_P1IE                0x194
#define R_SATA_MEM_AHCI_P2IE                0x214
#define R_SATA_MEM_AHCI_P3IE                0x294
#define R_SATA_MEM_AHCI_P4IE                0x314
#define R_SATA_MEM_AHCI_P5IE                0x394
#define R_SATA_MEM_AHCI_P6IE                0x414
#define R_SATA_MEM_AHCI_P7IE                0x494
#define B_SATA_MEM_AHCI_PXIE_CPDE           BIT31
#define B_SATA_MEM_AHCI_PXIE_TFEE           BIT30
#define B_SATA_MEM_AHCI_PXIE_HBFE           BIT29
#define B_SATA_MEM_AHCI_PXIE_HBDE           BIT28
#define B_SATA_MEM_AHCI_PXIE_IFE            BIT27
#define B_SATA_MEM_AHCI_PXIE_INFE           BIT26
#define B_SATA_MEM_AHCI_PXIE_OFE            BIT24
#define B_SATA_MEM_AHCI_PXIE_IPME           BIT23
#define B_SATA_MEM_AHCI_PXIE_PRCE           BIT22
#define B_SATA_MEM_AHCI_PXIE_DIE            BIT7
#define B_SATA_MEM_AHCI_PXIE_PCE            BIT6
#define B_SATA_MEM_AHCI_PXIE_DPE            BIT5
#define B_SATA_MEM_AHCI_PXIE_UFIE           BIT4
#define B_SATA_MEM_AHCI_PXIE_SDBE           BIT3
#define B_SATA_MEM_AHCI_PXIE_DSE            BIT2
#define B_SATA_MEM_AHCI_PXIE_PSE            BIT1
#define B_SATA_MEM_AHCI_PXIE_DHRE           BIT0
#define R_SATA_MEM_AHCI_P0CMD               0x118
#define R_SATA_MEM_AHCI_P1CMD               0x198
#define R_SATA_MEM_AHCI_P2CMD               0x218
#define R_SATA_MEM_AHCI_P3CMD               0x298
#define R_SATA_MEM_AHCI_P4CMD               0x318
#define R_SATA_MEM_AHCI_P5CMD               0x398
#define R_SATA_MEM_AHCI_P6CMD               0x418
#define R_SATA_MEM_AHCI_P7CMD               0x498
#define B_SATA_MEM_AHCI_PxCMD_ESP           BIT21 ///< Used with an external SATA device
#define B_SATA_MEM_AHCI_PxCMD_MPSP          BIT19 ///< Mechanical Switch Attached to Port
#define B_SATA_MEM_AHCI_PxCMD_HPCP          BIT18 ///< Hotplug capable
#define B_SATA_MEM_AHCI_PxCMD_CR            BIT15
#define B_SATA_MEM_AHCI_PxCMD_FR            BIT14
#define B_SATA_MEM_AHCI_PxCMD_ISS           BIT13
#define B_SATA_MEM_AHCI_PxCMD_CCS           0x00001F00
#define B_SATA_MEM_AHCI_PxCMD_FRE           BIT4
#define B_SATA_MEM_AHCI_PxCMD_CLO           BIT3
#define B_SATA_MEM_AHCI_PxCMD_POD           BIT2
#define B_SATA_MEM_AHCI_PxCMD_SUD           BIT1
#define B_SATA_MEM_AHCI_PxCMD_ST            BIT0
#define R_SATA_MEM_AHCI_P0TFD               0x120
#define R_SATA_MEM_AHCI_P1TFD               0x1A0
#define R_SATA_MEM_AHCI_P2TFD               0x220
#define R_SATA_MEM_AHCI_P3TFD               0x2A0
#define R_SATA_MEM_AHCI_P4TFD               0x320
#define R_SATA_MEM_AHCI_P5TFD               0x3A0
#define R_SATA_MEM_AHCI_P6TFD               0x420
#define B_SATA_MEM_AHCI_PXTFD_ERR           0x0000FF00
#define B_SATA_MEM_AHCI_PXTFD_STS           0x000000FF
#define R_SATA_MEM_AHCI_P0SIG               0x124
#define R_SATA_MEM_AHCI_P1SIG               0x1A4
#define R_SATA_MEM_AHCI_P2SIG               0x224
#define R_SATA_MEM_AHCI_P3SIG               0x2A4
#define R_SATA_MEM_AHCI_P4SIG               0x324
#define R_SATA_MEM_AHCI_P5SIG               0x3A4
#define R_SATA_MEM_AHCI_P6SIG               0x424
#define B_SATA_MEM_AHCI_PXSIG_LBA_HR        0xFF000000
#define B_SATA_MEM_AHCI_PXSIG_LBA_MR        0x00FF0000
#define B_SATA_MEM_AHCI_PXSIG_LBA_LR        0x0000FF00
#define B_SATA_MEM_AHCI_PXSIG_SCR           0x000000FF
#define R_SATA_MEM_AHCI_P0SSTS              0x128
#define R_SATA_MEM_AHCI_P1SSTS              0x1A8
#define R_SATA_MEM_AHCI_P2SSTS              0x228
#define R_SATA_MEM_AHCI_P3SSTS              0x2A8
#define R_SATA_MEM_AHCI_P4SSTS              0x328
#define R_SATA_MEM_AHCI_P5SSTS              0x3A8
#define R_SATA_MEM_AHCI_P6SSTS              0x428
#define B_SATA_MEM_AHCI_PXSSTS_IPM_0        0x00000000
#define B_SATA_MEM_AHCI_PXSSTS_IPM_1        0x00000100
#define B_SATA_MEM_AHCI_PXSSTS_IPM_2        0x00000200
#define B_SATA_MEM_AHCI_PXSSTS_IPM_6        0x00000600
#define B_SATA_MEM_AHCI_PXSSTS_SPD_0        0x00000000
#define B_SATA_MEM_AHCI_PXSSTS_SPD_1        0x00000010
#define B_SATA_MEM_AHCI_PXSSTS_SPD_2        0x00000020
#define B_SATA_MEM_AHCI_PXSSTS_SPD_3        0x00000030
#define B_SATA_MEM_AHCI_PXSSTS_DET_0        0x00000000
#define B_SATA_MEM_AHCI_PXSSTS_DET_1        0x00000001
#define B_SATA_MEM_AHCI_PXSSTS_DET_3        0x00000003
#define B_SATA_MEM_AHCI_PXSSTS_DET_4        0x00000004
#define R_SATA_MEM_AHCI_P0SCTL              0x12C
#define R_SATA_MEM_AHCI_P1SCTL              0x1AC
#define R_SATA_MEM_AHCI_P2SCTL              0x22C
#define R_SATA_MEM_AHCI_P3SCTL              0x2AC
#define R_SATA_MEM_AHCI_P4SCTL              0x32C
#define R_SATA_MEM_AHCI_P5SCTL              0x3AC
#define R_SATA_MEM_AHCI_P6SCTL              0x42C
#define B_SATA_MEM_AHCI_PXSCTL_IPM          0x00000F00
#define V_SATA_MEM_AHCI_PXSCTL_IPM_0        0x00000000
#define V_SATA_MEM_AHCI_PXSCTL_IPM_1        0x00000100
#define V_SATA_MEM_AHCI_PXSCTL_IPM_2        0x00000200
#define V_SATA_MEM_AHCI_PXSCTL_IPM_3        0x00000300
#define B_SATA_MEM_AHCI_PXSCTL_SPD          0x000000F0
#define V_SATA_MEM_AHCI_PXSCTL_SPD_0        0x00000000
#define V_SATA_MEM_AHCI_PXSCTL_SPD_1        0x00000010
#define V_SATA_MEM_AHCI_PXSCTL_SPD_2        0x00000020
#define V_SATA_MEM_AHCI_PXSCTL_SPD_3        0x00000030
#define B_SATA_MEM_AHCI_PXSCTL_DET          0x0000000F
#define V_SATA_MEM_AHCI_PXSCTL_DET_0        0x00000000
#define V_SATA_MEM_AHCI_PXSCTL_DET_1        0x00000001
#define V_SATA_MEM_AHCI_PXSCTL_DET_4        0x00000004
#define R_SATA_MEM_AHCI_P0SERR              0x130
#define R_SATA_MEM_AHCI_P1SERR              0x1B0
#define R_SATA_MEM_AHCI_P2SERR              0x230
#define R_SATA_MEM_AHCI_P3SERR              0x2B0
#define R_SATA_MEM_AHCI_P4SERR              0x330
#define R_SATA_MEM_AHCI_P5SERR              0x3B0
#define R_SATA_MEM_AHCI_P6SERR              0x430
#define B_SATA_MEM_AHCI_PXSERR_EXCHG        BIT26
#define B_SATA_MEM_AHCI_PXSERR_UN_FIS_TYPE  BIT25
#define B_SATA_MEM_AHCI_PXSERR_TRSTE_24     BIT24
#define B_SATA_MEM_AHCI_PXSERR_TRSTE_23     BIT23
#define B_SATA_MEM_AHCI_PXSERR_HANDSHAKE    BIT22
#define B_SATA_MEM_AHCI_PXSERR_CRC_ERROR    BIT21
#define B_SATA_MEM_AHCI_PXSERR_10B8B_DECERR BIT19
#define B_SATA_MEM_AHCI_PXSERR_COMM_WAKE    BIT18
#define B_SATA_MEM_AHCI_PXSERR_PHY_ERROR    BIT17
#define B_SATA_MEM_AHCI_PXSERR_PHY_RDY_CHG  BIT16
#define B_SATA_MEM_AHCI_PXSERR_INTRNAL_ERR  BIT11
#define B_SATA_MEM_AHCI_PXSERR_PROTOCOL_ERR BIT10
#define B_SATA_MEM_AHCI_PXSERR_PCDIE        BIT9
#define B_SATA_MEM_AHCI_PXSERR_TDIE         BIT8
#define B_SATA_MEM_AHCI_PXSERR_RCE          BIT1
#define B_SATA_MEM_AHCI_PXSERR_RDIE         BIT0
#define R_SATA_MEM_AHCI_P0SACT              0x134
#define R_SATA_MEM_AHCI_P1SACT              0x1B4
#define R_SATA_MEM_AHCI_P2SACT              0x234
#define R_SATA_MEM_AHCI_P3SACT              0x2B4
#define R_SATA_MEM_AHCI_P4SACT              0x334
#define R_SATA_MEM_AHCI_P5SACT              0x3B4
#define R_SATA_MEM_AHCI_P6SACT              0x434
#define B_SATA_MEM_AHCI_PXSACT_DS           0xFFFFFFFF
#define R_SATA_MEM_AHCI_P0CI                0x138
#define R_SATA_MEM_AHCI_P1CI                0x1B8
#define R_SATA_MEM_AHCI_P2CI                0x238
#define R_SATA_MEM_AHCI_P3CI                0x2B8
#define R_SATA_MEM_AHCI_P4CI                0x338
#define R_SATA_MEM_AHCI_P5CI                0x3B8
#define R_SATA_MEM_AHCI_P6CI                0x438
#define B_SATA_MEM_AHCI_PXCI                0xFFFFFFFF
 
//
//  SATA AHCI Device ID macros
//
#define IS_PCH_H_SATA_AHCI_DEVICE_ID(DeviceId) \
    ( \
      (DeviceId == V_CNL_PCH_H_SATA_CFG_DEVICE_ID_D_AHCI) || \
      (DeviceId == V_CNL_PCH_H_SATA_CFG_DEVICE_ID_MH_AHCI) || \
      (DeviceId == V_CNL_PCH_H_SATA_CFG_DEVICE_ID_D_OP_AHCI) \
    )
 
#define IS_PCH_LP_SATA_AHCI_DEVICE_ID(DeviceId) \
    ( \
      (DeviceId == V_CNL_PCH_LP_SATA_CFG_DEVICE_ID_M_AHCI) \
    )
 
#define IS_PCH_SATA_AHCI_DEVICE_ID(DeviceId) \
    ( \
      IS_PCH_H_SATA_AHCI_DEVICE_ID(DeviceId) || \
      IS_PCH_LP_SATA_AHCI_DEVICE_ID(DeviceId) \
    )
 
//
//  SATA RAID Device ID macros
//
#define IS_PCH_H_SATA_RAID_DEVICE_ID(DeviceId) \
    ( \
      (DeviceId == V_CNL_PCH_H_SATA_CFG_DEVICE_ID_D_RAID) || \
      (DeviceId == V_CNL_PCH_H_SATA_CFG_DEVICE_ID_MH_RAID) || \
      (DeviceId == V_CNL_PCH_H_SATA_CFG_DEVICE_ID_D_RAID_PREM) || \
      (DeviceId == V_CNL_PCH_H_SATA_CFG_DEVICE_ID_MH_RAID_PREM) || \
      (DeviceId == V_CNL_PCH_H_SATA_CFG_DEVICE_ID_D_RAID_IBC) || \
      (DeviceId == V_CNL_PCH_H_SATA_CFG_DEVICE_ID_D_RAID_IBC_RST) || \
      (DeviceId == V_CNL_PCH_H_SATA_CFG_DEVICE_ID_D_RAID_IBC_2) || \
      (DeviceId == V_PCH_H_SATA_CFG_DEVICE_ID_D_RAID_ALTDIS) || \
      (DeviceId == V_PCH_H_SATA_CFG_DEVICE_ID_D_RAID_RSTE) \
    )
 
#define IS_PCH_LP_SATA_RAID_DEVICE_ID(DeviceId) \
    ( \
      (DeviceId == V_CNL_PCH_LP_SATA_CFG_DEVICE_ID_M_RAID) || \
      (DeviceId == V_CNL_PCH_LP_SATA_CFG_DEVICE_ID_M_RAID_PREM) || \
      (DeviceId == V_CNL_PCH_LP_SATA_CFG_DEVICE_ID_M_RAID_IBC) \
    )
 
#define IS_PCH_SATA_RAID_DEVICE_ID(DeviceId) \
    ( \
      IS_PCH_H_SATA_RAID_DEVICE_ID(DeviceId) || \
      IS_PCH_LP_SATA_RAID_DEVICE_ID(DeviceId) \
    )
 
//
//  Combined SATA IDE/AHCI/RAID Device ID macros
//
#define IS_PCH_H_SATA_DEVICE_ID(DeviceId) \
    ( \
      IS_PCH_H_SATA_AHCI_DEVICE_ID(DeviceId) || \
      IS_PCH_H_SATA_RAID_DEVICE_ID(DeviceId) \
    )
 
#define IS_PCH_LP_SATA_DEVICE_ID(DeviceId) \
    ( \
      IS_PCH_LP_SATA_AHCI_DEVICE_ID(DeviceId) || \
      IS_PCH_LP_SATA_RAID_DEVICE_ID(DeviceId) \
    )
#define IS_PCH_SATA_DEVICE_ID(DeviceId) \
    ( \
      IS_PCH_H_SATA_DEVICE_ID(DeviceId) || \
      IS_PCH_LP_SATA_DEVICE_ID(DeviceId) \
    )
 
#endif