?? mpc8xx.c
字號:
#define PCMCIA_SL(t) ((t==32) ? 0 : ((t & 0x1F)<<7)) /* Strobe Length */#endif/* Calculate PIO timings */static voidm8xx_ide_tuneproc(ide_drive_t *drive, u8 pio){ ide_pio_data_t d;#if defined(CONFIG_IDE_8xx_PCCARD) || defined(CONFIG_IDE_8xx_DIRECT) volatile pcmconf8xx_t *pcmp; ulong timing, mask, reg;#endif pio = ide_get_best_pio_mode(drive, pio, 4, &d);#if 1 printk("%s[%d] %s: best PIO mode: %d\n", __FILE__,__LINE__,__FUNCTION__, pio);#endif#if defined(CONFIG_IDE_8xx_PCCARD) || defined(CONFIG_IDE_8xx_DIRECT) pcmp = (pcmconf8xx_t *)(&(((immap_t *)IMAP_ADDR)->im_pcmcia)); mask = ~(PCMCIA_SHT(0xFF) | PCMCIA_SST(0xFF) | PCMCIA_SL(0xFF)); timing = PCMCIA_SHT(hold_time[pio] ) | PCMCIA_SST(ide_pio_clocks[pio].setup_time ) | PCMCIA_SL (ide_pio_clocks[pio].active_time) ;#if 1 printk ("Setting timing bits 0x%08lx in PCMCIA controller\n", timing);#endif if ((reg = pcmp->pcmc_por0 & mask) != 0) pcmp->pcmc_por0 = reg | timing; if ((reg = pcmp->pcmc_por1 & mask) != 0) pcmp->pcmc_por1 = reg | timing; if ((reg = pcmp->pcmc_por2 & mask) != 0) pcmp->pcmc_por2 = reg | timing; if ((reg = pcmp->pcmc_por3 & mask) != 0) pcmp->pcmc_por3 = reg | timing; if ((reg = pcmp->pcmc_por4 & mask) != 0) pcmp->pcmc_por4 = reg | timing; if ((reg = pcmp->pcmc_por5 & mask) != 0) pcmp->pcmc_por5 = reg | timing; if ((reg = pcmp->pcmc_por6 & mask) != 0) pcmp->pcmc_por6 = reg | timing; if ((reg = pcmp->pcmc_por7 & mask) != 0) pcmp->pcmc_por7 = reg | timing;#elif defined(CONFIG_IDE_EXT_DIRECT) printk("%s[%d] %s: not implemented yet!\n", __FILE__,__LINE__,__FUNCTION__);#endif /* defined(CONFIG_IDE_8xx_PCCARD) || defined(CONFIG_IDE_8xx_PCMCIA */}static voidide_interrupt_ack (void *dev){#ifdef CONFIG_IDE_8xx_PCCARD u_int pscr, pipr;#if (PCMCIA_SOCKETS_NO == 2) u_int _slot_;#endif /* get interrupt sources */ pscr = ((volatile immap_t *)IMAP_ADDR)->im_pcmcia.pcmc_pscr; pipr = ((volatile immap_t *)IMAP_ADDR)->im_pcmcia.pcmc_pipr; /* * report only if both card detect signals are the same * not too nice done, * we depend on that CD2 is the bit to the left of CD1... */ if(_slot_==-1){ printk("PCMCIA slot has not been defined! Using A as default\n"); _slot_=0; } if(((pipr & M8XX_PCMCIA_CD2(_slot_)) >> 1) ^ (pipr & M8XX_PCMCIA_CD1(_slot_)) ) { printk ("card detect interrupt\n"); } /* clear the interrupt sources */ ((immap_t *)IMAP_ADDR)->im_pcmcia.pcmc_pscr = pscr;#else /* ! CONFIG_IDE_8xx_PCCARD */ /* * Only CONFIG_IDE_8xx_PCCARD is using the interrupt of the * MPC8xx's PCMCIA controller, so there is nothing to be done here * for CONFIG_IDE_8xx_DIRECT and CONFIG_IDE_EXT_DIRECT. * The interrupt is handled somewhere else. -- Steven */#endif /* CONFIG_IDE_8xx_PCCARD */}/* * CIS Tupel codes */#define CISTPL_NULL 0x00#define CISTPL_DEVICE 0x01#define CISTPL_LONGLINK_CB 0x02#define CISTPL_INDIRECT 0x03#define CISTPL_CONFIG_CB 0x04#define CISTPL_CFTABLE_ENTRY_CB 0x05#define CISTPL_LONGLINK_MFC 0x06#define CISTPL_BAR 0x07#define CISTPL_PWR_MGMNT 0x08#define CISTPL_EXTDEVICE 0x09#define CISTPL_CHECKSUM 0x10#define CISTPL_LONGLINK_A 0x11#define CISTPL_LONGLINK_C 0x12#define CISTPL_LINKTARGET 0x13#define CISTPL_NO_LINK 0x14#define CISTPL_VERS_1 0x15#define CISTPL_ALTSTR 0x16#define CISTPL_DEVICE_A 0x17#define CISTPL_JEDEC_C 0x18#define CISTPL_JEDEC_A 0x19#define CISTPL_CONFIG 0x1a#define CISTPL_CFTABLE_ENTRY 0x1b#define CISTPL_DEVICE_OC 0x1c#define CISTPL_DEVICE_OA 0x1d#define CISTPL_DEVICE_GEO 0x1e#define CISTPL_DEVICE_GEO_A 0x1f#define CISTPL_MANFID 0x20#define CISTPL_FUNCID 0x21#define CISTPL_FUNCE 0x22#define CISTPL_SWIL 0x23#define CISTPL_END 0xff/* * CIS Function ID codes */#define CISTPL_FUNCID_MULTI 0x00#define CISTPL_FUNCID_MEMORY 0x01#define CISTPL_FUNCID_SERIAL 0x02#define CISTPL_FUNCID_PARALLEL 0x03#define CISTPL_FUNCID_FIXED 0x04#define CISTPL_FUNCID_VIDEO 0x05#define CISTPL_FUNCID_NETWORK 0x06#define CISTPL_FUNCID_AIMS 0x07#define CISTPL_FUNCID_SCSI 0x08/* * Fixed Disk FUNCE codes */#define CISTPL_IDE_INTERFACE 0x01#define CISTPL_FUNCE_IDE_IFACE 0x01#define CISTPL_FUNCE_IDE_MASTER 0x02#define CISTPL_FUNCE_IDE_SLAVE 0x03/* First feature byte */#define CISTPL_IDE_SILICON 0x04#define CISTPL_IDE_UNIQUE 0x08#define CISTPL_IDE_DUAL 0x10/* Second feature byte */#define CISTPL_IDE_HAS_SLEEP 0x01#define CISTPL_IDE_HAS_STANDBY 0x02#define CISTPL_IDE_HAS_IDLE 0x04#define CISTPL_IDE_LOW_POWER 0x08#define CISTPL_IDE_REG_INHIBIT 0x10#define CISTPL_IDE_HAS_INDEX 0x20#define CISTPL_IDE_IOIS16 0x40/* -------------------------------------------------------------------- */#define MAX_TUPEL_SZ 512#define MAX_FEATURES 4static int check_ide_device (unsigned long base){ volatile u8 *ident = NULL; volatile u8 *feature_p[MAX_FEATURES]; volatile u8 *p, *start; int n_features = 0; u8 func_id = ~0; u8 code, len; unsigned short config_base = 0; int found = 0; int i;#ifdef DEBUG printk ("PCMCIA MEM: %08lX\n", base);#endif start = p = (volatile u8 *) base; while ((p - start) < MAX_TUPEL_SZ) { code = *p; p += 2; if (code == 0xFF) { /* End of chain */ break; } len = *p; p += 2;#ifdef DEBUG_PCMCIA { volatile u8 *q = p; printk ("\nTuple code %02x length %d\n\tData:", code, len); for (i = 0; i < len; ++i) { printk (" %02x", *q); q+= 2; } }#endif /* DEBUG_PCMCIA */ switch (code) { case CISTPL_VERS_1: ident = p + 4; break; case CISTPL_FUNCID: func_id = *p; break; case CISTPL_FUNCE: if (n_features < MAX_FEATURES) feature_p[n_features++] = p; break; case CISTPL_CONFIG: config_base = (*(p+6) << 8) + (*(p+4)); default: break; } p += 2 * len; } found = identify (ident); if (func_id != ((u8)~0)) { print_funcid (func_id); if (func_id == CISTPL_FUNCID_FIXED) found = 1; else return (1); /* no disk drive */ } for (i=0; i<n_features; ++i) { print_fixed (feature_p[i]); } if (!found) { printk ("unknown card type\n"); return (1); } /* set level mode irq and I/O mapped device in config reg*/ *((u8 *)(base + config_base)) = 0x41; return (0);}/* ------------------------------------------------------------------------- */static void print_funcid (int func){ switch (func) { case CISTPL_FUNCID_MULTI: printk (" Multi-Function"); break; case CISTPL_FUNCID_MEMORY: printk (" Memory"); break; case CISTPL_FUNCID_SERIAL: printk (" Serial Port"); break; case CISTPL_FUNCID_PARALLEL: printk (" Parallel Port"); break; case CISTPL_FUNCID_FIXED: printk (" Fixed Disk"); break; case CISTPL_FUNCID_VIDEO: printk (" Video Adapter"); break; case CISTPL_FUNCID_NETWORK: printk (" Network Adapter"); break; case CISTPL_FUNCID_AIMS: printk (" AIMS Card"); break; case CISTPL_FUNCID_SCSI: printk (" SCSI Adapter"); break; default: printk (" Unknown"); break; } printk (" Card\n");}/* ------------------------------------------------------------------------- */static void print_fixed (volatile u8 *p){ if (p == NULL) return; switch (*p) { case CISTPL_FUNCE_IDE_IFACE: { u8 iface = *(p+2); printk ((iface == CISTPL_IDE_INTERFACE) ? " IDE" : " unknown"); printk (" interface "); break; } case CISTPL_FUNCE_IDE_MASTER: case CISTPL_FUNCE_IDE_SLAVE: { u8 f1 = *(p+2); u8 f2 = *(p+4); printk ((f1 & CISTPL_IDE_SILICON) ? " [silicon]" : " [rotating]"); if (f1 & CISTPL_IDE_UNIQUE) printk (" [unique]"); printk ((f1 & CISTPL_IDE_DUAL) ? " [dual]" : " [single]"); if (f2 & CISTPL_IDE_HAS_SLEEP) printk (" [sleep]"); if (f2 & CISTPL_IDE_HAS_STANDBY) printk (" [standby]"); if (f2 & CISTPL_IDE_HAS_IDLE) printk (" [idle]"); if (f2 & CISTPL_IDE_LOW_POWER) printk (" [low power]"); if (f2 & CISTPL_IDE_REG_INHIBIT) printk (" [reg inhibit]"); if (f2 & CISTPL_IDE_HAS_INDEX) printk (" [index]"); if (f2 & CISTPL_IDE_IOIS16) printk (" [IOis16]"); break; } } printk ("\n");}/* ------------------------------------------------------------------------- */#define MAX_IDENT_CHARS 64#define MAX_IDENT_FIELDS 4static u8 *known_cards[] = { "ARGOSY PnPIDE D5", NULL};static int identify (volatile u8 *p){ u8 id_str[MAX_IDENT_CHARS]; u8 data; u8 *t; u8 **card; int i, done; if (p == NULL) return (0); /* Don't know */ t = id_str; done =0; for (i=0; i<=4 && !done; ++i, p+=2) { while ((data = *p) != '\0') { if (data == 0xFF) { done = 1; break; } *t++ = data; if (t == &id_str[MAX_IDENT_CHARS-1]) { done = 1; break; } p += 2; } if (!done) *t++ = ' '; } *t = '\0'; while (--t > id_str) { if (*t == ' ') *t = '\0'; else break; } printk ("Card ID: %s\n", id_str); for (card=known_cards; *card; ++card) { if (strcmp(*card, id_str) == 0) { /* found! */ return (1); } } return (0); /* don't know */}void m8xx_ide_init(void){ ppc_ide_md.default_irq = m8xx_ide_default_irq; ppc_ide_md.default_io_base = m8xx_ide_default_io_base; ppc_ide_md.ide_init_hwif = m8xx_ide_init_hwif_ports;}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -