Commit 6398b9fc authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'char-misc-5.5-rc3' 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 and other driver fixes for 5.5-rc3.

  The most noticable one is a much-reported fix for a random driver
  issue that came up from 5.5-rc1 compat_ioctl cleanups. The others are
  a chunk of habanalab driver fixes and intel_th driver fixes and new
  device ids.

  All have been in linux-next with no reported issues"

* tag 'char-misc-5.5-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc:
  random: don't forget compat_ioctl on urandom
  intel_th: msu: Fix window switching without windows
  intel_th: Fix freeing IRQs
  intel_th: pci: Add Elkhart Lake SOC support
  intel_th: pci: Add Comet Lake PCH-V support
  habanalabs: remove variable 'val' set but not used
  habanalabs: rate limit error msg on waiting for CS
parents 107aff96 4aa37c46
...@@ -2175,6 +2175,7 @@ const struct file_operations urandom_fops = { ...@@ -2175,6 +2175,7 @@ const struct file_operations urandom_fops = {
.read = urandom_read, .read = urandom_read,
.write = random_write, .write = random_write,
.unlocked_ioctl = random_ioctl, .unlocked_ioctl = random_ioctl,
.compat_ioctl = compat_ptr_ioctl,
.fasync = random_fasync, .fasync = random_fasync,
.llseek = noop_llseek, .llseek = noop_llseek,
}; };
......
...@@ -834,9 +834,6 @@ static irqreturn_t intel_th_irq(int irq, void *data) ...@@ -834,9 +834,6 @@ static irqreturn_t intel_th_irq(int irq, void *data)
ret |= d->irq(th->thdev[i]); ret |= d->irq(th->thdev[i]);
} }
if (ret == IRQ_NONE)
pr_warn_ratelimited("nobody cared for irq\n");
return ret; return ret;
} }
...@@ -887,6 +884,7 @@ intel_th_alloc(struct device *dev, struct intel_th_drvdata *drvdata, ...@@ -887,6 +884,7 @@ intel_th_alloc(struct device *dev, struct intel_th_drvdata *drvdata,
if (th->irq == -1) if (th->irq == -1)
th->irq = devres[r].start; th->irq = devres[r].start;
th->num_irqs++;
break; break;
default: default:
dev_warn(dev, "Unknown resource type %lx\n", dev_warn(dev, "Unknown resource type %lx\n",
...@@ -940,6 +938,9 @@ void intel_th_free(struct intel_th *th) ...@@ -940,6 +938,9 @@ void intel_th_free(struct intel_th *th)
th->num_thdevs = 0; th->num_thdevs = 0;
for (i = 0; i < th->num_irqs; i++)
devm_free_irq(th->dev, th->irq + i, th);
pm_runtime_get_sync(th->dev); pm_runtime_get_sync(th->dev);
pm_runtime_forbid(th->dev); pm_runtime_forbid(th->dev);
......
...@@ -261,6 +261,7 @@ enum th_mmio_idx { ...@@ -261,6 +261,7 @@ enum th_mmio_idx {
* @num_thdevs: number of devices in the @thdev array * @num_thdevs: number of devices in the @thdev array
* @num_resources: number of resources in the @resource array * @num_resources: number of resources in the @resource array
* @irq: irq number * @irq: irq number
* @num_irqs: number of IRQs is use
* @id: this Intel TH controller's device ID in the system * @id: this Intel TH controller's device ID in the system
* @major: device node major for output devices * @major: device node major for output devices
*/ */
...@@ -277,6 +278,7 @@ struct intel_th { ...@@ -277,6 +278,7 @@ struct intel_th {
unsigned int num_thdevs; unsigned int num_thdevs;
unsigned int num_resources; unsigned int num_resources;
int irq; int irq;
int num_irqs;
int id; int id;
int major; int major;
......
...@@ -1676,10 +1676,13 @@ static int intel_th_msc_init(struct msc *msc) ...@@ -1676,10 +1676,13 @@ static int intel_th_msc_init(struct msc *msc)
return 0; return 0;
} }
static void msc_win_switch(struct msc *msc) static int msc_win_switch(struct msc *msc)
{ {
struct msc_window *first; struct msc_window *first;
if (list_empty(&msc->win_list))
return -EINVAL;
first = list_first_entry(&msc->win_list, struct msc_window, entry); first = list_first_entry(&msc->win_list, struct msc_window, entry);
if (msc_is_last_win(msc->cur_win)) if (msc_is_last_win(msc->cur_win))
...@@ -1691,6 +1694,8 @@ static void msc_win_switch(struct msc *msc) ...@@ -1691,6 +1694,8 @@ static void msc_win_switch(struct msc *msc)
msc->base_addr = msc_win_base_dma(msc->cur_win); msc->base_addr = msc_win_base_dma(msc->cur_win);
intel_th_trace_switch(msc->thdev); intel_th_trace_switch(msc->thdev);
return 0;
} }
/** /**
...@@ -2025,16 +2030,15 @@ win_switch_store(struct device *dev, struct device_attribute *attr, ...@@ -2025,16 +2030,15 @@ win_switch_store(struct device *dev, struct device_attribute *attr,
if (val != 1) if (val != 1)
return -EINVAL; return -EINVAL;
ret = -EINVAL;
mutex_lock(&msc->buf_mutex); mutex_lock(&msc->buf_mutex);
/* /*
* Window switch can only happen in the "multi" mode. * Window switch can only happen in the "multi" mode.
* If a external buffer is engaged, they have the full * If a external buffer is engaged, they have the full
* control over window switching. * control over window switching.
*/ */
if (msc->mode != MSC_MODE_MULTI || msc->mbuf) if (msc->mode == MSC_MODE_MULTI && !msc->mbuf)
ret = -ENOTSUPP; ret = msc_win_switch(msc);
else
msc_win_switch(msc);
mutex_unlock(&msc->buf_mutex); mutex_unlock(&msc->buf_mutex);
return ret ? ret : size; return ret ? ret : size;
......
...@@ -204,6 +204,11 @@ static const struct pci_device_id intel_th_pci_id_table[] = { ...@@ -204,6 +204,11 @@ static const struct pci_device_id intel_th_pci_id_table[] = {
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x06a6), PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x06a6),
.driver_data = (kernel_ulong_t)&intel_th_2x, .driver_data = (kernel_ulong_t)&intel_th_2x,
}, },
{
/* Comet Lake PCH-V */
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0xa3a6),
.driver_data = (kernel_ulong_t)&intel_th_2x,
},
{ {
/* Ice Lake NNPI */ /* Ice Lake NNPI */
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x45c5), PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x45c5),
...@@ -229,6 +234,11 @@ static const struct pci_device_id intel_th_pci_id_table[] = { ...@@ -229,6 +234,11 @@ static const struct pci_device_id intel_th_pci_id_table[] = {
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4da6), PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4da6),
.driver_data = (kernel_ulong_t)&intel_th_2x, .driver_data = (kernel_ulong_t)&intel_th_2x,
}, },
{
/* Elkhart Lake */
PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x4b26),
.driver_data = (kernel_ulong_t)&intel_th_2x,
},
{ 0 }, { 0 },
}; };
......
...@@ -824,7 +824,8 @@ int hl_cs_wait_ioctl(struct hl_fpriv *hpriv, void *data) ...@@ -824,7 +824,8 @@ int hl_cs_wait_ioctl(struct hl_fpriv *hpriv, void *data)
memset(args, 0, sizeof(*args)); memset(args, 0, sizeof(*args));
if (rc < 0) { if (rc < 0) {
dev_err(hdev->dev, "Error %ld on waiting for CS handle %llu\n", dev_err_ratelimited(hdev->dev,
"Error %ld on waiting for CS handle %llu\n",
rc, seq); rc, seq);
if (rc == -ERESTARTSYS) { if (rc == -ERESTARTSYS) {
args->out.status = HL_WAIT_CS_STATUS_INTERRUPTED; args->out.status = HL_WAIT_CS_STATUS_INTERRUPTED;
......
...@@ -176,7 +176,7 @@ struct dma_fence *hl_ctx_get_fence(struct hl_ctx *ctx, u64 seq) ...@@ -176,7 +176,7 @@ struct dma_fence *hl_ctx_get_fence(struct hl_ctx *ctx, u64 seq)
spin_lock(&ctx->cs_lock); spin_lock(&ctx->cs_lock);
if (seq >= ctx->cs_sequence) { if (seq >= ctx->cs_sequence) {
dev_notice(hdev->dev, dev_notice_ratelimited(hdev->dev,
"Can't wait on seq %llu because current CS is at seq %llu\n", "Can't wait on seq %llu because current CS is at seq %llu\n",
seq, ctx->cs_sequence); seq, ctx->cs_sequence);
spin_unlock(&ctx->cs_lock); spin_unlock(&ctx->cs_lock);
......
...@@ -2192,7 +2192,7 @@ static int goya_push_linux_to_device(struct hl_device *hdev) ...@@ -2192,7 +2192,7 @@ static int goya_push_linux_to_device(struct hl_device *hdev)
static int goya_pldm_init_cpu(struct hl_device *hdev) static int goya_pldm_init_cpu(struct hl_device *hdev)
{ {
u32 val, unit_rst_val; u32 unit_rst_val;
int rc; int rc;
/* Must initialize SRAM scrambler before pushing u-boot to SRAM */ /* Must initialize SRAM scrambler before pushing u-boot to SRAM */
...@@ -2200,14 +2200,14 @@ static int goya_pldm_init_cpu(struct hl_device *hdev) ...@@ -2200,14 +2200,14 @@ static int goya_pldm_init_cpu(struct hl_device *hdev)
/* Put ARM cores into reset */ /* Put ARM cores into reset */
WREG32(mmCPU_CA53_CFG_ARM_RST_CONTROL, CPU_RESET_ASSERT); WREG32(mmCPU_CA53_CFG_ARM_RST_CONTROL, CPU_RESET_ASSERT);
val = RREG32(mmCPU_CA53_CFG_ARM_RST_CONTROL); RREG32(mmCPU_CA53_CFG_ARM_RST_CONTROL);
/* Reset the CA53 MACRO */ /* Reset the CA53 MACRO */
unit_rst_val = RREG32(mmPSOC_GLOBAL_CONF_UNIT_RST_N); unit_rst_val = RREG32(mmPSOC_GLOBAL_CONF_UNIT_RST_N);
WREG32(mmPSOC_GLOBAL_CONF_UNIT_RST_N, CA53_RESET); WREG32(mmPSOC_GLOBAL_CONF_UNIT_RST_N, CA53_RESET);
val = RREG32(mmPSOC_GLOBAL_CONF_UNIT_RST_N); RREG32(mmPSOC_GLOBAL_CONF_UNIT_RST_N);
WREG32(mmPSOC_GLOBAL_CONF_UNIT_RST_N, unit_rst_val); WREG32(mmPSOC_GLOBAL_CONF_UNIT_RST_N, unit_rst_val);
val = RREG32(mmPSOC_GLOBAL_CONF_UNIT_RST_N); RREG32(mmPSOC_GLOBAL_CONF_UNIT_RST_N);
rc = goya_push_uboot_to_device(hdev); rc = goya_push_uboot_to_device(hdev);
if (rc) if (rc)
...@@ -2228,7 +2228,7 @@ static int goya_pldm_init_cpu(struct hl_device *hdev) ...@@ -2228,7 +2228,7 @@ static int goya_pldm_init_cpu(struct hl_device *hdev)
/* Release ARM core 0 from reset */ /* Release ARM core 0 from reset */
WREG32(mmCPU_CA53_CFG_ARM_RST_CONTROL, WREG32(mmCPU_CA53_CFG_ARM_RST_CONTROL,
CPU_RESET_CORE0_DEASSERT); CPU_RESET_CORE0_DEASSERT);
val = RREG32(mmCPU_CA53_CFG_ARM_RST_CONTROL); RREG32(mmCPU_CA53_CFG_ARM_RST_CONTROL);
return 0; return 0;
} }
...@@ -2502,13 +2502,12 @@ int goya_mmu_init(struct hl_device *hdev) ...@@ -2502,13 +2502,12 @@ int goya_mmu_init(struct hl_device *hdev)
static int goya_hw_init(struct hl_device *hdev) static int goya_hw_init(struct hl_device *hdev)
{ {
struct asic_fixed_properties *prop = &hdev->asic_prop; struct asic_fixed_properties *prop = &hdev->asic_prop;
u32 val;
int rc; int rc;
dev_info(hdev->dev, "Starting initialization of H/W\n"); dev_info(hdev->dev, "Starting initialization of H/W\n");
/* Perform read from the device to make sure device is up */ /* Perform read from the device to make sure device is up */
val = RREG32(mmPCIE_DBI_DEVICE_ID_VENDOR_ID_REG); RREG32(mmPCIE_DBI_DEVICE_ID_VENDOR_ID_REG);
/* /*
* Let's mark in the H/W that we have reached this point. We check * Let's mark in the H/W that we have reached this point. We check
...@@ -2560,7 +2559,7 @@ static int goya_hw_init(struct hl_device *hdev) ...@@ -2560,7 +2559,7 @@ static int goya_hw_init(struct hl_device *hdev)
goto disable_queues; goto disable_queues;
/* Perform read from the device to flush all MSI-X configuration */ /* Perform read from the device to flush all MSI-X configuration */
val = RREG32(mmPCIE_DBI_DEVICE_ID_VENDOR_ID_REG); RREG32(mmPCIE_DBI_DEVICE_ID_VENDOR_ID_REG);
return 0; return 0;
......
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