/*ARGSUSED*/ int cpuprom_map(devfs_handle_t dev, vhandl_t *vt, off_t addr, size_t len) { int errcode; caddr_t kvaddr; devfs_handle_t node; cnodeid_t cnode; node = prominfo_nodeget(dev); if (!node) return EIO; kvaddr = hubdev_prombase_get(node); cnode = hubdev_cnodeid_get(node); #ifdef HUBSPC_DEBUG printf("cpuprom_map: hubnode %d kvaddr 0x%x\n", node, kvaddr); #endif if (len > RBOOT_SIZE) len = RBOOT_SIZE; /* * Map in the prom space */ errcode = v_mapphys(vt, kvaddr, len); if (errcode == 0 ) { /* * Set the MD configuration registers suitably. */ nasid_t nasid; uint64_t value; volatile hubreg_t *regaddr; nasid = COMPACT_TO_NASID_NODEID(cnode); regaddr = REMOTE_HUB_ADDR(nasid, FPROM_CONFIG_ADDR); value = HUB_L(regaddr); value &= ~(FPROM_SETUP_MASK | FPROM_ENABLE_MASK); { value |= (((long)CONFIG_FPROM_SETUP << FPROM_SETUP_SHFT) | ((long)CONFIG_FPROM_ENABLE << FPROM_ENABLE_SHFT)); } HUB_S(regaddr, value); } return (errcode); }
/*ARGSUSED*/ int mem_refcnt_mmap(devfs_handle_t dev, vhandl_t *vt, off_t off, size_t len, uint prot) { cnodeid_t node; int errcode; char* buffer; size_t blen; #ifndef CONFIG_IA64_SGI_SN1 extern int numnodes; #endif ASSERT( (hubspc_subdevice_t)(ulong)device_info_get(dev) == HUBSPC_REFCOUNTERS ); node = master_node_get(dev); ASSERT( (node >= 0) && (node < numnodes) ); ASSERT( NODEPDA(node)->migr_refcnt_counterbuffer != NULL); ASSERT( NODEPDA(node)->migr_refcnt_counterbase != NULL ); ASSERT( NODEPDA(node)->migr_refcnt_cbsize != 0 ); /* * XXXX deal with prot's somewhere around here.... */ buffer = NODEPDA(node)->migr_refcnt_counterbuffer; blen = NODEPDA(node)->migr_refcnt_cbsize; /* * Force offset to be a multiple of sizeof(refcnt_t) * We round up. */ off = (((off - 1)/sizeof(refcnt_t)) + 1) * sizeof(refcnt_t); if ( ((buffer + blen) - (buffer + off + len)) < 0 ) { return (EPERM); } errcode = v_mapphys(vt, buffer + off, len); return errcode; }