mirror of
https://github.com/torvalds/linux.git
synced 2026-06-07 05:55:44 +02:00
Merge 27bba9c532 ("Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi") into android-mainline
Steps on the way to 5.10-rc5 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: If85acec5178f1d8317f5ee781ae91ac27df55464
This commit is contained in:
commit
26d2906f96
|
|
@ -8,10 +8,16 @@ Required properties:
|
|||
|
||||
- reg : The I2C address of the device.
|
||||
|
||||
Optional properties:
|
||||
|
||||
- realtek,power-up-delay-ms
|
||||
Set a delay time for flush work to be completed,
|
||||
this value is adjustable depending on platform.
|
||||
|
||||
Example:
|
||||
|
||||
rt1015: codec@28 {
|
||||
compatible = "realtek,rt1015";
|
||||
reg = <0x28>;
|
||||
realtek,power-up-delay-ms = <50>;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -9169,6 +9169,7 @@ F: include/linux/iomap.h
|
|||
|
||||
IOMMU DRIVERS
|
||||
M: Joerg Roedel <joro@8bytes.org>
|
||||
M: Will Deacon <will@kernel.org>
|
||||
L: iommu@lists.linux-foundation.org
|
||||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/joro/iommu.git
|
||||
|
|
|
|||
|
|
@ -514,9 +514,6 @@ int tboot_force_iommu(void)
|
|||
if (!tboot_enabled())
|
||||
return 0;
|
||||
|
||||
if (intel_iommu_tboot_noforce)
|
||||
return 1;
|
||||
|
||||
if (no_iommu || swiotlb || dmar_disabled)
|
||||
pr_warn("Forcing Intel-IOMMU to enabled\n");
|
||||
|
||||
|
|
|
|||
|
|
@ -93,10 +93,20 @@ void xen_init_lock_cpu(int cpu)
|
|||
|
||||
void xen_uninit_lock_cpu(int cpu)
|
||||
{
|
||||
int irq;
|
||||
|
||||
if (!xen_pvspin)
|
||||
return;
|
||||
|
||||
unbind_from_irqhandler(per_cpu(lock_kicker_irq, cpu), NULL);
|
||||
/*
|
||||
* When booting the kernel with 'mitigations=auto,nosmt', the secondary
|
||||
* CPUs are not activated, and lock_kicker_irq is not initialized.
|
||||
*/
|
||||
irq = per_cpu(lock_kicker_irq, cpu);
|
||||
if (irq == -1)
|
||||
return;
|
||||
|
||||
unbind_from_irqhandler(irq, NULL);
|
||||
per_cpu(lock_kicker_irq, cpu) = -1;
|
||||
kfree(per_cpu(irq_name, cpu));
|
||||
per_cpu(irq_name, cpu) = NULL;
|
||||
|
|
|
|||
|
|
@ -849,6 +849,7 @@ static void blkcg_fill_root_iostats(void)
|
|||
blkg_iostat_set(&blkg->iostat.cur, &tmp);
|
||||
u64_stats_update_end(&blkg->iostat.sync);
|
||||
}
|
||||
disk_put_part(part);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -225,13 +225,18 @@ static void flush_end_io(struct request *flush_rq, blk_status_t error)
|
|||
/* release the tag's ownership to the req cloned from */
|
||||
spin_lock_irqsave(&fq->mq_flush_lock, flags);
|
||||
|
||||
WRITE_ONCE(flush_rq->state, MQ_RQ_IDLE);
|
||||
if (!refcount_dec_and_test(&flush_rq->ref)) {
|
||||
fq->rq_status = error;
|
||||
spin_unlock_irqrestore(&fq->mq_flush_lock, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Flush request has to be marked as IDLE when it is really ended
|
||||
* because its .end_io() is called from timeout code path too for
|
||||
* avoiding use-after-free.
|
||||
*/
|
||||
WRITE_ONCE(flush_rq->state, MQ_RQ_IDLE);
|
||||
if (fq->rq_status != BLK_STS_OK)
|
||||
error = fq->rq_status;
|
||||
|
||||
|
|
|
|||
|
|
@ -1039,16 +1039,15 @@ static int get_dma_id(struct dma_device *device)
|
|||
static int __dma_async_device_channel_register(struct dma_device *device,
|
||||
struct dma_chan *chan)
|
||||
{
|
||||
int rc = 0;
|
||||
int rc;
|
||||
|
||||
chan->local = alloc_percpu(typeof(*chan->local));
|
||||
if (!chan->local)
|
||||
goto err_out;
|
||||
return -ENOMEM;
|
||||
chan->dev = kzalloc(sizeof(*chan->dev), GFP_KERNEL);
|
||||
if (!chan->dev) {
|
||||
free_percpu(chan->local);
|
||||
chan->local = NULL;
|
||||
goto err_out;
|
||||
rc = -ENOMEM;
|
||||
goto err_free_local;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -1061,7 +1060,8 @@ static int __dma_async_device_channel_register(struct dma_device *device,
|
|||
if (chan->chan_id < 0) {
|
||||
pr_err("%s: unable to alloc ida for chan: %d\n",
|
||||
__func__, chan->chan_id);
|
||||
goto err_out;
|
||||
rc = chan->chan_id;
|
||||
goto err_free_dev;
|
||||
}
|
||||
|
||||
chan->dev->device.class = &dma_devclass;
|
||||
|
|
@ -1082,9 +1082,10 @@ static int __dma_async_device_channel_register(struct dma_device *device,
|
|||
mutex_lock(&device->chan_mutex);
|
||||
ida_free(&device->chan_ida, chan->chan_id);
|
||||
mutex_unlock(&device->chan_mutex);
|
||||
err_out:
|
||||
free_percpu(chan->local);
|
||||
err_free_dev:
|
||||
kfree(chan->dev);
|
||||
err_free_local:
|
||||
free_percpu(chan->local);
|
||||
return rc;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -271,7 +271,7 @@ int idxd_wq_map_portal(struct idxd_wq *wq)
|
|||
resource_size_t start;
|
||||
|
||||
start = pci_resource_start(pdev, IDXD_WQ_BAR);
|
||||
start = start + wq->id * IDXD_PORTAL_SIZE;
|
||||
start += idxd_get_wq_portal_full_offset(wq->id, IDXD_PORTAL_LIMITED);
|
||||
|
||||
wq->dportal = devm_ioremap(dev, start, IDXD_PORTAL_SIZE);
|
||||
if (!wq->dportal)
|
||||
|
|
@ -295,7 +295,7 @@ void idxd_wq_disable_cleanup(struct idxd_wq *wq)
|
|||
int i, wq_offset;
|
||||
|
||||
lockdep_assert_held(&idxd->dev_lock);
|
||||
memset(&wq->wqcfg, 0, sizeof(wq->wqcfg));
|
||||
memset(wq->wqcfg, 0, idxd->wqcfg_size);
|
||||
wq->type = IDXD_WQT_NONE;
|
||||
wq->size = 0;
|
||||
wq->group = NULL;
|
||||
|
|
@ -304,8 +304,8 @@ void idxd_wq_disable_cleanup(struct idxd_wq *wq)
|
|||
clear_bit(WQ_FLAG_DEDICATED, &wq->flags);
|
||||
memset(wq->name, 0, WQ_NAME_SIZE);
|
||||
|
||||
for (i = 0; i < 8; i++) {
|
||||
wq_offset = idxd->wqcfg_offset + wq->id * 32 + i * sizeof(u32);
|
||||
for (i = 0; i < WQCFG_STRIDES(idxd); i++) {
|
||||
wq_offset = WQCFG_OFFSET(idxd, wq->id, i);
|
||||
iowrite32(0, idxd->reg_base + wq_offset);
|
||||
dev_dbg(dev, "WQ[%d][%d][%#x]: %#x\n",
|
||||
wq->id, i, wq_offset,
|
||||
|
|
@ -539,10 +539,10 @@ static int idxd_wq_config_write(struct idxd_wq *wq)
|
|||
if (!wq->group)
|
||||
return 0;
|
||||
|
||||
memset(&wq->wqcfg, 0, sizeof(union wqcfg));
|
||||
memset(wq->wqcfg, 0, idxd->wqcfg_size);
|
||||
|
||||
/* byte 0-3 */
|
||||
wq->wqcfg.wq_size = wq->size;
|
||||
wq->wqcfg->wq_size = wq->size;
|
||||
|
||||
if (wq->size == 0) {
|
||||
dev_warn(dev, "Incorrect work queue size: 0\n");
|
||||
|
|
@ -550,22 +550,21 @@ static int idxd_wq_config_write(struct idxd_wq *wq)
|
|||
}
|
||||
|
||||
/* bytes 4-7 */
|
||||
wq->wqcfg.wq_thresh = wq->threshold;
|
||||
wq->wqcfg->wq_thresh = wq->threshold;
|
||||
|
||||
/* byte 8-11 */
|
||||
wq->wqcfg.priv = !!(wq->type == IDXD_WQT_KERNEL);
|
||||
wq->wqcfg.mode = 1;
|
||||
|
||||
wq->wqcfg.priority = wq->priority;
|
||||
wq->wqcfg->priv = !!(wq->type == IDXD_WQT_KERNEL);
|
||||
wq->wqcfg->mode = 1;
|
||||
wq->wqcfg->priority = wq->priority;
|
||||
|
||||
/* bytes 12-15 */
|
||||
wq->wqcfg.max_xfer_shift = ilog2(wq->max_xfer_bytes);
|
||||
wq->wqcfg.max_batch_shift = ilog2(wq->max_batch_size);
|
||||
wq->wqcfg->max_xfer_shift = ilog2(wq->max_xfer_bytes);
|
||||
wq->wqcfg->max_batch_shift = ilog2(wq->max_batch_size);
|
||||
|
||||
dev_dbg(dev, "WQ %d CFGs\n", wq->id);
|
||||
for (i = 0; i < 8; i++) {
|
||||
wq_offset = idxd->wqcfg_offset + wq->id * 32 + i * sizeof(u32);
|
||||
iowrite32(wq->wqcfg.bits[i], idxd->reg_base + wq_offset);
|
||||
for (i = 0; i < WQCFG_STRIDES(idxd); i++) {
|
||||
wq_offset = WQCFG_OFFSET(idxd, wq->id, i);
|
||||
iowrite32(wq->wqcfg->bits[i], idxd->reg_base + wq_offset);
|
||||
dev_dbg(dev, "WQ[%d][%d][%#x]: %#x\n",
|
||||
wq->id, i, wq_offset,
|
||||
ioread32(idxd->reg_base + wq_offset));
|
||||
|
|
|
|||
|
|
@ -103,7 +103,7 @@ struct idxd_wq {
|
|||
u32 priority;
|
||||
enum idxd_wq_state state;
|
||||
unsigned long flags;
|
||||
union wqcfg wqcfg;
|
||||
union wqcfg *wqcfg;
|
||||
u32 vec_ptr; /* interrupt steering */
|
||||
struct dsa_hw_desc **hw_descs;
|
||||
int num_descs;
|
||||
|
|
@ -183,6 +183,7 @@ struct idxd_device {
|
|||
int max_wq_size;
|
||||
int token_limit;
|
||||
int nr_tokens; /* non-reserved tokens */
|
||||
unsigned int wqcfg_size;
|
||||
|
||||
union sw_err_reg sw_err;
|
||||
wait_queue_head_t cmd_waitq;
|
||||
|
|
|
|||
|
|
@ -178,6 +178,9 @@ static int idxd_setup_internals(struct idxd_device *idxd)
|
|||
wq->idxd_cdev.minor = -1;
|
||||
wq->max_xfer_bytes = idxd->max_xfer_bytes;
|
||||
wq->max_batch_size = idxd->max_batch_size;
|
||||
wq->wqcfg = devm_kzalloc(dev, idxd->wqcfg_size, GFP_KERNEL);
|
||||
if (!wq->wqcfg)
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
for (i = 0; i < idxd->max_engines; i++) {
|
||||
|
|
@ -251,6 +254,8 @@ static void idxd_read_caps(struct idxd_device *idxd)
|
|||
dev_dbg(dev, "total workqueue size: %u\n", idxd->max_wq_size);
|
||||
idxd->max_wqs = idxd->hw.wq_cap.num_wqs;
|
||||
dev_dbg(dev, "max workqueues: %u\n", idxd->max_wqs);
|
||||
idxd->wqcfg_size = 1 << (idxd->hw.wq_cap.wqcfg_size + IDXD_WQCFG_MIN);
|
||||
dev_dbg(dev, "wqcfg size: %u\n", idxd->wqcfg_size);
|
||||
|
||||
/* reading operation capabilities */
|
||||
for (i = 0; i < 4; i++) {
|
||||
|
|
|
|||
|
|
@ -8,7 +8,7 @@
|
|||
|
||||
#define IDXD_MMIO_BAR 0
|
||||
#define IDXD_WQ_BAR 2
|
||||
#define IDXD_PORTAL_SIZE 0x4000
|
||||
#define IDXD_PORTAL_SIZE PAGE_SIZE
|
||||
|
||||
/* MMIO Device BAR0 Registers */
|
||||
#define IDXD_VER_OFFSET 0x00
|
||||
|
|
@ -43,7 +43,8 @@ union wq_cap_reg {
|
|||
struct {
|
||||
u64 total_wq_size:16;
|
||||
u64 num_wqs:8;
|
||||
u64 rsvd:24;
|
||||
u64 wqcfg_size:4;
|
||||
u64 rsvd:20;
|
||||
u64 shared_mode:1;
|
||||
u64 dedicated_mode:1;
|
||||
u64 rsvd2:1;
|
||||
|
|
@ -55,6 +56,7 @@ union wq_cap_reg {
|
|||
u64 bits;
|
||||
} __packed;
|
||||
#define IDXD_WQCAP_OFFSET 0x20
|
||||
#define IDXD_WQCFG_MIN 5
|
||||
|
||||
union group_cap_reg {
|
||||
struct {
|
||||
|
|
@ -333,4 +335,23 @@ union wqcfg {
|
|||
};
|
||||
u32 bits[8];
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
* This macro calculates the offset into the WQCFG register
|
||||
* idxd - struct idxd *
|
||||
* n - wq id
|
||||
* ofs - the index of the 32b dword for the config register
|
||||
*
|
||||
* The WQCFG register block is divided into groups per each wq. The n index
|
||||
* allows us to move to the register group that's for that particular wq.
|
||||
* Each register is 32bits. The ofs gives us the number of register to access.
|
||||
*/
|
||||
#define WQCFG_OFFSET(_idxd_dev, n, ofs) \
|
||||
({\
|
||||
typeof(_idxd_dev) __idxd_dev = (_idxd_dev); \
|
||||
(__idxd_dev)->wqcfg_offset + (n) * (__idxd_dev)->wqcfg_size + sizeof(u32) * (ofs); \
|
||||
})
|
||||
|
||||
#define WQCFG_STRIDES(_idxd_dev) ((_idxd_dev)->wqcfg_size / sizeof(u32))
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -74,7 +74,7 @@ int idxd_submit_desc(struct idxd_wq *wq, struct idxd_desc *desc)
|
|||
if (idxd->state != IDXD_DEV_ENABLED)
|
||||
return -EIO;
|
||||
|
||||
portal = wq->dportal + idxd_get_wq_portal_offset(IDXD_PORTAL_UNLIMITED);
|
||||
portal = wq->dportal;
|
||||
/*
|
||||
* The wmb() flushes writes to coherent DMA data before possibly
|
||||
* triggering a DMA read. The wmb() is necessary even on UP because
|
||||
|
|
|
|||
|
|
@ -40,16 +40,6 @@
|
|||
#define DCA2_TAG_MAP_BYTE3 0x82
|
||||
#define DCA2_TAG_MAP_BYTE4 0x82
|
||||
|
||||
/* verify if tag map matches expected values */
|
||||
static inline int dca2_tag_map_valid(u8 *tag_map)
|
||||
{
|
||||
return ((tag_map[0] == DCA2_TAG_MAP_BYTE0) &&
|
||||
(tag_map[1] == DCA2_TAG_MAP_BYTE1) &&
|
||||
(tag_map[2] == DCA2_TAG_MAP_BYTE2) &&
|
||||
(tag_map[3] == DCA2_TAG_MAP_BYTE3) &&
|
||||
(tag_map[4] == DCA2_TAG_MAP_BYTE4));
|
||||
}
|
||||
|
||||
/*
|
||||
* "Legacy" DCA systems do not implement the DCA register set in the
|
||||
* I/OAT device. Software needs direct support for their tag mappings.
|
||||
|
|
|
|||
|
|
@ -2799,7 +2799,7 @@ pl330_prep_dma_memcpy(struct dma_chan *chan, dma_addr_t dst,
|
|||
* If burst size is smaller than bus width then make sure we only
|
||||
* transfer one at a time to avoid a burst stradling an MFIFO entry.
|
||||
*/
|
||||
if (desc->rqcfg.brst_size * 8 < pl330->pcfg.data_bus_width)
|
||||
if (burst * 8 < pl330->pcfg.data_bus_width)
|
||||
desc->rqcfg.brst_len = 1;
|
||||
|
||||
desc->bytes_requested = len;
|
||||
|
|
|
|||
|
|
@ -83,7 +83,7 @@ EXPORT_SYMBOL(xudma_rflow_is_gp);
|
|||
#define XUDMA_GET_PUT_RESOURCE(res) \
|
||||
struct udma_##res *xudma_##res##_get(struct udma_dev *ud, int id) \
|
||||
{ \
|
||||
return __udma_reserve_##res(ud, false, id); \
|
||||
return __udma_reserve_##res(ud, UDMA_TP_NORMAL, id); \
|
||||
} \
|
||||
EXPORT_SYMBOL(xudma_##res##_get); \
|
||||
\
|
||||
|
|
|
|||
|
|
@ -1522,29 +1522,38 @@ static void omap_dma_free(struct omap_dmadev *od)
|
|||
}
|
||||
}
|
||||
|
||||
/* Currently used by omap2 & 3 to block deeper SoC idle states */
|
||||
static bool omap_dma_busy(struct omap_dmadev *od)
|
||||
{
|
||||
struct omap_chan *c;
|
||||
int lch = -1;
|
||||
|
||||
while (1) {
|
||||
lch = find_next_bit(od->lch_bitmap, od->lch_count, lch + 1);
|
||||
if (lch >= od->lch_count)
|
||||
break;
|
||||
c = od->lch_map[lch];
|
||||
if (!c)
|
||||
continue;
|
||||
if (omap_dma_chan_read(c, CCR) & CCR_ENABLE)
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Currently only used for omap2. For omap1, also a check for lcd_dma is needed */
|
||||
static int omap_dma_busy_notifier(struct notifier_block *nb,
|
||||
unsigned long cmd, void *v)
|
||||
{
|
||||
struct omap_dmadev *od;
|
||||
struct omap_chan *c;
|
||||
int lch = -1;
|
||||
|
||||
od = container_of(nb, struct omap_dmadev, nb);
|
||||
|
||||
switch (cmd) {
|
||||
case CPU_CLUSTER_PM_ENTER:
|
||||
while (1) {
|
||||
lch = find_next_bit(od->lch_bitmap, od->lch_count,
|
||||
lch + 1);
|
||||
if (lch >= od->lch_count)
|
||||
break;
|
||||
c = od->lch_map[lch];
|
||||
if (!c)
|
||||
continue;
|
||||
if (omap_dma_chan_read(c, CCR) & CCR_ENABLE)
|
||||
return NOTIFY_BAD;
|
||||
}
|
||||
if (omap_dma_busy(od))
|
||||
return NOTIFY_BAD;
|
||||
break;
|
||||
case CPU_CLUSTER_PM_ENTER_FAILED:
|
||||
case CPU_CLUSTER_PM_EXIT:
|
||||
|
|
@ -1595,6 +1604,8 @@ static int omap_dma_context_notifier(struct notifier_block *nb,
|
|||
|
||||
switch (cmd) {
|
||||
case CPU_CLUSTER_PM_ENTER:
|
||||
if (omap_dma_busy(od))
|
||||
return NOTIFY_BAD;
|
||||
omap_dma_context_save(od);
|
||||
break;
|
||||
case CPU_CLUSTER_PM_ENTER_FAILED:
|
||||
|
|
|
|||
|
|
@ -517,8 +517,8 @@ struct xilinx_dma_device {
|
|||
#define to_dma_tx_descriptor(tx) \
|
||||
container_of(tx, struct xilinx_dma_tx_descriptor, async_tx)
|
||||
#define xilinx_dma_poll_timeout(chan, reg, val, cond, delay_us, timeout_us) \
|
||||
readl_poll_timeout(chan->xdev->regs + chan->ctrl_offset + reg, val, \
|
||||
cond, delay_us, timeout_us)
|
||||
readl_poll_timeout_atomic(chan->xdev->regs + chan->ctrl_offset + reg, \
|
||||
val, cond, delay_us, timeout_us)
|
||||
|
||||
/* IO accessors */
|
||||
static inline u32 dma_read(struct xilinx_dma_chan *chan, u32 reg)
|
||||
|
|
@ -948,8 +948,10 @@ static u32 xilinx_dma_get_residue(struct xilinx_dma_chan *chan,
|
|||
{
|
||||
struct xilinx_cdma_tx_segment *cdma_seg;
|
||||
struct xilinx_axidma_tx_segment *axidma_seg;
|
||||
struct xilinx_aximcdma_tx_segment *aximcdma_seg;
|
||||
struct xilinx_cdma_desc_hw *cdma_hw;
|
||||
struct xilinx_axidma_desc_hw *axidma_hw;
|
||||
struct xilinx_aximcdma_desc_hw *aximcdma_hw;
|
||||
struct list_head *entry;
|
||||
u32 residue = 0;
|
||||
|
||||
|
|
@ -961,13 +963,23 @@ static u32 xilinx_dma_get_residue(struct xilinx_dma_chan *chan,
|
|||
cdma_hw = &cdma_seg->hw;
|
||||
residue += (cdma_hw->control - cdma_hw->status) &
|
||||
chan->xdev->max_buffer_len;
|
||||
} else {
|
||||
} else if (chan->xdev->dma_config->dmatype ==
|
||||
XDMA_TYPE_AXIDMA) {
|
||||
axidma_seg = list_entry(entry,
|
||||
struct xilinx_axidma_tx_segment,
|
||||
node);
|
||||
axidma_hw = &axidma_seg->hw;
|
||||
residue += (axidma_hw->control - axidma_hw->status) &
|
||||
chan->xdev->max_buffer_len;
|
||||
} else {
|
||||
aximcdma_seg =
|
||||
list_entry(entry,
|
||||
struct xilinx_aximcdma_tx_segment,
|
||||
node);
|
||||
aximcdma_hw = &aximcdma_seg->hw;
|
||||
residue +=
|
||||
(aximcdma_hw->control - aximcdma_hw->status) &
|
||||
chan->xdev->max_buffer_len;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1135,7 +1147,7 @@ static int xilinx_dma_alloc_chan_resources(struct dma_chan *dchan)
|
|||
upper_32_bits(chan->seg_p + sizeof(*chan->seg_mv) *
|
||||
((i + 1) % XILINX_DMA_NUM_DESCS));
|
||||
chan->seg_mv[i].phys = chan->seg_p +
|
||||
sizeof(*chan->seg_v) * i;
|
||||
sizeof(*chan->seg_mv) * i;
|
||||
list_add_tail(&chan->seg_mv[i].node,
|
||||
&chan->free_seg_list);
|
||||
}
|
||||
|
|
@ -1560,7 +1572,7 @@ static void xilinx_dma_start_transfer(struct xilinx_dma_chan *chan)
|
|||
static void xilinx_mcdma_start_transfer(struct xilinx_dma_chan *chan)
|
||||
{
|
||||
struct xilinx_dma_tx_descriptor *head_desc, *tail_desc;
|
||||
struct xilinx_axidma_tx_segment *tail_segment;
|
||||
struct xilinx_aximcdma_tx_segment *tail_segment;
|
||||
u32 reg;
|
||||
|
||||
/*
|
||||
|
|
@ -1582,7 +1594,7 @@ static void xilinx_mcdma_start_transfer(struct xilinx_dma_chan *chan)
|
|||
tail_desc = list_last_entry(&chan->pending_list,
|
||||
struct xilinx_dma_tx_descriptor, node);
|
||||
tail_segment = list_last_entry(&tail_desc->segments,
|
||||
struct xilinx_axidma_tx_segment, node);
|
||||
struct xilinx_aximcdma_tx_segment, node);
|
||||
|
||||
reg = dma_ctrl_read(chan, XILINX_MCDMA_CHAN_CR_OFFSET(chan->tdest));
|
||||
|
||||
|
|
@ -1864,6 +1876,7 @@ static void append_desc_queue(struct xilinx_dma_chan *chan,
|
|||
struct xilinx_vdma_tx_segment *tail_segment;
|
||||
struct xilinx_dma_tx_descriptor *tail_desc;
|
||||
struct xilinx_axidma_tx_segment *axidma_tail_segment;
|
||||
struct xilinx_aximcdma_tx_segment *aximcdma_tail_segment;
|
||||
struct xilinx_cdma_tx_segment *cdma_tail_segment;
|
||||
|
||||
if (list_empty(&chan->pending_list))
|
||||
|
|
@ -1885,11 +1898,17 @@ static void append_desc_queue(struct xilinx_dma_chan *chan,
|
|||
struct xilinx_cdma_tx_segment,
|
||||
node);
|
||||
cdma_tail_segment->hw.next_desc = (u32)desc->async_tx.phys;
|
||||
} else {
|
||||
} else if (chan->xdev->dma_config->dmatype == XDMA_TYPE_AXIDMA) {
|
||||
axidma_tail_segment = list_last_entry(&tail_desc->segments,
|
||||
struct xilinx_axidma_tx_segment,
|
||||
node);
|
||||
axidma_tail_segment->hw.next_desc = (u32)desc->async_tx.phys;
|
||||
} else {
|
||||
aximcdma_tail_segment =
|
||||
list_last_entry(&tail_desc->segments,
|
||||
struct xilinx_aximcdma_tx_segment,
|
||||
node);
|
||||
aximcdma_tail_segment->hw.next_desc = (u32)desc->async_tx.phys;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -2836,10 +2855,11 @@ static int xilinx_dma_chan_probe(struct xilinx_dma_device *xdev,
|
|||
chan->stop_transfer = xilinx_dma_stop_transfer;
|
||||
}
|
||||
|
||||
/* check if SG is enabled (only for AXIDMA and CDMA) */
|
||||
/* check if SG is enabled (only for AXIDMA, AXIMCDMA, and CDMA) */
|
||||
if (xdev->dma_config->dmatype != XDMA_TYPE_VDMA) {
|
||||
if (dma_ctrl_read(chan, XILINX_DMA_REG_DMASR) &
|
||||
XILINX_DMA_DMASR_SG_MASK)
|
||||
if (xdev->dma_config->dmatype == XDMA_TYPE_AXIMCDMA ||
|
||||
dma_ctrl_read(chan, XILINX_DMA_REG_DMASR) &
|
||||
XILINX_DMA_DMASR_SG_MASK)
|
||||
chan->has_sg = true;
|
||||
dev_dbg(chan->dev, "ch %d: SG %s\n", chan->id,
|
||||
chan->has_sg ? "enabled" : "disabled");
|
||||
|
|
|
|||
|
|
@ -1055,10 +1055,10 @@ static const struct pci_device_id pciidlist[] = {
|
|||
{0x1002, 0x15dd, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RAVEN|AMD_IS_APU},
|
||||
{0x1002, 0x15d8, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_RAVEN|AMD_IS_APU},
|
||||
/* Arcturus */
|
||||
{0x1002, 0x738C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARCTURUS|AMD_EXP_HW_SUPPORT},
|
||||
{0x1002, 0x7388, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARCTURUS|AMD_EXP_HW_SUPPORT},
|
||||
{0x1002, 0x738E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARCTURUS|AMD_EXP_HW_SUPPORT},
|
||||
{0x1002, 0x7390, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARCTURUS|AMD_EXP_HW_SUPPORT},
|
||||
{0x1002, 0x738C, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARCTURUS},
|
||||
{0x1002, 0x7388, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARCTURUS},
|
||||
{0x1002, 0x738E, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARCTURUS},
|
||||
{0x1002, 0x7390, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_ARCTURUS},
|
||||
/* Navi10 */
|
||||
{0x1002, 0x7310, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI10},
|
||||
{0x1002, 0x7312, PCI_ANY_ID, PCI_ANY_ID, 0, 0, CHIP_NAVI10},
|
||||
|
|
|
|||
|
|
@ -7506,7 +7506,6 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
|
|||
bool mode_set_reset_required = false;
|
||||
|
||||
drm_atomic_helper_update_legacy_modeset_state(dev, state);
|
||||
drm_atomic_helper_calc_timestamping_constants(state);
|
||||
|
||||
dm_state = dm_atomic_get_new_state(state);
|
||||
if (dm_state && dm_state->context) {
|
||||
|
|
@ -7533,6 +7532,8 @@ static void amdgpu_dm_atomic_commit_tail(struct drm_atomic_state *state)
|
|||
}
|
||||
}
|
||||
|
||||
drm_atomic_helper_calc_timestamping_constants(state);
|
||||
|
||||
/* update changed items */
|
||||
for_each_oldnew_crtc_in_state(state, crtc, old_crtc_state, new_crtc_state, i) {
|
||||
struct amdgpu_crtc *acrtc = to_amdgpu_crtc(crtc);
|
||||
|
|
|
|||
|
|
@ -299,8 +299,8 @@ irq_source_info_dcn20[DAL_IRQ_SOURCES_NUMBER] = {
|
|||
pflip_int_entry(1),
|
||||
pflip_int_entry(2),
|
||||
pflip_int_entry(3),
|
||||
[DC_IRQ_SOURCE_PFLIP5] = dummy_irq_entry(),
|
||||
[DC_IRQ_SOURCE_PFLIP6] = dummy_irq_entry(),
|
||||
pflip_int_entry(4),
|
||||
pflip_int_entry(5),
|
||||
[DC_IRQ_SOURCE_PFLIP_UNDERLAY0] = dummy_irq_entry(),
|
||||
gpio_pad_int_entry(0),
|
||||
gpio_pad_int_entry(1),
|
||||
|
|
|
|||
|
|
@ -2327,12 +2327,6 @@ static enum drm_connector_status dw_hdmi_detect(struct dw_hdmi *hdmi)
|
|||
{
|
||||
enum drm_connector_status result;
|
||||
|
||||
mutex_lock(&hdmi->mutex);
|
||||
hdmi->force = DRM_FORCE_UNSPECIFIED;
|
||||
dw_hdmi_update_power(hdmi);
|
||||
dw_hdmi_update_phy_mask(hdmi);
|
||||
mutex_unlock(&hdmi->mutex);
|
||||
|
||||
result = hdmi->phy.ops->read_hpd(hdmi, hdmi->phy.data);
|
||||
|
||||
mutex_lock(&hdmi->mutex);
|
||||
|
|
|
|||
|
|
@ -140,7 +140,7 @@ static void drm_gem_vram_placement(struct drm_gem_vram_object *gbo,
|
|||
unsigned int c = 0;
|
||||
|
||||
if (pl_flag & DRM_GEM_VRAM_PL_FLAG_TOPDOWN)
|
||||
pl_flag = TTM_PL_FLAG_TOPDOWN;
|
||||
invariant_flags = TTM_PL_FLAG_TOPDOWN;
|
||||
|
||||
gbo->placement.placement = gbo->placements;
|
||||
gbo->placement.busy_placement = gbo->placements;
|
||||
|
|
|
|||
|
|
@ -12878,10 +12878,11 @@ compute_sink_pipe_bpp(const struct drm_connector_state *conn_state,
|
|||
case 10 ... 11:
|
||||
bpp = 10 * 3;
|
||||
break;
|
||||
case 12:
|
||||
case 12 ... 16:
|
||||
bpp = 12 * 3;
|
||||
break;
|
||||
default:
|
||||
MISSING_CASE(conn_state->max_bpc);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5457,6 +5457,7 @@ static void virtual_context_destroy(struct kref *kref)
|
|||
__execlists_context_fini(&ve->context);
|
||||
intel_context_fini(&ve->context);
|
||||
|
||||
intel_breadcrumbs_free(ve->base.breadcrumbs);
|
||||
intel_engine_free_request_pool(&ve->base);
|
||||
|
||||
kfree(ve->bonds);
|
||||
|
|
|
|||
|
|
@ -243,8 +243,9 @@ static const struct drm_i915_mocs_entry tgl_mocs_table[] = {
|
|||
* only, __init_mocs_table() take care to program unused index with
|
||||
* this entry.
|
||||
*/
|
||||
MOCS_ENTRY(1, LE_3_WB | LE_TC_1_LLC | LE_LRUM(3),
|
||||
L3_3_WB),
|
||||
MOCS_ENTRY(I915_MOCS_PTE,
|
||||
LE_0_PAGETABLE | LE_TC_0_PAGETABLE,
|
||||
L3_1_UC),
|
||||
GEN11_MOCS_ENTRIES,
|
||||
|
||||
/* Implicitly enable L1 - HDC:L1 + L3 + LLC */
|
||||
|
|
|
|||
|
|
@ -56,9 +56,12 @@ static inline void set(struct intel_uncore *uncore, i915_reg_t reg, u32 val)
|
|||
|
||||
static void gen11_rc6_enable(struct intel_rc6 *rc6)
|
||||
{
|
||||
struct intel_uncore *uncore = rc6_to_uncore(rc6);
|
||||
struct intel_gt *gt = rc6_to_gt(rc6);
|
||||
struct intel_uncore *uncore = gt->uncore;
|
||||
struct intel_engine_cs *engine;
|
||||
enum intel_engine_id id;
|
||||
u32 pg_enable;
|
||||
int i;
|
||||
|
||||
/* 2b: Program RC6 thresholds.*/
|
||||
set(uncore, GEN6_RC6_WAKE_RATE_LIMIT, 54 << 16 | 85);
|
||||
|
|
@ -102,10 +105,19 @@ static void gen11_rc6_enable(struct intel_rc6 *rc6)
|
|||
GEN6_RC_CTL_RC6_ENABLE |
|
||||
GEN6_RC_CTL_EI_MODE(1);
|
||||
|
||||
set(uncore, GEN9_PG_ENABLE,
|
||||
GEN9_RENDER_PG_ENABLE |
|
||||
GEN9_MEDIA_PG_ENABLE |
|
||||
GEN11_MEDIA_SAMPLER_PG_ENABLE);
|
||||
pg_enable =
|
||||
GEN9_RENDER_PG_ENABLE |
|
||||
GEN9_MEDIA_PG_ENABLE |
|
||||
GEN11_MEDIA_SAMPLER_PG_ENABLE;
|
||||
|
||||
if (INTEL_GEN(gt->i915) >= 12) {
|
||||
for (i = 0; i < I915_MAX_VCS; i++)
|
||||
if (HAS_ENGINE(gt, _VCS(i)))
|
||||
pg_enable |= (VDN_HCP_POWERGATE_ENABLE(i) |
|
||||
VDN_MFX_POWERGATE_ENABLE(i));
|
||||
}
|
||||
|
||||
set(uncore, GEN9_PG_ENABLE, pg_enable);
|
||||
}
|
||||
|
||||
static void gen9_rc6_enable(struct intel_rc6 *rc6)
|
||||
|
|
|
|||
|
|
@ -131,8 +131,10 @@ static void _wa_add(struct i915_wa_list *wal, const struct i915_wa *wa)
|
|||
return;
|
||||
}
|
||||
|
||||
if (wal->list)
|
||||
if (wal->list) {
|
||||
memcpy(list, wal->list, sizeof(*wa) * wal->count);
|
||||
kfree(wal->list);
|
||||
}
|
||||
|
||||
wal->list = list;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -164,7 +164,7 @@ static unsigned char virtual_dp_monitor_edid[GVT_EDID_NUM][EDID_SIZE] = {
|
|||
|
||||
/* let the virtual display supports DP1.2 */
|
||||
static u8 dpcd_fix_data[DPCD_HEADER_SIZE] = {
|
||||
0x12, 0x014, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
0x12, 0x014, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
|
||||
};
|
||||
|
||||
static void emulate_monitor_status_change(struct intel_vgpu *vgpu)
|
||||
|
|
|
|||
|
|
@ -829,8 +829,10 @@ static int intel_vgpu_open(struct mdev_device *mdev)
|
|||
/* Take a module reference as mdev core doesn't take
|
||||
* a reference for vendor driver.
|
||||
*/
|
||||
if (!try_module_get(THIS_MODULE))
|
||||
if (!try_module_get(THIS_MODULE)) {
|
||||
ret = -ENODEV;
|
||||
goto undo_group;
|
||||
}
|
||||
|
||||
ret = kvmgt_guest_init(mdev);
|
||||
if (ret)
|
||||
|
|
|
|||
|
|
@ -439,7 +439,8 @@ static struct intel_vgpu *__intel_gvt_create_vgpu(struct intel_gvt *gvt,
|
|||
|
||||
if (IS_BROADWELL(dev_priv))
|
||||
ret = intel_gvt_hypervisor_set_edid(vgpu, PORT_B);
|
||||
else
|
||||
/* FixMe: Re-enable APL/BXT once vfio_edid enabled */
|
||||
else if (!IS_BROXTON(dev_priv))
|
||||
ret = intel_gvt_hypervisor_set_edid(vgpu, PORT_D);
|
||||
if (ret)
|
||||
goto out_clean_sched_policy;
|
||||
|
|
|
|||
|
|
@ -8971,10 +8971,6 @@ enum {
|
|||
#define GEN9_PWRGT_MEDIA_STATUS_MASK (1 << 0)
|
||||
#define GEN9_PWRGT_RENDER_STATUS_MASK (1 << 1)
|
||||
|
||||
#define POWERGATE_ENABLE _MMIO(0xa210)
|
||||
#define VDN_HCP_POWERGATE_ENABLE(n) BIT(((n) * 2) + 3)
|
||||
#define VDN_MFX_POWERGATE_ENABLE(n) BIT(((n) * 2) + 4)
|
||||
|
||||
#define GTFIFODBG _MMIO(0x120000)
|
||||
#define GT_FIFO_SBDEDICATE_FREE_ENTRY_CHV (0x1f << 20)
|
||||
#define GT_FIFO_FREE_ENTRIES_CHV (0x7f << 13)
|
||||
|
|
@ -9114,9 +9110,11 @@ enum {
|
|||
#define GEN9_MEDIA_PG_IDLE_HYSTERESIS _MMIO(0xA0C4)
|
||||
#define GEN9_RENDER_PG_IDLE_HYSTERESIS _MMIO(0xA0C8)
|
||||
#define GEN9_PG_ENABLE _MMIO(0xA210)
|
||||
#define GEN9_RENDER_PG_ENABLE REG_BIT(0)
|
||||
#define GEN9_MEDIA_PG_ENABLE REG_BIT(1)
|
||||
#define GEN11_MEDIA_SAMPLER_PG_ENABLE REG_BIT(2)
|
||||
#define GEN9_RENDER_PG_ENABLE REG_BIT(0)
|
||||
#define GEN9_MEDIA_PG_ENABLE REG_BIT(1)
|
||||
#define GEN11_MEDIA_SAMPLER_PG_ENABLE REG_BIT(2)
|
||||
#define VDN_HCP_POWERGATE_ENABLE(n) REG_BIT(3 + 2 * (n))
|
||||
#define VDN_MFX_POWERGATE_ENABLE(n) REG_BIT(4 + 2 * (n))
|
||||
#define GEN8_PUSHBUS_CONTROL _MMIO(0xA248)
|
||||
#define GEN8_PUSHBUS_ENABLE _MMIO(0xA250)
|
||||
#define GEN8_PUSHBUS_SHIFT _MMIO(0xA25C)
|
||||
|
|
|
|||
|
|
@ -7118,23 +7118,10 @@ static void icl_init_clock_gating(struct drm_i915_private *dev_priv)
|
|||
|
||||
static void tgl_init_clock_gating(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
u32 vd_pg_enable = 0;
|
||||
unsigned int i;
|
||||
|
||||
/* Wa_1409120013:tgl */
|
||||
I915_WRITE(ILK_DPFC_CHICKEN,
|
||||
ILK_DPFC_CHICKEN_COMP_DUMMY_PIXEL);
|
||||
|
||||
/* This is not a WA. Enable VD HCP & MFX_ENC powergate */
|
||||
for (i = 0; i < I915_MAX_VCS; i++) {
|
||||
if (HAS_ENGINE(&dev_priv->gt, _VCS(i)))
|
||||
vd_pg_enable |= VDN_HCP_POWERGATE_ENABLE(i) |
|
||||
VDN_MFX_POWERGATE_ENABLE(i);
|
||||
}
|
||||
|
||||
I915_WRITE(POWERGATE_ENABLE,
|
||||
I915_READ(POWERGATE_ENABLE) | vd_pg_enable);
|
||||
|
||||
/* Wa_1409825376:tgl (pre-prod)*/
|
||||
if (IS_TGL_DISP_REVID(dev_priv, TGL_REVID_A0, TGL_REVID_B1))
|
||||
I915_WRITE(GEN9_CLKGATE_DIS_3, I915_READ(GEN9_CLKGATE_DIS_3) |
|
||||
|
|
|
|||
|
|
@ -2293,8 +2293,10 @@ static int perf_request_latency(void *arg)
|
|||
struct intel_context *ce;
|
||||
|
||||
ce = intel_context_create(engine);
|
||||
if (IS_ERR(ce))
|
||||
if (IS_ERR(ce)) {
|
||||
err = PTR_ERR(ce);
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = intel_context_pin(ce);
|
||||
if (err) {
|
||||
|
|
@ -2467,8 +2469,10 @@ static int perf_series_engines(void *arg)
|
|||
struct intel_context *ce;
|
||||
|
||||
ce = intel_context_create(engine);
|
||||
if (IS_ERR(ce))
|
||||
if (IS_ERR(ce)) {
|
||||
err = PTR_ERR(ce);
|
||||
goto out;
|
||||
}
|
||||
|
||||
err = intel_context_pin(ce);
|
||||
if (err) {
|
||||
|
|
|
|||
|
|
@ -814,9 +814,15 @@ static int sun4i_backend_bind(struct device *dev, struct device *master,
|
|||
*
|
||||
* XXX(hch): this has no business in a driver and needs to move
|
||||
* to the device tree.
|
||||
*
|
||||
* If we have two subsequent calls to dma_direct_set_offset
|
||||
* returns -EINVAL. Unfortunately, this happens when we have two
|
||||
* backends in the system, and will result in the driver
|
||||
* reporting an error while it has been setup properly before.
|
||||
* Ignore EINVAL, but it should really be removed eventually.
|
||||
*/
|
||||
ret = dma_direct_set_offset(drm->dev, PHYS_OFFSET, 0, SZ_4G);
|
||||
if (ret)
|
||||
if (ret && ret != -EINVAL)
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -208,6 +208,7 @@ static int sun8i_dw_hdmi_bind(struct device *dev, struct device *master,
|
|||
phy_node = of_parse_phandle(dev->of_node, "phys", 0);
|
||||
if (!phy_node) {
|
||||
dev_err(dev, "Can't found PHY phandle\n");
|
||||
ret = -EINVAL;
|
||||
goto err_disable_clk_tmds;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -335,7 +335,9 @@ static void dmar_pci_bus_del_dev(struct dmar_pci_notify_info *info)
|
|||
|
||||
static inline void vf_inherit_msi_domain(struct pci_dev *pdev)
|
||||
{
|
||||
dev_set_msi_domain(&pdev->dev, dev_get_msi_domain(&pdev->physfn->dev));
|
||||
struct pci_dev *physfn = pci_physfn(pdev);
|
||||
|
||||
dev_set_msi_domain(&pdev->dev, dev_get_msi_domain(&physfn->dev));
|
||||
}
|
||||
|
||||
static int dmar_pci_bus_notifier(struct notifier_block *nb,
|
||||
|
|
|
|||
|
|
@ -179,7 +179,7 @@ static int rwbf_quirk;
|
|||
* (used when kernel is launched w/ TXT)
|
||||
*/
|
||||
static int force_on = 0;
|
||||
int intel_iommu_tboot_noforce;
|
||||
static int intel_iommu_tboot_noforce;
|
||||
static int no_platform_optin;
|
||||
|
||||
#define ROOT_ENTRY_NR (VTD_PAGE_SIZE/sizeof(struct root_entry))
|
||||
|
|
@ -4884,7 +4884,8 @@ int __init intel_iommu_init(void)
|
|||
* Intel IOMMU is required for a TXT/tboot launch or platform
|
||||
* opt in, so enforce that.
|
||||
*/
|
||||
force_on = tboot_force_iommu() || platform_optin_force_iommu();
|
||||
force_on = (!intel_iommu_tboot_noforce && tboot_force_iommu()) ||
|
||||
platform_optin_force_iommu();
|
||||
|
||||
if (iommu_init_mempool()) {
|
||||
if (force_on)
|
||||
|
|
|
|||
|
|
@ -30,7 +30,10 @@
|
|||
#define SDHCI_ARASAN_VENDOR_REGISTER 0x78
|
||||
|
||||
#define SDHCI_ARASAN_ITAPDLY_REGISTER 0xF0F8
|
||||
#define SDHCI_ARASAN_ITAPDLY_SEL_MASK 0xFF
|
||||
|
||||
#define SDHCI_ARASAN_OTAPDLY_REGISTER 0xF0FC
|
||||
#define SDHCI_ARASAN_OTAPDLY_SEL_MASK 0x3F
|
||||
|
||||
#define SDHCI_ARASAN_CQE_BASE_ADDR 0x200
|
||||
#define VENDOR_ENHANCED_STROBE BIT(0)
|
||||
|
|
@ -600,14 +603,8 @@ static int sdhci_zynqmp_sdcardclk_set_phase(struct clk_hw *hw, int degrees)
|
|||
u8 tap_delay, tap_max = 0;
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* This is applicable for SDHCI_SPEC_300 and above
|
||||
* ZynqMP does not set phase for <=25MHz clock.
|
||||
* If degrees is zero, no need to do anything.
|
||||
*/
|
||||
if (host->version < SDHCI_SPEC_300 ||
|
||||
host->timing == MMC_TIMING_LEGACY ||
|
||||
host->timing == MMC_TIMING_UHS_SDR12 || !degrees)
|
||||
/* This is applicable for SDHCI_SPEC_300 and above */
|
||||
if (host->version < SDHCI_SPEC_300)
|
||||
return 0;
|
||||
|
||||
switch (host->timing) {
|
||||
|
|
@ -638,6 +635,9 @@ static int sdhci_zynqmp_sdcardclk_set_phase(struct clk_hw *hw, int degrees)
|
|||
if (ret)
|
||||
pr_err("Error setting Output Tap Delay\n");
|
||||
|
||||
/* Release DLL Reset */
|
||||
zynqmp_pm_sd_dll_reset(node_id, PM_DLL_RESET_RELEASE);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -668,16 +668,13 @@ static int sdhci_zynqmp_sampleclk_set_phase(struct clk_hw *hw, int degrees)
|
|||
u8 tap_delay, tap_max = 0;
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* This is applicable for SDHCI_SPEC_300 and above
|
||||
* ZynqMP does not set phase for <=25MHz clock.
|
||||
* If degrees is zero, no need to do anything.
|
||||
*/
|
||||
if (host->version < SDHCI_SPEC_300 ||
|
||||
host->timing == MMC_TIMING_LEGACY ||
|
||||
host->timing == MMC_TIMING_UHS_SDR12 || !degrees)
|
||||
/* This is applicable for SDHCI_SPEC_300 and above */
|
||||
if (host->version < SDHCI_SPEC_300)
|
||||
return 0;
|
||||
|
||||
/* Assert DLL Reset */
|
||||
zynqmp_pm_sd_dll_reset(node_id, PM_DLL_RESET_ASSERT);
|
||||
|
||||
switch (host->timing) {
|
||||
case MMC_TIMING_MMC_HS:
|
||||
case MMC_TIMING_SD_HS:
|
||||
|
|
@ -733,14 +730,8 @@ static int sdhci_versal_sdcardclk_set_phase(struct clk_hw *hw, int degrees)
|
|||
struct sdhci_host *host = sdhci_arasan->host;
|
||||
u8 tap_delay, tap_max = 0;
|
||||
|
||||
/*
|
||||
* This is applicable for SDHCI_SPEC_300 and above
|
||||
* Versal does not set phase for <=25MHz clock.
|
||||
* If degrees is zero, no need to do anything.
|
||||
*/
|
||||
if (host->version < SDHCI_SPEC_300 ||
|
||||
host->timing == MMC_TIMING_LEGACY ||
|
||||
host->timing == MMC_TIMING_UHS_SDR12 || !degrees)
|
||||
/* This is applicable for SDHCI_SPEC_300 and above */
|
||||
if (host->version < SDHCI_SPEC_300)
|
||||
return 0;
|
||||
|
||||
switch (host->timing) {
|
||||
|
|
@ -773,6 +764,7 @@ static int sdhci_versal_sdcardclk_set_phase(struct clk_hw *hw, int degrees)
|
|||
regval = sdhci_readl(host, SDHCI_ARASAN_OTAPDLY_REGISTER);
|
||||
regval |= SDHCI_OTAPDLY_ENABLE;
|
||||
sdhci_writel(host, regval, SDHCI_ARASAN_OTAPDLY_REGISTER);
|
||||
regval &= ~SDHCI_ARASAN_OTAPDLY_SEL_MASK;
|
||||
regval |= tap_delay;
|
||||
sdhci_writel(host, regval, SDHCI_ARASAN_OTAPDLY_REGISTER);
|
||||
}
|
||||
|
|
@ -804,14 +796,8 @@ static int sdhci_versal_sampleclk_set_phase(struct clk_hw *hw, int degrees)
|
|||
struct sdhci_host *host = sdhci_arasan->host;
|
||||
u8 tap_delay, tap_max = 0;
|
||||
|
||||
/*
|
||||
* This is applicable for SDHCI_SPEC_300 and above
|
||||
* Versal does not set phase for <=25MHz clock.
|
||||
* If degrees is zero, no need to do anything.
|
||||
*/
|
||||
if (host->version < SDHCI_SPEC_300 ||
|
||||
host->timing == MMC_TIMING_LEGACY ||
|
||||
host->timing == MMC_TIMING_UHS_SDR12 || !degrees)
|
||||
/* This is applicable for SDHCI_SPEC_300 and above */
|
||||
if (host->version < SDHCI_SPEC_300)
|
||||
return 0;
|
||||
|
||||
switch (host->timing) {
|
||||
|
|
@ -846,6 +832,7 @@ static int sdhci_versal_sampleclk_set_phase(struct clk_hw *hw, int degrees)
|
|||
sdhci_writel(host, regval, SDHCI_ARASAN_ITAPDLY_REGISTER);
|
||||
regval |= SDHCI_ITAPDLY_ENABLE;
|
||||
sdhci_writel(host, regval, SDHCI_ARASAN_ITAPDLY_REGISTER);
|
||||
regval &= ~SDHCI_ARASAN_ITAPDLY_SEL_MASK;
|
||||
regval |= tap_delay;
|
||||
sdhci_writel(host, regval, SDHCI_ARASAN_ITAPDLY_REGISTER);
|
||||
regval &= ~SDHCI_ITAPDLY_CHGWIN;
|
||||
|
|
|
|||
|
|
@ -665,6 +665,15 @@ static void sdhci_intel_set_power(struct sdhci_host *host, unsigned char mode,
|
|||
}
|
||||
}
|
||||
|
||||
static void sdhci_intel_set_uhs_signaling(struct sdhci_host *host,
|
||||
unsigned int timing)
|
||||
{
|
||||
/* Set UHS timing to SDR25 for High Speed mode */
|
||||
if (timing == MMC_TIMING_MMC_HS || timing == MMC_TIMING_SD_HS)
|
||||
timing = MMC_TIMING_UHS_SDR25;
|
||||
sdhci_set_uhs_signaling(host, timing);
|
||||
}
|
||||
|
||||
#define INTEL_HS400_ES_REG 0x78
|
||||
#define INTEL_HS400_ES_BIT BIT(0)
|
||||
|
||||
|
|
@ -721,7 +730,7 @@ static const struct sdhci_ops sdhci_intel_byt_ops = {
|
|||
.enable_dma = sdhci_pci_enable_dma,
|
||||
.set_bus_width = sdhci_set_bus_width,
|
||||
.reset = sdhci_reset,
|
||||
.set_uhs_signaling = sdhci_set_uhs_signaling,
|
||||
.set_uhs_signaling = sdhci_intel_set_uhs_signaling,
|
||||
.hw_reset = sdhci_pci_hw_reset,
|
||||
};
|
||||
|
||||
|
|
@ -731,7 +740,7 @@ static const struct sdhci_ops sdhci_intel_glk_ops = {
|
|||
.enable_dma = sdhci_pci_enable_dma,
|
||||
.set_bus_width = sdhci_set_bus_width,
|
||||
.reset = sdhci_cqhci_reset,
|
||||
.set_uhs_signaling = sdhci_set_uhs_signaling,
|
||||
.set_uhs_signaling = sdhci_intel_set_uhs_signaling,
|
||||
.hw_reset = sdhci_pci_hw_reset,
|
||||
.irq = sdhci_cqhci_irq,
|
||||
};
|
||||
|
|
|
|||
|
|
@ -2929,7 +2929,7 @@ int nvme_get_log(struct nvme_ctrl *ctrl, u32 nsid, u8 log_page, u8 lsp, u8 csi,
|
|||
static int nvme_get_effects_log(struct nvme_ctrl *ctrl, u8 csi,
|
||||
struct nvme_effects_log **log)
|
||||
{
|
||||
struct nvme_cel *cel = xa_load(&ctrl->cels, csi);
|
||||
struct nvme_effects_log *cel = xa_load(&ctrl->cels, csi);
|
||||
int ret;
|
||||
|
||||
if (cel)
|
||||
|
|
@ -2940,16 +2940,15 @@ static int nvme_get_effects_log(struct nvme_ctrl *ctrl, u8 csi,
|
|||
return -ENOMEM;
|
||||
|
||||
ret = nvme_get_log(ctrl, 0x00, NVME_LOG_CMD_EFFECTS, 0, csi,
|
||||
&cel->log, sizeof(cel->log), 0);
|
||||
cel, sizeof(*cel), 0);
|
||||
if (ret) {
|
||||
kfree(cel);
|
||||
return ret;
|
||||
}
|
||||
|
||||
cel->csi = csi;
|
||||
xa_store(&ctrl->cels, cel->csi, cel, GFP_KERNEL);
|
||||
xa_store(&ctrl->cels, csi, cel, GFP_KERNEL);
|
||||
out:
|
||||
*log = &cel->log;
|
||||
*log = cel;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -4374,6 +4373,19 @@ void nvme_uninit_ctrl(struct nvme_ctrl *ctrl)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(nvme_uninit_ctrl);
|
||||
|
||||
static void nvme_free_cels(struct nvme_ctrl *ctrl)
|
||||
{
|
||||
struct nvme_effects_log *cel;
|
||||
unsigned long i;
|
||||
|
||||
xa_for_each (&ctrl->cels, i, cel) {
|
||||
xa_erase(&ctrl->cels, i);
|
||||
kfree(cel);
|
||||
}
|
||||
|
||||
xa_destroy(&ctrl->cels);
|
||||
}
|
||||
|
||||
static void nvme_free_ctrl(struct device *dev)
|
||||
{
|
||||
struct nvme_ctrl *ctrl =
|
||||
|
|
@ -4383,8 +4395,7 @@ static void nvme_free_ctrl(struct device *dev)
|
|||
if (!subsys || ctrl->instance != subsys->instance)
|
||||
ida_simple_remove(&nvme_instance_ida, ctrl->instance);
|
||||
|
||||
xa_destroy(&ctrl->cels);
|
||||
|
||||
nvme_free_cels(ctrl);
|
||||
nvme_mpath_uninit(ctrl);
|
||||
__free_page(ctrl->discard_page);
|
||||
|
||||
|
|
|
|||
|
|
@ -226,12 +226,6 @@ struct nvme_fault_inject {
|
|||
#endif
|
||||
};
|
||||
|
||||
struct nvme_cel {
|
||||
struct list_head entry;
|
||||
struct nvme_effects_log log;
|
||||
u8 csi;
|
||||
};
|
||||
|
||||
struct nvme_ctrl {
|
||||
bool comp_seen;
|
||||
enum nvme_ctrl_state state;
|
||||
|
|
|
|||
|
|
@ -292,9 +292,21 @@ static void nvme_dbbuf_init(struct nvme_dev *dev,
|
|||
nvmeq->dbbuf_cq_ei = &dev->dbbuf_eis[cq_idx(qid, dev->db_stride)];
|
||||
}
|
||||
|
||||
static void nvme_dbbuf_free(struct nvme_queue *nvmeq)
|
||||
{
|
||||
if (!nvmeq->qid)
|
||||
return;
|
||||
|
||||
nvmeq->dbbuf_sq_db = NULL;
|
||||
nvmeq->dbbuf_cq_db = NULL;
|
||||
nvmeq->dbbuf_sq_ei = NULL;
|
||||
nvmeq->dbbuf_cq_ei = NULL;
|
||||
}
|
||||
|
||||
static void nvme_dbbuf_set(struct nvme_dev *dev)
|
||||
{
|
||||
struct nvme_command c;
|
||||
unsigned int i;
|
||||
|
||||
if (!dev->dbbuf_dbs)
|
||||
return;
|
||||
|
|
@ -308,6 +320,9 @@ static void nvme_dbbuf_set(struct nvme_dev *dev)
|
|||
dev_warn(dev->ctrl.device, "unable to set dbbuf\n");
|
||||
/* Free memory and continue on */
|
||||
nvme_dbbuf_dma_free(dev);
|
||||
|
||||
for (i = 1; i <= dev->online_queues; i++)
|
||||
nvme_dbbuf_free(&dev->queues[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -2980,6 +2980,12 @@ static int _dasd_requeue_request(struct dasd_ccw_req *cqr)
|
|||
|
||||
if (!block)
|
||||
return -EINVAL;
|
||||
/*
|
||||
* If the request is an ERP request there is nothing to requeue.
|
||||
* This will be done with the remaining original request.
|
||||
*/
|
||||
if (cqr->refers)
|
||||
return 0;
|
||||
spin_lock_irq(&cqr->dq->lock);
|
||||
req = (struct request *) cqr->callback_data;
|
||||
blk_mq_requeue_request(req, false);
|
||||
|
|
|
|||
|
|
@ -533,8 +533,8 @@ static void iscsi_complete_task(struct iscsi_task *task, int state)
|
|||
if (conn->task == task)
|
||||
conn->task = NULL;
|
||||
|
||||
if (conn->ping_task == task)
|
||||
conn->ping_task = NULL;
|
||||
if (READ_ONCE(conn->ping_task) == task)
|
||||
WRITE_ONCE(conn->ping_task, NULL);
|
||||
|
||||
/* release get from queueing */
|
||||
__iscsi_put_task(task);
|
||||
|
|
@ -738,6 +738,9 @@ __iscsi_conn_send_pdu(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
|
|||
task->conn->session->age);
|
||||
}
|
||||
|
||||
if (unlikely(READ_ONCE(conn->ping_task) == INVALID_SCSI_TASK))
|
||||
WRITE_ONCE(conn->ping_task, task);
|
||||
|
||||
if (!ihost->workq) {
|
||||
if (iscsi_prep_mgmt_task(conn, task))
|
||||
goto free_task;
|
||||
|
|
@ -941,8 +944,11 @@ static int iscsi_send_nopout(struct iscsi_conn *conn, struct iscsi_nopin *rhdr)
|
|||
struct iscsi_nopout hdr;
|
||||
struct iscsi_task *task;
|
||||
|
||||
if (!rhdr && conn->ping_task)
|
||||
return -EINVAL;
|
||||
if (!rhdr) {
|
||||
if (READ_ONCE(conn->ping_task))
|
||||
return -EINVAL;
|
||||
WRITE_ONCE(conn->ping_task, INVALID_SCSI_TASK);
|
||||
}
|
||||
|
||||
memset(&hdr, 0, sizeof(struct iscsi_nopout));
|
||||
hdr.opcode = ISCSI_OP_NOOP_OUT | ISCSI_OP_IMMEDIATE;
|
||||
|
|
@ -957,11 +963,12 @@ static int iscsi_send_nopout(struct iscsi_conn *conn, struct iscsi_nopin *rhdr)
|
|||
|
||||
task = __iscsi_conn_send_pdu(conn, (struct iscsi_hdr *)&hdr, NULL, 0);
|
||||
if (!task) {
|
||||
if (!rhdr)
|
||||
WRITE_ONCE(conn->ping_task, NULL);
|
||||
iscsi_conn_printk(KERN_ERR, conn, "Could not send nopout\n");
|
||||
return -EIO;
|
||||
} else if (!rhdr) {
|
||||
/* only track our nops */
|
||||
conn->ping_task = task;
|
||||
conn->last_ping = jiffies;
|
||||
}
|
||||
|
||||
|
|
@ -984,7 +991,7 @@ static int iscsi_nop_out_rsp(struct iscsi_task *task,
|
|||
struct iscsi_conn *conn = task->conn;
|
||||
int rc = 0;
|
||||
|
||||
if (conn->ping_task != task) {
|
||||
if (READ_ONCE(conn->ping_task) != task) {
|
||||
/*
|
||||
* If this is not in response to one of our
|
||||
* nops then it must be from userspace.
|
||||
|
|
@ -1923,7 +1930,7 @@ static void iscsi_start_tx(struct iscsi_conn *conn)
|
|||
*/
|
||||
static int iscsi_has_ping_timed_out(struct iscsi_conn *conn)
|
||||
{
|
||||
if (conn->ping_task &&
|
||||
if (READ_ONCE(conn->ping_task) &&
|
||||
time_before_eq(conn->last_recv + (conn->recv_timeout * HZ) +
|
||||
(conn->ping_timeout * HZ), jiffies))
|
||||
return 1;
|
||||
|
|
@ -2058,7 +2065,7 @@ enum blk_eh_timer_return iscsi_eh_cmd_timed_out(struct scsi_cmnd *sc)
|
|||
* Checking the transport already or nop from a cmd timeout still
|
||||
* running
|
||||
*/
|
||||
if (conn->ping_task) {
|
||||
if (READ_ONCE(conn->ping_task)) {
|
||||
task->have_checked_conn = true;
|
||||
rc = BLK_EH_RESET_TIMER;
|
||||
goto done;
|
||||
|
|
|
|||
|
|
@ -483,8 +483,7 @@ EXPORT_SYMBOL(iscsit_queue_rsp);
|
|||
void iscsit_aborted_task(struct iscsi_conn *conn, struct iscsi_cmd *cmd)
|
||||
{
|
||||
spin_lock_bh(&conn->cmd_lock);
|
||||
if (!list_empty(&cmd->i_conn_node) &&
|
||||
!(cmd->se_cmd.transport_state & CMD_T_FABRIC_STOP))
|
||||
if (!list_empty(&cmd->i_conn_node))
|
||||
list_del_init(&cmd->i_conn_node);
|
||||
spin_unlock_bh(&conn->cmd_lock);
|
||||
|
||||
|
|
@ -4083,12 +4082,22 @@ static void iscsit_release_commands_from_conn(struct iscsi_conn *conn)
|
|||
spin_lock_bh(&conn->cmd_lock);
|
||||
list_splice_init(&conn->conn_cmd_list, &tmp_list);
|
||||
|
||||
list_for_each_entry(cmd, &tmp_list, i_conn_node) {
|
||||
list_for_each_entry_safe(cmd, cmd_tmp, &tmp_list, i_conn_node) {
|
||||
struct se_cmd *se_cmd = &cmd->se_cmd;
|
||||
|
||||
if (se_cmd->se_tfo != NULL) {
|
||||
spin_lock_irq(&se_cmd->t_state_lock);
|
||||
se_cmd->transport_state |= CMD_T_FABRIC_STOP;
|
||||
if (se_cmd->transport_state & CMD_T_ABORTED) {
|
||||
/*
|
||||
* LIO's abort path owns the cleanup for this,
|
||||
* so put it back on the list and let
|
||||
* aborted_task handle it.
|
||||
*/
|
||||
list_move_tail(&cmd->i_conn_node,
|
||||
&conn->conn_cmd_list);
|
||||
} else {
|
||||
se_cmd->transport_state |= CMD_T_FABRIC_STOP;
|
||||
}
|
||||
spin_unlock_irq(&se_cmd->t_state_lock);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -205,6 +205,7 @@ struct fixed_file_ref_node {
|
|||
struct list_head file_list;
|
||||
struct fixed_file_data *file_data;
|
||||
struct llist_node llist;
|
||||
bool done;
|
||||
};
|
||||
|
||||
struct fixed_file_data {
|
||||
|
|
@ -478,6 +479,7 @@ struct io_sr_msg {
|
|||
struct io_open {
|
||||
struct file *file;
|
||||
int dfd;
|
||||
bool ignore_nonblock;
|
||||
struct filename *filename;
|
||||
struct open_how how;
|
||||
unsigned long nofile;
|
||||
|
|
@ -2577,7 +2579,6 @@ static bool io_resubmit_prep(struct io_kiocb *req, int error)
|
|||
}
|
||||
end_req:
|
||||
req_set_fail_links(req);
|
||||
io_req_complete(req, ret);
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
|
@ -3795,6 +3796,7 @@ static int __io_openat_prep(struct io_kiocb *req, const struct io_uring_sqe *sqe
|
|||
return ret;
|
||||
}
|
||||
req->open.nofile = rlimit(RLIMIT_NOFILE);
|
||||
req->open.ignore_nonblock = false;
|
||||
req->flags |= REQ_F_NEED_CLEANUP;
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -3838,7 +3840,7 @@ static int io_openat2(struct io_kiocb *req, bool force_nonblock)
|
|||
struct file *file;
|
||||
int ret;
|
||||
|
||||
if (force_nonblock)
|
||||
if (force_nonblock && !req->open.ignore_nonblock)
|
||||
return -EAGAIN;
|
||||
|
||||
ret = build_open_flags(&req->open.how, &op);
|
||||
|
|
@ -3853,6 +3855,21 @@ static int io_openat2(struct io_kiocb *req, bool force_nonblock)
|
|||
if (IS_ERR(file)) {
|
||||
put_unused_fd(ret);
|
||||
ret = PTR_ERR(file);
|
||||
/*
|
||||
* A work-around to ensure that /proc/self works that way
|
||||
* that it should - if we get -EOPNOTSUPP back, then assume
|
||||
* that proc_self_get_link() failed us because we're in async
|
||||
* context. We should be safe to retry this from the task
|
||||
* itself with force_nonblock == false set, as it should not
|
||||
* block on lookup. Would be nice to know this upfront and
|
||||
* avoid the async dance, but doesn't seem feasible.
|
||||
*/
|
||||
if (ret == -EOPNOTSUPP && io_wq_current_is_worker()) {
|
||||
req->open.ignore_nonblock = true;
|
||||
refcount_inc(&req->refs);
|
||||
io_req_task_queue(req);
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
fsnotify_open(file);
|
||||
fd_install(ret, file);
|
||||
|
|
@ -6957,9 +6974,7 @@ static int io_sqe_files_unregister(struct io_ring_ctx *ctx)
|
|||
return -ENXIO;
|
||||
|
||||
spin_lock(&data->lock);
|
||||
if (!list_empty(&data->ref_list))
|
||||
ref_node = list_first_entry(&data->ref_list,
|
||||
struct fixed_file_ref_node, node);
|
||||
ref_node = data->node;
|
||||
spin_unlock(&data->lock);
|
||||
if (ref_node)
|
||||
percpu_ref_kill(&ref_node->refs);
|
||||
|
|
@ -7308,10 +7323,6 @@ static void __io_file_put_work(struct fixed_file_ref_node *ref_node)
|
|||
kfree(pfile);
|
||||
}
|
||||
|
||||
spin_lock(&file_data->lock);
|
||||
list_del(&ref_node->node);
|
||||
spin_unlock(&file_data->lock);
|
||||
|
||||
percpu_ref_exit(&ref_node->refs);
|
||||
kfree(ref_node);
|
||||
percpu_ref_put(&file_data->refs);
|
||||
|
|
@ -7338,17 +7349,32 @@ static void io_file_put_work(struct work_struct *work)
|
|||
static void io_file_data_ref_zero(struct percpu_ref *ref)
|
||||
{
|
||||
struct fixed_file_ref_node *ref_node;
|
||||
struct fixed_file_data *data;
|
||||
struct io_ring_ctx *ctx;
|
||||
bool first_add;
|
||||
bool first_add = false;
|
||||
int delay = HZ;
|
||||
|
||||
ref_node = container_of(ref, struct fixed_file_ref_node, refs);
|
||||
ctx = ref_node->file_data->ctx;
|
||||
data = ref_node->file_data;
|
||||
ctx = data->ctx;
|
||||
|
||||
if (percpu_ref_is_dying(&ctx->file_data->refs))
|
||||
spin_lock(&data->lock);
|
||||
ref_node->done = true;
|
||||
|
||||
while (!list_empty(&data->ref_list)) {
|
||||
ref_node = list_first_entry(&data->ref_list,
|
||||
struct fixed_file_ref_node, node);
|
||||
/* recycle ref nodes in order */
|
||||
if (!ref_node->done)
|
||||
break;
|
||||
list_del(&ref_node->node);
|
||||
first_add |= llist_add(&ref_node->llist, &ctx->file_put_llist);
|
||||
}
|
||||
spin_unlock(&data->lock);
|
||||
|
||||
if (percpu_ref_is_dying(&data->refs))
|
||||
delay = 0;
|
||||
|
||||
first_add = llist_add(&ref_node->llist, &ctx->file_put_llist);
|
||||
if (!delay)
|
||||
mod_delayed_work(system_wq, &ctx->file_put_work, 0);
|
||||
else if (first_add)
|
||||
|
|
@ -7372,6 +7398,7 @@ static struct fixed_file_ref_node *alloc_fixed_file_ref_node(
|
|||
INIT_LIST_HEAD(&ref_node->node);
|
||||
INIT_LIST_HEAD(&ref_node->file_list);
|
||||
ref_node->file_data = ctx->file_data;
|
||||
ref_node->done = false;
|
||||
return ref_node;
|
||||
}
|
||||
|
||||
|
|
@ -7467,7 +7494,7 @@ static int io_sqe_files_register(struct io_ring_ctx *ctx, void __user *arg,
|
|||
|
||||
file_data->node = ref_node;
|
||||
spin_lock(&file_data->lock);
|
||||
list_add(&ref_node->node, &file_data->ref_list);
|
||||
list_add_tail(&ref_node->node, &file_data->ref_list);
|
||||
spin_unlock(&file_data->lock);
|
||||
percpu_ref_get(&file_data->refs);
|
||||
return ret;
|
||||
|
|
@ -7626,7 +7653,7 @@ static int __io_sqe_files_update(struct io_ring_ctx *ctx,
|
|||
if (needs_switch) {
|
||||
percpu_ref_kill(&data->node->refs);
|
||||
spin_lock(&data->lock);
|
||||
list_add(&ref_node->node, &data->ref_list);
|
||||
list_add_tail(&ref_node->node, &data->ref_list);
|
||||
data->node = ref_node;
|
||||
spin_unlock(&data->lock);
|
||||
percpu_ref_get(&ctx->file_data->refs);
|
||||
|
|
|
|||
|
|
@ -16,6 +16,13 @@ static const char *proc_self_get_link(struct dentry *dentry,
|
|||
pid_t tgid = task_tgid_nr_ns(current, ns);
|
||||
char *name;
|
||||
|
||||
/*
|
||||
* Not currently supported. Once we can inherit all of struct pid,
|
||||
* we can allow this.
|
||||
*/
|
||||
if (current->flags & PF_KTHREAD)
|
||||
return ERR_PTR(-EOPNOTSUPP);
|
||||
|
||||
if (!tgid)
|
||||
return ERR_PTR(-ENOENT);
|
||||
/* max length of unsigned int in decimal + NULL term */
|
||||
|
|
|
|||
|
|
@ -798,7 +798,6 @@ extern int iommu_calculate_agaw(struct intel_iommu *iommu);
|
|||
extern int iommu_calculate_max_sagaw(struct intel_iommu *iommu);
|
||||
extern int dmar_disabled;
|
||||
extern int intel_iommu_enabled;
|
||||
extern int intel_iommu_tboot_noforce;
|
||||
extern int intel_iommu_gfx_mapped;
|
||||
#else
|
||||
static inline int iommu_calculate_agaw(struct intel_iommu *iommu)
|
||||
|
|
|
|||
|
|
@ -132,6 +132,9 @@ struct iscsi_task {
|
|||
void *dd_data; /* driver/transport data */
|
||||
};
|
||||
|
||||
/* invalid scsi_task pointer */
|
||||
#define INVALID_SCSI_TASK (struct iscsi_task *)-1l
|
||||
|
||||
static inline int iscsi_task_has_unsol_data(struct iscsi_task *task)
|
||||
{
|
||||
return task->unsol_r2t.data_length > task->unsol_r2t.sent;
|
||||
|
|
|
|||
15
include/sound/rt1015.h
Normal file
15
include/sound/rt1015.h
Normal file
|
|
@ -0,0 +1,15 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* linux/sound/rt1015.h -- Platform data for RT1015
|
||||
*
|
||||
* Copyright 2020 Realtek Microelectronics
|
||||
*/
|
||||
|
||||
#ifndef __LINUX_SND_RT1015_H
|
||||
#define __LINUX_SND_RT1015_H
|
||||
|
||||
struct rt1015_platform_data {
|
||||
unsigned int power_up_delay_ms;
|
||||
};
|
||||
|
||||
#endif
|
||||
18
mm/filemap.c
18
mm/filemap.c
|
|
@ -2347,10 +2347,15 @@ ssize_t generic_file_buffered_read(struct kiocb *iocb,
|
|||
|
||||
page_not_up_to_date:
|
||||
/* Get exclusive access to the page ... */
|
||||
if (iocb->ki_flags & IOCB_WAITQ)
|
||||
if (iocb->ki_flags & IOCB_WAITQ) {
|
||||
if (written) {
|
||||
put_page(page);
|
||||
goto out;
|
||||
}
|
||||
error = lock_page_async(page, iocb->ki_waitq);
|
||||
else
|
||||
} else {
|
||||
error = lock_page_killable(page);
|
||||
}
|
||||
if (unlikely(error))
|
||||
goto readpage_error;
|
||||
|
||||
|
|
@ -2393,10 +2398,15 @@ ssize_t generic_file_buffered_read(struct kiocb *iocb,
|
|||
}
|
||||
|
||||
if (!PageUptodate(page)) {
|
||||
if (iocb->ki_flags & IOCB_WAITQ)
|
||||
if (iocb->ki_flags & IOCB_WAITQ) {
|
||||
if (written) {
|
||||
put_page(page);
|
||||
goto out;
|
||||
}
|
||||
error = lock_page_async(page, iocb->ki_waitq);
|
||||
else
|
||||
} else {
|
||||
error = lock_page_killable(page);
|
||||
}
|
||||
|
||||
if (unlikely(error))
|
||||
goto readpage_error;
|
||||
|
|
|
|||
|
|
@ -1539,7 +1539,7 @@ static int snd_ctl_elem_add(struct snd_ctl_file *file,
|
|||
|
||||
unlock:
|
||||
up_write(&card->controls_rwsem);
|
||||
return 0;
|
||||
return err;
|
||||
}
|
||||
|
||||
static int snd_ctl_elem_add_user(struct snd_ctl_file *file,
|
||||
|
|
|
|||
|
|
@ -123,7 +123,7 @@ copy_resp_to_buf(struct snd_efw *efw, void *data, size_t length, int *rcode)
|
|||
t = (struct snd_efw_transaction *)data;
|
||||
length = min_t(size_t, be32_to_cpu(t->length) * sizeof(u32), length);
|
||||
|
||||
spin_lock_irq(&efw->lock);
|
||||
spin_lock(&efw->lock);
|
||||
|
||||
if (efw->push_ptr < efw->pull_ptr)
|
||||
capacity = (unsigned int)(efw->pull_ptr - efw->push_ptr);
|
||||
|
|
@ -190,7 +190,7 @@ handle_resp_for_user(struct fw_card *card, int generation, int source,
|
|||
|
||||
copy_resp_to_buf(efw, data, length, rcode);
|
||||
end:
|
||||
spin_unlock_irq(&instances_lock);
|
||||
spin_unlock(&instances_lock);
|
||||
}
|
||||
|
||||
static void
|
||||
|
|
|
|||
|
|
@ -2506,6 +2506,9 @@ static const struct pci_device_id azx_ids[] = {
|
|||
/* DG1 */
|
||||
{ PCI_DEVICE(0x8086, 0x490d),
|
||||
.driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE},
|
||||
/* Alderlake-S */
|
||||
{ PCI_DEVICE(0x8086, 0x7ad0),
|
||||
.driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE},
|
||||
/* Elkhart Lake */
|
||||
{ PCI_DEVICE(0x8086, 0x4b55),
|
||||
.driver_data = AZX_DRIVER_SKL | AZX_DCAPS_INTEL_SKYLAKE},
|
||||
|
|
|
|||
|
|
@ -9183,6 +9183,8 @@ static void ca0132_mmio_init(struct hda_codec *codec)
|
|||
case QUIRK_AE5:
|
||||
ca0132_mmio_init_ae5(codec);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -4274,6 +4274,7 @@ HDA_CODEC_ENTRY(0x8086280d, "Geminilake HDMI", patch_i915_glk_hdmi),
|
|||
HDA_CODEC_ENTRY(0x8086280f, "Icelake HDMI", patch_i915_icl_hdmi),
|
||||
HDA_CODEC_ENTRY(0x80862812, "Tigerlake HDMI", patch_i915_tgl_hdmi),
|
||||
HDA_CODEC_ENTRY(0x80862814, "DG1 HDMI", patch_i915_tgl_hdmi),
|
||||
HDA_CODEC_ENTRY(0x80862815, "Alderlake HDMI", patch_i915_tgl_hdmi),
|
||||
HDA_CODEC_ENTRY(0x80862816, "Rocketlake HDMI", patch_i915_tgl_hdmi),
|
||||
HDA_CODEC_ENTRY(0x8086281a, "Jasperlake HDMI", patch_i915_icl_hdmi),
|
||||
HDA_CODEC_ENTRY(0x8086281b, "Elkhartlake HDMI", patch_i915_icl_hdmi),
|
||||
|
|
|
|||
|
|
@ -2522,13 +2522,23 @@ static const struct snd_pci_quirk alc882_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK_VENDOR(0x1462, "MSI", ALC882_FIXUP_GPIO3),
|
||||
SND_PCI_QUIRK(0x147b, 0x107a, "Abit AW9D-MAX", ALC882_FIXUP_ABIT_AW9D_MAX),
|
||||
SND_PCI_QUIRK(0x1558, 0x9501, "Clevo P950HR", ALC1220_FIXUP_CLEVO_P950),
|
||||
SND_PCI_QUIRK(0x1558, 0x9506, "Clevo P955HQ", ALC1220_FIXUP_CLEVO_P950),
|
||||
SND_PCI_QUIRK(0x1558, 0x950A, "Clevo P955H[PR]", ALC1220_FIXUP_CLEVO_P950),
|
||||
SND_PCI_QUIRK(0x1558, 0x95e1, "Clevo P95xER", ALC1220_FIXUP_CLEVO_P950),
|
||||
SND_PCI_QUIRK(0x1558, 0x95e2, "Clevo P950ER", ALC1220_FIXUP_CLEVO_P950),
|
||||
SND_PCI_QUIRK(0x1558, 0x95e3, "Clevo P955[ER]T", ALC1220_FIXUP_CLEVO_P950),
|
||||
SND_PCI_QUIRK(0x1558, 0x95e4, "Clevo P955ER", ALC1220_FIXUP_CLEVO_P950),
|
||||
SND_PCI_QUIRK(0x1558, 0x95e5, "Clevo P955EE6", ALC1220_FIXUP_CLEVO_P950),
|
||||
SND_PCI_QUIRK(0x1558, 0x95e6, "Clevo P950R[CDF]", ALC1220_FIXUP_CLEVO_P950),
|
||||
SND_PCI_QUIRK(0x1558, 0x96e1, "Clevo P960[ER][CDFN]-K", ALC1220_FIXUP_CLEVO_P950),
|
||||
SND_PCI_QUIRK(0x1558, 0x97e1, "Clevo P970[ER][CDFN]", ALC1220_FIXUP_CLEVO_P950),
|
||||
SND_PCI_QUIRK(0x1558, 0x65d1, "Clevo PB51[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
|
||||
SND_PCI_QUIRK(0x1558, 0x67d1, "Clevo PB71[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
|
||||
SND_PCI_QUIRK(0x1558, 0x97e2, "Clevo P970RC-M", ALC1220_FIXUP_CLEVO_P950),
|
||||
SND_PCI_QUIRK(0x1558, 0x50d3, "Clevo PC50[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
|
||||
SND_PCI_QUIRK(0x1558, 0x65d1, "Clevo PB51[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
|
||||
SND_PCI_QUIRK(0x1558, 0x65d2, "Clevo PB51R[CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
|
||||
SND_PCI_QUIRK(0x1558, 0x65e1, "Clevo PB51[ED][DF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
|
||||
SND_PCI_QUIRK(0x1558, 0x67d1, "Clevo PB71[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
|
||||
SND_PCI_QUIRK(0x1558, 0x67e1, "Clevo PB71[DE][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
|
||||
SND_PCI_QUIRK(0x1558, 0x70d1, "Clevo PC70[ER][CDF]", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
|
||||
SND_PCI_QUIRK(0x1558, 0x7714, "Clevo X170", ALC1220_FIXUP_CLEVO_PB51ED_PINS),
|
||||
SND_PCI_QUIRK_VENDOR(0x1558, "Clevo laptop", ALC882_FIXUP_EAPD),
|
||||
|
|
@ -4216,6 +4226,12 @@ static void alc286_fixup_hp_gpio_led(struct hda_codec *codec,
|
|||
alc_fixup_hp_gpio_led(codec, action, 0x02, 0x20);
|
||||
}
|
||||
|
||||
static void alc287_fixup_hp_gpio_led(struct hda_codec *codec,
|
||||
const struct hda_fixup *fix, int action)
|
||||
{
|
||||
alc_fixup_hp_gpio_led(codec, action, 0x10, 0);
|
||||
}
|
||||
|
||||
/* turn on/off mic-mute LED per capture hook via VREF change */
|
||||
static int vref_micmute_led_set(struct led_classdev *led_cdev,
|
||||
enum led_brightness brightness)
|
||||
|
|
@ -6301,6 +6317,9 @@ enum {
|
|||
ALC274_FIXUP_HP_MIC,
|
||||
ALC274_FIXUP_HP_HEADSET_MIC,
|
||||
ALC256_FIXUP_ASUS_HPE,
|
||||
ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK,
|
||||
ALC287_FIXUP_HP_GPIO_LED,
|
||||
ALC256_FIXUP_HP_HEADSET_MIC,
|
||||
};
|
||||
|
||||
static const struct hda_fixup alc269_fixups[] = {
|
||||
|
|
@ -7705,6 +7724,20 @@ static const struct hda_fixup alc269_fixups[] = {
|
|||
.chained = true,
|
||||
.chain_id = ALC294_FIXUP_ASUS_HEADSET_MIC
|
||||
},
|
||||
[ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc_fixup_headset_jack,
|
||||
.chained = true,
|
||||
.chain_id = ALC269_FIXUP_THINKPAD_ACPI
|
||||
},
|
||||
[ALC287_FIXUP_HP_GPIO_LED] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc287_fixup_hp_gpio_led,
|
||||
},
|
||||
[ALC256_FIXUP_HP_HEADSET_MIC] = {
|
||||
.type = HDA_FIXUP_FUNC,
|
||||
.v.func = alc274_fixup_hp_headset_mic,
|
||||
},
|
||||
};
|
||||
|
||||
static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
|
|
@ -7859,6 +7892,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x103c, 0x8760, "HP", ALC285_FIXUP_HP_MUTE_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x877a, "HP", ALC285_FIXUP_HP_MUTE_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x877d, "HP", ALC236_FIXUP_HP_MUTE_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x87f4, "HP", ALC287_FIXUP_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x87f5, "HP", ALC287_FIXUP_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x1043, 0x103e, "ASUS X540SA", ALC256_FIXUP_ASUS_MIC),
|
||||
SND_PCI_QUIRK(0x1043, 0x103f, "ASUS TX300", ALC282_FIXUP_ASUS_TX300),
|
||||
SND_PCI_QUIRK(0x1043, 0x106d, "Asus K53BE", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
|
||||
|
|
@ -7924,11 +7959,49 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x1458, 0xfa53, "Gigabyte BXBT-2807", ALC283_FIXUP_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1462, 0xb120, "MSI Cubi MS-B120", ALC283_FIXUP_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1462, 0xb171, "Cubi N 8GL (MS-B171)", ALC283_FIXUP_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1558, 0x1323, "Clevo N130ZU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x1325, "System76 Darter Pro (darp5)", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x1401, "Clevo L140[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x1403, "Clevo N140CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x1404, "Clevo N150CU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x14a1, "Clevo L141MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x4018, "Clevo NV40M[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x4019, "Clevo NV40MZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x4020, "Clevo NV40MB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x40a1, "Clevo NL40GU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x40c1, "Clevo NL40[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x40d1, "Clevo NL41DU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x50a3, "Clevo NJ51GU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x50b3, "Clevo NK50S[BEZ]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x50b6, "Clevo NK50S5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x50b8, "Clevo NK50SZ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x50d5, "Clevo NP50D5", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x50f0, "Clevo NH50A[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x50f3, "Clevo NH58DPQ", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x5101, "Clevo S510WU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x5157, "Clevo W517GU1", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x51a1, "Clevo NS50MU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x70a1, "Clevo NB70T[HJK]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x70b3, "Clevo NK70SB", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x8228, "Clevo NR40BU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x8520, "Clevo NH50D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x8521, "Clevo NH77D[CD]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x8535, "Clevo NH50D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x8536, "Clevo NH79D[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x8550, "System76 Gazelle (gaze14)", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x8551, "System76 Gazelle (gaze14)", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x8560, "System76 Gazelle (gaze14)", ALC269_FIXUP_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1558, 0x8561, "System76 Gazelle (gaze14)", ALC269_FIXUP_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x1558, 0x8668, "Clevo NP50B[BE]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x8680, "Clevo NJ50LU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x8686, "Clevo NH50[CZ]U", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x8a20, "Clevo NH55DCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x8a51, "Clevo NH70RCQ-Y", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x8d50, "Clevo NH55RCQ-M", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x951d, "Clevo N950T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x961d, "Clevo N960S[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0x971d, "Clevo N970T[CDF]", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x1558, 0xa500, "Clevo NL53RU", ALC293_FIXUP_SYSTEM76_MIC_NO_PRESENCE),
|
||||
SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC233_FIXUP_LENOVO_MULTI_CODECS),
|
||||
SND_PCI_QUIRK(0x17aa, 0x1048, "ThinkCentre Station", ALC283_FIXUP_HEADSET_MIC),
|
||||
SND_PCI_QUIRK(0x17aa, 0x20f2, "Thinkpad SL410/510", ALC269_FIXUP_SKU_IGNORE),
|
||||
|
|
@ -7966,6 +8039,8 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
|||
SND_PCI_QUIRK(0x17aa, 0x225d, "Thinkpad T480", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
|
||||
SND_PCI_QUIRK(0x17aa, 0x2292, "Thinkpad X1 Carbon 7th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
|
||||
SND_PCI_QUIRK(0x17aa, 0x22be, "Thinkpad X1 Carbon 8th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
|
||||
SND_PCI_QUIRK(0x17aa, 0x22c1, "Thinkpad P1 Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),
|
||||
SND_PCI_QUIRK(0x17aa, 0x22c2, "Thinkpad X1 Extreme Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),
|
||||
SND_PCI_QUIRK(0x17aa, 0x30bb, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
|
||||
SND_PCI_QUIRK(0x17aa, 0x30e2, "ThinkCentre AIO", ALC233_FIXUP_LENOVO_LINE2_MIC_HOTKEY),
|
||||
SND_PCI_QUIRK(0x17aa, 0x310c, "ThinkCentre Station", ALC294_FIXUP_LENOVO_MIC_LOCATION),
|
||||
|
|
@ -8278,6 +8353,10 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
|
|||
{0x19, 0x02a11020},
|
||||
{0x1a, 0x02a11030},
|
||||
{0x21, 0x0221101f}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0236, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC,
|
||||
{0x14, 0x90170110},
|
||||
{0x19, 0x02a11020},
|
||||
{0x21, 0x02211030}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0255, 0x1028, "Dell", ALC255_FIXUP_DELL2_MIC_NO_PRESENCE,
|
||||
{0x14, 0x90170110},
|
||||
{0x21, 0x02211020}),
|
||||
|
|
@ -8380,6 +8459,10 @@ static const struct snd_hda_pin_quirk alc269_pin_fixup_tbl[] = {
|
|||
{0x1a, 0x90a70130},
|
||||
{0x1b, 0x90170110},
|
||||
{0x21, 0x03211020}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0256, 0x103c, "HP", ALC256_FIXUP_HP_HEADSET_MIC,
|
||||
{0x14, 0x90170110},
|
||||
{0x19, 0x02a11020},
|
||||
{0x21, 0x0221101f}),
|
||||
SND_HDA_PIN_QUIRK(0x10ec0274, 0x103c, "HP", ALC274_FIXUP_HP_HEADSET_MIC,
|
||||
{0x17, 0x90170110},
|
||||
{0x19, 0x03a11030},
|
||||
|
|
|
|||
|
|
@ -70,7 +70,6 @@ static int get_msg(struct mixart_mgr *mgr, struct mixart_msg *resp,
|
|||
unsigned int i;
|
||||
#endif
|
||||
|
||||
mutex_lock(&mgr->msg_lock);
|
||||
err = 0;
|
||||
|
||||
/* copy message descriptor from miXart to driver */
|
||||
|
|
@ -119,8 +118,6 @@ static int get_msg(struct mixart_mgr *mgr, struct mixart_msg *resp,
|
|||
writel_be(headptr, MIXART_MEM(mgr, MSG_OUTBOUND_FREE_HEAD));
|
||||
|
||||
_clean_exit:
|
||||
mutex_unlock(&mgr->msg_lock);
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
@ -258,7 +255,9 @@ int snd_mixart_send_msg(struct mixart_mgr *mgr, struct mixart_msg *request, int
|
|||
resp.data = resp_data;
|
||||
resp.size = max_resp_size;
|
||||
|
||||
mutex_lock(&mgr->msg_lock);
|
||||
err = get_msg(mgr, &resp, msg_frame);
|
||||
mutex_unlock(&mgr->msg_lock);
|
||||
|
||||
if( request->message_id != resp.message_id )
|
||||
dev_err(&mgr->pci->dev, "RESPONSE ERROR!\n");
|
||||
|
|
|
|||
|
|
@ -27,10 +27,15 @@
|
|||
#include <sound/soc-dapm.h>
|
||||
#include <sound/soc.h>
|
||||
#include <sound/tlv.h>
|
||||
#include <sound/rt1015.h>
|
||||
|
||||
#include "rl6231.h"
|
||||
#include "rt1015.h"
|
||||
|
||||
static const struct rt1015_platform_data i2s_default_platform_data = {
|
||||
.power_up_delay_ms = 50,
|
||||
};
|
||||
|
||||
static const struct reg_default rt1015_reg[] = {
|
||||
{ 0x0000, 0x0000 },
|
||||
{ 0x0004, 0xa000 },
|
||||
|
|
@ -539,7 +544,7 @@ static void rt1015_flush_work(struct work_struct *work)
|
|||
struct rt1015_priv *rt1015 = container_of(work, struct rt1015_priv,
|
||||
flush_work.work);
|
||||
struct snd_soc_component *component = rt1015->component;
|
||||
unsigned int val, i = 0, count = 20;
|
||||
unsigned int val, i = 0, count = 200;
|
||||
|
||||
while (i < count) {
|
||||
usleep_range(1000, 1500);
|
||||
|
|
@ -650,6 +655,7 @@ static int rt1015_amp_drv_event(struct snd_soc_dapm_widget *w,
|
|||
case SND_SOC_DAPM_POST_PMU:
|
||||
if (rt1015->hw_config == RT1015_HW_28)
|
||||
schedule_delayed_work(&rt1015->flush_work, msecs_to_jiffies(10));
|
||||
msleep(rt1015->pdata.power_up_delay_ms);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
|
@ -1067,9 +1073,16 @@ static struct acpi_device_id rt1015_acpi_match[] = {
|
|||
MODULE_DEVICE_TABLE(acpi, rt1015_acpi_match);
|
||||
#endif
|
||||
|
||||
static void rt1015_parse_dt(struct rt1015_priv *rt1015, struct device *dev)
|
||||
{
|
||||
device_property_read_u32(dev, "realtek,power-up-delay-ms",
|
||||
&rt1015->pdata.power_up_delay_ms);
|
||||
}
|
||||
|
||||
static int rt1015_i2c_probe(struct i2c_client *i2c,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
struct rt1015_platform_data *pdata = dev_get_platdata(&i2c->dev);
|
||||
struct rt1015_priv *rt1015;
|
||||
int ret;
|
||||
unsigned int val;
|
||||
|
|
@ -1081,6 +1094,13 @@ static int rt1015_i2c_probe(struct i2c_client *i2c,
|
|||
|
||||
i2c_set_clientdata(i2c, rt1015);
|
||||
|
||||
rt1015->pdata = i2s_default_platform_data;
|
||||
|
||||
if (pdata)
|
||||
rt1015->pdata = *pdata;
|
||||
else
|
||||
rt1015_parse_dt(rt1015, &i2c->dev);
|
||||
|
||||
rt1015->regmap = devm_regmap_init_i2c(i2c, &rt1015_regmap);
|
||||
if (IS_ERR(rt1015->regmap)) {
|
||||
ret = PTR_ERR(rt1015->regmap);
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@
|
|||
|
||||
#ifndef __RT1015_H__
|
||||
#define __RT1015_H__
|
||||
#include <sound/rt1015.h>
|
||||
|
||||
#define RT1015_DEVICE_ID_VAL 0x1011
|
||||
#define RT1015_DEVICE_ID_VAL2 0x1015
|
||||
|
|
@ -380,6 +381,7 @@ enum {
|
|||
|
||||
struct rt1015_priv {
|
||||
struct snd_soc_component *component;
|
||||
struct rt1015_platform_data pdata;
|
||||
struct regmap *regmap;
|
||||
int sysclk;
|
||||
int sysclk_src;
|
||||
|
|
|
|||
|
|
@ -700,6 +700,8 @@ static int kabylake_set_bias_level(struct snd_soc_card *card,
|
|||
switch (level) {
|
||||
case SND_SOC_BIAS_PREPARE:
|
||||
if (dapm->bias_level == SND_SOC_BIAS_ON) {
|
||||
if (!__clk_is_enabled(priv->mclk))
|
||||
return 0;
|
||||
dev_dbg(card->dev, "Disable mclk");
|
||||
clk_disable_unprepare(priv->mclk);
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -458,10 +458,6 @@ static int catpt_dai_prepare(struct snd_pcm_substream *substream,
|
|||
if (ret)
|
||||
return CATPT_IPC_ERROR(ret);
|
||||
|
||||
ret = catpt_dsp_update_lpclock(cdev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = catpt_dai_apply_usettings(dai, stream);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
|
@ -500,6 +496,7 @@ static int catpt_dai_trigger(struct snd_pcm_substream *substream, int cmd,
|
|||
case SNDRV_PCM_TRIGGER_RESUME:
|
||||
case SNDRV_PCM_TRIGGER_PAUSE_RELEASE:
|
||||
resume_stream:
|
||||
catpt_dsp_update_lpclock(cdev);
|
||||
ret = catpt_ipc_resume_stream(cdev, stream->info.stream_hw_id);
|
||||
if (ret)
|
||||
return CATPT_IPC_ERROR(ret);
|
||||
|
|
@ -507,11 +504,11 @@ static int catpt_dai_trigger(struct snd_pcm_substream *substream, int cmd,
|
|||
|
||||
case SNDRV_PCM_TRIGGER_STOP:
|
||||
stream->prepared = false;
|
||||
catpt_dsp_update_lpclock(cdev);
|
||||
fallthrough;
|
||||
case SNDRV_PCM_TRIGGER_SUSPEND:
|
||||
case SNDRV_PCM_TRIGGER_PAUSE_PUSH:
|
||||
ret = catpt_ipc_pause_stream(cdev, stream->info.stream_hw_id);
|
||||
catpt_dsp_update_lpclock(cdev);
|
||||
if (ret)
|
||||
return CATPT_IPC_ERROR(ret);
|
||||
break;
|
||||
|
|
@ -534,6 +531,8 @@ void catpt_stream_update_position(struct catpt_dev *cdev,
|
|||
|
||||
dsppos = bytes_to_frames(r, pos->stream_position);
|
||||
|
||||
if (!stream->prepared)
|
||||
goto exit;
|
||||
/* only offload is set_write_pos driven */
|
||||
if (stream->template->type != CATPT_STRM_TYPE_RENDER)
|
||||
goto exit;
|
||||
|
|
|
|||
|
|
@ -487,9 +487,9 @@ static int kmb_dai_hw_params(struct snd_pcm_substream *substream,
|
|||
kmb_i2s->xfer_resolution = 0x02;
|
||||
break;
|
||||
case SNDRV_PCM_FORMAT_S24_LE:
|
||||
config->data_width = 24;
|
||||
kmb_i2s->ccr = 0x08;
|
||||
kmb_i2s->xfer_resolution = 0x04;
|
||||
config->data_width = 32;
|
||||
kmb_i2s->ccr = 0x14;
|
||||
kmb_i2s->xfer_resolution = 0x05;
|
||||
break;
|
||||
case SNDRV_PCM_FORMAT_S32_LE:
|
||||
config->data_width = 32;
|
||||
|
|
|
|||
|
|
@ -122,8 +122,10 @@ static int lpass_platform_pcmops_open(struct snd_soc_component *component,
|
|||
else
|
||||
dma_ch = 0;
|
||||
|
||||
if (dma_ch < 0)
|
||||
if (dma_ch < 0) {
|
||||
kfree(data);
|
||||
return dma_ch;
|
||||
}
|
||||
|
||||
if (cpu_dai->driver->id == LPASS_DP_RX) {
|
||||
map = drvdata->hdmiif_map;
|
||||
|
|
@ -147,6 +149,7 @@ static int lpass_platform_pcmops_open(struct snd_soc_component *component,
|
|||
ret = snd_pcm_hw_constraint_integer(runtime,
|
||||
SNDRV_PCM_HW_PARAM_PERIODS);
|
||||
if (ret < 0) {
|
||||
kfree(data);
|
||||
dev_err(soc_runtime->dev, "setting constraints failed: %d\n",
|
||||
ret);
|
||||
return -EINVAL;
|
||||
|
|
|
|||
|
|
@ -558,6 +558,10 @@ static const struct usb_audio_device_name usb_audio_names[] = {
|
|||
|
||||
DEVICE_NAME(0x046d, 0x0990, "Logitech, Inc.", "QuickCam Pro 9000"),
|
||||
|
||||
/* ASUS ROG Strix */
|
||||
PROFILE_NAME(0x0b05, 0x1917,
|
||||
"Realtek", "ALC1220-VB-DT", "Realtek-ALC1220-VB-Desktop"),
|
||||
|
||||
/* Dell WD15 Dock */
|
||||
PROFILE_NAME(0x0bda, 0x4014, "Dell", "WD15 Dock", "Dell-WD15-Dock"),
|
||||
/* Dell WD19 Dock */
|
||||
|
|
|
|||
|
|
@ -561,7 +561,8 @@ static const struct usbmix_ctl_map usbmix_ctl_maps[] = {
|
|||
},
|
||||
{ /* ASUS ROG Strix */
|
||||
.id = USB_ID(0x0b05, 0x1917),
|
||||
.map = asus_rog_map,
|
||||
.map = trx40_mobo_map,
|
||||
.connector_map = trx40_mobo_connector_map,
|
||||
},
|
||||
{ /* MSI TRX40 Creator */
|
||||
.id = USB_ID(0x0db0, 0x0d64),
|
||||
|
|
|
|||
|
|
@ -1672,13 +1672,13 @@ void snd_usb_ctl_msg_quirk(struct usb_device *dev, unsigned int pipe,
|
|||
&& (requesttype & USB_TYPE_MASK) == USB_TYPE_CLASS)
|
||||
msleep(20);
|
||||
|
||||
/* Zoom R16/24, Logitech H650e/H570e, Jabra 550a, Kingston HyperX
|
||||
* needs a tiny delay here, otherwise requests like get/set
|
||||
* frequency return as failed despite actually succeeding.
|
||||
/* Zoom R16/24, many Logitech(at least H650e/H570e/BCC950),
|
||||
* Jabra 550a, Kingston HyperX needs a tiny delay here,
|
||||
* otherwise requests like get/set frequency return
|
||||
* as failed despite actually succeeding.
|
||||
*/
|
||||
if ((chip->usb_id == USB_ID(0x1686, 0x00dd) ||
|
||||
chip->usb_id == USB_ID(0x046d, 0x0a46) ||
|
||||
chip->usb_id == USB_ID(0x046d, 0x0a56) ||
|
||||
USB_ID_VENDOR(chip->usb_id) == 0x046d || /* Logitech */
|
||||
chip->usb_id == USB_ID(0x0b0e, 0x0349) ||
|
||||
chip->usb_id == USB_ID(0x0951, 0x16ad)) &&
|
||||
(requesttype & USB_TYPE_MASK) == USB_TYPE_CLASS)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user