regions: add memory region device support
Provide common code for using memory-backed region devices. This allows in-memory buffers to act as a region device. Change-Id: I266cd07bbfa16a427c2b31c512e7c87b77f47718 Signed-off-by: Aaron Durbin <adurbin@chromium.org> Reviewed-on: http://review.coreboot.org/9131 Tested-by: build bot (Jenkins) Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
This commit is contained in:
parent
127525c772
commit
b419c1a87c
|
@ -97,4 +97,23 @@ static inline size_t region_sz(const struct region *r)
|
||||||
return r->size;
|
return r->size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct mem_region_device {
|
||||||
|
char *base;
|
||||||
|
struct region_device rdev;
|
||||||
|
};
|
||||||
|
|
||||||
|
/* Iniitalize at runtime a mem_region_device. This would be used when
|
||||||
|
* the base and size are dynamic or can't be known during linking. */
|
||||||
|
void mem_region_device_init(struct mem_region_device *mdev, void *base,
|
||||||
|
size_t size);
|
||||||
|
|
||||||
|
extern const struct region_device_ops mem_rdev_ops;
|
||||||
|
|
||||||
|
/* Statically initialize mem_region_device. */
|
||||||
|
#define MEM_REGION_DEV_INIT(base_, size_) \
|
||||||
|
{ \
|
||||||
|
.base = (void *)(base_), \
|
||||||
|
.rdev = REGION_DEV_INIT(&mem_rdev_ops, 0, (size_)), \
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* _REGION_H_ */
|
#endif /* _REGION_H_ */
|
||||||
|
|
|
@ -119,3 +119,45 @@ int rdev_chain(struct region_device *child, const struct region_device *parent,
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void mem_region_device_init(struct mem_region_device *mdev, void *base,
|
||||||
|
size_t size)
|
||||||
|
{
|
||||||
|
memset(mdev, 0, sizeof(*mdev));
|
||||||
|
mdev->base = base;
|
||||||
|
mdev->rdev.ops = &mem_rdev_ops;
|
||||||
|
mdev->rdev.region.size = size;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void *mdev_mmap(const struct region_device *rd, size_t offset,
|
||||||
|
size_t size)
|
||||||
|
{
|
||||||
|
const struct mem_region_device *mdev;
|
||||||
|
|
||||||
|
mdev = container_of(rd, typeof(*mdev), rdev);
|
||||||
|
|
||||||
|
return &mdev->base[offset];
|
||||||
|
}
|
||||||
|
|
||||||
|
static int mdev_munmap(const struct region_device *rd, void *mapping)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static ssize_t mdev_readat(const struct region_device *rd, void *b,
|
||||||
|
size_t offset, size_t size)
|
||||||
|
{
|
||||||
|
const struct mem_region_device *mdev;
|
||||||
|
|
||||||
|
mdev = container_of(rd, typeof(*mdev), rdev);
|
||||||
|
|
||||||
|
memcpy(b, &mdev->base[offset], size);
|
||||||
|
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
const struct region_device_ops mem_rdev_ops = {
|
||||||
|
.mmap = mdev_mmap,
|
||||||
|
.munmap = mdev_munmap,
|
||||||
|
.readat = mdev_readat,
|
||||||
|
};
|
||||||
|
|
Loading…
Reference in New Issue