1. 02 12月, 2014 1 次提交
  2. 04 11月, 2014 1 次提交
    • D
      iommu/rockchip: rk3288 iommu driver · c68a2921
      Daniel Kurtz 提交于
      The rk3288 has several iommus.  Each iommu belongs to a single master
      device.  There is one device (ISP) that has two slave iommus, but that
      case is not yet supported by this driver.
      
      At subsys init, the iommu driver registers itself as the iommu driver for
      the platform bus.  The master devices find their slave iommus using the
      "iommus" field in their devicetree description.  Since each slave iommu
      belongs to exactly one master, their is no additional data needed at probe
      to associate a slave with its master.
      
      An iommu device's power domain, clock and irq are all shared with its
      master device, and the master device must be careful to attach from the
      iommu only after powering and clocking it (and leave it powered and
      clocked before detaching).  Because their is no guarantee what the status
      of the iommu is at probe, and since the driver does not even know if the
      device is powered, we delay requesting its irq until the master device
      attaches, at which point we have a guarantee that the device is powered
      and clocked and we can reset it and disable its interrupt mask.
      
      An iommu_domain describes a virtual iova address space.  Each iommu_domain
      has a corresponding page table that lists the mappings from iova to
      physical address.
      
      For the rk3288 iommu, the page table has two levels:
       The Level 1 "directory_table" has 1024 4-byte dte entries.
       Each dte points to a level 2 "page_table".
       Each level 2 page_table has 1024 4-byte pte entries.
       Each pte points to a 4 KiB page of memory.
      
      An iommu_domain is created when a dma_iommu_mapping is created via
      arm_iommu_create_mapping.  Master devices can then attach themselves to
      this mapping (or attach the mapping to themselves?) by calling
      arm_iommu_attach_device().  This in turn instructs the iommu driver to
      write the page table's physical address into the slave iommu's "Directory
      Table Entry" (DTE) register.
      
      In fact multiple master devices, each with their own slave iommu device,
      can all attach to the same mapping.  The iommus for these devices will
      share the same iommu_domain and therefore point to the same page table.
      Thus, the iommu domain maintains a list of iommu devices which are
      attached.  This driver relies on the iommu core to ensure that all devices
      have detached before destroying a domain.
      
      v6: - add .add/remove_device() callbacks.
          - parse platform_device device tree nodes for "iommus" property
          - store platform device pointer as group iommudata
          - Check for existence of iommu group instead of relying on a
            dev_get_drvdata() to return NULL for a NULL device.
      
      v7: - fixup some strings.
          - In rk_iommu_disable_paging() # and % were reversed.
      Signed-off-by: NDaniel Kurtz <djkurtz@chromium.org>
      Signed-off-by: NSimon Xue <xxm@rock-chips.com>
      Reviewed-by: NGrant Grundler <grundler@chromium.org>
      Reviewed-by: NStéphane Marchesin <marcheu@chromium.org>
      Tested-by: NHeiko Stuebner <heiko@sntech.de>
      Signed-off-by: NJoerg Roedel <jroedel@suse.de>
      c68a2921
  3. 03 11月, 2014 7 次提交
  4. 01 11月, 2014 10 次提交
  5. 31 10月, 2014 21 次提交