mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-30 08:02:30 +00:00
habanalabs: fix device IRQ unmasking for BE host
When unmasking IRQs inside the ASIC, the driver passes an array of all the IRQ to unmask. The ASIC's CPU is working in LE so when running in a BE host, the driver needs to do the proper endianness swapping when preparing this array. In addition, this patch also fixes the endianness of a couple of kernel log debug messages that print values of packets Signed-off-by: Ben Segal <bpsegal20@gmail.com> Reviewed-by: Oded Gabbay <oded.gabbay@gmail.com> Signed-off-by: Oded Gabbay <oded.gabbay@gmail.com>
This commit is contained in:
parent
b9040c9941
commit
b421d83a39
1 changed files with 24 additions and 9 deletions
|
@ -3314,9 +3314,11 @@ static int goya_validate_dma_pkt_no_mmu(struct hl_device *hdev,
|
|||
int rc;
|
||||
|
||||
dev_dbg(hdev->dev, "DMA packet details:\n");
|
||||
dev_dbg(hdev->dev, "source == 0x%llx\n", user_dma_pkt->src_addr);
|
||||
dev_dbg(hdev->dev, "destination == 0x%llx\n", user_dma_pkt->dst_addr);
|
||||
dev_dbg(hdev->dev, "size == %u\n", user_dma_pkt->tsize);
|
||||
dev_dbg(hdev->dev, "source == 0x%llx\n",
|
||||
le64_to_cpu(user_dma_pkt->src_addr));
|
||||
dev_dbg(hdev->dev, "destination == 0x%llx\n",
|
||||
le64_to_cpu(user_dma_pkt->dst_addr));
|
||||
dev_dbg(hdev->dev, "size == %u\n", le32_to_cpu(user_dma_pkt->tsize));
|
||||
|
||||
ctl = le32_to_cpu(user_dma_pkt->ctl);
|
||||
user_dir = (ctl & GOYA_PKT_LIN_DMA_CTL_DMA_DIR_MASK) >>
|
||||
|
@ -3345,9 +3347,11 @@ static int goya_validate_dma_pkt_mmu(struct hl_device *hdev,
|
|||
struct packet_lin_dma *user_dma_pkt)
|
||||
{
|
||||
dev_dbg(hdev->dev, "DMA packet details:\n");
|
||||
dev_dbg(hdev->dev, "source == 0x%llx\n", user_dma_pkt->src_addr);
|
||||
dev_dbg(hdev->dev, "destination == 0x%llx\n", user_dma_pkt->dst_addr);
|
||||
dev_dbg(hdev->dev, "size == %u\n", user_dma_pkt->tsize);
|
||||
dev_dbg(hdev->dev, "source == 0x%llx\n",
|
||||
le64_to_cpu(user_dma_pkt->src_addr));
|
||||
dev_dbg(hdev->dev, "destination == 0x%llx\n",
|
||||
le64_to_cpu(user_dma_pkt->dst_addr));
|
||||
dev_dbg(hdev->dev, "size == %u\n", le32_to_cpu(user_dma_pkt->tsize));
|
||||
|
||||
/*
|
||||
* WA for HW-23.
|
||||
|
@ -3387,7 +3391,8 @@ static int goya_validate_wreg32(struct hl_device *hdev,
|
|||
|
||||
dev_dbg(hdev->dev, "WREG32 packet details:\n");
|
||||
dev_dbg(hdev->dev, "reg_offset == 0x%x\n", reg_offset);
|
||||
dev_dbg(hdev->dev, "value == 0x%x\n", wreg_pkt->value);
|
||||
dev_dbg(hdev->dev, "value == 0x%x\n",
|
||||
le32_to_cpu(wreg_pkt->value));
|
||||
|
||||
if (reg_offset != (mmDMA_CH_0_WR_COMP_ADDR_LO & 0x1FFF)) {
|
||||
dev_err(hdev->dev, "WREG32 packet with illegal address 0x%x\n",
|
||||
|
@ -4359,6 +4364,8 @@ static int goya_unmask_irq_arr(struct hl_device *hdev, u32 *irq_arr,
|
|||
size_t total_pkt_size;
|
||||
long result;
|
||||
int rc;
|
||||
int irq_num_entries, irq_arr_index;
|
||||
__le32 *goya_irq_arr;
|
||||
|
||||
total_pkt_size = sizeof(struct armcp_unmask_irq_arr_packet) +
|
||||
irq_arr_size;
|
||||
|
@ -4376,8 +4383,16 @@ static int goya_unmask_irq_arr(struct hl_device *hdev, u32 *irq_arr,
|
|||
if (!pkt)
|
||||
return -ENOMEM;
|
||||
|
||||
pkt->length = cpu_to_le32(irq_arr_size / sizeof(irq_arr[0]));
|
||||
memcpy(&pkt->irqs, irq_arr, irq_arr_size);
|
||||
irq_num_entries = irq_arr_size / sizeof(irq_arr[0]);
|
||||
pkt->length = cpu_to_le32(irq_num_entries);
|
||||
|
||||
/* We must perform any necessary endianness conversation on the irq
|
||||
* array being passed to the goya hardware
|
||||
*/
|
||||
for (irq_arr_index = 0, goya_irq_arr = (__le32 *) &pkt->irqs;
|
||||
irq_arr_index < irq_num_entries ; irq_arr_index++)
|
||||
goya_irq_arr[irq_arr_index] =
|
||||
cpu_to_le32(irq_arr[irq_arr_index]);
|
||||
|
||||
pkt->armcp_pkt.ctl = cpu_to_le32(ARMCP_PACKET_UNMASK_RAZWI_IRQ_ARRAY <<
|
||||
ARMCP_PKT_CTL_OPCODE_SHIFT);
|
||||
|
|
Loading…
Reference in a new issue