Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/fdt/fdt_common.c
Show First 20 Lines • Show All 146 Lines • ▼ Show 20 Lines | |||||
} | } | ||||
int | int | ||||
fdt_get_range(phandle_t node, int range_id, u_long *base, u_long *size) | fdt_get_range(phandle_t node, int range_id, u_long *base, u_long *size) | ||||
{ | { | ||||
pcell_t ranges[6], *rangesptr; | pcell_t ranges[6], *rangesptr; | ||||
pcell_t addr_cells, size_cells, par_addr_cells; | pcell_t addr_cells, size_cells, par_addr_cells; | ||||
u_long par_bus_addr, pbase, psize; | u_long par_bus_addr, pbase, psize; | ||||
int err, len, tuple_size, tuples; | int err, len; | ||||
if ((fdt_addrsize_cells(node, &addr_cells, &size_cells)) != 0) | if ((fdt_addrsize_cells(node, &addr_cells, &size_cells)) != 0) | ||||
return (ENXIO); | return (ENXIO); | ||||
/* | /* | ||||
* Process 'ranges' property. | * Process 'ranges' property. | ||||
*/ | */ | ||||
par_addr_cells = fdt_parent_addr_cells(node); | par_addr_cells = fdt_parent_addr_cells(node); | ||||
if (par_addr_cells > 2) | if (par_addr_cells > 2) | ||||
Show All 9 Lines | fdt_get_range(phandle_t node, int range_id, u_long *base, u_long *size) | ||||
} | } | ||||
if (!(range_id < len)) | if (!(range_id < len)) | ||||
return (ERANGE); | return (ERANGE); | ||||
if (OF_getprop(node, "ranges", ranges, sizeof(ranges)) <= 0) | if (OF_getprop(node, "ranges", ranges, sizeof(ranges)) <= 0) | ||||
return (EINVAL); | return (EINVAL); | ||||
tuple_size = sizeof(pcell_t) * (addr_cells + par_addr_cells + | |||||
size_cells); | |||||
tuples = len / tuple_size; | |||||
if (par_addr_cells > 2 || addr_cells > 2 || size_cells > 2) | if (par_addr_cells > 2 || addr_cells > 2 || size_cells > 2) | ||||
return (ERANGE); | return (ERANGE); | ||||
*base = 0; | *base = 0; | ||||
*size = 0; | *size = 0; | ||||
rangesptr = &ranges[range_id]; | rangesptr = &ranges[range_id]; | ||||
*base = fdt_data_get((void *)rangesptr, addr_cells); | *base = fdt_data_get((void *)rangesptr, addr_cells); | ||||
▲ Show 20 Lines • Show All 399 Lines • ▼ Show 20 Lines | |||||
} | } | ||||
int | int | ||||
fdt_get_reserved_regions(struct mem_region *mr, int *mrcnt) | fdt_get_reserved_regions(struct mem_region *mr, int *mrcnt) | ||||
{ | { | ||||
pcell_t reserve[FDT_REG_CELLS * FDT_MEM_REGIONS]; | pcell_t reserve[FDT_REG_CELLS * FDT_MEM_REGIONS]; | ||||
pcell_t *reservep; | pcell_t *reservep; | ||||
phandle_t memory, root; | phandle_t memory, root; | ||||
uint32_t memory_size; | |||||
int addr_cells, size_cells; | int addr_cells, size_cells; | ||||
int i, max_size, res_len, rv, tuple_size, tuples; | int i, res_len, rv, tuple_size, tuples; | ||||
max_size = sizeof(reserve); | |||||
root = OF_finddevice("/"); | root = OF_finddevice("/"); | ||||
memory = OF_finddevice("/memory"); | memory = OF_finddevice("/memory"); | ||||
if (memory == -1) { | if (memory == -1) { | ||||
rv = ENXIO; | rv = ENXIO; | ||||
goto out; | goto out; | ||||
} | } | ||||
if ((rv = fdt_addrsize_cells(OF_parent(memory), &addr_cells, | if ((rv = fdt_addrsize_cells(OF_parent(memory), &addr_cells, | ||||
Show All 13 Lines | if (res_len <= 0 || res_len > sizeof(reserve)) { | ||||
goto out; | goto out; | ||||
} | } | ||||
if (OF_getprop(root, "memreserve", reserve, res_len) <= 0) { | if (OF_getprop(root, "memreserve", reserve, res_len) <= 0) { | ||||
rv = ENXIO; | rv = ENXIO; | ||||
goto out; | goto out; | ||||
} | } | ||||
memory_size = 0; | |||||
tuples = res_len / tuple_size; | tuples = res_len / tuple_size; | ||||
reservep = (pcell_t *)&reserve; | reservep = (pcell_t *)&reserve; | ||||
for (i = 0; i < tuples; i++) { | for (i = 0; i < tuples; i++) { | ||||
rv = fdt_data_to_res(reservep, addr_cells, size_cells, | rv = fdt_data_to_res(reservep, addr_cells, size_cells, | ||||
(u_long *)&mr[i].mr_start, (u_long *)&mr[i].mr_size); | (u_long *)&mr[i].mr_start, (u_long *)&mr[i].mr_size); | ||||
if (rv != 0) | if (rv != 0) | ||||
Show All 11 Lines | |||||
int | int | ||||
fdt_get_mem_regions(struct mem_region *mr, int *mrcnt, uint64_t *memsize) | fdt_get_mem_regions(struct mem_region *mr, int *mrcnt, uint64_t *memsize) | ||||
{ | { | ||||
pcell_t reg[FDT_REG_CELLS * FDT_MEM_REGIONS]; | pcell_t reg[FDT_REG_CELLS * FDT_MEM_REGIONS]; | ||||
pcell_t *regp; | pcell_t *regp; | ||||
phandle_t memory; | phandle_t memory; | ||||
uint64_t memory_size; | uint64_t memory_size; | ||||
int addr_cells, size_cells; | int addr_cells, size_cells; | ||||
int i, max_size, reg_len, rv, tuple_size, tuples; | int i, reg_len, rv, tuple_size, tuples; | ||||
max_size = sizeof(reg); | |||||
memory = OF_finddevice("/memory"); | memory = OF_finddevice("/memory"); | ||||
if (memory == -1) { | if (memory == -1) { | ||||
rv = ENXIO; | rv = ENXIO; | ||||
goto out; | goto out; | ||||
} | } | ||||
if ((rv = fdt_addrsize_cells(OF_parent(memory), &addr_cells, | if ((rv = fdt_addrsize_cells(OF_parent(memory), &addr_cells, | ||||
&size_cells)) != 0) | &size_cells)) != 0) | ||||
▲ Show 20 Lines • Show All 70 Lines • Show Last 20 Lines |