📄 ide-jasper.c
字号:
/* ide-jasper.c *//* jasper specific initialization stuff for ide */#include <linux/init.h>#include <asm/io.h>#include <asm/hardware.h>#include <linux/ide.h>#include "ide_modes.h"extern int printk(const char *fmt,...);extern void ide_setup_dma (ide_hwif_t *hwif, unsigned long dma_base, unsigned int num_ports);#define ENABLE_BMDMA // #undef ENABLE_BMDMA//#define ENABLE_UDMA #undef ENABLE_UDMAint ide_config_drive_speed (ide_drive_t *drive, byte speed);//Setup register 0x54 and 0x58a for UDMA timing//Values assume 100Mhz system busstatic int jasper_tune_chipset(ide_drive_t *drive, byte speed){ ide_hwif_t *hwif = HWIF(drive); char channel = hwif->channel; unsigned short reg54, reg58; int slave = 0; printk("jasper_tune_chipset: speed = %02x\n", speed); reg54=inw(JASPER_IDE_BASE + 0x54); reg58=inw(JASPER_IDE_BASE + 0x58);#ifdef ENABLE_UDMA if(speed>=XFER_UDMA_0 && speed<=XFER_UDMA_5){ // ---- This assume 100Mhz system bus - for UDMA if(slave) { reg54 |= 0x2; reg58 |= (speed-XFER_UDMA_0)<<4; }else { reg54 |= 0x1; reg58 |= (speed-XFER_UDMA_0); } // ---- } else#endif // ENABLE_UDMA { if(slave) { reg54 &= ~0x2; } else { reg54 &= ~0x1; } } outw(reg54, JASPER_IDE_BASE + 0x54); outw(reg58, JASPER_IDE_BASE + 0x58); return ide_config_drive_speed(drive, speed);}static int jasper_config_drive_for_dma (ide_drive_t *drive){ struct hd_driveid *id = drive->id; ide_hwif_t *hwif = HWIF(drive); int autodma = hwif->autodma; ide_dma_action_t dma_func = ide_dma_on; byte speed; byte udma_66 = eighty_ninty_three(drive); // 80 c ribbon ? printk ("jasper_config_drive_for_dma:\n"); printk (" capability = 0x%04x\n", id->capability); printk (" field_valid = 0x%04x\n", id->field_valid); printk (" dma_ultra = 0x%04x\n", id->dma_ultra); printk (" dma_1word (s) = 0x%04x\n", id->dma_1word); printk (" dma_mword (m) = 0x%04x\n", id->dma_mword); printk (" autodma = 0x%04x\n", autodma); if (id && (id->capability & 1) && autodma) { if (ide_dmaproc(ide_dma_bad_drive, drive)) { // consult list of known "bad" drives dma_func = ide_dma_off;// Ultra DMA support #ifdef ENABLE_UDMA } else if ((id->field_valid & 4) && (id->dma_ultra & 0x3F)) { // Enable DMA on any drive that is UltraDMA (mode 0-5) capable // mode3/4/5 needs 80c ribbon if((id->dma_ultra & 0x20) && udma_66) speed = XFER_UDMA_5; else if((id->dma_ultra & 0x10) && udma_66) speed = XFER_UDMA_4; else if((id->dma_ultra & 0x08) && udma_66) speed = XFER_UDMA_3; else if(id->dma_ultra & 0x04) speed = XFER_UDMA_2; else if(id->dma_ultra & 0x02) speed = XFER_UDMA_1; else if(id->dma_ultra & 0x01) speed = XFER_UDMA_0;#endif //Busmaster DMA support#ifdef ENABLE_BMDMA } else if((id->field_valid & 2) && (id->dma_mword & 0x7)) { // Multiword DMA if(id->dma_mword & 0x4) speed = XFER_MW_DMA_2; else if (id->dma_mword & 0x2) speed = XFER_MW_DMA_1; else speed = XFER_MW_DMA_0; } else if((id->field_valid & 2) && (id->dma_1word & 0x7)) { // Single word DMA if(id->dma_1word & 0x4) speed = XFER_SW_DMA_2; else if (id->dma_1word & 0x2) speed = XFER_SW_DMA_1; else speed = XFER_SW_DMA_0;#endif } else { speed = XFER_PIO_0 + ide_get_best_pio_mode(drive, 255, 5, NULL); dma_func = ide_dma_off_quietly; } if(jasper_tune_chipset(drive, speed)) { printk("Error in jasper_tune_chipset, disbale DMA\n"); dma_func = ide_dma_off; } return hwif->dmaproc(dma_func, drive); } printk ("DMA disabled quietly\n"); return hwif->dmaproc(ide_dma_off_quietly, drive);}static int jasper_dmaproc(ide_dma_action_t func, ide_drive_t *drive){ unsigned char dma_stat; unsigned long dma_base = HWIF(drive)->dma_base; unsigned long dma_count, dma_address; int i; switch (func) { case ide_dma_check: return jasper_config_drive_for_dma(drive); case ide_dma_end: drive->waiting_for_dma=0; for(i=0; i<100; i++) { dma_stat = inb(dma_base + 0x4); /* get DMA status */ if((dma_stat & 0x4) ==4) break; dma_count = inl(dma_base + 0xe4); dma_address = inl(dma_base + 0xe0); printk("J %1x %08x %04x\n", dma_stat & 0xF, dma_address, dma_count); } outb(inb(dma_base)&~1, dma_base); /* stop DMA */ outb(dma_stat|6, dma_base + 0x4); /* clear the INTR & ERROR bits */ ide_destroy_dmatable(drive); /* purge DMA mappings */ return (dma_stat & 4) != 4 ? (0x10 | dma_stat) : 0; default : break; } /* Other cases are done by generic IDE-DMA code. */ return ide_dmaproc(func, drive);}void __init jasper_ide_init(void){ ide_hwif_t *hwif; unsigned long dma_base = JASPER_IDE_DMA_BASE; // enable ide interface //set pio4 to 1 outl(0x0010FFFF, JASPER_PIO0_BASE + PIO_DIR); outl(0x0010FFFF, JASPER_PIO0_BASE + PIO_DATA); // choose ide over dvd loader (DVD_AV_CONTROL) // write 0x8000 to IDETIM outl(0x00, JASPER_DVD_BASE + DVD_AV_CTRL); //0x00 select IDE over DVD-loader outl(0x8000, JASPER_IDE_BASE + IDE_TIM);// outl(0xb301, JASPER_IDE_BASE + IDE_TIM); //0x40 IDE decode enable printk("JASPER ide controller activated\n"); // grab hwif, hwif = &ide_hwifs[0]; // setup busmaster dma ide_setup_dma(hwif, dma_base, 16); // override dmaproc hwif->dmaproc = &jasper_dmaproc; // autodma on hwif->autodma = 1;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -