Subject: Re: virtex 4 linux driver bus error

From: Grant Likely <[email-masked]>
Date: Wed, 22 Oct 2008 22:17:13 -0600

On Wed, Oct 22, 2008 at 02:10:12PM +0200, Mirsad Vejseli wrote:
> hello at all,
> 
> at the moment I use development board ML410 with montavistalinux. 
> 
> I have a problem, please help me! 
> 
> I try to write a linux-driver for writing or reading registers.
> I have a ace-file, which contents Linux and EDK-project with a component (IP-wizard) which is added on a PLB-bus.
> I also have a driver-construct which I can register (insmod driver.ko) into the linux-Kernel only if i do not use functions to write or read the bus (XIO_out32() or XIO_in32 ()  ). If I use this function after registering the driver I got an error.
> If I try to insert the modul with Insmod driver.ko I get a bus error!  
> 
> my driver is similar to http://ozlabs.org/pipermail/linuxppc-embedded/2006-January/021578.html
>  
> 
> her the two importent functions  of the driver:
> 

Try something like this:

#define REG_BASE 	(u32) XPAR_komponente_0_BASEADDR // defined in xparameters_ml41x.h 
#define REG_HIGH 	(u32) XPAR_komponente_0_HIGHADDR // defined in xparameters_ml41x.h 

#define reg0_upper	(u32) komponente_SLV_REG0_OFFSET // 32-bit register / defined in komponente.h
#define reg1_upper	(u32) komponente_SLV_REG1_OFFSET // 32-bit register / defined in komponente.h
#define reg2_upper	(u32) komponente_SLV_REG2_OFFSET // 32-bit register / defined in komponente.h

static int __init meintreiber_init(void)
{
	int rtn, upper;

	reg_remapped_address = (u32) ioremap(REG_BASE, REG_HIGH - REG_BASE + 1);
	if (!reg_remapped_address) {
		printk("error mapping registers\n");
		return -ENOMEM;
	}

	upper = in_be32(reg_mapped_address + reg1_upper);
	printk("Data in: %.8X\n", upper);
	return 0;
}

g.