From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-14.1 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E9689C433B4 for ; Wed, 19 May 2021 09:49:32 +0000 (UTC) Received: from desiato.infradead.org (desiato.infradead.org [90.155.92.199]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 7140F610A1 for ; Wed, 19 May 2021 09:49:32 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 7140F610A1 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=linaro.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=desiato.20200630; h=Sender:Content-Transfer-Encoding :Content-Type:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:Cc:To:Subject:Message-ID:Date:From:In-Reply-To: References:MIME-Version:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=G5PGACF/XJfgx3EbLu0PLM+/4ohgE4ki2GHRgBWR2FY=; b=C7P6fi4FAQdwTn+o/IpwFLBQn Ssmp4CASSDM1iIusFJ92PqgVeQ3xBT0becAr2HabsDAcuQVE3Elgcujhyia+1XOEufIfBGoz6ZDkN xhIoCYAOAallqxSjlFUQYvVgWyhLdurEFaJi0+c04igyLAr4huA1jXNjOFqDrJ7iD/lOlLxODsGra ru82jCfQQakflzAWSkfR9Q5EjN599lOY4hTgLGow7L5fkMOApCll0zSZjV8X93QczSTnpmuyw+Z3n nGCYsv1YsBJ6sEW+0QK7vPfKiBksFVaSl5lN6s3tlK9ZyI4krKZJJh/KKSw/rRoWNrvJaHv4sJaOd lAbmzv1Yg==; Received: from localhost ([::1] helo=desiato.infradead.org) by desiato.infradead.org with esmtp (Exim 4.94 #2 (Red Hat Linux)) id 1ljInY-003UUF-DE; Wed, 19 May 2021 09:47:28 +0000 Received: from bombadil.infradead.org ([2607:7c80:54:e::133]) by desiato.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) id 1ljInV-003UTc-7s for linux-arm-kernel@desiato.infradead.org; Wed, 19 May 2021 09:47:25 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20210309; h=Content-Type:Cc:To:Subject:Message-ID :Date:From:In-Reply-To:References:MIME-Version:Sender:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description; bh=5BUyFIFbLtTnek48PqOzCYPx8XjaYvuYiqGwkdtv6QQ=; b=gwoYiJpAp91iLsx1mZ+Ia/Xe/h VTTWSsE/oMMvPyeGEmIx54MlhfJnHh1zPkfCr2OMgK22CpzR3QHpbylkMQawVCKvQu4OBCz4E0Pwp B+DfRLID+sfQqa5Uq+/R3oIfkSbg2KJzfwsa8ZGhA0QYhW0HDpP9QO08VKK+73vxo6i4bFyNt2zsy 8Rn498bAc0ncenrqZCGze5HAgF6TJl6UWfXIqaLAS3DsgXKfDoYMwFaSw/omAtY+dQglTLVA5u0QS WJhGQzKhbfST9mQ+SDz/aCYholgGtRdEJuiNc+IoTEZb1vvw+V8/anpbNHnVgulSZFdJ9v5Jv9lC+ QlPQPOjQ==; Received: from mail-wr1-x42e.google.com ([2a00:1450:4864:20::42e]) by bombadil.infradead.org with esmtps (Exim 4.94 #2 (Red Hat Linux)) id 1ljInR-00FKNV-RD for linux-arm-kernel@lists.infradead.org; Wed, 19 May 2021 09:47:24 +0000 Received: by mail-wr1-x42e.google.com with SMTP id a4so13334218wrr.2 for ; Wed, 19 May 2021 02:47:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=5BUyFIFbLtTnek48PqOzCYPx8XjaYvuYiqGwkdtv6QQ=; b=fbML+/puVLx13PAWxlOAXr1q5niOqGJeDONgZKXVYiZNvnJkkOmnsTo9dvR+WyZUhi McLPaFVS3diUep14z7wIU1ieai4x7niM+VE7g4Dxl3frGkziCiuEBB/FiFbFx8dd/vkm FaeVSpNOZQzBL3jjJnzCe+wLTeHdAFoAAqVbqh8+CMH+ztmIu7rxhyshitmrQQ2wZA/N slbBJyMU94QAjC/5zZl437jSddPJc+mQZnY6WrRnFRYJz0vCZpYqYywEAkKMcGgxTSpZ g+JSvSPlkFun1f6ofZUs/7K0iIKeUd/R0d9DEzCSlmAIk55A8rUdmbMbRBntO5ZI6uWA 5R+w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=5BUyFIFbLtTnek48PqOzCYPx8XjaYvuYiqGwkdtv6QQ=; b=hRyY42+jLB8Y8z/VpXKDtcP1xz87ceOa8M3rfsRBLI48hDo00CR4tiLgUCJ5fztWPC vRYIdEDVSAqpkk0numgKYTJhPpkfEtd/BzooqjwUEt9JFQKdIqmDlhKd120vOpquGvmJ Ontlv0aE+TgV2+CKrTRTOAxmLRn5dk40hVIaHdXl8FpIkmzALf/gvQJ3U2bLEe0AHyE+ lnWoCnbNI9PuoiwBiQTRyl30D0Ve8sJntSLRXvZyvgFTuNMsGzJ/pGdXHHaa0gjjTdQ9 UmhG0iPVZMieGxC5u5blzNdS13ccWFAcsRPopZqW6l4QLQ5cIIzOIZbbK+gci5Kme1la hAwQ== X-Gm-Message-State: AOAM530oIqvY7xH0NjsSzIXp3PoBrGiCJNoch939JNNqX0x4hRYeGt7J 5sc8gmgeiAF4zon6wkPoR2zh3Q0cHXUgBJYk9tPAcA== X-Google-Smtp-Source: ABdhPJydZtDPAfMeFcim+GhrZGr1feDodhaK5teL9vhWqdF5sWYB+0FUKnrP0jzwvhyC7C4wCjw44VKmFmZmLDT1qfo= X-Received: by 2002:a5d:6882:: with SMTP id h2mr9357270wru.275.1621417639913; Wed, 19 May 2021 02:47:19 -0700 (PDT) MIME-Version: 1.0 References: <20210512211752.4103-1-mike.leach@linaro.org> <20210512211752.4103-5-mike.leach@linaro.org> <20210518193639.GC776252@xps15> In-Reply-To: <20210518193639.GC776252@xps15> From: Mike Leach Date: Wed, 19 May 2021 10:47:09 +0100 Message-ID: Subject: Re: [RFC PATCH 4/8] coresight: configfs: Allow configfs to activate configuration. To: Mathieu Poirier Cc: Coresight ML , linux-arm-kernel , "Suzuki K. Poulose" , Leo Yan X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210519_024721_921422_3BC06427 X-CRM114-Status: GOOD ( 49.23 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org Hi Mathieu, On Tue, 18 May 2021 at 20:36, Mathieu Poirier wrote: > > Please remove the '.' on every patch header. > Sorry - will do. Correct punctuation seems to be a habit that is hard to break! > On Wed, May 12, 2021 at 10:17:48PM +0100, Mike Leach wrote: > > Adds configfs attributes to allow a configuration to be enabled for use > > when sysfs is used to control CoreSight. > > > > perf retains independent enabling of configurations. > > > > Signed-off-by: Mike Leach > > --- > > .../coresight/coresight-etm4x-core.c | 5 + > > .../coresight/coresight-syscfg-configfs.c | 67 +++++++++ > > .../coresight/coresight-syscfg-configfs.h | 2 + > > .../hwtracing/coresight/coresight-syscfg.c | 129 ++++++++++++++---- > > .../hwtracing/coresight/coresight-syscfg.h | 7 +- > > 5 files changed, 182 insertions(+), 28 deletions(-) > > > > diff --git a/drivers/hwtracing/coresight/coresight-etm4x-core.c b/drivers/hwtracing/coresight/coresight-etm4x-core.c > > index b7a4aeaa2bc7..2637096c4621 100644 > > --- a/drivers/hwtracing/coresight/coresight-etm4x-core.c > > +++ b/drivers/hwtracing/coresight/coresight-etm4x-core.c > > @@ -688,6 +688,11 @@ static int etm4_enable_sysfs(struct coresight_device *csdev) > > struct etm4_enable_arg arg = { }; > > int ret; > > > > + /* enable any config activated by configfs */ > > + ret = cscfg_csdev_enable_active_config(csdev, 0, 0); > > + if (ret) > > + return ret; > > + > > spin_lock(&drvdata->spinlock); > > > > /* > > diff --git a/drivers/hwtracing/coresight/coresight-syscfg-configfs.c b/drivers/hwtracing/coresight/coresight-syscfg-configfs.c > > index 345a62f1b728..ae79ae8b1d7e 100644 > > --- a/drivers/hwtracing/coresight/coresight-syscfg-configfs.c > > +++ b/drivers/hwtracing/coresight/coresight-syscfg-configfs.c > > @@ -6,6 +6,7 @@ > > > > #include > > > > +#include "coresight-config.h" > > #include "coresight-syscfg-configfs.h" > > > > /* create a default ci_type. */ > > @@ -87,9 +88,75 @@ static ssize_t cscfg_cfg_values_show(struct config_item *item, char *page) > > } > > CONFIGFS_ATTR_RO(cscfg_cfg_, values); > > > > +static ssize_t cscfg_cfg_activate_show(struct config_item *item, char *page) > > +{ > > + struct cscfg_fs_config *fs_config = container_of(to_config_group(item), > > + struct cscfg_fs_config, group); > > + > > + return scnprintf(page, PAGE_SIZE, "%d\n", fs_config->active); > > +} > > + > > +static ssize_t cscfg_cfg_activate_store(struct config_item *item, > > + const char *page, size_t count) > > +{ > > + struct cscfg_fs_config *fs_config = container_of(to_config_group(item), > > + struct cscfg_fs_config, group); > > + int err; > > + bool val; > > + > > + err = kstrtobool(page, &val); > > + if (!err) > > + err = cscfg_config_sysfs_activation(fs_config->config_desc, val); > > + if (!err) { > > + fs_config->active = val; > > + if (val) > > + cscfg_config_sysfs_preset(fs_config->preset); > > + } > > + return err ? err : count; > > +} > > +CONFIGFS_ATTR(cscfg_cfg_, activate); > > + > > +static ssize_t cscfg_cfg_active_preset_show(struct config_item *item, char *page) > > +{ > > + struct cscfg_fs_config *fs_config = container_of(to_config_group(item), > > + struct cscfg_fs_config, group); > > + > > + return scnprintf(page, PAGE_SIZE, "%d\n", fs_config->preset); > > +} > > + > > +static ssize_t cscfg_cfg_active_preset_store(struct config_item *item, > > + const char *page, size_t count) > > +{ > > + struct cscfg_fs_config *fs_config = container_of(to_config_group(item), > > + struct cscfg_fs_config, group); > > + int preset, err; > > + > > + err = kstrtoint(page, 0, &preset); > > + if (!err) { > > + /* > > + * presets start at 1, and go up to max (15), > > + * but the config may provide fewer. > > + */ > > + if ((preset < 1) || (preset > fs_config->config_desc->nr_presets)) > > + err = -EINVAL; > > + } > > + > > + if (!err) { > > + /* set new value */ > > + fs_config->preset = preset; > > + /* set on system if active */ > > + if (fs_config->active) > > + cscfg_config_sysfs_preset(fs_config->preset); > > + } > > + return err ? err : count; > > +} > > +CONFIGFS_ATTR(cscfg_cfg_, active_preset); > > + > > static struct configfs_attribute *cscfg_config_view_attrs[] = { > > &cscfg_cfg_attr_description, > > &cscfg_cfg_attr_feature_refs, > > + &cscfg_cfg_attr_activate, > > + &cscfg_cfg_attr_active_preset, > > NULL, > > }; > > > > diff --git a/drivers/hwtracing/coresight/coresight-syscfg-configfs.h b/drivers/hwtracing/coresight/coresight-syscfg-configfs.h > > index ea1e54d29f7f..373d84d43268 100644 > > --- a/drivers/hwtracing/coresight/coresight-syscfg-configfs.h > > +++ b/drivers/hwtracing/coresight/coresight-syscfg-configfs.h > > @@ -15,6 +15,8 @@ > > struct cscfg_fs_config { > > struct cscfg_config_desc *config_desc; > > struct config_group group; > > + bool active; > > + int preset; > > }; > > > > /* container for feature view */ > > diff --git a/drivers/hwtracing/coresight/coresight-syscfg.c b/drivers/hwtracing/coresight/coresight-syscfg.c > > index 26c1a244c2b1..ab74e33b892b 100644 > > --- a/drivers/hwtracing/coresight/coresight-syscfg.c > > +++ b/drivers/hwtracing/coresight/coresight-syscfg.c > > @@ -743,32 +743,23 @@ void cscfg_csdev_reset_feats(struct coresight_device *csdev) > > } > > EXPORT_SYMBOL_GPL(cscfg_csdev_reset_feats); > > > > -/** > > - * cscfg_activate_config - Mark a configuration descriptor as active. > > - * > > - * This will be seen when csdev devices are enabled in the system. > > - * Only activated configurations can be enabled on individual devices. > > - * Activation protects the configuration from alteration or removal while > > - * active. > > - * > > - * Selection by hash value - generated from the configuration name when it > > - * was loaded and added to the cs_etm/configurations file system for selection > > - * by perf. > > +/* > > + * This activate configuration for either perf or sysfs. Perf can have multiple > > + * active configs, selected per event, sysfs is limited to one. > > * > > * Increments the configuration descriptor active count and the global active > > * count. > > * > > * @cfg_hash: Hash value of the selected configuration name. > > */ > > -int cscfg_activate_config(unsigned long cfg_hash) > > +static int _cscfg_activate_config(unsigned long cfg_hash) > > { > > struct cscfg_config_desc *config_desc; > > int err = -EINVAL; > > > > - mutex_lock(&cscfg_mutex); > > - > > list_for_each_entry(config_desc, &cscfg_mgr->config_desc_list, item) { > > if ((unsigned long)config_desc->event_ea->var == cfg_hash) { > > + > > Spurious newline > > > /* must ensure that config cannot be unloaded in use */ > > err = cscfg_owner_get(config_desc->load_owner); > > if (err) > > @@ -790,6 +781,88 @@ int cscfg_activate_config(unsigned long cfg_hash) > > break; > > } > > } > > + return err; > > +} > > + > > +static void _cscfg_deactivate_config(unsigned long cfg_hash) > > +{ > > + struct cscfg_config_desc *config_desc; > > + > > + list_for_each_entry(config_desc, &cscfg_mgr->config_desc_list, item) { > > + if ((unsigned long)config_desc->event_ea->var == cfg_hash) { > > + atomic_dec(&config_desc->active_cnt); > > + atomic_dec(&cscfg_mgr->sys_active_cnt); > > + cscfg_owner_put(config_desc->load_owner); > > + dev_dbg(cscfg_device(), "Deactivate config %s.\n", config_desc->name); > > + break; > > + } > > + } > > +} > > + > > +/* > > + * called from configfs to set/clear the active configuration for use when > > + * using sysfs to control trace. > > + */ > > +int cscfg_config_sysfs_activation(struct cscfg_config_desc *config_desc, bool activate) > > +{ > > + unsigned long cfg_hash_desc; > > + int err = 0; > > + > > + mutex_lock(&cscfg_mutex); > > + > > + cfg_hash_desc = (unsigned long)config_desc->event_ea->var; > > + > > + if (activate) { > > + /* cannot be a current active value to activate this */ > > + if (cscfg_mgr->sysfs_active_config) { > > + err = -EBUSY; > > + goto exit_unlock; > > + } > > + err = _cscfg_activate_config(cfg_hash_desc); > > + if (!err) > > + cscfg_mgr->sysfs_active_config = cfg_hash_desc; > > + } else { > > + /* disable if matching current value */ > > + if (cscfg_mgr->sysfs_active_config == cfg_hash_desc) { > > + _cscfg_deactivate_config(cfg_hash_desc); > > + cscfg_mgr->sysfs_active_config = 0; > > + } else > > + err = -EINVAL; > > + } > > + > > +exit_unlock: > > + mutex_unlock(&cscfg_mutex); > > + return err; > > +} > > + > > +/* set the sysfs preset value */ > > +void cscfg_config_sysfs_preset(int preset) > > +{ > > + mutex_lock(&cscfg_mutex); > > + cscfg_mgr->sysfs_active_preset = preset; > > + mutex_unlock(&cscfg_mutex); > > +} > > + > > +/** > > + * cscfg_activate_config - Mark a configuration descriptor as active. > > + * > > + * This will be seen when csdev devices are enabled in the system. > > + * Only activated configurations can be enabled on individual devices. > > + * Activation protects the configuration from alteration or removal while > > + * active. > > + * > > + * Selection by hash value - generated from the configuration name when it > > + * was loaded and added to the cs_etm/configurations file system for selection > > + * by perf. > > + * > > + * @cfg_hash: Hash value of the selected configuration name. > > + */ > > +int cscfg_activate_config(unsigned long cfg_hash) > > +{ > > + int err = 0; > > + > > + mutex_lock(&cscfg_mutex); > > + err = _cscfg_activate_config(cfg_hash); > > mutex_unlock(&cscfg_mutex); > > > > return err; > > @@ -805,19 +878,8 @@ EXPORT_SYMBOL_GPL(cscfg_activate_config); > > */ > > void cscfg_deactivate_config(unsigned long cfg_hash) > > { > > - struct cscfg_config_desc *config_desc; > > - > > mutex_lock(&cscfg_mutex); > > - > > - list_for_each_entry(config_desc, &cscfg_mgr->config_desc_list, item) { > > - if ((unsigned long)config_desc->event_ea->var == cfg_hash) { > > - atomic_dec(&config_desc->active_cnt); > > - atomic_dec(&cscfg_mgr->sys_active_cnt); > > - cscfg_owner_put(config_desc->load_owner); > > - dev_dbg(cscfg_device(), "Deactivate config %s.\n", config_desc->name); > > - break; > > - } > > - } > > + _cscfg_deactivate_config(cfg_hash); > > mutex_unlock(&cscfg_mutex); > > } > > EXPORT_SYMBOL_GPL(cscfg_deactivate_config); > > @@ -826,7 +888,8 @@ EXPORT_SYMBOL_GPL(cscfg_deactivate_config); > > * cscfg_csdev_enable_active_config - Enable matching active configuration for device. > > * > > * Enables the configuration selected by @cfg_hash if the configuration is supported > > - * on the device and has been activated. > > + * on the device and has been activated. A @cfg_hash value of 0 is used if the device > > + * is being programmed from sysfs, to select the current sysfs active config. > > * > > * If active and supported the CoreSight device @csdev will be programmed with the > > * configuration, using @preset parameters. > > @@ -850,6 +913,16 @@ int cscfg_csdev_enable_active_config(struct coresight_device *csdev, > > return 0; > > > > mutex_lock(&cscfg_csdev_mutex); > > + > > + /* sysfs controlled coresight will call with cfg_hash == 0 */ > > + if (!cfg_hash) { > > + if (!cscfg_mgr->sysfs_active_config) > > + goto exit_unlock; > > + > > + cfg_hash = cscfg_mgr->sysfs_active_config; > > + preset = cscfg_mgr->sysfs_active_preset; > > + } > > I'm worried about this snippet. For the time being it works but the function is > now entangled with the "if (attr->config2 ...) of etm4_parse_event_config(). > That being said I spent a fair amount of time trying to find a better solution > and I can't come up with one. The best option is probably to keep it for now. > > > > + > > list_for_each_entry(config_csdev_item, &csdev->config_csdev_list, node) { > > config_desc = config_csdev_item->config_desc; > > if ((atomic_read(&config_desc->active_cnt)) && > > @@ -863,6 +936,8 @@ int cscfg_csdev_enable_active_config(struct coresight_device *csdev, > > if (!err) > > csdev->active_cscfg_ctxt = (void *)config_csdev_active; > > } > > + > > +exit_unlock: > > mutex_unlock(&cscfg_csdev_mutex); > > return err; > > } > > diff --git a/drivers/hwtracing/coresight/coresight-syscfg.h b/drivers/hwtracing/coresight/coresight-syscfg.h > > index 1da37874f70f..e07e1b872806 100644 > > --- a/drivers/hwtracing/coresight/coresight-syscfg.h > > +++ b/drivers/hwtracing/coresight/coresight-syscfg.h > > @@ -28,6 +28,8 @@ > > * @load_order_list: Ordered list of owners for dynamically loaded configurations. > > * @sys_active_cnt: Total number of active config descriptor references. > > * @cfgfs_subsys: configfs subsystem used to manage configurations. > > + * @sysfs_active_config:Active config hash used if CoreSight controlled from sysfs. > > + * @sysfs_active_preset:Active preset index used if CoreSight controlled from sysfs. > > */ > > struct cscfg_manager { > > struct device dev; > > @@ -37,6 +39,8 @@ struct cscfg_manager { > > struct list_head load_order_list; > > atomic_t sys_active_cnt; > > struct configfs_subsystem cfgfs_subsys; > > + u32 sysfs_active_config; > > + int sysfs_active_preset; > > }; > > > > /* get reference to dev in cscfg_manager */ > > @@ -88,7 +92,8 @@ int cscfg_preload(void *owner_handle); > > const struct cscfg_feature_desc *cscfg_get_named_feat_desc(const char *name); > > int cscfg_update_feat_param_val(struct cscfg_feature_desc *feat_desc, > > int param_idx, u64 value); > > - > > +int cscfg_config_sysfs_activation(struct cscfg_config_desc *cfg_desc, bool activate); > > +void cscfg_config_sysfs_preset(int preset); > > With the above: > > Reviewed-by: Mathieu Poirier > Thanks. Regards Mike > > > > /* syscfg manager external API */ > > int cscfg_load_config_sets(struct cscfg_config_desc **cfg_descs, > > -- > > 2.17.1 > > -- Mike Leach Principal Engineer, ARM Ltd. Manchester Design Centre. UK _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel