diff --git a/fthd_buffer.c b/fthd_buffer.c index 2a991e5..bc8439b 100644 --- a/fthd_buffer.c +++ b/fthd_buffer.c @@ -38,7 +38,8 @@ static int iommu_allocator_init(struct fthd_private *dev_priv) return -ENOMEM; dev_priv->iommu->start = 0; - dev_priv->iommu->end = PAGE_SIZE - 1; + dev_priv->iommu->end = S2_PAGE_SIZE - 1; + return 0; } @@ -58,8 +59,8 @@ struct iommu_obj *iommu_allocate_sgtable(struct fthd_private *dev_priv, if (!total_len) return NULL; - total_len = roundup(total_len, PAGE_SIZE); - + total_len = roundup(total_len, S2_PAGE_SIZE) / S2_PAGE_SIZE; + obj = kzalloc(sizeof(struct iommu_obj), GFP_KERNEL); if (!obj) return NULL; @@ -84,11 +85,14 @@ struct iommu_obj *iommu_allocate_sgtable(struct fthd_private *dev_priv, sg = sgtable->sgl + i; WARN_ON(sg->offset); dma_addr = sg_dma_address(sg); + WARN_ON(dma_addr & 0xfff); - dma_addr >>= PAGE_SHIFT; + dma_addr >>= S2_PAGE_SHIFT; for (dma_length = 0; dma_length < sg_dma_len(sg); - dma_length += 0x1000) { + dma_length += S2_PAGE_SIZE) { + + /* FIXME: How do we handle 64-bit dma_addr_t? */ FTHD_S2_REG_WRITE(dma_addr++, pos); pos += 4; } diff --git a/fthd_drv.h b/fthd_drv.h index 3db1bcf..2fef7da 100644 --- a/fthd_drv.h +++ b/fthd_drv.h @@ -38,6 +38,9 @@ #define FTHD_NUM_BUFS 4 +#define S2_PAGE_SIZE 4096 +#define S2_PAGE_SHIFT 12 + enum FW_CHAN_TYPE { FW_CHAN_TYPE_OUT=0, FW_CHAN_TYPE_IN=1,