Sorry, I didn't notice that your code used to work well.
Can you find some messages such as "reprogram xxxx" in
syslog ?  Or your device is put into D3 state ?




minskey guo 写道:

This couldn't be an error of ddi_regs_map_setup() or ddi_get64(), if that
happens, most hardware device drivers cannot work.

You can check if the BAR is allocated PCI address range by "prtconf -vp",
and check the value of assigned-addresses of your device, and whether
your device support 64bit addressing or not. For the values of assigned-
addresses, each BAR is presented as 5 dwords.

Not sure that you just want to get the content of BAR0. The code is expected
to get the memory-mapped device registers or memory . If you did want to
get the content of mmaped registers, you should enable I/O or memory access
in PCI command register (PCI offset 0x04), before you read/write device
registers.

thanks,
-minskey


-minskey

Eitan Eliahu 写道:
The following is a code snippet which describes the problem. The value returned by ddi_get64 is wrong. I used PCItool to read the
same address from bar0 and it returns the correct value.
As I mentioned before the same code works on s10 update 6. It also works
fine on build 110 on Sparc. It seems that device address is not set
correctly. I haven't figured out at which address it points to but
certainly not the correct address.

ddi_device_acc_attr_t dev_attr = {
    DDI_DEVICE_ATTR_V0,
    DDI_NEVERSWAP_ACC,
    DDI_STRICTORDER_ACC,
    DDI_FLAGERR_ACC
};


    /* map BAR0 */
    ret = ddi_regs_map_setup(dev_info, 1, (caddr_t *)&attr.bar0,
        (offset_t)0, (offset_t)0, &dev_attr, &attr.regh0);
    if (ret != DDI_SUCCESS) {
        ...
    }


//
// val64 has a wrong value
//
val64 = ddi_get64(attr.regh0, (uint64_t *)(attr.bar0))



-----Original Message-----
From: Dan Mick [mailto:[email protected]] Sent: Friday, April 10, 2009 8:45 PM
To: Eitan Eliahu
Cc: [email protected]
Subject: Re: [driver-discuss] OpenSOlaris build 110 - problem with
ddi_regs_map_setup() on x86

Not enough information here.  Can you supply a misbehaving code snippet?
How do you know it's the wrong data?

Eitan Eliahu wrote:
Hello all,

I'm facing a problem with this build when running on an x86 machine.
It
seems that ddi_regs_map_setup()does not return the correct device address. When offset provided to ddi_get() a wrong data is read from
the
device.

The following attribute is provided:

ddi_device_acc_attr_t dev_attr = {

      DDI_DEVICE_ATTR_V0,

      DDI_NEVERSWAP_ACC,

      DDI_STRICTORDER_ACC,

      DDI_FLAGERR_ACC

};

When range # 0 is provided to ddi_regs_map_setup the correct data is read from the configuration space. The issue is for memory mapped I/O,

on x86 (Sparc works) and OpenSolaris build 110.

I would appreciate any advice.

Eitan



------------------------------------------------------------------------
_______________________________________________
driver-discuss mailing list
[email protected]
http://mail.opensolaris.org/mailman/listinfo/driver-discuss

_______________________________________________
driver-discuss mailing list
[email protected]
http://mail.opensolaris.org/mailman/listinfo/driver-discuss




_______________________________________________
driver-discuss mailing list
[email protected]
http://mail.opensolaris.org/mailman/listinfo/driver-discuss

Reply via email to