From mboxrd@z Thu Jan 1 00:00:00 1970 From: dykmanj@linux.vnet.ibm.com Subject: [PATCH 09/27] HFI: Add HFI window resource tracking Date: Wed, 2 Mar 2011 16:09:55 -0500 Message-ID: <1299100213-8770-9-git-send-email-dykmanj@linux.vnet.ibm.com> References: <1299100213-8770-1-git-send-email-dykmanj@linux.vnet.ibm.com> Cc: Jim Dykman , Piyush Chaudhary , Fu-Chung Chang , " William S. Cadden" , " Wen C. Chen" , Scot Sakolish , Jian Xiao , " Carol L. Soto" , " Sarah J. Sheppard" Return-path: Received: from e3.ny.us.ibm.com ([32.97.182.143]:55616 "EHLO e3.ny.us.ibm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757365Ab1CBVK0 (ORCPT ); Wed, 2 Mar 2011 16:10:26 -0500 Received: from d01dlp01.pok.ibm.com (d01dlp01.pok.ibm.com [9.56.224.56]) by e3.ny.us.ibm.com (8.14.4/8.13.1) with ESMTP id p22KoM7b016433 for ; Wed, 2 Mar 2011 15:50:22 -0500 Received: from d01relay06.pok.ibm.com (d01relay06.pok.ibm.com [9.56.227.116]) by d01dlp01.pok.ibm.com (Postfix) with ESMTP id D3D0B38C8038 for ; Wed, 2 Mar 2011 16:10:23 -0500 (EST) Received: from d01av04.pok.ibm.com (d01av04.pok.ibm.com [9.56.224.64]) by d01relay06.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id p22LAOiG2543632 for ; Wed, 2 Mar 2011 16:10:24 -0500 Received: from d01av04.pok.ibm.com (loopback [127.0.0.1]) by d01av04.pok.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id p22LANwv032016 for ; Wed, 2 Mar 2011 16:10:24 -0500 To: netdev@vger.kernel.org In-Reply-To: <1299100213-8770-1-git-send-email-dykmanj@linux.vnet.ibm.com> To: netdev@vger.kernel.org Sender: netdev-owner@vger.kernel.org List-ID: From: Jim Dykman An HFI window is very roughly similar to an infiniband UD queue pair. Signed-off-by: Piyush Chaudhary Signed-off-by: Jim Dykman Signed-off-by: Fu-Chung Chang Signed-off-by: William S. Cadden Signed-off-by: Wen C. Chen Signed-off-by: Scot Sakolish Signed-off-by: Jian Xiao Signed-off-by: Carol L. Soto Signed-off-by: Sarah J. Sheppard --- drivers/net/hfi/core/hfidd_adpt.c | 65 ++++++++++++++++++++++++++++++++++++ drivers/net/hfi/core/hfidd_proto.h | 2 + include/linux/hfi/hfidd_adpt.h | 10 +++++ include/linux/hfi/hfidd_client.h | 27 +++++++++++++++ include/linux/hfi/hfidd_internal.h | 43 +++++++++++++++++++++++ 5 files changed, 147 insertions(+), 0 deletions(-) diff --git a/drivers/net/hfi/core/hfidd_adpt.c b/drivers/net/hfi/core/hfidd_adpt.c index feb1b59..372eeec 100644 --- a/drivers/net/hfi/core/hfidd_adpt.c +++ b/drivers/net/hfi/core/hfidd_adpt.c @@ -66,6 +66,16 @@ int hfidd_alloc_adapter(struct hfidd_acs **adpt, dev_t devno, void *uiop) goto err_exit0; *adpt = p_acs; + + /* alloc window structures */ + ret = hfidd_alloc_windows(p_acs); + if (ret) { + dev_printk(KERN_ERR, p_acs->hfidd_dev, + "hfidd_alloc_adapter: hfidd_alloc_windows failed, " + "ret = 0x%x\n", ret); + goto err_exit0; + } + return 0; err_exit0: @@ -76,11 +86,66 @@ err_exit0: void hfidd_free_adapter(struct hfidd_acs *p_acs) { + hfidd_free_windows(p_acs); kfree(p_acs); p_acs = NULL; return; } +int hfidd_alloc_windows(struct hfidd_acs *p_acs) +{ + int i; + + p_acs->win = kzalloc(sizeof(*p_acs->win) * p_acs->dds.window_num, + GFP_KERNEL); + + if (p_acs->win == NULL) { + dev_printk(KERN_ERR, p_acs->hfidd_dev, + "hfidd_alloc_windows: kzalloc p_acs->win failed\n"); + return -ENOMEM; + } + + for (i = 0; i < p_acs->dds.window_num; i++) { + p_acs->win[i] = kzalloc(sizeof(*(p_acs->win[i])), + GFP_KERNEL); + if (p_acs->win[i] == NULL) { + dev_printk(KERN_ERR, p_acs->hfidd_dev, + "hfidd_alloc_windows: kzalloc win 0x%x " + "failed\n", i); + hfidd_free_windows(p_acs); + return -ENOMEM; + } + + /* Initialize window fields */ + spin_lock_init(&(p_acs->win[i]->win_lock)); + + p_acs->win[i]->ai = p_acs->index; + p_acs->win[i]->index = p_acs->dds.window_start + i; + + if (p_acs->win[i]->index < (p_acs->dds.window_start + + MAX_D_WIN_PER_HFI)) { + p_acs->win[i]->type = HFIDD_DYNAMIC_WIN; + } else { + p_acs->win[i]->type = HFIDD_RESERVE_WIN; + } + p_acs->win[i]->state = WIN_AVAILABLE; + } + return 0; +} + +void hfidd_free_windows(struct hfidd_acs *p_acs) +{ + int i; + + for (i = 0; i < p_acs->dds.window_num; i++) { + kfree(p_acs->win[i]); + p_acs->win[i] = NULL; + } + kfree(p_acs->win); + p_acs->win = NULL; + return; +} + /* Allocate the page for the HCALL */ int hfidd_get_phyp_page(struct hfidd_acs *p_acs, caddr_t *page, caddr_t *laddr, int size) diff --git a/drivers/net/hfi/core/hfidd_proto.h b/drivers/net/hfi/core/hfidd_proto.h index 320f41f..c61387e 100644 --- a/drivers/net/hfi/core/hfidd_proto.h +++ b/drivers/net/hfi/core/hfidd_proto.h @@ -35,6 +35,8 @@ int hfidd_alloc_adapter(struct hfidd_acs **adpt, dev_t, void *uiop); void hfidd_free_adapter(struct hfidd_acs *p_acs); +int hfidd_alloc_windows(struct hfidd_acs *p_acs); +void hfidd_free_windows(struct hfidd_acs *p_acs); int hfidd_init_adapter(struct hfidd_acs *p_acs, void *uiop); int hfidd_age_hcall(u64 time_start); int hfidd_get_phyp_page(struct hfidd_acs *p_acs, caddr_t *page, diff --git a/include/linux/hfi/hfidd_adpt.h b/include/linux/hfi/hfidd_adpt.h index e3271e9..babdb14 100644 --- a/include/linux/hfi/hfidd_adpt.h +++ b/include/linux/hfi/hfidd_adpt.h @@ -47,4 +47,14 @@ #define HFI_GOING_UNAVAIL 2 #define HFI_UNAVAIL 3 +/* HFI window states */ +#define WIN_AVAILABLE 0 +#define WIN_RESERVED 1 +#define WIN_OPENED 2 +#define WIN_SUSPENDED 3 +#define WIN_ERROR 4 +#define WIN_HERROR 5 +#define WIN_PENDING 6 +#define WIN_FAIL_CLOSE 7 + #endif /* _HFIDD_ADPT_H_ */ diff --git a/include/linux/hfi/hfidd_client.h b/include/linux/hfi/hfidd_client.h index b2ebd01..c3c8fef 100644 --- a/include/linux/hfi/hfidd_client.h +++ b/include/linux/hfi/hfidd_client.h @@ -64,6 +64,33 @@ struct hfi_req_hdr { }; #define HFIDD_REQ_HDR_SIZE sizeof(struct hfi_req_hdr) +struct fifo_info { + struct hfi_64b eaddr; + unsigned long long size; /* bytes */ +}; + +#define HFIDD_IP_WIN 1 /* IP windows get broadcasts forwarded + to them... */ +#define HFIDD_KERNEL_WIN 2 /* ... other kernel windows do not */ +#define HFIDD_RESERVE_WIN 3 /* Must be reserved by job scheduler */ +#define HFIDD_DYNAMIC_WIN 4 /* First come, first served. Window# is + returned */ +struct hfi_client_info { + struct hfi_req_hdr hdr; + + unsigned int window; + unsigned int win_type; /* HFIDD_*_WIN */ + unsigned int job_id; + unsigned int protection_key_flag; + unsigned int protection_key; + unsigned int local_isrid; /* Output */ + struct fifo_info sfifo; + struct fifo_info rfifo; + struct hfi_64b sfifo_finish_vec; + unsigned int sfifo_lkey; /* Output */ + struct hfi_64b mmio_regs; /* Output */ +}; + #define MAX_TORRENTS 1 #define MAX_HFI_PER_TORRENT 2 #define MAX_HFIS (MAX_TORRENTS * MAX_HFI_PER_TORRENT) diff --git a/include/linux/hfi/hfidd_internal.h b/include/linux/hfi/hfidd_internal.h index 311f906..a36c244 100644 --- a/include/linux/hfi/hfidd_internal.h +++ b/include/linux/hfi/hfidd_internal.h @@ -59,9 +59,13 @@ #include #include #include + #include #include #include + +#define MAX_D_WIN_PER_HFI (p_acs->dds.num_d_windows) + #define HFIDD_DEV_NAME "hfi" #define HFIDD_CLASS_NAME "hfi" @@ -76,6 +80,44 @@ struct hfidd_dds { unsigned long long fw_ec_level; /* Firmware Level */ }; +struct hfidd_fifo { + unsigned long long eaddr; + unsigned long long size; +}; + +#define IRQ_NAME_SIZE 20 + +struct hfidd_window { + spinlock_t win_lock; /* lock for window */ + int index; + unsigned int type; /* dynamic/scheduled */ + int state; + + unsigned int ai; /* index to p_acs */ + unsigned int is_ip; + + unsigned int job_id; + unsigned int pid; + unsigned int protection_key_flag; /* by job/task */ + + unsigned int recv_intr; /* Recv interrupt */ + unsigned int send_intr; /* Send interrupt */ + char recv_name[IRQ_NAME_SIZE]; + char send_name[IRQ_NAME_SIZE]; + + uid_t uid; + + struct hfi_client_info client_info; /* From user input */ + struct win_open_info *win_open_info_p; /* virtual addr + OPEN_WINDOW hcall */ + caddr_t win_open_info_laddr; /* logical addr + OPEN_WINDOW hcall */ + unsigned long long mmio_regs; /* logical addr from + OPEN WINDOW hcall */ + struct hfidd_vlxmem *sfifo_x_tab; + struct hfidd_vlxmem *rfifo_x_tab; +}; + #define HFI_DEVICE_NAME_MAX 64 /* hfi global */ struct hfidd_acs { @@ -87,6 +129,7 @@ struct hfidd_acs { unsigned int isr; + struct hfidd_window **win; struct device *hfidd_dev; struct hfidd_dds dds; }; -- 1.7.3.1