diff options
-rw-r--r-- | sys/pci/ncr.c | 279 |
1 files changed, 121 insertions, 158 deletions
diff --git a/sys/pci/ncr.c b/sys/pci/ncr.c index 8bc33fe..cca8ddd 100644 --- a/sys/pci/ncr.c +++ b/sys/pci/ncr.c @@ -180,8 +180,12 @@ #include <sys/malloc.h> #include <sys/kernel.h> #include <sys/sysctl.h> +#include <sys/bus.h> #include <machine/clock.h> #include <machine/md_var.h> +#include <machine/bus.h> +#include <machine/resource.h> +#include <sys/rman.h> #include <vm/vm.h> #include <vm/pmap.h> #include <vm/vm_extern.h> @@ -281,27 +285,33 @@ #define vtophys(va) alpha_XXX_dmamap((vm_offset_t)va) #endif -#ifdef NCR_IOMAPPED - -#define INB(r) inb (np->port + offsetof(struct ncr_reg, r)) -#define INW(r) inw (np->port + offsetof(struct ncr_reg, r)) -#define INL(r) inl (np->port + offsetof(struct ncr_reg, r)) - -#define OUTB(r, val) outb (np->port+offsetof(struct ncr_reg,r),(val)) -#define OUTW(r, val) outw (np->port+offsetof(struct ncr_reg,r),(val)) -#define OUTL(r, val) outl (np->port+offsetof(struct ncr_reg,r),(val)) -#define OUTL_OFF(o, val) outl(np->port + (o), (val)) - -#define INB_OFF(o) inb (np->port + (o)) -#define INW_OFF(o) inw (np->port + (o)) -#define INL_OFF(o) inl (np->port + (o)) - -#define READSCRIPT_OFF(base, off) \ - (*((u_int32_t *)((char *)base + (off)))) - -#define WRITESCRIPT_OFF(base, off, val) \ - do { \ - *((u_int32_t *)((char *)base + (off))) = (val); \ +#define INB(r) bus_space_read_1(np->bst, np->bsh, offsetof(struct ncr_reg, r)) +#define INW(r) bus_space_read_2(np->bst, np->bsh, offsetof(struct ncr_reg, r)) +#define INL(r) bus_space_read_4(np->bst, np->bsh, offsetof(struct ncr_reg, r)) + +#define OUTB(r, val) bus_space_write_1(np->bst, np->bsh, \ + offsetof(struct ncr_reg, r), val) +#define OUTW(r, val) bus_space_write_2(np->bst, np->bsh, \ + offsetof(struct ncr_reg, r), val) +#define OUTL(r, val) bus_space_write_4(np->bst, np->bsh, \ + offsetof(struct ncr_reg, r), val) +#define OUTL_OFF(o, val) bus_space_write_4(np->bst, np->bsh, o, val) + +#define INB_OFF(o) bus_space_read_1(np->bst, np->bsh, o) +#define INW_OFF(o) bus_space_read_2(np->bst, np->bsh, o) +#define INL_OFF(o) bus_space_read_4(np->bst, np->bsh, o) + +#define READSCRIPT_OFF(base, off) \ + (base ? *((volatile u_int32_t *)((volatile char *)base + (off))) : \ + bus_space_read_4(np->bst2, np->bsh2, off)) + +#define WRITESCRIPT_OFF(base, off, val) \ + do { \ + if (base) \ + *((volatile u_int32_t *) \ + ((volatile char *)base + (off))) = (val); \ + else \ + bus_space_write_4(np->bst2, np->bsh2, off, val); \ } while (0) #define READSCRIPT(r) \ @@ -310,65 +320,6 @@ #define WRITESCRIPT(r, val) \ WRITESCRIPT_OFF(np->script, offsetof(struct script, r), val) -#else - -#ifdef __alpha__ - -#define INB(r) readb (np->vaddr + offsetof(struct ncr_reg, r)) -#define INW(r) readw (np->vaddr + offsetof(struct ncr_reg, r)) -#define INL(r) readl (np->vaddr + offsetof(struct ncr_reg, r)) - -#define OUTB(r, val) writeb (np->vaddr+offsetof(struct ncr_reg,r),(val)) -#define OUTW(r, val) writew (np->vaddr+offsetof(struct ncr_reg,r),(val)) -#define OUTL(r, val) writel (np->vaddr+offsetof(struct ncr_reg,r),(val)) -#define OUTL_OFF(o, val) writel (np->vaddr + (o), (val)) - -#define INB_OFF(o) readb (np->vaddr + (o)) -#define INW_OFF(o) readw (np->vaddr + (o)) -#define INL_OFF(o) readl (np->vaddr + (o)) - -#define READSCRIPT_OFF(base, off) \ - (base ? *((u_int32_t *)((char *)base + (off))) : \ - readl(np->vaddr2 + off)) - -#define WRITESCRIPT_OFF(base, off, val) \ - do { \ - if (base) \ - *((u_int32_t *)((char *)base + (off))) = (val); \ - else \ - writel(np->vaddr2 + off, val); \ - } while (0) - -#define READSCRIPT(r) \ - READSCRIPT_OFF(np->script, offsetof(struct script, r)) - -#define WRITESCRIPT(r, val) \ - WRITESCRIPT_OFF(np->script, offsetof(struct script, r), val) - -#else - -#define INB(r) (np->reg->r) -#define INW(r) (np->reg->r) -#define INL(r) (np->reg->r) - -#define OUTB(r, val) np->reg->r = (val) -#define OUTW(r, val) np->reg->r = (val) -#define OUTL(r, val) np->reg->r = (val) -#define OUTL_OFF(o, val) *(u_int32_t *) (((u_char *) np->reg) + (o)) = (val) - -#define INB_OFF(o) *( ((u_char *) np->reg) + (o) ) -#define INW_OFF(o) *((u_short *) ( ((u_char *) np->reg) + (o)) ) -#define INL_OFF(o) *((u_int32_t *) ( ((u_char *) np->reg) + (o)) ) - -#define READSCRIPT_OFF(base, off) (*((volatile u_int32_t *)((char *)base + (off)))) -#define WRITESCRIPT_OFF(base, off, val) (*((volatile u_int32_t *)((char *)base + (off))) = (val)) -#define READSCRIPT(r) (np->script->r) -#define WRITESCRIPT(r, val) np->script->r = (val) - -#endif - -#endif - /* ** Set bit field ON, OFF */ @@ -1057,19 +1008,18 @@ struct ncb { ** virtual and physical addresses ** of the 53c810 chip. */ - vm_offset_t vaddr; - vm_offset_t paddr; + int reg_rid; + struct resource *reg_res; + bus_space_tag_t bst; + bus_space_handle_t bsh; - vm_offset_t vaddr2; - vm_offset_t paddr2; + int sram_rid; + struct resource *sram_res; + bus_space_tag_t bst2; + bus_space_handle_t bsh2; - /* - ** pointer to the chip's registers. - */ - volatile -#ifdef __i386__ - struct ncr_reg* reg; -#endif + struct resource *irq_res; + void *irq_handle; /* ** Scripts instance virtual address. @@ -1346,8 +1296,8 @@ static void ncr_action (struct cam_sim *sim, union ccb *ccb); static void ncr_timeout (void *arg); static void ncr_wakeup (ncb_p np, u_long code); -static const char* ncr_probe (pcici_t tag, pcidi_t type); -static void ncr_attach (pcici_t tag, int unit); +static int ncr_probe (device_t dev); +static int ncr_attach (device_t dev); #endif /* _KERNEL */ @@ -1373,8 +1323,6 @@ static const u_long ncr_version = NCR_VERSION * 11 + (u_long) sizeof (struct tcb) * 2; #ifdef _KERNEL -static const int nncr=MAX_UNITS; /* XXX to be replaced by SYSCTL */ -static ncb_p ncrp [MAX_UNITS]; /* XXX to be replaced by SYSCTL */ static int ncr_debug = SCSI_NCR_DEBUG; SYSCTL_INT(_debug, OID_AUTO, ncr_debug, CTLFLAG_RW, &ncr_debug, 0, ""); @@ -1404,18 +1352,6 @@ static int ncr_cache; /* to be aligned _NOT_ static */ #define NCR_1510D_ID (0x000a1000ul) -static u_long ncr_count; - -static struct pci_device ncr_device = { - "ncr", - ncr_probe, - ncr_attach, - &ncr_count, - NULL -}; - -COMPAT_PCI_DRIVER (ncr, ncr_device); - static char *ncr_name (ncb_p np) { static char name[10]; @@ -3173,7 +3109,7 @@ static void ncr_script_copy_and_bind (ncb_p np, ncrcmd *src, ncrcmd *dst, int le switch (old & RELOC_MASK) { case RELOC_REGISTER: - new = (old & ~RELOC_MASK) + np->paddr; + new = (old & ~RELOC_MASK) + rman_get_start(np->reg_res); break; case RELOC_LABEL: new = (old & ~RELOC_MASK) + np->p_script; @@ -3355,16 +3291,17 @@ static int ncr_chip_lookup(u_long device_id, u_char revision_id) -static const char* ncr_probe (pcici_t tag, pcidi_t type) +static int ncr_probe (device_t dev) { - u_char rev = pci_conf_read (tag, PCI_CLASS_REG) & 0xff; int i; - i = ncr_chip_lookup(type, rev); - if (i >= 0) - return ncr_chip_table[i].name; + i = ncr_chip_lookup(pci_get_devid(dev), pci_get_revid(dev)); + if (i >= 0) { + device_set_desc(dev, ncr_chip_table[i].name); + return (0); + } - return (NULL); + return (ENXIO); } @@ -3433,13 +3370,13 @@ ncr_init_burst(ncb_p np, u_char bc) */ -static void -ncr_attach (pcici_t config_id, int unit) +static int +ncr_attach (device_t dev) { - ncb_p np = (struct ncb*) 0; + ncb_p np = (struct ncb*) device_get_softc(dev); u_char rev = 0; u_long period; - int i; + int i, rid; u_int8_t usrsync; u_int8_t usrwide; struct cam_devq *devq; @@ -3448,20 +3385,20 @@ ncr_attach (pcici_t config_id, int unit) ** allocate and initialize structures. */ - np = (ncb_p) malloc (sizeof (struct ncb), M_DEVBUF, M_NOWAIT); - if (!np) return; - ncrp[unit]=np; - bzero (np, sizeof (*np)); - - np->unit = unit; + np->unit = device_get_unit(dev); /* ** Try to map the controller chip to ** virtual and physical memory. */ - if (!pci_map_mem (config_id, 0x14, &np->vaddr, &np->paddr)) - return; + np->reg_rid = 0x14; + np->reg_res = bus_alloc_resource(dev, SYS_RES_MEMORY, &np->reg_rid, + 0, ~0, 1, RF_ACTIVE); + if (!np->reg_res) { + device_printf(dev, "could not map memory\n"); + return ENXIO; + } /* ** Make the controller's registers available. @@ -3469,9 +3406,9 @@ ncr_attach (pcici_t config_id, int unit) ** can be used safely. */ -#ifdef __i386__ - np->reg = (struct ncr_reg*) np->vaddr; -#endif + np->bst = rman_get_bustag(np->reg_res); + np->bsh = rman_get_bushandle(np->reg_res); + #ifdef NCR_IOMAPPED /* @@ -3509,12 +3446,12 @@ ncr_attach (pcici_t config_id, int unit) ** Do chip dependent initialization. */ - rev = pci_conf_read (config_id, PCI_CLASS_REG) & 0xff; + rev = pci_get_revid(dev); /* ** Get chip features from chips table. */ - i = ncr_chip_lookup(pci_conf_read(config_id, PCI_ID_REG), rev); + i = ncr_chip_lookup(pci_get_devid(dev), rev); if (i >= 0) { np->maxburst = ncr_chip_table[i].maxburst; @@ -3648,24 +3585,24 @@ ncr_attach (pcici_t config_id, int unit) burst_code(np->rv_dmode, np->rv_ctest4, np->rv_ctest5); } -#ifndef NCR_IOMAPPED /* ** Get on-chip SRAM address, if supported */ - if ((np->features & FE_RAM) && sizeof(struct script) <= 4096) - (void)(!pci_map_mem (config_id,0x18, &np->vaddr2, &np->paddr2)); -#endif /* !NCR_IOMAPPED */ + if ((np->features & FE_RAM) && sizeof(struct script) <= 4096) { + np->sram_rid = 0x18; + np->sram_res = bus_alloc_resource(dev, SYS_RES_MEMORY, + &np->sram_rid, + 0, ~0, 1, RF_ACTIVE); + } /* ** Allocate structure for script relocation. */ - if (np->vaddr2 != NULL) { -#ifdef __alpha__ + if (np->sram_res != NULL) { np->script = NULL; -#else - np->script = (struct script *) np->vaddr2; -#endif - np->p_script = np->paddr2; + np->p_script = rman_get_start(np->sram_res); + np->bst2 = rman_get_bustag(np->sram_res); + np->bsh2 = rman_get_bushandle(np->sram_res); } else if (sizeof (struct script) > PAGE_SIZE) { np->script = (struct script*) vm_page_alloc_contig (round_page(sizeof (struct script)), @@ -3693,21 +3630,21 @@ ncr_attach (pcici_t config_id, int unit) */ #ifdef PCIR_CACHELNSZ /* To be sure that new PCI stuff is present */ { - u_char cachelnsz = pci_cfgread(config_id, PCIR_CACHELNSZ, 1); - u_short command = pci_cfgread(config_id, PCIR_COMMAND, 2); + u_char cachelnsz = pci_read_config(dev, PCIR_CACHELNSZ, 1); + u_short command = pci_read_config(dev, PCIR_COMMAND, 2); if (!cachelnsz) { cachelnsz = 8; printf("%s: setting PCI cache line size register to %d.\n", ncr_name(np), (int)cachelnsz); - pci_cfgwrite(config_id, PCIR_CACHELNSZ, cachelnsz, 1); + pci_write_config(dev, PCIR_CACHELNSZ, cachelnsz, 1); } if (!(command & (1<<4))) { command |= (1<<4); printf("%s: setting PCI command write and invalidate.\n", ncr_name(np)); - pci_cfgwrite(config_id, PCIR_COMMAND, command, 2); + pci_write_config(dev, PCIR_COMMAND, command, 2); } } #endif /* PCIR_CACHELNSZ */ @@ -3756,7 +3693,7 @@ ncr_attach (pcici_t config_id, int unit) ncr_name(np), np->rv_stest2 & 0x20 ? "differential" : "single-ended", np->rv_dcntl & IRQM ? "totem pole" : "open drain", - np->vaddr2 ? ", using on-chip SRAM" : ""); + np->sram_res ? ", using on-chip SRAM" : ""); /* ** Patch scripts to physical addresses @@ -3826,15 +3763,23 @@ ncr_attach (pcici_t config_id, int unit) if (ncr_snooptest (np)) { printf ("CACHE INCORRECTLY CONFIGURED.\n"); - return; + return EINVAL; }; /* ** Install the interrupt handler. */ - if (!pci_map_int (config_id, ncr_intr, np, &cam_imask)) - printf ("\tinterruptless mode: reduced performance.\n"); + rid = 0; + np->irq_res = bus_alloc_resource(dev, SYS_RES_IRQ, &rid, 0, ~0, 1, + RF_SHAREABLE | RF_ACTIVE); + if (np->irq_res == NULL) { + device_printf(dev, + "interruptless mode: reduced performance.\n"); + } else { + bus_setup_intr(dev, np->irq_res, INTR_TYPE_CAM, + ncr_intr, np, &np->irq_handle); + } /* ** Create the device queue. We only allow MAX_START-1 concurrent @@ -3843,7 +3788,7 @@ ncr_attach (pcici_t config_id, int unit) */ devq = cam_simq_alloc(MAX_START - 1); if (devq == NULL) - return; + return ENOMEM; /* ** Now tell the generic SCSI layer @@ -3853,13 +3798,13 @@ ncr_attach (pcici_t config_id, int unit) 1, MAX_TAGS, devq); if (np->sim == NULL) { cam_simq_free(devq); - return; + return ENOMEM; } if (xpt_bus_register(np->sim, 0) != CAM_SUCCESS) { cam_sim_free(np->sim, /*free_devq*/ TRUE); - return; + return ENOMEM; } if (xpt_create_path(&np->path, /*periph*/NULL, @@ -3867,7 +3812,7 @@ ncr_attach (pcici_t config_id, int unit) CAM_LUN_WILDCARD) != CAM_REQ_CMP) { xpt_bus_deregister(cam_sim_path(np->sim)); cam_sim_free(np->sim, /*free_devq*/TRUE); - return; + return ENOMEM; } /* @@ -3876,7 +3821,7 @@ ncr_attach (pcici_t config_id, int unit) ncr_timeout (np); np->lasttime=0; - return; + return 0; } /*========================================================== @@ -5596,7 +5541,7 @@ void ncr_exception (ncb_p np) printf (" "); break; }; - val = ((unsigned char*) np->vaddr) [i]; + val = bus_space_read_1(np->bst, np->bsh, i); printf (" %x%x", val/16, val%16); if (i%16==15) printf (".\n"); }; @@ -5799,7 +5744,7 @@ static void ncr_int_ma (ncb_p np, u_char dstat) printf ("\nCP=%p CP2=%p DSP=%x NXT=%x VDSP=%p CMD=%x ", cp, np->header.cp, dsp, - nxtdsp, (char*)vdsp_base+vdsp_off, cmd); + nxtdsp, (volatile char*)vdsp_base+vdsp_off, cmd); }; /* @@ -6566,11 +6511,11 @@ ncr_alloc_nccb (ncb_p np, u_long target, u_long lun) tp->getscr[0] = (np->features & FE_PFEN)? SCR_COPY(1) : SCR_COPY_F(1); tp->getscr[1] = vtophys (&tp->tinfo.sval); - tp->getscr[2] = np->paddr + offsetof (struct ncr_reg, nc_sxfer); + tp->getscr[2] = rman_get_start(np->reg_res) + offsetof (struct ncr_reg, nc_sxfer); tp->getscr[3] = (np->features & FE_PFEN)? SCR_COPY(1) : SCR_COPY_F(1); tp->getscr[4] = vtophys (&tp->tinfo.wval); - tp->getscr[5] = np->paddr + offsetof (struct ncr_reg, nc_scntl3); + tp->getscr[5] = rman_get_start(np->reg_res) + offsetof (struct ncr_reg, nc_scntl3); assert (((offsetof(struct ncr_reg, nc_sxfer) ^ (offsetof(struct tcb ,tinfo) @@ -7208,5 +7153,23 @@ printf ("Sum = %04x\n", sum); } #endif /* NCR_TEKRAM_EEPROM */ +static device_method_t ncr_methods[] = { + /* Device interface */ + DEVMETHOD(device_probe, ncr_probe), + DEVMETHOD(device_attach, ncr_attach), + + { 0, 0 } +}; + +static driver_t ncr_driver = { + "ncr", + ncr_methods, + sizeof(struct ncb), +}; + +static devclass_t ncr_devclass; + +DRIVER_MODULE(if_ncr, pci, ncr_driver, ncr_devclass, 0, 0); + /*=========================================================================*/ #endif /* _KERNEL */ |