Commit 9cfd9c45 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'char-misc-5.10-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc

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
parents 281b3ec3 092561f0
...@@ -357,7 +357,6 @@ static void speakup_cut(struct vc_data *vc) ...@@ -357,7 +357,6 @@ static void speakup_cut(struct vc_data *vc)
mark_cut_flag = 0; mark_cut_flag = 0;
synth_printf("%s\n", spk_msg_get(MSG_CUT)); synth_printf("%s\n", spk_msg_get(MSG_CUT));
speakup_clear_selection();
ret = speakup_set_selection(tty); ret = speakup_set_selection(tty);
switch (ret) { switch (ret) {
......
...@@ -22,13 +22,6 @@ struct speakup_selection_work { ...@@ -22,13 +22,6 @@ struct speakup_selection_work {
struct tty_struct *tty; struct tty_struct *tty;
}; };
void speakup_clear_selection(void)
{
console_lock();
clear_selection();
console_unlock();
}
static void __speakup_set_selection(struct work_struct *work) static void __speakup_set_selection(struct work_struct *work)
{ {
struct speakup_selection_work *ssw = struct speakup_selection_work *ssw =
...@@ -51,6 +44,10 @@ static void __speakup_set_selection(struct work_struct *work) ...@@ -51,6 +44,10 @@ static void __speakup_set_selection(struct work_struct *work)
goto unref; goto unref;
} }
console_lock();
clear_selection();
console_unlock();
set_selection_kernel(&sel, tty); set_selection_kernel(&sel, tty);
unref: unref:
......
...@@ -70,7 +70,6 @@ void spk_do_flush(void); ...@@ -70,7 +70,6 @@ void spk_do_flush(void);
void speakup_start_ttys(void); void speakup_start_ttys(void);
void synth_buffer_add(u16 ch); void synth_buffer_add(u16 ch);
void synth_buffer_clear(void); void synth_buffer_clear(void);
void speakup_clear_selection(void);
int speakup_set_selection(struct tty_struct *tty); int speakup_set_selection(struct tty_struct *tty);
void speakup_cancel_selection(void); void speakup_cancel_selection(void);
int speakup_paste_selection(struct tty_struct *tty); int speakup_paste_selection(struct tty_struct *tty);
......
...@@ -298,11 +298,13 @@ static unsigned char ttyio_in(int timeout) ...@@ -298,11 +298,13 @@ static unsigned char ttyio_in(int timeout)
struct spk_ldisc_data *ldisc_data = speakup_tty->disc_data; struct spk_ldisc_data *ldisc_data = speakup_tty->disc_data;
char rv; 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) { usecs_to_jiffies(timeout)) == 0) {
if (timeout) pr_warn("spk_ttyio: timeout (%d) while waiting for input\n",
pr_warn("spk_ttyio: timeout (%d) while waiting for input\n", timeout);
timeout);
return 0xff; return 0xff;
} }
......
...@@ -32,6 +32,10 @@ enum { ...@@ -32,6 +32,10 @@ enum {
E_NEW_DEFAULT, 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 { enum var_id_t {
VERSION = 0, SYNTH, SILENT, SYNTH_DIRECT, VERSION = 0, SYNTH, SILENT, SYNTH_DIRECT,
KEYMAP, CHARS, KEYMAP, CHARS,
...@@ -42,9 +46,9 @@ enum var_id_t { ...@@ -42,9 +46,9 @@ enum var_id_t {
SAY_CONTROL, SAY_WORD_CTL, NO_INTERRUPT, KEY_ECHO, SAY_CONTROL, SAY_WORD_CTL, NO_INTERRUPT, KEY_ECHO,
SPELL_DELAY, PUNC_LEVEL, READING_PUNC, SPELL_DELAY, PUNC_LEVEL, READING_PUNC,
ATTRIB_BLEEP, BLEEPS, ATTRIB_BLEEP, BLEEPS,
RATE, PITCH, INFLECTION, VOL, TONE, PUNCT, VOICE, FREQUENCY, LANG, RATE, PITCH, VOL, TONE, PUNCT, VOICE, FREQUENCY, LANG,
DIRECT, PAUSE, DIRECT, PAUSE,
CAPS_START, CAPS_STOP, CHARTAB, CAPS_START, CAPS_STOP, CHARTAB, INFLECTION,
MAXVARS MAXVARS
}; };
......
...@@ -435,12 +435,12 @@ static struct port_buffer *alloc_buf(struct virtio_device *vdev, size_t buf_size ...@@ -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 * Allocate DMA memory from ancestor. When a virtio
* device is created by remoteproc, the DMA memory is * device is created by remoteproc, the DMA memory is
* associated with the grandparent device: * associated with the parent device:
* vdev => rproc => platform-dev. * virtioY => remoteprocX#vdevYbuffer.
*/ */
if (!vdev->dev.parent || !vdev->dev.parent->parent) buf->dev = vdev->dev.parent;
if (!buf->dev)
goto free_buf; goto free_buf;
buf->dev = vdev->dev.parent->parent;
/* Increase device refcnt to avoid freeing it */ /* Increase device refcnt to avoid freeing it */
get_device(buf->dev); get_device(buf->dev);
......
...@@ -147,6 +147,9 @@ static int zynqmp_pm_feature(u32 api_id) ...@@ -147,6 +147,9 @@ static int zynqmp_pm_feature(u32 api_id)
return 0; return 0;
/* Return value if feature is already checked */ /* 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) if (zynqmp_pm_features[api_id] != PM_FEATURE_UNCHECKED)
return zynqmp_pm_features[api_id]; return zynqmp_pm_features[api_id];
......
...@@ -142,11 +142,10 @@ static void cb_fini(struct hl_device *hdev, struct hl_cb *cb) ...@@ -142,11 +142,10 @@ static void cb_fini(struct hl_device *hdev, struct hl_cb *cb)
{ {
if (cb->is_internal) if (cb->is_internal)
gen_pool_free(hdev->internal_cb_pool, gen_pool_free(hdev->internal_cb_pool,
cb->kernel_address, cb->size); (uintptr_t)cb->kernel_address, cb->size);
else else
hdev->asic_funcs->asic_dma_free_coherent(hdev, cb->size, hdev->asic_funcs->asic_dma_free_coherent(hdev, cb->size,
(void *) (uintptr_t) cb->kernel_address, cb->kernel_address, cb->bus_address);
cb->bus_address);
kfree(cb); kfree(cb);
} }
...@@ -230,7 +229,7 @@ static struct hl_cb *hl_cb_alloc(struct hl_device *hdev, u32 cb_size, ...@@ -230,7 +229,7 @@ static struct hl_cb *hl_cb_alloc(struct hl_device *hdev, u32 cb_size,
return NULL; return NULL;
} }
cb->kernel_address = (u64) (uintptr_t) p; cb->kernel_address = p;
cb->size = cb_size; cb->size = cb_size;
return cb; return cb;
...@@ -509,7 +508,7 @@ int hl_cb_mmap(struct hl_fpriv *hpriv, struct vm_area_struct *vma) ...@@ -509,7 +508,7 @@ int hl_cb_mmap(struct hl_fpriv *hpriv, struct vm_area_struct *vma)
vma->vm_private_data = cb; 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); cb->bus_address, cb->size);
if (rc) { if (rc) {
spin_lock(&cb->lock); spin_lock(&cb->lock);
......
...@@ -452,7 +452,7 @@ struct hl_cb { ...@@ -452,7 +452,7 @@ struct hl_cb {
struct list_head pool_list; struct list_head pool_list;
struct list_head va_block_list; struct list_head va_block_list;
u64 id; u64 id;
u64 kernel_address; void *kernel_address;
dma_addr_t bus_address; dma_addr_t bus_address;
u32 mmap_size; u32 mmap_size;
u32 size; u32 size;
...@@ -515,7 +515,7 @@ struct hl_hw_queue { ...@@ -515,7 +515,7 @@ struct hl_hw_queue {
struct hl_hw_sob hw_sob[HL_RSVD_SOBS]; struct hl_hw_sob hw_sob[HL_RSVD_SOBS];
struct hl_cs_job **shadow_queue; struct hl_cs_job **shadow_queue;
enum hl_queue_type queue_type; enum hl_queue_type queue_type;
u64 kernel_address; void *kernel_address;
dma_addr_t bus_address; dma_addr_t bus_address;
u32 pi; u32 pi;
atomic_t ci; atomic_t ci;
...@@ -544,7 +544,7 @@ struct hl_hw_queue { ...@@ -544,7 +544,7 @@ struct hl_hw_queue {
*/ */
struct hl_cq { struct hl_cq {
struct hl_device *hdev; struct hl_device *hdev;
u64 kernel_address; void *kernel_address;
dma_addr_t bus_address; dma_addr_t bus_address;
u32 cq_idx; u32 cq_idx;
u32 hw_queue_id; u32 hw_queue_id;
...@@ -562,7 +562,7 @@ struct hl_cq { ...@@ -562,7 +562,7 @@ struct hl_cq {
*/ */
struct hl_eq { struct hl_eq {
struct hl_device *hdev; struct hl_device *hdev;
u64 kernel_address; void *kernel_address;
dma_addr_t bus_address; dma_addr_t bus_address;
u32 ci; u32 ci;
}; };
...@@ -757,7 +757,7 @@ struct hl_asic_funcs { ...@@ -757,7 +757,7 @@ struct hl_asic_funcs {
u32 (*get_dma_desc_list_size)(struct hl_device *hdev, u32 (*get_dma_desc_list_size)(struct hl_device *hdev,
struct sg_table *sgt); struct sg_table *sgt);
void (*add_end_of_cb_packets)(struct hl_device *hdev, 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, u64 cq_addr, u32 cq_val, u32 msix_num,
bool eb); bool eb);
void (*update_eq_ci)(struct hl_device *hdev, u32 val); 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); ...@@ -1382,13 +1382,13 @@ void hl_wreg(struct hl_device *hdev, u32 reg, u32 val);
for (;;) { \ for (;;) { \
/* Verify we read updates done by other cores or by device */ \ /* Verify we read updates done by other cores or by device */ \
mb(); \ mb(); \
(val) = *((u32 *) (uintptr_t) (addr)); \ (val) = *((u32 *)(addr)); \
if (mem_written_by_device) \ if (mem_written_by_device) \
(val) = le32_to_cpu(*(__le32 *) &(val)); \ (val) = le32_to_cpu(*(__le32 *) &(val)); \
if (cond) \ if (cond) \
break; \ break; \
if (timeout_us && ktime_compare(ktime_get(), __timeout) > 0) { \ if (timeout_us && ktime_compare(ktime_get(), __timeout) > 0) { \
(val) = *((u32 *) (uintptr_t) (addr)); \ (val) = *((u32 *)(addr)); \
if (mem_written_by_device) \ if (mem_written_by_device) \
(val) = le32_to_cpu(*(__le32 *) &(val)); \ (val) = le32_to_cpu(*(__le32 *) &(val)); \
break; \ break; \
......
...@@ -75,7 +75,7 @@ static void ext_and_hw_queue_submit_bd(struct hl_device *hdev, ...@@ -75,7 +75,7 @@ static void ext_and_hw_queue_submit_bd(struct hl_device *hdev,
{ {
struct hl_bd *bd; 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 += hl_pi_2_offset(q->pi);
bd->ctl = cpu_to_le32(ctl); bd->ctl = cpu_to_le32(ctl);
bd->len = cpu_to_le32(len); bd->len = cpu_to_le32(len);
...@@ -335,8 +335,7 @@ static void int_queue_schedule_job(struct hl_cs_job *job) ...@@ -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.len = cpu_to_le32(job->job_cb_size);
bd.ptr = cpu_to_le64((u64) (uintptr_t) job->user_cb); bd.ptr = cpu_to_le64((u64) (uintptr_t) job->user_cb);
pi = (__le64 *) (uintptr_t) (q->kernel_address + pi = q->kernel_address + (q->pi & (q->int_queue_len - 1)) * sizeof(bd);
((q->pi & (q->int_queue_len - 1)) * sizeof(bd)));
q->pi++; q->pi++;
q->pi &= ((q->int_queue_len << 1) - 1); 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, ...@@ -630,7 +629,7 @@ static int ext_and_cpu_queue_init(struct hl_device *hdev, struct hl_hw_queue *q,
if (!p) if (!p)
return -ENOMEM; return -ENOMEM;
q->kernel_address = (u64) (uintptr_t) p; q->kernel_address = p;
q->shadow_queue = kmalloc_array(HL_QUEUE_LENGTH, q->shadow_queue = kmalloc_array(HL_QUEUE_LENGTH,
sizeof(*q->shadow_queue), sizeof(*q->shadow_queue),
...@@ -653,11 +652,11 @@ static int ext_and_cpu_queue_init(struct hl_device *hdev, struct hl_hw_queue *q, ...@@ -653,11 +652,11 @@ static int ext_and_cpu_queue_init(struct hl_device *hdev, struct hl_hw_queue *q,
if (is_cpu_queue) if (is_cpu_queue)
hdev->asic_funcs->cpu_accessible_dma_pool_free(hdev, hdev->asic_funcs->cpu_accessible_dma_pool_free(hdev,
HL_QUEUE_SIZE_IN_BYTES, HL_QUEUE_SIZE_IN_BYTES,
(void *) (uintptr_t) q->kernel_address); q->kernel_address);
else else
hdev->asic_funcs->asic_dma_free_coherent(hdev, hdev->asic_funcs->asic_dma_free_coherent(hdev,
HL_QUEUE_SIZE_IN_BYTES, HL_QUEUE_SIZE_IN_BYTES,
(void *) (uintptr_t) q->kernel_address, q->kernel_address,
q->bus_address); q->bus_address);
return rc; return rc;
...@@ -676,7 +675,7 @@ static int int_queue_init(struct hl_device *hdev, struct hl_hw_queue *q) ...@@ -676,7 +675,7 @@ static int int_queue_init(struct hl_device *hdev, struct hl_hw_queue *q)
return -EFAULT; return -EFAULT;
} }
q->kernel_address = (u64) (uintptr_t) p; q->kernel_address = p;
q->pi = 0; q->pi = 0;
atomic_set(&q->ci, 0); atomic_set(&q->ci, 0);
...@@ -704,7 +703,7 @@ static int hw_queue_init(struct hl_device *hdev, struct hl_hw_queue *q) ...@@ -704,7 +703,7 @@ static int hw_queue_init(struct hl_device *hdev, struct hl_hw_queue *q)
if (!p) if (!p)
return -ENOMEM; return -ENOMEM;
q->kernel_address = (u64) (uintptr_t) p; q->kernel_address = p;
/* Make sure read/write pointers are initialized to start of queue */ /* Make sure read/write pointers are initialized to start of queue */
atomic_set(&q->ci, 0); atomic_set(&q->ci, 0);
...@@ -839,11 +838,11 @@ static void queue_fini(struct hl_device *hdev, struct hl_hw_queue *q) ...@@ -839,11 +838,11 @@ static void queue_fini(struct hl_device *hdev, struct hl_hw_queue *q)
if (q->queue_type == QUEUE_TYPE_CPU) if (q->queue_type == QUEUE_TYPE_CPU)
hdev->asic_funcs->cpu_accessible_dma_pool_free(hdev, hdev->asic_funcs->cpu_accessible_dma_pool_free(hdev,
HL_QUEUE_SIZE_IN_BYTES, HL_QUEUE_SIZE_IN_BYTES,
(void *) (uintptr_t) q->kernel_address); q->kernel_address);
else else
hdev->asic_funcs->asic_dma_free_coherent(hdev, hdev->asic_funcs->asic_dma_free_coherent(hdev,
HL_QUEUE_SIZE_IN_BYTES, HL_QUEUE_SIZE_IN_BYTES,
(void *) (uintptr_t) q->kernel_address, q->kernel_address,
q->bus_address); q->bus_address);
} }
......
...@@ -90,7 +90,7 @@ irqreturn_t hl_irq_handler_cq(int irq, void *arg) ...@@ -90,7 +90,7 @@ irqreturn_t hl_irq_handler_cq(int irq, void *arg)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
cq_base = (struct hl_cq_entry *) (uintptr_t) cq->kernel_address; cq_base = cq->kernel_address;
while (1) { while (1) {
bool entry_ready = ((le32_to_cpu(cq_base[cq->ci].data) & 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) ...@@ -152,7 +152,7 @@ irqreturn_t hl_irq_handler_eq(int irq, void *arg)
struct hl_eq_entry *eq_base; struct hl_eq_entry *eq_base;
struct hl_eqe_work *handle_eqe_work; 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) { while (1) {
bool entry_ready = bool entry_ready =
...@@ -221,7 +221,7 @@ int hl_cq_init(struct hl_device *hdev, struct hl_cq *q, u32 hw_queue_id) ...@@ -221,7 +221,7 @@ int hl_cq_init(struct hl_device *hdev, struct hl_cq *q, u32 hw_queue_id)
return -ENOMEM; return -ENOMEM;
q->hdev = hdev; q->hdev = hdev;
q->kernel_address = (u64) (uintptr_t) p; q->kernel_address = p;
q->hw_queue_id = hw_queue_id; q->hw_queue_id = hw_queue_id;
q->ci = 0; q->ci = 0;
q->pi = 0; q->pi = 0;
...@@ -242,7 +242,8 @@ int hl_cq_init(struct hl_device *hdev, struct hl_cq *q, u32 hw_queue_id) ...@@ -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) 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, 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) 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) ...@@ -259,7 +260,7 @@ void hl_cq_reset(struct hl_device *hdev, struct hl_cq *q)
* when the device is operational again * 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) ...@@ -282,7 +283,7 @@ int hl_eq_init(struct hl_device *hdev, struct hl_eq *q)
return -ENOMEM; return -ENOMEM;
q->hdev = hdev; q->hdev = hdev;
q->kernel_address = (u64) (uintptr_t) p; q->kernel_address = p;
q->ci = 0; q->ci = 0;
return 0; return 0;
...@@ -302,7 +303,7 @@ void hl_eq_fini(struct hl_device *hdev, struct hl_eq *q) ...@@ -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, hdev->asic_funcs->cpu_accessible_dma_pool_free(hdev,
HL_EQ_SIZE_IN_BYTES, 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) 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) ...@@ -316,5 +317,5 @@ void hl_eq_reset(struct hl_device *hdev, struct hl_eq *q)
* when the device is operational again * 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);
} }
...@@ -680,8 +680,7 @@ static int _gaudi_init_tpc_mem(struct hl_device *hdev, ...@@ -680,8 +680,7 @@ static int _gaudi_init_tpc_mem(struct hl_device *hdev,
if (!cb) if (!cb)
return -EFAULT; return -EFAULT;
init_tpc_mem_pkt = (struct packet_lin_dma *) (uintptr_t) init_tpc_mem_pkt = cb->kernel_address;
cb->kernel_address;
cb_size = sizeof(*init_tpc_mem_pkt); cb_size = sizeof(*init_tpc_mem_pkt);
memset(init_tpc_mem_pkt, 0, cb_size); memset(init_tpc_mem_pkt, 0, cb_size);
...@@ -3811,8 +3810,7 @@ static int gaudi_validate_cb(struct hl_device *hdev, ...@@ -3811,8 +3810,7 @@ static int gaudi_validate_cb(struct hl_device *hdev,
u16 pkt_size; u16 pkt_size;
struct gaudi_packet *user_pkt; struct gaudi_packet *user_pkt;
user_pkt = (struct gaudi_packet *) (uintptr_t) user_pkt = parser->user_cb->kernel_address + cb_parsed_length;
(parser->user_cb->kernel_address + cb_parsed_length);
pkt_id = (enum packet_id) ( pkt_id = (enum packet_id) (
(le64_to_cpu(user_pkt->header) & (le64_to_cpu(user_pkt->header) &
...@@ -4035,11 +4033,9 @@ static int gaudi_patch_cb(struct hl_device *hdev, ...@@ -4035,11 +4033,9 @@ static int gaudi_patch_cb(struct hl_device *hdev,
u32 new_pkt_size = 0; u32 new_pkt_size = 0;
struct gaudi_packet *user_pkt, *kernel_pkt; struct gaudi_packet *user_pkt, *kernel_pkt;
user_pkt = (struct gaudi_packet *) (uintptr_t) user_pkt = parser->user_cb->kernel_address + cb_parsed_length;
(parser->user_cb->kernel_address + cb_parsed_length); kernel_pkt = parser->patched_cb->kernel_address +
kernel_pkt = (struct gaudi_packet *) (uintptr_t) cb_patched_cur_length;
(parser->patched_cb->kernel_address +
cb_patched_cur_length);
pkt_id = (enum packet_id) ( pkt_id = (enum packet_id) (
(le64_to_cpu(user_pkt->header) & (le64_to_cpu(user_pkt->header) &
...@@ -4155,8 +4151,8 @@ static int gaudi_parse_cb_mmu(struct hl_device *hdev, ...@@ -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 * The check that parser->user_cb_size <= parser->user_cb->size was done
* in validate_queue_index(). * in validate_queue_index().
*/ */
memcpy((void *) (uintptr_t) parser->patched_cb->kernel_address, memcpy(parser->patched_cb->kernel_address,
(void *) (uintptr_t) parser->user_cb->kernel_address, parser->user_cb->kernel_address,
parser->user_cb_size); parser->user_cb_size);
patched_cb_size = parser->patched_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) ...@@ -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, 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, u64 cq_addr, u32 cq_val, u32 msi_vec,
bool eb) bool eb)
{ {
...@@ -4298,8 +4294,7 @@ static void gaudi_add_end_of_cb_packets(struct hl_device *hdev, ...@@ -4298,8 +4294,7 @@ static void gaudi_add_end_of_cb_packets(struct hl_device *hdev,
struct packet_msg_prot *cq_pkt; struct packet_msg_prot *cq_pkt;
u32 tmp; u32 tmp;
cq_pkt = (struct packet_msg_prot *) (uintptr_t) cq_pkt = kernel_address + len - (sizeof(struct packet_msg_prot) * 2);
(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_OPCODE_MASK, PACKET_MSG_PROT);
tmp |= FIELD_PREP(GAUDI_PKT_CTL_MB_MASK, 1); 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, ...@@ -4342,7 +4337,7 @@ static int gaudi_memset_device_memory(struct hl_device *hdev, u64 addr,
if (!cb) if (!cb)
return -EFAULT; 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)); memset(lin_dma_pkt, 0, sizeof(*lin_dma_pkt));
cb_size = 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) ...@@ -4747,7 +4742,7 @@ static void gaudi_write_pte(struct hl_device *hdev, u64 addr, u64 val)
(addr - gaudi->hbm_bar_cur_addr)); (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 */ /* mask to zero the MMBP and ASID bits */
WREG32_AND(reg, ~0x7FF); WREG32_AND(reg, ~0x7FF);
...@@ -4915,9 +4910,6 @@ static void gaudi_mmu_prepare(struct hl_device *hdev, u32 asid) ...@@ -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, mmMME2_ACC_WBC, asid);
gaudi_mmu_prepare_reg(hdev, mmMME3_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); hdev->asic_funcs->set_clock_gating(hdev);
mutex_unlock(&gaudi->clk_gate_mutex); mutex_unlock(&gaudi->clk_gate_mutex);
...@@ -4954,8 +4946,8 @@ static int gaudi_send_job_on_qman0(struct hl_device *hdev, ...@@ -4954,8 +4946,8 @@ static int gaudi_send_job_on_qman0(struct hl_device *hdev,
cb = job->patched_cb; cb = job->patched_cb;
fence_pkt = (struct packet_msg_prot *) (uintptr_t) (cb->kernel_address + fence_pkt = cb->kernel_address +
job->job_cb_size - sizeof(struct packet_msg_prot)); 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_OPCODE_MASK, PACKET_MSG_PROT);
tmp |= FIELD_PREP(GAUDI_PKT_CTL_EB_MASK, 1); 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) ...@@ -6386,7 +6378,7 @@ static void gaudi_gen_signal_cb(struct hl_device *hdev, void *data, u16 sob_id)
struct packet_msg_short *pkt; struct packet_msg_short *pkt;
u32 value, ctl; u32 value, ctl;
pkt = (struct packet_msg_short *) (uintptr_t) cb->kernel_address; pkt = cb->kernel_address;
memset(pkt, 0, sizeof(*pkt)); memset(pkt, 0, sizeof(*pkt));
/* Inc by 1, Mode ADD */ /* Inc by 1, Mode ADD */
...@@ -6478,7 +6470,7 @@ static void gaudi_gen_wait_cb(struct hl_device *hdev, void *data, u16 sob_id, ...@@ -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) u16 sob_val, u16 mon_id, u32 q_idx)
{ {
struct hl_cb *cb = (struct hl_cb *) data; 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; u64 monitor_base, fence_addr = 0;
u32 size = 0; u32 size = 0;
u16 msg_addr_offset; u16 msg_addr_offset;
......
...@@ -271,5 +271,6 @@ void gaudi_set_pll_profile(struct hl_device *hdev, enum hl_pll_frequency freq); ...@@ -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); int gaudi_debug_coresight(struct hl_device *hdev, void *data);
void gaudi_halt_coresight(struct hl_device *hdev); void gaudi_halt_coresight(struct hl_device *hdev);
int gaudi_get_clk_rate(struct hl_device *hdev, u32 *cur_clk, u32 *max_clk); 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_ */ #endif /* GAUDIP_H_ */
...@@ -623,6 +623,11 @@ static int gaudi_config_etr(struct hl_device *hdev, ...@@ -623,6 +623,11 @@ static int gaudi_config_etr(struct hl_device *hdev,
return -EINVAL; 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 = upper_32_bits(input->buffer_address) >> 8;
msb &= PSOC_GLOBAL_CONF_TRACE_ADDR_MSB_MASK; msb &= PSOC_GLOBAL_CONF_TRACE_ADDR_MSB_MASK;
WREG32(mmPSOC_GLOBAL_CONF_TRACE_ADDR, msb); WREG32(mmPSOC_GLOBAL_CONF_TRACE_ADDR, msb);
......
...@@ -2882,8 +2882,8 @@ static int goya_send_job_on_qman0(struct hl_device *hdev, struct hl_cs_job *job) ...@@ -2882,8 +2882,8 @@ static int goya_send_job_on_qman0(struct hl_device *hdev, struct hl_cs_job *job)
cb = job->patched_cb; cb = job->patched_cb;
fence_pkt = (struct packet_msg_prot *) (uintptr_t) (cb->kernel_address + fence_pkt = cb->kernel_address +
job->job_cb_size - sizeof(struct packet_msg_prot)); job->job_cb_size - sizeof(struct packet_msg_prot);
tmp = (PACKET_MSG_PROT << GOYA_PKT_CTL_OPCODE_SHIFT) | tmp = (PACKET_MSG_PROT << GOYA_PKT_CTL_OPCODE_SHIFT) |
(1 << GOYA_PKT_CTL_EB_SHIFT) | (1 << GOYA_PKT_CTL_EB_SHIFT) |
...@@ -3475,8 +3475,7 @@ static int goya_validate_cb(struct hl_device *hdev, ...@@ -3475,8 +3475,7 @@ static int goya_validate_cb(struct hl_device *hdev,
u16 pkt_size; u16 pkt_size;
struct goya_packet *user_pkt; struct goya_packet *user_pkt;
user_pkt = (struct goya_packet *) (uintptr_t) user_pkt = parser->user_cb->kernel_address + cb_parsed_length;
(parser->user_cb->kernel_address + cb_parsed_length);
pkt_id = (enum packet_id) ( pkt_id = (enum packet_id) (
(le64_to_cpu(user_pkt->header) & (le64_to_cpu(user_pkt->header) &
...@@ -3713,11 +3712,9 @@ static int goya_patch_cb(struct hl_device *hdev, ...@@ -3713,11 +3712,9 @@ static int goya_patch_cb(struct hl_device *hdev,
u32 new_pkt_size = 0; u32 new_pkt_size = 0;
struct goya_packet *user_pkt, *kernel_pkt; struct goya_packet *user_pkt, *kernel_pkt;
user_pkt = (struct goya_packet *) (uintptr_t) user_pkt = parser->user_cb->kernel_address + cb_parsed_length;
(parser->user_cb->kernel_address + cb_parsed_length); kernel_pkt = parser->patched_cb->kernel_address +
kernel_pkt = (struct goya_packet *) (uintptr_t) cb_patched_cur_length;
(parser->patched_cb->kernel_address +
cb_patched_cur_length);
pkt_id = (enum packet_id) ( pkt_id = (enum packet_id) (
(le64_to_cpu(user_pkt->header) & (le64_to_cpu(user_pkt->header) &
...@@ -3841,8 +3838,8 @@ static int goya_parse_cb_mmu(struct hl_device *hdev, ...@@ -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 * The check that parser->user_cb_size <= parser->user_cb->size was done
* in validate_queue_index(). * in validate_queue_index().
*/ */
memcpy((void *) (uintptr_t) parser->patched_cb->kernel_address, memcpy(parser->patched_cb->kernel_address,
(void *) (uintptr_t) parser->user_cb->kernel_address, parser->user_cb->kernel_address,
parser->user_cb_size); parser->user_cb_size);
patched_cb_size = parser->patched_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) ...@@ -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); 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, u32 len, u64 cq_addr, u32 cq_val, u32 msix_vec,
bool eb) bool eb)
{ {
struct packet_msg_prot *cq_pkt; struct packet_msg_prot *cq_pkt;
u32 tmp; u32 tmp;
cq_pkt = (struct packet_msg_prot *) (uintptr_t) cq_pkt = kernel_address + len - (sizeof(struct packet_msg_prot) * 2);
(kernel_address + len - (sizeof(struct packet_msg_prot) * 2));
tmp = (PACKET_MSG_PROT << GOYA_PKT_CTL_OPCODE_SHIFT) | tmp = (PACKET_MSG_PROT << GOYA_PKT_CTL_OPCODE_SHIFT) |
(1 << GOYA_PKT_CTL_EB_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, ...@@ -4746,7 +4742,7 @@ static int goya_memset_device_memory(struct hl_device *hdev, u64 addr, u64 size,
if (!cb) if (!cb)
return -ENOMEM; return -ENOMEM;
lin_dma_pkt = (struct packet_lin_dma *) (uintptr_t) cb->kernel_address; lin_dma_pkt = cb->kernel_address;
do { do {
memset(lin_dma_pkt, 0, sizeof(*lin_dma_pkt)); memset(lin_dma_pkt, 0, sizeof(*lin_dma_pkt));
......
...@@ -217,7 +217,7 @@ int goya_resume(struct hl_device *hdev); ...@@ -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_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_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, u32 len, u64 cq_addr, u32 cq_val, u32 msix_vec,
bool eb); bool eb);
int goya_cs_parser(struct hl_device *hdev, struct hl_cs_parser *parser); int goya_cs_parser(struct hl_device *hdev, struct hl_cs_parser *parser);
......
...@@ -421,7 +421,6 @@ enum axi_id { ...@@ -421,7 +421,6 @@ enum axi_id {
#define QM_ARB_ERR_MSG_EN_MASK (\ #define QM_ARB_ERR_MSG_EN_MASK (\
QM_ARB_ERR_MSG_EN_CHOISE_OVF_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) QM_ARB_ERR_MSG_EN_AXI_LBW_ERR_MASK)
#define PCIE_AUX_FLR_CTRL_HW_CTRL_MASK 0x1 #define PCIE_AUX_FLR_CTRL_HW_CTRL_MASK 0x1
......
...@@ -182,11 +182,11 @@ static inline u8 mei_cl_me_id(const struct mei_cl *cl) ...@@ -182,11 +182,11 @@ static inline u8 mei_cl_me_id(const struct mei_cl *cl)
* *
* @cl: host client * @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) 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;
} }
/** /**
......
...@@ -413,10 +413,10 @@ static int uio_get_minor(struct uio_device *idev) ...@@ -413,10 +413,10 @@ static int uio_get_minor(struct uio_device *idev)
return retval; return retval;
} }
static void uio_free_minor(struct uio_device *idev) static void uio_free_minor(unsigned long minor)
{ {
mutex_lock(&minor_lock); mutex_lock(&minor_lock);
idr_remove(&uio_idr, idev->minor); idr_remove(&uio_idr, minor);
mutex_unlock(&minor_lock); mutex_unlock(&minor_lock);
} }
...@@ -990,7 +990,7 @@ int __uio_register_device(struct module *owner, ...@@ -990,7 +990,7 @@ int __uio_register_device(struct module *owner,
err_uio_dev_add_attributes: err_uio_dev_add_attributes:
device_del(&idev->dev); device_del(&idev->dev);
err_device_create: err_device_create:
uio_free_minor(idev); uio_free_minor(idev->minor);
put_device(&idev->dev); put_device(&idev->dev);
return ret; return ret;
} }
...@@ -1042,11 +1042,13 @@ EXPORT_SYMBOL_GPL(__devm_uio_register_device); ...@@ -1042,11 +1042,13 @@ EXPORT_SYMBOL_GPL(__devm_uio_register_device);
void uio_unregister_device(struct uio_info *info) void uio_unregister_device(struct uio_info *info)
{ {
struct uio_device *idev; struct uio_device *idev;
unsigned long minor;
if (!info || !info->uio_dev) if (!info || !info->uio_dev)
return; return;
idev = info->uio_dev; idev = info->uio_dev;
minor = idev->minor;
mutex_lock(&idev->info_lock); mutex_lock(&idev->info_lock);
uio_dev_del_attributes(idev); uio_dev_del_attributes(idev);
...@@ -1062,7 +1064,7 @@ void uio_unregister_device(struct uio_info *info) ...@@ -1062,7 +1064,7 @@ void uio_unregister_device(struct uio_info *info)
device_unregister(&idev->dev); device_unregister(&idev->dev);
uio_free_minor(idev); uio_free_minor(minor);
return; return;
} }
......
...@@ -1505,10 +1505,8 @@ static __poll_t ne_enclave_poll(struct file *file, poll_table *wait) ...@@ -1505,10 +1505,8 @@ static __poll_t ne_enclave_poll(struct file *file, poll_table *wait)
poll_wait(file, &ne_enclave->eventq, wait); poll_wait(file, &ne_enclave->eventq, wait);
if (!ne_enclave->has_event) if (ne_enclave->has_event)
return mask; mask |= EPOLLHUP;
mask = POLLHUP;
return mask; return mask;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment