1/* 2 * linux/include/asm-ia64/ide.h 3 * 4 * Copyright (C) 1994-1996 Linus Torvalds & authors 5 */ 6 7/* 8 * This file contains the ia64 architecture specific IDE code. 9 */ 10 11#ifndef __ASM_IA64_IDE_H 12#define __ASM_IA64_IDE_H 13 14#ifdef __KERNEL__ 15 16#include <linux/config.h> 17 18#include <linux/irq.h> 19 20#ifndef MAX_HWIFS 21# ifdef CONFIG_BLK_DEV_IDEPCI 22#define MAX_HWIFS 10 23# else 24#define MAX_HWIFS 6 25# endif 26#endif 27 28#define ide__sti() __sti() 29 30static __inline__ int ide_default_irq(ide_ioreg_t base) 31{ 32 switch (base) { 33 case 0x1f0: return isa_irq_to_vector(14); 34 case 0x170: return isa_irq_to_vector(15); 35 case 0x1e8: return isa_irq_to_vector(11); 36 case 0x168: return isa_irq_to_vector(10); 37 case 0x1e0: return isa_irq_to_vector(8); 38 case 0x160: return isa_irq_to_vector(12); 39 default: 40 return 0; 41 } 42} 43 44static __inline__ ide_ioreg_t ide_default_io_base(int index) 45{ 46 switch (index) { 47 case 0: return 0x1f0; 48 case 1: return 0x170; 49 case 2: return 0x1e8; 50 case 3: return 0x168; 51 case 4: return 0x1e0; 52 case 5: return 0x160; 53 default: 54 return 0; 55 } 56} 57 58static __inline__ void ide_init_hwif_ports(hw_regs_t *hw, ide_ioreg_t data_port, ide_ioreg_t ctrl_port, int *irq) 59{ 60 ide_ioreg_t reg = data_port; 61 int i; 62 63 for (i = IDE_DATA_OFFSET; i <= IDE_STATUS_OFFSET; i++) { 64 hw->io_ports[i] = reg; 65 reg += 1; 66 } 67 if (ctrl_port) { 68 hw->io_ports[IDE_CONTROL_OFFSET] = ctrl_port; 69 } else { 70 hw->io_ports[IDE_CONTROL_OFFSET] = hw->io_ports[IDE_DATA_OFFSET] + 0x206; 71 } 72 if (irq != NULL) 73 *irq = 0; 74 hw->io_ports[IDE_IRQ_OFFSET] = 0; 75} 76 77static __inline__ void ide_init_default_hwifs(void) 78{ 79#ifndef CONFIG_BLK_DEV_IDEPCI 80 hw_regs_t hw; 81 int index; 82 83 for(index = 0; index < MAX_HWIFS; index++) { 84 ide_init_hwif_ports(&hw, ide_default_io_base(index), 0, NULL); 85 hw.irq = ide_default_irq(ide_default_io_base(index)); 86 ide_register_hw(&hw, NULL); 87 } 88#endif /* CONFIG_BLK_DEV_IDEPCI */ 89} 90 91typedef union { 92 unsigned all : 8; /* all of the bits together */ 93 struct { 94 unsigned head : 4; /* always zeros here */ 95 unsigned unit : 1; /* drive select number, 0 or 1 */ 96 unsigned bit5 : 1; /* always 1 */ 97 unsigned lba : 1; /* using LBA instead of CHS */ 98 unsigned bit7 : 1; /* always 1 */ 99 } b; 100} select_t; 101 102typedef union { 103 unsigned all : 8; /* all of the bits together */ 104 struct { 105 unsigned bit0 : 1; 106 unsigned nIEN : 1; /* device INTRQ to host */ 107 unsigned SRST : 1; /* host soft reset bit */ 108 unsigned bit3 : 1; /* ATA-2 thingy */ 109 unsigned reserved456 : 3; 110 unsigned HOB : 1; /* 48-bit address ordering */ 111 } b; 112} control_t; 113 114#define ide_request_irq(irq,hand,flg,dev,id) request_irq((irq),(hand),(flg),(dev),(id)) 115#define ide_free_irq(irq,dev_id) free_irq((irq), (dev_id)) 116#define ide_check_region(from,extent) check_region((from), (extent)) 117#define ide_request_region(from,extent,name) request_region((from), (extent), (name)) 118#define ide_release_region(from,extent) release_region((from), (extent)) 119 120/* 121 * The following are not needed for the non-m68k ports 122 */ 123#define ide_ack_intr(hwif) (1) 124#define ide_fix_driveid(id) do {} while (0) 125#define ide_release_lock(lock) do {} while (0) 126#define ide_get_lock(lock, hdlr, data) do {} while (0) 127 128#endif /* __KERNEL__ */ 129 130#endif /* __ASM_IA64_IDE_H */ 131