rd_dev
struct vgic_io_device rd_dev = {
return vgic_uaccess(vcpu, &rd_dev, is_write, offset, val);
struct vgic_io_device *rd_dev = &vcpu->arch.vgic_cpu.rd_iodev;
kvm_iodevice_init(&rd_dev->dev, &kvm_io_gic_ops);
rd_dev->base_addr = rd_base;
rd_dev->iodev_type = IODEV_REDIST;
rd_dev->regions = vgic_v3_rd_registers;
rd_dev->nr_regions = ARRAY_SIZE(vgic_v3_rd_registers);
rd_dev->redist_vcpu = vcpu;
2 * SZ_64K, &rd_dev->dev);
struct vgic_io_device *rd_dev = &vcpu->arch.vgic_cpu.rd_iodev;
kvm_io_bus_unregister_dev(vcpu->kvm, KVM_MMIO_BUS, &rd_dev->dev);
rd_dev->rd_host->rd_host_id, rd_dev->rd_dev_id, page_count,
rd_dev->sg_table_count, (unsigned long)page_count * PAGE_SIZE);
rd_dev->sg_table_array = NULL;
rd_dev->sg_table_count = 0;
static int rd_allocate_sgl_table(struct rd_dev *rd_dev, struct rd_dev_sg_table *sg_table,
static int rd_build_device_space(struct rd_dev *rd_dev)
if (rd_dev->rd_page_count <= 0) {
rd_dev->rd_page_count);
if (rd_dev->rd_flags & RDF_NULLIO)
total_sg_needed = rd_dev->rd_page_count;
rd_dev->sg_table_array = sg_table;
rd_dev->sg_table_count = sg_tables;
rc = rd_allocate_sgl_table(rd_dev, sg_table, total_sg_needed, 0x00);
" %u pages in %u tables\n", rd_dev->rd_host->rd_host_id,
rd_dev->rd_dev_id, rd_dev->rd_page_count,
rd_dev->sg_table_count);
static void rd_release_prot_space(struct rd_dev *rd_dev)
if (!rd_dev->sg_prot_array || !rd_dev->sg_prot_count)
page_count = rd_release_sgl_table(rd_dev, rd_dev->sg_prot_array,
rd_dev->sg_prot_count);
rd_dev->rd_host->rd_host_id, rd_dev->rd_dev_id, page_count,
rd_dev->sg_table_count, (unsigned long)page_count * PAGE_SIZE);
rd_dev->sg_prot_array = NULL;
rd_dev->sg_prot_count = 0;
static int rd_build_prot_space(struct rd_dev *rd_dev, int prot_length, int block_size)
if (rd_dev->rd_flags & RDF_NULLIO)
total_sg_needed = (rd_dev->rd_page_count * prot_length / block_size) + 1;
rd_dev->sg_prot_array = sg_table;
rd_dev->sg_prot_count = sg_tables;
rc = rd_allocate_sgl_table(rd_dev, sg_table, total_sg_needed, 0xff);
" %u pages in %u tables\n", rd_dev->rd_host->rd_host_id,
rd_dev->rd_dev_id, total_sg_needed, rd_dev->sg_prot_count);
struct rd_dev *rd_dev;
rd_dev = kzalloc_obj(*rd_dev);
if (!rd_dev)
rd_dev->rd_host = rd_host;
static inline struct rd_dev *RD_DEV(struct se_device *dev)
return &rd_dev->dev;
struct rd_dev *rd_dev = RD_DEV(dev);
if (!(rd_dev->rd_flags & RDF_HAS_PAGE_COUNT)) {
ret = rd_build_device_space(rd_dev);
return container_of(dev, struct rd_dev, dev);
rd_dev->rd_dev_id = rd_host->rd_host_dev_id_count++;
rd_host->rd_host_id, rd_dev->rd_dev_id, rd_dev->rd_page_count,
rd_dev->sg_table_count,
(unsigned long)(rd_dev->rd_page_count * PAGE_SIZE));
rd_release_device_space(rd_dev);
struct rd_dev *rd_dev = RD_DEV(dev);
kfree(rd_dev);
struct rd_dev *rd_dev = RD_DEV(dev);
rd_release_device_space(rd_dev);
static struct rd_dev_sg_table *rd_get_sg_table(struct rd_dev *rd_dev, u32 page)
if (i < rd_dev->sg_table_count) {
sg_table = &rd_dev->sg_table_array[i];
static struct rd_dev_sg_table *rd_get_prot_table(struct rd_dev *rd_dev, u32 page)
if (i < rd_dev->sg_prot_count) {
sg_table = &rd_dev->sg_prot_array[i];
struct rd_dev *dev = RD_DEV(se_dev);
struct rd_dev *dev = RD_DEV(se_dev);
struct rd_dev *rd_dev = RD_DEV(dev);
rd_dev->rd_page_count = arg;
" Count: %u\n", rd_dev->rd_page_count);
rd_dev->rd_flags |= RDF_HAS_PAGE_COUNT;
rd_dev->rd_flags |= RDF_NULLIO;
rd_dev->rd_flags |= RDF_DUMMY;
struct rd_dev *rd_dev = RD_DEV(dev);
rd_dev->rd_dev_id);
rd_dev->rd_page_count,
PAGE_SIZE, rd_dev->sg_table_count,
!!(rd_dev->rd_flags & RDF_NULLIO),
!!(rd_dev->rd_flags & RDF_DUMMY));
struct rd_dev *rd_dev = RD_DEV(dev);
unsigned long long blocks_long = ((rd_dev->rd_page_count * PAGE_SIZE) /
struct rd_dev *rd_dev = RD_DEV(dev);
static u32 rd_release_sgl_table(struct rd_dev *rd_dev, struct rd_dev_sg_table *sg_table,
return rd_build_prot_space(rd_dev, dev->prot_length,
struct rd_dev *rd_dev = RD_DEV(dev);
rd_release_prot_space(rd_dev);
static void rd_release_device_space(struct rd_dev *rd_dev)
if (!rd_dev->sg_table_array || !rd_dev->sg_table_count)
page_count = rd_release_sgl_table(rd_dev, rd_dev->sg_table_array,
rd_dev->sg_table_count);