linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH][RFC] add support for PC-9800 architecture (12/26) kernel
@ 2002-10-17 11:40 Osamu Tomita
  0 siblings, 0 replies; only message in thread
From: Osamu Tomita @ 2002-10-17 11:40 UTC (permalink / raw)
  To: LKML; +Cc: Linus Torvalds

This is part 12/26 of patchset for add support NEC PC-9800 architecture,
against 2.5.43.

Summary:
  - add PC-9800 special features.
  - CLOCK_TICK is not constant.
  - odd/even only IO region mapping.

diffstat:
 include/linux/ioport.h |   14 ++++++
 kernel/dma.c           |    3 +
 kernel/resource.c      |  100 ++++++++++++++++++++++++++++++++++++++++++++++++-
 kernel/timer.c         |    5 ++
 4 files changed, 119 insertions(+), 3 deletions(-)

patch:
diff -urN linux/kernel/dma.c linux98/kernel/dma.c
--- linux/kernel/dma.c	Sun Aug 11 10:41:22 2002
+++ linux98/kernel/dma.c	Wed Aug 21 09:53:59 2002
@@ -9,6 +9,7 @@
  *   [It also happened to remove the sizeof(char *) == sizeof(int)
  *   assumption introduced because of those /proc/dma patches. -- Hennus]
  */
+#include <linux/config.h>
 #include <linux/module.h>
 #include <linux/kernel.h>
 #include <linux/errno.h>
@@ -62,10 +63,12 @@
 	{ 0, 0 },
 	{ 0, 0 },
 	{ 0, 0 },
+#ifndef CONFIG_PC9800
 	{ 1, "cascade" },
 	{ 0, 0 },
 	{ 0, 0 },
 	{ 0, 0 }
+#endif
 };
 
 
diff -urN linux/kernel/resource.c linux98/kernel/resource.c
--- linux/kernel/resource.c	Fri May 10 10:07:53 2002
+++ linux98/kernel/resource.c	Fri May 10 10:19:19 2002
@@ -7,6 +7,7 @@
  * Arbitrary resource management.
  */
 
+#include <linux/config.h>
 #include <linux/sched.h>
 #include <linux/errno.h>
 #include <linux/ioport.h>
@@ -15,6 +16,12 @@
 #include <linux/spinlock.h>
 #include <asm/io.h>
 
+#ifdef CONFIG_PC9800
+/*
+#define RESOURCE98_DEBUG
+*/
+#endif
+
 struct resource ioport_resource = { "PCI IO", 0x0000, IO_SPACE_LIMIT, IORESOURCE_IO };
 struct resource iomem_resource = { "PCI mem", 0x00000000, 0xffffffff, IORESOURCE_MEM };
 
@@ -40,7 +47,13 @@
 		if (!name)
 			name = "<BAD>";
 
+#ifdef CONFIG_PC9800
+		buf += sprintf(buf, fmt + offset, from, to,
+			       entry->flags & IORESOURCE98_SPARSE ? '*' : ' ',
+			       name);
+#else
 		buf += sprintf(buf, fmt + offset, from, to, name);
+#endif
 		if (entry->child)
 			buf = do_resource_list(entry->child, fmt, offset-2, buf, end);
 		entry = entry->sibling;
@@ -54,9 +67,15 @@
 	char *fmt;
 	int retval;
 
+#ifdef CONFIG_PC9800
+	fmt = "        %08lx-%08lx%c : %s\n";
+	if (root->end < 0x10000)
+		fmt = "        %04lx-%04lx%c : %s\n";
+#else
 	fmt = "        %08lx-%08lx : %s\n";
 	if (root->end < 0x10000)
 		fmt = "        %04lx-%04lx : %s\n";
+#endif
 	read_lock(&resource_lock);
 	retval = do_resource_list(root->child, fmt, 8, buf, buf + size) - buf;
 	read_unlock(&resource_lock);
@@ -70,6 +89,11 @@
 	unsigned long end = new->end;
 	struct resource *tmp, **p;
 
+#ifdef RESOURCE98_DEBUG
+	printk(KERN_DEBUG "request_resource(): new={%lx-%lx%c, \"%s\"}\n",
+	       new->start, new->end,
+	       (new->flags&IORESOURCE98_SPARSE) ? '*' : ' ', new->name);
+#endif
 	if (end < start)
 		return root;
 	if (start < root->start)
@@ -79,7 +103,23 @@
 	p = &root->child;
 	for (;;) {
 		tmp = *p;
-		if (!tmp || tmp->start > end) {
+#ifdef RESOURCE98_DEBUG
+		if (tmp)
+			printk(KERN_DEBUG "request_resource(): "
+				"compare {%lx-%lx%c,\"%s\"}\n",
+				tmp->start, tmp->end,
+				(tmp->flags & IORESOURCE98_SPARSE) ? '*' : ' ',
+				tmp->name);
+#endif
+		if (!tmp || tmp->start > end
+#ifdef CONFIG_PC9800
+		    || ((tmp->flags & IORESOURCE98_SPARSE
+			 || tmp->end == tmp->start)
+			&& (new->flags & IORESOURCE98_SPARSE || end == start)
+			&& ((start ^ tmp->start) & 1) != 0
+			&& (tmp->start > start))
+#endif
+			) {
 			new->sibling = tmp;
 			*p = new;
 			new->parent = root;
@@ -88,6 +128,13 @@
 		p = &tmp->sibling;
 		if (tmp->end < start)
 			continue;
+#ifdef CONFIG_PC9800
+		if ((tmp->flags & IORESOURCE98_SPARSE
+		     || tmp->end == tmp->start)
+		    && (new->flags & IORESOURCE98_SPARSE || end == start)
+		    && ((start ^ tmp->start) & 1) != 0)
+			continue;
+#endif
 		return tmp;
 	}
 }
@@ -216,7 +263,11 @@
  *
  * Release-region releases a matching busy region.
  */
+#ifndef CONFIG_PC9800
 struct resource * __request_region(struct resource *parent, unsigned long start, unsigned long n, const char *name)
+#else
+struct resource * __request_region(struct resource *parent, unsigned long start, long n, const char *name)
+#endif
 {
 	struct resource *res = kmalloc(sizeof(*res), GFP_KERNEL);
 
@@ -224,8 +275,15 @@
 		memset(res, 0, sizeof(*res));
 		res->name = name;
 		res->start = start;
-		res->end = start + n - 1;
 		res->flags = IORESOURCE_BUSY;
+#ifdef CONFIG_PC9800
+		if ((long) n < 0) {
+			n = -n;
+			if (n > 1)
+				res->flags |= IORESOURCE98_SPARSE;
+		}
+#endif
+		res->end = start + n - 1;
 
 		write_lock(&resource_lock);
 
@@ -251,7 +309,11 @@
 	return res;
 }
 
+#ifndef CONFIG_PC9800
 int __check_region(struct resource *parent, unsigned long start, unsigned long n)
+#else
+int __check_region(struct resource *parent, unsigned long start, long n)
+#endif
 {
 	struct resource * res;
 
@@ -264,12 +326,25 @@
 	return 0;
 }
 
+#ifndef CONFIG_PC9800
 void __release_region(struct resource *parent, unsigned long start, unsigned long n)
+#else
+void __release_region(struct resource *parent, unsigned long start, long n)
+#endif
 {
 	struct resource **p;
 	unsigned long end;
+#ifdef CONFIG_PC9800
+	unsigned long sparse_flag = 0;
+#endif
 
 	p = &parent->child;
+#ifdef CONFIG_PC9800
+	if ((long)n < 0) {
+		n = -n;
+		sparse_flag = IORESOURCE98_SPARSE;
+	}
+#endif
 	end = start + n - 1;
 
 	for (;;) {
@@ -277,11 +352,25 @@
 
 		if (!res)
 			break;
+#ifdef RESOURCE98_DEBUG
+		printk(KERN_DEBUG
+		       "__release_region(): compare {%lx-%lx%c,\"%s\"}\n",
+		       res->start, res->end,
+		       (res->flags & IORESOURCE98_SPARSE) ? '*' : ' ',
+		       res->name);
+#endif
 		if (res->start <= start && res->end >= end) {
 			if (!(res->flags & IORESOURCE_BUSY)) {
 				p = &res->child;
 				continue;
 			}
+#ifdef CONFIG_PC9800
+			if ((res->flags & IORESOURCE98_SPARSE) ^ sparse_flag) {
+				/* Sparseness does not match. */
+				p = &res->sibling;
+				continue;
+			}
+#endif
 			if (res->start != start || res->end != end)
 				break;
 			*p = res->sibling;
@@ -317,6 +406,13 @@
 			res->end = io_start + io_num - 1;
 			res->flags = IORESOURCE_BUSY;
 			res->child = NULL;
+#ifdef CONFIG_PC9800
+			if (io_num < 0) {
+				res->end = io_start - io_num - 1;
+				if (io_num < -1)
+					res->flags |= IORESOURCE98_SPARSE;
+			}
+#endif
 			if (request_resource(res->start >= 0x10000 ? &iomem_resource : &ioport_resource, res) == 0)
 				reserved = x+1;
 		}
diff -urN linux/kernel/timer.c linux98/kernel/timer.c
--- linux/kernel/timer.c	Sat Oct 12 13:21:36 2002
+++ linux98/kernel/timer.c	Sat Oct 12 14:18:54 2002
@@ -376,8 +376,13 @@
 /*
  * Timekeeping variables
  */
+#ifndef CONFIG_PC9800
 unsigned long tick_usec = TICK_USEC; 		/* ACTHZ   period (usec) */
 unsigned long tick_nsec = TICK_NSEC(TICK_USEC);	/* USER_HZ period (nsec) */
+#else
+extern unsigned long tick_usec; 		/* ACTHZ   period (usec) */
+extern unsigned long tick_nsec;			/* USER_HZ period (nsec) */
+#endif
 
 /* The current time */
 struct timespec xtime __attribute__ ((aligned (16)));
diff -urN linux/include/linux/ioport.h linux98/include/linux/ioport.h
--- linux/include/linux/ioport.h	Fri May 10 10:07:53 2002
+++ linux98/include/linux/ioport.h	Fri May 10 10:19:19 2002
@@ -79,6 +79,10 @@
 #define IORESOURCE_MEM_SHADOWABLE	(1<<5)	/* dup: IORESOURCE_SHADOWABLE */
 #define IORESOURCE_MEM_EXPANSIONROM	(1<<6)
 
+#ifdef CONFIG_PC9800
+#define IORESOURCE98_SPARSE 0x100000 /* sparse region */
+#endif
+
 /* PC/ISA/whatever - the normal PC address spaces: IO and memory */
 extern struct resource ioport_resource;
 extern struct resource iomem_resource;
@@ -99,8 +103,11 @@
 /* Convenience shorthand with allocation */
 #define request_region(start,n,name)	__request_region(&ioport_resource, (start), (n), (name))
 #define request_mem_region(start,n,name) __request_region(&iomem_resource, (start), (n), (name))
-
+#ifndef CONFIG_PC9800
 extern struct resource * __request_region(struct resource *, unsigned long start, unsigned long n, const char *name);
+#else
+extern struct resource * __request_region(struct resource *, unsigned long start, long n, const char *name);
+#endif
 
 /* Compatibility cruft */
 #define check_region(start,n)	__check_region(&ioport_resource, (start), (n))
@@ -108,8 +115,13 @@
 #define check_mem_region(start,n)	__check_region(&iomem_resource, (start), (n))
 #define release_mem_region(start,n)	__release_region(&iomem_resource, (start), (n))
 
+#ifndef CONFIG_PC9800
 extern int __check_region(struct resource *, unsigned long, unsigned long);
 extern void __release_region(struct resource *, unsigned long, unsigned long);
+#else
+extern int __check_region(struct resource *, unsigned long, long);
+extern void __release_region(struct resource *, unsigned long, long);
+#endif
 
 #define get_ioport_list(buf)	get_resource_list(&ioport_resource, buf, PAGE_SIZE)
 #define get_mem_list(buf)	get_resource_list(&iomem_resource, buf, PAGE_SIZE)

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2002-10-17 11:48 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2002-10-17 11:40 [PATCH][RFC] add support for PC-9800 architecture (12/26) kernel Osamu Tomita

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).