0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031 #include "bman_test.h"
0032
0033 #define NUM_BUFS 93
0034 #define LOOPS 3
0035 #define BMAN_TOKEN_MASK 0x00FFFFFFFFFFLLU
0036
0037 static struct bman_pool *pool;
0038 static struct bm_buffer bufs_in[NUM_BUFS] ____cacheline_aligned;
0039 static struct bm_buffer bufs_out[NUM_BUFS] ____cacheline_aligned;
0040 static int bufs_received;
0041
0042 static void bufs_init(void)
0043 {
0044 int i;
0045
0046 for (i = 0; i < NUM_BUFS; i++)
0047 bm_buffer_set64(&bufs_in[i], 0xfedc01234567LLU * i);
0048 bufs_received = 0;
0049 }
0050
0051 static inline int bufs_cmp(const struct bm_buffer *a, const struct bm_buffer *b)
0052 {
0053 if (bman_ip_rev == BMAN_REV20 || bman_ip_rev == BMAN_REV21) {
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066 if ((bm_buffer_get64(a) & BMAN_TOKEN_MASK) <
0067 (bm_buffer_get64(b) & BMAN_TOKEN_MASK))
0068 return -1;
0069 if ((bm_buffer_get64(a) & BMAN_TOKEN_MASK) >
0070 (bm_buffer_get64(b) & BMAN_TOKEN_MASK))
0071 return 1;
0072 } else {
0073 if (bm_buffer_get64(a) < bm_buffer_get64(b))
0074 return -1;
0075 if (bm_buffer_get64(a) > bm_buffer_get64(b))
0076 return 1;
0077 }
0078
0079 return 0;
0080 }
0081
0082 static void bufs_confirm(void)
0083 {
0084 int i, j;
0085
0086 for (i = 0; i < NUM_BUFS; i++) {
0087 int matches = 0;
0088
0089 for (j = 0; j < NUM_BUFS; j++)
0090 if (!bufs_cmp(&bufs_in[i], &bufs_out[j]))
0091 matches++;
0092 WARN_ON(matches != 1);
0093 }
0094 }
0095
0096
0097 void bman_test_api(void)
0098 {
0099 int i, loops = LOOPS;
0100
0101 bufs_init();
0102
0103 pr_info("%s(): Starting\n", __func__);
0104
0105 pool = bman_new_pool();
0106 if (!pool) {
0107 pr_crit("bman_new_pool() failed\n");
0108 goto failed;
0109 }
0110
0111
0112 do_loop:
0113 i = 0;
0114 while (i < NUM_BUFS) {
0115 int num = 8;
0116
0117 if (i + num > NUM_BUFS)
0118 num = NUM_BUFS - i;
0119 if (bman_release(pool, bufs_in + i, num)) {
0120 pr_crit("bman_release() failed\n");
0121 goto failed;
0122 }
0123 i += num;
0124 }
0125
0126
0127 while (i > 0) {
0128 int tmp, num = 8;
0129
0130 if (num > i)
0131 num = i;
0132 tmp = bman_acquire(pool, bufs_out + i - num, num);
0133 WARN_ON(tmp != num);
0134 i -= num;
0135 }
0136 i = bman_acquire(pool, NULL, 1);
0137 WARN_ON(i > 0);
0138
0139 bufs_confirm();
0140
0141 if (--loops)
0142 goto do_loop;
0143
0144
0145 bman_free_pool(pool);
0146 pr_info("%s(): Finished\n", __func__);
0147 return;
0148
0149 failed:
0150 WARN_ON(1);
0151 }