Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F168063615
D19775.id.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
2 KB
Referenced Files
None
Subscribers
None
D19775.id.diff
View Options
Index: head/sys/riscv/riscv/plic.c
===================================================================
--- head/sys/riscv/riscv/plic.c
+++ head/sys/riscv/riscv/plic.c
@@ -52,9 +52,9 @@
#include "pic_if.h"
-#define PLIC_NIRQS 32
+#define PLIC_MAX_IRQS 2048
#define PLIC_PRIORITY(n) (0x000000 + (n) * 0x4)
-#define PLIC_ENABLE(n, h) (0x002000 + (h) * 0x80 + (n) / 32)
+#define PLIC_ENABLE(n, h) (0x002000 + (h) * 0x80 + 4 * ((n) / 32))
#define PLIC_THRESHOLD(h) (0x200000 + (h) * 0x1000 + 0x0)
#define PLIC_CLAIM(h) (0x200000 + (h) * 0x1000 + 0x4)
@@ -66,7 +66,8 @@
struct plic_softc {
device_t dev;
struct resource * intc_res;
- struct plic_irqsrc isrcs[PLIC_NIRQS];
+ struct plic_irqsrc isrcs[PLIC_MAX_IRQS];
+ int ndev;
};
#define RD4(sc, reg) \
@@ -158,7 +159,7 @@
return (ENOTSUP);
daf = (struct intr_map_data_fdt *)data;
- if (daf->ncells != 1 || daf->cells[0] >= PLIC_NIRQS)
+ if (daf->ncells != 1 || daf->cells[0] > sc->ndev)
return (EINVAL);
*isrcp = &sc->isrcs[daf->cells[0]].isrc;
@@ -189,6 +190,7 @@
struct intr_pic *pic;
uint32_t irq;
const char *name;
+ phandle_t node;
phandle_t xref;
uint32_t cpu;
int error;
@@ -198,6 +200,20 @@
sc->dev = dev;
+ node = ofw_bus_get_node(dev);
+ if ((OF_getencprop(node, "riscv,ndev", &sc->ndev,
+ sizeof(sc->ndev))) < 0) {
+ device_printf(dev,
+ "Error: could not get number of devices\n");
+ return (ENXIO);
+ }
+
+ if (sc->ndev >= PLIC_MAX_IRQS) {
+ device_printf(dev,
+ "Error: invalid ndev (%d)\n", sc->ndev);
+ return (ENXIO);
+ }
+
/* Request memory resources */
rid = 0;
sc->intc_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
@@ -211,7 +227,7 @@
isrcs = sc->isrcs;
name = device_get_nameunit(sc->dev);
cpu = PCPU_GET(cpuid);
- for (irq = 0; irq < PLIC_NIRQS; irq++) {
+ for (irq = 1; irq <= sc->ndev; irq++) {
isrcs[irq].irq = irq;
error = intr_isrc_register(&isrcs[irq].isrc, sc->dev,
0, "%s,%u", name, irq);
@@ -223,7 +239,7 @@
}
WR4(sc, PLIC_THRESHOLD(cpu), 0);
- xref = OF_xref_from_node(ofw_bus_get_node(sc->dev));
+ xref = OF_xref_from_node(node);
pic = intr_pic_register(sc->dev, xref);
if (pic == NULL)
return (ENXIO);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Thu, Aug 27, 5:09 AM (1 h, 43 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
37353977
Default Alt Text
D19775.id.diff (2 KB)
Attached To
Mode
D19775: Fix PLIC number of devices supported
Attached
Detach File
Event Timeline
Log In to Comment