1 /* 2 * Enhanced Direct Memory Access (EDMA3) Controller 3 * 4 * (C) Copyright 2014 5 * Texas Instruments Incorporated, <www.ti.com> 6 * 7 * Author: Ivan Khoronzhuk <ivan.khoronzhuk@ti.com> 8 * 9 * SPDX-License-Identifier: GPL-2.0+ 10 */ 11 12 #include <asm/io.h> 13 #include <common.h> 14 #include <dma.h> 15 #include <dm/device.h> 16 #include <asm/omap_common.h> 17 #include <asm/ti-common/ti-edma3.h> 18 19 #define EDMA3_SL_BASE(slot) (0x4000 + ((slot) << 5)) 20 #define EDMA3_SL_MAX_NUM 512 21 #define EDMA3_SLOPT_FIFO_WIDTH_MASK (0x7 << 8) 22 23 #define EDMA3_QCHMAP(ch) 0x0200 + ((ch) << 2) 24 #define EDMA3_CHMAP_PARSET_MASK 0x1ff 25 #define EDMA3_CHMAP_PARSET_SHIFT 0x5 26 #define EDMA3_CHMAP_TRIGWORD_SHIFT 0x2 27 28 #define EDMA3_QEMCR 0x314 29 #define EDMA3_IPR 0x1068 30 #define EDMA3_IPRH 0x106c 31 #define EDMA3_ICR 0x1070 32 #define EDMA3_ICRH 0x1074 33 #define EDMA3_QEECR 0x1088 34 #define EDMA3_QEESR 0x108c 35 #define EDMA3_QSECR 0x1094 36 37 struct ti_edma3_priv { 38 u32 base; 39 }; 40 41 /** 42 * qedma3_start - start qdma on a channel 43 * @base: base address of edma 44 * @cfg: pinter to struct edma3_channel_config where you can set 45 * the slot number to associate with, the chnum, which corresponds 46 * your quick channel number 0-7, complete code - transfer complete code 47 * and trigger slot word - which has to correspond to the word number in 48 * edma3_slot_layout struct for generating event. 49 * 50 */ 51 void qedma3_start(u32 base, struct edma3_channel_config *cfg) 52 { 53 u32 qchmap; 54 55 /* Clear the pending int bit */ 56 if (cfg->complete_code < 32) 57 __raw_writel(1 << cfg->complete_code, base + EDMA3_ICR); 58 else 59 __raw_writel(1 << cfg->complete_code, base + EDMA3_ICRH); 60 61 /* Map parameter set and trigger word 7 to quick channel */ 62 qchmap = ((EDMA3_CHMAP_PARSET_MASK & cfg->slot) 63 << EDMA3_CHMAP_PARSET_SHIFT) | 64 (cfg->trigger_slot_word << EDMA3_CHMAP_TRIGWORD_SHIFT); 65 66 __raw_writel(qchmap, base + EDMA3_QCHMAP(cfg->chnum)); 67 68 /* Clear missed event if set*/ 69 __raw_writel(1 << cfg->chnum, base + EDMA3_QSECR); 70 __raw_writel(1 << cfg->chnum, base + EDMA3_QEMCR); 71 72 /* Enable qdma channel event */ 73 __raw_writel(1 << cfg->chnum, base + EDMA3_QEESR); 74 } 75 76 /** 77 * edma3_set_dest - set initial DMA destination address in parameter RAM slot 78 * @base: base address of edma 79 * @slot: parameter RAM slot being configured 80 * @dst: physical address of destination (memory, controller FIFO, etc) 81 * @addressMode: INCR, except in very rare cases 82 * @width: ignored unless @addressMode is FIFO, else specifies the 83 * width to use when addressing the fifo (e.g. W8BIT, W32BIT) 84 * 85 * Note that the destination address is modified during the DMA transfer 86 * according to edma3_set_dest_index(). 87 */ 88 void edma3_set_dest(u32 base, int slot, u32 dst, enum edma3_address_mode mode, 89 enum edma3_fifo_width width) 90 { 91 u32 opt; 92 struct edma3_slot_layout *rg; 93 94 rg = (struct edma3_slot_layout *)(base + EDMA3_SL_BASE(slot)); 95 96 opt = __raw_readl(&rg->opt); 97 if (mode == FIFO) 98 opt = (opt & EDMA3_SLOPT_FIFO_WIDTH_MASK) | 99 (EDMA3_SLOPT_DST_ADDR_CONST_MODE | 100 EDMA3_SLOPT_FIFO_WIDTH_SET(width)); 101 else 102 opt &= ~EDMA3_SLOPT_DST_ADDR_CONST_MODE; 103 104 __raw_writel(opt, &rg->opt); 105 __raw_writel(dst, &rg->dst); 106 } 107 108 /** 109 * edma3_set_dest_index - configure DMA destination address indexing 110 * @base: base address of edma 111 * @slot: parameter RAM slot being configured 112 * @bidx: byte offset between destination arrays in a frame 113 * @cidx: byte offset between destination frames in a block 114 * 115 * Offsets are specified to support either contiguous or discontiguous 116 * memory transfers, or repeated access to a hardware register, as needed. 117 * When accessing hardware registers, both offsets are normally zero. 118 */ 119 void edma3_set_dest_index(u32 base, unsigned slot, int bidx, int cidx) 120 { 121 u32 src_dst_bidx; 122 u32 src_dst_cidx; 123 struct edma3_slot_layout *rg; 124 125 rg = (struct edma3_slot_layout *)(base + EDMA3_SL_BASE(slot)); 126 127 src_dst_bidx = __raw_readl(&rg->src_dst_bidx); 128 src_dst_cidx = __raw_readl(&rg->src_dst_cidx); 129 130 __raw_writel((src_dst_bidx & 0x0000ffff) | (bidx << 16), 131 &rg->src_dst_bidx); 132 __raw_writel((src_dst_cidx & 0x0000ffff) | (cidx << 16), 133 &rg->src_dst_cidx); 134 } 135 136 /** 137 * edma3_set_dest_addr - set destination address for slot only 138 */ 139 void edma3_set_dest_addr(u32 base, int slot, u32 dst) 140 { 141 struct edma3_slot_layout *rg; 142 143 rg = (struct edma3_slot_layout *)(base + EDMA3_SL_BASE(slot)); 144 __raw_writel(dst, &rg->dst); 145 } 146 147 /** 148 * edma3_set_src - set initial DMA source address in parameter RAM slot 149 * @base: base address of edma 150 * @slot: parameter RAM slot being configured 151 * @src_port: physical address of source (memory, controller FIFO, etc) 152 * @mode: INCR, except in very rare cases 153 * @width: ignored unless @addressMode is FIFO, else specifies the 154 * width to use when addressing the fifo (e.g. W8BIT, W32BIT) 155 * 156 * Note that the source address is modified during the DMA transfer 157 * according to edma3_set_src_index(). 158 */ 159 void edma3_set_src(u32 base, int slot, u32 src, enum edma3_address_mode mode, 160 enum edma3_fifo_width width) 161 { 162 u32 opt; 163 struct edma3_slot_layout *rg; 164 165 rg = (struct edma3_slot_layout *)(base + EDMA3_SL_BASE(slot)); 166 167 opt = __raw_readl(&rg->opt); 168 if (mode == FIFO) 169 opt = (opt & EDMA3_SLOPT_FIFO_WIDTH_MASK) | 170 (EDMA3_SLOPT_DST_ADDR_CONST_MODE | 171 EDMA3_SLOPT_FIFO_WIDTH_SET(width)); 172 else 173 opt &= ~EDMA3_SLOPT_DST_ADDR_CONST_MODE; 174 175 __raw_writel(opt, &rg->opt); 176 __raw_writel(src, &rg->src); 177 } 178 179 /** 180 * edma3_set_src_index - configure DMA source address indexing 181 * @base: base address of edma 182 * @slot: parameter RAM slot being configured 183 * @bidx: byte offset between source arrays in a frame 184 * @cidx: byte offset between source frames in a block 185 * 186 * Offsets are specified to support either contiguous or discontiguous 187 * memory transfers, or repeated access to a hardware register, as needed. 188 * When accessing hardware registers, both offsets are normally zero. 189 */ 190 void edma3_set_src_index(u32 base, unsigned slot, int bidx, int cidx) 191 { 192 u32 src_dst_bidx; 193 u32 src_dst_cidx; 194 struct edma3_slot_layout *rg; 195 196 rg = (struct edma3_slot_layout *)(base + EDMA3_SL_BASE(slot)); 197 198 src_dst_bidx = __raw_readl(&rg->src_dst_bidx); 199 src_dst_cidx = __raw_readl(&rg->src_dst_cidx); 200 201 __raw_writel((src_dst_bidx & 0xffff0000) | bidx, 202 &rg->src_dst_bidx); 203 __raw_writel((src_dst_cidx & 0xffff0000) | cidx, 204 &rg->src_dst_cidx); 205 } 206 207 /** 208 * edma3_set_src_addr - set source address for slot only 209 */ 210 void edma3_set_src_addr(u32 base, int slot, u32 src) 211 { 212 struct edma3_slot_layout *rg; 213 214 rg = (struct edma3_slot_layout *)(base + EDMA3_SL_BASE(slot)); 215 __raw_writel(src, &rg->src); 216 } 217 218 /** 219 * edma3_set_transfer_params - configure DMA transfer parameters 220 * @base: base address of edma 221 * @slot: parameter RAM slot being configured 222 * @acnt: how many bytes per array (at least one) 223 * @bcnt: how many arrays per frame (at least one) 224 * @ccnt: how many frames per block (at least one) 225 * @bcnt_rld: used only for A-Synchronized transfers; this specifies 226 * the value to reload into bcnt when it decrements to zero 227 * @sync_mode: ASYNC or ABSYNC 228 * 229 * See the EDMA3 documentation to understand how to configure and link 230 * transfers using the fields in PaRAM slots. If you are not doing it 231 * all at once with edma3_write_slot(), you will use this routine 232 * plus two calls each for source and destination, setting the initial 233 * address and saying how to index that address. 234 * 235 * An example of an A-Synchronized transfer is a serial link using a 236 * single word shift register. In that case, @acnt would be equal to 237 * that word size; the serial controller issues a DMA synchronization 238 * event to transfer each word, and memory access by the DMA transfer 239 * controller will be word-at-a-time. 240 * 241 * An example of an AB-Synchronized transfer is a device using a FIFO. 242 * In that case, @acnt equals the FIFO width and @bcnt equals its depth. 243 * The controller with the FIFO issues DMA synchronization events when 244 * the FIFO threshold is reached, and the DMA transfer controller will 245 * transfer one frame to (or from) the FIFO. It will probably use 246 * efficient burst modes to access memory. 247 */ 248 void edma3_set_transfer_params(u32 base, int slot, int acnt, 249 int bcnt, int ccnt, u16 bcnt_rld, 250 enum edma3_sync_dimension sync_mode) 251 { 252 u32 opt; 253 u32 link_bcntrld; 254 struct edma3_slot_layout *rg; 255 256 rg = (struct edma3_slot_layout *)(base + EDMA3_SL_BASE(slot)); 257 258 link_bcntrld = __raw_readl(&rg->link_bcntrld); 259 260 __raw_writel((bcnt_rld << 16) | (0x0000ffff & link_bcntrld), 261 &rg->link_bcntrld); 262 263 opt = __raw_readl(&rg->opt); 264 if (sync_mode == ASYNC) 265 __raw_writel(opt & ~EDMA3_SLOPT_AB_SYNC, &rg->opt); 266 else 267 __raw_writel(opt | EDMA3_SLOPT_AB_SYNC, &rg->opt); 268 269 /* Set the acount, bcount, ccount registers */ 270 __raw_writel((bcnt << 16) | (acnt & 0xffff), &rg->a_b_cnt); 271 __raw_writel(0xffff & ccnt, &rg->ccnt); 272 } 273 274 /** 275 * edma3_write_slot - write parameter RAM data for slot 276 * @base: base address of edma 277 * @slot: number of parameter RAM slot being modified 278 * @param: data to be written into parameter RAM slot 279 * 280 * Use this to assign all parameters of a transfer at once. This 281 * allows more efficient setup of transfers than issuing multiple 282 * calls to set up those parameters in small pieces, and provides 283 * complete control over all transfer options. 284 */ 285 void edma3_write_slot(u32 base, int slot, struct edma3_slot_layout *param) 286 { 287 int i; 288 u32 *p = (u32 *)param; 289 u32 *addr = (u32 *)(base + EDMA3_SL_BASE(slot)); 290 291 for (i = 0; i < sizeof(struct edma3_slot_layout)/4; i += 4) 292 __raw_writel(*p++, addr++); 293 } 294 295 /** 296 * edma3_read_slot - read parameter RAM data from slot 297 * @base: base address of edma 298 * @slot: number of parameter RAM slot being copied 299 * @param: where to store copy of parameter RAM data 300 * 301 * Use this to read data from a parameter RAM slot, perhaps to 302 * save them as a template for later reuse. 303 */ 304 void edma3_read_slot(u32 base, int slot, struct edma3_slot_layout *param) 305 { 306 int i; 307 u32 *p = (u32 *)param; 308 u32 *addr = (u32 *)(base + EDMA3_SL_BASE(slot)); 309 310 for (i = 0; i < sizeof(struct edma3_slot_layout)/4; i += 4) 311 *p++ = __raw_readl(addr++); 312 } 313 314 void edma3_slot_configure(u32 base, int slot, struct edma3_slot_config *cfg) 315 { 316 struct edma3_slot_layout *rg; 317 318 rg = (struct edma3_slot_layout *)(base + EDMA3_SL_BASE(slot)); 319 320 __raw_writel(cfg->opt, &rg->opt); 321 __raw_writel(cfg->src, &rg->src); 322 __raw_writel((cfg->bcnt << 16) | (cfg->acnt & 0xffff), &rg->a_b_cnt); 323 __raw_writel(cfg->dst, &rg->dst); 324 __raw_writel((cfg->dst_bidx << 16) | 325 (cfg->src_bidx & 0xffff), &rg->src_dst_bidx); 326 __raw_writel((cfg->bcntrld << 16) | 327 (cfg->link & 0xffff), &rg->link_bcntrld); 328 __raw_writel((cfg->dst_cidx << 16) | 329 (cfg->src_cidx & 0xffff), &rg->src_dst_cidx); 330 __raw_writel(0xffff & cfg->ccnt, &rg->ccnt); 331 } 332 333 /** 334 * edma3_check_for_transfer - check if transfer coplete by checking 335 * interrupt pending bit. Clear interrupt pending bit if complete. 336 * @base: base address of edma 337 * @cfg: pinter to struct edma3_channel_config which was passed 338 * to qedma3_start when you started qdma channel 339 * 340 * Return 0 if complete, 1 if not. 341 */ 342 int edma3_check_for_transfer(u32 base, struct edma3_channel_config *cfg) 343 { 344 u32 inum; 345 u32 ipr_base; 346 u32 icr_base; 347 348 if (cfg->complete_code < 32) { 349 ipr_base = base + EDMA3_IPR; 350 icr_base = base + EDMA3_ICR; 351 inum = 1 << cfg->complete_code; 352 } else { 353 ipr_base = base + EDMA3_IPRH; 354 icr_base = base + EDMA3_ICRH; 355 inum = 1 << (cfg->complete_code - 32); 356 } 357 358 /* check complete interrupt */ 359 if (!(__raw_readl(ipr_base) & inum)) 360 return 1; 361 362 /* clean up the pending int bit */ 363 __raw_writel(inum, icr_base); 364 365 return 0; 366 } 367 368 /** 369 * qedma3_stop - stops dma on the channel passed 370 * @base: base address of edma 371 * @cfg: pinter to struct edma3_channel_config which was passed 372 * to qedma3_start when you started qdma channel 373 */ 374 void qedma3_stop(u32 base, struct edma3_channel_config *cfg) 375 { 376 /* Disable qdma channel event */ 377 __raw_writel(1 << cfg->chnum, base + EDMA3_QEECR); 378 379 /* clean up the interrupt indication */ 380 if (cfg->complete_code < 32) 381 __raw_writel(1 << cfg->complete_code, base + EDMA3_ICR); 382 else 383 __raw_writel(1 << cfg->complete_code, base + EDMA3_ICRH); 384 385 /* Clear missed event if set*/ 386 __raw_writel(1 << cfg->chnum, base + EDMA3_QSECR); 387 __raw_writel(1 << cfg->chnum, base + EDMA3_QEMCR); 388 389 /* Clear the channel map */ 390 __raw_writel(0, base + EDMA3_QCHMAP(cfg->chnum)); 391 } 392 393 void __edma3_transfer(unsigned long edma3_base_addr, unsigned int edma_slot_num, 394 void *dst, void *src, size_t len) 395 { 396 struct edma3_slot_config slot; 397 struct edma3_channel_config edma_channel; 398 int b_cnt_value = 1; 399 int rem_bytes = 0; 400 int a_cnt_value = len; 401 unsigned int addr = (unsigned int) (dst); 402 unsigned int max_acnt = 0x7FFFU; 403 404 if (len > max_acnt) { 405 b_cnt_value = (len / max_acnt); 406 rem_bytes = (len % max_acnt); 407 a_cnt_value = max_acnt; 408 } 409 410 slot.opt = 0; 411 slot.src = ((unsigned int) src); 412 slot.acnt = a_cnt_value; 413 slot.bcnt = b_cnt_value; 414 slot.ccnt = 1; 415 slot.src_bidx = a_cnt_value; 416 slot.dst_bidx = a_cnt_value; 417 slot.src_cidx = 0; 418 slot.dst_cidx = 0; 419 slot.link = EDMA3_PARSET_NULL_LINK; 420 slot.bcntrld = 0; 421 slot.opt = EDMA3_SLOPT_TRANS_COMP_INT_ENB | 422 EDMA3_SLOPT_COMP_CODE(0) | 423 EDMA3_SLOPT_STATIC | EDMA3_SLOPT_AB_SYNC; 424 425 edma3_slot_configure(edma3_base_addr, edma_slot_num, &slot); 426 edma_channel.slot = edma_slot_num; 427 edma_channel.chnum = 0; 428 edma_channel.complete_code = 0; 429 /* set event trigger to dst update */ 430 edma_channel.trigger_slot_word = EDMA3_TWORD(dst); 431 432 qedma3_start(edma3_base_addr, &edma_channel); 433 edma3_set_dest_addr(edma3_base_addr, edma_channel.slot, addr); 434 435 while (edma3_check_for_transfer(edma3_base_addr, &edma_channel)) 436 ; 437 qedma3_stop(edma3_base_addr, &edma_channel); 438 439 if (rem_bytes != 0) { 440 slot.opt = 0; 441 slot.src = 442 (b_cnt_value * max_acnt) + ((unsigned int) src); 443 slot.acnt = rem_bytes; 444 slot.bcnt = 1; 445 slot.ccnt = 1; 446 slot.src_bidx = rem_bytes; 447 slot.dst_bidx = rem_bytes; 448 slot.src_cidx = 0; 449 slot.dst_cidx = 0; 450 slot.link = EDMA3_PARSET_NULL_LINK; 451 slot.bcntrld = 0; 452 slot.opt = EDMA3_SLOPT_TRANS_COMP_INT_ENB | 453 EDMA3_SLOPT_COMP_CODE(0) | 454 EDMA3_SLOPT_STATIC | EDMA3_SLOPT_AB_SYNC; 455 edma3_slot_configure(edma3_base_addr, edma_slot_num, &slot); 456 edma_channel.slot = edma_slot_num; 457 edma_channel.chnum = 0; 458 edma_channel.complete_code = 0; 459 /* set event trigger to dst update */ 460 edma_channel.trigger_slot_word = EDMA3_TWORD(dst); 461 462 qedma3_start(edma3_base_addr, &edma_channel); 463 edma3_set_dest_addr(edma3_base_addr, edma_channel.slot, addr + 464 (max_acnt * b_cnt_value)); 465 while (edma3_check_for_transfer(edma3_base_addr, &edma_channel)) 466 ; 467 qedma3_stop(edma3_base_addr, &edma_channel); 468 } 469 } 470 471 #ifndef CONFIG_DMA 472 473 void edma3_transfer(unsigned long edma3_base_addr, unsigned int edma_slot_num, 474 void *dst, void *src, size_t len) 475 { 476 __edma3_transfer(edma3_base_addr, edma_slot_num, dst, src, len); 477 } 478 479 #else 480 481 static int ti_edma3_transfer(struct udevice *dev, int direction, void *dst, 482 void *src, size_t len) 483 { 484 struct ti_edma3_priv *priv = dev_get_priv(dev); 485 486 /* enable edma3 clocks */ 487 enable_edma3_clocks(); 488 489 switch (direction) { 490 case DMA_MEM_TO_MEM: 491 __edma3_transfer(priv->base, 1, dst, src, len); 492 break; 493 default: 494 error("Transfer type not implemented in DMA driver\n"); 495 break; 496 } 497 498 /* disable edma3 clocks */ 499 disable_edma3_clocks(); 500 501 return 0; 502 } 503 504 static int ti_edma3_ofdata_to_platdata(struct udevice *dev) 505 { 506 struct ti_edma3_priv *priv = dev_get_priv(dev); 507 508 priv->base = dev_get_addr(dev); 509 510 return 0; 511 } 512 513 static int ti_edma3_probe(struct udevice *dev) 514 { 515 struct dma_dev_priv *uc_priv = dev_get_uclass_priv(dev); 516 517 uc_priv->supported = DMA_SUPPORTS_MEM_TO_MEM; 518 519 return 0; 520 } 521 522 static const struct dma_ops ti_edma3_ops = { 523 .transfer = ti_edma3_transfer, 524 }; 525 526 static const struct udevice_id ti_edma3_ids[] = { 527 { .compatible = "ti,edma3" }, 528 { } 529 }; 530 531 U_BOOT_DRIVER(ti_edma3) = { 532 .name = "ti_edma3", 533 .id = UCLASS_DMA, 534 .of_match = ti_edma3_ids, 535 .ops = &ti_edma3_ops, 536 .ofdata_to_platdata = ti_edma3_ofdata_to_platdata, 537 .probe = ti_edma3_probe, 538 .priv_auto_alloc_size = sizeof(struct ti_edma3_priv), 539 }; 540 #endif /* CONFIG_DMA */ 541