Skip to content

Commit

Permalink
[SPARC64]: Probe virtual-devices root node on sun4v.
Browse files Browse the repository at this point in the history
This is where we learn how to get the interrupts
for things like the hypervisor console device.

Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
David S. Miller committed Mar 20, 2006
1 parent d5eb400 commit e77227e
Show file tree
Hide file tree
Showing 2 changed files with 76 additions and 0 deletions.
58 changes: 58 additions & 0 deletions arch/sparc64/kernel/devices.c
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
#include <linux/string.h>
#include <linux/spinlock.h>
#include <linux/errno.h>
#include <linux/bootmem.h>

#include <asm/page.h>
#include <asm/oplib.h>
Expand All @@ -20,6 +21,7 @@
#include <asm/spitfire.h>
#include <asm/timer.h>
#include <asm/cpudata.h>
#include <asm/vdev.h>

/* Used to synchronize acceses to NatSemi SUPER I/O chip configure
* operations in asm/ns87303.h
Expand All @@ -29,6 +31,61 @@ DEFINE_SPINLOCK(ns87303_lock);
extern void cpu_probe(void);
extern void central_probe(void);

u32 sun4v_vdev_devhandle;
int sun4v_vdev_root;
struct linux_prom_pci_intmap *sun4v_vdev_intmap;
int sun4v_vdev_num_intmap;
struct linux_prom_pci_intmap sun4v_vdev_intmask;

static void __init sun4v_virtual_device_probe(void)
{
struct linux_prom64_registers regs;
struct linux_prom_pci_intmap *ip;
int node, sz, err;

if (tlb_type != hypervisor)
return;

node = prom_getchild(prom_root_node);
node = prom_searchsiblings(node, "virtual-devices");
if (!node) {
prom_printf("SUN4V: Fatal error, no virtual-devices node.\n");
prom_halt();
}

sun4v_vdev_root = node;

prom_getproperty(node, "reg", (char *)&regs, sizeof(regs));
sun4v_vdev_devhandle = (regs.phys_addr >> 32UL) & 0x0fffffff;

sz = sizeof(*ip) * 64;
sun4v_vdev_intmap = ip = alloc_bootmem_low_pages(sz);
if (!sun4v_vdev_intmap) {
prom_printf("SUN4V: Error, cannot allocate vdev intmap.\n");
prom_halt();
}

err = prom_getproperty(node, "interrupt-map", (char *) ip, sz);
if (err == -1) {
prom_printf("SUN4V: Fatal error, no vdev interrupt-map.\n");
prom_halt();
}

sun4v_vdev_num_intmap = err / sizeof(*ip);

err = prom_getproperty(node, "interrupt-map-mask",
(char *) &sun4v_vdev_intmask,
sizeof(sun4v_vdev_intmask));
if (err == -1) {
prom_printf("SUN4V: Fatal error, no vdev "
"interrupt-map-mask.\n");
prom_halt();
}

printk("SUN4V: virtual-devices devhandle[%x]\n",
sun4v_vdev_devhandle);
}

static const char *cpu_mid_prop(void)
{
if (tlb_type == spitfire)
Expand Down Expand Up @@ -177,6 +234,7 @@ void __init device_scan(void)
}
#endif

sun4v_virtual_device_probe();
central_probe();

cpu_probe();
Expand Down
18 changes: 18 additions & 0 deletions include/asm-sparc64/vdev.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
/* vdev.h: SUN4V virtual device interfaces and defines.
*
* Copyright (C) 2006 David S. Miller <davem@davemloft.net>
*/

#ifndef _SPARC64_VDEV_H
#define _SPARC64_VDEV_H

#include <linux/types.h>
#include <asm/oplib.h>

extern u32 sun4v_vdev_devhandle;
extern int sun4v_vdev_root;
extern struct linux_prom_pci_intmap *sun4v_vdev_intmap;
extern int sun4v_vdev_num_intmap;
extern struct linux_prom_pci_intmap sun4v_vdev_intmask;

#endif /* !(_SPARC64_VDEV_H) */

0 comments on commit e77227e

Please sign in to comment.