mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -07:00
Merge branch 'fixes' of https://git.kernel.org/pub/scm/linux/kernel/git/vkoul/dmaengine.git
This commit is contained in:
@@ -288,6 +288,7 @@ static int idxd_cdev_open(struct inode *inode, struct file *filp)
|
||||
fdev->parent = cdev_dev(idxd_cdev);
|
||||
fdev->bus = &dsa_bus_type;
|
||||
fdev->type = &idxd_cdev_file_type;
|
||||
idxd_wq_get(wq);
|
||||
|
||||
rc = dev_set_name(fdev, "file%d", ctx->id);
|
||||
if (rc < 0) {
|
||||
@@ -301,13 +302,14 @@ static int idxd_cdev_open(struct inode *inode, struct file *filp)
|
||||
goto failed_dev_add;
|
||||
}
|
||||
|
||||
idxd_wq_get(wq);
|
||||
mutex_unlock(&wq->wq_lock);
|
||||
return 0;
|
||||
|
||||
failed_dev_add:
|
||||
failed_dev_name:
|
||||
mutex_unlock(&wq->wq_lock);
|
||||
put_device(fdev);
|
||||
return rc;
|
||||
failed_ida:
|
||||
failed_set_pasid:
|
||||
if (device_user_pasid_enabled(idxd))
|
||||
|
||||
+5
-31
@@ -159,18 +159,12 @@ static void idxd_cleanup_interrupts(struct idxd_device *idxd)
|
||||
|
||||
static void idxd_clean_wqs(struct idxd_device *idxd)
|
||||
{
|
||||
struct idxd_wq *wq;
|
||||
struct device *conf_dev;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < idxd->max_wqs; i++) {
|
||||
wq = idxd->wqs[i];
|
||||
if (idxd->hw.wq_cap.op_config)
|
||||
bitmap_free(wq->opcap_bmap);
|
||||
kfree(wq->wqcfg);
|
||||
conf_dev = wq_confdev(wq);
|
||||
conf_dev = wq_confdev(idxd->wqs[i]);
|
||||
put_device(conf_dev);
|
||||
kfree(wq);
|
||||
}
|
||||
bitmap_free(idxd->wq_enable_map);
|
||||
kfree(idxd->wqs);
|
||||
@@ -212,7 +206,6 @@ static int idxd_setup_wqs(struct idxd_device *idxd)
|
||||
rc = dev_set_name(conf_dev, "wq%d.%d", idxd->id, wq->id);
|
||||
if (rc < 0) {
|
||||
put_device(conf_dev);
|
||||
kfree(wq);
|
||||
goto err_unwind;
|
||||
}
|
||||
|
||||
@@ -227,7 +220,6 @@ static int idxd_setup_wqs(struct idxd_device *idxd)
|
||||
wq->wqcfg = kzalloc_node(idxd->wqcfg_size, GFP_KERNEL, dev_to_node(dev));
|
||||
if (!wq->wqcfg) {
|
||||
put_device(conf_dev);
|
||||
kfree(wq);
|
||||
rc = -ENOMEM;
|
||||
goto err_unwind;
|
||||
}
|
||||
@@ -235,9 +227,7 @@ static int idxd_setup_wqs(struct idxd_device *idxd)
|
||||
if (idxd->hw.wq_cap.op_config) {
|
||||
wq->opcap_bmap = bitmap_zalloc(IDXD_MAX_OPCAP_BITS, GFP_KERNEL);
|
||||
if (!wq->opcap_bmap) {
|
||||
kfree(wq->wqcfg);
|
||||
put_device(conf_dev);
|
||||
kfree(wq);
|
||||
rc = -ENOMEM;
|
||||
goto err_unwind;
|
||||
}
|
||||
@@ -252,13 +242,8 @@ static int idxd_setup_wqs(struct idxd_device *idxd)
|
||||
|
||||
err_unwind:
|
||||
while (--i >= 0) {
|
||||
wq = idxd->wqs[i];
|
||||
if (idxd->hw.wq_cap.op_config)
|
||||
bitmap_free(wq->opcap_bmap);
|
||||
kfree(wq->wqcfg);
|
||||
conf_dev = wq_confdev(wq);
|
||||
conf_dev = wq_confdev(idxd->wqs[i]);
|
||||
put_device(conf_dev);
|
||||
kfree(wq);
|
||||
}
|
||||
bitmap_free(idxd->wq_enable_map);
|
||||
|
||||
@@ -270,15 +255,12 @@ err_free_wqs:
|
||||
|
||||
static void idxd_clean_engines(struct idxd_device *idxd)
|
||||
{
|
||||
struct idxd_engine *engine;
|
||||
struct device *conf_dev;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < idxd->max_engines; i++) {
|
||||
engine = idxd->engines[i];
|
||||
conf_dev = engine_confdev(engine);
|
||||
conf_dev = engine_confdev(idxd->engines[i]);
|
||||
put_device(conf_dev);
|
||||
kfree(engine);
|
||||
}
|
||||
kfree(idxd->engines);
|
||||
}
|
||||
@@ -313,7 +295,6 @@ static int idxd_setup_engines(struct idxd_device *idxd)
|
||||
rc = dev_set_name(conf_dev, "engine%d.%d", idxd->id, engine->id);
|
||||
if (rc < 0) {
|
||||
put_device(conf_dev);
|
||||
kfree(engine);
|
||||
goto err;
|
||||
}
|
||||
|
||||
@@ -324,10 +305,8 @@ static int idxd_setup_engines(struct idxd_device *idxd)
|
||||
|
||||
err:
|
||||
while (--i >= 0) {
|
||||
engine = idxd->engines[i];
|
||||
conf_dev = engine_confdev(engine);
|
||||
conf_dev = engine_confdev(idxd->engines[i]);
|
||||
put_device(conf_dev);
|
||||
kfree(engine);
|
||||
}
|
||||
kfree(idxd->engines);
|
||||
|
||||
@@ -336,13 +315,10 @@ static int idxd_setup_engines(struct idxd_device *idxd)
|
||||
|
||||
static void idxd_clean_groups(struct idxd_device *idxd)
|
||||
{
|
||||
struct idxd_group *group;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < idxd->max_groups; i++) {
|
||||
group = idxd->groups[i];
|
||||
put_device(group_confdev(group));
|
||||
kfree(group);
|
||||
put_device(group_confdev(idxd->groups[i]));
|
||||
}
|
||||
kfree(idxd->groups);
|
||||
}
|
||||
@@ -377,7 +353,6 @@ static int idxd_setup_groups(struct idxd_device *idxd)
|
||||
rc = dev_set_name(conf_dev, "group%d.%d", idxd->id, group->id);
|
||||
if (rc < 0) {
|
||||
put_device(conf_dev);
|
||||
kfree(group);
|
||||
goto err;
|
||||
}
|
||||
|
||||
@@ -402,7 +377,6 @@ static int idxd_setup_groups(struct idxd_device *idxd)
|
||||
while (--i >= 0) {
|
||||
group = idxd->groups[i];
|
||||
put_device(group_confdev(group));
|
||||
kfree(group);
|
||||
}
|
||||
kfree(idxd->groups);
|
||||
|
||||
|
||||
@@ -945,16 +945,13 @@ static int sun6i_dma_terminate_all(struct dma_chan *chan)
|
||||
|
||||
spin_lock_irqsave(&vchan->vc.lock, flags);
|
||||
|
||||
if (vchan->cyclic) {
|
||||
vchan->cyclic = false;
|
||||
if (pchan && pchan->desc) {
|
||||
struct virt_dma_desc *vd = &pchan->desc->vd;
|
||||
struct virt_dma_chan *vc = &vchan->vc;
|
||||
if (pchan && pchan->desc && pchan->desc != pchan->done) {
|
||||
struct virt_dma_desc *vd = &pchan->desc->vd;
|
||||
|
||||
list_add_tail(&vd->node, &vc->desc_completed);
|
||||
}
|
||||
vchan_terminate_vdesc(vd);
|
||||
}
|
||||
|
||||
vchan->cyclic = false;
|
||||
vchan_get_all_descriptors(&vchan->vc, &head);
|
||||
|
||||
if (pchan) {
|
||||
|
||||
@@ -1099,7 +1099,7 @@ static int switchtec_dma_chan_init(struct switchtec_dma_dev *swdma_dev,
|
||||
dev_dbg(&pdev->dev, "Channel %d: SE buffer count %d\n", i, se_buf_len);
|
||||
|
||||
thresh = se_buf_len / 2;
|
||||
valid_en_se |= FIELD_GET(SE_THRESH_MASK, thresh);
|
||||
valid_en_se |= FIELD_PREP(SE_THRESH_MASK, thresh);
|
||||
writel(valid_en_se, &swdma_chan->mmio_chan_fw->valid_en_se);
|
||||
|
||||
/* request irqs */
|
||||
|
||||
@@ -13,9 +13,12 @@
|
||||
* supported by BAM DMA Engine.
|
||||
*
|
||||
* @cmd_and_addr - upper 8 bits command and lower 24 bits register address.
|
||||
* @data - for write command: content to be written into peripheral register.
|
||||
* for read command: dest addr to write peripheral register value.
|
||||
* @mask - register mask.
|
||||
* @data - For write command: content to be written into peripheral register.
|
||||
* For read command: lower 32 bits of destination address.
|
||||
* @mask - For write command: register write mask.
|
||||
* For read command on BAM v1.6.0+: upper 4 bits of destination address.
|
||||
* For read command on BAM < v1.6.0: ignored by hardware.
|
||||
* Setting to 0 ensures 32-bit addressing compatibility.
|
||||
* @reserved - for future usage.
|
||||
*
|
||||
*/
|
||||
@@ -42,6 +45,10 @@ enum bam_command_type {
|
||||
* @addr: target address
|
||||
* @cmd: BAM command
|
||||
* @data: actual data for write and dest addr for read in le32
|
||||
*
|
||||
* For BAM v1.6.0+, the mask field behavior depends on command type:
|
||||
* - Write commands: mask = write mask (typically 0xffffffff)
|
||||
* - Read commands: mask = upper 4 bits of destination address (0 for 32-bit)
|
||||
*/
|
||||
static inline void
|
||||
bam_prep_ce_le32(struct bam_cmd_element *bam_ce, u32 addr,
|
||||
@@ -50,7 +57,11 @@ bam_prep_ce_le32(struct bam_cmd_element *bam_ce, u32 addr,
|
||||
bam_ce->cmd_and_addr =
|
||||
cpu_to_le32((addr & 0xffffff) | ((cmd & 0xff) << 24));
|
||||
bam_ce->data = data;
|
||||
bam_ce->mask = cpu_to_le32(0xffffffff);
|
||||
if (cmd == BAM_READ_COMMAND)
|
||||
bam_ce->mask = cpu_to_le32(0x0); /* 32-bit addressing */
|
||||
else
|
||||
bam_ce->mask = cpu_to_le32(0xffffffff); /* Write mask */
|
||||
bam_ce->reserved = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -60,7 +71,7 @@ bam_prep_ce_le32(struct bam_cmd_element *bam_ce, u32 addr,
|
||||
* @bam_ce: BAM command element
|
||||
* @addr: target address
|
||||
* @cmd: BAM command
|
||||
* @data: actual data for write and dest addr for read
|
||||
* @data: actual data for write and destination address for read
|
||||
*/
|
||||
static inline void
|
||||
bam_prep_ce(struct bam_cmd_element *bam_ce, u32 addr,
|
||||
|
||||
Reference in New Issue
Block a user