Loading arch/sparc64/kernel/irq.c +13 −5 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ #include <asm/iommu.h> #include <asm/upa.h> #include <asm/oplib.h> #include <asm/prom.h> #include <asm/timer.h> #include <asm/smp.h> #include <asm/starfire.h> Loading Loading @@ -635,23 +636,30 @@ static u64 prom_limit0, prom_limit1; static void map_prom_timers(void) { unsigned int addr[3]; struct device_node *dp; unsigned int *addr; int tnode, err; /* PROM timer node hangs out in the top level of device siblings... */ tnode = prom_finddevice("/counter-timer"); dp = of_find_node_by_path("/"); dp = dp->child; while (dp) { if (!strcmp(dp->name, "counter-timer")) break; dp = dp->sibling; } /* Assume if node is not present, PROM uses different tick mechanism * which we should not care about. */ if (tnode == 0 || tnode == -1) { if (!dp) { prom_timers = (struct sun5_timer *) 0; return; } /* If PROM is really using this, it must be mapped by him. */ err = prom_getproperty(tnode, "address", (char *)addr, sizeof(addr)); if (err == -1) { addr = of_get_property(dp, "address", NULL); if (!addr) { prom_printf("PROM does not have timer mapped, trying to continue.\n"); prom_timers = (struct sun5_timer *) 0; return; Loading arch/sparc64/kernel/sbus.c +15 −14 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ #include <asm/cache.h> #include <asm/dma.h> #include <asm/irq.h> #include <asm/prom.h> #include <asm/starfire.h> #include "iommu_common.h" Loading Loading @@ -1098,24 +1099,25 @@ static void __init sysio_register_error_handlers(struct sbus_bus *sbus) } /* Boot time initialization. */ void __init sbus_iommu_init(int prom_node, struct sbus_bus *sbus) void __init sbus_iommu_init(int __node, struct sbus_bus *sbus) { struct linux_prom64_registers rprop; struct linux_prom64_registers *pr; struct device_node *dp; struct sbus_iommu *iommu; unsigned long regs, tsb_base; u64 control; int err, i; int i; dp = of_find_node_by_phandle(__node); sbus->portid = prom_getintdefault(sbus->prom_node, "upa-portid", -1); sbus->portid = of_getintprop_default(dp, "upa-portid", -1); err = prom_getproperty(prom_node, "reg", (char *)&rprop, sizeof(rprop)); if (err < 0) { pr = of_get_property(dp, "reg", NULL); if (!pr) { prom_printf("sbus_iommu_init: Cannot map SYSIO control registers.\n"); prom_halt(); } regs = rprop.phys_addr; regs = pr->phys_addr; iommu = kmalloc(sizeof(*iommu) + SMP_CACHE_BYTES, GFP_ATOMIC); if (iommu == NULL) { Loading Loading @@ -1228,12 +1230,11 @@ void __init sbus_iommu_init(int prom_node, struct sbus_bus *sbus) void sbus_fill_device_irq(struct sbus_dev *sdev) { struct linux_prom_irqs irqs[PROMINTR_MAX]; int len; struct device_node *dp = of_find_node_by_phandle(sdev->prom_node); struct linux_prom_irqs *irqs; len = prom_getproperty(sdev->prom_node, "interrupts", (char *) irqs, sizeof(irqs)); if (len == -1 || len == 0) { irqs = of_get_property(dp, "interrupts", NULL); if (!irqs) { sdev->irqs[0] = 0; sdev->num_irqs = 0; } else { Loading arch/sparc64/solaris/misc.c +22 −12 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ #include <asm/oplib.h> #include <asm/idprom.h> #include <asm/smp.h> #include <asm/prom.h> #include "conv.h" Loading Loading @@ -194,13 +195,16 @@ static char *machine(void) } } static char *platform(char *buffer) static char *platform(char *buffer, int sz) { struct device_node *dp = of_find_node_by_path("/"); int len; *buffer = 0; len = prom_getproperty(prom_root_node, "name", buffer, 256); if(len > 0) len = strlen(dp->name); if (len > sz) len = sz; memcpy(buffer, dp->name, len); buffer[len] = 0; if (*buffer) { char *p; Loading @@ -213,16 +217,22 @@ static char *platform(char *buffer) return "sun4u"; } static char *serial(char *buffer) static char *serial(char *buffer, int sz) { int node = prom_getchild(prom_root_node); struct device_node *dp = of_find_node_by_path("/options"); int len; node = prom_searchsiblings(node, "options"); *buffer = 0; len = prom_getproperty(node, "system-board-serial#", buffer, 256); if(len > 0) if (dp) { char *val = of_get_property(dp, "system-board-serial#", &len); if (val && len > 0) { if (len > sz) len = sz; memcpy(buffer, val, len); buffer[len] = 0; } } if (!*buffer) return "4512348717234"; else Loading Loading @@ -305,8 +315,8 @@ asmlinkage int solaris_sysinfo(int cmd, u32 buf, s32 count) case SI_MACHINE: r = machine(); break; case SI_ARCHITECTURE: r = "sparc"; break; case SI_HW_PROVIDER: r = "Sun_Microsystems"; break; case SI_HW_SERIAL: r = serial(buffer); break; case SI_PLATFORM: r = platform(buffer); break; case SI_HW_SERIAL: r = serial(buffer, sizeof(buffer)); break; case SI_PLATFORM: r = platform(buffer, sizeof(buffer)); break; case SI_SRPC_DOMAIN: r = ""; break; case SI_VERSION: r = "Generic"; break; default: return -EINVAL; Loading Loading
arch/sparc64/kernel/irq.c +13 −5 Original line number Diff line number Diff line Loading @@ -34,6 +34,7 @@ #include <asm/iommu.h> #include <asm/upa.h> #include <asm/oplib.h> #include <asm/prom.h> #include <asm/timer.h> #include <asm/smp.h> #include <asm/starfire.h> Loading Loading @@ -635,23 +636,30 @@ static u64 prom_limit0, prom_limit1; static void map_prom_timers(void) { unsigned int addr[3]; struct device_node *dp; unsigned int *addr; int tnode, err; /* PROM timer node hangs out in the top level of device siblings... */ tnode = prom_finddevice("/counter-timer"); dp = of_find_node_by_path("/"); dp = dp->child; while (dp) { if (!strcmp(dp->name, "counter-timer")) break; dp = dp->sibling; } /* Assume if node is not present, PROM uses different tick mechanism * which we should not care about. */ if (tnode == 0 || tnode == -1) { if (!dp) { prom_timers = (struct sun5_timer *) 0; return; } /* If PROM is really using this, it must be mapped by him. */ err = prom_getproperty(tnode, "address", (char *)addr, sizeof(addr)); if (err == -1) { addr = of_get_property(dp, "address", NULL); if (!addr) { prom_printf("PROM does not have timer mapped, trying to continue.\n"); prom_timers = (struct sun5_timer *) 0; return; Loading
arch/sparc64/kernel/sbus.c +15 −14 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ #include <asm/cache.h> #include <asm/dma.h> #include <asm/irq.h> #include <asm/prom.h> #include <asm/starfire.h> #include "iommu_common.h" Loading Loading @@ -1098,24 +1099,25 @@ static void __init sysio_register_error_handlers(struct sbus_bus *sbus) } /* Boot time initialization. */ void __init sbus_iommu_init(int prom_node, struct sbus_bus *sbus) void __init sbus_iommu_init(int __node, struct sbus_bus *sbus) { struct linux_prom64_registers rprop; struct linux_prom64_registers *pr; struct device_node *dp; struct sbus_iommu *iommu; unsigned long regs, tsb_base; u64 control; int err, i; int i; dp = of_find_node_by_phandle(__node); sbus->portid = prom_getintdefault(sbus->prom_node, "upa-portid", -1); sbus->portid = of_getintprop_default(dp, "upa-portid", -1); err = prom_getproperty(prom_node, "reg", (char *)&rprop, sizeof(rprop)); if (err < 0) { pr = of_get_property(dp, "reg", NULL); if (!pr) { prom_printf("sbus_iommu_init: Cannot map SYSIO control registers.\n"); prom_halt(); } regs = rprop.phys_addr; regs = pr->phys_addr; iommu = kmalloc(sizeof(*iommu) + SMP_CACHE_BYTES, GFP_ATOMIC); if (iommu == NULL) { Loading Loading @@ -1228,12 +1230,11 @@ void __init sbus_iommu_init(int prom_node, struct sbus_bus *sbus) void sbus_fill_device_irq(struct sbus_dev *sdev) { struct linux_prom_irqs irqs[PROMINTR_MAX]; int len; struct device_node *dp = of_find_node_by_phandle(sdev->prom_node); struct linux_prom_irqs *irqs; len = prom_getproperty(sdev->prom_node, "interrupts", (char *) irqs, sizeof(irqs)); if (len == -1 || len == 0) { irqs = of_get_property(dp, "interrupts", NULL); if (!irqs) { sdev->irqs[0] = 0; sdev->num_irqs = 0; } else { Loading
arch/sparc64/solaris/misc.c +22 −12 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ #include <asm/oplib.h> #include <asm/idprom.h> #include <asm/smp.h> #include <asm/prom.h> #include "conv.h" Loading Loading @@ -194,13 +195,16 @@ static char *machine(void) } } static char *platform(char *buffer) static char *platform(char *buffer, int sz) { struct device_node *dp = of_find_node_by_path("/"); int len; *buffer = 0; len = prom_getproperty(prom_root_node, "name", buffer, 256); if(len > 0) len = strlen(dp->name); if (len > sz) len = sz; memcpy(buffer, dp->name, len); buffer[len] = 0; if (*buffer) { char *p; Loading @@ -213,16 +217,22 @@ static char *platform(char *buffer) return "sun4u"; } static char *serial(char *buffer) static char *serial(char *buffer, int sz) { int node = prom_getchild(prom_root_node); struct device_node *dp = of_find_node_by_path("/options"); int len; node = prom_searchsiblings(node, "options"); *buffer = 0; len = prom_getproperty(node, "system-board-serial#", buffer, 256); if(len > 0) if (dp) { char *val = of_get_property(dp, "system-board-serial#", &len); if (val && len > 0) { if (len > sz) len = sz; memcpy(buffer, val, len); buffer[len] = 0; } } if (!*buffer) return "4512348717234"; else Loading Loading @@ -305,8 +315,8 @@ asmlinkage int solaris_sysinfo(int cmd, u32 buf, s32 count) case SI_MACHINE: r = machine(); break; case SI_ARCHITECTURE: r = "sparc"; break; case SI_HW_PROVIDER: r = "Sun_Microsystems"; break; case SI_HW_SERIAL: r = serial(buffer); break; case SI_PLATFORM: r = platform(buffer); break; case SI_HW_SERIAL: r = serial(buffer, sizeof(buffer)); break; case SI_PLATFORM: r = platform(buffer, sizeof(buffer)); break; case SI_SRPC_DOMAIN: r = ""; break; case SI_VERSION: r = "Generic"; break; default: return -EINVAL; Loading