Most platforms map the actual drive geometry to the firmware's notion

of geometry.  However, some platforms have a more complicated mapping
of the firmware values to the actual values.  pc98 is the only
platform that currently does this.  This mapping is necessary for
large disks connected to pc98 boxes, as the firmware labels require do
special hacks to the actual geometry for interoperability.  We cannot
do this all in the geom layer because of initialization issues (geom
looks for an already initialized pc98 label, but we need the geometry
information prior to initialization, classic chicken and egg problem).
We pass the disk and the device_t to this function because the
geometry mapping depends on what kind of controller is used.

This hook allows platforms that want to override things to do so, and
has 0 overhead on all other platforms.  These patches have been in use
locally for a long time, and received good feedback from the pc98
community and sos@ at various times during their development.

MFC After: 1 week
This commit is contained in:
Warner Losh 2006-08-09 18:23:47 +00:00
parent 850590166f
commit ab649fd4d2

View File

@ -62,6 +62,14 @@ static disk_strategy_t ad_strategy;
static disk_ioctl_t ad_ioctl;
static dumper_t ad_dump;
/*
* Most platforms map firmware geom to actual, but some don't. If
* not overridden, default to nothing.
*/
#ifndef ad_firmware_geom_adjust
#define ad_firmware_geom_adjust(dev, disk)
#endif
/* local vars */
static MALLOC_DEFINE(M_AD, "ad_driver", "ATA disk driver");
@ -152,6 +160,7 @@ ad_attach(device_t dev)
adp->disk->d_unit = device_get_unit(dev);
disk_create(adp->disk, DISK_VERSION);
device_add_child(dev, "subdisk", device_get_unit(dev));
ad_firmware_geom_adjust(dev, adp->disk);
bus_generic_attach(dev);
return 0;
}