예제 #1
0
파일: hubspc.c 프로젝트: nhanh0/hah
/*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);
}
예제 #2
0
/*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;
}