Christian Kaiser wrote: > Lu Baolu wrote: > >> On Wed, Dec 3, 2008 at 1:48 AM, Christian Kaiser <[EMAIL PROTECTED]> wrote: >> >>> Hi all, >>> >>> I am currently porting a driver from Linux to Solaris. >>> >>> The Linux driver uses amongst others the following functions: >>> >>> virt_to_phys() >>> virt_to_bus() >>> phys_to_virt() >>> bus_to_virt() >>> >>> As you can see, these functions translate virtual into physical or bus >>> addresses and vice versa. >>> Is there something similar available on Solaris? I am currently >>> developing on SXCE b103. >>> >> Hi, >> >> You may refer to the code in rootnex_get_sgl(). You can find samples >> there, but they are non-ddi. >> >> usr/src/uts/i86pc/io/rootnex.c, line 2393 >> >> 2387 /* >> 2388 * rootnex_get_sgl() >> 2389 * Called in bind fastpath to get the sgl. Most of this will be >> replaced >> 2390 * with a call to the vm layer when vm2.0 comes around... >> 2391 */ >> 2392 static void >> 2393 rootnex_get_sgl(ddi_dma_obj_t *dmar_object, ddi_dma_cookie_t *sgl, >> 2394 rootnex_sglinfo_t *sglinfo) >> > > Thanks! > > I found out that hat_getpfnum() is used in rootnex_get_sgl(). I assume > that since hat_getkpfnum() (the k makes the difference!) is not > available on amd64, hat_getpfnum() (without k!) is the only way to find > out the page frame number? Is that correct? > > Unfortunately, I don't know how the get the "hat" out of a virtual > address that would be the first parameter to hat_getpfnum(). In the > example it is taken from 'dmar_object' but I don't have such an object > in my code. What else can I do? >
If you are writing a device driver, or porting one, then you're going about this entirely the wrong way. These APIs should only be used by low level platform code, not from within device drivers. In fact, hat_getkpfnum generates warnings if you use it! Assuming that this is an ordinary device driver, and not something really unusual (really unusual would mean something like a new MMU layer or somesuch), then you need to use the Solaris DDI DMA interfaces. ddi_dma_alloc_handle() to get a handle. ddi_dma_mem_alloc() to allocate memory (unless you already have memory). ddi_dma_addr_bind_handle() to bind DMA addresses, and get the "cookie" for the corresponding physical address. ddi_dma_buf_bind_handle() if you're working buf(9S) structures instead of arbitrary memory This may sound like more work, but the end result is portable and safe, and will even work on amd64 and SPARC systems. -- Garrett _______________________________________________ opensolaris-code mailing list [email protected] http://mail.opensolaris.org/mailman/listinfo/opensolaris-code
