[parisc-linux] Re: CCIO dma io_command and related io_tlb format questions.

Joel Soete soete.joel at scarlet.be
Sat Oct 21 11:17:46 MDT 2006



Grant Grundler wrote:
> On Fri, Oct 20, 2006 at 05:18:28PM +0000, Joel Soete wrote:
>>>>> chainid_mask 0xfff80000
>>> This second chainid_mask is 13 bits wide.
>> mmm sorry how do you compute this wide value?
> 
> Count the number of contiguous bits set to 1.
> bit 31 to bit 19 is 13 bits.
> 
Ah thanks (one more stuff in my dico ;-) )

>> Btw I just discover an interesting comment in rope.h
>>> /*
>>> ** IOC supports 4/8/16/64KB page sizes (see TCNFG register)
>>> ** It's safer (avoid memory corruption) to keep DMA page mappings
>>> ** equivalently sized to VM PAGE_SIZE.
>>> **
>> [snip]
>>> **
>>> ** PAGE_SIZE could be greater than IOVP_SIZE. But not the inverse.
>>> */
>> and specialy:
>>> ** It's safer (avoid memory corruption) to keep DMA page mappings
>>> ** equivalently sized to VM PAGE_SIZE.
>> which was related to the original question I didn't reach to explain better.
> 
> The "avoid memory corruption" refers to the fact the we are likely
> to map *more* address space than the device actually will DMA to.
> If the device is doing DMA to 4K and we map 64k, than means there
> is 60k more DMA address space the device can write to than it needs
> permission to.
Exactely my understanding ...

> The trade-off is between efficiency in creating
> DMA mappings (reducing the number of mappings) and how much
> address space we actually use.
>
... too ;-)

>> So even if I don't understand why, we have to limits the number of iotlb 
>> entries to 256 (without doc I just accept it).
> 
> No. The number of IO TLB entries is implemented in HW.
> The SW (e.g. ccio) only controls the number IO Pdir entries and
> thus the total amount to DMA that can be mapped at the one time.
> 
> The size of a page (as seen from IO) is just much simpler to manage
> when it's the same size of a page as seen by the CPU.
> I need a really good reason to make things more complex.
> And in this case I don't have a reason. I just want to enable
> someone else to experiment if they have time or reason to do so.
> 
I didn't mean to make more complex?

But the confusion may be came that I took a comment in sba code to explain somthing which weems to me strange in ccio code?

Or my english is to bad or I missed the meaning of this hunk:

	iova_space_size = (num_physpages << PAGE_SHIFT) / count_parisc_driver(&ccio_driver)

   means simply that we equaly balance all my ram between ioc then
   [in my config 256MB / 2 ccio bc == 128MB]

	(assuming it >= 1MB and < then 1GB)

	iov_order = get_order(iova_space_size << PAGE_SHIFT);

         /* iova_space_size is now bytes, not pages */
         iova_space_size = 1 << (iov_order + PAGE_SHIFT);

   we compute just a new value so that  "iova space is log2() in size."
   [in my config 128MB]

   then we compute a pdir_size, reserve pdir_base and the same for res_size and res_map according to IOVP_SIZE.

   and finaly what I certainly missunderstand:

	ioc->chainid_shift = get_order(iova_space_size) + PAGE_SHIFT - CCIO_CHAINID_SHIFT;

   i.e. if I translate in terms of power 2:
	chain_size = iova_space_size / 256 [ in my config 128Mb / 256 = 512k]

   and my understanding of seting io_chain_id_mask = CCIO_MASK << chainid_shift
   was to configure ccio to use chain_size page size (and not IOVP_SIZE because it would resulting to much io tlb entry)?

   what seems to be confirmed elsewhere by:

> static CCIO_INLINE void
> ccio_clear_io_tlb(struct ioc *ioc, dma_addr_t iovp, size_t byte_cnt)
> {
>         u32 chain_size = 1 << ioc->chainid_shift;
> 
>         iovp &= IOVP_MASK;      /* clear offset bits, just want pagenum */
>         byte_cnt += chain_size;
> 
>         while(byte_cnt > chain_size) {
>                 WRITE_U32(CMD_TLB_PURGE | iovp, &ioc->ioc_regs->io_command);
>                 iovp += chain_size;
>                 byte_cnt -= chain_size;
>         }
> }

and nowhere else chainid_shift is used in sg list managment, only IOVP_[SHIFT,SIZE].

so either somewhere I learn sg manager that actual iovp became 512k (but seems to be break 2 sba advises: iovp_shift > 
PAGE_SIZE, DMA page mappings not equivalently sized to VM PAGE_SIZE)
or i save IOVP_SIZE (my preference) but recompute iova_space_size and all related values to setup ccio?

Or I just have to wait public ccio doc to better understand how this hw works ;-)

Thanks for your patience,
	Joel

> grant
> 
> 



More information about the parisc-linux mailing list