From nobody Wed May 14 00:31:13 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; 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 1488365183915674.277921350339; Wed, 1 Mar 2017 02:46:23 -0800 (PST) Received: from [127.0.0.1] (helo=ra.coresystems.de) by mail.coreboot.org with esmtp (Exim 4.86_2) (envelope-from ) id 1cj1lp-0004Py-I8; Wed, 01 Mar 2017 11:46:09 +0100 Received: from mail-ve1eur01on0093.outbound.protection.outlook.com ([104.47.1.93] helo=EUR01-VE1-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 1cj1lf-0004Lp-QV for seabios@seabios.org; Wed, 01 Mar 2017 11:46:07 +0100 Received: from rkaganb.sw.ru (195.214.232.6) by DB6PR0802MB2469.eurprd08.prod.outlook.com (10.172.251.17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.947.12; Wed, 1 Mar 2017 10:45:47 +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=u/un2TnaBZYXe4vRPCsWJr/JTwiHBkz1JbPqEjV/DR0=; b=JL2U3meVGN4jKXecSySSZQGQebsKSxsTdwwbFKj47uCF0Wo8deillgnC0CdroHuc6yUifiUIcxE/1FjTweUh8Z4SGMIBaWAWZSFbBNlburJGsrbMRJ0VfB8YaKciILtCE1SZdRZMse7uAX2CVC6GesXTMkkktWVKKrygsgQxTfw= 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: Date: Wed, 1 Mar 2017 13:45:35 +0300 Message-ID: <20170301104542.7373-3-rkagan@virtuozzo.com> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20170301104542.7373-1-rkagan@virtuozzo.com> References: <20170301104542.7373-1-rkagan@virtuozzo.com> MIME-Version: 1.0 X-Originating-IP: [195.214.232.6] X-ClientProxiedBy: HE1PR03CA0038.eurprd03.prod.outlook.com (10.163.170.176) To DB6PR0802MB2469.eurprd08.prod.outlook.com (10.172.251.17) X-MS-Office365-Filtering-Correlation-Id: ca9ea7ae-29ce-4d22-7b10-08d460901ef5 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001); SRVR:DB6PR0802MB2469; X-Microsoft-Exchange-Diagnostics: 1; DB6PR0802MB2469; 3:/YBWmQlRLFecjTJYrAm9clzmZ9N7JRBrEJiZAOLuS40IMqiTSczZdt4FvfnZga25zqnt3a3udRHVm4bZm/IdWxS1Z3sXzCL+hnm6RTvqOsw94njnaazJWoWziYI/ePZQYv8ivwIE4/VYv/IZuMHPDEEDM7yzcoa2+sCM5P+3wc/UkhpRv6cFndS+GOL2p1GmamZVeAq1ygtG8oN9OuSie5WcF+bcyZWcZNayOzmi9/zwXRHnsop7XVQt7+IpXqvm1c2Re0qy0MGOxNjy/h4fQw==; 25:mU6d+dRIzUCe6Cn8mxdTGFeGmek/IYPWiTEQJNULmLgY5v7jC/7ee49w8tklYO+XFvsZxKEqyOQJS/UZjybU9M/SuFuaKQVZ5NFfpKggtnZeRoYagiOxyM1/AQdmwF5RXiW0nLKwSQIUrxNYpBJ5MzFPAwsvFN6L/5AMQjI002MjUgEtTLIDwnaHtpQss9ieE9DJfwcR2W5xAkZpvfR4Xdz2l2lVCdxYM5mVZ2kBJ2uRDd87GkSSDCvAqe57F4f6mcV9afj8tQ96k+cYxkb5HE31ftJufIPBfG4MLlTOcJCiLzoZMQFUG9HZKibUq88ZOLuoUMibQ2J3zSMBbXcPAbijYwXaACp4G6fmbN+k9vY57U/It5hWVkVAfMPDoNwQQ/MgJKL1ONLBcvxfsoci3r4cTHdDRUXV1Vybk4SL5R/OkTRUnTppXZR83t35knRl1goJ9sgHXsavs/ykhfrQKw== X-Microsoft-Exchange-Diagnostics: 1; DB6PR0802MB2469; 31:QJe7KJ7PbwbDRQuE91uag8C25DbLNGeoLclteHw5p1BoLppHiJfaDsfTgKhyPUh1wcNXMURstMxiqm6nDI4B5HiY3W/yQORW5DwouNnnfLrk21pEqMvnqgueftJdNFjyjYthAJTPYrXl4jqScSRlIZ5GlPM+UHZkxt0lMY2LlKvMp9tnNGgjxzvFjqWyYzIFq1LRiLHlQlC7/aF/DZ0SJ2prI31tcEQI/rh8EOrJTlxLrfx++7SgymqHMimtmcNjrjYVgXApXwN+47l4DSnIIQ==; 20:TEd8x9YVfyBlLA2A9Dq9XX6hGKdRNN3VhbLgFuA5wD+tzveIowRdmO1Ucr9qWvlua9GDEpQ/YrENZThmuB1sxdw/kWdsaC81B4rWn1dUI+rz9pz/ajkvua4rk6MEBgl6UU/y8S1Y6nmAUHofy4DD26I6ZIZhXDBbLrPrDia8BGxi5yX2Qukt5PQpFAGIeIqAm9XSMKoWWSID6SAid8dW2tV8DpRW9wItjdbKjbtWMuIzqE7rTMtoE3T1glGTzJzabalxErczPQbfqLY0Hhfnd7CnZwWCmCqWJi1e3MzdyWPoKbDRxAOKltXcMbYDqo3xDkSjMCwQu6X/YkNcnCW627dyM/A0xCZoqHqb2vQksOPzsvN7fIAFYP9i6Hushz/W09c24pGdhAnMwiknagyRoeX1R/ZtpybgTJE96YqjC5w= X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040375)(601004)(2401047)(8121501046)(5005006)(3002001)(10201501046)(6041248)(20161123555025)(20161123562025)(20161123564025)(20161123558025)(20161123560025)(6072148); SRVR:DB6PR0802MB2469; BCL:0; PCL:0; RULEID:; SRVR:DB6PR0802MB2469; X-Microsoft-Exchange-Diagnostics: 1; DB6PR0802MB2469; 4:z05DUQg87HqkVEpPVuy2vtFpdaTByOL7A+/6eoTcqoK5l22VvVr53u6pRmzgk8YHeKXwOEejeK1vrdIXtGv3+t7rnvsY3cWlcByCkoH/jAdSRGf8er9VlJPt4wRjc8/89A+XAf0xHN0u5iZ3KE2aLsH3GOngTfQMgWLUgnirthHPXWkNkhNOsCkWoyglieRtPxBrjkiFrF9mnCCnOSoFFuiapq3OIoLkf6eGX0rHTuGMLSezxwTV0YvDH/dkbpA9grps3K2KoXQgwZRxx3j9NrmqVLyT9yh1C5gFo7o9+BYCIqrPbFo8sKiyK0Y0RHz5pTOVSYmBl9+ob36NZaqTbfzuIQTop9YkCpVUAChxgBG0fIIT+jDBf4eWXHIb77i5DIRw54SZDiQJvl76lXDdmSpcsi2NR1U08l5e8/9kAlD28UwmfhuV7PdaQkfeuNshQ2Vh9byu+2YwOjRj75aLOeOjAxCvbXzLA7VKs8X9JX3mUPsMSsjH3CgtXoO2lPkeuIfkVFyi3ASGIzvQ+axIiVSMDcOzGCnhrGGTOCkKZ6NP2lRjIxJ6YGLbbqrrnr1wCBhS/Tond8QQETMtRrWJCkXWlaeneQcS3Vguztcbur0= X-Forefront-PRVS: 0233768B38 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(4630300001)(6009001)(7916002)(39450400003)(36756003)(5660300001)(6486002)(5003940100001)(50986999)(76176999)(6512007)(2906002)(25786008)(2950100002)(450100001)(1076002)(6666003)(33646002)(6916009)(50466002)(6506006)(2351001)(42186005)(38730400002)(53936002)(305945005)(66066001)(92566002)(81166006)(8676002)(86362001)(53416004)(7736002)(110136004)(189998001)(47776003)(6116002)(3846002)(50226002)(41533002); DIR:OUT; SFP:1102; SCL:1; SRVR:DB6PR0802MB2469; H:rkaganb.sw.ru; FPR:; SPF:None; MLV:sfv; LANG:en; X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; DB6PR0802MB2469; 23:j9VwUFJ/IJREe1g7IRWjZUHIRdEChvVNvpW/Q6s?= =?us-ascii?Q?akWiUusyODks0505ynUq+ZhnYZ+7DSiv5dDx8vZVvzpxB+jlqAkWLz3UVsha?= =?us-ascii?Q?MpblLgnT0CEQ9avOviNDfsCzCB1DREO8bhewaSYtlh4Rd4XYlXv1RtvoNqAu?= =?us-ascii?Q?RAR3gqv/Xs5ZuwcY+MW4kh2UcKEypUzNID+m4c608Nx1o5CpqHONrn9q++M5?= =?us-ascii?Q?Ut+6pMB3ypVr+/WsQnudhhZRUHnC1tLmB/ghYBvfJasp1RFaIsjUEEu5ZHlw?= =?us-ascii?Q?zI95XkN8pXI8isQdxjPut4CchTFNmZ7S4aaOLR/HKpWN214d6V4wlLq3Sylw?= =?us-ascii?Q?JJ4iY8eJDJv3uqHKtzc/1xcoWlgwqCtPHVqnUpUPCKlp/y6yTC4lt6cZ+yKb?= =?us-ascii?Q?TIkNRn92nTsNt8XchEhkY3ObRStGoOmhG8HtSU4K4ofrDuZyulZH9Zleb7RB?= =?us-ascii?Q?i4b1If9cfs0MgqzJEDGQSmcANQ02KKPERaGzjZbMbzwrUWuqVvztdlEjMWLe?= =?us-ascii?Q?xNREyQ/9Im6TX+u5IDLiu+oBDXz8+C38sbzCksNcCcBIW9CrSw6sK21q0daq?= =?us-ascii?Q?ezz1C5+3syrCBehwFPIb/gjrHviDQH7qaOxthhSHxkah60Y+wqZjZ+ursXwK?= =?us-ascii?Q?IFOdvJVgP3cXFDEW0zD4HjfBbKczHxj9CKFIcmwSw/wd24yOtzHlcWTSWI8a?= =?us-ascii?Q?A9UDyMcQQCnMDwWWgmbpXgnLutkUcwZf+X/kblIuQjEPaLC9uBeSlJVWsxfa?= =?us-ascii?Q?0pWoEvr1S8ju3/KKt5c7wQOjDeKXcWzNttEoUv99IGODHLSkOOXziq0rCP7e?= =?us-ascii?Q?R+2KZKYwKgkkYWguVetpH2UpBuyfqdC8RzImJ698yzUMro++SX87U7aCw/D7?= =?us-ascii?Q?vNJlGsu5R75x3jfIA0aPdFeTcKb+vbMaBSClhZBygwx9hOqXR0CTn/J7EUz7?= =?us-ascii?Q?Bt5uWOZk9l21F2b7QxCKpO/2XZlijnWJobbct4Uq2a9FaUyuZwt54kZLIs6z?= =?us-ascii?Q?uO1s=3D?= X-Microsoft-Exchange-Diagnostics: 1; DB6PR0802MB2469; 6:IAfGg4El1djI575a62izOhOqgtp+5PoHaNtziiXmeFZ1AEGvluwqYblHqbFstDzmFKBn6FYS09AHcAfaSBrgg6jB3E7QD3FzD/7stKt5BuwehwdrNKBVNvkO0HX/uk+ZIMQMKPH6OL5N84p3jhST3dp+j4txIpeTdaKhg1HYY7hMkcJyyywzZLUkLUumimOwtRNhj9vzew9Dy18EZPbm7oywyFDDpiI6/US46bTMX8b5sMMqyVEFv1AU0loXGmSbEr6o5XIt221mmFriQCO/NaPwjMlHcgeqyH1IQ0S2f+e4rh5pmOGk8zdBaRsi8sQC3depwp7CZdrC3KWY7Qcz2vC9cYIlEM0Q2fuQMbZBuSz4h9kvaDDf2kRra4vflvtDQB1Ll+JlED9pELPty7hxrw==; 5:wt73/iOta+WNsiJbgmkpVLfLDqr0i3YSKJEcONeT+IaBdKPrO5FXspBsxBsWUIQMo9gMSMvXMIHXeULRs8mxzfAPsQMRWR8yRzE0ggkarEixcF94zF20D0goIFOG94JjLJt9V95XAz5aGXOUNtq6Sw==; 24:zGGTypiiZ4uz33xPZXfL0z955E6IebRLpi8a5ENcbAqsXKXCrawcdDdIdOuNEtVTAxGALxQptfXG4Ue7kQKg1qEwFhvr5cwTe+37E8vm+ss= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; DB6PR0802MB2469; 7:jeBWcORNJ69H2tm+wbRwmfp7yusN2UV0+vbwIsmX2TrjXNb8Vaj/6a3VyiXwKtyr2tHdn6/c5KDq7XWfATWmAh+nTCLB3PwUt0hFqvWFADBi/bkIomD/e1M75iZMPWyTYNs4WEMyUB9ahIXMrlQjHjx7Z6TiO0vzurbHrJCNueH5HDO2mE5qmHN5JESFItK9UuTbKp7/TZUT9YtzAt2ntj3aVSkOV6Jc6X3p78HkIS/TpHqqMUAexG38jPPSMIR0esFibuR1WtkNjoPyY5VPdb9t3iixqeIe1XpxZ3lQIDA/Xh6whcguFOo1uiBGpsvhcBpmKGGX0AmY9qtmtTXBkA==; 20:6/JLylLpCQEl/4PNj1WpARGfKU4y4K1w3VR/5D4jE3ZH/wN3PCGcLOlKB+hTgohqfMtZR/D8Yu7eIxNf+5+pZ8sTDoBXZnbseJtwt3AVMe2EIegEi/WgrkL8Lw73ncEOfe3JiLkvyrKBUa+FrwowiF9X8IC5C2PLyZ/pYek8tJ4= X-OriginatorOrg: virtuozzo.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Mar 2017 10:45:47.4672 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB6PR0802MB2469 X-Spam-Score: -5.6 (-----) Subject: [SeaBIOS] [PATCH 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: , 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: 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 --- src/hw/blockcmd.h | 4 +++ src/hw/blockcmd.c | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++= ++++ 2 files changed, 97 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..eeafb63 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,98 @@ 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(); + +retry: + op.blocksize =3D sizeof(struct cdbres_report_luns) + + maxluns * sizeof(struct scsi_lun); + op.buf_fl =3D malloc_high(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 > maxluns) { + free(op.buf_fl); + maxluns =3D nluns; + goto retry; + } + + 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://www.coreboot.org/mailman/listinfo/seabios