dm: core: add functions to get memory-mapped I/O addresses
Signed-off-by: Álvaro Fernández Rojas <noltari@gmail.com> Reviewed-by: Daniel Schwierzeck <daniel.schwierzeck@gmail.com> Signed-off-by: Daniel Schwierzeck <daniel.schwierzeck@gmail.com> Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
		
							parent
							
								
									c3c8638804
								
							
						
					
					
						commit
						30a90f56c3
					
				|  | @ -136,6 +136,21 @@ void *devfdt_get_addr_ptr(struct udevice *dev) | ||||||
| 	return (void *)(uintptr_t)devfdt_get_addr_index(dev, 0); | 	return (void *)(uintptr_t)devfdt_get_addr_index(dev, 0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void *devfdt_remap_addr_index(struct udevice *dev, int index) | ||||||
|  | { | ||||||
|  | 	fdt_addr_t addr = devfdt_get_addr(dev); | ||||||
|  | 
 | ||||||
|  | 	if (addr == FDT_ADDR_T_NONE) | ||||||
|  | 		return NULL; | ||||||
|  | 
 | ||||||
|  | 	return map_physmem(addr, 0, MAP_NOCACHE); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void *devfdt_remap_addr(struct udevice *dev) | ||||||
|  | { | ||||||
|  | 	return devfdt_remap_addr_index(dev, 0); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void *devfdt_map_physmem(struct udevice *dev, unsigned long size) | void *devfdt_map_physmem(struct udevice *dev, unsigned long size) | ||||||
| { | { | ||||||
| 	fdt_addr_t addr = devfdt_get_addr(dev); | 	fdt_addr_t addr = devfdt_get_addr(dev); | ||||||
|  |  | ||||||
|  | @ -4,6 +4,8 @@ | ||||||
|  * Written by Simon Glass <sjg@chromium.org> |  * Written by Simon Glass <sjg@chromium.org> | ||||||
|  */ |  */ | ||||||
| 
 | 
 | ||||||
|  | #include <asm/types.h> | ||||||
|  | #include <asm/io.h> | ||||||
| #include <common.h> | #include <common.h> | ||||||
| #include <dm.h> | #include <dm.h> | ||||||
| #include <mapmem.h> | #include <mapmem.h> | ||||||
|  | @ -57,6 +59,16 @@ fdt_addr_t dev_read_addr_index(struct udevice *dev, int index) | ||||||
| 		return devfdt_get_addr_index(dev, index); | 		return devfdt_get_addr_index(dev, index); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void *dev_remap_addr_index(struct udevice *dev, int index) | ||||||
|  | { | ||||||
|  | 	fdt_addr_t addr = dev_read_addr_index(dev, index); | ||||||
|  | 
 | ||||||
|  | 	if (addr == FDT_ADDR_T_NONE) | ||||||
|  | 		return NULL; | ||||||
|  | 
 | ||||||
|  | 	return map_physmem(addr, 0, MAP_NOCACHE); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| fdt_addr_t dev_read_addr(struct udevice *dev) | fdt_addr_t dev_read_addr(struct udevice *dev) | ||||||
| { | { | ||||||
| 	return dev_read_addr_index(dev, 0); | 	return dev_read_addr_index(dev, 0); | ||||||
|  | @ -69,6 +81,11 @@ void *dev_read_addr_ptr(struct udevice *dev) | ||||||
| 	return (addr == FDT_ADDR_T_NONE) ? NULL : map_sysmem(addr, 0); | 	return (addr == FDT_ADDR_T_NONE) ? NULL : map_sysmem(addr, 0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void *dev_remap_addr(struct udevice *dev) | ||||||
|  | { | ||||||
|  | 	return dev_remap_addr_index(dev, 0); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| fdt_addr_t dev_read_addr_size(struct udevice *dev, const char *property, | fdt_addr_t dev_read_addr_size(struct udevice *dev, const char *property, | ||||||
| 			      fdt_size_t *sizep) | 			      fdt_size_t *sizep) | ||||||
| { | { | ||||||
|  |  | ||||||
|  | @ -33,6 +33,28 @@ fdt_addr_t devfdt_get_addr(struct udevice *dev); | ||||||
|  */ |  */ | ||||||
| void *devfdt_get_addr_ptr(struct udevice *dev); | void *devfdt_get_addr_ptr(struct udevice *dev); | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * devfdt_remap_addr() - Return pointer to the memory-mapped I/O address | ||||||
|  |  *                           of the reg property of a device | ||||||
|  |  * | ||||||
|  |  * @dev: Pointer to a device | ||||||
|  |  * | ||||||
|  |  * @return Pointer to addr, or NULL if there is no such property | ||||||
|  |  */ | ||||||
|  | void *devfdt_remap_addr(struct udevice *dev); | ||||||
|  | 
 | ||||||
|  | /**
 | ||||||
|  |  * devfdt_remap_addr_index() - Return indexed pointer to the memory-mapped | ||||||
|  |  *                                 I/O address of the reg property of a device | ||||||
|  |  * @index: the 'reg' property can hold a list of <addr, size> pairs | ||||||
|  |  *	   and @index is used to select which one is required | ||||||
|  |  * | ||||||
|  |  * @dev: Pointer to a device | ||||||
|  |  * | ||||||
|  |  * @return Pointer to addr, or NULL if there is no such property | ||||||
|  |  */ | ||||||
|  | void *devfdt_remap_addr_index(struct udevice *dev, int index); | ||||||
|  | 
 | ||||||
| /**
 | /**
 | ||||||
|  * devfdt_map_physmem() - Read device address from reg property of the |  * devfdt_map_physmem() - Read device address from reg property of the | ||||||
|  *                     device node and map the address into CPU address |  *                     device node and map the address into CPU address | ||||||
|  |  | ||||||
|  | @ -112,6 +112,18 @@ int dev_read_size(struct udevice *dev, const char *propname); | ||||||
|  */ |  */ | ||||||
| fdt_addr_t dev_read_addr_index(struct udevice *dev, int index); | fdt_addr_t dev_read_addr_index(struct udevice *dev, int index); | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * dev_remap_addr_index() - Get the indexed reg property of a device | ||||||
|  |  *                               as a memory-mapped I/O pointer | ||||||
|  |  * | ||||||
|  |  * @dev: Device to read from | ||||||
|  |  * @index: the 'reg' property can hold a list of <addr, size> pairs | ||||||
|  |  *	   and @index is used to select which one is required | ||||||
|  |  * | ||||||
|  |  * @return pointer or NULL if not found | ||||||
|  |  */ | ||||||
|  | void *dev_remap_addr_index(struct udevice *dev, int index); | ||||||
|  | 
 | ||||||
| /**
 | /**
 | ||||||
|  * dev_read_addr() - Get the reg property of a device |  * dev_read_addr() - Get the reg property of a device | ||||||
|  * |  * | ||||||
|  | @ -131,6 +143,16 @@ fdt_addr_t dev_read_addr(struct udevice *dev); | ||||||
|  */ |  */ | ||||||
| void *dev_read_addr_ptr(struct udevice *dev); | void *dev_read_addr_ptr(struct udevice *dev); | ||||||
| 
 | 
 | ||||||
|  | /**
 | ||||||
|  |  * dev_remap_addr() - Get the reg property of a device as a | ||||||
|  |  *                         memory-mapped I/O pointer | ||||||
|  |  * | ||||||
|  |  * @dev: Device to read from | ||||||
|  |  * | ||||||
|  |  * @return pointer or NULL if not found | ||||||
|  |  */ | ||||||
|  | void *dev_remap_addr(struct udevice *dev); | ||||||
|  | 
 | ||||||
| /**
 | /**
 | ||||||
|  * dev_read_addr_size() - get address and size from a device property |  * dev_read_addr_size() - get address and size from a device property | ||||||
|  * |  * | ||||||
|  | @ -482,6 +504,16 @@ static inline void *dev_read_addr_ptr(struct udevice *dev) | ||||||
| 	return devfdt_get_addr_ptr(dev); | 	return devfdt_get_addr_ptr(dev); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | static inline void *dev_remap_addr(struct udevice *dev) | ||||||
|  | { | ||||||
|  | 	return devfdt_remap_addr(dev); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static inline void *dev_remap_addr_index(struct udevice *dev, int index) | ||||||
|  | { | ||||||
|  | 	return devfdt_remap_addr_index(dev, index); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| static inline fdt_addr_t dev_read_addr_size(struct udevice *dev, | static inline fdt_addr_t dev_read_addr_size(struct udevice *dev, | ||||||
| 					    const char *propname, | 					    const char *propname, | ||||||
| 					    fdt_size_t *sizep) | 					    fdt_size_t *sizep) | ||||||
|  |  | ||||||
|  | @ -461,3 +461,45 @@ static int dm_test_fdt_translation(struct unit_test_state *uts) | ||||||
| 	return 0; | 	return 0; | ||||||
| } | } | ||||||
| DM_TEST(dm_test_fdt_translation, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT); | DM_TEST(dm_test_fdt_translation, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT); | ||||||
|  | 
 | ||||||
|  | /* Test devfdt_remap_addr_index() */ | ||||||
|  | static int dm_test_fdt_remap_addr_flat(struct unit_test_state *uts) | ||||||
|  | { | ||||||
|  | 	struct udevice *dev; | ||||||
|  | 	fdt_addr_t addr; | ||||||
|  | 	void *paddr; | ||||||
|  | 
 | ||||||
|  | 	ut_assertok(uclass_find_device_by_seq(UCLASS_TEST_DUMMY, 0, true, &dev)); | ||||||
|  | 
 | ||||||
|  | 	addr = devfdt_get_addr(dev); | ||||||
|  | 	ut_asserteq(0x8000, addr); | ||||||
|  | 
 | ||||||
|  | 	paddr = map_physmem(addr, 0, MAP_NOCACHE); | ||||||
|  | 	ut_assertnonnull(paddr); | ||||||
|  | 	ut_asserteq_ptr(paddr, devfdt_remap_addr(dev)); | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | DM_TEST(dm_test_fdt_remap_addr_flat, | ||||||
|  | 	DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT | DM_TESTF_FLAT_TREE); | ||||||
|  | 
 | ||||||
|  | /* Test dev_remap_addr_index() */ | ||||||
|  | static int dm_test_fdt_remap_addr_live(struct unit_test_state *uts) | ||||||
|  | { | ||||||
|  | 	struct udevice *dev; | ||||||
|  | 	fdt_addr_t addr; | ||||||
|  | 	void *paddr; | ||||||
|  | 
 | ||||||
|  | 	ut_assertok(uclass_find_device_by_seq(UCLASS_TEST_DUMMY, 0, true, &dev)); | ||||||
|  | 
 | ||||||
|  | 	addr = dev_read_addr(dev); | ||||||
|  | 	ut_asserteq(0x8000, addr); | ||||||
|  | 
 | ||||||
|  | 	paddr = map_physmem(addr, 0, MAP_NOCACHE); | ||||||
|  | 	ut_assertnonnull(paddr); | ||||||
|  | 	ut_asserteq_ptr(paddr, dev_remap_addr(dev)); | ||||||
|  | 
 | ||||||
|  | 	return 0; | ||||||
|  | } | ||||||
|  | DM_TEST(dm_test_fdt_remap_addr_live, | ||||||
|  | 	DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT); | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue