Skip to content

Commit a864362

Browse files
committed
Merge tag 'misc-habanalabs-fixes-2020-11-04' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/ogabbay/linux into char-misc-next
Oded writes: This tag contains the following fixes: - Fix the kernel pointer type we are using across the driver to prevent compiler warnings (from u64 to void*) - Configure GAUDI's MMU coresight component in the correct location. The current code had a bug where the configuration was not executed in some cases - Mask watchdog timeout errors in QMANs which can spam the kernel log * tag 'misc-habanalabs-fixes-2020-11-04' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/ogabbay/linux: habanalabs/gaudi: mask WDT error in QMAN habanalabs/gaudi: move coresight mmu config habanalabs: fix kernel pointer type
2 parents bcbc0b2 + f83f3a3 commit a864362

10 files changed

Lines changed: 62 additions & 70 deletions

File tree

drivers/misc/habanalabs/common/command_buffer.c

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -142,11 +142,10 @@ static void cb_fini(struct hl_device *hdev, struct hl_cb *cb)
142142
{
143143
if (cb->is_internal)
144144
gen_pool_free(hdev->internal_cb_pool,
145-
cb->kernel_address, cb->size);
145+
(uintptr_t)cb->kernel_address, cb->size);
146146
else
147147
hdev->asic_funcs->asic_dma_free_coherent(hdev, cb->size,
148-
(void *) (uintptr_t) cb->kernel_address,
149-
cb->bus_address);
148+
cb->kernel_address, cb->bus_address);
150149

151150
kfree(cb);
152151
}
@@ -230,7 +229,7 @@ static struct hl_cb *hl_cb_alloc(struct hl_device *hdev, u32 cb_size,
230229
return NULL;
231230
}
232231

233-
cb->kernel_address = (u64) (uintptr_t) p;
232+
cb->kernel_address = p;
234233
cb->size = cb_size;
235234

236235
return cb;
@@ -509,7 +508,7 @@ int hl_cb_mmap(struct hl_fpriv *hpriv, struct vm_area_struct *vma)
509508

510509
vma->vm_private_data = cb;
511510

512-
rc = hdev->asic_funcs->cb_mmap(hdev, vma, (void *) cb->kernel_address,
511+
rc = hdev->asic_funcs->cb_mmap(hdev, vma, cb->kernel_address,
513512
cb->bus_address, cb->size);
514513
if (rc) {
515514
spin_lock(&cb->lock);

drivers/misc/habanalabs/common/habanalabs.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,7 @@ struct hl_cb {
452452
struct list_head pool_list;
453453
struct list_head va_block_list;
454454
u64 id;
455-
u64 kernel_address;
455+
void *kernel_address;
456456
dma_addr_t bus_address;
457457
u32 mmap_size;
458458
u32 size;
@@ -515,7 +515,7 @@ struct hl_hw_queue {
515515
struct hl_hw_sob hw_sob[HL_RSVD_SOBS];
516516
struct hl_cs_job **shadow_queue;
517517
enum hl_queue_type queue_type;
518-
u64 kernel_address;
518+
void *kernel_address;
519519
dma_addr_t bus_address;
520520
u32 pi;
521521
atomic_t ci;
@@ -544,7 +544,7 @@ struct hl_hw_queue {
544544
*/
545545
struct hl_cq {
546546
struct hl_device *hdev;
547-
u64 kernel_address;
547+
void *kernel_address;
548548
dma_addr_t bus_address;
549549
u32 cq_idx;
550550
u32 hw_queue_id;
@@ -562,7 +562,7 @@ struct hl_cq {
562562
*/
563563
struct hl_eq {
564564
struct hl_device *hdev;
565-
u64 kernel_address;
565+
void *kernel_address;
566566
dma_addr_t bus_address;
567567
u32 ci;
568568
};
@@ -757,7 +757,7 @@ struct hl_asic_funcs {
757757
u32 (*get_dma_desc_list_size)(struct hl_device *hdev,
758758
struct sg_table *sgt);
759759
void (*add_end_of_cb_packets)(struct hl_device *hdev,
760-
u64 kernel_address, u32 len,
760+
void *kernel_address, u32 len,
761761
u64 cq_addr, u32 cq_val, u32 msix_num,
762762
bool eb);
763763
void (*update_eq_ci)(struct hl_device *hdev, u32 val);
@@ -1382,13 +1382,13 @@ void hl_wreg(struct hl_device *hdev, u32 reg, u32 val);
13821382
for (;;) { \
13831383
/* Verify we read updates done by other cores or by device */ \
13841384
mb(); \
1385-
(val) = *((u32 *) (uintptr_t) (addr)); \
1385+
(val) = *((u32 *)(addr)); \
13861386
if (mem_written_by_device) \
13871387
(val) = le32_to_cpu(*(__le32 *) &(val)); \
13881388
if (cond) \
13891389
break; \
13901390
if (timeout_us && ktime_compare(ktime_get(), __timeout) > 0) { \
1391-
(val) = *((u32 *) (uintptr_t) (addr)); \
1391+
(val) = *((u32 *)(addr)); \
13921392
if (mem_written_by_device) \
13931393
(val) = le32_to_cpu(*(__le32 *) &(val)); \
13941394
break; \

drivers/misc/habanalabs/common/hw_queue.c

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ static void ext_and_hw_queue_submit_bd(struct hl_device *hdev,
7575
{
7676
struct hl_bd *bd;
7777

78-
bd = (struct hl_bd *) (uintptr_t) q->kernel_address;
78+
bd = q->kernel_address;
7979
bd += hl_pi_2_offset(q->pi);
8080
bd->ctl = cpu_to_le32(ctl);
8181
bd->len = cpu_to_le32(len);
@@ -335,8 +335,7 @@ static void int_queue_schedule_job(struct hl_cs_job *job)
335335
bd.len = cpu_to_le32(job->job_cb_size);
336336
bd.ptr = cpu_to_le64((u64) (uintptr_t) job->user_cb);
337337

338-
pi = (__le64 *) (uintptr_t) (q->kernel_address +
339-
((q->pi & (q->int_queue_len - 1)) * sizeof(bd)));
338+
pi = q->kernel_address + (q->pi & (q->int_queue_len - 1)) * sizeof(bd);
340339

341340
q->pi++;
342341
q->pi &= ((q->int_queue_len << 1) - 1);
@@ -630,7 +629,7 @@ static int ext_and_cpu_queue_init(struct hl_device *hdev, struct hl_hw_queue *q,
630629
if (!p)
631630
return -ENOMEM;
632631

633-
q->kernel_address = (u64) (uintptr_t) p;
632+
q->kernel_address = p;
634633

635634
q->shadow_queue = kmalloc_array(HL_QUEUE_LENGTH,
636635
sizeof(*q->shadow_queue),
@@ -653,11 +652,11 @@ static int ext_and_cpu_queue_init(struct hl_device *hdev, struct hl_hw_queue *q,
653652
if (is_cpu_queue)
654653
hdev->asic_funcs->cpu_accessible_dma_pool_free(hdev,
655654
HL_QUEUE_SIZE_IN_BYTES,
656-
(void *) (uintptr_t) q->kernel_address);
655+
q->kernel_address);
657656
else
658657
hdev->asic_funcs->asic_dma_free_coherent(hdev,
659658
HL_QUEUE_SIZE_IN_BYTES,
660-
(void *) (uintptr_t) q->kernel_address,
659+
q->kernel_address,
661660
q->bus_address);
662661

663662
return rc;
@@ -676,7 +675,7 @@ static int int_queue_init(struct hl_device *hdev, struct hl_hw_queue *q)
676675
return -EFAULT;
677676
}
678677

679-
q->kernel_address = (u64) (uintptr_t) p;
678+
q->kernel_address = p;
680679
q->pi = 0;
681680
atomic_set(&q->ci, 0);
682681

@@ -704,7 +703,7 @@ static int hw_queue_init(struct hl_device *hdev, struct hl_hw_queue *q)
704703
if (!p)
705704
return -ENOMEM;
706705

707-
q->kernel_address = (u64) (uintptr_t) p;
706+
q->kernel_address = p;
708707

709708
/* Make sure read/write pointers are initialized to start of queue */
710709
atomic_set(&q->ci, 0);
@@ -839,11 +838,11 @@ static void queue_fini(struct hl_device *hdev, struct hl_hw_queue *q)
839838
if (q->queue_type == QUEUE_TYPE_CPU)
840839
hdev->asic_funcs->cpu_accessible_dma_pool_free(hdev,
841840
HL_QUEUE_SIZE_IN_BYTES,
842-
(void *) (uintptr_t) q->kernel_address);
841+
q->kernel_address);
843842
else
844843
hdev->asic_funcs->asic_dma_free_coherent(hdev,
845844
HL_QUEUE_SIZE_IN_BYTES,
846-
(void *) (uintptr_t) q->kernel_address,
845+
q->kernel_address,
847846
q->bus_address);
848847
}
849848

drivers/misc/habanalabs/common/irq.c

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ irqreturn_t hl_irq_handler_cq(int irq, void *arg)
9090
return IRQ_HANDLED;
9191
}
9292

93-
cq_base = (struct hl_cq_entry *) (uintptr_t) cq->kernel_address;
93+
cq_base = cq->kernel_address;
9494

9595
while (1) {
9696
bool entry_ready = ((le32_to_cpu(cq_base[cq->ci].data) &
@@ -152,7 +152,7 @@ irqreturn_t hl_irq_handler_eq(int irq, void *arg)
152152
struct hl_eq_entry *eq_base;
153153
struct hl_eqe_work *handle_eqe_work;
154154

155-
eq_base = (struct hl_eq_entry *) (uintptr_t) eq->kernel_address;
155+
eq_base = eq->kernel_address;
156156

157157
while (1) {
158158
bool entry_ready =
@@ -221,7 +221,7 @@ int hl_cq_init(struct hl_device *hdev, struct hl_cq *q, u32 hw_queue_id)
221221
return -ENOMEM;
222222

223223
q->hdev = hdev;
224-
q->kernel_address = (u64) (uintptr_t) p;
224+
q->kernel_address = p;
225225
q->hw_queue_id = hw_queue_id;
226226
q->ci = 0;
227227
q->pi = 0;
@@ -242,7 +242,8 @@ int hl_cq_init(struct hl_device *hdev, struct hl_cq *q, u32 hw_queue_id)
242242
void hl_cq_fini(struct hl_device *hdev, struct hl_cq *q)
243243
{
244244
hdev->asic_funcs->asic_dma_free_coherent(hdev, HL_CQ_SIZE_IN_BYTES,
245-
(void *) (uintptr_t) q->kernel_address, q->bus_address);
245+
q->kernel_address,
246+
q->bus_address);
246247
}
247248

248249
void hl_cq_reset(struct hl_device *hdev, struct hl_cq *q)
@@ -259,7 +260,7 @@ void hl_cq_reset(struct hl_device *hdev, struct hl_cq *q)
259260
* when the device is operational again
260261
*/
261262

262-
memset((void *) (uintptr_t) q->kernel_address, 0, HL_CQ_SIZE_IN_BYTES);
263+
memset(q->kernel_address, 0, HL_CQ_SIZE_IN_BYTES);
263264
}
264265

265266
/**
@@ -282,7 +283,7 @@ int hl_eq_init(struct hl_device *hdev, struct hl_eq *q)
282283
return -ENOMEM;
283284

284285
q->hdev = hdev;
285-
q->kernel_address = (u64) (uintptr_t) p;
286+
q->kernel_address = p;
286287
q->ci = 0;
287288

288289
return 0;
@@ -302,7 +303,7 @@ void hl_eq_fini(struct hl_device *hdev, struct hl_eq *q)
302303

303304
hdev->asic_funcs->cpu_accessible_dma_pool_free(hdev,
304305
HL_EQ_SIZE_IN_BYTES,
305-
(void *) (uintptr_t) q->kernel_address);
306+
q->kernel_address);
306307
}
307308

308309
void hl_eq_reset(struct hl_device *hdev, struct hl_eq *q)
@@ -316,5 +317,5 @@ void hl_eq_reset(struct hl_device *hdev, struct hl_eq *q)
316317
* when the device is operational again
317318
*/
318319

319-
memset((void *) (uintptr_t) q->kernel_address, 0, HL_EQ_SIZE_IN_BYTES);
320+
memset(q->kernel_address, 0, HL_EQ_SIZE_IN_BYTES);
320321
}

drivers/misc/habanalabs/gaudi/gaudi.c

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -680,8 +680,7 @@ static int _gaudi_init_tpc_mem(struct hl_device *hdev,
680680
if (!cb)
681681
return -EFAULT;
682682

683-
init_tpc_mem_pkt = (struct packet_lin_dma *) (uintptr_t)
684-
cb->kernel_address;
683+
init_tpc_mem_pkt = cb->kernel_address;
685684
cb_size = sizeof(*init_tpc_mem_pkt);
686685
memset(init_tpc_mem_pkt, 0, cb_size);
687686

@@ -3811,8 +3810,7 @@ static int gaudi_validate_cb(struct hl_device *hdev,
38113810
u16 pkt_size;
38123811
struct gaudi_packet *user_pkt;
38133812

3814-
user_pkt = (struct gaudi_packet *) (uintptr_t)
3815-
(parser->user_cb->kernel_address + cb_parsed_length);
3813+
user_pkt = parser->user_cb->kernel_address + cb_parsed_length;
38163814

38173815
pkt_id = (enum packet_id) (
38183816
(le64_to_cpu(user_pkt->header) &
@@ -4035,11 +4033,9 @@ static int gaudi_patch_cb(struct hl_device *hdev,
40354033
u32 new_pkt_size = 0;
40364034
struct gaudi_packet *user_pkt, *kernel_pkt;
40374035

4038-
user_pkt = (struct gaudi_packet *) (uintptr_t)
4039-
(parser->user_cb->kernel_address + cb_parsed_length);
4040-
kernel_pkt = (struct gaudi_packet *) (uintptr_t)
4041-
(parser->patched_cb->kernel_address +
4042-
cb_patched_cur_length);
4036+
user_pkt = parser->user_cb->kernel_address + cb_parsed_length;
4037+
kernel_pkt = parser->patched_cb->kernel_address +
4038+
cb_patched_cur_length;
40434039

40444040
pkt_id = (enum packet_id) (
40454041
(le64_to_cpu(user_pkt->header) &
@@ -4155,8 +4151,8 @@ static int gaudi_parse_cb_mmu(struct hl_device *hdev,
41554151
* The check that parser->user_cb_size <= parser->user_cb->size was done
41564152
* in validate_queue_index().
41574153
*/
4158-
memcpy((void *) (uintptr_t) parser->patched_cb->kernel_address,
4159-
(void *) (uintptr_t) parser->user_cb->kernel_address,
4154+
memcpy(parser->patched_cb->kernel_address,
4155+
parser->user_cb->kernel_address,
41604156
parser->user_cb_size);
41614157

41624158
patched_cb_size = parser->patched_cb_size;
@@ -4290,16 +4286,15 @@ static int gaudi_cs_parser(struct hl_device *hdev, struct hl_cs_parser *parser)
42904286
}
42914287

42924288
static void gaudi_add_end_of_cb_packets(struct hl_device *hdev,
4293-
u64 kernel_address, u32 len,
4289+
void *kernel_address, u32 len,
42944290
u64 cq_addr, u32 cq_val, u32 msi_vec,
42954291
bool eb)
42964292
{
42974293
struct gaudi_device *gaudi = hdev->asic_specific;
42984294
struct packet_msg_prot *cq_pkt;
42994295
u32 tmp;
43004296

4301-
cq_pkt = (struct packet_msg_prot *) (uintptr_t)
4302-
(kernel_address + len - (sizeof(struct packet_msg_prot) * 2));
4297+
cq_pkt = kernel_address + len - (sizeof(struct packet_msg_prot) * 2);
43034298

43044299
tmp = FIELD_PREP(GAUDI_PKT_CTL_OPCODE_MASK, PACKET_MSG_PROT);
43054300
tmp |= FIELD_PREP(GAUDI_PKT_CTL_MB_MASK, 1);
@@ -4342,7 +4337,7 @@ static int gaudi_memset_device_memory(struct hl_device *hdev, u64 addr,
43424337
if (!cb)
43434338
return -EFAULT;
43444339

4345-
lin_dma_pkt = (struct packet_lin_dma *) (uintptr_t) cb->kernel_address;
4340+
lin_dma_pkt = cb->kernel_address;
43464341
memset(lin_dma_pkt, 0, sizeof(*lin_dma_pkt));
43474342
cb_size = sizeof(*lin_dma_pkt);
43484343

@@ -4747,7 +4742,7 @@ static void gaudi_write_pte(struct hl_device *hdev, u64 addr, u64 val)
47474742
(addr - gaudi->hbm_bar_cur_addr));
47484743
}
47494744

4750-
static void gaudi_mmu_prepare_reg(struct hl_device *hdev, u64 reg, u32 asid)
4745+
void gaudi_mmu_prepare_reg(struct hl_device *hdev, u64 reg, u32 asid)
47514746
{
47524747
/* mask to zero the MMBP and ASID bits */
47534748
WREG32_AND(reg, ~0x7FF);
@@ -4915,9 +4910,6 @@ static void gaudi_mmu_prepare(struct hl_device *hdev, u32 asid)
49154910
gaudi_mmu_prepare_reg(hdev, mmMME2_ACC_WBC, asid);
49164911
gaudi_mmu_prepare_reg(hdev, mmMME3_ACC_WBC, asid);
49174912

4918-
gaudi_mmu_prepare_reg(hdev, mmPSOC_GLOBAL_CONF_TRACE_ARUSER, asid);
4919-
gaudi_mmu_prepare_reg(hdev, mmPSOC_GLOBAL_CONF_TRACE_AWUSER, asid);
4920-
49214913
hdev->asic_funcs->set_clock_gating(hdev);
49224914

49234915
mutex_unlock(&gaudi->clk_gate_mutex);
@@ -4954,8 +4946,8 @@ static int gaudi_send_job_on_qman0(struct hl_device *hdev,
49544946

49554947
cb = job->patched_cb;
49564948

4957-
fence_pkt = (struct packet_msg_prot *) (uintptr_t) (cb->kernel_address +
4958-
job->job_cb_size - sizeof(struct packet_msg_prot));
4949+
fence_pkt = cb->kernel_address +
4950+
job->job_cb_size - sizeof(struct packet_msg_prot);
49594951

49604952
tmp = FIELD_PREP(GAUDI_PKT_CTL_OPCODE_MASK, PACKET_MSG_PROT);
49614953
tmp |= FIELD_PREP(GAUDI_PKT_CTL_EB_MASK, 1);
@@ -6386,7 +6378,7 @@ static void gaudi_gen_signal_cb(struct hl_device *hdev, void *data, u16 sob_id)
63866378
struct packet_msg_short *pkt;
63876379
u32 value, ctl;
63886380

6389-
pkt = (struct packet_msg_short *) (uintptr_t) cb->kernel_address;
6381+
pkt = cb->kernel_address;
63906382
memset(pkt, 0, sizeof(*pkt));
63916383

63926384
/* Inc by 1, Mode ADD */
@@ -6478,7 +6470,7 @@ static void gaudi_gen_wait_cb(struct hl_device *hdev, void *data, u16 sob_id,
64786470
u16 sob_val, u16 mon_id, u32 q_idx)
64796471
{
64806472
struct hl_cb *cb = (struct hl_cb *) data;
6481-
void *buf = (void *) (uintptr_t) cb->kernel_address;
6473+
void *buf = cb->kernel_address;
64826474
u64 monitor_base, fence_addr = 0;
64836475
u32 size = 0;
64846476
u16 msg_addr_offset;

drivers/misc/habanalabs/gaudi/gaudiP.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -271,5 +271,6 @@ void gaudi_set_pll_profile(struct hl_device *hdev, enum hl_pll_frequency freq);
271271
int gaudi_debug_coresight(struct hl_device *hdev, void *data);
272272
void gaudi_halt_coresight(struct hl_device *hdev);
273273
int gaudi_get_clk_rate(struct hl_device *hdev, u32 *cur_clk, u32 *max_clk);
274+
void gaudi_mmu_prepare_reg(struct hl_device *hdev, u64 reg, u32 asid);
274275

275276
#endif /* GAUDIP_H_ */

drivers/misc/habanalabs/gaudi/gaudi_coresight.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -623,6 +623,11 @@ static int gaudi_config_etr(struct hl_device *hdev,
623623
return -EINVAL;
624624
}
625625

626+
gaudi_mmu_prepare_reg(hdev, mmPSOC_GLOBAL_CONF_TRACE_ARUSER,
627+
hdev->compute_ctx->asid);
628+
gaudi_mmu_prepare_reg(hdev, mmPSOC_GLOBAL_CONF_TRACE_AWUSER,
629+
hdev->compute_ctx->asid);
630+
626631
msb = upper_32_bits(input->buffer_address) >> 8;
627632
msb &= PSOC_GLOBAL_CONF_TRACE_ADDR_MSB_MASK;
628633
WREG32(mmPSOC_GLOBAL_CONF_TRACE_ADDR, msb);

0 commit comments

Comments
 (0)