diff options
author | Ben Hutchings <bhutchings@solarflare.com> | 2012-10-10 18:20:17 -0400 |
---|---|---|
committer | Ben Hutchings <bhutchings@solarflare.com> | 2013-08-21 11:35:28 -0400 |
commit | 338f74df399d652788cf3bab247257ae90419c7d (patch) | |
tree | 0a17c0848023dbf6b1d6d8cf7960f395acb7a5b8 /drivers | |
parent | 9528b9219348e0a013f4b587958a8ba9c96d7e20 (diff) |
sfc: Add and use MCDI_SET_QWORD() and MCDI_SET_ARRAY_QWORD()
No need to keep open-coding the assignment of high and low dwords.
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/ethernet/sfc/mcdi.h | 23 | ||||
-rw-r--r-- | drivers/net/ethernet/sfc/mcdi_mon.c | 6 | ||||
-rw-r--r-- | drivers/net/ethernet/sfc/ptp.c | 13 | ||||
-rw-r--r-- | drivers/net/ethernet/sfc/siena_sriov.c | 21 |
4 files changed, 34 insertions, 29 deletions
diff --git a/drivers/net/ethernet/sfc/mcdi.h b/drivers/net/ethernet/sfc/mcdi.h index 28657a186761..899f094dfb2a 100644 --- a/drivers/net/ethernet/sfc/mcdi.h +++ b/drivers/net/ethernet/sfc/mcdi.h | |||
@@ -88,9 +88,9 @@ extern void efx_mcdi_process_event(struct efx_channel *channel, | |||
88 | extern void efx_mcdi_sensor_event(struct efx_nic *efx, efx_qword_t *ev); | 88 | extern void efx_mcdi_sensor_event(struct efx_nic *efx, efx_qword_t *ev); |
89 | 89 | ||
90 | /* We expect that 16- and 32-bit fields in MCDI requests and responses | 90 | /* We expect that 16- and 32-bit fields in MCDI requests and responses |
91 | * are appropriately aligned. Also, on Siena we must copy to the MC | 91 | * are appropriately aligned, but 64-bit fields are only |
92 | * shared memory strictly 32 bits at a time, so add any necessary | 92 | * 32-bit-aligned. Also, on Siena we must copy to the MC shared |
93 | * padding. | 93 | * memory strictly 32 bits at a time, so add any necessary padding. |
94 | */ | 94 | */ |
95 | #define MCDI_DECLARE_BUF(_name, _len) \ | 95 | #define MCDI_DECLARE_BUF(_name, _len) \ |
96 | efx_dword_t _name[DIV_ROUND_UP(_len, 4)] | 96 | efx_dword_t _name[DIV_ROUND_UP(_len, 4)] |
@@ -107,6 +107,13 @@ extern void efx_mcdi_sensor_event(struct efx_nic *efx, efx_qword_t *ev); | |||
107 | EFX_POPULATE_DWORD_1(*_MCDI_DWORD(_buf, _field), EFX_DWORD_0, _value) | 107 | EFX_POPULATE_DWORD_1(*_MCDI_DWORD(_buf, _field), EFX_DWORD_0, _value) |
108 | #define MCDI_DWORD(_buf, _field) \ | 108 | #define MCDI_DWORD(_buf, _field) \ |
109 | EFX_DWORD_FIELD(*_MCDI_DWORD(_buf, _field), EFX_DWORD_0) | 109 | EFX_DWORD_FIELD(*_MCDI_DWORD(_buf, _field), EFX_DWORD_0) |
110 | #define MCDI_SET_QWORD(_buf, _field, _value) \ | ||
111 | do { \ | ||
112 | EFX_POPULATE_DWORD_1(_MCDI_DWORD(_buf, _field)[0], \ | ||
113 | EFX_DWORD_0, (u32)(_value)); \ | ||
114 | EFX_POPULATE_DWORD_1(_MCDI_DWORD(_buf, _field)[1], \ | ||
115 | EFX_DWORD_0, (u64)(_value) >> 32); \ | ||
116 | } while (0) | ||
110 | #define MCDI_QWORD(_buf, _field) \ | 117 | #define MCDI_QWORD(_buf, _field) \ |
111 | (EFX_DWORD_FIELD(_MCDI_DWORD(_buf, _field)[0], EFX_DWORD_0) | \ | 118 | (EFX_DWORD_FIELD(_MCDI_DWORD(_buf, _field)[0], EFX_DWORD_0) | \ |
112 | (u64)EFX_DWORD_FIELD(_MCDI_DWORD(_buf, _field)[1], EFX_DWORD_0) << 32) | 119 | (u64)EFX_DWORD_FIELD(_MCDI_DWORD(_buf, _field)[1], EFX_DWORD_0) << 32) |
@@ -140,6 +147,16 @@ extern void efx_mcdi_sensor_event(struct efx_nic *efx, efx_qword_t *ev); | |||
140 | EFX_DWORD_0, _value) | 147 | EFX_DWORD_0, _value) |
141 | #define MCDI_ARRAY_DWORD(_buf, _field, _index) \ | 148 | #define MCDI_ARRAY_DWORD(_buf, _field, _index) \ |
142 | EFX_DWORD_FIELD(*_MCDI_ARRAY_DWORD(_buf, _field, _index), EFX_DWORD_0) | 149 | EFX_DWORD_FIELD(*_MCDI_ARRAY_DWORD(_buf, _field, _index), EFX_DWORD_0) |
150 | #define _MCDI_ARRAY_QWORD(_buf, _field, _index) \ | ||
151 | (BUILD_BUG_ON_ZERO(MC_CMD_ ## _field ## _LEN != 8) + \ | ||
152 | (efx_dword_t *)_MCDI_ARRAY_PTR(_buf, _field, _index, 4)) | ||
153 | #define MCDI_SET_ARRAY_QWORD(_buf, _field, _index, _value) \ | ||
154 | do { \ | ||
155 | EFX_SET_DWORD_FIELD(_MCDI_ARRAY_QWORD(_buf, _field, _index)[0],\ | ||
156 | EFX_DWORD_0, (u32)(_value)); \ | ||
157 | EFX_SET_DWORD_FIELD(_MCDI_ARRAY_QWORD(_buf, _field, _index)[1],\ | ||
158 | EFX_DWORD_0, (u64)(_value) >> 32); \ | ||
159 | } while (0) | ||
143 | #define MCDI_ARRAY_FIELD(_buf, _field1, _type, _index, _field2) \ | 160 | #define MCDI_ARRAY_FIELD(_buf, _field1, _type, _index, _field2) \ |
144 | MCDI_FIELD(MCDI_ARRAY_STRUCT_PTR(_buf, _field1, _index), \ | 161 | MCDI_FIELD(MCDI_ARRAY_STRUCT_PTR(_buf, _field1, _index), \ |
145 | _type ## _TYPEDEF, _field2) | 162 | _type ## _TYPEDEF, _field2) |
diff --git a/drivers/net/ethernet/sfc/mcdi_mon.c b/drivers/net/ethernet/sfc/mcdi_mon.c index 4e8a13854264..3179b2ba316e 100644 --- a/drivers/net/ethernet/sfc/mcdi_mon.c +++ b/drivers/net/ethernet/sfc/mcdi_mon.c | |||
@@ -95,10 +95,8 @@ static int efx_mcdi_mon_update(struct efx_nic *efx) | |||
95 | MCDI_DECLARE_BUF(inbuf, MC_CMD_READ_SENSORS_IN_LEN); | 95 | MCDI_DECLARE_BUF(inbuf, MC_CMD_READ_SENSORS_IN_LEN); |
96 | int rc; | 96 | int rc; |
97 | 97 | ||
98 | MCDI_SET_DWORD(inbuf, READ_SENSORS_IN_DMA_ADDR_LO, | 98 | MCDI_SET_QWORD(inbuf, READ_SENSORS_IN_DMA_ADDR, |
99 | hwmon->dma_buf.dma_addr & 0xffffffff); | 99 | hwmon->dma_buf.dma_addr); |
100 | MCDI_SET_DWORD(inbuf, READ_SENSORS_IN_DMA_ADDR_HI, | ||
101 | (u64)hwmon->dma_buf.dma_addr >> 32); | ||
102 | 100 | ||
103 | rc = efx_mcdi_rpc(efx, MC_CMD_READ_SENSORS, | 101 | rc = efx_mcdi_rpc(efx, MC_CMD_READ_SENSORS, |
104 | inbuf, sizeof(inbuf), NULL, 0, NULL); | 102 | inbuf, sizeof(inbuf), NULL, 0, NULL); |
diff --git a/drivers/net/ethernet/sfc/ptp.c b/drivers/net/ethernet/sfc/ptp.c index 5612021d960a..d96bfc41c149 100644 --- a/drivers/net/ethernet/sfc/ptp.c +++ b/drivers/net/ethernet/sfc/ptp.c | |||
@@ -533,10 +533,8 @@ static int efx_ptp_synchronize(struct efx_nic *efx, unsigned int num_readings) | |||
533 | MCDI_SET_DWORD(synch_buf, PTP_IN_OP, MC_CMD_PTP_OP_SYNCHRONIZE); | 533 | MCDI_SET_DWORD(synch_buf, PTP_IN_OP, MC_CMD_PTP_OP_SYNCHRONIZE); |
534 | MCDI_SET_DWORD(synch_buf, PTP_IN_SYNCHRONIZE_NUMTIMESETS, | 534 | MCDI_SET_DWORD(synch_buf, PTP_IN_SYNCHRONIZE_NUMTIMESETS, |
535 | num_readings); | 535 | num_readings); |
536 | MCDI_SET_DWORD(synch_buf, PTP_IN_SYNCHRONIZE_START_ADDR_LO, | 536 | MCDI_SET_QWORD(synch_buf, PTP_IN_SYNCHRONIZE_START_ADDR, |
537 | (u32)ptp->start.dma_addr); | 537 | ptp->start.dma_addr); |
538 | MCDI_SET_DWORD(synch_buf, PTP_IN_SYNCHRONIZE_START_ADDR_HI, | ||
539 | (u32)((u64)ptp->start.dma_addr >> 32)); | ||
540 | 538 | ||
541 | /* Clear flag that signals MC ready */ | 539 | /* Clear flag that signals MC ready */ |
542 | ACCESS_ONCE(*start) = 0; | 540 | ACCESS_ONCE(*start) = 0; |
@@ -1378,9 +1376,7 @@ static int efx_phc_adjfreq(struct ptp_clock_info *ptp, s32 delta) | |||
1378 | (PPB_EXTRA_BITS + MAX_PPB_BITS)); | 1376 | (PPB_EXTRA_BITS + MAX_PPB_BITS)); |
1379 | 1377 | ||
1380 | MCDI_SET_DWORD(inadj, PTP_IN_OP, MC_CMD_PTP_OP_ADJUST); | 1378 | MCDI_SET_DWORD(inadj, PTP_IN_OP, MC_CMD_PTP_OP_ADJUST); |
1381 | MCDI_SET_DWORD(inadj, PTP_IN_ADJUST_FREQ_LO, (u32)adjustment_ns); | 1379 | MCDI_SET_QWORD(inadj, PTP_IN_ADJUST_FREQ, adjustment_ns); |
1382 | MCDI_SET_DWORD(inadj, PTP_IN_ADJUST_FREQ_HI, | ||
1383 | (u32)(adjustment_ns >> 32)); | ||
1384 | MCDI_SET_DWORD(inadj, PTP_IN_ADJUST_SECONDS, 0); | 1380 | MCDI_SET_DWORD(inadj, PTP_IN_ADJUST_SECONDS, 0); |
1385 | MCDI_SET_DWORD(inadj, PTP_IN_ADJUST_NANOSECONDS, 0); | 1381 | MCDI_SET_DWORD(inadj, PTP_IN_ADJUST_NANOSECONDS, 0); |
1386 | rc = efx_mcdi_rpc(efx, MC_CMD_PTP, inadj, sizeof(inadj), | 1382 | rc = efx_mcdi_rpc(efx, MC_CMD_PTP, inadj, sizeof(inadj), |
@@ -1402,8 +1398,7 @@ static int efx_phc_adjtime(struct ptp_clock_info *ptp, s64 delta) | |||
1402 | MCDI_DECLARE_BUF(inbuf, MC_CMD_PTP_IN_ADJUST_LEN); | 1398 | MCDI_DECLARE_BUF(inbuf, MC_CMD_PTP_IN_ADJUST_LEN); |
1403 | 1399 | ||
1404 | MCDI_SET_DWORD(inbuf, PTP_IN_OP, MC_CMD_PTP_OP_ADJUST); | 1400 | MCDI_SET_DWORD(inbuf, PTP_IN_OP, MC_CMD_PTP_OP_ADJUST); |
1405 | MCDI_SET_DWORD(inbuf, PTP_IN_ADJUST_FREQ_LO, 0); | 1401 | MCDI_SET_QWORD(inbuf, PTP_IN_ADJUST_FREQ, 0); |
1406 | MCDI_SET_DWORD(inbuf, PTP_IN_ADJUST_FREQ_HI, 0); | ||
1407 | MCDI_SET_DWORD(inbuf, PTP_IN_ADJUST_SECONDS, (u32)delta_ts.tv_sec); | 1402 | MCDI_SET_DWORD(inbuf, PTP_IN_ADJUST_SECONDS, (u32)delta_ts.tv_sec); |
1408 | MCDI_SET_DWORD(inbuf, PTP_IN_ADJUST_NANOSECONDS, (u32)delta_ts.tv_nsec); | 1403 | MCDI_SET_DWORD(inbuf, PTP_IN_ADJUST_NANOSECONDS, (u32)delta_ts.tv_nsec); |
1409 | return efx_mcdi_rpc(efx, MC_CMD_PTP, inbuf, sizeof(inbuf), | 1404 | return efx_mcdi_rpc(efx, MC_CMD_PTP, inbuf, sizeof(inbuf), |
diff --git a/drivers/net/ethernet/sfc/siena_sriov.c b/drivers/net/ethernet/sfc/siena_sriov.c index 198044f80a05..2587d308234a 100644 --- a/drivers/net/ethernet/sfc/siena_sriov.c +++ b/drivers/net/ethernet/sfc/siena_sriov.c | |||
@@ -243,7 +243,8 @@ static int efx_sriov_memcpy(struct efx_nic *efx, struct efx_memcpy_req *req, | |||
243 | MCDI_DECLARE_BUF(inbuf, MCDI_CTL_SDU_LEN_MAX_V1); | 243 | MCDI_DECLARE_BUF(inbuf, MCDI_CTL_SDU_LEN_MAX_V1); |
244 | MCDI_DECLARE_STRUCT_PTR(record); | 244 | MCDI_DECLARE_STRUCT_PTR(record); |
245 | unsigned int index, used; | 245 | unsigned int index, used; |
246 | u32 from_rid, from_hi, from_lo; | 246 | u64 from_addr; |
247 | u32 from_rid; | ||
247 | int rc; | 248 | int rc; |
248 | 249 | ||
249 | mb(); /* Finish writing source/reading dest before DMA starts */ | 250 | mb(); /* Finish writing source/reading dest before DMA starts */ |
@@ -258,14 +259,11 @@ static int efx_sriov_memcpy(struct efx_nic *efx, struct efx_memcpy_req *req, | |||
258 | count); | 259 | count); |
259 | MCDI_SET_DWORD(record, MEMCPY_RECORD_TYPEDEF_TO_RID, | 260 | MCDI_SET_DWORD(record, MEMCPY_RECORD_TYPEDEF_TO_RID, |
260 | req->to_rid); | 261 | req->to_rid); |
261 | MCDI_SET_DWORD(record, MEMCPY_RECORD_TYPEDEF_TO_ADDR_LO, | 262 | MCDI_SET_QWORD(record, MEMCPY_RECORD_TYPEDEF_TO_ADDR, |
262 | (u32)req->to_addr); | 263 | req->to_addr); |
263 | MCDI_SET_DWORD(record, MEMCPY_RECORD_TYPEDEF_TO_ADDR_HI, | ||
264 | (u32)(req->to_addr >> 32)); | ||
265 | if (req->from_buf == NULL) { | 264 | if (req->from_buf == NULL) { |
266 | from_rid = req->from_rid; | 265 | from_rid = req->from_rid; |
267 | from_lo = (u32)req->from_addr; | 266 | from_addr = req->from_addr; |
268 | from_hi = (u32)(req->from_addr >> 32); | ||
269 | } else { | 267 | } else { |
270 | if (WARN_ON(used + req->length > | 268 | if (WARN_ON(used + req->length > |
271 | MCDI_CTL_SDU_LEN_MAX_V1)) { | 269 | MCDI_CTL_SDU_LEN_MAX_V1)) { |
@@ -274,18 +272,15 @@ static int efx_sriov_memcpy(struct efx_nic *efx, struct efx_memcpy_req *req, | |||
274 | } | 272 | } |
275 | 273 | ||
276 | from_rid = MC_CMD_MEMCPY_RECORD_TYPEDEF_RID_INLINE; | 274 | from_rid = MC_CMD_MEMCPY_RECORD_TYPEDEF_RID_INLINE; |
277 | from_lo = used; | 275 | from_addr = used; |
278 | from_hi = 0; | ||
279 | memcpy(_MCDI_PTR(inbuf, used), req->from_buf, | 276 | memcpy(_MCDI_PTR(inbuf, used), req->from_buf, |
280 | req->length); | 277 | req->length); |
281 | used += req->length; | 278 | used += req->length; |
282 | } | 279 | } |
283 | 280 | ||
284 | MCDI_SET_DWORD(record, MEMCPY_RECORD_TYPEDEF_FROM_RID, from_rid); | 281 | MCDI_SET_DWORD(record, MEMCPY_RECORD_TYPEDEF_FROM_RID, from_rid); |
285 | MCDI_SET_DWORD(record, MEMCPY_RECORD_TYPEDEF_FROM_ADDR_LO, | 282 | MCDI_SET_QWORD(record, MEMCPY_RECORD_TYPEDEF_FROM_ADDR, |
286 | from_lo); | 283 | from_addr); |
287 | MCDI_SET_DWORD(record, MEMCPY_RECORD_TYPEDEF_FROM_ADDR_HI, | ||
288 | from_hi); | ||
289 | MCDI_SET_DWORD(record, MEMCPY_RECORD_TYPEDEF_LENGTH, | 284 | MCDI_SET_DWORD(record, MEMCPY_RECORD_TYPEDEF_LENGTH, |
290 | req->length); | 285 | req->length); |
291 | 286 | ||