~vcs-imports/qemu/maemo

« back to all changes in this revision

Viewing changes to hw/onenand.c

  • Committer: Riku Voipio
  • Date: 2009-06-08 15:31:58 UTC
  • mfrom: (6281.2.366)
  • mto: This revision was merged to the branch mainline in revision 6452.
  • Revision ID: git-v1:759b334a9739814df2883aa4c41b1c0f5670e90a
Merge commit 'gnu/master' into test

Epic merge

Conflicts:
        Makefile
        block.c
        block.h
        configure
        hw/boards.h
        hw/flash.h
        hw/integratorcp.c
        hw/nand.c
        hw/omap2.c
        hw/omap_i2c.c
        hw/sd.c
        hw/smc91c111.c
        hw/tsc2005.c
        hw/tusb6010.c
        hw/usb-musb.c
        linux-user/syscall.c
        target-arm/machine.c
        target-arm/translate.c

Show diffs side-by-side

added added

removed removed

Lines of Context:
32
32
/* Fixed */
33
33
#define BLOCK_SHIFT     (PAGE_SHIFT + 6)
34
34
 
35
 
struct onenand_s {
 
35
typedef struct {
36
36
    uint32_t id;
37
37
    int shift;
38
38
    target_phys_addr_t base;
60
60
    uint16_t intstatus;
61
61
    uint16_t wpstatus;
62
62
 
63
 
    struct ecc_state_s ecc;
 
63
    ECCState ecc;
64
64
 
65
65
    int density_mask;
66
66
    int secs;
67
67
    int secs_cur;
68
68
    int blocks;
69
69
    uint8_t *blockwp;
70
 
};
 
70
} OneNANDState;
71
71
 
72
72
enum {
73
73
    ONEN_BUF_BLOCK = 0,
100
100
 
101
101
void onenand_base_update(void *opaque, target_phys_addr_t new)
102
102
{
103
 
    struct onenand_s *s = (struct onenand_s *) opaque;
 
103
    OneNANDState *s = (OneNANDState *) opaque;
104
104
 
105
105
    s->base = new;
106
106
 
119
119
 
120
120
void onenand_base_unmap(void *opaque)
121
121
{
122
 
    struct onenand_s *s = (struct onenand_s *) opaque;
 
122
    OneNANDState *s = (OneNANDState *) opaque;
123
123
 
124
124
    cpu_register_physical_memory(s->base,
125
125
                    0x10000 << s->shift, IO_MEM_UNASSIGNED);
126
126
}
127
127
 
128
 
static void onenand_intr_update(struct onenand_s *s)
 
128
static void onenand_intr_update(OneNANDState *s)
129
129
{
130
130
    qemu_set_irq(s->intr, ((s->intstatus >> 15) ^ (~s->config[0] >> 6)) & 1);
131
131
}
132
132
 
133
133
static void onenand_save_state(QEMUFile *f, void *opaque)
134
134
{
135
 
    struct onenand_s *s = (struct onenand_s *)opaque;
 
135
    OneNANDState *s = (OneNANDState *)opaque;
136
136
    int i;
137
137
    
138
138
    if (s->current == s->otp)
166
166
 
167
167
static int onenand_load_state(QEMUFile *f, void *opaque, int version_id)
168
168
{
169
 
    struct onenand_s *s = (struct onenand_s *)opaque;
 
169
    OneNANDState *s = (OneNANDState *)opaque;
170
170
    int i;
171
171
    
172
172
    if (version_id)
210
210
}
211
211
 
212
212
/* Hot reset (Reset OneNAND command) or warm reset (RP pin low) */
213
 
static void onenand_reset(struct onenand_s *s, int cold)
 
213
static void onenand_reset(OneNANDState *s, int cold)
214
214
{
215
215
    memset(&s->addr, 0, sizeof(s->addr));
216
216
    s->command = 0;
236
236
        memset(s->blockwp, ONEN_LOCK_LOCKED, s->blocks);
237
237
 
238
238
        if (s->bdrv && bdrv_read(s->bdrv, 0, s->boot[0], 8) < 0)
239
 
            cpu_abort(cpu_single_env, "%s: Loading the BootRAM failed.\n",
240
 
                            __FUNCTION__);
 
239
            hw_error("%s: Loading the BootRAM failed.\n", __FUNCTION__);
241
240
    }
242
241
}
243
242
 
244
 
static inline int onenand_load_main(struct onenand_s *s, int sec, int secn,
 
243
static inline int onenand_load_main(OneNANDState *s, int sec, int secn,
245
244
                void *dest)
246
245
{
247
246
    if (s->bdrv_cur)
254
253
    return 0;
255
254
}
256
255
 
257
 
static inline int onenand_prog_main(struct onenand_s *s, int sec, int secn,
 
256
static inline int onenand_prog_main(OneNANDState *s, int sec, int secn,
258
257
                void *src)
259
258
{
260
259
    if (s->bdrv_cur)
267
266
    return 0;
268
267
}
269
268
 
270
 
static inline int onenand_load_spare(struct onenand_s *s, int sec, int secn,
 
269
static inline int onenand_load_spare(OneNANDState *s, int sec, int secn,
271
270
                void *dest)
272
271
{
273
272
    uint8_t buf[512];
284
283
    return 0;
285
284
}
286
285
 
287
 
static inline int onenand_prog_spare(struct onenand_s *s, int sec, int secn,
 
286
static inline int onenand_prog_spare(OneNANDState *s, int sec, int secn,
288
287
                void *src)
289
288
{
290
289
    uint8_t buf[512];
302
301
    return 0;
303
302
}
304
303
 
305
 
static inline int onenand_erase(struct onenand_s *s, int sec, int num)
 
304
static inline int onenand_erase(OneNANDState *s, int sec, int num)
306
305
{
307
306
    /* TODO: optimise */
308
307
    uint8_t buf[512];
318
317
    return 0;
319
318
}
320
319
 
321
 
static void onenand_command(struct onenand_s *s, int cmd)
 
320
static void onenand_command(OneNANDState *s, int cmd)
322
321
{
323
322
    int b;
324
323
    int sec;
527
526
 
528
527
static uint32_t onenand_read(void *opaque, target_phys_addr_t addr)
529
528
{
530
 
    struct onenand_s *s = (struct onenand_s *) opaque;
 
529
    OneNANDState *s = (OneNANDState *) opaque;
531
530
    int offset = addr >> s->shift;
532
531
 
533
532
    switch (offset) {
580
579
    case 0xff02:        /* ECC Result of spare area data */
581
580
    case 0xff03:        /* ECC Result of main area data */
582
581
    case 0xff04:        /* ECC Result of spare area data */
583
 
        cpu_abort(cpu_single_env, "%s: imeplement ECC\n", __FUNCTION__);
 
582
        hw_error("%s: imeplement ECC\n", __FUNCTION__);
584
583
        return 0x0000;
585
584
    }
586
585
 
592
591
static void onenand_write(void *opaque, target_phys_addr_t addr,
593
592
                uint32_t value)
594
593
{
595
 
    struct onenand_s *s = (struct onenand_s *) opaque;
 
594
    OneNANDState *s = (OneNANDState *) opaque;
596
595
    int offset = addr >> s->shift;
597
596
    int sec;
598
597
 
699
698
 
700
699
void *onenand_init(uint32_t id, int regshift, qemu_irq irq)
701
700
{
702
 
    struct onenand_s *s = (struct onenand_s *) qemu_mallocz(sizeof(*s));
 
701
    OneNANDState *s = (OneNANDState *) qemu_mallocz(sizeof(*s));
703
702
    int bdrv_index = drive_get_index(IF_MTD, 0, 0);
704
703
    uint32_t size = 1 << (24 + ((id >> 12) & 7));
705
704
    void *ram;
740
739
 
741
740
void *onenand_raw_otp(void *opaque)
742
741
{
743
 
    struct onenand_s *s = (struct onenand_s *) opaque;
 
742
    OneNANDState *s = (OneNANDState *) opaque;
744
743
 
745
744
    return s->otp;
746
745
}