svn commit: r277021 - in projects/arm_intrng/sys: arm/arm arm/include dev/fdt powerpc/powerpc

Nathan Whitehorn nwhitehorn at freebsd.org
Sun Jan 11 20:25:18 UTC 2015


What is this function for, anyway? I'd much prefer some analog to the 
nexus method that implements OFW_BUS_MAP_IRQ() if it's just supposed to 
be a human-readable version of the mapping logic.
-Nathan

On 01/11/15 12:16, Andrew Turner wrote:
> Author: andrew
> Date: Sun Jan 11 20:16:14 2015
> New Revision: 277021
> URL: https://svnweb.freebsd.org/changeset/base/277021
>
> Log:
>    Rework describing interrupts to not use a static buffer and to build on
>    PowerPC with at least the MPC85XX kernel.
>    
>    I don't like the name of fdt_describe_irq, it could be called from non-FDT
>    code. As it's only called from simplebus I'll stick with it for now.
>
> Modified:
>    projects/arm_intrng/sys/arm/arm/intr.c
>    projects/arm_intrng/sys/arm/arm/intrng.c
>    projects/arm_intrng/sys/arm/include/fdt.h
>    projects/arm_intrng/sys/arm/include/intr.h
>    projects/arm_intrng/sys/dev/fdt/fdt_common.h
>    projects/arm_intrng/sys/dev/fdt/simplebus.c
>    projects/arm_intrng/sys/powerpc/powerpc/intr_machdep.c
>
> Modified: projects/arm_intrng/sys/arm/arm/intr.c
> ==============================================================================
> --- projects/arm_intrng/sys/arm/arm/intr.c	Sun Jan 11 20:07:07 2015	(r277020)
> +++ projects/arm_intrng/sys/arm/arm/intr.c	Sun Jan 11 20:16:14 2015	(r277021)
> @@ -126,16 +126,16 @@ arm_fdt_map_irq(phandle_t iparent, pcell
>   
>   	return (interrupt);
>   }
> -#endif
>   
> -const char *
> -arm_describe_irq(int irq)
> +int
> +fdt_describe_irq(char *buf, u_int len, u_int irq)
>   {
> -	static char buffer[8];
> +	int rv;
>   
> -	sprintf(buffer, "%d", irq);
> -	return (buffer);
> +	rv = snprintf(buf, len, "%u", irq);
> +	return (rv);
>   }
> +#endif
>   
>   void
>   arm_setup_irqhandler(const char *name, driver_filter_t *filt,
>
> Modified: projects/arm_intrng/sys/arm/arm/intrng.c
> ==============================================================================
> --- projects/arm_intrng/sys/arm/arm/intrng.c	Sun Jan 11 20:07:07 2015	(r277020)
> +++ projects/arm_intrng/sys/arm/arm/intrng.c	Sun Jan 11 20:16:14 2015	(r277021)
> @@ -55,6 +55,8 @@ __FBSDID("$FreeBSD$");
>   #include <dev/ofw/ofw_bus.h>
>   #include <dev/ofw/ofw_bus_subr.h>
>   
> +#include <dev/fdt/fdt_common.h>
> +
>   #include "pic_if.h"
>   
>   #define	INTRNAME_LEN	(MAXCOMLEN + 1)
> @@ -265,7 +267,7 @@ resirq_encode(u_int picidx, u_int irqidx
>   }
>   
>   static u_int
> -resirq_decode(int resirq, struct arm_intr_controller **pic,
> +resirq_decode(u_int resirq, struct arm_intr_controller **pic,
>      struct arm_intr_handler **pih)
>   {
>   	struct arm_intr_controller *ic;
> @@ -353,15 +355,12 @@ arm_fdt_map_irq(phandle_t icnode, pcell_
>   	return (ih->ih_resirq);
>   }
>   
> -const char *
> -arm_describe_irq(int resirq)
> +int
> +fdt_describe_irq(char *buf, u_int len, u_int resirq)
>   {
>   	struct arm_intr_controller *ic;
>   	struct arm_intr_handler *ih;
> -	int irqidx;
> -	static char buffer[INTRNAME_LEN];
> -
> -	/* XXX static buffer, can this be called after APs released? */
> +	int irqidx, rv;
>   
>   	irqidx = resirq_decode(resirq, &ic, &ih);
>   	KASSERT(ic != NULL, ("%s: bad resirq 0x%08x", resirq));
> @@ -371,13 +370,13 @@ arm_describe_irq(int resirq)
>   		 * IC device name nor interrupt number. All we can do is to
>   		 * use its index (fdt names are unbounded length).
>   		 */
> -		snprintf(buffer, sizeof(buffer), "ic%d.%d", ic->ic_idx, irqidx);
> +		rv = snprintf(buf, len, "ic%d.%d", ic->ic_idx, irqidx);
>   	} else {
>   		KASSERT(ih != NULL, ("%s: no handler for resirq 0x%08x\n", resirq));
> -		snprintf(buffer, sizeof(buffer), "%s.%d",
> +		rv = snprintf(buf, len, "%s.%d",
>   		    device_get_nameunit(ih->ih_ic->ic_dev), ih->ih_hwirq);
>   	}
> -	return (buffer);
> +	return (rv);
>   }
>   
>   void
> @@ -416,7 +415,7 @@ arm_register_pic(device_t dev, int flags
>   	}
>   
>   	/*
> -	 * arm_describe_irq() has to print fake names earlier when the device
> +	 * fdt_describe_irq() has to print fake names earlier when the device
>   	 * issn't registered yet, emit a string that has the same fake name in
>   	 * it, so that earlier output links to this device.
>   	 */
>
> Modified: projects/arm_intrng/sys/arm/include/fdt.h
> ==============================================================================
> --- projects/arm_intrng/sys/arm/include/fdt.h	Sun Jan 11 20:07:07 2015	(r277020)
> +++ projects/arm_intrng/sys/arm/include/fdt.h	Sun Jan 11 20:16:14 2015	(r277021)
> @@ -47,7 +47,6 @@
>   
>   /* Map phandle/intpin pair to global IRQ number */
>   #define	FDT_MAP_IRQ(node, pin)	(arm_fdt_map_irq(node, pin))
> -#define	FDT_DESCRIBE_IRQ(irq)	(arm_describe_irq(irq))
>   
>   #else
>   
> @@ -56,7 +55,6 @@
>   
>   /* Map phandle/intpin pair to global IRQ number */
>   #define	FDT_MAP_IRQ(node, pin)	(pin)
> -#define	FDT_DESCRIBE_IRQ(irq)	(arm_describe_irq(irq))
>   
>   #endif	/* ARM_INTRNG */
>   
>
> Modified: projects/arm_intrng/sys/arm/include/intr.h
> ==============================================================================
> --- projects/arm_intrng/sys/arm/include/intr.h	Sun Jan 11 20:07:07 2015	(r277020)
> +++ projects/arm_intrng/sys/arm/include/intr.h	Sun Jan 11 20:16:14 2015	(r277021)
> @@ -115,7 +115,6 @@ extern int (*arm_config_irq)(int irq, en
>   
>   #endif /* !ARM_INTRNG */
>   
> -const char *arm_describe_irq(int irq);
>   void arm_intrnames_init(void);
>   void arm_irq_memory_barrier(uintptr_t);
>   
>
> Modified: projects/arm_intrng/sys/dev/fdt/fdt_common.h
> ==============================================================================
> --- projects/arm_intrng/sys/dev/fdt/fdt_common.h	Sun Jan 11 20:07:07 2015	(r277020)
> +++ projects/arm_intrng/sys/dev/fdt/fdt_common.h	Sun Jan 11 20:16:14 2015	(r277021)
> @@ -79,6 +79,7 @@ extern u_char fdt_static_dtb;
>   int fdt_addrsize_cells(phandle_t, int *, int *);
>   u_long fdt_data_get(void *, int);
>   int fdt_data_to_res(pcell_t *, int, int, u_long *, u_long *);
> +int fdt_describe_irq(char *, u_int, u_int);
>   phandle_t fdt_find_compatible(phandle_t, const char *, int);
>   phandle_t fdt_depth_search_compatible(phandle_t, const char *, int);
>   int fdt_get_mem_regions(struct mem_region *, int *, uint32_t *);
>
> Modified: projects/arm_intrng/sys/dev/fdt/simplebus.c
> ==============================================================================
> --- projects/arm_intrng/sys/dev/fdt/simplebus.c	Sun Jan 11 20:07:07 2015	(r277020)
> +++ projects/arm_intrng/sys/dev/fdt/simplebus.c	Sun Jan 11 20:16:14 2015	(r277021)
> @@ -38,7 +38,7 @@ __FBSDID("$FreeBSD$");
>   #include <dev/ofw/ofw_bus.h>
>   #include <dev/ofw/ofw_bus_subr.h>
>   
> -#include <machine/fdt.h>
> +#include <dev/fdt/fdt_common.h>
>   
>   struct simplebus_range {
>   	uint64_t bus;
> @@ -408,7 +408,8 @@ static int
>   simplebus_print_irqs(struct resource_list *rl)
>   {
>   	struct resource_list_entry *rle;
> -	int printed, retval;
> +	int err, printed, retval;
> +	char buf[16];
>   
>   	printed = 0;
>   	retval = 0;
> @@ -417,8 +418,11 @@ simplebus_print_irqs(struct resource_lis
>   		if (rle->type != SYS_RES_IRQ)
>   			continue;
>   
> -		retval += printf("%s", printed ? "," : " irq ");
> -		retval += printf("%s", FDT_DESCRIBE_IRQ(rle->start));
> +		err = fdt_describe_irq(buf, sizeof(buf), rle->start);
> +		if (err < 0)
> +			snprintf(buf, sizeof(buf), "???");
> +
> +		retval += printf("%s%s", printed ? "," : " irq ", buf);
>   		printed++;
>   	}
>   
>
> Modified: projects/arm_intrng/sys/powerpc/powerpc/intr_machdep.c
> ==============================================================================
> --- projects/arm_intrng/sys/powerpc/powerpc/intr_machdep.c	Sun Jan 11 20:07:07 2015	(r277020)
> +++ projects/arm_intrng/sys/powerpc/powerpc/intr_machdep.c	Sun Jan 11 20:16:14 2015	(r277021)
> @@ -61,6 +61,7 @@
>    */
>   
>   #include "opt_isa.h"
> +#include "opt_platform.h"
>   
>   #include <sys/param.h>
>   #include <sys/systm.h>
> @@ -85,6 +86,10 @@
>   #include <machine/smp.h>
>   #include <machine/trap.h>
>   
> +#ifdef FDT
> +#include <dev/fdt/fdt_common.h>
> +#endif
> +
>   #include "pic_if.h"
>   
>   #define	MAX_STRAY_LOG	5
> @@ -604,3 +609,12 @@ stray:
>   	if (i != NULL)
>   		PIC_MASK(i->pic, i->intline);
>   }
> +
> +#ifdef FDT
> +int
> +fdt_describe_irq(char *buf, u_int len, u_int irq)
> +{
> +
> +	return (snprintf(buf, len, "%u", irq));
> +}
> +#endif
>



More information about the svn-src-projects mailing list