Received: by 2002:a25:8b12:0:0:0:0:0 with SMTP id i18csp3772795ybl; Mon, 12 Aug 2019 06:12:45 -0700 (PDT) X-Google-Smtp-Source: APXvYqzpMv2sBCZk7lbcodyJICmuBA25F60x4PoMe6iJhMGl4z6nfQQXjTatn8ooQk0HwHaQSZR5 X-Received: by 2002:a17:902:e58b:: with SMTP id cl11mr31987521plb.24.1565615564920; Mon, 12 Aug 2019 06:12:44 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1565615564; cv=none; d=google.com; s=arc-20160816; b=D1dW9ORptcgkMX3gya5Rwil1M0xWDxTDpN2vFXGF3R/DdfPxcFGWFGNX21xhx+hH8/ f28j8MGzUZJXv1KQ6XoNbpiMrPOl1CmHGpedpcm4OwvYj0HLlx2ALixNX31ZM2XqO4aG 8+CwtL3B1A7tqe85CKHkeTiyreQuPtw9VFUGKU4FrIca7rzMN694y/i8SbDQaM3Nhkkr jImvu6jA09RNaUvgDzamjWrWbBWaytPDR3xMRfOFs8/zIDSfaMBuL+TJdBPbOMz1UTdI 5zTmhm0me5RroRq5FfIJjWB1Yg8z0s9P0Dtb4hWm0s4vvQp4fwrU3iMCEo+zfkQBYww0 vBGg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:in-reply-to :content-disposition:mime-version:references:message-id:subject:cc :to:from:date:dkim-signature; bh=likbUpy+hqGKJ+aVkUc0jeuI5OoHP9NpOwWastRmABc=; b=oGDqtNK6E05SVNUERu5ncmTDNQKTsaBX9QgJh1OeaO2G5/n9JzYKLIcWOTYwGZIWN4 D1KQdElDfZoK35Dqo2QvNuIqTYHvi4P++PDUO/VyEN9E43mNb3kYE8XduE9RqcsrmAga V+7DSuoL9cvXrMlHuwc5+Zn5lUyDJB3fmK5z3w0MPLZBAWdvN+PlwKDt5Anl/ts6LDhg AUYrxApwyIDpW1Vn2DCrg5ksxHsFiAENZFyzxuT6GLzsIQTmhS7zUN/DiiOISi43L4RT 6LubtGJgUp1Z/3mtpuxMP4MrHImb3wSPRv51SaNIbH3nBuURndQKhaVjDzIHn4m4ikgg uU5A== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@ziepe.ca header.s=google header.b=kMK9Lpmi; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id d4si60836308pgc.75.2019.08.12.06.12.29; Mon, 12 Aug 2019 06:12:44 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@ziepe.ca header.s=google header.b=kMK9Lpmi; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728922AbfHLNKd (ORCPT + 99 others); Mon, 12 Aug 2019 09:10:33 -0400 Received: from mail-qk1-f196.google.com ([209.85.222.196]:40201 "EHLO mail-qk1-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728787AbfHLNKG (ORCPT ); Mon, 12 Aug 2019 09:10:06 -0400 Received: by mail-qk1-f196.google.com with SMTP id s145so76849230qke.7 for ; Mon, 12 Aug 2019 06:10:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ziepe.ca; s=google; h=date:from:to:cc:subject:message-id:references:mime-version :content-disposition:in-reply-to:user-agent; bh=likbUpy+hqGKJ+aVkUc0jeuI5OoHP9NpOwWastRmABc=; b=kMK9LpmiWRr60D1T45SSevOv2vlXHiDiuiZf4ulsSujUTJizy0pUz3kKtJ7qNNGElj mFCM6EpcfkE6SAynb+2ABW1IUSVqv2ssditwGlUOMmvdLgN1O01qru86vwQGjt+PtEcw yCn6ptRF+oQZfo9bCTN+M7VWA/LinJSYRnBoCCzIhLilDCp9A+WNZUvoYIQch03LkiyW UCAF0avgTHRqAP6fpSSdLw5TOSHhg0FRWpCrCjIBz6vBgjj5BFqOsozA1HSfhsf37z88 GlNWxbskvtCvJaIoLD5/kiOmhDqKuvUYuNv8F3UdSBXmES59wTP1s/FuIEgyxkN33U0M QDgQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:in-reply-to:user-agent; bh=likbUpy+hqGKJ+aVkUc0jeuI5OoHP9NpOwWastRmABc=; b=HhxX5v+pfrYMm28nEVT31luiFY3uKZmg2OOeFdwGyy++m8XEGtXQKjZ1IbPR2YvZ7m yAohPzyv5juavTkZpzOZ7cAenhT8L2Y2ZOpq8oDUsQuSgGjZiTKL7y1yqI37tcpm3Y1A b4iIAh182FzPPR39xxPrOQagi9M39a0MrUFxwODG+6KtOWuMCti74LnSfeMgy174R4h0 QlDN1o4m8z4b+WsiKnibzy+scffUkffwdryma7mu34DtmC9R+cWBVthzJsd74bww8Nwt 4W4v38QrX5uiBRDSr9ZbSr8ejJugpzd8mWww/POG75ayKQKUcexsi3huiXEDqtQFGV25 rQ4w== X-Gm-Message-State: APjAAAW7v3HMtpn7tgKLV5e3eAQTi+BZ/dGKBsqX1B70tlApDfsMMzPt RJT6qmHq54DW8ZOSrvZPTJBwHSd8J48= X-Received: by 2002:a37:b381:: with SMTP id c123mr30501028qkf.349.1565615404632; Mon, 12 Aug 2019 06:10:04 -0700 (PDT) Received: from ziepe.ca (hlfxns017vw-156-34-55-100.dhcp-dynamic.fibreop.ns.bellaliant.net. [156.34.55.100]) by smtp.gmail.com with ESMTPSA id h26sm60899009qta.58.2019.08.12.06.10.04 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Mon, 12 Aug 2019 06:10:04 -0700 (PDT) Received: from jgg by mlx.ziepe.ca with local (Exim 4.90_1) (envelope-from ) id 1hxA5L-0007Yr-Q4; Mon, 12 Aug 2019 10:10:03 -0300 Date: Mon, 12 Aug 2019 10:10:03 -0300 From: Jason Gunthorpe To: ivan.lazeev@gmail.com Cc: Jarkko Sakkinen , Peter Huewe , Arnd Bergmann , Greg Kroah-Hartman , linux-integrity@vger.kernel.org, linux-kernel@vger.kernel.org Subject: Re: [PATCH v2] Fix fTPM on AMD Zen+ CPUs Message-ID: <20190812131003.GF24457@ziepe.ca> References: <20190811185218.16893-1-ivan.lazeev@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20190811185218.16893-1-ivan.lazeev@gmail.com> User-Agent: Mutt/1.9.4 (2018-02-28) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Sun, Aug 11, 2019 at 09:52:18PM +0300, ivan.lazeev@gmail.com wrote: > From: Vanya Lazeev > > The patch is an attempt to make fTPM on AMD Zen CPUs work. > Bug link: https://bugzilla.kernel.org/show_bug.cgi?id=195657 > > The problem seems to be that tpm_crb driver doesn't expect tpm command > and response memory regions to belong to different ACPI resources. > > Tested on Asrock ITX motherboard with Ryzen 2600X CPU. > However, I don't have any other hardware to test the changes on and no > expertise to be sure that other TPMs won't break as a result. > Hopefully, the patch will be useful. > > Changes from v1: > - use list_for_each_safe > > Signed-off-by: Vanya Lazeev > drivers/char/tpm/tpm_crb.c | 146 ++++++++++++++++++++++++++++--------- > 1 file changed, 110 insertions(+), 36 deletions(-) > > diff --git a/drivers/char/tpm/tpm_crb.c b/drivers/char/tpm/tpm_crb.c > index e59f1f91d..b0e797464 100644 > +++ b/drivers/char/tpm/tpm_crb.c > @@ -91,7 +91,6 @@ enum crb_status { > struct crb_priv { > u32 sm; > const char *hid; > - void __iomem *iobase; > struct crb_regs_head __iomem *regs_h; > struct crb_regs_tail __iomem *regs_t; > u8 __iomem *cmd; > @@ -108,6 +107,13 @@ struct tpm2_crb_smc { > u32 smc_func_id; > }; > > +struct crb_resource { > + struct resource io_res; > + void __iomem *iobase; > + > + struct list_head link; > +}; > + > static bool crb_wait_for_reg_32(u32 __iomem *reg, u32 mask, u32 value, > unsigned long timeout) > { > @@ -432,23 +438,69 @@ static const struct tpm_class_ops tpm_crb = { > .req_complete_val = CRB_DRV_STS_COMPLETE, > }; > > +static void crb_free_resource_list(struct list_head *resources) > +{ > + struct list_head *position, *tmp; > + > + list_for_each_safe(position, tmp, resources) > + kfree(list_entry(position, struct crb_resource, link)); > +} > + > +/** > + * Checks if resource @io_res contains range with the specified @start and @size > + * completely or, when @strict is false, at least it's beginning. > + * Non-strict match is needed to work around broken BIOSes that return > + * inconsistent values from ACPI regions vs registers. > + */ > +static inline bool crb_resource_contains(const struct resource *io_res, > + u64 start, u32 size, bool strict) > +{ > + return start >= io_res->start && > + (start + size - 1 <= io_res->end || > + (!strict && start <= io_res->end)); > +} > + > +static struct crb_resource *crb_containing_resource( > + const struct list_head *resources, > + u64 start, u32 size, bool strict) > +{ > + struct list_head *pos; > + > + list_for_each(pos, resources) { > + struct crb_resource *cres; > + > + cres = list_entry(pos, struct crb_resource, link); > + if (crb_resource_contains(&cres->io_res, start, size, strict)) > + return cres; > + } > + > + return NULL; > +} This flow seems very strange, why isn't this part of crb_map_res? > static int crb_check_resource(struct acpi_resource *ares, void *data) > { > - struct resource *io_res = data; > + struct list_head *list = data; > + struct crb_resource *cres; > struct resource_win win; > struct resource *res = &(win.res); > > if (acpi_dev_resource_memory(ares, res) || > acpi_dev_resource_address_space(ares, &win)) { > - *io_res = *res; > - io_res->name = NULL; > + cres = kzalloc(sizeof(*cres), GFP_KERNEL); > + if (!cres) > + return -ENOMEM; > + > + cres->io_res = *res; > + cres->io_res.name = NULL; > + > + list_add_tail(&cres->link, list); And why is this allocating memory inside the acpi table walker? It seems to me like the memory should be allocated once the mapping is made. Maybe all the mappings should be created from the ACPI ranges right away? > @@ -460,10 +512,16 @@ static void __iomem *crb_map_res(struct device *dev, struct crb_priv *priv, > if (start != new_res.start) > return (void __iomem *) ERR_PTR(-EINVAL); > > - if (!resource_contains(io_res, &new_res)) > + if (!cres) > return devm_ioremap_resource(dev, &new_res); > > - return priv->iobase + (new_res.start - io_res->start); > + if (!cres->iobase) { > + cres->iobase = devm_ioremap_resource(dev, &cres->io_res); > + if (IS_ERR(cres->iobase)) > + return cres->iobase; > + } It sounds likethe real bug is that the crb_map_res only considers a single active mapping, while these AMD chips need more than one? Jason