Aneesh,

Thank you for your help. I tried

/* Workaround for lack of device tree */
                       if (primary) {
__ioremap_at(range.cpu_addr, (void *)ISA_IO_BASE,
                               range.size, HPTE_R_C | HPTE_R_M);
                       hose->io_base_virt = (void *)_IO_BASE;
printk("Initialised io_base_virt 0x%lx _IO_BASE 0x%llx\n", (unsigned long)hose->io_base_virt, (unsigned long long)_IO_BASE);
                    }

Unfortunately the kernel doesn't boot.

Cheers,

Christian

On 24 May 2016 at 5:37 PM, Aneesh Kumar K.V wrote:
You can look at commit 72176dd0ad36c ("powerpc/mm: Use a helper for
finding pte bits mapping I/O area") to find similar conversion we did.

For ex:
        __ioremap_at(phb_io_base_phys, (void *)ISA_IO_BASE,
                     size, _PAGE_NO_CACHE|_PAGE_GUARDED);

gets replaced by

        __ioremap_at(phb_io_base_phys, (void *)ISA_IO_BASE,
                     size, pgprot_val(pgprot_noncached(__pgprot(0))));

Now that gets mapped to the below hpte bits

pte bit -> _PAGE_NON_IDEMPOTENT

Which get converted in htab_convert_pte_flags(unsigned long pteflags)
to

        if ((pteflags & _PAGE_CACHE_CTL ) == _PAGE_NON_IDEMPOTENT)
                rflags |= (HPTE_R_I | HPTE_R_G);

BTW we default add (HPTE_R_C | HPTE_R_M ).

Hence the final pte WIMG bits will be MIG. I guess that is what you
wanted ?


If that doesn't work, can you point me the current code so that I can
look at it and suggest correct alternative.

-aneesh



_______________________________________________
Linuxppc-dev mailing list
Linuxppc-dev@lists.ozlabs.org
https://lists.ozlabs.org/listinfo/linuxppc-dev

Reply via email to