xref: /dpdk/drivers/raw/ifpga/base/opae_hw_api.c (revision e6a2804b77c5fbfd97d0fe05ec7f959a0404a380)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2010-2018 Intel Corporation
3  */
4 
5 #include <sys/mman.h>
6 #include <sys/stat.h>
7 #include <fcntl.h>
8 #include <unistd.h>
9 #include "opae_hw_api.h"
10 #include "opae_debug.h"
11 #include "ifpga_api.h"
12 
13 /* OPAE Bridge Functions */
14 
15 /**
16  * opae_bridge_alloc - alloc opae_bridge data structure
17  * @name: bridge name.
18  * @ops: ops of this bridge.
19  * @data: private data of this bridge.
20  *
21  * Return opae_bridge on success, otherwise NULL.
22  */
23 struct opae_bridge *
opae_bridge_alloc(const char * name,struct opae_bridge_ops * ops,void * data)24 opae_bridge_alloc(const char *name, struct opae_bridge_ops *ops, void *data)
25 {
26 	struct opae_bridge *br = opae_zmalloc(sizeof(*br));
27 
28 	if (!br)
29 		return NULL;
30 
31 	br->name = name;
32 	br->ops = ops;
33 	br->data = data;
34 
35 	opae_log("%s %p\n", __func__, br);
36 
37 	return br;
38 }
39 
40 /**
41  * opae_bridge_reset -  reset opae_bridge
42  * @br: bridge to be reset.
43  *
44  * Return: 0 on success, otherwise error code.
45  */
opae_bridge_reset(struct opae_bridge * br)46 int opae_bridge_reset(struct opae_bridge *br)
47 {
48 	if (!br)
49 		return -EINVAL;
50 
51 	if (br->ops && br->ops->reset)
52 		return br->ops->reset(br);
53 
54 	opae_log("%s no ops\n", __func__);
55 
56 	return -ENOENT;
57 }
58 
59 /* Accelerator Functions */
60 
61 /**
62  * opae_accelerator_alloc - alloc opae_accelerator data structure
63  * @name: accelerator name.
64  * @ops: ops of this accelerator.
65  * @data: private data of this accelerator.
66  *
67  * Return: opae_accelerator on success, otherwise NULL.
68  */
69 struct opae_accelerator *
opae_accelerator_alloc(const char * name,struct opae_accelerator_ops * ops,void * data)70 opae_accelerator_alloc(const char *name, struct opae_accelerator_ops *ops,
71 		       void *data)
72 {
73 	struct opae_accelerator *acc = opae_zmalloc(sizeof(*acc));
74 
75 	if (!acc)
76 		return NULL;
77 
78 	acc->name = name;
79 	acc->ops = ops;
80 	acc->data = data;
81 
82 	opae_log("%s %p\n", __func__, acc);
83 
84 	return acc;
85 }
86 
87 /**
88  * opae_acc_reg_read - read accelerator's register from its reg region.
89  * @acc: accelerator to read.
90  * @region_idx: reg region index.
91  * @offset: reg offset.
92  * @byte: read operation width, e.g 4 byte = 32bit read.
93  * @data: data to store the value read from the register.
94  *
95  * Return: 0 on success, otherwise error code.
96  */
opae_acc_reg_read(struct opae_accelerator * acc,unsigned int region_idx,u64 offset,unsigned int byte,void * data)97 int opae_acc_reg_read(struct opae_accelerator *acc, unsigned int region_idx,
98 		      u64 offset, unsigned int byte, void *data)
99 {
100 	if (!acc || !data)
101 		return -EINVAL;
102 
103 	if (acc->ops && acc->ops->read)
104 		return acc->ops->read(acc, region_idx, offset, byte, data);
105 
106 	return -ENOENT;
107 }
108 
109 /**
110  * opae_acc_reg_write - write to accelerator's register from its reg region.
111  * @acc: accelerator to write.
112  * @region_idx: reg region index.
113  * @offset: reg offset.
114  * @byte: write operation width, e.g 4 byte = 32bit write.
115  * @data: data stored the value to write to the register.
116  *
117  * Return: 0 on success, otherwise error code.
118  */
opae_acc_reg_write(struct opae_accelerator * acc,unsigned int region_idx,u64 offset,unsigned int byte,void * data)119 int opae_acc_reg_write(struct opae_accelerator *acc, unsigned int region_idx,
120 		       u64 offset, unsigned int byte, void *data)
121 {
122 	if (!acc || !data)
123 		return -EINVAL;
124 
125 	if (acc->ops && acc->ops->write)
126 		return acc->ops->write(acc, region_idx, offset, byte, data);
127 
128 	return -ENOENT;
129 }
130 
131 /**
132  * opae_acc_get_info - get information of an accelerator.
133  * @acc: targeted accelerator
134  * @info: accelerator info data structure to be filled.
135  *
136  * Return: 0 on success, otherwise error code.
137  */
opae_acc_get_info(struct opae_accelerator * acc,struct opae_acc_info * info)138 int opae_acc_get_info(struct opae_accelerator *acc, struct opae_acc_info *info)
139 {
140 	if (!acc || !info)
141 		return -EINVAL;
142 
143 	if (acc->ops && acc->ops->get_info)
144 		return acc->ops->get_info(acc, info);
145 
146 	return -ENOENT;
147 }
148 
149 /**
150  * opae_acc_get_region_info - get information of an accelerator register region.
151  * @acc: targeted accelerator
152  * @info: accelerator region info data structure to be filled.
153  *
154  * Return: 0 on success, otherwise error code.
155  */
opae_acc_get_region_info(struct opae_accelerator * acc,struct opae_acc_region_info * info)156 int opae_acc_get_region_info(struct opae_accelerator *acc,
157 			     struct opae_acc_region_info *info)
158 {
159 	if (!acc || !info)
160 		return -EINVAL;
161 
162 	if (acc->ops && acc->ops->get_region_info)
163 		return acc->ops->get_region_info(acc, info);
164 
165 	return -ENOENT;
166 }
167 
168 /**
169  * opae_acc_set_irq -  set an accelerator's irq.
170  * @acc: targeted accelerator
171  * @start: start vector number
172  * @count: count of vectors to be set from the start vector
173  * @evtfds: event fds to be notified when corresponding irqs happens
174  *
175  * Return: 0 on success, otherwise error code.
176  */
opae_acc_set_irq(struct opae_accelerator * acc,u32 start,u32 count,s32 evtfds[])177 int opae_acc_set_irq(struct opae_accelerator *acc,
178 		     u32 start, u32 count, s32 evtfds[])
179 {
180 	if (!acc)
181 		return -EINVAL;
182 
183 	if (start + count <= start)
184 		return -EINVAL;
185 
186 	if (acc->ops && acc->ops->set_irq)
187 		return acc->ops->set_irq(acc, start, count, evtfds);
188 
189 	return -ENOENT;
190 }
191 
192 /**
193  * opae_acc_get_uuid -  get accelerator's UUID.
194  * @acc: targeted accelerator
195  * @uuid: a pointer to UUID
196  *
197  * Return: 0 on success, otherwise error code.
198  */
opae_acc_get_uuid(struct opae_accelerator * acc,struct uuid * uuid)199 int opae_acc_get_uuid(struct opae_accelerator *acc,
200 		      struct uuid *uuid)
201 {
202 	if (!acc || !uuid)
203 		return -EINVAL;
204 
205 	if (acc->ops && acc->ops->get_uuid)
206 		return acc->ops->get_uuid(acc, uuid);
207 
208 	return -ENOENT;
209 }
210 
211 /* Manager Functions */
212 
213 /**
214  * opae_manager_alloc - alloc opae_manager data structure
215  * @name: manager name.
216  * @ops: ops of this manager.
217  * @network_ops: ops of network management.
218  * @data: private data of this manager.
219  *
220  * Return: opae_manager on success, otherwise NULL.
221  */
222 struct opae_manager *
opae_manager_alloc(const char * name,struct opae_manager_ops * ops,struct opae_manager_networking_ops * network_ops,void * data)223 opae_manager_alloc(const char *name, struct opae_manager_ops *ops,
224 		struct opae_manager_networking_ops *network_ops, void *data)
225 {
226 	struct opae_manager *mgr = opae_zmalloc(sizeof(*mgr));
227 
228 	if (!mgr)
229 		return NULL;
230 
231 	mgr->name = name;
232 	mgr->ops = ops;
233 	mgr->network_ops = network_ops;
234 	mgr->data = data;
235 
236 	opae_log("%s %p\n", __func__, mgr);
237 
238 	return mgr;
239 }
240 
241 /**
242  * opae_manager_flash - flash a reconfiguration image via opae_manager
243  * @mgr: opae_manager for flash.
244  * @id: id of target region (accelerator).
245  * @buf: image data buffer.
246  * @size: buffer size.
247  * @status: status to store flash result.
248  *
249  * Return: 0 on success, otherwise error code.
250  */
opae_manager_flash(struct opae_manager * mgr,int id,const char * buf,u32 size,u64 * status)251 int opae_manager_flash(struct opae_manager *mgr, int id, const char *buf,
252 		u32 size, u64 *status)
253 {
254 	if (!mgr)
255 		return -EINVAL;
256 
257 	if (mgr && mgr->ops && mgr->ops->flash)
258 		return mgr->ops->flash(mgr, id, buf, size, status);
259 
260 	return -ENOENT;
261 }
262 
263 /* Adapter Functions */
264 
265 /**
266  * opae_adapter_data_alloc - alloc opae_adapter_data data structure
267  * @type: opae_adapter_type.
268  *
269  * Return: opae_adapter_data on success, otherwise NULL.
270  */
opae_adapter_data_alloc(enum opae_adapter_type type)271 void *opae_adapter_data_alloc(enum opae_adapter_type type)
272 {
273 	struct opae_adapter_data *data;
274 	int size;
275 
276 	switch (type) {
277 	case OPAE_FPGA_PCI:
278 		size = sizeof(struct opae_adapter_data_pci);
279 		break;
280 	case OPAE_FPGA_NET:
281 		size = sizeof(struct opae_adapter_data_net);
282 		break;
283 	default:
284 		size = sizeof(struct opae_adapter_data);
285 		break;
286 	}
287 
288 	data = opae_zmalloc(size);
289 	if (!data)
290 		return NULL;
291 
292 	data->type = type;
293 
294 	return data;
295 }
296 
match_ops(struct opae_adapter * adapter)297 static struct opae_adapter_ops *match_ops(struct opae_adapter *adapter)
298 {
299 	struct opae_adapter_data *data;
300 
301 	if (!adapter || !adapter->data)
302 		return NULL;
303 
304 	data = adapter->data;
305 
306 	if (data->type == OPAE_FPGA_PCI)
307 		return &ifpga_adapter_ops;
308 
309 	return NULL;
310 }
311 
opae_mutex_init(pthread_mutex_t * mutex)312 static void opae_mutex_init(pthread_mutex_t *mutex)
313 {
314 	pthread_mutexattr_t mattr;
315 
316 	pthread_mutexattr_init(&mattr);
317 	pthread_mutexattr_settype(&mattr, PTHREAD_MUTEX_RECURSIVE);
318 	pthread_mutexattr_setpshared(&mattr, PTHREAD_PROCESS_SHARED);
319 	pthread_mutexattr_setrobust(&mattr, PTHREAD_MUTEX_ROBUST);
320 	pthread_mutexattr_setprotocol(&mattr, PTHREAD_PRIO_INHERIT);
321 	pthread_mutex_init(mutex, &mattr);
322 	pthread_mutexattr_destroy(&mattr);
323 }
324 
opae_shm_open(char * shm_name,u32 size,int * new_shm)325 static int opae_shm_open(char *shm_name, u32 size, int *new_shm)
326 {
327 	int shm_id;
328 	int ret;
329 
330 	shm_id = shm_open(shm_name, O_CREAT | O_EXCL | O_RDWR, 0666);
331 	if (shm_id == -1) {
332 		if (errno == EEXIST) {
333 			dev_info(NULL, "shared memory %s already exist\n",
334 					shm_name);
335 			shm_id = shm_open(shm_name, O_RDWR, 0666);
336 		} else {
337 			dev_err(NULL, "failed to create shared memory %s\n",
338 					shm_name);
339 			return -1;
340 		}
341 	} else {
342 		*new_shm = 1;
343 		ret = ftruncate(shm_id, size);
344 		if (ret == -1) {
345 			dev_err(NULL,
346 					"failed to set shared memory size to %u\n",
347 					size);
348 			ret = shm_unlink(shm_name);
349 			if (ret == -1) {
350 				dev_err(NULL,
351 						"failed to unlink shared memory %s\n",
352 						shm_name);
353 			}
354 			return -1;
355 		}
356 	}
357 
358 	return shm_id;
359 }
360 
opae_adapter_mutex_open(struct opae_adapter * adapter)361 static pthread_mutex_t *opae_adapter_mutex_open(struct opae_adapter *adapter)
362 {
363 	char shm_name[32];
364 	void *ptr;
365 	int shm_id;
366 	int new_shm = 0;
367 
368 	if (!adapter->data)
369 		return NULL;
370 	adapter->lock = NULL;
371 
372 	snprintf(shm_name, sizeof(shm_name), "/mutex.IFPGA:%s", adapter->name);
373 	shm_id = opae_shm_open(shm_name, sizeof(pthread_mutex_t), &new_shm);
374 	if (shm_id == -1) {
375 		dev_err(NULL, "failed to open shared memory %s\n", shm_name);
376 	} else {
377 		dev_info(NULL, "shared memory %s id is %d\n",
378 				shm_name, shm_id);
379 		ptr = mmap(NULL, sizeof(pthread_mutex_t),
380 				PROT_READ | PROT_WRITE, MAP_SHARED,
381 				shm_id, 0);
382 		adapter->lock = (pthread_mutex_t *)ptr;
383 		if (ptr != MAP_FAILED) {
384 			dev_info(NULL,
385 					"shared memory %s address is %p\n",
386 					shm_name, ptr);
387 			if (new_shm)
388 				opae_mutex_init(adapter->lock);
389 		} else {
390 			dev_err(NULL, "failed to map shared memory %s\n",
391 					shm_name);
392 		}
393 	}
394 
395 	return adapter->lock;
396 }
397 
opae_adapter_mutex_close(struct opae_adapter * adapter)398 static void opae_adapter_mutex_close(struct opae_adapter *adapter)
399 {
400 	char shm_name[32];
401 	int ret;
402 
403 	if (!adapter->lock)
404 		return;
405 
406 	snprintf(shm_name, sizeof(shm_name), "/mutex.IFPGA:%s", adapter->name);
407 
408 	ret = munmap(adapter->lock, sizeof(pthread_mutex_t));
409 	if (ret == -1)
410 		dev_err(NULL, "failed to unmap shared memory %s\n", shm_name);
411 	else
412 		adapter->lock = NULL;
413 }
414 
415 /**
416  * opae_adapter_lock - lock this adapter
417  * @adapter: adapter to lock.
418  * @timeout: maximum time to wait for lock done
419  *           -1  wait until the lock is available
420  *           0   do not wait and return immediately
421  *           t   positive time in second to wait
422  *
423  * Return: 0 on success, otherwise error code.
424  */
opae_adapter_lock(struct opae_adapter * adapter,int timeout)425 int opae_adapter_lock(struct opae_adapter *adapter, int timeout)
426 {
427 	struct timespec t;
428 	int ret = -EINVAL;
429 
430 	if (adapter && adapter->lock) {
431 		if (timeout < 0) {
432 			ret = pthread_mutex_lock(adapter->lock);
433 		} else if (timeout == 0) {
434 			ret = pthread_mutex_trylock(adapter->lock);
435 		} else {
436 			clock_gettime(CLOCK_REALTIME, &t);
437 			t.tv_sec += timeout;
438 			ret = pthread_mutex_timedlock(adapter->lock, &t);
439 		}
440 	}
441 	return ret;
442 }
443 
444 /**
445  * opae_adapter_unlock - unlock this adapter
446  * @adapter: adapter to unlock.
447  *
448  * Return: 0 on success, otherwise error code.
449  */
opae_adapter_unlock(struct opae_adapter * adapter)450 int opae_adapter_unlock(struct opae_adapter *adapter)
451 {
452 	int ret = -EINVAL;
453 
454 	if (adapter && adapter->lock)
455 		ret = pthread_mutex_unlock(adapter->lock);
456 
457 	return ret;
458 }
459 
opae_adapter_shm_init(struct opae_adapter * adapter)460 static void opae_adapter_shm_init(struct opae_adapter *adapter)
461 {
462 	opae_share_data *sd;
463 
464 	if (!adapter->shm.ptr)
465 		return;
466 
467 	sd = (opae_share_data *)adapter->shm.ptr;
468 	dev_info(NULL, "initialize shared memory\n");
469 	opae_mutex_init(&sd->spi_mutex);
470 	opae_mutex_init(&sd->i2c_mutex);
471 	sd->ref_cnt = 0;
472 	sd->dtb_size = SHM_BLK_SIZE;
473 	sd->rsu_ctrl = 0;
474 	sd->rsu_stat = 0;
475 }
476 
opae_adapter_shm_alloc(struct opae_adapter * adapter)477 static void *opae_adapter_shm_alloc(struct opae_adapter *adapter)
478 {
479 	char shm_name[32];
480 	opae_share_data *sd;
481 	u32 size = sizeof(opae_share_data);
482 	int shm_id;
483 	int new_shm = 0;
484 
485 	if (!adapter->data)
486 		return NULL;
487 
488 	snprintf(shm_name, sizeof(shm_name), "/IFPGA:%s", adapter->name);
489 	adapter->shm.ptr = NULL;
490 
491 	opae_adapter_lock(adapter, -1);
492 	shm_id = opae_shm_open(shm_name, size, &new_shm);
493 	if (shm_id == -1) {
494 		dev_err(NULL, "failed to open shared memory %s\n", shm_name);
495 	} else {
496 		dev_info(NULL, "shared memory %s id is %d\n",
497 				shm_name, shm_id);
498 		adapter->shm.id = shm_id;
499 		adapter->shm.size = size;
500 		adapter->shm.ptr = mmap(NULL, size, PROT_READ | PROT_WRITE,
501 							MAP_SHARED, shm_id, 0);
502 		if (adapter->shm.ptr != MAP_FAILED) {
503 			dev_info(NULL,
504 					"shared memory %s address is %p\n",
505 					shm_name, adapter->shm.ptr);
506 			if (new_shm)
507 				opae_adapter_shm_init(adapter);
508 			sd = (opae_share_data *)adapter->shm.ptr;
509 			sd->ref_cnt++;
510 		} else {
511 			dev_err(NULL, "failed to map shared memory %s\n",
512 					shm_name);
513 		}
514 	}
515 	opae_adapter_unlock(adapter);
516 
517 	return adapter->shm.ptr;
518 }
519 
opae_adapter_shm_free(struct opae_adapter * adapter)520 static void opae_adapter_shm_free(struct opae_adapter *adapter)
521 {
522 	char shm_name[32];
523 	opae_share_data *sd;
524 	u32 ref_cnt;
525 	int ret;
526 
527 	if (!adapter->shm.ptr)
528 		return;
529 
530 	sd = (opae_share_data *)adapter->shm.ptr;
531 	snprintf(shm_name, sizeof(shm_name), "/IFPGA:%s", adapter->name);
532 
533 	opae_adapter_lock(adapter, -1);
534 	ref_cnt = --sd->ref_cnt;
535 	ret = munmap(adapter->shm.ptr, adapter->shm.size);
536 	if (ret == -1)
537 		dev_err(NULL, "failed to unmap shared memory %s\n", shm_name);
538 	else
539 		adapter->shm.ptr = NULL;
540 
541 	if (ref_cnt == 0) {
542 		dev_info(NULL, "unlink shared memory %s\n", shm_name);
543 		ret = shm_unlink(shm_name);
544 		if (ret == -1) {
545 			dev_err(NULL, "failed to unlink shared memory %s\n",
546 					shm_name);
547 		}
548 	}
549 	opae_adapter_unlock(adapter);
550 }
551 
552 /**
553  * opae_adapter_init - init opae_adapter data structure
554  * @adapter: pointer of opae_adapter data structure
555  * @name: adapter name.
556  * @data: private data of this adapter.
557  *
558  * Return: 0 on success.
559  */
opae_adapter_init(struct opae_adapter * adapter,const char * name,void * data)560 int opae_adapter_init(struct opae_adapter *adapter,
561 		const char *name, void *data)
562 {
563 	if (!adapter)
564 		return -ENOMEM;
565 
566 	TAILQ_INIT(&adapter->acc_list);
567 	adapter->data = data;
568 	adapter->name = name;
569 	adapter->ops = match_ops(adapter);
570 
571 	if (!opae_adapter_mutex_open(adapter))
572 		return -ENOMEM;
573 
574 	if (!opae_adapter_shm_alloc(adapter))
575 		return -ENOMEM;
576 
577 	return 0;
578 }
579 
580 /**
581  * opae_adapter_enumerate - enumerate this adapter
582  * @adapter: adapter to enumerate.
583  *
584  * Return: 0 on success, otherwise error code.
585  */
opae_adapter_enumerate(struct opae_adapter * adapter)586 int opae_adapter_enumerate(struct opae_adapter *adapter)
587 {
588 	int ret = -ENOENT;
589 
590 	if (!adapter)
591 		return -EINVAL;
592 
593 	if (adapter->ops && adapter->ops->enumerate)
594 		ret = adapter->ops->enumerate(adapter);
595 
596 	if (!ret)
597 		opae_adapter_dump(adapter, 0);
598 
599 	return ret;
600 }
601 
602 /**
603  * opae_adapter_destroy - destroy this adapter
604  * @adapter: adapter to destroy.
605  *
606  * destroy things allocated during adapter enumeration.
607  */
opae_adapter_destroy(struct opae_adapter * adapter)608 void opae_adapter_destroy(struct opae_adapter *adapter)
609 {
610 	if (adapter) {
611 		if (adapter->ops && adapter->ops->destroy)
612 			adapter->ops->destroy(adapter);
613 		opae_adapter_shm_free(adapter);
614 		opae_adapter_mutex_close(adapter);
615 	}
616 }
617 
618 /**
619  * opae_adapter_get_acc - find and return accelerator with matched id
620  * @adapter: adapter to find the accelerator.
621  * @acc_id: id (index) of the accelerator.
622  *
623  * destroy things allocated during adapter enumeration.
624  */
625 struct opae_accelerator *
opae_adapter_get_acc(struct opae_adapter * adapter,int acc_id)626 opae_adapter_get_acc(struct opae_adapter *adapter, int acc_id)
627 {
628 	struct opae_accelerator *acc = NULL;
629 
630 	if (!adapter)
631 		return NULL;
632 
633 	opae_adapter_for_each_acc(adapter, acc)
634 		if (acc->index == acc_id)
635 			return acc;
636 
637 	return NULL;
638 }
639 
640 /**
641  * opae_manager_read_mac_rom - read the content of the MAC ROM
642  * @mgr: opae_manager for MAC ROM
643  * @port: the port number of retimer
644  * @addr: buffer of the MAC address
645  *
646  * Return: return the bytes of read successfully
647  */
opae_manager_read_mac_rom(struct opae_manager * mgr,int port,struct opae_ether_addr * addr)648 int opae_manager_read_mac_rom(struct opae_manager *mgr, int port,
649 		struct opae_ether_addr *addr)
650 {
651 	if (!mgr || !mgr->network_ops)
652 		return -EINVAL;
653 
654 	if (mgr->network_ops->read_mac_rom)
655 		return mgr->network_ops->read_mac_rom(mgr,
656 				port * sizeof(struct opae_ether_addr),
657 				addr, sizeof(struct opae_ether_addr));
658 
659 	return -ENOENT;
660 }
661 
662 /**
663  * opae_manager_write_mac_rom - write data into MAC ROM
664  * @mgr: opae_manager for MAC ROM
665  * @port: the port number of the retimer
666  * @addr: data of the MAC address
667  *
668  * Return: return written bytes
669  */
opae_manager_write_mac_rom(struct opae_manager * mgr,int port,struct opae_ether_addr * addr)670 int opae_manager_write_mac_rom(struct opae_manager *mgr, int port,
671 		struct opae_ether_addr *addr)
672 {
673 	if (!mgr || !mgr->network_ops)
674 		return -EINVAL;
675 
676 	if (mgr->network_ops && mgr->network_ops->write_mac_rom)
677 		return mgr->network_ops->write_mac_rom(mgr,
678 				port * sizeof(struct opae_ether_addr),
679 				addr, sizeof(struct opae_ether_addr));
680 
681 	return -ENOENT;
682 }
683 
684 /**
685  * opae_manager_get_eth_group_nums - get eth group numbers
686  * @mgr: opae_manager for eth group
687  *
688  * Return: the numbers of eth group
689  */
opae_manager_get_eth_group_nums(struct opae_manager * mgr)690 int opae_manager_get_eth_group_nums(struct opae_manager *mgr)
691 {
692 	if (!mgr || !mgr->network_ops)
693 		return -EINVAL;
694 
695 	if (mgr->network_ops->get_retimer_info)
696 		return mgr->network_ops->get_eth_group_nums(mgr);
697 
698 	return -ENOENT;
699 }
700 
701 /**
702  * opae_manager_get_eth_group_info - get eth group info
703  * @mgr: opae_manager for eth group
704  * @group_id: id for eth group
705  * @info: info return to caller
706  *
707  * Return: 0 on success, otherwise error code
708  */
opae_manager_get_eth_group_info(struct opae_manager * mgr,u8 group_id,struct opae_eth_group_info * info)709 int opae_manager_get_eth_group_info(struct opae_manager *mgr,
710 	       u8 group_id, struct opae_eth_group_info *info)
711 {
712 	if (!mgr || !mgr->network_ops)
713 		return -EINVAL;
714 
715 	if (mgr->network_ops->get_retimer_info)
716 		return mgr->network_ops->get_eth_group_info(mgr,
717 			group_id, info);
718 
719 	return -ENOENT;
720 }
721 
722 /**
723  * opae_manager_get_eth_group_region_info
724  * @mgr: opae_manager for flash.
725  * @info: the memory region info for eth group
726  *
727  * Return: 0 on success, otherwise error code.
728  */
opae_manager_get_eth_group_region_info(struct opae_manager * mgr,u8 group_id,struct opae_eth_group_region_info * info)729 int opae_manager_get_eth_group_region_info(struct opae_manager *mgr,
730 		u8 group_id, struct opae_eth_group_region_info *info)
731 {
732 	if (!mgr)
733 		return -EINVAL;
734 
735 	if (group_id >= MAX_ETH_GROUP_DEVICES)
736 		return -EINVAL;
737 
738 	info->group_id = group_id;
739 
740 	if (mgr && mgr->ops && mgr->ops->get_eth_group_region_info)
741 		return mgr->ops->get_eth_group_region_info(mgr, info);
742 
743 	return -ENOENT;
744 }
745 
746 /**
747  * opae_manager_eth_group_read_reg - read ETH group register
748  * @mgr: opae_manager for ETH Group
749  * @group_id: ETH group id
750  * @type: eth type
751  * @index: port index in eth group device
752  * @addr: register address of ETH Group
753  * @data: read buffer
754  *
755  * Return: 0 on success, otherwise error code
756  */
opae_manager_eth_group_read_reg(struct opae_manager * mgr,u8 group_id,u8 type,u8 index,u16 addr,u32 * data)757 int opae_manager_eth_group_read_reg(struct opae_manager *mgr, u8 group_id,
758 		u8 type, u8 index, u16 addr, u32 *data)
759 {
760 	if (!mgr || !mgr->network_ops)
761 		return -EINVAL;
762 
763 	if (mgr->network_ops->eth_group_reg_read)
764 		return mgr->network_ops->eth_group_reg_read(mgr, group_id,
765 				type, index, addr, data);
766 
767 	return -ENOENT;
768 }
769 
770 /**
771  * opae_manager_eth_group_write_reg - write ETH group register
772  * @mgr: opae_manager for ETH Group
773  * @group_id: ETH group id
774  * @type: eth type
775  * @index: port index in eth group device
776  * @addr: register address of ETH Group
777  * @data: data will write to register
778  *
779  * Return: 0 on success, otherwise error code
780  */
opae_manager_eth_group_write_reg(struct opae_manager * mgr,u8 group_id,u8 type,u8 index,u16 addr,u32 data)781 int opae_manager_eth_group_write_reg(struct opae_manager *mgr, u8 group_id,
782 		u8 type, u8 index, u16 addr, u32 data)
783 {
784 	if (!mgr || !mgr->network_ops)
785 		return -EINVAL;
786 
787 	if (mgr->network_ops->eth_group_reg_write)
788 		return mgr->network_ops->eth_group_reg_write(mgr, group_id,
789 				type, index, addr, data);
790 
791 	return -ENOENT;
792 }
793 
794 /**
795  * opae_manager_get_retimer_info - get retimer info like PKVL chip
796  * @mgr: opae_manager for retimer
797  * @info: info return to caller
798  *
799  * Return: 0 on success, otherwise error code
800  */
opae_manager_get_retimer_info(struct opae_manager * mgr,struct opae_retimer_info * info)801 int opae_manager_get_retimer_info(struct opae_manager *mgr,
802 	       struct opae_retimer_info *info)
803 {
804 	if (!mgr || !mgr->network_ops)
805 		return -EINVAL;
806 
807 	if (mgr->network_ops->get_retimer_info)
808 		return mgr->network_ops->get_retimer_info(mgr, info);
809 
810 	return -ENOENT;
811 }
812 
813 /**
814  * opae_manager_get_retimer_status - get retimer status
815  * @mgr: opae_manager of retimer
816  * @status: status of retimer
817  *
818  * Return: 0 on success, otherwise error code
819  */
opae_manager_get_retimer_status(struct opae_manager * mgr,struct opae_retimer_status * status)820 int opae_manager_get_retimer_status(struct opae_manager *mgr,
821 		struct opae_retimer_status *status)
822 {
823 	if (!mgr || !mgr->network_ops)
824 		return -EINVAL;
825 
826 	if (mgr->network_ops->get_retimer_status)
827 		return mgr->network_ops->get_retimer_status(mgr,
828 				status);
829 
830 	return -ENOENT;
831 }
832 
833 /**
834  * opae_manager_get_sensor_list - get sensor name list
835  * @mgr: opae_manager of sensors
836  * @buf: buffer to accommodate name list separated by semicolon
837  * @size: size of buffer
838  *
839  * Return: the pointer of the opae_sensor_info
840  */
841 int
opae_mgr_get_sensor_list(struct opae_manager * mgr,char * buf,size_t size)842 opae_mgr_get_sensor_list(struct opae_manager *mgr, char *buf, size_t size)
843 {
844 	struct opae_sensor_info *sensor;
845 	uint32_t offset = 0;
846 
847 	opae_mgr_for_each_sensor(mgr, sensor) {
848 		if (sensor->name) {
849 			if (buf && (offset < size))
850 				snprintf(buf + offset, size - offset, "%s;",
851 					sensor->name);
852 			offset += strlen(sensor->name) + 1;
853 		}
854 	}
855 
856 	if (buf && (offset > 0) && (offset <= size))
857 		buf[offset-1] = 0;
858 
859 	return offset;
860 }
861 
862 /**
863  * opae_manager_get_sensor_by_id - get sensor device
864  * @id: the id of the sensor
865  *
866  * Return: the pointer of the opae_sensor_info
867  */
868 struct opae_sensor_info *
opae_mgr_get_sensor_by_id(struct opae_manager * mgr,unsigned int id)869 opae_mgr_get_sensor_by_id(struct opae_manager *mgr,
870 		unsigned int id)
871 {
872 	struct opae_sensor_info *sensor;
873 
874 	opae_mgr_for_each_sensor(mgr, sensor)
875 		if (sensor->id == id)
876 			return sensor;
877 
878 	return NULL;
879 }
880 
881 /**
882  * opae_manager_get_sensor_by_name - get sensor device
883  * @name: the name of the sensor
884  *
885  * Return: the pointer of the opae_sensor_info
886  */
887 struct opae_sensor_info *
opae_mgr_get_sensor_by_name(struct opae_manager * mgr,const char * name)888 opae_mgr_get_sensor_by_name(struct opae_manager *mgr,
889 		const char *name)
890 {
891 	struct opae_sensor_info *sensor;
892 
893 	opae_mgr_for_each_sensor(mgr, sensor)
894 		if (!strcmp(sensor->name, name))
895 			return sensor;
896 
897 	return NULL;
898 }
899 
900 /**
901  * opae_manager_get_sensor_value_by_name - find the sensor by name and read out
902  * the value
903  * @mgr: opae_manager for sensor.
904  * @name: the name of the sensor
905  * @value: the readout sensor value
906  *
907  * Return: 0 on success, otherwise error code
908  */
909 int
opae_mgr_get_sensor_value_by_name(struct opae_manager * mgr,const char * name,unsigned int * value)910 opae_mgr_get_sensor_value_by_name(struct opae_manager *mgr,
911 		const char *name, unsigned int *value)
912 {
913 	struct opae_sensor_info *sensor;
914 
915 	if (!mgr)
916 		return -EINVAL;
917 
918 	sensor = opae_mgr_get_sensor_by_name(mgr, name);
919 	if (!sensor)
920 		return -ENODEV;
921 
922 	if (mgr->ops && mgr->ops->get_sensor_value)
923 		return mgr->ops->get_sensor_value(mgr, sensor, value);
924 
925 	return -ENOENT;
926 }
927 
928 /**
929  * opae_manager_get_sensor_value_by_id - find the sensor by id and readout the
930  * value
931  * @mgr: opae_manager for sensor
932  * @id: the id of the sensor
933  * @value: the readout sensor value
934  *
935  * Return: 0 on success, otherwise error code
936  */
937 int
opae_mgr_get_sensor_value_by_id(struct opae_manager * mgr,unsigned int id,unsigned int * value)938 opae_mgr_get_sensor_value_by_id(struct opae_manager *mgr,
939 		unsigned int id, unsigned int *value)
940 {
941 	struct opae_sensor_info *sensor;
942 
943 	if (!mgr)
944 		return -EINVAL;
945 
946 	sensor = opae_mgr_get_sensor_by_id(mgr, id);
947 	if (!sensor)
948 		return -ENODEV;
949 
950 	if (mgr->ops && mgr->ops->get_sensor_value)
951 		return mgr->ops->get_sensor_value(mgr, sensor, value);
952 
953 	return -ENOENT;
954 }
955 
956 /**
957  * opae_manager_get_sensor_value - get the current
958  * sensor value
959  * @mgr: opae_manager for sensor
960  * @sensor: opae_sensor_info for sensor
961  * @value: the readout sensor value
962  *
963  * Return: 0 on success, otherwise error code
964  */
965 int
opae_mgr_get_sensor_value(struct opae_manager * mgr,struct opae_sensor_info * sensor,unsigned int * value)966 opae_mgr_get_sensor_value(struct opae_manager *mgr,
967 		struct opae_sensor_info *sensor,
968 		unsigned int *value)
969 {
970 	if (!mgr || !sensor)
971 		return -EINVAL;
972 
973 	if (mgr->ops && mgr->ops->get_sensor_value)
974 		return mgr->ops->get_sensor_value(mgr, sensor, value);
975 
976 	return -ENOENT;
977 }
978 
979 /**
980  * opae_manager_get_board_info - get board info
981  * sensor value
982  * @info: opae_board_info for the card
983  *
984  * Return: 0 on success, otherwise error code
985  */
986 int
opae_mgr_get_board_info(struct opae_manager * mgr,struct opae_board_info ** info)987 opae_mgr_get_board_info(struct opae_manager *mgr,
988 		struct opae_board_info **info)
989 {
990 	if (!mgr || !info)
991 		return -EINVAL;
992 
993 	if (mgr->ops && mgr->ops->get_board_info)
994 		return mgr->ops->get_board_info(mgr, info);
995 
996 	return -ENOENT;
997 }
998 
999 /**
1000  * opae_mgr_get_uuid -  get manager's UUID.
1001  * @mgr: targeted manager
1002  * @uuid: a pointer to UUID
1003  *
1004  * Return: 0 on success, otherwise error code.
1005  */
opae_mgr_get_uuid(struct opae_manager * mgr,struct uuid * uuid)1006 int opae_mgr_get_uuid(struct opae_manager *mgr, struct uuid *uuid)
1007 {
1008 	if (!mgr || !uuid)
1009 		return -EINVAL;
1010 
1011 	if (mgr->ops && mgr->ops->get_uuid)
1012 		return mgr->ops->get_uuid(mgr, uuid);
1013 
1014 	return -ENOENT;
1015 }
1016 
1017 /**
1018  * opae_mgr_update_flash -  update image in flash.
1019  * @mgr: targeted manager
1020  * @image: name of image file
1021  * @status: status of update
1022  *
1023  * Return: 0 on success, otherwise error code.
1024  */
opae_mgr_update_flash(struct opae_manager * mgr,const char * image,uint64_t * status)1025 int opae_mgr_update_flash(struct opae_manager *mgr, const char *image,
1026 	uint64_t *status)
1027 {
1028 	if (!mgr)
1029 		return -EINVAL;
1030 
1031 	if (mgr->ops && mgr->ops->update_flash)
1032 		return mgr->ops->update_flash(mgr, image, status);
1033 
1034 	return -ENOENT;
1035 }
1036 
1037 /**
1038  * opae_stop_flash_update -  stop flash update.
1039  * @mgr: targeted manager
1040  * @force: make sure the update process is stopped
1041  *
1042  * Return: 0 on success, otherwise error code.
1043  */
opae_mgr_stop_flash_update(struct opae_manager * mgr,int force)1044 int opae_mgr_stop_flash_update(struct opae_manager *mgr, int force)
1045 {
1046 	if (!mgr)
1047 		return -EINVAL;
1048 
1049 	if (mgr->ops && mgr->ops->stop_flash_update)
1050 		return mgr->ops->stop_flash_update(mgr, force);
1051 
1052 	return -ENOENT;
1053 }
1054 
1055 /**
1056  * opae_mgr_reload -  reload FPGA.
1057  * @mgr: targeted manager
1058  * @type: FPGA type
1059  * @page: reload from which page
1060  *
1061  * Return: 0 on success, otherwise error code.
1062  */
opae_mgr_reload(struct opae_manager * mgr,int type,int page)1063 int opae_mgr_reload(struct opae_manager *mgr, int type, int page)
1064 {
1065 	if (!mgr)
1066 		return -EINVAL;
1067 
1068 	if (mgr->ops && mgr->ops->reload)
1069 		return mgr->ops->reload(mgr, type, page);
1070 
1071 	return -ENOENT;
1072 }
1073 /**
1074  * opae_mgr_read_flash -  read flash content
1075  * @mgr: targeted manager
1076  * @address: the start address of flash
1077  * @size: the size of flash
1078  * @buf: the read buffer
1079  *
1080  * Return: 0 on success, otherwise error code.
1081  */
opae_mgr_read_flash(struct opae_manager * mgr,u32 address,u32 size,void * buf)1082 int opae_mgr_read_flash(struct opae_manager *mgr, u32 address,
1083 		u32 size, void *buf)
1084 {
1085 	if (!mgr)
1086 		return -EINVAL;
1087 
1088 	if (mgr->ops && mgr->ops->read_flash)
1089 		return mgr->ops->read_flash(mgr, address, size, buf);
1090 
1091 	return -ENOENT;
1092 }
1093