From jeremy@au1.ibm.com Thu Apr 13 15:31:10 2006 Return-Path: Received: from imap.linux.ibm.com ([unix socket]) by imap.linux.ibm.com (Cyrus v2.3.1-Invoca-RPM-2.3.1-2.1) with LMTPA; Thu, 13 Apr 2006 09:31:54 -0400 X-Sieve: CMU Sieve 2.3 Received: by imap.linux.ibm.com (Postfix, from userid 101) id D797945C02E; Thu, 13 Apr 2006 09:31:54 -0400 (EDT) X-Spam-TestScore: none X-Spam-TokenSummary: Bayes not run. X-Spam-Checker-Version: SpamAssassin 3.1.1 (2006-03-10) on imap.linux.ibm.com X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham version=3.1.1 X-Spam-Relay-Country: Received: from smtp.linux.ibm.com (smtp.linux.ibm.com [9.26.4.197]) by imap.linux.ibm.com (Postfix) with ESMTP id 9397C45C037 for ; Thu, 13 Apr 2006 09:31:52 -0400 (EDT) Received: from localhost (localhost.localdomain [127.0.0.1]) by smtp.linux.ibm.com (Postfix) with ESMTP id 0D0D898047 for ; Thu, 13 Apr 2006 09:31:51 -0400 (EDT) Received: from d12nrmr1507.megacenter.de.ibm.com (d12nrmr1507.megacenter.de.ibm.com [9.149.167.1]) by smtp.linux.ibm.com (Postfix) with ESMTP id 7025298049 for ; Thu, 13 Apr 2006 09:31:51 -0400 (EDT) Received: from d12av02.megacenter.de.ibm.com (d12av02.megacenter.de.ibm.com [9.149.165.228]) by d12nrmr1507.megacenter.de.ibm.com (8.12.10/NCO/VER6.8) with ESMTP id k3DDWjun132590; Thu, 13 Apr 2006 15:32:45 +0200 Received: from d12av02.megacenter.de.ibm.com (loopback [127.0.0.1]) by d12av02.megacenter.de.ibm.com (8.12.11/8.13.3) with ESMTP id k3DDVoQl031281; Thu, 13 Apr 2006 15:31:50 +0200 Received: from westrelay03.boulder.ibm.com (westrelay03.boulder.ibm.com [9.17.195.12]) by d12av02.megacenter.de.ibm.com (8.12.11/8.12.11) with ESMTP id k3DDVntr031249; Thu, 13 Apr 2006 15:31:49 +0200 Received: from d03av03.boulder.ibm.com (d03av03.boulder.ibm.com [9.17.195.169]) by westrelay03.boulder.ibm.com (8.12.10/NCO/VER6.8) with ESMTP id k3DDYpHD135872; Thu, 13 Apr 2006 07:34:51 -0600 Received: from d03av03.boulder.ibm.com (loopback [127.0.0.1]) by d03av03.boulder.ibm.com (8.12.11/8.13.3) with ESMTP id k3DDVm1m011321; Thu, 13 Apr 2006 07:31:48 -0600 Received: from smtp.linux.ibm.com (ltc-eth1000.torolab.ibm.com [9.26.4.197]) by d03av03.boulder.ibm.com (8.12.11/8.12.11) with ESMTP id k3DDVl8J011257; Thu, 13 Apr 2006 07:31:47 -0600 Received: from localhost (localhost.localdomain [127.0.0.1]) by smtp.linux.ibm.com (Postfix) with ESMTP id 7A0B798047; Thu, 13 Apr 2006 09:31:40 -0400 (EDT) Received: from linux.ibm.com (localhost.localdomain [127.0.0.1]) by smtp.linux.ibm.com (Postfix) with ESMTP id 9C17798034; Thu, 13 Apr 2006 09:31:33 -0400 (EDT) X-Original-To: ibm-linux-cell@linux.ibm.com Delivered-To: ibm-linux-cell@linux.ibm.com Received: from localhost (localhost.localdomain [127.0.0.1]) by smtp.linux.ibm.com (Postfix) with ESMTP id 4CB1698045 for ; Thu, 13 Apr 2006 09:31:32 -0400 (EDT) Received: from sd0112e0.au.ibm.com (d23rh903.au.ibm.com [9.190.250.240]) by smtp.linux.ibm.com (Postfix) with ESMTP id 8BC1E98034 for ; Thu, 13 Apr 2006 09:31:31 -0400 (EDT) Received: from d23av03.au.ibm.com (d23av03.au.ibm.com [9.190.250.244]) by sd0112e0.au.ibm.com (8.12.10/NCO/VER6.8) with ESMTP id k3DDYnG7178394 for ; Thu, 13 Apr 2006 23:34:49 +1000 Received: from d23av03.au.ibm.com (loopback [127.0.0.1]) by d23av03.au.ibm.com (8.12.11/8.13.3) with ESMTP id k3DDVT5C014856 for ; Thu, 13 Apr 2006 23:31:29 +1000 Received: from ozlabs.au.ibm.com (ozlabs.au.ibm.com [9.190.163.12]) by d23av03.au.ibm.com (8.12.11/8.12.11) with ESMTP id k3DDVTlv014853 for ; Thu, 13 Apr 2006 23:31:29 +1000 Received: from dyn-9-152-242-80.boeblingen.de.ibm.com (dyn-9-152-242-80.boeblingen.de.ibm.com [9.152.242.80]) (using SSLv3 with cipher EXP1024-RC4-SHA (56/128 bits)) (Client did not present a certificate) by ozlabs.au.ibm.com (Postfix) with ESMTP id 29498736B7 for ; Thu, 13 Apr 2006 23:32:31 +1000 (EST) From: Jeremy Kerr To: ibm-linux-cell@linux.ibm.com Date: Thu, 13 Apr 2006 15:31:10 +0200 User-Agent: KMail/1.9.1 References: <1144929972.702754.650631816840.qpush@pokey> In-Reply-To: <1144929972.702754.650631816840.qpush@pokey> Organization: IBM MIME-Version: 1.0 Content-Disposition: inline Message-Id: <200604131531.11166.jeremy@au.ibm.com> Subject: Re: [ibm-linux-cell] [PATCH 3/3] powerpc: cell: Register SPUs as sysdevs X-BeenThere: ibm-linux-cell@linux.ibm.com X-Mailman-Version: 2.1.7 Precedence: list Reply-To: jeremy@au1.ibm.com List-Id: Discussion of Linux on Cell kernel development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: ibm-linux-cell-bounces@linux.ibm.com Errors-To: ibm-linux-cell-bounces@linux.ibm.com X-Virus-Scanned: amavisd-new at linux.ibm.com X-Length: 9810 X-UID: 1989 SPUs are registered as system devices, exposing attributes through sysfs. Since the sysdev includes a kref, we can remove the one in struct spu (it isn't used at the moment anyway). Currently only the interrupt source and numa node attributes are added. Signed-off-by: Jeremy Kerr --- arch/powerpc/platforms/cell/spu_base.c | 59 +++++++++++++++++++++++++++++++++ include/asm-powerpc/spu.h | 5 +- Index: linus-2.6/arch/powerpc/platforms/cell/spu_base.c =================================================================== --- linus-2.6.orig/arch/powerpc/platforms/cell/spu_base.c +++ linus-2.6/arch/powerpc/platforms/cell/spu_base.c @@ -658,6 +658,52 @@ out: return ret; } +struct sysdev_class spu_sysdev_class = { + set_kset_name("spu") +}; + +static ssize_t spu_show_isrc(struct sys_device *sysdev, char *buf) +{ + struct spu *spu = container_of(sysdev, struct spu, sysdev); + return sprintf(buf, "%d", spu->isrc); + +} +static SYSDEV_ATTR(isrc, 0400, spu_show_isrc, NULL); + +static ssize_t spu_show_numa_id(struct sys_device *sysdev, char *buf) +{ + struct spu *spu = container_of(sysdev, struct spu, sysdev); + return sprintf(buf, "%d", spu->nid); + +} +static SYSDEV_ATTR(numa_id, 0400, spu_show_numa_id, NULL); + +static int spu_create_sysdev(struct spu *spu) +{ + int ret; + + spu->sysdev.id = spu->number; + spu->sysdev.cls = &spu_sysdev_class; + ret = sysdev_register(&spu->sysdev); + if (ret) { + printk(KERN_ERR "Can't register SPU %d with sysfs\n", + spu->number); + return ret; + } + + sysdev_create_file(&spu->sysdev, &attr_isrc); + sysdev_create_file(&spu->sysdev, &attr_numa_id); + + return 0; +} + +static void spu_destroy_sysdev(struct spu *spu) +{ + sysdev_remove_file(&spu->sysdev, &attr_isrc); + sysdev_remove_file(&spu->sysdev, &attr_numa_id); + sysdev_unregister(&spu->sysdev); +} + static int __init create_spu(struct device_node *spe) { struct spu *spu; @@ -690,6 +736,10 @@ static int __init create_spu(struct devi if (ret) goto out_unmap; + ret = spu_create_sysdev(spu); + if (ret) + goto out_free_irqs; + list_add(&spu->list, &spu_list); up(&spu_mutex); @@ -698,6 +748,9 @@ static int __init create_spu(struct devi spu->problem, spu->priv1, spu->priv2, spu->number); goto out; +out_free_irqs: + spu_free_irqs(spu); + out_unmap: up(&spu_mutex); spu_unmap(spu); @@ -711,6 +764,7 @@ static void destroy_spu(struct spu *spu) { list_del_init(&spu->list); + spu_destroy_sysdev(spu); spu_free_irqs(spu); spu_unmap(spu); kfree(spu); @@ -723,6 +777,7 @@ static void cleanup_spu_base(void) list_for_each_entry_safe(spu, tmp, &spu_list, list) destroy_spu(spu); up(&spu_mutex); + sysdev_class_unregister(&spu_sysdev_class); } module_exit(cleanup_spu_base); @@ -731,6 +786,11 @@ static int __init init_spu_base(void) struct device_node *node; int ret; + /* create sysdev class for spus */ + ret = sysdev_class_register(&spu_sysdev_class); + if (ret) + return ret; + ret = -ENODEV; for (node = of_find_node_by_type(NULL, "spe"); node; node = of_find_node_by_type(node, "spe")) { Index: linus-2.6/include/asm-powerpc/spu.h =================================================================== --- linus-2.6.orig/include/asm-powerpc/spu.h +++ linus-2.6/include/asm-powerpc/spu.h @@ -25,8 +25,8 @@ #ifdef __KERNEL__ #include -#include #include +#include #define LS_SIZE (256 * 1024) #define LS_ADDR_MASK (LS_SIZE - 1) @@ -123,7 +123,6 @@ struct spu { u64 flags; u64 dar; u64 dsisr; - struct kref kref; size_t ls_size; unsigned int slb_replace; struct mm_struct *mm; @@ -144,6 +143,8 @@ struct spu { char irq_c0[8]; char irq_c1[8]; char irq_c2[8]; + + struct sys_device sysdev; }; struct spu *spu_alloc(void);