Could you teach me how fine the physcial addtess?
Mitch Bradley
wmb at laptop.org
Thu Sep 6 12:14:28 EDT 2007
Adding devel@ to the list because this is generally useful information....
Jordan Crouse wrote:
> On 06/09/07 14:29 +0100, David Woodhouse wrote:
>
>> On Thu, 2007-09-06 at 20:57 +0800, Luna.Huang at quantatw.com wrote:
>>
>>> Could you teach me how find the DCOM register in CPU?
>>>
>>> For example, I want to read a DC register, DC_GENERAL_CFG register.
>>>
>>> I know its memory offset is 004h but I don’t know how find the base
>>> address.
>>>
>>> Study the CPU spec. but not really understand.
>>>
>> I believe the easiest way to find those is through a PCI BAR, although
>> actually it's set by magic GeodeLink stuff. Jordan is the best person to
>> ask.
>>
>
> The DC lives at 0xfe004000. All the video base addresses are in PCI
> header device 00:01.1, PCI id 1022:2081.
>
> Bar 0 is the framebuffer,
> bar 1 is the graphics processor
> bar 2 is the display controller
> bar 3 is the video processor
>
> Jordan
>
>
Here are some techniques you can use from Open Firmware:
ok screen-ih iselect
ok see dc@
: dc@
dc-base + rl@
;
ok dc-base map?
VA: ffae8000 PA: fe004000
Mode: 73 Dirty Accessed Don'tCache Supervisor R/W
ok dc-base >physical .
fe004000
ok 918 config-l@ .
fe004000
The "918 config-l@ ." displays the value of BAR 1. How did I get the
918 number? The general pattern for the PCI config space address of a
BAR is:
(bus# * 0x10000) + (device# * 0x800) + (function# * 0x100) + 0x10
+ (BAR# * 4)
(The 0x10 is the starting offset of the BARs in the device's block of
configuration registers.)
In this case, bus# =0 (because this is the root PCI bus - there are no
PCI to PCI bridges in the system - this is the 00 in 00:01.1), device#
is 1 (the 01 in 00:01.1), function# is 1 (the .1 in 00:01.1), BAR# is 2:
(0 * 0x10000) + (1 * 0x800) + (1 * 0x100) + 0x10 + (2*4) = 0x918
How did Jordan know which BAR is which? Well, one way is to read the
source code for either the Linux driver or the OFW driver. That
information is not in the LX hardware specification. The reason it is
not there is because the graphics hardware is not really on the PCI
bus! It is really on an internal bus inside the LX processor. The
hardware manual cannot document which BAR is which because there really
are no BARs in the LX hardware!
Software pretends it is on the PCI bus because OSs have well-developed
frameworks for handling PCI devices, and do not have frameworks for
handling the real GeodeLink internal hardware architecture. How does
the software do this pretending?
In the case of a conventional BIOS, there is special "VSA" code that
runs in system management mode. The VSA code intercepts accesses to the
PC I/O port addresses that are used for PCI configuration space access,
and runs complicated system-management-mode code that emulates PCI
configuration registers for the devices that are inside the LX CPU and
the CS5536 I/O chip.
In the Open Firmware case, I didn't want to use VSA because it is hard
to maintain (for example we don't have a compiler that will compile the
code) and slow (it would have made startup and resume take longer). So
instead of emulating the PCI configuration access by intercepting the
I/O port accesses, I added a small amount of code to the PCI
configuration access subroutines in the Linux kernel and OFW. That code
does effectively the same thing as VSA, but at a slightly higher level -
it notices that the configuration space address is for one of the
internal devices, and returns the right value from a table in memory.
So back to the question of where the BAR numbers are documented: AMD
has a document that describes the emulated PCI config registers that the
VSA provides. That document is hard to get; it is on AMD's restricted
web site. It is easier to get the information either by reading the
driver code or by asking Jordan.
How does the hardware actually establish the physical address of the
DC? Well, the LX CPU has some "P2D" MSRs that control address
assignment. Any P2D MSR can map an address to one of several devices,
so there is not a fixed assignment of P2Ds to specific devices. OFW
chooses to use the P2D MSR at MSR number 0x1000002a to map the DC. The
value in that MSR is 0x801ffcfe.007fe004 . You can look up the bits in
that MSR if you want to understand how it really works. OFW maps the GP
with MSR 0x10000022, and the VP+VIP with MSR 0x10000023.
One more topic: You can find PCI device and function numbers with:
ok show-devs /pci
/pci/usb at f,5
/pci/usb at f,4
/pci/audio at f,3
/pci/camera at c,2
/pci/sd at c,1
/pci/nandflash at c
/pci/pci1022,2082 at 1,2
/pci/host at 1
/pci/display at 1,1
/pci/isa at f
/pci/usb at f,5/wlan at 0,0
/pci/sd at c,1/disk
/pci/isa at f/rtc at i70
/pci/isa at f/8042 at i60
/pci/isa at f/serial at i3f8
/pci/isa at f/timer at i40
/pci/isa at f/interrupt-controller at i20
/pci/isa at f/dma-controller at i00
/pci/isa at f/8042 at i60/mouse at aux
/pci/isa at f/8042 at i60/keyboard at kbd
Here we see "/pci/display at 1,1" - the display device is device# 1,
function# 1. Similarly, the audio device (audio at f,3) is device# f,
function# 3. There are two USB devices - the one at f,5 is the EHCI,
i.e. the USB2.0 controller, and the one at f,4 is OHCI, i.e. the USB 1.1
controller.
Thus endeth the lesson.
More information about the Devel
mailing list