Add consistency check to the functions that map port or memory ranges:

Return failure, if the enable bit corresponding to the map type has not
been set in the command register. This feature was requested by Justin
Gibbs, who pointed out that some early PCI to PCI bridges do not correctly
support memory windows (I assume because of the risk of deadlocks that
have been taken care of in the PCI 2.2 spec) and that some BIOS clears
the memory address decode enable bit in the command register of the PCI
device, if it finds them behind such a bridge.
This commit is contained in:
Stefan Eßer 1997-05-28 10:10:02 +00:00
parent a9ad937362
commit 8ae85778a3
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=26231

View File

@ -23,7 +23,7 @@
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* $Id$
* $Id: pci_compat.c,v 1.1 1997/05/26 15:08:35 se Exp $
*
*/
@ -70,13 +70,26 @@ pci_mapno(pcicfgregs *cfg, int reg)
return (map);
}
static int
pci_porten(pcicfgregs *cfg)
{
return ((cfg->cmdreg & PCIM_CMD_PORTEN) != 0);
}
static int
pci_isportmap(pcicfgregs *cfg, int map)
{
return ((unsigned)map < cfg->nummaps
&& (cfg->map[map].type & PCI_MAPPORT) != 0);
}
static int
pci_memen(pcicfgregs *cfg)
{
return ((cfg->cmdreg & PCIM_CMD_MEMEN) != 0);
}
static int
pci_ismemmap(pcicfgregs *cfg, int map)
{
@ -103,7 +116,7 @@ int pci_map_port(pcici_t cfg, u_long reg, u_short* pa)
int map;
map = pci_mapno(cfg, reg);
if (pci_isportmap(cfg, map)) {
if (pci_porten(cfg) && pci_isportmap(cfg, map)) {
u_int32_t iobase;
u_int32_t iosize;
@ -126,7 +139,7 @@ int pci_map_mem(pcici_t cfg, u_long reg, vm_offset_t* va, vm_offset_t* pa)
int map;
map = pci_mapno(cfg, reg);
if (pci_ismemmap(cfg, map)) {
if (pci_memen(cfg) && pci_ismemmap(cfg, map)) {
u_int32_t paddr;
u_int32_t psize;