From owner-svn-src-all@FreeBSD.ORG Tue Mar 26 21:16:54 2013 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id AF8C59A9; Tue, 26 Mar 2013 21:16:54 +0000 (UTC) (envelope-from jimharris@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) by mx1.freebsd.org (Postfix) with ESMTP id 8900ADA; Tue, 26 Mar 2013 21:16:54 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.6/8.14.6) with ESMTP id r2QLGsUL014992; Tue, 26 Mar 2013 21:16:54 GMT (envelope-from jimharris@svn.freebsd.org) Received: (from jimharris@localhost) by svn.freebsd.org (8.14.6/8.14.5/Submit) id r2QLGssV014990; Tue, 26 Mar 2013 21:16:54 GMT (envelope-from jimharris@svn.freebsd.org) Message-Id: <201303262116.r2QLGssV014990@svn.freebsd.org> From: Jim Harris Date: Tue, 26 Mar 2013 21:16:54 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r248762 - head/sys/dev/nvme X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 26 Mar 2013 21:16:54 -0000 Author: jimharris Date: Tue Mar 26 21:16:53 2013 New Revision: 248762 URL: http://svnweb.freebsd.org/changeset/base/248762 Log: Ensure the controller's MDTS is accounted for in max_xfer_size. The controller's IDENTIFY data contains MDTS (Max Data Transfer Size) to allow the controller to specify the maximum I/O data transfer size. nvme(4) already provides a default maximum, but make sure it does not exceed what MDTS reports. Sponsored by: Intel Reviewed by: carl Modified: head/sys/dev/nvme/nvme_ctrlr.c head/sys/dev/nvme/nvme_private.h Modified: head/sys/dev/nvme/nvme_ctrlr.c ============================================================================== --- head/sys/dev/nvme/nvme_ctrlr.c Tue Mar 26 21:14:51 2013 (r248761) +++ head/sys/dev/nvme/nvme_ctrlr.c Tue Mar 26 21:16:53 2013 (r248762) @@ -457,6 +457,14 @@ nvme_ctrlr_identify(struct nvme_controll nvme_chatham_populate_cdata(ctrlr); #endif + /* + * Use MDTS to ensure our default max_xfer_size doesn't exceed what the + * controller supports. + */ + if (ctrlr->cdata.mdts > 0) + ctrlr->max_xfer_size = min(ctrlr->max_xfer_size, + ctrlr->min_page_size * (1 << (ctrlr->cdata.mdts))); + return (0); } @@ -923,6 +931,8 @@ nvme_ctrlr_construct(struct nvme_control if (cap_hi.bits.dstrd != 0) return (ENXIO); + ctrlr->min_page_size = 1 << (12 + cap_hi.bits.mpsmin); + /* Get ready timeout value from controller, in units of 500ms. */ cap_lo.raw = nvme_mmio_read_4(ctrlr, cap_lo); ctrlr->ready_timeout_in_ms = cap_lo.bits.to * 500; Modified: head/sys/dev/nvme/nvme_private.h ============================================================================== --- head/sys/dev/nvme/nvme_private.h Tue Mar 26 21:14:51 2013 (r248761) +++ head/sys/dev/nvme/nvme_private.h Tue Mar 26 21:16:53 2013 (r248762) @@ -265,6 +265,9 @@ struct nvme_controller { /** maximum i/o size in bytes */ uint32_t max_xfer_size; + /** minimum page size supported by this controller in bytes */ + uint32_t min_page_size; + /** interrupt coalescing time period (in microseconds) */ uint32_t int_coal_time;