summaryrefslogtreecommitdiffstats
path: root/sys/i386
diff options
context:
space:
mode:
authorjmg <jmg@FreeBSD.org>1997-09-09 12:48:59 +0000
committerjmg <jmg@FreeBSD.org>1997-09-09 12:48:59 +0000
commit5fdad78cd7e4b3e7e86fdd394bf973f1f317ae79 (patch)
tree1955bbb0e84e90ca9bb57a953bea8b986f1d560b /sys/i386
parent6eb185adfd7463cd85500982c3adc5b295f4391f (diff)
downloadFreeBSD-src-5fdad78cd7e4b3e7e86fdd394bf973f1f317ae79.zip
FreeBSD-src-5fdad78cd7e4b3e7e86fdd394bf973f1f317ae79.tar.gz
add neccessary calls to autoconf for pnp,
also teach userconfig about the new pnp commands, for usage see pnp(4)
Diffstat (limited to 'sys/i386')
-rw-r--r--sys/i386/i386/autoconf.c11
-rw-r--r--sys/i386/i386/userconfig.c221
2 files changed, 214 insertions, 18 deletions
diff --git a/sys/i386/i386/autoconf.c b/sys/i386/i386/autoconf.c
index 94a8b54..9fbbbcf 100644
--- a/sys/i386/i386/autoconf.c
+++ b/sys/i386/i386/autoconf.c
@@ -34,7 +34,7 @@
* SUCH DAMAGE.
*
* from: @(#)autoconf.c 7.1 (Berkeley) 5/9/91
- * $Id: autoconf.c,v 1.5 1997/07/22 18:37:49 smp Exp smp $
+ * $Id: autoconf.c,v 1.74 1997/07/22 20:12:32 fsmp Exp $
*/
/*
@@ -69,6 +69,11 @@
#include <i386/isa/isa_device.h>
#endif
+#include "pnp.h"
+#if NPNP > 0
+#include <i386/isa/pnp.h>
+#endif
+
#include "eisa.h"
#if NEISA > 0
#include <i386/eisa/eisaconf.h>
@@ -203,6 +208,10 @@ configure(dummy)
pci_configure();
#endif
+#if NPNP > 0
+ pnp_configure();
+#endif
+
#if NISA > 0
isa_configure();
#endif
diff --git a/sys/i386/i386/userconfig.c b/sys/i386/i386/userconfig.c
index 7137e72..c5a4835 100644
--- a/sys/i386/i386/userconfig.c
+++ b/sys/i386/i386/userconfig.c
@@ -46,7 +46,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: userconfig.c,v 1.90 1997/08/29 14:47:31 kato Exp $
+ ** $Id: userconfig.c,v 1.91 1997/09/04 09:01:07 jkh Exp $
**/
/**
@@ -118,6 +118,11 @@
#include <machine/limits.h>
#include <i386/isa/isa_device.h>
+#include "pnp.h"
+
+#if NPNP > 0
+#include <i386/isa/pnp.h>
+#endif
#include <pci/pcivar.h>
@@ -2360,7 +2365,7 @@ visuserconfig(void)
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
- * $Id: userconfig.c,v 1.90 1997/08/29 14:47:31 kato Exp $
+ * $Id: userconfig.c,v 1.91 1997/09/04 09:01:07 jkh Exp $
*/
#include "scbus.h"
@@ -2370,6 +2375,7 @@ visuserconfig(void)
#define PARM_DEVSPEC 0x1
#define PARM_INT 0x2
#define PARM_ADDR 0x3
+#define PARM_STRING 0x4
typedef struct _cmdparm {
int type;
@@ -2418,6 +2424,11 @@ static int helpfunc(CmdParm *);
static int introfunc(CmdParm *);
#endif
+#if NPNP > 0
+static int lspnp(void);
+static int set_pnp_parms(CmdParm *);
+#endif
+
static int lineno;
#include "eisa.h"
@@ -2447,6 +2458,11 @@ static CmdParm dev_parms[] = {
{ -1, {} },
};
+static CmdParm string_arg[] = {
+ { PARM_STRING, {} },
+ { -1, {} },
+};
+
#if NEISA > 0
static CmdParm int_arg[] = {
{ PARM_INT, {} },
@@ -2472,6 +2488,9 @@ static Cmd CmdList[] = {
{ "ios", set_device_iosize, int_parms }, /* iosize dev size */
{ "ir", set_device_irq, int_parms }, /* irq dev # */
{ "l", list_devices, NULL }, /* ls, list */
+#if NPNP > 0
+ { "pn", set_pnp_parms, string_arg }, /* pnp ... */
+#endif
{ "po", set_device_ioaddr, int_parms }, /* port dev addr */
{ "res", (CmdFunc)cpu_reset, NULL }, /* reset CPU */
{ "q", quitfunc, NULL }, /* quit */
@@ -2599,6 +2618,10 @@ parse_args(char *cmd, CmdParm *parms)
++parms;
continue;
}
+ if (parms->type == PARM_STRING) {
+ parms->parm.aparm = (void *)cmd ;
+ return 0;
+ }
}
return 0;
}
@@ -2611,6 +2634,9 @@ list_devices(CmdParm *parms)
if (lsdevtab(&isa_devtab_tty[0])) return 0;
if (lsdevtab(&isa_devtab_net[0])) return 0;
if (lsdevtab(&isa_devtab_null[0])) return 0;
+#if NPNP > 0
+ if (lspnp()) return 0;
+#endif
#if NEISA > 0
printf("\nNumber of EISA slots to probe: %d\n", num_eisa_slots);
#endif /* NEISA > 0 */
@@ -2699,6 +2725,94 @@ set_device_disable(CmdParm *parms)
return 0;
}
+#if NPNP > 0
+/*
+ * this function sets the kernel table to override bios PnP
+ * configuration.
+ */
+static int
+set_pnp_parms(CmdParm *parms)
+{
+ u_long idx, val, ldn, csn;
+ int i;
+ char *q, *p=parms[0].parm.aparm;
+ struct pnp_cinfo d;
+
+ csn=strtoul(p,&q, 0);
+ ldn=strtoul(q,&q, 0);
+ for (p=q; *p && (*p==' ' || *p=='\t'); p++) ;
+ if (csn < 1 || csn > MAX_PNP_CARDS || ldn >= MAX_PNP_LDN) {
+ printf("bad csn/ldn %d:%d\n", csn, ldn);
+ return 0;
+ }
+ for (i=0; i < MAX_PNP_LDN; i++) {
+ if (pnp_ldn_overrides[i].csn == csn &&
+ pnp_ldn_overrides[i].ldn == ldn)
+ break;
+ }
+ if (i==MAX_PNP_LDN) {
+ for (i=0; i < MAX_PNP_LDN; i++) {
+ if (pnp_ldn_overrides[i].csn <1 ||
+ pnp_ldn_overrides[i].csn > MAX_PNP_CARDS)
+ break;
+ }
+ }
+ if (i==MAX_PNP_LDN) {
+ printf("sorry, no PnP entries available, try delete one\n");
+ return 0 ;
+ }
+ d = pnp_ldn_overrides[i] ;
+ d.csn = csn;
+ d.ldn = ldn ;
+ while (*p) {
+ idx = 0;
+ val = 0;
+ if (!strncmp(p,"irq",3)) {
+ idx=strtoul(p+3,&q, 0);
+ val=strtoul(q,&q, 0);
+ if (idx >=0 && idx < 2) d.irq[idx] = val;
+ } else if (!strncmp(p,"flags",5)) {
+ idx=strtoul(p+5,&q, 0);
+ d.flags = idx;
+ } else if (!strncmp(p,"drq",3)) {
+ idx=strtoul(p+3,&q, 0);
+ val=strtoul(q,&q, 0);
+ if (idx >=0 && idx < 2) d.drq[idx] = val;
+ } else if (!strncmp(p,"port",4)) {
+ idx=strtoul(p+4,&q, 0);
+ val=strtoul(q,&q, 0);
+ if (idx >=0 && idx < 8) d.port[idx] = val;
+ } else if (!strncmp(p,"mem",3)) {
+ idx=strtoul(p+3,&q, 0);
+ val=strtoul(q,&q, 0);
+ if (idx >=0 && idx < 4) d.mem[idx].base = val;
+ } else if (!strncmp(p,"bios",4)) {
+ q = p+ 4;
+ d.override = 0 ;
+ } else if (!strncmp(p,"os",2)) {
+ q = p+2 ;
+ d.override = 1 ;
+ } else if (!strncmp(p,"disable",7)) {
+ q = p+7 ;
+ d.enable = 0 ;
+ } else if (!strncmp(p,"enable",6)) {
+ q = p+6;
+ d.enable = 1 ;
+ } else if (!strncmp(p,"delete",6)) {
+ bzero(&pnp_ldn_overrides[i], sizeof (pnp_ldn_overrides[i]));
+ if (i==0) pnp_ldn_overrides[i].csn = 255;/* not reinit */
+ return 0;
+ } else {
+ printf("unknown command <%s>\n", p);
+ break;
+ }
+ for (p=q; *p && (*p==' ' || *p=='\t'); p++) ;
+ }
+ pnp_ldn_overrides[i] = d ;
+ return 0;
+}
+#endif /* NPNP */
+
#if NEISA > 0
static int
set_num_eisa_slots(CmdParm *parms)
@@ -2720,27 +2834,39 @@ quitfunc(CmdParm *parms)
static int
helpfunc(CmdParm *parms)
{
- printf("Command\t\t\tDescription\n");
- printf("-------\t\t\t-----------\n");
- printf("ls\t\t\tList currently configured devices\n");
- printf("port <devname> <addr>\tSet device port (i/o address)\n");
- printf("irq <devname> <number>\tSet device irq\n");
- printf("drq <devname> <number>\tSet device drq\n");
- printf("iomem <devname> <addr>\tSet device maddr (memory address)\n");
- printf("iosize <devname> <size>\tSet device memory size\n");
- printf("flags <devname> <mask>\tSet device flags\n");
- printf("enable <devname>\tEnable device\n");
- printf("disable <devname>\tDisable device (will not be probed)\n");
+ printf(
+ "Command\t\t\tDescription\n"
+ "-------\t\t\t-----------\n"
+ "ls\t\t\tList currently configured devices\n"
+ "port <devname> <addr>\tSet device port (i/o address)\n"
+ "irq <devname> <number>\tSet device irq\n"
+ "drq <devname> <number>\tSet device drq\n"
+ "iomem <devname> <addr>\tSet device maddr (memory address)\n"
+ "iosize <devname> <size>\tSet device memory size\n"
+ "flags <devname> <mask>\tSet device flags\n"
+ "enable <devname>\tEnable device\n"
+ "disable <devname>\tDisable device (will not be probed)\n");
+#if NPNP > 0
+ printf(
+ "pnp <csn> <ldn> [enable|disable]\tenable/disable device\n"
+ "pnp <csn> <ldn> [os|bios]\tset parameters using FreeBSD or BIOS\n"
+ "pnp <csn> <ldn> [portX <addr>]\tset addr for port X (0..7)\n"
+ "pnp <csn> <ldn> [memX <maddr>]\tset addr for memory range X (0..3)\n"
+ "pnp <csn> <ldn> [irq <number>]\tset irq X (0..1) to number, 0=unused\n"
+ "pnp <csn> <ldn> [drq <number>]\tset drq X (0..1) to number, 4=unused\n");
+#endif
#if NEISA > 0
printf("eisa <number>\t\tSet the number of EISA slots to probe\n");
#endif /* NEISA > 0 */
- printf("quit\t\t\tExit this configuration utility\n");
- printf("reset\t\t\tReset CPU\n");
+ printf(
+ "quit\t\t\tExit this configuration utility\n"
+ "reset\t\t\tReset CPU\n");
#ifdef VISUAL_USERCONFIG
printf("visual\t\t\tGo to fullscreen mode.\n");
#endif
- printf("help\t\t\tThis message\n\n");
- printf("Commands may be abbreviated to a unique prefix\n");
+ printf(
+ "help\t\t\tThis message\n\n"
+ "Commands may be abbreviated to a unique prefix\n");
return 0;
}
@@ -2889,6 +3015,67 @@ introfunc(CmdParm *parms)
}
#endif
+#if NPNP > 0
+static int
+lspnp ()
+{
+ struct pnp_cinfo *c;
+ int i, first = 1;
+
+
+ for (i=0; i< MAX_PNP_LDN; i++) {
+ c = &pnp_ldn_overrides[i];
+ if (c->csn >0 && c->csn != 255) {
+ int j, pmax, mmax;
+ static char pfmt[] =
+ "port 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x 0x%x ";
+ static char mfmt[] =
+ "mem 0x%x 0x%x 0x%x 0x%x";
+ char buf[256];
+ if (lineno >= 23) {
+ printf("<More> ");
+ if (getchar() == 'q') {
+ printf("quit\n");
+ return (1);
+ }
+ printf("\n");
+ lineno = 0;
+ }
+ if (lineno == 0 || first)
+ printf("CSN LDN conf en irqs drqs others (PnP devices)\n");
+ first = 0 ;
+ printf("%3d %3d %4s %2s %2d %-2d %2d %-2d ",
+ c->csn, c->ldn,
+ c->override ? "OS ":"BIOS",
+ c->enable ? "Y":"N",
+ c->irq[0], c->irq[1], c->drq[0], c->drq[1]);
+ if (c->flags)
+ printf("flags 0x%08x ",c->flags);
+ for (pmax = 7; pmax >=0 ; pmax--)
+ if (c->port[pmax]!=0) break;
+ for (mmax = 3; mmax >=0 ; mmax--)
+ if (c->mem[mmax].base!=0) break;
+ if (pmax>=0) {
+ strcpy(buf, pfmt);
+ buf[10 + 5*pmax]='\0';
+ printf(buf,
+ c->port[0], c->port[1], c->port[2], c->port[3],
+ c->port[4], c->port[5], c->port[6], c->port[7]);
+ }
+ if (mmax>=0) {
+ strcpy(buf, mfmt);
+ buf[8 + 5*mmax]='\0';
+ printf(buf,
+ c->mem[0].base, c->mem[1].base,
+ c->mem[2].base, c->mem[3].base);
+ }
+ printf("\n");
+ }
+ }
+ return 0 ;
+}
+#endif /* NPNP */
+
static int
lsdevtab(struct isa_device *dt)
{
OpenPOWER on IntegriCloud