/* $Id: dma.c,v 1.5 1992/11/18 02:49:05 root Exp root $
 * linux/kernel/dma.c: A DMA channel allocator. Inspired by linux/kernel/irq.c.
 * Written by Hennus Bergman, 1992.
 */

#include <linux/kernel.h>
#include <linux/errno.h>
#include <asm/dma.h>

/* A note on resource allocation:
 *
 * All drivers needing DMA channels, should allocate and release them
 * through the public routines `request_dma()' and `free_dma()'.
 *
 * In order to avoid problems, all processes should allocate resources in
 * the same sequence and release them in the reverse order.
 *
 * So, when allocating DMAs and IRQs, first allocate the IRQ, then the DMA.
 * When releasing them, first release the DMA, then release the IRQ.
 * If you don't, you may cause allocation requests to fail unnecessarily.
 * This doesn't really matter now, but it will once we get real semaphores
 * in the kernel.
 */

/* Channel n is busy iff dma_chan_busy[n] != 0.
 * DMA0 is reserved for DRAM refresh, I think.
 * DMA4 is reserved for cascading (?).
 */
 /* dma_chan_busy[n] != 0 表示该通道不可用
 * DMA0 用作DRAM的刷新.
 * DMA4 用作级连.
 */
static volatile unsigned int dma_chan_busy[MAX_DMA_CHANNELS] = {
    1, 0, 0, 0, 1, 0, 0, 0
};

/* Atomically swap memory location [32 bits] with `newval'.
 * This avoid the cli()/sti() junk and related problems.
 * [And it's faster too :-)]
 * Maybe this should be in include/asm/mutex.h and be used for
 * implementing kernel-semaphores as well.
 */
 // 将*p指向的数据替换为newval.由关键字xchgl看,这个值是32位的值。
 // xchgl是原子操作,可以省去cli和sti.
static __inline__ unsigned int mutex_atomic_swap(volatile unsigned int * p, unsigned int newval)
{
    unsigned int semval = newval;

/* If one of the operands for the XCHG instructions is a memory ref,
     * it makes the swap an uninterruptible RMW cycle.
     *
     * One operand must be in memory, the other in a register, otherwise
     * the swap may not be atomic.
     */

asm __volatile__ ("xchgl %2, %0\n"
            : /* outputs: semval   */ "=r" (semval)
            : /* inputs: newval, p */ "0" (semval), "m" (*p)
            );    /* p is a var, containing an address */
    return semval;
} /* mutex_atomic_swap */

//请求DMA,核心由上个函数mutex_atomic_swap完成
int request_dma(unsigned int dmanr)
{
    if (dmanr >= MAX_DMA_CHANNELS)
        return -EINVAL;

if (mutex_atomic_swap(&dma_chan_busy[dmanr], 1) != 0)
        return -EBUSY;
    else
        /* old flag was 0, now contains 1 to indicate busy */
        return 0;
} /* request_dma */

//释放DMA,核心由函数mutex_atomic_swap完成
void free_dma(unsigned int dmanr)
{
    if (dmanr >= MAX_DMA_CHANNELS) {
        printk("Trying to free DMA%d\n", dmanr);
        return;
    }

if (mutex_atomic_swap(&dma_chan_busy[dmanr], 0) == 0)
        printk("Trying to free free DMA%d\n", dmanr);
} /* free_dma */

kernel/dma.c的更多相关文章

  1. include/asm/dma.h

    /* $Id: dma.h,v 1.7 1992/12/14 00:29:34 root Exp root $ * linux/include/asm/dma.h: Defines for using ...

  2. iommu分析之---DMA remap框架实现

    本文主要介绍iommu的框架.基于4.19.204内核 IOMMU核心框架是管理IOMMU设备的一个通过框架,IOMMU设备通过实现特定的回调函数并将自身注册到IOMMU核心框架中,以此通过IOMMU ...

  3. Linux服务器宕机案例一则

    案例环境 操作系统 :Oracle Linux Server release 5.7 64bit 虚拟机 硬件配置 : 物理机型号为DELL R720 资源配置 :RAM 8G Intel(R) Xe ...

  4. Linux系统OOM killer机制详解

    介绍: Linux下面有个特性叫OOM killer(Out Of Memory killer),会在系统内存耗尽的情况下出现,选择性的干掉一些进程以求释放一些内存.广大从事Linux方面的IT农民工 ...

  5. VNF网络性能提升解决方案及实践

    VNF网络性能提升解决方案及实践 2016年7月 作者:    王智民 贡献者:     创建时间:    2016-7-20 稳定程度:    初稿 修改历史 版本 日期 修订人 说明 1.0 20 ...

  6. linux驱动(续)

    网络通信 --> IO多路复用之select.poll.epoll详解 IO多路复用之select.poll.epoll详解      目前支持I/O多路复用的系统调用有 select,psel ...

  7. Linux 驱动开发

    linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...

  8. 【内核】linux内核启动流程详细分析

    Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件,包括内核入口ENTRY(stext)到start_kernel间的初始化代码, 主要作用 ...

  9. 【内核】linux内核启动流程详细分析【转】

    转自:http://www.cnblogs.com/lcw/p/3337937.html Linux内核启动流程 arch/arm/kernel/head-armv.S 该文件是内核最先执行的一个文件 ...

随机推荐

  1. Whole life

    Whole life the wonder such you bring the beautyI can see but i keep deep inside on itOh life i feel ...

  2. java.lang.UnsupportedClassVersionError出错

    代码出错如下:java.lang.UnsupportedClassVersionError: cn/itcast/mybatis/first/MybatisFirst : Unsupported ma ...

  3. java目录与classpath

    目录结构 描述 jdk bin            编译器和工具 demo             演示 docs              HTML格式的类库文档 include         ...

  4. 针对不同浏览器,CSS如何写

    我们在开发DIV+CSS页面时候常常会遇到开发出的网页的一些地方在各大浏览器比如微软IE6.微软IE7.微软IE8.火狐浏览器.谷歌浏览器有一些不同,如宽度.高度等地方有相差误.IE6比较老的版本浏览 ...

  5. php 循环删除目录中的过期文件

            $savepath1 = 'Public/biaoqian/upload';         $path1 = dir($savepath1);           while (($ ...

  6. SQLServer存储过程和触发器学习记录及简单例子

     一.存储过程 存储过程即为能完成特定功能的一组SQL语句集.如果需要对查出的多条数据进行操作的话,这里需要理解游标(CURSOR)的概念,对于oracle有for each row命令,可以不用游标 ...

  7. Visual Studio 2015 Update 1 ISO

    Visual Studio Community 2015 with UPDATE 1___________________________________________English ENU - h ...

  8. goldengate for big data 12.2.0.1.1新增功能

    新格式支持:包括Avro OCF和HDFS顺序文件,OGG现在支持将数据写入Avro对象容器(Object container format)和HDFS顺序文件 支持Hadoop平台元数据或DDL更新 ...

  9. String类常用方法小节

    (1)String.equals() 返回值是boolean类型 equals(Object anObject)           将此字符串与指定的对象比较. (2)length() 返回值是in ...

  10. Intel RealSense SDK 简翻

    :first-child{margin-top:0!important}img.plugin{box-shadow:0 1px 3px rgba(0,0,0,.1);border-radius:3px ...