Skip to content

Commit 5cb664f

Browse files
committed
Merge branch 'fixes' into next
We have a conflict in idxd driver between 'fixes' and 'next' and there are patches dependent on this so, merge the 'fixes' branch into next
2 parents 105a8c5 + 822c9f2 commit 5cb664f

File tree

6 files changed

+129
-64
lines changed

6 files changed

+129
-64
lines changed

drivers/dma/dw-axi-dmac/dw-axi-dmac-platform.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,7 @@ static void axi_chan_block_xfer_start(struct axi_dma_chan *chan,
373373
struct axi_dma_desc *first)
374374
{
375375
u32 priority = chan->chip->dw->hdata->priority[chan->id];
376-
struct axi_dma_chan_config config;
376+
struct axi_dma_chan_config config = {};
377377
u32 irq_mask;
378378
u8 lms = 0; /* Select AXI0 master for LLI fetching */
379379

@@ -391,7 +391,7 @@ static void axi_chan_block_xfer_start(struct axi_dma_chan *chan,
391391
config.tt_fc = DWAXIDMAC_TT_FC_MEM_TO_MEM_DMAC;
392392
config.prior = priority;
393393
config.hs_sel_dst = DWAXIDMAC_HS_SEL_HW;
394-
config.hs_sel_dst = DWAXIDMAC_HS_SEL_HW;
394+
config.hs_sel_src = DWAXIDMAC_HS_SEL_HW;
395395
switch (chan->direction) {
396396
case DMA_MEM_TO_DEV:
397397
dw_axi_dma_set_byte_halfword(chan, true);

drivers/dma/dw-edma/dw-edma-pcie.c

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -187,17 +187,9 @@ static int dw_edma_pcie_probe(struct pci_dev *pdev,
187187

188188
/* DMA configuration */
189189
err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(64));
190-
if (!err) {
190+
if (err) {
191191
pci_err(pdev, "DMA mask 64 set failed\n");
192192
return err;
193-
} else {
194-
pci_err(pdev, "DMA mask 64 set failed\n");
195-
196-
err = dma_set_mask_and_coherent(&pdev->dev, DMA_BIT_MASK(32));
197-
if (err) {
198-
pci_err(pdev, "DMA mask 32 set failed\n");
199-
return err;
200-
}
201193
}
202194

203195
/* Data structure allocation */

drivers/dma/idxd/irq.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -318,10 +318,10 @@ static int process_misc_interrupts(struct idxd_device *idxd, u32 cause)
318318
INIT_WORK(&idxd->work, idxd_device_reinit);
319319
queue_work(idxd->wq, &idxd->work);
320320
} else {
321-
spin_lock(&idxd->dev_lock);
322321
idxd->state = IDXD_DEV_HALTED;
323322
idxd_wqs_quiesce(idxd);
324323
idxd_wqs_unmap_portal(idxd);
324+
spin_lock(&idxd->dev_lock);
325325
idxd_device_clear_state(idxd);
326326
dev_err(&idxd->pdev->dev,
327327
"idxd halted, need %s.\n",

drivers/dma/idxd/submit.c

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ static void llist_abort_desc(struct idxd_wq *wq, struct idxd_irq_entry *ie,
9797
{
9898
struct idxd_desc *d, *t, *found = NULL;
9999
struct llist_node *head;
100+
LIST_HEAD(flist);
100101

101102
desc->completion->status = IDXD_COMP_DESC_ABORT;
102103
/*
@@ -111,7 +112,11 @@ static void llist_abort_desc(struct idxd_wq *wq, struct idxd_irq_entry *ie,
111112
found = desc;
112113
continue;
113114
}
114-
list_add_tail(&desc->list, &ie->work_list);
115+
116+
if (d->completion->status)
117+
list_add_tail(&d->list, &flist);
118+
else
119+
list_add_tail(&d->list, &ie->work_list);
115120
}
116121
}
117122

@@ -121,6 +126,17 @@ static void llist_abort_desc(struct idxd_wq *wq, struct idxd_irq_entry *ie,
121126

122127
if (found)
123128
idxd_dma_complete_txd(found, IDXD_COMPLETE_ABORT, false);
129+
130+
/*
131+
* completing the descriptor will return desc to allocator and
132+
* the desc can be acquired by a different process and the
133+
* desc->list can be modified. Delete desc from list so the
134+
* list trasversing does not get corrupted by the other process.
135+
*/
136+
list_for_each_entry_safe(d, t, &flist, list) {
137+
list_del_init(&d->list);
138+
idxd_dma_complete_txd(found, IDXD_COMPLETE_ABORT, true);
139+
}
124140
}
125141

126142
/*

drivers/dma/st_fdma.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -874,4 +874,4 @@ MODULE_LICENSE("GPL v2");
874874
MODULE_DESCRIPTION("STMicroelectronics FDMA engine driver");
875875
MODULE_AUTHOR("Ludovic.barre <[email protected]>");
876876
MODULE_AUTHOR("Peter Griffin <[email protected]>");
877-
MODULE_ALIAS("platform: " DRIVER_NAME);
877+
MODULE_ALIAS("platform:" DRIVER_NAME);

drivers/dma/ti/k3-udma.c

Lines changed: 107 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -4535,45 +4535,60 @@ static int udma_setup_resources(struct udma_dev *ud)
45354535
rm_res = tisci_rm->rm_ranges[RM_RANGE_TCHAN];
45364536
if (IS_ERR(rm_res)) {
45374537
bitmap_zero(ud->tchan_map, ud->tchan_cnt);
4538+
irq_res.sets = 1;
45384539
} else {
45394540
bitmap_fill(ud->tchan_map, ud->tchan_cnt);
45404541
for (i = 0; i < rm_res->sets; i++)
45414542
udma_mark_resource_ranges(ud, ud->tchan_map,
45424543
&rm_res->desc[i], "tchan");
4544+
irq_res.sets = rm_res->sets;
45434545
}
4544-
irq_res.sets = rm_res->sets;
45454546

45464547
/* rchan and matching default flow ranges */
45474548
rm_res = tisci_rm->rm_ranges[RM_RANGE_RCHAN];
45484549
if (IS_ERR(rm_res)) {
45494550
bitmap_zero(ud->rchan_map, ud->rchan_cnt);
4551+
irq_res.sets++;
45504552
} else {
45514553
bitmap_fill(ud->rchan_map, ud->rchan_cnt);
45524554
for (i = 0; i < rm_res->sets; i++)
45534555
udma_mark_resource_ranges(ud, ud->rchan_map,
45544556
&rm_res->desc[i], "rchan");
4557+
irq_res.sets += rm_res->sets;
45554558
}
45564559

4557-
irq_res.sets += rm_res->sets;
45584560
irq_res.desc = kcalloc(irq_res.sets, sizeof(*irq_res.desc), GFP_KERNEL);
4561+
if (!irq_res.desc)
4562+
return -ENOMEM;
45594563
rm_res = tisci_rm->rm_ranges[RM_RANGE_TCHAN];
4560-
for (i = 0; i < rm_res->sets; i++) {
4561-
irq_res.desc[i].start = rm_res->desc[i].start;
4562-
irq_res.desc[i].num = rm_res->desc[i].num;
4563-
irq_res.desc[i].start_sec = rm_res->desc[i].start_sec;
4564-
irq_res.desc[i].num_sec = rm_res->desc[i].num_sec;
4564+
if (IS_ERR(rm_res)) {
4565+
irq_res.desc[0].start = 0;
4566+
irq_res.desc[0].num = ud->tchan_cnt;
4567+
i = 1;
4568+
} else {
4569+
for (i = 0; i < rm_res->sets; i++) {
4570+
irq_res.desc[i].start = rm_res->desc[i].start;
4571+
irq_res.desc[i].num = rm_res->desc[i].num;
4572+
irq_res.desc[i].start_sec = rm_res->desc[i].start_sec;
4573+
irq_res.desc[i].num_sec = rm_res->desc[i].num_sec;
4574+
}
45654575
}
45664576
rm_res = tisci_rm->rm_ranges[RM_RANGE_RCHAN];
4567-
for (j = 0; j < rm_res->sets; j++, i++) {
4568-
if (rm_res->desc[j].num) {
4569-
irq_res.desc[i].start = rm_res->desc[j].start +
4570-
ud->soc_data->oes.udma_rchan;
4571-
irq_res.desc[i].num = rm_res->desc[j].num;
4572-
}
4573-
if (rm_res->desc[j].num_sec) {
4574-
irq_res.desc[i].start_sec = rm_res->desc[j].start_sec +
4575-
ud->soc_data->oes.udma_rchan;
4576-
irq_res.desc[i].num_sec = rm_res->desc[j].num_sec;
4577+
if (IS_ERR(rm_res)) {
4578+
irq_res.desc[i].start = 0;
4579+
irq_res.desc[i].num = ud->rchan_cnt;
4580+
} else {
4581+
for (j = 0; j < rm_res->sets; j++, i++) {
4582+
if (rm_res->desc[j].num) {
4583+
irq_res.desc[i].start = rm_res->desc[j].start +
4584+
ud->soc_data->oes.udma_rchan;
4585+
irq_res.desc[i].num = rm_res->desc[j].num;
4586+
}
4587+
if (rm_res->desc[j].num_sec) {
4588+
irq_res.desc[i].start_sec = rm_res->desc[j].start_sec +
4589+
ud->soc_data->oes.udma_rchan;
4590+
irq_res.desc[i].num_sec = rm_res->desc[j].num_sec;
4591+
}
45774592
}
45784593
}
45794594
ret = ti_sci_inta_msi_domain_alloc_irqs(ud->dev, &irq_res);
@@ -4691,77 +4706,104 @@ static int bcdma_setup_resources(struct udma_dev *ud)
46914706
rm_res = tisci_rm->rm_ranges[RM_RANGE_BCHAN];
46924707
if (IS_ERR(rm_res)) {
46934708
bitmap_zero(ud->bchan_map, ud->bchan_cnt);
4709+
irq_res.sets++;
46944710
} else {
46954711
bitmap_fill(ud->bchan_map, ud->bchan_cnt);
46964712
for (i = 0; i < rm_res->sets; i++)
46974713
udma_mark_resource_ranges(ud, ud->bchan_map,
46984714
&rm_res->desc[i],
46994715
"bchan");
4716+
irq_res.sets += rm_res->sets;
47004717
}
4701-
irq_res.sets += rm_res->sets;
47024718
}
47034719

47044720
/* tchan ranges */
47054721
if (ud->tchan_cnt) {
47064722
rm_res = tisci_rm->rm_ranges[RM_RANGE_TCHAN];
47074723
if (IS_ERR(rm_res)) {
47084724
bitmap_zero(ud->tchan_map, ud->tchan_cnt);
4725+
irq_res.sets += 2;
47094726
} else {
47104727
bitmap_fill(ud->tchan_map, ud->tchan_cnt);
47114728
for (i = 0; i < rm_res->sets; i++)
47124729
udma_mark_resource_ranges(ud, ud->tchan_map,
47134730
&rm_res->desc[i],
47144731
"tchan");
4732+
irq_res.sets += rm_res->sets * 2;
47154733
}
4716-
irq_res.sets += rm_res->sets * 2;
47174734
}
47184735

47194736
/* rchan ranges */
47204737
if (ud->rchan_cnt) {
47214738
rm_res = tisci_rm->rm_ranges[RM_RANGE_RCHAN];
47224739
if (IS_ERR(rm_res)) {
47234740
bitmap_zero(ud->rchan_map, ud->rchan_cnt);
4741+
irq_res.sets += 2;
47244742
} else {
47254743
bitmap_fill(ud->rchan_map, ud->rchan_cnt);
47264744
for (i = 0; i < rm_res->sets; i++)
47274745
udma_mark_resource_ranges(ud, ud->rchan_map,
47284746
&rm_res->desc[i],
47294747
"rchan");
4748+
irq_res.sets += rm_res->sets * 2;
47304749
}
4731-
irq_res.sets += rm_res->sets * 2;
47324750
}
47334751

47344752
irq_res.desc = kcalloc(irq_res.sets, sizeof(*irq_res.desc), GFP_KERNEL);
4753+
if (!irq_res.desc)
4754+
return -ENOMEM;
47354755
if (ud->bchan_cnt) {
47364756
rm_res = tisci_rm->rm_ranges[RM_RANGE_BCHAN];
4737-
for (i = 0; i < rm_res->sets; i++) {
4738-
irq_res.desc[i].start = rm_res->desc[i].start +
4739-
oes->bcdma_bchan_ring;
4740-
irq_res.desc[i].num = rm_res->desc[i].num;
4757+
if (IS_ERR(rm_res)) {
4758+
irq_res.desc[0].start = oes->bcdma_bchan_ring;
4759+
irq_res.desc[0].num = ud->bchan_cnt;
4760+
i = 1;
4761+
} else {
4762+
for (i = 0; i < rm_res->sets; i++) {
4763+
irq_res.desc[i].start = rm_res->desc[i].start +
4764+
oes->bcdma_bchan_ring;
4765+
irq_res.desc[i].num = rm_res->desc[i].num;
4766+
}
47414767
}
47424768
}
47434769
if (ud->tchan_cnt) {
47444770
rm_res = tisci_rm->rm_ranges[RM_RANGE_TCHAN];
4745-
for (j = 0; j < rm_res->sets; j++, i += 2) {
4746-
irq_res.desc[i].start = rm_res->desc[j].start +
4747-
oes->bcdma_tchan_data;
4748-
irq_res.desc[i].num = rm_res->desc[j].num;
4749-
4750-
irq_res.desc[i + 1].start = rm_res->desc[j].start +
4751-
oes->bcdma_tchan_ring;
4752-
irq_res.desc[i + 1].num = rm_res->desc[j].num;
4771+
if (IS_ERR(rm_res)) {
4772+
irq_res.desc[i].start = oes->bcdma_tchan_data;
4773+
irq_res.desc[i].num = ud->tchan_cnt;
4774+
irq_res.desc[i + 1].start = oes->bcdma_tchan_ring;
4775+
irq_res.desc[i + 1].num = ud->tchan_cnt;
4776+
i += 2;
4777+
} else {
4778+
for (j = 0; j < rm_res->sets; j++, i += 2) {
4779+
irq_res.desc[i].start = rm_res->desc[j].start +
4780+
oes->bcdma_tchan_data;
4781+
irq_res.desc[i].num = rm_res->desc[j].num;
4782+
4783+
irq_res.desc[i + 1].start = rm_res->desc[j].start +
4784+
oes->bcdma_tchan_ring;
4785+
irq_res.desc[i + 1].num = rm_res->desc[j].num;
4786+
}
47534787
}
47544788
}
47554789
if (ud->rchan_cnt) {
47564790
rm_res = tisci_rm->rm_ranges[RM_RANGE_RCHAN];
4757-
for (j = 0; j < rm_res->sets; j++, i += 2) {
4758-
irq_res.desc[i].start = rm_res->desc[j].start +
4759-
oes->bcdma_rchan_data;
4760-
irq_res.desc[i].num = rm_res->desc[j].num;
4761-
4762-
irq_res.desc[i + 1].start = rm_res->desc[j].start +
4763-
oes->bcdma_rchan_ring;
4764-
irq_res.desc[i + 1].num = rm_res->desc[j].num;
4791+
if (IS_ERR(rm_res)) {
4792+
irq_res.desc[i].start = oes->bcdma_rchan_data;
4793+
irq_res.desc[i].num = ud->rchan_cnt;
4794+
irq_res.desc[i + 1].start = oes->bcdma_rchan_ring;
4795+
irq_res.desc[i + 1].num = ud->rchan_cnt;
4796+
i += 2;
4797+
} else {
4798+
for (j = 0; j < rm_res->sets; j++, i += 2) {
4799+
irq_res.desc[i].start = rm_res->desc[j].start +
4800+
oes->bcdma_rchan_data;
4801+
irq_res.desc[i].num = rm_res->desc[j].num;
4802+
4803+
irq_res.desc[i + 1].start = rm_res->desc[j].start +
4804+
oes->bcdma_rchan_ring;
4805+
irq_res.desc[i + 1].num = rm_res->desc[j].num;
4806+
}
47654807
}
47664808
}
47674809

@@ -4859,39 +4901,54 @@ static int pktdma_setup_resources(struct udma_dev *ud)
48594901
if (IS_ERR(rm_res)) {
48604902
/* all rflows are assigned exclusively to Linux */
48614903
bitmap_zero(ud->rflow_in_use, ud->rflow_cnt);
4904+
irq_res.sets = 1;
48624905
} else {
48634906
bitmap_fill(ud->rflow_in_use, ud->rflow_cnt);
48644907
for (i = 0; i < rm_res->sets; i++)
48654908
udma_mark_resource_ranges(ud, ud->rflow_in_use,
48664909
&rm_res->desc[i], "rflow");
4910+
irq_res.sets = rm_res->sets;
48674911
}
4868-
irq_res.sets = rm_res->sets;
48694912

48704913
/* tflow ranges */
48714914
rm_res = tisci_rm->rm_ranges[RM_RANGE_TFLOW];
48724915
if (IS_ERR(rm_res)) {
48734916
/* all tflows are assigned exclusively to Linux */
48744917
bitmap_zero(ud->tflow_map, ud->tflow_cnt);
4918+
irq_res.sets++;
48754919
} else {
48764920
bitmap_fill(ud->tflow_map, ud->tflow_cnt);
48774921
for (i = 0; i < rm_res->sets; i++)
48784922
udma_mark_resource_ranges(ud, ud->tflow_map,
48794923
&rm_res->desc[i], "tflow");
4924+
irq_res.sets += rm_res->sets;
48804925
}
4881-
irq_res.sets += rm_res->sets;
48824926

48834927
irq_res.desc = kcalloc(irq_res.sets, sizeof(*irq_res.desc), GFP_KERNEL);
4928+
if (!irq_res.desc)
4929+
return -ENOMEM;
48844930
rm_res = tisci_rm->rm_ranges[RM_RANGE_TFLOW];
4885-
for (i = 0; i < rm_res->sets; i++) {
4886-
irq_res.desc[i].start = rm_res->desc[i].start +
4887-
oes->pktdma_tchan_flow;
4888-
irq_res.desc[i].num = rm_res->desc[i].num;
4931+
if (IS_ERR(rm_res)) {
4932+
irq_res.desc[0].start = oes->pktdma_tchan_flow;
4933+
irq_res.desc[0].num = ud->tflow_cnt;
4934+
i = 1;
4935+
} else {
4936+
for (i = 0; i < rm_res->sets; i++) {
4937+
irq_res.desc[i].start = rm_res->desc[i].start +
4938+
oes->pktdma_tchan_flow;
4939+
irq_res.desc[i].num = rm_res->desc[i].num;
4940+
}
48894941
}
48904942
rm_res = tisci_rm->rm_ranges[RM_RANGE_RFLOW];
4891-
for (j = 0; j < rm_res->sets; j++, i++) {
4892-
irq_res.desc[i].start = rm_res->desc[j].start +
4893-
oes->pktdma_rchan_flow;
4894-
irq_res.desc[i].num = rm_res->desc[j].num;
4943+
if (IS_ERR(rm_res)) {
4944+
irq_res.desc[i].start = oes->pktdma_rchan_flow;
4945+
irq_res.desc[i].num = ud->rflow_cnt;
4946+
} else {
4947+
for (j = 0; j < rm_res->sets; j++, i++) {
4948+
irq_res.desc[i].start = rm_res->desc[j].start +
4949+
oes->pktdma_rchan_flow;
4950+
irq_res.desc[i].num = rm_res->desc[j].num;
4951+
}
48954952
}
48964953
ret = ti_sci_inta_msi_domain_alloc_irqs(ud->dev, &irq_res);
48974954
kfree(irq_res.desc);

0 commit comments

Comments
 (0)