1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 #ifndef _SYS_DDIDMAREQ_H 27 #define _SYS_DDIDMAREQ_H 28 29 #pragma ident "%Z%%M% %I% %E% SMI" 30 31 #ifdef __cplusplus 32 extern "C" { 33 #endif 34 35 /* 36 * Memory Objects 37 * 38 * Definitions of structures that can describe 39 * an object that can be mapped for DMA. 40 */ 41 42 /* 43 * Structure describing a virtual address 44 */ 45 struct v_address { 46 caddr_t v_addr; /* base virtual address */ 47 struct as *v_as; /* pointer to address space */ 48 void *v_priv; /* priv data for shadow I/O */ 49 }; 50 51 /* 52 * Structure describing a page-based address 53 */ 54 struct pp_address { 55 /* 56 * A pointer to a circularly linked list of page structures. 57 */ 58 struct page *pp_pp; 59 uint_t pp_offset; /* offset within first page */ 60 }; 61 62 /* 63 * Structure to describe a physical memory address. 64 */ 65 struct phy_address { 66 ulong_t p_addr; /* base physical address */ 67 ulong_t p_memtype; /* memory type */ 68 }; 69 70 /* 71 * A union of all of the above structures. 72 * 73 * This union describes the relationship between 74 * the kind of an address description and an object. 75 */ 76 typedef union { 77 struct v_address virt_obj; /* Some virtual address */ 78 struct pp_address pp_obj; /* Some page-based address */ 79 struct phy_address phys_obj; /* Some physical address */ 80 } ddi_dma_aobj_t; 81 82 /* 83 * DMA object types - used to select how the object 84 * being mapped is being addressed by the IU. 85 */ 86 typedef enum { 87 DMA_OTYP_VADDR = 0, /* enforce starting value of zero */ 88 DMA_OTYP_PAGES, 89 DMA_OTYP_PADDR, 90 DMA_OTYP_BUFVADDR 91 } ddi_dma_atyp_t; 92 93 /* 94 * A compact package to describe an object that is to be mapped for DMA. 95 */ 96 typedef struct { 97 uint_t dmao_size; /* size, in bytes, of the object */ 98 ddi_dma_atyp_t dmao_type; /* type of object */ 99 ddi_dma_aobj_t dmao_obj; /* the object described */ 100 } ddi_dma_obj_t; 101 102 /* 103 * DMA addressing limits. 104 * 105 * This structure describes the constraints that a particular device's 106 * DMA engine has to its parent so that the parent may correctly set 107 * things up for a DMA mapping. Each parent may in turn modify the 108 * constraints listed in a DMA request structure in order to describe 109 * to its parent any changed or additional constraints. The rules 110 * are that each parent may modify a constraint in order to further 111 * constrain things (e.g., picking a more limited address range than 112 * that permitted by the child), but that the parent may not ignore 113 * a child's constraints. 114 * 115 * A particular constraint that we do *not* address is whether or not 116 * a requested mapping is too large for a DMA engine's counter to 117 * correctly track. It is still up to each driver to explicitly handle 118 * transfers that are too large for its own hardware to deal with directly. 119 * 120 * The mapping routines that are cognizant of this structure will 121 * copy any user defined limits structure if they need to modify 122 * the fields (as alluded to above). 123 * 124 * A note as to how to define constraints: 125 * 126 * How you define the constraints for your device depends on how you 127 * define your device. For example, you may have an SBus card with a 128 * device on it that address only the bottom 16mb of virtual DMA space. 129 * However, if the card also has ancillary circuitry that pulls the high 8 130 * bits of address lines high, the more correct expression for your device 131 * is that it address [0xff000000..0xffffffff] rather than [0..0x00ffffff]. 132 */ 133 #if defined(__sparc) 134 typedef struct ddi_dma_lim { 135 136 /* 137 * Low range of 32 bit addressing capability. 138 */ 139 uint_t dlim_addr_lo; 140 141 /* 142 * Upper inclusive bound of addressing capability. It is an 143 * inclusive boundary limit to allow for the addressing range 144 * [0..0xffffffff] to be specified in preference to [0..0]. 145 */ 146 uint_t dlim_addr_hi; 147 148 /* 149 * Inclusive upper bound with which The DMA engine's counter acts as 150 * a register. 151 * 152 * This handles the case where an upper portion of a DMA address 153 * register is a latch instead of being a full 32 bit register 154 * (e.g., the upper 8 bits may remain constant while the lower 155 * 24 bits are the real address register). 156 * 157 * This essentially gives a hint about segment limitations 158 * to the mapping routines. 159 */ 160 uint_t dlim_cntr_max; 161 162 /* 163 * DMA burst sizes. 164 * 165 * At the time of a mapping request, this tag defines the possible 166 * DMA burst cycle sizes that the requestor's DMA engine can 167 * emit. The format of the data is binary encoding of burst sizes 168 * assumed to be powers of two. That is, if a DMA engine is capable 169 * of doing 1, 2, 4 and 16 byte transfers, the encoding would be 0x17. 170 * 171 * As the mapping request is handled by intervening nexi, the 172 * burstsizes value may be modified. Prior to enabling DMA for 173 * the specific device, the driver that owns the DMA engine should 174 * check (via ddi_dma_burstsizes(9F)) what the allowed burstsizes 175 * have become and program their DMA engine appropriately. 176 */ 177 uint_t dlim_burstsizes; 178 179 /* 180 * Minimum effective DMA transfer size, in units of bytes. 181 * 182 * This value specifies the minimum effective granularity of the 183 * DMA engine. It is distinct from dlim_burtsizes in that it 184 * describes the minimum amount of access a DMA transfer will 185 * effect. dlim_burtsizes describes in what electrical fashion 186 * the DMA engine might perform its accesses, while dlim_minxfer 187 * describes the minimum amount of memory that can be touched by 188 * the DMA transfer. 189 * 190 * As the mapping request is handled by intervening nexi, the 191 * dlim_minxfer value may be modifed contingent upon the presence 192 * (and use) of I/O caches and DMA write buffers in between the 193 * DMA engine and the object that DMA is being performed on. 194 * 195 */ 196 uint_t dlim_minxfer; 197 198 /* 199 * Expected average data rate for this DMA engine 200 * while transferring data. 201 * 202 * This is used as a hint for a number of operations that might 203 * want to know the possible optimal latency requirements of this 204 * device. A value of zero will be interpreted as a 'do not care'. 205 */ 206 uint_t dlim_dmaspeed; 207 208 } ddi_dma_lim_t; 209 210 #elif defined(__x86) 211 212 /* 213 * values for dlim_minxfer 214 */ 215 #define DMA_UNIT_8 1 216 #define DMA_UNIT_16 2 217 #define DMA_UNIT_32 4 218 219 /* 220 * Version number 221 */ 222 #define DMALIM_VER0 ((0x86000000) + 0) 223 224 typedef struct ddi_dma_lim { 225 226 /* 227 * Low range of 32 bit addressing capability. 228 */ 229 uint_t dlim_addr_lo; 230 231 /* 232 * Upper Inclusive bound of 32 bit addressing capability. 233 * 234 * The ISA nexus restricts this to 0x00ffffff, since this bus has 235 * only 24 address lines. This enforces the 16 Mb address limitation. 236 * The EISA nexus restricts this to 0xffffffff. 237 */ 238 uint_t dlim_addr_hi; 239 240 /* 241 * DMA engine counter not used; set to 0 242 */ 243 uint_t dlim_cntr_max; 244 245 /* 246 * DMA burst sizes not used; set to 1 247 */ 248 uint_t dlim_burstsizes; 249 250 /* 251 * Minimum effective DMA transfer size. 252 * 253 * This value specifies the minimum effective granularity of the 254 * DMA engine. It is distinct from dlim_burstsizes in that it 255 * describes the minimum amount of access a DMA transfer will 256 * effect. dlim_burstsizes describes in what electrical fashion 257 * the DMA engine might perform its accesses, while dlim_minxfer 258 * describes the minimum amount of memory that can be touched by 259 * the DMA transfer. 260 * 261 * This value also implies the required address alignment. 262 * The number of bytes transferred is assumed to be 263 * dlim_minxfer * (DMA engine count) 264 * 265 * It should be set to DMA_UNIT_8, DMA_UNIT_16, or DMA_UNIT_32. 266 */ 267 uint_t dlim_minxfer; 268 269 /* 270 * Expected average data rate for this DMA engine 271 * while transferring data. 272 * 273 * This is used as a hint for a number of operations that might 274 * want to know the possible optimal latency requirements of this 275 * device. A value of zero will be interpreted as a 'do not care'. 276 */ 277 uint_t dlim_dmaspeed; 278 279 280 /* 281 * Version number of this structure 282 */ 283 uint_t dlim_version; /* = 0x86 << 24 + 0 */ 284 285 /* 286 * Inclusive upper bound with which the DMA engine's Address acts as 287 * a register. 288 * This handles the case where an upper portion of a DMA address 289 * register is a latch instead of being a full 32 bit register 290 * (e.g., the upper 16 bits remain constant while the lower 16 bits 291 * are incremented for each DMA transfer). 292 * 293 * The ISA nexus restricts only 3rd-party DMA requests to 0x0000ffff, 294 * since the ISA DMA engine has a 16-bit register for low address and 295 * an 8-bit latch for high address. This enforces the first 64 Kb 296 * limitation (address boundary). 297 * The EISA nexus restricts only 3rd-party DMA requests to 0xffffffff. 298 */ 299 uint_t dlim_adreg_max; 300 301 /* 302 * Maximum transfer count that the DMA engine can handle. 303 * 304 * The ISA nexus restricts only 3rd-party DMA requests to 0x0000ffff, 305 * since the ISA DMA engine has a 16-bit register for counting. 306 * This enforces the other 64 Kb limitation (count size). 307 * The EISA nexus restricts only 3rd-party DMA requests to 0x00ffffff, 308 * since the EISA DMA engine has a 24-bit register for counting. 309 * 310 * This transfer count limitation is a per segment limitation. 311 * It can also be used to restrict the size of segments. 312 * 313 * This is used as a bit mask, so it must be a power of 2, minus 1. 314 */ 315 uint_t dlim_ctreg_max; 316 317 /* 318 * Granularity of DMA transfer, in units of bytes. 319 * 320 * Breakup sizes must be multiples of this value. 321 * If no scatter/gather capabilty is specified, then the size of 322 * each DMA transfer must be a multiple of this value. 323 * 324 * If there is scatter/gather capability, then a single cookie cannot 325 * be smaller in size than the minimum xfer value, and may be less 326 * than the granularity value. The total transfer length of the 327 * scatter/gather list should be a multiple of the granularity value; 328 * use dlim_sgllen to specify the length of the scatter/gather list. 329 * 330 * This value should be equal to the sector size of the device. 331 */ 332 uint_t dlim_granular; 333 334 /* 335 * Length of scatter/gather list 336 * 337 * This value specifies the number of segments or cookies that a DMA 338 * engine can consume in one i/o request to the device. For 3rd-party 339 * DMA that uses the bus nexus this should be set to 1. Devices with 340 * 1st-party DMA capability should specify the number of entries in 341 * its scatter/gather list. The breakup routine will ensure that each 342 * group of dlim_sgllen cookies (within a DMA window) will have a 343 * total transfer length that is a multiple of dlim_granular. 344 * 345 * < 0 : tbd 346 * = 0 : breakup is for PIO. 347 * = 1 : breakup is for DMA engine with no scatter/gather 348 * capability. 349 * >= 2 : breakup is for DMA engine with scatter/gather 350 * capability; value is max number of entries in list. 351 * 352 * Note that this list length is not dependent on the DMA window 353 * size. The size of the DMA window is based on resources consumed, 354 * such as intermediate buffers. Several s/g lists may exist within 355 * a window. But the end of a window does imply the end of the s/g 356 * list. 357 */ 358 short dlim_sgllen; 359 360 /* 361 * Size of device i/o request 362 * 363 * This value indicates the maximum number of bytes the device 364 * can transmit/receive for one i/o command. This limitation is 365 * significant ony if it is less than (dlim_ctreg_max * dlim_sgllen). 366 */ 367 uint_t dlim_reqsize; 368 369 } ddi_dma_lim_t; 370 371 #else 372 #error "struct ddi_dma_lim not defined for this architecture" 373 #endif /* defined(__sparc) */ 374 375 /* 376 * Flags definition for dma_attr_flags 377 */ 378 379 /* 380 * return physical DMA address on platforms 381 * which support DVMA 382 */ 383 #define DDI_DMA_FORCE_PHYSICAL 0x0100 384 385 /* 386 * An error will be flagged for DMA data path errors 387 */ 388 #define DDI_DMA_FLAGERR 0x200 389 390 /* 391 * Enable relaxed ordering 392 */ 393 #define DDI_DMA_RELAXED_ORDERING 0x400 394 395 #define DMA_ATTR_V0 0 396 #define DMA_ATTR_VERSION DMA_ATTR_V0 397 398 typedef struct ddi_dma_attr { 399 uint_t dma_attr_version; /* version number */ 400 uint64_t dma_attr_addr_lo; /* low DMA address range */ 401 uint64_t dma_attr_addr_hi; /* high DMA address range */ 402 uint64_t dma_attr_count_max; /* DMA counter register */ 403 uint64_t dma_attr_align; /* DMA address alignment */ 404 uint_t dma_attr_burstsizes; /* DMA burstsizes */ 405 uint32_t dma_attr_minxfer; /* min effective DMA size */ 406 uint64_t dma_attr_maxxfer; /* max DMA xfer size */ 407 uint64_t dma_attr_seg; /* segment boundary */ 408 int dma_attr_sgllen; /* s/g length */ 409 uint32_t dma_attr_granular; /* granularity of device */ 410 uint_t dma_attr_flags; /* Bus specific DMA flags */ 411 } ddi_dma_attr_t; 412 413 /* 414 * Handy macro to set a maximum bit value (should be elsewhere) 415 * 416 * Clear off all bits lower then 'mybit' in val; if there are no 417 * bits higher than or equal to mybit in val then set mybit. Assumes 418 * mybit equals some power of 2 and is not zero. 419 */ 420 #define maxbit(val, mybit) \ 421 ((val) & ~((mybit)-1)) | ((((val) & ~((mybit)-1)) == 0) ? (mybit) : 0) 422 423 /* 424 * Handy macro to set a minimum bit value (should be elsewhere) 425 * 426 * Clear off all bits higher then 'mybit' in val; if there are no 427 * bits lower than or equal to mybit in val then set mybit. Assumes 428 * mybit equals some pow2 and is not zero. 429 */ 430 #define minbit(val, mybit) \ 431 (((val)&((mybit)|((mybit)-1))) | \ 432 ((((val) & ((mybit)-1)) == 0) ? (mybit) : 0)) 433 434 /* 435 * Structure of a request to map an object for DMA. 436 */ 437 typedef struct ddi_dma_req { 438 /* 439 * Caller's DMA engine constraints. 440 * 441 * If there are no particular constraints to the caller's DMA 442 * engine, this field may be set to NULL. The implementation DMA 443 * setup functions will then select a set of standard beginning 444 * constraints. 445 * 446 * In either case, as the mapping proceeds, the initial DMA 447 * constraints may become more restrictive as each intervening 448 * nexus might add further restrictions. 449 */ 450 ddi_dma_lim_t *dmar_limits; 451 452 /* 453 * Contains the information passed to the DMA mapping allocation 454 * routine(s). 455 */ 456 uint_t dmar_flags; 457 458 /* 459 * Callback function. A caller of the DMA mapping functions must 460 * specify by filling in this field whether the allocation routines 461 * can sleep awaiting mapping resources, must *not* sleep awaiting 462 * resources, or may *not* sleep awaiting any resources and must 463 * call the function specified by dmar_fp with the the argument 464 * dmar_arg when resources might have become available at a future 465 * time. 466 */ 467 int (*dmar_fp)(); 468 469 caddr_t dmar_arg; /* Callback function argument */ 470 471 /* 472 * Description of the object to be mapped for DMA. 473 * Must be last in this structure in case that the 474 * union ddi_dma_obj_t changes in the future. 475 */ 476 ddi_dma_obj_t dmar_object; 477 478 } ddi_dma_req_t; 479 480 /* 481 * Defines for the DMA mapping allocation functions 482 * 483 * If a DMA callback funtion is set to anything other than the following 484 * defines then it is assumed that one wishes a callback and is providing 485 * a function address. 486 */ 487 #ifdef __STDC__ 488 #define DDI_DMA_DONTWAIT ((int (*)(caddr_t))0) 489 #define DDI_DMA_SLEEP ((int (*)(caddr_t))1) 490 #else 491 #define DDI_DMA_DONTWAIT ((int (*)())0) 492 #define DDI_DMA_SLEEP ((int (*)())1) 493 #endif 494 495 /* 496 * Return values from callback functions. 497 */ 498 #define DDI_DMA_CALLBACK_RUNOUT 0 499 #define DDI_DMA_CALLBACK_DONE 1 500 501 /* 502 * Flag definitions for the allocation functions. 503 */ 504 #define DDI_DMA_WRITE 0x0001 /* Direction memory --> IO */ 505 #define DDI_DMA_READ 0x0002 /* Direction IO --> memory */ 506 #define DDI_DMA_RDWR (DDI_DMA_READ | DDI_DMA_WRITE) 507 508 /* 509 * If possible, establish a MMU redzone after the mapping (to protect 510 * against cheap DMA hardware that might get out of control). 511 */ 512 #define DDI_DMA_REDZONE 0x0004 513 514 /* 515 * A partial allocation is allowed. That is, if the size of the object 516 * exceeds the mapping resources available, only map a portion of the 517 * object and return status indicating that this took place. The caller 518 * can use the functions ddi_dma_numwin(9F) and ddi_dma_getwin(9F) to 519 * change, at a later point, the actual mapped portion of the object. 520 * 521 * The mapped portion begins at offset 0 of the object. 522 * 523 */ 524 #define DDI_DMA_PARTIAL 0x0008 525 526 /* 527 * Map the object for byte consistent access. Note that explicit 528 * synchronization (via ddi_dma_sync(9F)) will still be required. 529 * Consider this flag to be a hint to the mapping routines as to 530 * the intended use of the mapping. 531 * 532 * Normal data transfers can be usually consider to use 'streaming' 533 * modes of operations. They start at a specific point, transfer a 534 * fairly large amount of data sequentially, and then stop (usually 535 * on a well aligned boundary). 536 * 537 * Control mode data transfers (for memory resident device control blocks, 538 * e.g., ethernet message descriptors) do not access memory in such 539 * a streaming sequential fashion. Instead, they tend to modify a few 540 * words or bytes, move around and maybe modify a few more. 541 * 542 * There are many machine implementations that make this difficult to 543 * control in a generic and seamless fashion. Therefore, explicit synch- 544 * ronization steps (via ddi_dma_sync(9F)) are still required (even if you 545 * ask for a byte-consistent mapping) in order to make the view of the 546 * memory object shared between a CPU and a DMA master in consistent. 547 * However, judicious use of this flag can give sufficient hints to 548 * the mapping routines to attempt to pick the most efficacious mapping 549 * such that the synchronization steps are as efficient as possible. 550 * 551 */ 552 #define DDI_DMA_CONSISTENT 0x0010 553 554 /* 555 * Some DMA mappings have to be 'exclusive' access. 556 */ 557 #define DDI_DMA_EXCLUSIVE 0x0020 558 559 /* 560 * Sequential, unidirectional, block-sized and block aligned transfers 561 */ 562 #define DDI_DMA_STREAMING 0x0040 563 564 /* 565 * Support for 64-bit SBus devices 566 */ 567 #define DDI_DMA_SBUS_64BIT 0x2000 568 569 /* 570 * Return values from the mapping allocation functions. 571 */ 572 573 /* 574 * succeeded in satisfying request 575 */ 576 #define DDI_DMA_MAPPED 0 577 578 /* 579 * Mapping is legitimate (for advisory calls). 580 */ 581 #define DDI_DMA_MAPOK 0 582 583 /* 584 * Succeeded in mapping a portion of the request. 585 */ 586 #define DDI_DMA_PARTIAL_MAP 1 587 588 /* 589 * indicates end of window/segment list 590 */ 591 #define DDI_DMA_DONE 2 592 593 /* 594 * No resources to map request. 595 */ 596 #define DDI_DMA_NORESOURCES -1 597 598 /* 599 * Can't establish a mapping to the specified object 600 * (no specific reason). 601 */ 602 #define DDI_DMA_NOMAPPING -2 603 604 /* 605 * The request is too big to be mapped. 606 */ 607 #define DDI_DMA_TOOBIG -3 608 609 /* 610 * The request is too small to be mapped. 611 */ 612 #define DDI_DMA_TOOSMALL -4 613 614 /* 615 * The request cannot be mapped because the object 616 * is locked against mapping by another DMA master. 617 */ 618 #define DDI_DMA_LOCKED -5 619 620 /* 621 * The request cannot be mapped because the limits 622 * structure has bogus values. 623 */ 624 #define DDI_DMA_BADLIMITS -6 625 626 /* 627 * the segment/window pointer is stale 628 */ 629 #define DDI_DMA_STALE -7 630 631 /* 632 * The system can't allocate DMA resources using 633 * the given DMA attributes 634 */ 635 #define DDI_DMA_BADATTR -8 636 637 /* 638 * A DMA handle is already used for a DMA 639 */ 640 #define DDI_DMA_INUSE -9 641 642 /* 643 * In order for the access to a memory object to be consistent 644 * between a device and a CPU, the function ddi_dma_sync(9F) 645 * must be called upon the DMA handle. The following flags 646 * define whose view of the object should be made consistent. 647 * There are different flags here because on different machines 648 * there are definite performance implications of how long 649 * such synchronization takes. 650 * 651 * DDI_DMA_SYNC_FORDEV makes all device references to the object 652 * mapped by the DMA handle up to date. It should be used by a 653 * driver after a cpu modifies the memory object (over the range 654 * specified by the other arguments to the ddi_dma_sync(9F) call). 655 * 656 * DDI_DMA_SYNC_FORCPU makes all cpu references to the object 657 * mapped by the DMA handle up to date. It should be used 658 * by a driver after the receipt of data from the device to 659 * the memory object is done (over the range specified by 660 * the other arguments to the ddi_dma_sync(9F) call). 661 * 662 * If the only mapping that concerns the driver is one for the 663 * kernel (such as memory allocated by ddi_iopb_alloc(9F)), the 664 * flag DDI_DMA_SYNC_FORKERNEL can be used. This is a hint to the 665 * system that if it can synchronize the kernel's view faster 666 * that the CPU's view, it can do so, otherwise it acts the 667 * same as DDI_DMA_SYNC_FORCPU. DDI_DMA_SYNC_FORKERNEL might 668 * speed up the synchronization of kernel mappings in case of 669 * non IO-coherent CPU caches. 670 */ 671 #define DDI_DMA_SYNC_FORDEV 0x0 672 #define DDI_DMA_SYNC_FORCPU 0x1 673 #define DDI_DMA_SYNC_FORKERNEL 0x2 674 675 /* 676 * Bus nexus control functions for DMA 677 */ 678 679 /* 680 * Control operations, defined here so that devops.h can be included 681 * by drivers without having to include a specific SYSDDI implementation 682 * header file. 683 */ 684 685 enum ddi_dma_ctlops { 686 DDI_DMA_FREE, /* free reference to object */ 687 DDI_DMA_SYNC, /* synchronize cache references */ 688 DDI_DMA_HTOC, /* return DMA cookie for handle */ 689 DDI_DMA_KVADDR, /* return kernel virtual address */ 690 DDI_DMA_MOVWIN, /* change mapped DMA window on object */ 691 DDI_DMA_REPWIN, /* report current window on DMA object */ 692 DDI_DMA_GETERR, /* report any post-transfer DMA errors */ 693 DDI_DMA_COFF, /* convert a DMA cookie to an offset */ 694 DDI_DMA_NEXTWIN, /* get next window within object */ 695 DDI_DMA_NEXTSEG, /* get next segment within window */ 696 DDI_DMA_SEGTOC, /* return segment DMA cookie */ 697 DDI_DMA_RESERVE, /* reserve some DVMA range */ 698 DDI_DMA_RELEASE, /* free preallocated DVMA range */ 699 DDI_DMA_RESETH, /* reset next cookie ptr in handle */ 700 DDI_DMA_CKSYNC, /* sync intermediate buffer to cookies */ 701 DDI_DMA_IOPB_ALLOC, /* get contiguous DMA-able memory */ 702 DDI_DMA_IOPB_FREE, /* return contiguous DMA-able memory */ 703 DDI_DMA_SMEM_ALLOC, /* get contiguous DMA-able memory */ 704 DDI_DMA_SMEM_FREE, /* return contiguous DMA-able memory */ 705 DDI_DMA_SET_SBUS64, /* 64 bit SBus support */ 706 DDI_DMA_REMAP, /* remap DMA buffers after relocation */ 707 708 /* 709 * control ops for DMA engine on motherboard 710 */ 711 DDI_DMA_E_ACQUIRE, /* get channel for exclusive use */ 712 DDI_DMA_E_FREE, /* release channel */ 713 DDI_DMA_E_1STPTY, /* setup channel for 1st party DMA */ 714 DDI_DMA_E_GETCB, /* get control block for DMA engine */ 715 DDI_DMA_E_FREECB, /* free control blk for DMA engine */ 716 DDI_DMA_E_PROG, /* program channel of DMA engine */ 717 DDI_DMA_E_SWSETUP, /* setup channel for software control */ 718 DDI_DMA_E_SWSTART, /* software operation of DMA channel */ 719 DDI_DMA_E_ENABLE, /* enable channel of DMA engine */ 720 DDI_DMA_E_STOP, /* stop a channel of DMA engine */ 721 DDI_DMA_E_DISABLE, /* disable channel of DMA engine */ 722 DDI_DMA_E_GETCNT, /* get remaining xfer count */ 723 DDI_DMA_E_GETLIM, /* get DMA engine limits */ 724 DDI_DMA_E_GETATTR /* get DMA engine attributes */ 725 }; 726 727 #ifdef __cplusplus 728 } 729 #endif 730 731 #endif /* _SYS_DDIDMAREQ_H */ 732