Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/arm/annapurna/alpine/alpine_ccu.c
39536 views
1
/*-
2
* Copyright (c) 2015,2016 Annapurna Labs Ltd. and affiliates
3
* All rights reserved.
4
*
5
* Developed by Semihalf.
6
*
7
* Redistribution and use in source and binary forms, with or without
8
* modification, are permitted provided that the following conditions
9
* are met:
10
* 1. Redistributions of source code must retain the above copyright
11
* notice, this list of conditions and the following disclaimer.
12
* 2. Redistributions in binary form must reproduce the above copyright
13
* notice, this list of conditions and the following disclaimer in the
14
* documentation and/or other materials provided with the distribution.
15
*
16
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26
* SUCH DAMAGE.
27
*/
28
29
#include <sys/param.h>
30
#include <sys/bus.h>
31
#include <sys/conf.h>
32
#include <sys/rman.h>
33
#include <sys/kernel.h>
34
#include <sys/module.h>
35
#include <sys/resource.h>
36
#include <sys/systm.h>
37
38
#include <machine/bus.h>
39
#include <dev/ofw/ofw_bus_subr.h>
40
41
#define AL_CCU_SNOOP_CONTROL_IOFAB_0_OFFSET 0x4000
42
#define AL_CCU_SNOOP_CONTROL_IOFAB_1_OFFSET 0x5000
43
#define AL_CCU_SPECULATION_CONTROL_OFFSET 0x4
44
45
static struct resource_spec al_ccu_spec[] = {
46
{ SYS_RES_MEMORY, 0, RF_ACTIVE },
47
{ -1, 0 }
48
};
49
50
struct al_ccu_softc {
51
struct resource *res;
52
};
53
54
static int al_ccu_probe(device_t dev);
55
static int al_ccu_attach(device_t dev);
56
static int al_ccu_detach(device_t dev);
57
58
static device_method_t al_ccu_methods[] = {
59
DEVMETHOD(device_probe, al_ccu_probe),
60
DEVMETHOD(device_attach, al_ccu_attach),
61
DEVMETHOD(device_detach, al_ccu_detach),
62
{ 0, 0 }
63
};
64
65
static driver_t al_ccu_driver = {
66
"ccu",
67
al_ccu_methods,
68
sizeof(struct al_ccu_softc)
69
};
70
71
EARLY_DRIVER_MODULE(al_ccu, simplebus, al_ccu_driver, 0, 0,
72
BUS_PASS_CPU + BUS_PASS_ORDER_MIDDLE);
73
EARLY_DRIVER_MODULE(al_ccu, ofwbus, al_ccu_driver, 0, 0,
74
BUS_PASS_CPU + BUS_PASS_ORDER_MIDDLE);
75
76
static int
77
al_ccu_probe(device_t dev)
78
{
79
80
if (!ofw_bus_status_okay(dev))
81
return (ENXIO);
82
83
if (!ofw_bus_is_compatible(dev, "annapurna-labs,al-ccu"))
84
return (ENXIO);
85
86
device_set_desc(dev, "Alpine CCU");
87
88
return (BUS_PROBE_DEFAULT);
89
}
90
91
static int
92
al_ccu_attach(device_t dev)
93
{
94
struct al_ccu_softc *sc;
95
int err;
96
97
sc = device_get_softc(dev);
98
99
err = bus_alloc_resources(dev, al_ccu_spec, &sc->res);
100
if (err != 0) {
101
device_printf(dev, "could not allocate resources\n");
102
return (err);
103
}
104
105
/* Enable cache snoop */
106
bus_write_4(sc->res, AL_CCU_SNOOP_CONTROL_IOFAB_0_OFFSET, 1);
107
bus_write_4(sc->res, AL_CCU_SNOOP_CONTROL_IOFAB_1_OFFSET, 1);
108
109
/* Disable speculative fetches from masters */
110
bus_write_4(sc->res, AL_CCU_SPECULATION_CONTROL_OFFSET, 7);
111
112
return (0);
113
}
114
115
static int
116
al_ccu_detach(device_t dev)
117
{
118
struct al_ccu_softc *sc;
119
120
sc = device_get_softc(dev);
121
122
bus_release_resources(dev, al_ccu_spec, &sc->res);
123
124
return (0);
125
}
126
127