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;
|
||||
}
|
||||
|
||||
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_ */
|
||||
|
|
|
@ -119,3 +119,45 @@ int rdev_chain(struct region_device *child, const struct region_device *parent,
|
|||
|
||||
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