diff options
author | Ralf Baechle <ralf@linux-mips.org> | 1998-05-07 02:55:41 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 1998-05-07 02:55:41 +0000 |
commit | dcec8a13bf565e47942a1751a9cec21bec5648fe (patch) | |
tree | 548b69625b18cc2e88c3e68d0923be546c9ebb03 /include/asm-ppc/ide.h | |
parent | 2e0f55e79c49509b7ff70ff1a10e1e9e90a3dfd4 (diff) |
o Merge with Linux 2.1.99.
o Fix ancient bug in the ELF loader making ldd crash.
o Fix ancient bug in the keyboard code for SGI, SNI and Jazz.
Diffstat (limited to 'include/asm-ppc/ide.h')
-rw-r--r-- | include/asm-ppc/ide.h | 74 |
1 files changed, 60 insertions, 14 deletions
diff --git a/include/asm-ppc/ide.h b/include/asm-ppc/ide.h index 14f8d3312..efbd4b363 100644 --- a/include/asm-ppc/ide.h +++ b/include/asm-ppc/ide.h @@ -28,17 +28,35 @@ #define ide_sti() sti() -typedef unsigned long ide_ioreg_t; +typedef unsigned int ide_ioreg_t; void ide_init_hwif_ports(ide_ioreg_t *p, ide_ioreg_t base, int *irq); void prep_ide_init_hwif_ports(ide_ioreg_t *p, ide_ioreg_t base, int *irq); +void mbx_ide_init_hwif_ports(ide_ioreg_t *p, ide_ioreg_t base, int *irq); void pmac_ide_init_hwif_ports(ide_ioreg_t *p, ide_ioreg_t base, int *irq); +void chrp_ide_init_hwif_ports(ide_ioreg_t *p, ide_ioreg_t base, int *irq); void ide_insw(ide_ioreg_t port, void *buf, int ns); void ide_outsw(ide_ioreg_t port, void *buf, int ns); +extern int pmac_ide_ports_known; +extern ide_ioreg_t pmac_ide_regbase[MAX_HWIFS]; +extern int pmac_ide_irq[MAX_HWIFS]; +extern void pmac_ide_probe(void); + +extern int chrp_ide_ports_known; +extern ide_ioreg_t chrp_ide_regbase[MAX_HWIFS]; +extern ide_ioreg_t chrp_idedma_regbase; /* one for both channels */ +extern unsigned int chrp_ide_irq; +extern void chrp_ide_probe(void); + static __inline__ int ide_default_irq(ide_ioreg_t base) { - if ( _machine == _MACH_Pmac ) + if ( (_machine == _MACH_Pmac) || (_machine == _MACH_mbx) ) return 0; + else if ( _machine == _MACH_chrp) { + if (chrp_ide_ports_known == 0) + chrp_ide_probe(); + return chrp_ide_irq; + } switch (base) { case 0x1f0: return 13; case 0x170: return 13; @@ -51,8 +69,17 @@ static __inline__ int ide_default_irq(ide_ioreg_t base) static __inline__ ide_ioreg_t ide_default_io_base(int index) { - if ( _machine == _MACH_Pmac ) - return index; + if (_machine == _MACH_Pmac) { + if (!pmac_ide_ports_known) + pmac_ide_probe(); + return pmac_ide_regbase[index]; + } + if (_machine == _MACH_mbx) return index; + if ( _machine == _MACH_chrp ) { + if (chrp_ide_ports_known == 0) + chrp_ide_probe(); + return chrp_ide_regbase[index]; + } switch (index) { case 0: return 0x1f0; case 1: return 0x170; @@ -65,21 +92,21 @@ static __inline__ ide_ioreg_t ide_default_io_base(int index) static __inline__ int ide_check_region (ide_ioreg_t from, unsigned int extent) { - if ( _machine == _MACH_Pmac ) + if ( (_machine == _MACH_Pmac) || (_machine == _MACH_mbx)) return 0; return check_region(from, extent); } static __inline__ void ide_request_region (ide_ioreg_t from, unsigned int extent, const char *name) { - if ( _machine == _MACH_Pmac ) + if ( (_machine == _MACH_Pmac) || (_machine == _MACH_mbx) ) return; request_region(from, extent, name); } static __inline__ void ide_release_region (ide_ioreg_t from, unsigned int extent) { - if ( _machine == _MACH_Pmac ) + if ( (_machine == _MACH_Pmac) || (_machine == _MACH_mbx) ) return; release_region(from, extent); } @@ -87,7 +114,7 @@ static __inline__ void ide_release_region (ide_ioreg_t from, unsigned int extent #define ide_fix_driveid(id) do { \ int nh; \ unsigned short *p = (unsigned short *) id; \ - if ( _machine == _MACH_Pmac ) \ + if (( _machine == _MACH_Pmac ) || (_machine == _MACH_chrp)|| (_machine == _MACH_mbx) ) \ for (nh = SECTOR_WORDS * 2; nh != 0; --nh, ++p) \ *p = (*p << 8) + (*p >> 8); \ } while (0) @@ -95,21 +122,40 @@ static __inline__ void ide_release_region (ide_ioreg_t from, unsigned int extent #undef insw #define insw(port, buf, ns) do { \ - if ( _machine != _MACH_Pmac ) \ + if ( _machine == _MACH_chrp) {\ + ide_insw((port)+_IO_BASE, (buf), (ns)); \ + }\ + else if ( (_machine == _MACH_Pmac) || (_machine == _MACH_mbx) ) \ + ide_insw((port), (buf), (ns)); \ + else \ /* this must be the same as insw in io.h!! */ \ _insw((unsigned short *)((port)+_IO_BASE), (buf), (ns)); \ - else \ - ide_insw((port), (buf), (ns)); \ } while (0) #undef outsw +/* printk("port: %x buf: %p ns: %d\n",port,buf,ns); \ */ #define outsw(port, buf, ns) do { \ - if ( _machine != _MACH_Pmac ) \ + if ( _machine == _MACH_chrp) {\ + ide_outsw((port)+_IO_BASE, (buf), (ns)); \ + }\ + else if ( (_machine == _MACH_Pmac) || (_machine == _MACH_mbx) ) \ + ide_outsw((port), (buf), (ns)); \ + else \ /* this must be the same as outsw in io.h!! */ \ _outsw((unsigned short *)((port)+_IO_BASE), (buf), (ns)); \ - else \ - ide_outsw((port), (buf), (ns)); \ } while (0) +#undef inb +#define inb(port) \ + in_8((unsigned char *)((port) + ((_machine==_MACH_Pmac)? 0: _IO_BASE))) +#undef inb_p +#define inb_p(port) inb(port) + +#undef outb +#define outb(val, port) \ + out_8((unsigned char *)((port) + ((_machine==_MACH_Pmac)? 0: _IO_BASE)), (val)) +#undef outb_p +#define outb_p(val, port) outb(val, port) + typedef union { unsigned all : 8; /* all of the bits together */ struct { |