Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 19 Oct 2008 08:37:58 +0000 (UTC)
From:      Takahashi Yoshihiro <nyan@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-user@freebsd.org
Subject:   svn commit: r184050 - user/nyan/pc98/sys/pc98/pc98
Message-ID:  <200810190837.m9J8bwb7038241@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: nyan
Date: Sun Oct 19 08:37:58 2008
New Revision: 184050
URL: http://svn.freebsd.org/changeset/base/184050

Log:
  Add the machdep.ad_geom_method tunable to select the method of the IDE HDD
  geometry conversion.
  
  Submitted by:	kato

Modified:
  user/nyan/pc98/sys/pc98/pc98/pc98_machdep.c
  user/nyan/pc98/sys/pc98/pc98/pc98_machdep.h

Modified: user/nyan/pc98/sys/pc98/pc98/pc98_machdep.c
==============================================================================
--- user/nyan/pc98/sys/pc98/pc98/pc98_machdep.c	Sun Oct 19 08:37:51 2008	(r184049)
+++ user/nyan/pc98/sys/pc98/pc98/pc98_machdep.c	Sun Oct 19 08:37:58 2008	(r184050)
@@ -36,15 +36,23 @@
 #include <sys/param.h>
 #include <sys/systm.h>
 
-#include <cam/cam.h>
-#include <cam/cam_ccb.h>
 #include <sys/bio.h>
 #include <sys/bus.h>
 #include <sys/conf.h>
+#include <sys/kernel.h>
+#include <sys/sysctl.h>
+#include <cam/cam.h>
+#include <cam/cam_ccb.h>
 #include <geom/geom_disk.h>
 #include <machine/md_var.h>
 #include <pc98/pc98/pc98_machdep.h>
 
+static	int	ad_geom_method = AD_GEOM_ADJUST_COMPATIDE;
+
+TUNABLE_INT("machdep.ad_geom_method", &ad_geom_method);
+SYSCTL_INT(_machdep, OID_AUTO, ad_geom_method, CTLFLAG_RW, &ad_geom_method, 0,
+    "IDE disk geometry conversion method");
+
 /*
  * Initialize DMA controller
  */
@@ -198,12 +206,62 @@ scsi_da_bios_params(struct ccb_calc_geom
 }
 
 /*
- * Get the geometry of the ATA HDD from the BIOS work area.
- *
- * XXX for now, we hack it
+ * Adjust the geometry of the IDE HDD.
  */
-void
-pc98_ad_firmware_geom_adjust(device_t dev, struct disk *disk)
+
+/* IDE BIOS compatible mode. */
+static	void
+pc98_ad_geom_adjust_idebios(struct disk *disk)
+{
+
+	if (disk->d_mediasize < MEDIASIZE_4_3G) {
+		disk->d_fwsectors = 17;
+		disk->d_fwheads = 8;
+	} else if (disk->d_mediasize < MEDIASIZE_29_5G) {
+		disk->d_fwsectors = 63;
+		if (disk->d_fwheads != 15)	/* Allow 15H63S. */
+			disk->d_fwheads = 16;
+	} else if (disk->d_mediasize < MEDIASIZE_31_5G) {
+		disk->d_fwsectors = 63;
+		disk->d_fwheads = 16;
+	} else if (disk->d_mediasize < MEDIASIZE_127G) {
+		disk->d_fwsectors = 255;
+		disk->d_fwheads = 16;
+	} else {
+		/* XXX */
+		disk->d_fwsectors = 255;
+		disk->d_fwheads = 255;
+	}
+}
+
+/* SCSI BIOS compatible mode. */
+static	void
+pc98_ad_geom_adjust_scsibios(struct disk *disk)
+{
+
+	if (disk->d_mediasize < MEDIASIZE_8G) {
+		disk->d_fwsectors = 32;
+		disk->d_fwheads = 8;
+	} else if (disk->d_mediasize < MEDIASIZE_32G) {
+		disk->d_fwsectors = 128;
+		disk->d_fwheads = 8;
+	} else if (disk->d_mediasize < MEDIASIZE_60G) {
+		/* Compatible with IFC-USP 1.2. */
+		disk->d_fwsectors = 128;
+		disk->d_fwheads = 15;
+	} else if (disk->d_mediasize < MEDIASIZE_120G) {
+		disk->d_fwsectors = 255;
+		disk->d_fwheads = 15;
+	} else {
+		/* XXX */
+		disk->d_fwsectors = 255;
+		disk->d_fwheads = 255;
+	}
+}
+
+/* Compatible with the revision 1.28. */
+static	void
+pc98_ad_geom_adjust_cyl16bit(struct disk *disk)
 {
 	off_t totsec = disk->d_mediasize / disk->d_sectorsize;
 	off_t cyl = totsec / disk->d_fwsectors / disk->d_fwheads;
@@ -229,3 +287,35 @@ pc98_ad_firmware_geom_adjust(device_t de
 		}
 	}
 }
+
+void
+pc98_ad_firmware_geom_adjust(device_t dev, struct disk *disk)
+{
+	u_int	oldsectors, oldheads;
+
+	oldsectors = disk->d_fwsectors;
+	oldheads = disk->d_fwheads;
+
+	switch (ad_geom_method) {
+	case AD_GEOM_ADJUST_COMPATIDE:
+		pc98_ad_geom_adjust_idebios(disk);
+		break;
+	case AD_GEOM_ADJUST_COMPATSCSI:
+		pc98_ad_geom_adjust_scsibios(disk);
+		break;
+	case AD_GEOM_ADJUST_COMPATCYL16:
+		pc98_ad_geom_adjust_cyl16bit(disk);
+		break;
+	default:
+		/* Do nothing. */
+		break;
+	}
+
+	if (bootverbose &&
+	    (oldsectors != disk->d_fwsectors || oldheads != disk->d_fwheads))
+		device_printf(dev,
+		    "geometry adjusted from [%dH/%dS] to [%dH/%dS]\n",
+		    oldheads, oldsectors,
+		    disk->d_fwheads, disk->d_fwsectors);
+
+}

Modified: user/nyan/pc98/sys/pc98/pc98/pc98_machdep.h
==============================================================================
--- user/nyan/pc98/sys/pc98/pc98/pc98_machdep.h	Sun Oct 19 08:37:51 2008	(r184049)
+++ user/nyan/pc98/sys/pc98/pc98/pc98_machdep.h	Sun Oct 19 08:37:58 2008	(r184050)
@@ -85,6 +85,21 @@ extern unsigned char	pc98_system_paramet
 #define EPSON_PC486_SR		0x38
 #define EPSON_PC486_HA		0x3b
 
+/* IDE HDD geometry conversion. */
+#define	AD_GEOM_ADJUST_NONE		0	/* Do nothing. */
+#define	AD_GEOM_ADJUST_COMPATIDE	1	/* PC-98 IDE BIOS. */
+#define	AD_GEOM_ADJUST_COMPATSCSI	2	/* PC-98 SCSI. */
+#define	AD_GEOM_ADJUST_COMPATCYL16	100	/* Compat Rev. 1.28. */
+
+#define	MEDIASIZE_4_3G		(4351LL * 1024LL * 1024LL)      /* 4351M */
+#define	MEDIASIZE_8G		(8192LL * 1024LL * 1024LL)      /* 8192M */
+#define	MEDIASIZE_29_5G		(30239LL * 1024LL * 1024LL)	/* 30239M */
+#define	MEDIASIZE_31_5G		(32255LL * 1024 * 1024)         /* 32255M */
+#define	MEDIASIZE_32G		(32768LL * 1024LL * 1024LL)     /* 32768M */
+#define	MEDIASIZE_60G		(61440LL * 1024LL * 1024LL)     /* 61440M */
+#define	MEDIASIZE_120G		(122400LL * 1024LL * 1024LL)    /* 122400M */
+#define	MEDIASIZE_127G		(130558LL * 1024LL * 1024LL)    /* 130558M */
+
 #endif /* _KERNEL */
 
 #endif /* __PC98_PC98_PC98_MACHDEP_H__ */



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