1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35#include <linux/types.h>
36
37#define MTHCA_RD_DOORBELL 0x00
38#define MTHCA_SEND_DOORBELL 0x10
39#define MTHCA_RECEIVE_DOORBELL 0x18
40#define MTHCA_CQ_DOORBELL 0x20
41#define MTHCA_EQ_DOORBELL 0x28
42
43#if BITS_PER_LONG == 64
44
45
46
47
48
49
50#define MTHCA_DECLARE_DOORBELL_LOCK(name)
51#define MTHCA_INIT_DOORBELL_LOCK(ptr) do { } while (0)
52#define MTHCA_GET_DOORBELL_LOCK(ptr) (NULL)
53
54static inline void mthca_write64_raw(__be64 val, void __iomem *dest)
55{
56 __raw_writeq((__force u64) val, dest);
57}
58
59static inline void mthca_write64(u32 hi, u32 lo, void __iomem *dest,
60 spinlock_t *doorbell_lock)
61{
62 __raw_writeq((__force u64) cpu_to_be64((u64) hi << 32 | lo), dest);
63}
64
65static inline void mthca_write_db_rec(__be32 val[2], __be32 *db)
66{
67 *(u64 *) db = *(u64 *) val;
68}
69
70#else
71
72
73
74
75
76
77
78#define MTHCA_DECLARE_DOORBELL_LOCK(name) spinlock_t name;
79#define MTHCA_INIT_DOORBELL_LOCK(ptr) spin_lock_init(ptr)
80#define MTHCA_GET_DOORBELL_LOCK(ptr) (ptr)
81
82static inline void mthca_write64_raw(__be64 val, void __iomem *dest)
83{
84 __raw_writel(((__force u32 *) &val)[0], dest);
85 __raw_writel(((__force u32 *) &val)[1], dest + 4);
86}
87
88static inline void mthca_write64(u32 hi, u32 lo, void __iomem *dest,
89 spinlock_t *doorbell_lock)
90{
91 unsigned long flags;
92
93 hi = (__force u32) cpu_to_be32(hi);
94 lo = (__force u32) cpu_to_be32(lo);
95
96 spin_lock_irqsave(doorbell_lock, flags);
97 __raw_writel(hi, dest);
98 __raw_writel(lo, dest + 4);
99 spin_unlock_irqrestore(doorbell_lock, flags);
100}
101
102static inline void mthca_write_db_rec(__be32 val[2], __be32 *db)
103{
104 db[0] = val[0];
105 wmb();
106 db[1] = val[1];
107}
108
109#endif
110