11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* $Id: shmem.c,v 1.2.10.1 2001/09/23 22:24:59 kai Exp $ 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 1996 SpellCaster Telecommunications Inc. 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Card functions implementing ISDN4Linux functionality 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * This software may be used and distributed according to the terms 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * of the GNU General Public License, incorporated herein by reference. 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * For more information, please contact gpl-info@spellcast.com or write: 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * SpellCaster Telecommunications Inc. 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 5621 Finch Avenue East, Unit #3 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Scarborough, Ontario Canada 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * M1B 2T9 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * +1 (416) 297-8565 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * +1 (416) 297-6433 Facsimile 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "includes.h" /* This must be first */ 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "hardware.h" 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include "card.h" 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid memcpy_toshmem(int card, void *dest, const void *src, size_t n) 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long flags; 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char ch; 319317d4313e0cd51b2256ea9a9316f2d8561e37a8Jeff Garzik unsigned long dest_rem = ((unsigned long) dest) % 0x4000; 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 339317d4313e0cd51b2256ea9a9316f2d8561e37a8Jeff Garzik if (!IS_VALID_CARD(card)) { 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pr_debug("Invalid param: %d is not a valid card id\n", card); 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 389317d4313e0cd51b2256ea9a9316f2d8561e37a8Jeff Garzik if (n > SRAM_PAGESIZE) 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * determine the page to load from the address 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ch = (unsigned long) dest / SRAM_PAGESIZE; 45475be4d85a274d0961593db41cf85689db1d583cJoe Perches pr_debug("%s: loaded page %d\n", sc_adapter[card]->devicename, ch); 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Block interrupts and load the page 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds spin_lock_irqsave(&sc_adapter[card]->lock, flags); 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds outb(((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE) >> 14) | 0x80, 52475be4d85a274d0961593db41cf85689db1d583cJoe Perches sc_adapter[card]->ioport[sc_adapter[card]->shmem_pgport]); 5366ba886254edbbd9442d30f1eef6f6fb0145027dFrank Lichtenheld memcpy_toio((void __iomem *)(sc_adapter[card]->rambase + dest_rem), src, n); 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds spin_unlock_irqrestore(&sc_adapter[card]->lock, flags); 55475be4d85a274d0961593db41cf85689db1d583cJoe Perches pr_debug("%s: set page to %#x\n", sc_adapter[card]->devicename, 56475be4d85a274d0961593db41cf85689db1d583cJoe Perches ((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE) >> 14) | 0x80); 570d5048a96fc51d976ac777e3d78762b4dd241693Randy Dunlap pr_debug("%s: copying %zu bytes from %#lx to %#lx\n", 58475be4d85a274d0961593db41cf85689db1d583cJoe Perches sc_adapter[card]->devicename, n, 59475be4d85a274d0961593db41cf85689db1d583cJoe Perches (unsigned long) src, 60475be4d85a274d0961593db41cf85689db1d583cJoe Perches sc_adapter[card]->rambase + ((unsigned long) dest % 0x4000)); 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Reverse of above 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid memcpy_fromshmem(int card, void *dest, const void *src, size_t n) 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long flags; 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char ch; 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 71475be4d85a274d0961593db41cf85689db1d583cJoe Perches if (!IS_VALID_CARD(card)) { 721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pr_debug("Invalid param: %d is not a valid card id\n", card); 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 76475be4d85a274d0961593db41cf85689db1d583cJoe Perches if (n > SRAM_PAGESIZE) { 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * determine the page to load from the address 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ch = (unsigned long) src / SRAM_PAGESIZE; 84475be4d85a274d0961593db41cf85689db1d583cJoe Perches pr_debug("%s: loaded page %d\n", sc_adapter[card]->devicename, ch); 85475be4d85a274d0961593db41cf85689db1d583cJoe Perches 86475be4d85a274d0961593db41cf85689db1d583cJoe Perches 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Block interrupts and load the page 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds spin_lock_irqsave(&sc_adapter[card]->lock, flags); 911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds outb(((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE) >> 14) | 0x80, 93475be4d85a274d0961593db41cf85689db1d583cJoe Perches sc_adapter[card]->ioport[sc_adapter[card]->shmem_pgport]); 94475be4d85a274d0961593db41cf85689db1d583cJoe Perches memcpy_fromio(dest, (void *)(sc_adapter[card]->rambase + 95475be4d85a274d0961593db41cf85689db1d583cJoe Perches ((unsigned long) src % 0x4000)), n); 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds spin_unlock_irqrestore(&sc_adapter[card]->lock, flags); 97475be4d85a274d0961593db41cf85689db1d583cJoe Perches pr_debug("%s: set page to %#x\n", sc_adapter[card]->devicename, 98475be4d85a274d0961593db41cf85689db1d583cJoe Perches ((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE) >> 14) | 0x80); 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* pr_debug("%s: copying %d bytes from %#x to %#x\n", 100475be4d85a274d0961593db41cf85689db1d583cJoe Perches sc_adapter[card]->devicename, n, 101475be4d85a274d0961593db41cf85689db1d583cJoe Perches sc_adapter[card]->rambase + ((unsigned long) src %0x4000), (unsigned long) dest); */ 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 104e3ca5e762c2aca373f1762cbc622ebe20fd20869Adrian Bunk#if 0 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsvoid memset_shmem(int card, void *dest, int c, size_t n) 1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{ 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned long flags; 1081da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds unsigned char ch; 1091da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 110475be4d85a274d0961593db41cf85689db1d583cJoe Perches if (!IS_VALID_CARD(card)) { 1111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds pr_debug("Invalid param: %d is not a valid card id\n", card); 1121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 1131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 115475be4d85a274d0961593db41cf85689db1d583cJoe Perches if (n > SRAM_PAGESIZE) { 1161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds return; 1171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds } 1181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * determine the page to load from the address 1211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds ch = (unsigned long) dest / SRAM_PAGESIZE; 123475be4d85a274d0961593db41cf85689db1d583cJoe Perches pr_debug("%s: loaded page %d\n", sc_adapter[card]->devicename, ch); 1241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds /* 1261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Block interrupts and load the page 1271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 1281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds spin_lock_irqsave(&sc_adapter[card]->lock, flags); 1291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds outb(((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE) >> 14) | 0x80, 131475be4d85a274d0961593db41cf85689db1d583cJoe Perches sc_adapter[card]->ioport[sc_adapter[card]->shmem_pgport]); 1321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds memset_io(sc_adapter[card]->rambase + 133475be4d85a274d0961593db41cf85689db1d583cJoe Perches ((unsigned long) dest % 0x4000), c, n); 134475be4d85a274d0961593db41cf85689db1d583cJoe Perches pr_debug("%s: set page to %#x\n", sc_adapter[card]->devicename, 135475be4d85a274d0961593db41cf85689db1d583cJoe Perches ((sc_adapter[card]->shmem_magic + ch * SRAM_PAGESIZE) >> 14) | 0x80); 1361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds spin_unlock_irqrestore(&sc_adapter[card]->lock, flags); 1371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds} 138e3ca5e762c2aca373f1762cbc622ebe20fd20869Adrian Bunk#endif /* 0 */ 139