int psl_init_afu_event(struct AFU_EVENT *event, char *server_host, int port) { psl_event_reset(event); event->room = 64; event->rbp = 0; struct hostent *he; if ((he = gethostbyname(server_host)) == NULL) { herror("gethostbyname"); return PSL_BAD_SOCKET; } struct sockaddr_in ssadr; memset(&ssadr, 0, sizeof(ssadr)); memcpy(&ssadr.sin_addr, he->h_addr_list[0], he->h_length); ssadr.sin_family = AF_INET; ssadr.sin_port = htons(port); event->sockfd = socket(PF_INET, SOCK_STREAM, 0); if (event->sockfd == 0) { perror("socket"); return PSL_BAD_SOCKET; } if (connect(event->sockfd, (struct sockaddr *)&ssadr, sizeof(ssadr)) < 0) { perror("connect"); return PSL_BAD_SOCKET; } fcntl(event->sockfd, F_SETFL, O_NONBLOCK); int rc = establish_protocol(event); printf("PSL_SOCKET: Using PSL protocol level : %d.%d.%d\n", event->proto_primary, event->proto_secondary, event->proto_tertiary); return rc; }
int psl_serv_afu_event(struct AFU_EVENT *event, int port) { int cs = -1; psl_event_reset(event); event->room = 64; event->rbp = 0; struct sockaddr_in ssadr, csadr; unsigned int csalen = sizeof(csadr); memset(&ssadr, 0, sizeof(ssadr)); ssadr.sin_family = AF_UNSPEC; ssadr.sin_addr.s_addr = INADDR_ANY; ssadr.sin_port = htons(port); event->sockfd = socket(PF_INET, SOCK_STREAM, 0); if (event->sockfd < 0) { perror("socket"); return PSL_BAD_SOCKET; } if (bind(event->sockfd, (struct sockaddr *)&ssadr, sizeof(ssadr)) == -1) { perror("bind"); psl_close_afu_event(event); return PSL_BAD_SOCKET; } char hostname[1024]; hostname[1023] = '\0'; gethostname(hostname, 1023); printf("AFU Server is waiting for connection on %s:%d\n", hostname, port); fflush(stdout); if (listen(event->sockfd, 10) == -1) { perror("listen"); psl_close_afu_event(event); return PSL_BAD_SOCKET; } while (cs < 0) { cs = accept(event->sockfd, (struct sockaddr *)&csadr, &csalen); if ((cs < 0) && (errno != EINTR)) { perror("accept"); psl_close_afu_event(event); return PSL_BAD_SOCKET; } } close(event->sockfd); event->sockfd = cs; fcntl(event->sockfd, F_SETFL, O_NONBLOCK); char clientname[1024]; clientname[1023] = '\0'; getnameinfo((struct sockaddr *)&csadr, sizeof(csadr), clientname, 1024, NULL, 0, 0); printf("PSL client connection from %s\n", clientname); int rc = establish_protocol(event); printf("Using PSL protocol level : %d.%d.%d\n", event->proto_primary, event->proto_secondary, event->proto_tertiary); return rc; }
struct cxl_afu_h * cxl_afu_open_dev(char *path) { char *x, *comment, *afu_id, *host, *port_str; struct cxl_afu_h *afu; FILE *fp; char hostdata[MAX_LINE_CHARS]; int port; uint64_t value; // Isolate AFU id from full path x = strrchr (path, '/'); x++; // Allocate AFU struct afu = (struct cxl_afu_h *) malloc (sizeof (struct cxl_afu_h)); if (!afu) { perror ("malloc"); return NULL; } // Allocate AFU_EVENT struct status.event = (struct AFU_EVENT *) malloc (sizeof (struct AFU_EVENT)); if (!status.event ) { perror ("malloc"); free (afu); return NULL; } psl_event_reset (status.event); // Connect to AFU server fp = fopen ("shim_host.dat", "r"); if (!fp) { perror ("fopen shim_host.dat"); free (status.event); free (afu); return NULL; } afu_id = x+1; host = NULL; port_str = NULL; while (strcmp (afu_id, x) && fgets (hostdata, MAX_LINE_CHARS, fp)) { afu_id = hostdata; comment = strchr(hostdata, '#'); if (comment) continue; host = strchr(hostdata, ','); if (host) { *host = '\0'; ++host; } else { printf ("Invalid format in shim_host.dat. Expected ',' :%s\n", hostdata); fclose (fp); free (status.event); free (afu); return NULL; } port_str = strchr(host, ':'); if (port_str) { *port_str = '\0'; ++port_str; } else { printf ("Invalid format in shim_host.dat. Expected ':' :%s\n", hostdata); fclose (fp); free (status.event); free (afu); return NULL; } } fclose (fp); // Convert port to int port = atoi (port_str); // Connect to AFU server printf ("Attempting to connect to %s:%d\n", host, port); if (psl_init_afu_event (status.event, host, port) != PSL_SUCCESS) { printf ("Unable to connect to %s:%d\n", host, port); free (status.event); free (afu); return NULL; } // Start PSL thread status.psl_state = PSL_INIT; status.event_occurred = 0; status.credits = 64; status.first_br = NULL; status.last_br = NULL; afu->id = afu_id; afu->mmio_size = 0; afu->attached = 0; afu->running = 0; pthread_create(&(afu->thread), NULL, psl, (void *) afu); psl_aux1_change (status.event, status.credits); // Reset AFU status.cmd.code = PSL_JOB_RESET; status.cmd.addr = 0; status.cmd.request = AFU_REQUEST; // FIXME: Add timeout while (status.cmd.request != AFU_IDLE) short_delay(); // Read AFU descriptor status.mmio.rnw = 1; status.mmio.dw = 1; status.mmio.desc = 1; // Offset 0x00 status.mmio.addr = 0; status.mmio.request = AFU_REQUEST; // FIXME: Add timeout while (status.mmio.request != AFU_IDLE) short_delay(); value = be64toh(status.mmio.data); afu->desc.req_prog_model = value && 0xffff; value >>= 16; afu->desc.num_of_afu_CRs = value && 0xffff; value >>= 16; afu->desc.num_of_processes = value && 0xffff; value >>= 16; afu->desc.num_ints_per_process = value && 0xffff; // Offset 0x20 status.mmio.addr = 8; status.mmio.request = AFU_REQUEST; // FIXME: Add timeout while (status.mmio.request != AFU_IDLE) short_delay(); afu->desc.AFU_CR_len = be64toh(status.mmio.data); // Offset 0x28 status.mmio.addr = 10; status.mmio.request = AFU_REQUEST; // FIXME: Add timeout while (status.mmio.request != AFU_IDLE) short_delay(); afu->desc.AFU_CR_offset = be64toh(status.mmio.data); // Offset 0x30 status.mmio.addr = 12; status.mmio.request = AFU_REQUEST; // FIXME: Add timeout while (status.mmio.request != AFU_IDLE) short_delay(); afu->desc.PerProcessPSA = be64toh(status.mmio.data); // Offset 0x38 status.mmio.addr = 14; status.mmio.request = AFU_REQUEST; // FIXME: Add timeout while (status.mmio.request != AFU_IDLE) short_delay(); afu->desc.PerProcessPSA_offset = be64toh(status.mmio.data); // Offset 0x40 status.mmio.addr = 16; status.mmio.request = AFU_REQUEST; // FIXME: Add timeout while (status.mmio.request != AFU_IDLE) short_delay(); afu->desc.AFU_EB_len = be64toh(status.mmio.data); // Offset 0x48 status.mmio.addr = 18; status.mmio.request = AFU_REQUEST; // FIXME: Add timeout while (status.mmio.request != AFU_IDLE) short_delay(); afu->desc.AFU_EB_offset = be64toh(status.mmio.data); status.mmio.desc = 0; return afu; }