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