@@ -52,8 +52,9 @@ static void pci_command_bar(struct pci_dev *dev)
5252 bool enable_mem =
5353 PCI_HDR_READ (dev -> hdr , PCI_COMMAND , 16 ) & PCI_COMMAND_MEMORY ;
5454 for (int i = 0 ; i < PCI_STD_NUM_BARS ; i ++ ) {
55- struct bus * bus = dev -> bar_is_io_space [i ] ? dev -> io_bus : dev -> mmio_bus ;
56- bool enable = dev -> bar_is_io_space [i ] ? enable_io : enable_mem ;
55+ bool is_io = dev -> bar_layout [i ] & PCI_BASE_ADDRESS_SPACE_IO ;
56+ struct bus * bus = is_io ? dev -> io_bus : dev -> mmio_bus ;
57+ bool enable = is_io ? enable_io : enable_mem ;
5758
5859 if (enable )
5960 pci_activate_bar (dev , i , bus );
@@ -71,9 +72,9 @@ static void pci_config_bar(struct pci_dev *dev, uint8_t bar)
7172{
7273 uint32_t mask = ~(dev -> bar_size [bar ] - 1 );
7374 uint32_t old_bar = PCI_HDR_READ (dev -> hdr , PCI_BAR_OFFSET (bar ), 32 );
74- uint32_t new_bar = (old_bar & mask ) | dev -> bar_is_io_space [bar ];
75+ uint32_t new_bar = (old_bar & mask ) | ( dev -> bar_layout [bar ] & ~ mask ) ;
7576 PCI_HDR_WRITE (dev -> hdr , PCI_BAR_OFFSET (bar ), new_bar , 32 );
76- dev -> space_dev [bar ].base = new_bar ;
77+ dev -> space_dev [bar ].base = new_bar & mask ;
7778}
7879
7980static void pci_config_write (struct pci_dev * dev ,
@@ -145,14 +146,17 @@ static void pci_mmio_io(void *owner,
145146void pci_set_bar (struct pci_dev * dev ,
146147 uint8_t bar ,
147148 uint32_t bar_size ,
148- bool is_io_space ,
149+ uint32_t layout ,
149150 dev_io_fn do_io )
150151{
151- /* TODO: mem type, prefetch */
152- /* FIXME: bar_size must be power of 2 */
153- PCI_HDR_WRITE (dev -> hdr , PCI_BAR_OFFSET (bar ), is_io_space , 32 );
152+ /*
153+ * FIXME: bar_size must be a power of two.
154+ * TODO: 64-bit BARs need a second adjacent slot for the upper dword;
155+ * only 32-bit memory and I/O BARs are wired up here.
156+ */
157+ PCI_HDR_WRITE (dev -> hdr , PCI_BAR_OFFSET (bar ), layout , 32 );
154158 dev -> bar_size [bar ] = bar_size ;
155- dev -> bar_is_io_space [bar ] = is_io_space ;
159+ dev -> bar_layout [bar ] = layout ;
156160 dev_init (& dev -> space_dev [bar ], 0 , bar_size , dev , do_io );
157161}
158162
0 commit comments