Commit e3572dff authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'char-misc-5.15-rc6' 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 driver fixes for 5.15-rc6 for reported
  issues that include:

   - habanalabs driver fixes

   - mei driver fixes and new ids

   - fpga new device ids

   - MAINTAINER file updates for fpga subsystem

   - spi module id table additions and fixes

   - fastrpc locking fixes

   - nvmem driver fix

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

* tag 'char-misc-5.15-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc:
  eeprom: 93xx46: fix MODULE_DEVICE_TABLE
  nvmem: Fix shift-out-of-bound (UBSAN) with byte size cells
  mei: hbm: drop hbm responses on early shutdown
  mei: me: add Ice Lake-N device id.
  eeprom: 93xx46: Add SPI device ID table
  eeprom: at25: Add SPI ID table
  misc: HI6421V600_IRQ should depend on HAS_IOMEM
  misc: fastrpc: Add missing lock before accessing find_vma()
  cb710: avoid NULL pointer subtraction
  misc: gehc: Add SPI ID table
  MAINTAINERS: Drop outdated FPGA Manager website
  MAINTAINERS: Add Hao and Yilun as maintainers
  habanalabs: fix resetting args in wait for CS IOCTL
  fpga: ice40-spi: Add SPI device ID table
parents a563ae0f f4275272
...@@ -7343,10 +7343,11 @@ F: include/uapi/linux/fpga-dfl.h ...@@ -7343,10 +7343,11 @@ F: include/uapi/linux/fpga-dfl.h
FPGA MANAGER FRAMEWORK FPGA MANAGER FRAMEWORK
M: Moritz Fischer <mdf@kernel.org> M: Moritz Fischer <mdf@kernel.org>
M: Wu Hao <hao.wu@intel.com>
M: Xu Yilun <yilun.xu@intel.com>
R: Tom Rix <trix@redhat.com> R: Tom Rix <trix@redhat.com>
L: linux-fpga@vger.kernel.org L: linux-fpga@vger.kernel.org
S: Maintained S: Maintained
W: http://www.rocketboards.org
Q: http://patchwork.kernel.org/project/linux-fpga/list/ Q: http://patchwork.kernel.org/project/linux-fpga/list/
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mdf/linux-fpga.git T: git git://git.kernel.org/pub/scm/linux/kernel/git/mdf/linux-fpga.git
F: Documentation/devicetree/bindings/fpga/ F: Documentation/devicetree/bindings/fpga/
......
...@@ -192,12 +192,19 @@ static const struct of_device_id ice40_fpga_of_match[] = { ...@@ -192,12 +192,19 @@ static const struct of_device_id ice40_fpga_of_match[] = {
}; };
MODULE_DEVICE_TABLE(of, ice40_fpga_of_match); MODULE_DEVICE_TABLE(of, ice40_fpga_of_match);
static const struct spi_device_id ice40_fpga_spi_ids[] = {
{ .name = "ice40-fpga-mgr", },
{},
};
MODULE_DEVICE_TABLE(spi, ice40_fpga_spi_ids);
static struct spi_driver ice40_fpga_driver = { static struct spi_driver ice40_fpga_driver = {
.probe = ice40_fpga_probe, .probe = ice40_fpga_probe,
.driver = { .driver = {
.name = "ice40spi", .name = "ice40spi",
.of_match_table = of_match_ptr(ice40_fpga_of_match), .of_match_table = of_match_ptr(ice40_fpga_of_match),
}, },
.id_table = ice40_fpga_spi_ids,
}; };
module_spi_driver(ice40_fpga_driver); module_spi_driver(ice40_fpga_driver);
......
...@@ -224,6 +224,7 @@ config HI6421V600_IRQ ...@@ -224,6 +224,7 @@ config HI6421V600_IRQ
tristate "HiSilicon Hi6421v600 IRQ and powerkey" tristate "HiSilicon Hi6421v600 IRQ and powerkey"
depends on OF depends on OF
depends on SPMI depends on SPMI
depends on HAS_IOMEM
select MFD_CORE select MFD_CORE
select REGMAP_SPMI select REGMAP_SPMI
help help
......
...@@ -47,7 +47,7 @@ static inline bool needs_unaligned_copy(const void *ptr) ...@@ -47,7 +47,7 @@ static inline bool needs_unaligned_copy(const void *ptr)
#ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS #ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
return false; return false;
#else #else
return ((ptr - NULL) & 3) != 0; return ((uintptr_t)ptr & 3) != 0;
#endif #endif
} }
......
...@@ -366,6 +366,13 @@ static const struct of_device_id at25_of_match[] = { ...@@ -366,6 +366,13 @@ static const struct of_device_id at25_of_match[] = {
}; };
MODULE_DEVICE_TABLE(of, at25_of_match); MODULE_DEVICE_TABLE(of, at25_of_match);
static const struct spi_device_id at25_spi_ids[] = {
{ .name = "at25",},
{ .name = "fm25",},
{ }
};
MODULE_DEVICE_TABLE(spi, at25_spi_ids);
static int at25_probe(struct spi_device *spi) static int at25_probe(struct spi_device *spi)
{ {
struct at25_data *at25 = NULL; struct at25_data *at25 = NULL;
...@@ -491,6 +498,7 @@ static struct spi_driver at25_driver = { ...@@ -491,6 +498,7 @@ static struct spi_driver at25_driver = {
.dev_groups = sernum_groups, .dev_groups = sernum_groups,
}, },
.probe = at25_probe, .probe = at25_probe,
.id_table = at25_spi_ids,
}; };
module_spi_driver(at25_driver); module_spi_driver(at25_driver);
......
...@@ -406,6 +406,23 @@ static const struct of_device_id eeprom_93xx46_of_table[] = { ...@@ -406,6 +406,23 @@ static const struct of_device_id eeprom_93xx46_of_table[] = {
}; };
MODULE_DEVICE_TABLE(of, eeprom_93xx46_of_table); MODULE_DEVICE_TABLE(of, eeprom_93xx46_of_table);
static const struct spi_device_id eeprom_93xx46_spi_ids[] = {
{ .name = "eeprom-93xx46",
.driver_data = (kernel_ulong_t)&at93c46_data, },
{ .name = "at93c46",
.driver_data = (kernel_ulong_t)&at93c46_data, },
{ .name = "at93c46d",
.driver_data = (kernel_ulong_t)&atmel_at93c46d_data, },
{ .name = "at93c56",
.driver_data = (kernel_ulong_t)&at93c56_data, },
{ .name = "at93c66",
.driver_data = (kernel_ulong_t)&at93c66_data, },
{ .name = "93lc46b",
.driver_data = (kernel_ulong_t)&microchip_93lc46b_data, },
{}
};
MODULE_DEVICE_TABLE(spi, eeprom_93xx46_spi_ids);
static int eeprom_93xx46_probe_dt(struct spi_device *spi) static int eeprom_93xx46_probe_dt(struct spi_device *spi)
{ {
const struct of_device_id *of_id = const struct of_device_id *of_id =
...@@ -555,6 +572,7 @@ static struct spi_driver eeprom_93xx46_driver = { ...@@ -555,6 +572,7 @@ static struct spi_driver eeprom_93xx46_driver = {
}, },
.probe = eeprom_93xx46_probe, .probe = eeprom_93xx46_probe,
.remove = eeprom_93xx46_remove, .remove = eeprom_93xx46_remove,
.id_table = eeprom_93xx46_spi_ids,
}; };
module_spi_driver(eeprom_93xx46_driver); module_spi_driver(eeprom_93xx46_driver);
......
...@@ -814,10 +814,12 @@ static int fastrpc_get_args(u32 kernel, struct fastrpc_invoke_ctx *ctx) ...@@ -814,10 +814,12 @@ static int fastrpc_get_args(u32 kernel, struct fastrpc_invoke_ctx *ctx)
rpra[i].pv = (u64) ctx->args[i].ptr; rpra[i].pv = (u64) ctx->args[i].ptr;
pages[i].addr = ctx->maps[i]->phys; pages[i].addr = ctx->maps[i]->phys;
mmap_read_lock(current->mm);
vma = find_vma(current->mm, ctx->args[i].ptr); vma = find_vma(current->mm, ctx->args[i].ptr);
if (vma) if (vma)
pages[i].addr += ctx->args[i].ptr - pages[i].addr += ctx->args[i].ptr -
vma->vm_start; vma->vm_start;
mmap_read_unlock(current->mm);
pg_start = (ctx->args[i].ptr & PAGE_MASK) >> PAGE_SHIFT; pg_start = (ctx->args[i].ptr & PAGE_MASK) >> PAGE_SHIFT;
pg_end = ((ctx->args[i].ptr + len - 1) & PAGE_MASK) >> pg_end = ((ctx->args[i].ptr + len - 1) & PAGE_MASK) >>
......
...@@ -539,6 +539,7 @@ static int gehc_achc_probe(struct spi_device *spi) ...@@ -539,6 +539,7 @@ static int gehc_achc_probe(struct spi_device *spi)
static const struct spi_device_id gehc_achc_id[] = { static const struct spi_device_id gehc_achc_id[] = {
{ "ge,achc", 0 }, { "ge,achc", 0 },
{ "achc", 0 },
{ } { }
}; };
MODULE_DEVICE_TABLE(spi, gehc_achc_id); MODULE_DEVICE_TABLE(spi, gehc_achc_id);
......
...@@ -2649,11 +2649,18 @@ static int hl_multi_cs_wait_ioctl(struct hl_fpriv *hpriv, void *data) ...@@ -2649,11 +2649,18 @@ static int hl_multi_cs_wait_ioctl(struct hl_fpriv *hpriv, void *data)
free_seq_arr: free_seq_arr:
kfree(cs_seq_arr); kfree(cs_seq_arr);
/* update output args */
memset(args, 0, sizeof(*args));
if (rc) if (rc)
return rc; return rc;
if (mcs_data.wait_status == -ERESTARTSYS) {
dev_err_ratelimited(hdev->dev,
"user process got signal while waiting for Multi-CS\n");
return -EINTR;
}
/* update output args */
memset(args, 0, sizeof(*args));
if (mcs_data.completion_bitmap) { if (mcs_data.completion_bitmap) {
args->out.status = HL_WAIT_CS_STATUS_COMPLETED; args->out.status = HL_WAIT_CS_STATUS_COMPLETED;
args->out.cs_completion_map = mcs_data.completion_bitmap; args->out.cs_completion_map = mcs_data.completion_bitmap;
...@@ -2667,8 +2674,6 @@ static int hl_multi_cs_wait_ioctl(struct hl_fpriv *hpriv, void *data) ...@@ -2667,8 +2674,6 @@ static int hl_multi_cs_wait_ioctl(struct hl_fpriv *hpriv, void *data)
/* update if some CS was gone */ /* update if some CS was gone */
if (mcs_data.timestamp) if (mcs_data.timestamp)
args->out.flags |= HL_WAIT_CS_STATUS_FLAG_GONE; args->out.flags |= HL_WAIT_CS_STATUS_FLAG_GONE;
} else if (mcs_data.wait_status == -ERESTARTSYS) {
args->out.status = HL_WAIT_CS_STATUS_INTERRUPTED;
} else { } else {
args->out.status = HL_WAIT_CS_STATUS_BUSY; args->out.status = HL_WAIT_CS_STATUS_BUSY;
} }
...@@ -2688,16 +2693,17 @@ static int hl_cs_wait_ioctl(struct hl_fpriv *hpriv, void *data) ...@@ -2688,16 +2693,17 @@ static int hl_cs_wait_ioctl(struct hl_fpriv *hpriv, void *data)
rc = _hl_cs_wait_ioctl(hdev, hpriv->ctx, args->in.timeout_us, seq, rc = _hl_cs_wait_ioctl(hdev, hpriv->ctx, args->in.timeout_us, seq,
&status, &timestamp); &status, &timestamp);
if (rc == -ERESTARTSYS) {
dev_err_ratelimited(hdev->dev,
"user process got signal while waiting for CS handle %llu\n",
seq);
return -EINTR;
}
memset(args, 0, sizeof(*args)); memset(args, 0, sizeof(*args));
if (rc) { if (rc) {
if (rc == -ERESTARTSYS) { if (rc == -ETIMEDOUT) {
dev_err_ratelimited(hdev->dev,
"user process got signal while waiting for CS handle %llu\n",
seq);
args->out.status = HL_WAIT_CS_STATUS_INTERRUPTED;
rc = -EINTR;
} else if (rc == -ETIMEDOUT) {
dev_err_ratelimited(hdev->dev, dev_err_ratelimited(hdev->dev,
"CS %llu has timed-out while user process is waiting for it\n", "CS %llu has timed-out while user process is waiting for it\n",
seq); seq);
...@@ -2823,7 +2829,6 @@ static int _hl_interrupt_wait_ioctl(struct hl_device *hdev, struct hl_ctx *ctx, ...@@ -2823,7 +2829,6 @@ static int _hl_interrupt_wait_ioctl(struct hl_device *hdev, struct hl_ctx *ctx,
dev_err_ratelimited(hdev->dev, dev_err_ratelimited(hdev->dev,
"user process got signal while waiting for interrupt ID %d\n", "user process got signal while waiting for interrupt ID %d\n",
interrupt->interrupt_id); interrupt->interrupt_id);
*status = HL_WAIT_CS_STATUS_INTERRUPTED;
rc = -EINTR; rc = -EINTR;
} else { } else {
*status = CS_WAIT_STATUS_BUSY; *status = CS_WAIT_STATUS_BUSY;
...@@ -2878,8 +2883,6 @@ static int hl_interrupt_wait_ioctl(struct hl_fpriv *hpriv, void *data) ...@@ -2878,8 +2883,6 @@ static int hl_interrupt_wait_ioctl(struct hl_fpriv *hpriv, void *data)
args->in.interrupt_timeout_us, args->in.addr, args->in.interrupt_timeout_us, args->in.addr,
args->in.target, interrupt_offset, &status); args->in.target, interrupt_offset, &status);
memset(args, 0, sizeof(*args));
if (rc) { if (rc) {
if (rc != -EINTR) if (rc != -EINTR)
dev_err_ratelimited(hdev->dev, dev_err_ratelimited(hdev->dev,
...@@ -2888,6 +2891,8 @@ static int hl_interrupt_wait_ioctl(struct hl_fpriv *hpriv, void *data) ...@@ -2888,6 +2891,8 @@ static int hl_interrupt_wait_ioctl(struct hl_fpriv *hpriv, void *data)
return rc; return rc;
} }
memset(args, 0, sizeof(*args));
switch (status) { switch (status) {
case CS_WAIT_STATUS_COMPLETED: case CS_WAIT_STATUS_COMPLETED:
args->out.status = HL_WAIT_CS_STATUS_COMPLETED; args->out.status = HL_WAIT_CS_STATUS_COMPLETED;
......
...@@ -1298,7 +1298,8 @@ int mei_hbm_dispatch(struct mei_device *dev, struct mei_msg_hdr *hdr) ...@@ -1298,7 +1298,8 @@ int mei_hbm_dispatch(struct mei_device *dev, struct mei_msg_hdr *hdr)
if (dev->dev_state != MEI_DEV_INIT_CLIENTS || if (dev->dev_state != MEI_DEV_INIT_CLIENTS ||
dev->hbm_state != MEI_HBM_STARTING) { dev->hbm_state != MEI_HBM_STARTING) {
if (dev->dev_state == MEI_DEV_POWER_DOWN) { if (dev->dev_state == MEI_DEV_POWER_DOWN ||
dev->dev_state == MEI_DEV_POWERING_DOWN) {
dev_dbg(dev->dev, "hbm: start: on shutdown, ignoring\n"); dev_dbg(dev->dev, "hbm: start: on shutdown, ignoring\n");
return 0; return 0;
} }
...@@ -1381,7 +1382,8 @@ int mei_hbm_dispatch(struct mei_device *dev, struct mei_msg_hdr *hdr) ...@@ -1381,7 +1382,8 @@ int mei_hbm_dispatch(struct mei_device *dev, struct mei_msg_hdr *hdr)
if (dev->dev_state != MEI_DEV_INIT_CLIENTS || if (dev->dev_state != MEI_DEV_INIT_CLIENTS ||
dev->hbm_state != MEI_HBM_DR_SETUP) { dev->hbm_state != MEI_HBM_DR_SETUP) {
if (dev->dev_state == MEI_DEV_POWER_DOWN) { if (dev->dev_state == MEI_DEV_POWER_DOWN ||
dev->dev_state == MEI_DEV_POWERING_DOWN) {
dev_dbg(dev->dev, "hbm: dma setup response: on shutdown, ignoring\n"); dev_dbg(dev->dev, "hbm: dma setup response: on shutdown, ignoring\n");
return 0; return 0;
} }
...@@ -1448,7 +1450,8 @@ int mei_hbm_dispatch(struct mei_device *dev, struct mei_msg_hdr *hdr) ...@@ -1448,7 +1450,8 @@ int mei_hbm_dispatch(struct mei_device *dev, struct mei_msg_hdr *hdr)
if (dev->dev_state != MEI_DEV_INIT_CLIENTS || if (dev->dev_state != MEI_DEV_INIT_CLIENTS ||
dev->hbm_state != MEI_HBM_CLIENT_PROPERTIES) { dev->hbm_state != MEI_HBM_CLIENT_PROPERTIES) {
if (dev->dev_state == MEI_DEV_POWER_DOWN) { if (dev->dev_state == MEI_DEV_POWER_DOWN ||
dev->dev_state == MEI_DEV_POWERING_DOWN) {
dev_dbg(dev->dev, "hbm: properties response: on shutdown, ignoring\n"); dev_dbg(dev->dev, "hbm: properties response: on shutdown, ignoring\n");
return 0; return 0;
} }
...@@ -1490,7 +1493,8 @@ int mei_hbm_dispatch(struct mei_device *dev, struct mei_msg_hdr *hdr) ...@@ -1490,7 +1493,8 @@ int mei_hbm_dispatch(struct mei_device *dev, struct mei_msg_hdr *hdr)
if (dev->dev_state != MEI_DEV_INIT_CLIENTS || if (dev->dev_state != MEI_DEV_INIT_CLIENTS ||
dev->hbm_state != MEI_HBM_ENUM_CLIENTS) { dev->hbm_state != MEI_HBM_ENUM_CLIENTS) {
if (dev->dev_state == MEI_DEV_POWER_DOWN) { if (dev->dev_state == MEI_DEV_POWER_DOWN ||
dev->dev_state == MEI_DEV_POWERING_DOWN) {
dev_dbg(dev->dev, "hbm: enumeration response: on shutdown, ignoring\n"); dev_dbg(dev->dev, "hbm: enumeration response: on shutdown, ignoring\n");
return 0; return 0;
} }
......
...@@ -92,6 +92,7 @@ ...@@ -92,6 +92,7 @@
#define MEI_DEV_ID_CDF 0x18D3 /* Cedar Fork */ #define MEI_DEV_ID_CDF 0x18D3 /* Cedar Fork */
#define MEI_DEV_ID_ICP_LP 0x34E0 /* Ice Lake Point LP */ #define MEI_DEV_ID_ICP_LP 0x34E0 /* Ice Lake Point LP */
#define MEI_DEV_ID_ICP_N 0x38E0 /* Ice Lake Point N */
#define MEI_DEV_ID_JSP_N 0x4DE0 /* Jasper Lake Point N */ #define MEI_DEV_ID_JSP_N 0x4DE0 /* Jasper Lake Point N */
......
...@@ -96,6 +96,7 @@ static const struct pci_device_id mei_me_pci_tbl[] = { ...@@ -96,6 +96,7 @@ static const struct pci_device_id mei_me_pci_tbl[] = {
{MEI_PCI_DEVICE(MEI_DEV_ID_CMP_H_3, MEI_ME_PCH8_ITOUCH_CFG)}, {MEI_PCI_DEVICE(MEI_DEV_ID_CMP_H_3, MEI_ME_PCH8_ITOUCH_CFG)},
{MEI_PCI_DEVICE(MEI_DEV_ID_ICP_LP, MEI_ME_PCH12_CFG)}, {MEI_PCI_DEVICE(MEI_DEV_ID_ICP_LP, MEI_ME_PCH12_CFG)},
{MEI_PCI_DEVICE(MEI_DEV_ID_ICP_N, MEI_ME_PCH12_CFG)},
{MEI_PCI_DEVICE(MEI_DEV_ID_TGP_LP, MEI_ME_PCH15_CFG)}, {MEI_PCI_DEVICE(MEI_DEV_ID_TGP_LP, MEI_ME_PCH15_CFG)},
{MEI_PCI_DEVICE(MEI_DEV_ID_TGP_H, MEI_ME_PCH15_SPS_CFG)}, {MEI_PCI_DEVICE(MEI_DEV_ID_TGP_H, MEI_ME_PCH15_SPS_CFG)},
......
...@@ -1383,7 +1383,8 @@ static void nvmem_shift_read_buffer_in_place(struct nvmem_cell *cell, void *buf) ...@@ -1383,7 +1383,8 @@ static void nvmem_shift_read_buffer_in_place(struct nvmem_cell *cell, void *buf)
*p-- = 0; *p-- = 0;
/* clear msb bits if any leftover in the last byte */ /* clear msb bits if any leftover in the last byte */
*p &= GENMASK((cell->nbits%BITS_PER_BYTE) - 1, 0); if (cell->nbits % BITS_PER_BYTE)
*p &= GENMASK((cell->nbits % BITS_PER_BYTE) - 1, 0);
} }
static int __nvmem_cell_read(struct nvmem_device *nvmem, static int __nvmem_cell_read(struct nvmem_device *nvmem,
......
...@@ -917,7 +917,6 @@ struct hl_wait_cs_in { ...@@ -917,7 +917,6 @@ struct hl_wait_cs_in {
#define HL_WAIT_CS_STATUS_BUSY 1 #define HL_WAIT_CS_STATUS_BUSY 1
#define HL_WAIT_CS_STATUS_TIMEDOUT 2 #define HL_WAIT_CS_STATUS_TIMEDOUT 2
#define HL_WAIT_CS_STATUS_ABORTED 3 #define HL_WAIT_CS_STATUS_ABORTED 3
#define HL_WAIT_CS_STATUS_INTERRUPTED 4
#define HL_WAIT_CS_STATUS_FLAG_GONE 0x1 #define HL_WAIT_CS_STATUS_FLAG_GONE 0x1
#define HL_WAIT_CS_STATUS_FLAG_TIMESTAMP_VLD 0x2 #define HL_WAIT_CS_STATUS_FLAG_TIMESTAMP_VLD 0x2
...@@ -1286,7 +1285,8 @@ struct hl_debug_args { ...@@ -1286,7 +1285,8 @@ struct hl_debug_args {
* EIO - The CS was aborted (usually because the device was reset) * EIO - The CS was aborted (usually because the device was reset)
* ENODEV - The device wants to do hard-reset (so user need to close FD) * ENODEV - The device wants to do hard-reset (so user need to close FD)
* *
* The driver also returns a custom define inside the IOCTL which can be: * The driver also returns a custom define in case the IOCTL call returned 0.
* The define can be one of the following:
* *
* HL_WAIT_CS_STATUS_COMPLETED - The CS has been completed successfully (0) * HL_WAIT_CS_STATUS_COMPLETED - The CS has been completed successfully (0)
* HL_WAIT_CS_STATUS_BUSY - The CS is still executing (0) * HL_WAIT_CS_STATUS_BUSY - The CS is still executing (0)
...@@ -1294,8 +1294,6 @@ struct hl_debug_args { ...@@ -1294,8 +1294,6 @@ struct hl_debug_args {
* (ETIMEDOUT) * (ETIMEDOUT)
* HL_WAIT_CS_STATUS_ABORTED - The CS was aborted, usually because the * HL_WAIT_CS_STATUS_ABORTED - The CS was aborted, usually because the
* device was reset (EIO) * device was reset (EIO)
* HL_WAIT_CS_STATUS_INTERRUPTED - Waiting for the CS was interrupted (EINTR)
*
*/ */
#define HL_IOCTL_WAIT_CS \ #define HL_IOCTL_WAIT_CS \
......
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