Merge tag 'char-misc-5.10-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregk...
authorLinus Torvalds <torvalds@linux-foundation.org>
Sun, 15 Nov 2020 18:15:17 +0000 (10:15 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Sun, 15 Nov 2020 18:15:17 +0000 (10:15 -0800)
Pull char/misc driver fixes from Greg KH:
 "Here are some small char/misc/whatever driver fixes for 5.10-rc4.

  Nothing huge, lots of small fixes for reported issues:

   - habanalabs driver fixes

   - speakup driver fixes

   - uio driver fixes

   - virtio driver fix

   - other tiny driver fixes

  Full details are in the shortlog.

  All of these have been in linux-next for a full week with no reported
  issues"

* tag 'char-misc-5.10-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc:
  uio: Fix use-after-free in uio_unregister_device()
  firmware: xilinx: fix out-of-bounds access
  nitro_enclaves: Fixup type and simplify logic of the poll mask setup
  speakup ttyio: Do not schedule() in ttyio_in_nowait
  speakup: Fix clearing selection in safe context
  speakup: Fix var_id_t values and thus keymap
  virtio: virtio_console: fix DMA memory allocation for rproc serial
  habanalabs/gaudi: mask WDT error in QMAN
  habanalabs/gaudi: move coresight mmu config
  habanalabs: fix kernel pointer type
  mei: protect mei_cl_mtu from null dereference

20 files changed:
drivers/accessibility/speakup/main.c
drivers/accessibility/speakup/selection.c
drivers/accessibility/speakup/speakup.h
drivers/accessibility/speakup/spk_ttyio.c
drivers/accessibility/speakup/spk_types.h
drivers/char/virtio_console.c
drivers/firmware/xilinx/zynqmp.c
drivers/misc/habanalabs/common/command_buffer.c
drivers/misc/habanalabs/common/habanalabs.h
drivers/misc/habanalabs/common/hw_queue.c
drivers/misc/habanalabs/common/irq.c
drivers/misc/habanalabs/gaudi/gaudi.c
drivers/misc/habanalabs/gaudi/gaudiP.h
drivers/misc/habanalabs/gaudi/gaudi_coresight.c
drivers/misc/habanalabs/goya/goya.c
drivers/misc/habanalabs/goya/goyaP.h
drivers/misc/habanalabs/include/gaudi/gaudi_masks.h
drivers/misc/mei/client.h
drivers/uio/uio.c
drivers/virt/nitro_enclaves/ne_misc_dev.c

index be79b21..4801966 100644 (file)
@@ -357,7 +357,6 @@ static void speakup_cut(struct vc_data *vc)
        mark_cut_flag = 0;
        synth_printf("%s\n", spk_msg_get(MSG_CUT));
 
-       speakup_clear_selection();
        ret = speakup_set_selection(tty);
 
        switch (ret) {
index 032f326..7df7afa 100644 (file)
@@ -22,13 +22,6 @@ struct speakup_selection_work {
        struct tty_struct *tty;
 };
 
-void speakup_clear_selection(void)
-{
-       console_lock();
-       clear_selection();
-       console_unlock();
-}
-
 static void __speakup_set_selection(struct work_struct *work)
 {
        struct speakup_selection_work *ssw =
@@ -51,6 +44,10 @@ static void __speakup_set_selection(struct work_struct *work)
                goto unref;
        }
 
+       console_lock();
+       clear_selection();
+       console_unlock();
+
        set_selection_kernel(&sel, tty);
 
 unref:
index 74fe49c..33594f5 100644 (file)
@@ -70,7 +70,6 @@ void spk_do_flush(void);
 void speakup_start_ttys(void);
 void synth_buffer_add(u16 ch);
 void synth_buffer_clear(void);
-void speakup_clear_selection(void);
 int speakup_set_selection(struct tty_struct *tty);
 void speakup_cancel_selection(void);
 int speakup_paste_selection(struct tty_struct *tty);
index a831ff6..ecc3998 100644 (file)
@@ -298,11 +298,13 @@ static unsigned char ttyio_in(int timeout)
        struct spk_ldisc_data *ldisc_data = speakup_tty->disc_data;
        char rv;
 
-       if (wait_for_completion_timeout(&ldisc_data->completion,
+       if (!timeout) {
+               if (!try_wait_for_completion(&ldisc_data->completion))
+                       return 0xff;
+       } else if (wait_for_completion_timeout(&ldisc_data->completion,
                                        usecs_to_jiffies(timeout)) == 0) {
-               if (timeout)
-                       pr_warn("spk_ttyio: timeout (%d)  while waiting for input\n",
-                               timeout);
+               pr_warn("spk_ttyio: timeout (%d)  while waiting for input\n",
+                       timeout);
                return 0xff;
        }
 
index 7398f11..91fca30 100644 (file)
@@ -32,6 +32,10 @@ enum {
        E_NEW_DEFAULT,
 };
 
+/*
+ * Note: add new members at the end, speakupmap.h depends on the values of the
+ * enum starting from SPELL_DELAY (see inc_dec_var)
+ */
 enum var_id_t {
        VERSION = 0, SYNTH, SILENT, SYNTH_DIRECT,
        KEYMAP, CHARS,
@@ -42,9 +46,9 @@ enum var_id_t {
        SAY_CONTROL, SAY_WORD_CTL, NO_INTERRUPT, KEY_ECHO,
        SPELL_DELAY, PUNC_LEVEL, READING_PUNC,
        ATTRIB_BLEEP, BLEEPS,
-       RATE, PITCH, INFLECTION, VOL, TONE, PUNCT, VOICE, FREQUENCY, LANG,
+       RATE, PITCH, VOL, TONE, PUNCT, VOICE, FREQUENCY, LANG,
        DIRECT, PAUSE,
-       CAPS_START, CAPS_STOP, CHARTAB,
+       CAPS_START, CAPS_STOP, CHARTAB, INFLECTION,
        MAXVARS
 };
 
index a2da8f7..1836cc5 100644 (file)
@@ -435,12 +435,12 @@ static struct port_buffer *alloc_buf(struct virtio_device *vdev, size_t buf_size
                /*
                 * Allocate DMA memory from ancestor. When a virtio
                 * device is created by remoteproc, the DMA memory is
-                * associated with the grandparent device:
-                * vdev => rproc => platform-dev.
+                * associated with the parent device:
+                * virtioY => remoteprocX#vdevYbuffer.
                 */
-               if (!vdev->dev.parent || !vdev->dev.parent->parent)
+               buf->dev = vdev->dev.parent;
+               if (!buf->dev)
                        goto free_buf;
-               buf->dev = vdev->dev.parent->parent;
 
                /* Increase device refcnt to avoid freeing it */
                get_device(buf->dev);
index 8d1ff24..efb8a66 100644 (file)
@@ -147,6 +147,9 @@ static int zynqmp_pm_feature(u32 api_id)
                return 0;
 
        /* Return value if feature is already checked */
+       if (api_id > ARRAY_SIZE(zynqmp_pm_features))
+               return PM_FEATURE_INVALID;
+
        if (zynqmp_pm_features[api_id] != PM_FEATURE_UNCHECKED)
                return zynqmp_pm_features[api_id];
 
index 901e213..ada570f 100644 (file)
@@ -142,11 +142,10 @@ static void cb_fini(struct hl_device *hdev, struct hl_cb *cb)
 {
        if (cb->is_internal)
                gen_pool_free(hdev->internal_cb_pool,
-                               cb->kernel_address, cb->size);
+                               (uintptr_t)cb->kernel_address, cb->size);
        else
                hdev->asic_funcs->asic_dma_free_coherent(hdev, cb->size,
-                               (void *) (uintptr_t) cb->kernel_address,
-                               cb->bus_address);
+                               cb->kernel_address, cb->bus_address);
 
        kfree(cb);
 }
@@ -230,7 +229,7 @@ static struct hl_cb *hl_cb_alloc(struct hl_device *hdev, u32 cb_size,
                return NULL;
        }
 
-       cb->kernel_address = (u64) (uintptr_t) p;
+       cb->kernel_address = p;
        cb->size = cb_size;
 
        return cb;
@@ -509,7 +508,7 @@ int hl_cb_mmap(struct hl_fpriv *hpriv, struct vm_area_struct *vma)
 
        vma->vm_private_data = cb;
 
-       rc = hdev->asic_funcs->cb_mmap(hdev, vma, (void *) cb->kernel_address,
+       rc = hdev->asic_funcs->cb_mmap(hdev, vma, cb->kernel_address,
                                        cb->bus_address, cb->size);
        if (rc) {
                spin_lock(&cb->lock);
index 80d4d73..6ed974d 100644 (file)
@@ -452,7 +452,7 @@ struct hl_cb {
        struct list_head        pool_list;
        struct list_head        va_block_list;
        u64                     id;
-       u64                     kernel_address;
+       void                    *kernel_address;
        dma_addr_t              bus_address;
        u32                     mmap_size;
        u32                     size;
@@ -515,7 +515,7 @@ struct hl_hw_queue {
        struct hl_hw_sob        hw_sob[HL_RSVD_SOBS];
        struct hl_cs_job        **shadow_queue;
        enum hl_queue_type      queue_type;
-       u64                     kernel_address;
+       void                    *kernel_address;
        dma_addr_t              bus_address;
        u32                     pi;
        atomic_t                ci;
@@ -544,7 +544,7 @@ struct hl_hw_queue {
  */
 struct hl_cq {
        struct hl_device        *hdev;
-       u64                     kernel_address;
+       void                    *kernel_address;
        dma_addr_t              bus_address;
        u32                     cq_idx;
        u32                     hw_queue_id;
@@ -562,7 +562,7 @@ struct hl_cq {
  */
 struct hl_eq {
        struct hl_device        *hdev;
-       u64                     kernel_address;
+       void                    *kernel_address;
        dma_addr_t              bus_address;
        u32                     ci;
 };
@@ -757,7 +757,7 @@ struct hl_asic_funcs {
        u32 (*get_dma_desc_list_size)(struct hl_device *hdev,
                                        struct sg_table *sgt);
        void (*add_end_of_cb_packets)(struct hl_device *hdev,
-                                       u64 kernel_address, u32 len,
+                                       void *kernel_address, u32 len,
                                        u64 cq_addr, u32 cq_val, u32 msix_num,
                                        bool eb);
        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);
        for (;;) { \
                /* Verify we read updates done by other cores or by device */ \
                mb(); \
-               (val) = *((u32 *) (uintptr_t) (addr)); \
+               (val) = *((u32 *)(addr)); \
                if (mem_written_by_device) \
                        (val) = le32_to_cpu(*(__le32 *) &(val)); \
                if (cond) \
                        break; \
                if (timeout_us && ktime_compare(ktime_get(), __timeout) > 0) { \
-                       (val) = *((u32 *) (uintptr_t) (addr)); \
+                       (val) = *((u32 *)(addr)); \
                        if (mem_written_by_device) \
                                (val) = le32_to_cpu(*(__le32 *) &(val)); \
                        break; \
index 5e66c98..250cf9c 100644 (file)
@@ -75,7 +75,7 @@ static void ext_and_hw_queue_submit_bd(struct hl_device *hdev,
 {
        struct hl_bd *bd;
 
-       bd = (struct hl_bd *) (uintptr_t) q->kernel_address;
+       bd = q->kernel_address;
        bd += hl_pi_2_offset(q->pi);
        bd->ctl = cpu_to_le32(ctl);
        bd->len = cpu_to_le32(len);
@@ -335,8 +335,7 @@ static void int_queue_schedule_job(struct hl_cs_job *job)
        bd.len = cpu_to_le32(job->job_cb_size);
        bd.ptr = cpu_to_le64((u64) (uintptr_t) job->user_cb);
 
-       pi = (__le64 *) (uintptr_t) (q->kernel_address +
-               ((q->pi & (q->int_queue_len - 1)) * sizeof(bd)));
+       pi = q->kernel_address + (q->pi & (q->int_queue_len - 1)) * sizeof(bd);
 
        q->pi++;
        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,
        if (!p)
                return -ENOMEM;
 
-       q->kernel_address = (u64) (uintptr_t) p;
+       q->kernel_address = p;
 
        q->shadow_queue = kmalloc_array(HL_QUEUE_LENGTH,
                                        sizeof(*q->shadow_queue),
@@ -653,11 +652,11 @@ free_queue:
        if (is_cpu_queue)
                hdev->asic_funcs->cpu_accessible_dma_pool_free(hdev,
                                        HL_QUEUE_SIZE_IN_BYTES,
-                                       (void *) (uintptr_t) q->kernel_address);
+                                       q->kernel_address);
        else
                hdev->asic_funcs->asic_dma_free_coherent(hdev,
                                        HL_QUEUE_SIZE_IN_BYTES,
-                                       (void *) (uintptr_t) q->kernel_address,
+                                       q->kernel_address,
                                        q->bus_address);
 
        return rc;
@@ -676,7 +675,7 @@ static int int_queue_init(struct hl_device *hdev, struct hl_hw_queue *q)
                return -EFAULT;
        }
 
-       q->kernel_address = (u64) (uintptr_t) p;
+       q->kernel_address = p;
        q->pi = 0;
        atomic_set(&q->ci, 0);
 
@@ -704,7 +703,7 @@ static int hw_queue_init(struct hl_device *hdev, struct hl_hw_queue *q)
        if (!p)
                return -ENOMEM;
 
-       q->kernel_address = (u64) (uintptr_t) p;
+       q->kernel_address = p;
 
        /* Make sure read/write pointers are initialized to start of queue */
        atomic_set(&q->ci, 0);
@@ -839,11 +838,11 @@ static void queue_fini(struct hl_device *hdev, struct hl_hw_queue *q)
        if (q->queue_type == QUEUE_TYPE_CPU)
                hdev->asic_funcs->cpu_accessible_dma_pool_free(hdev,
                                        HL_QUEUE_SIZE_IN_BYTES,
-                                       (void *) (uintptr_t) q->kernel_address);
+                                       q->kernel_address);
        else
                hdev->asic_funcs->asic_dma_free_coherent(hdev,
                                        HL_QUEUE_SIZE_IN_BYTES,
-                                       (void *) (uintptr_t) q->kernel_address,
+                                       q->kernel_address,
                                        q->bus_address);
 }
 
index d20e40a..de53fb5 100644 (file)
@@ -90,7 +90,7 @@ irqreturn_t hl_irq_handler_cq(int irq, void *arg)
                return IRQ_HANDLED;
        }
 
-       cq_base = (struct hl_cq_entry *) (uintptr_t) cq->kernel_address;
+       cq_base = cq->kernel_address;
 
        while (1) {
                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)
        struct hl_eq_entry *eq_base;
        struct hl_eqe_work *handle_eqe_work;
 
-       eq_base = (struct hl_eq_entry *) (uintptr_t) eq->kernel_address;
+       eq_base = eq->kernel_address;
 
        while (1) {
                bool entry_ready =
@@ -221,7 +221,7 @@ int hl_cq_init(struct hl_device *hdev, struct hl_cq *q, u32 hw_queue_id)
                return -ENOMEM;
 
        q->hdev = hdev;
-       q->kernel_address = (u64) (uintptr_t) p;
+       q->kernel_address = p;
        q->hw_queue_id = hw_queue_id;
        q->ci = 0;
        q->pi = 0;
@@ -242,7 +242,8 @@ int hl_cq_init(struct hl_device *hdev, struct hl_cq *q, u32 hw_queue_id)
 void hl_cq_fini(struct hl_device *hdev, struct hl_cq *q)
 {
        hdev->asic_funcs->asic_dma_free_coherent(hdev, HL_CQ_SIZE_IN_BYTES,
-                       (void *) (uintptr_t) q->kernel_address, q->bus_address);
+                                                q->kernel_address,
+                                                q->bus_address);
 }
 
 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)
         * when the device is operational again
         */
 
-       memset((void *) (uintptr_t) q->kernel_address, 0, HL_CQ_SIZE_IN_BYTES);
+       memset(q->kernel_address, 0, HL_CQ_SIZE_IN_BYTES);
 }
 
 /**
@@ -282,7 +283,7 @@ int hl_eq_init(struct hl_device *hdev, struct hl_eq *q)
                return -ENOMEM;
 
        q->hdev = hdev;
-       q->kernel_address = (u64) (uintptr_t) p;
+       q->kernel_address = p;
        q->ci = 0;
 
        return 0;
@@ -302,7 +303,7 @@ void hl_eq_fini(struct hl_device *hdev, struct hl_eq *q)
 
        hdev->asic_funcs->cpu_accessible_dma_pool_free(hdev,
                                        HL_EQ_SIZE_IN_BYTES,
-                                       (void *) (uintptr_t) q->kernel_address);
+                                       q->kernel_address);
 }
 
 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)
         * when the device is operational again
         */
 
-       memset((void *) (uintptr_t) q->kernel_address, 0, HL_EQ_SIZE_IN_BYTES);
+       memset(q->kernel_address, 0, HL_EQ_SIZE_IN_BYTES);
 }
index 5f65a16..2519a34 100644 (file)
@@ -680,8 +680,7 @@ static int _gaudi_init_tpc_mem(struct hl_device *hdev,
        if (!cb)
                return -EFAULT;
 
-       init_tpc_mem_pkt = (struct packet_lin_dma *) (uintptr_t)
-                                       cb->kernel_address;
+       init_tpc_mem_pkt = cb->kernel_address;
        cb_size = sizeof(*init_tpc_mem_pkt);
        memset(init_tpc_mem_pkt, 0, cb_size);
 
@@ -3811,8 +3810,7 @@ static int gaudi_validate_cb(struct hl_device *hdev,
                u16 pkt_size;
                struct gaudi_packet *user_pkt;
 
-               user_pkt = (struct gaudi_packet *) (uintptr_t)
-                       (parser->user_cb->kernel_address + cb_parsed_length);
+               user_pkt = parser->user_cb->kernel_address + cb_parsed_length;
 
                pkt_id = (enum packet_id) (
                                (le64_to_cpu(user_pkt->header) &
@@ -4035,11 +4033,9 @@ static int gaudi_patch_cb(struct hl_device *hdev,
                u32 new_pkt_size = 0;
                struct gaudi_packet *user_pkt, *kernel_pkt;
 
-               user_pkt = (struct gaudi_packet *) (uintptr_t)
-                       (parser->user_cb->kernel_address + cb_parsed_length);
-               kernel_pkt = (struct gaudi_packet *) (uintptr_t)
-                       (parser->patched_cb->kernel_address +
-                                       cb_patched_cur_length);
+               user_pkt = parser->user_cb->kernel_address + cb_parsed_length;
+               kernel_pkt = parser->patched_cb->kernel_address +
+                                       cb_patched_cur_length;
 
                pkt_id = (enum packet_id) (
                                (le64_to_cpu(user_pkt->header) &
@@ -4155,8 +4151,8 @@ static int gaudi_parse_cb_mmu(struct hl_device *hdev,
         * The check that parser->user_cb_size <= parser->user_cb->size was done
         * in validate_queue_index().
         */
-       memcpy((void *) (uintptr_t) parser->patched_cb->kernel_address,
-               (void *) (uintptr_t) parser->user_cb->kernel_address,
+       memcpy(parser->patched_cb->kernel_address,
+               parser->user_cb->kernel_address,
                parser->user_cb_size);
 
        patched_cb_size = parser->patched_cb_size;
@@ -4290,7 +4286,7 @@ static int gaudi_cs_parser(struct hl_device *hdev, struct hl_cs_parser *parser)
 }
 
 static void gaudi_add_end_of_cb_packets(struct hl_device *hdev,
-                                       u64 kernel_address, u32 len,
+                                       void *kernel_address, u32 len,
                                        u64 cq_addr, u32 cq_val, u32 msi_vec,
                                        bool eb)
 {
@@ -4298,8 +4294,7 @@ static void gaudi_add_end_of_cb_packets(struct hl_device *hdev,
        struct packet_msg_prot *cq_pkt;
        u32 tmp;
 
-       cq_pkt = (struct packet_msg_prot *) (uintptr_t)
-               (kernel_address + len - (sizeof(struct packet_msg_prot) * 2));
+       cq_pkt = kernel_address + len - (sizeof(struct packet_msg_prot) * 2);
 
        tmp = FIELD_PREP(GAUDI_PKT_CTL_OPCODE_MASK, PACKET_MSG_PROT);
        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,
        if (!cb)
                return -EFAULT;
 
-       lin_dma_pkt = (struct packet_lin_dma *) (uintptr_t) cb->kernel_address;
+       lin_dma_pkt = cb->kernel_address;
        memset(lin_dma_pkt, 0, sizeof(*lin_dma_pkt));
        cb_size = sizeof(*lin_dma_pkt);
 
@@ -4747,7 +4742,7 @@ static void gaudi_write_pte(struct hl_device *hdev, u64 addr, u64 val)
                        (addr - gaudi->hbm_bar_cur_addr));
 }
 
-static void gaudi_mmu_prepare_reg(struct hl_device *hdev, u64 reg, u32 asid)
+void gaudi_mmu_prepare_reg(struct hl_device *hdev, u64 reg, u32 asid)
 {
        /* mask to zero the MMBP and ASID bits */
        WREG32_AND(reg, ~0x7FF);
@@ -4915,9 +4910,6 @@ static void gaudi_mmu_prepare(struct hl_device *hdev, u32 asid)
        gaudi_mmu_prepare_reg(hdev, mmMME2_ACC_WBC, asid);
        gaudi_mmu_prepare_reg(hdev, mmMME3_ACC_WBC, asid);
 
-       gaudi_mmu_prepare_reg(hdev, mmPSOC_GLOBAL_CONF_TRACE_ARUSER, asid);
-       gaudi_mmu_prepare_reg(hdev, mmPSOC_GLOBAL_CONF_TRACE_AWUSER, asid);
-
        hdev->asic_funcs->set_clock_gating(hdev);
 
        mutex_unlock(&gaudi->clk_gate_mutex);
@@ -4954,8 +4946,8 @@ static int gaudi_send_job_on_qman0(struct hl_device *hdev,
 
        cb = job->patched_cb;
 
-       fence_pkt = (struct packet_msg_prot *) (uintptr_t) (cb->kernel_address +
-                       job->job_cb_size - sizeof(struct packet_msg_prot));
+       fence_pkt = cb->kernel_address +
+                       job->job_cb_size - sizeof(struct packet_msg_prot);
 
        tmp = FIELD_PREP(GAUDI_PKT_CTL_OPCODE_MASK, PACKET_MSG_PROT);
        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)
        struct packet_msg_short *pkt;
        u32 value, ctl;
 
-       pkt = (struct packet_msg_short *) (uintptr_t) cb->kernel_address;
+       pkt = cb->kernel_address;
        memset(pkt, 0, sizeof(*pkt));
 
        /* Inc by 1, Mode ADD */
@@ -6478,7 +6470,7 @@ static void gaudi_gen_wait_cb(struct hl_device *hdev, void *data, u16 sob_id,
                        u16 sob_val, u16 mon_id, u32 q_idx)
 {
        struct hl_cb *cb = (struct hl_cb *) data;
-       void *buf = (void *) (uintptr_t) cb->kernel_address;
+       void *buf = cb->kernel_address;
        u64 monitor_base, fence_addr = 0;
        u32 size = 0;
        u16 msg_addr_offset;
index 83ad2b0..8eb598d 100644 (file)
@@ -271,5 +271,6 @@ void gaudi_set_pll_profile(struct hl_device *hdev, enum hl_pll_frequency freq);
 int gaudi_debug_coresight(struct hl_device *hdev, void *data);
 void gaudi_halt_coresight(struct hl_device *hdev);
 int gaudi_get_clk_rate(struct hl_device *hdev, u32 *cur_clk, u32 *max_clk);
+void gaudi_mmu_prepare_reg(struct hl_device *hdev, u64 reg, u32 asid);
 
 #endif /* GAUDIP_H_ */
index 881531d..3d2b0f0 100644 (file)
@@ -623,6 +623,11 @@ static int gaudi_config_etr(struct hl_device *hdev,
                        return -EINVAL;
                }
 
+               gaudi_mmu_prepare_reg(hdev, mmPSOC_GLOBAL_CONF_TRACE_ARUSER,
+                                               hdev->compute_ctx->asid);
+               gaudi_mmu_prepare_reg(hdev, mmPSOC_GLOBAL_CONF_TRACE_AWUSER,
+                                               hdev->compute_ctx->asid);
+
                msb = upper_32_bits(input->buffer_address) >> 8;
                msb &= PSOC_GLOBAL_CONF_TRACE_ADDR_MSB_MASK;
                WREG32(mmPSOC_GLOBAL_CONF_TRACE_ADDR, msb);
index 5db5206..235d47b 100644 (file)
@@ -2882,8 +2882,8 @@ static int goya_send_job_on_qman0(struct hl_device *hdev, struct hl_cs_job *job)
 
        cb = job->patched_cb;
 
-       fence_pkt = (struct packet_msg_prot *) (uintptr_t) (cb->kernel_address +
-                       job->job_cb_size - sizeof(struct packet_msg_prot));
+       fence_pkt = cb->kernel_address +
+                       job->job_cb_size - sizeof(struct packet_msg_prot);
 
        tmp = (PACKET_MSG_PROT << GOYA_PKT_CTL_OPCODE_SHIFT) |
                        (1 << GOYA_PKT_CTL_EB_SHIFT) |
@@ -3475,8 +3475,7 @@ static int goya_validate_cb(struct hl_device *hdev,
                u16 pkt_size;
                struct goya_packet *user_pkt;
 
-               user_pkt = (struct goya_packet *) (uintptr_t)
-                       (parser->user_cb->kernel_address + cb_parsed_length);
+               user_pkt = parser->user_cb->kernel_address + cb_parsed_length;
 
                pkt_id = (enum packet_id) (
                                (le64_to_cpu(user_pkt->header) &
@@ -3713,11 +3712,9 @@ static int goya_patch_cb(struct hl_device *hdev,
                u32 new_pkt_size = 0;
                struct goya_packet *user_pkt, *kernel_pkt;
 
-               user_pkt = (struct goya_packet *) (uintptr_t)
-                       (parser->user_cb->kernel_address + cb_parsed_length);
-               kernel_pkt = (struct goya_packet *) (uintptr_t)
-                       (parser->patched_cb->kernel_address +
-                                       cb_patched_cur_length);
+               user_pkt = parser->user_cb->kernel_address + cb_parsed_length;
+               kernel_pkt = parser->patched_cb->kernel_address +
+                                       cb_patched_cur_length;
 
                pkt_id = (enum packet_id) (
                                (le64_to_cpu(user_pkt->header) &
@@ -3841,8 +3838,8 @@ static int goya_parse_cb_mmu(struct hl_device *hdev,
         * The check that parser->user_cb_size <= parser->user_cb->size was done
         * in validate_queue_index().
         */
-       memcpy((void *) (uintptr_t) parser->patched_cb->kernel_address,
-               (void *) (uintptr_t) parser->user_cb->kernel_address,
+       memcpy(parser->patched_cb->kernel_address,
+               parser->user_cb->kernel_address,
                parser->user_cb_size);
 
        patched_cb_size = parser->patched_cb_size;
@@ -3974,15 +3971,14 @@ int goya_cs_parser(struct hl_device *hdev, struct hl_cs_parser *parser)
                return goya_parse_cb_no_mmu(hdev, parser);
 }
 
-void goya_add_end_of_cb_packets(struct hl_device *hdev, u64 kernel_address,
+void goya_add_end_of_cb_packets(struct hl_device *hdev, void *kernel_address,
                                u32 len, u64 cq_addr, u32 cq_val, u32 msix_vec,
                                bool eb)
 {
        struct packet_msg_prot *cq_pkt;
        u32 tmp;
 
-       cq_pkt = (struct packet_msg_prot *) (uintptr_t)
-               (kernel_address + len - (sizeof(struct packet_msg_prot) * 2));
+       cq_pkt = kernel_address + len - (sizeof(struct packet_msg_prot) * 2);
 
        tmp = (PACKET_MSG_PROT << GOYA_PKT_CTL_OPCODE_SHIFT) |
                        (1 << GOYA_PKT_CTL_EB_SHIFT) |
@@ -4746,7 +4742,7 @@ static int goya_memset_device_memory(struct hl_device *hdev, u64 addr, u64 size,
        if (!cb)
                return -ENOMEM;
 
-       lin_dma_pkt = (struct packet_lin_dma *) (uintptr_t) cb->kernel_address;
+       lin_dma_pkt = cb->kernel_address;
 
        do {
                memset(lin_dma_pkt, 0, sizeof(*lin_dma_pkt));
index 09b4006..def86c7 100644 (file)
@@ -217,7 +217,7 @@ int goya_resume(struct hl_device *hdev);
 void goya_handle_eqe(struct hl_device *hdev, struct hl_eq_entry *eq_entry);
 void *goya_get_events_stat(struct hl_device *hdev, bool aggregate, u32 *size);
 
-void goya_add_end_of_cb_packets(struct hl_device *hdev, u64 kernel_address,
+void goya_add_end_of_cb_packets(struct hl_device *hdev, void *kernel_address,
                                u32 len, u64 cq_addr, u32 cq_val, u32 msix_vec,
                                bool eb);
 int goya_cs_parser(struct hl_device *hdev, struct hl_cs_parser *parser);
index f395721..46aed13 100644 (file)
@@ -421,7 +421,6 @@ enum axi_id {
 
 #define QM_ARB_ERR_MSG_EN_MASK         (\
                                        QM_ARB_ERR_MSG_EN_CHOISE_OVF_MASK |\
-                                       QM_ARB_ERR_MSG_EN_CHOISE_WDT_MASK |\
                                        QM_ARB_ERR_MSG_EN_AXI_LBW_ERR_MASK)
 
 #define PCIE_AUX_FLR_CTRL_HW_CTRL_MASK                               0x1
index 64143d4..9e08a98 100644 (file)
@@ -182,11 +182,11 @@ static inline u8 mei_cl_me_id(const struct mei_cl *cl)
  *
  * @cl: host client
  *
- * Return: mtu
+ * Return: mtu or 0 if client is not connected
  */
 static inline size_t mei_cl_mtu(const struct mei_cl *cl)
 {
-       return cl->me_cl->props.max_msg_length;
+       return cl->me_cl ? cl->me_cl->props.max_msg_length : 0;
 }
 
 /**
index 6dca744..be06f1a 100644 (file)
@@ -413,10 +413,10 @@ static int uio_get_minor(struct uio_device *idev)
        return retval;
 }
 
-static void uio_free_minor(struct uio_device *idev)
+static void uio_free_minor(unsigned long minor)
 {
        mutex_lock(&minor_lock);
-       idr_remove(&uio_idr, idev->minor);
+       idr_remove(&uio_idr, minor);
        mutex_unlock(&minor_lock);
 }
 
@@ -990,7 +990,7 @@ err_request_irq:
 err_uio_dev_add_attributes:
        device_del(&idev->dev);
 err_device_create:
-       uio_free_minor(idev);
+       uio_free_minor(idev->minor);
        put_device(&idev->dev);
        return ret;
 }
@@ -1042,11 +1042,13 @@ EXPORT_SYMBOL_GPL(__devm_uio_register_device);
 void uio_unregister_device(struct uio_info *info)
 {
        struct uio_device *idev;
+       unsigned long minor;
 
        if (!info || !info->uio_dev)
                return;
 
        idev = info->uio_dev;
+       minor = idev->minor;
 
        mutex_lock(&idev->info_lock);
        uio_dev_del_attributes(idev);
@@ -1062,7 +1064,7 @@ void uio_unregister_device(struct uio_info *info)
 
        device_unregister(&idev->dev);
 
-       uio_free_minor(idev);
+       uio_free_minor(minor);
 
        return;
 }
index f06622b..f1964ea 100644 (file)
@@ -1505,10 +1505,8 @@ static __poll_t ne_enclave_poll(struct file *file, poll_table *wait)
 
        poll_wait(file, &ne_enclave->eventq, wait);
 
-       if (!ne_enclave->has_event)
-               return mask;
-
-       mask = POLLHUP;
+       if (ne_enclave->has_event)
+               mask |= EPOLLHUP;
 
        return mask;
 }