Changeset View
Changeset View
Standalone View
Standalone View
head/sys/dev/ofw/ofw_bus_subr.c
Show First 20 Lines • Show All 380 Lines • ▼ Show 20 Lines | ofw_bus_search_intrmap(void *intr, int intrsz, void *regs, int physsz, | ||||
phandle_t parent; | phandle_t parent; | ||||
uint8_t *ref = maskbuf; | uint8_t *ref = maskbuf; | ||||
uint8_t *uiintr = intr; | uint8_t *uiintr = intr; | ||||
uint8_t *uiregs = regs; | uint8_t *uiregs = regs; | ||||
uint8_t *uiimapmsk = imapmsk; | uint8_t *uiimapmsk = imapmsk; | ||||
uint8_t *mptr; | uint8_t *mptr; | ||||
pcell_t paddrsz; | pcell_t paddrsz; | ||||
pcell_t pintrsz; | pcell_t pintrsz; | ||||
int i, rsz, tsz; | int i, tsz; | ||||
rsz = -1; | |||||
if (imapmsk != NULL) { | if (imapmsk != NULL) { | ||||
for (i = 0; i < physsz; i++) | for (i = 0; i < physsz; i++) | ||||
ref[i] = uiregs[i] & uiimapmsk[i]; | ref[i] = uiregs[i] & uiimapmsk[i]; | ||||
for (i = 0; i < intrsz; i++) | for (i = 0; i < intrsz; i++) | ||||
ref[physsz + i] = uiintr[i] & uiimapmsk[physsz + i]; | ref[physsz + i] = uiintr[i] & uiimapmsk[physsz + i]; | ||||
} else { | } else { | ||||
bcopy(regs, ref, physsz); | bcopy(regs, ref, physsz); | ||||
bcopy(intr, ref + physsz, intrsz); | bcopy(intr, ref + physsz, intrsz); | ||||
Show All 40 Lines | |||||
} | } | ||||
int | int | ||||
ofw_bus_msimap(phandle_t node, uint16_t pci_rid, phandle_t *msi_parent, | ofw_bus_msimap(phandle_t node, uint16_t pci_rid, phandle_t *msi_parent, | ||||
uint32_t *msi_rid) | uint32_t *msi_rid) | ||||
{ | { | ||||
pcell_t *map, mask, msi_base, rid_base, rid_length; | pcell_t *map, mask, msi_base, rid_base, rid_length; | ||||
ssize_t len; | ssize_t len; | ||||
uint32_t masked_rid, rid; | uint32_t masked_rid; | ||||
int err, i; | int err, i; | ||||
/* TODO: This should be OF_searchprop_alloc if we had it */ | /* TODO: This should be OF_searchprop_alloc if we had it */ | ||||
len = OF_getencprop_alloc(node, "msi-map", sizeof(*map), (void **)&map); | len = OF_getencprop_alloc(node, "msi-map", sizeof(*map), (void **)&map); | ||||
if (len < 0) { | if (len < 0) { | ||||
if (msi_parent != NULL) { | if (msi_parent != NULL) { | ||||
*msi_parent = 0; | *msi_parent = 0; | ||||
OF_getencprop(node, "msi-parent", msi_parent, | OF_getencprop(node, "msi-parent", msi_parent, | ||||
sizeof(*msi_parent)); | sizeof(*msi_parent)); | ||||
} | } | ||||
if (msi_rid != NULL) | if (msi_rid != NULL) | ||||
*msi_rid = pci_rid; | *msi_rid = pci_rid; | ||||
return (0); | return (0); | ||||
} | } | ||||
err = ENOENT; | err = ENOENT; | ||||
rid = 0; | |||||
mask = 0xffffffff; | mask = 0xffffffff; | ||||
OF_getencprop(node, "msi-map-mask", &mask, sizeof(mask)); | OF_getencprop(node, "msi-map-mask", &mask, sizeof(mask)); | ||||
masked_rid = pci_rid & mask; | masked_rid = pci_rid & mask; | ||||
for (i = 0; i < len; i += 4) { | for (i = 0; i < len; i += 4) { | ||||
rid_base = map[i + 0]; | rid_base = map[i + 0]; | ||||
rid_length = map[i + 3]; | rid_length = map[i + 3]; | ||||
▲ Show 20 Lines • Show All 491 Lines • Show Last 20 Lines |