Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

dmaengine: ti: k3-udma: Add support for second resource range from sysfw

Resource allocation via sysfw can use up to two ranges per resource subtype
to support more complex resource assignment, mainly for DMA channels.

Take the second range also into consideration when setting up the maps for
available resources.

Signed-off-by: Peter Ujfalusi <peter.ujfalusi@ti.com>
Link: https://lore.kernel.org/r/20201208090440.31792-4-peter.ujfalusi@ti.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>

authored by

Peter Ujfalusi and committed by
Vinod Koul
1609c15a 5e1cb1cb

+31 -24
+31 -24
drivers/dma/ti/k3-udma.c
··· 3174 3174 return 0; 3175 3175 } 3176 3176 3177 + static void udma_mark_resource_ranges(struct udma_dev *ud, unsigned long *map, 3178 + struct ti_sci_resource_desc *rm_desc, 3179 + char *name) 3180 + { 3181 + bitmap_clear(map, rm_desc->start, rm_desc->num); 3182 + bitmap_clear(map, rm_desc->start_sec, rm_desc->num_sec); 3183 + dev_dbg(ud->dev, "ti_sci resource range for %s: %d:%d | %d:%d\n", name, 3184 + rm_desc->start, rm_desc->num, rm_desc->start_sec, 3185 + rm_desc->num_sec); 3186 + } 3187 + 3177 3188 static int udma_setup_resources(struct udma_dev *ud) 3178 3189 { 3179 3190 struct device *dev = ud->dev; 3180 3191 int ch_count, ret, i, j; 3181 3192 u32 cap2, cap3; 3182 - struct ti_sci_resource_desc *rm_desc; 3183 3193 struct ti_sci_resource *rm_res, irq_res; 3184 3194 struct udma_tisci_rm *tisci_rm = &ud->tisci_rm; 3185 3195 static const char * const range_names[] = { "ti,sci-rm-range-tchan", ··· 3274 3264 bitmap_zero(ud->tchan_map, ud->tchan_cnt); 3275 3265 } else { 3276 3266 bitmap_fill(ud->tchan_map, ud->tchan_cnt); 3277 - for (i = 0; i < rm_res->sets; i++) { 3278 - rm_desc = &rm_res->desc[i]; 3279 - bitmap_clear(ud->tchan_map, rm_desc->start, 3280 - rm_desc->num); 3281 - dev_dbg(dev, "ti-sci-res: tchan: %d:%d\n", 3282 - rm_desc->start, rm_desc->num); 3283 - } 3267 + for (i = 0; i < rm_res->sets; i++) 3268 + udma_mark_resource_ranges(ud, ud->tchan_map, 3269 + &rm_res->desc[i], "tchan"); 3284 3270 } 3285 3271 irq_res.sets = rm_res->sets; 3286 3272 ··· 3286 3280 bitmap_zero(ud->rchan_map, ud->rchan_cnt); 3287 3281 } else { 3288 3282 bitmap_fill(ud->rchan_map, ud->rchan_cnt); 3289 - for (i = 0; i < rm_res->sets; i++) { 3290 - rm_desc = &rm_res->desc[i]; 3291 - bitmap_clear(ud->rchan_map, rm_desc->start, 3292 - rm_desc->num); 3293 - dev_dbg(dev, "ti-sci-res: rchan: %d:%d\n", 3294 - rm_desc->start, rm_desc->num); 3295 - } 3283 + for (i = 0; i < rm_res->sets; i++) 3284 + udma_mark_resource_ranges(ud, ud->rchan_map, 3285 + &rm_res->desc[i], "rchan"); 3296 3286 } 3297 3287 3298 3288 irq_res.sets += rm_res->sets; ··· 3297 3295 for (i = 0; i < rm_res->sets; i++) { 3298 3296 irq_res.desc[i].start = rm_res->desc[i].start; 3299 3297 irq_res.desc[i].num = rm_res->desc[i].num; 3298 + irq_res.desc[i].start_sec = rm_res->desc[i].start_sec; 3299 + irq_res.desc[i].num_sec = rm_res->desc[i].num_sec; 3300 3300 } 3301 3301 rm_res = tisci_rm->rm_ranges[RM_RANGE_RCHAN]; 3302 3302 for (j = 0; j < rm_res->sets; j++, i++) { 3303 - irq_res.desc[i].start = rm_res->desc[j].start + 3303 + if (rm_res->desc[j].num) { 3304 + irq_res.desc[i].start = rm_res->desc[j].start + 3304 3305 ud->soc_data->rchan_oes_offset; 3305 - irq_res.desc[i].num = rm_res->desc[j].num; 3306 + irq_res.desc[i].num = rm_res->desc[j].num; 3307 + } 3308 + if (rm_res->desc[j].num_sec) { 3309 + irq_res.desc[i].start_sec = rm_res->desc[j].start_sec + 3310 + ud->soc_data->rchan_oes_offset; 3311 + irq_res.desc[i].num_sec = rm_res->desc[j].num_sec; 3312 + } 3306 3313 } 3307 3314 ret = ti_sci_inta_msi_domain_alloc_irqs(ud->dev, &irq_res); 3308 3315 kfree(irq_res.desc); ··· 3327 3316 bitmap_clear(ud->rflow_gp_map, ud->rchan_cnt, 3328 3317 ud->rflow_cnt - ud->rchan_cnt); 3329 3318 } else { 3330 - for (i = 0; i < rm_res->sets; i++) { 3331 - rm_desc = &rm_res->desc[i]; 3332 - bitmap_clear(ud->rflow_gp_map, rm_desc->start, 3333 - rm_desc->num); 3334 - dev_dbg(dev, "ti-sci-res: rflow: %d:%d\n", 3335 - rm_desc->start, rm_desc->num); 3336 - } 3319 + for (i = 0; i < rm_res->sets; i++) 3320 + udma_mark_resource_ranges(ud, ud->rflow_gp_map, 3321 + &rm_res->desc[i], "gp-rflow"); 3337 3322 } 3338 3323 3339 3324 ch_count -= bitmap_weight(ud->tchan_map, ud->tchan_cnt);