Received: by 2002:a05:6358:111d:b0:dc:6189:e246 with SMTP id f29csp2634389rwi; Tue, 1 Nov 2022 09:52:24 -0700 (PDT) X-Google-Smtp-Source: AMsMyM6jyP8MHOpF3PS9oToxRLDPTH3w4funHU3CCa4akKdPgaQ2ozkb5QGJU1c2uZCx549lhj7X X-Received: by 2002:a17:906:6a26:b0:7ad:975c:9785 with SMTP id qw38-20020a1709066a2600b007ad975c9785mr20725164ejc.25.1667321543789; Tue, 01 Nov 2022 09:52:23 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1667321543; cv=none; d=google.com; s=arc-20160816; b=eeTzSOBUy47c3wJd4vus5sVQRE/eyyNkFgFnXnYX0hh/r51VvQT8fKF1v0LBKYmLVo 3Qvz0hHyi8Jf/pzVogI5igO7MkjY9h2UntUqQJtuORqT0DT3SJzB5WAIOKFVfFJ3/fL8 YXHLI7sEvjWInl3ziTuoaqrUedkrl7L0EkwUtpK8fn4btZzcKvBB9STr9zQumI9i7EI8 Ov5rKwJtlbSCKpmBvnjZOiQXVznjJOjd1Bs8fy2/sOD8XBWIdp8atF8fLuCuw2Xtmz+k mjFng+XaQVK+INhp944YZmfLqUGUCpS+/jBYfJGJH/6F/1a3LcdIA5FJivY24NS4ZPC+ YhBQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:mime-version:user-agent:references:message-id :in-reply-to:subject:cc:to:from:date:dkim-signature; bh=TzV1k7tedoYM01KWfIzCpPqOxEYYSDUDF7t9GAT8lEY=; b=Y51S8DKbGKRUKfxBNRhkwjBMXJKSZZgakTSyur3MTC5H//aNmmYQ6sWDAb1P+dI0wU M6lNVQ7gxhOFAVFMmaPzdhmMaI2GIy+wJZCy+6zABg1fM5afJGKUAKXZhNXbXb80wCGa hfjOi0TfDqV9jHKg90Lf2QszfiMVYJQBYMGD0ziKCgZZot8o/Yeme0ptZiTNsk/tizZe hgLhqf52Qdhivt5KiU4Y9gRfMCf6jTCofx//l1UR7bxFjxCa92t47M83xfvlAN1pD5LT 4RDkvDn+tGfIjHcY4hSrCE0+KZoEp9u9m7NCNQ+uBfAoKkAwstwz6+GnbahIm2jCCKKp KBJg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b="I8I/girk"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id gt2-20020a170906f20200b0078dcdbb3e87si9693843ejb.530.2022.11.01.09.52.00; Tue, 01 Nov 2022 09:52:23 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b="I8I/girk"; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230127AbiKAQGx (ORCPT + 96 others); Tue, 1 Nov 2022 12:06:53 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47506 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229553AbiKAQGu (ORCPT ); Tue, 1 Nov 2022 12:06:50 -0400 Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 371EE1571D; Tue, 1 Nov 2022 09:06:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1667318809; x=1698854809; h=date:from:to:cc:subject:in-reply-to:message-id: references:mime-version; bh=MayWlSqqoHM0+wU0rV8BWk4tRrFd6ej2gtNp75/u7+4=; b=I8I/girk6cKqgnvjHfcZfIE6DEfTK4qX3Lv2KSvFIcnyawa0uqdxmNqi eBLyblNJzj101uHA0L1PupsJHBwcEimUon+XewA/8WJFumt30M0CK2z76 DhtHcCRSjg4Tx06itMFreTXwc//wseED0G4zIEQJOIFt9EEqStoAZ3GLe gFtowvcAZWkU0LJYz33QrcMVgkXgYUxhJlpTBaPvW+IjZf5xmLPzUDd+6 S7k3EdOC6mkMB3ObJqQS8ic5UQjE6dPbWQymyUwnUvsdukoiQRA3KqR8X kzJOPqvd0OzlZONOLOn7ahuCtEefF7cooNGRXbucHMuxBpsCXA6RmU2pb Q==; X-IronPort-AV: E=McAfee;i="6500,9779,10518"; a="307896805" X-IronPort-AV: E=Sophos;i="5.95,231,1661842800"; d="scan'208";a="307896805" Received: from fmsmga007.fm.intel.com ([10.253.24.52]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Nov 2022 09:06:44 -0700 X-IronPort-AV: E=McAfee;i="6500,9779,10518"; a="636445570" X-IronPort-AV: E=Sophos;i="5.95,231,1661842800"; d="scan'208";a="636445570" Received: from rhweight-wrk1.ra.intel.com ([137.102.106.139]) by fmsmga007-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Nov 2022 09:06:42 -0700 Date: Tue, 1 Nov 2022 09:04:39 -0700 (PDT) From: matthew.gerlach@linux.intel.com X-X-Sender: mgerlach@rhweight-WRK1 To: Xu Yilun cc: hao.wu@intel.com, russell.h.weight@intel.com, basheer.ahmed.muddebihal@intel.com, trix@redhat.com, mdf@kernel.org, linux-fpga@vger.kernel.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, tianfei.zhang@intel.com, corbet@lwn.net, linux-serial@vger.kernel.org, jirislaby@kernel.org, geert+renesas@glider.be, andriy.shevchenko@linux.intel.com, niklas.soderlund+renesas@ragnatech.se, macro@orcam.me.uk, johan@kernel.org, lukas@wunner.de, ilpo.jarvinen@linux.intel.com, marpagan@redhat.com Subject: Re: [PATCH v4 4/4] tty: serial: 8250: add DFL bus driver for Altera 16550. In-Reply-To: Message-ID: References: <20221020212610.697729-1-matthew.gerlach@linux.intel.com> <20221020212610.697729-5-matthew.gerlach@linux.intel.com> User-Agent: Alpine 2.22 (DEB 394 2020-01-19) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII; format=flowed X-Spam-Status: No, score=-5.3 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_EF,RCVD_IN_DNSWL_MED,SPF_HELO_NONE, SPF_NONE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, 1 Nov 2022, Xu Yilun wrote: > On 2022-10-31 at 17:34:39 -0700, matthew.gerlach@linux.intel.com wrote: >> >> >> On Sat, 29 Oct 2022, Xu Yilun wrote: >> >>> On 2022-10-20 at 14:26:10 -0700, matthew.gerlach@linux.intel.com wrote: >>>> From: Matthew Gerlach >>>> >>>> Add a Device Feature List (DFL) bus driver for the Altera >>>> 16550 implementation of UART. >>>> >>>> Signed-off-by: Matthew Gerlach >>>> --- >>>> v4: use dev_err_probe() everywhere that is appropriate >>>> clean up noise >>>> change error messages to use the word, unsupported >>>> tried again to sort Makefile and KConfig better >>>> reorder probe function for easier error handling >>>> use new dfh_find_param API >>>> >>>> v3: use passed in location of registers >>>> use cleaned up functions for parsing parameters >>>> >>>> v2: clean up error messages >>>> alphabetize header files >>>> fix 'missing prototype' error by making function static >>>> tried to sort Makefile and Kconfig better >>>> --- >>>> drivers/tty/serial/8250/8250_dfl.c | 149 +++++++++++++++++++++++++++++ >>>> drivers/tty/serial/8250/Kconfig | 12 +++ >>>> drivers/tty/serial/8250/Makefile | 1 + >>>> 3 files changed, 162 insertions(+) >>>> create mode 100644 drivers/tty/serial/8250/8250_dfl.c >>>> >>>> diff --git a/drivers/tty/serial/8250/8250_dfl.c b/drivers/tty/serial/8250/8250_dfl.c >>>> new file mode 100644 >>>> index 000000000000..f02f0ba2a565 >>>> --- /dev/null >>>> +++ b/drivers/tty/serial/8250/8250_dfl.c >>>> @@ -0,0 +1,149 @@ >>>> +// SPDX-License-Identifier: GPL-2.0 >>>> +/* >>>> + * Driver for FPGA UART >>>> + * >>>> + * Copyright (C) 2022 Intel Corporation, Inc. >>>> + * >>>> + * Authors: >>>> + * Ananda Ravuri >>>> + * Matthew Gerlach >>>> + */ >>>> + >>>> +#include >>>> +#include >>>> +#include >>>> +#include >>>> +#include >>>> +#include >>>> +#include >>>> + >>>> +struct dfl_uart { >>>> + int line; >>>> +}; >>>> + >>>> +static int dfl_uart_get_params(struct dfl_device *dfl_dev, struct uart_8250_port *uart) >>>> +{ >>>> + struct device *dev = &dfl_dev->dev; >>>> + u64 v, fifo_len, reg_width; >>>> + u64 *p; >>>> + >>>> + p = dfh_find_param(dfl_dev, DFHv1_PARAM_ID_CLK_FRQ); >>>> + if (!p) >>>> + return dev_err_probe(dev, -EINVAL, "missing CLK_FRQ param\n"); >>>> + >>>> + uart->port.uartclk = *p; >>>> + dev_dbg(dev, "UART_CLK_ID %u Hz\n", uart->port.uartclk); >>>> + >>>> + p = dfh_find_param(dfl_dev, DFHv1_PARAM_ID_FIFO_LEN); >>>> + if (!p) >>>> + return dev_err_probe(dev, -EINVAL, "missing FIFO_LEN param\n"); >>>> + >>>> + fifo_len = *p; >>>> + dev_dbg(dev, "UART_FIFO_ID fifo_len %llu\n", fifo_len); >>>> + >>>> + switch (fifo_len) { >>>> + case 32: >>>> + uart->port.type = PORT_ALTR_16550_F32; >>>> + break; >>>> + >>>> + case 64: >>>> + uart->port.type = PORT_ALTR_16550_F64; >>>> + break; >>>> + >>>> + case 128: >>>> + uart->port.type = PORT_ALTR_16550_F128; >>>> + break; >>>> + >>>> + default: >>>> + return dev_err_probe(dev, -EINVAL, "unsupported fifo_len %llu\n", fifo_len); >>>> + } >>>> + >>>> + p = dfh_find_param(dfl_dev, DFHv1_PARAM_ID_REG_LAYOUT); >>>> + if (!p) >>>> + return dev_err_probe(dev, -EINVAL, "missing REG_LAYOUT param\n"); >>>> + >>>> + v = *p; >>>> + uart->port.regshift = FIELD_GET(DFHv1_PARAM_ID_REG_SHIFT, v); >>>> + reg_width = FIELD_GET(DFHv1_PARAM_ID_REG_WIDTH, v); >>> >>> I have concern that the raw layout inside the parameter block is >>> still exposed to drivers and need to be parsed by each driver. >> >> Raw parameter block will always have to be passed to the driver because HW >> specific properties can be defined that will need to be parsed by the >> specific driver. > > So there is a question about the scope of the definitions of these parameter > blocks. MSIX seems globally used across all dfl devices. REG_LAYOUT > seems specific to uart? There are definitely two classes of parameter blocks. One class is HW agnostic parameters where the parameters are relevant to many different kinds of HW components. MSI-X, and input clock-frequency are certainly HW agnostic, and it turns out that REG_LAYOUT is not specific to uart. You can see reg_bits and reg_stride in struct regmap_config. There are also device tree bindings for reg-shift and reg-io-width. The second class of parameters would be specific to HW component. In the case of this uart driver, all parameters would be considered HW agnostic parameters. > > If a parameter block is widely used in dfl drivers, duplicate the parsing > from HW layout in each driver may not be a good idea. While for device > specific parameter block, it's OK. It sounds like we are in agreement. > > Another concern is the indexing of the parameter IDs. If some parameter > blocks should be device specific, then no need to have globally indexed > parameter IDs. Index them locally in device is OK. So put the definitions > of ID values, HW layout and their parsing operation in each driver. It may be confusing for two drivers to use the same parameter id that have different meanings and data layout. Since all the parameters for this driver would be considered HW agnostic, we'd don't need to address this issue with this patchset. > > Thanks, > Yilun > >> >>> >>> How about we define HW agnostic IDs for parameter specific fields like: >>> >>> PARAM_ID FIELD_ID >>> ================================ >>> MSIX STARTV >>> NUMV >>> -------------------------------- >>> CLK FREQ >>> -------------------------------- >>> FIFO LEN >>> -------------------------------- >>> REG_LAYOUT WIDTH >>> SHIFT >>> >>> And define like u64 dfl_find_param(struct dfl_device *, int param_id, int field_id) >> >> I don't think dfl_find_param as defined above adds much value. >> >>> >>> Think further, if we have to define HW agnostic property - value pairs, >>> why don't we just use "Software nodes for the firmware node", see >>> drivers/base/swnode.c. I think this may be a better choice. >> >> I am looking into "Software nodes for the firmware node", and it can be used >> for HW agnostic properties. Each dfl driver will still have to make a >> function call to fetch each HW agnostice property value as well as a >> function call to find the HW specific parameters and then parse those >> parameters. >> >>> >>> Thanks, >>> Yilun >>> >