Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 7 Apr 2009 11:04:11 -0400
From:      Alexander Sack <pisymbol@gmail.com>
To:        John Baldwin <jhb@freebsd.org>
Cc:        freebsd-hackers@freebsd.org, Sergey Babkin <babkin@verizon.net>, Ivan Voras <ivoras@freebsd.org>
Subject:   Re: Patch for MS Hyper V (virtualization)
Message-ID:  <3c0b01820904070804s1aa63cc3ife542e7001f5497c@mail.gmail.com>
In-Reply-To: <200904070921.14294.jhb@freebsd.org>
References:  <1366225354.253456.1238948619308.JavaMail.root@vms124.mailsrvcs.net> <200904061342.22000.jhb@freebsd.org> <49DAC4A1.589A5FE@verizon.net> <200904070921.14294.jhb@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, Apr 7, 2009 at 9:21 AM, John Baldwin <jhb@freebsd.org> wrote:
> On Monday 06 April 2009 11:12:33 pm Sergey Babkin wrote:
>> John Baldwin wrote:
>> >
>> > On Monday 06 April 2009 1:07:38 pm Ivan Voras wrote:
>> > > 2009/4/6 John Baldwin <jhb@freebsd.org>:
>> > > > On Sunday 05 April 2009 12:23:39 pm Sergey Babkin wrote:
>> > >
>> > > > Hmm, the problem is we need to be able to write to BARs to size th=
em.
> =C2 Any
>> > OS
>> > > > needs to be able to do this to know what address space regions are
> being
>> > > > decoded by devices. =C2 We can't avoid writing to BARs.
>> > >
>> > > I have only vague idea what BARs are and if it's the correct diagnos=
is
>> > > in this case, but the fact is that other operating systems (Windows,
>> > > Linux tested) work, so either there is a way around it or the origin=
al
>> > > premise is wrong-ish.
>> >
>> > Every OS writes to BARs to size them during boot. =9AIt's the defined
> procedure
>> > for sizing them. =9AA BAR is a base address register, and it is how a =
PCI
>> > device gets memory and I/O port resources. =9AOS (or BIOS) writes a st=
arting
>> > address into the register to tell the PCI device where a given
>> > resource "starts".
>>
>> The OS doesn't have to write to the BAR if BIOS has already
>> done it. And the BIOS in the Hyper-V VM is obviously special,
>> so it doesn't trip on iself.
>
> Yes it does because we don't know how _big_ the BAR is. =9AThe OS has to =
know if
> the device is decoding 1MB or 64KB because we need to reserve the entire
> window to prevent any other devices from using it. =9AWe don't just write=
 the
> existing value, we write all 1's to it and read it back. =9AThe lower N
> bits "stick" at zero and we use that to figure out the BAR's size. =9ASee
> pci_add_map() in sys/dev/pci/pci.c

John is 100% correct.  Every kernel PCI driver has to figure out how
big the BAR is and IN FACT typically the BIOS assigns more address
space than the register set you are mapping.  This is straight out of
the PCI spec.

-aps



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3c0b01820904070804s1aa63cc3ife542e7001f5497c>