Annotation of qemu/roms/ipxe/src/net/infiniband/ib_sma.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (C) 2009 Michael Brown <[email protected]>.
        !             3:  *
        !             4:  * This program is free software; you can redistribute it and/or
        !             5:  * modify it under the terms of the GNU General Public License as
        !             6:  * published by the Free Software Foundation; either version 2 of the
        !             7:  * License, or any later version.
        !             8:  *
        !             9:  * This program is distributed in the hope that it will be useful, but
        !            10:  * WITHOUT ANY WARRANTY; without even the implied warranty of
        !            11:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
        !            12:  * General Public License for more details.
        !            13:  *
        !            14:  * You should have received a copy of the GNU General Public License
        !            15:  * along with this program; if not, write to the Free Software
        !            16:  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
        !            17:  */
        !            18: 
        !            19: FILE_LICENCE ( GPL2_OR_LATER );
        !            20: 
        !            21: #include <stdint.h>
        !            22: #include <stdlib.h>
        !            23: #include <string.h>
        !            24: #include <errno.h>
        !            25: #include <stdio.h>
        !            26: #include <unistd.h>
        !            27: #include <byteswap.h>
        !            28: #include <ipxe/settings.h>
        !            29: #include <ipxe/infiniband.h>
        !            30: #include <ipxe/iobuf.h>
        !            31: #include <ipxe/ib_mi.h>
        !            32: #include <ipxe/ib_sma.h>
        !            33: 
        !            34: /**
        !            35:  * @file
        !            36:  *
        !            37:  * Infiniband Subnet Management Agent
        !            38:  *
        !            39:  */
        !            40: 
        !            41: /**
        !            42:  * Node information
        !            43:  *
        !            44:  * @v ibdev            Infiniband device
        !            45:  * @v mi               Management interface
        !            46:  * @v mad              Received MAD
        !            47:  * @v av               Source address vector
        !            48:  */
        !            49: static void ib_sma_node_info ( struct ib_device *ibdev,
        !            50:                               struct ib_mad_interface *mi,
        !            51:                               union ib_mad *mad,
        !            52:                               struct ib_address_vector *av ) {
        !            53:        struct ib_node_info *node_info = &mad->smp.smp_data.node_info;
        !            54:        int rc;
        !            55: 
        !            56:        /* Fill in information */
        !            57:        memset ( node_info, 0, sizeof ( *node_info ) );
        !            58:        node_info->base_version = IB_MGMT_BASE_VERSION;
        !            59:        node_info->class_version = IB_SMP_CLASS_VERSION;
        !            60:        node_info->node_type = IB_NODE_TYPE_HCA;
        !            61:        node_info->num_ports = ib_count_ports ( ibdev );
        !            62:        memcpy ( &node_info->sys_guid, &ibdev->node_guid,
        !            63:                 sizeof ( node_info->sys_guid ) );
        !            64:        memcpy ( &node_info->node_guid, &ibdev->node_guid,
        !            65:                 sizeof ( node_info->node_guid ) );
        !            66:        memcpy ( &node_info->port_guid, &ibdev->gid.s.guid,
        !            67:                 sizeof ( node_info->port_guid ) );
        !            68:        node_info->partition_cap = htons ( 1 );
        !            69:        node_info->local_port_num = ibdev->port;
        !            70: 
        !            71:        /* Send GetResponse */
        !            72:        mad->hdr.method = IB_MGMT_METHOD_GET_RESP;
        !            73:        if ( ( rc = ib_mi_send ( ibdev, mi, mad, av ) ) != 0 ) {
        !            74:                DBGC ( mi, "SMA %p could not send NodeInfo GetResponse: %s\n",
        !            75:                       mi, strerror ( rc ) );
        !            76:                return;
        !            77:        }
        !            78: }
        !            79: 
        !            80: /**
        !            81:  * Node description
        !            82:  *
        !            83:  * @v ibdev            Infiniband device
        !            84:  * @v mi               Management interface
        !            85:  * @v mad              Received MAD
        !            86:  * @v av               Source address vector
        !            87:  */
        !            88: static void ib_sma_node_desc ( struct ib_device *ibdev,
        !            89:                               struct ib_mad_interface *mi,
        !            90:                               union ib_mad *mad,
        !            91:                               struct ib_address_vector *av ) {
        !            92:        struct ib_node_desc *node_desc = &mad->smp.smp_data.node_desc;
        !            93:        union ib_guid *guid = &ibdev->node_guid;
        !            94:        char hostname[ sizeof ( node_desc->node_string ) ];
        !            95:        int hostname_len;
        !            96:        int rc;
        !            97: 
        !            98:        /* Fill in information */
        !            99:        memset ( node_desc, 0, sizeof ( *node_desc ) );
        !           100:        hostname_len = fetch_string_setting ( NULL, &hostname_setting,
        !           101:                                              hostname, sizeof ( hostname ) );
        !           102:        snprintf ( node_desc->node_string, sizeof ( node_desc->node_string ),
        !           103:                   "iPXE %s%s%02x:%02x:%02x:%02x:%02x:%02x:%02x:%02x (%s)",
        !           104:                   hostname, ( ( hostname_len >= 0 ) ? " " : "" ),
        !           105:                   guid->bytes[0], guid->bytes[1], guid->bytes[2],
        !           106:                   guid->bytes[3], guid->bytes[4], guid->bytes[5],
        !           107:                   guid->bytes[6], guid->bytes[7], ibdev->dev->name );
        !           108: 
        !           109:        /* Send GetResponse */
        !           110:        mad->hdr.method = IB_MGMT_METHOD_GET_RESP;
        !           111:        if ( ( rc = ib_mi_send ( ibdev, mi, mad, av ) ) != 0 ) {
        !           112:                DBGC ( mi, "SMA %p could not send NodeDesc GetResponse: %s\n",
        !           113:                       mi, strerror ( rc ) );
        !           114:                return;
        !           115:        }
        !           116: }
        !           117: 
        !           118: /**
        !           119:  * GUID information
        !           120:  *
        !           121:  * @v ibdev            Infiniband device
        !           122:  * @v mi               Management interface
        !           123:  * @v mad              Received MAD
        !           124:  * @v av               Source address vector
        !           125:  */
        !           126: static void ib_sma_guid_info ( struct ib_device *ibdev,
        !           127:                               struct ib_mad_interface *mi,
        !           128:                               union ib_mad *mad,
        !           129:                               struct ib_address_vector *av ) {
        !           130:        struct ib_guid_info *guid_info = &mad->smp.smp_data.guid_info;
        !           131:        int rc;
        !           132: 
        !           133:        /* Fill in information */
        !           134:        memset ( guid_info, 0, sizeof ( *guid_info ) );
        !           135:        memcpy ( guid_info->guid[0], &ibdev->gid.s.guid,
        !           136:                 sizeof ( guid_info->guid[0] ) );
        !           137: 
        !           138:        /* Send GetResponse */
        !           139:        mad->hdr.method = IB_MGMT_METHOD_GET_RESP;
        !           140:        if ( ( rc = ib_mi_send ( ibdev, mi, mad, av ) ) != 0 ) {
        !           141:                DBGC ( mi, "SMA %p could not send GuidInfo GetResponse: %s\n",
        !           142:                       mi, strerror ( rc ) );
        !           143:                return;
        !           144:        }
        !           145: }
        !           146: 
        !           147: /**
        !           148:  * Set port information
        !           149:  *
        !           150:  * @v ibdev            Infiniband device
        !           151:  * @v mi               Management interface
        !           152:  * @v mad              Received MAD
        !           153:  * @ret rc             Return status code
        !           154:  */
        !           155: static int ib_sma_set_port_info ( struct ib_device *ibdev,
        !           156:                                  struct ib_mad_interface *mi,
        !           157:                                  union ib_mad *mad ) {
        !           158:        const struct ib_port_info *port_info = &mad->smp.smp_data.port_info;
        !           159:        unsigned int link_width_enabled;
        !           160:        unsigned int link_speed_enabled;
        !           161:        int rc;
        !           162: 
        !           163:        /* Set parameters */
        !           164:        memcpy ( &ibdev->gid.s.prefix, port_info->gid_prefix,
        !           165:                 sizeof ( ibdev->gid.s.prefix ) );
        !           166:        ibdev->lid = ntohs ( port_info->lid );
        !           167:        ibdev->sm_lid = ntohs ( port_info->mastersm_lid );
        !           168:        if ( ( link_width_enabled = port_info->link_width_enabled ) )
        !           169:                ibdev->link_width_enabled = link_width_enabled;
        !           170:        if ( ( link_speed_enabled =
        !           171:               ( port_info->link_speed_active__link_speed_enabled & 0xf ) ) )
        !           172:                ibdev->link_speed_enabled = link_speed_enabled;
        !           173:        ibdev->sm_sl = ( port_info->neighbour_mtu__mastersm_sl & 0xf );
        !           174:        DBGC ( mi, "SMA %p set LID %04x SMLID %04x link width %02x speed "
        !           175:               "%02x\n", mi, ibdev->lid, ibdev->sm_lid,
        !           176:               ibdev->link_width_enabled, ibdev->link_speed_enabled );
        !           177: 
        !           178:        /* Update parameters on device */
        !           179:        if ( ( rc = ib_set_port_info ( ibdev, mad ) ) != 0 ) {
        !           180:                DBGC ( mi, "SMA %p could not set port information: %s\n",
        !           181:                       mi, strerror ( rc ) );
        !           182:                return rc;
        !           183:        }
        !           184: 
        !           185:        return 0;
        !           186: }
        !           187: 
        !           188: /**
        !           189:  * Port information
        !           190:  *
        !           191:  * @v ibdev            Infiniband device
        !           192:  * @v mi               Management interface
        !           193:  * @v mad              Received MAD
        !           194:  * @v av               Source address vector
        !           195:  */
        !           196: static void ib_sma_port_info ( struct ib_device *ibdev,
        !           197:                               struct ib_mad_interface *mi,
        !           198:                               union ib_mad *mad,
        !           199:                               struct ib_address_vector *av ) {
        !           200:        struct ib_port_info *port_info = &mad->smp.smp_data.port_info;
        !           201:        int rc;
        !           202: 
        !           203:        /* Set parameters if applicable */
        !           204:        if ( mad->hdr.method == IB_MGMT_METHOD_SET ) {
        !           205:                if ( ( rc = ib_sma_set_port_info ( ibdev, mi, mad ) ) != 0 ) {
        !           206:                        mad->hdr.status =
        !           207:                              htons ( IB_MGMT_STATUS_UNSUPPORTED_METHOD_ATTR );
        !           208:                        /* Fall through to generate GetResponse */
        !           209:                }
        !           210:        }
        !           211: 
        !           212:        /* Fill in information */
        !           213:        memset ( port_info, 0, sizeof ( *port_info ) );
        !           214:        memcpy ( port_info->gid_prefix, &ibdev->gid.s.prefix,
        !           215:                 sizeof ( port_info->gid_prefix ) );
        !           216:        port_info->lid = ntohs ( ibdev->lid );
        !           217:        port_info->mastersm_lid = ntohs ( ibdev->sm_lid );
        !           218:        port_info->local_port_num = ibdev->port;
        !           219:        port_info->link_width_enabled = ibdev->link_width_enabled;
        !           220:        port_info->link_width_supported = ibdev->link_width_supported;
        !           221:        port_info->link_width_active = ibdev->link_width_active;
        !           222:        port_info->link_speed_supported__port_state =
        !           223:                ( ( ibdev->link_speed_supported << 4 ) | ibdev->port_state );
        !           224:        port_info->port_phys_state__link_down_def_state =
        !           225:                ( ( IB_PORT_PHYS_STATE_POLLING << 4 ) |
        !           226:                  IB_PORT_PHYS_STATE_POLLING );
        !           227:        port_info->link_speed_active__link_speed_enabled =
        !           228:                ( ( ibdev->link_speed_active << 4 ) |
        !           229:                  ibdev->link_speed_enabled );
        !           230:        port_info->neighbour_mtu__mastersm_sl =
        !           231:                ( ( IB_MTU_2048 << 4 ) | ibdev->sm_sl );
        !           232:        port_info->vl_cap__init_type = ( IB_VL_0 << 4 );
        !           233:        port_info->init_type_reply__mtu_cap = IB_MTU_2048;
        !           234:        port_info->operational_vls__enforcement = ( IB_VL_0 << 4 );
        !           235:        port_info->guid_cap = 1;
        !           236: 
        !           237:        /* Send GetResponse */
        !           238:        mad->hdr.method = IB_MGMT_METHOD_GET_RESP;
        !           239:        if ( ( rc = ib_mi_send ( ibdev, mi, mad, av ) ) != 0 ) {
        !           240:                DBGC ( mi, "SMA %p could not send PortInfo GetResponse: %s\n",
        !           241:                       mi, strerror ( rc ) );
        !           242:                return;
        !           243:        }
        !           244: }
        !           245: 
        !           246: /**
        !           247:  * Set partition key table
        !           248:  *
        !           249:  * @v ibdev            Infiniband device
        !           250:  * @v mi               Management interface
        !           251:  * @v mad              Received MAD
        !           252:  * @ret rc             Return status code
        !           253:  */
        !           254: static int ib_sma_set_pkey_table ( struct ib_device *ibdev,
        !           255:                                   struct ib_mad_interface *mi,
        !           256:                                   union ib_mad *mad ) {
        !           257:        struct ib_pkey_table *pkey_table = &mad->smp.smp_data.pkey_table;
        !           258:        int rc;
        !           259: 
        !           260:        /* Set parameters */
        !           261:        ibdev->pkey = ntohs ( pkey_table->pkey[0] );
        !           262:        DBGC ( mi, "SMA %p set pkey %04x\n", mi, ibdev->pkey );
        !           263: 
        !           264:        /* Update parameters on device */
        !           265:        if ( ( rc = ib_set_pkey_table ( ibdev, mad ) ) != 0 ) {
        !           266:                DBGC ( mi, "SMA %p could not set pkey table: %s\n",
        !           267:                       mi, strerror ( rc ) );
        !           268:                return rc;
        !           269:        }
        !           270: 
        !           271:        return 0;
        !           272: }
        !           273: 
        !           274: /**
        !           275:  * Partition key table
        !           276:  *
        !           277:  * @v ibdev            Infiniband device
        !           278:  * @v mi               Management interface
        !           279:  * @v mad              Received MAD
        !           280:  * @v av               Source address vector
        !           281:  */
        !           282: static void ib_sma_pkey_table ( struct ib_device *ibdev,
        !           283:                                struct ib_mad_interface *mi,
        !           284:                                union ib_mad *mad,
        !           285:                                struct ib_address_vector *av ) {
        !           286:        struct ib_pkey_table *pkey_table = &mad->smp.smp_data.pkey_table;
        !           287:        int rc;
        !           288: 
        !           289:        /* Set parameters, if applicable */
        !           290:        if ( mad->hdr.method == IB_MGMT_METHOD_SET ) {
        !           291:                if ( ( rc = ib_sma_set_pkey_table ( ibdev, mi, mad ) ) != 0 ) {
        !           292:                        mad->hdr.status =
        !           293:                              htons ( IB_MGMT_STATUS_UNSUPPORTED_METHOD_ATTR );
        !           294:                        /* Fall through to generate GetResponse */
        !           295:                }
        !           296:        }
        !           297: 
        !           298:        /* Fill in information */
        !           299:        mad->hdr.method = IB_MGMT_METHOD_GET_RESP;
        !           300:        memset ( pkey_table, 0, sizeof ( *pkey_table ) );
        !           301:        pkey_table->pkey[0] = htons ( ibdev->pkey );
        !           302: 
        !           303:        /* Send GetResponse */
        !           304:        mad->hdr.method = IB_MGMT_METHOD_GET_RESP;
        !           305:        if ( ( rc = ib_mi_send ( ibdev, mi, mad, av ) ) != 0 ) {
        !           306:                DBGC ( mi, "SMA %p could not send PKeyTable GetResponse: %s\n",
        !           307:                       mi, strerror ( rc ) );
        !           308:                return;
        !           309:        }
        !           310: }
        !           311: 
        !           312: /** Subnet management agent */
        !           313: struct ib_mad_agent ib_sma_agent[] __ib_mad_agent = {
        !           314:        {
        !           315:                .mgmt_class = IB_MGMT_CLASS_SUBN_LID_ROUTED,
        !           316:                .class_version = IB_SMP_CLASS_VERSION,
        !           317:                .attr_id = htons ( IB_SMP_ATTR_NODE_INFO ),
        !           318:                .handle = ib_sma_node_info,
        !           319:        },
        !           320:        {
        !           321:                .mgmt_class = IB_MGMT_CLASS_SUBN_LID_ROUTED,
        !           322:                .class_version = IB_SMP_CLASS_VERSION,
        !           323:                .attr_id = htons ( IB_SMP_ATTR_NODE_DESC ),
        !           324:                .handle = ib_sma_node_desc,
        !           325:        },
        !           326:        {
        !           327:                .mgmt_class = IB_MGMT_CLASS_SUBN_LID_ROUTED,
        !           328:                .class_version = IB_SMP_CLASS_VERSION,
        !           329:                .attr_id = htons ( IB_SMP_ATTR_GUID_INFO ),
        !           330:                .handle = ib_sma_guid_info,
        !           331:        },
        !           332:        {
        !           333:                .mgmt_class = IB_MGMT_CLASS_SUBN_LID_ROUTED,
        !           334:                .class_version = IB_SMP_CLASS_VERSION,
        !           335:                .attr_id = htons ( IB_SMP_ATTR_PORT_INFO ),
        !           336:                .handle = ib_sma_port_info,
        !           337:        },
        !           338:        {
        !           339:                .mgmt_class = IB_MGMT_CLASS_SUBN_LID_ROUTED,
        !           340:                .class_version = IB_SMP_CLASS_VERSION,
        !           341:                .attr_id = htons ( IB_SMP_ATTR_PKEY_TABLE ),
        !           342:                .handle = ib_sma_pkey_table,
        !           343:        },
        !           344: };
        !           345: 
        !           346: /**
        !           347:  * Create subnet management agent and interface
        !           348:  *
        !           349:  * @v ibdev            Infiniband device
        !           350:  * @v mi               Management interface
        !           351:  * @ret rc             Return status code
        !           352:  */
        !           353: int ib_create_sma ( struct ib_device *ibdev, struct ib_mad_interface *mi ) {
        !           354: 
        !           355:        /* Nothing to do */
        !           356:        DBGC ( ibdev, "IBDEV %p SMA using SMI %p\n", ibdev, mi );
        !           357: 
        !           358:        return 0;
        !           359: }
        !           360: 
        !           361: /**
        !           362:  * Destroy subnet management agent and interface
        !           363:  *
        !           364:  * @v ibdev            Infiniband device
        !           365:  * @v mi               Management interface
        !           366:  */
        !           367: void ib_destroy_sma ( struct ib_device *ibdev __unused,
        !           368:                      struct ib_mad_interface *mi __unused ) {
        !           369:        /* Nothing to do */
        !           370: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.