diff --git a/sys/conf/files.sparc64 b/sys/conf/files.sparc64 index 3a0f6f03f04d..00b7c45f972e 100644 --- a/sys/conf/files.sparc64 +++ b/sys/conf/files.sparc64 @@ -88,6 +88,7 @@ sparc64/pci/psycho.c optional pci sparc64/sbus/dma_sbus.c optional sbus sparc64/sbus/sbus.c optional sbus sparc64/sbus/lsi64854.c optional sbus +sparc64/sparc64/ata_machdep.c optional atadisk sparc64/sparc64/autoconf.c standard sparc64/sparc64/bus_machdep.c standard sparc64/sparc64/cache.c standard diff --git a/sys/sparc64/include/md_var.h b/sys/sparc64/include/md_var.h index 34a3437ac06a..69c6d698c5fb 100644 --- a/sys/sparc64/include/md_var.h +++ b/sys/sparc64/include/md_var.h @@ -60,4 +60,17 @@ cpu_block_zero_t spitfire_block_zero; extern cpu_block_copy_t *cpu_block_copy; extern cpu_block_zero_t *cpu_block_zero; +/* + * Given that the Sun disk label only uses 16-bit fields for cylinders, + * heads and sectors we might need to adjust the geometry of large IDE + * disks. + * We have to have a knowledge that a device_t is a struct device * here + * to avoid including too many things from this file. + */ +struct disk; +struct device; +void sparc64_ad_firmware_geom_adjust(struct device *dev, struct disk *disk); +#define ad_firmware_geom_adjust(dev, dsk) \ + sparc64_ad_firmware_geom_adjust(dev, dsk) + #endif /* !_MACHINE_MD_VAR_H_ */ diff --git a/sys/sparc64/sparc64/ata_machdep.c b/sys/sparc64/sparc64/ata_machdep.c new file mode 100644 index 000000000000..20729bbaa20d --- /dev/null +++ b/sys/sparc64/sparc64/ata_machdep.c @@ -0,0 +1,52 @@ +/*- + * Copyright (c) 2008 Marius Strobl + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +__FBSDID("$FreeBSD$"); + +#include +#include +#include + +void +sparc64_ad_firmware_geom_adjust(device_t dev, struct disk *disk) +{ + + /* + * The Sun disk label only uses 16-bit fields for cylinders, + * heads and sectors so the geometry of large IDE disks has + * to be adjusted. If the disk is > 32GB at 16 heads and 63 + * sectors, the sectors have to be adjusted to 255. If the + * the disk is even > 128GB, additionally adjust the heads + * to 255. + * XXX the OpenSolaris dad(7D) driver limits the mediasize + * to 128GB. + */ + if (disk->d_mediasize > (off_t)65535 * 16 * 63 * disk->d_sectorsize) + disk->d_fwsectors = 255; + if (disk->d_mediasize > (off_t)65535 * 16 * 255 * disk->d_sectorsize) + disk->d_fwheads = 255; +}