From mboxrd@z Thu Jan 1 00:00:00 1970 From: Konrad Rzeszutek Wilk Subject: Re: [PATCH] hvmloader: don't treat ROM BAR like other BARs Date: Mon, 23 Mar 2015 15:35:02 -0400 Message-ID: <20150323193502.GC20509@l.oracle.com> References: <550C48C0020000780006C1E1@mail.emea.novell.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1Ya880-0001Xo-24 for xen-devel@lists.xenproject.org; Mon, 23 Mar 2015 19:35:12 +0000 Content-Disposition: inline In-Reply-To: <550C48C0020000780006C1E1@mail.emea.novell.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: Jan Beulich Cc: xen-devel , Keir Fraser , Andrew Cooper List-Id: xen-devel@lists.xenproject.org On Fri, Mar 20, 2015 at 03:20:16PM +0000, Jan Beulich wrote: > Its low 11 bits have different meaning. > > Signed-off-by: Jan Beulich Reviewed-by: Konrad Rzeszutek Wilk > > --- a/tools/firmware/hvmloader/pci.c > +++ b/tools/firmware/hvmloader/pci.c > @@ -179,18 +179,31 @@ void pci_setup(void) > bar_reg = PCI_ROM_ADDRESS; > > bar_data = pci_readl(devfn, bar_reg); > - is_64bar = !!((bar_data & (PCI_BASE_ADDRESS_SPACE | > - PCI_BASE_ADDRESS_MEM_TYPE_MASK)) == > - (PCI_BASE_ADDRESS_SPACE_MEMORY | > - PCI_BASE_ADDRESS_MEM_TYPE_64)); > - pci_writel(devfn, bar_reg, ~0); > + if ( bar_reg != PCI_ROM_ADDRESS ) > + { > + is_64bar = !!((bar_data & (PCI_BASE_ADDRESS_SPACE | > + PCI_BASE_ADDRESS_MEM_TYPE_MASK)) == > + (PCI_BASE_ADDRESS_SPACE_MEMORY | > + PCI_BASE_ADDRESS_MEM_TYPE_64)); > + pci_writel(devfn, bar_reg, ~0); > + } > + else > + { > + is_64bar = 0; > + pci_writel(devfn, bar_reg, > + (bar_data | PCI_ROM_ADDRESS_MASK) & > + ~PCI_ROM_ADDRESS_ENABLE); > + } > bar_sz = pci_readl(devfn, bar_reg); > pci_writel(devfn, bar_reg, bar_data); > > - bar_sz &= (((bar_data & PCI_BASE_ADDRESS_SPACE) == > - PCI_BASE_ADDRESS_SPACE_MEMORY) ? > - PCI_BASE_ADDRESS_MEM_MASK : > - (PCI_BASE_ADDRESS_IO_MASK & 0xffff)); > + if ( bar_reg != PCI_ROM_ADDRESS ) > + bar_sz &= (((bar_data & PCI_BASE_ADDRESS_SPACE) == > + PCI_BASE_ADDRESS_SPACE_MEMORY) ? > + PCI_BASE_ADDRESS_MEM_MASK : > + (PCI_BASE_ADDRESS_IO_MASK & 0xffff)); > + else > + bar_sz &= PCI_ROM_ADDRESS_MASK; > if (is_64bar) { > bar_data_upper = pci_readl(devfn, bar_reg + 4); > pci_writel(devfn, bar_reg + 4, ~0); > @@ -214,8 +227,9 @@ void pci_setup(void) > bars[i].bar_reg = bar_reg; > bars[i].bar_sz = bar_sz; > > - if ( (bar_data & PCI_BASE_ADDRESS_SPACE) == > - PCI_BASE_ADDRESS_SPACE_MEMORY ) > + if ( ((bar_data & PCI_BASE_ADDRESS_SPACE) == > + PCI_BASE_ADDRESS_SPACE_MEMORY) || > + (bar_reg == PCI_ROM_ADDRESS) ) > mmio_total += bar_sz; > > nr_bars++; > > > > hvmloader: don't treat ROM BAR like other BARs > > Its low 11 bits have different meaning. > > Signed-off-by: Jan Beulich > > --- a/tools/firmware/hvmloader/pci.c > +++ b/tools/firmware/hvmloader/pci.c > @@ -179,18 +179,31 @@ void pci_setup(void) > bar_reg = PCI_ROM_ADDRESS; > > bar_data = pci_readl(devfn, bar_reg); > - is_64bar = !!((bar_data & (PCI_BASE_ADDRESS_SPACE | > - PCI_BASE_ADDRESS_MEM_TYPE_MASK)) == > - (PCI_BASE_ADDRESS_SPACE_MEMORY | > - PCI_BASE_ADDRESS_MEM_TYPE_64)); > - pci_writel(devfn, bar_reg, ~0); > + if ( bar_reg != PCI_ROM_ADDRESS ) > + { > + is_64bar = !!((bar_data & (PCI_BASE_ADDRESS_SPACE | > + PCI_BASE_ADDRESS_MEM_TYPE_MASK)) == > + (PCI_BASE_ADDRESS_SPACE_MEMORY | > + PCI_BASE_ADDRESS_MEM_TYPE_64)); > + pci_writel(devfn, bar_reg, ~0); > + } > + else > + { > + is_64bar = 0; > + pci_writel(devfn, bar_reg, > + (bar_data | PCI_ROM_ADDRESS_MASK) & > + ~PCI_ROM_ADDRESS_ENABLE); > + } > bar_sz = pci_readl(devfn, bar_reg); > pci_writel(devfn, bar_reg, bar_data); > > - bar_sz &= (((bar_data & PCI_BASE_ADDRESS_SPACE) == > - PCI_BASE_ADDRESS_SPACE_MEMORY) ? > - PCI_BASE_ADDRESS_MEM_MASK : > - (PCI_BASE_ADDRESS_IO_MASK & 0xffff)); > + if ( bar_reg != PCI_ROM_ADDRESS ) > + bar_sz &= (((bar_data & PCI_BASE_ADDRESS_SPACE) == > + PCI_BASE_ADDRESS_SPACE_MEMORY) ? > + PCI_BASE_ADDRESS_MEM_MASK : > + (PCI_BASE_ADDRESS_IO_MASK & 0xffff)); > + else > + bar_sz &= PCI_ROM_ADDRESS_MASK; > if (is_64bar) { > bar_data_upper = pci_readl(devfn, bar_reg + 4); > pci_writel(devfn, bar_reg + 4, ~0); > @@ -214,8 +227,9 @@ void pci_setup(void) > bars[i].bar_reg = bar_reg; > bars[i].bar_sz = bar_sz; > > - if ( (bar_data & PCI_BASE_ADDRESS_SPACE) == > - PCI_BASE_ADDRESS_SPACE_MEMORY ) > + if ( ((bar_data & PCI_BASE_ADDRESS_SPACE) == > + PCI_BASE_ADDRESS_SPACE_MEMORY) || > + (bar_reg == PCI_ROM_ADDRESS) ) > mmio_total += bar_sz; > > nr_bars++; > _______________________________________________ > Xen-devel mailing list > Xen-devel@lists.xen.org > http://lists.xen.org/xen-devel