[driver] Add sBFT detection and debug parsing
[sanbootconf.git] / driver / sbft.c
1 /*
2  * Copyright (C) 2009 Fen Systems Ltd <mbrown@fensystems.co.uk>.
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  *
9  *   Redistributions of source code must retain the above copyright
10  *   notice, this list of conditions and the following disclaimer.
11  *
12  *   Redistributions in binary form must reproduce the above copyright
13  *   notice, this list of conditions and the following disclaimer in
14  *   the documentation and/or other materials provided with the
15  *   distribution.
16  *
17  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
20  * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
21  * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
22  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
28  * OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30
31 #include <ntddk.h>
32 #include <ntstrsafe.h>
33 #include "sanbootconf.h"
34 #include "sbft.h"
35
36 /**
37  * Parse sBFT SCSI subtable
38  *
39  * @v sbft              sBFT
40  * @v scsi              SCSI subtable
41  */
42 static VOID parse_sbft_scsi ( PSBFT_TABLE sbft, PSBFT_SCSI_SUBTABLE scsi ) {
43
44         DbgPrint ( "Found sBFT SCSI subtable:\n" );
45         DbgPrint ( "  LUN = %04x-%04x-%04x-%04x\n",
46                    ( ( scsi->lun >> 48 ) & 0xffff ),
47                    ( ( scsi->lun >> 32 ) & 0xffff ),
48                    ( ( scsi->lun >> 16 ) & 0xffff ),
49                    ( ( scsi->lun >> 0  ) & 0xffff ) );
50         ( VOID ) sbft;
51 }
52
53 /**
54  * Parse sBFT SRP subtable
55  *
56  * @v sbft              sBFT
57  * @v srp               SRP subtable
58  */
59 static VOID parse_sbft_srp ( PSBFT_TABLE sbft, PSBFT_SRP_SUBTABLE srp ) {
60
61         DbgPrint ( "Found sBFT SRP subtable:\n" );
62         DbgPrint ( "  Initiator port ID = 0x%08x%08x%08x%08x\n",
63                    RtlUlongByteSwap ( srp->initiator_port_id.u.dwords[0] ),
64                    RtlUlongByteSwap ( srp->initiator_port_id.u.dwords[1] ),
65                    RtlUlongByteSwap ( srp->initiator_port_id.u.dwords[2] ),
66                    RtlUlongByteSwap ( srp->initiator_port_id.u.dwords[3] ) );
67         DbgPrint ( "  Target port ID = 0x%08x%08x%08x%08x\n",
68                    RtlUlongByteSwap ( srp->target_port_id.u.dwords[0] ),
69                    RtlUlongByteSwap ( srp->target_port_id.u.dwords[1] ),
70                    RtlUlongByteSwap ( srp->target_port_id.u.dwords[2] ),
71                    RtlUlongByteSwap ( srp->target_port_id.u.dwords[3] ) );
72         ( VOID ) sbft;
73 }
74
75 /**
76  * Parse sBFT IB subtable
77  *
78  * @v sbft              sBFT
79  * @v ib                IB subtable
80  */
81 static VOID parse_sbft_ib ( PSBFT_TABLE sbft, PSBFT_IB_SUBTABLE ib ) {
82
83         DbgPrint ( "Found sBFT IB subtable:\n" );
84         DbgPrint ( "  Source GID = 0x%08x%08x%08x%08x\n",
85                    RtlUlongByteSwap ( ib->sgid.u.dwords[0] ),
86                    RtlUlongByteSwap ( ib->sgid.u.dwords[1] ),
87                    RtlUlongByteSwap ( ib->sgid.u.dwords[2] ),
88                    RtlUlongByteSwap ( ib->sgid.u.dwords[3] ) );
89         DbgPrint ( "  Destination GID = 0x%08x%08x%08x%08x\n",
90                    RtlUlongByteSwap ( ib->dgid.u.dwords[0] ),
91                    RtlUlongByteSwap ( ib->dgid.u.dwords[1] ),
92                    RtlUlongByteSwap ( ib->dgid.u.dwords[2] ),
93                    RtlUlongByteSwap ( ib->dgid.u.dwords[3] ) );
94         DbgPrint ( "  Service ID = 0x%08x%08x\n",
95                    RtlUlongByteSwap ( ib->service_id.u.dwords[0] ),
96                    RtlUlongByteSwap ( ib->service_id.u.dwords[1] ) );
97         DbgPrint ( "  Partition key = 0x%04x\n", ib->pkey );
98         ( VOID ) sbft;
99 }
100
101 /**
102  * Parse sBFT
103  *
104  * @v sbft              sBFT
105  */
106 VOID parse_sbft ( PSBFT_TABLE sbft ) {
107         PSBFT_SCSI_SUBTABLE scsi;
108         PSBFT_SRP_SUBTABLE srp;
109         PSBFT_IB_SUBTABLE ib;
110
111         if ( sbft->scsi_offset ) {
112                 scsi = ( ( PSBFT_SCSI_SUBTABLE )
113                          ( ( PUCHAR ) sbft + sbft->scsi_offset ) );
114                 parse_sbft_scsi ( sbft, scsi );
115         }
116         if ( sbft->srp_offset ) {
117                 srp = ( ( PSBFT_SRP_SUBTABLE )
118                         ( ( PUCHAR ) sbft + sbft->srp_offset ) );
119                 parse_sbft_srp ( sbft, srp );
120         }
121         if ( sbft->ib_offset ) {
122                 ib = ( ( PSBFT_IB_SUBTABLE )
123                        ( ( PUCHAR ) sbft + sbft->ib_offset ) );
124                 parse_sbft_ib ( sbft, ib );
125         }
126 }