Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8ed9b2c7 authored by Jes Sorensen's avatar Jes Sorensen Committed by Tony Luck
Browse files

[IA64-SGI] sn2 minor fixes and cleanups



General SN2 code cleanup:
 - Do not initialize global variables to zero
 - Use kzalloc instead of kmalloc+memset
 - Check kmalloc return values
 - Do not obfuscate spin lock calls
 - Remove some unused code
 - Various formatting cleanups

Signed-off-by: default avatarJes Sorensen <jes@sgi.com>
Signed-off-by: default avatarTony Luck <tony.luck@intel.com>
parent 50d8e590
Loading
Loading
Loading
Loading
+39 −57
Original line number Diff line number Diff line
@@ -23,6 +23,10 @@
#include "xtalk/hubdev.h"
#include "xtalk/xwidgetdev.h"


extern void sn_init_cpei_timer(void);
extern void register_sn_procfs(void);

static struct list_head sn_sysdata_list;

/* sysdata list struct */
@@ -40,11 +44,11 @@ struct brick {
	struct slab_info slab_info[MAX_SLABS + 1];
};

int sn_ioif_inited = 0;		/* SN I/O infrastructure initialized? */
int sn_ioif_inited;		/* SN I/O infrastructure initialized? */

struct sn_pcibus_provider *sn_pci_provider[PCIIO_ASIC_MAX_TYPES];	/* indexed by asic type */

static int max_segment_number = 0; /* Default highest segment number */
static int max_segment_number;		 /* Default highest segment number */
static int max_pcibus_number = 255;	/* Default highest pci bus number */

/*
@@ -84,7 +88,6 @@ static inline u64
sal_get_device_dmaflush_list(u64 nasid, u64 widget_num, u64 device_num,
			     u64 address)
{

	struct ia64_sal_retval ret_stuff;
	ret_stuff.status = 0;
	ret_stuff.v0 = 0;
@@ -94,7 +97,6 @@ sal_get_device_dmaflush_list(u64 nasid, u64 widget_num, u64 device_num,
			(u64) nasid, (u64) widget_num,
			(u64) device_num, (u64) address, 0, 0, 0);
	return ret_stuff.status;

}

/*
@@ -102,7 +104,6 @@ sal_get_device_dmaflush_list(u64 nasid, u64 widget_num, u64 device_num,
 */
static inline u64 sal_get_hubdev_info(u64 handle, u64 address)
{

	struct ia64_sal_retval ret_stuff;
	ret_stuff.status = 0;
	ret_stuff.v0 = 0;
@@ -118,7 +119,6 @@ static inline u64 sal_get_hubdev_info(u64 handle, u64 address)
 */
static inline u64 sal_get_pcibus_info(u64 segment, u64 busnum, u64 address)
{

	struct ia64_sal_retval ret_stuff;
	ret_stuff.status = 0;
	ret_stuff.v0 = 0;
@@ -215,7 +215,7 @@ static void __init sn_fixup_ionodes(void)
	struct hubdev_info *hubdev;
	u64 status;
	u64 nasid;
	int i, widget, device;
	int i, widget, device, size;

	/*
	 * Get SGI Specific HUB chipset information.
@@ -251,47 +251,36 @@ static void __init sn_fixup_ionodes(void)
		if (!hubdev->hdi_flush_nasid_list.widget_p)
			continue;

		size = (HUB_WIDGET_ID_MAX + 1) *
			sizeof(struct sn_flush_device_kernel *);
		hubdev->hdi_flush_nasid_list.widget_p =
		    kmalloc((HUB_WIDGET_ID_MAX + 1) *
			    sizeof(struct sn_flush_device_kernel *),
			    GFP_KERNEL);
		memset(hubdev->hdi_flush_nasid_list.widget_p, 0x0,
		       (HUB_WIDGET_ID_MAX + 1) *
		       sizeof(struct sn_flush_device_kernel *));
			kzalloc(size, GFP_KERNEL);
		if (!hubdev->hdi_flush_nasid_list.widget_p)
			BUG();

		for (widget = 0; widget <= HUB_WIDGET_ID_MAX; widget++) {
			sn_flush_device_kernel = kmalloc(DEV_PER_WIDGET *
						         sizeof(struct
						        sn_flush_device_kernel),
						        GFP_KERNEL);
			size = DEV_PER_WIDGET *
				sizeof(struct sn_flush_device_kernel);
			sn_flush_device_kernel = kzalloc(size, GFP_KERNEL);
			if (!sn_flush_device_kernel)
				BUG();
			memset(sn_flush_device_kernel, 0x0,
			       DEV_PER_WIDGET *
			       sizeof(struct sn_flush_device_kernel));

			dev_entry = sn_flush_device_kernel;
			for (device = 0; device < DEV_PER_WIDGET;
			     device++,dev_entry++) {
				dev_entry->common = kmalloc(sizeof(struct
					      	        sn_flush_device_common),
					                    GFP_KERNEL);
				size = sizeof(struct sn_flush_device_common);
				dev_entry->common = kzalloc(size, GFP_KERNEL);
				if (!dev_entry->common)
					BUG();
				memset(dev_entry->common, 0x0, sizeof(struct
					     	       sn_flush_device_common));

				if (sn_prom_feature_available(
						       PRF_DEVICE_FLUSH_LIST))
					status = sal_get_device_dmaflush_list(
									  nasid,
									 widget,
								       	 device,
						     nasid, widget, device,
						     (u64)(dev_entry->common));
				else
					status = sn_device_fixup_war(nasid,
								     widget,
							    	     device,
						     widget, device,
						     dev_entry->common);
				if (status != SALRET_OK)
					panic("SAL call failed: %s\n",
@@ -383,13 +372,12 @@ void sn_pci_fixup_slot(struct pci_dev *dev)

	pci_dev_get(dev); /* for the sysdata pointer */
	pcidev_info = kzalloc(sizeof(struct pcidev_info), GFP_KERNEL);
	if (pcidev_info <= 0)
	if (!pcidev_info)
		BUG();		/* Cannot afford to run out of memory */

	sn_irq_info = kmalloc(sizeof(struct sn_irq_info), GFP_KERNEL);
	if (sn_irq_info <= 0)
	sn_irq_info = kzalloc(sizeof(struct sn_irq_info), GFP_KERNEL);
	if (!sn_irq_info)
		BUG();		/* Cannot afford to run out of memory */
	memset(sn_irq_info, 0, sizeof(struct sn_irq_info));

	/* Call to retrieve pci device information needed by kernel. */
	status = sal_get_pcidev_info((u64) segment, (u64) dev->bus->number, 
@@ -482,13 +470,13 @@ void sn_pci_fixup_slot(struct pci_dev *dev)
 */
void sn_pci_controller_fixup(int segment, int busnum, struct pci_bus *bus)
{
	int status = 0;
	int status;
	int nasid, cnode;
	struct pci_controller *controller;
	struct sn_pci_controller *sn_controller;
	struct pcibus_bussoft *prom_bussoft_ptr;
	struct hubdev_info *hubdev_info;
	void *provider_soft = NULL;
	void *provider_soft;
	struct sn_pcibus_provider *provider;

 	status = sal_get_pcibus_info((u64) segment, (u64) busnum,
@@ -535,6 +523,8 @@ void sn_pci_controller_fixup(int segment, int busnum, struct pci_bus *bus)
	bus->sysdata = controller;
	if (provider->bus_fixup)
		provider_soft = (*provider->bus_fixup) (prom_bussoft_ptr, controller);
	else
		provider_soft = NULL;

	if (provider_soft == NULL) {
		/* fixup failed or not applicable */
@@ -638,13 +628,8 @@ void sn_bus_free_sysdata(void)

static int __init sn_pci_init(void)
{
	int i = 0;
	int j = 0;
	int i, j;
	struct pci_dev *pci_dev = NULL;
	extern void sn_init_cpei_timer(void);
#ifdef CONFIG_PROC_FS
	extern void register_sn_procfs(void);
#endif

	if (!ia64_platform_is("sn2") || IS_RUNNING_ON_FAKE_PROM())
		return 0;
@@ -700,32 +685,29 @@ static int __init sn_pci_init(void)
 */
void hubdev_init_node(nodepda_t * npda, cnodeid_t node)
{

	struct hubdev_info *hubdev_info;
	int size;
	pg_data_t *pg;

	size = sizeof(struct hubdev_info);

	if (node >= num_online_nodes())	/* Headless/memless IO nodes */
		hubdev_info =
		    (struct hubdev_info *)alloc_bootmem_node(NODE_DATA(0),
							     sizeof(struct
								    hubdev_info));
		pg = NODE_DATA(0);
	else
		hubdev_info =
		    (struct hubdev_info *)alloc_bootmem_node(NODE_DATA(node),
							     sizeof(struct
								    hubdev_info));
	npda->pdinfo = (void *)hubdev_info;
		pg = NODE_DATA(node);

	hubdev_info = (struct hubdev_info *)alloc_bootmem_node(pg, size);

	npda->pdinfo = (void *)hubdev_info;
}

geoid_t
cnodeid_get_geoid(cnodeid_t cnode)
{

	struct hubdev_info *hubdev;

	hubdev = (struct hubdev_info *)(NODEPDA(cnode)->pdinfo);
	return hubdev->hdi_geoid;

}

subsys_initcall(sn_pci_init);
+13 −12
Original line number Diff line number Diff line
@@ -3,7 +3,7 @@
 * License.  See the file "COPYING" in the main directory of this archive
 * for more details.
 *
 * Copyright (C) 1999,2001-2004 Silicon Graphics, Inc.  All Rights Reserved.
 * Copyright (C) 1999,2001-2004, 2006 Silicon Graphics, Inc.  All Rights Reserved.
 *
 * Module to export the system's Firmware Interface Tables, including
 * PROM revision numbers and banners, in /proc
@@ -190,7 +190,7 @@ static int
read_version_entry(char *page, char **start, off_t off, int count, int *eof,
		   void *data)
{
	int len = 0;
	int len;

	/* data holds the NASID of the node */
	len = dump_version(page, (unsigned long)data);
@@ -202,7 +202,7 @@ static int
read_fit_entry(char *page, char **start, off_t off, int count, int *eof,
	       void *data)
{
	int len = 0;
	int len;

	/* data holds the NASID of the node */
	len = dump_fit(page, (unsigned long)data);
@@ -229,13 +229,16 @@ int __init prominfo_init(void)
	struct proc_dir_entry *p;
	cnodeid_t cnodeid;
	unsigned long nasid;
	int size;
	char name[NODE_NAME_LEN];

	if (!ia64_platform_is("sn2"))
		return 0;

	proc_entries = kmalloc(num_online_nodes() * sizeof(struct proc_dir_entry *),
			       GFP_KERNEL);
	size = num_online_nodes() * sizeof(struct proc_dir_entry *);
	proc_entries = kzalloc(size, GFP_KERNEL);
	if (!proc_entries)
		return -ENOMEM;

	sgi_prominfo_entry = proc_mkdir("sgi_prominfo", NULL);

@@ -244,14 +247,12 @@ int __init prominfo_init(void)
		sprintf(name, "node%d", cnodeid);
		*entp = proc_mkdir(name, sgi_prominfo_entry);
		nasid = cnodeid_to_nasid(cnodeid);
		p = create_proc_read_entry(
			"fit", 0, *entp, read_fit_entry,
		p = create_proc_read_entry("fit", 0, *entp, read_fit_entry,
					   (void *)nasid);
		if (p)
			p->owner = THIS_MODULE;
		p = create_proc_read_entry(
			"version", 0, *entp, read_version_entry,
			(void *)nasid);
		p = create_proc_read_entry("version", 0, *entp,
					   read_version_entry, (void *)nasid);
		if (p)
			p->owner = THIS_MODULE;
		entp++;
@@ -263,7 +264,7 @@ int __init prominfo_init(void)
void __exit prominfo_exit(void)
{
	struct proc_dir_entry **entp;
	unsigned cnodeid;
	unsigned int cnodeid;
	char name[NODE_NAME_LEN];

	entp = proc_entries;
+17 −18
Original line number Diff line number Diff line
@@ -46,7 +46,13 @@ DECLARE_PER_CPU(struct ptc_stats, ptcstats);

static  __cacheline_aligned DEFINE_SPINLOCK(sn2_global_ptc_lock);

void sn2_ptc_deadlock_recovery(short *, short, short, int, volatile unsigned long *, unsigned long,
extern unsigned long
sn2_ptc_deadlock_recovery_core(volatile unsigned long *, unsigned long,
			       volatile unsigned long *, unsigned long,
			       volatile unsigned long *, unsigned long);
void
sn2_ptc_deadlock_recovery(short *, short, short, int,
			  volatile unsigned long *, unsigned long,
			  volatile unsigned long *, unsigned long);

/*
@@ -59,16 +65,6 @@ void sn2_ptc_deadlock_recovery(short *, short, short, int, volatile unsigned lon
#define reset_max_active_on_deadlock()	1
#define PTC_LOCK(sh1)			((sh1) ? &sn2_global_ptc_lock : &sn_nodepda->ptc_lock)

static inline void ptc_lock(int sh1, unsigned long *flagp)
{
	spin_lock_irqsave(PTC_LOCK(sh1), *flagp);
}

static inline void ptc_unlock(int sh1, unsigned long flags)
{
	spin_unlock_irqrestore(PTC_LOCK(sh1), flags);
}

struct ptc_stats {
	unsigned long ptc_l;
	unsigned long change_rid;
@@ -82,6 +78,8 @@ struct ptc_stats {
	unsigned long shub_ptc_flushes_not_my_mm;
};

#define sn2_ptctest	0

static inline unsigned long wait_piowc(void)
{
	volatile unsigned long *piows;
@@ -200,7 +198,7 @@ sn2_global_tlb_purge(struct mm_struct *mm, unsigned long start,
	max_active = max_active_pio(shub1);

	itc = ia64_get_itc();
	ptc_lock(shub1, &flags);
	spin_lock_irqsave(PTC_LOCK(shub1), flags);
	itc2 = ia64_get_itc();

	__get_cpu_var(ptcstats).lock_itc_clocks += itc2 - itc;
@@ -258,7 +256,7 @@ sn2_global_tlb_purge(struct mm_struct *mm, unsigned long start,
		ia64_srlz_d();
	}

	ptc_unlock(shub1, flags);
	spin_unlock_irqrestore(PTC_LOCK(shub1), flags);

	preempt_enable();
}
@@ -270,11 +268,12 @@ sn2_global_tlb_purge(struct mm_struct *mm, unsigned long start,
 * TLB flush transaction.  The recovery sequence is somewhat tricky & is
 * coded in assembly language.
 */
void sn2_ptc_deadlock_recovery(short *nasids, short ib, short ie, int mynasid, volatile unsigned long *ptc0, unsigned long data0,

void
sn2_ptc_deadlock_recovery(short *nasids, short ib, short ie, int mynasid,
			  volatile unsigned long *ptc0, unsigned long data0,
			  volatile unsigned long *ptc1, unsigned long data1)
{
	extern unsigned long sn2_ptc_deadlock_recovery_core(volatile unsigned long *, unsigned long,
	        volatile unsigned long *, unsigned long, volatile unsigned long *, unsigned long);
	short nasid, i;
	unsigned long *piows, zeroval, n;

+11 −11
Original line number Diff line number Diff line
@@ -6,11 +6,11 @@
 * Copyright (C) 2000-2005 Silicon Graphics, Inc. All rights reserved.
 */
#include <linux/config.h>
#include <asm/uaccess.h>

#ifdef CONFIG_PROC_FS
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <asm/uaccess.h>
#include <asm/sn/sn_sal.h>

static int partition_id_show(struct seq_file *s, void *p)
@@ -90,8 +90,8 @@ static int coherence_id_open(struct inode *inode, struct file *file)
	return single_open(file, coherence_id_show, NULL);
}

static struct proc_dir_entry *sn_procfs_create_entry(
	const char *name, struct proc_dir_entry *parent,
static struct proc_dir_entry
*sn_procfs_create_entry(const char *name, struct proc_dir_entry *parent,
			int (*openfunc)(struct inode *, struct file *),
			int (*releasefunc)(struct inode *, struct file *))
{
+1 −3
Original line number Diff line number Diff line
@@ -284,12 +284,10 @@ struct sn_irq_info *tiocx_irq_alloc(nasid_t nasid, int widget, int irq,
	if ((nasid & 1) == 0)
		return NULL;

	sn_irq_info = kmalloc(sn_irq_size, GFP_KERNEL);
	sn_irq_info = kzalloc(sn_irq_size, GFP_KERNEL);
	if (sn_irq_info == NULL)
		return NULL;

	memset(sn_irq_info, 0x0, sn_irq_size);

	status = tiocx_intr_alloc(nasid, widget, __pa(sn_irq_info), irq,
				  req_nasid, slice);
	if (status) {
Loading