Hi Michal,

>> 
>> void __init setup_virt_paging(void)
>> {
>> -    BUG_ON("unimplemented");
>> +    register_t vtcr_el2 = READ_SYSREG(VTCR_EL2);
>> +    register_t vstcr_el2 = READ_SYSREG(VSTCR_EL2);
>> +
>> +    /* PA size */
>> +    const unsigned int pa_range_info[] = {32, 36, 40, 42, 44, 48, 52, 0,
>> +                                          /* Invalid */};
>> +
>> +    /*
>> +     * Restrict "p2m_ipa_bits" if needed. As P2M table is always configured
>> +     * with IPA bits == PA bits, compare against "pabits".
>> +     */
>> +    if ( pa_range_info[system_cpuinfo.mm64.pa_range] < p2m_ipa_bits )
>> +        p2m_ipa_bits = pa_range_info[system_cpuinfo.mm64.pa_range];
>> +
>> +    /*
>> +     * The MSA and MSA_frac fields in the ID_AA64MMFR0_EL1 register 
>> identify the
>> +     * memory system configurations supported. In Armv8-R AArch64, the
>> +     * only permitted value for ID_AA64MMFR0_EL1.MSA is 0b1111.
>> +     */
>> +    if ( system_cpuinfo.mm64.msa != MM64_MSA_PMSA_SUPPORT )
>> +        goto fault;
>> +
>> +    /* Permitted values for ID_AA64MMFR0_EL1.MSA_frac are 0b0001 and 
>> 0b0010. */
>> +    if ( (system_cpuinfo.mm64.msa_frac != MM64_MSA_FRAC_PMSA_SUPPORT) &&
>> +         (system_cpuinfo.mm64.msa_frac != MM64_MSA_FRAC_VMSA_SUPPORT) )
>> +        goto fault;
>> +
>> +    /* Stage 1 EL1&0 translation regime uses PMSAv8 by default */
>> +    vtcr_el2 &= ~VTCR_MSA;
>> +
>> +    /*
>> +     * Clear VTCR_EL2.NSA bit to configure non-secure stage 2 translation 
>> output
>> +     * address space to access the Secure PA space as Armv8r only implements
>> +     * secure state.
>> +     */
>> +    vtcr_el2 &= ~VTCR_NSA;
>> +
>> +    /*
>> +     * cpuinfo sanitization makes sure we support 16bits VMID only if all 
>> cores
>> +     * are supporting it.
>> +     *
>> +     * Set the VS bit only if 16 bit VIMD is supported.
>> +     */
>> +    if ( system_cpuinfo.mm64.vmid_bits == MM64_VMID_16_BITS_SUPPORT )
>> +    {
>> +        vtcr_el2 |= VTCR_VS;
>> +        max_vmid = MAX_VMID_16_BIT;
>> +    }
>> +    else
>> +        vtcr_el2 &= ~VTCR_VS;
> This is the last change to vtcr_el2. Why do you put p2m_vmid_allocator_init()
> in-between this and write to vtcr_el2 register? It looks odd.

ok I can have the write to the register before calling p2m_vmid_allocator_init, 
in the
end what matters is only to call p2m_vmid_allocator_init() after setting 
max_vmid.

> 
>> +
>> +    p2m_vmid_allocator_init();
>> +
>> +    WRITE_SYSREG(vtcr_el2, VTCR_EL2);
>> +
>> +    /*
>> +     * VSTCR_EL2.SA defines secure stage 2 translation output address space.
>> +     * To make sure that all stage 2 translations for the Secure PA space 
>> access
>> +     * the Secure PA space, we keep SA bit as 0.
>> +     *
>> +     * VSTCR_EL2.SC is NS check enable bit. To make sure that Stage 2 NS
>> +     * configuration is checked against stage 1 NS configuration in EL1&0
>> +     * translation regime for the given address, and generates a fault if 
>> they
>> +     * are different, we set SC bit 1.
>> +     */
>> +    vstcr_el2 &= ~VSTCR_EL2_SA;
>> +    vstcr_el2 |= VSTCR_EL2_SC;
>> +    WRITE_SYSREG(vstcr_el2, VSTCR_EL2);
>> +
>> +    printk("P2M: %d-bit IPA with %d-bit PA and %d-bit VMID\n",
> All these are unsigned, so %u.

Oops, blindly copying from MMU code, I realise we have the issue also there

Cheers,
Luca


Reply via email to