pc-bios/s390-ccw: qemuize types

Turn [the most of] existing declarations from
    struct type_name { ... };
into
    struct TypeName { ... };
    typedef struct TypeName TypeName;
and make use of them.

Also switch u{8,16,32,64} to uint{8,16,32,64}_t.

Acked-by: Cornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: Eugene (jno) Dvurechenski <jno@linux.vnet.ibm.com>
Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com>
This commit is contained in:
Eugene (jno) Dvurechenski 2015-11-10 14:10:20 +01:00 committed by Cornelia Huck
parent dc25e843f6
commit b88d7fa590
4 changed files with 115 additions and 94 deletions

View File

@ -14,7 +14,7 @@
char stack[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE))); char stack[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE)));
char ring_area[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE))); char ring_area[PAGE_SIZE * 8] __attribute__((__aligned__(PAGE_SIZE)));
uint64_t boot_value; uint64_t boot_value;
static struct subchannel_id blk_schid = { .one = 1 }; static SubChannelId blk_schid = { .one = 1 };
/* /*
* Priniciples of Operations (SA22-7832-09) chapter 17 requires that * Priniciples of Operations (SA22-7832-09) chapter 17 requires that
@ -23,7 +23,7 @@ static struct subchannel_id blk_schid = { .one = 1 };
*/ */
void write_subsystem_identification(void) void write_subsystem_identification(void)
{ {
struct subchannel_id *schid = (struct subchannel_id *) 184; SubChannelId *schid = (SubChannelId *) 184;
uint32_t *zeroes = (uint32_t *) 188; uint32_t *zeroes = (uint32_t *) 188;
*schid = blk_schid; *schid = blk_schid;
@ -38,7 +38,7 @@ void panic(const char *string)
while (1) { } while (1) { }
} }
static bool find_dev(struct schib *schib, int dev_no) static bool find_dev(Schib *schib, int dev_no)
{ {
int i, r; int i, r;
@ -64,7 +64,7 @@ static bool find_dev(struct schib *schib, int dev_no)
static void virtio_setup(uint64_t dev_info) static void virtio_setup(uint64_t dev_info)
{ {
struct schib schib; Schib schib;
int ssid; int ssid;
bool found = false; bool found = false;
uint16_t dev_no; uint16_t dev_no;

View File

@ -45,6 +45,14 @@ typedef unsigned long long __u64;
#include "cio.h" #include "cio.h"
typedef struct irb Irb;
typedef struct ccw1 Ccw1;
typedef struct cmd_orb CmdOrb;
typedef struct schib Schib;
typedef struct chsc_area_sda ChscAreaSda;
typedef struct senseid SenseId;
typedef struct subchannel_id SubChannelId;
/* start.s */ /* start.s */
void disabled_wait(void); void disabled_wait(void);
void consume_sclp_int(void); void consume_sclp_int(void);
@ -63,8 +71,8 @@ void sclp_setup(void);
/* virtio.c */ /* virtio.c */
unsigned long virtio_load_direct(ulong rec_list1, ulong rec_list2, unsigned long virtio_load_direct(ulong rec_list1, ulong rec_list2,
ulong subchan_id, void *load_addr); ulong subchan_id, void *load_addr);
bool virtio_is_blk(struct subchannel_id schid); bool virtio_is_blk(SubChannelId schid);
void virtio_setup_block(struct subchannel_id schid); void virtio_setup_block(SubChannelId schid);
int virtio_read(ulong sector, void *load_addr); int virtio_read(ulong sector, void *load_addr);
int enable_mss_facility(void); int enable_mss_facility(void);
ulong get_second(void); ulong get_second(void);

View File

@ -11,7 +11,7 @@
#include "s390-ccw.h" #include "s390-ccw.h"
#include "virtio.h" #include "virtio.h"
static struct vring block; static VRing block;
static char chsc_page[PAGE_SIZE] __attribute__((__aligned__(PAGE_SIZE))); static char chsc_page[PAGE_SIZE] __attribute__((__aligned__(PAGE_SIZE)));
@ -31,7 +31,7 @@ static long kvm_hypercall(unsigned long nr, unsigned long param1,
return retval; return retval;
} }
static void virtio_notify(struct subchannel_id schid) static void virtio_notify(SubChannelId schid)
{ {
kvm_hypercall(KVM_S390_VIRTIO_CCW_NOTIFY, *(u32 *)&schid, 0); kvm_hypercall(KVM_S390_VIRTIO_CCW_NOTIFY, *(u32 *)&schid, 0);
} }
@ -40,9 +40,9 @@ static void virtio_notify(struct subchannel_id schid)
* Virtio functions * * Virtio functions *
***********************************************/ ***********************************************/
static int drain_irqs(struct subchannel_id schid) static int drain_irqs(SubChannelId schid)
{ {
struct irb irb = {}; Irb irb = {};
int r = 0; int r = 0;
while (1) { while (1) {
@ -59,11 +59,11 @@ static int drain_irqs(struct subchannel_id schid)
} }
} }
static int run_ccw(struct subchannel_id schid, int cmd, void *ptr, int len) static int run_ccw(SubChannelId schid, int cmd, void *ptr, int len)
{ {
struct ccw1 ccw = {}; Ccw1 ccw = {};
struct cmd_orb orb = {}; CmdOrb orb = {};
struct schib schib; Schib schib;
int r; int r;
/* start command processing */ /* start command processing */
@ -92,7 +92,7 @@ static int run_ccw(struct subchannel_id schid, int cmd, void *ptr, int len)
return r; return r;
} }
static void virtio_set_status(struct subchannel_id schid, static void virtio_set_status(SubChannelId schid,
unsigned long dev_addr) unsigned long dev_addr)
{ {
unsigned char status = dev_addr; unsigned char status = dev_addr;
@ -101,18 +101,18 @@ static void virtio_set_status(struct subchannel_id schid,
} }
} }
static void virtio_reset(struct subchannel_id schid) static void virtio_reset(SubChannelId schid)
{ {
run_ccw(schid, CCW_CMD_VDEV_RESET, NULL, 0); run_ccw(schid, CCW_CMD_VDEV_RESET, NULL, 0);
} }
static void vring_init(struct vring *vr, unsigned int num, void *p, static void vring_init(VRing *vr, unsigned int num, void *p,
unsigned long align) unsigned long align)
{ {
debug_print_addr("init p", p); debug_print_addr("init p", p);
vr->num = num; vr->num = num;
vr->desc = p; vr->desc = p;
vr->avail = p + num*sizeof(struct vring_desc); vr->avail = p + num * sizeof(VRingDesc);
vr->used = (void *)(((unsigned long)&vr->avail->ring[num] + align-1) vr->used = (void *)(((unsigned long)&vr->avail->ring[num] + align-1)
& ~(align - 1)); & ~(align - 1));
@ -129,12 +129,12 @@ static void vring_init(struct vring *vr, unsigned int num, void *p,
debug_print_addr("init vr", vr); debug_print_addr("init vr", vr);
} }
static void vring_notify(struct subchannel_id schid) static void vring_notify(SubChannelId schid)
{ {
virtio_notify(schid); virtio_notify(schid);
} }
static void vring_send_buf(struct vring *vr, void *p, int len, int flags) static void vring_send_buf(VRing *vr, void *p, int len, int flags)
{ {
/* For follow-up chains we need to keep the first entry point */ /* For follow-up chains we need to keep the first entry point */
if (!(flags & VRING_HIDDEN_IS_CHAIN)) { if (!(flags & VRING_HIDDEN_IS_CHAIN)) {
@ -174,10 +174,10 @@ ulong get_second(void)
* *
* Returns 0 on success, 1 on timeout. * Returns 0 on success, 1 on timeout.
*/ */
static int vring_wait_reply(struct vring *vr, int timeout) static int vring_wait_reply(VRing *vr, int timeout)
{ {
ulong target_second = get_second() + timeout; ulong target_second = get_second() + timeout;
struct subchannel_id schid = vr->schid; SubChannelId schid = vr->schid;
int r = 0; int r = 0;
/* Wait until the used index has moved. */ /* Wait until the used index has moved. */
@ -204,7 +204,7 @@ static int vring_wait_reply(struct vring *vr, int timeout)
int virtio_read_many(ulong sector, void *load_addr, int sec_num) int virtio_read_many(ulong sector, void *load_addr, int sec_num)
{ {
struct virtio_blk_outhdr out_hdr; VirtioBlkOuthdr out_hdr;
u8 status; u8 status;
int r; int r;
@ -363,10 +363,10 @@ uint64_t virtio_get_blocks(void)
(virtio_get_block_size() / VIRTIO_SECTOR_SIZE); (virtio_get_block_size() / VIRTIO_SECTOR_SIZE);
} }
void virtio_setup_block(struct subchannel_id schid) void virtio_setup_block(SubChannelId schid)
{ {
struct vq_info_block info; VqInfo info;
struct vq_config_block config = {}; VqConfig config = {};
blk_cfg.blk_size = 0; /* mark "illegal" - setup started... */ blk_cfg.blk_size = 0; /* mark "illegal" - setup started... */
guessed_disk_nature = false; guessed_disk_nature = false;
@ -406,10 +406,10 @@ void virtio_setup_block(struct subchannel_id schid)
} }
} }
bool virtio_is_blk(struct subchannel_id schid) bool virtio_is_blk(SubChannelId schid)
{ {
int r; int r;
struct senseid senseid = {}; SenseId senseid = {};
/* run sense id command */ /* run sense id command */
r = run_ccw(schid, CCW_CMD_SENSE_ID, &senseid, sizeof(senseid)); r = run_ccw(schid, CCW_CMD_SENSE_ID, &senseid, sizeof(senseid));
@ -426,7 +426,7 @@ bool virtio_is_blk(struct subchannel_id schid)
int enable_mss_facility(void) int enable_mss_facility(void)
{ {
int ret; int ret;
struct chsc_area_sda *sda_area = (struct chsc_area_sda *) chsc_page; ChscAreaSda *sda_area = (ChscAreaSda *) chsc_page;
memset(sda_area, 0, PAGE_SIZE); memset(sda_area, 0, PAGE_SIZE);
sda_area->request.length = 0x0400; sda_area->request.length = 0x0400;

View File

@ -23,48 +23,54 @@
/* We've given up on this device. */ /* We've given up on this device. */
#define VIRTIO_CONFIG_S_FAILED 0x80 #define VIRTIO_CONFIG_S_FAILED 0x80
enum virtio_dev_type { enum VirtioDevType {
VIRTIO_ID_NET = 1, VIRTIO_ID_NET = 1,
VIRTIO_ID_BLOCK = 2, VIRTIO_ID_BLOCK = 2,
VIRTIO_ID_CONSOLE = 3, VIRTIO_ID_CONSOLE = 3,
VIRTIO_ID_BALLOON = 5, VIRTIO_ID_BALLOON = 5,
}; };
typedef enum VirtioDevType VirtioDevType;
struct virtio_dev_header { struct VirtioDevHeader {
enum virtio_dev_type type : 8; VirtioDevType type:8;
u8 num_vq; uint8_t num_vq;
u8 feature_len; uint8_t feature_len;
u8 config_len; uint8_t config_len;
u8 status; uint8_t status;
u8 vqconfig[]; uint8_t vqconfig[];
} __attribute__((packed)); } __attribute__((packed));
typedef struct VirtioDevHeader VirtioDevHeader;
struct virtio_vqconfig { struct VirtioVqConfig {
u64 token; uint64_t token;
u64 address; uint64_t address;
u16 num; uint16_t num;
u8 pad[6]; uint8_t pad[6];
} __attribute__((packed)); } __attribute__((packed));
typedef struct VirtioVqConfig VirtioVqConfig;
struct vq_info_block { struct VqInfo {
u64 queue; uint64_t queue;
u32 align; uint32_t align;
u16 index; uint16_t index;
u16 num; uint16_t num;
} __attribute__((packed)); } __attribute__((packed));
typedef struct VqInfo VqInfo;
struct vq_config_block { struct VqConfig {
u16 index; uint16_t index;
u16 num; uint16_t num;
} __attribute__((packed)); } __attribute__((packed));
typedef struct VqConfig VqConfig;
struct virtio_dev { struct VirtioDev {
struct virtio_dev_header *header; VirtioDevHeader *header;
struct virtio_vqconfig *vqconfig; VirtioVqConfig *vqconfig;
char *host_features; char *host_features;
char *guest_features; char *guest_features;
char *config; char *config;
}; };
typedef struct VirtioDev VirtioDev;
#define KVM_S390_VIRTIO_RING_ALIGN 4096 #define KVM_S390_VIRTIO_RING_ALIGN 4096
@ -81,46 +87,51 @@ struct virtio_dev {
#define VRING_HIDDEN_IS_CHAIN 256 #define VRING_HIDDEN_IS_CHAIN 256
/* Virtio ring descriptors: 16 bytes. These can chain together via "next". */ /* Virtio ring descriptors: 16 bytes. These can chain together via "next". */
struct vring_desc { struct VRingDesc {
/* Address (guest-physical). */ /* Address (guest-physical). */
u64 addr; uint64_t addr;
/* Length. */ /* Length. */
u32 len; uint32_t len;
/* The flags as indicated above. */ /* The flags as indicated above. */
u16 flags; uint16_t flags;
/* We chain unused descriptors via this, too */ /* We chain unused descriptors via this, too */
u16 next; uint16_t next;
} __attribute__((packed)); } __attribute__((packed));
typedef struct VRingDesc VRingDesc;
struct vring_avail { struct VRingAvail {
u16 flags; uint16_t flags;
u16 idx; uint16_t idx;
u16 ring[]; uint16_t ring[];
} __attribute__((packed)); } __attribute__((packed));
typedef struct VRingAvail VRingAvail;
/* u32 is used here for ids for padding reasons. */ /* uint32_t is used here for ids for padding reasons. */
struct vring_used_elem { struct VRingUsedElem {
/* Index of start of used descriptor chain. */ /* Index of start of used descriptor chain. */
u32 id; uint32_t id;
/* Total length of the descriptor chain which was used (written to) */ /* Total length of the descriptor chain which was used (written to) */
u32 len; uint32_t len;
} __attribute__((packed)); } __attribute__((packed));
typedef struct VRingUsedElem VRingUsedElem;
struct vring_used { struct VRingUsed {
u16 flags; uint16_t flags;
u16 idx; uint16_t idx;
struct vring_used_elem ring[]; VRingUsedElem ring[];
} __attribute__((packed)); } __attribute__((packed));
typedef struct VRingUsed VRingUsed;
struct vring { struct VRing {
unsigned int num; unsigned int num;
int next_idx; int next_idx;
int used_idx; int used_idx;
struct vring_desc *desc; VRingDesc *desc;
struct vring_avail *avail; VRingAvail *avail;
struct vring_used *used; VRingUsed *used;
struct subchannel_id schid; SubChannelId schid;
}; };
typedef struct VRing VRing;
/*********************************************** /***********************************************
@ -152,37 +163,39 @@ struct vring {
#define VIRTIO_BLK_T_BARRIER 0x80000000 #define VIRTIO_BLK_T_BARRIER 0x80000000
/* This is the first element of the read scatter-gather list. */ /* This is the first element of the read scatter-gather list. */
struct virtio_blk_outhdr { struct VirtioBlkOuthdr {
/* VIRTIO_BLK_T* */ /* VIRTIO_BLK_T* */
u32 type; uint32_t type;
/* io priority. */ /* io priority. */
u32 ioprio; uint32_t ioprio;
/* Sector (ie. 512 byte offset) */ /* Sector (ie. 512 byte offset) */
u64 sector; uint64_t sector;
}; };
typedef struct VirtioBlkOuthdr VirtioBlkOuthdr;
typedef struct VirtioBlkConfig { struct VirtioBlkConfig {
u64 capacity; /* in 512-byte sectors */ uint64_t capacity; /* in 512-byte sectors */
u32 size_max; /* max segment size (if VIRTIO_BLK_F_SIZE_MAX) */ uint32_t size_max; /* max segment size (if VIRTIO_BLK_F_SIZE_MAX) */
u32 seg_max; /* max number of segments (if VIRTIO_BLK_F_SEG_MAX) */ uint32_t seg_max; /* max number of segments (if VIRTIO_BLK_F_SEG_MAX) */
struct virtio_blk_geometry { struct VirtioBlkGeometry {
u16 cylinders; uint16_t cylinders;
u8 heads; uint8_t heads;
u8 sectors; uint8_t sectors;
} geometry; /* (if VIRTIO_BLK_F_GEOMETRY) */ } geometry; /* (if VIRTIO_BLK_F_GEOMETRY) */
u32 blk_size; /* block size of device (if VIRTIO_BLK_F_BLK_SIZE) */ uint32_t blk_size; /* block size of device (if VIRTIO_BLK_F_BLK_SIZE) */
/* the next 4 entries are guarded by VIRTIO_BLK_F_TOPOLOGY */ /* the next 4 entries are guarded by VIRTIO_BLK_F_TOPOLOGY */
u8 physical_block_exp; /* exponent for physical block per logical block */ uint8_t physical_block_exp; /* exponent for physical blk per logical blk */
u8 alignment_offset; /* alignment offset in logical blocks */ uint8_t alignment_offset; /* alignment offset in logical blocks */
u16 min_io_size; /* min I/O size without performance penalty uint16_t min_io_size; /* min I/O size without performance penalty
in logical blocks */ in logical blocks */
u32 opt_io_size; /* optimal sustained I/O size in logical blocks */ uint32_t opt_io_size; /* optimal sustained I/O size in logical blks */
u8 wce; /* writeback mode (if VIRTIO_BLK_F_CONFIG_WCE) */ uint8_t wce; /* writeback mode (if VIRTIO_BLK_F_CONFIG_WCE) */
} __attribute__((packed)) VirtioBlkConfig; } __attribute__((packed));
typedef struct VirtioBlkConfig VirtioBlkConfig;
bool virtio_guessed_disk_nature(void); bool virtio_guessed_disk_nature(void);
void virtio_assume_scsi(void); void virtio_assume_scsi(void);