cam_machdep.c revision 228022
1/*- 2 * Copyright (c) 2011 Marius Strobl <marius@FreeBSD.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 */ 26 27#include <sys/cdefs.h> 28__FBSDID("$FreeBSD: head/sys/sparc64/sparc64/cam_machdep.c 228022 2011-11-27 15:43:40Z marius $"); 29 30#include <sys/param.h> 31#include <sys/systm.h> 32 33#include <cam/cam.h> 34#include <cam/cam_ccb.h> 35 36#include <machine/md_var.h> 37 38int 39scsi_da_bios_params(struct ccb_calc_geometry *ccg) 40{ 41 uint32_t secs_per_cylinder, size_mb; 42 43 /* 44 * The VTOC8 disk label only uses 16-bit fields for cylinders, heads 45 * and sectors so the geometry of large disks has to be adjusted. 46 * We generally use the sizing used by cam_calc_geometry(9), except 47 * when it would overflow the cylinders, in which case we use 255 48 * heads and sectors. This allows disks up to the 2TB limit of the 49 * extended VTOC8. 50 * XXX this doesn't match the sizing used by OpenSolaris, as that 51 * would exceed the 8-bit ccg->heads and ccg->secs_per_track. 52 */ 53 if (ccg->block_size == 0) 54 return (0); 55 size_mb = (1024L * 1024L) / ccg->block_size; 56 if (size_mb == 0) 57 return (0); 58 size_mb = ccg->volume_size / size_mb; 59 if (ccg->volume_size > (uint64_t)65535 * 255 * 63) { 60 ccg->heads = 255; 61 ccg->secs_per_track = 255; 62 } else if (size_mb > 1024) { 63 ccg->heads = 255; 64 ccg->secs_per_track = 63; 65 } else { 66 ccg->heads = 64; 67 ccg->secs_per_track = 32; 68 } 69 secs_per_cylinder = ccg->heads * ccg->secs_per_track; 70 if (secs_per_cylinder == 0) 71 return (0); 72 ccg->cylinders = ccg->volume_size / secs_per_cylinder; 73 return (1); 74} 75