aboutsummaryrefslogtreecommitdiff
path: root/include/hw/nubus/nubus.h
blob: 9370f0d8f07793bfe87cdf2ddbe6f3f74c1dcfea (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/*
 * Copyright (c) 2013-2018 Laurent Vivier <laurent@vivier.eu>
 *
 * This work is licensed under the terms of the GNU GPL, version 2 or later.
 * See the COPYING file in the top-level directory.
 *
 */

#ifndef HW_NUBUS_NUBUS_H
#define HW_NUBUS_NUBUS_H

#include "hw/qdev-properties.h"
#include "exec/address-spaces.h"
#include "qom/object.h"

#define NUBUS_SUPER_SLOT_SIZE 0x10000000U
#define NUBUS_SUPER_SLOT_NB   0x9

#define NUBUS_SLOT_SIZE       0x01000000
#define NUBUS_SLOT_NB         0xF

#define NUBUS_FIRST_SLOT      0x9
#define NUBUS_LAST_SLOT       0xF

#define TYPE_NUBUS_DEVICE "nubus-device"
typedef struct NubusDevice NubusDevice;
DECLARE_INSTANCE_CHECKER(NubusDevice, NUBUS_DEVICE,
                         TYPE_NUBUS_DEVICE)

#define TYPE_NUBUS_BUS "nubus-bus"
typedef struct NubusBus NubusBus;
DECLARE_INSTANCE_CHECKER(NubusBus, NUBUS_BUS,
                         TYPE_NUBUS_BUS)

#define TYPE_NUBUS_BRIDGE "nubus-bridge"

struct NubusBus {
    BusState qbus;

    MemoryRegion super_slot_io;
    MemoryRegion slot_io;

    int current_slot;
};

struct NubusDevice {
    DeviceState qdev;

    int slot_nb;
    MemoryRegion slot_mem;

    /* Format Block */

    MemoryRegion fblock_io;

    uint32_t rom_length;
    uint32_t rom_crc;
    uint8_t rom_rev;
    uint8_t rom_format;
    uint8_t byte_lanes;
    int32_t directory_offset;

    /* ROM */

    MemoryRegion rom_io;
    const uint8_t *rom;
};

void nubus_register_rom(NubusDevice *dev, const uint8_t *rom, uint32_t size,
                        int revision, int format, uint8_t byte_lanes);

#endif