From owner-freebsd-hackers Wed Sep 17 17:41:55 1997 Return-Path: Received: (from root@localhost) by hub.freebsd.org (8.8.7/8.8.7) id RAA22863 for hackers-outgoing; Wed, 17 Sep 1997 17:41:55 -0700 (PDT) Received: from usr04.primenet.com (tlambert@usr04.primenet.com [206.165.6.204]) by hub.freebsd.org (8.8.7/8.8.7) with ESMTP id RAA22856 for ; Wed, 17 Sep 1997 17:41:53 -0700 (PDT) Received: (from tlambert@localhost) by usr04.primenet.com (8.8.5/8.8.5) id RAA21191 for hackers@freebsd.org; Wed, 17 Sep 1997 17:41:48 -0700 (MST) From: Terry Lambert Message-Id: <199709180041.RAA21191@usr04.primenet.com> Subject: INB question To: hackers@freebsd.org Date: Thu, 18 Sep 1997 00:41:48 +0000 (GMT) X-Mailer: ELM [version 2.4 PL23] Content-Type: text Sender: owner-freebsd-hackers@freebsd.org X-Loop: FreeBSD.org Precedence: bulk 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 #include /* * 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.