shmem.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. /* $Id: shmem.c,v 1.2.10.1 2001/09/23 22:24:59 kai Exp $
  2. *
  3. * Copyright (C) 1996 SpellCaster Telecommunications Inc.
  4. *
  5. * Card functions implementing ISDN4Linux functionality
  6. *
  7. * This software may be used and distributed according to the terms
  8. * of the GNU General Public License, incorporated herein by reference.
  9. *
  10. * For more information, please contact gpl-info@spellcast.com or write:
  11. *
  12. * SpellCaster Telecommunications Inc.
  13. * 5621 Finch Avenue East, Unit #3
  14. * Scarborough, Ontario Canada
  15. * M1B 2T9
  16. * +1 (416) 297-8565
  17. * +1 (416) 297-6433 Facsimile
  18. */
  19. #include "includes.h" /* This must be first */
  20. #include "hardware.h"
  21. #include "card.h"
  22. /*
  23. *
  24. */
  25. void memcpy_toshmem(int card, void *dest, const void *src, size_t n)
  26. {
  27. unsigned long flags;
  28. unsigned char ch;
  29. unsigned long dest_rem = ((unsigned long) dest) % 0x4000;
  30. if (!IS_VALID_CARD(card)) {
  31. pr_debug("Invalid param: %d is not a valid card id\n", card);
  32. return;
  33. }
  34. if (n > SRAM_PAGESIZE)
  35. return;
  36. /*
  37. * determine the page to load from the address
  38. */
  39. ch = (unsigned long) dest / SRAM_PAGESIZE;
  40. pr_debug("%s: loaded page %d\n", sc_adapter[card]->devicename, ch);
  41. /*
  42. * Block interrupts and load the page
  43. */
  44. spin_lock_irqsave(&sc_adapter[card]->lock, flags);
  45. outb(((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE) >> 14) | 0x80,
  46. sc_adapter[card]->ioport[sc_adapter[card]->shmem_pgport]);
  47. memcpy_toio((void __iomem *)(sc_adapter[card]->rambase + dest_rem), src, n);
  48. spin_unlock_irqrestore(&sc_adapter[card]->lock, flags);
  49. pr_debug("%s: set page to %#x\n", sc_adapter[card]->devicename,
  50. ((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE) >> 14) | 0x80);
  51. pr_debug("%s: copying %zu bytes from %#lx to %#lx\n",
  52. sc_adapter[card]->devicename, n,
  53. (unsigned long) src,
  54. sc_adapter[card]->rambase + ((unsigned long) dest % 0x4000));
  55. }
  56. /*
  57. * Reverse of above
  58. */
  59. void memcpy_fromshmem(int card, void *dest, const void *src, size_t n)
  60. {
  61. unsigned long flags;
  62. unsigned char ch;
  63. if (!IS_VALID_CARD(card)) {
  64. pr_debug("Invalid param: %d is not a valid card id\n", card);
  65. return;
  66. }
  67. if (n > SRAM_PAGESIZE) {
  68. return;
  69. }
  70. /*
  71. * determine the page to load from the address
  72. */
  73. ch = (unsigned long) src / SRAM_PAGESIZE;
  74. pr_debug("%s: loaded page %d\n", sc_adapter[card]->devicename, ch);
  75. /*
  76. * Block interrupts and load the page
  77. */
  78. spin_lock_irqsave(&sc_adapter[card]->lock, flags);
  79. outb(((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE) >> 14) | 0x80,
  80. sc_adapter[card]->ioport[sc_adapter[card]->shmem_pgport]);
  81. memcpy_fromio(dest, (void *)(sc_adapter[card]->rambase +
  82. ((unsigned long) src % 0x4000)), n);
  83. spin_unlock_irqrestore(&sc_adapter[card]->lock, flags);
  84. pr_debug("%s: set page to %#x\n", sc_adapter[card]->devicename,
  85. ((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE) >> 14) | 0x80);
  86. /* pr_debug("%s: copying %d bytes from %#x to %#x\n",
  87. sc_adapter[card]->devicename, n,
  88. sc_adapter[card]->rambase + ((unsigned long) src %0x4000), (unsigned long) dest); */
  89. }
  90. #if 0
  91. void memset_shmem(int card, void *dest, int c, size_t n)
  92. {
  93. unsigned long flags;
  94. unsigned char ch;
  95. if (!IS_VALID_CARD(card)) {
  96. pr_debug("Invalid param: %d is not a valid card id\n", card);
  97. return;
  98. }
  99. if (n > SRAM_PAGESIZE) {
  100. return;
  101. }
  102. /*
  103. * determine the page to load from the address
  104. */
  105. ch = (unsigned long) dest / SRAM_PAGESIZE;
  106. pr_debug("%s: loaded page %d\n", sc_adapter[card]->devicename, ch);
  107. /*
  108. * Block interrupts and load the page
  109. */
  110. spin_lock_irqsave(&sc_adapter[card]->lock, flags);
  111. outb(((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE) >> 14) | 0x80,
  112. sc_adapter[card]->ioport[sc_adapter[card]->shmem_pgport]);
  113. memset_io(sc_adapter[card]->rambase +
  114. ((unsigned long) dest % 0x4000), c, n);
  115. pr_debug("%s: set page to %#x\n", sc_adapter[card]->devicename,
  116. ((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE) >> 14) | 0x80);
  117. spin_unlock_irqrestore(&sc_adapter[card]->lock, flags);
  118. }
  119. #endif /* 0 */