summaryrefslogtreecommitdiffstats
path: root/sys/i386/bios
diff options
context:
space:
mode:
Diffstat (limited to 'sys/i386/bios')
-rw-r--r--sys/i386/bios/smapi.c21
-rw-r--r--sys/i386/bios/smapi_bios.S17
-rw-r--r--sys/i386/bios/smapi_isa.c65
3 files changed, 48 insertions, 55 deletions
diff --git a/sys/i386/bios/smapi.c b/sys/i386/bios/smapi.c
index e2e96ad..038a076 100644
--- a/sys/i386/bios/smapi.c
+++ b/sys/i386/bios/smapi.c
@@ -117,9 +117,14 @@ smapi_ioctl (dev, cmd, data, fflag, td)
error = 0;
break;
case SMAPIOCGFUNCTION:
+#if 1
smapi32_segment = SMAPI32_SEGMENT;
smapi32_offset = sc->smapi32_entry;
- error = smapi32((struct smapi_bios_parameter *)data,
+ error = smapi32(
+#else
+ error = smapi32_new(sc->smapi32_entry, SMAPI32_SEGMENT,
+#endif
+ (struct smapi_bios_parameter *)data,
(struct smapi_bios_parameter *)data);
break;
default:
@@ -133,9 +138,6 @@ fail:
int
smapi_attach (struct smapi_softc *sc)
{
- struct smapi_bios_parameter input_param;
- struct smapi_bios_parameter output_param;
- int retval;
sc->cdev = make_dev(&smapi_cdevsw,
device_get_unit(sc->dev),
@@ -144,17 +146,6 @@ smapi_attach (struct smapi_softc *sc)
smapi_cdevsw.d_name,
device_get_unit(sc->dev));
- bzero(&input_param, sizeof(struct smapi_bios_parameter));
- bzero(&output_param, sizeof(struct smapi_bios_parameter));
- smapi32_segment = SMAPI32_SEGMENT;
- smapi32_offset = sc->smapi32_entry;
- retval = smapi32(&output_param, &output_param);
-
-#if 0
- retval = smapi32_new(sc->smapi32_entry, SMAPI32_SEGMENT,
- &output_param, &output_param);
-#endif
-
return (0);
}
diff --git a/sys/i386/bios/smapi_bios.S b/sys/i386/bios/smapi_bios.S
index 2ada5c6..010d9cd 100644
--- a/sys/i386/bios/smapi_bios.S
+++ b/sys/i386/bios/smapi_bios.S
@@ -2,9 +2,6 @@
#include <machine/asmacros.h>
- .data
-smapi32_segment_tmp: .word 0
-smapi32_offset_tmp: .long 0
.text
/*
* smapi32(input_param, output_param)
@@ -36,10 +33,12 @@ ENTRY(smapi32)
*/
ENTRY(smapi32_new)
pushl %ebp /* Save frame */
- movl 0x08(%esp),%ebp
- movl %ebp,smapi32_offset_tmp
- movw 0x0c(%esp),%bp
- movw %bp,smapi32_segment_tmp
+ movl %esp,%ebp
+
+ movl 0x08(%ebp),%eax
+ movl %eax,smapi32_offset
+ movw 0x0c(%ebp),%ax
+ movw %ax,smapi32_segment
pushl %ds
pushl 0x20(%ebp) /* Output Param */
@@ -47,8 +46,8 @@ ENTRY(smapi32_new)
pushl 0x10(%ebp) /* Input Param */
movl $0,%eax
- movw %cs,smapi32_segment_tmp
- lcall *(smapi32_offset_tmp)
+ movw %cs,smapi32_segment
+ lcall *(smapi32_offset)
leave
ret
diff --git a/sys/i386/bios/smapi_isa.c b/sys/i386/bios/smapi_isa.c
index bd6bfd3..da96864 100644
--- a/sys/i386/bios/smapi_isa.c
+++ b/sys/i386/bios/smapi_isa.c
@@ -38,9 +38,6 @@
#include <machine/resource.h>
#include <sys/rman.h>
-#include <isa/isavar.h>
-#include <isa/pnpvar.h>
-
/* And all this for BIOS_PADDRTOVADDR() */
#include <vm/vm.h>
#include <vm/pmap.h>
@@ -58,13 +55,6 @@ static int smapi_modevent (module_t, int, void *);
static int smapi_header_cksum (struct smapi_bios_header *);
-#define SMAPI_ID 0x0000a24d
-
-static struct isa_pnp_id smapi_ids[] = {
- { SMAPI_ID, NULL }, /* SMB0000 */
- { 0, NULL },
-};
-
#define SMAPI_START 0xf0000
#define SMAPI_END 0xffff0
#define SMAPI_STEP 0x10
@@ -73,23 +63,21 @@ static struct isa_pnp_id smapi_ids[] = {
(h->signature[1] == 'S') && \
(h->signature[2] == 'M') && \
(h->signature[3] == 'B'))
+#define RES2HEADER(res) ((struct smapi_bios_header *)rman_get_virtual(res))
static void
smapi_isa_identify (driver_t *driver, device_t parent)
{
device_t child;
struct resource *res;
- struct smapi_bios_header *header;
u_int32_t chunk;
int rid;
rid = 0;
chunk = SMAPI_START;
- child = BUS_ADD_CHILD(parent, ISA_ORDER_SENSITIVE, "smapi", -1);
+ child = BUS_ADD_CHILD(parent, 0, "smapi", -1);
device_set_driver(child, driver);
- isa_set_logicalid(child, SMAPI_ID);
- isa_set_vendorid(child, SMAPI_ID);
while (chunk < SMAPI_END) {
bus_set_resource(child, SYS_RES_MEMORY, rid, chunk,
@@ -101,14 +89,9 @@ smapi_isa_identify (driver_t *driver, device_t parent)
chunk += SMAPI_STEP;
continue;
}
- header = (struct smapi_bios_header *)rman_get_virtual(res);
- if (SMAPI_SIGNATURE(header)) {
- if (smapi_header_cksum(header)) {
- device_printf(child, "SMAPI header checksum failed.\n");
- } else {
+ if (SMAPI_SIGNATURE(RES2HEADER(res))) {
goto found;
- }
} else {
bus_release_resource(child, SYS_RES_MEMORY, rid, res);
bus_delete_resource(child, SYS_RES_MEMORY, rid);
@@ -121,6 +104,7 @@ smapi_isa_identify (driver_t *driver, device_t parent)
return;
found:
+ bus_release_resource(child, SYS_RES_MEMORY, rid, res);
device_set_desc(child, "SMAPI BIOS");
return;
}
@@ -128,7 +112,30 @@ found:
static int
smapi_isa_probe (device_t dev)
{
- return (ISA_PNP_PROBE(device_get_parent(dev), dev, smapi_ids));
+ struct resource *res;
+ int rid;
+ int error;
+
+ error = 0;
+ rid = 0;
+ res = bus_alloc_resource(dev, SYS_RES_MEMORY, &rid,
+ 0ul, ~0ul, 1, RF_ACTIVE);
+ if (res == NULL) {
+ device_printf(dev, "Unable to allocate memory resource.\n");
+ error = ENOMEM;
+ goto bad;
+ }
+
+ if (smapi_header_cksum(RES2HEADER(res))) {
+ device_printf(dev, "SMAPI header checksum failed.\n");
+ error = ENXIO;
+ goto bad;
+ }
+
+bad:
+ if (res)
+ bus_release_resource(dev, SYS_RES_MEMORY, rid, res);
+ return (error);
}
static int
@@ -154,21 +161,17 @@ smapi_isa_attach (device_t dev)
sc->header->prot32_segment +
sc->header->prot32_offset);
- if (smapi_header_cksum(sc->header)) {
- device_printf(dev, "SMAPI header checksum failed.\n");
- error = ENXIO;
- goto bad;
- }
-
if (smapi_attach(sc)) {
device_printf(dev, "SMAPI attach failed.\n");
error = ENXIO;
goto bad;
}
- device_printf(dev, "Version %02d.%02d, Length %d, Checksum 0x%02x\n",
- sc->header->version_major, sc->header->version_minor,
- sc->header->length, sc->header->checksum);
+ device_printf(dev, "Version %d.%02d, Length %d, Checksum 0x%02x\n",
+ bcd2bin(sc->header->version_major),
+ bcd2bin(sc->header->version_minor),
+ sc->header->length,
+ sc->header->checksum);
device_printf(dev, "Information=0x%b\n",
sc->header->information,
"\020"
@@ -254,7 +257,7 @@ static driver_t smapi_driver = {
sizeof(struct smapi_softc),
};
-DRIVER_MODULE(smapi, isa, smapi_driver, smapi_devclass, smapi_modevent, 0);
+DRIVER_MODULE(smapi, legacy, smapi_driver, smapi_devclass, smapi_modevent, 0);
MODULE_VERSION(smapi, 1);
static int
OpenPOWER on IntegriCloud