Received: by 2002:a05:6a10:5bc5:0:0:0:0 with SMTP id os5csp2830459pxb; Mon, 1 Nov 2021 02:44:07 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwOu1i0ox9zDYEHstBUp7fTj1CswMva5zjxDd7aY8xU18G0wO7C0GhFc1MiVdL+f3mlgLo5 X-Received: by 2002:a92:d78a:: with SMTP id d10mr19392709iln.108.1635759847565; Mon, 01 Nov 2021 02:44:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1635759847; cv=none; d=google.com; s=arc-20160816; b=WY8bhP/Yh53NimNWZEI5gknYfLcb+QcgAE/6jsgYw58DiKcymvEiDs/MDtNbamD1/S 7BXhbcgY5lpgtY18gPaOGqYfwjeWcoUF4iobt+ZE+qW1EYxJ2F1YVQHzfn8T0s0IaiFZ mBcWk+s7cU1Nz8KCHIi1MIMg5YmoszDz1tic69k3Ism4hEKWf4B9oQV93WMU94oprV+p sEkqTRYfJY1XaVVPvBTzjEIB257NgawKdWdV3/t69NWQcLG7VR5rI/9w0+/rs531Ec2q g7UFMjL8chiG/SySk/HXVOgHEc7R29BJz0xFvrQKKgEvaj1eU4wkOmfudN6rs76Ig3g4 +oZg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:in-reply-to:content-disposition:mime-version :references:message-id:subject:cc:to:from:date; bh=GHn5UD3A4ZACPEW+V0t5q502Fzo1iFqjjnqQ/Anva+I=; b=pbzV0yrr6QuT2N6W+f+7KeW9qkuBi+Sw060nhSNqYkkdLZhnJT2glRoKj1kTIFhNco H5JXHVKx9ZBl2cIVdC+xQrF+2LofS6V6Y/rhhuaXKDBcAjd8l8pp3M8IQtLWHRL7qH6M 3mnAiGXkJROodzMlOVa6eCyVVIZBPCVEuC3HscFTbJ2SU3zt8BpeBVoZvb7fW9nNmvsx jsVQ1Dd+whveto52mYJqaI38FGAcQvdnN2DRsU7AF6uLeFa2qx9axoO8hCP+KqmSo6k0 9NgbfEophjTWW6IjgeKnpsZnf2MXbo9xclW8oEthUWfIYhXrlrC03jkO+4Ev1EAk5NBv dKuw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id m10si17919829ilh.107.2021.11.01.02.43.56; Mon, 01 Nov 2021 02:44:07 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233311AbhKAJnD (ORCPT + 99 others); Mon, 1 Nov 2021 05:43:03 -0400 Received: from mga09.intel.com ([134.134.136.24]:37760 "EHLO mga09.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233875AbhKAJkj (ORCPT ); Mon, 1 Nov 2021 05:40:39 -0400 X-IronPort-AV: E=McAfee;i="6200,9189,10154"; a="230836116" X-IronPort-AV: E=Sophos;i="5.87,198,1631602800"; d="scan'208";a="230836116" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Nov 2021 02:33:28 -0700 X-IronPort-AV: E=Sophos;i="5.87,198,1631602800"; d="scan'208";a="499970131" Received: from shiweiyu-mobl.ccr.corp.intel.com (HELO chenyu5-mobl1) ([10.255.28.221]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Nov 2021 02:33:24 -0700 Date: Mon, 1 Nov 2021 17:33:20 +0800 From: Chen Yu To: Andy Shevchenko Cc: linux-acpi@vger.kernel.org, Greg Kroah-Hartman , "Rafael J. Wysocki" , Ard Biesheuvel , Len Brown , Ashok Raj , Mike Rapoport , Aubrey Li , linux-kernel@vger.kernel.org Subject: Re: [PATCH v7 2/4] drivers/acpi: Introduce Platform Firmware Runtime Update device driver Message-ID: <20211101093320.GA18982@chenyu5-mobl1> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Oct 27, 2021 at 01:20:33PM +0300, Andy Shevchenko wrote: > On Wed, Oct 27, 2021 at 03:07:51PM +0800, Chen Yu wrote: > > Introduce the pfru_update driver which can be used for Platform Firmware > > Runtime code injection and driver update [1]. The user is expected to > > provide the update firmware in the form of capsule file, and pass it to > > the driver via ioctl. Then the driver would hand this capsule file to the > > Platform Firmware Runtime Update via the ACPI device _DSM method. At last > > the low level Management Mode would do the firmware update. > > > > The corresponding userspace tool and man page will be introduced at > > tools/power/acpi/pfru. > > ... > > > +static int get_image_type(struct efi_manage_capsule_image_header *img_hdr, > > + struct pfru_device *pfru_dev) > > +{ > > + guid_t *image_type_id = &img_hdr->image_type_id; > > efi_guid_t ? > efi_guid_t is a 32-bit aligned guid_t, which is for the case when efi_guid_t* arguments are 32-bit aligned. And it is for 32-bit ARM. Since this code injection is only for 64-bit, the guid is not required to be strictly 32-bit aligned I suppose? > > + /* check whether this is a code injection or driver update */ > > + if (guid_equal(image_type_id, &pfru_dev->code_uuid)) > > + return CODE_INJECT_TYPE; > > + > > + if (guid_equal(image_type_id, &pfru_dev->drv_uuid)) > > + return DRIVER_UPDATE_TYPE; > > + > > + return -EINVAL; > > +} > > ... > > > +static bool valid_version(const void *data, struct pfru_update_cap_info *cap, > > + struct pfru_device *pfru_dev) > > +{ > > + struct pfru_payload_hdr *payload_hdr; > > + efi_capsule_header_t *cap_hdr; > > + struct efi_manage_capsule_header *m_hdr; > > + struct efi_manage_capsule_image_header *m_img_hdr; > > + struct efi_image_auth *auth; > > + int type, size; > > + > > + /* > > + * Sanity check if the capsule image has a newer version > > + * than current one. > > + */ > > + cap_hdr = (efi_capsule_header_t *)data; > > Why casting? > Will remove this in next version. > > + size = cap_hdr->headersize; > > + m_hdr = (struct efi_manage_capsule_header *)(data + size); > > + /* > > + * Current data structure size plus variable array indicated > > + * by number of (emb_drv_cnt + payload_cnt) > > + */ > > + size += sizeof(struct efi_manage_capsule_header) + > > + (m_hdr->emb_drv_cnt + m_hdr->payload_cnt) * sizeof(u64); > > + m_img_hdr = (struct efi_manage_capsule_image_header *)(data + size); > > + > > + type = get_image_type(m_img_hdr, pfru_dev); > > + if (type < 0) > > + return false; > > + > > + size = adjust_efi_size(m_img_hdr, size); > > + if (size < 0) > > + return false; > > + > > + auth = (struct efi_image_auth *)(data + size); > > + size += sizeof(u64) + auth->auth_info.hdr.len; > > + payload_hdr = (struct pfru_payload_hdr *)(data + size); > > + > > + /* finally compare the version */ > > + if (type == CODE_INJECT_TYPE) > > + return payload_hdr->rt_ver >= cap->code_rt_version; > > + else > > + return payload_hdr->rt_ver >= cap->drv_rt_version; > > +} > > ... > > > +static long pfru_ioctl(struct file *file, unsigned int cmd, unsigned long arg) > > +{ > > + struct pfru_update_cap_info cap; > > + struct pfru_device *pfru_dev; > > + void __user *p; > > + int ret, rev; > > > + pfru_dev = to_pfru_dev(file); > > + p = (void __user *)arg; > > Can be combined with definitions above. Ditto for the rest cases in the code. > Ok, will do. > > +} > > ... > > > + phy_addr = (phys_addr_t)(info.addr_lo | (info.addr_hi << 32)); > > Does it compile without warnings for 32-bit target? > > ... > The code injection depends on Kconfig 64-bit and is not supposed to work on 32-bit AFAIK. > > + ret = guid_parse(PFRU_UUID, &pfru_dev->uuid); > > + if (ret) > > + return ret; > > + > > + ret = guid_parse(PFRU_CODE_INJ_UUID, &pfru_dev->code_uuid); > > + if (ret) > > + return ret; > > + > > + ret = guid_parse(PFRU_DRV_UPDATE_UUID, &pfru_dev->drv_uuid); > > + if (ret) > > + return ret; > > Why do you need to keep zillions of copies of the data which seems > is not going to be changed? Three global variables should be enough, > no? > The guid information is embedded in each pfru_dev and only calculated once during probe. I thought people try to avoid using global variables if possible? > > + ret = ida_alloc(&pfru_ida, GFP_KERNEL); > > + if (ret < 0) > > + return ret; > > + > > + pfru_dev->index = ret; > > ... > > > + /* default rev id is 1 */ > > Shouldn't you rather define this magic and drop this doubtful comment? > Ok, will do. > > + pfru_dev->rev_id = 1; > > ... > > > +failed: > > Make you labeling consistent. The usual pattern is to explain what will be > happened when goto to the certain label, for example, here is 'err_free_ida'. > Also, add an empty line everywhere before labels. > Ok, got it, will do. > > + ida_free(&pfru_ida, pfru_dev->index); > > + > > + return ret; > > +} > > ... > > > +#define UUID_SIZE 16 > > It must not be here at all. > Or it should be properly namespaced. > Ok. Would __u8 uuid[16] applicable? There are some examples in uapi headers. thanks, Chenyu > -- > With Best Regards, > Andy Shevchenko > >