예제 #1
0
static void beat_lpar_hpte_invalidate(unsigned long slot, unsigned long va,
                                      int psize, int ssize, int local)
{
    unsigned long want_v;
    unsigned long lpar_rc;
    u64 dummy1, dummy2;
    unsigned long flags;

    DBG_LOW("    inval : slot=%lx, va=%016lx, psize: %d, local: %d\n",
            slot, va, psize, local);
    want_v = hpte_encode_v(va, psize, MMU_SEGSIZE_256M);

    atomic_spin_lock_irqsave(&beat_htab_lock, flags);
    dummy1 = beat_lpar_hpte_getword0(slot);

    if ((dummy1 & ~0x7FUL) != (want_v & ~0x7FUL)) {
        DBG_LOW("not found !\n");
        atomic_spin_unlock_irqrestore(&beat_htab_lock, flags);
        return;
    }

    lpar_rc = beat_write_htab_entry(0, slot, 0, 0, HPTE_V_VALID, 0,
                                    &dummy1, &dummy2);
    atomic_spin_unlock_irqrestore(&beat_htab_lock, flags);

    BUG_ON(lpar_rc != 0);
}
예제 #2
0
static void beat_lpar_hptab_clear(void)
{
    unsigned long size_bytes = 1UL << ppc64_pft_size;
    unsigned long hpte_count = size_bytes >> 4;
    int i;
    u64 dummy0, dummy1;

    /* TODO: Use bulk call */
    for (i = 0; i < hpte_count; i++)
        beat_write_htab_entry(0, i, 0, 0, -1UL, -1UL, &dummy0, &dummy1);
}
예제 #3
0
파일: beat_htab.c 프로젝트: 274914765/C
static void beat_lpar_hpte_updateboltedpp(unsigned long newpp,
                      unsigned long ea,
                      int psize, int ssize)
{
    unsigned long lpar_rc, slot, vsid, va, dummy0, dummy1;

    vsid = get_kernel_vsid(ea, MMU_SEGSIZE_256M);
    va = (vsid << 28) | (ea & 0x0fffffff);

    spin_lock(&beat_htab_lock);
    slot = beat_lpar_hpte_find(va, psize);
    BUG_ON(slot == -1);

    lpar_rc = beat_write_htab_entry(0, slot, 0, newpp, 0, 7,
        &dummy0, &dummy1);
    spin_unlock(&beat_htab_lock);

    BUG_ON(lpar_rc != 0);
}
예제 #4
0
static void beat_lpar_hpte_updateboltedpp(unsigned long newpp,
					  unsigned long ea,
					  int psize, int ssize)
{
	unsigned long vpn;
	unsigned long lpar_rc, slot, vsid;
	u64 dummy0, dummy1;

	vsid = get_kernel_vsid(ea, MMU_SEGSIZE_256M);
	vpn = hpt_vpn(ea, vsid, MMU_SEGSIZE_256M);

	raw_spin_lock(&beat_htab_lock);
	slot = beat_lpar_hpte_find(vpn, psize);
	BUG_ON(slot == -1);

	lpar_rc = beat_write_htab_entry(0, slot, 0, newpp, 0, 7,
		&dummy0, &dummy1);
	raw_spin_unlock(&beat_htab_lock);

	BUG_ON(lpar_rc != 0);
}
예제 #5
0
파일: beat_htab.c 프로젝트: 168519/linux
/*
 * NOTE: for updatepp ops we are fortunate that the linux "newpp" bits and
 * the low 3 bits of flags happen to line up.  So no transform is needed.
 * We can probably optimize here and assume the high bits of newpp are
 * already zero.  For now I am paranoid.
 */
static long beat_lpar_hpte_updatepp(unsigned long slot,
				    unsigned long newpp,
				    unsigned long vpn,
				    int psize, int apsize,
				    int ssize, unsigned long flags)
{
	unsigned long lpar_rc;
	u64 dummy0, dummy1;
	unsigned long want_v;

	want_v = hpte_encode_avpn(vpn, psize, MMU_SEGSIZE_256M);

	DBG_LOW("    update: "
		"avpnv=%016lx, slot=%016lx, psize: %d, newpp %016lx ... ",
		want_v & HPTE_V_AVPN, slot, psize, newpp);

	raw_spin_lock(&beat_htab_lock);
	dummy0 = beat_lpar_hpte_getword0(slot);
	if ((dummy0 & ~0x7FUL) != (want_v & ~0x7FUL)) {
		DBG_LOW("not found !\n");
		raw_spin_unlock(&beat_htab_lock);
		return -1;
	}

	lpar_rc = beat_write_htab_entry(0, slot, 0, newpp, 0, 7, &dummy0,
					&dummy1);
	raw_spin_unlock(&beat_htab_lock);
	if (lpar_rc != 0 || dummy0 == 0) {
		DBG_LOW("not found !\n");
		return -1;
	}

	DBG_LOW("ok %lx %lx\n", dummy0, dummy1);

	BUG_ON(lpar_rc != 0);

	return 0;
}