Looks pretty good, Bruce, just a few comments (mostly nit picking).
On Monday, January 31, 2005 1:11 pm, Bruce Losure wrote:
> +#include <linux/list.h>
> +#include <asm-ia64/sn/types.h>
This should just be <asm/sn/types.h>.
> +/* create DMA address by stripping AS bits */
> +#define TIOCX_DMA_ADDR(a) (uint64_t)((uint64_t)(a) & 0xffffcfffffffff)
Can you suffix your long constants with UL, e.g. 0xffffcfffffffffUL? Some
compilers and source checkers might complain otherwise.
> diff -Nru a/arch/ia64/sn/kernel/Makefile b/arch/ia64/sn/kernel/Makefile
> --- a/arch/ia64/sn/kernel/Makefile 2005-01-31 14:54:21 -06:00
> +++ b/arch/ia64/sn/kernel/Makefile 2005-01-31 14:54:21 -06:00
> @@ -10,3 +10,4 @@
> obj-y += setup.o bte.o bte_error.o irq.o mca.o idle.o \
> huberror.o io_init.o iomv.o klconflib.o sn2/
> obj-$(CONFIG_IA64_GENERIC) += machvec.o
> +obj-m += tiocx.o
If you want to keep it modular (as opposed to just putting it in the obj-y
objects), you should probably add a config option for it (probably under the
character devices menu next to the sn system controller driver) and make it
obj-$(CONFIG_SGI_TIOCX) instead. Also, if you put this file under
drivers/char it's more likely to be updated as APIs change and such. It
might mean moving some headers that it needs from arch/ia64/sn/include to
include/asm-ia64/sn though (which is no biggie). Maybe like this?
===== drivers/char/Kconfig 1.59 vs edited =====
--- 1.59/drivers/char/Kconfig 2005-01-06 10:42:18 -08:00
+++ edited/drivers/char/Kconfig 2005-01-31 14:03:11 -08:00
@@ -432,6 +432,13 @@
controller communication from user space (you want this!),
say Y. Otherwise, say N.
+config SGI_TIOCX
+ bool "SGI TIO CX driver support"
+ depends on (IA64_SGI_SN2 || IA64_GENERIC)
+ help
+ If you have an SGI Altix and you want to use fpga devices attached
+ to your TIO, say Y or M here, otherwise say N.
+
source "drivers/serial/Kconfig"
config UNIX98_PTYS
then in drivers/char/Makefile:
===== drivers/char/Makefile 1.81 vs edited =====
--- 1.81/drivers/char/Makefile 2004-11-07 15:27:25 -08:00
+++ edited/drivers/char/Makefile 2005-01-31 14:05:38 -08:00
@@ -45,6 +45,7 @@
obj-$(CONFIG_HVC_CONSOLE) += hvc_console.o hvsi.o
obj-$(CONFIG_RAW_DRIVER) += raw.o
obj-$(CONFIG_SGI_SNSC) += snsc.o
+obj-$(CONFIG_SGI_TIOCX) += tiocx.o
obj-$(CONFIG_MMTIMER) += mmtimer.o
obj-$(CONFIG_VIOCONS) += viocons.o
obj-$(CONFIG_VIOTAPE) += viotape.o
And of course we should probably enable it by default in sn2_defconfig and
defconfig to make things easy for bleeding edge users (which fpga users may
be).
> +#include <asm/sn/types.h>
> +#include <linux/module.h>
> +#include <linux/kernel.h>
> +#include <linux/version.h>
> +#include <linux/slab.h>
> +#include <linux/spinlock.h>
> +#include <linux/proc_fs.h>
> +#include <asm/sn/sn_sal.h>
> +#include <asm/sn/addrs.h>
> +#include <asm/sn/io.h>
> +#include "shubio.h"
> +#include "tio.h"
> +#include "tiocx.h"
> +#include "xtalk/xwidgetdev.h"
> +#include "xtalk/hubdev.h"
> +#include <asm-ia64/delay.h>
> +#include <asm/uaccess.h>
Should probably be linux/delay.h instead (if there's a linux/ version use it
over the asm/ version in general). Please put the #includes in order too,
linux/, asm/, asm/sn, then local is probably best.
> +#define WIDGET_ID 0
> +
> +static int tiocx_debug; /* debug switch */
> +MODULE_PARM(tiocx_debug, "i");
> +#define DBG(fmt...) if (tiocx_debug) printk(KERN_ALERT fmt)
New compilers may optimize out the tiocx_debug flag, meaning you couldn't
reenable it with a kernel debugger later (I'm assuming that's what you want).
Making it a #define would work around that but also make it static. Or you
could just remove the debug flag altogether since you've already debugged
this code and it's perfect right? :)
> + cx_dev = (struct cx_dev *)kmalloc(sizeof(struct cx_dev), GFP_KERNEL);
kmalloc returns void * so you shouldn't need the cast.
> + spin_lock(&cx_device_spin);
> + list_add_tail((struct list_head *)cx_dev, &cx_device_list);
Do you want list_add_tail(&cx_dev->global_list, &cx_device_list) here instead?
I.e. shouldn't you be passing in a list_head * instead?
> + list_for_each_safe(lp, tmp, (struct list_head *)&cx_device_list) {
I think you can drop the cast since cx_device_list is a struct list_head,
therefore &cx_device_list will be a struct list_head *, right? There are a
few cases of this.
> + ia64_sal_oemcall_nolock(&rv, (u64) SN_SAL_IOIF_INTERRUPT,
> + (u64) SAL_INTR_ALLOC, (u64) nasid,
> + (u64) widget, (u64) sn_irq_info, (u64) req_irq,
> + (u64) req_nasid, (u64) req_slice);
Most of these casts can be safely removed (elsewhere too).
> + sn_irq_info = kmalloc(sn_irq_size, GFP_KERNEL);
> + if (sn_irq_info == NULL)
> + return NULL;
> +
> + memset(sn_irq_info, 0x0, sn_irq_size);
You can use kmalloc(sn_irq_size, GFP_KERNEL | __GFP_ZERO); to avoid having to
memset it to 0.
> +static void tio_corelet_reset(nasid_t nasid, int corelet)
> +{
> + if (!(nasid & 1))
> + return;
> +
> + REMOTE_HUB_S(nasid, TIO_ICE_PMI_TX_CFG, 1 << corelet);
> + udelay(2000);
> + REMOTE_HUB_S(nasid, TIO_ICE_PMI_TX_CFG, 0);
> + udelay(2000);
Are these udelays necessary? Do we have to wait a certain number of clock
ticks before clearing the TIO_ICE_PMI_TX_CFG register or something?
> +int tiocx_open(struct inode *ip, struct file *fp)
> +{
> + if (ip == NULL) {
> + return -EINVAL;
> + }
> + if (fp == NULL) {
> + return -EINVAL;
> + }
You can drop the extra {} in both of the ifs above and maybe combine it into
if (!ip || !fp)
return -EINVAL;
if you want.
> + if (cx_device_register
> + (nasid, widgetp->xwi_hwid.part_num,
> + widgetp->xwi_hwid.mfg_num, hubdev) < 0)
> + return -ENXIO;
Did you mean to put the function name and the function call arguments on
different lines here?
Thanks,
Jesse
-
To unsubscribe from this list: send the line "unsubscribe linux-ia64" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html