[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH] hvmloader: don't treat ROM BAR like other BARs



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 <jbeulich@xxxxxxxx>

Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@xxxxxxxxxx>
> 
> --- 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 <jbeulich@xxxxxxxx>
> 
> --- 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@xxxxxxxxxxxxx
> http://lists.xen.org/xen-devel


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.