Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / u-boot / arch / sparc / include / asm / prom.h
diff --git a/qemu/roms/u-boot/arch/sparc/include/asm/prom.h b/qemu/roms/u-boot/arch/sparc/include/asm/prom.h
new file mode 100644 (file)
index 0000000..8906ef6
--- /dev/null
@@ -0,0 +1,283 @@
+/* OpenProm defines mainly taken from linux kernel header files
+ *
+ * openprom.h:  Prom structures and defines for access to the OPENBOOT
+ *              prom routines and data areas.
+ *
+ * Copyright (C) 1995 David S. Miller (davem@caip.rutgers.edu)
+ * Copyright (C) 2007 Daniel Hellstrom (daniel@gaisler.com)
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+
+#ifndef __SPARC_OPENPROM_H__
+#define __SPARC_OPENPROM_H__
+
+/* Empirical constants... */
+#define        LINUX_OPPROM_MAGIC      0x10010407
+
+#ifndef __ASSEMBLY__
+/* V0 prom device operations. */
+struct linux_dev_v0_funcs {
+       int (*v0_devopen) (char *device_str);
+       int (*v0_devclose) (int dev_desc);
+       int (*v0_rdblkdev) (int dev_desc, int num_blks, int blk_st, char *buf);
+       int (*v0_wrblkdev) (int dev_desc, int num_blks, int blk_st, char *buf);
+       int (*v0_wrnetdev) (int dev_desc, int num_bytes, char *buf);
+       int (*v0_rdnetdev) (int dev_desc, int num_bytes, char *buf);
+       int (*v0_rdchardev) (int dev_desc, int num_bytes, int dummy, char *buf);
+       int (*v0_wrchardev) (int dev_desc, int num_bytes, int dummy, char *buf);
+       int (*v0_seekdev) (int dev_desc, long logical_offst, int from);
+};
+
+/* V2 and later prom device operations. */
+struct linux_dev_v2_funcs {
+       int (*v2_inst2pkg) (int d);     /* Convert ihandle to phandle */
+       char *(*v2_dumb_mem_alloc) (char *va, unsigned sz);
+       void (*v2_dumb_mem_free) (char *va, unsigned sz);
+
+       /* To map devices into virtual I/O space. */
+       char *(*v2_dumb_mmap) (char *virta, int which_io, unsigned paddr,
+                              unsigned sz);
+       void (*v2_dumb_munmap) (char *virta, unsigned size);
+
+       int (*v2_dev_open) (char *devpath);
+       void (*v2_dev_close) (int d);
+       int (*v2_dev_read) (int d, char *buf, int nbytes);
+       int (*v2_dev_write) (int d, char *buf, int nbytes);
+       int (*v2_dev_seek) (int d, int hi, int lo);
+
+       /* Never issued (multistage load support) */
+       void (*v2_wheee2) (void);
+       void (*v2_wheee3) (void);
+};
+
+struct linux_mlist_v0 {
+       struct linux_mlist_v0 *theres_more;
+       char *start_adr;
+       unsigned num_bytes;
+};
+
+struct linux_mem_v0 {
+       struct linux_mlist_v0 **v0_totphys;
+       struct linux_mlist_v0 **v0_prommap;
+       struct linux_mlist_v0 **v0_available;   /* What we can use */
+};
+
+/* Arguments sent to the kernel from the boot prompt. */
+struct linux_arguments_v0 {
+       char * const argv[8];
+       char args[100];
+       char boot_dev[2];
+       int boot_dev_ctrl;
+       int boot_dev_unit;
+       int dev_partition;
+       char *kernel_file_name;
+       void *aieee1;           /* XXX */
+};
+
+/* V2 and up boot things. */
+struct linux_bootargs_v2 {
+       char **bootpath;
+       char **bootargs;
+       int *fd_stdin;
+       int *fd_stdout;
+};
+
+/* The top level PROM vector. */
+struct linux_romvec {
+       /* Version numbers. */
+       unsigned int pv_magic_cookie;
+       unsigned int pv_romvers;
+       unsigned int pv_plugin_revision;
+       unsigned int pv_printrev;
+
+       /* Version 0 memory descriptors. */
+       struct linux_mem_v0 pv_v0mem;
+
+       /* Node operations. */
+       struct linux_nodeops *pv_nodeops;
+
+       char **pv_bootstr;
+       struct linux_dev_v0_funcs pv_v0devops;
+
+       char *pv_stdin;
+       char *pv_stdout;
+#define        PROMDEV_KBD     0       /* input from keyboard */
+#define        PROMDEV_SCREEN  0       /* output to screen */
+#define        PROMDEV_TTYA    1       /* in/out to ttya */
+#define        PROMDEV_TTYB    2       /* in/out to ttyb */
+
+       /* Blocking getchar/putchar.  NOT REENTRANT! (grr) */
+       int (*pv_getchar) (void);
+       void (*pv_putchar) (int ch);
+
+       /* Non-blocking variants. */
+       int (*pv_nbgetchar) (void);
+       int (*pv_nbputchar) (int ch);
+
+       void (*pv_putstr) (char *str, int len);
+
+       /* Miscellany. */
+       void (*pv_reboot) (char *bootstr);
+       void (*pv_printf) (__const__ char *fmt, ...);
+       void (*pv_abort) (void);
+       __volatile__ int *pv_ticks;
+       void (*pv_halt) (void);
+       void (**pv_synchook) (void);
+
+       /* Evaluate a forth string, not different proto for V0 and V2->up. */
+       union {
+               void (*v0_eval) (int len, char *str);
+               void (*v2_eval) (char *str);
+       } pv_fortheval;
+
+       struct linux_arguments_v0 **pv_v0bootargs;
+
+       /* Get ether address. */
+       unsigned int (*pv_enaddr) (int d, char *enaddr);
+
+       struct linux_bootargs_v2 pv_v2bootargs;
+       struct linux_dev_v2_funcs pv_v2devops;
+
+       int filler[15];
+
+       /* This one is sun4c/sun4 only. */
+       void (*pv_setctxt) (int ctxt, char *va, int pmeg);
+
+       /* Prom version 3 Multiprocessor routines. This stuff is crazy.
+        * No joke. Calling these when there is only one cpu probably
+        * crashes the machine, have to test this. :-)
+        */
+
+       /* v3_cpustart() will start the cpu 'whichcpu' in mmu-context
+        * 'thiscontext' executing at address 'prog_counter'
+        */
+       int (*v3_cpustart) (unsigned int whichcpu, int ctxtbl_ptr,
+                           int thiscontext, char *prog_counter);
+
+       /* v3_cpustop() will cause cpu 'whichcpu' to stop executing
+        * until a resume cpu call is made.
+        */
+       int (*v3_cpustop) (unsigned int whichcpu);
+
+       /* v3_cpuidle() will idle cpu 'whichcpu' until a stop or
+        * resume cpu call is made.
+        */
+       int (*v3_cpuidle) (unsigned int whichcpu);
+
+       /* v3_cpuresume() will resume processor 'whichcpu' executing
+        * starting with whatever 'pc' and 'npc' were left at the
+        * last 'idle' or 'stop' call.
+        */
+       int (*v3_cpuresume) (unsigned int whichcpu);
+};
+
+/* Routines for traversing the prom device tree. */
+struct linux_nodeops {
+       int (*no_nextnode) (int node);
+       int (*no_child) (int node);
+       int (*no_proplen) (int node, char *name);
+       int (*no_getprop) (int node, char *name, char *val);
+       int (*no_setprop) (int node, char *name, char *val, int len);
+       char *(*no_nextprop) (int node, char *name);
+};
+
+/* More fun PROM structures for device probing. */
+#define PROMREG_MAX     16
+#define PROMVADDR_MAX   16
+#define PROMINTR_MAX    15
+
+struct linux_prom_registers {
+       unsigned int which_io;  /* is this in OBIO space? */
+       unsigned int phys_addr; /* The physical address of this register */
+       unsigned int reg_size;  /* How many bytes does this register take up? */
+};
+
+struct linux_prom_irqs {
+       int pri;                /* IRQ priority */
+       int vector;             /* This is foobar, what does it do? */
+};
+
+/* Element of the "ranges" vector */
+struct linux_prom_ranges {
+       unsigned int ot_child_space;
+       unsigned int ot_child_base;     /* Bus feels this */
+       unsigned int ot_parent_space;
+       unsigned int ot_parent_base;    /* CPU looks from here */
+       unsigned int or_size;
+};
+
+/* Ranges and reg properties are a bit different for PCI. */
+struct linux_prom_pci_registers {
+       /*
+        * We don't know what information this field contain.
+        * We guess, PCI device function is in bits 15:8
+        * So, ...
+        */
+       unsigned int which_io;  /* Let it be which_io */
+
+       unsigned int phys_hi;
+       unsigned int phys_lo;
+
+       unsigned int size_hi;
+       unsigned int size_lo;
+};
+
+struct linux_prom_pci_ranges {
+       unsigned int child_phys_hi;     /* Only certain bits are encoded here. */
+       unsigned int child_phys_mid;
+       unsigned int child_phys_lo;
+
+       unsigned int parent_phys_hi;
+       unsigned int parent_phys_lo;
+
+       unsigned int size_hi;
+       unsigned int size_lo;
+};
+
+struct linux_prom_pci_assigned_addresses {
+       unsigned int which_io;
+
+       unsigned int phys_hi;
+       unsigned int phys_lo;
+
+       unsigned int size_hi;
+       unsigned int size_lo;
+};
+
+struct linux_prom_ebus_ranges {
+       unsigned int child_phys_hi;
+       unsigned int child_phys_lo;
+
+       unsigned int parent_phys_hi;
+       unsigned int parent_phys_mid;
+       unsigned int parent_phys_lo;
+
+       unsigned int size;
+};
+
+/* Offset into the EEPROM where the id PROM is located on the 4c */
+#define IDPROM_OFFSET  0x7d8
+
+/* On sun4m; physical. */
+/* MicroSPARC(-II) does not decode 31rd bit, but it works. */
+#define IDPROM_OFFSET_M  0xfd8
+
+struct idprom {
+       unsigned char id_format;        /* Format identifier (always 0x01) */
+       unsigned char id_machtype;      /* Machine type */
+       unsigned char id_ethaddr[6];    /* Hardware ethernet address */
+       long id_date;           /* Date of manufacture */
+       unsigned int id_sernum:24;      /* Unique serial number */
+       unsigned char id_cksum; /* Checksum - xor of the data bytes */
+       unsigned char reserved[16];
+};
+
+extern struct idprom *idprom;
+extern void idprom_init(void);
+
+#define IDPROM_SIZE  (sizeof(struct idprom))
+
+#endif                         /* !(__ASSEMBLY__) */
+
+#endif