[BACK]Return to rumpdev_bus_dma.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / sys / rump / dev / lib / libpci

Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.

Diff for /src/sys/rump/dev/lib/libpci/rumpdev_bus_dma.c between version 1.1 and 1.1.2.1

version 1.1, 2014/04/04 12:53:59 version 1.1.2.1, 2014/08/10 06:56:50
Line 86 
Line 86 
 int     _bus_dmamap_load_buffer (bus_dma_tag_t, bus_dmamap_t, void *,  int     _bus_dmamap_load_buffer (bus_dma_tag_t, bus_dmamap_t, void *,
             bus_size_t, struct vmspace *, int, paddr_t *, int *, int);              bus_size_t, struct vmspace *, int, paddr_t *, int *, int);
   
 #undef PHYS_TO_BUS_MEM  
 #define PHYS_TO_BUS_MEM(_t_, _a_) rumpcomp_pci_virt_to_mach((void *)_a_)  
 #undef BUS_MEM_TO_PHYS  
 #define BUS_MEM_TO_PHYS(_t_, _a_) rumpcomp_pci_mach_to_virt(_a_)  
   
 /*  /*
  * Common function for DMA map creation.  May be called by bus-specific   * Common function for DMA map creation.  May be called by bus-specific
  * DMA map creation functions.   * DMA map creation functions.
Line 212  _bus_dmamap_load_buffer(bus_dma_tag_t t,
Line 207  _bus_dmamap_load_buffer(bus_dma_tag_t t,
                  * the previous segment if possible.                   * the previous segment if possible.
                  */                   */
                 if (first) {                  if (first) {
                         map->dm_segs[seg].ds_addr = PHYS_TO_BUS_MEM(t, curaddr);                          map->dm_segs[seg].ds_addr
                               = rumpcomp_pci_virt_to_mach((void *)curaddr);
                         map->dm_segs[seg].ds_len = sgsize;                          map->dm_segs[seg].ds_len = sgsize;
                         first = 0;                          first = 0;
                 } else {                  } else {
Line 221  _bus_dmamap_load_buffer(bus_dma_tag_t t,
Line 217  _bus_dmamap_load_buffer(bus_dma_tag_t t,
                              map->dm_maxsegsz &&                               map->dm_maxsegsz &&
                             (map->_dm_boundary == 0 ||                              (map->_dm_boundary == 0 ||
                              (map->dm_segs[seg].ds_addr & bmask) ==                               (map->dm_segs[seg].ds_addr & bmask) ==
                              (PHYS_TO_BUS_MEM(t, curaddr) & bmask)))                               (rumpcomp_pci_virt_to_mach((void*)curaddr)&bmask)))
                                 map->dm_segs[seg].ds_len += sgsize;                                  map->dm_segs[seg].ds_len += sgsize;
                         else {                          else {
                                 if (++seg >= map->_dm_segcnt)                                  if (++seg >= map->_dm_segcnt)
                                         break;                                          break;
                                 map->dm_segs[seg].ds_addr =                                  map->dm_segs[seg].ds_addr =
                                         PHYS_TO_BUS_MEM(t, curaddr);                                      rumpcomp_pci_virt_to_mach((void *)curaddr);
                                 map->dm_segs[seg].ds_len = sgsize;                                  map->dm_segs[seg].ds_len = sgsize;
                         }                          }
                 }                  }
Line 334  bus_dmamap_load_mbuf(bus_dma_tag_t t, bu
Line 330  bus_dmamap_load_mbuf(bus_dma_tag_t t, bu
                                 continue;                                  continue;
                         }                          }
                         map->dm_segs[seg].ds_addr =                          map->dm_segs[seg].ds_addr =
                             PHYS_TO_BUS_MEM(t, lastaddr);                              rumpcomp_pci_virt_to_mach((void *)lastaddr);
                         map->dm_segs[seg].ds_len = m->m_len;                          map->dm_segs[seg].ds_len = m->m_len;
                         lastaddr += m->m_len;                          lastaddr += m->m_len;
                         continue;                          continue;
Line 462  int
Line 458  int
 bus_dmamem_map(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs,  bus_dmamem_map(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs,
         size_t size, void **kvap, int flags)          size_t size, void **kvap, int flags)
 {  {
           struct rumpcomp_pci_dmaseg *dss;
           size_t allocsize = nsegs * sizeof(*dss);
           int rv, i;
   
         if (nsegs != 1)          /*
                 panic("bus_dmamem_map: only nsegs == 1 supported");           * Though rumpcomp_pci_dmaseg "accidentally" matches the
         *kvap = rumpcomp_pci_mach_to_virt(segs[0].ds_addr);           * bus_dma segment descriptor (at least for now), act
            * proper and actually translate it.
            */
           dss = kmem_alloc(allocsize, KM_SLEEP);
           for (i = 0; i < nsegs; i++) {
                   dss[i].ds_pa = segs[i].ds_addr;
                   dss[i].ds_len = segs[i].ds_len;
                   dss[i].ds_vacookie = segs[i]._ds_vacookie;
           }
           rv = rumpcomp_pci_dmamem_map(dss, nsegs, size, kvap);
           kmem_free(dss, allocsize);
   
         return 0;          return rv;
 }  }
   
 /*  /*
Line 499  bus_dmamem_alloc(bus_dma_tag_t t, bus_si
Line 508  bus_dmamem_alloc(bus_dma_tag_t t, bus_si
         int flags)          int flags)
 {  {
         paddr_t curaddr, lastaddr, pa;          paddr_t curaddr, lastaddr, pa;
           vaddr_t vacookie;
         int curseg, error;          int curseg, error;
   
         /* Always round the size. */          /* Always round the size. */
Line 513  bus_dmamem_alloc(bus_dma_tag_t t, bus_si
Line 523  bus_dmamem_alloc(bus_dma_tag_t t, bus_si
 #else  #else
         /* XXX: ignores boundary, nsegs, etc. */          /* XXX: ignores boundary, nsegs, etc. */
         //printf("dma allocation %lx %lx %d\n", alignment, boundary, nsegs);          //printf("dma allocation %lx %lx %d\n", alignment, boundary, nsegs);
         error = rumpcomp_pci_dmalloc(size, alignment, &pa);          error = rumpcomp_pci_dmalloc(size, alignment, &pa, &vacookie);
 #endif  #endif
         if (error)          if (error)
                 return (error);                  return (error);
Line 525  bus_dmamem_alloc(bus_dma_tag_t t, bus_si
Line 535  bus_dmamem_alloc(bus_dma_tag_t t, bus_si
         curseg = 0;          curseg = 0;
         lastaddr = segs[curseg].ds_addr = pa;          lastaddr = segs[curseg].ds_addr = pa;
         segs[curseg].ds_len = PAGE_SIZE;          segs[curseg].ds_len = PAGE_SIZE;
           segs[curseg]._ds_vacookie = vacookie;
         size -= PAGE_SIZE;          size -= PAGE_SIZE;
         pa += PAGE_SIZE;          pa += PAGE_SIZE;
           vacookie += PAGE_SIZE;
   
         for (; size; pa += PAGE_SIZE, size -= PAGE_SIZE) {          for (; size;
               pa += PAGE_SIZE, vacookie += PAGE_SIZE, size -= PAGE_SIZE) {
                 curaddr = pa;                  curaddr = pa;
                 if (curaddr == (lastaddr + PAGE_SIZE) &&                  if (curaddr == (lastaddr + PAGE_SIZE) &&
                     (lastaddr & boundary) == (curaddr & boundary)) {                      (lastaddr & boundary) == (curaddr & boundary)) {
Line 539  bus_dmamem_alloc(bus_dma_tag_t t, bus_si
Line 552  bus_dmamem_alloc(bus_dma_tag_t t, bus_si
                                 return EFBIG;                                  return EFBIG;
                         segs[curseg].ds_addr = curaddr;                          segs[curseg].ds_addr = curaddr;
                         segs[curseg].ds_len = PAGE_SIZE;                          segs[curseg].ds_len = PAGE_SIZE;
                           segs[curseg]._ds_vacookie = vacookie;
                 }                  }
                 lastaddr = curaddr;                  lastaddr = curaddr;
         }          }

Legend:
Removed from v.1.1  
changed lines
  Added in v.1.1.2.1

CVSweb <webmaster@jp.NetBSD.org>