Subversion Repositories Kolibri OS

Rev

Rev 2338 | Rev 2342 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. #include "drmP.h"
  2. #include "drm.h"
  3. #include "i915_drm.h"
  4. #include "i915_drv.h"
  5. #include "intel_drv.h"
  6.  
  7.  
  8. #include <linux/kernel.h>
  9. #include <linux/module.h>
  10. #include <linux/mod_devicetable.h>
  11. #include <errno-base.h>
  12. #include <linux/pci.h>
  13. #include <syscall.h>
  14.  
  15. typedef struct bitmap bitmap_t;
  16.  
  17. void parse_cmdline(char *cmdline, char *log);
  18. int _stdcall display_handler(ioctl_t *io);
  19. int init_agp(void);
  20.  
  21. int create_video(int width, int height, u32_t *outp);
  22. int create_bitmap(bitmap_t **pbitmap, int width, int height);
  23. int video_blit(uint64_t src_offset, int  x, int y,
  24.                     int w, int h, int pitch);
  25.  
  26. static char  log[256];
  27.  
  28. int i915_modeset = 1;
  29.  
  30. u32_t drvEntry(int action, char *cmdline)
  31. {
  32.     struct pci_device_id  *ent;
  33.  
  34.     int     err = 0;
  35.  
  36.     if(action != 1)
  37.         return 0;
  38.  
  39.     if( GetService("DISPLAY") != 0 )
  40.         return 0;
  41.  
  42.     if( cmdline && *cmdline )
  43.         parse_cmdline(cmdline, log);
  44.  
  45.     if(!dbg_open(log))
  46.     {
  47.         strcpy(log, "/RD/1/DRIVERS/i915.log");
  48.  
  49.         if(!dbg_open(log))
  50.         {
  51.             printf("Can't open %s\nExit\n", log);
  52.             return 0;
  53.         };
  54.     }
  55.     dbgprintf("i915_early_preview second edition\n cmdline: %s\n", cmdline);
  56.  
  57.     enum_pci_devices();
  58.  
  59.     err = i915_init();
  60.  
  61.     if(err)
  62.     {
  63.         dbgprintf("Epic Fail :(/n");
  64.  
  65.     };
  66.  
  67.     err = RegService("DISPLAY", display_handler);
  68.  
  69.     if( err != 0)
  70.         dbgprintf("Set DISPLAY handler\n");
  71.  
  72.     return err;
  73. };
  74.  
  75. #define API_VERSION     0x01000100
  76.  
  77. #define SRV_GETVERSION      0
  78. #define SRV_ENUM_MODES      1
  79. #define SRV_SET_MODE        2
  80.  
  81. #define SRV_CREATE_VIDEO    9
  82. #define SRV_BLIT_VIDEO     10
  83. #define SRV_CREATE_BITMAP  11
  84.  
  85. #define check_input(size) \
  86.     if( unlikely((inp==NULL)||(io->inp_size != (size))) )   \
  87.         break;
  88.  
  89. #define check_output(size) \
  90.     if( unlikely((outp==NULL)||(io->out_size != (size))) )   \
  91.         break;
  92.  
  93. int _stdcall display_handler(ioctl_t *io)
  94. {
  95.     int    retval = -1;
  96.     u32_t *inp;
  97.     u32_t *outp;
  98.  
  99.     inp = io->input;
  100.     outp = io->output;
  101.  
  102.     switch(io->io_code)
  103.     {
  104.         case SRV_GETVERSION:
  105.             check_output(4);
  106.             *outp  = API_VERSION;
  107.             retval = 0;
  108.             break;
  109.  
  110.         case SRV_ENUM_MODES:
  111.             dbgprintf("SRV_ENUM_MODES inp %x inp_size %x out_size %x\n",
  112.                        inp, io->inp_size, io->out_size );
  113.             check_output(4);
  114. //            check_input(*outp * sizeof(videomode_t));
  115.             if( i915_modeset)
  116.                 retval = get_videomodes((videomode_t*)inp, outp);
  117.             break;
  118.  
  119.         case SRV_SET_MODE:
  120.             dbgprintf("SRV_SET_MODE inp %x inp_size %x\n",
  121.                        inp, io->inp_size);
  122.             check_input(sizeof(videomode_t));
  123.             if( i915_modeset )
  124.                 retval = set_user_mode((videomode_t*)inp);
  125.             break;
  126.  
  127.         case SRV_CREATE_VIDEO:
  128.             check_input(2);
  129.             check_output(4);
  130.             retval = create_video(inp[0], inp[1], outp);
  131.             break;
  132.  
  133.         case SRV_BLIT_VIDEO:
  134.             video_blit( ((uint64_t*)inp)[0], inp[2], inp[3],
  135.                     inp[4], inp[5], inp[6]);
  136.  
  137.             retval = 0;
  138.             break;
  139.  
  140.         case SRV_CREATE_BITMAP:
  141.             check_input(8);
  142.             check_output(4);
  143.             retval = create_bitmap((bitmap_t**)outp, inp[0], inp[1]);
  144.             break;
  145.  
  146.     };
  147.  
  148.     return retval;
  149. }
  150.  
  151.  
  152. #define PCI_CLASS_REVISION      0x08
  153. #define PCI_CLASS_DISPLAY_VGA   0x0300
  154. #define PCI_CLASS_BRIDGE_HOST   0x0600
  155. #define PCI_CLASS_BRIDGE_ISA    0x0601
  156.  
  157. int pci_scan_filter(u32_t id, u32_t busnr, u32_t devfn)
  158. {
  159.     u16_t vendor, device;
  160.     u32_t class;
  161.     int   ret = 0;
  162.  
  163.     vendor   = id & 0xffff;
  164.     device   = (id >> 16) & 0xffff;
  165.  
  166.     if(vendor == 0x8086)
  167.     {
  168.         class = PciRead32(busnr, devfn, PCI_CLASS_REVISION);
  169.         class >>= 16;
  170.  
  171.         if( (class == PCI_CLASS_DISPLAY_VGA) ||
  172.             (class == PCI_CLASS_BRIDGE_HOST) ||
  173.             (class == PCI_CLASS_BRIDGE_ISA))
  174.             ret = 1;
  175.     }
  176.     return ret;
  177. };
  178.  
  179.  
  180. static char* parse_path(char *p, char *log)
  181. {
  182.     char  c;
  183.  
  184.     while( (c = *p++) == ' ');
  185.         p--;
  186.     while( (c = *log++ = *p++) && (c != ' '));
  187.     *log = 0;
  188.  
  189.     return p;
  190. };
  191.  
  192. void parse_cmdline(char *cmdline, char *log)
  193. {
  194.     char *p = cmdline;
  195.  
  196.     char c = *p++;
  197.  
  198.     while( c )
  199.     {
  200.         if( c == '-')
  201.         {
  202.             switch(*p++)
  203.             {
  204.                 case 'l':
  205.                     p = parse_path(p, log);
  206.                     break;
  207.             };
  208.         };
  209.         c = *p++;
  210.     };
  211. };
  212.  
  213.