ehca: InfiniBand query and multicast functionality
PATCH 5/16 ehca: InfiniBand query and multicast functionality
ehca_hca.c | 286 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ehca_mcast.c | 198 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 484 insertions(+)
drivers/infiniband/hw/ehca/ehca_hca.c +286 -0
@@ -0,0 +1,286 @@ +/* +* IBM eServer eHCA Infiniband device driver for Linux on POWER +* +* HCA query functions +* +* Authors: Heiko J Schick <[email protected]> +* Christoph Raisch <[email protected]> +* +* Copyright (c) 2005 IBM Corporation +* +* All rights reserved. +* +* This source code is distributed under a dual license of GPL v2.0 and OpenIB +* BSD. +* +* OpenIB BSD License +* +* Redistribution and use in source and binary forms, with or without +* modification, are permitted provided that the following conditions are met: +* +* Redistributions of source code must retain the above copyright notice, this +* list of conditions and the following disclaimer. +* +* Redistributions in binary form must reproduce the above copyright notice, +* this list of conditions and the following disclaimer in the documentation +* and/or other materials +* provided with the distribution. +* +* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE +* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR +* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +* IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +* POSSIBILITY OF SUCH DAMAGE. +* +* $Id: ehca_hca.c,v 1.13 2006/04/25 07:32:54 schickhj Exp $ +*/ + +#undef DEB_PREFIX +#define DEB_PREFIX "shca" + +#include "ehca_kernel.h" +#include "ehca_tools.h" + +#include "hcp_if.h" + +#define TO_MAX_INT (dest, src) \ + if (src >= INT_MAX) \ + dest = INT_MAX; \ + else \ + dest = src + +int ehca_query_device (struct ib_device *ibdev,struct ib_device_attr *props) +{ +int ret =0 ; +struct ehca_shca *shca; +struct hipz_query_hca *rblock; + +EDEB_EN (7 ,"" ); + +memset (props,0 ,sizeof (struct ib_device_attr )); + shca = container_of(ibdev, struct ehca_shca, ib_device); + + rblock =kzalloc (H_CB_ALIGNMENT ,GFP_KERNEL ); +if (!rblock) { +EDEB_ERR (4 ,"Can't allocate rblock memory." ); + ret = -ENOMEM ; + goto query_device0; + } + +if (hipz_h_query_hca (shca->ipz_hca_handle, rblock) !=H_SUCCESS ) { +EDEB_ERR (4 ,"Can't query device properties" ); + ret = -EINVAL ; + goto query_device1; + } + props->fw_ver = rblock->hw_ver; + props->max_mr_size = rblock->max_mr_size; + props->vendor_id = rblock->vendor_id >>8 ; + props->vendor_part_id = rblock->vendor_part_id >>16 ; + props->hw_ver = rblock->hw_ver; +TO_MAX_INT (props->max_qp, (rblock->max_qp - rblock->cur_qp)); +TO_MAX_INT (props->max_qp_wr, rblock->max_wqes_wq); + props->max_sge = rblock->max_sge; + props->max_sge_rd = rblock->max_sge_rd; +TO_MAX_INT (props->max_cq, (rblock->max_cq - rblock->cur_cq)); + props->max_cqe = rblock->max_cqe; +TO_MAX_INT (props->max_mr, (rblock->max_cq - rblock->cur_mr)); +TO_MAX_INT (props->max_pd, rblock->max_pd); + props->max_mw = rblock->max_mw; +TO_MAX_INT (props->max_mr, (rblock->max_mw - rblock->cur_mw)); + props->max_raw_ipv6_qp = rblock->max_raw_ipv6_qp; + props->max_raw_ethy_qp = rblock->max_raw_ethy_qp; + props->max_mcast_grp = rblock->max_mcast_grp; + props->max_mcast_qp_attach = rblock->max_qps_attached_mcast_grp; + props->max_total_mcast_qp_attach = rblock->max_qps_attached_all_mcast_grp; +TO_MAX_INT (props->max_ah, rblock->max_ah); + props->max_fmr = rblock->max_mr; + props->max_srq =0 ; + props->max_srq_wr =0 ; + props->max_srq_sge =0 ; + props->max_pkeys =16 ; + props->local_ca_ack_delay = rblock->local_ca_ack_delay; + +query_device1: +kfree (rblock); + +query_device0: +EDEB_EX (7 ,"ret=%x" , ret); + +return ret; +} + +int ehca_query_port (struct ib_device *ibdev, +u8 port,struct ib_port_attr *props) +{ +int ret =0 ; +struct ehca_shca *shca; +struct hipz_query_port *rblock; + +EDEB_EN (7 ,"port=%x" , port); + +memset (props,0 ,sizeof (struct ib_port_attr )); + shca = container_of(ibdev, struct ehca_shca, ib_device); + + rblock =kzalloc (H_CB_ALIGNMENT ,GFP_KERNEL ); +if (!rblock) { +EDEB_ERR (4 ,"Can't allocate rblock memory." ); + ret = -ENOMEM ; + goto query_port0; + } + +if (hipz_h_query_port (shca->ipz_hca_handle, port, rblock) !=H_SUCCESS ) { +EDEB_ERR (4 ,"Can't query port properties" ); + ret = -EINVAL ; + goto query_port1; + } + + props->state = rblock->state; + +switch (rblock->max_mtu) { +case 0x1 : + props->active_mtu = props->max_mtu =IB_MTU_256 ; +break ; +case 0x2 : + props->active_mtu = props->max_mtu =IB_MTU_512 ; +break ; +case 0x3 : + props->active_mtu = props->max_mtu =IB_MTU_1024 ; +break ; +case 0x4 : + props->active_mtu = props->max_mtu =IB_MTU_2048 ; +break ; +case 0x5 : + props->active_mtu = props->max_mtu =IB_MTU_4096 ; +break ; +default : +EDEB_ERR (4 ,"Unknown MTU size: %x." , rblock->max_mtu); + } + + props->gid_tbl_len = rblock->gid_tbl_len; + props->max_msg_sz = rblock->max_msg_sz; + props->bad_pkey_cntr = rblock->bad_pkey_cntr; + props->qkey_viol_cntr = rblock->qkey_viol_cntr; + props->pkey_tbl_len = rblock->pkey_tbl_len; + props->lid = rblock->lid; + props->sm_lid = rblock->sm_lid; + props->lmc = rblock->lmc; + props->sm_sl = rblock->sm_sl; + props->subnet_timeout = rblock->subnet_timeout; + props->init_type_reply = rblock->init_type_reply; + + props->active_width =IB_WIDTH_12X ; + props->active_speed =0x1 ; + +query_port1: +kfree (rblock); + +query_port0: +EDEB_EX (7 ,"ret=%x" , ret); + +return ret; +} + +int ehca_query_pkey (struct ib_device *ibdev,u8 port,u16 index,u16 *pkey) +{ +int ret =0 ; +struct ehca_shca *shca; +struct hipz_query_port *rblock; + +EDEB_EN (7 ,"port=%x index=%x" , port, index); + +if (index >16 ) { +EDEB_ERR (4 ,"Invalid index: %x." , index); + ret = -EINVAL ; + goto query_pkey0; + } + + shca = container_of(ibdev, struct ehca_shca, ib_device); + + rblock =kzalloc (H_CB_ALIGNMENT ,GFP_KERNEL ); +if (!rblock) { +EDEB_ERR (4 ,"Can't allocate rblock memory." ); + ret = -ENOMEM ; + goto query_pkey0; + } + +if (hipz_h_query_port (shca->ipz_hca_handle, port, rblock) !=H_SUCCESS ) { +EDEB_ERR (4 ,"Can't query port properties" ); + ret = -EINVAL ; + goto query_pkey1; + } + +memcpy (pkey, &rblock->pkey_entries + index,sizeof (u16)); + +query_pkey1: +kfree (rblock); + +query_pkey0: +EDEB_EX (7 ,"ret=%x" , ret); + +return ret; +} + +int ehca_query_gid (struct ib_device *ibdev,u8 port, +int index,union ib_gid *gid) +{ +int ret =0 ; +struct ehca_shca *shca; +struct hipz_query_port *rblock; + +EDEB_EN (7 ,"port=%x index=%x" , port, index); + +if (index >255 ) { +EDEB_ERR (4 ,"Invalid index: %x." , index); + ret = -EINVAL ; + goto query_gid0; + } + + shca = container_of(ibdev, struct ehca_shca, ib_device); + + rblock =kzalloc (H_CB_ALIGNMENT ,GFP_KERNEL ); +if (!rblock) { +EDEB_ERR (4 ,"Can't allocate rblock memory." ); + ret = -ENOMEM ; + goto query_gid0; + } + +if (hipz_h_query_port (shca->ipz_hca_handle, port, rblock) !=H_SUCCESS ) { +EDEB_ERR (4 ,"Can't query port properties" ); + ret = -EINVAL ; + goto query_gid1; + } + +memcpy (&gid->raw[0 ], &rblock->gid_prefix,sizeof (u64)); +memcpy (&gid->raw[8 ], &rblock->guid_entries[index],sizeof (u64)); + +query_gid1: +kfree (rblock); + +query_gid0: +EDEB_EX (7 ,"ret=%x GID=%lx%lx" , ret, + *(u64 *) & gid->raw[0 ], + *(u64 *) & gid->raw[8 ]); + +return ret; +} + +int ehca_modify_port (struct ib_device *ibdev, +u8 port,int port_modify_mask, +struct ib_port_modify *props) +{ +int ret =0 ; + +EDEB_EN (7 ,"port=%x" , port); + +/* Not implemented yet. */ + +EDEB_EX (7 ,"ret=%x" , ret); + +return ret; +}
drivers/infiniband/hw/ehca/ehca_mcast.c +198 -0
198 lines not on this page · raw message
Some small stuff.
Quoted 3 lines · Heiko J Schick
+ * This source code is distributed under a dual license of GPL v2.0 and OpenIB
Line wrap. You might want to check your mailer or switch to a different one.
Review
Quoted 1 line
(quoted diff) +1
-0+ return (-EINVAL);
Remove brackets.
Review
Quoted 1 line
(quoted diff) +1
-0+ if (H_SUCCESS != hipz_rc) {
To frown upon reversed grammar, I tend. Hard to understand, such code is.
With a decent compiler, there is zero advantage to put the constant first - assuming you don't ignore warnings. But it makes the code just as hard to read as the Yoda-speak above.
Review
Quoted 1 line
(quoted diff) +1
-0+ return retcode;
People tend to use the shorter "ret" or "err".
Jörn
Signature · 2 lines
You can take my soul, but not my lack of enthusiasm. -- Wally
Quoted 8 lines · Jörn Engel
Quoted 3 lines · Heiko J Schick
+ * This source code is distributed under a dual license of GPL v2.0 and OpenIB
Line wrap. You might want to check your mailer or switch to a different one.
Looks correct here. Maybe you need to check yours ;-)
Arnd <><
Quoted 11 lines · Arnd Bergmann
Quoted 8 lines · Jörn Engel
Quoted 3 lines · Heiko J Schick
+ * This source code is distributed under a dual license of GPL v2.0 and OpenIB
Line wrap. You might want to check your mailer or switch to a different one.
Looks correct here. Maybe you need to check yours ;-)
Weird. I didn't change anything in the last couple of years and never had problems before.
Jörn
Signature · 3 lines
The cheapest, fastest and most reliable components of a computer system are those that aren't there. -- Gordon Bell, DEC labratories
Quoted 11 lines · Arnd Bergmann
Quoted 8 lines · J?rn Engel
Quoted 3 lines · Heiko J Schick
+ * ?This source code is distributed under a dual license of GPL v2.0 and OpenIB
Line wrap. ?You might want to check your mailer or switch to a different one.
Looks correct here. Maybe you need to check yours ;-)
It's linewrapped here, too. And the mailer on this box hasn't changed for more than three years. OTOH I got strangely looking mails from you recently :)
Quoted 5 lines · Christoph Hellwig
It's linewrapped here, too. And the mailer on this box hasn't changed for more than three years. OTOH I got strangely looking mails from you recently :)
Hmm. I don't see line wrap problems on
http://patchwork.ozlabs.org/linuxppc/patch?id=5174 . Maybe I'm just blind.
However, /something/ went wrong with the way the patch showed up there. Half of it ended up in the comment section instead of the patch itself.
Arnd <><
Quoted 8 lines · On Thu, 27 Apr 2006 12:48:29 +0200 Heiko J Schick <[email protected]> wrote:
Signed-off-by Heiko J Schick <[email protected]>ehca_hca.c | 286 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ehca_mcast.c | 198 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 484 insertions(+)
drivers/infiniband/hw/ehca/ehca_hca.c line 57
Quoted 6 lines
drivers/infiniband/hw/ehca/ehca_hca.c +6
-0+#define TO_MAX_INT (dest, src) \ + if (src >= INT_MAX) \ + dest = INT_MAX; \ + else \ + dest = src +
This is doubly ugly, replace
TO_MAX_INT(props->max_qp, (rblock->max_qp - rblock->cur_qp); with props->max_qp = min(rblock->max_qp - rblock->cur_qp, INT_MAX);