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