[infiniband] Add support for SRP over Infiniband
[people/pravin/gpxe.git] / src / arch / i386 / interface / pcbios / ib_srpboot.c
1 #include <stdint.h>
2 #include <string.h>
3 #include <stdlib.h>
4 #include <stdio.h>
5 #include <errno.h>
6 #include <gpxe/sanboot.h>
7 #include <int13.h>
8 #include <gpxe/srp.h>
9
10 FILE_LICENCE ( GPL2_OR_LATER );
11
12 static int ib_srpboot ( const char *root_path ) {
13         struct scsi_device *scsi;
14         struct int13_drive *drive;
15         int rc;
16
17         scsi = zalloc ( sizeof ( *scsi ) );
18         if ( ! scsi ) {
19                 rc = -ENOMEM;
20                 goto err_alloc_scsi;
21         }
22         drive = zalloc ( sizeof ( *drive ) );
23         if ( ! drive ) {
24                 rc = -ENOMEM;
25                 goto err_alloc_drive;
26         }
27
28         if ( ( rc = srp_attach ( scsi, root_path ) ) != 0 ) {
29                 printf ( "Could not attach IB_SRP device: %s\n",
30                          strerror ( rc ) );
31                 goto err_attach;
32         }
33         if ( ( rc = init_scsidev ( scsi ) ) != 0 ) {
34                 printf ( "Could not initialise IB_SRP device: %s\n",
35                          strerror ( rc ) );
36                 goto err_init;
37         }
38
39         drive->blockdev = &scsi->blockdev;
40
41         register_int13_drive ( drive );
42         printf ( "Registered as BIOS drive %#02x\n", drive->drive );
43         printf ( "Booting from BIOS drive %#02x\n", drive->drive );
44         rc = int13_boot ( drive->drive );
45         printf ( "Boot failed\n" );
46
47         printf ( "Unregistering BIOS drive %#02x\n", drive->drive );
48         unregister_int13_drive ( drive );
49
50  err_init:
51         srp_detach ( scsi );
52  err_attach:
53         free ( drive );
54  err_alloc_drive:
55         free ( scsi );
56  err_alloc_scsi:
57         return rc;
58 }
59
60 struct sanboot_protocol ib_srp_sanboot_protocol __sanboot_protocol = {
61         .prefix = "ib_srp:",
62         .boot = ib_srpboot,
63 };