patch: linux-2.4.20 alpha broken cia(rev1) fix
Hi,
The attached patch fixes the initialization for CIA revision 1 chips that can be found on most Alcor machines. As it is impossible to boot such a box together with the Qlogic ISP SCSI controller without this patch I believe it is important to include it in the official kernel.
cheers .. Bjoern
arch/alpha/kernel/core_cia.c +25 -8
@@ -370,7 +370,7 @@ }static inline void -cia_prepare_tbia_workaround (void ) +cia_prepare_tbia_workaround (int cia_rev,int is_pyxis) {unsigned long *ppte, pte;long i;
@@ -382,10 +382,21 @@for (i =0 ; i <CIA_BROKEN_TBIA_SIZE /sizeof (unsigned long ); ++i) ppte[i] = pte; - *(vip )CIA_IOC_PCI_W1_BASE =CIA_BROKEN_TBIA_BASE |3 ; - *(vip )CIA_IOC_PCI_W1_MASK = (CIA_BROKEN_TBIA_SIZE *1024 -1 ) - &0xfff00000 ; - *(vip )CIA_IOC_PCI_T1_BASE =virt_to_phys (ppte) >>2 ; +if (is_pyxis || cia_rev !=1 ) { +/* We can use W1 for SG on PYXIS/CIA rev 2. */ + *(vip )CIA_IOC_PCI_W1_BASE =CIA_BROKEN_TBIA_BASE |3 ; + *(vip )CIA_IOC_PCI_W1_MASK = (CIA_BROKEN_TBIA_SIZE *1024 -1 ) + &0xfff00000 ; + *(vip )CIA_IOC_PCI_T1_BASE =virt_to_phys (ppte) >>2 ; + }else { +/* CIA rev 1 can't use W1 or W2 for SG, apparently, +so use W3, which we made sure is not used for DAC. */ + *(vip )CIA_IOC_PCI_W3_BASE =CIA_BROKEN_TBIA_BASE |3 ; + *(vip )CIA_IOC_PCI_W3_MASK = (CIA_BROKEN_TBIA_SIZE *1024 -1 ) + &0xfff00000 ; + *(vip )CIA_IOC_PCI_T3_BASE =virt_to_phys (ppte) >>2 ; + } + } static void __init
@@ -715,8 +726,14 @@are compared against W_DAC. We can, however, directly map 4GB, which is better than before. However, due to assumptions made elsewhere, we should not claim that we support DAC unless that -4GB covers all of physical memory. */ -if (is_pyxis || max_low_pfn > (0x100000000 >>PAGE_SHIFT )) { +4GB covers all of physical memory. + +Also, don't do DAC on CIA rev 1, it has other problems and is +unlikely to have more than 2GB of memory anyway, so direct is +fine. +*/ +if (cia_rev ==1 || is_pyxis || + max_low_pfn > (0x100000000 >>PAGE_SHIFT )) { *(vip )CIA_IOC_PCI_W3_BASE =0 ; }else { *(vip )CIA_IOC_PCI_W3_BASE =0x00000000 |1 |8 ;
@@ -728,7 +745,7 @@ }/* Prepare workaround for apparently broken tbia. */ -cia_prepare_tbia_workaround (); +cia_prepare_tbia_workaround (cia_rev, is_pyxis); }void __init
Quoted 4 lines · Bjoern Brauel
The attached patch fixes the initialization for CIA revision 1 chips that can be found on most Alcor machines. As it is impossible to boot such a box together with the Qlogic ISP SCSI controller without this patch I believe it is important to include it in the official kernel.
Try this version instead. Control structures should not be replicated in different functions like that. It's a sure recipie for one of them getting out of sync.
r~
===== arch/alpha/kernel/core_cia.c 1.6 vs edited =====
arch/alpha/kernel/core_cia.c +21 -10
@@ -370,7 +370,7 @@ }static inline void -cia_prepare_tbia_workaround (void ) +cia_prepare_tbia_workaround (int window) {unsigned long *ppte, pte;long i;
@@ -382,10 +382,10 @@for (i =0 ; i <CIA_BROKEN_TBIA_SIZE /sizeof (unsigned long ); ++i) ppte[i] = pte; - *(vip )CIA_IOC_PCI_W1_BASE =CIA_BROKEN_TBIA_BASE |3 ; - *(vip )CIA_IOC_PCI_W1_MASK = (CIA_BROKEN_TBIA_SIZE *1024 -1 ) - &0xfff00000 ; - *(vip )CIA_IOC_PCI_T1_BASE =virt_to_phys (ppte) >>2 ; + *(vip )CIA_IOC_PCI_Wn_BASE (window) =CIA_BROKEN_TBIA_BASE |3 ; + *(vip )CIA_IOC_PCI_Wn_MASK (window) + = (CIA_BROKEN_TBIA_SIZE *1024 -1 ) &0xfff00000 ; + *(vip )CIA_IOC_PCI_Tn_BASE (window) =virt_to_phys (ppte) >>2 ; } static void __init
@@ -605,8 +605,7 @@ do_init_arch(int is_pyxis) {struct pci_controller *hose; -int temp; -int cia_rev; +int temp, cia_rev, tbia_window; cia_rev = *(vip )CIA_IOC_CIA_REV &CIA_REV_MASK ; printk("pci: cia revision %d%s\n",
@@ -715,8 +714,20 @@are compared against W_DAC. We can, however, directly map 4GB, which is better than before. However, due to assumptions made elsewhere, we should not claim that we support DAC unless that -4GB covers all of physical memory. */ -if (is_pyxis || max_low_pfn > (0x100000000 >>PAGE_SHIFT )) { +4GB covers all of physical memory. + +On CIA rev 1, apparently W1 and W2 can't be used for SG. +At least, there are reports that it doesn't work for Alcor. +In that case, we have no choice but to use W3 for the TBIA +workaround, which means we can't use DAC at all. */ + + tbia_window =1 ; +if (is_pyxis) { + *(vip )CIA_IOC_PCI_W3_BASE =0 ; + }else if (cia_rev ==1 ) { + *(vip )CIA_IOC_PCI_W1_BASE =0 ; + tbia_window =3 ; + }else if (max_low_pfn > (0x100000000 >>PAGE_SHIFT )) { *(vip )CIA_IOC_PCI_W3_BASE =0 ; }else { *(vip )CIA_IOC_PCI_W3_BASE =0x00000000 |1 |8 ;
@@ -728,7 +739,7 @@ }/* Prepare workaround for apparently broken tbia. */ -cia_prepare_tbia_workaround (); +cia_prepare_tbia_workaround (tbia_window); }void __init
===== include/asm-alpha/core_cia.h 1.4 vs edited =====
include/asm-alpha/core_cia.h +4 -0
@@ -202,6 +202,10 @@#define CIA_IOC_PCI_W3_MASK (IDENT_ADDR + 0x8760000740UL)#define CIA_IOC_PCI_T3_BASE (IDENT_ADDR + 0x8760000780UL) +#define CIA_IOC_PCI_Wn_BASE (N ) (IDENT_ADDR + 0x8760000400UL + (N)*0x100) +#define CIA_IOC_PCI_Wn_MASK (N ) (IDENT_ADDR + 0x8760000440UL + (N)*0x100) +#define CIA_IOC_PCI_Tn_BASE (N ) (IDENT_ADDR + 0x8760000480UL + (N)*0x100) +#define CIA_IOC_PCI_W_DAC (IDENT_ADDR + 0x87600007C0UL)/*
Quoted 4 lines
The attached patch fixes the initialization for CIA revision 1 chips that can be found on most Alcor machines. As it is impossible to boot such a box together with the Qlogic ISP SCSI controller without this patch I believe it is important to include it in the official kernel.
RH> Try this version instead. Control structures should not be RH> replicated in different functions like that. It's a sure RH> recipie for one of them getting out of sync.
I had problems compiling that one:
make[1]: Leaving directory `/data/src/linux-2.4.20/Documentation/DocBook' gcc -Wall -Wstrict-prototypes -O2 -fomit-frame-pointer -o scripts/split-include scripts/split-include.c
make: *** No rule to make target include/linux/autoconf.h', needed by include/config/MARKER'. Stop.
which I find rather strange.
make dep ; make clean ; make boot modules modules_install should take care of those dependencies, doesn't it?
<...>
Hmmm, for some reason include/linux/autoconf.h doesn't exist at all. <...>
Oh, I see: I had to run make menuconfig & save the config for that. That's odd. I just copied my old config to .config, thought that would do the trick!
Folkert van Heusden
http://www.vanheusden.com/Linux/kernel_patches.php3