Annotation of driverkit/notes/DriverDmaProcedure, revision 1.1

1.1     ! root        1:                        NRW DMA - driver usage
        !             2:                        
        !             3: DMA procedure, block mode devices
        !             4: {
        !             5:        shut down possible DMA in progress, dequeue descriptors (not 
        !             6:                normally done);
        !             7:        /*
        !             8:         * enable interrupts at device/channel level. Output devices
        !             9:         * should rely on device-level I/O complete interrupts; input
        !            10:         * devices can use DMA descriptor interrupts.
        !            11:         */
        !            12:        enable device error and all channel interrupts;
        !            13:        if output operation 
        !            14:                enable device I/O complete interrupts;
        !            15:        enqueue the dma frame, enabling descriptor interrupt for input only;
        !            16:        assert reset_chan and chan_{input,output};
        !            17:        enable interrupt notification at kernel level;
        !            18:        assert load_desc;
        !            19:        assert enable_chan;
        !            20:        enable device-specific logic;
        !            21:        wait for interrupt or timeout;
        !            22:        if any errors (timeout, channel errors, device-specific errors) {
        !            23:                error recovery;
        !            24:        }
        !            25:        else if input operation {
        !            26:                if descriptor interrupt {
        !            27:                        /* I/O Complete */
        !            28:                        clear descriptor interrupt bit;
        !            29:                        dequeue DMA frame;
        !            30:                }
        !            31:                else {
        !            32:                        spurious interrupt (error);
        !            33:                }
        !            34:        }
        !            35:        else {
        !            36:                if Device I/O complete interrupt {
        !            37:                        /* I/O Complete */
        !            38:                        clear device interrupt bit;
        !            39:                        dequeue DMA frame;
        !            40:                }
        !            41:                else {
        !            42:                        spurious interrupt (error);
        !            43:                }
        !            44:        }
        !            45: }
        !            46: 
        !            47: DMA procedure, Streaming mode devices
        !            48: {
        !            49:        /*
        !            50:         * initialize channel for normal operation.
        !            51:         */
        !            52:        assert reset_chan and chan_{input,output};
        !            53:        enable device error and all channel interrupts;
        !            54:        
        !            55:        /*
        !            56:         * Main loop, run forever.
        !            57:         */
        !            58:        while(1) {
        !            59:                wait for interrupt or new command;
        !            60:                if(new command) {
        !            61:                        enqueue the DMA frame, enabling descriptor interrupt
        !            62:                                and interrupt notification;
        !            63:                        if descriptor list empty {
        !            64:                                assert load_desc;
        !            65:                                assert enable_chan;
        !            66:                        }
        !            67:                        if device logic idle
        !            68:                                enable device-specific logic;
        !            69:                }
        !            70:                else {
        !            71:                        /*
        !            72:                         * Interrupt. 
        !            73:                         */
        !            74:                        if any errors (timeout, channel errors, 
        !            75:                            device-specific errors) {
        !            76:                                error recovery;
        !            77:                        }
        !            78:                        else if descriptor interrupt {
        !            79:                        
        !            80:                                /*
        !            81:                                 * Dequeue all completed frames.
        !            82:                                 */
        !            83:                                clear descriptor interrupt bit;
        !            84:                                do {
        !            85:                                        dequeue_frame(completed only, enable
        !            86:                                                interrupts if no more);
        !            87:                                        I/O complete for that frame;
        !            88:                                } while(descriptors available);
        !            89:                        }
        !            90:                        else {
        !            91:                                spurious interrupt;
        !            92:                        }
        !            93:                }
        !            94:        }
        !            95: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.