From nobody Sat May 10 15:07:38 2025 Delivered-To: importer@patchew.org Received-SPF: none (zoho.com: 80.81.252.135 is neither permitted nor denied by domain of seabios.org) client-ip=80.81.252.135; envelope-from=seabios-bounces@seabios.org; helo=mail.coreboot.org; Authentication-Results: mx.zoho.com; dkim=fail spf=none (zoho.com: 80.81.252.135 is neither permitted nor denied by domain of seabios.org) smtp.mailfrom=seabios-bounces@seabios.org; Return-Path: Received: from mail.coreboot.org (mail.coreboot.org [80.81.252.135]) by mx.zohomail.com with SMTPS id 1493216347836244.7431240728987; Wed, 26 Apr 2017 07:19:07 -0700 (PDT) Received: from [127.0.0.1] (helo=ra.coresystems.de) by mail.coreboot.org with esmtp (Exim 4.86_2) (envelope-from ) id 1d3NmM-00039r-Es; Wed, 26 Apr 2017 16:18:50 +0200 Received: from mail-eopbgr30136.outbound.protection.outlook.com ([40.107.3.136] helo=EUR03-AM5-obe.outbound.protection.outlook.com) by mail.coreboot.org with esmtps (TLSv1.2:ECDHE-RSA-AES256-SHA384:256) (Exim 4.86_2) (envelope-from ) id 1d3NmB-000355-1K for seabios@seabios.org; Wed, 26 Apr 2017 16:18:46 +0200 Received: from rkaganb.sw.ru (195.214.232.6) by VI1PR08MB0845.eurprd08.prod.outlook.com (10.164.93.143) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1047.13; Wed, 26 Apr 2017 14:18:17 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=virtuozzo.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=xqUIdFo48BpCg1uRxjMO3FPWJYN4j/qCmdLTxJXEZ54=; b=TIZDNEDT9/fmfRti43JKDnaEyk0xXgWntSlfCCLrUjtR5ufHZT1npalukJC5nSGrsf8ARqLtBA7ALXxfv+DxobE0nT1NOGDg3etLqkyRWrJPvNV1T3IErTpLWwTgGCLbrWv8azchN/4+YUVhaaLmQYczvzlmp3C+NQYIx0zxqb4= Authentication-Results: seabios.org; dkim=none (message not signed) header.d=none;seabios.org; dmarc=none action=none header.from=virtuozzo.com; From: Roman Kagan To: , Kevin O'Connor Date: Wed, 26 Apr 2017 17:18:02 +0300 Message-ID: <20170426141809.12661-3-rkagan@virtuozzo.com> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20170426141809.12661-1-rkagan@virtuozzo.com> References: <20170426141809.12661-1-rkagan@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: DB6PR0802CA0047.eurprd08.prod.outlook.com (10.172.252.161) To VI1PR08MB0845.eurprd08.prod.outlook.com (10.164.93.143) X-MS-Office365-Filtering-Correlation-Id: c517cdc1-47da-42d9-58f9-08d48caf161d X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(201703131423075)(201703031133081); SRVR:VI1PR08MB0845; X-Microsoft-Exchange-Diagnostics: 1; VI1PR08MB0845; 3:tNL7ZjFDU8GcLtKjK7ideb39U8WM/eJJzktPU8NONoq63AGkdFtk93mMwJdAGyben3RCckrD7gKzrs4L8gV+niniLs2Ub95BgFoZlWGGlJjHxD2tIg50D1tLAw/FeCQOL71ojLY8vxMCM/E8MY6EtN9OCMrlzVK7JFJxwVcPM71gw98AFizRwDJZjg3Ee3lqazmc5AsMHquldAKblDKiS9d2Z22sSYnAy32CJfRNnZj4sFGENZJ6Kk5KwhjrjG2Q+32rwexxVMGkVoC0Kg1vuyyknRtXraYJxq2iIUPjdur33VxIWEmUVr/ubrN9l5GL9DhRXpFoO6sKZLtXP9ceLQ==; 25:pXqtV64369pLhaE1hlrt3DDbn/SGYEhMgVoCEqAeLJUeaxWXEBD/Dz+h8KZAYzFcw/wELfM86LGpv2TmosHoUFmYcljWI5kVJ8bcPsLEWCsTmyosYYMW56b0uTJZ6DbVEFEvSUlQkxVQL3TWLFvujjQ1rz+3zx04wd4wPxLhNOEEXLuzwh6MIoX0LWo97Bm3JPk9a6B18WsfJTCKNyw1C+aFH1wTF0WHvTkzqJgaTZE4/qaaXiBgvuMw1z/AyHC4Y6gfyPQhs0Mk9MWEsrFeIyY4EsIZp16zUhiOW2+6+authhohHqeHFDnABC/AIz8CT+g/7ZzEOXMcM/cLtTy7sfNd39gcKMqOzY1t2PzlcfsF4d63STC153sS+B9UQL1I6btklCSv0K4eNfjsOhaPVua9Vi2uP+EGKvUH5K7f1gHLgxdeJeD1IwP/73Kz0lfNi9hYHPke9hwtrOFD1tu4aw== X-Microsoft-Exchange-Diagnostics: 1; VI1PR08MB0845; 31:dyPyE0CJbsYgmnrpnd3O/X677zNZ9xDL4/ShM4tdx35LQjnzXzoFDWXp1egHKsFb1yfDbIlnXgWiIHu60Q9M6JXNzEGk5beiPakq7vYxR84zOLw8CA46ED96I9DB9hwu3jZ3T0U/8RVduTdSXLnub/H8OgTmMqB50CRbeZ0pID307uay81zx4eZ2wMUokK6xjk1/m8jHNsPS+/qKX/S59F2O4a042/M1SL+QY7dhKC9O1J6j34qOFPJPcMvIXAXn; 20:FlHmyQKb3QyTfYN3XqMnQKxjSUwnurfQYVMU9XiuRW0pzksHBSCm8A8oLvRCyvvOgvl+GzWL/RD7okjENjNm1o0sfnRqw7jByrNtPL1+dT8OhzPcaVp0eFdm7q54ncUN2n1GJZLILxA2fq0rAFEIIxJCh44IQoP10RKSIceQYpyiKlkqQGTjxaiQ7qfkH4o3d9kJrMc/IpZ7pzhPvHf1faMqGkTA0kFww77fOvt5LM4OJ5AdM6U9ry3JGrgxROIBkUR8EO4CpkvO8PzstsBs9mYEnOWStdMPKcgmyf0FDBEmwidufogak12ZehIu46+XommZjMKbCI8u8R6DL7v72qNFEEjiGkIg7FJ4TAzNpaW2V+rmQyNYxlmwsY1nHyX3HBOs1GHwZj5amU2iV08yuGFV9PzjDFEX+a4U1/NovKw= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040450)(601004)(2401047)(5005006)(8121501046)(10201501046)(93006095)(93001095)(3002001)(6041248)(20161123562025)(20161123564025)(201703131423075)(201702281528075)(201703061421075)(20161123560025)(20161123555025)(6072148); SRVR:VI1PR08MB0845; BCL:0; PCL:0; RULEID:; SRVR:VI1PR08MB0845; X-Microsoft-Exchange-Diagnostics: 1; VI1PR08MB0845; 4:J5RR+axFXFltFvcuc96PDSD4I27nH6XSJzaLMFt52PFjom+hBg1wcD9LZ7u1TItzJn+3L6YRQ66gjKnQf1ZKvZFxnNetFrihoS/oVMBQdcGxAVdpQNstE9OCh4BNFLAWG2VJ34dlgV7VyFX2ysC1EoJT249V8Y2p0D/nDCf6jo6DjzcbulptTsNAd/mHeTojRoeZQqyR3YXOfPOqOximXCDe3OfS34Ppco5Z1lLCarZIJjCdVm56BNFf6q5Xi7bt2k9bYdDObGy3T2JaItBxOg7utcq7VoIj2g/GX2Y/TOiOz3wsDErrAcuYd/i+B9wzEdTOcEuCC2eEqT7vfLTmhPc5J/r3FtFzyUCXZlHkGi3TNT/NgY2mg8QaUL1Yx4aCqqwgIwJySY3PwGYdT1PLkmF7PSnLfuWvcwmnB/UDRaV70GggOgeevCtNFIuecwtueNzZMP7BLvvteMbzo/iwclfWvgRRzzCvWsYmM4JTc6gmRloMZjpuVOiLVu3z9DAqt3/J3JVTrgXLc1WFHkOtxdrLYUqVVbnp7kHtD8X9dy/LGX9FzEwihKy7TUYnkIwWUS9l+J004gFAIWT8PM9Gg2D77XW5vGC4+pg2bj8tQ18td4w1K8QCdbPUUXTIkA7B44o2F+FsbnWjZA/6CAiTuCFBguKaP57VapgMtTiII6kKErsotqsqLYgBglPJwHzVCdUSeEyTcPNaolLXLkUhiA== X-Forefront-PRVS: 0289B6431E X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(4630300001)(6009001)(39410400002)(39840400002)(39450400003)(39400400002)(305945005)(7736002)(189998001)(5660300001)(8676002)(25786009)(48376002)(86362001)(53416004)(42186005)(4326008)(2950100002)(38730400002)(81166006)(6666003)(36756003)(2906002)(50466002)(33646002)(66066001)(50226002)(6506006)(6116002)(54906002)(76176999)(47776003)(6512007)(50986999)(5003940100001)(6486002)(3846002)(53936002)(1076002)(41533002); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR08MB0845; H:rkaganb.sw.ru; FPR:; SPF:None; MLV:sfv; LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; VI1PR08MB0845; 23:XyrFF/0zSwq8ML+VGu1HBuvpvX3dnxvIE4mjb4F0Y?= =?us-ascii?Q?65a9symRTyM58wPT3+6x0OLZz1TVqQsIFzsP8mSjiIPD5EDXz7NrmXScMZkN?= =?us-ascii?Q?mSbF1mORhVBazDyu8KxaItpA2uW8f9F+J1reowhrVrozuuApGZlMYJQvt7c2?= =?us-ascii?Q?DxKCddt6bBvqTqSocFsagHOt+Jy4xL8zykqKyCxFfuwUxDBSA2WTvcko1Z6M?= =?us-ascii?Q?Px8KCCamSdXFTWXIRALWl55DUJy5QtvPc2991pULgG/vToNFyA3c/x21BtOY?= =?us-ascii?Q?anfEWvO265o4Ruz7OjJ8VboGXk/dmZloL6MnqnsS26I1K3joN7T93NPe42yN?= =?us-ascii?Q?Y1lLZGHJrEJBD0lL6y1EHeXBzfGW02otpn4vW1fv8ixBfpVQSX8S76kLbeP5?= =?us-ascii?Q?nka71X5qxRY/Ej5pt+2lCKdlM2rGZKp1xYTxypBRDyEv2dXr4LmTYvXEFA3u?= =?us-ascii?Q?k7vELaEuVKePYGmrpVuuuv23jnUy4fxnQ+1vl5Fl0lu37WbbY252es/Ts2++?= =?us-ascii?Q?Brd3r7LbGWlsdx5cM09zN2be7uw1GYn9FyWxFoYaEMjLT9Plc0LbpLMQVTua?= =?us-ascii?Q?6SEmQ0k3FsLvuch3KQM/jsmqixyyq2Y/JeypJYR/BbnHZBpoWh2RXg2vMw7J?= =?us-ascii?Q?PWB7Nng3DtBEjs89C8z3vLm5EjRd0W/8VIOD6Oj6konUouJzkghLKmLs+KNB?= =?us-ascii?Q?YQ4ztm3+cHbALRfW3Liquq3k2ZldRY9T+8qEdaPGtY10smIPS8/9p6IK4WAm?= =?us-ascii?Q?rd4JExZAYtjiBFT9f8eKGuXC/u87fhKm8qKTCXK/1BQFawIfl0RDiWwjv93v?= =?us-ascii?Q?kjqhERu1Y0wWjt8gKaJ9ykWWL7Sudbhb7DoHHwCeYCmZKNnoUR1H/pP9i2NT?= =?us-ascii?Q?tSUpr28hV6wimCs1j2fWcDbFrKn6elAaPkYpVRUg+FmhxrsyTw8P5epH2Iy1?= =?us-ascii?Q?w0CgL+DxGR0DiOmhX1qqvJUZi5qJBNkrQm8CbUEv3nZJgLeVSJycGlpaOiuC?= =?us-ascii?Q?NBIlILINBwop9GFRJfDEhBj?= X-Microsoft-Exchange-Diagnostics: 1; VI1PR08MB0845; 6:gnCB+q3anXOPegzpxur3VYyCf6LXrt2YI1wPkNUetniirsJFPaXw172ozOaSxKs3j4YZI0mJA3Di8SEv1Ozo0u0iifYa+M8HhYBslEjWcvht21Cw2lBYa2Op6iNchYFhoaP6Wsu6s+A8scjTSEfiHmnWW7qrH0dOmStxJ3ODh+AMjeUDb91W8eu5WdILgY2vszQQBy/MFHIH0az38V+bXIEtfehNDtLX6jWyXK9wN0EcUxQb/buUf/kklFN9Kh5ZFr5FC2VEol/hpzZImFmMO3X+cr75z/EERWYPfMq4bl1SmfEsGBPsWW58cDiJicGYX8HBMjf4elsbpN085w8xoIsMBhyGLUCnGeA4GY+sCLZNy06RAsUrvK33IGYMgHXdP43ZNalZJK2I20KXs4y8PLO6uyf5WOox0x9x/OTwoL7NFCC/VP3OGq0TApIi8eR4LzRGgRT/yOBzN6K5RQ+KHraoWQUa+1wEZXaG2FnH60xon7Xwda9WYAHH18nbBskZdrqc+N2KtNbmBV12/6l4Mg==; 5:j2Q+9a9CwV2kwL2JVzjszQlbzLDVr6vsqmsazwIetiSnCkXVmPI9z3QMP+BefAFoTb0fo9iCUaG2wDM2gdcBRepNRDzNBgtsldVJzoByazBiPOo24QUTRBUcok6tfACaO6ntv4XCfOu34CihdOBUkw==; 24:pZammXGAtRpyadA6eqCofgc0yV9Z8+l7cf+bE49vaY8eC71f+/7NeVmKpCqvlL42Wn+lLSdgnILjeBzryuFx3HMmU9fWz3MtFKWVeKBe7e0= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; VI1PR08MB0845; 7:Vzlrho5e9Kt54u+hmQIOSkiE3JaMtcwy4yEJV9EKy0lM8rRAfiyMFx92JIzYtsu0JrbXyS6XW5y4VNSwtfoWtFx/sK11EJUKkf3XnnQwQ7PwBR2VzvuX2Ne1I4E55Dkp/67d/tdIp3FG9cdiBOpTzLTPHx0KBR1iJ4QC7eJYElNX3EZNvY/MrCRoR+jolUcz4OEWqt4kWalV0SslY5KAsseqPrVb3rqafdU7yPzTMOXnpGp9eQOfsqALUPbeoz0oe0iZ/B8LQY54WtlG1ptUi+TlCagWwrKqRUE96DpMgxcl7c0DjWTMo6qUDepq9XXpRleFuA39P9vR3FyygEPLRg==; 20:EHoWZin0y5YeGL7DYfiJIM2CoELlCtCllKDZmUNXdzTds5ksyCXfdWGhgWtGL5GgE7xWOAZ8rh9afXQ6EMrg/sZFlQS3rLuxD8y7ciSwdGh/V3K2ZPzJkyTuyc5iV92bjZr7GELAwNRRJLvdupNwK+6+BSiIFm/PzXfyhBNpnlo= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 26 Apr 2017 14:18:17.8235 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR08MB0845 X-Spam-Score: -3.6 (---) Subject: [SeaBIOS] [PATCH v2 2/9] blockcmd: generic SCSI luns enumeration X-BeenThere: seabios@seabios.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: SeaBIOS mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Evgeniy Yakovlev Content-Transfer-Encoding: quoted-printable Errors-To: seabios-bounces@seabios.org Sender: "SeaBIOS" X-Duff: Orig. Duff, Duff Lite, Duff Dry, Duff Dark, Raspberry Duff, Lady Duff, Red Duff, Tartar Control Duff X-ZohoMail-DKIM: fail (Header signature does not verify) X-ZohoMail: RDKM_2 RSF_4 Z_629925259 SPT_0 Content-Type: text/plain; charset="utf-8" Add two generic functions to discover active LUNs on a SCSI target. The functions take a temporary drive descriptor on the target, and a callback to create a new drive descriptor with a new LUN using the temporary one as a template. One of the functions performs REPORT LUNS on the temporary drive to obtain the list of candidate luns; the other sequentially iterates the lun numbers up to the given maximum, and is meant as a fallback. Both functions return the number of successfully created drive descriptors, or a negative number if an error occured. This will allow to lift the limitation of most of the SCSI drivers that support booting off the LUN #0 only. Signed-off-by: Roman Kagan --- v1 -> v2: - use malloc_tmp instead of malloc_high - format the retry logic as a regular while{} loop - I left the interface as in v1 as the alternatives looked heavier src/hw/blockcmd.h | 4 +++ src/hw/blockcmd.c | 94 +++++++++++++++++++++++++++++++++++++++++++++++++++= ++++ 2 files changed, 98 insertions(+) diff --git a/src/hw/blockcmd.h b/src/hw/blockcmd.h index b543f85..f18543e 100644 --- a/src/hw/blockcmd.h +++ b/src/hw/blockcmd.h @@ -106,5 +106,9 @@ int scsi_is_read(struct disk_op_s *op); int scsi_is_ready(struct disk_op_s *op); struct drive_s; int scsi_drive_setup(struct drive_s *drive, const char *s, int prio); +typedef int (*scsi_add_lun)(u32 lun, struct drive_s *tmpl_drv); +int scsi_rep_luns_scan(struct drive_s *tmp_drive, scsi_add_lun add_lun); +int scsi_sequential_scan(struct drive_s *tmp_drive, u32 maxluns, + scsi_add_lun add_lun); =20 #endif // blockcmd.h diff --git a/src/hw/blockcmd.c b/src/hw/blockcmd.c index 5ad128e..324188d 100644 --- a/src/hw/blockcmd.c +++ b/src/hw/blockcmd.c @@ -13,6 +13,7 @@ #include "std/disk.h" // DISK_RET_EPARAM #include "string.h" // memset #include "util.h" // timer_calc +#include "malloc.h" =20 =20 /**************************************************************** @@ -181,6 +182,99 @@ scsi_is_ready(struct disk_op_s *op) return 0; } =20 +#define CDB_CMD_REPORT_LUNS 0xA0 + +struct cdb_report_luns { + u8 command; + u8 reserved_01[5]; + u32 length; + u8 pad[6]; +} PACKED; + +struct scsi_lun { + u16 lun[4]; +}; + +struct cdbres_report_luns { + u32 length; + u32 reserved; + struct scsi_lun luns[]; +}; + +static u64 scsilun2u64(struct scsi_lun *scsi_lun) +{ + int i; + u64 ret =3D 0; + for (i =3D 0; i < ARRAY_SIZE(scsi_lun->lun); i++) + ret |=3D be16_to_cpu(scsi_lun->lun[i]) << (16 * i); + return ret; +} + +// Issue REPORT LUNS on a temporary drive and iterate reported luns calling +// @add_lun for each +int scsi_rep_luns_scan(struct drive_s *tmp_drive, scsi_add_lun add_lun) +{ + int ret =3D -1; + u32 maxluns =3D 511; + u32 nluns, i; + struct cdb_report_luns cdb =3D { + .command =3D CDB_CMD_REPORT_LUNS, + }; + struct disk_op_s op =3D { + .drive_gf =3D tmp_drive, + .command =3D CMD_SCSI, + .count =3D 1, + .cdbcmd =3D &cdb, + }; + struct cdbres_report_luns *resp; + + ASSERT32FLAT(); + + while (1) { + op.blocksize =3D sizeof(struct cdbres_report_luns) + + maxluns * sizeof(struct scsi_lun); + op.buf_fl =3D malloc_tmp(op.blocksize); + if (!op.buf_fl) { + warn_noalloc(); + return -1; + } + + cdb.length =3D cpu_to_be32(op.blocksize); + if (process_op(&op) !=3D DISK_RET_SUCCESS) + goto out; + + resp =3D op.buf_fl; + nluns =3D be32_to_cpu(resp->length) / sizeof(struct scsi_lun); + if (nluns <=3D maxluns) + break; + + free(op.buf_fl); + maxluns =3D nluns; + } + + for (i =3D 0, ret =3D 0; i < nluns; i++) { + u64 lun =3D scsilun2u64(&resp->luns[i]); + if (lun >> 32) + continue; + ret +=3D !add_lun((u32)lun, tmp_drive); + } +out: + free(op.buf_fl); + return ret; +} + +// Iterate LUNs on the target and call @add_lun for each +int scsi_sequential_scan(struct drive_s *tmp_drive, u32 maxluns, + scsi_add_lun add_lun) +{ + int ret; + u32 lun; + + for (lun =3D 0, ret =3D 0; lun < maxluns; lun++) + ret +=3D !add_lun(lun, tmp_drive); + return ret; +} + // Validate drive, find block size / sector count, and register drive. int scsi_drive_setup(struct drive_s *drive, const char *s, int prio) --=20 2.9.3 _______________________________________________ SeaBIOS mailing list SeaBIOS@seabios.org https://mail.coreboot.org/mailman/listinfo/seabios