public inbox for linux-ia64@vger.kernel.org
 help / color / mirror / Atom feed
* [Linux-ia64] Status of 64K pagesize support
@ 2001-03-16 21:07 Jack Steiner
  2001-03-16 21:25 ` Don Dugger
                   ` (5 more replies)
  0 siblings, 6 replies; 7+ messages in thread
From: Jack Steiner @ 2001-03-16 21:07 UTC (permalink / raw)
  To: linux-ia64

What is the status of support for 64K pagesizes in IA64. Is anyone
actively working this??

I built a 2.4.2 kernel with 64K pages & immediately hit 2
problems:

	- gcc doesnt support 64K alignment (perhaps I am using
	  an old gcc??)

	- drivers/scsi/scsi_dma.c has a bitmap 
	  that overflows with 64K pages.


I dont mind working on these issues but first wanted to check if
anyone else is working on them.

What other issues are people aware of that are lurking.....



-- 
Thanks

Jack Steiner    (651-683-5302)   (vnet 233-5302)      steiner@sgi.com



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Linux-ia64] Status of 64K pagesize support
  2001-03-16 21:07 [Linux-ia64] Status of 64K pagesize support Jack Steiner
@ 2001-03-16 21:25 ` Don Dugger
  2001-03-16 21:38 ` Jim Wilson
                   ` (4 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Don Dugger @ 2001-03-16 21:25 UTC (permalink / raw)
  To: linux-ia64

Jack-

I was working on this and discovered the same two problems you ran
into.  The alignment issue isn't really a problem, turns out that
where that directive is give the code is appropriately aligned
already so just remove the line should be OK.

The bitmap in `scsi_dma.c' is the real issue and needs to be re-written
in a more general fashion.  I don't really have time to work on this
right now so if you're interested go for it.  I'd be interested in
hearing about anything you find out.

On Fri, Mar 16, 2001 at 03:07:53PM -0600, Jack Steiner wrote:
> What is the status of support for 64K pagesizes in IA64. Is anyone
> actively working this??
> 
> I built a 2.4.2 kernel with 64K pages & immediately hit 2
> problems:
> 
> 	- gcc doesnt support 64K alignment (perhaps I am using
> 	  an old gcc??)
> 
> 	- drivers/scsi/scsi_dma.c has a bitmap 
> 	  that overflows with 64K pages.
> 
> 
> I dont mind working on these issues but first wanted to check if
> anyone else is working on them.
> 
> What other issues are people aware of that are lurking.....
> 
> 
> 
> -- 
> Thanks
> 
> Jack Steiner    (651-683-5302)   (vnet 233-5302)      steiner@sgi.com
> 
> 
> _______________________________________________
> Linux-IA64 mailing list
> Linux-IA64@linuxia64.org
> http://lists.linuxia64.org/lists/listinfo/linux-ia64

-- 
Don Dugger
"Censeo Toto nos in Kansa esse decisse." - D. Gale
n0ano@valinux.com
Ph: 303/938-9838


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Linux-ia64] Status of 64K pagesize support
  2001-03-16 21:07 [Linux-ia64] Status of 64K pagesize support Jack Steiner
  2001-03-16 21:25 ` Don Dugger
@ 2001-03-16 21:38 ` Jim Wilson
  2001-03-16 23:03 ` David Mosberger
                   ` (3 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: Jim Wilson @ 2001-03-16 21:38 UTC (permalink / raw)
  To: linux-ia64

Don Dugger of VA has looked at 64K page support.

	- gcc doesnt support 64K alignment (perhaps I am using
	  an old gcc??)

Don reported an assembler problem.  Is that perhaps what you meant?
In gas/read.c, function s_align, there is a check
  if (align > 15)
    {
      align = 15;
      as_bad (_("Alignment too large: %u assumed"), align);
    }
I don't know why it is there.  I would hypothesize limitations of old object
file formats like aout/coff.  This problem has been reported on the
binutils@sources.redhat.com mailing list, but no one there volunteered to
look into the problem.  This is still on my todo list, along with a lot of
more important stuff.

Jim


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Linux-ia64] Status of 64K pagesize support
  2001-03-16 21:07 [Linux-ia64] Status of 64K pagesize support Jack Steiner
  2001-03-16 21:25 ` Don Dugger
  2001-03-16 21:38 ` Jim Wilson
@ 2001-03-16 23:03 ` David Mosberger
  2001-03-22 17:49 ` Jack Steiner
                   ` (2 subsequent siblings)
  5 siblings, 0 replies; 7+ messages in thread
From: David Mosberger @ 2001-03-16 23:03 UTC (permalink / raw)
  To: linux-ia64

>>>>> On Fri, 16 Mar 2001 15:07:53 -0600 (CST), Jack Steiner <steiner@sgi.com> said:

  Jack> What is the status of support for 64K pagesizes in IA64. Is
  Jack> anyone actively working this??

  Jack> I built a 2.4.2 kernel with 64K pages & immediately hit 2
  Jack> problems:

  Jack> 	- gcc doesnt support 64K alignment (perhaps I am using
  Jack> an old gcc??)

  Jack> 	- drivers/scsi/scsi_dma.c has a bitmap that overflows
  Jack> with 64K pages.


  Jack> I dont mind working on these issues but first wanted to check
  Jack> if anyone else is working on them.

  Jack> What other issues are people aware of that are lurking.....

There shouldn't be any.  The VM system should handle it just fine.

	--david


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Linux-ia64] Status of 64K pagesize support
  2001-03-16 21:07 [Linux-ia64] Status of 64K pagesize support Jack Steiner
                   ` (2 preceding siblings ...)
  2001-03-16 23:03 ` David Mosberger
@ 2001-03-22 17:49 ` Jack Steiner
  2001-03-26 17:51 ` Jack Steiner
  2001-03-28 22:26 ` David Mosberger
  5 siblings, 0 replies; 7+ messages in thread
From: Jack Steiner @ 2001-03-22 17:49 UTC (permalink / raw)
  To: linux-ia64

> 
> Jack-
> 
> I was working on this and discovered the same two problems you ran
> into.  The alignment issue isn't really a problem, turns out that
> where that directive is give the code is appropriately aligned
> already so just remove the line should be OK.
> 
> The bitmap in `scsi_dma.c' is the real issue and needs to be re-written
> in a more general fashion.  I don't really have time to work on this
> right now so if you're interested go for it.  I'd be interested in
> hearing about anything you find out.
> 

I took a look at scsi_dma.c. As you pointed out, changing it to work with 
64K pages overflows the bitmap/page (128 bits). 

Fixing this is a little more than I wanted to bite off right now so I took 
an interim approach that may be "good enough" for a while - at least until
someone has more time to invest here. 

It is relatively simple to change scsi_dma.c so that 
	1) it uses longs to represent the free bit map for a page
	2) each bit represents 1024 bytes instead of 512 bytes.

A request to allocate 512 bytes will actually get a 1024 byte chunk.

With this change (& a bunch more), I have been able to boot & run
numerous tests with 64K pages. The only thing not working yet
is swapping (next on my list).




Do you feel that this is an acceptible interim solution.

The scsi_dma.c. patch is appended:


-- 
Thanks

Jack Steiner    (651-683-5302)   (vnet 233-5302)      steiner@sgi.com





diff -Naur linux_base/drivers/scsi/scsi_dma.c linux/drivers/scsi/scsi_dma.c
--- linux_base/drivers/scsi/scsi_dma.c	Mon Mar 12 13:17:38 2001
+++ linux/drivers/scsi/scsi_dma.c	Tue Mar 20 16:35:27 2001
@@ -23,13 +23,25 @@
  * PAGE_SIZE must be a multiple of the sector size (512).  True
  * for all reasonably recent architectures (even the VAX...).
  */
-#define SECTOR_SIZE		512
+#ifdef CONFIG_IA64_PAGE_SIZE_64KB
+#define BIG_SECTORS
+#endif
+
+#ifdef BIG_SECTORS
+#define SECTOR_SHIFT		10
+#else
+#define SECTOR_SHIFT		9
+#endif
+
+#define SECTOR_SIZE		(1<<SECTOR_SHIFT)
 #define SECTORS_PER_PAGE	(PAGE_SIZE/SECTOR_SIZE)
 
 #if SECTORS_PER_PAGE <= 8
 typedef unsigned char FreeSectorBitmap;
 #elif SECTORS_PER_PAGE <= 32
 typedef unsigned int FreeSectorBitmap;
+#elif SECTORS_PER_PAGE <= 64
+typedef unsigned long FreeSectorBitmap;
 #else
 #error You lose.
 #endif
@@ -75,10 +87,14 @@
 	unsigned long flags;
 
 	int i, j;
+#ifdef BIG_SECTORS
+	if (len % SECTOR_SIZE)
+		len += 512;
+#endif
 	if (len % SECTOR_SIZE != 0 || len > PAGE_SIZE)
 		return NULL;
 
-	nbits = len >> 9;
+	nbits = len >> SECTOR_SHIFT;
 	mask = (1 << nbits) - 1;
 
 	spin_lock_irqsave(&allocator_request_lock, flags);
@@ -89,11 +105,11 @@
 				dma_malloc_freelist[i] |= (mask << j);
 				scsi_dma_free_sectors -= nbits;
 #ifdef DEBUG
-				SCSI_LOG_MLQUEUE(3, printk("SMalloc: %d %p [From:%p]\n", len, dma_malloc_pages[i] + (j << 9)));
-				printk("SMalloc: %d %p [From:%p]\n", len, dma_malloc_pages[i] + (j << 9));
+				SCSI_LOG_MLQUEUE(3, printk("SMalloc: %d %p [From:%p]\n", len, dma_malloc_pages[i] + (j << SECTOR_SHIFT)));
+				printk("SMalloc: %d %p [From:%p]\n", len, dma_malloc_pages[i] + (j << SECTOR_SHIFT));
 #endif
 				spin_unlock_irqrestore(&allocator_request_lock, flags);
-				return (void *) ((unsigned long) dma_malloc_pages[i] + (j << 9));
+				return (void *) ((unsigned long) dma_malloc_pages[i] + (j << SECTOR_SHIFT));
 			}
 		}
 	spin_unlock_irqrestore(&allocator_request_lock, flags);
@@ -136,15 +152,19 @@
 	SCSI_LOG_MLQUEUE(3, printk("SFree: %p %d\n", obj, len));
 #endif
 
+#ifdef BIG_SECTORS
+	if (len % SECTOR_SIZE)
+		len += 512;
+#endif
 	spin_lock_irqsave(&allocator_request_lock, flags);
 
 	for (page = 0; page < dma_sectors / SECTORS_PER_PAGE; page++) {
 		unsigned long page_addr = (unsigned long) dma_malloc_pages[page];
 		if ((unsigned long) obj >= page_addr &&
 		    (unsigned long) obj < page_addr + PAGE_SIZE) {
-			sector = (((unsigned long) obj) - page_addr) >> 9;
+			sector = (((unsigned long) obj) - page_addr) >> SECTOR_SHIFT;
 
-			nbits = len >> 9;
+			nbits = len >> SECTOR_SHIFT;
 			mask = (1 << nbits) - 1;
 
 			if (sector + nbits > SECTORS_PER_PAGE)
@@ -254,27 +274,27 @@
 				if (nents < 64) nents = 64;
 #endif
 				new_dma_sectors += ((nents *
-				sizeof(struct scatterlist) + 511) >> 9) *
+				sizeof(struct scatterlist) + SECTOR_SIZE-1) >> SECTOR_SHIFT) *
 				 SDpnt->queue_depth;
 				if (SDpnt->type = TYPE_WORM || SDpnt->type = TYPE_ROM)
-					new_dma_sectors += (2048 >> 9) * SDpnt->queue_depth;
+					new_dma_sectors += (2048 >> SECTOR_SHIFT) * SDpnt->queue_depth;
 			} else if (SDpnt->type = TYPE_SCANNER ||
 				   SDpnt->type = TYPE_PROCESSOR ||
 				   SDpnt->type = TYPE_COMM ||
 				   SDpnt->type = TYPE_MEDIUM_CHANGER ||
 				   SDpnt->type = TYPE_ENCLOSURE) {
-				new_dma_sectors += (4096 >> 9) * SDpnt->queue_depth;
+				new_dma_sectors += (4096 >> SECTOR_SHIFT) * SDpnt->queue_depth;
 			} else {
 				if (SDpnt->type != TYPE_TAPE) {
 					printk("resize_dma_pool: unknown device type %d\n", SDpnt->type);
-					new_dma_sectors += (4096 >> 9) * SDpnt->queue_depth;
+					new_dma_sectors += (4096 >> SECTOR_SHIFT) * SDpnt->queue_depth;
 				}
 			}
 
 			if (host->unchecked_isa_dma &&
 			    need_isa_bounce_buffers &&
 			    SDpnt->type != TYPE_TAPE) {
-				new_dma_sectors += (PAGE_SIZE >> 9) * host->sg_tablesize *
+				new_dma_sectors += (PAGE_SIZE >> SECTOR_SHIFT) * host->sg_tablesize *
 				    SDpnt->queue_depth;
 				new_need_isa_buffer++;
 			}


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Linux-ia64] Status of 64K pagesize support
  2001-03-16 21:07 [Linux-ia64] Status of 64K pagesize support Jack Steiner
                   ` (3 preceding siblings ...)
  2001-03-22 17:49 ` Jack Steiner
@ 2001-03-26 17:51 ` Jack Steiner
  2001-03-28 22:26 ` David Mosberger
  5 siblings, 0 replies; 7+ messages in thread
From: Jack Steiner @ 2001-03-26 17:51 UTC (permalink / raw)
  To: linux-ia64

I have built a system with 64K pages. 

As long as you do not try mount swap devices, everything 
seems to be running ok.  (Swapping to files works OK).

I ran fairly heavy stress for a couple hours
and did not see any failures. More testing is still needed, however.


There are still a few issues with swapping to devices. The  
buffer_head field "b_size" is a short, the kernel tries to
do 64K IO & overflows the field. (I'm assuming that changing
b_size to an "int" is NOT acceptible). 

I'm working on fixing this but thought I'd send these fixes out now
since they enable others to use 64K pages.



Here is a summary of the changes I've made so far:

  include/asm-ia64/system.h
  	add BOOT_PARAM_ADDR. If pagesize is 64K, BOOT_PARAM_ADDR. is not
	the same as ZERO_PAGE_ADDR.

  arch/ia64/boot/bootloader.c
  	change name of ZERO_PAGE_ADDR to BOOT_PARAM_ADDR

  arch/ia64/kernel/fw-emu.c
  	change name of ZERO_PAGE_ADDR to BOOT_PARAM_ADDR

  arch/ia64/kernel/gate.S
  	delete ".align PAGE_SIZE". Code is already correctly aligned & 
	gcc doesnt support alignment > 16k

  arch/ia64/kernel/ivt.S
  	add alignment pragmas to the end to make the size of the IVT
	an integral number of pages. 

  arch/ia64/kernel/setup.c
  	change name of ZERO_PAGE_ADDR to BOOT_PARAM_ADDR

  arch/ia64/sn/fprom/fw-emu.c
	change name of ZERO_PAGE_ADDR to BOOT_PARAM_ADDR

  drivers/scsi/scsi_dma.c
  	change the FreeSectorBitmap so that on 64k page systems, a bit
	in the map represents 1K instead of 512 bytes. Otherwise, you
	overflow the long used to manage free space in a page.
	I view this as an interim fix..... (I swapped mail with dugger
	about this patch).

  include/asm-ia64/a.out.h
  	dont make STACK_TOP bigger than the max virtual address supported 
	on itanium.



	

diff -Naur linux_base/arch/ia64/boot/bootloader.c linux/arch/ia64/boot/bootloader.c
--- linux_base/arch/ia64/boot/bootloader.c	Thu Mar 15 08:24:13 2001
+++ linux/arch/ia64/boot/bootloader.c	Tue Mar 20 21:37:45 2001
@@ -224,11 +224,11 @@
 	ssc(0, (long) kpath, 0, 0, SSC_LOAD_SYMBOLS);
 
 	/*
-	 * Install the kernel's command line argument on ZERO_PAGE
-	 * just after the botoparam structure.
+	 * Install the kernel's command line argument at BOOT_PARAM_ADDR
+	 * just after the bootparam structure.
 	 * In case we don't have any argument just put \0
 	 */
-	memcpy(((struct ia64_boot_param *)ZERO_PAGE_ADDR) + 1, args, arglen);
+	memcpy(((struct ia64_boot_param *)BOOT_PARAM_ADDR) + 1, args, arglen);
 	sp = __pa(&stack);
 
 	asm volatile ("br.sptk.few %0" :: "b"(e_entry));
diff -Naur linux_base/arch/ia64/kernel/fw-emu.c linux/arch/ia64/kernel/fw-emu.c
--- linux_base/arch/ia64/kernel/fw-emu.c	Thu Mar 15 08:24:15 2001
+++ linux/arch/ia64/kernel/fw-emu.c	Tue Mar 20 16:33:52 2001
@@ -469,7 +469,7 @@
 	md->attribute = EFI_MEMORY_WB;
 #endif
 
-	bp = id(ZERO_PAGE_ADDR);
+	bp = id(BOOT_PARAM_ADDR);
 	bp->efi_systab = __pa(&fw_mem);
 	bp->efi_memmap = __pa(efi_memmap);
 	bp->efi_memmap_size = NUM_MEM_DESCS*sizeof(efi_memory_desc_t);
diff -Naur linux_base/arch/ia64/kernel/gate.S linux/arch/ia64/kernel/gate.S
--- linux_base/arch/ia64/kernel/gate.S	Mon Mar 19 09:55:02 2001
+++ linux/arch/ia64/kernel/gate.S	Mon Mar 19 13:12:38 2001
@@ -19,8 +19,6 @@
 
 	.section .text.gate,"ax"
 
-	.align PAGE_SIZE
-
 #	define SIGINFO_OFF	16
 #	define SIGCONTEXT_OFF	(SIGINFO_OFF + ((IA64_SIGINFO_SIZE + 15) & ~15))
 #	define FLAGS_OFF	IA64_SIGCONTEXT_FLAGS_OFFSET
diff -Naur linux_base/arch/ia64/kernel/ivt.S linux/arch/ia64/kernel/ivt.S
--- linux_base/arch/ia64/kernel/ivt.S	Fri Mar 16 09:21:13 2001
+++ linux/arch/ia64/kernel/ivt.S	Tue Mar 20 21:37:34 2001
@@ -1357,3 +1357,20 @@
 /////////////////////////////////////////////////////////////////////////////////////////
 // 0x7f00 Entry 67 (size 16 bundles) Reserved
 	FAULT(67)
+
+
+//
+// The end of the IVT must be aligned at a page boundary so that the structures
+// that follow it are also aligned on page boundaries. We would like to use the
+// gcc .align pragma but that doesnt work for sizes greater than 16K alignment
+// and we may need 64K alignment. For now, the following works. If/when gcc is
+// fixed, this should be revisited.....
+//
+#ifdef CONFIG_IA64_PAGE_SIZE_64KB
+        .align 16384
+        nop 0;;
+        .align 16384
+        nop 0;;
+        .align 16384
+#endif
+
diff -Naur linux_base/arch/ia64/kernel/setup.c linux/arch/ia64/kernel/setup.c
--- linux_base/arch/ia64/kernel/setup.c	Thu Mar 15 08:24:15 2001
+++ linux/arch/ia64/kernel/setup.c	Tue Mar 20 16:32:28 2001
@@ -143,10 +143,11 @@
 
 	/*
 	 * The secondary bootstrap loader passes us the boot
-	 * parameters at the beginning of the ZERO_PAGE, so let's
+	 * parameters at the end of the 32K IVT. Depending on pagesize,
+	 * this may be the location of the ZERO_PAGE, so let's
 	 * stash away those values before ZERO_PAGE gets cleared out.
 	 */
-	memcpy(&ia64_boot_param, (void *) ZERO_PAGE_ADDR, sizeof(ia64_boot_param));
+	memcpy(&ia64_boot_param, (void *) BOOT_PARAM_ADDR, sizeof(ia64_boot_param));
 
 	*cmdline_p = __va(ia64_boot_param.command_line);
 	strncpy(saved_command_line, *cmdline_p, sizeof(saved_command_line));
diff -Naur linux_base/arch/ia64/sn/fprom/fw-emu.c linux/arch/ia64/sn/fprom/fw-emu.c
--- linux_base/arch/ia64/sn/fprom/fw-emu.c	Thu Mar 15 08:24:16 2001
+++ linux/arch/ia64/sn/fprom/fw-emu.c	Tue Mar 20 16:32:19 2001
@@ -494,7 +494,7 @@
 	md = &efi_memmap[0];
 	num_memmd = build_efi_memmap((void *)md, mdsize) ;
 
-	bp = id(ZERO_PAGE_ADDR + (((long)base_nasid)<<33));
+	bp = id(BOOT_PARAM_ADDR + (((long)base_nasid)<<33));
 	bp->efi_systab = __fwtab_pa(base_nasid, &fw_mem);
 	bp->efi_memmap = __fwtab_pa(base_nasid, efi_memmap);
 	bp->efi_memmap_size = num_memmd*mdsize;
diff -Naur linux_base/drivers/scsi/scsi_dma.c linux/drivers/scsi/scsi_dma.c
--- linux_base/drivers/scsi/scsi_dma.c	Mon Mar 19 09:55:02 2001
+++ linux/drivers/scsi/scsi_dma.c	Tue Mar 20 16:37:37 2001
@@ -23,13 +23,25 @@
  * PAGE_SIZE must be a multiple of the sector size (512).  True
  * for all reasonably recent architectures (even the VAX...).
  */
-#define SECTOR_SIZE		512
+#ifdef CONFIG_IA64_PAGE_SIZE_64KB
+#define BIG_SECTORS
+#endif
+
+#ifdef BIG_SECTORS
+#define SECTOR_SHIFT		10
+#else
+#define SECTOR_SHIFT		9
+#endif
+
+#define SECTOR_SIZE		(1<<SECTOR_SHIFT)
 #define SECTORS_PER_PAGE	(PAGE_SIZE/SECTOR_SIZE)
 
 #if SECTORS_PER_PAGE <= 8
 typedef unsigned char FreeSectorBitmap;
 #elif SECTORS_PER_PAGE <= 32
 typedef unsigned int FreeSectorBitmap;
+#elif SECTORS_PER_PAGE <= 64
+typedef unsigned long FreeSectorBitmap;
 #else
 #error You lose.
 #endif
@@ -75,10 +87,14 @@
 	unsigned long flags;
 
 	int i, j;
+#ifdef BIG_SECTORS
+	if (len % SECTOR_SIZE)
+		len += 512;
+#endif
 	if (len % SECTOR_SIZE != 0 || len > PAGE_SIZE)
 		return NULL;
 
-	nbits = len >> 9;
+	nbits = len >> SECTOR_SHIFT;
 	mask = (1 << nbits) - 1;
 
 	spin_lock_irqsave(&allocator_request_lock, flags);
@@ -89,11 +105,11 @@
 				dma_malloc_freelist[i] |= (mask << j);
 				scsi_dma_free_sectors -= nbits;
 #ifdef DEBUG
-				SCSI_LOG_MLQUEUE(3, printk("SMalloc: %d %p [From:%p]\n", len, dma_malloc_pages[i] + (j << 9)));
-				printk("SMalloc: %d %p [From:%p]\n", len, dma_malloc_pages[i] + (j << 9));
+				SCSI_LOG_MLQUEUE(3, printk("SMalloc: %d %p [From:%p]\n", len, dma_malloc_pages[i] + (j << SECTOR_SHIFT)));
+				printk("SMalloc: %d %p [From:%p]\n", len, dma_malloc_pages[i] + (j << SECTOR_SHIFT));
 #endif
 				spin_unlock_irqrestore(&allocator_request_lock, flags);
-				return (void *) ((unsigned long) dma_malloc_pages[i] + (j << 9));
+				return (void *) ((unsigned long) dma_malloc_pages[i] + (j << SECTOR_SHIFT));
 			}
 		}
 	spin_unlock_irqrestore(&allocator_request_lock, flags);
@@ -136,15 +152,19 @@
 	SCSI_LOG_MLQUEUE(3, printk("SFree: %p %d\n", obj, len));
 #endif
 
+#ifdef BIG_SECTORS
+	if (len % SECTOR_SIZE)
+		len += 512;
+#endif
 	spin_lock_irqsave(&allocator_request_lock, flags);
 
 	for (page = 0; page < dma_sectors / SECTORS_PER_PAGE; page++) {
 		unsigned long page_addr = (unsigned long) dma_malloc_pages[page];
 		if ((unsigned long) obj >= page_addr &&
 		    (unsigned long) obj < page_addr + PAGE_SIZE) {
-			sector = (((unsigned long) obj) - page_addr) >> 9;
+			sector = (((unsigned long) obj) - page_addr) >> SECTOR_SHIFT;
 
-			nbits = len >> 9;
+			nbits = len >> SECTOR_SHIFT;
 			mask = (1 << nbits) - 1;
 
 			if (sector + nbits > SECTORS_PER_PAGE)
@@ -254,27 +274,27 @@
 				if (nents < 64) nents = 64;
 #endif
 				new_dma_sectors += ((nents *
-				sizeof(struct scatterlist) + 511) >> 9) *
+				sizeof(struct scatterlist) + SECTOR_SIZE-1) >> SECTOR_SHIFT) *
 				 SDpnt->queue_depth;
 				if (SDpnt->type = TYPE_WORM || SDpnt->type = TYPE_ROM)
-					new_dma_sectors += (2048 >> 9) * SDpnt->queue_depth;
+					new_dma_sectors += (2048 >> SECTOR_SHIFT) * SDpnt->queue_depth;
 			} else if (SDpnt->type = TYPE_SCANNER ||
 				   SDpnt->type = TYPE_PROCESSOR ||
 				   SDpnt->type = TYPE_COMM ||
 				   SDpnt->type = TYPE_MEDIUM_CHANGER ||
 				   SDpnt->type = TYPE_ENCLOSURE) {
-				new_dma_sectors += (4096 >> 9) * SDpnt->queue_depth;
+				new_dma_sectors += (4096 >> SECTOR_SHIFT) * SDpnt->queue_depth;
 			} else {
 				if (SDpnt->type != TYPE_TAPE) {
 					printk("resize_dma_pool: unknown device type %d\n", SDpnt->type);
-					new_dma_sectors += (4096 >> 9) * SDpnt->queue_depth;
+					new_dma_sectors += (4096 >> SECTOR_SHIFT) * SDpnt->queue_depth;
 				}
 			}
 
 			if (host->unchecked_isa_dma &&
 			    need_isa_bounce_buffers &&
 			    SDpnt->type != TYPE_TAPE) {
-				new_dma_sectors += (PAGE_SIZE >> 9) * host->sg_tablesize *
+				new_dma_sectors += (PAGE_SIZE >> SECTOR_SHIFT) * host->sg_tablesize *
 				    SDpnt->queue_depth;
 				new_need_isa_buffer++;
 			}
diff -Naur linux_base/include/asm-ia64/a.out.h linux/include/asm-ia64/a.out.h
--- linux_base/include/asm-ia64/a.out.h	Thu Mar 15 08:30:28 2001
+++ linux/include/asm-ia64/a.out.h	Mon Mar 19 14:05:34 2001
@@ -30,7 +30,11 @@
 #define N_TXTOFF(x)	0
 
 #ifdef __KERNEL__
+#ifdef CONFIG_IA64_PAGE_SIZE_64KB
+# define STACK_TOP	(0x8000000000000000UL + (1UL << 50))
+#else
 # define STACK_TOP	(0x8000000000000000UL + (1UL << (4*PAGE_SHIFT - 12)))
+#endif
 # define IA64_RBS_BOT	(STACK_TOP - 0x80000000L)	/* bottom of register backing store */
 #endif
 
diff -Naur linux_base/include/asm-ia64/system.h linux/include/asm-ia64/system.h
--- linux_base/include/asm-ia64/system.h	Thu Mar 22 18:27:40 2001
+++ linux/include/asm-ia64/system.h	Thu Mar 22 18:00:49 2001
@@ -17,13 +17,19 @@
 #include <asm/page.h>
 
 #define KERNEL_START		(PAGE_OFFSET + 0x500000)
+#define BOOT_PARAM_ADDR		(KERNEL_START + 0x8000)
 
 /*
  * The following #defines must match with vmlinux.lds.S:
  */
-#define IVT_END_ADDR		(KERNEL_START + 0x8000)
-#define ZERO_PAGE_ADDR		(IVT_END_ADDR + 0*PAGE_SIZE)
-#define SWAPPER_PGD_ADDR	(IVT_END_ADDR + 1*PAGE_SIZE)
+#ifdef CONFIG_IA64_PAGE_SIZE_64KB
+#define IVT_PAGE_END_ADDR	(KERNEL_START + 0x10000)
+#else
+#define IVT_PAGE_END_ADDR	(KERNEL_START + 0x8000)
+#endif
+
+#define ZERO_PAGE_ADDR		(IVT_PAGE_END_ADDR + 0*PAGE_SIZE)
+#define SWAPPER_PGD_ADDR	(IVT_PAGE_END_ADDR + 1*PAGE_SIZE)
 
 #define GATE_ADDR		(0xa000000000000000 + PAGE_SIZE)
 #define PERCPU_ADDR		(0xa000000000000000 + 2*PAGE_SIZE)
-- 
Thanks

Jack Steiner    (651-683-5302)   (vnet 233-5302)      steiner@sgi.com



^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [Linux-ia64] Status of 64K pagesize support
  2001-03-16 21:07 [Linux-ia64] Status of 64K pagesize support Jack Steiner
                   ` (4 preceding siblings ...)
  2001-03-26 17:51 ` Jack Steiner
@ 2001-03-28 22:26 ` David Mosberger
  5 siblings, 0 replies; 7+ messages in thread
From: David Mosberger @ 2001-03-28 22:26 UTC (permalink / raw)
  To: linux-ia64

>>>>> On Mon, 26 Mar 2001 11:51:07 -0600 (CST), Jack Steiner <steiner@sgi.com> said:

  Jack> Here is a summary of the changes I've made so far:

  Jack>   include/asm-ia64/system.h add BOOT_PARAM_ADDR. If pagesize
  Jack> is 64K, BOOT_PARAM_ADDR. is not the same as ZERO_PAGE_ADDR.

OK, sounds reasonable.  I made that change.

  Jack>   arch/ia64/boot/bootloader.c change name of ZERO_PAGE_ADDR to
  Jack> BOOT_PARAM_ADDR

OK.

  Jack>   arch/ia64/kernel/fw-emu.c change name of ZERO_PAGE_ADDR to
  Jack> BOOT_PARAM_ADDR

OK.

  Jack>   arch/ia64/kernel/gate.S delete ".align PAGE_SIZE". Code is
  Jack> already correctly aligned & gcc doesnt support alignment > 16k

I don't want to do that.  The .align is there to make it clear that
the code must be page aligned.  We should fix gas instead.

  Jack>   arch/ia64/kernel/ivt.S add alignment pragmas to the end to
  Jack> make the size of the IVT an integral number of pages.

I don't really like that.  The ivt shouldn't have to care what the
page size is.  I put an alignment directive in the linker script
instead.

  Jack>   arch/ia64/kernel/setup.c change name of ZERO_PAGE_ADDR to
  Jack> BOOT_PARAM_ADDR

OK.

  Jack>   arch/ia64/sn/fprom/fw-emu.c change name of ZERO_PAGE_ADDR to
  Jack> BOOT_PARAM_ADDR

OK.

  Jack>   drivers/scsi/scsi_dma.c change the FreeSectorBitmap so that
  Jack> on 64k page systems, a bit in the map represents 1K instead of
  Jack> 512 bytes. Otherwise, you overflow the long used to manage
  Jack> free space in a page.  I view this as an interim fix..... (I
  Jack> swapped mail with dugger about this patch).

I'll wait with this one until there is a permanent fix.

  Jack>   include/asm-ia64/a.out.h dont make STACK_TOP bigger than the
  Jack> max virtual address supported on itanium.

Ditto here.

	--david


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2001-03-28 22:26 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2001-03-16 21:07 [Linux-ia64] Status of 64K pagesize support Jack Steiner
2001-03-16 21:25 ` Don Dugger
2001-03-16 21:38 ` Jim Wilson
2001-03-16 23:03 ` David Mosberger
2001-03-22 17:49 ` Jack Steiner
2001-03-26 17:51 ` Jack Steiner
2001-03-28 22:26 ` David Mosberger

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox