home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.1 (Developer) [x86] / NeXT Step 3.1 Intel dev.cdr.dmg / NextDeveloper / Headers / bsd / dev / i386 / IdeInline.h < prev    next >
Encoding:
C/C++ Source or Header  |  1993-04-30  |  2.8 KB  |  114 lines

  1. /*     Copyright (c) 1991 NeXT Computer, Inc.  All rights reserved. 
  2.  *
  3.  * IdeInline.h - Ide Inline Fuctions module.
  4.  *
  5.  * HISTORY
  6.  * 16-March-1993 David Somayajulu at NeXT
  7.  *      Created. 
  8.  */
  9.  
  10. #define MACH_USER_API    1
  11. #undef    KERNEL_PRIVATE
  12.  
  13. #import <bsd/dev/i386/IdeCnt.h>
  14. #import <kern/assert.h>
  15. #import <driverkit/kernelDriver.h>
  16. #import <kernserv/prototypes.h>
  17. #import <mach/mach_interface.h>
  18. #import <driverkit/IODevice.h>
  19. #import <driverkit/align.h>
  20. #import <machkit/NXLock.h>
  21. #import <machdep/i386/io_inline.h>
  22. #import <kernserv/i386/spl.h>
  23.  
  24.  
  25.  
  26. #if !IDE_DEBUG
  27. static inline
  28. #endif !IDE_DEBUG 
  29. void rwSectorBuffer(caddr_t addr, unsigned read, unsigned length,
  30.                 unsigned ideDataRegister)
  31. {
  32.     // length is always a multiple of two
  33.  
  34.     if (read){
  35.         linw(ideDataRegister, addr, length/2);
  36.     }else{
  37.         loutw(ideDataRegister, addr, length/2);
  38.     }
  39.  
  40. }
  41.  
  42. #if !IDE_DEBUG
  43. static inline
  44. #endif !IDE_DEBUG 
  45. void ideXferData(caddr_t addr, unsigned read, vm_map_t client, 
  46.             unsigned length, ideRegsAddrs_t ideRegs)
  47. {
  48. // length is <= PAGE_SIZE while calling this function
  49.     
  50.     unsigned pageMask = PAGE_SIZE - 1;
  51.     extern vm_map_t kernel_map;
  52.     
  53.     unsigned count, offset;
  54.     unsigned short sw;
  55.     caddr_t maddr0, maddr1;
  56.     
  57.  
  58.     if ( client == kernel_map ) {
  59.         /* simple case, no mapping required */
  60.         rwSectorBuffer(addr, read, length,ideRegs.data);
  61.     } else {
  62.         /* to get the physical address here */
  63.         offset = ((unsigned)addr & pageMask);
  64.         if ((PAGE_SIZE - offset)  < length) { /* this is a pain */
  65.             count = PAGE_SIZE - offset;
  66.             maddr0 = (caddr_t)pmap_resident_extract(
  67.                  vm_map_pmap((vm_map_t)client), addr);
  68.             maddr1 = (caddr_t)pmap_resident_extract(
  69.                  vm_map_pmap((vm_map_t)client), addr+count);
  70.             if (count % 2 ) {
  71.                 rwSectorBuffer((unsigned char *)
  72.                         pmap_phys_to_kern(maddr0), 
  73.                         read, (count-1),ideRegs.data);
  74.  
  75.                 if(read) {
  76.                     sw = inw(ideRegs.data);
  77.                     *((unsigned char *)
  78.                       pmap_phys_to_kern(maddr0+count-1)) =
  79.                       (unsigned char)(sw & 0xFF);
  80.                     *((unsigned char *)
  81.                       pmap_phys_to_kern(maddr1)) = 
  82.                      (unsigned char)((sw & 0xFF)>>8);
  83.                 } else {
  84.                     sw = *((unsigned char *)
  85.                      pmap_phys_to_kern(maddr0 + count -1));
  86.                     sw |= *((unsigned char *)
  87.                          pmap_phys_to_kern(maddr1)) << 8;
  88.                     outw(ideRegs.data, sw);
  89.                 }
  90.                 maddr1++;
  91.                 rwSectorBuffer((unsigned char *)
  92.                         pmap_phys_to_kern(maddr1), 
  93.                         read, (length-count-1),
  94.                         ideRegs.data);
  95.             } else {
  96.                 rwSectorBuffer((unsigned char *)
  97.                         pmap_phys_to_kern(maddr0), 
  98.                         read, count,ideRegs.data);
  99.                 rwSectorBuffer((unsigned char *)
  100.                         pmap_phys_to_kern(maddr1), 
  101.                         read, (length-count),
  102.                         ideRegs.data);
  103.             }
  104.         } else {
  105.             maddr0 = (caddr_t)pmap_resident_extract(
  106.                 vm_map_pmap((vm_map_t)client), addr);
  107.             rwSectorBuffer((unsigned char *)
  108.                         pmap_phys_to_kern(maddr0), 
  109.                         read, length,ideRegs.data);
  110.         }
  111.     }
  112. }
  113.  
  114.