From nobody Tue Feb 10 05:27:02 2026 Received: from smtp86.ord1d.emailsrvr.com (smtp86.ord1d.emailsrvr.com [184.106.54.86]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 82B8F35B134 for ; Fri, 30 Jan 2026 17:05:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=184.106.54.86 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769792712; cv=none; b=Tv3qch+t30h8SuPLa+dW3yeb2l6LCTmhrR4E3AkVoPQX5R13SCql6V2mdw4PO1zvp/PxzGHUXbsKwCgTVQ3CFy9zYZWHZgJ+HU3R/TUNaY7biJBN++ZuuWaBvAGAVjX0DR4wGlXjeAMYuvuHj25IWeOiRMbJv17Y1UkOHoFFZJA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1769792712; c=relaxed/simple; bh=MfzuQ8imMk4RLujxm0/Ic8A6iaTtbqCYJGloXprnP6U=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=ma2B7fz6DU8MkOKNsTxoXNO3XgwXktBedepI3eNrlG+Sea16/u9WG+ceqclRXp3jea9kWton1t0f2fcXfRVTvSTc9Ii1LM3aT8gcmcJCSnDdnIm34s6w47KTUFaTsclk1O8HDWu3Km4OMMMw/Xr4ogTgzX4qqwWvqG4Fz3Dm3Eg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=mev.co.uk; spf=pass smtp.mailfrom=mev.co.uk; dkim=pass (1024-bit key) header.d=mev.co.uk header.i=@mev.co.uk header.b=PxDigfAC; arc=none smtp.client-ip=184.106.54.86 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=mev.co.uk Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=mev.co.uk Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=mev.co.uk header.i=@mev.co.uk header.b="PxDigfAC" DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=mev.co.uk; s=20221208-6x11dpa4; t=1769792709; bh=MfzuQ8imMk4RLujxm0/Ic8A6iaTtbqCYJGloXprnP6U=; h=From:To:Subject:Date:From; b=PxDigfACaLWJt+7s69EMNtUpr+w7UkREYZMnzSOWQWpr6nt3lJ0Ddc5PYVh8QTYMv ZHaDrrbfYjz9XVA0KiWxU3vBLowxvu5Dc0WzIzi4cv9FYoqmZ5eClkYb5O4SIJxy2l jkOVq+lZjFFjbBg/DBTTzAh0bLFWOqsEftZOm4ZI= X-Auth-ID: abbotti@mev.co.uk Received: by smtp19.relay.ord1d.emailsrvr.com (Authenticated sender: abbotti-AT-mev.co.uk) with ESMTPSA id D74B4602A3; Fri, 30 Jan 2026 12:05:08 -0500 (EST) From: Ian Abbott To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , Ian Abbott , H Hartley Sweeten Subject: [PATCH 35/46] comedi: pcl730: Add sanity checks for I/O base address Date: Fri, 30 Jan 2026 16:48:00 +0000 Message-ID: <20260130170416.49994-36-abbotti@mev.co.uk> X-Mailer: git-send-email 2.51.0 In-Reply-To: <20260130170416.49994-1-abbotti@mev.co.uk> References: <20260130170416.49994-1-abbotti@mev.co.uk> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Classification-ID: 429d5722-7f90-4557-8586-08913fa85e9e-36-1 Content-Type: text/plain; charset="utf-8" The "pcl730" driver uses an admin-supplied configuration option (`it->options[0]`) to configure the I/O port base address of various relay output and digital input ISA board from Advantech, ADLINK, ICP DAS, and Diamond Systems. It currently allows any base address to be configured but the hardware devices have restrictions on the base addresses (configured by on-board DIP switches or jumpers), including the alignment, which can be larger than the board's I/O register address span. The Diamond Systems IR104-PBF board is particularly restricted to 4 different base addresses with different sized gaps between the possible addresses. Store the minimum supported I/O base addresses and alignment in the static board information array elements and add a sanity check to ensure the device is not configured at an unsupported base address. For the IR104-PBF board, add a special check that the base address is one of the 4 supported base addresses for that board. Signed-off-by: Ian Abbott --- drivers/comedi/drivers/pcl730.c | 49 +++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) diff --git a/drivers/comedi/drivers/pcl730.c b/drivers/comedi/drivers/pcl73= 0.c index d2733cd5383d..cf0f97b6e2c0 100644 --- a/drivers/comedi/drivers/pcl730.c +++ b/drivers/comedi/drivers/pcl730.c @@ -101,7 +101,9 @@ =20 struct pcl730_board { const char *name; - unsigned int io_range; + unsigned short io_range; + unsigned short min_io_start; + unsigned short align_io_start; unsigned is_pcl725:1; unsigned is_acl7225b:1; unsigned is_ir104:1; @@ -117,6 +119,8 @@ static const struct pcl730_board pcl730_boards[] =3D { { .name =3D "pcl730", .io_range =3D 0x04, + .min_io_start =3D 0, + .align_io_start =3D 0x04, .has_ttl_io =3D 1, .n_subdevs =3D 4, .n_iso_out_chan =3D 16, @@ -125,6 +129,8 @@ static const struct pcl730_board pcl730_boards[] =3D { }, { .name =3D "iso730", .io_range =3D 0x04, + .min_io_start =3D 0, + .align_io_start =3D 0x04, .n_subdevs =3D 4, .n_iso_out_chan =3D 16, .n_iso_in_chan =3D 16, @@ -132,6 +138,8 @@ static const struct pcl730_board pcl730_boards[] =3D { }, { .name =3D "acl7130", .io_range =3D 0x08, + .min_io_start =3D 0x200, + .align_io_start =3D 0x08, .has_ttl_io =3D 1, .n_subdevs =3D 4, .n_iso_out_chan =3D 16, @@ -140,6 +148,8 @@ static const struct pcl730_board pcl730_boards[] =3D { }, { .name =3D "pcm3730", .io_range =3D 0x04, + .min_io_start =3D 0, + .align_io_start =3D 0x04, .has_ttl_io =3D 1, .n_subdevs =3D 4, .n_iso_out_chan =3D 8, @@ -148,6 +158,8 @@ static const struct pcl730_board pcl730_boards[] =3D { }, { .name =3D "pcl725", .io_range =3D 0x02, + .min_io_start =3D 0x200, + .align_io_start =3D 0x02, .is_pcl725 =3D 1, .n_subdevs =3D 2, .n_iso_out_chan =3D 8, @@ -155,6 +167,8 @@ static const struct pcl730_board pcl730_boards[] =3D { }, { .name =3D "p8r8dio", .io_range =3D 0x02, + .min_io_start =3D 0, + .align_io_start =3D 0x10, .is_pcl725 =3D 1, .has_readback =3D 1, .n_subdevs =3D 2, @@ -163,6 +177,8 @@ static const struct pcl730_board pcl730_boards[] =3D { }, { .name =3D "acl7225b", .io_range =3D 0x08, /* only 4 are used */ + .min_io_start =3D 0x200, + .align_io_start =3D 0x08, .is_acl7225b =3D 1, .has_readback =3D 1, .n_subdevs =3D 2, @@ -171,6 +187,8 @@ static const struct pcl730_board pcl730_boards[] =3D { }, { .name =3D "p16r16dio", .io_range =3D 0x04, + .min_io_start =3D 0, + .align_io_start =3D 0x08, .is_acl7225b =3D 1, .has_readback =3D 1, .n_subdevs =3D 2, @@ -179,16 +197,22 @@ static const struct pcl730_board pcl730_boards[] =3D { }, { .name =3D "pcl733", .io_range =3D 0x04, + .min_io_start =3D 0, + .align_io_start =3D 0x04, .n_subdevs =3D 1, .n_iso_in_chan =3D 32, }, { .name =3D "pcl734", .io_range =3D 0x04, + .min_io_start =3D 0, + .align_io_start =3D 0x04, .n_subdevs =3D 1, .n_iso_out_chan =3D 32, }, { .name =3D "opmm-1616-xt", .io_range =3D 0x10, + .min_io_start =3D 0x100, + .align_io_start =3D 0x10, .is_acl7225b =3D 1, .has_readback =3D 1, .n_subdevs =3D 2, @@ -197,11 +221,15 @@ static const struct pcl730_board pcl730_boards[] =3D { }, { .name =3D "pearl-mm-p", .io_range =3D 0x02, + .min_io_start =3D 0x240, + .align_io_start =3D 0x40, .n_subdevs =3D 1, .n_iso_out_chan =3D 16, }, { .name =3D "ir104-pbf", .io_range =3D 0x08, + .min_io_start =3D 0x240, + .align_io_start =3D 0x20, .is_ir104 =3D 1, .has_readback =3D 1, .n_iso_out_chan =3D 20, @@ -266,10 +294,27 @@ static int pcl730_attach(struct comedi_device *dev, { const struct pcl730_board *board =3D dev->board_ptr; struct comedi_subdevice *s; + unsigned int iobase =3D it->options[0]; int subdev; int ret; =20 - ret =3D comedi_request_region(dev, it->options[0], board->io_range); + if (board->is_ir104) { + switch (iobase) { + case 0x240: + case 0x260: + case 0x280: + case 0x300: + break; + default: + dev_warn(dev->class_dev, + "%s: unsupported I/O base address %#x\n", + dev->board_name, iobase); + return -EINVAL; + } + } + ret =3D comedi_check_request_region(dev, iobase, board->io_range, + board->min_io_start, 0x3ff, + board->align_io_start); if (ret) return ret; =20 --=20 2.51.0