Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma

Pull RDMA subsystem updates from Jason Gunthorpe:
"This cycle mainly saw lots of bug fixes and clean up code across the
core code and several drivers, few new functional changes were made.

- Many cleanup and bug fixes for hns

- Various small bug fixes and cleanups in hfi1, mlx5, usnic, qed,
bnxt_re, efa

- Share the query_port code between all the iWarp drivers

- General rework and cleanup of the ODP MR umem code to fit better
with the mmu notifier get/put scheme

- Support rdma netlink in non init_net name spaces

- mlx5 support for XRC devx and DC ODP"

* tag 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/rdma/rdma: (99 commits)
RDMA: Fix double-free in srq creation error flow
RDMA/efa: Fix incorrect error print
IB/mlx5: Free mpi in mp_slave mode
IB/mlx5: Use the original address for the page during free_pages
RDMA/bnxt_re: Fix spelling mistake "missin_resp" -> "missing_resp"
RDMA/hns: Package operations of rq inline buffer into separate functions
RDMA/hns: Optimize cmd init and mode selection for hip08
IB/hfi1: Define variables as unsigned long to fix KASAN warning
IB/{rdmavt, hfi1, qib}: Add a counter for credit waits
IB/hfi1: Add traces for TID RDMA READ
RDMA/siw: Relax from kmap_atomic() use in TX path
IB/iser: Support up to 16MB data transfer in a single command
RDMA/siw: Fix page address mapping in TX path
RDMA: Fix goto target to release the allocated memory
RDMA/usnic: Avoid overly large buffers on stack
RDMA/odp: Add missing cast for 32 bit
RDMA/hns: Use devm_platform_ioremap_resource() to simplify code
Documentation/infiniband: update name of some functions
RDMA/cma: Fix false error message
RDMA/hns: Fix wrong assignment of qp_access_flags
...

+2746 -1927
+4 -4
Documentation/infiniband/core_locking.rst
··· 29 29 The corresponding functions exported to upper level protocol 30 30 consumers: 31 31 32 - - ib_create_ah 33 - - ib_modify_ah 34 - - ib_query_ah 35 - - ib_destroy_ah 32 + - rdma_create_ah 33 + - rdma_modify_ah 34 + - rdma_query_ah 35 + - rdma_destroy_ah 36 36 - ib_post_send 37 37 - ib_post_recv 38 38 - ib_req_notify_cq
+1 -1
drivers/infiniband/core/addr.c
··· 183 183 184 184 /* Repair the nlmsg header length */ 185 185 nlmsg_end(skb, nlh); 186 - rdma_nl_multicast(skb, RDMA_NL_GROUP_LS, GFP_KERNEL); 186 + rdma_nl_multicast(&init_net, skb, RDMA_NL_GROUP_LS, GFP_KERNEL); 187 187 188 188 /* Make the request retry, so when we get the response from userspace 189 189 * we will have something.
+1
drivers/infiniband/core/cache.c
··· 810 810 if (leak) 811 811 return; 812 812 813 + mutex_destroy(&table->lock); 813 814 kfree(table->data_vec); 814 815 kfree(table); 815 816 }
+1 -1
drivers/infiniband/core/cma.c
··· 3046 3046 if (status) 3047 3047 pr_debug_ratelimited("RDMA CM: ADDR_ERROR: failed to acquire device. status %d\n", 3048 3048 status); 3049 - } else { 3049 + } else if (status) { 3050 3050 pr_debug_ratelimited("RDMA CM: ADDR_ERROR: failed to resolve IP. status %d\n", status); 3051 3051 } 3052 3052
+7 -1
drivers/infiniband/core/cma_configfs.c
··· 342 342 343 343 int __init cma_configfs_init(void) 344 344 { 345 + int ret; 346 + 345 347 config_group_init(&cma_subsys.su_group); 346 348 mutex_init(&cma_subsys.su_mutex); 347 - return configfs_register_subsystem(&cma_subsys); 349 + ret = configfs_register_subsystem(&cma_subsys); 350 + if (ret) 351 + mutex_destroy(&cma_subsys.su_mutex); 352 + return ret; 348 353 } 349 354 350 355 void __exit cma_configfs_exit(void) 351 356 { 352 357 configfs_unregister_subsystem(&cma_subsys); 358 + mutex_destroy(&cma_subsys.su_mutex); 353 359 }
+23 -1
drivers/infiniband/core/core_priv.h
··· 36 36 #include <linux/list.h> 37 37 #include <linux/spinlock.h> 38 38 #include <linux/cgroup_rdma.h> 39 + #include <net/net_namespace.h> 40 + #include <net/netns/generic.h> 39 41 40 42 #include <rdma/ib_verbs.h> 41 43 #include <rdma/opa_addr.h> ··· 56 54 struct list_head qp_list; 57 55 }; 58 56 57 + /** 58 + * struct rdma_dev_net - rdma net namespace metadata for a net 59 + * @nl_sock: Pointer to netlink socket 60 + * @net: Pointer to owner net namespace 61 + * @id: xarray id to identify the net namespace. 62 + */ 63 + struct rdma_dev_net { 64 + struct sock *nl_sock; 65 + possible_net_t net; 66 + u32 id; 67 + }; 68 + 59 69 extern const struct attribute_group ib_dev_attr_group; 60 70 extern bool ib_devices_shared_netns; 71 + extern unsigned int rdma_dev_net_id; 72 + 73 + static inline struct rdma_dev_net *rdma_net_to_dev_net(struct net *net) 74 + { 75 + return net_generic(net, rdma_dev_net_id); 76 + } 61 77 62 78 int ib_device_register_sysfs(struct ib_device *device); 63 79 void ib_device_unregister_sysfs(struct ib_device *device); ··· 199 179 int ib_sa_init(void); 200 180 void ib_sa_cleanup(void); 201 181 202 - int rdma_nl_init(void); 203 182 void rdma_nl_exit(void); 204 183 205 184 int ib_nl_handle_resolve_resp(struct sk_buff *skb, ··· 384 365 385 366 int ib_device_set_netns_put(struct sk_buff *skb, 386 367 struct ib_device *dev, u32 ns_fd); 368 + 369 + int rdma_nl_net_init(struct rdma_dev_net *rnet); 370 + void rdma_nl_net_exit(struct rdma_dev_net *rnet); 387 371 #endif /* _CORE_PRIV_H */
+4 -4
drivers/infiniband/core/counters.c
··· 599 599 void rdma_counter_init(struct ib_device *dev) 600 600 { 601 601 struct rdma_port_counter *port_counter; 602 - u32 port; 602 + u32 port, i; 603 603 604 604 if (!dev->port_data) 605 605 return; ··· 620 620 return; 621 621 622 622 fail: 623 - rdma_for_each_port(dev, port) { 623 + for (i = port; i >= rdma_start_port(dev); i--) { 624 624 port_counter = &dev->port_data[port].port_counter; 625 625 kfree(port_counter->hstats); 626 626 port_counter->hstats = NULL; 627 + mutex_destroy(&port_counter->lock); 627 628 } 628 - 629 - return; 630 629 } 631 630 632 631 void rdma_counter_release(struct ib_device *dev) ··· 636 637 rdma_for_each_port(dev, port) { 637 638 port_counter = &dev->port_data[port].port_counter; 638 639 kfree(port_counter->hstats); 640 + mutex_destroy(&port_counter->lock); 639 641 } 640 642 }
+28
drivers/infiniband/core/cq.c
··· 253 253 EXPORT_SYMBOL(__ib_alloc_cq_user); 254 254 255 255 /** 256 + * __ib_alloc_cq_any - allocate a completion queue 257 + * @dev: device to allocate the CQ for 258 + * @private: driver private data, accessible from cq->cq_context 259 + * @nr_cqe: number of CQEs to allocate 260 + * @poll_ctx: context to poll the CQ from 261 + * @caller: module owner name 262 + * 263 + * Attempt to spread ULP Completion Queues over each device's interrupt 264 + * vectors. A simple best-effort mechanism is used. 265 + */ 266 + struct ib_cq *__ib_alloc_cq_any(struct ib_device *dev, void *private, 267 + int nr_cqe, enum ib_poll_context poll_ctx, 268 + const char *caller) 269 + { 270 + static atomic_t counter; 271 + int comp_vector = 0; 272 + 273 + if (dev->num_comp_vectors > 1) 274 + comp_vector = 275 + atomic_inc_return(&counter) % 276 + min_t(int, dev->num_comp_vectors, num_online_cpus()); 277 + 278 + return __ib_alloc_cq_user(dev, private, nr_cqe, comp_vector, poll_ctx, 279 + caller, NULL); 280 + } 281 + EXPORT_SYMBOL(__ib_alloc_cq_any); 282 + 283 + /** 256 284 * ib_free_cq_user - free a completion queue 257 285 * @cq: completion queue to free. 258 286 * @udata: User data or NULL for kernel object
+88 -42
drivers/infiniband/core/device.c
··· 39 39 #include <linux/init.h> 40 40 #include <linux/netdevice.h> 41 41 #include <net/net_namespace.h> 42 - #include <net/netns/generic.h> 43 42 #include <linux/security.h> 44 43 #include <linux/notifier.h> 45 44 #include <linux/hashtable.h> ··· 110 111 */ 111 112 #define CLIENT_DATA_REGISTERED XA_MARK_1 112 113 113 - /** 114 - * struct rdma_dev_net - rdma net namespace metadata for a net 115 - * @net: Pointer to owner net namespace 116 - * @id: xarray id to identify the net namespace. 117 - */ 118 - struct rdma_dev_net { 119 - possible_net_t net; 120 - u32 id; 121 - }; 122 - 123 - static unsigned int rdma_dev_net_id; 114 + unsigned int rdma_dev_net_id; 124 115 125 116 /* 126 117 * A list of net namespaces is maintained in an xarray. This is necessary ··· 502 513 pdata[0]), 503 514 rcu_head); 504 515 } 516 + 517 + mutex_destroy(&dev->unregistration_lock); 518 + mutex_destroy(&dev->compat_devs_mutex); 505 519 506 520 xa_destroy(&dev->compat_devs); 507 521 xa_destroy(&dev->client_data); ··· 1052 1060 1053 1061 static void rdma_dev_exit_net(struct net *net) 1054 1062 { 1055 - struct rdma_dev_net *rnet = net_generic(net, rdma_dev_net_id); 1063 + struct rdma_dev_net *rnet = rdma_net_to_dev_net(net); 1056 1064 struct ib_device *dev; 1057 1065 unsigned long index; 1058 1066 int ret; ··· 1086 1094 } 1087 1095 up_read(&devices_rwsem); 1088 1096 1097 + rdma_nl_net_exit(rnet); 1089 1098 xa_erase(&rdma_nets, rnet->id); 1090 1099 } 1091 1100 1092 1101 static __net_init int rdma_dev_init_net(struct net *net) 1093 1102 { 1094 - struct rdma_dev_net *rnet = net_generic(net, rdma_dev_net_id); 1103 + struct rdma_dev_net *rnet = rdma_net_to_dev_net(net); 1095 1104 unsigned long index; 1096 1105 struct ib_device *dev; 1097 1106 int ret; 1107 + 1108 + write_pnet(&rnet->net, net); 1109 + 1110 + ret = rdma_nl_net_init(rnet); 1111 + if (ret) 1112 + return ret; 1098 1113 1099 1114 /* No need to create any compat devices in default init_net. */ 1100 1115 if (net_eq(net, &init_net)) 1101 1116 return 0; 1102 1117 1103 - write_pnet(&rnet->net, net); 1104 - 1105 1118 ret = xa_alloc(&rdma_nets, &rnet->id, rnet, xa_limit_32b, GFP_KERNEL); 1106 - if (ret) 1119 + if (ret) { 1120 + rdma_nl_net_exit(rnet); 1107 1121 return ret; 1122 + } 1108 1123 1109 1124 down_read(&devices_rwsem); 1110 1125 xa_for_each_marked (&devices, index, dev, DEVICE_REGISTERED) { ··· 1973 1974 } 1974 1975 EXPORT_SYMBOL(ib_dispatch_event); 1975 1976 1977 + static int iw_query_port(struct ib_device *device, 1978 + u8 port_num, 1979 + struct ib_port_attr *port_attr) 1980 + { 1981 + struct in_device *inetdev; 1982 + struct net_device *netdev; 1983 + int err; 1984 + 1985 + memset(port_attr, 0, sizeof(*port_attr)); 1986 + 1987 + netdev = ib_device_get_netdev(device, port_num); 1988 + if (!netdev) 1989 + return -ENODEV; 1990 + 1991 + dev_put(netdev); 1992 + 1993 + port_attr->max_mtu = IB_MTU_4096; 1994 + port_attr->active_mtu = ib_mtu_int_to_enum(netdev->mtu); 1995 + 1996 + if (!netif_carrier_ok(netdev)) { 1997 + port_attr->state = IB_PORT_DOWN; 1998 + port_attr->phys_state = IB_PORT_PHYS_STATE_DISABLED; 1999 + } else { 2000 + inetdev = in_dev_get(netdev); 2001 + 2002 + if (inetdev && inetdev->ifa_list) { 2003 + port_attr->state = IB_PORT_ACTIVE; 2004 + port_attr->phys_state = IB_PORT_PHYS_STATE_LINK_UP; 2005 + in_dev_put(inetdev); 2006 + } else { 2007 + port_attr->state = IB_PORT_INIT; 2008 + port_attr->phys_state = 2009 + IB_PORT_PHYS_STATE_PORT_CONFIGURATION_TRAINING; 2010 + } 2011 + } 2012 + 2013 + err = device->ops.query_port(device, port_num, port_attr); 2014 + if (err) 2015 + return err; 2016 + 2017 + return 0; 2018 + } 2019 + 2020 + static int __ib_query_port(struct ib_device *device, 2021 + u8 port_num, 2022 + struct ib_port_attr *port_attr) 2023 + { 2024 + union ib_gid gid = {}; 2025 + int err; 2026 + 2027 + memset(port_attr, 0, sizeof(*port_attr)); 2028 + 2029 + err = device->ops.query_port(device, port_num, port_attr); 2030 + if (err || port_attr->subnet_prefix) 2031 + return err; 2032 + 2033 + if (rdma_port_get_link_layer(device, port_num) != 2034 + IB_LINK_LAYER_INFINIBAND) 2035 + return 0; 2036 + 2037 + err = device->ops.query_gid(device, port_num, 0, &gid); 2038 + if (err) 2039 + return err; 2040 + 2041 + port_attr->subnet_prefix = be64_to_cpu(gid.global.subnet_prefix); 2042 + return 0; 2043 + } 2044 + 1976 2045 /** 1977 2046 * ib_query_port - Query IB port attributes 1978 2047 * @device:Device to query ··· 2054 1987 u8 port_num, 2055 1988 struct ib_port_attr *port_attr) 2056 1989 { 2057 - union ib_gid gid; 2058 - int err; 2059 - 2060 1990 if (!rdma_is_port_valid(device, port_num)) 2061 1991 return -EINVAL; 2062 1992 2063 - memset(port_attr, 0, sizeof(*port_attr)); 2064 - err = device->ops.query_port(device, port_num, port_attr); 2065 - if (err || port_attr->subnet_prefix) 2066 - return err; 2067 - 2068 - if (rdma_port_get_link_layer(device, port_num) != IB_LINK_LAYER_INFINIBAND) 2069 - return 0; 2070 - 2071 - err = device->ops.query_gid(device, port_num, 0, &gid); 2072 - if (err) 2073 - return err; 2074 - 2075 - port_attr->subnet_prefix = be64_to_cpu(gid.global.subnet_prefix); 2076 - return 0; 1993 + if (rdma_protocol_iwarp(device, port_num)) 1994 + return iw_query_port(device, port_num, port_attr); 1995 + else 1996 + return __ib_query_port(device, port_num, port_attr); 2077 1997 } 2078 1998 EXPORT_SYMBOL(ib_query_port); 2079 1999 ··· 2715 2661 goto err_comp_unbound; 2716 2662 } 2717 2663 2718 - ret = rdma_nl_init(); 2719 - if (ret) { 2720 - pr_warn("Couldn't init IB netlink interface: err %d\n", ret); 2721 - goto err_sysfs; 2722 - } 2723 - 2724 2664 ret = addr_init(); 2725 2665 if (ret) { 2726 2666 pr_warn("Could't init IB address resolution\n"); ··· 2760 2712 err_addr: 2761 2713 addr_cleanup(); 2762 2714 err_ibnl: 2763 - rdma_nl_exit(); 2764 - err_sysfs: 2765 2715 class_unregister(&ib_class); 2766 2716 err_comp_unbound: 2767 2717 destroy_workqueue(ib_comp_unbound_wq);
-13
drivers/infiniband/core/fmr_pool.c
··· 148 148 hlist_del_init(&fmr->cache_node); 149 149 fmr->remap_count = 0; 150 150 list_add_tail(&fmr->fmr->list, &fmr_list); 151 - 152 - #ifdef DEBUG 153 - if (fmr->ref_count !=0) { 154 - pr_warn(PFX "Unmapping FMR 0x%08x with ref count %d\n", 155 - fmr, fmr->ref_count); 156 - } 157 - #endif 158 151 } 159 152 160 153 list_splice_init(&pool->dirty_list, &unmap_list); ··· 488 495 } 489 496 } 490 497 } 491 - 492 - #ifdef DEBUG 493 - if (fmr->ref_count < 0) 494 - pr_warn(PFX "FMR %p has ref count %d < 0\n", 495 - fmr, fmr->ref_count); 496 - #endif 497 498 498 499 spin_unlock_irqrestore(&pool->pool_lock, flags); 499 500 }
+7 -10
drivers/infiniband/core/iwpm_msg.c
··· 112 112 pr_debug("%s: Multicasting a nlmsg (dev = %s ifname = %s iwpm = %s)\n", 113 113 __func__, pm_msg->dev_name, pm_msg->if_name, iwpm_ulib_name); 114 114 115 - ret = rdma_nl_multicast(skb, RDMA_NL_GROUP_IWPM, GFP_KERNEL); 115 + ret = rdma_nl_multicast(&init_net, skb, RDMA_NL_GROUP_IWPM, GFP_KERNEL); 116 116 if (ret) { 117 117 skb = NULL; /* skb is freed in the netlink send-op handling */ 118 118 iwpm_user_pid = IWPM_PID_UNAVAILABLE; ··· 124 124 return ret; 125 125 pid_query_error: 126 126 pr_info("%s: %s (client = %d)\n", __func__, err_str, nl_client); 127 - if (skb) 128 - dev_kfree_skb(skb); 127 + dev_kfree_skb(skb); 129 128 if (nlmsg_request) 130 129 iwpm_free_nlmsg_request(&nlmsg_request->kref); 131 130 return ret; ··· 201 202 nlmsg_end(skb, nlh); 202 203 nlmsg_request->req_buffer = pm_msg; 203 204 204 - ret = rdma_nl_unicast_wait(skb, iwpm_user_pid); 205 + ret = rdma_nl_unicast_wait(&init_net, skb, iwpm_user_pid); 205 206 if (ret) { 206 207 skb = NULL; /* skb is freed in the netlink send-op handling */ 207 208 iwpm_user_pid = IWPM_PID_UNDEFINED; ··· 213 214 add_mapping_error: 214 215 pr_info("%s: %s (client = %d)\n", __func__, err_str, nl_client); 215 216 add_mapping_error_nowarn: 216 - if (skb) 217 - dev_kfree_skb(skb); 217 + dev_kfree_skb(skb); 218 218 if (nlmsg_request) 219 219 iwpm_free_nlmsg_request(&nlmsg_request->kref); 220 220 return ret; ··· 295 297 nlmsg_end(skb, nlh); 296 298 nlmsg_request->req_buffer = pm_msg; 297 299 298 - ret = rdma_nl_unicast_wait(skb, iwpm_user_pid); 300 + ret = rdma_nl_unicast_wait(&init_net, skb, iwpm_user_pid); 299 301 if (ret) { 300 302 skb = NULL; /* skb is freed in the netlink send-op handling */ 301 303 err_str = "Unable to send a nlmsg"; ··· 306 308 query_mapping_error: 307 309 pr_info("%s: %s (client = %d)\n", __func__, err_str, nl_client); 308 310 query_mapping_error_nowarn: 309 - if (skb) 310 - dev_kfree_skb(skb); 311 + dev_kfree_skb(skb); 311 312 if (nlmsg_request) 312 313 iwpm_free_nlmsg_request(&nlmsg_request->kref); 313 314 return ret; ··· 361 364 362 365 nlmsg_end(skb, nlh); 363 366 364 - ret = rdma_nl_unicast_wait(skb, iwpm_user_pid); 367 + ret = rdma_nl_unicast_wait(&init_net, skb, iwpm_user_pid); 365 368 if (ret) { 366 369 skb = NULL; /* skb is freed in the netlink send-op handling */ 367 370 iwpm_user_pid = IWPM_PID_UNDEFINED;
+6 -9
drivers/infiniband/core/iwpm_util.c
··· 645 645 646 646 nlmsg_end(skb, nlh); 647 647 648 - ret = rdma_nl_unicast(skb, iwpm_pid); 648 + ret = rdma_nl_unicast(&init_net, skb, iwpm_pid); 649 649 if (ret) { 650 650 skb = NULL; 651 651 err_str = "Unable to send a nlmsg"; ··· 655 655 return 0; 656 656 mapinfo_num_error: 657 657 pr_info("%s: %s\n", __func__, err_str); 658 - if (skb) 659 - dev_kfree_skb(skb); 658 + dev_kfree_skb(skb); 660 659 return ret; 661 660 } 662 661 ··· 673 674 return -ENOMEM; 674 675 } 675 676 nlh->nlmsg_type = NLMSG_DONE; 676 - ret = rdma_nl_unicast(skb, iwpm_pid); 677 + ret = rdma_nl_unicast(&init_net, skb, iwpm_pid); 677 678 if (ret) 678 679 pr_warn("%s Unable to send a nlmsg\n", __func__); 679 680 return ret; ··· 777 778 send_mapping_info_exit: 778 779 if (ret) { 779 780 pr_warn("%s: %s (ret = %d)\n", __func__, err_str, ret); 780 - if (skb) 781 - dev_kfree_skb(skb); 781 + dev_kfree_skb(skb); 782 782 return ret; 783 783 } 784 784 send_nlmsg_done(skb, nl_client, iwpm_pid); ··· 822 824 goto hello_num_error; 823 825 nlmsg_end(skb, nlh); 824 826 825 - ret = rdma_nl_unicast(skb, iwpm_pid); 827 + ret = rdma_nl_unicast(&init_net, skb, iwpm_pid); 826 828 if (ret) { 827 829 skb = NULL; 828 830 err_str = "Unable to send a nlmsg"; ··· 832 834 return 0; 833 835 hello_num_error: 834 836 pr_info("%s: %s\n", __func__, err_str); 835 - if (skb) 836 - dev_kfree_skb(skb); 837 + dev_kfree_skb(skb); 837 838 return ret; 838 839 }
+50 -27
drivers/infiniband/core/netlink.c
··· 36 36 #include <linux/export.h> 37 37 #include <net/netlink.h> 38 38 #include <net/net_namespace.h> 39 + #include <net/netns/generic.h> 39 40 #include <net/sock.h> 40 41 #include <rdma/rdma_netlink.h> 41 42 #include <linux/module.h> 42 43 #include "core_priv.h" 43 44 44 45 static DEFINE_MUTEX(rdma_nl_mutex); 45 - static struct sock *nls; 46 46 static struct { 47 47 const struct rdma_nl_cbs *cb_table; 48 48 } rdma_nl_types[RDMA_NL_NUM_CLIENTS]; 49 49 50 50 bool rdma_nl_chk_listeners(unsigned int group) 51 51 { 52 - return netlink_has_listeners(nls, group); 52 + struct rdma_dev_net *rnet = rdma_net_to_dev_net(&init_net); 53 + 54 + return netlink_has_listeners(rnet->nl_sock, group); 53 55 } 54 56 EXPORT_SYMBOL(rdma_nl_chk_listeners); 55 57 ··· 75 73 return (op < max_num_ops[type]) ? true : false; 76 74 } 77 75 78 - static bool is_nl_valid(unsigned int type, unsigned int op) 76 + static bool 77 + is_nl_valid(const struct sk_buff *skb, unsigned int type, unsigned int op) 79 78 { 80 79 const struct rdma_nl_cbs *cb_table; 81 80 82 81 if (!is_nl_msg_valid(type, op)) 82 + return false; 83 + 84 + /* 85 + * Currently only NLDEV client is supporting netlink commands in 86 + * non init_net net namespace. 87 + */ 88 + if (sock_net(skb->sk) != &init_net && type != RDMA_NL_NLDEV) 83 89 return false; 84 90 85 91 if (!rdma_nl_types[type].cb_table) { ··· 171 161 unsigned int op = RDMA_NL_GET_OP(type); 172 162 const struct rdma_nl_cbs *cb_table; 173 163 174 - if (!is_nl_valid(index, op)) 164 + if (!is_nl_valid(skb, index, op)) 175 165 return -EINVAL; 176 166 177 167 cb_table = rdma_nl_types[index].cb_table; ··· 195 185 .dump = cb_table[op].dump, 196 186 }; 197 187 if (c.dump) 198 - return netlink_dump_start(nls, skb, nlh, &c); 188 + return netlink_dump_start(skb->sk, skb, nlh, &c); 199 189 return -EINVAL; 200 190 } 201 191 ··· 268 258 mutex_unlock(&rdma_nl_mutex); 269 259 } 270 260 271 - int rdma_nl_unicast(struct sk_buff *skb, u32 pid) 261 + int rdma_nl_unicast(struct net *net, struct sk_buff *skb, u32 pid) 272 262 { 263 + struct rdma_dev_net *rnet = rdma_net_to_dev_net(net); 273 264 int err; 274 265 275 - err = netlink_unicast(nls, skb, pid, MSG_DONTWAIT); 266 + err = netlink_unicast(rnet->nl_sock, skb, pid, MSG_DONTWAIT); 276 267 return (err < 0) ? err : 0; 277 268 } 278 269 EXPORT_SYMBOL(rdma_nl_unicast); 279 270 280 - int rdma_nl_unicast_wait(struct sk_buff *skb, __u32 pid) 271 + int rdma_nl_unicast_wait(struct net *net, struct sk_buff *skb, __u32 pid) 281 272 { 273 + struct rdma_dev_net *rnet = rdma_net_to_dev_net(net); 282 274 int err; 283 275 284 - err = netlink_unicast(nls, skb, pid, 0); 276 + err = netlink_unicast(rnet->nl_sock, skb, pid, 0); 285 277 return (err < 0) ? err : 0; 286 278 } 287 279 EXPORT_SYMBOL(rdma_nl_unicast_wait); 288 280 289 - int rdma_nl_multicast(struct sk_buff *skb, unsigned int group, gfp_t flags) 281 + int rdma_nl_multicast(struct net *net, struct sk_buff *skb, 282 + unsigned int group, gfp_t flags) 290 283 { 291 - return nlmsg_multicast(nls, skb, 0, group, flags); 284 + struct rdma_dev_net *rnet = rdma_net_to_dev_net(net); 285 + 286 + return nlmsg_multicast(rnet->nl_sock, skb, 0, group, flags); 292 287 } 293 288 EXPORT_SYMBOL(rdma_nl_multicast); 294 - 295 - int __init rdma_nl_init(void) 296 - { 297 - struct netlink_kernel_cfg cfg = { 298 - .input = rdma_nl_rcv, 299 - }; 300 - 301 - nls = netlink_kernel_create(&init_net, NETLINK_RDMA, &cfg); 302 - if (!nls) 303 - return -ENOMEM; 304 - 305 - nls->sk_sndtimeo = 10 * HZ; 306 - return 0; 307 - } 308 289 309 290 void rdma_nl_exit(void) 310 291 { 311 292 int idx; 312 293 313 294 for (idx = 0; idx < RDMA_NL_NUM_CLIENTS; idx++) 314 - rdma_nl_unregister(idx); 295 + WARN(rdma_nl_types[idx].cb_table, 296 + "Netlink client %d wasn't released prior to unloading %s\n", 297 + idx, KBUILD_MODNAME); 298 + } 315 299 316 - netlink_kernel_release(nls); 300 + int rdma_nl_net_init(struct rdma_dev_net *rnet) 301 + { 302 + struct net *net = read_pnet(&rnet->net); 303 + struct netlink_kernel_cfg cfg = { 304 + .input = rdma_nl_rcv, 305 + }; 306 + struct sock *nls; 307 + 308 + nls = netlink_kernel_create(net, NETLINK_RDMA, &cfg); 309 + if (!nls) 310 + return -ENOMEM; 311 + 312 + nls->sk_sndtimeo = 10 * HZ; 313 + rnet->nl_sock = nls; 314 + return 0; 315 + } 316 + 317 + void rdma_nl_net_exit(struct rdma_dev_net *rnet) 318 + { 319 + netlink_kernel_release(rnet->nl_sock); 317 320 } 318 321 319 322 MODULE_ALIAS_NET_PF_PROTO(PF_NETLINK, NETLINK_RDMA);
+10 -10
drivers/infiniband/core/nldev.c
··· 831 831 nlmsg_end(msg, nlh); 832 832 833 833 ib_device_put(device); 834 - return rdma_nl_unicast(msg, NETLINK_CB(skb).portid); 834 + return rdma_nl_unicast(sock_net(skb->sk), msg, NETLINK_CB(skb).portid); 835 835 836 836 err_free: 837 837 nlmsg_free(msg); ··· 971 971 nlmsg_end(msg, nlh); 972 972 ib_device_put(device); 973 973 974 - return rdma_nl_unicast(msg, NETLINK_CB(skb).portid); 974 + return rdma_nl_unicast(sock_net(skb->sk), msg, NETLINK_CB(skb).portid); 975 975 976 976 err_free: 977 977 nlmsg_free(msg); ··· 1073 1073 1074 1074 nlmsg_end(msg, nlh); 1075 1075 ib_device_put(device); 1076 - return rdma_nl_unicast(msg, NETLINK_CB(skb).portid); 1076 + return rdma_nl_unicast(sock_net(skb->sk), msg, NETLINK_CB(skb).portid); 1077 1077 1078 1078 err_free: 1079 1079 nlmsg_free(msg); ··· 1250 1250 1251 1251 nlmsg_end(msg, nlh); 1252 1252 ib_device_put(device); 1253 - return rdma_nl_unicast(msg, NETLINK_CB(skb).portid); 1253 + return rdma_nl_unicast(sock_net(skb->sk), msg, NETLINK_CB(skb).portid); 1254 1254 1255 1255 err_free: 1256 1256 nlmsg_free(msg); ··· 1595 1595 put_device(data.cdev); 1596 1596 if (ibdev) 1597 1597 ib_device_put(ibdev); 1598 - return rdma_nl_unicast(msg, NETLINK_CB(skb).portid); 1598 + return rdma_nl_unicast(sock_net(skb->sk), msg, NETLINK_CB(skb).portid); 1599 1599 1600 1600 out_data: 1601 1601 put_device(data.cdev); ··· 1635 1635 return err; 1636 1636 } 1637 1637 nlmsg_end(msg, nlh); 1638 - return rdma_nl_unicast(msg, NETLINK_CB(skb).portid); 1638 + return rdma_nl_unicast(sock_net(skb->sk), msg, NETLINK_CB(skb).portid); 1639 1639 } 1640 1640 1641 1641 static int nldev_set_sys_set_doit(struct sk_buff *skb, struct nlmsghdr *nlh, ··· 1733 1733 1734 1734 nlmsg_end(msg, nlh); 1735 1735 ib_device_put(device); 1736 - return rdma_nl_unicast(msg, NETLINK_CB(skb).portid); 1736 + return rdma_nl_unicast(sock_net(skb->sk), msg, NETLINK_CB(skb).portid); 1737 1737 1738 1738 err_fill: 1739 1739 rdma_counter_unbind_qpn(device, port, qpn, cntn); ··· 1801 1801 1802 1802 nlmsg_end(msg, nlh); 1803 1803 ib_device_put(device); 1804 - return rdma_nl_unicast(msg, NETLINK_CB(skb).portid); 1804 + return rdma_nl_unicast(sock_net(skb->sk), msg, NETLINK_CB(skb).portid); 1805 1805 1806 1806 err_fill: 1807 1807 rdma_counter_bind_qpn(device, port, qpn, cntn); ··· 1892 1892 mutex_unlock(&stats->lock); 1893 1893 nlmsg_end(msg, nlh); 1894 1894 ib_device_put(device); 1895 - return rdma_nl_unicast(msg, NETLINK_CB(skb).portid); 1895 + return rdma_nl_unicast(sock_net(skb->sk), msg, NETLINK_CB(skb).portid); 1896 1896 1897 1897 err_table: 1898 1898 nla_nest_cancel(msg, table_attr); ··· 1964 1964 1965 1965 nlmsg_end(msg, nlh); 1966 1966 ib_device_put(device); 1967 - return rdma_nl_unicast(msg, NETLINK_CB(skb).portid); 1967 + return rdma_nl_unicast(sock_net(skb->sk), msg, NETLINK_CB(skb).portid); 1968 1968 1969 1969 err_msg: 1970 1970 nlmsg_free(msg);
+1 -1
drivers/infiniband/core/sa_query.c
··· 860 860 /* Repair the nlmsg header length */ 861 861 nlmsg_end(skb, nlh); 862 862 863 - return rdma_nl_multicast(skb, RDMA_NL_GROUP_LS, gfp_mask); 863 + return rdma_nl_multicast(&init_net, skb, RDMA_NL_GROUP_LS, gfp_mask); 864 864 } 865 865 866 866 static int ib_nl_make_request(struct ib_sa_query *query, gfp_t gfp_mask)
+20 -10
drivers/infiniband/core/sysfs.c
··· 289 289 ib_width_enum_to_int(attr.active_width), speed); 290 290 } 291 291 292 + static const char *phys_state_to_str(enum ib_port_phys_state phys_state) 293 + { 294 + static const char * phys_state_str[] = { 295 + "<unknown>", 296 + "Sleep", 297 + "Polling", 298 + "Disabled", 299 + "PortConfigurationTraining", 300 + "LinkUp", 301 + "LinkErrorRecovery", 302 + "Phy Test", 303 + }; 304 + 305 + if (phys_state < ARRAY_SIZE(phys_state_str)) 306 + return phys_state_str[phys_state]; 307 + return "<unknown>"; 308 + } 309 + 292 310 static ssize_t phys_state_show(struct ib_port *p, struct port_attribute *unused, 293 311 char *buf) 294 312 { ··· 318 300 if (ret) 319 301 return ret; 320 302 321 - switch (attr.phys_state) { 322 - case 1: return sprintf(buf, "1: Sleep\n"); 323 - case 2: return sprintf(buf, "2: Polling\n"); 324 - case 3: return sprintf(buf, "3: Disabled\n"); 325 - case 4: return sprintf(buf, "4: PortConfigurationTraining\n"); 326 - case 5: return sprintf(buf, "5: LinkUp\n"); 327 - case 6: return sprintf(buf, "6: LinkErrorRecovery\n"); 328 - case 7: return sprintf(buf, "7: Phy Test\n"); 329 - default: return sprintf(buf, "%d: <unknown>\n", attr.phys_state); 330 - } 303 + return sprintf(buf, "%d: %s\n", attr.phys_state, 304 + phys_state_to_str(attr.phys_state)); 331 305 } 332 306 333 307 static ssize_t link_layer_show(struct ib_port *p, struct port_attribute *unused,
+1 -1
drivers/infiniband/core/umem_odp.c
··· 218 218 umem_odp->interval_tree.start = 219 219 ALIGN_DOWN(umem_odp->umem.address, page_size); 220 220 if (check_add_overflow(umem_odp->umem.address, 221 - umem_odp->umem.length, 221 + (unsigned long)umem_odp->umem.length, 222 222 &umem_odp->interval_tree.last)) 223 223 return -EOVERFLOW; 224 224 umem_odp->interval_tree.last =
+1 -1
drivers/infiniband/core/user_mad.c
··· 1042 1042 ib_unregister_mad_agent(file->agent[i]); 1043 1043 1044 1044 mutex_unlock(&file->port->file_mutex); 1045 - 1045 + mutex_destroy(&file->mutex); 1046 1046 kfree(file); 1047 1047 return 0; 1048 1048 }
+2 -1
drivers/infiniband/core/uverbs_cmd.c
··· 3479 3479 3480 3480 err_copy: 3481 3481 ib_destroy_srq_user(srq, uverbs_get_cleared_udata(attrs)); 3482 - 3482 + /* It was released in ib_destroy_srq_user */ 3483 + srq = NULL; 3483 3484 err_free: 3484 3485 kfree(srq); 3485 3486 err_put:
+4
drivers/infiniband/core/uverbs_main.c
··· 120 120 121 121 uverbs_destroy_api(dev->uapi); 122 122 cleanup_srcu_struct(&dev->disassociate_srcu); 123 + mutex_destroy(&dev->lists_mutex); 124 + mutex_destroy(&dev->xrcd_tree_mutex); 123 125 kfree(dev); 124 126 } 125 127 ··· 214 212 215 213 if (file->disassociate_page) 216 214 __free_pages(file->disassociate_page, 0); 215 + mutex_destroy(&file->umap_lock); 216 + mutex_destroy(&file->ucontext_lock); 217 217 kfree(file); 218 218 } 219 219
+1
drivers/infiniband/core/verbs.c
··· 2259 2259 if (ret) 2260 2260 return ret; 2261 2261 } 2262 + mutex_destroy(&xrcd->tgt_qp_mutex); 2262 2263 2263 2264 return xrcd->device->ops.dealloc_xrcd(xrcd, udata); 2264 2265 }
+1 -1
drivers/infiniband/hw/bnxt_re/hw_counters.c
··· 74 74 [BNXT_RE_SEQ_ERR_NAKS_RCVD] = "seq_err_naks_rcvd", 75 75 [BNXT_RE_MAX_RETRY_EXCEEDED] = "max_retry_exceeded", 76 76 [BNXT_RE_RNR_NAKS_RCVD] = "rnr_naks_rcvd", 77 - [BNXT_RE_MISSING_RESP] = "missin_resp", 77 + [BNXT_RE_MISSING_RESP] = "missing_resp", 78 78 [BNXT_RE_UNRECOVERABLE_ERR] = "unrecoverable_err", 79 79 [BNXT_RE_BAD_RESP_ERR] = "bad_resp_err", 80 80 [BNXT_RE_LOCAL_QP_OP_ERR] = "local_qp_op_err",
+3 -3
drivers/infiniband/hw/bnxt_re/ib_verbs.c
··· 220 220 221 221 if (netif_running(rdev->netdev) && netif_carrier_ok(rdev->netdev)) { 222 222 port_attr->state = IB_PORT_ACTIVE; 223 - port_attr->phys_state = 5; 223 + port_attr->phys_state = IB_PORT_PHYS_STATE_LINK_UP; 224 224 } else { 225 225 port_attr->state = IB_PORT_DOWN; 226 - port_attr->phys_state = 3; 226 + port_attr->phys_state = IB_PORT_PHYS_STATE_DISABLED; 227 227 } 228 228 port_attr->max_mtu = IB_MTU_4096; 229 229 port_attr->active_mtu = iboe_get_mtu(rdev->netdev->mtu); ··· 1398 1398 dev_err(rdev_to_dev(rdev), "SRQ copy to udata failed!"); 1399 1399 bnxt_qplib_destroy_srq(&rdev->qplib_res, 1400 1400 &srq->qplib_srq); 1401 - goto exit; 1401 + goto fail; 1402 1402 } 1403 1403 } 1404 1404 if (nq)
-1
drivers/infiniband/hw/bnxt_re/main.c
··· 1473 1473 &rdev->active_width); 1474 1474 set_bit(BNXT_RE_FLAG_ISSUE_ROCE_STATS, &rdev->flags); 1475 1475 bnxt_re_dispatch_event(&rdev->ibdev, NULL, 1, IB_EVENT_PORT_ACTIVE); 1476 - bnxt_re_dispatch_event(&rdev->ibdev, NULL, 1, IB_EVENT_GID_CHANGE); 1477 1476 1478 1477 return 0; 1479 1478 free_sctx:
+20 -25
drivers/infiniband/hw/cxgb3/iwch_provider.c
··· 991 991 static int iwch_query_port(struct ib_device *ibdev, 992 992 u8 port, struct ib_port_attr *props) 993 993 { 994 - struct iwch_dev *dev; 995 - struct net_device *netdev; 996 - struct in_device *inetdev; 997 - 998 994 pr_debug("%s ibdev %p\n", __func__, ibdev); 999 - 1000 - dev = to_iwch_dev(ibdev); 1001 - netdev = dev->rdev.port_info.lldevs[port-1]; 1002 - 1003 - /* props being zeroed by the caller, avoid zeroing it here */ 1004 - props->max_mtu = IB_MTU_4096; 1005 - props->active_mtu = ib_mtu_int_to_enum(netdev->mtu); 1006 - 1007 - if (!netif_carrier_ok(netdev)) 1008 - props->state = IB_PORT_DOWN; 1009 - else { 1010 - inetdev = in_dev_get(netdev); 1011 - if (inetdev) { 1012 - if (inetdev->ifa_list) 1013 - props->state = IB_PORT_ACTIVE; 1014 - else 1015 - props->state = IB_PORT_INIT; 1016 - in_dev_put(inetdev); 1017 - } else 1018 - props->state = IB_PORT_INIT; 1019 - } 1020 995 1021 996 props->port_cap_flags = 1022 997 IB_PORT_CM_SUP | ··· 1248 1273 INIT_RDMA_OBJ_SIZE(ib_ucontext, iwch_ucontext, ibucontext), 1249 1274 }; 1250 1275 1276 + static int set_netdevs(struct ib_device *ib_dev, struct cxio_rdev *rdev) 1277 + { 1278 + int ret; 1279 + int i; 1280 + 1281 + for (i = 0; i < rdev->port_info.nports; i++) { 1282 + ret = ib_device_set_netdev(ib_dev, rdev->port_info.lldevs[i], 1283 + i + 1); 1284 + if (ret) 1285 + return ret; 1286 + } 1287 + return 0; 1288 + } 1289 + 1251 1290 int iwch_register_device(struct iwch_dev *dev) 1252 1291 { 1292 + int err; 1293 + 1253 1294 pr_debug("%s iwch_dev %p\n", __func__, dev); 1254 1295 memset(&dev->ibdev.node_guid, 0, sizeof(dev->ibdev.node_guid)); 1255 1296 memcpy(&dev->ibdev.node_guid, dev->rdev.t3cdev_p->lldev->dev_addr, 6); ··· 1306 1315 1307 1316 rdma_set_device_sysfs_group(&dev->ibdev, &iwch_attr_group); 1308 1317 ib_set_device_ops(&dev->ibdev, &iwch_dev_ops); 1318 + err = set_netdevs(&dev->ibdev, &dev->rdev); 1319 + if (err) 1320 + return err; 1321 + 1309 1322 return ib_register_device(&dev->ibdev, "cxgb3_%d"); 1310 1323 } 1311 1324
-24
drivers/infiniband/hw/cxgb4/provider.c
··· 305 305 static int c4iw_query_port(struct ib_device *ibdev, u8 port, 306 306 struct ib_port_attr *props) 307 307 { 308 - struct c4iw_dev *dev; 309 - struct net_device *netdev; 310 - struct in_device *inetdev; 311 - 312 308 pr_debug("ibdev %p\n", ibdev); 313 - 314 - dev = to_c4iw_dev(ibdev); 315 - netdev = dev->rdev.lldi.ports[port-1]; 316 - /* props being zeroed by the caller, avoid zeroing it here */ 317 - props->max_mtu = IB_MTU_4096; 318 - props->active_mtu = ib_mtu_int_to_enum(netdev->mtu); 319 - 320 - if (!netif_carrier_ok(netdev)) 321 - props->state = IB_PORT_DOWN; 322 - else { 323 - inetdev = in_dev_get(netdev); 324 - if (inetdev) { 325 - if (inetdev->ifa_list) 326 - props->state = IB_PORT_ACTIVE; 327 - else 328 - props->state = IB_PORT_INIT; 329 - in_dev_put(inetdev); 330 - } else 331 - props->state = IB_PORT_INIT; 332 - } 333 309 334 310 props->port_cap_flags = 335 311 IB_PORT_CM_SUP |
+3
drivers/infiniband/hw/efa/efa.h
··· 156 156 int qp_attr_mask, struct ib_udata *udata); 157 157 enum rdma_link_layer efa_port_link_layer(struct ib_device *ibdev, 158 158 u8 port_num); 159 + struct rdma_hw_stats *efa_alloc_hw_stats(struct ib_device *ibdev, u8 port_num); 160 + int efa_get_hw_stats(struct ib_device *ibdev, struct rdma_hw_stats *stats, 161 + u8 port_num, int index); 159 162 160 163 #endif /* _EFA_H_ */
+39 -31
drivers/infiniband/hw/efa/efa_com.c
··· 109 109 } while (time_is_after_jiffies(exp_time)); 110 110 111 111 if (read_resp->req_id != mmio_read->seq_num) { 112 - ibdev_err(edev->efa_dev, 113 - "Reading register timed out. expected: req id[%u] offset[%#x] actual: req id[%u] offset[%#x]\n", 114 - mmio_read->seq_num, offset, read_resp->req_id, 115 - read_resp->reg_off); 112 + ibdev_err_ratelimited( 113 + edev->efa_dev, 114 + "Reading register timed out. expected: req id[%u] offset[%#x] actual: req id[%u] offset[%#x]\n", 115 + mmio_read->seq_num, offset, read_resp->req_id, 116 + read_resp->reg_off); 116 117 err = EFA_MMIO_READ_INVALID; 117 118 goto out; 118 119 } 119 120 120 121 if (read_resp->reg_off != offset) { 121 - ibdev_err(edev->efa_dev, 122 - "Reading register failed: wrong offset provided\n"); 122 + ibdev_err_ratelimited( 123 + edev->efa_dev, 124 + "Reading register failed: wrong offset provided\n"); 123 125 err = EFA_MMIO_READ_INVALID; 124 126 goto out; 125 127 } ··· 295 293 u16 ctx_id = cmd_id & (aq->depth - 1); 296 294 297 295 if (aq->comp_ctx[ctx_id].occupied && capture) { 298 - ibdev_err(aq->efa_dev, 299 - "Completion context for command_id %#x is occupied\n", 300 - cmd_id); 296 + ibdev_err_ratelimited( 297 + aq->efa_dev, 298 + "Completion context for command_id %#x is occupied\n", 299 + cmd_id); 301 300 return NULL; 302 301 } 303 302 ··· 404 401 405 402 spin_lock(&aq->sq.lock); 406 403 if (!test_bit(EFA_AQ_STATE_RUNNING_BIT, &aq->state)) { 407 - ibdev_err(aq->efa_dev, "Admin queue is closed\n"); 404 + ibdev_err_ratelimited(aq->efa_dev, "Admin queue is closed\n"); 408 405 spin_unlock(&aq->sq.lock); 409 406 return ERR_PTR(-ENODEV); 410 407 } ··· 522 519 break; 523 520 524 521 if (time_is_before_jiffies(timeout)) { 525 - ibdev_err(aq->efa_dev, 526 - "Wait for completion (polling) timeout\n"); 522 + ibdev_err_ratelimited( 523 + aq->efa_dev, 524 + "Wait for completion (polling) timeout\n"); 527 525 /* EFA didn't have any completion */ 528 526 atomic64_inc(&aq->stats.no_completion); 529 527 ··· 565 561 atomic64_inc(&aq->stats.no_completion); 566 562 567 563 if (comp_ctx->status == EFA_CMD_COMPLETED) 568 - ibdev_err(aq->efa_dev, 569 - "The device sent a completion but the driver didn't receive any MSI-X interrupt for admin cmd %s(%d) status %d (ctx: 0x%p, sq producer: %d, sq consumer: %d, cq consumer: %d)\n", 570 - efa_com_cmd_str(comp_ctx->cmd_opcode), 571 - comp_ctx->cmd_opcode, comp_ctx->status, 572 - comp_ctx, aq->sq.pc, aq->sq.cc, aq->cq.cc); 564 + ibdev_err_ratelimited( 565 + aq->efa_dev, 566 + "The device sent a completion but the driver didn't receive any MSI-X interrupt for admin cmd %s(%d) status %d (ctx: 0x%p, sq producer: %d, sq consumer: %d, cq consumer: %d)\n", 567 + efa_com_cmd_str(comp_ctx->cmd_opcode), 568 + comp_ctx->cmd_opcode, comp_ctx->status, 569 + comp_ctx, aq->sq.pc, aq->sq.cc, aq->cq.cc); 573 570 else 574 - ibdev_err(aq->efa_dev, 575 - "The device didn't send any completion for admin cmd %s(%d) status %d (ctx 0x%p, sq producer: %d, sq consumer: %d, cq consumer: %d)\n", 576 - efa_com_cmd_str(comp_ctx->cmd_opcode), 577 - comp_ctx->cmd_opcode, comp_ctx->status, 578 - comp_ctx, aq->sq.pc, aq->sq.cc, aq->cq.cc); 571 + ibdev_err_ratelimited( 572 + aq->efa_dev, 573 + "The device didn't send any completion for admin cmd %s(%d) status %d (ctx 0x%p, sq producer: %d, sq consumer: %d, cq consumer: %d)\n", 574 + efa_com_cmd_str(comp_ctx->cmd_opcode), 575 + comp_ctx->cmd_opcode, comp_ctx->status, 576 + comp_ctx, aq->sq.pc, aq->sq.cc, aq->cq.cc); 579 577 580 578 clear_bit(EFA_AQ_STATE_RUNNING_BIT, &aq->state); 581 579 err = -ETIME; ··· 639 633 cmd->aq_common_descriptor.opcode); 640 634 comp_ctx = efa_com_submit_admin_cmd(aq, cmd, cmd_size, comp, comp_size); 641 635 if (IS_ERR(comp_ctx)) { 642 - ibdev_err(aq->efa_dev, 643 - "Failed to submit command %s (opcode %u) err %ld\n", 644 - efa_com_cmd_str(cmd->aq_common_descriptor.opcode), 645 - cmd->aq_common_descriptor.opcode, PTR_ERR(comp_ctx)); 636 + ibdev_err_ratelimited( 637 + aq->efa_dev, 638 + "Failed to submit command %s (opcode %u) err %ld\n", 639 + efa_com_cmd_str(cmd->aq_common_descriptor.opcode), 640 + cmd->aq_common_descriptor.opcode, PTR_ERR(comp_ctx)); 646 641 647 642 up(&aq->avail_cmds); 648 643 return PTR_ERR(comp_ctx); ··· 651 644 652 645 err = efa_com_wait_and_process_admin_cq(comp_ctx, aq); 653 646 if (err) 654 - ibdev_err(aq->efa_dev, 655 - "Failed to process command %s (opcode %u) comp_status %d err %d\n", 656 - efa_com_cmd_str(cmd->aq_common_descriptor.opcode), 657 - cmd->aq_common_descriptor.opcode, 658 - comp_ctx->comp_status, err); 647 + ibdev_err_ratelimited( 648 + aq->efa_dev, 649 + "Failed to process command %s (opcode %u) comp_status %d err %d\n", 650 + efa_com_cmd_str(cmd->aq_common_descriptor.opcode), 651 + cmd->aq_common_descriptor.opcode, comp_ctx->comp_status, 652 + err); 659 653 660 654 up(&aq->avail_cmds); 661 655
+113 -52
drivers/infiniband/hw/efa/efa_com_cmd.c
··· 44 44 (struct efa_admin_acq_entry *)&cmd_completion, 45 45 sizeof(cmd_completion)); 46 46 if (err) { 47 - ibdev_err(edev->efa_dev, "Failed to create qp [%d]\n", err); 47 + ibdev_err_ratelimited(edev->efa_dev, 48 + "Failed to create qp [%d]\n", err); 48 49 return err; 49 50 } 50 51 ··· 83 82 (struct efa_admin_acq_entry *)&resp, 84 83 sizeof(resp)); 85 84 if (err) { 86 - ibdev_err(edev->efa_dev, 87 - "Failed to modify qp-%u modify_mask[%#x] [%d]\n", 88 - cmd.qp_handle, cmd.modify_mask, err); 85 + ibdev_err_ratelimited( 86 + edev->efa_dev, 87 + "Failed to modify qp-%u modify_mask[%#x] [%d]\n", 88 + cmd.qp_handle, cmd.modify_mask, err); 89 89 return err; 90 90 } 91 91 ··· 111 109 (struct efa_admin_acq_entry *)&resp, 112 110 sizeof(resp)); 113 111 if (err) { 114 - ibdev_err(edev->efa_dev, "Failed to query qp-%u [%d]\n", 115 - cmd.qp_handle, err); 112 + ibdev_err_ratelimited(edev->efa_dev, 113 + "Failed to query qp-%u [%d]\n", 114 + cmd.qp_handle, err); 116 115 return err; 117 116 } 118 117 ··· 142 139 (struct efa_admin_acq_entry *)&cmd_completion, 143 140 sizeof(cmd_completion)); 144 141 if (err) { 145 - ibdev_err(edev->efa_dev, "Failed to destroy qp-%u [%d]\n", 146 - qp_cmd.qp_handle, err); 142 + ibdev_err_ratelimited(edev->efa_dev, 143 + "Failed to destroy qp-%u [%d]\n", 144 + qp_cmd.qp_handle, err); 147 145 return err; 148 146 } 149 147 ··· 177 173 (struct efa_admin_acq_entry *)&cmd_completion, 178 174 sizeof(cmd_completion)); 179 175 if (err) { 180 - ibdev_err(edev->efa_dev, "Failed to create cq[%d]\n", err); 176 + ibdev_err_ratelimited(edev->efa_dev, 177 + "Failed to create cq[%d]\n", err); 181 178 return err; 182 179 } 183 180 ··· 206 201 sizeof(destroy_resp)); 207 202 208 203 if (err) { 209 - ibdev_err(edev->efa_dev, "Failed to destroy CQ-%u [%d]\n", 210 - params->cq_idx, err); 204 + ibdev_err_ratelimited(edev->efa_dev, 205 + "Failed to destroy CQ-%u [%d]\n", 206 + params->cq_idx, err); 211 207 return err; 212 208 } 213 209 ··· 256 250 (struct efa_admin_acq_entry *)&cmd_completion, 257 251 sizeof(cmd_completion)); 258 252 if (err) { 259 - ibdev_err(edev->efa_dev, "Failed to register mr [%d]\n", err); 253 + ibdev_err_ratelimited(edev->efa_dev, 254 + "Failed to register mr [%d]\n", err); 260 255 return err; 261 256 } 262 257 ··· 284 277 (struct efa_admin_acq_entry *)&cmd_completion, 285 278 sizeof(cmd_completion)); 286 279 if (err) { 287 - ibdev_err(edev->efa_dev, 288 - "Failed to de-register mr(lkey-%u) [%d]\n", 289 - mr_cmd.l_key, err); 280 + ibdev_err_ratelimited(edev->efa_dev, 281 + "Failed to de-register mr(lkey-%u) [%d]\n", 282 + mr_cmd.l_key, err); 290 283 return err; 291 284 } 292 285 ··· 313 306 (struct efa_admin_acq_entry *)&cmd_completion, 314 307 sizeof(cmd_completion)); 315 308 if (err) { 316 - ibdev_err(edev->efa_dev, "Failed to create ah for %pI6 [%d]\n", 317 - ah_cmd.dest_addr, err); 309 + ibdev_err_ratelimited(edev->efa_dev, 310 + "Failed to create ah for %pI6 [%d]\n", 311 + ah_cmd.dest_addr, err); 318 312 return err; 319 313 } 320 314 ··· 342 334 (struct efa_admin_acq_entry *)&cmd_completion, 343 335 sizeof(cmd_completion)); 344 336 if (err) { 345 - ibdev_err(edev->efa_dev, "Failed to destroy ah-%d pd-%d [%d]\n", 346 - ah_cmd.ah, ah_cmd.pd, err); 337 + ibdev_err_ratelimited(edev->efa_dev, 338 + "Failed to destroy ah-%d pd-%d [%d]\n", 339 + ah_cmd.ah, ah_cmd.pd, err); 347 340 return err; 348 341 } 349 342 ··· 376 367 int err; 377 368 378 369 if (!efa_com_check_supported_feature_id(edev, feature_id)) { 379 - ibdev_err(edev->efa_dev, "Feature %d isn't supported\n", 380 - feature_id); 370 + ibdev_err_ratelimited(edev->efa_dev, 371 + "Feature %d isn't supported\n", 372 + feature_id); 381 373 return -EOPNOTSUPP; 382 374 } 383 375 ··· 406 396 sizeof(*get_resp)); 407 397 408 398 if (err) { 409 - ibdev_err(edev->efa_dev, 410 - "Failed to submit get_feature command %d [%d]\n", 411 - feature_id, err); 399 + ibdev_err_ratelimited( 400 + edev->efa_dev, 401 + "Failed to submit get_feature command %d [%d]\n", 402 + feature_id, err); 412 403 return err; 413 404 } 414 405 ··· 432 421 err = efa_com_get_feature(edev, &resp, 433 422 EFA_ADMIN_NETWORK_ATTR); 434 423 if (err) { 435 - ibdev_err(edev->efa_dev, 436 - "Failed to get network attributes %d\n", err); 424 + ibdev_err_ratelimited(edev->efa_dev, 425 + "Failed to get network attributes %d\n", 426 + err); 437 427 return err; 438 428 } 439 429 ··· 453 441 454 442 err = efa_com_get_feature(edev, &resp, EFA_ADMIN_DEVICE_ATTR); 455 443 if (err) { 456 - ibdev_err(edev->efa_dev, "Failed to get device attributes %d\n", 457 - err); 444 + ibdev_err_ratelimited(edev->efa_dev, 445 + "Failed to get device attributes %d\n", 446 + err); 458 447 return err; 459 448 } 460 449 ··· 469 456 result->db_bar = resp.u.device_attr.db_bar; 470 457 471 458 if (result->admin_api_version < 1) { 472 - ibdev_err(edev->efa_dev, 473 - "Failed to get device attr api version [%u < 1]\n", 474 - result->admin_api_version); 459 + ibdev_err_ratelimited( 460 + edev->efa_dev, 461 + "Failed to get device attr api version [%u < 1]\n", 462 + result->admin_api_version); 475 463 return -EINVAL; 476 464 } 477 465 ··· 480 466 err = efa_com_get_feature(edev, &resp, 481 467 EFA_ADMIN_QUEUE_ATTR); 482 468 if (err) { 483 - ibdev_err(edev->efa_dev, 484 - "Failed to get network attributes %d\n", err); 469 + ibdev_err_ratelimited(edev->efa_dev, 470 + "Failed to get queue attributes %d\n", 471 + err); 485 472 return err; 486 473 } 487 474 ··· 512 497 513 498 err = efa_com_get_feature(edev, &resp, EFA_ADMIN_HW_HINTS); 514 499 if (err) { 515 - ibdev_err(edev->efa_dev, "Failed to get hw hints %d\n", err); 500 + ibdev_err_ratelimited(edev->efa_dev, 501 + "Failed to get hw hints %d\n", err); 516 502 return err; 517 503 } 518 504 ··· 536 520 int err; 537 521 538 522 if (!efa_com_check_supported_feature_id(edev, feature_id)) { 539 - ibdev_err(edev->efa_dev, "Feature %d isn't supported\n", 540 - feature_id); 523 + ibdev_err_ratelimited(edev->efa_dev, 524 + "Feature %d isn't supported\n", 525 + feature_id); 541 526 return -EOPNOTSUPP; 542 527 } 543 528 ··· 562 545 sizeof(*set_resp)); 563 546 564 547 if (err) { 565 - ibdev_err(edev->efa_dev, 566 - "Failed to submit set_feature command %d error: %d\n", 567 - feature_id, err); 548 + ibdev_err_ratelimited( 549 + edev->efa_dev, 550 + "Failed to submit set_feature command %d error: %d\n", 551 + feature_id, err); 568 552 return err; 569 553 } 570 554 ··· 592 574 593 575 err = efa_com_get_feature(edev, &get_resp, EFA_ADMIN_AENQ_CONFIG); 594 576 if (err) { 595 - ibdev_err(edev->efa_dev, "Failed to get aenq attributes: %d\n", 596 - err); 577 + ibdev_err_ratelimited(edev->efa_dev, 578 + "Failed to get aenq attributes: %d\n", 579 + err); 597 580 return err; 598 581 } 599 582 ··· 604 585 get_resp.u.aenq.enabled_groups); 605 586 606 587 if ((get_resp.u.aenq.supported_groups & groups) != groups) { 607 - ibdev_err(edev->efa_dev, 608 - "Trying to set unsupported aenq groups[%#x] supported[%#x]\n", 609 - groups, get_resp.u.aenq.supported_groups); 588 + ibdev_err_ratelimited( 589 + edev->efa_dev, 590 + "Trying to set unsupported aenq groups[%#x] supported[%#x]\n", 591 + groups, get_resp.u.aenq.supported_groups); 610 592 return -EOPNOTSUPP; 611 593 } 612 594 ··· 615 595 err = efa_com_set_feature(edev, &set_resp, &cmd, 616 596 EFA_ADMIN_AENQ_CONFIG); 617 597 if (err) { 618 - ibdev_err(edev->efa_dev, "Failed to set aenq attributes: %d\n", 619 - err); 598 + ibdev_err_ratelimited(edev->efa_dev, 599 + "Failed to set aenq attributes: %d\n", 600 + err); 620 601 return err; 621 602 } 622 603 ··· 640 619 (struct efa_admin_acq_entry *)&resp, 641 620 sizeof(resp)); 642 621 if (err) { 643 - ibdev_err(edev->efa_dev, "Failed to allocate pd[%d]\n", err); 622 + ibdev_err_ratelimited(edev->efa_dev, 623 + "Failed to allocate pd[%d]\n", err); 644 624 return err; 645 625 } 646 626 ··· 667 645 (struct efa_admin_acq_entry *)&resp, 668 646 sizeof(resp)); 669 647 if (err) { 670 - ibdev_err(edev->efa_dev, "Failed to deallocate pd-%u [%d]\n", 671 - cmd.pd, err); 648 + ibdev_err_ratelimited(edev->efa_dev, 649 + "Failed to deallocate pd-%u [%d]\n", 650 + cmd.pd, err); 672 651 return err; 673 652 } 674 653 ··· 692 669 (struct efa_admin_acq_entry *)&resp, 693 670 sizeof(resp)); 694 671 if (err) { 695 - ibdev_err(edev->efa_dev, "Failed to allocate uar[%d]\n", err); 672 + ibdev_err_ratelimited(edev->efa_dev, 673 + "Failed to allocate uar[%d]\n", err); 696 674 return err; 697 675 } 698 676 ··· 719 695 (struct efa_admin_acq_entry *)&resp, 720 696 sizeof(resp)); 721 697 if (err) { 722 - ibdev_err(edev->efa_dev, "Failed to deallocate uar-%u [%d]\n", 723 - cmd.uar, err); 698 + ibdev_err_ratelimited(edev->efa_dev, 699 + "Failed to deallocate uar-%u [%d]\n", 700 + cmd.uar, err); 724 701 return err; 725 702 } 703 + 704 + return 0; 705 + } 706 + 707 + int efa_com_get_stats(struct efa_com_dev *edev, 708 + struct efa_com_get_stats_params *params, 709 + union efa_com_get_stats_result *result) 710 + { 711 + struct efa_com_admin_queue *aq = &edev->aq; 712 + struct efa_admin_aq_get_stats_cmd cmd = {}; 713 + struct efa_admin_acq_get_stats_resp resp; 714 + int err; 715 + 716 + cmd.aq_common_descriptor.opcode = EFA_ADMIN_GET_STATS; 717 + cmd.type = params->type; 718 + cmd.scope = params->scope; 719 + cmd.scope_modifier = params->scope_modifier; 720 + 721 + err = efa_com_cmd_exec(aq, 722 + (struct efa_admin_aq_entry *)&cmd, 723 + sizeof(cmd), 724 + (struct efa_admin_acq_entry *)&resp, 725 + sizeof(resp)); 726 + if (err) { 727 + ibdev_err_ratelimited( 728 + edev->efa_dev, 729 + "Failed to get stats type-%u scope-%u.%u [%d]\n", 730 + cmd.type, cmd.scope, cmd.scope_modifier, err); 731 + return err; 732 + } 733 + 734 + result->basic_stats.tx_bytes = resp.basic_stats.tx_bytes; 735 + result->basic_stats.tx_pkts = resp.basic_stats.tx_pkts; 736 + result->basic_stats.rx_bytes = resp.basic_stats.rx_bytes; 737 + result->basic_stats.rx_pkts = resp.basic_stats.rx_pkts; 738 + result->basic_stats.rx_drops = resp.basic_stats.rx_drops; 726 739 727 740 return 0; 728 741 }
+23
drivers/infiniband/hw/efa/efa_com_cmd.h
··· 225 225 u16 uarn; 226 226 }; 227 227 228 + struct efa_com_get_stats_params { 229 + /* see enum efa_admin_get_stats_type */ 230 + u8 type; 231 + /* see enum efa_admin_get_stats_scope */ 232 + u8 scope; 233 + u16 scope_modifier; 234 + }; 235 + 236 + struct efa_com_basic_stats { 237 + u64 tx_bytes; 238 + u64 tx_pkts; 239 + u64 rx_bytes; 240 + u64 rx_pkts; 241 + u64 rx_drops; 242 + }; 243 + 244 + union efa_com_get_stats_result { 245 + struct efa_com_basic_stats basic_stats; 246 + }; 247 + 228 248 void efa_com_set_dma_addr(dma_addr_t addr, u32 *addr_high, u32 *addr_low); 229 249 int efa_com_create_qp(struct efa_com_dev *edev, 230 250 struct efa_com_create_qp_params *params, ··· 286 266 struct efa_com_alloc_uar_result *result); 287 267 int efa_com_dealloc_uar(struct efa_com_dev *edev, 288 268 struct efa_com_dealloc_uar_params *params); 269 + int efa_com_get_stats(struct efa_com_dev *edev, 270 + struct efa_com_get_stats_params *params, 271 + union efa_com_get_stats_result *result); 289 272 290 273 #endif /* _EFA_COM_CMD_H_ */
+2
drivers/infiniband/hw/efa/efa_main.c
··· 201 201 .driver_id = RDMA_DRIVER_EFA, 202 202 .uverbs_abi_ver = EFA_UVERBS_ABI_VERSION, 203 203 204 + .alloc_hw_stats = efa_alloc_hw_stats, 204 205 .alloc_pd = efa_alloc_pd, 205 206 .alloc_ucontext = efa_alloc_ucontext, 206 207 .create_ah = efa_create_ah, ··· 213 212 .destroy_ah = efa_destroy_ah, 214 213 .destroy_cq = efa_destroy_cq, 215 214 .destroy_qp = efa_destroy_qp, 215 + .get_hw_stats = efa_get_hw_stats, 216 216 .get_link_layer = efa_port_link_layer, 217 217 .get_port_immutable = efa_get_port_immutable, 218 218 .mmap = efa_mmap,
+82 -9
drivers/infiniband/hw/efa/efa_verbs.c
··· 41 41 ((u64)efa->mmap_page << PAGE_SHIFT); 42 42 } 43 43 44 + #define EFA_DEFINE_STATS(op) \ 45 + op(EFA_TX_BYTES, "tx_bytes") \ 46 + op(EFA_TX_PKTS, "tx_pkts") \ 47 + op(EFA_RX_BYTES, "rx_bytes") \ 48 + op(EFA_RX_PKTS, "rx_pkts") \ 49 + op(EFA_RX_DROPS, "rx_drops") \ 50 + op(EFA_SUBMITTED_CMDS, "submitted_cmds") \ 51 + op(EFA_COMPLETED_CMDS, "completed_cmds") \ 52 + op(EFA_NO_COMPLETION_CMDS, "no_completion_cmds") \ 53 + op(EFA_KEEP_ALIVE_RCVD, "keep_alive_rcvd") \ 54 + op(EFA_ALLOC_PD_ERR, "alloc_pd_err") \ 55 + op(EFA_CREATE_QP_ERR, "create_qp_err") \ 56 + op(EFA_REG_MR_ERR, "reg_mr_err") \ 57 + op(EFA_ALLOC_UCONTEXT_ERR, "alloc_ucontext_err") \ 58 + op(EFA_CREATE_AH_ERR, "create_ah_err") 59 + 60 + #define EFA_STATS_ENUM(ename, name) ename, 61 + #define EFA_STATS_STR(ename, name) [ename] = name, 62 + 63 + enum efa_hw_stats { 64 + EFA_DEFINE_STATS(EFA_STATS_ENUM) 65 + }; 66 + 67 + static const char *const efa_stats_names[] = { 68 + EFA_DEFINE_STATS(EFA_STATS_STR) 69 + }; 70 + 44 71 #define EFA_CHUNK_PAYLOAD_SHIFT 12 45 72 #define EFA_CHUNK_PAYLOAD_SIZE BIT(EFA_CHUNK_PAYLOAD_SHIFT) 46 73 #define EFA_CHUNK_PAYLOAD_PTR_SIZE 8 ··· 148 121 } 149 122 150 123 #define field_avail(x, fld, sz) (offsetof(typeof(x), fld) + \ 151 - sizeof(((typeof(x) *)0)->fld) <= (sz)) 124 + FIELD_SIZEOF(typeof(x), fld) <= (sz)) 152 125 153 126 #define is_reserved_cleared(reserved) \ 154 127 !memchr_inv(reserved, 0, sizeof(reserved)) ··· 333 306 props->lmc = 1; 334 307 335 308 props->state = IB_PORT_ACTIVE; 336 - props->phys_state = 5; 309 + props->phys_state = IB_PORT_PHYS_STATE_LINK_UP; 337 310 props->gid_tbl_len = 1; 338 311 props->pkey_tbl_len = 1; 339 312 props->active_speed = IB_SPEED_EDR; ··· 1500 1473 1501 1474 ibdev_dbg(&dev->ibdev, "Deregister mr[%d]\n", ibmr->lkey); 1502 1475 1503 - if (mr->umem) { 1504 - params.l_key = mr->ibmr.lkey; 1505 - err = efa_com_dereg_mr(&dev->edev, &params); 1506 - if (err) 1507 - return err; 1508 - } 1509 - ib_umem_release(mr->umem); 1476 + params.l_key = mr->ibmr.lkey; 1477 + err = efa_com_dereg_mr(&dev->edev, &params); 1478 + if (err) 1479 + return err; 1510 1480 1481 + ib_umem_release(mr->umem); 1511 1482 kfree(mr); 1512 1483 1513 1484 return 0; ··· 1750 1725 } 1751 1726 1752 1727 efa_ah_destroy(dev, ah); 1728 + } 1729 + 1730 + struct rdma_hw_stats *efa_alloc_hw_stats(struct ib_device *ibdev, u8 port_num) 1731 + { 1732 + return rdma_alloc_hw_stats_struct(efa_stats_names, 1733 + ARRAY_SIZE(efa_stats_names), 1734 + RDMA_HW_STATS_DEFAULT_LIFESPAN); 1735 + } 1736 + 1737 + int efa_get_hw_stats(struct ib_device *ibdev, struct rdma_hw_stats *stats, 1738 + u8 port_num, int index) 1739 + { 1740 + struct efa_com_get_stats_params params = {}; 1741 + union efa_com_get_stats_result result; 1742 + struct efa_dev *dev = to_edev(ibdev); 1743 + struct efa_com_basic_stats *bs; 1744 + struct efa_com_stats_admin *as; 1745 + struct efa_stats *s; 1746 + int err; 1747 + 1748 + params.type = EFA_ADMIN_GET_STATS_TYPE_BASIC; 1749 + params.scope = EFA_ADMIN_GET_STATS_SCOPE_ALL; 1750 + 1751 + err = efa_com_get_stats(&dev->edev, &params, &result); 1752 + if (err) 1753 + return err; 1754 + 1755 + bs = &result.basic_stats; 1756 + stats->value[EFA_TX_BYTES] = bs->tx_bytes; 1757 + stats->value[EFA_TX_PKTS] = bs->tx_pkts; 1758 + stats->value[EFA_RX_BYTES] = bs->rx_bytes; 1759 + stats->value[EFA_RX_PKTS] = bs->rx_pkts; 1760 + stats->value[EFA_RX_DROPS] = bs->rx_drops; 1761 + 1762 + as = &dev->edev.aq.stats; 1763 + stats->value[EFA_SUBMITTED_CMDS] = atomic64_read(&as->submitted_cmd); 1764 + stats->value[EFA_COMPLETED_CMDS] = atomic64_read(&as->completed_cmd); 1765 + stats->value[EFA_NO_COMPLETION_CMDS] = atomic64_read(&as->no_completion); 1766 + 1767 + s = &dev->stats; 1768 + stats->value[EFA_KEEP_ALIVE_RCVD] = atomic64_read(&s->keep_alive_rcvd); 1769 + stats->value[EFA_ALLOC_PD_ERR] = atomic64_read(&s->sw_stats.alloc_pd_err); 1770 + stats->value[EFA_CREATE_QP_ERR] = atomic64_read(&s->sw_stats.create_qp_err); 1771 + stats->value[EFA_REG_MR_ERR] = atomic64_read(&s->sw_stats.reg_mr_err); 1772 + stats->value[EFA_ALLOC_UCONTEXT_ERR] = atomic64_read(&s->sw_stats.alloc_ucontext_err); 1773 + stats->value[EFA_CREATE_AH_ERR] = atomic64_read(&s->sw_stats.create_ah_err); 1774 + 1775 + return ARRAY_SIZE(efa_stats_names); 1753 1776 } 1754 1777 1755 1778 enum rdma_link_layer efa_port_link_layer(struct ib_device *ibdev,
+2
drivers/infiniband/hw/hfi1/chip.c
··· 4101 4101 def_access_ibp_counter(rdma_seq); 4102 4102 def_access_ibp_counter(unaligned); 4103 4103 def_access_ibp_counter(seq_naks); 4104 + def_access_ibp_counter(rc_crwaits); 4104 4105 4105 4106 static struct cntr_entry dev_cntrs[DEV_CNTR_LAST] = { 4106 4107 [C_RCV_OVF] = RXE32_DEV_CNTR_ELEM(RcvOverflow, RCV_BUF_OVFL_CNT, CNTR_SYNTH), ··· 5120 5119 [C_SW_IBP_RDMA_SEQ] = SW_IBP_CNTR(RdmaSeq, rdma_seq), 5121 5120 [C_SW_IBP_UNALIGNED] = SW_IBP_CNTR(Unaligned, unaligned), 5122 5121 [C_SW_IBP_SEQ_NAK] = SW_IBP_CNTR(SeqNak, seq_naks), 5122 + [C_SW_IBP_RC_CRWAITS] = SW_IBP_CNTR(RcCrWait, rc_crwaits), 5123 5123 [C_SW_CPU_RC_ACKS] = CNTR_ELEM("RcAcks", 0, 0, CNTR_NORMAL, 5124 5124 access_sw_cpu_rc_acks), 5125 5125 [C_SW_CPU_RC_QACKS] = CNTR_ELEM("RcQacks", 0, 0, CNTR_NORMAL,
+1
drivers/infiniband/hw/hfi1/chip.h
··· 1245 1245 C_SW_IBP_RDMA_SEQ, 1246 1246 C_SW_IBP_UNALIGNED, 1247 1247 C_SW_IBP_SEQ_NAK, 1248 + C_SW_IBP_RC_CRWAITS, 1248 1249 C_SW_CPU_RC_ACKS, 1249 1250 C_SW_CPU_RC_QACKS, 1250 1251 C_SW_CPU_RC_DELAYED_COMP,
+19 -26
drivers/infiniband/hw/hfi1/mad.c
··· 2326 2326 __be32 vl_select_mask; 2327 2327 }; 2328 2328 2329 - #define VL_MASK_ALL 0x000080ff 2329 + #define VL_MASK_ALL 0x00000000000080ffUL 2330 2330 2331 2331 struct opa_port_status_rsp { 2332 2332 __u8 port_num; ··· 2625 2625 } 2626 2626 2627 2627 static void a0_portstatus(struct hfi1_pportdata *ppd, 2628 - struct opa_port_status_rsp *rsp, u32 vl_select_mask) 2628 + struct opa_port_status_rsp *rsp) 2629 2629 { 2630 2630 if (!is_bx(ppd->dd)) { 2631 2631 unsigned long vl; 2632 2632 u64 sum_vl_xmit_wait = 0; 2633 - u32 vl_all_mask = VL_MASK_ALL; 2633 + unsigned long vl_all_mask = VL_MASK_ALL; 2634 2634 2635 - for_each_set_bit(vl, (unsigned long *)&(vl_all_mask), 2636 - 8 * sizeof(vl_all_mask)) { 2635 + for_each_set_bit(vl, &vl_all_mask, BITS_PER_LONG) { 2637 2636 u64 tmp = sum_vl_xmit_wait + 2638 2637 read_port_cntr(ppd, C_TX_WAIT_VL, 2639 2638 idx_from_vl(vl)); ··· 2729 2730 (struct opa_port_status_req *)pmp->data; 2730 2731 struct hfi1_devdata *dd = dd_from_ibdev(ibdev); 2731 2732 struct opa_port_status_rsp *rsp; 2732 - u32 vl_select_mask = be32_to_cpu(req->vl_select_mask); 2733 + unsigned long vl_select_mask = be32_to_cpu(req->vl_select_mask); 2733 2734 unsigned long vl; 2734 2735 size_t response_data_size; 2735 2736 u32 nports = be32_to_cpu(pmp->mad_hdr.attr_mod) >> 24; 2736 2737 u8 port_num = req->port_num; 2737 - u8 num_vls = hweight32(vl_select_mask); 2738 + u8 num_vls = hweight64(vl_select_mask); 2738 2739 struct _vls_pctrs *vlinfo; 2739 2740 struct hfi1_ibport *ibp = to_iport(ibdev, port); 2740 2741 struct hfi1_pportdata *ppd = ppd_from_ibp(ibp); ··· 2769 2770 2770 2771 hfi1_read_link_quality(dd, &rsp->link_quality_indicator); 2771 2772 2772 - rsp->vl_select_mask = cpu_to_be32(vl_select_mask); 2773 + rsp->vl_select_mask = cpu_to_be32((u32)vl_select_mask); 2773 2774 rsp->port_xmit_data = cpu_to_be64(read_dev_cntr(dd, C_DC_XMIT_FLITS, 2774 2775 CNTR_INVALID_VL)); 2775 2776 rsp->port_rcv_data = cpu_to_be64(read_dev_cntr(dd, C_DC_RCV_FLITS, ··· 2840 2841 * So in the for_each_set_bit() loop below, we don't need 2841 2842 * any additional checks for vl. 2842 2843 */ 2843 - for_each_set_bit(vl, (unsigned long *)&(vl_select_mask), 2844 - 8 * sizeof(vl_select_mask)) { 2844 + for_each_set_bit(vl, &vl_select_mask, BITS_PER_LONG) { 2845 2845 memset(vlinfo, 0, sizeof(*vlinfo)); 2846 2846 2847 2847 tmp = read_dev_cntr(dd, C_DC_RX_FLIT_VL, idx_from_vl(vl)); ··· 2881 2883 vfi++; 2882 2884 } 2883 2885 2884 - a0_portstatus(ppd, rsp, vl_select_mask); 2886 + a0_portstatus(ppd, rsp); 2885 2887 2886 2888 if (resp_len) 2887 2889 *resp_len += response_data_size; ··· 2928 2930 return error_counter_summary; 2929 2931 } 2930 2932 2931 - static void a0_datacounters(struct hfi1_pportdata *ppd, struct _port_dctrs *rsp, 2932 - u32 vl_select_mask) 2933 + static void a0_datacounters(struct hfi1_pportdata *ppd, struct _port_dctrs *rsp) 2933 2934 { 2934 2935 if (!is_bx(ppd->dd)) { 2935 2936 unsigned long vl; 2936 2937 u64 sum_vl_xmit_wait = 0; 2937 - u32 vl_all_mask = VL_MASK_ALL; 2938 + unsigned long vl_all_mask = VL_MASK_ALL; 2938 2939 2939 - for_each_set_bit(vl, (unsigned long *)&(vl_all_mask), 2940 - 8 * sizeof(vl_all_mask)) { 2940 + for_each_set_bit(vl, &vl_all_mask, BITS_PER_LONG) { 2941 2941 u64 tmp = sum_vl_xmit_wait + 2942 2942 read_port_cntr(ppd, C_TX_WAIT_VL, 2943 2943 idx_from_vl(vl)); ··· 2990 2994 u64 port_mask; 2991 2995 u8 port_num; 2992 2996 unsigned long vl; 2993 - u32 vl_select_mask; 2997 + unsigned long vl_select_mask; 2994 2998 int vfi; 2995 2999 u16 link_width; 2996 3000 u16 link_speed; ··· 3067 3071 * So in the for_each_set_bit() loop below, we don't need 3068 3072 * any additional checks for vl. 3069 3073 */ 3070 - for_each_set_bit(vl, (unsigned long *)&(vl_select_mask), 3071 - 8 * sizeof(req->vl_select_mask)) { 3074 + for_each_set_bit(vl, &vl_select_mask, BITS_PER_LONG) { 3072 3075 memset(vlinfo, 0, sizeof(*vlinfo)); 3073 3076 3074 3077 rsp->vls[vfi].port_vl_xmit_data = ··· 3115 3120 vfi++; 3116 3121 } 3117 3122 3118 - a0_datacounters(ppd, rsp, vl_select_mask); 3123 + a0_datacounters(ppd, rsp); 3119 3124 3120 3125 if (resp_len) 3121 3126 *resp_len += response_data_size; ··· 3210 3215 struct _vls_ectrs *vlinfo; 3211 3216 unsigned long vl; 3212 3217 u64 port_mask, tmp; 3213 - u32 vl_select_mask; 3218 + unsigned long vl_select_mask; 3214 3219 int vfi; 3215 3220 3216 3221 req = (struct opa_port_error_counters64_msg *)pmp->data; ··· 3268 3273 vlinfo = &rsp->vls[0]; 3269 3274 vfi = 0; 3270 3275 vl_select_mask = be32_to_cpu(req->vl_select_mask); 3271 - for_each_set_bit(vl, (unsigned long *)&(vl_select_mask), 3272 - 8 * sizeof(req->vl_select_mask)) { 3276 + for_each_set_bit(vl, &vl_select_mask, BITS_PER_LONG) { 3273 3277 memset(vlinfo, 0, sizeof(*vlinfo)); 3274 3278 rsp->vls[vfi].port_vl_xmit_discards = 3275 3279 cpu_to_be64(read_port_cntr(ppd, C_SW_XMIT_DSCD_VL, ··· 3479 3485 u32 nports = be32_to_cpu(pmp->mad_hdr.attr_mod) >> 24; 3480 3486 u64 portn = be64_to_cpu(req->port_select_mask[3]); 3481 3487 u32 counter_select = be32_to_cpu(req->counter_select_mask); 3482 - u32 vl_select_mask = VL_MASK_ALL; /* clear all per-vl cnts */ 3488 + unsigned long vl_select_mask = VL_MASK_ALL; /* clear all per-vl cnts */ 3483 3489 unsigned long vl; 3484 3490 3485 3491 if ((nports != 1) || (portn != 1 << port)) { ··· 3573 3579 if (counter_select & CS_UNCORRECTABLE_ERRORS) 3574 3580 write_dev_cntr(dd, C_DC_UNC_ERR, CNTR_INVALID_VL, 0); 3575 3581 3576 - for_each_set_bit(vl, (unsigned long *)&(vl_select_mask), 3577 - 8 * sizeof(vl_select_mask)) { 3582 + for_each_set_bit(vl, &vl_select_mask, BITS_PER_LONG) { 3578 3583 if (counter_select & CS_PORT_XMIT_DATA) 3579 3584 write_port_cntr(ppd, C_TX_FLIT_VL, idx_from_vl(vl), 0); 3580 3585
+7 -8
drivers/infiniband/hw/hfi1/rc.c
··· 595 595 case IB_WR_SEND_WITH_IMM: 596 596 case IB_WR_SEND_WITH_INV: 597 597 /* If no credit, return. */ 598 - if (!(qp->s_flags & RVT_S_UNLIMITED_CREDIT) && 599 - rvt_cmp_msn(wqe->ssn, qp->s_lsn + 1) > 0) { 600 - qp->s_flags |= RVT_S_WAIT_SSN_CREDIT; 598 + if (!rvt_rc_credit_avail(qp, wqe)) 601 599 goto bail; 602 - } 603 600 if (len > pmtu) { 604 601 qp->s_state = OP(SEND_FIRST); 605 602 len = pmtu; ··· 629 632 goto no_flow_control; 630 633 case IB_WR_RDMA_WRITE_WITH_IMM: 631 634 /* If no credit, return. */ 632 - if (!(qp->s_flags & RVT_S_UNLIMITED_CREDIT) && 633 - rvt_cmp_msn(wqe->ssn, qp->s_lsn + 1) > 0) { 634 - qp->s_flags |= RVT_S_WAIT_SSN_CREDIT; 635 + if (!rvt_rc_credit_avail(qp, wqe)) 635 636 goto bail; 636 - } 637 637 no_flow_control: 638 638 put_ib_reth_vaddr( 639 639 wqe->rdma_wr.remote_addr, ··· 1477 1483 req->ack_pending = cur_seg - req->comp_seg; 1478 1484 priv->pending_tid_r_segs += req->ack_pending; 1479 1485 qp->s_num_rd_atomic += req->ack_pending; 1486 + trace_hfi1_tid_req_update_num_rd_atomic(qp, 0, 1487 + wqe->wr.opcode, 1488 + wqe->psn, 1489 + wqe->lpsn, 1490 + req); 1480 1491 } else { 1481 1492 priv->pending_tid_r_segs += req->total_segs; 1482 1493 qp->s_num_rd_atomic += req->total_segs;
+8
drivers/infiniband/hw/hfi1/tid_rdma.c
··· 2646 2646 u32 fpsn; 2647 2647 2648 2648 lockdep_assert_held(&qp->r_lock); 2649 + trace_hfi1_rsp_read_kdeth_eflags(qp, ibpsn); 2650 + trace_hfi1_sender_read_kdeth_eflags(qp); 2651 + trace_hfi1_tid_read_sender_kdeth_eflags(qp, 0); 2649 2652 spin_lock(&qp->s_lock); 2650 2653 /* If the psn is out of valid range, drop the packet */ 2651 2654 if (cmp_psn(ibpsn, qp->s_last_psn) < 0 || ··· 2713 2710 goto s_unlock; 2714 2711 2715 2712 req = wqe_to_tid_req(wqe); 2713 + trace_hfi1_tid_req_read_kdeth_eflags(qp, 0, wqe->wr.opcode, wqe->psn, 2714 + wqe->lpsn, req); 2716 2715 switch (rcv_type) { 2717 2716 case RHF_RCV_TYPE_EXPECTED: 2718 2717 switch (rte) { ··· 2729 2724 * packets that could be still in the fabric. 2730 2725 */ 2731 2726 flow = &req->flows[req->clear_tail]; 2727 + trace_hfi1_tid_flow_read_kdeth_eflags(qp, 2728 + req->clear_tail, 2729 + flow); 2732 2730 if (priv->s_flags & HFI1_R_TID_SW_PSN) { 2733 2731 diff = cmp_psn(psn, 2734 2732 flow->flow_state.r_next_psn);
+38
drivers/infiniband/hw/hfi1/trace_tid.h
··· 627 627 TP_ARGS(qp, index, flow) 628 628 ); 629 629 630 + DEFINE_EVENT(/* event */ 631 + hfi1_tid_flow_template, hfi1_tid_flow_read_kdeth_eflags, 632 + TP_PROTO(struct rvt_qp *qp, int index, struct tid_rdma_flow *flow), 633 + TP_ARGS(qp, index, flow) 634 + ); 635 + 630 636 DECLARE_EVENT_CLASS(/* tid_node */ 631 637 hfi1_tid_node_template, 632 638 TP_PROTO(struct rvt_qp *qp, const char *msg, u32 index, u32 base, ··· 857 851 TP_ARGS(qp, psn) 858 852 ); 859 853 854 + DEFINE_EVENT(/* event */ 855 + hfi1_responder_info_template, hfi1_rsp_read_kdeth_eflags, 856 + TP_PROTO(struct rvt_qp *qp, u32 psn), 857 + TP_ARGS(qp, psn) 858 + ); 859 + 860 860 DECLARE_EVENT_CLASS(/* sender_info */ 861 861 hfi1_sender_info_template, 862 862 TP_PROTO(struct rvt_qp *qp), ··· 967 955 TP_ARGS(qp) 968 956 ); 969 957 958 + DEFINE_EVENT(/* event */ 959 + hfi1_sender_info_template, hfi1_sender_read_kdeth_eflags, 960 + TP_PROTO(struct rvt_qp *qp), 961 + TP_ARGS(qp) 962 + ); 963 + 970 964 DECLARE_EVENT_CLASS(/* tid_read_sender */ 971 965 hfi1_tid_read_sender_template, 972 966 TP_PROTO(struct rvt_qp *qp, char newreq), ··· 1029 1011 1030 1012 DEFINE_EVENT(/* event */ 1031 1013 hfi1_tid_read_sender_template, hfi1_tid_read_sender_make_req, 1014 + TP_PROTO(struct rvt_qp *qp, char newreq), 1015 + TP_ARGS(qp, newreq) 1016 + ); 1017 + 1018 + DEFINE_EVENT(/* event */ 1019 + hfi1_tid_read_sender_template, hfi1_tid_read_sender_kdeth_eflags, 1032 1020 TP_PROTO(struct rvt_qp *qp, char newreq), 1033 1021 TP_ARGS(qp, newreq) 1034 1022 ); ··· 1240 1216 ); 1241 1217 1242 1218 DEFINE_EVENT(/* event */ 1219 + hfi1_tid_rdma_request_template, hfi1_tid_req_read_kdeth_eflags, 1220 + TP_PROTO(struct rvt_qp *qp, char newreq, u8 opcode, u32 psn, u32 lpsn, 1221 + struct tid_rdma_request *req), 1222 + TP_ARGS(qp, newreq, opcode, psn, lpsn, req) 1223 + ); 1224 + 1225 + DEFINE_EVENT(/* event */ 1243 1226 hfi1_tid_rdma_request_template, hfi1_tid_req_make_rc_ack_write, 1244 1227 TP_PROTO(struct rvt_qp *qp, char newreq, u8 opcode, u32 psn, u32 lpsn, 1245 1228 struct tid_rdma_request *req), ··· 1255 1224 1256 1225 DEFINE_EVENT(/* event */ 1257 1226 hfi1_tid_rdma_request_template, hfi1_tid_req_make_req_write, 1227 + TP_PROTO(struct rvt_qp *qp, char newreq, u8 opcode, u32 psn, u32 lpsn, 1228 + struct tid_rdma_request *req), 1229 + TP_ARGS(qp, newreq, opcode, psn, lpsn, req) 1230 + ); 1231 + 1232 + DEFINE_EVENT(/* event */ 1233 + hfi1_tid_rdma_request_template, hfi1_tid_req_update_num_rd_atomic, 1258 1234 TP_PROTO(struct rvt_qp *qp, char newreq, u8 opcode, u32 psn, u32 lpsn, 1259 1235 struct tid_rdma_request *req), 1260 1236 TP_ARGS(qp, newreq, opcode, psn, lpsn, req)
-6
drivers/infiniband/hw/hfi1/user_sdma.h
··· 110 110 SDMA_PKT_Q_DEFERRED, 111 111 }; 112 112 113 - /* 114 - * Maximum retry attempts to submit a TX request 115 - * before putting the process to sleep. 116 - */ 117 - #define MAX_DEFER_RETRY_COUNT 1 118 - 119 113 #define SDMA_IOWAIT_TIMEOUT 1000 /* in milliseconds */ 120 114 121 115 #define SDMA_DBG(req, fmt, ...) \
+9 -8
drivers/infiniband/hw/hfi1/verbs.c
··· 874 874 else 875 875 pbc |= (ib_is_sc5(sc5) << PBC_DC_INFO_SHIFT); 876 876 877 - if (unlikely(hfi1_dbg_should_fault_tx(qp, ps->opcode))) 878 - pbc = hfi1_fault_tx(qp, ps->opcode, pbc); 879 877 pbc = create_pbc(ppd, 880 878 pbc, 881 879 qp->srate_mbps, 882 880 vl, 883 881 plen); 884 882 885 - /* Update HCRC based on packet opcode */ 886 - pbc = update_hcrc(ps->opcode, pbc); 883 + if (unlikely(hfi1_dbg_should_fault_tx(qp, ps->opcode))) 884 + pbc = hfi1_fault_tx(qp, ps->opcode, pbc); 885 + else 886 + /* Update HCRC based on packet opcode */ 887 + pbc = update_hcrc(ps->opcode, pbc); 887 888 } 888 889 tx->wqe = qp->s_wqe; 889 890 ret = build_verbs_tx_desc(tx->sde, len, tx, ahg_info, pbc); ··· 1031 1030 else 1032 1031 pbc |= (ib_is_sc5(sc5) << PBC_DC_INFO_SHIFT); 1033 1032 1033 + pbc = create_pbc(ppd, pbc, qp->srate_mbps, vl, plen); 1034 1034 if (unlikely(hfi1_dbg_should_fault_tx(qp, ps->opcode))) 1035 1035 pbc = hfi1_fault_tx(qp, ps->opcode, pbc); 1036 - pbc = create_pbc(ppd, pbc, qp->srate_mbps, vl, plen); 1037 - 1038 - /* Update HCRC based on packet opcode */ 1039 - pbc = update_hcrc(ps->opcode, pbc); 1036 + else 1037 + /* Update HCRC based on packet opcode */ 1038 + pbc = update_hcrc(ps->opcode, pbc); 1040 1039 } 1041 1040 if (cb) 1042 1041 iowait_pio_inc(&priv->s_iowait);
-8
drivers/infiniband/hw/hns/Kconfig
··· 8 8 is used in Hisilicon Hip06 and more further ICT SoC based on 9 9 platform device. 10 10 11 - To compile HIP06 or HIP08 driver as module, choose M here. 12 - 13 11 config INFINIBAND_HNS_HIP06 14 12 tristate "Hisilicon Hip06 Family RoCE support" 15 13 depends on INFINIBAND_HNS && HNS && HNS_DSAF && HNS_ENET ··· 15 17 RoCE driver support for Hisilicon RoCE engine in Hisilicon Hip06 and 16 18 Hip07 SoC. These RoCE engines are platform devices. 17 19 18 - To compile this driver, choose Y here: if INFINIBAND_HNS is m, this 19 - module will be called hns-roce-hw-v1 20 - 21 20 config INFINIBAND_HNS_HIP08 22 21 tristate "Hisilicon Hip08 Family RoCE support" 23 22 depends on INFINIBAND_HNS && PCI && HNS3 24 23 ---help--- 25 24 RoCE driver support for Hisilicon RoCE engine in Hisilicon Hip08 SoC. 26 25 The RoCE engine is a PCI device. 27 - 28 - To compile this driver, choose Y here: if INFINIBAND_HNS is m, this 29 - module will be called hns-roce-hw-v2.
+7 -16
drivers/infiniband/hw/hns/hns_roce_ah.c
··· 66 66 HNS_ROCE_VLAN_SL_SHIFT; 67 67 } 68 68 69 - ah->av.port_pd = cpu_to_le32(to_hr_pd(ibah->pd)->pdn | 70 - (rdma_ah_get_port_num(ah_attr) << 71 - HNS_ROCE_PORT_NUM_SHIFT)); 69 + ah->av.port = rdma_ah_get_port_num(ah_attr); 72 70 ah->av.gid_index = grh->sgid_index; 73 - ah->av.vlan = cpu_to_le16(vlan_tag); 71 + ah->av.vlan = vlan_tag; 74 72 ah->av.vlan_en = vlan_en; 75 73 dev_dbg(dev, "gid_index = 0x%x,vlan = 0x%x\n", ah->av.gid_index, 76 74 ah->av.vlan); ··· 77 79 ah->av.stat_rate = IB_RATE_10_GBPS; 78 80 79 81 memcpy(ah->av.dgid, grh->dgid.raw, HNS_ROCE_GID_SIZE); 80 - ah->av.sl_tclass_flowlabel = cpu_to_le32(rdma_ah_get_sl(ah_attr) << 81 - HNS_ROCE_SL_SHIFT); 82 + ah->av.sl = rdma_ah_get_sl(ah_attr); 82 83 83 84 return 0; 84 85 } ··· 88 91 89 92 memset(ah_attr, 0, sizeof(*ah_attr)); 90 93 91 - rdma_ah_set_sl(ah_attr, (le32_to_cpu(ah->av.sl_tclass_flowlabel) >> 92 - HNS_ROCE_SL_SHIFT)); 93 - rdma_ah_set_port_num(ah_attr, (le32_to_cpu(ah->av.port_pd) >> 94 - HNS_ROCE_PORT_NUM_SHIFT)); 94 + rdma_ah_set_sl(ah_attr, ah->av.sl); 95 + rdma_ah_set_port_num(ah_attr, ah->av.port); 95 96 rdma_ah_set_static_rate(ah_attr, ah->av.stat_rate); 96 - rdma_ah_set_grh(ah_attr, NULL, 97 - (le32_to_cpu(ah->av.sl_tclass_flowlabel) & 98 - HNS_ROCE_FLOW_LABEL_MASK), ah->av.gid_index, 99 - ah->av.hop_limit, 100 - (le32_to_cpu(ah->av.sl_tclass_flowlabel) >> 101 - HNS_ROCE_TCLASS_SHIFT)); 97 + rdma_ah_set_grh(ah_attr, NULL, ah->av.flowlabel, 98 + ah->av.gid_index, ah->av.hop_limit, ah->av.tclass); 102 99 rdma_ah_set_dgid_raw(ah_attr, ah->av.dgid); 103 100 104 101 return 0;
+1 -10
drivers/infiniband/hw/hns/hns_roce_cmd.c
··· 211 211 mutex_init(&hr_dev->cmd.hcr_mutex); 212 212 sema_init(&hr_dev->cmd.poll_sem, 1); 213 213 hr_dev->cmd.use_events = 0; 214 - hr_dev->cmd.toggle = 1; 215 214 hr_dev->cmd.max_cmds = CMD_MAX_NUM; 216 215 hr_dev->cmd.pool = dma_pool_create("hns_roce_cmd", dev, 217 216 HNS_ROCE_MAILBOX_SIZE, ··· 251 252 hr_cmd->token_mask = CMD_TOKEN_MASK; 252 253 hr_cmd->use_events = 1; 253 254 254 - down(&hr_cmd->poll_sem); 255 - 256 255 return 0; 257 256 } 258 257 259 258 void hns_roce_cmd_use_polling(struct hns_roce_dev *hr_dev) 260 259 { 261 260 struct hns_roce_cmdq *hr_cmd = &hr_dev->cmd; 262 - int i; 263 - 264 - hr_cmd->use_events = 0; 265 - 266 - for (i = 0; i < hr_cmd->max_cmds; ++i) 267 - down(&hr_cmd->event_sem); 268 261 269 262 kfree(hr_cmd->context); 270 - up(&hr_cmd->poll_sem); 263 + hr_cmd->use_events = 0; 271 264 } 272 265 273 266 struct hns_roce_cmd_mailbox
+120 -66
drivers/infiniband/hw/hns/hns_roce_cq.c
··· 83 83 84 84 static int hns_roce_cq_alloc(struct hns_roce_dev *hr_dev, int nent, 85 85 struct hns_roce_mtt *hr_mtt, 86 - struct hns_roce_uar *hr_uar, 87 86 struct hns_roce_cq *hr_cq, int vector) 88 87 { 89 88 struct hns_roce_cmd_mailbox *mailbox; ··· 153 154 154 155 hr_cq->cons_index = 0; 155 156 hr_cq->arm_sn = 1; 156 - hr_cq->uar = hr_uar; 157 157 158 158 atomic_set(&hr_cq->refcount, 1); 159 159 init_completion(&hr_cq->free); ··· 296 298 &buf->hr_buf); 297 299 } 298 300 301 + static int create_user_cq(struct hns_roce_dev *hr_dev, 302 + struct hns_roce_cq *hr_cq, 303 + struct ib_udata *udata, 304 + struct hns_roce_ib_create_cq_resp *resp, 305 + int cq_entries) 306 + { 307 + struct hns_roce_ib_create_cq ucmd; 308 + struct device *dev = hr_dev->dev; 309 + int ret; 310 + struct hns_roce_ucontext *context = rdma_udata_to_drv_context( 311 + udata, struct hns_roce_ucontext, ibucontext); 312 + 313 + if (ib_copy_from_udata(&ucmd, udata, sizeof(ucmd))) { 314 + dev_err(dev, "Failed to copy_from_udata.\n"); 315 + return -EFAULT; 316 + } 317 + 318 + /* Get user space address, write it into mtt table */ 319 + ret = hns_roce_ib_get_cq_umem(hr_dev, udata, &hr_cq->hr_buf, 320 + &hr_cq->umem, ucmd.buf_addr, 321 + cq_entries); 322 + if (ret) { 323 + dev_err(dev, "Failed to get_cq_umem.\n"); 324 + return ret; 325 + } 326 + 327 + if ((hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB) && 328 + (udata->outlen >= sizeof(*resp))) { 329 + ret = hns_roce_db_map_user(context, udata, ucmd.db_addr, 330 + &hr_cq->db); 331 + if (ret) { 332 + dev_err(dev, "cq record doorbell map failed!\n"); 333 + goto err_mtt; 334 + } 335 + hr_cq->db_en = 1; 336 + resp->cap_flags |= HNS_ROCE_SUPPORT_CQ_RECORD_DB; 337 + } 338 + 339 + return 0; 340 + 341 + err_mtt: 342 + hns_roce_mtt_cleanup(hr_dev, &hr_cq->hr_buf.hr_mtt); 343 + ib_umem_release(hr_cq->umem); 344 + 345 + return ret; 346 + } 347 + 348 + static int create_kernel_cq(struct hns_roce_dev *hr_dev, 349 + struct hns_roce_cq *hr_cq, int cq_entries) 350 + { 351 + struct device *dev = hr_dev->dev; 352 + struct hns_roce_uar *uar; 353 + int ret; 354 + 355 + if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB) { 356 + ret = hns_roce_alloc_db(hr_dev, &hr_cq->db, 1); 357 + if (ret) 358 + return ret; 359 + 360 + hr_cq->set_ci_db = hr_cq->db.db_record; 361 + *hr_cq->set_ci_db = 0; 362 + hr_cq->db_en = 1; 363 + } 364 + 365 + /* Init mtt table and write buff address to mtt table */ 366 + ret = hns_roce_ib_alloc_cq_buf(hr_dev, &hr_cq->hr_buf, cq_entries); 367 + if (ret) { 368 + dev_err(dev, "Failed to alloc_cq_buf.\n"); 369 + goto err_db; 370 + } 371 + 372 + uar = &hr_dev->priv_uar; 373 + hr_cq->cq_db_l = hr_dev->reg_base + hr_dev->odb_offset + 374 + DB_REG_OFFSET * uar->index; 375 + 376 + return 0; 377 + 378 + err_db: 379 + if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB) 380 + hns_roce_free_db(hr_dev, &hr_cq->db); 381 + 382 + return ret; 383 + } 384 + 385 + static void destroy_user_cq(struct hns_roce_dev *hr_dev, 386 + struct hns_roce_cq *hr_cq, 387 + struct ib_udata *udata, 388 + struct hns_roce_ib_create_cq_resp *resp) 389 + { 390 + struct hns_roce_ucontext *context = rdma_udata_to_drv_context( 391 + udata, struct hns_roce_ucontext, ibucontext); 392 + 393 + if ((hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB) && 394 + (udata->outlen >= sizeof(*resp))) 395 + hns_roce_db_unmap_user(context, &hr_cq->db); 396 + 397 + hns_roce_mtt_cleanup(hr_dev, &hr_cq->hr_buf.hr_mtt); 398 + ib_umem_release(hr_cq->umem); 399 + } 400 + 401 + static void destroy_kernel_cq(struct hns_roce_dev *hr_dev, 402 + struct hns_roce_cq *hr_cq) 403 + { 404 + hns_roce_mtt_cleanup(hr_dev, &hr_cq->hr_buf.hr_mtt); 405 + hns_roce_ib_free_cq_buf(hr_dev, &hr_cq->hr_buf, hr_cq->ib_cq.cqe); 406 + 407 + if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB) 408 + hns_roce_free_db(hr_dev, &hr_cq->db); 409 + } 410 + 299 411 int hns_roce_ib_create_cq(struct ib_cq *ib_cq, 300 412 const struct ib_cq_init_attr *attr, 301 413 struct ib_udata *udata) 302 414 { 303 415 struct hns_roce_dev *hr_dev = to_hr_dev(ib_cq->device); 304 416 struct device *dev = hr_dev->dev; 305 - struct hns_roce_ib_create_cq ucmd; 306 417 struct hns_roce_ib_create_cq_resp resp = {}; 307 418 struct hns_roce_cq *hr_cq = to_hr_cq(ib_cq); 308 - struct hns_roce_uar *uar = NULL; 309 419 int vector = attr->comp_vector; 310 420 int cq_entries = attr->cqe; 311 421 int ret; 312 - struct hns_roce_ucontext *context = rdma_udata_to_drv_context( 313 - udata, struct hns_roce_ucontext, ibucontext); 314 422 315 423 if (cq_entries < 1 || cq_entries > hr_dev->caps.max_cqes) { 316 424 dev_err(dev, "Creat CQ failed. entries=%d, max=%d\n", ··· 432 328 spin_lock_init(&hr_cq->lock); 433 329 434 330 if (udata) { 435 - if (ib_copy_from_udata(&ucmd, udata, sizeof(ucmd))) { 436 - dev_err(dev, "Failed to copy_from_udata.\n"); 437 - ret = -EFAULT; 438 - goto err_cq; 439 - } 440 - 441 - /* Get user space address, write it into mtt table */ 442 - ret = hns_roce_ib_get_cq_umem(hr_dev, udata, &hr_cq->hr_buf, 443 - &hr_cq->umem, ucmd.buf_addr, 444 - cq_entries); 331 + ret = create_user_cq(hr_dev, hr_cq, udata, &resp, cq_entries); 445 332 if (ret) { 446 - dev_err(dev, "Failed to get_cq_umem.\n"); 333 + dev_err(dev, "Create cq failed in user mode!\n"); 447 334 goto err_cq; 448 335 } 449 - 450 - if ((hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB) && 451 - (udata->outlen >= sizeof(resp))) { 452 - ret = hns_roce_db_map_user(context, udata, ucmd.db_addr, 453 - &hr_cq->db); 454 - if (ret) { 455 - dev_err(dev, "cq record doorbell map failed!\n"); 456 - goto err_mtt; 457 - } 458 - hr_cq->db_en = 1; 459 - resp.cap_flags |= HNS_ROCE_SUPPORT_CQ_RECORD_DB; 460 - } 461 - 462 - /* Get user space parameters */ 463 - uar = &context->uar; 464 336 } else { 465 - if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB) { 466 - ret = hns_roce_alloc_db(hr_dev, &hr_cq->db, 1); 467 - if (ret) 468 - goto err_cq; 469 - 470 - hr_cq->set_ci_db = hr_cq->db.db_record; 471 - *hr_cq->set_ci_db = 0; 472 - hr_cq->db_en = 1; 473 - } 474 - 475 - /* Init mmt table and write buff address to mtt table */ 476 - ret = hns_roce_ib_alloc_cq_buf(hr_dev, &hr_cq->hr_buf, 477 - cq_entries); 337 + ret = create_kernel_cq(hr_dev, hr_cq, cq_entries); 478 338 if (ret) { 479 - dev_err(dev, "Failed to alloc_cq_buf.\n"); 480 - goto err_db; 339 + dev_err(dev, "Create cq failed in kernel mode!\n"); 340 + goto err_cq; 481 341 } 482 - 483 - uar = &hr_dev->priv_uar; 484 - hr_cq->cq_db_l = hr_dev->reg_base + hr_dev->odb_offset + 485 - DB_REG_OFFSET * uar->index; 486 342 } 487 343 488 344 /* Allocate cq index, fill cq_context */ 489 - ret = hns_roce_cq_alloc(hr_dev, cq_entries, &hr_cq->hr_buf.hr_mtt, uar, 345 + ret = hns_roce_cq_alloc(hr_dev, cq_entries, &hr_cq->hr_buf.hr_mtt, 490 346 hr_cq, vector); 491 347 if (ret) { 492 348 dev_err(dev, "Creat CQ .Failed to cq_alloc.\n"); ··· 480 416 hns_roce_free_cq(hr_dev, hr_cq); 481 417 482 418 err_dbmap: 483 - if (udata && (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB) && 484 - (udata->outlen >= sizeof(resp))) 485 - hns_roce_db_unmap_user(context, &hr_cq->db); 486 - 487 - err_mtt: 488 - hns_roce_mtt_cleanup(hr_dev, &hr_cq->hr_buf.hr_mtt); 489 - ib_umem_release(hr_cq->umem); 490 - if (!udata) 491 - hns_roce_ib_free_cq_buf(hr_dev, &hr_cq->hr_buf, 492 - hr_cq->ib_cq.cqe); 493 - 494 - err_db: 495 - if (!udata && (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB)) 496 - hns_roce_free_db(hr_dev, &hr_cq->db); 419 + if (udata) 420 + destroy_user_cq(hr_dev, hr_cq, udata, &resp); 421 + else 422 + destroy_kernel_cq(hr_dev, hr_cq); 497 423 498 424 err_cq: 499 425 return ret;
+44 -51
drivers/infiniband/hw/hns/hns_roce_device.h
··· 84 84 #define HNS_ROCE_CEQ_ENTRY_SIZE 0x4 85 85 #define HNS_ROCE_AEQ_ENTRY_SIZE 0x10 86 86 87 - /* 4G/4K = 1M */ 88 87 #define HNS_ROCE_SL_SHIFT 28 89 88 #define HNS_ROCE_TCLASS_SHIFT 20 90 89 #define HNS_ROCE_FLOW_LABEL_MASK 0xfffff ··· 126 127 127 128 #define HNS_ROCE_IDX_QUE_ENTRY_SZ 4 128 129 #define SRQ_DB_REG 0x230 130 + 131 + /* The chip implementation of the consumer index is calculated 132 + * according to twice the actual EQ depth 133 + */ 134 + #define EQ_DEPTH_COEFF 2 129 135 130 136 enum { 131 137 HNS_ROCE_SUPPORT_RQ_RECORD_DB = 1 << 0, ··· 326 322 unsigned long num_hem; 327 323 /* HEM entry record obj total num */ 328 324 unsigned long num_obj; 329 - /*Single obj size */ 325 + /* Single obj size */ 330 326 unsigned long obj_size; 331 327 unsigned long table_chunk_size; 332 328 int lowmem; ··· 347 343 348 344 struct hns_roce_buf_region { 349 345 int offset; /* page offset */ 350 - u32 count; /* page count*/ 346 + u32 count; /* page count */ 351 347 int hopnum; /* addressing hop num */ 352 348 }; 353 349 ··· 388 384 u64 size; /* Address range of MR */ 389 385 u32 key; /* Key of MR */ 390 386 u32 pd; /* PD num of MR */ 391 - u32 access;/* Access permission of MR */ 387 + u32 access; /* Access permission of MR */ 392 388 u32 npages; 393 389 int enabled; /* MR's active status */ 394 390 int type; /* MR's register type */ 395 - u64 *pbl_buf;/* MR's PBL space */ 391 + u64 *pbl_buf; /* MR's PBL space */ 396 392 dma_addr_t pbl_dma_addr; /* MR's PBL space PA */ 397 - u32 pbl_size;/* PA number in the PBL */ 398 - u64 pbl_ba;/* page table address */ 399 - u32 l0_chunk_last_num;/* L0 last number */ 400 - u32 l1_chunk_last_num;/* L1 last number */ 401 - u64 **pbl_bt_l2;/* PBL BT L2 */ 402 - u64 **pbl_bt_l1;/* PBL BT L1 */ 403 - u64 *pbl_bt_l0;/* PBL BT L0 */ 404 - dma_addr_t *pbl_l2_dma_addr;/* PBL BT L2 dma addr */ 405 - dma_addr_t *pbl_l1_dma_addr;/* PBL BT L1 dma addr */ 406 - dma_addr_t pbl_l0_dma_addr;/* PBL BT L0 dma addr */ 407 - u32 pbl_ba_pg_sz;/* BT chunk page size */ 408 - u32 pbl_buf_pg_sz;/* buf chunk page size */ 409 - u32 pbl_hop_num;/* multi-hop number */ 393 + u32 pbl_size; /* PA number in the PBL */ 394 + u64 pbl_ba; /* page table address */ 395 + u32 l0_chunk_last_num; /* L0 last number */ 396 + u32 l1_chunk_last_num; /* L1 last number */ 397 + u64 **pbl_bt_l2; /* PBL BT L2 */ 398 + u64 **pbl_bt_l1; /* PBL BT L1 */ 399 + u64 *pbl_bt_l0; /* PBL BT L0 */ 400 + dma_addr_t *pbl_l2_dma_addr; /* PBL BT L2 dma addr */ 401 + dma_addr_t *pbl_l1_dma_addr; /* PBL BT L1 dma addr */ 402 + dma_addr_t pbl_l0_dma_addr; /* PBL BT L0 dma addr */ 403 + u32 pbl_ba_pg_sz; /* BT chunk page size */ 404 + u32 pbl_buf_pg_sz; /* buf chunk page size */ 405 + u32 pbl_hop_num; /* multi-hop number */ 410 406 }; 411 407 412 408 struct hns_roce_mr_table { ··· 429 425 u32 max_post; 430 426 int max_gs; 431 427 int offset; 432 - int wqe_shift;/* WQE size */ 428 + int wqe_shift; /* WQE size */ 433 429 u32 head; 434 430 u32 tail; 435 431 void __iomem *db_reg_l; 436 432 }; 437 433 438 434 struct hns_roce_sge { 439 - int sge_cnt; /* SGE num */ 435 + int sge_cnt; /* SGE num */ 440 436 int offset; 441 - int sge_shift;/* SGE size */ 437 + int sge_shift; /* SGE size */ 442 438 }; 443 439 444 440 struct hns_roce_buf_list { ··· 573 569 }; 574 570 575 571 struct hns_roce_av { 576 - __le32 port_pd; 572 + u8 port; 577 573 u8 gid_index; 578 574 u8 stat_rate; 579 575 u8 hop_limit; 580 - __le32 sl_tclass_flowlabel; 576 + u32 flowlabel; 577 + u8 sl; 578 + u8 tclass; 581 579 u8 dgid[HNS_ROCE_GID_SIZE]; 582 580 u8 mac[ETH_ALEN]; 583 - __le16 vlan; 581 + u16 vlan; 584 582 bool vlan_en; 585 583 }; 586 584 ··· 624 618 * close device, switch into poll mode(non event mode) 625 619 */ 626 620 u8 use_events; 627 - u8 toggle; 628 621 }; 629 622 630 623 struct hns_roce_cmd_mailbox { ··· 657 652 u8 rdb_en; 658 653 u8 sdb_en; 659 654 u32 doorbell_qpn; 660 - __le32 sq_signal_bits; 655 + u32 sq_signal_bits; 661 656 u32 sq_next_wqe; 662 - int sq_max_wqes_per_wr; 663 - int sq_spare_wqes; 664 657 struct hns_roce_wq sq; 665 658 666 659 struct ib_umem *umem; ··· 712 709 }; 713 710 714 711 struct hns_roce_ceqe { 715 - u32 comp; 712 + __le32 comp; 716 713 }; 717 714 718 715 struct hns_roce_aeqe { ··· 755 752 struct hns_roce_dev *hr_dev; 756 753 void __iomem *doorbell; 757 754 758 - int type_flag;/* Aeq:1 ceq:0 */ 755 + int type_flag; /* Aeq:1 ceq:0 */ 759 756 int eqn; 760 757 u32 entries; 761 758 int log_entries; ··· 801 798 int local_ca_ack_delay; 802 799 int num_uars; 803 800 u32 phy_num_uars; 804 - u32 max_sq_sg; /* 2 */ 805 - u32 max_sq_inline; /* 32 */ 806 - u32 max_rq_sg; /* 2 */ 801 + u32 max_sq_sg; 802 + u32 max_sq_inline; 803 + u32 max_rq_sg; 807 804 u32 max_extend_sg; 808 - int num_qps; /* 256k */ 805 + int num_qps; 809 806 int reserved_qps; 810 807 int num_qpc_timer; 811 808 int num_cqc_timer; 812 809 u32 max_srq_sg; 813 810 int num_srqs; 814 - u32 max_wqes; /* 16k */ 811 + u32 max_wqes; 815 812 u32 max_srqs; 816 813 u32 max_srq_wrs; 817 814 u32 max_srq_sges; 818 - u32 max_sq_desc_sz; /* 64 */ 819 - u32 max_rq_desc_sz; /* 64 */ 815 + u32 max_sq_desc_sz; 816 + u32 max_rq_desc_sz; 820 817 u32 max_srq_desc_sz; 821 818 int max_qp_init_rdma; 822 819 int max_qp_dest_rdma; ··· 827 824 int reserved_cqs; 828 825 int reserved_srqs; 829 826 u32 max_srqwqes; 830 - int num_aeq_vectors; /* 1 */ 827 + int num_aeq_vectors; 831 828 int num_comp_vectors; 832 829 int num_other_vectors; 833 830 int num_mtpts; ··· 908 905 u32 sl_num; 909 906 u32 tsq_buf_pg_sz; 910 907 u32 tpq_buf_pg_sz; 911 - u32 chunk_sz; /* chunk size in non multihop mode*/ 908 + u32 chunk_sz; /* chunk size in non multihop mode */ 912 909 u64 flags; 913 910 }; 914 911 ··· 994 991 const struct ib_device_ops *hns_roce_dev_srq_ops; 995 992 }; 996 993 997 - enum hns_phy_state { 998 - HNS_ROCE_PHY_SLEEP = 1, 999 - HNS_ROCE_PHY_POLLING = 2, 1000 - HNS_ROCE_PHY_DISABLED = 3, 1001 - HNS_ROCE_PHY_TRAINING = 4, 1002 - HNS_ROCE_PHY_LINKUP = 5, 1003 - HNS_ROCE_PHY_LINKERR = 6, 1004 - HNS_ROCE_PHY_TEST = 7 1005 - }; 1006 - 1007 994 struct hns_roce_dev { 1008 995 struct ib_device ib_dev; 1009 996 struct platform_device *pdev; ··· 1038 1045 int loop_idc; 1039 1046 u32 sdb_offset; 1040 1047 u32 odb_offset; 1041 - dma_addr_t tptr_dma_addr; /*only for hw v1*/ 1042 - u32 tptr_size; /*only for hw v1*/ 1048 + dma_addr_t tptr_dma_addr; /* only for hw v1 */ 1049 + u32 tptr_size; /* only for hw v1 */ 1043 1050 const struct hns_roce_hw *hw; 1044 1051 void *priv; 1045 1052 struct workqueue_struct *irq_workq;
+106 -144
drivers/infiniband/hw/hns/hns_roce_hem.c
··· 41 41 42 42 bool hns_roce_check_whether_mhop(struct hns_roce_dev *hr_dev, u32 type) 43 43 { 44 - if ((hr_dev->caps.qpc_hop_num && type == HEM_TYPE_QPC) || 45 - (hr_dev->caps.mpt_hop_num && type == HEM_TYPE_MTPT) || 46 - (hr_dev->caps.cqc_hop_num && type == HEM_TYPE_CQC) || 47 - (hr_dev->caps.srqc_hop_num && type == HEM_TYPE_SRQC) || 48 - (hr_dev->caps.sccc_hop_num && type == HEM_TYPE_SCCC) || 49 - (hr_dev->caps.qpc_timer_hop_num && type == HEM_TYPE_QPC_TIMER) || 50 - (hr_dev->caps.cqc_timer_hop_num && type == HEM_TYPE_CQC_TIMER) || 51 - (hr_dev->caps.cqe_hop_num && type == HEM_TYPE_CQE) || 52 - (hr_dev->caps.mtt_hop_num && type == HEM_TYPE_MTT) || 53 - (hr_dev->caps.srqwqe_hop_num && type == HEM_TYPE_SRQWQE) || 54 - (hr_dev->caps.idx_hop_num && type == HEM_TYPE_IDX)) 55 - return true; 44 + int hop_num = 0; 56 45 57 - return false; 46 + switch (type) { 47 + case HEM_TYPE_QPC: 48 + hop_num = hr_dev->caps.qpc_hop_num; 49 + break; 50 + case HEM_TYPE_MTPT: 51 + hop_num = hr_dev->caps.mpt_hop_num; 52 + break; 53 + case HEM_TYPE_CQC: 54 + hop_num = hr_dev->caps.cqc_hop_num; 55 + break; 56 + case HEM_TYPE_SRQC: 57 + hop_num = hr_dev->caps.srqc_hop_num; 58 + break; 59 + case HEM_TYPE_SCCC: 60 + hop_num = hr_dev->caps.sccc_hop_num; 61 + break; 62 + case HEM_TYPE_QPC_TIMER: 63 + hop_num = hr_dev->caps.qpc_timer_hop_num; 64 + break; 65 + case HEM_TYPE_CQC_TIMER: 66 + hop_num = hr_dev->caps.cqc_timer_hop_num; 67 + break; 68 + case HEM_TYPE_CQE: 69 + hop_num = hr_dev->caps.cqe_hop_num; 70 + break; 71 + case HEM_TYPE_MTT: 72 + hop_num = hr_dev->caps.mtt_hop_num; 73 + break; 74 + case HEM_TYPE_SRQWQE: 75 + hop_num = hr_dev->caps.srqwqe_hop_num; 76 + break; 77 + case HEM_TYPE_IDX: 78 + hop_num = hr_dev->caps.idx_hop_num; 79 + break; 80 + default: 81 + return false; 82 + } 83 + 84 + return hop_num ? true : false; 58 85 } 59 86 60 87 static bool hns_roce_check_hem_null(struct hns_roce_hem **hem, u64 start_idx, 61 - u32 bt_chunk_num) 88 + u32 bt_chunk_num, u64 hem_max_num) 62 89 { 63 - int i; 90 + u64 check_max_num = start_idx + bt_chunk_num; 91 + u64 i; 64 92 65 - for (i = 0; i < bt_chunk_num; i++) 66 - if (hem[start_idx + i]) 93 + for (i = start_idx; (i < check_max_num) && (i < hem_max_num); i++) 94 + if (hem[i]) 67 95 return false; 68 96 69 97 return true; ··· 120 92 return 0; 121 93 } 122 94 123 - int hns_roce_calc_hem_mhop(struct hns_roce_dev *hr_dev, 124 - struct hns_roce_hem_table *table, unsigned long *obj, 125 - struct hns_roce_hem_mhop *mhop) 95 + static int get_hem_table_config(struct hns_roce_dev *hr_dev, 96 + struct hns_roce_hem_mhop *mhop, 97 + u32 type) 126 98 { 127 99 struct device *dev = hr_dev->dev; 128 - u32 chunk_ba_num; 129 - u32 table_idx; 130 - u32 bt_num; 131 - u32 chunk_size; 132 100 133 - switch (table->type) { 101 + switch (type) { 134 102 case HEM_TYPE_QPC: 135 103 mhop->buf_chunk_size = 1 << (hr_dev->caps.qpc_buf_pg_sz 136 104 + PAGE_SHIFT); ··· 217 193 break; 218 194 default: 219 195 dev_err(dev, "Table %d not support multi-hop addressing!\n", 220 - table->type); 196 + type); 221 197 return -EINVAL; 222 198 } 199 + 200 + return 0; 201 + } 202 + 203 + int hns_roce_calc_hem_mhop(struct hns_roce_dev *hr_dev, 204 + struct hns_roce_hem_table *table, unsigned long *obj, 205 + struct hns_roce_hem_mhop *mhop) 206 + { 207 + struct device *dev = hr_dev->dev; 208 + u32 chunk_ba_num; 209 + u32 table_idx; 210 + u32 bt_num; 211 + u32 chunk_size; 212 + 213 + if (get_hem_table_config(hr_dev, mhop, table->type)) 214 + return -EINVAL; 223 215 224 216 if (!obj) 225 217 return 0; ··· 364 324 { 365 325 spinlock_t *lock = &hr_dev->bt_cmd_lock; 366 326 struct device *dev = hr_dev->dev; 367 - unsigned long end = 0; 327 + long end; 368 328 unsigned long flags; 369 329 struct hns_roce_hem_iter iter; 370 330 void __iomem *bt_cmd; 371 - u32 bt_cmd_h_val = 0; 372 - u32 bt_cmd_val[2]; 373 - u32 bt_cmd_l = 0; 331 + __le32 bt_cmd_val[2]; 332 + __le32 bt_cmd_h = 0; 333 + __le32 bt_cmd_l = 0; 374 334 u64 bt_ba = 0; 375 335 int ret = 0; 376 336 ··· 380 340 381 341 switch (table->type) { 382 342 case HEM_TYPE_QPC: 383 - roce_set_field(bt_cmd_h_val, ROCEE_BT_CMD_H_ROCEE_BT_CMD_MDF_M, 384 - ROCEE_BT_CMD_H_ROCEE_BT_CMD_MDF_S, HEM_TYPE_QPC); 385 - break; 386 343 case HEM_TYPE_MTPT: 387 - roce_set_field(bt_cmd_h_val, ROCEE_BT_CMD_H_ROCEE_BT_CMD_MDF_M, 388 - ROCEE_BT_CMD_H_ROCEE_BT_CMD_MDF_S, 389 - HEM_TYPE_MTPT); 390 - break; 391 344 case HEM_TYPE_CQC: 392 - roce_set_field(bt_cmd_h_val, ROCEE_BT_CMD_H_ROCEE_BT_CMD_MDF_M, 393 - ROCEE_BT_CMD_H_ROCEE_BT_CMD_MDF_S, HEM_TYPE_CQC); 394 - break; 395 345 case HEM_TYPE_SRQC: 396 - roce_set_field(bt_cmd_h_val, ROCEE_BT_CMD_H_ROCEE_BT_CMD_MDF_M, 397 - ROCEE_BT_CMD_H_ROCEE_BT_CMD_MDF_S, 398 - HEM_TYPE_SRQC); 346 + roce_set_field(bt_cmd_h, ROCEE_BT_CMD_H_ROCEE_BT_CMD_MDF_M, 347 + ROCEE_BT_CMD_H_ROCEE_BT_CMD_MDF_S, table->type); 399 348 break; 400 349 default: 401 350 return ret; 402 351 } 403 - roce_set_field(bt_cmd_h_val, ROCEE_BT_CMD_H_ROCEE_BT_CMD_IN_MDF_M, 352 + 353 + roce_set_field(bt_cmd_h, ROCEE_BT_CMD_H_ROCEE_BT_CMD_IN_MDF_M, 404 354 ROCEE_BT_CMD_H_ROCEE_BT_CMD_IN_MDF_S, obj); 405 - roce_set_bit(bt_cmd_h_val, ROCEE_BT_CMD_H_ROCEE_BT_CMD_S, 0); 406 - roce_set_bit(bt_cmd_h_val, ROCEE_BT_CMD_H_ROCEE_BT_CMD_HW_SYNS_S, 1); 355 + roce_set_bit(bt_cmd_h, ROCEE_BT_CMD_H_ROCEE_BT_CMD_S, 0); 356 + roce_set_bit(bt_cmd_h, ROCEE_BT_CMD_H_ROCEE_BT_CMD_HW_SYNS_S, 1); 407 357 408 358 /* Currently iter only a chunk */ 409 359 for (hns_roce_hem_first(table->hem[i], &iter); ··· 405 375 bt_cmd = hr_dev->reg_base + ROCEE_BT_CMD_H_REG; 406 376 407 377 end = HW_SYNC_TIMEOUT_MSECS; 408 - while (end) { 378 + while (end > 0) { 409 379 if (!(readl(bt_cmd) >> BT_CMD_SYNC_SHIFT)) 410 380 break; 411 381 ··· 419 389 return -EBUSY; 420 390 } 421 391 422 - bt_cmd_l = (u32)bt_ba; 423 - roce_set_field(bt_cmd_h_val, ROCEE_BT_CMD_H_ROCEE_BT_CMD_BA_H_M, 392 + bt_cmd_l = cpu_to_le32(bt_ba); 393 + roce_set_field(bt_cmd_h, ROCEE_BT_CMD_H_ROCEE_BT_CMD_BA_H_M, 424 394 ROCEE_BT_CMD_H_ROCEE_BT_CMD_BA_H_S, 425 395 bt_ba >> BT_BA_SHIFT); 426 396 427 397 bt_cmd_val[0] = bt_cmd_l; 428 - bt_cmd_val[1] = bt_cmd_h_val; 398 + bt_cmd_val[1] = bt_cmd_h; 429 399 hns_roce_write64_k(bt_cmd_val, 430 400 hr_dev->reg_base + ROCEE_BT_CMD_L_REG); 431 401 spin_unlock_irqrestore(lock, flags); ··· 484 454 default: 485 455 dev_err(dev, "Table %d not support hop_num = %d!\n", 486 456 table->type, hop_num); 457 + return -EINVAL; 458 + } 459 + 460 + if (unlikely(hem_idx >= table->num_hem)) { 461 + dev_err(dev, "Table %d exceed hem limt idx = %llu,max = %lu!\n", 462 + table->type, hem_idx, table->num_hem); 487 463 return -EINVAL; 488 464 } 489 465 ··· 729 693 if (check_whether_bt_num_2(table->type, hop_num)) { 730 694 start_idx = mhop.l0_idx * chunk_ba_num; 731 695 if (hns_roce_check_hem_null(table->hem, start_idx, 732 - chunk_ba_num)) { 696 + chunk_ba_num, table->num_hem)) { 733 697 if (table->type < HEM_TYPE_MTT && 734 698 hr_dev->hw->clear_hem(hr_dev, table, obj, 0)) 735 699 dev_warn(dev, "Clear HEM base address failed.\n"); ··· 743 707 start_idx = mhop.l0_idx * chunk_ba_num * chunk_ba_num + 744 708 mhop.l1_idx * chunk_ba_num; 745 709 if (hns_roce_check_hem_null(table->hem, start_idx, 746 - chunk_ba_num)) { 710 + chunk_ba_num, table->num_hem)) { 747 711 if (hr_dev->hw->clear_hem(hr_dev, table, obj, 1)) 748 712 dev_warn(dev, "Clear HEM base address failed.\n"); 749 713 ··· 827 791 } else { 828 792 u32 seg_size = 64; /* 8 bytes per BA and 8 BA per segment */ 829 793 830 - hns_roce_calc_hem_mhop(hr_dev, table, &mhop_obj, &mhop); 794 + if (hns_roce_calc_hem_mhop(hr_dev, table, &mhop_obj, &mhop)) 795 + goto out; 831 796 /* mtt mhop */ 832 797 i = mhop.l0_idx; 833 798 j = mhop.l1_idx; ··· 877 840 { 878 841 struct hns_roce_hem_mhop mhop; 879 842 unsigned long inc = table->table_chunk_size / table->obj_size; 880 - unsigned long i; 843 + unsigned long i = 0; 881 844 int ret; 882 845 883 846 if (hns_roce_check_whether_mhop(hr_dev, table->type)) { 884 - hns_roce_calc_hem_mhop(hr_dev, table, NULL, &mhop); 847 + ret = hns_roce_calc_hem_mhop(hr_dev, table, NULL, &mhop); 848 + if (ret) 849 + goto fail; 885 850 inc = mhop.bt_chunk_size / table->obj_size; 886 851 } 887 852 ··· 913 874 unsigned long i; 914 875 915 876 if (hns_roce_check_whether_mhop(hr_dev, table->type)) { 916 - hns_roce_calc_hem_mhop(hr_dev, table, NULL, &mhop); 877 + if (hns_roce_calc_hem_mhop(hr_dev, table, NULL, &mhop)) 878 + return; 917 879 inc = mhop.bt_chunk_size / table->obj_size; 918 880 } 919 881 ··· 927 887 unsigned long obj_size, unsigned long nobj, 928 888 int use_lowmem) 929 889 { 930 - struct device *dev = hr_dev->dev; 931 890 unsigned long obj_per_chunk; 932 891 unsigned long num_hem; 933 892 ··· 939 900 if (!table->hem) 940 901 return -ENOMEM; 941 902 } else { 903 + struct hns_roce_hem_mhop mhop = {}; 942 904 unsigned long buf_chunk_size; 943 905 unsigned long bt_chunk_size; 944 906 unsigned long bt_chunk_num; 945 907 unsigned long num_bt_l0 = 0; 946 908 u32 hop_num; 947 909 948 - switch (type) { 949 - case HEM_TYPE_QPC: 950 - buf_chunk_size = 1 << (hr_dev->caps.qpc_buf_pg_sz 951 - + PAGE_SHIFT); 952 - bt_chunk_size = 1 << (hr_dev->caps.qpc_ba_pg_sz 953 - + PAGE_SHIFT); 954 - num_bt_l0 = hr_dev->caps.qpc_bt_num; 955 - hop_num = hr_dev->caps.qpc_hop_num; 956 - break; 957 - case HEM_TYPE_MTPT: 958 - buf_chunk_size = 1 << (hr_dev->caps.mpt_buf_pg_sz 959 - + PAGE_SHIFT); 960 - bt_chunk_size = 1 << (hr_dev->caps.mpt_ba_pg_sz 961 - + PAGE_SHIFT); 962 - num_bt_l0 = hr_dev->caps.mpt_bt_num; 963 - hop_num = hr_dev->caps.mpt_hop_num; 964 - break; 965 - case HEM_TYPE_CQC: 966 - buf_chunk_size = 1 << (hr_dev->caps.cqc_buf_pg_sz 967 - + PAGE_SHIFT); 968 - bt_chunk_size = 1 << (hr_dev->caps.cqc_ba_pg_sz 969 - + PAGE_SHIFT); 970 - num_bt_l0 = hr_dev->caps.cqc_bt_num; 971 - hop_num = hr_dev->caps.cqc_hop_num; 972 - break; 973 - case HEM_TYPE_SCCC: 974 - buf_chunk_size = 1 << (hr_dev->caps.sccc_buf_pg_sz 975 - + PAGE_SHIFT); 976 - bt_chunk_size = 1 << (hr_dev->caps.sccc_ba_pg_sz 977 - + PAGE_SHIFT); 978 - num_bt_l0 = hr_dev->caps.sccc_bt_num; 979 - hop_num = hr_dev->caps.sccc_hop_num; 980 - break; 981 - case HEM_TYPE_QPC_TIMER: 982 - buf_chunk_size = 1 << (hr_dev->caps.qpc_timer_buf_pg_sz 983 - + PAGE_SHIFT); 984 - bt_chunk_size = 1 << (hr_dev->caps.qpc_timer_ba_pg_sz 985 - + PAGE_SHIFT); 986 - num_bt_l0 = hr_dev->caps.qpc_timer_bt_num; 987 - hop_num = hr_dev->caps.qpc_timer_hop_num; 988 - break; 989 - case HEM_TYPE_CQC_TIMER: 990 - buf_chunk_size = 1 << (hr_dev->caps.cqc_timer_buf_pg_sz 991 - + PAGE_SHIFT); 992 - bt_chunk_size = 1 << (hr_dev->caps.cqc_timer_ba_pg_sz 993 - + PAGE_SHIFT); 994 - num_bt_l0 = hr_dev->caps.cqc_timer_bt_num; 995 - hop_num = hr_dev->caps.cqc_timer_hop_num; 996 - break; 997 - case HEM_TYPE_SRQC: 998 - buf_chunk_size = 1 << (hr_dev->caps.srqc_buf_pg_sz 999 - + PAGE_SHIFT); 1000 - bt_chunk_size = 1 << (hr_dev->caps.srqc_ba_pg_sz 1001 - + PAGE_SHIFT); 1002 - num_bt_l0 = hr_dev->caps.srqc_bt_num; 1003 - hop_num = hr_dev->caps.srqc_hop_num; 1004 - break; 1005 - case HEM_TYPE_MTT: 1006 - buf_chunk_size = 1 << (hr_dev->caps.mtt_ba_pg_sz 1007 - + PAGE_SHIFT); 1008 - bt_chunk_size = buf_chunk_size; 1009 - hop_num = hr_dev->caps.mtt_hop_num; 1010 - break; 1011 - case HEM_TYPE_CQE: 1012 - buf_chunk_size = 1 << (hr_dev->caps.cqe_ba_pg_sz 1013 - + PAGE_SHIFT); 1014 - bt_chunk_size = buf_chunk_size; 1015 - hop_num = hr_dev->caps.cqe_hop_num; 1016 - break; 1017 - case HEM_TYPE_SRQWQE: 1018 - buf_chunk_size = 1 << (hr_dev->caps.srqwqe_ba_pg_sz 1019 - + PAGE_SHIFT); 1020 - bt_chunk_size = buf_chunk_size; 1021 - hop_num = hr_dev->caps.srqwqe_hop_num; 1022 - break; 1023 - case HEM_TYPE_IDX: 1024 - buf_chunk_size = 1 << (hr_dev->caps.idx_ba_pg_sz 1025 - + PAGE_SHIFT); 1026 - bt_chunk_size = buf_chunk_size; 1027 - hop_num = hr_dev->caps.idx_hop_num; 1028 - break; 1029 - default: 1030 - dev_err(dev, 1031 - "Table %d not support to init hem table here!\n", 1032 - type); 910 + if (get_hem_table_config(hr_dev, &mhop, type)) 1033 911 return -EINVAL; 1034 - } 912 + 913 + buf_chunk_size = mhop.buf_chunk_size; 914 + bt_chunk_size = mhop.bt_chunk_size; 915 + num_bt_l0 = mhop.ba_l0_num; 916 + hop_num = mhop.hop_num; 917 + 1035 918 obj_per_chunk = buf_chunk_size / obj_size; 1036 919 num_hem = (nobj + obj_per_chunk - 1) / obj_per_chunk; 1037 920 bt_chunk_num = bt_chunk_size / BA_BYTE_LEN; ··· 1036 1075 int i; 1037 1076 u64 obj; 1038 1077 1039 - hns_roce_calc_hem_mhop(hr_dev, table, NULL, &mhop); 1078 + if (hns_roce_calc_hem_mhop(hr_dev, table, NULL, &mhop)) 1079 + return; 1040 1080 buf_chunk_size = table->type < HEM_TYPE_MTT ? mhop.buf_chunk_size : 1041 1081 mhop.bt_chunk_size; 1042 1082
+3 -3
drivers/infiniband/hw/hns/hns_roce_hem.h
··· 102 102 u32 buf_chunk_size; 103 103 u32 bt_chunk_size; 104 104 u32 ba_l0_num; 105 - u32 l0_idx;/* level 0 base address table index */ 106 - u32 l1_idx;/* level 1 base address table index */ 107 - u32 l2_idx;/* level 2 base address table index */ 105 + u32 l0_idx; /* level 0 base address table index */ 106 + u32 l1_idx; /* level 1 base address table index */ 107 + u32 l2_idx; /* level 2 base address table index */ 108 108 }; 109 109 110 110 void hns_roce_free_hem(struct hns_roce_dev *hr_dev, struct hns_roce_hem *hem);
+29 -40
drivers/infiniband/hw/hns/hns_roce_hw_v1.c
··· 73 73 int ps_opcode = 0, i = 0; 74 74 unsigned long flags = 0; 75 75 void *wqe = NULL; 76 - u32 doorbell[2]; 76 + __le32 doorbell[2]; 77 77 int nreq = 0; 78 78 u32 ind = 0; 79 79 int ret = 0; ··· 175 175 roce_set_field(ud_sq_wqe->u32_36, 176 176 UD_SEND_WQE_U32_36_FLOW_LABEL_M, 177 177 UD_SEND_WQE_U32_36_FLOW_LABEL_S, 178 - ah->av.sl_tclass_flowlabel & 179 - HNS_ROCE_FLOW_LABEL_MASK); 178 + ah->av.flowlabel); 180 179 roce_set_field(ud_sq_wqe->u32_36, 181 180 UD_SEND_WQE_U32_36_PRIORITY_M, 182 181 UD_SEND_WQE_U32_36_PRIORITY_S, 183 - le32_to_cpu(ah->av.sl_tclass_flowlabel) >> 184 - HNS_ROCE_SL_SHIFT); 182 + ah->av.sl); 185 183 roce_set_field(ud_sq_wqe->u32_36, 186 184 UD_SEND_WQE_U32_36_SGID_INDEX_M, 187 185 UD_SEND_WQE_U32_36_SGID_INDEX_S, ··· 193 195 roce_set_field(ud_sq_wqe->u32_40, 194 196 UD_SEND_WQE_U32_40_TRAFFIC_CLASS_M, 195 197 UD_SEND_WQE_U32_40_TRAFFIC_CLASS_S, 196 - ah->av.sl_tclass_flowlabel >> 197 - HNS_ROCE_TCLASS_SHIFT); 198 + ah->av.tclass); 198 199 199 200 memcpy(&ud_sq_wqe->dgid[0], &ah->av.dgid[0], GID_LEN); 200 201 ··· 332 335 SQ_DOORBELL_U32_8_QPN_S, qp->doorbell_qpn); 333 336 roce_set_bit(sq_db.u32_8, SQ_DOORBELL_HW_SYNC_S, 1); 334 337 335 - doorbell[0] = le32_to_cpu(sq_db.u32_4); 336 - doorbell[1] = le32_to_cpu(sq_db.u32_8); 338 + doorbell[0] = sq_db.u32_4; 339 + doorbell[1] = sq_db.u32_8; 337 340 338 - hns_roce_write64_k((__le32 *)doorbell, qp->sq.db_reg_l); 341 + hns_roce_write64_k(doorbell, qp->sq.db_reg_l); 339 342 qp->sq_next_wqe = ind; 340 343 } 341 344 ··· 360 363 struct hns_roce_dev *hr_dev = to_hr_dev(ibqp->device); 361 364 struct device *dev = &hr_dev->pdev->dev; 362 365 struct hns_roce_rq_db rq_db; 363 - uint32_t doorbell[2] = {0}; 366 + __le32 doorbell[2] = {0}; 364 367 365 368 spin_lock_irqsave(&hr_qp->rq.lock, flags); 366 369 ind = hr_qp->rq.head & (hr_qp->rq.wqe_cnt - 1); ··· 434 437 roce_set_bit(rq_db.u32_8, RQ_DOORBELL_U32_8_HW_SYNC_S, 435 438 1); 436 439 437 - doorbell[0] = le32_to_cpu(rq_db.u32_4); 438 - doorbell[1] = le32_to_cpu(rq_db.u32_8); 440 + doorbell[0] = rq_db.u32_4; 441 + doorbell[1] = rq_db.u32_8; 439 442 440 - hns_roce_write64_k((__le32 *)doorbell, 441 - hr_qp->rq.db_reg_l); 443 + hns_roce_write64_k(doorbell, hr_qp->rq.db_reg_l); 442 444 } 443 445 } 444 446 spin_unlock_irqrestore(&hr_qp->rq.lock, flags); ··· 711 715 struct ib_cq *cq; 712 716 struct ib_pd *pd; 713 717 union ib_gid dgid; 714 - u64 subnet_prefix; 718 + __be64 subnet_prefix; 715 719 int attr_mask = 0; 716 720 int ret; 717 721 int i, j; ··· 967 971 struct hns_roce_free_mr *free_mr; 968 972 struct hns_roce_v1_priv *priv; 969 973 struct completion comp; 970 - unsigned long end = HNS_ROCE_V1_RECREATE_LP_QP_TIMEOUT_MSECS; 974 + long end = HNS_ROCE_V1_RECREATE_LP_QP_TIMEOUT_MSECS; 971 975 972 976 priv = (struct hns_roce_v1_priv *)hr_dev->priv; 973 977 free_mr = &priv->free_mr; ··· 987 991 988 992 queue_work(free_mr->free_mr_wq, &(lp_qp_work->work)); 989 993 990 - while (end) { 994 + while (end > 0) { 991 995 if (try_wait_for_completion(&comp)) 992 996 return 0; 993 997 msleep(HNS_ROCE_V1_RECREATE_LP_QP_WAIT_VALUE); ··· 1105 1109 struct hns_roce_free_mr *free_mr; 1106 1110 struct hns_roce_v1_priv *priv; 1107 1111 struct completion comp; 1108 - unsigned long end = HNS_ROCE_V1_FREE_MR_TIMEOUT_MSECS; 1112 + long end = HNS_ROCE_V1_FREE_MR_TIMEOUT_MSECS; 1109 1113 unsigned long start = jiffies; 1110 1114 int npages; 1111 1115 int ret = 0; ··· 1135 1139 1136 1140 queue_work(free_mr->free_mr_wq, &(mr_work->work)); 1137 1141 1138 - while (end) { 1142 + while (end > 0) { 1139 1143 if (try_wait_for_completion(&comp)) 1140 1144 goto free_mr; 1141 1145 msleep(HNS_ROCE_V1_FREE_MR_WAIT_VALUE); ··· 2161 2165 { 2162 2166 struct hns_roce_cq *hr_cq = to_hr_cq(ibcq); 2163 2167 u32 notification_flag; 2164 - __le32 doorbell[2]; 2168 + __le32 doorbell[2] = {}; 2165 2169 2166 2170 notification_flag = (flags & IB_CQ_SOLICITED_MASK) == 2167 2171 IB_CQ_SOLICITED ? CQ_DB_REQ_NOT : CQ_DB_REQ_NOT_SOL; ··· 2426 2430 { 2427 2431 struct device *dev = &hr_dev->pdev->dev; 2428 2432 struct hns_roce_v1_priv *priv; 2429 - unsigned long end = 0, flags = 0; 2433 + unsigned long flags = 0; 2434 + long end = HW_SYNC_TIMEOUT_MSECS; 2430 2435 __le32 bt_cmd_val[2] = {0}; 2431 2436 void __iomem *bt_cmd; 2432 2437 u64 bt_ba = 0; ··· 2436 2439 2437 2440 switch (table->type) { 2438 2441 case HEM_TYPE_QPC: 2439 - roce_set_field(bt_cmd_val[1], ROCEE_BT_CMD_H_ROCEE_BT_CMD_MDF_M, 2440 - ROCEE_BT_CMD_H_ROCEE_BT_CMD_MDF_S, HEM_TYPE_QPC); 2441 2442 bt_ba = priv->bt_table.qpc_buf.map >> 12; 2442 2443 break; 2443 2444 case HEM_TYPE_MTPT: 2444 - roce_set_field(bt_cmd_val[1], ROCEE_BT_CMD_H_ROCEE_BT_CMD_MDF_M, 2445 - ROCEE_BT_CMD_H_ROCEE_BT_CMD_MDF_S, HEM_TYPE_MTPT); 2446 2445 bt_ba = priv->bt_table.mtpt_buf.map >> 12; 2447 2446 break; 2448 2447 case HEM_TYPE_CQC: 2449 - roce_set_field(bt_cmd_val[1], ROCEE_BT_CMD_H_ROCEE_BT_CMD_MDF_M, 2450 - ROCEE_BT_CMD_H_ROCEE_BT_CMD_MDF_S, HEM_TYPE_CQC); 2451 2448 bt_ba = priv->bt_table.cqc_buf.map >> 12; 2452 2449 break; 2453 2450 case HEM_TYPE_SRQC: ··· 2450 2459 default: 2451 2460 return 0; 2452 2461 } 2462 + roce_set_field(bt_cmd_val[1], ROCEE_BT_CMD_H_ROCEE_BT_CMD_MDF_M, 2463 + ROCEE_BT_CMD_H_ROCEE_BT_CMD_MDF_S, table->type); 2453 2464 roce_set_field(bt_cmd_val[1], ROCEE_BT_CMD_H_ROCEE_BT_CMD_IN_MDF_M, 2454 2465 ROCEE_BT_CMD_H_ROCEE_BT_CMD_IN_MDF_S, obj); 2455 2466 roce_set_bit(bt_cmd_val[1], ROCEE_BT_CMD_H_ROCEE_BT_CMD_S, 0); ··· 2461 2468 2462 2469 bt_cmd = hr_dev->reg_base + ROCEE_BT_CMD_H_REG; 2463 2470 2464 - end = HW_SYNC_TIMEOUT_MSECS; 2465 2471 while (1) { 2466 2472 if (readl(bt_cmd) >> BT_CMD_SYNC_SHIFT) { 2467 2473 if (!end) { ··· 2476 2484 end -= HW_SYNC_SLEEP_TIME_INTERVAL; 2477 2485 } 2478 2486 2479 - bt_cmd_val[0] = (__le32)bt_ba; 2487 + bt_cmd_val[0] = cpu_to_le32(bt_ba); 2480 2488 roce_set_field(bt_cmd_val[1], ROCEE_BT_CMD_H_ROCEE_BT_CMD_BA_H_M, 2481 2489 ROCEE_BT_CMD_H_ROCEE_BT_CMD_BA_H_S, bt_ba >> 32); 2482 2490 hns_roce_write64_k(bt_cmd_val, hr_dev->reg_base + ROCEE_BT_CMD_L_REG); ··· 2619 2627 QP1C_BYTES_16_PORT_NUM_S, hr_qp->phy_port); 2620 2628 roce_set_bit(context->qp1c_bytes_16, 2621 2629 QP1C_BYTES_16_SIGNALING_TYPE_S, 2622 - le32_to_cpu(hr_qp->sq_signal_bits)); 2630 + hr_qp->sq_signal_bits); 2623 2631 roce_set_bit(context->qp1c_bytes_16, QP1C_BYTES_16_RQ_BA_FLG_S, 2624 2632 1); 2625 2633 roce_set_bit(context->qp1c_bytes_16, QP1C_BYTES_16_SQ_BA_FLG_S, ··· 2925 2933 1); 2926 2934 roce_set_bit(context->qpc_bytes_32, 2927 2935 QP_CONTEXT_QPC_BYTE_32_SIGNALING_TYPE_S, 2928 - le32_to_cpu(hr_qp->sq_signal_bits)); 2936 + hr_qp->sq_signal_bits); 2929 2937 2930 2938 port = (attr_mask & IB_QP_PORT) ? (attr->port_num - 1) : 2931 2939 hr_qp->port; ··· 3570 3578 qp_attr->retry_cnt = roce_get_field(context->qpc_bytes_148, 3571 3579 QP_CONTEXT_QPC_BYTES_148_RETRY_COUNT_M, 3572 3580 QP_CONTEXT_QPC_BYTES_148_RETRY_COUNT_S); 3573 - qp_attr->rnr_retry = (u8)context->rnr_retry; 3581 + qp_attr->rnr_retry = (u8)le32_to_cpu(context->rnr_retry); 3574 3582 3575 3583 done: 3576 3584 qp_attr->cur_qp_state = qp_attr->qp_state; ··· 4013 4021 ++eq->cons_index; 4014 4022 ceqes_found = 1; 4015 4023 4016 - if (eq->cons_index > 2 * hr_dev->caps.ceqe_depth - 1) { 4024 + if (eq->cons_index > 4025 + EQ_DEPTH_COEFF * hr_dev->caps.ceqe_depth - 1) { 4017 4026 dev_warn(&eq->hr_dev->pdev->dev, 4018 4027 "cons_index overflow, set back to 0.\n"); 4019 4028 eq->cons_index = 0; ··· 4511 4518 struct platform_device *pdev = NULL; 4512 4519 struct net_device *netdev = NULL; 4513 4520 struct device_node *net_node; 4514 - struct resource *res; 4515 4521 int port_cnt = 0; 4516 4522 u8 phy_port; 4517 4523 int ret; ··· 4549 4557 } 4550 4558 4551 4559 /* get the mapped register base address */ 4552 - res = platform_get_resource(hr_dev->pdev, IORESOURCE_MEM, 0); 4553 - hr_dev->reg_base = devm_ioremap_resource(dev, res); 4560 + hr_dev->reg_base = devm_platform_ioremap_resource(hr_dev->pdev, 0); 4554 4561 if (IS_ERR(hr_dev->reg_base)) 4555 4562 return PTR_ERR(hr_dev->reg_base); 4556 4563 ··· 4624 4633 /* fetch the interrupt numbers */ 4625 4634 for (i = 0; i < HNS_ROCE_V1_MAX_IRQ_NUM; i++) { 4626 4635 hr_dev->irq[i] = platform_get_irq(hr_dev->pdev, i); 4627 - if (hr_dev->irq[i] <= 0) { 4628 - dev_err(dev, "platform get of irq[=%d] failed!\n", i); 4636 + if (hr_dev->irq[i] <= 0) 4629 4637 return -EINVAL; 4630 - } 4631 4638 } 4632 4639 4633 4640 return 0;
+620 -463
drivers/infiniband/hw/hns/hns_roce_hw_v2.c
··· 239 239 struct device *dev = hr_dev->dev; 240 240 struct hns_roce_v2_db sq_db; 241 241 struct ib_qp_attr attr; 242 - unsigned int sge_ind = 0; 242 + unsigned int sge_ind; 243 243 unsigned int owner_bit; 244 244 unsigned long flags; 245 245 unsigned int ind; ··· 397 397 roce_set_field(ud_sq_wqe->byte_36, 398 398 V2_UD_SEND_WQE_BYTE_36_TCLASS_M, 399 399 V2_UD_SEND_WQE_BYTE_36_TCLASS_S, 400 - ah->av.sl_tclass_flowlabel >> 401 - HNS_ROCE_TCLASS_SHIFT); 400 + ah->av.tclass); 402 401 roce_set_field(ud_sq_wqe->byte_40, 403 402 V2_UD_SEND_WQE_BYTE_40_FLOW_LABEL_M, 404 403 V2_UD_SEND_WQE_BYTE_40_FLOW_LABEL_S, 405 - ah->av.sl_tclass_flowlabel & 406 - HNS_ROCE_FLOW_LABEL_MASK); 404 + ah->av.flowlabel); 407 405 roce_set_field(ud_sq_wqe->byte_40, 408 406 V2_UD_SEND_WQE_BYTE_40_SL_M, 409 407 V2_UD_SEND_WQE_BYTE_40_SL_S, 410 - le32_to_cpu(ah->av.sl_tclass_flowlabel) >> 411 - HNS_ROCE_SL_SHIFT); 408 + ah->av.sl); 412 409 roce_set_field(ud_sq_wqe->byte_40, 413 410 V2_UD_SEND_WQE_BYTE_40_PORTN_M, 414 411 V2_UD_SEND_WQE_BYTE_40_PORTN_S, ··· 884 887 roce_write(hr_dev, ROCEE_TX_CMQ_BASEADDR_H_REG, 885 888 upper_32_bits(dma)); 886 889 roce_write(hr_dev, ROCEE_TX_CMQ_DEPTH_REG, 887 - (ring->desc_num >> HNS_ROCE_CMQ_DESC_NUM_S) | 888 - HNS_ROCE_CMQ_ENABLE); 890 + ring->desc_num >> HNS_ROCE_CMQ_DESC_NUM_S); 889 891 roce_write(hr_dev, ROCEE_TX_CMQ_HEAD_REG, 0); 890 892 roce_write(hr_dev, ROCEE_TX_CMQ_TAIL_REG, 0); 891 893 } else { ··· 892 896 roce_write(hr_dev, ROCEE_RX_CMQ_BASEADDR_H_REG, 893 897 upper_32_bits(dma)); 894 898 roce_write(hr_dev, ROCEE_RX_CMQ_DEPTH_REG, 895 - (ring->desc_num >> HNS_ROCE_CMQ_DESC_NUM_S) | 896 - HNS_ROCE_CMQ_ENABLE); 899 + ring->desc_num >> HNS_ROCE_CMQ_DESC_NUM_S); 897 900 roce_write(hr_dev, ROCEE_RX_CMQ_HEAD_REG, 0); 898 901 roce_write(hr_dev, ROCEE_RX_CMQ_TAIL_REG, 0); 899 902 } ··· 1039 1044 * If the command is sync, wait for the firmware to write back, 1040 1045 * if multi descriptors to be sent, use the first one to check 1041 1046 */ 1042 - if ((desc->flag) & HNS_ROCE_CMD_FLAG_NO_INTR) { 1047 + if (le16_to_cpu(desc->flag) & HNS_ROCE_CMD_FLAG_NO_INTR) { 1043 1048 do { 1044 1049 if (hns_roce_cmq_csq_done(hr_dev)) 1045 1050 break; ··· 1056 1061 desc_to_use = &csq->desc[ntc]; 1057 1062 desc[handle] = *desc_to_use; 1058 1063 dev_dbg(hr_dev->dev, "Get cmq desc:\n"); 1059 - desc_ret = desc[handle].retval; 1064 + desc_ret = le16_to_cpu(desc[handle].retval); 1060 1065 if (desc_ret == CMD_EXEC_SUCCESS) 1061 1066 ret = 0; 1062 1067 else ··· 1119 1124 return ret; 1120 1125 1121 1126 resp = (struct hns_roce_query_version *)desc.data; 1122 - hr_dev->hw_rev = le32_to_cpu(resp->rocee_hw_version); 1127 + hr_dev->hw_rev = le16_to_cpu(resp->rocee_hw_version); 1123 1128 hr_dev->vendor_id = hr_dev->pci_dev->vendor; 1124 1129 1125 1130 return 0; 1126 1131 } 1127 1132 1133 + static bool hns_roce_func_clr_chk_rst(struct hns_roce_dev *hr_dev) 1134 + { 1135 + struct hns_roce_v2_priv *priv = (struct hns_roce_v2_priv *)hr_dev->priv; 1136 + struct hnae3_handle *handle = priv->handle; 1137 + const struct hnae3_ae_ops *ops = handle->ae_algo->ops; 1138 + unsigned long reset_cnt; 1139 + bool sw_resetting; 1140 + bool hw_resetting; 1141 + 1142 + reset_cnt = ops->ae_dev_reset_cnt(handle); 1143 + hw_resetting = ops->get_hw_reset_stat(handle); 1144 + sw_resetting = ops->ae_dev_resetting(handle); 1145 + 1146 + if (reset_cnt != hr_dev->reset_cnt || hw_resetting || sw_resetting) 1147 + return true; 1148 + 1149 + return false; 1150 + } 1151 + 1152 + static void hns_roce_func_clr_rst_prc(struct hns_roce_dev *hr_dev, int retval, 1153 + int flag) 1154 + { 1155 + struct hns_roce_v2_priv *priv = (struct hns_roce_v2_priv *)hr_dev->priv; 1156 + struct hnae3_handle *handle = priv->handle; 1157 + const struct hnae3_ae_ops *ops = handle->ae_algo->ops; 1158 + unsigned long instance_stage; 1159 + unsigned long reset_cnt; 1160 + unsigned long end; 1161 + bool sw_resetting; 1162 + bool hw_resetting; 1163 + 1164 + instance_stage = handle->rinfo.instance_state; 1165 + reset_cnt = ops->ae_dev_reset_cnt(handle); 1166 + hw_resetting = ops->get_hw_reset_stat(handle); 1167 + sw_resetting = ops->ae_dev_resetting(handle); 1168 + 1169 + if (reset_cnt != hr_dev->reset_cnt) { 1170 + hr_dev->dis_db = true; 1171 + hr_dev->is_reset = true; 1172 + dev_info(hr_dev->dev, "Func clear success after reset.\n"); 1173 + } else if (hw_resetting) { 1174 + hr_dev->dis_db = true; 1175 + 1176 + dev_warn(hr_dev->dev, 1177 + "Func clear is pending, device in resetting state.\n"); 1178 + end = HNS_ROCE_V2_HW_RST_TIMEOUT; 1179 + while (end) { 1180 + if (!ops->get_hw_reset_stat(handle)) { 1181 + hr_dev->is_reset = true; 1182 + dev_info(hr_dev->dev, 1183 + "Func clear success after reset.\n"); 1184 + return; 1185 + } 1186 + msleep(HNS_ROCE_V2_HW_RST_COMPLETION_WAIT); 1187 + end -= HNS_ROCE_V2_HW_RST_COMPLETION_WAIT; 1188 + } 1189 + 1190 + dev_warn(hr_dev->dev, "Func clear failed.\n"); 1191 + } else if (sw_resetting && instance_stage == HNS_ROCE_STATE_INIT) { 1192 + hr_dev->dis_db = true; 1193 + 1194 + dev_warn(hr_dev->dev, 1195 + "Func clear is pending, device in resetting state.\n"); 1196 + end = HNS_ROCE_V2_HW_RST_TIMEOUT; 1197 + while (end) { 1198 + if (ops->ae_dev_reset_cnt(handle) != 1199 + hr_dev->reset_cnt) { 1200 + hr_dev->is_reset = true; 1201 + dev_info(hr_dev->dev, 1202 + "Func clear success after sw reset\n"); 1203 + return; 1204 + } 1205 + msleep(HNS_ROCE_V2_HW_RST_COMPLETION_WAIT); 1206 + end -= HNS_ROCE_V2_HW_RST_COMPLETION_WAIT; 1207 + } 1208 + 1209 + dev_warn(hr_dev->dev, "Func clear failed because of unfinished sw reset\n"); 1210 + } else { 1211 + if (retval && !flag) 1212 + dev_warn(hr_dev->dev, 1213 + "Func clear read failed, ret = %d.\n", retval); 1214 + 1215 + dev_warn(hr_dev->dev, "Func clear failed.\n"); 1216 + } 1217 + } 1128 1218 static void hns_roce_function_clear(struct hns_roce_dev *hr_dev) 1129 1219 { 1220 + bool fclr_write_fail_flag = false; 1130 1221 struct hns_roce_func_clear *resp; 1131 1222 struct hns_roce_cmq_desc desc; 1132 1223 unsigned long end; 1133 - int ret; 1224 + int ret = 0; 1225 + 1226 + if (hns_roce_func_clr_chk_rst(hr_dev)) 1227 + goto out; 1134 1228 1135 1229 hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_FUNC_CLEAR, false); 1136 1230 resp = (struct hns_roce_func_clear *)desc.data; 1137 1231 1138 1232 ret = hns_roce_cmq_send(hr_dev, &desc, 1); 1139 1233 if (ret) { 1234 + fclr_write_fail_flag = true; 1140 1235 dev_err(hr_dev->dev, "Func clear write failed, ret = %d.\n", 1141 1236 ret); 1142 - return; 1237 + goto out; 1143 1238 } 1144 1239 1145 1240 msleep(HNS_ROCE_V2_READ_FUNC_CLEAR_FLAG_INTERVAL); 1146 1241 end = HNS_ROCE_V2_FUNC_CLEAR_TIMEOUT_MSECS; 1147 1242 while (end) { 1243 + if (hns_roce_func_clr_chk_rst(hr_dev)) 1244 + goto out; 1148 1245 msleep(HNS_ROCE_V2_READ_FUNC_CLEAR_FLAG_FAIL_WAIT); 1149 1246 end -= HNS_ROCE_V2_READ_FUNC_CLEAR_FLAG_FAIL_WAIT; 1150 1247 ··· 1253 1166 } 1254 1167 } 1255 1168 1169 + out: 1256 1170 dev_err(hr_dev->dev, "Func clear fail.\n"); 1171 + hns_roce_func_clr_rst_prc(hr_dev, ret, fclr_write_fail_flag); 1257 1172 } 1258 1173 1259 1174 static int hns_roce_query_fw_ver(struct hns_roce_dev *hr_dev) ··· 1387 1298 1388 1299 swt = (struct hns_roce_vf_switch *)desc.data; 1389 1300 hns_roce_cmq_setup_basic_desc(&desc, HNS_SWITCH_PARAMETER_CFG, true); 1390 - swt->rocee_sel |= cpu_to_le16(HNS_ICL_SWITCH_CMD_ROCEE_SEL); 1301 + swt->rocee_sel |= cpu_to_le32(HNS_ICL_SWITCH_CMD_ROCEE_SEL); 1391 1302 roce_set_field(swt->fun_id, 1392 1303 VF_SWITCH_DATA_FUN_ID_VF_ID_M, 1393 1304 VF_SWITCH_DATA_FUN_ID_VF_ID_S, ··· 1399 1310 cpu_to_le16(HNS_ROCE_CMD_FLAG_NO_INTR | HNS_ROCE_CMD_FLAG_IN); 1400 1311 desc.flag &= cpu_to_le16(~HNS_ROCE_CMD_FLAG_WR); 1401 1312 roce_set_bit(swt->cfg, VF_SWITCH_DATA_CFG_ALW_LPBK_S, 1); 1402 - roce_set_bit(swt->cfg, VF_SWITCH_DATA_CFG_ALW_LCL_LPBK_S, 1); 1313 + roce_set_bit(swt->cfg, VF_SWITCH_DATA_CFG_ALW_LCL_LPBK_S, 0); 1403 1314 roce_set_bit(swt->cfg, VF_SWITCH_DATA_CFG_ALW_DST_OVRD_S, 1); 1404 1315 1405 1316 return hns_roce_cmq_send(hr_dev, &desc, 1); ··· 1813 1724 desc[i].flag &= ~cpu_to_le16(HNS_ROCE_CMD_FLAG_NEXT); 1814 1725 1815 1726 if (i == 0) { 1816 - req_a->base_addr_l = link_tbl->table.map & 0xffffffff; 1817 - req_a->base_addr_h = (link_tbl->table.map >> 32) & 1818 - 0xffffffff; 1727 + req_a->base_addr_l = 1728 + cpu_to_le32(link_tbl->table.map & 0xffffffff); 1729 + req_a->base_addr_h = 1730 + cpu_to_le32(link_tbl->table.map >> 32); 1819 1731 roce_set_field(req_a->depth_pgsz_init_en, 1820 1732 CFG_LLM_QUE_DEPTH_M, 1821 1733 CFG_LLM_QUE_DEPTH_S, ··· 1825 1735 CFG_LLM_QUE_PGSZ_M, 1826 1736 CFG_LLM_QUE_PGSZ_S, 1827 1737 link_tbl->pg_sz); 1828 - req_a->head_ba_l = entry[0].blk_ba0; 1829 - req_a->head_ba_h_nxtptr = entry[0].blk_ba1_nxt_ptr; 1738 + req_a->head_ba_l = cpu_to_le32(entry[0].blk_ba0); 1739 + req_a->head_ba_h_nxtptr = 1740 + cpu_to_le32(entry[0].blk_ba1_nxt_ptr); 1830 1741 roce_set_field(req_a->head_ptr, 1831 1742 CFG_LLM_HEAD_PTR_M, 1832 1743 CFG_LLM_HEAD_PTR_S, 0); 1833 1744 } else { 1834 - req_b->tail_ba_l = entry[page_num - 1].blk_ba0; 1745 + req_b->tail_ba_l = 1746 + cpu_to_le32(entry[page_num - 1].blk_ba0); 1835 1747 roce_set_field(req_b->tail_ba_h, 1836 1748 CFG_LLM_TAIL_BA_H_M, 1837 1749 CFG_LLM_TAIL_BA_H_S, ··· 1909 1817 1910 1818 link_tbl->pg_list[i].map = t; 1911 1819 1912 - entry[i].blk_ba0 = (t >> 12) & 0xffffffff; 1913 - roce_set_field(entry[i].blk_ba1_nxt_ptr, 1914 - HNS_ROCE_LINK_TABLE_BA1_M, 1915 - HNS_ROCE_LINK_TABLE_BA1_S, 1916 - t >> 44); 1820 + entry[i].blk_ba0 = (u32)(t >> 12); 1821 + entry[i].blk_ba1_nxt_ptr = (u32)(t >> 44); 1917 1822 1918 1823 if (i < (pg_num - 1)) 1919 - roce_set_field(entry[i].blk_ba1_nxt_ptr, 1920 - HNS_ROCE_LINK_TABLE_NXT_PTR_M, 1921 - HNS_ROCE_LINK_TABLE_NXT_PTR_S, 1922 - i + 1); 1824 + entry[i].blk_ba1_nxt_ptr |= 1825 + (i + 1) << HNS_ROCE_LINK_TABLE_NXT_PTR_S; 1826 + 1923 1827 } 1924 1828 link_tbl->npages = pg_num; 1925 1829 link_tbl->pg_sz = buf_chk_sz; ··· 1976 1888 goto err_tpq_init_failed; 1977 1889 } 1978 1890 1979 - /* Alloc memory for QPC Timer buffer space chunk*/ 1891 + /* Alloc memory for QPC Timer buffer space chunk */ 1980 1892 for (qpc_count = 0; qpc_count < hr_dev->caps.qpc_timer_bt_num; 1981 1893 qpc_count++) { 1982 1894 ret = hns_roce_table_get(hr_dev, &hr_dev->qpc_timer_table, ··· 1987 1899 } 1988 1900 } 1989 1901 1990 - /* Alloc memory for CQC Timer buffer space chunk*/ 1902 + /* Alloc memory for CQC Timer buffer space chunk */ 1991 1903 for (cqc_count = 0; cqc_count < hr_dev->caps.cqc_timer_bt_num; 1992 1904 cqc_count++) { 1993 1905 ret = hns_roce_table_get(hr_dev, &hr_dev->cqc_timer_table, ··· 2040 1952 if (status) 2041 1953 return status; 2042 1954 2043 - return cpu_to_le32(mb_st->mb_status_hw_run); 1955 + return le32_to_cpu(mb_st->mb_status_hw_run); 2044 1956 } 2045 1957 2046 1958 static int hns_roce_v2_cmd_pending(struct hns_roce_dev *hr_dev) ··· 2066 1978 2067 1979 hns_roce_cmq_setup_basic_desc(&desc, HNS_ROCE_OPC_POST_MB, false); 2068 1980 2069 - mb->in_param_l = cpu_to_le64(in_param); 2070 - mb->in_param_h = cpu_to_le64(in_param) >> 32; 2071 - mb->out_param_l = cpu_to_le64(out_param); 2072 - mb->out_param_h = cpu_to_le64(out_param) >> 32; 1981 + mb->in_param_l = cpu_to_le32(in_param); 1982 + mb->in_param_h = cpu_to_le32(in_param >> 32); 1983 + mb->out_param_l = cpu_to_le32(out_param); 1984 + mb->out_param_h = cpu_to_le32(out_param >> 32); 2073 1985 mb->cmd_tag = cpu_to_le32(in_modifier << 8 | op); 2074 1986 mb->token_event_en = cpu_to_le32(event << 16 | token); 2075 1987 ··· 2211 2123 roce_set_field(smac_tb->vf_smac_h_rsv, 2212 2124 CFG_SMAC_TB_VF_SMAC_H_M, 2213 2125 CFG_SMAC_TB_VF_SMAC_H_S, reg_smac_h); 2214 - smac_tb->vf_smac_l = reg_smac_l; 2126 + smac_tb->vf_smac_l = cpu_to_le32(reg_smac_l); 2215 2127 2216 2128 return hns_roce_cmq_send(hr_dev, &desc, 1); 2217 2129 } ··· 2497 2409 2498 2410 for (prod_index = hr_cq->cons_index; get_sw_cqe_v2(hr_cq, prod_index); 2499 2411 ++prod_index) { 2500 - if (prod_index == hr_cq->cons_index + hr_cq->ib_cq.cqe) 2412 + if (prod_index > hr_cq->cons_index + hr_cq->ib_cq.cqe) 2501 2413 break; 2502 2414 } 2503 2415 ··· 2566 2478 V2_CQC_BYTE_4_SHIFT_S, ilog2((unsigned int)nent)); 2567 2479 roce_set_field(cq_context->byte_4_pg_ceqn, V2_CQC_BYTE_4_CEQN_M, 2568 2480 V2_CQC_BYTE_4_CEQN_S, vector); 2569 - cq_context->byte_4_pg_ceqn = cpu_to_le32(cq_context->byte_4_pg_ceqn); 2570 2481 2571 2482 roce_set_field(cq_context->byte_8_cqn, V2_CQC_BYTE_8_CQN_M, 2572 2483 V2_CQC_BYTE_8_CQN_S, hr_cq->cqn); 2573 2484 2574 - cq_context->cqe_cur_blk_addr = (u32)(mtts[0] >> PAGE_ADDR_SHIFT); 2575 - cq_context->cqe_cur_blk_addr = 2576 - cpu_to_le32(cq_context->cqe_cur_blk_addr); 2485 + cq_context->cqe_cur_blk_addr = cpu_to_le32(mtts[0] >> PAGE_ADDR_SHIFT); 2577 2486 2578 2487 roce_set_field(cq_context->byte_16_hop_addr, 2579 2488 V2_CQC_BYTE_16_CQE_CUR_BLK_ADDR_M, 2580 2489 V2_CQC_BYTE_16_CQE_CUR_BLK_ADDR_S, 2581 - cpu_to_le32((mtts[0]) >> (32 + PAGE_ADDR_SHIFT))); 2490 + mtts[0] >> (32 + PAGE_ADDR_SHIFT)); 2582 2491 roce_set_field(cq_context->byte_16_hop_addr, 2583 2492 V2_CQC_BYTE_16_CQE_HOP_NUM_M, 2584 2493 V2_CQC_BYTE_16_CQE_HOP_NUM_S, hr_dev->caps.cqe_hop_num == 2585 2494 HNS_ROCE_HOP_NUM_0 ? 0 : hr_dev->caps.cqe_hop_num); 2586 2495 2587 - cq_context->cqe_nxt_blk_addr = (u32)(mtts[1] >> PAGE_ADDR_SHIFT); 2496 + cq_context->cqe_nxt_blk_addr = cpu_to_le32(mtts[1] >> PAGE_ADDR_SHIFT); 2588 2497 roce_set_field(cq_context->byte_24_pgsz_addr, 2589 2498 V2_CQC_BYTE_24_CQE_NXT_BLK_ADDR_M, 2590 2499 V2_CQC_BYTE_24_CQE_NXT_BLK_ADDR_S, 2591 - cpu_to_le32((mtts[1]) >> (32 + PAGE_ADDR_SHIFT))); 2500 + mtts[1] >> (32 + PAGE_ADDR_SHIFT)); 2592 2501 roce_set_field(cq_context->byte_24_pgsz_addr, 2593 2502 V2_CQC_BYTE_24_CQE_BA_PG_SZ_M, 2594 2503 V2_CQC_BYTE_24_CQE_BA_PG_SZ_S, ··· 2595 2510 V2_CQC_BYTE_24_CQE_BUF_PG_SZ_S, 2596 2511 hr_dev->caps.cqe_buf_pg_sz + PG_SHIFT_OFFSET); 2597 2512 2598 - cq_context->cqe_ba = (u32)(dma_handle >> 3); 2513 + cq_context->cqe_ba = cpu_to_le32(dma_handle >> 3); 2599 2514 2600 2515 roce_set_field(cq_context->byte_40_cqe_ba, V2_CQC_BYTE_40_CQE_BA_M, 2601 2516 V2_CQC_BYTE_40_CQE_BA_S, (dma_handle >> (32 + 3))); ··· 2608 2523 V2_CQC_BYTE_44_DB_RECORD_ADDR_M, 2609 2524 V2_CQC_BYTE_44_DB_RECORD_ADDR_S, 2610 2525 ((u32)hr_cq->db.dma) >> 1); 2611 - cq_context->db_record_addr = hr_cq->db.dma >> 32; 2526 + cq_context->db_record_addr = cpu_to_le32(hr_cq->db.dma >> 32); 2612 2527 2613 2528 roce_set_field(cq_context->byte_56_cqe_period_maxcnt, 2614 2529 V2_CQC_BYTE_56_CQ_MAX_CNT_M, ··· 2626 2541 struct hns_roce_dev *hr_dev = to_hr_dev(ibcq->device); 2627 2542 struct hns_roce_cq *hr_cq = to_hr_cq(ibcq); 2628 2543 u32 notification_flag; 2629 - u32 doorbell[2]; 2544 + __le32 doorbell[2]; 2630 2545 2631 2546 doorbell[0] = 0; 2632 2547 doorbell[1] = 0; ··· 2753 2668 ++wq->tail; 2754 2669 } else if ((*cur_qp)->ibqp.srq) { 2755 2670 srq = to_hr_srq((*cur_qp)->ibqp.srq); 2756 - wqe_ctr = le16_to_cpu(roce_get_field(cqe->byte_4, 2757 - V2_CQE_BYTE_4_WQE_INDX_M, 2758 - V2_CQE_BYTE_4_WQE_INDX_S)); 2671 + wqe_ctr = (u16)roce_get_field(cqe->byte_4, 2672 + V2_CQE_BYTE_4_WQE_INDX_M, 2673 + V2_CQE_BYTE_4_WQE_INDX_S); 2759 2674 wc->wr_id = srq->wrid[wqe_ctr]; 2760 2675 hns_roce_free_srq_wqe(srq, wqe_ctr); 2761 2676 } else { ··· 2947 2862 wc->smac[5] = roce_get_field(cqe->byte_28, 2948 2863 V2_CQE_BYTE_28_SMAC_5_M, 2949 2864 V2_CQE_BYTE_28_SMAC_5_S); 2865 + wc->wc_flags |= IB_WC_WITH_SMAC; 2950 2866 if (roce_get_bit(cqe->byte_28, V2_CQE_BYTE_28_VID_VLD_S)) { 2951 2867 wc->vlan_id = (u16)roce_get_field(cqe->byte_28, 2952 2868 V2_CQE_BYTE_28_VID_M, 2953 2869 V2_CQE_BYTE_28_VID_S); 2870 + wc->wc_flags |= IB_WC_WITH_VLAN; 2954 2871 } else { 2955 2872 wc->vlan_id = 0xffff; 2956 2873 } 2957 2874 2958 - wc->wc_flags |= (IB_WC_WITH_VLAN | IB_WC_WITH_SMAC); 2959 2875 wc->network_hdr_type = roce_get_field(cqe->byte_28, 2960 2876 V2_CQE_BYTE_28_PORT_TYPE_M, 2961 2877 V2_CQE_BYTE_28_PORT_TYPE_S); ··· 2991 2905 return npolled; 2992 2906 } 2993 2907 2994 - static int hns_roce_v2_set_hem(struct hns_roce_dev *hr_dev, 2995 - struct hns_roce_hem_table *table, int obj, 2996 - int step_idx) 2908 + static int get_op_for_set_hem(struct hns_roce_dev *hr_dev, u32 type, 2909 + int step_idx) 2997 2910 { 2998 - struct device *dev = hr_dev->dev; 2999 - struct hns_roce_cmd_mailbox *mailbox; 3000 - struct hns_roce_hem_iter iter; 3001 - struct hns_roce_hem_mhop mhop; 3002 - struct hns_roce_hem *hem; 3003 - unsigned long mhop_obj = obj; 3004 - int i, j, k; 3005 - int ret = 0; 3006 - u64 hem_idx = 0; 3007 - u64 l1_idx = 0; 3008 - u64 bt_ba = 0; 3009 - u32 chunk_ba_num; 3010 - u32 hop_num; 3011 - u16 op = 0xff; 2911 + int op; 3012 2912 3013 - if (!hns_roce_check_whether_mhop(hr_dev, table->type)) 3014 - return 0; 2913 + if (type == HEM_TYPE_SCCC && step_idx) 2914 + return -EINVAL; 3015 2915 3016 - hns_roce_calc_hem_mhop(hr_dev, table, &mhop_obj, &mhop); 3017 - i = mhop.l0_idx; 3018 - j = mhop.l1_idx; 3019 - k = mhop.l2_idx; 3020 - hop_num = mhop.hop_num; 3021 - chunk_ba_num = mhop.bt_chunk_size / 8; 3022 - 3023 - if (hop_num == 2) { 3024 - hem_idx = i * chunk_ba_num * chunk_ba_num + j * chunk_ba_num + 3025 - k; 3026 - l1_idx = i * chunk_ba_num + j; 3027 - } else if (hop_num == 1) { 3028 - hem_idx = i * chunk_ba_num + j; 3029 - } else if (hop_num == HNS_ROCE_HOP_NUM_0) { 3030 - hem_idx = i; 3031 - } 3032 - 3033 - switch (table->type) { 2916 + switch (type) { 3034 2917 case HEM_TYPE_QPC: 3035 2918 op = HNS_ROCE_CMD_WRITE_QPC_BT0; 3036 2919 break; ··· 3022 2967 op = HNS_ROCE_CMD_WRITE_CQC_TIMER_BT0; 3023 2968 break; 3024 2969 default: 3025 - dev_warn(dev, "Table %d not to be written by mailbox!\n", 3026 - table->type); 3027 - return 0; 2970 + dev_warn(hr_dev->dev, 2971 + "Table %d not to be written by mailbox!\n", type); 2972 + return -EINVAL; 3028 2973 } 3029 2974 3030 - if (table->type == HEM_TYPE_SCCC && step_idx) 2975 + return op + step_idx; 2976 + } 2977 + 2978 + static int hns_roce_v2_set_hem(struct hns_roce_dev *hr_dev, 2979 + struct hns_roce_hem_table *table, int obj, 2980 + int step_idx) 2981 + { 2982 + struct hns_roce_cmd_mailbox *mailbox; 2983 + struct hns_roce_hem_iter iter; 2984 + struct hns_roce_hem_mhop mhop; 2985 + struct hns_roce_hem *hem; 2986 + unsigned long mhop_obj = obj; 2987 + int i, j, k; 2988 + int ret = 0; 2989 + u64 hem_idx = 0; 2990 + u64 l1_idx = 0; 2991 + u64 bt_ba = 0; 2992 + u32 chunk_ba_num; 2993 + u32 hop_num; 2994 + int op; 2995 + 2996 + if (!hns_roce_check_whether_mhop(hr_dev, table->type)) 3031 2997 return 0; 3032 2998 3033 - op += step_idx; 2999 + hns_roce_calc_hem_mhop(hr_dev, table, &mhop_obj, &mhop); 3000 + i = mhop.l0_idx; 3001 + j = mhop.l1_idx; 3002 + k = mhop.l2_idx; 3003 + hop_num = mhop.hop_num; 3004 + chunk_ba_num = mhop.bt_chunk_size / 8; 3005 + 3006 + if (hop_num == 2) { 3007 + hem_idx = i * chunk_ba_num * chunk_ba_num + j * chunk_ba_num + 3008 + k; 3009 + l1_idx = i * chunk_ba_num + j; 3010 + } else if (hop_num == 1) { 3011 + hem_idx = i * chunk_ba_num + j; 3012 + } else if (hop_num == HNS_ROCE_HOP_NUM_0) { 3013 + hem_idx = i; 3014 + } 3015 + 3016 + op = get_op_for_set_hem(hr_dev, table->type, step_idx); 3017 + if (op == -EINVAL) 3018 + return 0; 3034 3019 3035 3020 mailbox = hns_roce_alloc_cmd_mailbox(hr_dev); 3036 3021 if (IS_ERR(mailbox)) ··· 3213 3118 roce_set_bit(qpc_mask->byte_76_srqn_op_en, V2_QPC_BYTE_76_ATE_S, 0); 3214 3119 } 3215 3120 3121 + static void set_qpc_wqe_cnt(struct hns_roce_qp *hr_qp, 3122 + struct hns_roce_v2_qp_context *context, 3123 + struct hns_roce_v2_qp_context *qpc_mask) 3124 + { 3125 + if (hr_qp->ibqp.qp_type == IB_QPT_GSI) 3126 + roce_set_field(context->byte_4_sqpn_tst, 3127 + V2_QPC_BYTE_4_SGE_SHIFT_M, 3128 + V2_QPC_BYTE_4_SGE_SHIFT_S, 3129 + ilog2((unsigned int)hr_qp->sge.sge_cnt)); 3130 + else 3131 + roce_set_field(context->byte_4_sqpn_tst, 3132 + V2_QPC_BYTE_4_SGE_SHIFT_M, 3133 + V2_QPC_BYTE_4_SGE_SHIFT_S, 3134 + hr_qp->sq.max_gs > 3135 + HNS_ROCE_V2_UC_RC_SGE_NUM_IN_WQE ? 3136 + ilog2((unsigned int)hr_qp->sge.sge_cnt) : 0); 3137 + 3138 + roce_set_field(qpc_mask->byte_4_sqpn_tst, V2_QPC_BYTE_4_SGE_SHIFT_M, 3139 + V2_QPC_BYTE_4_SGE_SHIFT_S, 0); 3140 + 3141 + roce_set_field(context->byte_20_smac_sgid_idx, 3142 + V2_QPC_BYTE_20_SQ_SHIFT_M, V2_QPC_BYTE_20_SQ_SHIFT_S, 3143 + ilog2((unsigned int)hr_qp->sq.wqe_cnt)); 3144 + roce_set_field(qpc_mask->byte_20_smac_sgid_idx, 3145 + V2_QPC_BYTE_20_SQ_SHIFT_M, V2_QPC_BYTE_20_SQ_SHIFT_S, 0); 3146 + 3147 + roce_set_field(context->byte_20_smac_sgid_idx, 3148 + V2_QPC_BYTE_20_RQ_SHIFT_M, V2_QPC_BYTE_20_RQ_SHIFT_S, 3149 + (hr_qp->ibqp.qp_type == IB_QPT_XRC_INI || 3150 + hr_qp->ibqp.qp_type == IB_QPT_XRC_TGT || 3151 + hr_qp->ibqp.srq) ? 0 : 3152 + ilog2((unsigned int)hr_qp->rq.wqe_cnt)); 3153 + 3154 + roce_set_field(qpc_mask->byte_20_smac_sgid_idx, 3155 + V2_QPC_BYTE_20_RQ_SHIFT_M, V2_QPC_BYTE_20_RQ_SHIFT_S, 0); 3156 + } 3157 + 3216 3158 static void modify_qp_reset_to_init(struct ib_qp *ibqp, 3217 3159 const struct ib_qp_attr *attr, 3218 3160 int attr_mask, ··· 3270 3138 roce_set_field(qpc_mask->byte_4_sqpn_tst, V2_QPC_BYTE_4_TST_M, 3271 3139 V2_QPC_BYTE_4_TST_S, 0); 3272 3140 3273 - if (ibqp->qp_type == IB_QPT_GSI) 3274 - roce_set_field(context->byte_4_sqpn_tst, 3275 - V2_QPC_BYTE_4_SGE_SHIFT_M, 3276 - V2_QPC_BYTE_4_SGE_SHIFT_S, 3277 - ilog2((unsigned int)hr_qp->sge.sge_cnt)); 3278 - else 3279 - roce_set_field(context->byte_4_sqpn_tst, 3280 - V2_QPC_BYTE_4_SGE_SHIFT_M, 3281 - V2_QPC_BYTE_4_SGE_SHIFT_S, 3282 - hr_qp->sq.max_gs > 2 ? 3283 - ilog2((unsigned int)hr_qp->sge.sge_cnt) : 0); 3284 - 3285 - roce_set_field(qpc_mask->byte_4_sqpn_tst, V2_QPC_BYTE_4_SGE_SHIFT_M, 3286 - V2_QPC_BYTE_4_SGE_SHIFT_S, 0); 3287 - 3288 3141 roce_set_field(context->byte_4_sqpn_tst, V2_QPC_BYTE_4_SQPN_M, 3289 3142 V2_QPC_BYTE_4_SQPN_S, hr_qp->qpn); 3290 3143 roce_set_field(qpc_mask->byte_4_sqpn_tst, V2_QPC_BYTE_4_SQPN_M, ··· 3285 3168 roce_set_field(qpc_mask->byte_20_smac_sgid_idx, V2_QPC_BYTE_20_RQWS_M, 3286 3169 V2_QPC_BYTE_20_RQWS_S, 0); 3287 3170 3288 - roce_set_field(context->byte_20_smac_sgid_idx, 3289 - V2_QPC_BYTE_20_SQ_SHIFT_M, V2_QPC_BYTE_20_SQ_SHIFT_S, 3290 - ilog2((unsigned int)hr_qp->sq.wqe_cnt)); 3291 - roce_set_field(qpc_mask->byte_20_smac_sgid_idx, 3292 - V2_QPC_BYTE_20_SQ_SHIFT_M, V2_QPC_BYTE_20_SQ_SHIFT_S, 0); 3293 - 3294 - roce_set_field(context->byte_20_smac_sgid_idx, 3295 - V2_QPC_BYTE_20_RQ_SHIFT_M, V2_QPC_BYTE_20_RQ_SHIFT_S, 3296 - (hr_qp->ibqp.qp_type == IB_QPT_XRC_INI || 3297 - hr_qp->ibqp.qp_type == IB_QPT_XRC_TGT || ibqp->srq) ? 0 : 3298 - ilog2((unsigned int)hr_qp->rq.wqe_cnt)); 3299 - roce_set_field(qpc_mask->byte_20_smac_sgid_idx, 3300 - V2_QPC_BYTE_20_RQ_SHIFT_M, V2_QPC_BYTE_20_RQ_SHIFT_S, 0); 3171 + set_qpc_wqe_cnt(hr_qp, context, qpc_mask); 3301 3172 3302 3173 /* No VLAN need to set 0xFFF */ 3303 3174 roce_set_field(context->byte_24_mtu_tc, V2_QPC_BYTE_24_VLAN_ID_M, ··· 3330 3225 roce_set_field(qpc_mask->byte_68_rq_db, 3331 3226 V2_QPC_BYTE_68_RQ_DB_RECORD_ADDR_M, 3332 3227 V2_QPC_BYTE_68_RQ_DB_RECORD_ADDR_S, 0); 3333 - context->rq_db_record_addr = hr_qp->rdb.dma >> 32; 3228 + context->rq_db_record_addr = cpu_to_le32(hr_qp->rdb.dma >> 32); 3334 3229 qpc_mask->rq_db_record_addr = 0; 3335 3230 3336 3231 roce_set_bit(context->byte_76_srqn_op_en, V2_QPC_BYTE_76_RQIE_S, ··· 3561 3456 roce_set_field(qpc_mask->byte_4_sqpn_tst, V2_QPC_BYTE_4_TST_M, 3562 3457 V2_QPC_BYTE_4_TST_S, 0); 3563 3458 3564 - if (ibqp->qp_type == IB_QPT_GSI) 3565 - roce_set_field(context->byte_4_sqpn_tst, 3566 - V2_QPC_BYTE_4_SGE_SHIFT_M, 3567 - V2_QPC_BYTE_4_SGE_SHIFT_S, 3568 - ilog2((unsigned int)hr_qp->sge.sge_cnt)); 3569 - else 3570 - roce_set_field(context->byte_4_sqpn_tst, 3571 - V2_QPC_BYTE_4_SGE_SHIFT_M, 3572 - V2_QPC_BYTE_4_SGE_SHIFT_S, 3573 - hr_qp->sq.max_gs > 3574 - HNS_ROCE_V2_UC_RC_SGE_NUM_IN_WQE ? 3575 - ilog2((unsigned int)hr_qp->sge.sge_cnt) : 0); 3576 - 3577 - roce_set_field(qpc_mask->byte_4_sqpn_tst, V2_QPC_BYTE_4_SGE_SHIFT_M, 3578 - V2_QPC_BYTE_4_SGE_SHIFT_S, 0); 3579 - 3580 3459 if (attr_mask & IB_QP_ACCESS_FLAGS) { 3581 3460 roce_set_bit(context->byte_76_srqn_op_en, V2_QPC_BYTE_76_RRE_S, 3582 3461 !!(attr->qp_access_flags & IB_ACCESS_REMOTE_READ)); ··· 3594 3505 roce_set_bit(qpc_mask->byte_76_srqn_op_en, V2_QPC_BYTE_76_ATE_S, 3595 3506 0); 3596 3507 } 3597 - 3598 - roce_set_field(context->byte_20_smac_sgid_idx, 3599 - V2_QPC_BYTE_20_SQ_SHIFT_M, V2_QPC_BYTE_20_SQ_SHIFT_S, 3600 - ilog2((unsigned int)hr_qp->sq.wqe_cnt)); 3601 - roce_set_field(qpc_mask->byte_20_smac_sgid_idx, 3602 - V2_QPC_BYTE_20_SQ_SHIFT_M, V2_QPC_BYTE_20_SQ_SHIFT_S, 0); 3603 - 3604 - roce_set_field(context->byte_20_smac_sgid_idx, 3605 - V2_QPC_BYTE_20_RQ_SHIFT_M, V2_QPC_BYTE_20_RQ_SHIFT_S, 3606 - (hr_qp->ibqp.qp_type == IB_QPT_XRC_INI || 3607 - hr_qp->ibqp.qp_type == IB_QPT_XRC_TGT || ibqp->srq) ? 0 : 3608 - ilog2((unsigned int)hr_qp->rq.wqe_cnt)); 3609 - roce_set_field(qpc_mask->byte_20_smac_sgid_idx, 3610 - V2_QPC_BYTE_20_RQ_SHIFT_M, V2_QPC_BYTE_20_RQ_SHIFT_S, 0); 3611 3508 3612 3509 roce_set_field(context->byte_16_buf_ba_pg_sz, V2_QPC_BYTE_16_PD_M, 3613 3510 V2_QPC_BYTE_16_PD_S, to_hr_pd(ibqp->pd)->pdn); ··· 3713 3638 } 3714 3639 3715 3640 dmac = (u8 *)attr->ah_attr.roce.dmac; 3716 - context->wqe_sge_ba = (u32)(wqe_sge_ba >> 3); 3641 + context->wqe_sge_ba = cpu_to_le32(wqe_sge_ba >> 3); 3717 3642 qpc_mask->wqe_sge_ba = 0; 3718 3643 3719 3644 /* ··· 3769 3694 V2_QPC_BYTE_16_WQE_SGE_BUF_PG_SZ_M, 3770 3695 V2_QPC_BYTE_16_WQE_SGE_BUF_PG_SZ_S, 0); 3771 3696 3772 - context->rq_cur_blk_addr = (u32)(mtts[0] >> PAGE_ADDR_SHIFT); 3697 + context->rq_cur_blk_addr = cpu_to_le32(mtts[0] >> PAGE_ADDR_SHIFT); 3773 3698 qpc_mask->rq_cur_blk_addr = 0; 3774 3699 3775 3700 roce_set_field(context->byte_92_srq_info, ··· 3780 3705 V2_QPC_BYTE_92_RQ_CUR_BLK_ADDR_M, 3781 3706 V2_QPC_BYTE_92_RQ_CUR_BLK_ADDR_S, 0); 3782 3707 3783 - context->rq_nxt_blk_addr = (u32)(mtts[1] >> PAGE_ADDR_SHIFT); 3708 + context->rq_nxt_blk_addr = cpu_to_le32(mtts[1] >> PAGE_ADDR_SHIFT); 3784 3709 qpc_mask->rq_nxt_blk_addr = 0; 3785 3710 3786 3711 roce_set_field(context->byte_104_rq_sge, ··· 3795 3720 V2_QPC_BYTE_132_TRRL_BA_S, dma_handle_3 >> 4); 3796 3721 roce_set_field(qpc_mask->byte_132_trrl, V2_QPC_BYTE_132_TRRL_BA_M, 3797 3722 V2_QPC_BYTE_132_TRRL_BA_S, 0); 3798 - context->trrl_ba = (u32)(dma_handle_3 >> (16 + 4)); 3723 + context->trrl_ba = cpu_to_le32(dma_handle_3 >> (16 + 4)); 3799 3724 qpc_mask->trrl_ba = 0; 3800 3725 roce_set_field(context->byte_140_raq, V2_QPC_BYTE_140_TRRL_BA_M, 3801 3726 V2_QPC_BYTE_140_TRRL_BA_S, ··· 3803 3728 roce_set_field(qpc_mask->byte_140_raq, V2_QPC_BYTE_140_TRRL_BA_M, 3804 3729 V2_QPC_BYTE_140_TRRL_BA_S, 0); 3805 3730 3806 - context->irrl_ba = (u32)(dma_handle_2 >> 6); 3731 + context->irrl_ba = cpu_to_le32(dma_handle_2 >> 6); 3807 3732 qpc_mask->irrl_ba = 0; 3808 3733 roce_set_field(context->byte_208_irrl, V2_QPC_BYTE_208_IRRL_BA_M, 3809 3734 V2_QPC_BYTE_208_IRRL_BA_S, ··· 3951 3876 * we should set all bits of the relevant fields in context mask to 3952 3877 * 0 at the same time, else set them to 0x1. 3953 3878 */ 3954 - context->sq_cur_blk_addr = (u32)(sq_cur_blk >> PAGE_ADDR_SHIFT); 3879 + context->sq_cur_blk_addr = cpu_to_le32(sq_cur_blk >> PAGE_ADDR_SHIFT); 3955 3880 roce_set_field(context->byte_168_irrl_idx, 3956 3881 V2_QPC_BYTE_168_SQ_CUR_BLK_ADDR_M, 3957 3882 V2_QPC_BYTE_168_SQ_CUR_BLK_ADDR_S, ··· 3963 3888 3964 3889 context->sq_cur_sge_blk_addr = ((ibqp->qp_type == IB_QPT_GSI) || 3965 3890 hr_qp->sq.max_gs > HNS_ROCE_V2_UC_RC_SGE_NUM_IN_WQE) ? 3966 - ((u32)(sge_cur_blk >> 3967 - PAGE_ADDR_SHIFT)) : 0; 3891 + cpu_to_le32(sge_cur_blk >> 3892 + PAGE_ADDR_SHIFT) : 0; 3968 3893 roce_set_field(context->byte_184_irrl_idx, 3969 3894 V2_QPC_BYTE_184_SQ_CUR_SGE_BLK_ADDR_M, 3970 3895 V2_QPC_BYTE_184_SQ_CUR_SGE_BLK_ADDR_S, ··· 3977 3902 V2_QPC_BYTE_184_SQ_CUR_SGE_BLK_ADDR_M, 3978 3903 V2_QPC_BYTE_184_SQ_CUR_SGE_BLK_ADDR_S, 0); 3979 3904 3980 - context->rx_sq_cur_blk_addr = (u32)(sq_cur_blk >> PAGE_ADDR_SHIFT); 3905 + context->rx_sq_cur_blk_addr = 3906 + cpu_to_le32(sq_cur_blk >> PAGE_ADDR_SHIFT); 3981 3907 roce_set_field(context->byte_232_irrl_sge, 3982 3908 V2_QPC_BYTE_232_RX_SQ_CUR_BLK_ADDR_M, 3983 3909 V2_QPC_BYTE_232_RX_SQ_CUR_BLK_ADDR_S, ··· 4050 3974 4051 3975 } 4052 3976 4053 - static int hns_roce_v2_modify_qp(struct ib_qp *ibqp, 4054 - const struct ib_qp_attr *attr, 4055 - int attr_mask, enum ib_qp_state cur_state, 4056 - enum ib_qp_state new_state) 3977 + static int hns_roce_v2_set_path(struct ib_qp *ibqp, 3978 + const struct ib_qp_attr *attr, 3979 + int attr_mask, 3980 + struct hns_roce_v2_qp_context *context, 3981 + struct hns_roce_v2_qp_context *qpc_mask) 4057 3982 { 3983 + const struct ib_global_route *grh = rdma_ah_read_grh(&attr->ah_attr); 4058 3984 struct hns_roce_dev *hr_dev = to_hr_dev(ibqp->device); 4059 3985 struct hns_roce_qp *hr_qp = to_hr_qp(ibqp); 4060 - struct hns_roce_v2_qp_context *context; 4061 - struct hns_roce_v2_qp_context *qpc_mask; 4062 - struct device *dev = hr_dev->dev; 4063 - int ret = -EINVAL; 3986 + const struct ib_gid_attr *gid_attr = NULL; 3987 + int is_roce_protocol; 3988 + bool is_udp = false; 3989 + u16 vlan = 0xffff; 3990 + u8 ib_port; 3991 + u8 hr_port; 3992 + int ret; 4064 3993 4065 - context = kcalloc(2, sizeof(*context), GFP_ATOMIC); 4066 - if (!context) 4067 - return -ENOMEM; 3994 + ib_port = (attr_mask & IB_QP_PORT) ? attr->port_num : hr_qp->port + 1; 3995 + hr_port = ib_port - 1; 3996 + is_roce_protocol = rdma_cap_eth_ah(&hr_dev->ib_dev, ib_port) && 3997 + rdma_ah_get_ah_flags(&attr->ah_attr) & IB_AH_GRH; 4068 3998 4069 - qpc_mask = context + 1; 4070 - /* 4071 - * In v2 engine, software pass context and context mask to hardware 4072 - * when modifying qp. If software need modify some fields in context, 4073 - * we should set all bits of the relevant fields in context mask to 4074 - * 0 at the same time, else set them to 0x1. 4075 - */ 4076 - memset(qpc_mask, 0xff, sizeof(*qpc_mask)); 3999 + if (is_roce_protocol) { 4000 + gid_attr = attr->ah_attr.grh.sgid_attr; 4001 + ret = rdma_read_gid_l2_fields(gid_attr, &vlan, NULL); 4002 + if (ret) 4003 + return ret; 4004 + 4005 + if (gid_attr) 4006 + is_udp = (gid_attr->gid_type == 4007 + IB_GID_TYPE_ROCE_UDP_ENCAP); 4008 + } 4009 + 4010 + if (vlan < VLAN_CFI_MASK) { 4011 + roce_set_bit(context->byte_76_srqn_op_en, 4012 + V2_QPC_BYTE_76_RQ_VLAN_EN_S, 1); 4013 + roce_set_bit(qpc_mask->byte_76_srqn_op_en, 4014 + V2_QPC_BYTE_76_RQ_VLAN_EN_S, 0); 4015 + roce_set_bit(context->byte_168_irrl_idx, 4016 + V2_QPC_BYTE_168_SQ_VLAN_EN_S, 1); 4017 + roce_set_bit(qpc_mask->byte_168_irrl_idx, 4018 + V2_QPC_BYTE_168_SQ_VLAN_EN_S, 0); 4019 + } 4020 + 4021 + roce_set_field(context->byte_24_mtu_tc, V2_QPC_BYTE_24_VLAN_ID_M, 4022 + V2_QPC_BYTE_24_VLAN_ID_S, vlan); 4023 + roce_set_field(qpc_mask->byte_24_mtu_tc, V2_QPC_BYTE_24_VLAN_ID_M, 4024 + V2_QPC_BYTE_24_VLAN_ID_S, 0); 4025 + 4026 + if (grh->sgid_index >= hr_dev->caps.gid_table_len[hr_port]) { 4027 + dev_err(hr_dev->dev, "sgid_index(%u) too large. max is %d\n", 4028 + grh->sgid_index, hr_dev->caps.gid_table_len[hr_port]); 4029 + return -EINVAL; 4030 + } 4031 + 4032 + if (attr->ah_attr.type != RDMA_AH_ATTR_TYPE_ROCE) { 4033 + dev_err(hr_dev->dev, "ah attr is not RDMA roce type\n"); 4034 + return -EINVAL; 4035 + } 4036 + 4037 + roce_set_field(context->byte_52_udpspn_dmac, V2_QPC_BYTE_52_UDPSPN_M, 4038 + V2_QPC_BYTE_52_UDPSPN_S, 4039 + is_udp ? 0x12b7 : 0); 4040 + 4041 + roce_set_field(qpc_mask->byte_52_udpspn_dmac, V2_QPC_BYTE_52_UDPSPN_M, 4042 + V2_QPC_BYTE_52_UDPSPN_S, 0); 4043 + 4044 + roce_set_field(context->byte_20_smac_sgid_idx, 4045 + V2_QPC_BYTE_20_SGID_IDX_M, V2_QPC_BYTE_20_SGID_IDX_S, 4046 + grh->sgid_index); 4047 + 4048 + roce_set_field(qpc_mask->byte_20_smac_sgid_idx, 4049 + V2_QPC_BYTE_20_SGID_IDX_M, V2_QPC_BYTE_20_SGID_IDX_S, 0); 4050 + 4051 + roce_set_field(context->byte_24_mtu_tc, V2_QPC_BYTE_24_HOP_LIMIT_M, 4052 + V2_QPC_BYTE_24_HOP_LIMIT_S, grh->hop_limit); 4053 + roce_set_field(qpc_mask->byte_24_mtu_tc, V2_QPC_BYTE_24_HOP_LIMIT_M, 4054 + V2_QPC_BYTE_24_HOP_LIMIT_S, 0); 4055 + 4056 + if (hr_dev->pci_dev->revision == 0x21 && is_udp) 4057 + roce_set_field(context->byte_24_mtu_tc, V2_QPC_BYTE_24_TC_M, 4058 + V2_QPC_BYTE_24_TC_S, grh->traffic_class >> 2); 4059 + else 4060 + roce_set_field(context->byte_24_mtu_tc, V2_QPC_BYTE_24_TC_M, 4061 + V2_QPC_BYTE_24_TC_S, grh->traffic_class); 4062 + roce_set_field(qpc_mask->byte_24_mtu_tc, V2_QPC_BYTE_24_TC_M, 4063 + V2_QPC_BYTE_24_TC_S, 0); 4064 + roce_set_field(context->byte_28_at_fl, V2_QPC_BYTE_28_FL_M, 4065 + V2_QPC_BYTE_28_FL_S, grh->flow_label); 4066 + roce_set_field(qpc_mask->byte_28_at_fl, V2_QPC_BYTE_28_FL_M, 4067 + V2_QPC_BYTE_28_FL_S, 0); 4068 + memcpy(context->dgid, grh->dgid.raw, sizeof(grh->dgid.raw)); 4069 + memset(qpc_mask->dgid, 0, sizeof(grh->dgid.raw)); 4070 + roce_set_field(context->byte_28_at_fl, V2_QPC_BYTE_28_SL_M, 4071 + V2_QPC_BYTE_28_SL_S, rdma_ah_get_sl(&attr->ah_attr)); 4072 + roce_set_field(qpc_mask->byte_28_at_fl, V2_QPC_BYTE_28_SL_M, 4073 + V2_QPC_BYTE_28_SL_S, 0); 4074 + hr_qp->sl = rdma_ah_get_sl(&attr->ah_attr); 4075 + 4076 + return 0; 4077 + } 4078 + 4079 + static int hns_roce_v2_set_abs_fields(struct ib_qp *ibqp, 4080 + const struct ib_qp_attr *attr, 4081 + int attr_mask, 4082 + enum ib_qp_state cur_state, 4083 + enum ib_qp_state new_state, 4084 + struct hns_roce_v2_qp_context *context, 4085 + struct hns_roce_v2_qp_context *qpc_mask) 4086 + { 4087 + struct hns_roce_dev *hr_dev = to_hr_dev(ibqp->device); 4088 + int ret = 0; 4089 + 4077 4090 if (cur_state == IB_QPS_RESET && new_state == IB_QPS_INIT) { 4078 4091 memset(qpc_mask, 0, sizeof(*qpc_mask)); 4079 4092 modify_qp_reset_to_init(ibqp, attr, attr_mask, context, ··· 4184 4019 /* Nothing */ 4185 4020 ; 4186 4021 } else { 4187 - dev_err(dev, "Illegal state for QP!\n"); 4022 + dev_err(hr_dev->dev, "Illegal state for QP!\n"); 4188 4023 ret = -EINVAL; 4189 4024 goto out; 4190 4025 } 4191 4026 4192 - /* When QP state is err, SQ and RQ WQE should be flushed */ 4193 - if (new_state == IB_QPS_ERR) { 4194 - roce_set_field(context->byte_160_sq_ci_pi, 4195 - V2_QPC_BYTE_160_SQ_PRODUCER_IDX_M, 4196 - V2_QPC_BYTE_160_SQ_PRODUCER_IDX_S, 4197 - hr_qp->sq.head); 4198 - roce_set_field(qpc_mask->byte_160_sq_ci_pi, 4199 - V2_QPC_BYTE_160_SQ_PRODUCER_IDX_M, 4200 - V2_QPC_BYTE_160_SQ_PRODUCER_IDX_S, 0); 4027 + out: 4028 + return ret; 4029 + } 4201 4030 4202 - if (!ibqp->srq) { 4203 - roce_set_field(context->byte_84_rq_ci_pi, 4204 - V2_QPC_BYTE_84_RQ_PRODUCER_IDX_M, 4205 - V2_QPC_BYTE_84_RQ_PRODUCER_IDX_S, 4206 - hr_qp->rq.head); 4207 - roce_set_field(qpc_mask->byte_84_rq_ci_pi, 4208 - V2_QPC_BYTE_84_RQ_PRODUCER_IDX_M, 4209 - V2_QPC_BYTE_84_RQ_PRODUCER_IDX_S, 0); 4210 - } 4211 - } 4031 + static int hns_roce_v2_set_opt_fields(struct ib_qp *ibqp, 4032 + const struct ib_qp_attr *attr, 4033 + int attr_mask, 4034 + struct hns_roce_v2_qp_context *context, 4035 + struct hns_roce_v2_qp_context *qpc_mask) 4036 + { 4037 + struct hns_roce_dev *hr_dev = to_hr_dev(ibqp->device); 4038 + struct hns_roce_qp *hr_qp = to_hr_qp(ibqp); 4039 + int ret = 0; 4212 4040 4213 4041 if (attr_mask & IB_QP_AV) { 4214 - const struct ib_global_route *grh = 4215 - rdma_ah_read_grh(&attr->ah_attr); 4216 - const struct ib_gid_attr *gid_attr = NULL; 4217 - int is_roce_protocol; 4218 - u16 vlan = 0xffff; 4219 - u8 ib_port; 4220 - u8 hr_port; 4221 - 4222 - ib_port = (attr_mask & IB_QP_PORT) ? attr->port_num : 4223 - hr_qp->port + 1; 4224 - hr_port = ib_port - 1; 4225 - is_roce_protocol = rdma_cap_eth_ah(&hr_dev->ib_dev, ib_port) && 4226 - rdma_ah_get_ah_flags(&attr->ah_attr) & IB_AH_GRH; 4227 - 4228 - if (is_roce_protocol) { 4229 - gid_attr = attr->ah_attr.grh.sgid_attr; 4230 - ret = rdma_read_gid_l2_fields(gid_attr, &vlan, NULL); 4231 - if (ret) 4232 - goto out; 4233 - } 4234 - 4235 - if (vlan < VLAN_CFI_MASK) { 4236 - roce_set_bit(context->byte_76_srqn_op_en, 4237 - V2_QPC_BYTE_76_RQ_VLAN_EN_S, 1); 4238 - roce_set_bit(qpc_mask->byte_76_srqn_op_en, 4239 - V2_QPC_BYTE_76_RQ_VLAN_EN_S, 0); 4240 - roce_set_bit(context->byte_168_irrl_idx, 4241 - V2_QPC_BYTE_168_SQ_VLAN_EN_S, 1); 4242 - roce_set_bit(qpc_mask->byte_168_irrl_idx, 4243 - V2_QPC_BYTE_168_SQ_VLAN_EN_S, 0); 4244 - } 4245 - 4246 - roce_set_field(context->byte_24_mtu_tc, 4247 - V2_QPC_BYTE_24_VLAN_ID_M, 4248 - V2_QPC_BYTE_24_VLAN_ID_S, vlan); 4249 - roce_set_field(qpc_mask->byte_24_mtu_tc, 4250 - V2_QPC_BYTE_24_VLAN_ID_M, 4251 - V2_QPC_BYTE_24_VLAN_ID_S, 0); 4252 - 4253 - if (grh->sgid_index >= hr_dev->caps.gid_table_len[hr_port]) { 4254 - dev_err(hr_dev->dev, 4255 - "sgid_index(%u) too large. max is %d\n", 4256 - grh->sgid_index, 4257 - hr_dev->caps.gid_table_len[hr_port]); 4258 - ret = -EINVAL; 4259 - goto out; 4260 - } 4261 - 4262 - if (attr->ah_attr.type != RDMA_AH_ATTR_TYPE_ROCE) { 4263 - dev_err(hr_dev->dev, "ah attr is not RDMA roce type\n"); 4264 - ret = -EINVAL; 4265 - goto out; 4266 - } 4267 - 4268 - roce_set_field(context->byte_52_udpspn_dmac, 4269 - V2_QPC_BYTE_52_UDPSPN_M, V2_QPC_BYTE_52_UDPSPN_S, 4270 - (gid_attr->gid_type != IB_GID_TYPE_ROCE_UDP_ENCAP) ? 4271 - 0 : 0x12b7); 4272 - 4273 - roce_set_field(qpc_mask->byte_52_udpspn_dmac, 4274 - V2_QPC_BYTE_52_UDPSPN_M, 4275 - V2_QPC_BYTE_52_UDPSPN_S, 0); 4276 - 4277 - roce_set_field(context->byte_20_smac_sgid_idx, 4278 - V2_QPC_BYTE_20_SGID_IDX_M, 4279 - V2_QPC_BYTE_20_SGID_IDX_S, grh->sgid_index); 4280 - 4281 - roce_set_field(qpc_mask->byte_20_smac_sgid_idx, 4282 - V2_QPC_BYTE_20_SGID_IDX_M, 4283 - V2_QPC_BYTE_20_SGID_IDX_S, 0); 4284 - 4285 - roce_set_field(context->byte_24_mtu_tc, 4286 - V2_QPC_BYTE_24_HOP_LIMIT_M, 4287 - V2_QPC_BYTE_24_HOP_LIMIT_S, grh->hop_limit); 4288 - roce_set_field(qpc_mask->byte_24_mtu_tc, 4289 - V2_QPC_BYTE_24_HOP_LIMIT_M, 4290 - V2_QPC_BYTE_24_HOP_LIMIT_S, 0); 4291 - 4292 - if (hr_dev->pci_dev->revision == 0x21 && 4293 - gid_attr->gid_type == IB_GID_TYPE_ROCE_UDP_ENCAP) 4294 - roce_set_field(context->byte_24_mtu_tc, 4295 - V2_QPC_BYTE_24_TC_M, V2_QPC_BYTE_24_TC_S, 4296 - grh->traffic_class >> 2); 4297 - else 4298 - roce_set_field(context->byte_24_mtu_tc, 4299 - V2_QPC_BYTE_24_TC_M, V2_QPC_BYTE_24_TC_S, 4300 - grh->traffic_class); 4301 - roce_set_field(qpc_mask->byte_24_mtu_tc, V2_QPC_BYTE_24_TC_M, 4302 - V2_QPC_BYTE_24_TC_S, 0); 4303 - roce_set_field(context->byte_28_at_fl, V2_QPC_BYTE_28_FL_M, 4304 - V2_QPC_BYTE_28_FL_S, grh->flow_label); 4305 - roce_set_field(qpc_mask->byte_28_at_fl, V2_QPC_BYTE_28_FL_M, 4306 - V2_QPC_BYTE_28_FL_S, 0); 4307 - memcpy(context->dgid, grh->dgid.raw, sizeof(grh->dgid.raw)); 4308 - memset(qpc_mask->dgid, 0, sizeof(grh->dgid.raw)); 4309 - roce_set_field(context->byte_28_at_fl, V2_QPC_BYTE_28_SL_M, 4310 - V2_QPC_BYTE_28_SL_S, 4311 - rdma_ah_get_sl(&attr->ah_attr)); 4312 - roce_set_field(qpc_mask->byte_28_at_fl, V2_QPC_BYTE_28_SL_M, 4313 - V2_QPC_BYTE_28_SL_S, 0); 4314 - hr_qp->sl = rdma_ah_get_sl(&attr->ah_attr); 4042 + ret = hns_roce_v2_set_path(ibqp, attr, attr_mask, context, 4043 + qpc_mask); 4044 + if (ret) 4045 + return ret; 4315 4046 } 4316 4047 4317 4048 if (attr_mask & IB_QP_TIMEOUT) { ··· 4219 4158 V2_QPC_BYTE_28_AT_M, V2_QPC_BYTE_28_AT_S, 4220 4159 0); 4221 4160 } else { 4222 - dev_warn(dev, "Local ACK timeout shall be 0 to 30.\n"); 4161 + dev_warn(hr_dev->dev, 4162 + "Local ACK timeout shall be 0 to 30.\n"); 4223 4163 } 4224 4164 } 4225 4165 ··· 4258 4196 V2_QPC_BYTE_244_RNR_CNT_S, 0); 4259 4197 } 4260 4198 4199 + /* RC&UC&UD required attr */ 4261 4200 if (attr_mask & IB_QP_SQ_PSN) { 4262 4201 roce_set_field(context->byte_172_sq_psn, 4263 4202 V2_QPC_BYTE_172_SQ_CUR_PSN_M, ··· 4353 4290 } 4354 4291 4355 4292 if (attr_mask & IB_QP_QKEY) { 4356 - context->qkey_xrcd = attr->qkey; 4293 + context->qkey_xrcd = cpu_to_le32(attr->qkey); 4357 4294 qpc_mask->qkey_xrcd = 0; 4358 4295 hr_qp->qkey = attr->qkey; 4359 4296 } 4297 + 4298 + return ret; 4299 + } 4300 + 4301 + static void hns_roce_v2_record_opt_fields(struct ib_qp *ibqp, 4302 + const struct ib_qp_attr *attr, 4303 + int attr_mask) 4304 + { 4305 + struct hns_roce_dev *hr_dev = to_hr_dev(ibqp->device); 4306 + struct hns_roce_qp *hr_qp = to_hr_qp(ibqp); 4307 + 4308 + if (attr_mask & IB_QP_ACCESS_FLAGS) 4309 + hr_qp->atomic_rd_en = attr->qp_access_flags; 4310 + 4311 + if (attr_mask & IB_QP_MAX_DEST_RD_ATOMIC) 4312 + hr_qp->resp_depth = attr->max_dest_rd_atomic; 4313 + if (attr_mask & IB_QP_PORT) { 4314 + hr_qp->port = attr->port_num - 1; 4315 + hr_qp->phy_port = hr_dev->iboe.phy_port[hr_qp->port]; 4316 + } 4317 + } 4318 + 4319 + static int hns_roce_v2_modify_qp(struct ib_qp *ibqp, 4320 + const struct ib_qp_attr *attr, 4321 + int attr_mask, enum ib_qp_state cur_state, 4322 + enum ib_qp_state new_state) 4323 + { 4324 + struct hns_roce_dev *hr_dev = to_hr_dev(ibqp->device); 4325 + struct hns_roce_qp *hr_qp = to_hr_qp(ibqp); 4326 + struct hns_roce_v2_qp_context ctx[2]; 4327 + struct hns_roce_v2_qp_context *context = ctx; 4328 + struct hns_roce_v2_qp_context *qpc_mask = ctx + 1; 4329 + struct device *dev = hr_dev->dev; 4330 + int ret; 4331 + 4332 + /* 4333 + * In v2 engine, software pass context and context mask to hardware 4334 + * when modifying qp. If software need modify some fields in context, 4335 + * we should set all bits of the relevant fields in context mask to 4336 + * 0 at the same time, else set them to 0x1. 4337 + */ 4338 + memset(context, 0, sizeof(*context)); 4339 + memset(qpc_mask, 0xff, sizeof(*qpc_mask)); 4340 + ret = hns_roce_v2_set_abs_fields(ibqp, attr, attr_mask, cur_state, 4341 + new_state, context, qpc_mask); 4342 + if (ret) 4343 + goto out; 4344 + 4345 + /* When QP state is err, SQ and RQ WQE should be flushed */ 4346 + if (new_state == IB_QPS_ERR) { 4347 + roce_set_field(context->byte_160_sq_ci_pi, 4348 + V2_QPC_BYTE_160_SQ_PRODUCER_IDX_M, 4349 + V2_QPC_BYTE_160_SQ_PRODUCER_IDX_S, 4350 + hr_qp->sq.head); 4351 + roce_set_field(qpc_mask->byte_160_sq_ci_pi, 4352 + V2_QPC_BYTE_160_SQ_PRODUCER_IDX_M, 4353 + V2_QPC_BYTE_160_SQ_PRODUCER_IDX_S, 0); 4354 + 4355 + if (!ibqp->srq) { 4356 + roce_set_field(context->byte_84_rq_ci_pi, 4357 + V2_QPC_BYTE_84_RQ_PRODUCER_IDX_M, 4358 + V2_QPC_BYTE_84_RQ_PRODUCER_IDX_S, 4359 + hr_qp->rq.head); 4360 + roce_set_field(qpc_mask->byte_84_rq_ci_pi, 4361 + V2_QPC_BYTE_84_RQ_PRODUCER_IDX_M, 4362 + V2_QPC_BYTE_84_RQ_PRODUCER_IDX_S, 0); 4363 + } 4364 + } 4365 + 4366 + /* Configure the optional fields */ 4367 + ret = hns_roce_v2_set_opt_fields(ibqp, attr, attr_mask, context, 4368 + qpc_mask); 4369 + if (ret) 4370 + goto out; 4360 4371 4361 4372 roce_set_bit(context->byte_108_rx_reqepsn, V2_QPC_BYTE_108_INV_CREDIT_S, 4362 4373 ibqp->srq ? 1 : 0); ··· 4444 4307 V2_QPC_BYTE_60_QP_ST_S, 0); 4445 4308 4446 4309 /* SW pass context to HW */ 4447 - ret = hns_roce_v2_qp_modify(hr_dev, cur_state, new_state, 4448 - context, hr_qp); 4310 + ret = hns_roce_v2_qp_modify(hr_dev, cur_state, new_state, ctx, hr_qp); 4449 4311 if (ret) { 4450 4312 dev_err(dev, "hns_roce_qp_modify failed(%d)\n", ret); 4451 4313 goto out; ··· 4452 4316 4453 4317 hr_qp->state = new_state; 4454 4318 4455 - if (attr_mask & IB_QP_ACCESS_FLAGS) 4456 - hr_qp->atomic_rd_en = attr->qp_access_flags; 4457 - 4458 - if (attr_mask & IB_QP_MAX_DEST_RD_ATOMIC) 4459 - hr_qp->resp_depth = attr->max_dest_rd_atomic; 4460 - if (attr_mask & IB_QP_PORT) { 4461 - hr_qp->port = attr->port_num - 1; 4462 - hr_qp->phy_port = hr_dev->iboe.phy_port[hr_qp->port]; 4463 - } 4319 + hns_roce_v2_record_opt_fields(ibqp, attr, attr_mask); 4464 4320 4465 4321 if (new_state == IB_QPS_RESET && !ibqp->uobject) { 4466 4322 hns_roce_v2_cq_clean(to_hr_cq(ibqp->recv_cq), hr_qp->qpn, ··· 4472 4344 } 4473 4345 4474 4346 out: 4475 - kfree(context); 4476 4347 return ret; 4477 4348 } 4478 4349 ··· 4522 4395 { 4523 4396 struct hns_roce_dev *hr_dev = to_hr_dev(ibqp->device); 4524 4397 struct hns_roce_qp *hr_qp = to_hr_qp(ibqp); 4525 - struct hns_roce_v2_qp_context *context; 4398 + struct hns_roce_v2_qp_context context = {}; 4526 4399 struct device *dev = hr_dev->dev; 4527 4400 int tmp_qp_state; 4528 4401 int state; 4529 4402 int ret; 4530 - 4531 - context = kzalloc(sizeof(*context), GFP_KERNEL); 4532 - if (!context) 4533 - return -ENOMEM; 4534 4403 4535 4404 memset(qp_attr, 0, sizeof(*qp_attr)); 4536 4405 memset(qp_init_attr, 0, sizeof(*qp_init_attr)); ··· 4539 4416 goto done; 4540 4417 } 4541 4418 4542 - ret = hns_roce_v2_query_qpc(hr_dev, hr_qp, context); 4419 + ret = hns_roce_v2_query_qpc(hr_dev, hr_qp, &context); 4543 4420 if (ret) { 4544 4421 dev_err(dev, "query qpc error\n"); 4545 4422 ret = -EINVAL; 4546 4423 goto out; 4547 4424 } 4548 4425 4549 - state = roce_get_field(context->byte_60_qpst_tempid, 4426 + state = roce_get_field(context.byte_60_qpst_tempid, 4550 4427 V2_QPC_BYTE_60_QP_ST_M, V2_QPC_BYTE_60_QP_ST_S); 4551 4428 tmp_qp_state = to_ib_qp_st((enum hns_roce_v2_qp_state)state); 4552 4429 if (tmp_qp_state == -1) { ··· 4556 4433 } 4557 4434 hr_qp->state = (u8)tmp_qp_state; 4558 4435 qp_attr->qp_state = (enum ib_qp_state)hr_qp->state; 4559 - qp_attr->path_mtu = (enum ib_mtu)roce_get_field(context->byte_24_mtu_tc, 4436 + qp_attr->path_mtu = (enum ib_mtu)roce_get_field(context.byte_24_mtu_tc, 4560 4437 V2_QPC_BYTE_24_MTU_M, 4561 4438 V2_QPC_BYTE_24_MTU_S); 4562 4439 qp_attr->path_mig_state = IB_MIG_ARMED; ··· 4564 4441 if (hr_qp->ibqp.qp_type == IB_QPT_UD) 4565 4442 qp_attr->qkey = V2_QKEY_VAL; 4566 4443 4567 - qp_attr->rq_psn = roce_get_field(context->byte_108_rx_reqepsn, 4444 + qp_attr->rq_psn = roce_get_field(context.byte_108_rx_reqepsn, 4568 4445 V2_QPC_BYTE_108_RX_REQ_EPSN_M, 4569 4446 V2_QPC_BYTE_108_RX_REQ_EPSN_S); 4570 - qp_attr->sq_psn = (u32)roce_get_field(context->byte_172_sq_psn, 4447 + qp_attr->sq_psn = (u32)roce_get_field(context.byte_172_sq_psn, 4571 4448 V2_QPC_BYTE_172_SQ_CUR_PSN_M, 4572 4449 V2_QPC_BYTE_172_SQ_CUR_PSN_S); 4573 - qp_attr->dest_qp_num = (u8)roce_get_field(context->byte_56_dqpn_err, 4450 + qp_attr->dest_qp_num = (u8)roce_get_field(context.byte_56_dqpn_err, 4574 4451 V2_QPC_BYTE_56_DQPN_M, 4575 4452 V2_QPC_BYTE_56_DQPN_S); 4576 - qp_attr->qp_access_flags = ((roce_get_bit(context->byte_76_srqn_op_en, 4577 - V2_QPC_BYTE_76_RRE_S)) << V2_QP_RWE_S) | 4578 - ((roce_get_bit(context->byte_76_srqn_op_en, 4579 - V2_QPC_BYTE_76_RWE_S)) << V2_QP_RRE_S) | 4580 - ((roce_get_bit(context->byte_76_srqn_op_en, 4453 + qp_attr->qp_access_flags = ((roce_get_bit(context.byte_76_srqn_op_en, 4454 + V2_QPC_BYTE_76_RRE_S)) << V2_QP_RRE_S) | 4455 + ((roce_get_bit(context.byte_76_srqn_op_en, 4456 + V2_QPC_BYTE_76_RWE_S)) << V2_QP_RWE_S) | 4457 + ((roce_get_bit(context.byte_76_srqn_op_en, 4581 4458 V2_QPC_BYTE_76_ATE_S)) << V2_QP_ATE_S); 4582 4459 4583 4460 if (hr_qp->ibqp.qp_type == IB_QPT_RC || ··· 4586 4463 rdma_ah_retrieve_grh(&qp_attr->ah_attr); 4587 4464 4588 4465 rdma_ah_set_sl(&qp_attr->ah_attr, 4589 - roce_get_field(context->byte_28_at_fl, 4466 + roce_get_field(context.byte_28_at_fl, 4590 4467 V2_QPC_BYTE_28_SL_M, 4591 4468 V2_QPC_BYTE_28_SL_S)); 4592 - grh->flow_label = roce_get_field(context->byte_28_at_fl, 4469 + grh->flow_label = roce_get_field(context.byte_28_at_fl, 4593 4470 V2_QPC_BYTE_28_FL_M, 4594 4471 V2_QPC_BYTE_28_FL_S); 4595 - grh->sgid_index = roce_get_field(context->byte_20_smac_sgid_idx, 4472 + grh->sgid_index = roce_get_field(context.byte_20_smac_sgid_idx, 4596 4473 V2_QPC_BYTE_20_SGID_IDX_M, 4597 4474 V2_QPC_BYTE_20_SGID_IDX_S); 4598 - grh->hop_limit = roce_get_field(context->byte_24_mtu_tc, 4475 + grh->hop_limit = roce_get_field(context.byte_24_mtu_tc, 4599 4476 V2_QPC_BYTE_24_HOP_LIMIT_M, 4600 4477 V2_QPC_BYTE_24_HOP_LIMIT_S); 4601 - grh->traffic_class = roce_get_field(context->byte_24_mtu_tc, 4478 + grh->traffic_class = roce_get_field(context.byte_24_mtu_tc, 4602 4479 V2_QPC_BYTE_24_TC_M, 4603 4480 V2_QPC_BYTE_24_TC_S); 4604 4481 4605 - memcpy(grh->dgid.raw, context->dgid, sizeof(grh->dgid.raw)); 4482 + memcpy(grh->dgid.raw, context.dgid, sizeof(grh->dgid.raw)); 4606 4483 } 4607 4484 4608 4485 qp_attr->port_num = hr_qp->port + 1; 4609 4486 qp_attr->sq_draining = 0; 4610 - qp_attr->max_rd_atomic = 1 << roce_get_field(context->byte_208_irrl, 4487 + qp_attr->max_rd_atomic = 1 << roce_get_field(context.byte_208_irrl, 4611 4488 V2_QPC_BYTE_208_SR_MAX_M, 4612 4489 V2_QPC_BYTE_208_SR_MAX_S); 4613 - qp_attr->max_dest_rd_atomic = 1 << roce_get_field(context->byte_140_raq, 4490 + qp_attr->max_dest_rd_atomic = 1 << roce_get_field(context.byte_140_raq, 4614 4491 V2_QPC_BYTE_140_RR_MAX_M, 4615 4492 V2_QPC_BYTE_140_RR_MAX_S); 4616 - qp_attr->min_rnr_timer = (u8)roce_get_field(context->byte_80_rnr_rx_cqn, 4493 + qp_attr->min_rnr_timer = (u8)roce_get_field(context.byte_80_rnr_rx_cqn, 4617 4494 V2_QPC_BYTE_80_MIN_RNR_TIME_M, 4618 4495 V2_QPC_BYTE_80_MIN_RNR_TIME_S); 4619 - qp_attr->timeout = (u8)roce_get_field(context->byte_28_at_fl, 4496 + qp_attr->timeout = (u8)roce_get_field(context.byte_28_at_fl, 4620 4497 V2_QPC_BYTE_28_AT_M, 4621 4498 V2_QPC_BYTE_28_AT_S); 4622 - qp_attr->retry_cnt = roce_get_field(context->byte_212_lsn, 4499 + qp_attr->retry_cnt = roce_get_field(context.byte_212_lsn, 4623 4500 V2_QPC_BYTE_212_RETRY_CNT_M, 4624 4501 V2_QPC_BYTE_212_RETRY_CNT_S); 4625 - qp_attr->rnr_retry = context->rq_rnr_timer; 4502 + qp_attr->rnr_retry = le32_to_cpu(context.rq_rnr_timer); 4626 4503 4627 4504 done: 4628 4505 qp_attr->cur_qp_state = qp_attr->qp_state; ··· 4641 4518 4642 4519 out: 4643 4520 mutex_unlock(&hr_qp->mutex); 4644 - kfree(context); 4645 4521 return ret; 4646 4522 } 4647 4523 ··· 4649 4527 struct ib_udata *udata) 4650 4528 { 4651 4529 struct hns_roce_cq *send_cq, *recv_cq; 4652 - struct device *dev = hr_dev->dev; 4530 + struct ib_device *ibdev = &hr_dev->ib_dev; 4653 4531 int ret; 4654 4532 4655 4533 if (hr_qp->ibqp.qp_type == IB_QPT_RC && hr_qp->state != IB_QPS_RESET) { ··· 4657 4535 ret = hns_roce_v2_modify_qp(&hr_qp->ibqp, NULL, 0, 4658 4536 hr_qp->state, IB_QPS_RESET); 4659 4537 if (ret) { 4660 - dev_err(dev, "modify QP %06lx to ERR failed.\n", 4661 - hr_qp->qpn); 4538 + ibdev_err(ibdev, "modify QP to Reset failed.\n"); 4662 4539 return ret; 4663 4540 } 4664 4541 } ··· 4726 4605 4727 4606 ret = hns_roce_v2_destroy_qp_common(hr_dev, hr_qp, udata); 4728 4607 if (ret) { 4729 - dev_err(hr_dev->dev, "Destroy qp failed(%d)\n", ret); 4608 + ibdev_err(&hr_dev->ib_dev, "Destroy qp 0x%06lx failed(%d)\n", 4609 + hr_qp->qpn, ret); 4730 4610 return ret; 4731 4611 } 4732 4612 ··· 4951 4829 static void set_eq_cons_index_v2(struct hns_roce_eq *eq) 4952 4830 { 4953 4831 struct hns_roce_dev *hr_dev = eq->hr_dev; 4954 - u32 doorbell[2]; 4832 + __le32 doorbell[2]; 4955 4833 4956 4834 doorbell[0] = 0; 4957 4835 doorbell[1] = 0; ··· 5026 4904 struct hns_roce_eq *eq) 5027 4905 { 5028 4906 struct device *dev = hr_dev->dev; 5029 - struct hns_roce_aeqe *aeqe; 4907 + struct hns_roce_aeqe *aeqe = next_aeqe_sw_v2(eq); 5030 4908 int aeqe_found = 0; 5031 4909 int event_type; 5032 4910 int sub_type; ··· 5034 4912 u32 qpn; 5035 4913 u32 cqn; 5036 4914 5037 - while ((aeqe = next_aeqe_sw_v2(eq))) { 5038 - 4915 + while (aeqe) { 5039 4916 /* Make sure we read AEQ entry after we have checked the 5040 4917 * ownership bit 5041 4918 */ ··· 5098 4977 ++eq->cons_index; 5099 4978 aeqe_found = 1; 5100 4979 5101 - if (eq->cons_index > (2 * eq->entries - 1)) { 5102 - dev_warn(dev, "cons_index overflow, set back to 0.\n"); 4980 + if (eq->cons_index > (2 * eq->entries - 1)) 5103 4981 eq->cons_index = 0; 5104 - } 4982 + 5105 4983 hns_roce_v2_init_irq_work(hr_dev, eq, qpn, cqn); 4984 + 4985 + aeqe = next_aeqe_sw_v2(eq); 5106 4986 } 5107 4987 5108 4988 set_eq_cons_index_v2(eq); ··· 5156 5034 struct hns_roce_eq *eq) 5157 5035 { 5158 5036 struct device *dev = hr_dev->dev; 5159 - struct hns_roce_ceqe *ceqe; 5037 + struct hns_roce_ceqe *ceqe = next_ceqe_sw_v2(eq); 5160 5038 int ceqe_found = 0; 5161 5039 u32 cqn; 5162 5040 5163 - while ((ceqe = next_ceqe_sw_v2(eq))) { 5164 - 5041 + while (ceqe) { 5165 5042 /* Make sure we read CEQ entry after we have checked the 5166 5043 * ownership bit 5167 5044 */ ··· 5175 5054 ++eq->cons_index; 5176 5055 ceqe_found = 1; 5177 5056 5178 - if (eq->cons_index > (2 * eq->entries - 1)) { 5057 + if (eq->cons_index > (EQ_DEPTH_COEFF * eq->entries - 1)) { 5179 5058 dev_warn(dev, "cons_index overflow, set back to 0.\n"); 5180 5059 eq->cons_index = 0; 5181 5060 } 5061 + 5062 + ceqe = next_ceqe_sw_v2(eq); 5182 5063 } 5183 5064 5184 5065 set_eq_cons_index_v2(eq); ··· 5216 5093 int_st = roce_read(hr_dev, ROCEE_VF_ABN_INT_ST_REG); 5217 5094 int_en = roce_read(hr_dev, ROCEE_VF_ABN_INT_EN_REG); 5218 5095 5219 - if (roce_get_bit(int_st, HNS_ROCE_V2_VF_INT_ST_AEQ_OVERFLOW_S)) { 5096 + if (int_st & BIT(HNS_ROCE_V2_VF_INT_ST_AEQ_OVERFLOW_S)) { 5220 5097 struct pci_dev *pdev = hr_dev->pci_dev; 5221 5098 struct hnae3_ae_dev *ae_dev = pci_get_drvdata(pdev); 5222 5099 const struct hnae3_ae_ops *ops = ae_dev->ops; 5223 5100 5224 5101 dev_err(dev, "AEQ overflow!\n"); 5225 5102 5226 - roce_set_bit(int_st, HNS_ROCE_V2_VF_INT_ST_AEQ_OVERFLOW_S, 1); 5103 + int_st |= 1 << HNS_ROCE_V2_VF_INT_ST_AEQ_OVERFLOW_S; 5227 5104 roce_write(hr_dev, ROCEE_VF_ABN_INT_ST_REG, int_st); 5228 5105 5229 5106 /* Set reset level for reset_event() */ ··· 5233 5110 if (ops->reset_event) 5234 5111 ops->reset_event(pdev, NULL); 5235 5112 5236 - roce_set_bit(int_en, HNS_ROCE_V2_VF_ABN_INT_EN_S, 1); 5113 + int_en |= 1 << HNS_ROCE_V2_VF_ABN_INT_EN_S; 5237 5114 roce_write(hr_dev, ROCEE_VF_ABN_INT_EN_REG, int_en); 5238 5115 5239 5116 int_work = 1; 5240 - } else if (roce_get_bit(int_st, HNS_ROCE_V2_VF_INT_ST_BUS_ERR_S)) { 5117 + } else if (int_st & BIT(HNS_ROCE_V2_VF_INT_ST_BUS_ERR_S)) { 5241 5118 dev_err(dev, "BUS ERR!\n"); 5242 5119 5243 - roce_set_bit(int_st, HNS_ROCE_V2_VF_INT_ST_BUS_ERR_S, 1); 5120 + int_st |= 1 << HNS_ROCE_V2_VF_INT_ST_BUS_ERR_S; 5244 5121 roce_write(hr_dev, ROCEE_VF_ABN_INT_ST_REG, int_st); 5245 5122 5246 - roce_set_bit(int_en, HNS_ROCE_V2_VF_ABN_INT_EN_S, 1); 5123 + int_en |= 1 << HNS_ROCE_V2_VF_ABN_INT_EN_S; 5247 5124 roce_write(hr_dev, ROCEE_VF_ABN_INT_EN_REG, int_en); 5248 5125 5249 5126 int_work = 1; 5250 - } else if (roce_get_bit(int_st, HNS_ROCE_V2_VF_INT_ST_OTHER_ERR_S)) { 5127 + } else if (int_st & BIT(HNS_ROCE_V2_VF_INT_ST_OTHER_ERR_S)) { 5251 5128 dev_err(dev, "OTHER ERR!\n"); 5252 5129 5253 - roce_set_bit(int_st, HNS_ROCE_V2_VF_INT_ST_OTHER_ERR_S, 1); 5130 + int_st |= 1 << HNS_ROCE_V2_VF_INT_ST_OTHER_ERR_S; 5254 5131 roce_write(hr_dev, ROCEE_VF_ABN_INT_ST_REG, int_st); 5255 5132 5256 - roce_set_bit(int_en, HNS_ROCE_V2_VF_ABN_INT_EN_S, 1); 5133 + int_en |= 1 << HNS_ROCE_V2_VF_ABN_INT_EN_S; 5257 5134 roce_write(hr_dev, ROCEE_VF_ABN_INT_EN_REG, int_en); 5258 5135 5259 5136 int_work = 1; ··· 5325 5202 buf_chk_sz = 1 << (hr_dev->caps.eqe_buf_pg_sz + PAGE_SHIFT); 5326 5203 bt_chk_sz = 1 << (hr_dev->caps.eqe_ba_pg_sz + PAGE_SHIFT); 5327 5204 5328 - /* hop_num = 0 */ 5329 5205 if (mhop_num == HNS_ROCE_HOP_NUM_0) { 5330 5206 dma_free_coherent(dev, (unsigned int)(eq->entries * 5331 5207 eq->eqe_size), eq->bt_l0, eq->l0_dma); 5332 5208 return; 5333 5209 } 5334 5210 5335 - /* hop_num = 1 or hop = 2 */ 5336 5211 dma_free_coherent(dev, bt_chk_sz, eq->bt_l0, eq->l0_dma); 5337 5212 if (mhop_num == 1) { 5338 5213 for (i = 0; i < eq->l0_last_num; i++) { ··· 5570 5449 buf_chk_sz); 5571 5450 bt_num = DIV_ROUND_UP(ba_num, bt_chk_sz / BA_BYTE_LEN); 5572 5451 5573 - /* hop_num = 0 */ 5574 5452 if (mhop_num == HNS_ROCE_HOP_NUM_0) { 5575 5453 if (eq->entries > buf_chk_sz / eq->eqe_size) { 5576 5454 dev_err(dev, "eq entries %d is larger than buf_pg_sz!", ··· 5635 5515 break; 5636 5516 } 5637 5517 eq->cur_eqe_ba = eq->buf_dma[0]; 5638 - eq->nxt_eqe_ba = eq->buf_dma[1]; 5518 + if (ba_num > 1) 5519 + eq->nxt_eqe_ba = eq->buf_dma[1]; 5639 5520 5640 5521 } else if (mhop_num == 2) { 5641 5522 /* alloc L1 BT and buf */ ··· 5677 5556 break; 5678 5557 } 5679 5558 eq->cur_eqe_ba = eq->buf_dma[0]; 5680 - eq->nxt_eqe_ba = eq->buf_dma[1]; 5559 + if (ba_num > 1) 5560 + eq->nxt_eqe_ba = eq->buf_dma[1]; 5681 5561 } 5682 5562 5683 5563 eq->l0_last_num = i + 1; ··· 5821 5699 return ret; 5822 5700 } 5823 5701 5702 + static int __hns_roce_request_irq(struct hns_roce_dev *hr_dev, int irq_num, 5703 + int comp_num, int aeq_num, int other_num) 5704 + { 5705 + struct hns_roce_eq_table *eq_table = &hr_dev->eq_table; 5706 + int i, j; 5707 + int ret; 5708 + 5709 + for (i = 0; i < irq_num; i++) { 5710 + hr_dev->irq_names[i] = kzalloc(HNS_ROCE_INT_NAME_LEN, 5711 + GFP_KERNEL); 5712 + if (!hr_dev->irq_names[i]) { 5713 + ret = -ENOMEM; 5714 + goto err_kzalloc_failed; 5715 + } 5716 + } 5717 + 5718 + /* irq contains: abnormal + AEQ + CEQ */ 5719 + for (j = 0; j < other_num; j++) 5720 + snprintf((char *)hr_dev->irq_names[j], 5721 + HNS_ROCE_INT_NAME_LEN, "hns-abn-%d", j); 5722 + 5723 + for (j = other_num; j < (other_num + aeq_num); j++) 5724 + snprintf((char *)hr_dev->irq_names[j], 5725 + HNS_ROCE_INT_NAME_LEN, "hns-aeq-%d", 5726 + j - other_num); 5727 + 5728 + for (j = (other_num + aeq_num); j < irq_num; j++) 5729 + snprintf((char *)hr_dev->irq_names[j], 5730 + HNS_ROCE_INT_NAME_LEN, "hns-ceq-%d", 5731 + j - other_num - aeq_num); 5732 + 5733 + for (j = 0; j < irq_num; j++) { 5734 + if (j < other_num) 5735 + ret = request_irq(hr_dev->irq[j], 5736 + hns_roce_v2_msix_interrupt_abn, 5737 + 0, hr_dev->irq_names[j], hr_dev); 5738 + 5739 + else if (j < (other_num + comp_num)) 5740 + ret = request_irq(eq_table->eq[j - other_num].irq, 5741 + hns_roce_v2_msix_interrupt_eq, 5742 + 0, hr_dev->irq_names[j + aeq_num], 5743 + &eq_table->eq[j - other_num]); 5744 + else 5745 + ret = request_irq(eq_table->eq[j - other_num].irq, 5746 + hns_roce_v2_msix_interrupt_eq, 5747 + 0, hr_dev->irq_names[j - comp_num], 5748 + &eq_table->eq[j - other_num]); 5749 + if (ret) { 5750 + dev_err(hr_dev->dev, "Request irq error!\n"); 5751 + goto err_request_failed; 5752 + } 5753 + } 5754 + 5755 + return 0; 5756 + 5757 + err_request_failed: 5758 + for (j -= 1; j >= 0; j--) 5759 + if (j < other_num) 5760 + free_irq(hr_dev->irq[j], hr_dev); 5761 + else 5762 + free_irq(eq_table->eq[j - other_num].irq, 5763 + &eq_table->eq[j - other_num]); 5764 + 5765 + err_kzalloc_failed: 5766 + for (i -= 1; i >= 0; i--) 5767 + kfree(hr_dev->irq_names[i]); 5768 + 5769 + return ret; 5770 + } 5771 + 5772 + static void __hns_roce_free_irq(struct hns_roce_dev *hr_dev) 5773 + { 5774 + int irq_num; 5775 + int eq_num; 5776 + int i; 5777 + 5778 + eq_num = hr_dev->caps.num_comp_vectors + hr_dev->caps.num_aeq_vectors; 5779 + irq_num = eq_num + hr_dev->caps.num_other_vectors; 5780 + 5781 + for (i = 0; i < hr_dev->caps.num_other_vectors; i++) 5782 + free_irq(hr_dev->irq[i], hr_dev); 5783 + 5784 + for (i = 0; i < eq_num; i++) 5785 + free_irq(hr_dev->eq_table.eq[i].irq, &hr_dev->eq_table.eq[i]); 5786 + 5787 + for (i = 0; i < irq_num; i++) 5788 + kfree(hr_dev->irq_names[i]); 5789 + } 5790 + 5824 5791 static int hns_roce_v2_init_eq_table(struct hns_roce_dev *hr_dev) 5825 5792 { 5826 5793 struct hns_roce_eq_table *eq_table = &hr_dev->eq_table; ··· 5921 5710 int other_num; 5922 5711 int comp_num; 5923 5712 int aeq_num; 5924 - int i, j, k; 5713 + int i; 5925 5714 int ret; 5926 5715 5927 5716 other_num = hr_dev->caps.num_other_vectors; ··· 5935 5724 if (!eq_table->eq) 5936 5725 return -ENOMEM; 5937 5726 5938 - for (i = 0; i < irq_num; i++) { 5939 - hr_dev->irq_names[i] = kzalloc(HNS_ROCE_INT_NAME_LEN, 5940 - GFP_KERNEL); 5941 - if (!hr_dev->irq_names[i]) { 5942 - ret = -ENOMEM; 5943 - goto err_failed_kzalloc; 5944 - } 5945 - } 5946 - 5947 5727 /* create eq */ 5948 - for (j = 0; j < eq_num; j++) { 5949 - eq = &eq_table->eq[j]; 5728 + for (i = 0; i < eq_num; i++) { 5729 + eq = &eq_table->eq[i]; 5950 5730 eq->hr_dev = hr_dev; 5951 - eq->eqn = j; 5952 - if (j < comp_num) { 5731 + eq->eqn = i; 5732 + if (i < comp_num) { 5953 5733 /* CEQ */ 5954 5734 eq_cmd = HNS_ROCE_CMD_CREATE_CEQC; 5955 5735 eq->type_flag = HNS_ROCE_CEQ; 5956 5736 eq->entries = hr_dev->caps.ceqe_depth; 5957 5737 eq->eqe_size = HNS_ROCE_CEQ_ENTRY_SIZE; 5958 - eq->irq = hr_dev->irq[j + other_num + aeq_num]; 5738 + eq->irq = hr_dev->irq[i + other_num + aeq_num]; 5959 5739 eq->eq_max_cnt = HNS_ROCE_CEQ_DEFAULT_BURST_NUM; 5960 5740 eq->eq_period = HNS_ROCE_CEQ_DEFAULT_INTERVAL; 5961 5741 } else { ··· 5955 5753 eq->type_flag = HNS_ROCE_AEQ; 5956 5754 eq->entries = hr_dev->caps.aeqe_depth; 5957 5755 eq->eqe_size = HNS_ROCE_AEQ_ENTRY_SIZE; 5958 - eq->irq = hr_dev->irq[j - comp_num + other_num]; 5756 + eq->irq = hr_dev->irq[i - comp_num + other_num]; 5959 5757 eq->eq_max_cnt = HNS_ROCE_AEQ_DEFAULT_BURST_NUM; 5960 5758 eq->eq_period = HNS_ROCE_AEQ_DEFAULT_INTERVAL; 5961 5759 } ··· 5970 5768 /* enable irq */ 5971 5769 hns_roce_v2_int_mask_enable(hr_dev, eq_num, EQ_ENABLE); 5972 5770 5973 - /* irq contains: abnormal + AEQ + CEQ*/ 5974 - for (k = 0; k < irq_num; k++) 5975 - if (k < other_num) 5976 - snprintf((char *)hr_dev->irq_names[k], 5977 - HNS_ROCE_INT_NAME_LEN, "hns-abn-%d", k); 5978 - else if (k < (other_num + aeq_num)) 5979 - snprintf((char *)hr_dev->irq_names[k], 5980 - HNS_ROCE_INT_NAME_LEN, "hns-aeq-%d", 5981 - k - other_num); 5982 - else 5983 - snprintf((char *)hr_dev->irq_names[k], 5984 - HNS_ROCE_INT_NAME_LEN, "hns-ceq-%d", 5985 - k - other_num - aeq_num); 5986 - 5987 - for (k = 0; k < irq_num; k++) { 5988 - if (k < other_num) 5989 - ret = request_irq(hr_dev->irq[k], 5990 - hns_roce_v2_msix_interrupt_abn, 5991 - 0, hr_dev->irq_names[k], hr_dev); 5992 - 5993 - else if (k < (other_num + comp_num)) 5994 - ret = request_irq(eq_table->eq[k - other_num].irq, 5995 - hns_roce_v2_msix_interrupt_eq, 5996 - 0, hr_dev->irq_names[k + aeq_num], 5997 - &eq_table->eq[k - other_num]); 5998 - else 5999 - ret = request_irq(eq_table->eq[k - other_num].irq, 6000 - hns_roce_v2_msix_interrupt_eq, 6001 - 0, hr_dev->irq_names[k - comp_num], 6002 - &eq_table->eq[k - other_num]); 6003 - if (ret) { 6004 - dev_err(dev, "Request irq error!\n"); 6005 - goto err_request_irq_fail; 6006 - } 5771 + ret = __hns_roce_request_irq(hr_dev, irq_num, comp_num, 5772 + aeq_num, other_num); 5773 + if (ret) { 5774 + dev_err(dev, "Request irq failed.\n"); 5775 + goto err_request_irq_fail; 6007 5776 } 6008 5777 6009 5778 hr_dev->irq_workq = ··· 5982 5809 if (!hr_dev->irq_workq) { 5983 5810 dev_err(dev, "Create irq workqueue failed!\n"); 5984 5811 ret = -ENOMEM; 5985 - goto err_request_irq_fail; 5812 + goto err_create_wq_fail; 5986 5813 } 5987 5814 5988 5815 return 0; 5989 5816 5817 + err_create_wq_fail: 5818 + __hns_roce_free_irq(hr_dev); 5819 + 5990 5820 err_request_irq_fail: 5991 - for (k -= 1; k >= 0; k--) 5992 - if (k < other_num) 5993 - free_irq(hr_dev->irq[k], hr_dev); 5994 - else 5995 - free_irq(eq_table->eq[k - other_num].irq, 5996 - &eq_table->eq[k - other_num]); 5821 + hns_roce_v2_int_mask_enable(hr_dev, eq_num, EQ_DISABLE); 5997 5822 5998 5823 err_create_eq_fail: 5999 - for (j -= 1; j >= 0; j--) 6000 - hns_roce_v2_free_eq(hr_dev, &eq_table->eq[j]); 6001 - 6002 - err_failed_kzalloc: 6003 5824 for (i -= 1; i >= 0; i--) 6004 - kfree(hr_dev->irq_names[i]); 5825 + hns_roce_v2_free_eq(hr_dev, &eq_table->eq[i]); 6005 5826 kfree(eq_table->eq); 6006 5827 6007 5828 return ret; ··· 6004 5837 static void hns_roce_v2_cleanup_eq_table(struct hns_roce_dev *hr_dev) 6005 5838 { 6006 5839 struct hns_roce_eq_table *eq_table = &hr_dev->eq_table; 6007 - int irq_num; 6008 5840 int eq_num; 6009 5841 int i; 6010 5842 6011 5843 eq_num = hr_dev->caps.num_comp_vectors + hr_dev->caps.num_aeq_vectors; 6012 - irq_num = eq_num + hr_dev->caps.num_other_vectors; 6013 5844 6014 5845 /* Disable irq */ 6015 5846 hns_roce_v2_int_mask_enable(hr_dev, eq_num, EQ_DISABLE); 6016 5847 6017 - for (i = 0; i < hr_dev->caps.num_other_vectors; i++) 6018 - free_irq(hr_dev->irq[i], hr_dev); 5848 + __hns_roce_free_irq(hr_dev); 6019 5849 6020 5850 for (i = 0; i < eq_num; i++) { 6021 5851 hns_roce_v2_destroy_eqc(hr_dev, i); 6022 5852 6023 - free_irq(eq_table->eq[i].irq, &eq_table->eq[i]); 6024 - 6025 5853 hns_roce_v2_free_eq(hr_dev, &eq_table->eq[i]); 6026 5854 } 6027 - 6028 - for (i = 0; i < irq_num; i++) 6029 - kfree(hr_dev->irq_names[i]); 6030 5855 6031 5856 kfree(eq_table->eq); 6032 5857 ··· 6063 5904 roce_set_field(srq_context->byte_24_wqe_bt_ba, 6064 5905 SRQC_BYTE_24_SRQ_WQE_BT_BA_M, 6065 5906 SRQC_BYTE_24_SRQ_WQE_BT_BA_S, 6066 - cpu_to_le32(dma_handle_wqe >> 35)); 5907 + dma_handle_wqe >> 35); 6067 5908 6068 5909 roce_set_field(srq_context->byte_28_rqws_pd, SRQC_BYTE_28_PD_M, 6069 5910 SRQC_BYTE_28_PD_S, pdn); ··· 6071 5912 SRQC_BYTE_28_RQWS_S, srq->max_gs <= 0 ? 0 : 6072 5913 fls(srq->max_gs - 1)); 6073 5914 6074 - srq_context->idx_bt_ba = (u32)(dma_handle_idx >> 3); 6075 - srq_context->idx_bt_ba = cpu_to_le32(srq_context->idx_bt_ba); 5915 + srq_context->idx_bt_ba = cpu_to_le32(dma_handle_idx >> 3); 6076 5916 roce_set_field(srq_context->rsv_idx_bt_ba, 6077 5917 SRQC_BYTE_36_SRQ_IDX_BT_BA_M, 6078 5918 SRQC_BYTE_36_SRQ_IDX_BT_BA_S, 6079 - cpu_to_le32(dma_handle_idx >> 35)); 5919 + dma_handle_idx >> 35); 6080 5920 6081 - srq_context->idx_cur_blk_addr = (u32)(mtts_idx[0] >> PAGE_ADDR_SHIFT); 6082 5921 srq_context->idx_cur_blk_addr = 6083 - cpu_to_le32(srq_context->idx_cur_blk_addr); 5922 + cpu_to_le32(mtts_idx[0] >> PAGE_ADDR_SHIFT); 6084 5923 roce_set_field(srq_context->byte_44_idxbufpgsz_addr, 6085 5924 SRQC_BYTE_44_SRQ_IDX_CUR_BLK_ADDR_M, 6086 5925 SRQC_BYTE_44_SRQ_IDX_CUR_BLK_ADDR_S, 6087 - cpu_to_le32((mtts_idx[0]) >> (32 + PAGE_ADDR_SHIFT))); 5926 + mtts_idx[0] >> (32 + PAGE_ADDR_SHIFT)); 6088 5927 roce_set_field(srq_context->byte_44_idxbufpgsz_addr, 6089 5928 SRQC_BYTE_44_SRQ_IDX_HOP_NUM_M, 6090 5929 SRQC_BYTE_44_SRQ_IDX_HOP_NUM_S, ··· 6098 5941 SRQC_BYTE_44_SRQ_IDX_BUF_PG_SZ_S, 6099 5942 hr_dev->caps.idx_buf_pg_sz); 6100 5943 6101 - srq_context->idx_nxt_blk_addr = (u32)(mtts_idx[1] >> PAGE_ADDR_SHIFT); 6102 5944 srq_context->idx_nxt_blk_addr = 6103 - cpu_to_le32(srq_context->idx_nxt_blk_addr); 5945 + cpu_to_le32(mtts_idx[1] >> PAGE_ADDR_SHIFT); 6104 5946 roce_set_field(srq_context->rsv_idxnxtblkaddr, 6105 5947 SRQC_BYTE_52_SRQ_IDX_NXT_BLK_ADDR_M, 6106 5948 SRQC_BYTE_52_SRQ_IDX_NXT_BLK_ADDR_S, 6107 - cpu_to_le32((mtts_idx[1]) >> (32 + PAGE_ADDR_SHIFT))); 5949 + mtts_idx[1] >> (32 + PAGE_ADDR_SHIFT)); 6108 5950 roce_set_field(srq_context->byte_56_xrc_cqn, 6109 5951 SRQC_BYTE_56_SRQ_XRC_CQN_M, SRQC_BYTE_56_SRQ_XRC_CQN_S, 6110 5952 cqn); ··· 6297 6141 */ 6298 6142 wmb(); 6299 6143 6300 - srq_db.byte_4 = HNS_ROCE_V2_SRQ_DB << V2_DB_BYTE_4_CMD_S | 6301 - (srq->srqn & V2_DB_BYTE_4_TAG_M); 6302 - srq_db.parameter = srq->head; 6144 + srq_db.byte_4 = 6145 + cpu_to_le32(HNS_ROCE_V2_SRQ_DB << V2_DB_BYTE_4_CMD_S | 6146 + (srq->srqn & V2_DB_BYTE_4_TAG_M)); 6147 + srq_db.parameter = cpu_to_le32(srq->head); 6303 6148 6304 6149 hns_roce_write64(hr_dev, (__le32 *)&srq_db, srq->db_reg_l); 6305 6150 ··· 6590 6433 6591 6434 handle->rinfo.reset_state = HNS_ROCE_STATE_RST_UNINIT; 6592 6435 dev_info(&handle->pdev->dev, "In reset process RoCE client uninit.\n"); 6593 - msleep(100); 6436 + msleep(HNS_ROCE_V2_HW_RST_UNINT_DELAY); 6594 6437 __hns_roce_hw_v2_uninit_instance(handle, false); 6595 6438 6596 6439 return 0;
+4 -3
drivers/infiniband/hw/hns/hns_roce_hw_v2.h
··· 96 96 #define HNS_ROCE_V2_UC_RC_SGE_NUM_IN_WQE 2 97 97 #define HNS_ROCE_V2_RSV_QPS 8 98 98 99 - #define HNS_ROCE_V2_HW_RST_TIMEOUT 1000 99 + #define HNS_ROCE_V2_HW_RST_TIMEOUT 1000 100 + #define HNS_ROCE_V2_HW_RST_UNINT_DELAY 100 101 + 102 + #define HNS_ROCE_V2_HW_RST_COMPLETION_WAIT 20 100 103 101 104 #define HNS_ROCE_CONTEXT_HOP_NUM 1 102 105 #define HNS_ROCE_SCCC_HOP_NUM 1 ··· 129 126 #define HNS_ROCE_CMD_FLAG_ERR_INTR BIT(HNS_ROCE_CMD_FLAG_ERR_INTR_SHIFT) 130 127 131 128 #define HNS_ROCE_CMQ_DESC_NUM_S 3 132 - #define HNS_ROCE_CMQ_EN_B 16 133 - #define HNS_ROCE_CMQ_ENABLE BIT(HNS_ROCE_CMQ_EN_B) 134 129 135 130 #define HNS_ROCE_CMQ_SCC_CLR_DONE_CNT 5 136 131
+6 -5
drivers/infiniband/hw/hns/hns_roce_main.c
··· 262 262 props->state = (netif_running(net_dev) && netif_carrier_ok(net_dev)) ? 263 263 IB_PORT_ACTIVE : IB_PORT_DOWN; 264 264 props->phys_state = (props->state == IB_PORT_ACTIVE) ? 265 - HNS_ROCE_PHY_LINKUP : HNS_ROCE_PHY_DISABLED; 265 + IB_PORT_PHYS_STATE_LINK_UP : 266 + IB_PORT_PHYS_STATE_DISABLED; 266 267 267 268 spin_unlock_irqrestore(&hr_dev->iboe.lock, flags); 268 269 ··· 902 901 goto error_failed_cmd_init; 903 902 } 904 903 904 + /* EQ depends on poll mode, event mode depends on EQ */ 905 905 ret = hr_dev->hw->init_eq(hr_dev); 906 906 if (ret) { 907 907 dev_err(dev, "eq init failed!\n"); ··· 912 910 if (hr_dev->cmd_mod) { 913 911 ret = hns_roce_cmd_use_events(hr_dev); 914 912 if (ret) { 915 - dev_err(dev, "Switch to event-driven cmd failed!\n"); 916 - goto error_failed_use_event; 913 + dev_warn(dev, 914 + "Cmd event mode failed, set back to poll!\n"); 915 + hns_roce_cmd_use_polling(hr_dev); 917 916 } 918 917 } 919 918 ··· 957 954 error_failed_init_hem: 958 955 if (hr_dev->cmd_mod) 959 956 hns_roce_cmd_use_polling(hr_dev); 960 - 961 - error_failed_use_event: 962 957 hr_dev->hw->cleanup_eq(hr_dev); 963 958 964 959 error_failed_eq_table:
+257 -189
drivers/infiniband/hw/hns/hns_roce_mr.c
··· 347 347 mr->pbl_bt_l0 = NULL; 348 348 mr->pbl_l0_dma_addr = 0; 349 349 } 350 + static int pbl_1hop_alloc(struct hns_roce_dev *hr_dev, int npages, 351 + struct hns_roce_mr *mr, u32 pbl_bt_sz) 352 + { 353 + struct device *dev = hr_dev->dev; 354 + 355 + if (npages > pbl_bt_sz / 8) { 356 + dev_err(dev, "npages %d is larger than buf_pg_sz!", 357 + npages); 358 + return -EINVAL; 359 + } 360 + mr->pbl_buf = dma_alloc_coherent(dev, npages * 8, 361 + &(mr->pbl_dma_addr), 362 + GFP_KERNEL); 363 + if (!mr->pbl_buf) 364 + return -ENOMEM; 365 + 366 + mr->pbl_size = npages; 367 + mr->pbl_ba = mr->pbl_dma_addr; 368 + mr->pbl_hop_num = 1; 369 + mr->pbl_ba_pg_sz = hr_dev->caps.pbl_ba_pg_sz; 370 + mr->pbl_buf_pg_sz = hr_dev->caps.pbl_buf_pg_sz; 371 + return 0; 372 + 373 + } 374 + 375 + 376 + static int pbl_2hop_alloc(struct hns_roce_dev *hr_dev, int npages, 377 + struct hns_roce_mr *mr, u32 pbl_bt_sz) 378 + { 379 + struct device *dev = hr_dev->dev; 380 + int npages_allocated; 381 + u64 pbl_last_bt_num; 382 + u64 pbl_bt_cnt = 0; 383 + u64 size; 384 + int i; 385 + 386 + pbl_last_bt_num = (npages + pbl_bt_sz / 8 - 1) / (pbl_bt_sz / 8); 387 + 388 + /* alloc L1 BT */ 389 + for (i = 0; i < pbl_bt_sz / 8; i++) { 390 + if (pbl_bt_cnt + 1 < pbl_last_bt_num) { 391 + size = pbl_bt_sz; 392 + } else { 393 + npages_allocated = i * (pbl_bt_sz / 8); 394 + size = (npages - npages_allocated) * 8; 395 + } 396 + mr->pbl_bt_l1[i] = dma_alloc_coherent(dev, size, 397 + &(mr->pbl_l1_dma_addr[i]), 398 + GFP_KERNEL); 399 + if (!mr->pbl_bt_l1[i]) { 400 + hns_roce_loop_free(hr_dev, mr, 1, i, 0); 401 + return -ENOMEM; 402 + } 403 + 404 + *(mr->pbl_bt_l0 + i) = mr->pbl_l1_dma_addr[i]; 405 + 406 + pbl_bt_cnt++; 407 + if (pbl_bt_cnt >= pbl_last_bt_num) 408 + break; 409 + } 410 + 411 + mr->l0_chunk_last_num = i + 1; 412 + 413 + return 0; 414 + } 415 + 416 + static int pbl_3hop_alloc(struct hns_roce_dev *hr_dev, int npages, 417 + struct hns_roce_mr *mr, u32 pbl_bt_sz) 418 + { 419 + struct device *dev = hr_dev->dev; 420 + int mr_alloc_done = 0; 421 + int npages_allocated; 422 + u64 pbl_last_bt_num; 423 + u64 pbl_bt_cnt = 0; 424 + u64 bt_idx; 425 + u64 size; 426 + int i; 427 + int j = 0; 428 + 429 + pbl_last_bt_num = (npages + pbl_bt_sz / 8 - 1) / (pbl_bt_sz / 8); 430 + 431 + mr->pbl_l2_dma_addr = kcalloc(pbl_last_bt_num, 432 + sizeof(*mr->pbl_l2_dma_addr), 433 + GFP_KERNEL); 434 + if (!mr->pbl_l2_dma_addr) 435 + return -ENOMEM; 436 + 437 + mr->pbl_bt_l2 = kcalloc(pbl_last_bt_num, 438 + sizeof(*mr->pbl_bt_l2), 439 + GFP_KERNEL); 440 + if (!mr->pbl_bt_l2) 441 + goto err_kcalloc_bt_l2; 442 + 443 + /* alloc L1, L2 BT */ 444 + for (i = 0; i < pbl_bt_sz / 8; i++) { 445 + mr->pbl_bt_l1[i] = dma_alloc_coherent(dev, pbl_bt_sz, 446 + &(mr->pbl_l1_dma_addr[i]), 447 + GFP_KERNEL); 448 + if (!mr->pbl_bt_l1[i]) { 449 + hns_roce_loop_free(hr_dev, mr, 1, i, 0); 450 + goto err_dma_alloc_l0; 451 + } 452 + 453 + *(mr->pbl_bt_l0 + i) = mr->pbl_l1_dma_addr[i]; 454 + 455 + for (j = 0; j < pbl_bt_sz / 8; j++) { 456 + bt_idx = i * pbl_bt_sz / 8 + j; 457 + 458 + if (pbl_bt_cnt + 1 < pbl_last_bt_num) { 459 + size = pbl_bt_sz; 460 + } else { 461 + npages_allocated = bt_idx * 462 + (pbl_bt_sz / 8); 463 + size = (npages - npages_allocated) * 8; 464 + } 465 + mr->pbl_bt_l2[bt_idx] = dma_alloc_coherent( 466 + dev, size, 467 + &(mr->pbl_l2_dma_addr[bt_idx]), 468 + GFP_KERNEL); 469 + if (!mr->pbl_bt_l2[bt_idx]) { 470 + hns_roce_loop_free(hr_dev, mr, 2, i, j); 471 + goto err_dma_alloc_l0; 472 + } 473 + 474 + *(mr->pbl_bt_l1[i] + j) = 475 + mr->pbl_l2_dma_addr[bt_idx]; 476 + 477 + pbl_bt_cnt++; 478 + if (pbl_bt_cnt >= pbl_last_bt_num) { 479 + mr_alloc_done = 1; 480 + break; 481 + } 482 + } 483 + 484 + if (mr_alloc_done) 485 + break; 486 + } 487 + 488 + mr->l0_chunk_last_num = i + 1; 489 + mr->l1_chunk_last_num = j + 1; 490 + 491 + 492 + return 0; 493 + 494 + err_dma_alloc_l0: 495 + kfree(mr->pbl_bt_l2); 496 + mr->pbl_bt_l2 = NULL; 497 + 498 + err_kcalloc_bt_l2: 499 + kfree(mr->pbl_l2_dma_addr); 500 + mr->pbl_l2_dma_addr = NULL; 501 + 502 + return -ENOMEM; 503 + } 504 + 350 505 351 506 /* PBL multi hop addressing */ 352 507 static int hns_roce_mhop_alloc(struct hns_roce_dev *hr_dev, int npages, 353 508 struct hns_roce_mr *mr) 354 509 { 355 510 struct device *dev = hr_dev->dev; 356 - int mr_alloc_done = 0; 357 - int npages_allocated; 358 - int i = 0, j = 0; 359 511 u32 pbl_bt_sz; 360 512 u32 mhop_num; 361 - u64 pbl_last_bt_num; 362 - u64 pbl_bt_cnt = 0; 363 - u64 bt_idx; 364 - u64 size; 365 513 366 514 mhop_num = (mr->type == MR_TYPE_FRMR ? 1 : hr_dev->caps.pbl_hop_num); 367 515 pbl_bt_sz = 1 << (hr_dev->caps.pbl_ba_pg_sz + PAGE_SHIFT); 368 - pbl_last_bt_num = (npages + pbl_bt_sz / 8 - 1) / (pbl_bt_sz / 8); 369 516 370 517 if (mhop_num == HNS_ROCE_HOP_NUM_0) 371 518 return 0; 372 519 373 - /* hop_num = 1 */ 374 - if (mhop_num == 1) { 375 - if (npages > pbl_bt_sz / 8) { 376 - dev_err(dev, "npages %d is larger than buf_pg_sz!", 377 - npages); 378 - return -EINVAL; 379 - } 380 - mr->pbl_buf = dma_alloc_coherent(dev, npages * 8, 381 - &(mr->pbl_dma_addr), 382 - GFP_KERNEL); 383 - if (!mr->pbl_buf) 384 - return -ENOMEM; 385 - 386 - mr->pbl_size = npages; 387 - mr->pbl_ba = mr->pbl_dma_addr; 388 - mr->pbl_hop_num = mhop_num; 389 - mr->pbl_ba_pg_sz = hr_dev->caps.pbl_ba_pg_sz; 390 - mr->pbl_buf_pg_sz = hr_dev->caps.pbl_buf_pg_sz; 391 - return 0; 392 - } 520 + if (mhop_num == 1) 521 + return pbl_1hop_alloc(hr_dev, npages, mr, pbl_bt_sz); 393 522 394 523 mr->pbl_l1_dma_addr = kcalloc(pbl_bt_sz / 8, 395 524 sizeof(*mr->pbl_l1_dma_addr), ··· 531 402 if (!mr->pbl_bt_l1) 532 403 goto err_kcalloc_bt_l1; 533 404 534 - if (mhop_num == 3) { 535 - mr->pbl_l2_dma_addr = kcalloc(pbl_last_bt_num, 536 - sizeof(*mr->pbl_l2_dma_addr), 537 - GFP_KERNEL); 538 - if (!mr->pbl_l2_dma_addr) 539 - goto err_kcalloc_l2_dma; 540 - 541 - mr->pbl_bt_l2 = kcalloc(pbl_last_bt_num, 542 - sizeof(*mr->pbl_bt_l2), 543 - GFP_KERNEL); 544 - if (!mr->pbl_bt_l2) 545 - goto err_kcalloc_bt_l2; 546 - } 547 - 548 405 /* alloc L0 BT */ 549 406 mr->pbl_bt_l0 = dma_alloc_coherent(dev, pbl_bt_sz, 550 407 &(mr->pbl_l0_dma_addr), 551 408 GFP_KERNEL); 552 409 if (!mr->pbl_bt_l0) 553 - goto err_dma_alloc_l0; 410 + goto err_kcalloc_l2_dma; 554 411 555 412 if (mhop_num == 2) { 556 - /* alloc L1 BT */ 557 - for (i = 0; i < pbl_bt_sz / 8; i++) { 558 - if (pbl_bt_cnt + 1 < pbl_last_bt_num) { 559 - size = pbl_bt_sz; 560 - } else { 561 - npages_allocated = i * (pbl_bt_sz / 8); 562 - size = (npages - npages_allocated) * 8; 563 - } 564 - mr->pbl_bt_l1[i] = dma_alloc_coherent(dev, size, 565 - &(mr->pbl_l1_dma_addr[i]), 566 - GFP_KERNEL); 567 - if (!mr->pbl_bt_l1[i]) { 568 - hns_roce_loop_free(hr_dev, mr, 1, i, 0); 569 - goto err_dma_alloc_l0; 570 - } 571 - 572 - *(mr->pbl_bt_l0 + i) = mr->pbl_l1_dma_addr[i]; 573 - 574 - pbl_bt_cnt++; 575 - if (pbl_bt_cnt >= pbl_last_bt_num) 576 - break; 577 - } 578 - } else if (mhop_num == 3) { 579 - /* alloc L1, L2 BT */ 580 - for (i = 0; i < pbl_bt_sz / 8; i++) { 581 - mr->pbl_bt_l1[i] = dma_alloc_coherent(dev, pbl_bt_sz, 582 - &(mr->pbl_l1_dma_addr[i]), 583 - GFP_KERNEL); 584 - if (!mr->pbl_bt_l1[i]) { 585 - hns_roce_loop_free(hr_dev, mr, 1, i, 0); 586 - goto err_dma_alloc_l0; 587 - } 588 - 589 - *(mr->pbl_bt_l0 + i) = mr->pbl_l1_dma_addr[i]; 590 - 591 - for (j = 0; j < pbl_bt_sz / 8; j++) { 592 - bt_idx = i * pbl_bt_sz / 8 + j; 593 - 594 - if (pbl_bt_cnt + 1 < pbl_last_bt_num) { 595 - size = pbl_bt_sz; 596 - } else { 597 - npages_allocated = bt_idx * 598 - (pbl_bt_sz / 8); 599 - size = (npages - npages_allocated) * 8; 600 - } 601 - mr->pbl_bt_l2[bt_idx] = dma_alloc_coherent( 602 - dev, size, 603 - &(mr->pbl_l2_dma_addr[bt_idx]), 604 - GFP_KERNEL); 605 - if (!mr->pbl_bt_l2[bt_idx]) { 606 - hns_roce_loop_free(hr_dev, mr, 2, i, j); 607 - goto err_dma_alloc_l0; 608 - } 609 - 610 - *(mr->pbl_bt_l1[i] + j) = 611 - mr->pbl_l2_dma_addr[bt_idx]; 612 - 613 - pbl_bt_cnt++; 614 - if (pbl_bt_cnt >= pbl_last_bt_num) { 615 - mr_alloc_done = 1; 616 - break; 617 - } 618 - } 619 - 620 - if (mr_alloc_done) 621 - break; 622 - } 413 + if (pbl_2hop_alloc(hr_dev, npages, mr, pbl_bt_sz)) 414 + goto err_kcalloc_l2_dma; 623 415 } 624 416 625 - mr->l0_chunk_last_num = i + 1; 626 - if (mhop_num == 3) 627 - mr->l1_chunk_last_num = j + 1; 417 + if (mhop_num == 3) { 418 + if (pbl_3hop_alloc(hr_dev, npages, mr, pbl_bt_sz)) 419 + goto err_kcalloc_l2_dma; 420 + } 421 + 628 422 629 423 mr->pbl_size = npages; 630 424 mr->pbl_ba = mr->pbl_l0_dma_addr; ··· 556 504 mr->pbl_buf_pg_sz = hr_dev->caps.pbl_buf_pg_sz; 557 505 558 506 return 0; 559 - 560 - err_dma_alloc_l0: 561 - kfree(mr->pbl_bt_l2); 562 - mr->pbl_bt_l2 = NULL; 563 - 564 - err_kcalloc_bt_l2: 565 - kfree(mr->pbl_l2_dma_addr); 566 - mr->pbl_l2_dma_addr = NULL; 567 507 568 508 err_kcalloc_l2_dma: 569 509 kfree(mr->pbl_bt_l1); ··· 1205 1161 return ERR_PTR(ret); 1206 1162 } 1207 1163 1164 + static int rereg_mr_trans(struct ib_mr *ibmr, int flags, 1165 + u64 start, u64 length, 1166 + u64 virt_addr, int mr_access_flags, 1167 + struct hns_roce_cmd_mailbox *mailbox, 1168 + u32 pdn, struct ib_udata *udata) 1169 + { 1170 + struct hns_roce_dev *hr_dev = to_hr_dev(ibmr->device); 1171 + struct hns_roce_mr *mr = to_hr_mr(ibmr); 1172 + struct device *dev = hr_dev->dev; 1173 + int npages; 1174 + int ret; 1175 + 1176 + if (mr->size != ~0ULL) { 1177 + npages = ib_umem_page_count(mr->umem); 1178 + 1179 + if (hr_dev->caps.pbl_hop_num) 1180 + hns_roce_mhop_free(hr_dev, mr); 1181 + else 1182 + dma_free_coherent(dev, npages * 8, 1183 + mr->pbl_buf, mr->pbl_dma_addr); 1184 + } 1185 + ib_umem_release(mr->umem); 1186 + 1187 + mr->umem = ib_umem_get(udata, start, length, mr_access_flags, 0); 1188 + if (IS_ERR(mr->umem)) { 1189 + ret = PTR_ERR(mr->umem); 1190 + mr->umem = NULL; 1191 + return -ENOMEM; 1192 + } 1193 + npages = ib_umem_page_count(mr->umem); 1194 + 1195 + if (hr_dev->caps.pbl_hop_num) { 1196 + ret = hns_roce_mhop_alloc(hr_dev, npages, mr); 1197 + if (ret) 1198 + goto release_umem; 1199 + } else { 1200 + mr->pbl_buf = dma_alloc_coherent(dev, npages * 8, 1201 + &(mr->pbl_dma_addr), 1202 + GFP_KERNEL); 1203 + if (!mr->pbl_buf) { 1204 + ret = -ENOMEM; 1205 + goto release_umem; 1206 + } 1207 + } 1208 + 1209 + ret = hr_dev->hw->rereg_write_mtpt(hr_dev, mr, flags, pdn, 1210 + mr_access_flags, virt_addr, 1211 + length, mailbox->buf); 1212 + if (ret) 1213 + goto release_umem; 1214 + 1215 + 1216 + ret = hns_roce_ib_umem_write_mr(hr_dev, mr, mr->umem); 1217 + if (ret) { 1218 + if (mr->size != ~0ULL) { 1219 + npages = ib_umem_page_count(mr->umem); 1220 + 1221 + if (hr_dev->caps.pbl_hop_num) 1222 + hns_roce_mhop_free(hr_dev, mr); 1223 + else 1224 + dma_free_coherent(dev, npages * 8, 1225 + mr->pbl_buf, 1226 + mr->pbl_dma_addr); 1227 + } 1228 + 1229 + goto release_umem; 1230 + } 1231 + 1232 + return 0; 1233 + 1234 + release_umem: 1235 + ib_umem_release(mr->umem); 1236 + return ret; 1237 + 1238 + } 1239 + 1240 + 1208 1241 int hns_roce_rereg_user_mr(struct ib_mr *ibmr, int flags, u64 start, u64 length, 1209 1242 u64 virt_addr, int mr_access_flags, struct ib_pd *pd, 1210 1243 struct ib_udata *udata) ··· 1292 1171 struct device *dev = hr_dev->dev; 1293 1172 unsigned long mtpt_idx; 1294 1173 u32 pdn = 0; 1295 - int npages; 1296 1174 int ret; 1297 1175 1298 1176 if (!mr->enabled) ··· 1318 1198 pdn = to_hr_pd(pd)->pdn; 1319 1199 1320 1200 if (flags & IB_MR_REREG_TRANS) { 1321 - if (mr->size != ~0ULL) { 1322 - npages = ib_umem_page_count(mr->umem); 1323 - 1324 - if (hr_dev->caps.pbl_hop_num) 1325 - hns_roce_mhop_free(hr_dev, mr); 1326 - else 1327 - dma_free_coherent(dev, npages * 8, mr->pbl_buf, 1328 - mr->pbl_dma_addr); 1329 - } 1330 - ib_umem_release(mr->umem); 1331 - 1332 - mr->umem = 1333 - ib_umem_get(udata, start, length, mr_access_flags, 0); 1334 - if (IS_ERR(mr->umem)) { 1335 - ret = PTR_ERR(mr->umem); 1336 - mr->umem = NULL; 1201 + ret = rereg_mr_trans(ibmr, flags, 1202 + start, length, 1203 + virt_addr, mr_access_flags, 1204 + mailbox, pdn, udata); 1205 + if (ret) 1337 1206 goto free_cmd_mbox; 1338 - } 1339 - npages = ib_umem_page_count(mr->umem); 1340 - 1341 - if (hr_dev->caps.pbl_hop_num) { 1342 - ret = hns_roce_mhop_alloc(hr_dev, npages, mr); 1343 - if (ret) 1344 - goto release_umem; 1345 - } else { 1346 - mr->pbl_buf = dma_alloc_coherent(dev, npages * 8, 1347 - &(mr->pbl_dma_addr), 1348 - GFP_KERNEL); 1349 - if (!mr->pbl_buf) { 1350 - ret = -ENOMEM; 1351 - goto release_umem; 1352 - } 1353 - } 1354 - } 1355 - 1356 - ret = hr_dev->hw->rereg_write_mtpt(hr_dev, mr, flags, pdn, 1357 - mr_access_flags, virt_addr, 1358 - length, mailbox->buf); 1359 - if (ret) { 1360 - if (flags & IB_MR_REREG_TRANS) 1361 - goto release_umem; 1362 - else 1207 + } else { 1208 + ret = hr_dev->hw->rereg_write_mtpt(hr_dev, mr, flags, pdn, 1209 + mr_access_flags, virt_addr, 1210 + length, mailbox->buf); 1211 + if (ret) 1363 1212 goto free_cmd_mbox; 1364 - } 1365 - 1366 - if (flags & IB_MR_REREG_TRANS) { 1367 - ret = hns_roce_ib_umem_write_mr(hr_dev, mr, mr->umem); 1368 - if (ret) { 1369 - if (mr->size != ~0ULL) { 1370 - npages = ib_umem_page_count(mr->umem); 1371 - 1372 - if (hr_dev->caps.pbl_hop_num) 1373 - hns_roce_mhop_free(hr_dev, mr); 1374 - else 1375 - dma_free_coherent(dev, npages * 8, 1376 - mr->pbl_buf, 1377 - mr->pbl_dma_addr); 1378 - } 1379 - 1380 - goto release_umem; 1381 - } 1382 1213 } 1383 1214 1384 1215 ret = hns_roce_sw2hw_mpt(hr_dev, mailbox, mtpt_idx); 1385 1216 if (ret) { 1386 1217 dev_err(dev, "SW2HW_MPT failed (%d)\n", ret); 1387 - goto release_umem; 1218 + ib_umem_release(mr->umem); 1219 + goto free_cmd_mbox; 1388 1220 } 1389 1221 1390 1222 mr->enabled = 1; ··· 1346 1274 hns_roce_free_cmd_mailbox(hr_dev, mailbox); 1347 1275 1348 1276 return 0; 1349 - 1350 - release_umem: 1351 - ib_umem_release(mr->umem); 1352 1277 1353 1278 free_cmd_mbox: 1354 1279 hns_roce_free_cmd_mailbox(hr_dev, mailbox); ··· 1426 1357 { 1427 1358 struct hns_roce_mr *mr = to_hr_mr(ibmr); 1428 1359 1429 - mr->pbl_buf[mr->npages++] = cpu_to_le64(addr); 1360 + mr->pbl_buf[mr->npages++] = addr; 1430 1361 1431 1362 return 0; 1432 1363 } ··· 1597 1528 /* Save page addr, low 12 bits : 0 */ 1598 1529 for (i = 0; i < count; i++) { 1599 1530 if (hr_dev->hw_rev == HNS_ROCE_HW_VER1) 1600 - mtts[i] = cpu_to_le64(bufs[npage] >> 1601 - PAGE_ADDR_SHIFT); 1531 + mtts[i] = bufs[npage] >> PAGE_ADDR_SHIFT; 1602 1532 else 1603 - mtts[i] = cpu_to_le64(bufs[npage]); 1533 + mtts[i] = bufs[npage]; 1604 1534 1605 1535 npage++; 1606 1536 }
+236 -151
drivers/infiniband/hw/hns/hns_roce_qp.c
··· 324 324 return 0; 325 325 } 326 326 327 - static int hns_roce_set_user_sq_size(struct hns_roce_dev *hr_dev, 328 - struct ib_qp_cap *cap, 329 - struct hns_roce_qp *hr_qp, 330 - struct hns_roce_ib_create_qp *ucmd) 327 + static int check_sq_size_with_integrity(struct hns_roce_dev *hr_dev, 328 + struct ib_qp_cap *cap, 329 + struct hns_roce_ib_create_qp *ucmd) 331 330 { 332 331 u32 roundup_sq_stride = roundup_pow_of_two(hr_dev->caps.max_sq_desc_sz); 333 332 u8 max_sq_stride = ilog2(roundup_sq_stride); 334 - u32 ex_sge_num; 335 - u32 page_size; 336 - u32 max_cnt; 337 333 338 334 /* Sanity check SQ size before proceeding */ 339 335 if ((u32)(1 << ucmd->log_sq_bb_count) > hr_dev->caps.max_wqes || 340 336 ucmd->log_sq_stride > max_sq_stride || 341 337 ucmd->log_sq_stride < HNS_ROCE_IB_MIN_SQ_STRIDE) { 342 - dev_err(hr_dev->dev, "check SQ size error!\n"); 338 + ibdev_err(&hr_dev->ib_dev, "check SQ size error!\n"); 343 339 return -EINVAL; 344 340 } 345 341 346 342 if (cap->max_send_sge > hr_dev->caps.max_sq_sg) { 347 - dev_err(hr_dev->dev, "SQ sge error! max_send_sge=%d\n", 348 - cap->max_send_sge); 343 + ibdev_err(&hr_dev->ib_dev, "SQ sge error! max_send_sge=%d\n", 344 + cap->max_send_sge); 349 345 return -EINVAL; 346 + } 347 + 348 + return 0; 349 + } 350 + 351 + static int hns_roce_set_user_sq_size(struct hns_roce_dev *hr_dev, 352 + struct ib_qp_cap *cap, 353 + struct hns_roce_qp *hr_qp, 354 + struct hns_roce_ib_create_qp *ucmd) 355 + { 356 + u32 ex_sge_num; 357 + u32 page_size; 358 + u32 max_cnt; 359 + int ret; 360 + 361 + ret = check_sq_size_with_integrity(hr_dev, cap, ucmd); 362 + if (ret) { 363 + ibdev_err(&hr_dev->ib_dev, "Sanity check sq size failed\n"); 364 + return ret; 350 365 } 351 366 352 367 hr_qp->sq.wqe_cnt = 1 << ucmd->log_sq_bb_count; ··· 516 501 return bt_pg_shift - PAGE_SHIFT; 517 502 } 518 503 519 - static int hns_roce_set_kernel_sq_size(struct hns_roce_dev *hr_dev, 520 - struct ib_qp_cap *cap, 521 - struct hns_roce_qp *hr_qp) 504 + static int set_extend_sge_param(struct hns_roce_dev *hr_dev, 505 + struct hns_roce_qp *hr_qp) 522 506 { 523 507 struct device *dev = hr_dev->dev; 524 - u32 page_size; 525 - u32 max_cnt; 526 - int size; 527 - 528 - if (cap->max_send_wr > hr_dev->caps.max_wqes || 529 - cap->max_send_sge > hr_dev->caps.max_sq_sg || 530 - cap->max_inline_data > hr_dev->caps.max_sq_inline) { 531 - dev_err(dev, "SQ WR or sge or inline data error!\n"); 532 - return -EINVAL; 533 - } 534 - 535 - hr_qp->sq.wqe_shift = ilog2(hr_dev->caps.max_sq_desc_sz); 536 - hr_qp->sq_max_wqes_per_wr = 1; 537 - hr_qp->sq_spare_wqes = 0; 538 - 539 - if (hr_dev->caps.min_wqes) 540 - max_cnt = max(cap->max_send_wr, hr_dev->caps.min_wqes); 541 - else 542 - max_cnt = cap->max_send_wr; 543 - 544 - hr_qp->sq.wqe_cnt = roundup_pow_of_two(max_cnt); 545 - if ((u32)hr_qp->sq.wqe_cnt > hr_dev->caps.max_wqes) { 546 - dev_err(dev, "while setting kernel sq size, sq.wqe_cnt too large\n"); 547 - return -EINVAL; 548 - } 549 - 550 - /* Get data_seg numbers */ 551 - max_cnt = max(1U, cap->max_send_sge); 552 - if (hr_dev->caps.max_sq_sg <= 2) 553 - hr_qp->sq.max_gs = roundup_pow_of_two(max_cnt); 554 - else 555 - hr_qp->sq.max_gs = max_cnt; 556 508 557 509 if (hr_qp->sq.max_gs > 2) { 558 510 hr_qp->sge.sge_cnt = roundup_pow_of_two(hr_qp->sq.wqe_cnt * ··· 540 558 hr_qp->sge.sge_cnt); 541 559 return -EINVAL; 542 560 } 561 + } 562 + 563 + return 0; 564 + } 565 + 566 + static int hns_roce_set_kernel_sq_size(struct hns_roce_dev *hr_dev, 567 + struct ib_qp_cap *cap, 568 + struct hns_roce_qp *hr_qp) 569 + { 570 + struct device *dev = hr_dev->dev; 571 + u32 page_size; 572 + u32 max_cnt; 573 + int size; 574 + int ret; 575 + 576 + if (cap->max_send_wr > hr_dev->caps.max_wqes || 577 + cap->max_send_sge > hr_dev->caps.max_sq_sg || 578 + cap->max_inline_data > hr_dev->caps.max_sq_inline) { 579 + dev_err(dev, "SQ WR or sge or inline data error!\n"); 580 + return -EINVAL; 581 + } 582 + 583 + hr_qp->sq.wqe_shift = ilog2(hr_dev->caps.max_sq_desc_sz); 584 + 585 + if (hr_dev->caps.min_wqes) 586 + max_cnt = max(cap->max_send_wr, hr_dev->caps.min_wqes); 587 + else 588 + max_cnt = cap->max_send_wr; 589 + 590 + hr_qp->sq.wqe_cnt = roundup_pow_of_two(max_cnt); 591 + if ((u32)hr_qp->sq.wqe_cnt > hr_dev->caps.max_wqes) { 592 + dev_err(dev, "while setting kernel sq size, sq.wqe_cnt too large\n"); 593 + return -EINVAL; 594 + } 595 + 596 + /* Get data_seg numbers */ 597 + max_cnt = max(1U, cap->max_send_sge); 598 + if (hr_dev->caps.max_sq_sg <= 2) 599 + hr_qp->sq.max_gs = roundup_pow_of_two(max_cnt); 600 + else 601 + hr_qp->sq.max_gs = max_cnt; 602 + 603 + ret = set_extend_sge_param(hr_dev, hr_qp); 604 + if (ret) { 605 + dev_err(dev, "set extend sge parameters fail\n"); 606 + return ret; 543 607 } 544 608 545 609 /* Get buf size, SQ and RQ are aligned to PAGE_SIZE */ ··· 635 607 return 1; 636 608 } 637 609 610 + static int alloc_rq_inline_buf(struct hns_roce_qp *hr_qp, 611 + struct ib_qp_init_attr *init_attr) 612 + { 613 + u32 max_recv_sge = init_attr->cap.max_recv_sge; 614 + struct hns_roce_rinl_wqe *wqe_list; 615 + u32 wqe_cnt = hr_qp->rq.wqe_cnt; 616 + int i; 617 + 618 + /* allocate recv inline buf */ 619 + wqe_list = kcalloc(wqe_cnt, sizeof(struct hns_roce_rinl_wqe), 620 + GFP_KERNEL); 621 + 622 + if (!wqe_list) 623 + goto err; 624 + 625 + /* Allocate a continuous buffer for all inline sge we need */ 626 + wqe_list[0].sg_list = kcalloc(wqe_cnt, (max_recv_sge * 627 + sizeof(struct hns_roce_rinl_sge)), 628 + GFP_KERNEL); 629 + if (!wqe_list[0].sg_list) 630 + goto err_wqe_list; 631 + 632 + /* Assign buffers of sg_list to each inline wqe */ 633 + for (i = 1; i < wqe_cnt; i++) 634 + wqe_list[i].sg_list = &wqe_list[0].sg_list[i * max_recv_sge]; 635 + 636 + hr_qp->rq_inl_buf.wqe_list = wqe_list; 637 + hr_qp->rq_inl_buf.wqe_cnt = wqe_cnt; 638 + 639 + return 0; 640 + 641 + err_wqe_list: 642 + kfree(wqe_list); 643 + 644 + err: 645 + return -ENOMEM; 646 + } 647 + 648 + static void free_rq_inline_buf(struct hns_roce_qp *hr_qp) 649 + { 650 + kfree(hr_qp->rq_inl_buf.wqe_list[0].sg_list); 651 + kfree(hr_qp->rq_inl_buf.wqe_list); 652 + } 653 + 638 654 static int hns_roce_create_qp_common(struct hns_roce_dev *hr_dev, 639 655 struct ib_pd *ib_pd, 640 656 struct ib_qp_init_attr *init_attr, 641 657 struct ib_udata *udata, unsigned long sqpn, 642 658 struct hns_roce_qp *hr_qp) 643 659 { 644 - dma_addr_t *buf_list[ARRAY_SIZE(hr_qp->regions)] = { 0 }; 660 + dma_addr_t *buf_list[ARRAY_SIZE(hr_qp->regions)] = { NULL }; 645 661 struct device *dev = hr_dev->dev; 646 662 struct hns_roce_ib_create_qp ucmd; 647 663 struct hns_roce_ib_create_qp_resp resp = {}; ··· 707 635 hr_qp->ibqp.qp_type = init_attr->qp_type; 708 636 709 637 if (init_attr->sq_sig_type == IB_SIGNAL_ALL_WR) 710 - hr_qp->sq_signal_bits = cpu_to_le32(IB_SIGNAL_ALL_WR); 638 + hr_qp->sq_signal_bits = IB_SIGNAL_ALL_WR; 711 639 else 712 - hr_qp->sq_signal_bits = cpu_to_le32(IB_SIGNAL_REQ_WR); 640 + hr_qp->sq_signal_bits = IB_SIGNAL_REQ_WR; 713 641 714 642 ret = hns_roce_set_rq_size(hr_dev, &init_attr->cap, udata, 715 643 hns_roce_qp_has_rq(init_attr), hr_qp); ··· 720 648 721 649 if ((hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RQ_INLINE) && 722 650 hns_roce_qp_has_rq(init_attr)) { 723 - /* allocate recv inline buf */ 724 - hr_qp->rq_inl_buf.wqe_list = kcalloc(hr_qp->rq.wqe_cnt, 725 - sizeof(struct hns_roce_rinl_wqe), 726 - GFP_KERNEL); 727 - if (!hr_qp->rq_inl_buf.wqe_list) { 728 - ret = -ENOMEM; 651 + ret = alloc_rq_inline_buf(hr_qp, init_attr); 652 + if (ret) { 653 + dev_err(dev, "allocate receive inline buffer failed\n"); 729 654 goto err_out; 730 655 } 731 - 732 - hr_qp->rq_inl_buf.wqe_cnt = hr_qp->rq.wqe_cnt; 733 - 734 - /* Firstly, allocate a list of sge space buffer */ 735 - hr_qp->rq_inl_buf.wqe_list[0].sg_list = 736 - kcalloc(hr_qp->rq_inl_buf.wqe_cnt, 737 - init_attr->cap.max_recv_sge * 738 - sizeof(struct hns_roce_rinl_sge), 739 - GFP_KERNEL); 740 - if (!hr_qp->rq_inl_buf.wqe_list[0].sg_list) { 741 - ret = -ENOMEM; 742 - goto err_wqe_list; 743 - } 744 - 745 - for (i = 1; i < hr_qp->rq_inl_buf.wqe_cnt; i++) 746 - /* Secondly, reallocate the buffer */ 747 - hr_qp->rq_inl_buf.wqe_list[i].sg_list = 748 - &hr_qp->rq_inl_buf.wqe_list[0].sg_list[i * 749 - init_attr->cap.max_recv_sge]; 750 656 } 751 657 752 658 page_shift = PAGE_SHIFT + hr_dev->caps.mtt_buf_pg_sz; ··· 732 682 if (ib_copy_from_udata(&ucmd, udata, sizeof(ucmd))) { 733 683 dev_err(dev, "ib_copy_from_udata error for create qp\n"); 734 684 ret = -EFAULT; 735 - goto err_rq_sge_list; 685 + goto err_alloc_rq_inline_buf; 736 686 } 737 687 738 688 ret = hns_roce_set_user_sq_size(hr_dev, &init_attr->cap, hr_qp, 739 689 &ucmd); 740 690 if (ret) { 741 691 dev_err(dev, "hns_roce_set_user_sq_size error for create qp\n"); 742 - goto err_rq_sge_list; 692 + goto err_alloc_rq_inline_buf; 743 693 } 744 694 745 695 hr_qp->umem = ib_umem_get(udata, ucmd.buf_addr, ··· 747 697 if (IS_ERR(hr_qp->umem)) { 748 698 dev_err(dev, "ib_umem_get error for create qp\n"); 749 699 ret = PTR_ERR(hr_qp->umem); 750 - goto err_rq_sge_list; 700 + goto err_alloc_rq_inline_buf; 751 701 } 752 702 hr_qp->region_cnt = split_wqe_buf_region(hr_dev, hr_qp, 753 703 hr_qp->regions, ARRAY_SIZE(hr_qp->regions), ··· 808 758 IB_QP_CREATE_BLOCK_MULTICAST_LOOPBACK) { 809 759 dev_err(dev, "init_attr->create_flags error!\n"); 810 760 ret = -EINVAL; 811 - goto err_rq_sge_list; 761 + goto err_alloc_rq_inline_buf; 812 762 } 813 763 814 764 if (init_attr->create_flags & IB_QP_CREATE_IPOIB_UD_LSO) { 815 765 dev_err(dev, "init_attr->create_flags error!\n"); 816 766 ret = -EINVAL; 817 - goto err_rq_sge_list; 767 + goto err_alloc_rq_inline_buf; 818 768 } 819 769 820 770 /* Set SQ size */ ··· 822 772 hr_qp); 823 773 if (ret) { 824 774 dev_err(dev, "hns_roce_set_kernel_sq_size error!\n"); 825 - goto err_rq_sge_list; 775 + goto err_alloc_rq_inline_buf; 826 776 } 827 777 828 778 /* QP doorbell register address */ ··· 836 786 ret = hns_roce_alloc_db(hr_dev, &hr_qp->rdb, 0); 837 787 if (ret) { 838 788 dev_err(dev, "rq record doorbell alloc failed!\n"); 839 - goto err_rq_sge_list; 789 + goto err_alloc_rq_inline_buf; 840 790 } 841 791 *hr_qp->rdb.db_record = 0; 842 792 hr_qp->rdb_en = 1; ··· 876 826 877 827 hr_qp->sq.wrid = kcalloc(hr_qp->sq.wqe_cnt, sizeof(u64), 878 828 GFP_KERNEL); 879 - hr_qp->rq.wrid = kcalloc(hr_qp->rq.wqe_cnt, sizeof(u64), 880 - GFP_KERNEL); 881 - if (!hr_qp->sq.wrid || !hr_qp->rq.wrid) { 829 + if (ZERO_OR_NULL_PTR(hr_qp->sq.wrid)) { 882 830 ret = -ENOMEM; 883 - goto err_wrid; 831 + goto err_get_bufs; 832 + } 833 + 834 + if (hr_qp->rq.wqe_cnt) { 835 + hr_qp->rq.wrid = kcalloc(hr_qp->rq.wqe_cnt, sizeof(u64), 836 + GFP_KERNEL); 837 + if (ZERO_OR_NULL_PTR(hr_qp->rq.wrid)) { 838 + ret = -ENOMEM; 839 + goto err_sq_wrid; 840 + } 884 841 } 885 842 } 886 843 ··· 932 875 if (sqpn) 933 876 hr_qp->doorbell_qpn = 1; 934 877 else 935 - hr_qp->doorbell_qpn = cpu_to_le64(hr_qp->qpn); 878 + hr_qp->doorbell_qpn = (u32)hr_qp->qpn; 936 879 937 880 if (udata) { 938 881 ret = ib_copy_to_udata(udata, &resp, ··· 973 916 hns_roce_qp_has_rq(init_attr)) 974 917 hns_roce_db_unmap_user(uctx, &hr_qp->rdb); 975 918 } else { 976 - kfree(hr_qp->sq.wrid); 977 - kfree(hr_qp->rq.wrid); 919 + if (hr_qp->rq.wqe_cnt) 920 + kfree(hr_qp->rq.wrid); 978 921 } 979 922 980 923 err_sq_dbmap: ··· 984 927 (udata->outlen >= sizeof(resp)) && 985 928 hns_roce_qp_has_sq(init_attr)) 986 929 hns_roce_db_unmap_user(uctx, &hr_qp->sdb); 930 + 931 + err_sq_wrid: 932 + if (!udata) 933 + kfree(hr_qp->sq.wrid); 987 934 988 935 err_get_bufs: 989 936 hns_roce_free_buf_list(buf_list, hr_qp->region_cnt); ··· 1002 941 (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RECORD_DB)) 1003 942 hns_roce_free_db(hr_dev, &hr_qp->rdb); 1004 943 1005 - err_rq_sge_list: 1006 - if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RQ_INLINE) 1007 - kfree(hr_qp->rq_inl_buf.wqe_list[0].sg_list); 1008 - 1009 - err_wqe_list: 1010 - if (hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RQ_INLINE) 1011 - kfree(hr_qp->rq_inl_buf.wqe_list); 944 + err_alloc_rq_inline_buf: 945 + if ((hr_dev->caps.flags & HNS_ROCE_CAP_FLAG_RQ_INLINE) && 946 + hns_roce_qp_has_rq(init_attr)) 947 + free_rq_inline_buf(hr_qp); 1012 948 1013 949 err_out: 1014 950 return ret; ··· 1016 958 struct ib_udata *udata) 1017 959 { 1018 960 struct hns_roce_dev *hr_dev = to_hr_dev(pd->device); 1019 - struct device *dev = hr_dev->dev; 961 + struct ib_device *ibdev = &hr_dev->ib_dev; 1020 962 struct hns_roce_sqp *hr_sqp; 1021 963 struct hns_roce_qp *hr_qp; 1022 964 int ret; ··· 1030 972 ret = hns_roce_create_qp_common(hr_dev, pd, init_attr, udata, 0, 1031 973 hr_qp); 1032 974 if (ret) { 1033 - dev_err(dev, "Create RC QP failed\n"); 975 + ibdev_err(ibdev, "Create RC QP 0x%06lx failed(%d)\n", 976 + hr_qp->qpn, ret); 1034 977 kfree(hr_qp); 1035 978 return ERR_PTR(ret); 1036 979 } ··· 1043 984 case IB_QPT_GSI: { 1044 985 /* Userspace is not allowed to create special QPs: */ 1045 986 if (udata) { 1046 - dev_err(dev, "not support usr space GSI\n"); 987 + ibdev_err(ibdev, "not support usr space GSI\n"); 1047 988 return ERR_PTR(-EINVAL); 1048 989 } 1049 990 ··· 1065 1006 ret = hns_roce_create_qp_common(hr_dev, pd, init_attr, udata, 1066 1007 hr_qp->ibqp.qp_num, hr_qp); 1067 1008 if (ret) { 1068 - dev_err(dev, "Create GSI QP failed!\n"); 1009 + ibdev_err(ibdev, "Create GSI QP failed!\n"); 1069 1010 kfree(hr_sqp); 1070 1011 return ERR_PTR(ret); 1071 1012 } ··· 1073 1014 break; 1074 1015 } 1075 1016 default:{ 1076 - dev_err(dev, "not support QP type %d\n", init_attr->qp_type); 1017 + ibdev_err(ibdev, "not support QP type %d\n", 1018 + init_attr->qp_type); 1077 1019 return ERR_PTR(-EINVAL); 1078 1020 } 1079 1021 } ··· 1100 1040 return transport_type; 1101 1041 } 1102 1042 1043 + static int check_mtu_validate(struct hns_roce_dev *hr_dev, 1044 + struct hns_roce_qp *hr_qp, 1045 + struct ib_qp_attr *attr, int attr_mask) 1046 + { 1047 + enum ib_mtu active_mtu; 1048 + int p; 1049 + 1050 + p = attr_mask & IB_QP_PORT ? (attr->port_num - 1) : hr_qp->port; 1051 + active_mtu = iboe_get_mtu(hr_dev->iboe.netdevs[p]->mtu); 1052 + 1053 + if ((hr_dev->caps.max_mtu >= IB_MTU_2048 && 1054 + attr->path_mtu > hr_dev->caps.max_mtu) || 1055 + attr->path_mtu < IB_MTU_256 || attr->path_mtu > active_mtu) { 1056 + ibdev_err(&hr_dev->ib_dev, 1057 + "attr path_mtu(%d)invalid while modify qp", 1058 + attr->path_mtu); 1059 + return -EINVAL; 1060 + } 1061 + 1062 + return 0; 1063 + } 1064 + 1065 + static int hns_roce_check_qp_attr(struct ib_qp *ibqp, struct ib_qp_attr *attr, 1066 + int attr_mask) 1067 + { 1068 + struct hns_roce_dev *hr_dev = to_hr_dev(ibqp->device); 1069 + struct hns_roce_qp *hr_qp = to_hr_qp(ibqp); 1070 + int p; 1071 + 1072 + if ((attr_mask & IB_QP_PORT) && 1073 + (attr->port_num == 0 || attr->port_num > hr_dev->caps.num_ports)) { 1074 + ibdev_err(&hr_dev->ib_dev, 1075 + "attr port_num invalid.attr->port_num=%d\n", 1076 + attr->port_num); 1077 + return -EINVAL; 1078 + } 1079 + 1080 + if (attr_mask & IB_QP_PKEY_INDEX) { 1081 + p = attr_mask & IB_QP_PORT ? (attr->port_num - 1) : hr_qp->port; 1082 + if (attr->pkey_index >= hr_dev->caps.pkey_table_len[p]) { 1083 + ibdev_err(&hr_dev->ib_dev, 1084 + "attr pkey_index invalid.attr->pkey_index=%d\n", 1085 + attr->pkey_index); 1086 + return -EINVAL; 1087 + } 1088 + } 1089 + 1090 + if (attr_mask & IB_QP_MAX_QP_RD_ATOMIC && 1091 + attr->max_rd_atomic > hr_dev->caps.max_qp_init_rdma) { 1092 + ibdev_err(&hr_dev->ib_dev, 1093 + "attr max_rd_atomic invalid.attr->max_rd_atomic=%d\n", 1094 + attr->max_rd_atomic); 1095 + return -EINVAL; 1096 + } 1097 + 1098 + if (attr_mask & IB_QP_MAX_DEST_RD_ATOMIC && 1099 + attr->max_dest_rd_atomic > hr_dev->caps.max_qp_dest_rdma) { 1100 + ibdev_err(&hr_dev->ib_dev, 1101 + "attr max_dest_rd_atomic invalid.attr->max_dest_rd_atomic=%d\n", 1102 + attr->max_dest_rd_atomic); 1103 + return -EINVAL; 1104 + } 1105 + 1106 + if (attr_mask & IB_QP_PATH_MTU) 1107 + return check_mtu_validate(hr_dev, hr_qp, attr, attr_mask); 1108 + 1109 + return 0; 1110 + } 1111 + 1103 1112 int hns_roce_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr, 1104 1113 int attr_mask, struct ib_udata *udata) 1105 1114 { 1106 1115 struct hns_roce_dev *hr_dev = to_hr_dev(ibqp->device); 1107 1116 struct hns_roce_qp *hr_qp = to_hr_qp(ibqp); 1108 1117 enum ib_qp_state cur_state, new_state; 1109 - struct device *dev = hr_dev->dev; 1110 1118 int ret = -EINVAL; 1111 - int p; 1112 - enum ib_mtu active_mtu; 1113 1119 1114 1120 mutex_lock(&hr_qp->mutex); 1115 1121 1116 1122 cur_state = attr_mask & IB_QP_CUR_STATE ? 1117 1123 attr->cur_qp_state : (enum ib_qp_state)hr_qp->state; 1118 - new_state = attr_mask & IB_QP_STATE ? 1119 - attr->qp_state : cur_state; 1124 + new_state = attr_mask & IB_QP_STATE ? attr->qp_state : cur_state; 1120 1125 1121 1126 if (ibqp->uobject && 1122 1127 (attr_mask & IB_QP_STATE) && new_state == IB_QPS_ERR) { ··· 1191 1066 if (hr_qp->rdb_en == 1) 1192 1067 hr_qp->rq.head = *(int *)(hr_qp->rdb.virt_addr); 1193 1068 } else { 1194 - dev_warn(dev, "flush cqe is not supported in userspace!\n"); 1069 + ibdev_warn(&hr_dev->ib_dev, 1070 + "flush cqe is not supported in userspace!\n"); 1195 1071 goto out; 1196 1072 } 1197 1073 } 1198 1074 1199 1075 if (!ib_modify_qp_is_ok(cur_state, new_state, ibqp->qp_type, 1200 1076 attr_mask)) { 1201 - dev_err(dev, "ib_modify_qp_is_ok failed\n"); 1077 + ibdev_err(&hr_dev->ib_dev, "ib_modify_qp_is_ok failed\n"); 1202 1078 goto out; 1203 1079 } 1204 1080 1205 - if ((attr_mask & IB_QP_PORT) && 1206 - (attr->port_num == 0 || attr->port_num > hr_dev->caps.num_ports)) { 1207 - dev_err(dev, "attr port_num invalid.attr->port_num=%d\n", 1208 - attr->port_num); 1081 + ret = hns_roce_check_qp_attr(ibqp, attr, attr_mask); 1082 + if (ret) 1209 1083 goto out; 1210 - } 1211 - 1212 - if (attr_mask & IB_QP_PKEY_INDEX) { 1213 - p = attr_mask & IB_QP_PORT ? (attr->port_num - 1) : hr_qp->port; 1214 - if (attr->pkey_index >= hr_dev->caps.pkey_table_len[p]) { 1215 - dev_err(dev, "attr pkey_index invalid.attr->pkey_index=%d\n", 1216 - attr->pkey_index); 1217 - goto out; 1218 - } 1219 - } 1220 - 1221 - if (attr_mask & IB_QP_PATH_MTU) { 1222 - p = attr_mask & IB_QP_PORT ? (attr->port_num - 1) : hr_qp->port; 1223 - active_mtu = iboe_get_mtu(hr_dev->iboe.netdevs[p]->mtu); 1224 - 1225 - if ((hr_dev->caps.max_mtu == IB_MTU_4096 && 1226 - attr->path_mtu > IB_MTU_4096) || 1227 - (hr_dev->caps.max_mtu == IB_MTU_2048 && 1228 - attr->path_mtu > IB_MTU_2048) || 1229 - attr->path_mtu < IB_MTU_256 || 1230 - attr->path_mtu > active_mtu) { 1231 - dev_err(dev, "attr path_mtu(%d)invalid while modify qp", 1232 - attr->path_mtu); 1233 - goto out; 1234 - } 1235 - } 1236 - 1237 - if (attr_mask & IB_QP_MAX_QP_RD_ATOMIC && 1238 - attr->max_rd_atomic > hr_dev->caps.max_qp_init_rdma) { 1239 - dev_err(dev, "attr max_rd_atomic invalid.attr->max_rd_atomic=%d\n", 1240 - attr->max_rd_atomic); 1241 - goto out; 1242 - } 1243 - 1244 - if (attr_mask & IB_QP_MAX_DEST_RD_ATOMIC && 1245 - attr->max_dest_rd_atomic > hr_dev->caps.max_qp_dest_rdma) { 1246 - dev_err(dev, "attr max_dest_rd_atomic invalid.attr->max_dest_rd_atomic=%d\n", 1247 - attr->max_dest_rd_atomic); 1248 - goto out; 1249 - } 1250 1084 1251 1085 if (cur_state == new_state && cur_state == IB_QPS_RESET) { 1252 1086 if (hr_dev->caps.min_wqes) { 1253 1087 ret = -EPERM; 1254 - dev_err(dev, "cur_state=%d new_state=%d\n", cur_state, 1088 + ibdev_err(&hr_dev->ib_dev, 1089 + "cur_state=%d new_state=%d\n", cur_state, 1255 1090 new_state); 1256 1091 } else { 1257 1092 ret = 0;
+168 -128
drivers/infiniband/hw/hns/hns_roce_srq.c
··· 175 175 hns_roce_bitmap_free(&srq_table->bitmap, srq->srqn, BITMAP_NO_RR); 176 176 } 177 177 178 + static int create_user_srq(struct hns_roce_srq *srq, struct ib_udata *udata, 179 + int srq_buf_size) 180 + { 181 + struct hns_roce_dev *hr_dev = to_hr_dev(srq->ibsrq.device); 182 + struct hns_roce_ib_create_srq ucmd; 183 + u32 page_shift; 184 + u32 npages; 185 + int ret; 186 + 187 + if (ib_copy_from_udata(&ucmd, udata, sizeof(ucmd))) 188 + return -EFAULT; 189 + 190 + srq->umem = ib_umem_get(udata, ucmd.buf_addr, srq_buf_size, 0, 0); 191 + if (IS_ERR(srq->umem)) 192 + return PTR_ERR(srq->umem); 193 + 194 + npages = (ib_umem_page_count(srq->umem) + 195 + (1 << hr_dev->caps.srqwqe_buf_pg_sz) - 1) / 196 + (1 << hr_dev->caps.srqwqe_buf_pg_sz); 197 + page_shift = PAGE_SHIFT + hr_dev->caps.srqwqe_buf_pg_sz; 198 + ret = hns_roce_mtt_init(hr_dev, npages, page_shift, &srq->mtt); 199 + if (ret) 200 + goto err_user_buf; 201 + 202 + ret = hns_roce_ib_umem_write_mtt(hr_dev, &srq->mtt, srq->umem); 203 + if (ret) 204 + goto err_user_srq_mtt; 205 + 206 + /* config index queue BA */ 207 + srq->idx_que.umem = ib_umem_get(udata, ucmd.que_addr, 208 + srq->idx_que.buf_size, 0, 0); 209 + if (IS_ERR(srq->idx_que.umem)) { 210 + dev_err(hr_dev->dev, "ib_umem_get error for index queue\n"); 211 + ret = PTR_ERR(srq->idx_que.umem); 212 + goto err_user_srq_mtt; 213 + } 214 + 215 + ret = hns_roce_mtt_init(hr_dev, ib_umem_page_count(srq->idx_que.umem), 216 + PAGE_SHIFT, &srq->idx_que.mtt); 217 + 218 + if (ret) { 219 + dev_err(hr_dev->dev, "hns_roce_mtt_init error for idx que\n"); 220 + goto err_user_idx_mtt; 221 + } 222 + 223 + ret = hns_roce_ib_umem_write_mtt(hr_dev, &srq->idx_que.mtt, 224 + srq->idx_que.umem); 225 + if (ret) { 226 + dev_err(hr_dev->dev, 227 + "hns_roce_ib_umem_write_mtt error for idx que\n"); 228 + goto err_user_idx_buf; 229 + } 230 + 231 + return 0; 232 + 233 + err_user_idx_buf: 234 + hns_roce_mtt_cleanup(hr_dev, &srq->idx_que.mtt); 235 + 236 + err_user_idx_mtt: 237 + ib_umem_release(srq->idx_que.umem); 238 + 239 + err_user_srq_mtt: 240 + hns_roce_mtt_cleanup(hr_dev, &srq->mtt); 241 + 242 + err_user_buf: 243 + ib_umem_release(srq->umem); 244 + 245 + return ret; 246 + } 247 + 178 248 static int hns_roce_create_idx_que(struct ib_pd *pd, struct hns_roce_srq *srq, 179 249 u32 page_shift) 180 250 { ··· 266 196 return 0; 267 197 } 268 198 199 + static int create_kernel_srq(struct hns_roce_srq *srq, int srq_buf_size) 200 + { 201 + struct hns_roce_dev *hr_dev = to_hr_dev(srq->ibsrq.device); 202 + u32 page_shift = PAGE_SHIFT + hr_dev->caps.srqwqe_buf_pg_sz; 203 + int ret; 204 + 205 + if (hns_roce_buf_alloc(hr_dev, srq_buf_size, (1 << page_shift) * 2, 206 + &srq->buf, page_shift)) 207 + return -ENOMEM; 208 + 209 + srq->head = 0; 210 + srq->tail = srq->max - 1; 211 + 212 + ret = hns_roce_mtt_init(hr_dev, srq->buf.npages, srq->buf.page_shift, 213 + &srq->mtt); 214 + if (ret) 215 + goto err_kernel_buf; 216 + 217 + ret = hns_roce_buf_write_mtt(hr_dev, &srq->mtt, &srq->buf); 218 + if (ret) 219 + goto err_kernel_srq_mtt; 220 + 221 + page_shift = PAGE_SHIFT + hr_dev->caps.idx_buf_pg_sz; 222 + ret = hns_roce_create_idx_que(srq->ibsrq.pd, srq, page_shift); 223 + if (ret) { 224 + dev_err(hr_dev->dev, "Create idx queue fail(%d)!\n", ret); 225 + goto err_kernel_srq_mtt; 226 + } 227 + 228 + /* Init mtt table for idx_que */ 229 + ret = hns_roce_mtt_init(hr_dev, srq->idx_que.idx_buf.npages, 230 + srq->idx_que.idx_buf.page_shift, 231 + &srq->idx_que.mtt); 232 + if (ret) 233 + goto err_kernel_create_idx; 234 + 235 + /* Write buffer address into the mtt table */ 236 + ret = hns_roce_buf_write_mtt(hr_dev, &srq->idx_que.mtt, 237 + &srq->idx_que.idx_buf); 238 + if (ret) 239 + goto err_kernel_idx_buf; 240 + 241 + srq->wrid = kvmalloc_array(srq->max, sizeof(u64), GFP_KERNEL); 242 + if (!srq->wrid) { 243 + ret = -ENOMEM; 244 + goto err_kernel_idx_buf; 245 + } 246 + 247 + return 0; 248 + 249 + err_kernel_idx_buf: 250 + hns_roce_mtt_cleanup(hr_dev, &srq->idx_que.mtt); 251 + 252 + err_kernel_create_idx: 253 + hns_roce_buf_free(hr_dev, srq->idx_que.buf_size, 254 + &srq->idx_que.idx_buf); 255 + kfree(srq->idx_que.bitmap); 256 + 257 + err_kernel_srq_mtt: 258 + hns_roce_mtt_cleanup(hr_dev, &srq->mtt); 259 + 260 + err_kernel_buf: 261 + hns_roce_buf_free(hr_dev, srq_buf_size, &srq->buf); 262 + 263 + return ret; 264 + } 265 + 266 + static void destroy_user_srq(struct hns_roce_dev *hr_dev, 267 + struct hns_roce_srq *srq) 268 + { 269 + hns_roce_mtt_cleanup(hr_dev, &srq->idx_que.mtt); 270 + ib_umem_release(srq->idx_que.umem); 271 + hns_roce_mtt_cleanup(hr_dev, &srq->mtt); 272 + ib_umem_release(srq->umem); 273 + } 274 + 275 + static void destroy_kernel_srq(struct hns_roce_dev *hr_dev, 276 + struct hns_roce_srq *srq, int srq_buf_size) 277 + { 278 + kvfree(srq->wrid); 279 + hns_roce_mtt_cleanup(hr_dev, &srq->idx_que.mtt); 280 + hns_roce_buf_free(hr_dev, srq->idx_que.buf_size, &srq->idx_que.idx_buf); 281 + kfree(srq->idx_que.bitmap); 282 + hns_roce_mtt_cleanup(hr_dev, &srq->mtt); 283 + hns_roce_buf_free(hr_dev, srq_buf_size, &srq->buf); 284 + } 285 + 269 286 int hns_roce_create_srq(struct ib_srq *ib_srq, 270 287 struct ib_srq_init_attr *srq_init_attr, 271 288 struct ib_udata *udata) ··· 362 205 struct hns_roce_srq *srq = to_hr_srq(ib_srq); 363 206 int srq_desc_size; 364 207 int srq_buf_size; 365 - u32 page_shift; 366 208 int ret = 0; 367 - u32 npages; 368 209 u32 cqn; 369 210 370 211 /* Check the actual SRQ wqe and SRQ sge num */ ··· 388 233 srq->idx_que.mtt.mtt_type = MTT_TYPE_IDX; 389 234 390 235 if (udata) { 391 - struct hns_roce_ib_create_srq ucmd; 392 - 393 - if (ib_copy_from_udata(&ucmd, udata, sizeof(ucmd))) 394 - return -EFAULT; 395 - 396 - srq->umem = 397 - ib_umem_get(udata, ucmd.buf_addr, srq_buf_size, 0, 0); 398 - if (IS_ERR(srq->umem)) 399 - return PTR_ERR(srq->umem); 400 - 401 - if (hr_dev->caps.srqwqe_buf_pg_sz) { 402 - npages = (ib_umem_page_count(srq->umem) + 403 - (1 << hr_dev->caps.srqwqe_buf_pg_sz) - 1) / 404 - (1 << hr_dev->caps.srqwqe_buf_pg_sz); 405 - page_shift = PAGE_SHIFT + hr_dev->caps.srqwqe_buf_pg_sz; 406 - ret = hns_roce_mtt_init(hr_dev, npages, 407 - page_shift, 408 - &srq->mtt); 409 - } else 410 - ret = hns_roce_mtt_init(hr_dev, 411 - ib_umem_page_count(srq->umem), 412 - PAGE_SHIFT, &srq->mtt); 413 - if (ret) 414 - goto err_buf; 415 - 416 - ret = hns_roce_ib_umem_write_mtt(hr_dev, &srq->mtt, srq->umem); 417 - if (ret) 418 - goto err_srq_mtt; 419 - 420 - /* config index queue BA */ 421 - srq->idx_que.umem = ib_umem_get(udata, ucmd.que_addr, 422 - srq->idx_que.buf_size, 0, 0); 423 - if (IS_ERR(srq->idx_que.umem)) { 424 - dev_err(hr_dev->dev, 425 - "ib_umem_get error for index queue\n"); 426 - ret = PTR_ERR(srq->idx_que.umem); 427 - goto err_srq_mtt; 428 - } 429 - 430 - if (hr_dev->caps.idx_buf_pg_sz) { 431 - npages = (ib_umem_page_count(srq->idx_que.umem) + 432 - (1 << hr_dev->caps.idx_buf_pg_sz) - 1) / 433 - (1 << hr_dev->caps.idx_buf_pg_sz); 434 - page_shift = PAGE_SHIFT + hr_dev->caps.idx_buf_pg_sz; 435 - ret = hns_roce_mtt_init(hr_dev, npages, 436 - page_shift, &srq->idx_que.mtt); 437 - } else { 438 - ret = hns_roce_mtt_init( 439 - hr_dev, ib_umem_page_count(srq->idx_que.umem), 440 - PAGE_SHIFT, &srq->idx_que.mtt); 441 - } 442 - 236 + ret = create_user_srq(srq, udata, srq_buf_size); 443 237 if (ret) { 444 - dev_err(hr_dev->dev, 445 - "hns_roce_mtt_init error for idx que\n"); 446 - goto err_idx_mtt; 447 - } 448 - 449 - ret = hns_roce_ib_umem_write_mtt(hr_dev, &srq->idx_que.mtt, 450 - srq->idx_que.umem); 451 - if (ret) { 452 - dev_err(hr_dev->dev, 453 - "hns_roce_ib_umem_write_mtt error for idx que\n"); 454 - goto err_idx_buf; 238 + dev_err(hr_dev->dev, "Create user srq failed\n"); 239 + goto err_srq; 455 240 } 456 241 } else { 457 - page_shift = PAGE_SHIFT + hr_dev->caps.srqwqe_buf_pg_sz; 458 - if (hns_roce_buf_alloc(hr_dev, srq_buf_size, 459 - (1 << page_shift) * 2, &srq->buf, 460 - page_shift)) 461 - return -ENOMEM; 462 - 463 - srq->head = 0; 464 - srq->tail = srq->max - 1; 465 - 466 - ret = hns_roce_mtt_init(hr_dev, srq->buf.npages, 467 - srq->buf.page_shift, &srq->mtt); 468 - if (ret) 469 - goto err_buf; 470 - 471 - ret = hns_roce_buf_write_mtt(hr_dev, &srq->mtt, &srq->buf); 472 - if (ret) 473 - goto err_srq_mtt; 474 - 475 - page_shift = PAGE_SHIFT + hr_dev->caps.idx_buf_pg_sz; 476 - ret = hns_roce_create_idx_que(ib_srq->pd, srq, page_shift); 242 + ret = create_kernel_srq(srq, srq_buf_size); 477 243 if (ret) { 478 - dev_err(hr_dev->dev, "Create idx queue fail(%d)!\n", 479 - ret); 480 - goto err_srq_mtt; 481 - } 482 - 483 - /* Init mtt table for idx_que */ 484 - ret = hns_roce_mtt_init(hr_dev, srq->idx_que.idx_buf.npages, 485 - srq->idx_que.idx_buf.page_shift, 486 - &srq->idx_que.mtt); 487 - if (ret) 488 - goto err_create_idx; 489 - 490 - /* Write buffer address into the mtt table */ 491 - ret = hns_roce_buf_write_mtt(hr_dev, &srq->idx_que.mtt, 492 - &srq->idx_que.idx_buf); 493 - if (ret) 494 - goto err_idx_buf; 495 - 496 - srq->wrid = kvmalloc_array(srq->max, sizeof(u64), GFP_KERNEL); 497 - if (!srq->wrid) { 498 - ret = -ENOMEM; 499 - goto err_idx_buf; 244 + dev_err(hr_dev->dev, "Create kernel srq failed\n"); 245 + goto err_srq; 500 246 } 501 247 } 502 248 ··· 412 356 goto err_wrid; 413 357 414 358 srq->event = hns_roce_ib_srq_event; 415 - srq->ibsrq.ext.xrc.srq_num = srq->srqn; 416 359 resp.srqn = srq->srqn; 417 360 418 361 if (udata) { ··· 428 373 hns_roce_srq_free(hr_dev, srq); 429 374 430 375 err_wrid: 431 - kvfree(srq->wrid); 376 + if (udata) 377 + destroy_user_srq(hr_dev, srq); 378 + else 379 + destroy_kernel_srq(hr_dev, srq, srq_buf_size); 432 380 433 - err_idx_buf: 434 - hns_roce_mtt_cleanup(hr_dev, &srq->idx_que.mtt); 435 - 436 - err_idx_mtt: 437 - ib_umem_release(srq->idx_que.umem); 438 - 439 - err_create_idx: 440 - hns_roce_buf_free(hr_dev, srq->idx_que.buf_size, 441 - &srq->idx_que.idx_buf); 442 - bitmap_free(srq->idx_que.bitmap); 443 - 444 - err_srq_mtt: 445 - hns_roce_mtt_cleanup(hr_dev, &srq->mtt); 446 - 447 - err_buf: 448 - ib_umem_release(srq->umem); 449 - if (!udata) 450 - hns_roce_buf_free(hr_dev, srq_buf_size, &srq->buf); 451 - 381 + err_srq: 452 382 return ret; 453 383 } 454 384
-11
drivers/infiniband/hw/i40iw/i40iw_verbs.c
··· 97 97 u8 port, 98 98 struct ib_port_attr *props) 99 99 { 100 - struct i40iw_device *iwdev = to_iwdev(ibdev); 101 - struct net_device *netdev = iwdev->netdev; 102 - 103 - /* props being zeroed by the caller, avoid zeroing it here */ 104 - props->max_mtu = IB_MTU_4096; 105 - props->active_mtu = ib_mtu_int_to_enum(netdev->mtu); 106 - 107 100 props->lid = 1; 108 - if (netif_carrier_ok(iwdev->netdev)) 109 - props->state = IB_PORT_ACTIVE; 110 - else 111 - props->state = IB_PORT_DOWN; 112 101 props->port_cap_flags = IB_PORT_CM_SUP | IB_PORT_REINIT_SUP | 113 102 IB_PORT_VENDOR_CLASS_SUP | IB_PORT_BOOT_MGMT_SUP; 114 103 props->gid_tbl_len = 1;
+2 -1
drivers/infiniband/hw/mlx4/main.c
··· 734 734 735 735 static u8 state_to_phys_state(enum ib_port_state state) 736 736 { 737 - return state == IB_PORT_ACTIVE ? 5 : 3; 737 + return state == IB_PORT_ACTIVE ? 738 + IB_PORT_PHYS_STATE_LINK_UP : IB_PORT_PHYS_STATE_DISABLED; 738 739 } 739 740 740 741 static int eth_link_query_port(struct ib_device *ibdev, u8 port,
+4 -3
drivers/infiniband/hw/mlx4/mr.c
··· 377 377 * again 378 378 */ 379 379 if (!ib_access_writable(access_flags)) { 380 + unsigned long untagged_start = untagged_addr(start); 380 381 struct vm_area_struct *vma; 381 382 382 383 down_read(&current->mm->mmap_sem); ··· 386 385 * cover the memory, but for now it requires a single vma to 387 386 * entirely cover the MR to support RO mappings. 388 387 */ 389 - vma = find_vma(current->mm, start); 390 - if (vma && vma->vm_end >= start + length && 391 - vma->vm_start <= start) { 388 + vma = find_vma(current->mm, untagged_start); 389 + if (vma && vma->vm_end >= untagged_start + length && 390 + vma->vm_start <= untagged_start) { 392 391 if (vma->vm_flags & VM_WRITE) 393 392 access_flags |= IB_ACCESS_LOCAL_WRITE; 394 393 } else {
+157 -85
drivers/infiniband/hw/mlx4/qp.c
··· 325 325 } 326 326 327 327 static int set_rq_size(struct mlx4_ib_dev *dev, struct ib_qp_cap *cap, 328 - bool is_user, int has_rq, struct mlx4_ib_qp *qp, 328 + bool is_user, bool has_rq, struct mlx4_ib_qp *qp, 329 329 u32 inl_recv_sz) 330 330 { 331 331 /* Sanity check RQ size before proceeding */ ··· 506 506 kfree(qp->sqp_proxy_rcv); 507 507 } 508 508 509 - static int qp_has_rq(struct ib_qp_init_attr *attr) 509 + static bool qp_has_rq(struct ib_qp_init_attr *attr) 510 510 { 511 511 if (attr->qp_type == IB_QPT_XRC_INI || attr->qp_type == IB_QPT_XRC_TGT) 512 - return 0; 512 + return false; 513 513 514 514 return !attr->srq; 515 515 } ··· 855 855 mutex_unlock(&context->wqn_ranges_mutex); 856 856 } 857 857 858 - static int create_qp_common(struct mlx4_ib_dev *dev, struct ib_pd *pd, 859 - enum mlx4_ib_source_type src, 860 - struct ib_qp_init_attr *init_attr, 858 + static int create_rq(struct ib_pd *pd, struct ib_qp_init_attr *init_attr, 859 + struct ib_udata *udata, struct mlx4_ib_qp *qp) 860 + { 861 + struct mlx4_ib_dev *dev = to_mdev(pd->device); 862 + int qpn; 863 + int err; 864 + struct mlx4_ib_ucontext *context = rdma_udata_to_drv_context( 865 + udata, struct mlx4_ib_ucontext, ibucontext); 866 + struct mlx4_ib_cq *mcq; 867 + unsigned long flags; 868 + int range_size; 869 + struct mlx4_ib_create_wq wq; 870 + size_t copy_len; 871 + int shift; 872 + int n; 873 + 874 + qp->mlx4_ib_qp_type = MLX4_IB_QPT_RAW_PACKET; 875 + 876 + mutex_init(&qp->mutex); 877 + spin_lock_init(&qp->sq.lock); 878 + spin_lock_init(&qp->rq.lock); 879 + INIT_LIST_HEAD(&qp->gid_list); 880 + INIT_LIST_HEAD(&qp->steering_rules); 881 + 882 + qp->state = IB_QPS_RESET; 883 + 884 + copy_len = min(sizeof(struct mlx4_ib_create_wq), udata->inlen); 885 + 886 + if (ib_copy_from_udata(&wq, udata, copy_len)) { 887 + err = -EFAULT; 888 + goto err; 889 + } 890 + 891 + if (wq.comp_mask || wq.reserved[0] || wq.reserved[1] || 892 + wq.reserved[2]) { 893 + pr_debug("user command isn't supported\n"); 894 + err = -EOPNOTSUPP; 895 + goto err; 896 + } 897 + 898 + if (wq.log_range_size > ilog2(dev->dev->caps.max_rss_tbl_sz)) { 899 + pr_debug("WQN range size must be equal or smaller than %d\n", 900 + dev->dev->caps.max_rss_tbl_sz); 901 + err = -EOPNOTSUPP; 902 + goto err; 903 + } 904 + range_size = 1 << wq.log_range_size; 905 + 906 + if (init_attr->create_flags & IB_QP_CREATE_SCATTER_FCS) 907 + qp->flags |= MLX4_IB_QP_SCATTER_FCS; 908 + 909 + err = set_rq_size(dev, &init_attr->cap, true, true, qp, qp->inl_recv_sz); 910 + if (err) 911 + goto err; 912 + 913 + qp->sq_no_prefetch = 1; 914 + qp->sq.wqe_cnt = 1; 915 + qp->sq.wqe_shift = MLX4_IB_MIN_SQ_STRIDE; 916 + qp->buf_size = (qp->rq.wqe_cnt << qp->rq.wqe_shift) + 917 + (qp->sq.wqe_cnt << qp->sq.wqe_shift); 918 + 919 + qp->umem = ib_umem_get(udata, wq.buf_addr, qp->buf_size, 0, 0); 920 + if (IS_ERR(qp->umem)) { 921 + err = PTR_ERR(qp->umem); 922 + goto err; 923 + } 924 + 925 + n = ib_umem_page_count(qp->umem); 926 + shift = mlx4_ib_umem_calc_optimal_mtt_size(qp->umem, 0, &n); 927 + err = mlx4_mtt_init(dev->dev, n, shift, &qp->mtt); 928 + 929 + if (err) 930 + goto err_buf; 931 + 932 + err = mlx4_ib_umem_write_mtt(dev, &qp->mtt, qp->umem); 933 + if (err) 934 + goto err_mtt; 935 + 936 + err = mlx4_ib_db_map_user(udata, wq.db_addr, &qp->db); 937 + if (err) 938 + goto err_mtt; 939 + qp->mqp.usage = MLX4_RES_USAGE_USER_VERBS; 940 + 941 + err = mlx4_ib_alloc_wqn(context, qp, range_size, &qpn); 942 + if (err) 943 + goto err_wrid; 944 + 945 + err = mlx4_qp_alloc(dev->dev, qpn, &qp->mqp); 946 + if (err) 947 + goto err_qpn; 948 + 949 + /* 950 + * Hardware wants QPN written in big-endian order (after 951 + * shifting) for send doorbell. Precompute this value to save 952 + * a little bit when posting sends. 953 + */ 954 + qp->doorbell_qpn = swab32(qp->mqp.qpn << 8); 955 + 956 + qp->mqp.event = mlx4_ib_wq_event; 957 + 958 + spin_lock_irqsave(&dev->reset_flow_resource_lock, flags); 959 + mlx4_ib_lock_cqs(to_mcq(init_attr->send_cq), 960 + to_mcq(init_attr->recv_cq)); 961 + /* Maintain device to QPs access, needed for further handling 962 + * via reset flow 963 + */ 964 + list_add_tail(&qp->qps_list, &dev->qp_list); 965 + /* Maintain CQ to QPs access, needed for further handling 966 + * via reset flow 967 + */ 968 + mcq = to_mcq(init_attr->send_cq); 969 + list_add_tail(&qp->cq_send_list, &mcq->send_qp_list); 970 + mcq = to_mcq(init_attr->recv_cq); 971 + list_add_tail(&qp->cq_recv_list, &mcq->recv_qp_list); 972 + mlx4_ib_unlock_cqs(to_mcq(init_attr->send_cq), 973 + to_mcq(init_attr->recv_cq)); 974 + spin_unlock_irqrestore(&dev->reset_flow_resource_lock, flags); 975 + return 0; 976 + 977 + err_qpn: 978 + mlx4_ib_release_wqn(context, qp, 0); 979 + err_wrid: 980 + mlx4_ib_db_unmap_user(context, &qp->db); 981 + 982 + err_mtt: 983 + mlx4_mtt_cleanup(dev->dev, &qp->mtt); 984 + err_buf: 985 + ib_umem_release(qp->umem); 986 + err: 987 + return err; 988 + } 989 + 990 + static int create_qp_common(struct ib_pd *pd, struct ib_qp_init_attr *init_attr, 861 991 struct ib_udata *udata, int sqpn, 862 992 struct mlx4_ib_qp **caller_qp) 863 993 { 994 + struct mlx4_ib_dev *dev = to_mdev(pd->device); 864 995 int qpn; 865 996 int err; 866 997 struct mlx4_ib_sqp *sqp = NULL; ··· 1001 870 enum mlx4_ib_qp_type qp_type = (enum mlx4_ib_qp_type) init_attr->qp_type; 1002 871 struct mlx4_ib_cq *mcq; 1003 872 unsigned long flags; 1004 - int range_size = 0; 1005 873 1006 874 /* When tunneling special qps, we use a plain UD qp */ 1007 875 if (sqpn) { ··· 1051 921 if (!sqp) 1052 922 return -ENOMEM; 1053 923 qp = &sqp->qp; 1054 - qp->pri.vid = 0xFFFF; 1055 - qp->alt.vid = 0xFFFF; 1056 924 } else { 1057 925 qp = kzalloc(sizeof(struct mlx4_ib_qp), GFP_KERNEL); 1058 926 if (!qp) 1059 927 return -ENOMEM; 1060 - qp->pri.vid = 0xFFFF; 1061 - qp->alt.vid = 0xFFFF; 1062 928 } 929 + qp->pri.vid = 0xFFFF; 930 + qp->alt.vid = 0xFFFF; 1063 931 } else 1064 932 qp = *caller_qp; 1065 933 ··· 1069 941 INIT_LIST_HEAD(&qp->gid_list); 1070 942 INIT_LIST_HEAD(&qp->steering_rules); 1071 943 1072 - qp->state = IB_QPS_RESET; 944 + qp->state = IB_QPS_RESET; 1073 945 if (init_attr->sq_sig_type == IB_SIGNAL_ALL_WR) 1074 946 qp->sq_signal_bits = cpu_to_be32(MLX4_WQE_CTRL_CQ_UPDATE); 1075 947 1076 - 1077 948 if (udata) { 1078 - union { 1079 - struct mlx4_ib_create_qp qp; 1080 - struct mlx4_ib_create_wq wq; 1081 - } ucmd; 949 + struct mlx4_ib_create_qp ucmd; 1082 950 size_t copy_len; 1083 951 int shift; 1084 952 int n; 1085 953 1086 - copy_len = (src == MLX4_IB_QP_SRC) ? 1087 - sizeof(struct mlx4_ib_create_qp) : 1088 - min(sizeof(struct mlx4_ib_create_wq), udata->inlen); 954 + copy_len = sizeof(struct mlx4_ib_create_qp); 1089 955 1090 956 if (ib_copy_from_udata(&ucmd, udata, copy_len)) { 1091 957 err = -EFAULT; 1092 958 goto err; 1093 959 } 1094 960 1095 - if (src == MLX4_IB_RWQ_SRC) { 1096 - if (ucmd.wq.comp_mask || ucmd.wq.reserved[0] || 1097 - ucmd.wq.reserved[1] || ucmd.wq.reserved[2]) { 1098 - pr_debug("user command isn't supported\n"); 1099 - err = -EOPNOTSUPP; 1100 - goto err; 1101 - } 1102 - 1103 - if (ucmd.wq.log_range_size > 1104 - ilog2(dev->dev->caps.max_rss_tbl_sz)) { 1105 - pr_debug("WQN range size must be equal or smaller than %d\n", 1106 - dev->dev->caps.max_rss_tbl_sz); 1107 - err = -EOPNOTSUPP; 1108 - goto err; 1109 - } 1110 - range_size = 1 << ucmd.wq.log_range_size; 1111 - } else { 1112 - qp->inl_recv_sz = ucmd.qp.inl_recv_sz; 1113 - } 961 + qp->inl_recv_sz = ucmd.inl_recv_sz; 1114 962 1115 963 if (init_attr->create_flags & IB_QP_CREATE_SCATTER_FCS) { 1116 964 if (!(dev->dev->caps.flags & ··· 1104 1000 if (err) 1105 1001 goto err; 1106 1002 1107 - if (src == MLX4_IB_QP_SRC) { 1108 - qp->sq_no_prefetch = ucmd.qp.sq_no_prefetch; 1003 + qp->sq_no_prefetch = ucmd.sq_no_prefetch; 1109 1004 1110 - err = set_user_sq_size(dev, qp, 1111 - (struct mlx4_ib_create_qp *) 1112 - &ucmd); 1113 - if (err) 1114 - goto err; 1115 - } else { 1116 - qp->sq_no_prefetch = 1; 1117 - qp->sq.wqe_cnt = 1; 1118 - qp->sq.wqe_shift = MLX4_IB_MIN_SQ_STRIDE; 1119 - /* Allocated buffer expects to have at least that SQ 1120 - * size. 1121 - */ 1122 - qp->buf_size = (qp->rq.wqe_cnt << qp->rq.wqe_shift) + 1123 - (qp->sq.wqe_cnt << qp->sq.wqe_shift); 1124 - } 1005 + err = set_user_sq_size(dev, qp, &ucmd); 1006 + if (err) 1007 + goto err; 1125 1008 1126 1009 qp->umem = 1127 - ib_umem_get(udata, 1128 - (src == MLX4_IB_QP_SRC) ? ucmd.qp.buf_addr : 1129 - ucmd.wq.buf_addr, 1130 - qp->buf_size, 0, 0); 1010 + ib_umem_get(udata, ucmd.buf_addr, qp->buf_size, 0, 0); 1131 1011 if (IS_ERR(qp->umem)) { 1132 1012 err = PTR_ERR(qp->umem); 1133 1013 goto err; ··· 1129 1041 goto err_mtt; 1130 1042 1131 1043 if (qp_has_rq(init_attr)) { 1132 - err = mlx4_ib_db_map_user(udata, 1133 - (src == MLX4_IB_QP_SRC) ? 1134 - ucmd.qp.db_addr : 1135 - ucmd.wq.db_addr, 1136 - &qp->db); 1044 + err = mlx4_ib_db_map_user(udata, ucmd.db_addr, &qp->db); 1137 1045 if (err) 1138 1046 goto err_mtt; 1139 1047 } ··· 1199 1115 goto err_wrid; 1200 1116 } 1201 1117 } 1202 - } else if (src == MLX4_IB_RWQ_SRC) { 1203 - err = mlx4_ib_alloc_wqn(context, qp, range_size, &qpn); 1204 - if (err) 1205 - goto err_wrid; 1206 1118 } else { 1207 1119 /* Raw packet QPNs may not have bits 6,7 set in their qp_num; 1208 1120 * otherwise, the WQE BlueFlame setup flow wrongly causes ··· 1237 1157 */ 1238 1158 qp->doorbell_qpn = swab32(qp->mqp.qpn << 8); 1239 1159 1240 - qp->mqp.event = (src == MLX4_IB_QP_SRC) ? mlx4_ib_qp_event : 1241 - mlx4_ib_wq_event; 1160 + qp->mqp.event = mlx4_ib_qp_event; 1242 1161 1243 1162 if (!*caller_qp) 1244 1163 *caller_qp = qp; ··· 1265 1186 if (!sqpn) { 1266 1187 if (qp->flags & MLX4_IB_QP_NETIF) 1267 1188 mlx4_ib_steer_qp_free(dev, qpn, 1); 1268 - else if (src == MLX4_IB_RWQ_SRC) 1269 - mlx4_ib_release_wqn(context, qp, 0); 1270 1189 else 1271 1190 mlx4_qp_release_range(dev->dev, qpn, 1); 1272 1191 } ··· 1595 1518 /* fall through */ 1596 1519 case IB_QPT_UD: 1597 1520 { 1598 - err = create_qp_common(to_mdev(pd->device), pd, MLX4_IB_QP_SRC, 1599 - init_attr, udata, 0, &qp); 1521 + err = create_qp_common(pd, init_attr, udata, 0, &qp); 1600 1522 if (err) { 1601 1523 kfree(qp); 1602 1524 return ERR_PTR(err); ··· 1625 1549 sqpn = get_sqp_num(to_mdev(pd->device), init_attr); 1626 1550 } 1627 1551 1628 - err = create_qp_common(to_mdev(pd->device), pd, MLX4_IB_QP_SRC, 1629 - init_attr, udata, sqpn, &qp); 1552 + err = create_qp_common(pd, init_attr, udata, sqpn, &qp); 1630 1553 if (err) 1631 1554 return ERR_PTR(err); 1632 1555 ··· 4122 4047 struct ib_wq_init_attr *init_attr, 4123 4048 struct ib_udata *udata) 4124 4049 { 4125 - struct mlx4_ib_dev *dev; 4126 - struct ib_qp_init_attr ib_qp_init_attr; 4050 + struct mlx4_dev *dev = to_mdev(pd->device)->dev; 4051 + struct ib_qp_init_attr ib_qp_init_attr = {}; 4127 4052 struct mlx4_ib_qp *qp; 4128 4053 struct mlx4_ib_create_wq ucmd; 4129 4054 int err, required_cmd_sz; ··· 4148 4073 if (udata->outlen) 4149 4074 return ERR_PTR(-EOPNOTSUPP); 4150 4075 4151 - dev = to_mdev(pd->device); 4152 - 4153 4076 if (init_attr->wq_type != IB_WQT_RQ) { 4154 4077 pr_debug("unsupported wq type %d\n", init_attr->wq_type); 4155 4078 return ERR_PTR(-EOPNOTSUPP); 4156 4079 } 4157 4080 4158 - if (init_attr->create_flags & ~IB_WQ_FLAGS_SCATTER_FCS) { 4081 + if (init_attr->create_flags & ~IB_WQ_FLAGS_SCATTER_FCS || 4082 + !(dev->caps.flags & MLX4_DEV_CAP_FLAG_FCS_KEEP)) { 4159 4083 pr_debug("unsupported create_flags %u\n", 4160 4084 init_attr->create_flags); 4161 4085 return ERR_PTR(-EOPNOTSUPP); ··· 4167 4093 qp->pri.vid = 0xFFFF; 4168 4094 qp->alt.vid = 0xFFFF; 4169 4095 4170 - memset(&ib_qp_init_attr, 0, sizeof(ib_qp_init_attr)); 4171 4096 ib_qp_init_attr.qp_context = init_attr->wq_context; 4172 4097 ib_qp_init_attr.qp_type = IB_QPT_RAW_PACKET; 4173 4098 ib_qp_init_attr.cap.max_recv_wr = init_attr->max_wr; ··· 4177 4104 if (init_attr->create_flags & IB_WQ_FLAGS_SCATTER_FCS) 4178 4105 ib_qp_init_attr.create_flags |= IB_QP_CREATE_SCATTER_FCS; 4179 4106 4180 - err = create_qp_common(dev, pd, MLX4_IB_RWQ_SRC, &ib_qp_init_attr, 4181 - udata, 0, &qp); 4107 + err = create_rq(pd, &ib_qp_init_attr, udata, qp); 4182 4108 if (err) { 4183 4109 kfree(qp); 4184 4110 return ERR_PTR(err);
+26
drivers/infiniband/hw/mlx5/devx.c
··· 233 233 case MLX5_EVENT_TYPE_SRQ_CATAS_ERROR: 234 234 case MLX5_EVENT_TYPE_DCT_DRAINED: 235 235 case MLX5_EVENT_TYPE_COMP: 236 + case MLX5_EVENT_TYPE_DCT_KEY_VIOLATION: 237 + case MLX5_EVENT_TYPE_XRQ_ERROR: 236 238 return true; 237 239 default: 238 240 return false; ··· 317 315 case MLX5_EVENT_TYPE_SRQ_CATAS_ERROR: 318 316 return eqe->data.qp_srq.type; 319 317 case MLX5_EVENT_TYPE_CQ_ERROR: 318 + case MLX5_EVENT_TYPE_XRQ_ERROR: 320 319 return 0; 321 320 case MLX5_EVENT_TYPE_DCT_DRAINED: 321 + case MLX5_EVENT_TYPE_DCT_KEY_VIOLATION: 322 322 return MLX5_EVENT_QUEUE_TYPE_DCT; 323 323 default: 324 324 return MLX5_GET(affiliated_event_header, &eqe->data, obj_type); ··· 546 542 break; 547 543 case MLX5_CMD_OP_ARM_XRQ: 548 544 case MLX5_CMD_OP_SET_XRQ_DC_PARAMS_ENTRY: 545 + case MLX5_CMD_OP_RELEASE_XRQ_ERROR: 546 + case MLX5_CMD_OP_MODIFY_XRQ: 549 547 obj_id = get_enc_obj_id(MLX5_CMD_OP_CREATE_XRQ, 550 548 MLX5_GET(arm_xrq_in, in, xrqn)); 551 549 break; ··· 782 776 return true; 783 777 return false; 784 778 } 779 + case MLX5_CMD_OP_CREATE_PSV: 780 + { 781 + u8 num_psv = MLX5_GET(create_psv_in, in, num_psv); 782 + 783 + if (num_psv == 1) 784 + return true; 785 + return false; 786 + } 785 787 default: 786 788 return false; 787 789 } ··· 824 810 case MLX5_CMD_OP_ARM_DCT_FOR_KEY_VIOLATION: 825 811 case MLX5_CMD_OP_ARM_XRQ: 826 812 case MLX5_CMD_OP_SET_XRQ_DC_PARAMS_ENTRY: 813 + case MLX5_CMD_OP_RELEASE_XRQ_ERROR: 814 + case MLX5_CMD_OP_MODIFY_XRQ: 827 815 return true; 828 816 case MLX5_CMD_OP_SET_FLOW_TABLE_ENTRY: 829 817 { ··· 1231 1215 break; 1232 1216 case MLX5_CMD_OP_ALLOC_XRCD: 1233 1217 MLX5_SET(general_obj_in_cmd_hdr, din, opcode, MLX5_CMD_OP_DEALLOC_XRCD); 1218 + break; 1219 + case MLX5_CMD_OP_CREATE_PSV: 1220 + MLX5_SET(general_obj_in_cmd_hdr, din, opcode, 1221 + MLX5_CMD_OP_DESTROY_PSV); 1222 + MLX5_SET(destroy_psv_in, din, psvn, 1223 + MLX5_GET(create_psv_out, out, psv0_index)); 1234 1224 break; 1235 1225 default: 1236 1226 /* The entry must match to one of the devx_is_obj_create_cmd */ ··· 2308 2286 case MLX5_EVENT_TYPE_WQ_ACCESS_ERROR: 2309 2287 obj_id = be32_to_cpu(eqe->data.qp_srq.qp_srq_n) & 0xffffff; 2310 2288 break; 2289 + case MLX5_EVENT_TYPE_XRQ_ERROR: 2290 + obj_id = be32_to_cpu(eqe->data.xrq_err.type_xrqn) & 0xffffff; 2291 + break; 2311 2292 case MLX5_EVENT_TYPE_DCT_DRAINED: 2293 + case MLX5_EVENT_TYPE_DCT_KEY_VIOLATION: 2312 2294 obj_id = be32_to_cpu(eqe->data.dct.dctn) & 0xffffff; 2313 2295 break; 2314 2296 case MLX5_EVENT_TYPE_CQ_ERROR:
+11 -2
drivers/infiniband/hw/mlx5/flow.c
··· 32 32 case MLX5_IB_UAPI_FLOW_TABLE_TYPE_FDB: 33 33 *namespace = MLX5_FLOW_NAMESPACE_FDB; 34 34 break; 35 + case MLX5_IB_UAPI_FLOW_TABLE_TYPE_RDMA_RX: 36 + *namespace = MLX5_FLOW_NAMESPACE_RDMA_RX; 37 + break; 35 38 default: 36 39 return -EINVAL; 37 40 } ··· 104 101 if (fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_FDB && !dest_devx) 105 102 return -EINVAL; 106 103 104 + /* Allow only DEVX object or QP as dest when inserting to RDMA_RX */ 105 + if ((fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_RDMA_RX) && 106 + ((!dest_devx && !dest_qp) || (dest_devx && dest_qp))) 107 + return -EINVAL; 108 + 107 109 if (dest_devx) { 108 110 devx_obj = uverbs_attr_get_obj( 109 111 attrs, MLX5_IB_ATTR_CREATE_FLOW_DEST_DEVX); ··· 120 112 */ 121 113 if (!mlx5_ib_devx_is_flow_dest(devx_obj, &dest_id, &dest_type)) 122 114 return -EINVAL; 123 - /* Allow only flow table as dest when inserting to FDB */ 124 - if (fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_FDB && 115 + /* Allow only flow table as dest when inserting to FDB or RDMA_RX */ 116 + if ((fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_FDB || 117 + fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_RDMA_RX) && 125 118 dest_type != MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE) 126 119 return -EINVAL; 127 120 } else if (dest_qp) {
+86 -41
drivers/infiniband/hw/mlx5/main.c
··· 535 535 props->max_msg_sz = 1 << MLX5_CAP_GEN(dev->mdev, log_max_msg); 536 536 props->pkey_tbl_len = 1; 537 537 props->state = IB_PORT_DOWN; 538 - props->phys_state = 3; 538 + props->phys_state = IB_PORT_PHYS_STATE_DISABLED; 539 539 540 540 mlx5_query_nic_vport_qkey_viol_cntr(mdev, &qkey_viol_cntr); 541 541 props->qkey_viol_cntr = qkey_viol_cntr; ··· 561 561 562 562 if (netif_running(ndev) && netif_carrier_ok(ndev)) { 563 563 props->state = IB_PORT_ACTIVE; 564 - props->phys_state = 5; 564 + props->phys_state = IB_PORT_PHYS_STATE_LINK_UP; 565 565 } 566 566 567 567 ndev_ib_mtu = iboe_get_mtu(ndev->mtu); ··· 3971 3971 esw_encap) 3972 3972 flags |= MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT; 3973 3973 priority = FDB_BYPASS_PATH; 3974 + } else if (fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_RDMA_RX) { 3975 + max_table_size = 3976 + BIT(MLX5_CAP_FLOWTABLE_RDMA_RX(dev->mdev, 3977 + log_max_ft_size)); 3978 + priority = fs_matcher->priority; 3974 3979 } 3975 3980 3976 3981 max_table_size = min_t(int, max_table_size, MLX5_FS_MAX_ENTRIES); ··· 3990 3985 prio = &dev->flow_db->egress_prios[priority]; 3991 3986 else if (fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_FDB) 3992 3987 prio = &dev->flow_db->fdb; 3988 + else if (fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_RDMA_RX) 3989 + prio = &dev->flow_db->rdma_rx[priority]; 3993 3990 3994 3991 if (!prio) 3995 3992 return ERR_PTR(-EINVAL); ··· 5333 5326 INIT_EXT_PPCNT_COUNTER(rx_icrc_encapsulated), 5334 5327 }; 5335 5328 5329 + static bool is_mdev_switchdev_mode(const struct mlx5_core_dev *mdev) 5330 + { 5331 + return MLX5_ESWITCH_MANAGER(mdev) && 5332 + mlx5_ib_eswitch_mode(mdev->priv.eswitch) == 5333 + MLX5_ESWITCH_OFFLOADS; 5334 + } 5335 + 5336 5336 static void mlx5_ib_dealloc_counters(struct mlx5_ib_dev *dev) 5337 5337 { 5338 + int num_cnt_ports; 5338 5339 int i; 5339 5340 5340 - for (i = 0; i < dev->num_ports; i++) { 5341 + num_cnt_ports = is_mdev_switchdev_mode(dev->mdev) ? 1 : dev->num_ports; 5342 + 5343 + for (i = 0; i < num_cnt_ports; i++) { 5341 5344 if (dev->port[i].cnts.set_id_valid) 5342 5345 mlx5_core_dealloc_q_counter(dev->mdev, 5343 5346 dev->port[i].cnts.set_id); ··· 5449 5432 5450 5433 static int mlx5_ib_alloc_counters(struct mlx5_ib_dev *dev) 5451 5434 { 5435 + int num_cnt_ports; 5452 5436 int err = 0; 5453 5437 int i; 5454 5438 bool is_shared; 5455 5439 5456 5440 is_shared = MLX5_CAP_GEN(dev->mdev, log_max_uctx) != 0; 5441 + num_cnt_ports = is_mdev_switchdev_mode(dev->mdev) ? 1 : dev->num_ports; 5457 5442 5458 - for (i = 0; i < dev->num_ports; i++) { 5443 + for (i = 0; i < num_cnt_ports; i++) { 5459 5444 err = __mlx5_ib_alloc_counters(dev, &dev->port[i].cnts); 5460 5445 if (err) 5461 5446 goto err_alloc; ··· 5477 5458 } 5478 5459 dev->port[i].cnts.set_id_valid = true; 5479 5460 } 5480 - 5481 5461 return 0; 5482 5462 5483 5463 err_alloc: ··· 5484 5466 return err; 5485 5467 } 5486 5468 5469 + static const struct mlx5_ib_counters *get_counters(struct mlx5_ib_dev *dev, 5470 + u8 port_num) 5471 + { 5472 + return is_mdev_switchdev_mode(dev->mdev) ? &dev->port[0].cnts : 5473 + &dev->port[port_num].cnts; 5474 + } 5475 + 5476 + /** 5477 + * mlx5_ib_get_counters_id - Returns counters id to use for device+port 5478 + * @dev: Pointer to mlx5 IB device 5479 + * @port_num: Zero based port number 5480 + * 5481 + * mlx5_ib_get_counters_id() Returns counters set id to use for given 5482 + * device port combination in switchdev and non switchdev mode of the 5483 + * parent device. 5484 + */ 5485 + u16 mlx5_ib_get_counters_id(struct mlx5_ib_dev *dev, u8 port_num) 5486 + { 5487 + const struct mlx5_ib_counters *cnts = get_counters(dev, port_num); 5488 + 5489 + return cnts->set_id; 5490 + } 5491 + 5487 5492 static struct rdma_hw_stats *mlx5_ib_alloc_hw_stats(struct ib_device *ibdev, 5488 5493 u8 port_num) 5489 5494 { 5490 5495 struct mlx5_ib_dev *dev = to_mdev(ibdev); 5491 - struct mlx5_ib_port *port = &dev->port[port_num - 1]; 5496 + const struct mlx5_ib_counters *cnts; 5497 + bool is_switchdev = is_mdev_switchdev_mode(dev->mdev); 5492 5498 5493 - /* We support only per port stats */ 5494 - if (port_num == 0) 5499 + if ((is_switchdev && port_num) || (!is_switchdev && !port_num)) 5495 5500 return NULL; 5496 5501 5497 - return rdma_alloc_hw_stats_struct(port->cnts.names, 5498 - port->cnts.num_q_counters + 5499 - port->cnts.num_cong_counters + 5500 - port->cnts.num_ext_ppcnt_counters, 5502 + cnts = get_counters(dev, port_num - 1); 5503 + 5504 + return rdma_alloc_hw_stats_struct(cnts->names, 5505 + cnts->num_q_counters + 5506 + cnts->num_cong_counters + 5507 + cnts->num_ext_ppcnt_counters, 5501 5508 RDMA_HW_STATS_DEFAULT_LIFESPAN); 5502 5509 } 5503 5510 5504 5511 static int mlx5_ib_query_q_counters(struct mlx5_core_dev *mdev, 5505 - struct mlx5_ib_port *port, 5512 + const struct mlx5_ib_counters *cnts, 5506 5513 struct rdma_hw_stats *stats, 5507 5514 u16 set_id) 5508 5515 { ··· 5544 5501 if (ret) 5545 5502 goto free; 5546 5503 5547 - for (i = 0; i < port->cnts.num_q_counters; i++) { 5548 - val = *(__be32 *)(out + port->cnts.offsets[i]); 5504 + for (i = 0; i < cnts->num_q_counters; i++) { 5505 + val = *(__be32 *)(out + cnts->offsets[i]); 5549 5506 stats->value[i] = (u64)be32_to_cpu(val); 5550 5507 } 5551 5508 ··· 5555 5512 } 5556 5513 5557 5514 static int mlx5_ib_query_ext_ppcnt_counters(struct mlx5_ib_dev *dev, 5558 - struct mlx5_ib_port *port, 5559 - struct rdma_hw_stats *stats) 5515 + const struct mlx5_ib_counters *cnts, 5516 + struct rdma_hw_stats *stats) 5560 5517 { 5561 - int offset = port->cnts.num_q_counters + port->cnts.num_cong_counters; 5518 + int offset = cnts->num_q_counters + cnts->num_cong_counters; 5562 5519 int sz = MLX5_ST_SZ_BYTES(ppcnt_reg); 5563 5520 int ret, i; 5564 5521 void *out; ··· 5571 5528 if (ret) 5572 5529 goto free; 5573 5530 5574 - for (i = 0; i < port->cnts.num_ext_ppcnt_counters; i++) { 5531 + for (i = 0; i < cnts->num_ext_ppcnt_counters; i++) 5575 5532 stats->value[i + offset] = 5576 5533 be64_to_cpup((__be64 *)(out + 5577 - port->cnts.offsets[i + offset])); 5578 - } 5579 - 5534 + cnts->offsets[i + offset])); 5580 5535 free: 5581 5536 kvfree(out); 5582 5537 return ret; ··· 5585 5544 u8 port_num, int index) 5586 5545 { 5587 5546 struct mlx5_ib_dev *dev = to_mdev(ibdev); 5588 - struct mlx5_ib_port *port = &dev->port[port_num - 1]; 5547 + const struct mlx5_ib_counters *cnts = get_counters(dev, port_num - 1); 5589 5548 struct mlx5_core_dev *mdev; 5590 5549 int ret, num_counters; 5591 5550 u8 mdev_port_num; ··· 5593 5552 if (!stats) 5594 5553 return -EINVAL; 5595 5554 5596 - num_counters = port->cnts.num_q_counters + 5597 - port->cnts.num_cong_counters + 5598 - port->cnts.num_ext_ppcnt_counters; 5555 + num_counters = cnts->num_q_counters + 5556 + cnts->num_cong_counters + 5557 + cnts->num_ext_ppcnt_counters; 5599 5558 5600 5559 /* q_counters are per IB device, query the master mdev */ 5601 - ret = mlx5_ib_query_q_counters(dev->mdev, port, stats, 5602 - port->cnts.set_id); 5560 + ret = mlx5_ib_query_q_counters(dev->mdev, cnts, stats, cnts->set_id); 5603 5561 if (ret) 5604 5562 return ret; 5605 5563 5606 5564 if (MLX5_CAP_PCAM_FEATURE(dev->mdev, rx_icrc_encapsulated_counter)) { 5607 - ret = mlx5_ib_query_ext_ppcnt_counters(dev, port, stats); 5565 + ret = mlx5_ib_query_ext_ppcnt_counters(dev, cnts, stats); 5608 5566 if (ret) 5609 5567 return ret; 5610 5568 } ··· 5620 5580 } 5621 5581 ret = mlx5_lag_query_cong_counters(dev->mdev, 5622 5582 stats->value + 5623 - port->cnts.num_q_counters, 5624 - port->cnts.num_cong_counters, 5625 - port->cnts.offsets + 5626 - port->cnts.num_q_counters); 5583 + cnts->num_q_counters, 5584 + cnts->num_cong_counters, 5585 + cnts->offsets + 5586 + cnts->num_q_counters); 5627 5587 5628 5588 mlx5_ib_put_native_port_mdev(dev, port_num); 5629 5589 if (ret) ··· 5638 5598 mlx5_ib_counter_alloc_stats(struct rdma_counter *counter) 5639 5599 { 5640 5600 struct mlx5_ib_dev *dev = to_mdev(counter->device); 5641 - struct mlx5_ib_port *port = &dev->port[counter->port - 1]; 5601 + const struct mlx5_ib_counters *cnts = 5602 + get_counters(dev, counter->port - 1); 5642 5603 5643 5604 /* Q counters are in the beginning of all counters */ 5644 - return rdma_alloc_hw_stats_struct(port->cnts.names, 5645 - port->cnts.num_q_counters, 5605 + return rdma_alloc_hw_stats_struct(cnts->names, 5606 + cnts->num_q_counters, 5646 5607 RDMA_HW_STATS_DEFAULT_LIFESPAN); 5647 5608 } 5648 5609 5649 5610 static int mlx5_ib_counter_update_stats(struct rdma_counter *counter) 5650 5611 { 5651 5612 struct mlx5_ib_dev *dev = to_mdev(counter->device); 5652 - struct mlx5_ib_port *port = &dev->port[counter->port - 1]; 5613 + const struct mlx5_ib_counters *cnts = 5614 + get_counters(dev, counter->port - 1); 5653 5615 5654 - return mlx5_ib_query_q_counters(dev->mdev, port, 5616 + return mlx5_ib_query_q_counters(dev->mdev, cnts, 5655 5617 counter->stats, counter->id); 5656 5618 } 5657 5619 ··· 5830 5788 mlx5_ib_warn(dev, "Failed to init delay drop debugfs\n"); 5831 5789 } 5832 5790 5833 - /* The mlx5_ib_multiport_mutex should be held when calling this function */ 5834 5791 static void mlx5_ib_unbind_slave_port(struct mlx5_ib_dev *ibdev, 5835 5792 struct mlx5_ib_multiport_info *mpi) 5836 5793 { ··· 5838 5797 int comps; 5839 5798 int err; 5840 5799 int i; 5800 + 5801 + lockdep_assert_held(&mlx5_ib_multiport_mutex); 5841 5802 5842 5803 mlx5_ib_cleanup_cong_debugfs(ibdev, port_num); 5843 5804 ··· 5890 5847 ibdev->port[port_num].roce.last_port_state = IB_PORT_DOWN; 5891 5848 } 5892 5849 5893 - /* The mlx5_ib_multiport_mutex should be held when calling this function */ 5894 5850 static bool mlx5_ib_bind_slave_port(struct mlx5_ib_dev *ibdev, 5895 5851 struct mlx5_ib_multiport_info *mpi) 5896 5852 { 5897 5853 u8 port_num = mlx5_core_native_port_num(mpi->mdev) - 1; 5898 5854 int err; 5855 + 5856 + lockdep_assert_held(&mlx5_ib_multiport_mutex); 5899 5857 5900 5858 spin_lock(&ibdev->port[port_num].mp.mpi_lock); 5901 5859 if (ibdev->port[port_num].mp.mpi) { ··· 6926 6882 dev->port = kcalloc(num_ports, sizeof(*dev->port), 6927 6883 GFP_KERNEL); 6928 6884 if (!dev->port) { 6929 - ib_dealloc_device((struct ib_device *)dev); 6885 + ib_dealloc_device(&dev->ib_dev); 6930 6886 return NULL; 6931 6887 } 6932 6888 ··· 6953 6909 mlx5_ib_unbind_slave_port(mpi->ibdev, mpi); 6954 6910 list_del(&mpi->list); 6955 6911 mutex_unlock(&mlx5_ib_multiport_mutex); 6912 + kfree(mpi); 6956 6913 return; 6957 6914 } 6958 6915
+2
drivers/infiniband/hw/mlx5/mlx5_ib.h
··· 200 200 struct mlx5_ib_flow_prio sniffer[MLX5_IB_NUM_SNIFFER_FTS]; 201 201 struct mlx5_ib_flow_prio egress[MLX5_IB_NUM_EGRESS_FTS]; 202 202 struct mlx5_ib_flow_prio fdb; 203 + struct mlx5_ib_flow_prio rdma_rx[MLX5_IB_NUM_FLOW_FT]; 203 204 struct mlx5_flow_table *lag_demux_ft; 204 205 /* Protect flow steering bypass flow tables 205 206 * when add/del flow rules. ··· 1477 1476 bool dyn_bfreg); 1478 1477 1479 1478 int mlx5_ib_qp_set_counter(struct ib_qp *qp, struct rdma_counter *counter); 1479 + u16 mlx5_ib_get_counters_id(struct mlx5_ib_dev *dev, u8 port_num); 1480 1480 1481 1481 static inline bool mlx5_ib_can_use_umr(struct mlx5_ib_dev *dev, 1482 1482 bool do_modify_atomic)
+8 -76
drivers/infiniband/hw/mlx5/odp.c
··· 982 982 return ret < 0 ? ret : npages; 983 983 } 984 984 985 - static const u32 mlx5_ib_odp_opcode_cap[] = { 986 - [MLX5_OPCODE_SEND] = IB_ODP_SUPPORT_SEND, 987 - [MLX5_OPCODE_SEND_IMM] = IB_ODP_SUPPORT_SEND, 988 - [MLX5_OPCODE_SEND_INVAL] = IB_ODP_SUPPORT_SEND, 989 - [MLX5_OPCODE_RDMA_WRITE] = IB_ODP_SUPPORT_WRITE, 990 - [MLX5_OPCODE_RDMA_WRITE_IMM] = IB_ODP_SUPPORT_WRITE, 991 - [MLX5_OPCODE_RDMA_READ] = IB_ODP_SUPPORT_READ, 992 - [MLX5_OPCODE_ATOMIC_CS] = IB_ODP_SUPPORT_ATOMIC, 993 - [MLX5_OPCODE_ATOMIC_FA] = IB_ODP_SUPPORT_ATOMIC, 994 - }; 995 - 996 985 /* 997 986 * Parse initiator WQE. Advances the wqe pointer to point at the 998 987 * scatter-gather list, and set wqe_end to the end of the WQE. ··· 992 1003 { 993 1004 struct mlx5_wqe_ctrl_seg *ctrl = *wqe; 994 1005 u16 wqe_index = pfault->wqe.wqe_index; 995 - u32 transport_caps; 996 1006 struct mlx5_base_av *av; 997 1007 unsigned ds, opcode; 998 - #if defined(DEBUG) 999 - u32 ctrl_wqe_index, ctrl_qpn; 1000 - #endif 1001 1008 u32 qpn = qp->trans_qp.base.mqp.qpn; 1002 1009 1003 1010 ds = be32_to_cpu(ctrl->qpn_ds) & MLX5_WQE_CTRL_DS_MASK; ··· 1009 1024 return -EFAULT; 1010 1025 } 1011 1026 1012 - #if defined(DEBUG) 1013 - ctrl_wqe_index = (be32_to_cpu(ctrl->opmod_idx_opcode) & 1014 - MLX5_WQE_CTRL_WQE_INDEX_MASK) >> 1015 - MLX5_WQE_CTRL_WQE_INDEX_SHIFT; 1016 - if (wqe_index != ctrl_wqe_index) { 1017 - mlx5_ib_err(dev, "Got WQE with invalid wqe_index. wqe_index=0x%x, qpn=0x%x ctrl->wqe_index=0x%x\n", 1018 - wqe_index, qpn, 1019 - ctrl_wqe_index); 1020 - return -EFAULT; 1021 - } 1022 - 1023 - ctrl_qpn = (be32_to_cpu(ctrl->qpn_ds) & MLX5_WQE_CTRL_QPN_MASK) >> 1024 - MLX5_WQE_CTRL_QPN_SHIFT; 1025 - if (qpn != ctrl_qpn) { 1026 - mlx5_ib_err(dev, "Got WQE with incorrect QP number. wqe_index=0x%x, qpn=0x%x ctrl->qpn=0x%x\n", 1027 - wqe_index, qpn, 1028 - ctrl_qpn); 1029 - return -EFAULT; 1030 - } 1031 - #endif /* DEBUG */ 1032 - 1033 1027 *wqe_end = *wqe + ds * MLX5_WQE_DS_UNITS; 1034 1028 *wqe += sizeof(*ctrl); 1035 1029 1036 1030 opcode = be32_to_cpu(ctrl->opmod_idx_opcode) & 1037 1031 MLX5_WQE_CTRL_OPCODE_MASK; 1038 1032 1039 - switch (qp->ibqp.qp_type) { 1040 - case IB_QPT_XRC_INI: 1033 + if (qp->ibqp.qp_type == IB_QPT_XRC_INI) 1041 1034 *wqe += sizeof(struct mlx5_wqe_xrc_seg); 1042 - transport_caps = dev->odp_caps.per_transport_caps.xrc_odp_caps; 1043 - break; 1044 - case IB_QPT_RC: 1045 - transport_caps = dev->odp_caps.per_transport_caps.rc_odp_caps; 1046 - break; 1047 - case IB_QPT_UD: 1048 - transport_caps = dev->odp_caps.per_transport_caps.ud_odp_caps; 1049 - break; 1050 - default: 1051 - mlx5_ib_err(dev, "ODP fault on QP of an unsupported transport 0x%x\n", 1052 - qp->ibqp.qp_type); 1053 - return -EFAULT; 1054 - } 1055 1035 1056 - if (unlikely(opcode >= ARRAY_SIZE(mlx5_ib_odp_opcode_cap) || 1057 - !(transport_caps & mlx5_ib_odp_opcode_cap[opcode]))) { 1058 - mlx5_ib_err(dev, "ODP fault on QP of an unsupported opcode 0x%x\n", 1059 - opcode); 1060 - return -EFAULT; 1061 - } 1062 - 1063 - if (qp->ibqp.qp_type == IB_QPT_UD) { 1036 + if (qp->ibqp.qp_type == IB_QPT_UD || 1037 + qp->qp_sub_type == MLX5_IB_QPT_DCI) { 1064 1038 av = *wqe; 1065 1039 if (av->dqp_dct & cpu_to_be32(MLX5_EXTENDED_UD_AV)) 1066 1040 *wqe += sizeof(struct mlx5_av); ··· 1082 1138 return -EFAULT; 1083 1139 } 1084 1140 1085 - switch (qp->ibqp.qp_type) { 1086 - case IB_QPT_RC: 1087 - if (!(dev->odp_caps.per_transport_caps.rc_odp_caps & 1088 - IB_ODP_SUPPORT_RECV)) 1089 - goto invalid_transport_or_opcode; 1090 - break; 1091 - default: 1092 - invalid_transport_or_opcode: 1093 - mlx5_ib_err(dev, "ODP fault on QP of an unsupported transport. transport: 0x%x\n", 1094 - qp->ibqp.qp_type); 1095 - return -EFAULT; 1096 - } 1097 - 1098 1141 *wqe_end = wqe + wqe_size; 1099 1142 1100 1143 return 0; ··· 1131 1200 { 1132 1201 bool sq = pfault->type & MLX5_PFAULT_REQUESTOR; 1133 1202 u16 wqe_index = pfault->wqe.wqe_index; 1134 - void *wqe = NULL, *wqe_end = NULL; 1203 + void *wqe, *wqe_start = NULL, *wqe_end = NULL; 1135 1204 u32 bytes_mapped, total_wqe_bytes; 1136 1205 struct mlx5_core_rsc_common *res; 1137 1206 int resume_with_error = 1; ··· 1152 1221 goto resolve_page_fault; 1153 1222 } 1154 1223 1155 - wqe = (void *)__get_free_page(GFP_KERNEL); 1156 - if (!wqe) { 1224 + wqe_start = (void *)__get_free_page(GFP_KERNEL); 1225 + if (!wqe_start) { 1157 1226 mlx5_ib_err(dev, "Error allocating memory for IO page fault handling.\n"); 1158 1227 goto resolve_page_fault; 1159 1228 } 1160 1229 1230 + wqe = wqe_start; 1161 1231 qp = (res->res == MLX5_RES_QP) ? res_to_qp(res) : NULL; 1162 1232 if (qp && sq) { 1163 1233 ret = mlx5_ib_read_user_wqe_sq(qp, wqe_index, wqe, PAGE_SIZE, ··· 1213 1281 pfault->wqe.wq_num, resume_with_error, 1214 1282 pfault->type); 1215 1283 mlx5_core_res_put(res); 1216 - free_page((unsigned long)wqe); 1284 + free_page((unsigned long)wqe_start); 1217 1285 } 1218 1286 1219 1287 static int pages_in_range(u64 address, u32 length)
+13 -12
drivers/infiniband/hw/mlx5/qp.c
··· 3386 3386 struct mlx5_ib_dev *dev = to_mdev(qp->device); 3387 3387 struct mlx5_ib_qp *mqp = to_mqp(qp); 3388 3388 struct mlx5_qp_context context = {}; 3389 - struct mlx5_ib_port *mibport = NULL; 3390 3389 struct mlx5_ib_qp_base *base; 3391 3390 u32 set_id; 3392 3391 3393 3392 if (!MLX5_CAP_GEN(dev->mdev, rts2rts_qp_counters_set_id)) 3394 3393 return 0; 3395 3394 3396 - if (counter) { 3395 + if (counter) 3397 3396 set_id = counter->id; 3398 - } else { 3399 - mibport = &dev->port[mqp->port - 1]; 3400 - set_id = mibport->cnts.set_id; 3401 - } 3397 + else 3398 + set_id = mlx5_ib_get_counters_id(dev, mqp->port - 1); 3402 3399 3403 3400 base = &mqp->trans_qp.base; 3404 3401 context.qp_counter_set_usr_page &= cpu_to_be32(0xffffff); ··· 3456 3459 struct mlx5_ib_cq *send_cq, *recv_cq; 3457 3460 struct mlx5_qp_context *context; 3458 3461 struct mlx5_ib_pd *pd; 3459 - struct mlx5_ib_port *mibport = NULL; 3460 3462 enum mlx5_qp_state mlx5_cur, mlx5_new; 3461 3463 enum mlx5_qp_optpar optpar; 3462 3464 u32 set_id = 0; ··· 3620 3624 if (qp->flags & MLX5_IB_QP_UNDERLAY) 3621 3625 port_num = 0; 3622 3626 3623 - mibport = &dev->port[port_num]; 3624 3627 if (ibqp->counter) 3625 3628 set_id = ibqp->counter->id; 3626 3629 else 3627 - set_id = mibport->cnts.set_id; 3630 + set_id = mlx5_ib_get_counters_id(dev, port_num); 3628 3631 context->qp_counter_set_usr_page |= 3629 3632 cpu_to_be32(set_id << 24); 3630 3633 } ··· 3812 3817 3813 3818 dctc = MLX5_ADDR_OF(create_dct_in, qp->dct.in, dct_context_entry); 3814 3819 if (cur_state == IB_QPS_RESET && new_state == IB_QPS_INIT) { 3820 + u16 set_id; 3821 + 3815 3822 required |= IB_QP_ACCESS_FLAGS | IB_QP_PKEY_INDEX | IB_QP_PORT; 3816 3823 if (!is_valid_mask(attr_mask, required, 0)) 3817 3824 return -EINVAL; ··· 3840 3843 } 3841 3844 MLX5_SET(dctc, dctc, pkey_index, attr->pkey_index); 3842 3845 MLX5_SET(dctc, dctc, port, attr->port_num); 3843 - MLX5_SET(dctc, dctc, counter_set_id, dev->port[attr->port_num - 1].cnts.set_id); 3846 + 3847 + set_id = mlx5_ib_get_counters_id(dev, attr->port_num - 1); 3848 + MLX5_SET(dctc, dctc, counter_set_id, set_id); 3844 3849 3845 3850 } else if (cur_state == IB_QPS_INIT && new_state == IB_QPS_RTR) { 3846 3851 struct mlx5_ib_modify_qp_resp resp = {}; ··· 6344 6345 } 6345 6346 6346 6347 if (curr_wq_state == IB_WQS_RESET && wq_state == IB_WQS_RDY) { 6348 + u16 set_id; 6349 + 6350 + set_id = mlx5_ib_get_counters_id(dev, 0); 6347 6351 if (MLX5_CAP_GEN(dev->mdev, modify_rq_counter_set_id)) { 6348 6352 MLX5_SET64(modify_rq_in, in, modify_bitmask, 6349 6353 MLX5_MODIFY_RQ_IN_MODIFY_BITMASK_RQ_COUNTER_SET_ID); 6350 - MLX5_SET(rqc, rqc, counter_set_id, 6351 - dev->port->cnts.set_id); 6354 + MLX5_SET(rqc, rqc, counter_set_id, set_id); 6352 6355 } else 6353 6356 dev_info_once( 6354 6357 &dev->ib_dev.dev,
+2 -2
drivers/infiniband/hw/ocrdma/ocrdma_verbs.c
··· 163 163 netdev = dev->nic_info.netdev; 164 164 if (netif_running(netdev) && netif_oper_up(netdev)) { 165 165 port_state = IB_PORT_ACTIVE; 166 - props->phys_state = 5; 166 + props->phys_state = IB_PORT_PHYS_STATE_LINK_UP; 167 167 } else { 168 168 port_state = IB_PORT_DOWN; 169 - props->phys_state = 3; 169 + props->phys_state = IB_PORT_PHYS_STATE_DISABLED; 170 170 } 171 171 props->max_mtu = IB_MTU_4096; 172 172 props->active_mtu = iboe_get_mtu(netdev->mtu);
+1 -1
drivers/infiniband/hw/qedr/main.c
··· 826 826 if (rc) 827 827 goto out; 828 828 829 - dev->db_addr = (void __iomem *)(uintptr_t)out_params.dpi_addr; 829 + dev->db_addr = out_params.dpi_addr; 830 830 dev->db_phys_addr = out_params.dpi_phys_addr; 831 831 dev->db_size = out_params.dpi_size; 832 832 dev->dpi = out_params.dpi;
+1 -1
drivers/infiniband/hw/qedr/qedr.h
··· 229 229 struct ib_ucontext ibucontext; 230 230 struct qedr_dev *dev; 231 231 struct qedr_pd *pd; 232 - u64 dpi_addr; 232 + void __iomem *dpi_addr; 233 233 u64 dpi_phys_addr; 234 234 u32 dpi_size; 235 235 u16 dpi;
+3 -4
drivers/infiniband/hw/qedr/verbs.c
··· 221 221 /* *attr being zeroed by the caller, avoid zeroing it here */ 222 222 if (rdma_port->port_state == QED_RDMA_PORT_UP) { 223 223 attr->state = IB_PORT_ACTIVE; 224 - attr->phys_state = 5; 224 + attr->phys_state = IB_PORT_PHYS_STATE_LINK_UP; 225 225 } else { 226 226 attr->state = IB_PORT_DOWN; 227 - attr->phys_state = 3; 227 + attr->phys_state = IB_PORT_PHYS_STATE_DISABLED; 228 228 } 229 229 attr->max_mtu = IB_MTU_4096; 230 230 attr->active_mtu = iboe_get_mtu(dev->ndev->mtu); ··· 2451 2451 struct qedr_dev *dev = qp->dev; 2452 2452 struct ib_qp_attr attr; 2453 2453 int attr_mask = 0; 2454 - int rc = 0; 2455 2454 2456 2455 DP_DEBUG(dev, QEDR_MSG_QP, "destroy qp: destroying %p, qp type=%d\n", 2457 2456 qp, qp->qp_type); ··· 2495 2496 xa_erase_irq(&dev->qps, qp->qp_id); 2496 2497 kfree(qp); 2497 2498 } 2498 - return rc; 2499 + return 0; 2499 2500 } 2500 2501 2501 2502 int qedr_create_ah(struct ib_ah *ibah, struct rdma_ah_attr *attr, u32 flags,
+1 -2
drivers/infiniband/hw/qib/qib_file_ops.c
··· 1789 1789 1790 1790 static int qib_close(struct inode *in, struct file *fp) 1791 1791 { 1792 - int ret = 0; 1793 1792 struct qib_filedata *fd; 1794 1793 struct qib_ctxtdata *rcd; 1795 1794 struct qib_devdata *dd; ··· 1872 1873 1873 1874 bail: 1874 1875 kfree(fd); 1875 - return ret; 1876 + return 0; 1876 1877 } 1877 1878 1878 1879 static int qib_ctxt_info(struct file *fp, struct qib_ctxt_info __user *uinfo)
+2 -8
drivers/infiniband/hw/qib/qib_rc.c
··· 313 313 case IB_WR_SEND: 314 314 case IB_WR_SEND_WITH_IMM: 315 315 /* If no credit, return. */ 316 - if (!(qp->s_flags & RVT_S_UNLIMITED_CREDIT) && 317 - rvt_cmp_msn(wqe->ssn, qp->s_lsn + 1) > 0) { 318 - qp->s_flags |= RVT_S_WAIT_SSN_CREDIT; 316 + if (!rvt_rc_credit_avail(qp, wqe)) 319 317 goto bail; 320 - } 321 318 if (len > pmtu) { 322 319 qp->s_state = OP(SEND_FIRST); 323 320 len = pmtu; ··· 341 344 goto no_flow_control; 342 345 case IB_WR_RDMA_WRITE_WITH_IMM: 343 346 /* If no credit, return. */ 344 - if (!(qp->s_flags & RVT_S_UNLIMITED_CREDIT) && 345 - rvt_cmp_msn(wqe->ssn, qp->s_lsn + 1) > 0) { 346 - qp->s_flags |= RVT_S_WAIT_SSN_CREDIT; 347 + if (!rvt_rc_credit_avail(qp, wqe)) 347 348 goto bail; 348 - } 349 349 no_flow_control: 350 350 ohdr->u.rc.reth.vaddr = 351 351 cpu_to_be64(wqe->rdma_wr.remote_addr);
+2
drivers/infiniband/hw/qib/qib_sysfs.c
··· 436 436 QIB_DIAGC_ATTR(unaligned); 437 437 QIB_DIAGC_ATTR(rc_dupreq); 438 438 QIB_DIAGC_ATTR(rc_seqnak); 439 + QIB_DIAGC_ATTR(rc_crwaits); 439 440 440 441 static struct attribute *diagc_default_attributes[] = { 441 442 &qib_diagc_attr_rc_resends.attr, ··· 454 453 &qib_diagc_attr_unaligned.attr, 455 454 &qib_diagc_attr_rc_dupreq.attr, 456 455 &qib_diagc_attr_rc_seqnak.attr, 456 + &qib_diagc_attr_rc_crwaits.attr, 457 457 NULL 458 458 }; 459 459
+8 -2
drivers/infiniband/hw/usnic/usnic_ib_main.c
··· 89 89 90 90 void usnic_ib_log_vf(struct usnic_ib_vf *vf) 91 91 { 92 - char buf[1000]; 93 - usnic_ib_dump_vf(vf, buf, sizeof(buf)); 92 + char *buf = kzalloc(1000, GFP_KERNEL); 93 + 94 + if (!buf) 95 + return; 96 + 97 + usnic_ib_dump_vf(vf, buf, 1000); 94 98 usnic_dbg("%s\n", buf); 99 + 100 + kfree(buf); 95 101 } 96 102 97 103 /* Start of netdev section */
+5 -4
drivers/infiniband/hw/usnic/usnic_ib_verbs.c
··· 194 194 return ERR_CAST(dev_list); 195 195 for (i = 0; dev_list[i]; i++) { 196 196 dev = dev_list[i]; 197 - vf = pci_get_drvdata(to_pci_dev(dev)); 197 + vf = dev_get_drvdata(dev); 198 198 spin_lock(&vf->lock); 199 199 vnic = vf->vnic; 200 200 if (!usnic_vnic_check_room(vnic, res_spec)) { ··· 356 356 357 357 if (!us_ibdev->ufdev->link_up) { 358 358 props->state = IB_PORT_DOWN; 359 - props->phys_state = 3; 359 + props->phys_state = IB_PORT_PHYS_STATE_DISABLED; 360 360 } else if (!us_ibdev->ufdev->inaddr) { 361 361 props->state = IB_PORT_INIT; 362 - props->phys_state = 4; 362 + props->phys_state = 363 + IB_PORT_PHYS_STATE_PORT_CONFIGURATION_TRAINING; 363 364 } else { 364 365 props->state = IB_PORT_ACTIVE; 365 - props->phys_state = 5; 366 + props->phys_state = IB_PORT_PHYS_STATE_LINK_UP; 366 367 } 367 368 368 369 props->port_cap_flags = 0;
-4
drivers/infiniband/sw/rxe/rxe.h
··· 65 65 */ 66 66 #define RXE_UVERBS_ABI_VERSION 2 67 67 68 - #define RDMA_LINK_PHYS_STATE_LINK_UP (5) 69 - #define RDMA_LINK_PHYS_STATE_DISABLED (3) 70 - #define RDMA_LINK_PHYS_STATE_POLLING (2) 71 - 72 68 #define RXE_ROCE_V2_SPORT (0xc000) 73 69 74 70 static inline u32 rxe_crc32(struct rxe_dev *rxe,
+1 -1
drivers/infiniband/sw/rxe/rxe_param.h
··· 154 154 RXE_PORT_ACTIVE_WIDTH = IB_WIDTH_1X, 155 155 RXE_PORT_ACTIVE_SPEED = 1, 156 156 RXE_PORT_PKEY_TBL_LEN = 64, 157 - RXE_PORT_PHYS_STATE = 2, 157 + RXE_PORT_PHYS_STATE = IB_PORT_PHYS_STATE_POLLING, 158 158 RXE_PORT_SUBNET_PREFIX = 0xfe80000000000000ULL, 159 159 }; 160 160
+3 -3
drivers/infiniband/sw/rxe/rxe_verbs.c
··· 69 69 &attr->active_width); 70 70 71 71 if (attr->state == IB_PORT_ACTIVE) 72 - attr->phys_state = RDMA_LINK_PHYS_STATE_LINK_UP; 72 + attr->phys_state = IB_PORT_PHYS_STATE_LINK_UP; 73 73 else if (dev_get_flags(rxe->ndev) & IFF_UP) 74 - attr->phys_state = RDMA_LINK_PHYS_STATE_POLLING; 74 + attr->phys_state = IB_PORT_PHYS_STATE_POLLING; 75 75 else 76 - attr->phys_state = RDMA_LINK_PHYS_STATE_DISABLED; 76 + attr->phys_state = IB_PORT_PHYS_STATE_DISABLED; 77 77 78 78 mutex_unlock(&rxe->usdev_lock); 79 79
+11 -12
drivers/infiniband/sw/siw/siw_qp_tx.c
··· 76 76 if (unlikely(!p)) 77 77 return -EFAULT; 78 78 79 - buffer = kmap_atomic(p); 79 + buffer = kmap(p); 80 80 81 81 if (likely(PAGE_SIZE - off >= bytes)) { 82 82 memcpy(paddr, buffer + off, bytes); 83 - kunmap_atomic(buffer); 84 83 } else { 85 84 unsigned long part = bytes - (PAGE_SIZE - off); 86 85 87 86 memcpy(paddr, buffer + off, part); 88 - kunmap_atomic(buffer); 87 + kunmap(p); 89 88 90 89 if (!mem->is_pbl) 91 90 p = siw_get_upage(mem->umem, ··· 96 97 if (unlikely(!p)) 97 98 return -EFAULT; 98 99 99 - buffer = kmap_atomic(p); 100 - memcpy(paddr + part, buffer, 101 - bytes - part); 102 - kunmap_atomic(buffer); 100 + buffer = kmap(p); 101 + memcpy(paddr + part, buffer, bytes - part); 103 102 } 103 + kunmap(p); 104 104 } 105 105 } 106 106 return (int)bytes; ··· 516 518 c_tx->mpa_crc_hd, 517 519 iov[seg].iov_base, 518 520 plen); 519 - } else if (do_crc) 520 - crypto_shash_update( 521 - c_tx->mpa_crc_hd, 522 - page_address(p) + fp_off, 523 - plen); 521 + } else if (do_crc) { 522 + crypto_shash_update(c_tx->mpa_crc_hd, 523 + kmap(p) + fp_off, 524 + plen); 525 + kunmap(p); 526 + } 524 527 } else { 525 528 u64 va = sge->laddr + sge_off; 526 529
+2 -1
drivers/infiniband/sw/siw/siw_verbs.c
··· 206 206 attr->gid_tbl_len = 1; 207 207 attr->max_msg_sz = -1; 208 208 attr->max_mtu = ib_mtu_int_to_enum(sdev->netdev->mtu); 209 - attr->phys_state = sdev->state == IB_PORT_ACTIVE ? 5 : 3; 209 + attr->phys_state = sdev->state == IB_PORT_ACTIVE ? 210 + IB_PORT_PHYS_STATE_LINK_UP : IB_PORT_PHYS_STATE_DISABLED; 210 211 attr->pkey_tbl_len = 1; 211 212 attr->port_cap_flags = IB_PORT_CM_SUP | IB_PORT_DEVICE_MGMT_SUP; 212 213 attr->state = sdev->state;
+4 -3
drivers/infiniband/ulp/iser/iscsi_iser.h
··· 102 102 103 103 /* Default support is 512KB I/O size */ 104 104 #define ISER_DEF_MAX_SECTORS 1024 105 - #define ISCSI_ISER_DEF_SG_TABLESIZE ((ISER_DEF_MAX_SECTORS * 512) >> SHIFT_4K) 106 - /* Maximum support is 8MB I/O size */ 107 - #define ISCSI_ISER_MAX_SG_TABLESIZE ((16384 * 512) >> SHIFT_4K) 105 + #define ISCSI_ISER_DEF_SG_TABLESIZE \ 106 + ((ISER_DEF_MAX_SECTORS * SECTOR_SIZE) >> SHIFT_4K) 107 + /* Maximum support is 16MB I/O size */ 108 + #define ISCSI_ISER_MAX_SG_TABLESIZE ((32768 * SECTOR_SIZE) >> SHIFT_4K) 108 109 109 110 #define ISER_DEF_XMIT_CMDS_DEFAULT 512 110 111 #if ISCSI_DEF_XMIT_CMDS_MAX > ISER_DEF_XMIT_CMDS_DEFAULT
+2 -2
drivers/infiniband/ulp/srpt/ib_srpt.c
··· 1767 1767 goto out; 1768 1768 1769 1769 retry: 1770 - ch->cq = ib_alloc_cq(sdev->device, ch, ch->rq_size + sq_size, 1771 - 0 /* XXX: spread CQs */, IB_POLL_WORKQUEUE); 1770 + ch->cq = ib_alloc_cq_any(sdev->device, ch, ch->rq_size + sq_size, 1771 + IB_POLL_WORKQUEUE); 1772 1772 if (IS_ERR(ch->cq)) { 1773 1773 ret = PTR_ERR(ch->cq); 1774 1774 pr_err("failed to create CQ cqe= %d ret= %d\n",
+2 -4
drivers/net/ethernet/mellanox/mlx5/core/rl.c
··· 188 188 /* new rate limit */ 189 189 err = mlx5_set_pp_rate_limit_cmd(dev, entry->index, rl); 190 190 if (err) { 191 - mlx5_core_err(dev, "Failed configuring rate limit(err %d): \ 192 - rate %u, max_burst_sz %u, typical_pkt_sz %u\n", 191 + mlx5_core_err(dev, "Failed configuring rate limit(err %d): rate %u, max_burst_sz %u, typical_pkt_sz %u\n", 193 192 err, rl->rate, rl->max_burst_sz, 194 193 rl->typical_pkt_sz); 195 194 goto out; ··· 217 218 mutex_lock(&table->rl_lock); 218 219 entry = find_rl_entry(table, rl); 219 220 if (!entry || !entry->refcount) { 220 - mlx5_core_warn(dev, "Rate %u, max_burst_sz %u typical_pkt_sz %u \ 221 - are not configured\n", 221 + mlx5_core_warn(dev, "Rate %u, max_burst_sz %u typical_pkt_sz %u are not configured\n", 222 222 rl->rate, rl->max_burst_sz, rl->typical_pkt_sz); 223 223 goto out; 224 224 }
+2 -3
drivers/net/ethernet/qlogic/qed/qed_rdma.c
··· 798 798 /* Calculate the corresponding DPI address */ 799 799 dpi_start_offset = p_hwfn->dpi_start_offset; 800 800 801 - out_params->dpi_addr = (u64)((u8 __iomem *)p_hwfn->doorbells + 802 - dpi_start_offset + 803 - ((out_params->dpi) * p_hwfn->dpi_size)); 801 + out_params->dpi_addr = p_hwfn->doorbells + dpi_start_offset + 802 + out_params->dpi * p_hwfn->dpi_size; 804 803 805 804 out_params->dpi_phys_addr = p_hwfn->db_phys_addr + 806 805 dpi_start_offset +
+6 -4
fs/cifs/smbdirect.c
··· 1654 1654 1655 1655 info->send_cq = NULL; 1656 1656 info->recv_cq = NULL; 1657 - info->send_cq = ib_alloc_cq(info->id->device, info, 1658 - info->send_credit_target, 0, IB_POLL_SOFTIRQ); 1657 + info->send_cq = 1658 + ib_alloc_cq_any(info->id->device, info, 1659 + info->send_credit_target, IB_POLL_SOFTIRQ); 1659 1660 if (IS_ERR(info->send_cq)) { 1660 1661 info->send_cq = NULL; 1661 1662 goto alloc_cq_failed; 1662 1663 } 1663 1664 1664 - info->recv_cq = ib_alloc_cq(info->id->device, info, 1665 - info->receive_credit_max, 0, IB_POLL_SOFTIRQ); 1665 + info->recv_cq = 1666 + ib_alloc_cq_any(info->id->device, info, 1667 + info->receive_credit_max, IB_POLL_SOFTIRQ); 1666 1668 if (IS_ERR(info->recv_cq)) { 1667 1669 info->recv_cq = NULL; 1668 1670 goto alloc_cq_failed;
-6
include/Kbuild
··· 881 881 header-test- += net/xdp_priv.h 882 882 header-test- += pcmcia/cistpl.h 883 883 header-test- += pcmcia/ds.h 884 - header-test- += rdma/ib.h 885 - header-test- += rdma/iw_portmap.h 886 - header-test- += rdma/opa_port_info.h 887 - header-test- += rdma/rdmavt_cq.h 888 - header-test- += rdma/restrack.h 889 - header-test- += rdma/signature.h 890 884 header-test- += rdma/tid_rdma_defs.h 891 885 header-test- += scsi/fc/fc_encaps.h 892 886 header-test- += scsi/fc/fc_fc2.h
+9
include/linux/mlx5/device.h
··· 328 328 MLX5_EVENT_TYPE_GPIO_EVENT = 0x15, 329 329 MLX5_EVENT_TYPE_PORT_MODULE_EVENT = 0x16, 330 330 MLX5_EVENT_TYPE_TEMP_WARN_EVENT = 0x17, 331 + MLX5_EVENT_TYPE_XRQ_ERROR = 0x18, 331 332 MLX5_EVENT_TYPE_REMOTE_CONFIG = 0x19, 332 333 MLX5_EVENT_TYPE_GENERAL_EVENT = 0x22, 333 334 MLX5_EVENT_TYPE_MONITOR_COUNTER = 0x24, ··· 346 345 MLX5_EVENT_TYPE_ESW_FUNCTIONS_CHANGED = 0xe, 347 346 348 347 MLX5_EVENT_TYPE_DCT_DRAINED = 0x1c, 348 + MLX5_EVENT_TYPE_DCT_KEY_VIOLATION = 0x1d, 349 349 350 350 MLX5_EVENT_TYPE_FPGA_ERROR = 0x20, 351 351 MLX5_EVENT_TYPE_FPGA_QP_ERROR = 0x21, ··· 586 584 u8 syndrome; 587 585 }; 588 586 587 + struct mlx5_eqe_xrq_err { 588 + __be32 reserved1[5]; 589 + __be32 type_xrqn; 590 + __be32 reserved2; 591 + }; 592 + 589 593 struct mlx5_eqe_port_state { 590 594 u8 reserved0[8]; 591 595 u8 port; ··· 706 698 struct mlx5_eqe_pps pps; 707 699 struct mlx5_eqe_dct dct; 708 700 struct mlx5_eqe_temp_warning temp_warning; 701 + struct mlx5_eqe_xrq_err xrq_err; 709 702 } __packed; 710 703 711 704 struct mlx5_eqe {
+1 -1
include/linux/qed/qed_rdma_if.h
··· 225 225 226 226 struct qed_rdma_add_user_out_params { 227 227 u16 dpi; 228 - u64 dpi_addr; 228 + void __iomem *dpi_addr; 229 229 u64 dpi_phys_addr; 230 230 u32 dpi_size; 231 231 u16 wid_count;
+2
include/rdma/ib.h
··· 36 36 #include <linux/types.h> 37 37 #include <linux/sched.h> 38 38 #include <linux/cred.h> 39 + #include <linux/uaccess.h> 40 + #include <linux/fs.h> 39 41 40 42 struct ib_addr { 41 43 union {
+71 -3
include/rdma/ib_verbs.h
··· 98 98 #if defined(CONFIG_DYNAMIC_DEBUG) 99 99 #define ibdev_dbg(__dev, format, args...) \ 100 100 dynamic_ibdev_dbg(__dev, format, ##args) 101 - #elif defined(DEBUG) 102 - #define ibdev_dbg(__dev, format, args...) \ 103 - ibdev_printk(KERN_DEBUG, __dev, format, ##args) 104 101 #else 105 102 __printf(2, 3) __cold 106 103 static inline 107 104 void ibdev_dbg(const struct ib_device *ibdev, const char *format, ...) {} 105 + #endif 106 + 107 + #define ibdev_level_ratelimited(ibdev_level, ibdev, fmt, ...) \ 108 + do { \ 109 + static DEFINE_RATELIMIT_STATE(_rs, \ 110 + DEFAULT_RATELIMIT_INTERVAL, \ 111 + DEFAULT_RATELIMIT_BURST); \ 112 + if (__ratelimit(&_rs)) \ 113 + ibdev_level(ibdev, fmt, ##__VA_ARGS__); \ 114 + } while (0) 115 + 116 + #define ibdev_emerg_ratelimited(ibdev, fmt, ...) \ 117 + ibdev_level_ratelimited(ibdev_emerg, ibdev, fmt, ##__VA_ARGS__) 118 + #define ibdev_alert_ratelimited(ibdev, fmt, ...) \ 119 + ibdev_level_ratelimited(ibdev_alert, ibdev, fmt, ##__VA_ARGS__) 120 + #define ibdev_crit_ratelimited(ibdev, fmt, ...) \ 121 + ibdev_level_ratelimited(ibdev_crit, ibdev, fmt, ##__VA_ARGS__) 122 + #define ibdev_err_ratelimited(ibdev, fmt, ...) \ 123 + ibdev_level_ratelimited(ibdev_err, ibdev, fmt, ##__VA_ARGS__) 124 + #define ibdev_warn_ratelimited(ibdev, fmt, ...) \ 125 + ibdev_level_ratelimited(ibdev_warn, ibdev, fmt, ##__VA_ARGS__) 126 + #define ibdev_notice_ratelimited(ibdev, fmt, ...) \ 127 + ibdev_level_ratelimited(ibdev_notice, ibdev, fmt, ##__VA_ARGS__) 128 + #define ibdev_info_ratelimited(ibdev, fmt, ...) \ 129 + ibdev_level_ratelimited(ibdev_info, ibdev, fmt, ##__VA_ARGS__) 130 + 131 + #if defined(CONFIG_DYNAMIC_DEBUG) 132 + /* descriptor check is first to prevent flooding with "callbacks suppressed" */ 133 + #define ibdev_dbg_ratelimited(ibdev, fmt, ...) \ 134 + do { \ 135 + static DEFINE_RATELIMIT_STATE(_rs, \ 136 + DEFAULT_RATELIMIT_INTERVAL, \ 137 + DEFAULT_RATELIMIT_BURST); \ 138 + DEFINE_DYNAMIC_DEBUG_METADATA(descriptor, fmt); \ 139 + if (DYNAMIC_DEBUG_BRANCH(descriptor) && __ratelimit(&_rs)) \ 140 + __dynamic_ibdev_dbg(&descriptor, ibdev, fmt, \ 141 + ##__VA_ARGS__); \ 142 + } while (0) 143 + #else 144 + __printf(2, 3) __cold 145 + static inline 146 + void ibdev_dbg_ratelimited(const struct ib_device *ibdev, const char *format, ...) {} 108 147 #endif 109 148 110 149 union ib_gid { ··· 488 449 IB_PORT_ARMED = 3, 489 450 IB_PORT_ACTIVE = 4, 490 451 IB_PORT_ACTIVE_DEFER = 5 452 + }; 453 + 454 + enum ib_port_phys_state { 455 + IB_PORT_PHYS_STATE_SLEEP = 1, 456 + IB_PORT_PHYS_STATE_POLLING = 2, 457 + IB_PORT_PHYS_STATE_DISABLED = 3, 458 + IB_PORT_PHYS_STATE_PORT_CONFIGURATION_TRAINING = 4, 459 + IB_PORT_PHYS_STATE_LINK_UP = 5, 460 + IB_PORT_PHYS_STATE_LINK_ERROR_RECOVERY = 6, 461 + IB_PORT_PHYS_STATE_PHY_TEST = 7, 491 462 }; 492 463 493 464 enum ib_port_width { ··· 3757 3708 { 3758 3709 return ib_alloc_cq_user(dev, private, nr_cqe, comp_vector, poll_ctx, 3759 3710 NULL); 3711 + } 3712 + 3713 + struct ib_cq *__ib_alloc_cq_any(struct ib_device *dev, void *private, 3714 + int nr_cqe, enum ib_poll_context poll_ctx, 3715 + const char *caller); 3716 + 3717 + /** 3718 + * ib_alloc_cq_any: Allocate kernel CQ 3719 + * @dev: The IB device 3720 + * @private: Private data attached to the CQE 3721 + * @nr_cqe: Number of CQEs in the CQ 3722 + * @poll_ctx: Context used for polling the CQ 3723 + */ 3724 + static inline struct ib_cq *ib_alloc_cq_any(struct ib_device *dev, 3725 + void *private, int nr_cqe, 3726 + enum ib_poll_context poll_ctx) 3727 + { 3728 + return __ib_alloc_cq_any(dev, private, nr_cqe, poll_ctx, 3729 + KBUILD_MODNAME); 3760 3730 } 3761 3731 3762 3732 /**
+3
include/rdma/iw_portmap.h
··· 33 33 #ifndef _IW_PORTMAP_H 34 34 #define _IW_PORTMAP_H 35 35 36 + #include <linux/socket.h> 37 + #include <linux/netlink.h> 38 + 36 39 #define IWPM_ULIBNAME_SIZE 32 37 40 #define IWPM_DEVNAME_SIZE 32 38 41 #define IWPM_IFNAME_SIZE 16
+2
include/rdma/opa_port_info.h
··· 33 33 #if !defined(OPA_PORT_INFO_H) 34 34 #define OPA_PORT_INFO_H 35 35 36 + #include <rdma/opa_smi.h> 37 + 36 38 #define OPA_PORT_LINK_MODE_NOP 0 /* No change */ 37 39 #define OPA_PORT_LINK_MODE_OPA 4 /* Port mode is OPA */ 38 40
+7 -3
include/rdma/rdma_netlink.h
··· 76 76 77 77 /** 78 78 * Send the supplied skb to a specific userspace PID. 79 + * @net: Net namespace in which to send the skb 79 80 * @skb: The netlink skb 80 81 * @pid: Userspace netlink process ID 81 82 * Returns 0 on success or a negative error code. 82 83 */ 83 - int rdma_nl_unicast(struct sk_buff *skb, u32 pid); 84 + int rdma_nl_unicast(struct net *net, struct sk_buff *skb, u32 pid); 84 85 85 86 /** 86 87 * Send, with wait/1 retry, the supplied skb to a specific userspace PID. 88 + * @net: Net namespace in which to send the skb 87 89 * @skb: The netlink skb 88 90 * @pid: Userspace netlink process ID 89 91 * Returns 0 on success or a negative error code. 90 92 */ 91 - int rdma_nl_unicast_wait(struct sk_buff *skb, __u32 pid); 93 + int rdma_nl_unicast_wait(struct net *net, struct sk_buff *skb, __u32 pid); 92 94 93 95 /** 94 96 * Send the supplied skb to a netlink group. 97 + * @net: Net namespace in which to send the skb 95 98 * @skb: The netlink skb 96 99 * @group: Netlink group ID 97 100 * @flags: allocation flags 98 101 * Returns 0 on success or a negative error code. 99 102 */ 100 - int rdma_nl_multicast(struct sk_buff *skb, unsigned int group, gfp_t flags); 103 + int rdma_nl_multicast(struct net *net, struct sk_buff *skb, 104 + unsigned int group, gfp_t flags); 101 105 102 106 /** 103 107 * Check if there are any listeners to the netlink group
+1
include/rdma/rdma_vt.h
··· 116 116 u64 n_unaligned; 117 117 u64 n_rc_dupreq; 118 118 u64 n_rc_seqnak; 119 + u64 n_rc_crwaits; 119 120 u16 pkey_violations; 120 121 u16 qkey_violations; 121 122 u16 mkey_violations;
+1
include/rdma/rdmavt_cq.h
··· 53 53 54 54 #include <linux/kthread.h> 55 55 #include <rdma/ib_user_verbs.h> 56 + #include <rdma/ib_verbs.h> 56 57 57 58 /* 58 59 * Define an ib_cq_notify value that is not valid so we know when CQ
+35
include/rdma/rdmavt_qp.h
··· 973 973 rq->wq = NULL; 974 974 } 975 975 976 + /** 977 + * rvt_to_iport - Get the ibport pointer 978 + * @qp: the qp pointer 979 + * 980 + * This function returns the ibport pointer from the qp pointer. 981 + */ 982 + static inline struct rvt_ibport *rvt_to_iport(struct rvt_qp *qp) 983 + { 984 + struct rvt_dev_info *rdi = ib_to_rvt(qp->ibqp.device); 985 + 986 + return rdi->ports[qp->port_num - 1]; 987 + } 988 + 989 + /** 990 + * rvt_rc_credit_avail - Check if there are enough RC credits for the request 991 + * @qp: the qp 992 + * @wqe: the request 993 + * 994 + * This function returns false when there are not enough credits for the given 995 + * request and true otherwise. 996 + */ 997 + static inline bool rvt_rc_credit_avail(struct rvt_qp *qp, struct rvt_swqe *wqe) 998 + { 999 + lockdep_assert_held(&qp->s_lock); 1000 + if (!(qp->s_flags & RVT_S_UNLIMITED_CREDIT) && 1001 + rvt_cmp_msn(wqe->ssn, qp->s_lsn + 1) > 0) { 1002 + struct rvt_ibport *rvp = rvt_to_iport(qp); 1003 + 1004 + qp->s_flags |= RVT_S_WAIT_SSN_CREDIT; 1005 + rvp->n_rc_crwaits++; 1006 + return false; 1007 + } 1008 + return true; 1009 + } 1010 + 976 1011 struct rvt_qp_iter *rvt_qp_iter_init(struct rvt_dev_info *rdi, 977 1012 u64 v, 978 1013 void (*cb)(struct rvt_qp *qp, u64 v));
+2
include/rdma/signature.h
··· 6 6 #ifndef _RDMA_SIGNATURE_H_ 7 7 #define _RDMA_SIGNATURE_H_ 8 8 9 + #include <linux/types.h> 10 + 9 11 enum ib_signature_prot_cap { 10 12 IB_PROT_T10DIF_TYPE_1 = 1, 11 13 IB_PROT_T10DIF_TYPE_2 = 1 << 1,
+1
include/uapi/rdma/mlx5_user_ioctl_verbs.h
··· 43 43 MLX5_IB_UAPI_FLOW_TABLE_TYPE_NIC_RX = 0x0, 44 44 MLX5_IB_UAPI_FLOW_TABLE_TYPE_NIC_TX = 0x1, 45 45 MLX5_IB_UAPI_FLOW_TABLE_TYPE_FDB = 0x2, 46 + MLX5_IB_UAPI_FLOW_TABLE_TYPE_RDMA_RX = 0x3, 46 47 }; 47 48 48 49 enum mlx5_ib_uapi_flow_action_packet_reformat_type {
+3 -3
net/9p/trans_rdma.c
··· 685 685 goto error; 686 686 687 687 /* Create the Completion Queue */ 688 - rdma->cq = ib_alloc_cq(rdma->cm_id->device, client, 689 - opts.sq_depth + opts.rq_depth + 1, 690 - 0, IB_POLL_SOFTIRQ); 688 + rdma->cq = ib_alloc_cq_any(rdma->cm_id->device, client, 689 + opts.sq_depth + opts.rq_depth + 1, 690 + IB_POLL_SOFTIRQ); 691 691 if (IS_ERR(rdma->cq)) 692 692 goto error; 693 693
+4 -4
net/sunrpc/xprtrdma/svc_rdma_transport.c
··· 454 454 dprintk("svcrdma: error creating PD for connect request\n"); 455 455 goto errout; 456 456 } 457 - newxprt->sc_sq_cq = ib_alloc_cq(dev, newxprt, newxprt->sc_sq_depth, 458 - 0, IB_POLL_WORKQUEUE); 457 + newxprt->sc_sq_cq = ib_alloc_cq_any(dev, newxprt, newxprt->sc_sq_depth, 458 + IB_POLL_WORKQUEUE); 459 459 if (IS_ERR(newxprt->sc_sq_cq)) { 460 460 dprintk("svcrdma: error creating SQ CQ for connect request\n"); 461 461 goto errout; 462 462 } 463 - newxprt->sc_rq_cq = ib_alloc_cq(dev, newxprt, rq_depth, 464 - 0, IB_POLL_WORKQUEUE); 463 + newxprt->sc_rq_cq = 464 + ib_alloc_cq_any(dev, newxprt, rq_depth, IB_POLL_WORKQUEUE); 465 465 if (IS_ERR(newxprt->sc_rq_cq)) { 466 466 dprintk("svcrdma: error creating RQ CQ for connect request\n"); 467 467 goto errout;
+6 -7
net/sunrpc/xprtrdma/verbs.c
··· 521 521 init_waitqueue_head(&ep->rep_connect_wait); 522 522 ep->rep_receive_count = 0; 523 523 524 - sendcq = ib_alloc_cq(ia->ri_id->device, NULL, 525 - ep->rep_attr.cap.max_send_wr + 1, 526 - ia->ri_id->device->num_comp_vectors > 1 ? 1 : 0, 527 - IB_POLL_WORKQUEUE); 524 + sendcq = ib_alloc_cq_any(ia->ri_id->device, NULL, 525 + ep->rep_attr.cap.max_send_wr + 1, 526 + IB_POLL_WORKQUEUE); 528 527 if (IS_ERR(sendcq)) { 529 528 rc = PTR_ERR(sendcq); 530 529 goto out1; 531 530 } 532 531 533 - recvcq = ib_alloc_cq(ia->ri_id->device, NULL, 534 - ep->rep_attr.cap.max_recv_wr + 1, 535 - 0, IB_POLL_WORKQUEUE); 532 + recvcq = ib_alloc_cq_any(ia->ri_id->device, NULL, 533 + ep->rep_attr.cap.max_recv_wr + 1, 534 + IB_POLL_WORKQUEUE); 536 535 if (IS_ERR(recvcq)) { 537 536 rc = PTR_ERR(recvcq); 538 537 goto out2;