Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 21438
b: refs/heads/master
c: e77227e
h: refs/heads/master
v: v3
  • Loading branch information
David S. Miller committed Mar 20, 2006
1 parent 5239faa commit 2f07e2c
Show file tree
Hide file tree
Showing 3 changed files with 77 additions and 1 deletion.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: d5eb4004303b4dd04ec83b926b5fc2d9ceda4b2e
refs/heads/master: e77227eb4e17591a6a511b9c0ff6e8ad7350c575
58 changes: 58 additions & 0 deletions trunk/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 trunk/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 2f07e2c

Please sign in to comment.