Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/powerpc/platforms/wsp/scom_wsp.c
10818 views
1
/*
2
* SCOM backend for WSP
3
*
4
* Copyright 2010 Benjamin Herrenschmidt, IBM Corp.
5
*
6
* This program is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU General Public License
8
* as published by the Free Software Foundation; either version
9
* 2 of the License, or (at your option) any later version.
10
*/
11
12
#include <linux/cpumask.h>
13
#include <linux/io.h>
14
#include <linux/of.h>
15
#include <linux/spinlock.h>
16
#include <linux/types.h>
17
18
#include <asm/cputhreads.h>
19
#include <asm/reg_a2.h>
20
#include <asm/scom.h>
21
#include <asm/udbg.h>
22
23
#include "wsp.h"
24
25
26
static scom_map_t wsp_scom_map(struct device_node *dev, u64 reg, u64 count)
27
{
28
struct resource r;
29
u64 xscom_addr;
30
31
if (!of_get_property(dev, "scom-controller", NULL)) {
32
pr_err("%s: device %s is not a SCOM controller\n",
33
__func__, dev->full_name);
34
return SCOM_MAP_INVALID;
35
}
36
37
if (of_address_to_resource(dev, 0, &r)) {
38
pr_debug("Failed to find SCOM controller address\n");
39
return 0;
40
}
41
42
/* Transform the SCOM address into an XSCOM offset */
43
xscom_addr = ((reg & 0x7f000000) >> 1) | ((reg & 0xfffff) << 3);
44
45
return (scom_map_t)ioremap(r.start + xscom_addr, count << 3);
46
}
47
48
static void wsp_scom_unmap(scom_map_t map)
49
{
50
iounmap((void *)map);
51
}
52
53
static u64 wsp_scom_read(scom_map_t map, u32 reg)
54
{
55
u64 __iomem *addr = (u64 __iomem *)map;
56
57
return in_be64(addr + reg);
58
}
59
60
static void wsp_scom_write(scom_map_t map, u32 reg, u64 value)
61
{
62
u64 __iomem *addr = (u64 __iomem *)map;
63
64
return out_be64(addr + reg, value);
65
}
66
67
static const struct scom_controller wsp_scom_controller = {
68
.map = wsp_scom_map,
69
.unmap = wsp_scom_unmap,
70
.read = wsp_scom_read,
71
.write = wsp_scom_write
72
};
73
74
void scom_init_wsp(void)
75
{
76
scom_init(&wsp_scom_controller);
77
}
78
79