Commit patch to Inifiniband support and additional support information
authortimlegge <timlegge>
Fri, 10 Feb 2006 00:44:10 +0000 (00:44 +0000)
committertimlegge <timlegge>
Fri, 10 Feb 2006 00:44:10 +0000 (00:44 +0000)
12 files changed:
LOG
src/drivers/net/mlx_ipoib/doc/README.boot_over_ib [new file with mode: 0644]
src/drivers/net/mlx_ipoib/ib_driver.c
src/drivers/net/mlx_ipoib/ib_mt23108.c
src/drivers/net/mlx_ipoib/ib_mt25218.c
src/drivers/net/mlx_ipoib/ipoib.c
src/drivers/net/mlx_ipoib/mt23108.c
src/drivers/net/mlx_ipoib/mt23108_imp.c
src/drivers/net/mlx_ipoib/mt25218.c
src/drivers/net/mlx_ipoib/mt25218_imp.c
src/drivers/net/mlx_ipoib/patches/dhcpd.patch [new file with mode: 0644]
src/drivers/net/mlx_ipoib/samples/dhcpd.conf [new file with mode: 0644]

diff --git a/LOG b/LOG
index 7cd034a..2491f44 100644 (file)
--- a/LOG
+++ b/LOG
@@ -2898,3 +2898,7 @@ Released as Etherboot 5.4.1 (production)
   support for their cards.  Thanks to Mellanox for their support of the 
   Etherboot project
 
++ Eli Cohen sent a patch for Infiniband to add a readme file, sample files to 
+  help configuring a DHCP server for use with Infiniband and add an option for
+  the user to print information that is helpful in configuring a DHCP server
+
diff --git a/src/drivers/net/mlx_ipoib/doc/README.boot_over_ib b/src/drivers/net/mlx_ipoib/doc/README.boot_over_ib
new file mode 100644 (file)
index 0000000..0773862
--- /dev/null
@@ -0,0 +1,176 @@
+.Boot over IB over Mellanox HCAs README - Pre-Alpha release
+==========================================================
+Document #2442, Rev 0.10, December 2005
+
+
+1. General
+-----------
+This README describes the Boot over IB package which enables booting a Linux 
+kernel from a remote server using one of the Mellanox Technologies HCA 
+devices. The package is based on Etherboot 5.4.1.
+
+The package actually implements a network driver for Etherboot. The wire 
+protocol is compliant with IP Over IB 
+(see http://www.ietf.org/html.charters/ipoib-charter.html for related 
+documents).
+
+Etherboot uses a traditional setup of a DHCP server and a TFTP server to 
+perform a remote boot in a similar manner to Ethernet NICs. The binary code is 
+exported by the device as an expansion ROM image.
+
+
+2. Supported Devices
+---------------------
+The following Mellanox Technologies HCA devices are supported:
+
+       PCI Device ID           Mellanox HCA Device
+       ----------------------------------------------
+       23108                   InfiniHost (P/N MT23108)
+       25208                   InfiniHost III Ex (P/N MT25208) (InfiniHost)
+       25218                   InfiniHost III Ex (P/N MT25208) (MemFree)
+       25204                   InfiniHost III Lx (P/N MT25204)
+
+       
+       Note:   For devices with more than one IB port, port 1 is used for 
+       communications.
+
+
+3. Compiling
+----------------
+From the src directory:
+Run" make bin/<device>.<ext>
+where device can be any of:
+       MT23108
+       MT25218
+       MT25208
+       MT25204
+       
+and ext can be rom, zrom etc. (see Etherbot doumentation for more details)
+
+4. Directory Structure
+-----------------------
+All driver files are available under src/drivers/net/mlx_ipoib/. Under this 
+directory the following files can be found:
+       
+       ***     doc - Contains related documents including this file.
+       ***             patches - Contains needed patch files.
+       ***     samples - Contains sample files.
+       ***     . Contains driver source files.
+       
+
+5. Burning the Flash Memory
+----------------------------
+The binary code resides in the same Flash device of the device firmware. 
+However the binary files are distinct and do not affect each other. Mellanox's 
+'mlxburn' tool is available for burning, however, it is not possible to burn 
+the expansion ROM image by itself; rather, both the firmware and expansion ROM 
+images must be burnt simultaneously.
+
+'mlxburn' is part of the Mellanox Firmware Tools (MFT) package         available for 
+download from www.mellanox.com under 'Firmware Downloads'.
+
+Example:
+The following command burns a firmware image and an expansion ROM image to an 
+InfiniHost Adapter Card (P/N MHX-CE128-T.ini):
+         
+   mlxburn -fw fw-23108-a1-rel.mlx -exp_rom MT23108.bin
+                        /dev/mst/mt23108_pci_cr0 -conf MHX-CE128-T.ini
+
+*** Important Note: The .ini file must support burning expansion ROMs. For 
+example, the following lines must appear in the .ini file. If they do not, 
+please add them        manually.
+
+[ADAPTER]
+exp_rom_en = true
+
+Mellanox's web site contains firmware binary files with extension .bin.gz. 
+These files contain contain EVERYTHING the goes in the flash memory and thus 
+are NOT suitable for including the expansion rom image. Therefore, one use the 
+files with .mlx extension also available from Mellanox's web site.
+
+       
+
+6. Preparing the DHCP Server
+-----------------------------
+DHCP messages over IP Over IB are transmitted as broadcasts. In order to 
+distinguish between messages belonging to a certain DHCP session, the messages 
+must carry the client identifier option (see ietf documentation        referred to 
+above). As of November 2005, ISC DHCP servers do not support this feature. 
+They are expected to support this at the end of 2005. In order to work this 
+out, the appropriate patch must be applied (see patches directory). It has 
+been tested on version isc-dhcpd-V3.0.4b2.
+
+The DHCP server must run on a machine which supports IP Over IB. The Mellanox 
+IBGD package (gen1 or gen2) can be used to provide this.
+To run the DHCP server from the command line use: dhcpd ib0
+
+7. DHCP Server Configuration File
+----------------------------------
+In order for the DHCP server to provide configuration records for clients, an 
+appropriate configuration file dhcpd.conf must be created and put under /etc/. 
+A sample configuration file with comments can be found in the samples directory.
+
+
+8. OpenSM
+----------
+To successfully boot over IB, the IB network must contain a Subnet Manager 
+which configures the IB network. OpenSM is part of the IBGD distribution and 
+can be used to accomplish that. Note that OpenSM may be run on the same host 
+running the DHCP server but it is not mandatory.
+
+
+9. TFTP Server
+---------------
+When the DHCP session is completed, the client has the IP address of the TFTP 
+server from which it should download the kernel image. This TFTP server must 
+run on a machine with InfiniBand support. The client loads first a loader 
+image based on PXE API which then loads the kernel image. The image can be 
+found in the Linux kernel homepage:
+
+http://www.kernel.org/pub/linux/boot/syslinux/
+
+
+10. BIOS Configuration
+-----------------------
+The expansion ROM image presents itself to the BIOS as a boot device. As a 
+result, the BIOS will add it to the list of boot devices. The priority of this 
+list can be modified when entering the BIOS setup. The boot over IB    image must 
+be set first for the BIOS to attempt to use it first.
+
+
+11. Operation
+--------------
+When booting the client, a message appears on the screen describing the device 
+found and the revision of the code. The user has 3 seconds to press a key for 
+increased functionality:
+'V' will increase verbosity.
+'I' will prinit some information to aid in configuring the DHCP configuration 
+    file. In this case the display will hold for 5 seconds to let the user 
+       grasp the information.
+       
+Note that increasing verbosity will significantly slow boot time and will 
+print lots of debug messages to the screen.
+
+
+12. Diskless Machines
+----------------------
+Most often it is required to boot a diskless machine. In these         cases the 
+kernel mounts its root file system over NFS over one of the interfaces. For 
+this to happen on a client with only InfiniBand interfaces, the kernel image 
+must be configured accordingly and must include IP Over IB support. This can 
+be achieved either by compiling this into the kernel or using initrd images 
+that contain IP Over IB support.
+
+
+13. Changing Defaults
+----------------------
+As stated the driver uses port 1 for its communications. To use another port 
+edit the file src/drivers/net/ib_driver.h and modify the definition of 
+PXE_IB_PORT.
+
+
+14. Installing a package from Mellanox
+--------------------------------------
+When using a package obtained from Mellanox Technologies' web site, the
+directory src/bin will contain the driver binary files. The files have a .bin
+extension and are equivalent to the same files with .zrom extension.
index 197bfc0..a46db7f 100644 (file)
@@ -90,6 +90,9 @@ static int ib_driver_init(struct pci_device *pci, udqp_t * ipoib_qph_p)
 
        ib_data.port = port;
 
+       if(print_info)
+               printf("boot port = %d\n", ib_data.port);
+
        rc = wait_logic_link_up(port);
        if (rc)
                return rc;
@@ -107,6 +110,18 @@ static int ib_driver_init(struct pci_device *pci, udqp_t * ipoib_qph_p)
 
        tprintf("get_guid_info() success");
 
+       /* this to flush stdout that contains previous chars */
+       printf("    \n");
+       if(print_info) {
+               __u8 *gid=ib_data.port_gid.raw;
+
+               printf("\n");
+               printf("port GID=%hhx:%hhx:%hhx:%hhx:%hhx:%hhx:%hhx:%hhx:"
+                      "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx:%hhx:%hhx\n",
+                      gid[0],gid[1],gid[2],gid[3],gid[4],gid[5],gid[6],gid[7],
+                      gid[8],gid[9],gid[10],gid[11],gid[12],gid[13],gid[14],gid[15]);
+       }
+
        rc = get_pkey_tbl(NULL, &status);
        if (rc) {
                eprintf("");
index 4871415..0291f46 100644 (file)
@@ -542,6 +542,12 @@ static int setup_hca(__u8 port, void **eq_p)
        } else {
                tprintf("cmd_query_fw() success");
 
+               if (print_info) {
+                       printf("FW ver = %d.%d.%d\n",
+                               qfw.fw_rev_major,
+                               qfw.fw_rev_minor,
+                               qfw.fw_rev_subminor);
+               }
                tprintf("fw_rev_major=%d", qfw.fw_rev_major);
                tprintf("fw_rev_minor=%d", qfw.fw_rev_minor);
                tprintf("fw_rev_subminor=%d", qfw.fw_rev_subminor);
index b46fcaa..11b25d4 100644 (file)
@@ -651,6 +651,13 @@ static int setup_hca(__u8 port, void **eq_p)
        else {
                tprintf("cmd_query_fw() success");
 
+               if (print_info) {
+                       printf("FW ver = %d.%d.%d\n",
+                       qfw.fw_rev_major,
+                       qfw.fw_rev_minor,
+                       qfw.fw_rev_subminor);
+               }
+
                tprintf("fw_rev_major=%d", qfw.fw_rev_major);
                tprintf("fw_rev_minor=%d", qfw.fw_rev_minor);
                tprintf("fw_rev_subminor=%d", qfw.fw_rev_subminor);
index fe9227b..85eaac7 100644 (file)
@@ -999,9 +999,8 @@ static int ipoib_init(struct pci_device *pci)
        ipoib_data.ipoib_qph = qph;
        ipoib_data.ipoib_qpn = ib_get_qpn(qph);
 
-       /* we need to print this so the system administrator
-          can use this to create dhcpd.conf file */
-       printf("\nlocal ipoib qpn=0x%x\n", ipoib_data.ipoib_qpn);
+       if(print_info)
+               printf("local ipoib qpn=0x%x\n", ipoib_data.ipoib_qpn);
 
        ipoib_data.bcast_av = ib_data.bcast_av;
        ipoib_data.port_gid_raw = ib_data.port_gid.raw;
index 52bfced..157995d 100644 (file)
@@ -24,13 +24,23 @@ Skeleton NIC driver for Etherboot
 
 /* NIC specific static variables go here */
 
-int prompt_key(int secs, int ch)
+int prompt_key(int secs, unsigned char *ch_p)
 {
        unsigned long tmo;
+       unsigned char ch;
 
        for (tmo = currticks() + secs * TICKS_PER_SEC; currticks() < tmo;) {
-               if (iskey() && (ch = getchar(), tolower(ch) == 'v')) {
-                       return 1;
+               if (iskey()) {
+                       ch = getchar();
+                       /* toupper does not work ... */
+                       if (ch == 'v')
+                               ch = 'V';
+                       if (ch == 'i')
+                               ch = 'I';
+                       if ((ch=='V') || (ch=='I')) {
+                               *ch_p = ch;
+                               return 1;
+                       }
                }
        }
 
@@ -167,6 +177,7 @@ static int tavor_probe(struct dev *dev, struct pci_device *pci)
 {
        struct nic *nic = (struct nic *)dev;
        int rc;
+       unsigned char user_request;
 
        if (pci->vendor != MELLANOX_VENDOR_ID) {
                eprintf("");
@@ -178,9 +189,19 @@ static int tavor_probe(struct dev *dev, struct pci_device *pci)
        printf("Build version = %s\n\n", build_revision);
 
        verbose_messages = 0;
-       printf("Press 'V' within 3 seconds to increase verbosity ... ");
-       if (prompt_key(3, 'v')) {
-               verbose_messages = 1;
+        print_info = 0;
+       printf("Press within 3 seconds:\n");
+       printf("V - to increase verbosity\n");
+       printf("I - to print information\n");
+       if (prompt_key(3, &user_request)) {
+               if (user_request == 'V') {
+                       printf("User selected verbose messages\n");
+                       verbose_messages = 1;
+               }
+               else if (user_request == 'I') {
+                       printf("User selected to print information\n");
+                       print_info = 1;
+               }
        }
        printf("\n");
 
@@ -188,6 +209,11 @@ static int tavor_probe(struct dev *dev, struct pci_device *pci)
 
        nic->priv_data = NULL;
        rc = probe_imp(pci, nic);
+
+       /* give the user a chance to look at the info */
+       if (print_info)
+               sleep(5);
+
        if (!rc) {
                /* store NIC parameters */
                nic->ioaddr = pci->ioaddr & ~3;
index 7fc7204..4e60166 100644 (file)
@@ -3,6 +3,7 @@ typedef uint16_t __u16;
 typedef uint8_t __u8;
 
 static int verbose_messages=0;
+static int print_info=0;
 static int fatal_condition=0;
 static int fw_fatal;
 
index a2c48bd..7866bf6 100644 (file)
@@ -24,13 +24,23 @@ Skeleton NIC driver for Etherboot
 
 /* NIC specific static variables go here */
 
-int prompt_key(int secs, int ch)
+int prompt_key(int secs, unsigned char *ch_p)
 {
        unsigned long tmo;
+       unsigned char ch;
 
        for (tmo = currticks() + secs * TICKS_PER_SEC; currticks() < tmo;) {
-               if (iskey() && (ch = getchar(), tolower(ch) == 'v')) {
-                       return 1;
+               if (iskey()) {
+                       ch = getchar();
+                       /* toupper does not work ... */
+                       if (ch == 'v')
+                               ch = 'V';
+                       if (ch == 'i')
+                               ch = 'I';
+                       if ((ch=='V') || (ch=='I')) {
+                               *ch_p = ch;
+                               return 1;
+                       }
                }
        }
 
@@ -167,6 +177,7 @@ static int mt25218_probe(struct dev *dev, struct pci_device *pci)
 {
        struct nic *nic = (struct nic *)dev;
        int rc;
+       unsigned char user_request;
 
        if (pci->vendor != MELLANOX_VENDOR_ID) {
                eprintf("");
@@ -178,9 +189,19 @@ static int mt25218_probe(struct dev *dev, struct pci_device *pci)
        printf("Build version = %s\n\n", build_revision);
 
        verbose_messages = 0;
-       printf("Press 'V' within 3 seconds to increase verbosity ... ");
-       if (prompt_key(3, 'v')) {
-               verbose_messages = 1;
+        print_info = 0;
+       printf("Press within 3 seconds:\n");
+       printf("V - to increase verbosity\n");
+       printf("I - to print information\n");
+       if (prompt_key(3, &user_request)) {
+               if (user_request == 'V') {
+                       printf("User selected verbose messages\n");
+                       verbose_messages = 1;
+               }
+               else if (user_request == 'I') {
+                       printf("User selected to print information\n");
+                       print_info = 1;
+               }
        }
        printf("\n");
 
@@ -188,6 +209,11 @@ static int mt25218_probe(struct dev *dev, struct pci_device *pci)
 
        nic->priv_data = NULL;
        rc = probe_imp(pci, nic);
+
+       /* give the user a chance to look at the info */
+       if (print_info)
+               sleep(5);
+
        if (!rc) {
                /* store NIC parameters */
                nic->ioaddr = pci->ioaddr & ~3;
index d7273fa..fe40704 100644 (file)
@@ -3,6 +3,7 @@ typedef uint16_t __u16;
 typedef uint8_t __u8;
 
 static int verbose_messages=0;
+static int print_info=0;
 static int fatal_condition=0;
 static int fw_fatal;
 
diff --git a/src/drivers/net/mlx_ipoib/patches/dhcpd.patch b/src/drivers/net/mlx_ipoib/patches/dhcpd.patch
new file mode 100644 (file)
index 0000000..e2d0a20
--- /dev/null
@@ -0,0 +1,23 @@
+diff -ru ../../orig/dhcp-3.0.4b2/common/options.c ./common/options.c
+--- ../../orig/dhcp-3.0.4b2/common/options.c   2005-11-02 01:19:03.000000000 +0200
++++ ./common/options.c 2005-12-06 14:38:17.000000000 +0200
+@@ -537,6 +537,7 @@
+       priority_list [priority_len++] = DHO_DHCP_LEASE_TIME;
+       priority_list [priority_len++] = DHO_DHCP_MESSAGE;
+       priority_list [priority_len++] = DHO_DHCP_REQUESTED_ADDRESS;
++      priority_list [priority_len++] = DHO_DHCP_CLIENT_IDENTIFIER;
+       priority_list [priority_len++] = DHO_FQDN;
+       if (prl && prl -> len > 0) {
+diff -ru ../../orig/dhcp-3.0.4b2/includes/site.h ./includes/site.h
+--- ../../orig/dhcp-3.0.4b2/includes/site.h    2002-03-12 20:33:39.000000000 +0200
++++ ./includes/site.h  2005-12-06 14:36:55.000000000 +0200
+@@ -135,7 +135,7 @@
+    the aforementioned problems do not matter to you, or if no other
+    API is supported for your system, you may want to go with it. */
+-/* #define USE_SOCKETS */
++#define USE_SOCKETS
+ /* Define this to use the Sun Streams NIT API.
diff --git a/src/drivers/net/mlx_ipoib/samples/dhcpd.conf b/src/drivers/net/mlx_ipoib/samples/dhcpd.conf
new file mode 100644 (file)
index 0000000..ed6975f
--- /dev/null
@@ -0,0 +1,56 @@
+# dhcpd.conf
+#
+# Sample configuration file for ISC dhcpd
+#
+
+# option definitions common to all supported networks...
+
+DHCPD_INTERFACE = "ib0";
+
+# if you do not use dynamical DNS updates:
+#
+# this statement is needed by dhcpd-3 needs at least this statement.
+# you have to delete it for dhcpd-2, because it does not know it.
+#
+# if you want to use dynamical DNS updates, you should first read
+# read /usr/share/doc/packages/dhcp-server/DDNS-howto.txt
+ddns-update-style none; ddns-updates off;
+
+filename "pxelinux.bin";
+
+# If this DHCP server is the official DHCP server for the local
+# network, the authoritative directive should be uncommented.
+#authoritative;
+
+# No service will be given on this subnet, but declaring it helps the 
+# DHCP server to understand the network topology.
+
+subnet 10.152.187.0 netmask 255.255.255.0 {
+}
+
+# This declaration allows BOOTP clients to get dynamic addresses,
+# which we don't really recommend.
+
+shared-network "ipoib_network" {
+       subnet 11.4.8.0 netmask 255.255.255.0 {
+               option dhcp-client-identifier = option dhcp-client-identifier;
+               option subnet-mask 255.255.255.0;
+               option domain-name "yok.mtl.com";
+               option domain-name-servers  10.0.0.1;
+               default-lease-time 28800;
+               max-lease-time 86400;
+               next-server 11.4.8.99;
+
+       }
+}
+
+
+# You need one such entry for each client
+host swlab35 {
+       fixed-address 11.4.8.35; # the IP address to be assigned to the client 
+       # The value of the client identifier must be comprised from the prefix 20:00:
+       # folowed by the client's ipoib qp number - 55:04:01 in this example -
+       # followed by the GID of the port
+       option  dhcp-client-identifier = 20:00:55:04:01:fe:80:00:00:00:00:00:00:00:02:c9:00:01:70:8a:81;
+}
+