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