Revision cfe5f011

b/hw/collie.c
26 26
{
27 27
    StrongARMState *s;
28 28
    DriveInfo *dinfo;
29
    ram_addr_t phys_flash;
30 29

  
31 30
    if (!cpu_model) {
32 31
        cpu_model = "sa1110";
......
34 33

  
35 34
    s = sa1110_init(collie_binfo.ram_size, cpu_model);
36 35

  
37
    phys_flash = qemu_ram_alloc(NULL, "collie.fl1", 0x02000000);
38 36
    dinfo = drive_get(IF_PFLASH, 0, 0);
39
    pflash_cfi01_register(SA_CS0, phys_flash,
37
    pflash_cfi01_register(SA_CS0, NULL, "collie.fl1", 0x02000000,
40 38
                    dinfo ? dinfo->bdrv : NULL, (64 * 1024),
41 39
                    512, 4, 0x00, 0x00, 0x00, 0x00, 0);
42 40

  
43
    phys_flash = qemu_ram_alloc(NULL, "collie.fl2", 0x02000000);
44 41
    dinfo = drive_get(IF_PFLASH, 0, 1);
45
    pflash_cfi01_register(SA_CS1, phys_flash,
42
    pflash_cfi01_register(SA_CS1, NULL, "collie.fl2", 0x02000000,
46 43
                    dinfo ? dinfo->bdrv : NULL, (64 * 1024),
47 44
                    512, 4, 0x00, 0x00, 0x00, 0x00, 0);
48 45

  
b/hw/flash.h
1 1
/* NOR flash devices */
2

  
3
#include "memory.h"
4

  
2 5
typedef struct pflash_t pflash_t;
3 6

  
4 7
/* pflash_cfi01.c */
5
pflash_t *pflash_cfi01_register(target_phys_addr_t base, ram_addr_t off,
8
pflash_t *pflash_cfi01_register(target_phys_addr_t base,
9
                                DeviceState *qdev, const char *name,
10
                                target_phys_addr_t size,
6 11
                                BlockDriverState *bs,
7 12
                                uint32_t sector_len, int nb_blocs, int width,
8 13
                                uint16_t id0, uint16_t id1,
9 14
                                uint16_t id2, uint16_t id3, int be);
10 15

  
11 16
/* pflash_cfi02.c */
12
pflash_t *pflash_cfi02_register(target_phys_addr_t base, ram_addr_t off,
17
pflash_t *pflash_cfi02_register(target_phys_addr_t base,
18
                                DeviceState *qdev, const char *name,
19
                                target_phys_addr_t size,
13 20
                                BlockDriverState *bs, uint32_t sector_len,
14 21
                                int nb_blocs, int nb_mappings, int width,
15 22
                                uint16_t id0, uint16_t id1,
......
17 24
                                uint16_t unlock_addr0, uint16_t unlock_addr1,
18 25
                                int be);
19 26

  
27
MemoryRegion *pflash_cfi01_get_memory(pflash_t *fl);
28

  
20 29
/* nand.c */
21 30
DeviceState *nand_init(BlockDriverState *bdrv, int manf_id, int chip_id);
22 31
void nand_setpins(DeviceState *dev, uint8_t cle, uint8_t ale,
b/hw/gumstix.c
67 67
#else
68 68
    be = 0;
69 69
#endif
70
    if (!pflash_cfi01_register(0x00000000, qemu_ram_alloc(NULL, "connext.rom",
71
                                                          connex_rom),
70
    if (!pflash_cfi01_register(0x00000000, NULL, "connext.rom", connex_rom,
72 71
                               dinfo->bdrv, sector_len, connex_rom / sector_len,
73 72
                               2, 0, 0, 0, 0, be)) {
74 73
        fprintf(stderr, "qemu: Error registering flash memory.\n");
......
106 105
#else
107 106
    be = 0;
108 107
#endif
109
    if (!pflash_cfi01_register(0x00000000, qemu_ram_alloc(NULL, "verdex.rom",
110
                                                          verdex_rom),
108
    if (!pflash_cfi01_register(0x00000000, NULL, "verdex.rom", verdex_rom,
111 109
                               dinfo->bdrv, sector_len, verdex_rom / sector_len,
112 110
                               2, 0, 0, 0, 0, be)) {
113 111
        fprintf(stderr, "qemu: Error registering flash memory.\n");
b/hw/lm32_boards.c
77 77
    CPUState *env;
78 78
    DriveInfo *dinfo;
79 79
    ram_addr_t phys_ram;
80
    ram_addr_t phys_flash;
81 80
    qemu_irq *cpu_irq, irq[32];
82 81
    ResetInfo *reset_info;
83 82
    int i;
......
108 107
    phys_ram = qemu_ram_alloc(NULL, "lm32_evr.sdram", ram_size);
109 108
    cpu_register_physical_memory(ram_base, ram_size, phys_ram | IO_MEM_RAM);
110 109

  
111
    phys_flash = qemu_ram_alloc(NULL, "lm32_evr.flash", flash_size);
112 110
    dinfo = drive_get(IF_PFLASH, 0, 0);
113 111
    /* Spansion S29NS128P */
114
    pflash_cfi02_register(flash_base, phys_flash,
112
    pflash_cfi02_register(flash_base, NULL, "lm32_evr.flash", flash_size,
115 113
                          dinfo ? dinfo->bdrv : NULL, flash_sector_size,
116 114
                          flash_size / flash_sector_size, 1, 2,
117 115
                          0x01, 0x7e, 0x43, 0x00, 0x555, 0x2aa, 1);
......
165 163
    CPUState *env;
166 164
    DriveInfo *dinfo;
167 165
    ram_addr_t phys_ram;
168
    ram_addr_t phys_flash;
169 166
    qemu_irq *cpu_irq, irq[32];
170 167
    HWSetup *hw;
171 168
    ResetInfo *reset_info;
......
203 200
    phys_ram = qemu_ram_alloc(NULL, "lm32_uclinux.sdram", ram_size);
204 201
    cpu_register_physical_memory(ram_base, ram_size, phys_ram | IO_MEM_RAM);
205 202

  
206
    phys_flash = qemu_ram_alloc(NULL, "lm32_uclinux.flash", flash_size);
207 203
    dinfo = drive_get(IF_PFLASH, 0, 0);
208 204
    /* Spansion S29NS128P */
209
    pflash_cfi02_register(flash_base, phys_flash,
205
    pflash_cfi02_register(flash_base, NULL, "lm32_uclinux.flash", flash_size,
210 206
                          dinfo ? dinfo->bdrv : NULL, flash_sector_size,
211 207
                          flash_size / flash_sector_size, 1, 2,
212 208
                          0x01, 0x7e, 0x43, 0x00, 0x555, 0x2aa, 1);
b/hw/mainstone.c
126 126
            exit(1);
127 127
        }
128 128

  
129
        if (!pflash_cfi01_register(mainstone_flash_base[i],
130
                                   qemu_ram_alloc(NULL, i ? "mainstone.flash1" :
131
                                                  "mainstone.flash0",
132
                                                  MAINSTONE_FLASH),
129
        if (!pflash_cfi01_register(mainstone_flash_base[i], NULL,
130
                                   i ? "mainstone.flash1" : "mainstone.flash0",
131
                                   MAINSTONE_FLASH,
133 132
                                   dinfo->bdrv, sector_len,
134 133
                                   MAINSTONE_FLASH / sector_len, 4, 0, 0, 0, 0,
135 134
                                   be)) {
b/hw/milkymist.c
82 82
    int kernel_size;
83 83
    DriveInfo *dinfo;
84 84
    ram_addr_t phys_sdram;
85
    ram_addr_t phys_flash;
86 85
    qemu_irq irq[32], *cpu_irq;
87 86
    int i;
88 87
    char *bios_filename;
......
113 112
    cpu_register_physical_memory(sdram_base, sdram_size,
114 113
            phys_sdram | IO_MEM_RAM);
115 114

  
116
    phys_flash = qemu_ram_alloc(NULL, "milkymist.flash", flash_size);
117 115
    dinfo = drive_get(IF_PFLASH, 0, 0);
118 116
    /* Numonyx JS28F256J3F105 */
119
    pflash_cfi01_register(flash_base, phys_flash,
117
    pflash_cfi01_register(flash_base, NULL, "milkymist.flash", flash_size,
120 118
                          dinfo ? dinfo->bdrv : NULL, flash_sector_size,
121 119
                          flash_size / flash_sector_size, 2,
122 120
                          0x00, 0x89, 0x00, 0x1d, 1);
b/hw/mips_malta.c
46 46
#include "elf.h"
47 47
#include "mc146818rtc.h"
48 48
#include "blockdev.h"
49
#include "exec-memory.h"
49 50

  
50 51
//#define DEBUG_BOARD_INIT
51 52

  
......
761 762
                      const char *initrd_filename, const char *cpu_model)
762 763
{
763 764
    char *filename;
765
    pflash_t *fl;
764 766
    ram_addr_t ram_offset;
765
    ram_addr_t bios_offset;
767
    MemoryRegion *system_memory = get_system_memory();
768
    MemoryRegion *bios, *bios_alias = g_new(MemoryRegion, 1);
766 769
    target_long bios_size;
767 770
    int64_t kernel_entry;
768 771
    PCIBus *pci_bus;
......
811 814
        exit(1);
812 815
    }
813 816
    ram_offset = qemu_ram_alloc(NULL, "mips_malta.ram", ram_size);
814
    bios_offset = qemu_ram_alloc(NULL, "mips_malta.bios", BIOS_SIZE);
815

  
816 817

  
817 818
    cpu_register_physical_memory(0, ram_size, ram_offset | IO_MEM_RAM);
818 819

  
819
    /* Map the bios at two physical locations, as on the real board. */
820
    cpu_register_physical_memory(0x1e000000LL,
821
                                 BIOS_SIZE, bios_offset | IO_MEM_ROM);
822
    cpu_register_physical_memory(0x1fc00000LL,
823
                                 BIOS_SIZE, bios_offset | IO_MEM_ROM);
824

  
825 820
#ifdef TARGET_WORDS_BIGENDIAN
826 821
    be = 1;
827 822
#else
......
833 828
    /* Load firmware in flash / BIOS unless we boot directly into a kernel. */
834 829
    if (kernel_filename) {
835 830
        /* Write a small bootloader to the flash location. */
831
        bios = g_new(MemoryRegion, 1);
832
        memory_region_init_ram(bios, NULL, "mips_malta.bios", BIOS_SIZE);
833
        memory_region_set_readonly(bios, true);
834
        memory_region_init_alias(bios_alias, "bios.1fc", bios, 0, BIOS_SIZE);
835
        /* Map the bios at two physical locations, as on the real board. */
836
        memory_region_add_subregion(system_memory, 0x1e000000LL, bios);
837
        memory_region_add_subregion(system_memory, 0x1fc00000LL, bios_alias);
836 838
        loaderparams.ram_size = ram_size;
837 839
        loaderparams.kernel_filename = kernel_filename;
838 840
        loaderparams.kernel_cmdline = kernel_cmdline;
839 841
        loaderparams.initrd_filename = initrd_filename;
840 842
        kernel_entry = load_kernel();
841
        write_bootloader(env, qemu_get_ram_ptr(bios_offset), kernel_entry);
843
        write_bootloader(env, memory_region_get_ram_ptr(bios), kernel_entry);
842 844
    } else {
843 845
        dinfo = drive_get(IF_PFLASH, 0, fl_idx);
844 846
        if (dinfo) {
......
847 849
            fl_sectors = bios_size >> 16;
848 850
#ifdef DEBUG_BOARD_INIT
849 851
            printf("Register parallel flash %d size " TARGET_FMT_lx " at "
850
                   "offset %08lx addr %08llx '%s' %x\n",
851
                   fl_idx, bios_size, bios_offset, 0x1e000000LL,
852
                   "addr %08llx '%s' %x\n",
853
                   fl_idx, bios_size, 0x1e000000LL,
852 854
                   bdrv_get_device_name(dinfo->bdrv), fl_sectors);
853 855
#endif
854
            pflash_cfi01_register(0x1e000000LL, bios_offset,
855
                                  dinfo->bdrv, 65536, fl_sectors,
856
                                  4, 0x0000, 0x0000, 0x0000, 0x0000, be);
857
            fl_idx++;
856
            fl = pflash_cfi01_register(0x1e000000LL,
857
                                       NULL, "mips_malta.bios", BIOS_SIZE,
858
                                       dinfo->bdrv, 65536, fl_sectors,
859
                                       4, 0x0000, 0x0000, 0x0000, 0x0000, be);
860
            bios = pflash_cfi01_get_memory(fl);
861
            /* Map the bios at two physical locations, as on the real board. */
862
            memory_region_init_alias(bios_alias, "bios.1fc",
863
                                     bios, 0, BIOS_SIZE);
864
            memory_region_add_subregion(system_memory, 0x1fc00000LL,
865
                                        bios_alias);
866
           fl_idx++;
858 867
        } else {
868
            bios = g_new(MemoryRegion, 1);
869
            memory_region_init_ram(bios, NULL, "mips_malta.bios", BIOS_SIZE);
870
            memory_region_set_readonly(bios, true);
871
            memory_region_init_alias(bios_alias, "bios.1fc",
872
                                     bios, 0, BIOS_SIZE);
873
            /* Map the bios at two physical locations, as on the real board. */
874
            memory_region_add_subregion(system_memory, 0x1e000000LL, bios);
875
            memory_region_add_subregion(system_memory, 0x1fc00000LL,
876
                                        bios_alias);
859 877
            /* Load a BIOS image. */
860 878
            if (bios_name == NULL)
861 879
                bios_name = BIOS_FILENAME;
......
878 896
           a neat trick which allows bi-endian firmware. */
879 897
#ifndef TARGET_WORDS_BIGENDIAN
880 898
        {
881
            uint32_t *addr = qemu_get_ram_ptr(bios_offset);;
899
            uint32_t *addr = memory_region_get_ram_ptr(bios);
882 900
            uint32_t *end = addr + bios_size;
883 901
            while (addr < end) {
884 902
                bswap32s(addr);
......
890 908
    /* Board ID = 0x420 (Malta Board with CoreLV)
891 909
       XXX: theoretically 0x1e000010 should map to flash and 0x1fc00010 should
892 910
       map to the board ID. */
893
    stl_p(qemu_get_ram_ptr(bios_offset) + 0x10, 0x00000420);
911
    stl_p(memory_region_get_ram_ptr(bios) + 0x10, 0x00000420);
894 912

  
895 913
    /* Init internal devices */
896 914
    cpu_mips_irq_init_cpu(env);
b/hw/mips_r4k.c
23 23
#include "elf.h"
24 24
#include "mc146818rtc.h"
25 25
#include "blockdev.h"
26
#include "exec-memory.h"
26 27

  
27 28
#define MAX_IDE_BUS 2
28 29

  
......
163 164
{
164 165
    char *filename;
165 166
    ram_addr_t ram_offset;
166
    ram_addr_t bios_offset;
167
    MemoryRegion *bios;
167 168
    int bios_size;
168 169
    CPUState *env;
169 170
    ResetData *reset_info;
......
227 228
    be = 0;
228 229
#endif
229 230
    if ((bios_size > 0) && (bios_size <= BIOS_SIZE)) {
230
        bios_offset = qemu_ram_alloc(NULL, "mips_r4k.bios", BIOS_SIZE);
231
	cpu_register_physical_memory(0x1fc00000, BIOS_SIZE,
232
                                     bios_offset | IO_MEM_ROM);
231
        bios = g_new(MemoryRegion, 1);
232
        memory_region_init_ram(bios, NULL, "mips_r4k.bios", BIOS_SIZE);
233
        memory_region_set_readonly(bios, true);
234
        memory_region_add_subregion(get_system_memory(), 0x1fc00000, bios);
233 235

  
234 236
        load_image_targphys(filename, 0x1fc00000, BIOS_SIZE);
235 237
    } else if ((dinfo = drive_get(IF_PFLASH, 0, 0)) != NULL) {
236 238
        uint32_t mips_rom = 0x00400000;
237
        bios_offset = qemu_ram_alloc(NULL, "mips_r4k.bios", mips_rom);
238
        if (!pflash_cfi01_register(0x1fc00000, bios_offset,
239
        if (!pflash_cfi01_register(0x1fc00000, NULL, "mips_r4k.bios", mips_rom,
239 240
                                   dinfo->bdrv, sector_len,
240 241
                                   mips_rom / sector_len,
241 242
                                   4, 0, 0, 0, 0, be)) {
b/hw/musicpal.c
1565 1565
         * image is smaller than 32 MB.
1566 1566
         */
1567 1567
#ifdef TARGET_WORDS_BIGENDIAN
1568
        pflash_cfi02_register(0-MP_FLASH_SIZE_MAX, qemu_ram_alloc(NULL,
1569
                              "musicpal.flash", flash_size),
1568
        pflash_cfi02_register(0-MP_FLASH_SIZE_MAX, NULL,
1569
                              "musicpal.flash", flash_size,
1570 1570
                              dinfo->bdrv, 0x10000,
1571 1571
                              (flash_size + 0xffff) >> 16,
1572 1572
                              MP_FLASH_SIZE_MAX / flash_size,
1573 1573
                              2, 0x00BF, 0x236D, 0x0000, 0x0000,
1574 1574
                              0x5555, 0x2AAA, 1);
1575 1575
#else
1576
        pflash_cfi02_register(0-MP_FLASH_SIZE_MAX, qemu_ram_alloc(NULL,
1577
                              "musicpal.flash", flash_size),
1576
        pflash_cfi02_register(0-MP_FLASH_SIZE_MAX, NULL,
1577
                              "musicpal.flash", flash_size,
1578 1578
                              dinfo->bdrv, 0x10000,
1579 1579
                              (flash_size + 0xffff) >> 16,
1580 1580
                              MP_FLASH_SIZE_MAX / flash_size,
b/hw/omap_sx1.c
161 161
#endif
162 162

  
163 163
    if ((dinfo = drive_get(IF_PFLASH, 0, fl_idx)) != NULL) {
164
        if (!pflash_cfi01_register(OMAP_CS0_BASE, qemu_ram_alloc(NULL,
165
                                   "omap_sx1.flash0-1", flash_size),
164
        if (!pflash_cfi01_register(OMAP_CS0_BASE, NULL,
165
                                   "omap_sx1.flash0-1", flash_size,
166 166
                                   dinfo->bdrv, sector_size,
167 167
                                   flash_size / sector_size,
168 168
                                   4, 0, 0, 0, 0, be)) {
......
182 182
        cpu_register_physical_memory(OMAP_CS1_BASE + flash1_size,
183 183
                        OMAP_CS1_SIZE - flash1_size, io);
184 184

  
185
        if (!pflash_cfi01_register(OMAP_CS1_BASE, qemu_ram_alloc(NULL,
186
                                   "omap_sx1.flash1-1", flash1_size),
185
        if (!pflash_cfi01_register(OMAP_CS1_BASE, NULL,
186
                                   "omap_sx1.flash1-1", flash1_size,
187 187
                                   dinfo->bdrv, sector_size,
188 188
                                   flash1_size / sector_size,
189 189
                                   4, 0, 0, 0, 0, be)) {
b/hw/petalogix_ml605_mmu.c
149 149
    target_phys_addr_t ddr_base = MEMORY_BASEADDR;
150 150
    ram_addr_t phys_lmb_bram;
151 151
    ram_addr_t phys_ram;
152
    ram_addr_t phys_flash;
153 152
    qemu_irq irq[32], *cpu_irq;
154 153

  
155 154
    /* init CPUs */
......
169 168
    phys_ram = qemu_ram_alloc(NULL, "petalogix_ml605.ram", ram_size);
170 169
    cpu_register_physical_memory(ddr_base, ram_size, phys_ram | IO_MEM_RAM);
171 170

  
172
    phys_flash = qemu_ram_alloc(NULL, "petalogix_ml605.flash", FLASH_SIZE);
173 171
    dinfo = drive_get(IF_PFLASH, 0, 0);
174 172
    /* 5th parameter 2 means bank-width
175 173
     * 10th paremeter 0 means little-endian */
176
    pflash_cfi01_register(FLASH_BASEADDR, phys_flash,
174
    pflash_cfi01_register(FLASH_BASEADDR,
175
                          NULL, "petalogix_ml605.flash", FLASH_SIZE,
177 176
                          dinfo ? dinfo->bdrv : NULL, (64 * 1024),
178 177
                          FLASH_SIZE >> 16,
179 178
                          2, 0x89, 0x18, 0x0000, 0x0, 0);
b/hw/petalogix_s3adsp1800_mmu.c
127 127
    target_phys_addr_t ddr_base = 0x90000000;
128 128
    ram_addr_t phys_lmb_bram;
129 129
    ram_addr_t phys_ram;
130
    ram_addr_t phys_flash;
131 130
    qemu_irq irq[32], *cpu_irq;
132 131

  
133 132
    /* init CPUs */
......
148 147
    phys_ram = qemu_ram_alloc(NULL, "petalogix_s3adsp1800.ram", ram_size);
149 148
    cpu_register_physical_memory(ddr_base, ram_size, phys_ram | IO_MEM_RAM);
150 149

  
151
    phys_flash = qemu_ram_alloc(NULL, "petalogix_s3adsp1800.flash", FLASH_SIZE);
152 150
    dinfo = drive_get(IF_PFLASH, 0, 0);
153
    pflash_cfi01_register(0xa0000000, phys_flash,
151
    pflash_cfi01_register(0xa0000000,
152
                          NULL, "petalogix_s3adsp1800.flash", FLASH_SIZE,
154 153
                          dinfo ? dinfo->bdrv : NULL, (64 * 1024),
155 154
                          FLASH_SIZE >> 16,
156 155
                          1, 0x89, 0x18, 0x0000, 0x0, 1);
b/hw/pflash_cfi01.c
40 40
#include "flash.h"
41 41
#include "block.h"
42 42
#include "qemu-timer.h"
43
#include "exec-memory.h"
43 44

  
44 45
#define PFLASH_BUG(fmt, ...) \
45 46
do { \
......
74 75
    target_phys_addr_t counter;
75 76
    unsigned int writeblock_size;
76 77
    QEMUTimer *timer;
77
    ram_addr_t off;
78
    int fl_mem;
78
    MemoryRegion mem;
79 79
    void *storage;
80 80
};
81 81

  
......
89 89
    if (pfl->bypass) {
90 90
        pfl->wcycle = 2;
91 91
    } else {
92
        cpu_register_physical_memory(pfl->base, pfl->total_len,
93
                        pfl->off | IO_MEM_ROMD | pfl->fl_mem);
92
        memory_region_rom_device_set_readable(&pfl->mem, true);
94 93
        pfl->wcycle = 0;
95 94
    }
96 95
    pfl->cmd = 0;
......
263 262

  
264 263
    if (!pfl->wcycle) {
265 264
        /* Set the device in I/O access mode */
266
        cpu_register_physical_memory(pfl->base, pfl->total_len, pfl->fl_mem);
265
        memory_region_rom_device_set_readable(&pfl->mem, false);
267 266
    }
268 267

  
269 268
    switch (pfl->wcycle) {
......
422 421
           __func__, offset, pfl->wcycle, pfl->cmd, value);
423 422

  
424 423
 reset_flash:
425
    cpu_register_physical_memory(pfl->base, pfl->total_len,
426
                    pfl->off | IO_MEM_ROMD | pfl->fl_mem);
424
    memory_region_rom_device_set_readable(&pfl->mem, true);
427 425

  
428 426
    pfl->bypass = 0;
429 427
    pfl->wcycle = 0;
......
514 512
    pflash_write(pfl, addr, value, 4, 0);
515 513
}
516 514

  
517
static CPUWriteMemoryFunc * const pflash_write_ops_be[] = {
518
    &pflash_writeb_be,
519
    &pflash_writew_be,
520
    &pflash_writel_be,
515
static const MemoryRegionOps pflash_cfi01_ops_be = {
516
    .old_mmio = {
517
        .read = { pflash_readb_be, pflash_readw_be, pflash_readl_be, },
518
        .write = { pflash_writeb_be, pflash_writew_be, pflash_writel_be, },
519
    },
520
    .endianness = DEVICE_NATIVE_ENDIAN,
521 521
};
522 522

  
523
static CPUReadMemoryFunc * const pflash_read_ops_be[] = {
524
    &pflash_readb_be,
525
    &pflash_readw_be,
526
    &pflash_readl_be,
527
};
528

  
529
static CPUWriteMemoryFunc * const pflash_write_ops_le[] = {
530
    &pflash_writeb_le,
531
    &pflash_writew_le,
532
    &pflash_writel_le,
533
};
534

  
535
static CPUReadMemoryFunc * const pflash_read_ops_le[] = {
536
    &pflash_readb_le,
537
    &pflash_readw_le,
538
    &pflash_readl_le,
523
static const MemoryRegionOps pflash_cfi01_ops_le = {
524
    .old_mmio = {
525
        .read = { pflash_readb_le, pflash_readw_le, pflash_readl_le, },
526
        .write = { pflash_writeb_le, pflash_writew_le, pflash_writel_le, },
527
    },
528
    .endianness = DEVICE_NATIVE_ENDIAN,
539 529
};
540 530

  
541 531
/* Count trailing zeroes of a 32 bits quantity */
......
574 564
    return ret;
575 565
}
576 566

  
577
pflash_t *pflash_cfi01_register(target_phys_addr_t base, ram_addr_t off,
567
pflash_t *pflash_cfi01_register(target_phys_addr_t base,
568
                                DeviceState *qdev, const char *name,
569
                                target_phys_addr_t size,
578 570
                                BlockDriverState *bs, uint32_t sector_len,
579 571
                                int nb_blocs, int width,
580 572
                                uint16_t id0, uint16_t id1,
581
                                uint16_t id2, uint16_t id3,
582
                                int be)
573
                                uint16_t id2, uint16_t id3, int be)
583 574
{
584 575
    pflash_t *pfl;
585 576
    target_phys_addr_t total_len;
......
596 587

  
597 588
    pfl = g_malloc0(sizeof(pflash_t));
598 589

  
599
    /* FIXME: Allocate ram ourselves.  */
600
    pfl->storage = qemu_get_ram_ptr(off);
601
    if (be) {
602
        pfl->fl_mem = cpu_register_io_memory(pflash_read_ops_be,
603
                                             pflash_write_ops_be, pfl,
604
                                             DEVICE_NATIVE_ENDIAN);
605
    } else {
606
        pfl->fl_mem = cpu_register_io_memory(pflash_read_ops_le,
607
                                             pflash_write_ops_le, pfl,
608
                                             DEVICE_NATIVE_ENDIAN);
609
    }
610
    pfl->off = off;
611
    cpu_register_physical_memory(base, total_len,
612
                    off | pfl->fl_mem | IO_MEM_ROMD);
590
    memory_region_init_rom_device(
591
        &pfl->mem, be ? &pflash_cfi01_ops_be : &pflash_cfi01_ops_le, pfl,
592
        qdev, name, size);
593
    pfl->storage = memory_region_get_ram_ptr(&pfl->mem);
594
    memory_region_add_subregion(get_system_memory(), base, &pfl->mem);
613 595

  
614 596
    pfl->bs = bs;
615 597
    if (pfl->bs) {
616 598
        /* read the initial flash content */
617 599
        ret = bdrv_read(pfl->bs, 0, pfl->storage, total_len >> 9);
618 600
        if (ret < 0) {
619
            cpu_unregister_io_memory(pfl->fl_mem);
601
            memory_region_del_subregion(get_system_memory(), &pfl->mem);
602
            memory_region_destroy(&pfl->mem);
620 603
            g_free(pfl);
621 604
            return NULL;
622 605
        }
......
724 707

  
725 708
    return pfl;
726 709
}
710

  
711
MemoryRegion *pflash_cfi01_get_memory(pflash_t *fl)
712
{
713
    return &fl->mem;
714
}
b/hw/pflash_cfi02.c
39 39
#include "flash.h"
40 40
#include "qemu-timer.h"
41 41
#include "block.h"
42
#include "exec-memory.h"
42 43

  
43 44
//#define PFLASH_DEBUG
44 45
#ifdef PFLASH_DEBUG
......
69 70
    uint8_t cfi_len;
70 71
    uint8_t cfi_table[0x52];
71 72
    QEMUTimer *timer;
72
    ram_addr_t off;
73
    int fl_mem;
73
    /* The device replicates the flash memory across its memory space.  Emulate
74
     * that by having a container (.mem) filled with an array of aliases
75
     * (.mem_mappings) pointing to the flash memory (.orig_mem).
76
     */
77
    MemoryRegion mem;
78
    MemoryRegion *mem_mappings;    /* array; one per mapping */
79
    MemoryRegion orig_mem;
74 80
    int rom_mode;
75 81
    int read_counter; /* used for lazy switch-back to rom mode */
76 82
    void *storage;
77 83
};
78 84

  
79
static void pflash_register_memory(pflash_t *pfl, int rom_mode)
85
/*
86
 * Set up replicated mappings of the same region.
87
 */
88
static void pflash_setup_mappings(pflash_t *pfl)
80 89
{
81
    unsigned long phys_offset = pfl->fl_mem;
82
    int i;
83

  
84
    if (rom_mode)
85
        phys_offset |= pfl->off | IO_MEM_ROMD;
86
    pfl->rom_mode = rom_mode;
90
    unsigned i;
91
    target_phys_addr_t size = memory_region_size(&pfl->orig_mem);
92

  
93
    memory_region_init(&pfl->mem, "pflash", pfl->mappings * size);
94
    pfl->mem_mappings = g_new(MemoryRegion, pfl->mappings);
95
    for (i = 0; i < pfl->mappings; ++i) {
96
        memory_region_init_alias(&pfl->mem_mappings[i], "pflash-alias",
97
                                 &pfl->orig_mem, 0, size);
98
        memory_region_add_subregion(&pfl->mem, i * size, &pfl->mem_mappings[i]);
99
    }
100
}
87 101

  
88
    for (i = 0; i < pfl->mappings; i++)
89
        cpu_register_physical_memory(pfl->base + i * pfl->chip_len,
90
                                     pfl->chip_len, phys_offset);
102
static void pflash_register_memory(pflash_t *pfl, int rom_mode)
103
{
104
    memory_region_rom_device_set_readable(&pfl->orig_mem, rom_mode);
91 105
}
92 106

  
93 107
static void pflash_timer (void *opaque)
......
538 552
    pflash_write(pfl, addr, value, 4, 0);
539 553
}
540 554

  
541
static CPUWriteMemoryFunc * const pflash_write_ops_be[] = {
542
    &pflash_writeb_be,
543
    &pflash_writew_be,
544
    &pflash_writel_be,
545
};
546

  
547
static CPUReadMemoryFunc * const pflash_read_ops_be[] = {
548
    &pflash_readb_be,
549
    &pflash_readw_be,
550
    &pflash_readl_be,
555
static const MemoryRegionOps pflash_cfi02_ops_be = {
556
    .old_mmio = {
557
        .read = { pflash_readb_be, pflash_readw_be, pflash_readl_be, },
558
        .write = { pflash_writeb_be, pflash_writew_be, pflash_writel_be, },
559
    },
560
    .endianness = DEVICE_NATIVE_ENDIAN,
551 561
};
552 562

  
553
static CPUWriteMemoryFunc * const pflash_write_ops_le[] = {
554
    &pflash_writeb_le,
555
    &pflash_writew_le,
556
    &pflash_writel_le,
557
};
558

  
559
static CPUReadMemoryFunc * const pflash_read_ops_le[] = {
560
    &pflash_readb_le,
561
    &pflash_readw_le,
562
    &pflash_readl_le,
563
static const MemoryRegionOps pflash_cfi02_ops_le = {
564
    .old_mmio = {
565
        .read = { pflash_readb_le, pflash_readw_le, pflash_readl_le, },
566
        .write = { pflash_writeb_le, pflash_writew_le, pflash_writel_le, },
567
    },
568
    .endianness = DEVICE_NATIVE_ENDIAN,
563 569
};
564 570

  
565 571
/* Count trailing zeroes of a 32 bits quantity */
......
598 604
    return ret;
599 605
}
600 606

  
601
pflash_t *pflash_cfi02_register(target_phys_addr_t base, ram_addr_t off,
607
pflash_t *pflash_cfi02_register(target_phys_addr_t base,
608
                                DeviceState *qdev, const char *name,
609
                                target_phys_addr_t size,
602 610
                                BlockDriverState *bs, uint32_t sector_len,
603 611
                                int nb_blocs, int nb_mappings, int width,
604 612
                                uint16_t id0, uint16_t id1,
......
618 626
        return NULL;
619 627
#endif
620 628
    pfl = g_malloc0(sizeof(pflash_t));
621
    /* FIXME: Allocate ram ourselves.  */
622
    pfl->storage = qemu_get_ram_ptr(off);
623
    if (be) {
624
        pfl->fl_mem = cpu_register_io_memory(pflash_read_ops_be,
625
                                             pflash_write_ops_be,
626
                                             pfl, DEVICE_NATIVE_ENDIAN);
627
    } else {
628
        pfl->fl_mem = cpu_register_io_memory(pflash_read_ops_le,
629
                                             pflash_write_ops_le,
630
                                             pfl, DEVICE_NATIVE_ENDIAN);
631
    }
632
    pfl->off = off;
629
    memory_region_init_rom_device(
630
        &pfl->orig_mem, be ? &pflash_cfi02_ops_be : &pflash_cfi02_ops_le, pfl,
631
        qdev, name, size);
632
    pfl->storage = memory_region_get_ram_ptr(&pfl->orig_mem);
633 633
    pfl->base = base;
634 634
    pfl->chip_len = chip_len;
635 635
    pfl->mappings = nb_mappings;
636
    pflash_register_memory(pfl, 1);
637 636
    pfl->bs = bs;
638 637
    if (pfl->bs) {
639 638
        /* read the initial flash content */
640 639
        ret = bdrv_read(pfl->bs, 0, pfl->storage, chip_len >> 9);
641 640
        if (ret < 0) {
642
            cpu_unregister_io_memory(pfl->fl_mem);
643 641
            g_free(pfl);
644 642
            return NULL;
645 643
        }
646 644
    }
645
    pflash_setup_mappings(pfl);
646
    pfl->rom_mode = 1;
647
    memory_region_add_subregion(get_system_memory(), pfl->base, &pfl->mem);
647 648
#if 0 /* XXX: there should be a bit to set up read-only,
648 649
       *      the same way the hardware does (with WP pin).
649 650
       */
b/hw/ppc405_boards.c
32 32
#include "qemu-log.h"
33 33
#include "loader.h"
34 34
#include "blockdev.h"
35
#include "exec-memory.h"
35 36

  
36 37
#define BIOS_FILENAME "ppc405_rom.bin"
37 38
#define BIOS_SIZE (2048 * 1024)
......
181 182
    ppc4xx_bd_info_t bd;
182 183
    CPUPPCState *env;
183 184
    qemu_irq *pic;
184
    ram_addr_t sram_offset, bios_offset, bdloc;
185
    MemoryRegion *bios;
186
    ram_addr_t sram_offset, bdloc;
185 187
    MemoryRegion *ram_memories = g_malloc(2 * sizeof(*ram_memories));
186 188
    target_phys_addr_t ram_bases[2], ram_sizes[2];
187 189
    target_ulong sram_size;
......
224 226
    dinfo = drive_get(IF_PFLASH, 0, fl_idx);
225 227
    if (dinfo) {
226 228
        bios_size = bdrv_getlength(dinfo->bdrv);
227
        bios_offset = qemu_ram_alloc(NULL, "ef405ep.bios", bios_size);
228 229
        fl_sectors = (bios_size + 65535) >> 16;
229 230
#ifdef DEBUG_BOARD_INIT
230 231
        printf("Register parallel flash %d size %lx"
231
               " at offset %08lx addr %lx '%s' %d\n",
232
               fl_idx, bios_size, bios_offset, -bios_size,
232
               " at addr %lx '%s' %d\n",
233
               fl_idx, bios_size, -bios_size,
233 234
               bdrv_get_device_name(dinfo->bdrv), fl_sectors);
234 235
#endif
235
        pflash_cfi02_register((uint32_t)(-bios_size), bios_offset,
236
        pflash_cfi02_register((uint32_t)(-bios_size),
237
                              NULL, "ef405ep.bios", bios_size,
236 238
                              dinfo->bdrv, 65536, fl_sectors, 1,
237 239
                              2, 0x0001, 0x22DA, 0x0000, 0x0000, 0x555, 0x2AA,
238 240
                              1);
......
243 245
#ifdef DEBUG_BOARD_INIT
244 246
        printf("Load BIOS from file\n");
245 247
#endif
246
        bios_offset = qemu_ram_alloc(NULL, "ef405ep.bios", BIOS_SIZE);
248
        bios = g_new(MemoryRegion, 1);
249
        memory_region_init_ram(bios, NULL, "ef405ep.bios", BIOS_SIZE);
247 250
        if (bios_name == NULL)
248 251
            bios_name = BIOS_FILENAME;
249 252
        filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
250 253
        if (filename) {
251
            bios_size = load_image(filename, qemu_get_ram_ptr(bios_offset));
254
            bios_size = load_image(filename, memory_region_get_ram_ptr(bios));
252 255
            g_free(filename);
253 256
        } else {
254 257
            bios_size = -1;
......
259 262
            exit(1);
260 263
        }
261 264
        bios_size = (bios_size + 0xfff) & ~0xfff;
262
        cpu_register_physical_memory((uint32_t)(-bios_size),
263
                                     bios_size, bios_offset | IO_MEM_ROM);
265
        memory_region_set_readonly(bios, true);
266
        memory_region_add_subregion(get_system_memory(),
267
                                    (uint32_t)(-bios_size), bios);
264 268
    }
265 269
    /* Register FPGA */
266 270
#ifdef DEBUG_BOARD_INIT
......
507 511
{
508 512
    char *filename;
509 513
    qemu_irq *pic;
510
    ram_addr_t bios_offset;
514
    MemoryRegion *bios;
511 515
    MemoryRegion *ram_memories = g_malloc(2 * sizeof(*ram_memories));
512 516
    target_phys_addr_t ram_bases[2], ram_sizes[2];
513 517
    long bios_size;
......
544 548
        /* XXX: should check that size is 2MB */
545 549
        //        bios_size = 2 * 1024 * 1024;
546 550
        fl_sectors = (bios_size + 65535) >> 16;
547
        bios_offset = qemu_ram_alloc(NULL, "taihu_405ep.bios", bios_size);
548 551
#ifdef DEBUG_BOARD_INIT
549 552
        printf("Register parallel flash %d size %lx"
550
               " at offset %08lx addr %lx '%s' %d\n",
551
               fl_idx, bios_size, bios_offset, -bios_size,
553
               " at addr %lx '%s' %d\n",
554
               fl_idx, bios_size, -bios_size,
552 555
               bdrv_get_device_name(dinfo->bdrv), fl_sectors);
553 556
#endif
554
        pflash_cfi02_register((uint32_t)(-bios_size), bios_offset,
557
        pflash_cfi02_register((uint32_t)(-bios_size),
558
                              NULL, "taihu_405ep.bios", bios_size,
555 559
                              dinfo->bdrv, 65536, fl_sectors, 1,
556 560
                              4, 0x0001, 0x22DA, 0x0000, 0x0000, 0x555, 0x2AA,
557 561
                              1);
......
564 568
#endif
565 569
        if (bios_name == NULL)
566 570
            bios_name = BIOS_FILENAME;
567
        bios_offset = qemu_ram_alloc(NULL, "taihu_405ep.bios", BIOS_SIZE);
571
        bios = g_new(MemoryRegion, 1);
572
        memory_region_init_ram(bios, NULL, "taihu_405ep.bios", BIOS_SIZE);
568 573
        filename = qemu_find_file(QEMU_FILE_TYPE_BIOS, bios_name);
569 574
        if (filename) {
570
            bios_size = load_image(filename, qemu_get_ram_ptr(bios_offset));
575
            bios_size = load_image(filename, memory_region_get_ram_ptr(bios));
571 576
            g_free(filename);
572 577
        } else {
573 578
            bios_size = -1;
......
578 583
            exit(1);
579 584
        }
580 585
        bios_size = (bios_size + 0xfff) & ~0xfff;
581
        cpu_register_physical_memory((uint32_t)(-bios_size),
582
                                     bios_size, bios_offset | IO_MEM_ROM);
586
        memory_region_set_readonly(bios, true);
587
        memory_region_add_subregion(get_system_memory(), (uint32_t)(-bios_size),
588
                                    bios);
583 589
    }
584 590
    /* Register Linux flash */
585 591
    dinfo = drive_get(IF_PFLASH, 0, fl_idx);
......
590 596
        fl_sectors = (bios_size + 65535) >> 16;
591 597
#ifdef DEBUG_BOARD_INIT
592 598
        printf("Register parallel flash %d size %lx"
593
               " at offset %08lx  addr " TARGET_FMT_lx " '%s'\n",
594
               fl_idx, bios_size, bios_offset, (target_ulong)0xfc000000,
599
               " at addr " TARGET_FMT_lx " '%s'\n",
600
               fl_idx, bios_size, (target_ulong)0xfc000000,
595 601
               bdrv_get_device_name(dinfo->bdrv));
596 602
#endif
597
        bios_offset = qemu_ram_alloc(NULL, "taihu_405ep.flash", bios_size);
598
        pflash_cfi02_register(0xfc000000, bios_offset,
603
        pflash_cfi02_register(0xfc000000, NULL, "taihu_405ep.flash", bios_size,
599 604
                              dinfo->bdrv, 65536, fl_sectors, 1,
600 605
                              4, 0x0001, 0x22DA, 0x0000, 0x0000, 0x555, 0x2AA,
601 606
                              1);
b/hw/r2d.c
267 267

  
268 268
    /* onboard flash memory */
269 269
    dinfo = drive_get(IF_PFLASH, 0, 0);
270
    pflash_cfi02_register(0x0, qemu_ram_alloc(NULL, "r2d.flash", FLASH_SIZE),
270
    pflash_cfi02_register(0x0, NULL, "r2d.flash", FLASH_SIZE,
271 271
                          dinfo ? dinfo->bdrv : NULL, (16 * 1024),
272 272
                          FLASH_SIZE >> 16,
273 273
                          1, 4, 0x0000, 0x0000, 0x0000, 0x0000,
b/hw/virtex_ml507.c
196 196
    target_phys_addr_t ram_base = 0;
197 197
    DriveInfo *dinfo;
198 198
    ram_addr_t phys_ram;
199
    ram_addr_t phys_flash;
200 199
    qemu_irq irq[32], *cpu_irq;
201 200
    clk_setup_t clk_setup[7];
202 201
    int kernel_size;
......
215 214
    phys_ram = qemu_ram_alloc(NULL, "ram", ram_size);
216 215
    cpu_register_physical_memory(ram_base, ram_size, phys_ram | IO_MEM_RAM);
217 216

  
218
    phys_flash = qemu_ram_alloc(NULL, "virtex.flash", FLASH_SIZE);
219 217
    dinfo = drive_get(IF_PFLASH, 0, 0);
220
    pflash_cfi01_register(0xfc000000, phys_flash,
218
    pflash_cfi01_register(0xfc000000, NULL, "virtex.flash", FLASH_SIZE,
221 219
                          dinfo ? dinfo->bdrv : NULL, (64 * 1024),
222 220
                          FLASH_SIZE >> 16,
223 221
                          1, 0x89, 0x18, 0x0000, 0x0, 1);
b/hw/z2.c
305 305
    }
306 306

  
307 307
    if (!pflash_cfi01_register(Z2_FLASH_BASE,
308
                               qemu_ram_alloc(NULL, "z2.flash0", Z2_FLASH_SIZE),
308
                               NULL, "z2.flash0", Z2_FLASH_SIZE,
309 309
                               dinfo->bdrv, sector_len,
310 310
                               Z2_FLASH_SIZE / sector_len, 4, 0, 0, 0, 0,
311 311
                               be)) {

Also available in: Unified diff