Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 18 Sep 1997 00:41:48 +0000 (GMT)
From:      Terry Lambert <tlambert@primenet.com>
To:        hackers@freebsd.org
Subject:   INB question
Message-ID:  <199709180041.RAA21191@usr04.primenet.com>

next in thread | raw e-mail | index | archive | help
If a device doesn't exist, what does inb return?  0xff, right?

Specifically, how do I know if something lives at a given port?

I want to do the following:

#include <fcntl.h>
#include <machine/cpufunc.h>

/*
 * MCA DMA
 */
#define IO_MCA_A_DXFR   0x18    /* DMA Extended Function Register (address)*/
#define IO_MCA_I_DXFR   0x1A    /* DMA Extended Function Register (I/O)*/

/*
 * High Nibble commands; low nibble specifies which channel, 0-7
 */
#define MCA_DXFR_IOAR   0x00    /* I/O Address Register*/
#define MCA_DXFR_BCAW   0x20    /* Base and Current Address Write*/
#define MCA_DXFR_BAR    0x30    /* Base Address Read*/
#define MCA_DXFR_BCCW   0x40    /* Base and Current Count Write*/
#define MCA_DXFR_BCR    0x50    /* Base Count Read*/
#define MCA_DXFR_SRR    0x60    /* Status Register Read*/
#define MCA_DXFR_EMR    0x70    /* Extended Mode Register*/
#define MCA_DXFR_MRDC   0x90    /* Mask Register Disable Channel*/
#define MCA_DXFR_MREC   0xA0    /* Mask Register Ensable Channel*/
#define MCA_DXFR_MD     0xD0    /* Master Disable*/

/*
 * Channel specific commands
 */
#define MCA_DXFR_AL0    0x80    /* Arbitration Level -- Channel 0*/
#define MCA_DXFR_AL4    0x84    /* Arbitration Level -- Channel 4*/

/*
 * Return 1 if MCA bus exists, 0 otherwise
 *
 * Note:	Can't call INT 0x15, AH=0xC0 and use ptr to offset 5,
 *		bit 1 for MCA detect from protected mode.  Instead,
 *		read DMA Extended Function Register's Extended Mode
 *		register and make sure bit 7 is 0 by assuming an
 *		inb on an invalid I/O port will return 0xff.
 */
int
mca_detect()
{
	int	rv;

	outb( IO_MCA_A_DXFR, (MCA_DXFR_EMR | 0x0));
        inb( 0x84);     /* delay; this is bogus excpt on EISA, and
			 * it's not needed on EISA because it sync's
			 * I/O like ISA should have... should use
			 * outb to port 0x80 (POST code register)
			 * instead...
			 */
        rv = inb( IO_MCA_I_DXFR);

	return( ( rv & 0x80) ? 0 : 1);
}


					Terry Lambert
					terry@lambert.org
---
Any opinions in this posting are my own and not those of my present
or previous employers.



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