Linux Headquarters
[ Register ]
[ About us ] [ Home Page ]

Advertisement
[ Kernel ] [ Documentation ] [ Links ] [ Books ]

Advertisement

Kernel v2.4.13 /include/asm-i386/pci.h

Filename:/include/asm-i386/pci.h
Lines Added:78
Lines Deleted:4
Also changed in: (Previous) 2.4.13-pre6  2.4.13-pre5  2.4.13-pre4  2.4.13-pre3  2.4.13-pre2  2.4.12-ac6 
(Following) 2.4.13-ac1  2.4.13-ac2  2.4.13-ac3  2.4.13-ac4  2.4.13-ac5  2.4.13-ac6 

Location
[  2.4.13
  [  include
    [  asm-i386
       o  pci.h

Patch

diff -u --recursive --new-file v2.4.12/linux/include/asm-i386/pci.h linux/include/asm-i386/pci.h
--- v2.4.12/linux/include/asm-i386/pci.h   Thu Oct 18 13:48:29 2001
+++ linux/include/asm-i386/pci.h   Tue Oct 23 22:00:02 2001
@@ -34,6 +34,12 @@
 
 struct pci_dev;
 
+/* The PCI address space does equal the physical memory
+ * address space.  The networking and block device layers use
+ * this boolean for bounce buffer decisions.
+ */
+#define PCI_DMA_BUS_IS_PHYS   (1)
+
 /* Allocate and map kernel buffer using consistent mode DMA for a device.
  * hwdev should be valid struct pci_dev pointer for PCI devices,
  * NULL for PCI-like buses (ISA, EISA).
@@ -84,6 +90,27 @@
    /* Nothing to do */
 }
 
+/*
+ * pci_{map,unmap}_single_page maps a kernel page to a dma_addr_t. identical
+ * to pci_map_single, but takes a struct page instead of a virtual address
+ */
+static inline dma_addr_t pci_map_page(struct pci_dev *hwdev, struct page *page,
+                  unsigned long offset, size_t size, int direction)
+{
+   if (direction == PCI_DMA_NONE)
+      BUG();
+
+   return (page - mem_map) * PAGE_SIZE + offset;
+}
+
+static inline void pci_unmap_page(struct pci_dev *hwdev, dma_addr_t dma_address,
+              size_t size, int direction)
+{
+   if (direction == PCI_DMA_NONE)
+      BUG();
+   /* Nothing to do */
+}
+
 /* Map a set of buffers described by scatterlist in streaming
  * mode for DMA.  This is the scather-gather version of the
  * above pci_map_single interface.  Here the scatter gather list
@@ -102,8 +129,26 @@
 static inline int pci_map_sg(struct pci_dev *hwdev, struct scatterlist *sg,
               int nents, int direction)
 {
+   int i;
+
    if (direction == PCI_DMA_NONE)
       BUG();
+
+   /*
+    * temporary 2.4 hack
+    */
+   for (i = 0; i < nents; i++ ) {
+      if (sg[i].address && sg[i].page)
+         BUG();
+      else if (!sg[i].address && !sg[i].page)
+         BUG();
+
+      if (sg[i].address)
+         sg[i].dma_address = virt_to_bus(sg[i].address);
+      else
+         sg[i].dma_address = page_to_bus(sg[i].page) + sg[i].offset;
+   }
+
    return nents;
 }
 
@@ -157,7 +202,7 @@
  * only drive the low 24-bits during PCI bus mastering, then
  * you would pass 0x00ffffff as the mask to this function.
  */
-static inline int pci_dma_supported(struct pci_dev *hwdev, dma_addr_t mask)
+static inline int pci_dma_supported(struct pci_dev *hwdev, u64 mask)
 {
         /*
          * we fall back to GFP_DMA when the mask isn't all 1s,
@@ -170,13 +215,42 @@
    return 1;
 }
 
+/* This is always fine. */
+#define pci_dac_dma_supported(pci_dev, mask)   (1)
+
+static __inline__ dma64_addr_t
+pci_dac_page_to_dma(struct pci_dev *pdev, struct page *page, unsigned long offset, int direction)
+{
+   return ((dma64_addr_t) page_to_bus(page) +
+      (dma64_addr_t) offset);
+}
+
+static __inline__ struct page *
+pci_dac_dma_to_page(struct pci_dev *pdev, dma64_addr_t dma_addr)
+{
+   unsigned long poff = (dma_addr >> PAGE_SHIFT);
+
+   return mem_map + poff;
+}
+
+static __inline__ unsigned long
+pci_dac_dma_to_offset(struct pci_dev *pdev, dma64_addr_t dma_addr)
+{
+   return (dma_addr & ~PAGE_MASK);
+}
+
+static __inline__ void
+pci_dac_dma_sync_single(struct pci_dev *pdev, dma64_addr_t dma_addr, size_t len, int direction)
+{
+   /* Nothing to do. */
+}
+
 /* These macros should be used after a pci_map_sg call has been done
  * to get bus addresses of each of the SG entries and their lengths.
  * You should only work with the number of sg entries pci_map_sg
- * returns, or alternatively stop on the first sg_dma_len(sg) which
- * is 0.
+ * returns.
  */
-#define sg_dma_address(sg)   (virt_to_bus((sg)->address))
+#define sg_dma_address(sg)   ((sg)->dma_address)
 #define sg_dma_len(sg)      ((sg)->length)
 
 /* Return the index of the PCI controller for device. */


Comments: webmaster (at) linuxhq.com.
Advertising: banners (at) linuxhq.com.
Compilation ©1998-2008 Linux Headquarters, Inc.