sis_ds.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:9k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /* sis_ds.c -- Private header for Direct Rendering Manager -*- linux-c -*-
  2.  * Created: Mon Jan  4 10:05:05 1999 by sclin@sis.com.tw
  3.  *
  4.  * Copyright 2000 Silicon Integrated Systems Corp, Inc., HsinChu, Taiwan.
  5.  * All rights reserved.
  6.  *
  7.  * Permission is hereby granted, free of charge, to any person obtaining a
  8.  * copy of this software and associated documentation files (the "Software"),
  9.  * to deal in the Software without restriction, including without limitation
  10.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  11.  * and/or sell copies of the Software, and to permit persons to whom the
  12.  * Software is furnished to do so, subject to the following conditions:
  13.  * 
  14.  * The above copyright notice and this permission notice (including the next
  15.  * paragraph) shall be included in all copies or substantial portions of the
  16.  * Software.
  17.  * 
  18.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  19.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  20.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  21.  * PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
  22.  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
  23.  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  24.  * DEALINGS IN THE SOFTWARE.
  25.  * 
  26.  * Authors:
  27.  *    Sung-Ching Lin <sclin@sis.com.tw>
  28.  * 
  29.  */
  30. #define __NO_VERSION__
  31. #include <linux/module.h>
  32. #include <linux/delay.h>
  33. #include <linux/errno.h>
  34. #include <linux/kernel.h>
  35. #include <linux/malloc.h>
  36. #include <linux/poll.h>
  37. #include <asm/io.h>
  38. #include <linux/pci.h>
  39. #include "sis_ds.h"
  40. /* Set Data Structure, not check repeated value
  41.  * temporarily used
  42.  */
  43. set_t *setInit(void)
  44. {
  45.   int i;
  46.   set_t *set;
  47.   set = (set_t *)MALLOC(sizeof(set_t));
  48.   for(i = 0; i < SET_SIZE; i++){
  49.     set->list[i].free_next = i+1;    
  50.     set->list[i].alloc_next = -1;
  51.   }    
  52.   set->list[SET_SIZE-1].free_next = -1;
  53.   set->free = 0;
  54.   set->alloc = -1;
  55.   set->trace = -1;
  56.   
  57.   return set;
  58. }
  59. int setAdd(set_t *set, ITEM_TYPE item)
  60. {
  61.   int free = set->free;
  62.   
  63.   if(free != -1){
  64.     set->list[free].val = item;
  65.     set->free = set->list[free].free_next;
  66.   }
  67.   else{
  68.     return 0;
  69.   }
  70.   set->list[free].alloc_next = set->alloc;
  71.   set->alloc = free;  
  72.   set->list[free].free_next = -1;    
  73.   return 1;
  74. }
  75. int setDel(set_t *set, ITEM_TYPE item)
  76. {
  77.   int alloc = set->alloc;
  78.   int prev = -1;  
  79.   
  80.   while(alloc != -1){
  81.     if(set->list[alloc].val == item){
  82.       if(prev != -1)      
  83.         set->list[prev].alloc_next = set->list[alloc].alloc_next; 
  84.       else
  85.         set->alloc = set->list[alloc].alloc_next;
  86.       break;
  87.     }
  88.     prev = alloc;
  89.     alloc = set->list[alloc].alloc_next;      
  90.   }
  91.   if(alloc == -1)
  92.     return 0;
  93.   
  94.   set->list[alloc].free_next = set->free;
  95.   set->free = alloc;
  96.   set->list[alloc].alloc_next = -1;   
  97.   return 1;
  98. }
  99. /* setFirst -> setAdd -> setNext is wrong */
  100. int setFirst(set_t *set, ITEM_TYPE *item)
  101. {
  102.   if(set->alloc == -1)
  103.     return 0;
  104.   *item = set->list[set->alloc].val;
  105.   set->trace = set->list[set->alloc].alloc_next; 
  106.   return 1;
  107. }
  108. int setNext(set_t *set, ITEM_TYPE *item)
  109. {
  110.   if(set->trace == -1)
  111.     return 0;
  112.   
  113.   *item = set->list[set->trace].val;
  114.   set->trace = set->list[set->trace].alloc_next;      
  115.   return 1;
  116. }
  117. int setDestroy(set_t *set)
  118. {
  119.   FREE(set);
  120.   return 1;
  121. }
  122. /*
  123.  * GLX Hardware Device Driver common code
  124.  * Copyright (C) 1999 Keith Whitwell
  125.  *
  126.  * Permission is hereby granted, free of charge, to any person obtaining a
  127.  * copy of this software and associated documentation files (the "Software"),
  128.  * to deal in the Software without restriction, including without limitation
  129.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  130.  * and/or sell copies of the Software, and to permit persons to whom the
  131.  * Software is furnished to do so, subject to the following conditions:
  132.  *
  133.  * The above copyright notice and this permission notice shall be included
  134.  * in all copies or substantial portions of the Software.
  135.  *
  136.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  137.  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  138.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  139.  * KEITH WHITWELL, OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY CLAIM, 
  140.  * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 
  141.  * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE 
  142.  * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  143.  *
  144.  */
  145. #define ISFREE(bptr) ((bptr)->free)
  146. #define PRINTF(fmt, arg...) do{}while(0)
  147. #define fprintf(fmt, arg...) do{}while(0)
  148. static void *calloc(size_t nmemb, size_t size)
  149. {
  150.   void *addr;
  151.   addr = kmalloc(nmemb*size, GFP_KERNEL);
  152.   memset(addr, 0, nmemb*size);
  153.   return addr;
  154. }
  155. #define free(n) kfree(n)
  156.            
  157. void mmDumpMemInfo( memHeap_t *heap )
  158. {
  159.   TMemBlock *p;
  160.   PRINTF ("Memory heap %p:n", heap);
  161.   if (heap == 0) {
  162.     PRINTF ("  heap == 0n");
  163.   } else {
  164.     p = (TMemBlock *)heap;
  165.     while (p) {
  166.       PRINTF ("  Offset:%08x, Size:%08x, %c%cn",p->ofs,p->size,
  167.      p->free ? '.':'U',
  168.      p->reserved ? 'R':'.');
  169.       p = p->next;
  170.     }
  171.   }
  172.   PRINTF ("End of memory blocksn");
  173. }
  174. memHeap_t *mmInit(int ofs,
  175.   int size)
  176. {
  177.    PMemBlock blocks;
  178.   
  179.    if (size <= 0) {
  180.       return 0;
  181.    }
  182.    blocks = (TMemBlock *) calloc(1,sizeof(TMemBlock));
  183.    if (blocks) {
  184.       blocks->ofs = ofs;
  185.       blocks->size = size;
  186.       blocks->free = 1;
  187.       return (memHeap_t *)blocks;
  188.    } else
  189.       return 0;
  190. }
  191. /* Kludgey workaround for existing i810 server.  Remove soon.
  192.  */
  193. memHeap_t *mmAddRange( memHeap_t *heap,
  194.        int ofs,
  195.        int size )
  196. {
  197.    PMemBlock blocks;
  198.    blocks = (TMemBlock *) calloc(2,sizeof(TMemBlock));
  199.    if (blocks) {
  200.       blocks[0].size = size;
  201.       blocks[0].free = 1;
  202.       blocks[0].ofs = ofs;
  203.       blocks[0].next = &blocks[1];
  204.       /* Discontinuity - stops JoinBlock from trying to join non-adjacent
  205.        * ranges.
  206.        */
  207.       blocks[1].size = 0;
  208.       blocks[1].free = 0;
  209.       blocks[1].ofs = ofs+size;
  210.       blocks[1].next = (PMemBlock) heap;      
  211.       return (memHeap_t *)blocks;
  212.    } 
  213.    else
  214.       return heap;
  215. }
  216. static TMemBlock* SliceBlock(TMemBlock *p, 
  217.      int startofs, int size, 
  218.      int reserved, int alignment)
  219. {
  220.   TMemBlock *newblock;
  221.   /* break left */
  222.   if (startofs > p->ofs) {
  223.     newblock = (TMemBlock*) calloc(1,sizeof(TMemBlock));
  224.     newblock->ofs = startofs;
  225.     newblock->size = p->size - (startofs - p->ofs);
  226.     newblock->free = 1;
  227.     newblock->next = p->next;
  228.     p->size -= newblock->size;
  229.     p->next = newblock;
  230.     p = newblock;
  231.   }
  232.   /* break right */
  233.   if (size < p->size) {
  234.     newblock = (TMemBlock*) calloc(1,sizeof(TMemBlock));
  235.     newblock->ofs = startofs + size;
  236.     newblock->size = p->size - size;
  237.     newblock->free = 1;
  238.     newblock->next = p->next;
  239.     p->size = size;
  240.     p->next = newblock;
  241.   }
  242.   /* p = middle block */
  243.   p->align = alignment;
  244.   p->free = 0;
  245.   p->reserved = reserved;
  246.   return p;
  247. }
  248. PMemBlock mmAllocMem( memHeap_t *heap, int size, int align2, int startSearch)
  249. {
  250.   int mask,startofs,endofs;
  251.   TMemBlock *p;
  252.   if (!heap || align2 < 0 || size <= 0)
  253.     return NULL;
  254.   mask = (1 << align2)-1;
  255.   startofs = 0;
  256.   p = (TMemBlock *)heap;
  257.   while (p) {
  258.     if (ISFREE(p)) {
  259.       startofs = (p->ofs + mask) & ~mask;
  260.       if ( startofs < startSearch ) {
  261.        startofs = startSearch;
  262.       }
  263.       endofs = startofs+size;
  264.       if (endofs <= (p->ofs+p->size))
  265. break;
  266.     }
  267.     p = p->next;
  268.   }
  269.   if (!p)
  270.     return NULL;
  271.   p = SliceBlock(p,startofs,size,0,mask+1);
  272.   p->heap = heap;
  273.   return p;
  274. }
  275. static __inline__ int Join2Blocks(TMemBlock *p)
  276. {
  277.   if (p->free && p->next && p->next->free) {
  278.     TMemBlock *q = p->next;
  279.     p->size += q->size;
  280.     p->next = q->next;
  281.     free(q);
  282.     return 1;
  283.   }
  284.   return 0;
  285. }
  286. int mmFreeMem(PMemBlock b)
  287. {
  288.   TMemBlock *p,*prev;
  289.   if (!b)
  290.     return 0;
  291.   if (!b->heap) {
  292.      fprintf(stderr, "no heapn");
  293.      return -1;
  294.   }
  295.   p = b->heap;
  296.   prev = NULL;
  297.   while (p && p != b) {
  298.     prev = p;
  299.     p = p->next;
  300.   }
  301.   if (!p || p->free || p->reserved) {
  302.      if (!p)
  303. fprintf(stderr, "block not found in heapn");
  304.      else if (p->free)
  305. fprintf(stderr, "block already freen");
  306.      else
  307. fprintf(stderr, "block is reservedn");
  308.     return -1;
  309.   }
  310.   p->free = 1;
  311.   Join2Blocks(p);
  312.   if (prev)
  313.     Join2Blocks(prev);
  314.   return 0;
  315. }
  316. int mmReserveMem(memHeap_t *heap, int offset,int size)
  317. {
  318.   int endofs;
  319.   TMemBlock *p;
  320.   if (!heap || size <= 0)
  321.     return -1;
  322.   endofs = offset+size;
  323.   p = (TMemBlock *)heap;
  324.   while (p && p->ofs <= offset) {
  325.     if (ISFREE(p) && endofs <= (p->ofs+p->size)) {
  326.       SliceBlock(p,offset,size,1,1);
  327.       return 0;
  328.     }
  329.     p = p->next;
  330.   }
  331.   return -1;
  332. }
  333. int mmFreeReserved(memHeap_t *heap, int offset)
  334. {
  335.   TMemBlock *p,*prev;
  336.   if (!heap)
  337.     return -1;
  338.   p = (TMemBlock *)heap;
  339.   prev = NULL;
  340.   while (p && p->ofs != offset) {
  341.     prev = p;
  342.     p = p->next;
  343.   }
  344.   if (!p || !p->reserved)
  345.     return -1;
  346.   p->free = 1;
  347.   p->reserved = 0;
  348.   Join2Blocks(p);
  349.   if (prev)
  350.     Join2Blocks(prev);
  351.   return 0;
  352. }
  353. void mmDestroy(memHeap_t *heap)
  354. {
  355.   TMemBlock *p,*q;
  356.   if (!heap)
  357.     return;
  358.   p = (TMemBlock *)heap;
  359.   while (p) {
  360.     q = p->next;
  361.     free(p);
  362.     p = q;
  363.   }
  364. }