home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.2 (Developer) / NS_dev_3.2.iso / NextDeveloper / Examples / DriverKit / S3 / S3_reloc.tproj / S3Modes.h < prev    next >
Encoding:
C/C++ Source or Header  |  1993-07-20  |  6.2 KB  |  231 lines

  1. /* CONFIDENTIAL
  2.  * Copyright (c) 1993 by NeXT Computer, Inc as an unpublished work.
  3.  * All rights reserved.
  4.  *
  5.  * S3Modes.h -- internal definitions for S3 driver.
  6.  *
  7.  * Author:  Derek B Clegg    21 May 1993
  8.  *
  9.  * Based on work by Peter Graffagnino, 31 January 1993.
  10.  */
  11.  
  12. #ifndef S3MODES_H__
  13. #define S3MODES_H__
  14.  
  15. #import <objc/objc.h>
  16. #import <mach/mach.h>
  17. #import <driverkit/displayDefs.h>
  18. #import <driverkit/i386/ioPorts.h>
  19. #import "vgaModes.h"
  20.  
  21. enum S3AdapterType {
  22.     UnknownAdapter, S3_805, S3_928,
  23. };
  24. typedef enum S3AdapterType S3AdapterType;
  25.  
  26. enum DACtype {
  27.     UnknownDAC,
  28.     ATT20C491,        /* AT&T 20C491 or Sierra SC15025. */
  29.     Bt484,        /* BrookTree 484. */
  30.     Bt485,        /* BrookTree 485. */
  31.     Bt485A,        /* BrookTree 485A. */
  32. };
  33. typedef enum DACtype DACtype;
  34.  
  35. #define ONE_MEGABYTE    (1 << 20)
  36. #define TWO_MEGABYTES   (2 << 20)
  37. #define THREE_MEGABYTES (3 << 20)
  38. #define FOUR_MEGABYTES  (4 << 20)
  39.  
  40. #define S3_XCRTC_COUNT    48
  41. #define S3_MODE_COUNT    10    /* Maximum refresh rate/mode control pairs. */
  42.  
  43. struct S3ModeControl {
  44.     unsigned char refreshRate;
  45.     unsigned char modeControl;    /* 0x3D4:42 */
  46. };
  47.  
  48. struct S3Mode {
  49.     const char *name;        /* The name of this mode. */
  50.     S3AdapterType adapter;    /* The adapter required for this mode. */
  51.     unsigned long memSize;    /* The memory necessary for this mode. */
  52.  
  53.     struct S3ModeControl modeControl[S3_MODE_COUNT];
  54.     unsigned char advFuncCntl;    /* 0x4AE8 */
  55.     unsigned char xcrtc[S3_XCRTC_COUNT];
  56.     VGAMode vgaData;
  57. };
  58. typedef struct S3Mode S3Mode;
  59.  
  60. extern const IODisplayInfo S3_805_ModeTable[];
  61. extern const int S3_805_ModeTableCount;
  62. extern const int S3_805_defaultMode;
  63. extern const IODisplayInfo S3_928_ModeTable[];
  64. extern const int S3_928_ModeTableCount;
  65. extern const int S3_928_defaultMode;
  66.  
  67. /* Definitions for the S3 registers that we use. */
  68.  
  69. #define S3_EXTENDED_REGISTER_MAX    0x7F
  70.  
  71. /* Indexes for S3 registers. */
  72.  
  73. #define S3_CHIP_ID_INDEX    0x30    /* Chip ID/REV register. */
  74. #define S3_CHIP_ID_MASK        0xF0
  75. #define S3_CHIP_ID_805        0xA0
  76. #define S3_CHIP_ID_928        0x90
  77. #define S3_REVISION_MASK    0x0F
  78.  
  79. #define S3_MEM_CNFG_INDEX    0x31    /* Memory configuration register. */
  80.  
  81. #define S3_BKWD_2        0x33    /* Backward compatibility register. */
  82.  
  83. #define S3_CRTR_LOCK_INDEX    0x35    /* CRT register lock register. */
  84.  
  85. #define S3_CONFG_REG1_INDEX    0x36    /* Configuration 1 register. */
  86. #define S3_CONFG_REG2_INDEX    0x37    /* Configuration 2 register. */
  87. #define S3_BUS_SELECT_MASK    0x03
  88. #define S3_EISA_BUS        0x00
  89. #define S3_LOCAL_BUS        0x01
  90. #define S3_ISA_BUS        0x03
  91. #define S3_MEM_SIZE_MASK    0xC0
  92. #define S3_4_MEG        0
  93. #define S3_3_MEG        (2 << 5)
  94. #define S3_2_MEG        (4 << 5)
  95. #define S3_1_MEG        (6 << 5)
  96. #define S3_HALF_MEG        (7 << 5)
  97.  
  98. /*  Lock registers */
  99.  
  100. #define S3_REG_LOCK1        0x38    /* Register lock 1 register. */
  101. #define S3_LOCK1_KEY        0x48
  102. #define S3_REG_LOCK2        0x39    /* Register lock 2 register. */
  103. #define S3_LOCK2_KEY        0xA0
  104.  
  105. #define S3_DT_EX_POS        0x3B    /* Data transfer execute position
  106.                        register. */
  107. #define S3_IL_RTSTART        0x3C    /* Interlace retrace start register. */
  108.  
  109. /* System Control Registers */
  110.  
  111. #define S3_SYS_CNFG        0x40    /* System configuration register. */
  112. #define S3_8514_ACCESS_MASK    0x01
  113. #define S3_8514_ENABLE_ACCESS    0x01
  114. #define S3_8514_DISABLE_ACCESS    0x00
  115. #define S3_WRITE_POST_MASK    0x08
  116. #define S3_WRITE_POST_ENABLE    0x08
  117. #define S3_WRITE_POST_DISABLE    0x00
  118.  
  119. #define S3_MODE_CTL        0x42    /* Mode control register. */
  120. #define S3_EXT_MODE        0x43    /* Extended mode register. */
  121. #define S3_HGC_MODE        0x45    /* Hardware graphics cursor mode
  122.                        register. */
  123. #define S3_ENB_485        (1 << 5)/* Cursor control enable for Brooktree
  124.                        Bt485 DAC. */
  125.  
  126. /* System Extension Registers. */
  127.  
  128. #define S3_EX_SCTL_1        0x50    /* Extended system control 1
  129.                        register. */
  130.  
  131. #define S3_EX_MCTL_1        0x53    /* Extended memory control 1
  132.                        register. */
  133. #define S3_MMIO_ACCESS_MASK    0x10
  134. #define S3_ENABLE_MMIO_ACCESS    0x10
  135. #define S3_DISABLE_MMIO_ACCESS    0x00
  136.  
  137. #define S3_EX_MCTL_2        0x54    /* Extended memory control 2
  138.                        register. */
  139. #define S3_PREFETCH_CTRL_MASK    0x07
  140. #define S3_PREFETCH_MAX        0x07
  141.  
  142. #define S3_EX_DAC_CT        0x55    /* Extended video DAC control
  143.                        register. */
  144. #define S3_DAC_R_SEL_MASK    0x03    /* Mask for extension bits of the
  145.                        RS[1:0] signals for video DAC
  146.                        addressing. */
  147. #define S3_ENB_SID        0x80    /* Enable external SID operation. */
  148. #define S3_HWGC_EXOP        0x20    /* Hardware cursor external operation
  149.                        mode. */
  150.  
  151. #define S3_LAW_CTL        0x58    /* Linear address window control
  152.                        register. */
  153. #define S3_LAW_SIZE_MASK    0x03
  154. #define S3_LAW_SIZE_64K        0x00
  155. #define S3_LAW_SIZE_1M        0x01
  156. #define S3_LAW_SIZE_2M        0x02
  157. #define S3_LAW_SIZE_4M        0x03
  158. #define S3_PREFETCH_MASK    0x04
  159. #define S3_ENABLE_PREFETCH    0x04
  160. #define S3_DISABLE_PREFETCH    0x00
  161. #define S3_LAW_ENABLE_MASK    0x10
  162. #define S3_ENABLE_LAW        0x10
  163. #define S3_DISABLE_LAW        0x00
  164.  
  165. #define S3_LAW_POS_HI        0x59    /* Linear address window position
  166.                        registers. */
  167. #define S3_LAW_POS_LO        0x5A
  168.  
  169. #define S3_GOUT_PORT        0x5C    /* General output port register. */
  170.  
  171. #define S3_EXT_H_OVF        0x5D    /* Extended horizontal overflow
  172.                        register. */
  173. #define S3_EXT_V_OVF        0x5E    /* Extended vertical overflow
  174.                        register. */
  175.  
  176. /* Enhanced Command Registers */
  177.  
  178. #define S3_ADVFUNC_CNTL        0x4AE8    /* Advanced function control
  179.                        register. */
  180. #define S3_GP_STAT        0x9AE8    /* Graphics processor status
  181.                        register. */
  182. #define S3_GP_BUSY_MASK        (1 << 9)
  183.  
  184. /* DAC registers. */
  185.  
  186. #define RS_00    0x3C8
  187. #define RS_01    0x3C9
  188. #define RS_02    0x3C6
  189. #define RS_03    0x3C7
  190.  
  191. /* Register read/write helpers. */
  192.  
  193. /* Set an index on `port' to `index', and return the byte read from `port + 1'.
  194.  */
  195. static inline int rread(int port, int index)
  196. {
  197.     outb(port, index);
  198.     return (inb(port + 1));
  199. }
  200.  
  201. /* Use outw to send index and data together.
  202.  */
  203. static inline void rwrite(int port, int index, int value)
  204. {
  205.     outw(port, index | (value << 8));
  206. }
  207.  
  208. /* Read-modify-write.
  209.  */
  210. static inline void rrmw(int port, int index, int protect, int value)
  211. {
  212.     unsigned int u = rread(port, index);
  213.     rwrite(port,index, (u & protect) | value);
  214. }
  215.  
  216. static inline void
  217. S3_unlockRegisters(void)
  218. {
  219.     rwrite(VGA_CRTC_INDEX, S3_REG_LOCK1, S3_LOCK1_KEY);
  220.     rwrite(VGA_CRTC_INDEX, S3_REG_LOCK2, S3_LOCK2_KEY);
  221. }
  222.  
  223. static inline void
  224. S3_lockRegisters(void)
  225. {
  226.     rwrite(VGA_CRTC_INDEX, S3_REG_LOCK1, 0);
  227.     rwrite(VGA_CRTC_INDEX, S3_REG_LOCK2, 0);
  228. }
  229.  
  230. #endif    /* S3MODES_H__ */
  231.